'use client' import { DEFAULT_MATERIALS, type MaterialPreset, type MaterialSchema } from '@pascal-app/core' import { useState } from 'react' const PRESET_COLORS: Record = { white: '#ffffff', brick: '#8b4513', concrete: '#808080', wood: '#deb887', glass: '#87ceeb', metal: '#c0c0c0', plaster: '#f5f5dc', tile: '#d3d3d3', marble: '#fafafa', custom: '#ffffff', } const PRESET_LABELS: Record = { white: 'White', brick: 'Brick', concrete: 'Concrete', wood: 'Wood', glass: 'Glass', metal: 'Metal', plaster: 'Plaster', tile: 'Tile', marble: 'Marble', custom: 'Custom', } type MaterialPickerProps = { value?: MaterialSchema onChange: (material: MaterialSchema) => void } export function MaterialPicker({ value, onChange }: MaterialPickerProps) { const [showCustom, setShowCustom] = useState(value?.preset === 'custom' || !!value?.properties) const currentPreset = value?.preset || 'white' const currentProps = value?.properties || DEFAULT_MATERIALS[currentPreset] const handlePresetChange = (preset: MaterialPreset) => { if (preset === 'custom') { setShowCustom(true) onChange({ preset: 'custom', properties: { color: value?.properties?.color || '#ffffff', roughness: value?.properties?.roughness ?? 0.5, metalness: value?.properties?.metalness ?? 0, opacity: value?.properties?.opacity ?? 1, transparent: value?.properties?.transparent ?? false, side: value?.properties?.side ?? 'front', }, }) } else { setShowCustom(false) onChange({ preset }) } } const handlePropertyChange = (prop: keyof typeof currentProps, val: typeof currentProps[keyof typeof currentProps]) => { onChange({ preset: showCustom ? 'custom' : currentPreset, properties: { ...currentProps, [prop]: val, }, }) } return (
{(Object.keys(PRESET_COLORS) as MaterialPreset[]).map((preset) => (
{showCustom && (
handlePropertyChange('color', e.target.value)} type="color" value={currentProps.color} /> handlePropertyChange('color', e.target.value)} type="text" value={currentProps.color} />
handlePropertyChange('roughness', parseFloat(e.target.value))} step={0.01} type="range" value={currentProps.roughness} /> {currentProps.roughness.toFixed(2)}
handlePropertyChange('metalness', parseFloat(e.target.value))} step={0.01} type="range" value={currentProps.metalness} /> {currentProps.metalness.toFixed(2)}
{ const opacity = parseFloat(e.target.value) handlePropertyChange('opacity', opacity) if (opacity < 1 && !currentProps.transparent) { handlePropertyChange('transparent', true) } }} step={0.01} type="range" value={currentProps.opacity} /> {currentProps.opacity.toFixed(2)}
)}
) }