@weasel-js/labkit 0.1.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_dts/{fitViewToBounds-rWrBI4a6.d.ts → DrawCommand-CEvS5AdV.d.ts} +124 -23
- package/dist/{chunk-B5ZUYRKN.js → chunk-GSSBVWH7.js} +5178 -5352
- package/dist/chunk-GSSBVWH7.js.map +1 -0
- package/dist/chunk-H4NC6XM3.js +6037 -0
- package/dist/chunk-H4NC6XM3.js.map +1 -0
- package/dist/{chunk-SD3HDXR7.js → chunk-LSO7MDGZ.js} +8 -8
- package/dist/chunk-LSO7MDGZ.js.map +1 -0
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/opentype-BYRB6NOX.js +15965 -0
- package/dist/opentype-BYRB6NOX.js.map +1 -0
- package/dist/passthrough/weasel-canvas.d.ts +1 -1
- package/dist/passthrough/weasel-canvas.js +1 -1
- package/dist/passthrough/weasel-ui.d.ts +2220 -744
- package/dist/passthrough/weasel-ui.js +2 -2
- package/dist/ui/layers/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-6FO7G5BB.js +0 -6095
- package/dist/chunk-6FO7G5BB.js.map +0 -1
- package/dist/chunk-B5ZUYRKN.js.map +0 -1
- package/dist/chunk-SD3HDXR7.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/instrument/capabilityDetector.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/lab/gridDims.ts","../src/dragdrop/DragGhost.tsx","../src/dragdrop/DragDropRuntime.tsx","../src/dragdrop/Palette.tsx","../src/lab/LabContext.ts","../src/workspace/DefaultSidebar.tsx","../src/workspace/DefaultStatusBar.tsx","../src/workspace/DefaultToolbar.tsx","../src/workspace/WorkspaceChrome.tsx","../src/workspace/Workspace.tsx","../src/workspace/workspaceOps.ts","../src/lab/LabShell.tsx","../src/lab/WorkspaceGrid.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../src/ui/format.ts","../src/ui/properties/PropertyPanel.tsx"],"names":["useState","useEffect","jsx","jsxs","useContext","useStore","useRef","useMemo","Fragment","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { Instrument } from './types';\n\nexport interface CapabilityFlags {\n hasCanvas: boolean;\n hasLayers: boolean;\n hasDragDrop: boolean;\n hasUndo: boolean;\n}\n\nexport function detectCapabilities(instrument: Instrument<unknown, unknown>): CapabilityFlags {\n return {\n hasCanvas: instrument.canvas != null,\n hasLayers: instrument.layers != null,\n hasDragDrop: instrument.dragDrop != null,\n hasUndo: instrument.undo != null,\n };\n}\n","import type { Instrument } from './types';\n\nexport function defineInstrument<TS, TC>(spec: Instrument<TS, TC>): Instrument<TS, TC> {\n return spec;\n}\n","import type { ConfigField, ConfigFieldType } from '../controls/types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst KNOWN_TYPES: ConfigFieldType[] = ['slider', 'checkbox', 'select', 'number', 'text', 'color'];\n\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (!KNOWN_TYPES.includes(field.type)) {\n errors.push(`Unknown field type: \"${field.type}\" on key \"${field.key}\"`);\n continue;\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","export interface GridDims {\n cols: number;\n rows: number;\n}\n\nexport function gridDims(count: number): GridDims {\n if (count <= 1) return { cols: 1, rows: 1 };\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n return { cols, rows };\n}\n","import { type ReactPortal, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PaletteItem, Point } from '../instrument/types';\n\nexport interface DragGhostProps {\n item: PaletteItem;\n screenPos: Point;\n}\n\nexport function DragGhost({ item, screenPos }: DragGhostProps): ReactPortal | null {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n if (!mounted || typeof document === 'undefined') return null;\n const style = {\n left: `${screenPos.x + 12}px`,\n top: `${screenPos.y + 12}px`,\n };\n return createPortal(\n <div className=\"lk-drag-ghost\" style={style}>\n <span className=\"lk-drag-ghost__label\">{item.label}</span>\n </div>,\n document.body,\n );\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { screenToWorld } from '../canvas/canvasCoords';\nimport type {\n DragDropCapability,\n DragFeedback,\n PaletteItem,\n Point,\n ViewTransform,\n} from '../instrument/types';\nimport { DragGhost } from './DragGhost';\n\nexport interface DragState {\n item: PaletteItem;\n screenPos: Point;\n feedback: DragFeedback | null;\n}\n\nexport interface UseDragDropArgs<TS, TC> {\n capability: DragDropCapability<TS, TC>;\n canvasContainerRef: RefObject<HTMLElement | null>;\n view: ViewTransform;\n state: TS;\n config: TC;\n setState: (next: TS | ((prev: TS) => TS)) => void;\n emit: (event: string) => void;\n}\n\nexport interface UseDragDropResult {\n drag: DragState | null;\n startDrag: (item: PaletteItem, originScreenPos: Point) => void;\n}\n\nexport function useDragDrop<TS, TC>({\n capability,\n canvasContainerRef,\n view,\n state,\n config,\n setState,\n emit,\n}: UseDragDropArgs<TS, TC>): UseDragDropResult {\n const [drag, setDrag] = useState<DragState | null>(null);\n const dragRef = useRef<DragState | null>(null);\n dragRef.current = drag;\n const rafThrottle = useRef<number | null>(null);\n\n const isOverCanvas = useCallback(\n (screenPos: Point): boolean => {\n const el = canvasContainerRef.current;\n if (!el) return false;\n const r = el.getBoundingClientRect();\n return (\n screenPos.x >= r.left &&\n screenPos.x <= r.right &&\n screenPos.y >= r.top &&\n screenPos.y <= r.bottom\n );\n },\n [canvasContainerRef],\n );\n\n const screenToWorldFromContainer = useCallback(\n (screenPos: Point): Point | null => {\n const el = canvasContainerRef.current;\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return screenToWorld({ x: screenPos.x - r.left, y: screenPos.y - r.top }, view);\n },\n [canvasContainerRef, view],\n );\n\n useEffect(() => {\n if (!drag) return;\n const handleMove = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const current = dragRef.current;\n if (!current) return;\n if (rafThrottle.current !== null) {\n dragRef.current = { ...current, screenPos };\n setDrag(dragRef.current);\n return;\n }\n rafThrottle.current = requestAnimationFrame(() => {\n rafThrottle.current = null;\n const active = dragRef.current;\n if (!active) return;\n let feedback: DragFeedback | null = null;\n if (capability.onDragOver && isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) feedback = capability.onDragOver(world, active.item, state, config);\n }\n setDrag({ ...active, screenPos, feedback });\n });\n };\n const handleUp = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const active = dragRef.current;\n if (!active) return;\n if (rafThrottle.current !== null) {\n cancelAnimationFrame(rafThrottle.current);\n rafThrottle.current = null;\n }\n if (isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) {\n const nextState = capability.onDrop(world, active.item, state, config);\n setState(nextState);\n emit('canvas.itemAdded');\n }\n }\n setDrag(null);\n };\n window.addEventListener('pointermove', handleMove);\n window.addEventListener('pointerup', handleUp);\n return () => {\n window.removeEventListener('pointermove', handleMove);\n window.removeEventListener('pointerup', handleUp);\n };\n }, [drag, capability, state, config, setState, emit, isOverCanvas, screenToWorldFromContainer]);\n\n const startDrag = useCallback((item: PaletteItem, originScreenPos: Point) => {\n setDrag({ item, screenPos: originScreenPos, feedback: null });\n }, []);\n\n return { drag, startDrag };\n}\n\nexport interface DragOverlayProps {\n drag: DragState | null;\n}\n\nexport function DragOverlay({ drag }: DragOverlayProps) {\n if (!drag) return null;\n return <DragGhost item={drag.item} screenPos={drag.screenPos} />;\n}\n","import type { PaletteItem, Point } from '../instrument/types';\n\nexport interface PaletteProps {\n items: PaletteItem[];\n onDragStart: (item: PaletteItem, originScreenPos: Point) => void;\n className?: string;\n}\n\nexport function Palette({ items, onDragStart, className }: PaletteProps) {\n return (\n <div className={className ? `lk-palette ${className}` : 'lk-palette'}>\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.id}\n className=\"lk-palette__item\"\n onPointerDown={(e) => {\n e.preventDefault();\n onDragStart(item, { x: e.clientX, y: e.clientY });\n }}\n >\n <span className=\"lk-palette__label\">{item.label}</span>\n </button>\n ))}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport type { SavedSnapshot, WorkspaceRecord } from '../state/types';\n\nexport interface LabContextValue {\n instruments: Instrument[];\n workspaces: WorkspaceRecord[];\n addWorkspace: (instrumentName: string) => void;\n cloneWorkspace: (id: string) => void;\n closeWorkspace: (id: string) => void;\n resetWorkspace: (id: string) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (workspaceId: string, name?: string) => void;\n loadSnapshot: (workspaceId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n theme: 'auto' | 'light' | 'interstellar';\n setTheme: (t: 'auto' | 'light' | 'interstellar') => void;\n}\n\nexport const LabContext = createContext<LabContextValue | null>(null);\n\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { ControlPanel } from '../controls/ControlPanel';\nimport { Sidebar } from '../primitives/Sidebar';\nimport type { WorkspaceSidebarContext } from './slotTypes';\n\nexport interface DefaultSidebarProps {\n ctx: WorkspaceSidebarContext;\n}\n\nexport function DefaultSidebar({ ctx }: DefaultSidebarProps) {\n if (ctx.configFields.length === 0) {\n return (\n <Sidebar title={ctx.instrumentName}>\n <div className=\"lk-sidebar__placeholder\">{ctx.instrumentName} has no config fields.</div>\n </Sidebar>\n );\n }\n return (\n <Sidebar title={ctx.instrumentName}>\n <ControlPanel\n fields={ctx.configFields}\n config={ctx.config as Record<string, unknown>}\n setConfig={(key, value) => ctx.setConfig(key as string, value)}\n />\n </Sidebar>\n );\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport type { WorkspaceStatusBarContext } from './slotTypes';\n\nexport interface DefaultStatusBarProps {\n ctx: WorkspaceStatusBarContext;\n}\n\nexport function DefaultStatusBar({ ctx }: DefaultStatusBarProps) {\n return (\n <StatusBar>\n <StatusBar.Section>{ctx.instrumentName}</StatusBar.Section>\n <StatusBar.Section>{Math.round(ctx.zoom * 100)}%</StatusBar.Section>\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport type { WorkspaceToolbarContext } from './slotTypes';\n\nexport interface DefaultToolbarProps {\n ctx: WorkspaceToolbarContext;\n}\n\nexport function DefaultToolbar({ ctx }: DefaultToolbarProps) {\n return (\n <Toolbar>\n {ctx.hasUndo && (\n <>\n <Toolbar.Button onClick={ctx.undo} disabled={!ctx.canUndo} title=\"Undo (Cmd/Ctrl+Z)\">\n Undo\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.redo}\n disabled={!ctx.canRedo}\n title=\"Redo (Cmd/Ctrl+Shift+Z)\"\n >\n Redo\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n {ctx.hasCanvas && (\n <>\n <Toolbar.Button onClick={ctx.zoomOut} title=\"Zoom out\">\n −\n </Toolbar.Button>\n <span className=\"lk-toolbar__zoom-label\">{Math.round(ctx.zoom * 100)}%</span>\n <Toolbar.Button onClick={ctx.zoomIn} title=\"Zoom in\">\n +\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.resetZoom} title=\"Reset zoom\">\n 1:1\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n <Toolbar.Button onClick={() => ctx.saveSnapshot()} title=\"Save snapshot (Cmd/Ctrl+S)\">\n Save\n </Toolbar.Button>\n\n {ctx.savedSnapshots.length > 0 && (\n <select\n className=\"lk-toolbar__load-select\"\n aria-label=\"Load snapshot\"\n defaultValue=\"\"\n onChange={(e) => {\n const id = e.target.value;\n if (id) {\n ctx.loadSnapshot(id);\n e.target.value = '';\n }\n }}\n >\n <option value=\"\" disabled>\n Load…\n </option>\n {ctx.savedSnapshots.map((sn) => (\n <option key={sn.id} value={sn.id}>\n {sn.name}\n </option>\n ))}\n </select>\n )}\n\n <Toolbar.Spacer />\n\n <Toolbar.Button onClick={ctx.clone} title=\"Clone workspace\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset workspace\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastWorkspace}\n title={ctx.isLastWorkspace ? 'Cannot close the last workspace' : 'Close workspace'}\n >\n Close\n </Toolbar.Button>\n </Toolbar>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LabStoreContext } from '../state/context';\nimport type { WorkspaceRecord } from '../state/types';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n WorkspaceSidebarContext,\n WorkspaceStatusBarContext,\n WorkspaceToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\nexport interface WorkspaceChromeProps {\n workspaceId: string;\n record: WorkspaceRecord;\n instrument: Instrument;\n isLastWorkspace: boolean;\n toolbar?: ToolbarSlot;\n sidebar?: SidebarSlot;\n statusBar?: StatusBarSlot;\n undoBindings?: UndoBindings;\n sidebarExtras?: ReactNode;\n children: ReactNode;\n}\n\nexport function WorkspaceChrome({\n workspaceId,\n record,\n instrument,\n isLastWorkspace,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n sidebarExtras,\n children,\n}: WorkspaceChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] WorkspaceChrome requires <LabStoreProvider>');\n const updateWorkspaceView = useStore(storeCtx.store, (s) => s.updateWorkspaceView);\n const updateWorkspaceConfig = useStore(storeCtx.store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceState = useStore(storeCtx.store, (s) => s.updateWorkspaceState);\n\n const toolbarCtx = useMemo<WorkspaceToolbarContext>(() => {\n const setZoom = (z: number): void => {\n updateWorkspaceView(workspaceId, { ...record.view, zoom: z });\n };\n return {\n workspaceId,\n instrumentName: record.instrumentName,\n hasUndo: instrument.undo != null,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? (() => {}),\n redo: undoBindings?.redo ?? (() => {}),\n zoom: record.view.zoom,\n setZoom,\n zoomIn: () => setZoom(record.view.zoom * 1.25),\n zoomOut: () => setZoom(record.view.zoom * 0.8),\n resetZoom: () => setZoom(1),\n hasCanvas: instrument.canvas != null,\n savedSnapshots: lab.savedSnapshots.filter((s) => s.workspaceId === workspaceId),\n saveSnapshot: (name) => lab.saveSnapshot(workspaceId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(workspaceId, snapshotId),\n clone: () => lab.cloneWorkspace(workspaceId),\n reset: () => lab.resetWorkspace(workspaceId),\n close: () => lab.closeWorkspace(workspaceId),\n isLastWorkspace,\n };\n }, [workspaceId, record, instrument, lab, isLastWorkspace, updateWorkspaceView, undoBindings]);\n\n const sidebarCtx = useMemo<WorkspaceSidebarContext>(\n () => ({\n workspaceId,\n instrumentName: record.instrumentName,\n configFields: instrument.configSchema?.() ?? [],\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateWorkspaceConfig(workspaceId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateWorkspaceState(workspaceId, nextState as never);\n }\n },\n }),\n [workspaceId, record, instrument, updateWorkspaceConfig, updateWorkspaceState],\n );\n\n const statusCtx: WorkspaceStatusBarContext = {\n workspaceId,\n instrumentName: record.instrumentName,\n zoom: record.view.zoom,\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) toolbarCtx.redo();\n else toolbarCtx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n toolbarCtx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-workspace\"\n aria-label={`Workspace ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-workspace__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-workspace__body\">\n <div className=\"lk-workspace__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-workspace__content\">{children}</div>\n </div>\n <div className=\"lk-workspace__status\">\n {statusBar ? statusBar(statusCtx) : <DefaultStatusBar ctx={statusCtx} />}\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n ViewTransform,\n} from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { LabStoreContext } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { WorkspaceRecord } from '../state/types';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { UndoBindings } from './WorkspaceChrome';\nimport { WorkspaceChrome } from './WorkspaceChrome';\n\nexport interface WorkspaceProps {\n id: string;\n}\n\nexport function Workspace({ id }: WorkspaceProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Workspace> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.workspaces.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-workspace lk-workspace--unknown\">Workspace not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-workspace lk-workspace--unknown\">\n Unknown instrument: {record.instrumentName}\n </div>\n );\n }\n return (\n <WorkspaceRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.workspaces.length <= 1}\n />\n );\n}\n\ninterface WorkspaceRuntimeProps {\n record: WorkspaceRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction WorkspaceRuntime({ record, instrument, store, isLast }: WorkspaceRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateWorkspaceState = useStore(store, (s) => s.updateWorkspaceState);\n const updateWorkspaceConfig = useStore(store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceView = useStore(store, (s) => s.updateWorkspaceView);\n const updateWorkspaceUndoStack = useStore(store, (s) => s.updateWorkspaceUndoStack);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().workspaces.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateWorkspaceUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: ViewTransform): void => updateWorkspaceView(record.id, v);\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateWorkspaceState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateWorkspaceConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n workspace: {\n id: record.id,\n zoom: record.view.zoom,\n setZoom: (z) => updateWorkspaceView(record.id, { ...record.view, zoom: z }),\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n };\n\n const undoBindings: UndoBindings | undefined = undoCap\n ? {\n canUndo: record.undoStack.past.length > 0,\n canRedo: record.undoStack.future.length > 0,\n undo: () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view) =>\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom }),\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((lid) => ({ id: lid, label: lid }));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: record.view,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateWorkspaceState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div\n ref={canvasContainerRef}\n className=\"lk-workspace__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack layers={layersWithFeedback} view={record.view} onViewChange={setView} />\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const paletteNode =\n paletteItems.length > 0 ? (\n <Palette items={paletteItems} onDragStart={dragDropResult.startDrag} />\n ) : null;\n\n const layerListNode =\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null;\n\n return (\n <WorkspaceChrome\n workspaceId={record.id}\n record={record}\n instrument={instrument}\n isLastWorkspace={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </WorkspaceChrome>\n );\n}\n","import type { Instrument } from '../instrument/types';\nimport type { WorkspaceRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: Instrument[], name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): WorkspaceRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\nexport function addWorkspace(\n workspaces: WorkspaceRecord[],\n instruments: Instrument[],\n instrumentName: string,\n): WorkspaceRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: WorkspaceRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces, record];\n}\n\nexport function cloneWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n const sourceIdx = workspaces.findIndex((w) => w.id === id);\n const source = workspaces[sourceIdx];\n if (!source) return workspaces;\n const clone: WorkspaceRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces.slice(0, sourceIdx + 1), clone, ...workspaces.slice(sourceIdx + 1)];\n}\n\nexport function closeWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n if (workspaces.length <= 1) return workspaces;\n const next = workspaces.filter((w) => w.id !== id);\n return next.length === workspaces.length ? workspaces : next;\n}\n\nexport function resetWorkspace(\n workspaces: WorkspaceRecord[],\n id: string,\n instruments: Instrument[],\n): WorkspaceRecord[] {\n const idx = workspaces.findIndex((w) => w.id === id);\n const current = workspaces[idx];\n if (!current) return workspaces;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: WorkspaceRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...workspaces.slice(0, idx), reset, ...workspaces.slice(idx + 1)];\n}\n","import type { ReactNode } from 'react';\n\nexport type LabTheme = 'auto' | 'light' | 'interstellar';\n\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Theme override. \"auto\" (default) follows prefers-color-scheme. */\n theme?: LabTheme;\n}\n\nexport function LabShell({ title, children, header, footer, theme = 'auto' }: LabShellProps) {\n const themeClass =\n theme === 'light'\n ? ' lk-theme-light'\n : theme === 'interstellar'\n ? ' lk-theme-interstellar'\n : '';\n return (\n <div className={`lk-root lk-shell${themeClass}`}>\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n}\n","import { Children, type CSSProperties, type ReactNode } from 'react';\nimport { gridDims } from './gridDims';\n\nexport interface WorkspaceGridProps {\n children: ReactNode;\n}\n\nexport function WorkspaceGrid({ children }: WorkspaceGridProps) {\n const count = Children.count(children);\n const { cols, rows } = gridDims(count);\n const style = {\n '--lk-grid-cols': String(cols),\n '--lk-grid-rows': String(rows),\n } as CSSProperties;\n return (\n <div className=\"lk-workspace-grid\" style={style}>\n {children}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { Workspace } from '../workspace/Workspace';\nimport {\n addWorkspace as addWorkspaceOp,\n cloneWorkspace as cloneWorkspaceOp,\n closeWorkspace as closeWorkspaceOp,\n resetWorkspace as resetWorkspaceOp,\n} from '../workspace/workspaceOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { WorkspaceGrid } from './WorkspaceGrid';\n\nexport interface LabProps {\n instruments: Instrument[];\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n theme?: 'auto' | 'light' | 'interstellar';\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless `theme=\"interstellar\"` is active.\n */\n nebula?: readonly string[];\n title?: string;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: Instrument[],\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialTheme: 'auto' | 'light' | 'interstellar',\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialTheme });\n if (store.getState().workspaces.length === 0) {\n const seeded = addWorkspaceOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addWorkspace(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length]!;\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n theme,\n nebula,\n title,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n theme ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const workspaces = useStore(store, (s) => s.workspaces);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const themeValue = useStore(store, (s) => s.theme);\n\n useEffect(() => {\n if (theme && theme !== store.getState().theme) {\n store.getState().setTheme(theme);\n }\n }, [theme, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceWorkspaces = (next: WorkspaceRecord[]): void => {\n const currentById = new Map(store.getState().workspaces.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ workspaces: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setTheme(store.getState().theme);\n };\n\n return {\n instruments,\n workspaces,\n addWorkspace: (instrumentName) => {\n const next = addWorkspaceOp(store.getState().workspaces, instruments, instrumentName);\n replaceWorkspaces(next);\n },\n cloneWorkspace: (id) => {\n const next = cloneWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n closeWorkspace: (id) => {\n const next = closeWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n resetWorkspace: (id) => {\n const next = resetWorkspaceOp(store.getState().workspaces, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n workspaces: s.workspaces.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateWorkspaceView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (workspaceId, name) => {\n store.getState().saveSnapshot(workspaceId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (workspaceId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, workspaceId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n theme: themeValue,\n setTheme: (t) => {\n store.getState().setTheme(t);\n },\n };\n }, [instruments, workspaces, savedSnapshots, themeValue, store]);\n\n const themeClass =\n themeValue === 'light'\n ? 'lk-theme-light'\n : themeValue === 'interstellar'\n ? 'lk-theme-interstellar'\n : '';\n\n // Only apply the nebula override when interstellar is active and at\n // least one color is provided. Setting a CSS custom property is the\n // sanctioned use of inline style.\n const nebulaStyle =\n themeValue === 'interstellar' && nebula && nebula.length > 0\n ? ({ ['--lk-space-nebula' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <div className={`lk-lab ${themeClass}`.trim()} style={nebulaStyle}>\n <LabShell title={title ?? 'Labkit'} theme={themeValue} header={children}>\n <WorkspaceGrid>\n {workspaces.map((w) => (\n <Workspace key={w.id} id={w.id} />\n ))}\n </WorkspaceGrid>\n </LabShell>\n </div>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { type ControlPoint, CurveEditor, dlog } from '../../passthrough/weasel-ui';\n\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import it from `@weasel-js/labkit/weasel-ui`.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i]!, y: values[i + 1]! });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i]!.y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i]!.x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i]!, y: values[i + 1]! });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i]!;\n flipped[i + 1] = 2 * mid - values[i + 1]!;\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className=\"lk-curve-field\">\n <div className=\"lk-curve-field__plot\">\n <CurveEditor\n value={points}\n onChange={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className=\"lk-curve-field__marks\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className=\"lk-curve-field__actions\">\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className=\"lk-curve-field__action\"\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from 'react';\n\n// ── Subpanel ─────────────────────────────────────────────────────────\n// Headered group of controls inside a wider panel/list. The header is a\n// label flanked by a horizontal rule — no background, padding, or border;\n// purely a typographic divider. Ported from speech-balloons styles.css:277-313.\n\nexport interface SubpanelProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Subpanel({ title, children, className }: SubpanelProps) {\n const cls = className ? `lk-subpanel ${className}` : 'lk-subpanel';\n return (\n <div className={cls}>\n <h4 className=\"lk-subpanel__title\">\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n\n// ── EffectCard ───────────────────────────────────────────────────────\n// Draggable, collapsible card for stacked effect editors. Optional --lk-panel-accent\n// per-instance recolors the title bar, border-left, and (via re-binding --lk-accent\n// inside the card) every descendant control that reads from the accent token.\n\nexport interface EffectCardProps {\n /** Card title rendered in the title bar (e.g. effect kind label or a select). */\n title: ReactNode;\n /** Optional badge/chip displayed before the remove button (e.g. primary value summary). */\n primary?: ReactNode;\n /** Optional accent color in any CSS color form. Sets --lk-panel-accent on the card. */\n accent?: string;\n /** Optional ordinal badge that doubles as the drag handle (used by tail cards in SB). */\n index?: number;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n onRemove?: () => void;\n /**\n * Drag-handle wiring. When provided, an inline handle (⋮⋮ icon or `index`)\n * activates HTML5 drag on press. Consumer owns the drag/drop coordination —\n * see EffectCardList for the batteries-included wrapper.\n */\n draggable?: boolean;\n onPressHandle?: () => void;\n onReleaseHandle?: () => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n dragging?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\nexport function EffectCard({\n title,\n primary,\n accent,\n index,\n expanded = true,\n onToggleExpanded,\n onRemove,\n draggable,\n onPressHandle,\n onReleaseHandle,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n dragging,\n children,\n className,\n}: EffectCardProps) {\n const stateClass = `${expanded ? 'is-expanded' : 'is-collapsed'}${dragging ? ' is-dragging' : ''}${accent ? ' has-accent' : ''}`;\n const cls = `lk-effect-card ${stateClass}${className ? ` ${className}` : ''}`;\n // Per-instance dynamic color → CSS custom property requires inline style.\n // The card's CSS re-binds --lk-accent to --lk-panel-accent so descendants tint.\n const style = accent ? ({ '--lk-panel-accent': accent } as CSSProperties) : undefined;\n\n // When a toggle handler is supplied the header acts as a disclosure button:\n // role + tab stop + Enter/Space. Bundled together so the interactive props are\n // applied as a set (no half-interactive element when onToggleExpanded is absent).\n const headProps = onToggleExpanded\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onToggleExpanded,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggleExpanded();\n }\n },\n }\n : {};\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: native HTML5 drag-and-drop container — drag events are not click/keyboard interactions and have no semantic element; the in-card handle and header carry the a11y affordances.\n <div\n className={cls}\n style={style}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className=\"lk-effect-card__head\" {...headProps}>\n {index != null ? (\n <button\n type=\"button\"\n className=\"lk-effect-card__index-badge lk-effect-card__handle\"\n title=\"Drag to reorder · click to toggle\"\n aria-label={`Item ${index + 1} — drag to reorder, click to toggle`}\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpanded?.();\n }}\n >\n {index + 1}\n </button>\n ) : (\n <span\n className=\"lk-effect-card__handle\"\n aria-hidden=\"true\"\n title=\"Drag to reorder\"\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n >\n <DragHandleIcon />\n </span>\n )}\n <span className=\"lk-effect-card__title\">{title}</span>\n {primary != null && <span className=\"lk-effect-card__primary\">{primary}</span>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"lk-effect-card__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n title=\"Remove\"\n aria-label=\"Remove\"\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className=\"lk-effect-card__body\">{children}</div>}\n </div>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ── EffectCardList ───────────────────────────────────────────────────\n// Batteries-included list wrapper that coordinates HTML5 drag-and-drop across\n// a list of EffectCards. Consumer supplies items + a renderItem callback;\n// onReorder fires with (sourceId, targetId, position) on drop. Mirrors the\n// LayerStack pattern from speech-balloons Lab.tsx:630-707.\n\nexport interface EffectCardListItem {\n id: string | number;\n}\n\nexport interface EffectCardListProps<T extends EffectCardListItem> {\n items: ReadonlyArray<T>;\n renderItem: (\n item: T,\n helpers: {\n isExpanded: boolean;\n isDragging: boolean;\n toggleExpanded: () => void;\n cardProps: Pick<\n EffectCardProps,\n | 'expanded'\n | 'dragging'\n | 'draggable'\n | 'onToggleExpanded'\n | 'onPressHandle'\n | 'onReleaseHandle'\n | 'onDragStart'\n | 'onDragEnd'\n | 'onDragOver'\n | 'onDragLeave'\n | 'onDrop'\n >;\n },\n ) => ReactNode;\n onReorder: (sourceId: T['id'], targetId: T['id'], position: 'before' | 'after') => void;\n /** Optional rendered when the list is empty. */\n empty?: ReactNode;\n /** IDs to render expanded on first mount. Defaults to all collapsed. */\n defaultExpandedIds?: ReadonlyArray<T['id']>;\n}\n\nexport function EffectCardList<T extends EffectCardListItem>({\n items,\n renderItem,\n onReorder,\n empty,\n defaultExpandedIds,\n}: EffectCardListProps<T>) {\n const [expanded, setExpanded] = useState<Set<T['id']>>(() => new Set(defaultExpandedIds ?? []));\n const [draggingId, setDraggingId] = useState<T['id'] | null>(null);\n const [pressedId, setPressedId] = useState<T['id'] | null>(null);\n const [dropHint, setDropHint] = useState<{ id: T['id']; position: 'before' | 'after' } | null>(\n null,\n );\n\n if (items.length === 0) {\n return <>{empty ?? <div className=\"lk-effect-card-list__empty\">No items.</div>}</>;\n }\n\n return (\n <div className=\"lk-effect-card-list\">\n {items.map((item) => {\n const isExpanded = expanded.has(item.id);\n const isDragging = draggingId === item.id;\n const isPressed = pressedId === item.id;\n const showHintBefore =\n dropHint && dropHint.id === item.id && dropHint.position === 'before';\n const showHintAfter = dropHint && dropHint.id === item.id && dropHint.position === 'after';\n\n const toggleExpanded = () =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) next.delete(item.id);\n else next.add(item.id);\n return next;\n });\n\n return (\n <div key={String(item.id)} className=\"lk-effect-card-list__wrap\">\n {showHintBefore && <div className=\"lk-effect-card-list__drop-hint\" />}\n {renderItem(item, {\n isExpanded,\n isDragging,\n toggleExpanded,\n cardProps: {\n expanded: isExpanded,\n dragging: isDragging,\n draggable: isPressed,\n onToggleExpanded: toggleExpanded,\n onPressHandle: () => setPressedId(item.id),\n onReleaseHandle: () => setPressedId(null),\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(item.id));\n setDraggingId(item.id);\n },\n onDragEnd: () => {\n setDraggingId(null);\n setPressedId(null);\n setDropHint(null);\n },\n onDragOver: (e) => {\n if (draggingId === null || draggingId === item.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n setDropHint({ id: item.id, position });\n },\n onDragLeave: () => {\n setDropHint((h) => (h && h.id === item.id ? null : h));\n },\n onDrop: (e) => {\n e.preventDefault();\n if (draggingId === null || draggingId === item.id) {\n setDropHint(null);\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n onReorder(draggingId, item.id, position);\n setDropHint(null);\n },\n },\n })}\n {showHintAfter && <div className=\"lk-effect-card-list__drop-hint\" />}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface PropertyGroupProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n */\n pack?: 'auto-color' | 'pairs';\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n */\nexport function PropertyGroup({\n title,\n hidden,\n children,\n className,\n pack = 'auto-color',\n}: PropertyGroupProps) {\n if (hidden) return null;\n const packClass = pack === 'pairs' ? ' lk-property-group--pairs' : '';\n const cls = `lk-property-group${packClass}${className ? ` ${className}` : ''}`;\n return (\n <div className={cls}>\n <h3 className=\"lk-property-group__title\">\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n <div className=\"lk-property-group__body\">{children}</div>\n </div>\n );\n}\n","// Display formatting helpers shared across the UI.\n//\n// House style: render negative numbers with the typographic MINUS SIGN\n// (U+2212, \"−\") instead of ASCII hyphen-minus (\"-\"). Editing surfaces should\n// accept either glyph on input via `parseSignedNumber`.\n\nconst MINUS = '−';\n\n/** Format a finite number for display, swapping the leading \"-\" to U+2212. */\nexport function formatNumber(n: number, fractionDigits?: number): string {\n if (!Number.isFinite(n)) return String(n);\n const s = fractionDigits == null ? String(n) : n.toFixed(fractionDigits);\n return s.startsWith('-') ? MINUS + s.slice(1) : s;\n}\n\n/** Parse a string that may use U+2212 or ASCII hyphen-minus for the negative sign. */\nexport function parseSignedNumber(s: string): number {\n return Number(s.replace(MINUS, '-'));\n}\n","import { type ReactNode, useState } from 'react';\nimport { dlog } from '../../passthrough/weasel-ui';\nimport { formatNumber, parseSignedNumber } from '../format';\n\nexport interface PropertyPanelProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function PropertyPanel({ title, children, className }: PropertyPanelProps) {\n const cls = className ? `lk-property-panel ${className}` : 'lk-property-panel';\n return (\n <div className={cls}>\n {title != null && <h2 className=\"lk-property-panel__title\">{title}</h2>}\n {children}\n </div>\n );\n}\n\nexport type PropertyListPack = 'auto-color' | 'pairs';\n\nexport interface PropertyListProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers, subpanels, and full-width children (`<hr>`, curve blocks)\n * still span via `lk-property-list__span`. Right for dense effect bodies.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport function PropertyList({ children, className, pack = 'auto-color' }: PropertyListProps) {\n const packClass = pack === 'pairs' ? ' lk-property-list--pairs' : '';\n const cls = `lk-property-list${packClass}${className ? ` ${className}` : ''}`;\n return <div className={cls}>{children}</div>;\n}\n\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\nexport type PropertyRowLayout = 'block' | 'inline';\n\nexport interface PropertyRowProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. \"block\" (default) stacks\n * label above control; \"inline\" places the label to the left.\n * Color and checkbox variants are always inline by their own nature.\n */\n layout?: PropertyRowLayout;\n children: ReactNode;\n htmlFor?: string;\n className?: string;\n}\n\nexport function PropertyRow({\n label,\n readout,\n variant = 'default',\n layout = 'block',\n children,\n htmlFor,\n className,\n}: PropertyRowProps) {\n const variantClass = variant === 'default' ? '' : ` lk-property-row--${variant}`;\n // Layout only meaningfully applies to the default variant; color and\n // checkbox have their own intrinsic orientation.\n const layoutClass =\n variant === 'default' && layout === 'inline' ? ' lk-property-row--inline' : '';\n const cls = `lk-property-row${variantClass}${layoutClass}${className ? ` ${className}` : ''}`;\n return (\n <label className={cls} htmlFor={htmlFor}>\n <span className=\"lk-property-row__label\">\n {label}\n {readout != null && <em className=\"lk-property-row__readout\">{readout}</em>}\n </span>\n {children}\n </label>\n );\n}\n\n// ── Row implementations ──────────────────────────────────────────────\n\nexport interface SliderRowProps {\n label: ReactNode;\n value: number;\n min: number;\n max: number;\n step?: number;\n onChange: (next: number) => void;\n /** Override how the value is rendered next to the label. Defaults to `value.toString()`. */\n format?: (value: number) => ReactNode;\n /**\n * Optional suffix rendered next to the readout. A string becomes a\n * baseline-aligned dim \"word\" unit (e.g. \"px\"); pass JSX like `<sup>°</sup>`\n * to get the browser's native super positioning for symbol units.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n}\n\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n onChange,\n format,\n unit,\n layout,\n}: SliderRowProps) {\n // Default readout precision tracks `step`: integer steps → 0 decimals,\n // 0.1 → 1 decimal, 0.05/0.02/0.01 → 2 decimals, 0.005 → 3, etc. Callers\n // can still pass an explicit `format` to override (e.g. for a custom\n // unit string or a non-decimal display like fractions).\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const effectiveFormat = format ?? ((n: number) => formatNumber(n, decimals));\n return (\n <PropertyRow\n label={label}\n readout={\n <EditableReadout\n value={value}\n min={min}\n max={max}\n format={effectiveFormat}\n unit={unit}\n onCommit={onChange}\n />\n }\n layout={layout}\n >\n <input\n type=\"range\"\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => {\n const v = Number(e.target.value);\n dlog('property-panel', 'slider', { label, value: v });\n onChange(v);\n }}\n />\n </PropertyRow>\n );\n}\n\ninterface EditableReadoutProps {\n value: number;\n min: number;\n max: number;\n format?: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so the wrapping <label> doesn't\n * forward focus to the slider thumb.\n */\nfunction EditableReadout({ value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused. Live value mirrors\n // into the input otherwise. Pattern mirrors speech-balloons Lab.tsx:893-942.\n const [draft, setDraft] = useState<string | null>(null);\n const fmt = (n: number) => (format ? format(n) : formatNumber(n));\n const displayValue =\n draft !== null\n ? draft\n : (() => {\n const formatted = fmt(value);\n return typeof formatted === 'string' ? formatted : String(formatted);\n })();\n\n const suffix =\n unit == null ? null : typeof unit === 'string' ? (\n <span className=\"lk-property-row__readout-unit\">{unit}</span>\n ) : (\n unit\n );\n\n const commit = () => {\n if (draft !== null) {\n const n = parseSignedNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className=\"lk-property-row__readout-group\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className=\"lk-property-row__readout-input\"\n value={displayValue}\n onFocus={(e) => {\n const formatted = fmt(value);\n setDraft(typeof formatted === 'string' ? formatted : String(formatted));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n // Stop the click from reaching the wrapping <label> (which would\n // forward focus to the slider thumb).\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {suffix}\n </span>\n );\n}\n\nexport interface ColorRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n /** 0..1 alpha. When provided, a translucent slider renders beneath the swatch. */\n alpha?: number;\n onAlphaChange?: (next: number) => void;\n /**\n * Render the alpha track as inert (dimmed, no thumb, not-allowed cursor).\n * Use when the color's consumer drops alpha so the affordance reads dead.\n */\n alphaDisabled?: boolean;\n}\n\nexport function ColorRow({\n label,\n value,\n onChange,\n alpha,\n onAlphaChange,\n alphaDisabled,\n}: ColorRowProps) {\n const showAlpha = alpha != null;\n const className = alphaDisabled ? 'lk-property-row--alpha-disabled' : undefined;\n return (\n <PropertyRow label={label} variant=\"color\" className={className}>\n <input type=\"color\" value={value} onChange={(e) => onChange(e.target.value)} />\n {showAlpha && (\n <input\n type=\"range\"\n className=\"lk-property-row__alpha\"\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={alphaDisabled}\n onChange={(e) => onAlphaChange?.(Number(e.target.value))}\n />\n )}\n </PropertyRow>\n );\n}\n\nexport interface CheckboxRowProps {\n label: ReactNode;\n value: boolean;\n onChange: (next: boolean) => void;\n}\n\nexport function CheckboxRow({ label, value, onChange }: CheckboxRowProps) {\n return (\n <PropertyRow label={label} variant=\"checkbox\">\n <input type=\"checkbox\" checked={value} onChange={(e) => onChange(e.target.checked)} />\n </PropertyRow>\n );\n}\n\nexport interface TextRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n layout?: PropertyRowLayout;\n}\n\nexport function TextRow({ label, value, onChange, placeholder, maxLength, layout }: TextRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n />\n </PropertyRow>\n );\n}\n\nexport interface NumberRowProps {\n label: ReactNode;\n value: number;\n onChange: (next: number) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n layout?: PropertyRowLayout;\n}\n\nexport function NumberRow({\n label,\n value,\n onChange,\n min,\n max,\n step,\n placeholder,\n layout,\n}: NumberRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"number\"\n value={value}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) onChange(n);\n }}\n />\n </PropertyRow>\n );\n}\n\nexport interface SelectOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SelectRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function SelectRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: SelectRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value as T;\n dlog('property-panel', 'select', { label, value: v });\n onChange(v);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {/* HTML <option> only renders text; ReactNode → string coerce */}\n {opt.label as string}\n </option>\n ))}\n </select>\n </PropertyRow>\n );\n}\n\nexport interface ToggleRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function ToggleRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: ToggleRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <div className=\"lk-property-row__toggle\">\n {options.map((opt) => {\n const selected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-pressed={selected}\n className={\n selected\n ? 'lk-property-row__toggle-button lk-property-row__toggle-button--selected'\n : 'lk-property-row__toggle-button'\n }\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </PropertyRow>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/instrument/capabilityDetector.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/lab/gridDims.ts","../src/dragdrop/DragGhost.tsx","../src/dragdrop/DragDropRuntime.tsx","../src/dragdrop/Palette.tsx","../src/lab/LabContext.ts","../src/workspace/DefaultSidebar.tsx","../src/workspace/DefaultStatusBar.tsx","../src/workspace/DefaultToolbar.tsx","../src/workspace/WorkspaceChrome.tsx","../src/workspace/Workspace.tsx","../src/workspace/workspaceOps.ts","../src/lab/LabShell.tsx","../src/lab/WorkspaceGrid.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../src/ui/format.ts","../src/ui/properties/PropertyPanel.tsx"],"names":["useState","useEffect","jsx","jsxs","useContext","useStore","useRef","useMemo","p","Fragment","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { Instrument } from './types';\n\nexport interface CapabilityFlags {\n hasCanvas: boolean;\n hasLayers: boolean;\n hasDragDrop: boolean;\n hasUndo: boolean;\n}\n\nexport function detectCapabilities(instrument: Instrument<unknown, unknown>): CapabilityFlags {\n return {\n hasCanvas: instrument.canvas != null,\n hasLayers: instrument.layers != null,\n hasDragDrop: instrument.dragDrop != null,\n hasUndo: instrument.undo != null,\n };\n}\n","import type { Instrument } from './types';\n\nexport function defineInstrument<TS, TC>(spec: Instrument<TS, TC>): Instrument<TS, TC> {\n return spec;\n}\n","import type { ConfigField, ConfigFieldType } from '../controls/types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst KNOWN_TYPES: ConfigFieldType[] = ['slider', 'checkbox', 'select', 'number', 'text', 'color'];\n\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (!KNOWN_TYPES.includes(field.type)) {\n errors.push(`Unknown field type: \"${field.type}\" on key \"${field.key}\"`);\n continue;\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","export interface GridDims {\n cols: number;\n rows: number;\n}\n\nexport function gridDims(count: number): GridDims {\n if (count <= 1) return { cols: 1, rows: 1 };\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n return { cols, rows };\n}\n","import { type ReactPortal, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PaletteItem, Point } from '../instrument/types';\n\nexport interface DragGhostProps {\n item: PaletteItem;\n screenPos: Point;\n}\n\nexport function DragGhost({ item, screenPos }: DragGhostProps): ReactPortal | null {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n if (!mounted || typeof document === 'undefined') return null;\n const style = {\n left: `${screenPos.x + 12}px`,\n top: `${screenPos.y + 12}px`,\n };\n return createPortal(\n <div className=\"lk-drag-ghost\" style={style}>\n <span className=\"lk-drag-ghost__label\">{item.label}</span>\n </div>,\n document.body,\n );\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { screenToWorld } from '../canvas/canvasCoords';\nimport type {\n DragDropCapability,\n DragFeedback,\n PaletteItem,\n Point,\n ViewTransform,\n} from '../instrument/types';\nimport { DragGhost } from './DragGhost';\n\nexport interface DragState {\n item: PaletteItem;\n screenPos: Point;\n feedback: DragFeedback | null;\n}\n\nexport interface UseDragDropArgs<TS, TC> {\n capability: DragDropCapability<TS, TC>;\n canvasContainerRef: RefObject<HTMLElement | null>;\n view: ViewTransform;\n state: TS;\n config: TC;\n setState: (next: TS | ((prev: TS) => TS)) => void;\n emit: (event: string) => void;\n}\n\nexport interface UseDragDropResult {\n drag: DragState | null;\n startDrag: (item: PaletteItem, originScreenPos: Point) => void;\n}\n\nexport function useDragDrop<TS, TC>({\n capability,\n canvasContainerRef,\n view,\n state,\n config,\n setState,\n emit,\n}: UseDragDropArgs<TS, TC>): UseDragDropResult {\n const [drag, setDrag] = useState<DragState | null>(null);\n const dragRef = useRef<DragState | null>(null);\n dragRef.current = drag;\n const rafThrottle = useRef<number | null>(null);\n\n const isOverCanvas = useCallback(\n (screenPos: Point): boolean => {\n const el = canvasContainerRef.current;\n if (!el) return false;\n const r = el.getBoundingClientRect();\n return (\n screenPos.x >= r.left &&\n screenPos.x <= r.right &&\n screenPos.y >= r.top &&\n screenPos.y <= r.bottom\n );\n },\n [canvasContainerRef],\n );\n\n const screenToWorldFromContainer = useCallback(\n (screenPos: Point): Point | null => {\n const el = canvasContainerRef.current;\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return screenToWorld({ x: screenPos.x - r.left, y: screenPos.y - r.top }, view);\n },\n [canvasContainerRef, view],\n );\n\n useEffect(() => {\n if (!drag) return;\n const handleMove = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const current = dragRef.current;\n if (!current) return;\n if (rafThrottle.current !== null) {\n dragRef.current = { ...current, screenPos };\n setDrag(dragRef.current);\n return;\n }\n rafThrottle.current = requestAnimationFrame(() => {\n rafThrottle.current = null;\n const active = dragRef.current;\n if (!active) return;\n let feedback: DragFeedback | null = null;\n if (capability.onDragOver && isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) feedback = capability.onDragOver(world, active.item, state, config);\n }\n setDrag({ ...active, screenPos, feedback });\n });\n };\n const handleUp = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const active = dragRef.current;\n if (!active) return;\n if (rafThrottle.current !== null) {\n cancelAnimationFrame(rafThrottle.current);\n rafThrottle.current = null;\n }\n if (isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) {\n const nextState = capability.onDrop(world, active.item, state, config);\n setState(nextState);\n emit('canvas.itemAdded');\n }\n }\n setDrag(null);\n };\n window.addEventListener('pointermove', handleMove);\n window.addEventListener('pointerup', handleUp);\n return () => {\n window.removeEventListener('pointermove', handleMove);\n window.removeEventListener('pointerup', handleUp);\n };\n }, [drag, capability, state, config, setState, emit, isOverCanvas, screenToWorldFromContainer]);\n\n const startDrag = useCallback((item: PaletteItem, originScreenPos: Point) => {\n setDrag({ item, screenPos: originScreenPos, feedback: null });\n }, []);\n\n return { drag, startDrag };\n}\n\nexport interface DragOverlayProps {\n drag: DragState | null;\n}\n\nexport function DragOverlay({ drag }: DragOverlayProps) {\n if (!drag) return null;\n return <DragGhost item={drag.item} screenPos={drag.screenPos} />;\n}\n","import type { PaletteItem, Point } from '../instrument/types';\n\nexport interface PaletteProps {\n items: PaletteItem[];\n onDragStart: (item: PaletteItem, originScreenPos: Point) => void;\n className?: string;\n}\n\nexport function Palette({ items, onDragStart, className }: PaletteProps) {\n return (\n <div className={className ? `lk-palette ${className}` : 'lk-palette'}>\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.id}\n className=\"lk-palette__item\"\n onPointerDown={(e) => {\n e.preventDefault();\n onDragStart(item, { x: e.clientX, y: e.clientY });\n }}\n >\n <span className=\"lk-palette__label\">{item.label}</span>\n </button>\n ))}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport type { SavedSnapshot, WorkspaceRecord } from '../state/types';\n\nexport interface LabContextValue {\n instruments: Instrument[];\n workspaces: WorkspaceRecord[];\n addWorkspace: (instrumentName: string) => void;\n cloneWorkspace: (id: string) => void;\n closeWorkspace: (id: string) => void;\n resetWorkspace: (id: string) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (workspaceId: string, name?: string) => void;\n loadSnapshot: (workspaceId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n theme: 'auto' | 'light' | 'interstellar';\n setTheme: (t: 'auto' | 'light' | 'interstellar') => void;\n}\n\nexport const LabContext = createContext<LabContextValue | null>(null);\n\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { ControlPanel } from '../controls/ControlPanel';\nimport { Sidebar } from '../primitives/Sidebar';\nimport type { WorkspaceSidebarContext } from './slotTypes';\n\nexport interface DefaultSidebarProps {\n ctx: WorkspaceSidebarContext;\n}\n\nexport function DefaultSidebar({ ctx }: DefaultSidebarProps) {\n if (ctx.configFields.length === 0) {\n return (\n <Sidebar title={ctx.instrumentName}>\n <div className=\"lk-sidebar__placeholder\">{ctx.instrumentName} has no config fields.</div>\n </Sidebar>\n );\n }\n return (\n <Sidebar title={ctx.instrumentName}>\n <ControlPanel\n fields={ctx.configFields}\n config={ctx.config as Record<string, unknown>}\n setConfig={(key, value) => ctx.setConfig(key as string, value)}\n />\n </Sidebar>\n );\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport type { WorkspaceStatusBarContext } from './slotTypes';\n\nexport interface DefaultStatusBarProps {\n ctx: WorkspaceStatusBarContext;\n}\n\nexport function DefaultStatusBar({ ctx }: DefaultStatusBarProps) {\n return (\n <StatusBar>\n <StatusBar.Section>{ctx.instrumentName}</StatusBar.Section>\n <StatusBar.Section>{Math.round(ctx.zoom * 100)}%</StatusBar.Section>\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport type { WorkspaceToolbarContext } from './slotTypes';\n\nexport interface DefaultToolbarProps {\n ctx: WorkspaceToolbarContext;\n}\n\nexport function DefaultToolbar({ ctx }: DefaultToolbarProps) {\n return (\n <Toolbar>\n {ctx.hasUndo && (\n <>\n <Toolbar.Button onClick={ctx.undo} disabled={!ctx.canUndo} title=\"Undo (Cmd/Ctrl+Z)\">\n Undo\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.redo}\n disabled={!ctx.canRedo}\n title=\"Redo (Cmd/Ctrl+Shift+Z)\"\n >\n Redo\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n {ctx.hasCanvas && (\n <>\n <Toolbar.Button onClick={ctx.zoomOut} title=\"Zoom out\">\n −\n </Toolbar.Button>\n <span className=\"lk-toolbar__zoom-label\">{Math.round(ctx.zoom * 100)}%</span>\n <Toolbar.Button onClick={ctx.zoomIn} title=\"Zoom in\">\n +\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.resetZoom} title=\"Reset zoom\">\n 1:1\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n <Toolbar.Button onClick={() => ctx.saveSnapshot()} title=\"Save snapshot (Cmd/Ctrl+S)\">\n Save\n </Toolbar.Button>\n\n {ctx.savedSnapshots.length > 0 && (\n <select\n className=\"lk-toolbar__load-select\"\n aria-label=\"Load snapshot\"\n defaultValue=\"\"\n onChange={(e) => {\n const id = e.target.value;\n if (id) {\n ctx.loadSnapshot(id);\n e.target.value = '';\n }\n }}\n >\n <option value=\"\" disabled>\n Load…\n </option>\n {ctx.savedSnapshots.map((sn) => (\n <option key={sn.id} value={sn.id}>\n {sn.name}\n </option>\n ))}\n </select>\n )}\n\n <Toolbar.Spacer />\n\n <Toolbar.Button onClick={ctx.clone} title=\"Clone workspace\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset workspace\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastWorkspace}\n title={ctx.isLastWorkspace ? 'Cannot close the last workspace' : 'Close workspace'}\n >\n Close\n </Toolbar.Button>\n </Toolbar>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LabStoreContext } from '../state/context';\nimport type { WorkspaceRecord } from '../state/types';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n WorkspaceSidebarContext,\n WorkspaceStatusBarContext,\n WorkspaceToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\nexport interface WorkspaceChromeProps {\n workspaceId: string;\n record: WorkspaceRecord;\n instrument: Instrument;\n isLastWorkspace: boolean;\n toolbar?: ToolbarSlot;\n sidebar?: SidebarSlot;\n statusBar?: StatusBarSlot;\n undoBindings?: UndoBindings;\n sidebarExtras?: ReactNode;\n children: ReactNode;\n}\n\nexport function WorkspaceChrome({\n workspaceId,\n record,\n instrument,\n isLastWorkspace,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n sidebarExtras,\n children,\n}: WorkspaceChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] WorkspaceChrome requires <LabStoreProvider>');\n const updateWorkspaceView = useStore(storeCtx.store, (s) => s.updateWorkspaceView);\n const updateWorkspaceConfig = useStore(storeCtx.store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceState = useStore(storeCtx.store, (s) => s.updateWorkspaceState);\n\n const toolbarCtx = useMemo<WorkspaceToolbarContext>(() => {\n const setZoom = (z: number): void => {\n updateWorkspaceView(workspaceId, { ...record.view, zoom: z });\n };\n return {\n workspaceId,\n instrumentName: record.instrumentName,\n hasUndo: instrument.undo != null,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? (() => {}),\n redo: undoBindings?.redo ?? (() => {}),\n zoom: record.view.zoom,\n setZoom,\n zoomIn: () => setZoom(record.view.zoom * 1.25),\n zoomOut: () => setZoom(record.view.zoom * 0.8),\n resetZoom: () => setZoom(1),\n hasCanvas: instrument.canvas != null,\n savedSnapshots: lab.savedSnapshots.filter((s) => s.workspaceId === workspaceId),\n saveSnapshot: (name) => lab.saveSnapshot(workspaceId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(workspaceId, snapshotId),\n clone: () => lab.cloneWorkspace(workspaceId),\n reset: () => lab.resetWorkspace(workspaceId),\n close: () => lab.closeWorkspace(workspaceId),\n isLastWorkspace,\n };\n }, [workspaceId, record, instrument, lab, isLastWorkspace, updateWorkspaceView, undoBindings]);\n\n const sidebarCtx = useMemo<WorkspaceSidebarContext>(\n () => ({\n workspaceId,\n instrumentName: record.instrumentName,\n configFields: instrument.configSchema?.() ?? [],\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateWorkspaceConfig(workspaceId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateWorkspaceState(workspaceId, nextState as never);\n }\n },\n }),\n [workspaceId, record, instrument, updateWorkspaceConfig, updateWorkspaceState],\n );\n\n const statusCtx: WorkspaceStatusBarContext = {\n workspaceId,\n instrumentName: record.instrumentName,\n zoom: record.view.zoom,\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) toolbarCtx.redo();\n else toolbarCtx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n toolbarCtx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-workspace\"\n aria-label={`Workspace ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-workspace__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-workspace__body\">\n <div className=\"lk-workspace__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-workspace__content\">{children}</div>\n </div>\n <div className=\"lk-workspace__status\">\n {statusBar ? statusBar(statusCtx) : <DefaultStatusBar ctx={statusCtx} />}\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n ViewTransform,\n} from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { LabStoreContext } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { WorkspaceRecord } from '../state/types';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { UndoBindings } from './WorkspaceChrome';\nimport { WorkspaceChrome } from './WorkspaceChrome';\n\nexport interface WorkspaceProps {\n id: string;\n}\n\nexport function Workspace({ id }: WorkspaceProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Workspace> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.workspaces.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-workspace lk-workspace--unknown\">Workspace not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-workspace lk-workspace--unknown\">\n Unknown instrument: {record.instrumentName}\n </div>\n );\n }\n return (\n <WorkspaceRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.workspaces.length <= 1}\n />\n );\n}\n\ninterface WorkspaceRuntimeProps {\n record: WorkspaceRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction WorkspaceRuntime({ record, instrument, store, isLast }: WorkspaceRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateWorkspaceState = useStore(store, (s) => s.updateWorkspaceState);\n const updateWorkspaceConfig = useStore(store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceView = useStore(store, (s) => s.updateWorkspaceView);\n const updateWorkspaceUndoStack = useStore(store, (s) => s.updateWorkspaceUndoStack);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().workspaces.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateWorkspaceUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: ViewTransform): void => updateWorkspaceView(record.id, v);\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateWorkspaceState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateWorkspaceConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n workspace: {\n id: record.id,\n zoom: record.view.zoom,\n setZoom: (z) => updateWorkspaceView(record.id, { ...record.view, zoom: z }),\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n };\n\n const undoBindings: UndoBindings | undefined = undoCap\n ? {\n canUndo: record.undoStack.past.length > 0,\n canRedo: record.undoStack.future.length > 0,\n undo: () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view) =>\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom }),\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((lid) => ({ id: lid, label: lid }));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: record.view,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateWorkspaceState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div\n ref={canvasContainerRef}\n className=\"lk-workspace__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack layers={layersWithFeedback} view={record.view} onViewChange={setView} />\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const paletteNode =\n paletteItems.length > 0 ? (\n <Palette items={paletteItems} onDragStart={dragDropResult.startDrag} />\n ) : null;\n\n const layerListNode =\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null;\n\n return (\n <WorkspaceChrome\n workspaceId={record.id}\n record={record}\n instrument={instrument}\n isLastWorkspace={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </WorkspaceChrome>\n );\n}\n","import type { Instrument } from '../instrument/types';\nimport type { WorkspaceRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: Instrument[], name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): WorkspaceRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\nexport function addWorkspace(\n workspaces: WorkspaceRecord[],\n instruments: Instrument[],\n instrumentName: string,\n): WorkspaceRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: WorkspaceRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces, record];\n}\n\nexport function cloneWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n const sourceIdx = workspaces.findIndex((w) => w.id === id);\n const source = workspaces[sourceIdx];\n if (!source) return workspaces;\n const clone: WorkspaceRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces.slice(0, sourceIdx + 1), clone, ...workspaces.slice(sourceIdx + 1)];\n}\n\nexport function closeWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n if (workspaces.length <= 1) return workspaces;\n const next = workspaces.filter((w) => w.id !== id);\n return next.length === workspaces.length ? workspaces : next;\n}\n\nexport function resetWorkspace(\n workspaces: WorkspaceRecord[],\n id: string,\n instruments: Instrument[],\n): WorkspaceRecord[] {\n const idx = workspaces.findIndex((w) => w.id === id);\n const current = workspaces[idx];\n if (!current) return workspaces;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: WorkspaceRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...workspaces.slice(0, idx), reset, ...workspaces.slice(idx + 1)];\n}\n","import type { ReactNode } from 'react';\n\nexport type LabTheme = 'auto' | 'light' | 'interstellar';\n\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Theme override. \"auto\" (default) follows prefers-color-scheme. */\n theme?: LabTheme;\n}\n\nexport function LabShell({ title, children, header, footer, theme = 'auto' }: LabShellProps) {\n const themeClass =\n theme === 'light'\n ? ' lk-theme-light'\n : theme === 'interstellar'\n ? ' lk-theme-interstellar'\n : '';\n return (\n <div className={`lk-root lk-shell${themeClass}`}>\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n}\n","import { Children, type CSSProperties, type ReactNode } from 'react';\nimport { gridDims } from './gridDims';\n\nexport interface WorkspaceGridProps {\n children: ReactNode;\n}\n\nexport function WorkspaceGrid({ children }: WorkspaceGridProps) {\n const count = Children.count(children);\n const { cols, rows } = gridDims(count);\n const style = {\n '--lk-grid-cols': String(cols),\n '--lk-grid-rows': String(rows),\n } as CSSProperties;\n return (\n <div className=\"lk-workspace-grid\" style={style}>\n {children}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { Workspace } from '../workspace/Workspace';\nimport {\n addWorkspace as addWorkspaceOp,\n cloneWorkspace as cloneWorkspaceOp,\n closeWorkspace as closeWorkspaceOp,\n resetWorkspace as resetWorkspaceOp,\n} from '../workspace/workspaceOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { WorkspaceGrid } from './WorkspaceGrid';\n\nexport interface LabProps {\n instruments: Instrument[];\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n theme?: 'auto' | 'light' | 'interstellar';\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless `theme=\"interstellar\"` is active.\n */\n nebula?: readonly string[];\n title?: string;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: Instrument[],\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialTheme: 'auto' | 'light' | 'interstellar',\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialTheme });\n if (store.getState().workspaces.length === 0) {\n const seeded = addWorkspaceOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addWorkspace(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length]!;\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n theme,\n nebula,\n title,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n theme ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const workspaces = useStore(store, (s) => s.workspaces);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const themeValue = useStore(store, (s) => s.theme);\n\n useEffect(() => {\n if (theme && theme !== store.getState().theme) {\n store.getState().setTheme(theme);\n }\n }, [theme, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceWorkspaces = (next: WorkspaceRecord[]): void => {\n const currentById = new Map(store.getState().workspaces.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ workspaces: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setTheme(store.getState().theme);\n };\n\n return {\n instruments,\n workspaces,\n addWorkspace: (instrumentName) => {\n const next = addWorkspaceOp(store.getState().workspaces, instruments, instrumentName);\n replaceWorkspaces(next);\n },\n cloneWorkspace: (id) => {\n const next = cloneWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n closeWorkspace: (id) => {\n const next = closeWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n resetWorkspace: (id) => {\n const next = resetWorkspaceOp(store.getState().workspaces, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n workspaces: s.workspaces.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateWorkspaceView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (workspaceId, name) => {\n store.getState().saveSnapshot(workspaceId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (workspaceId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, workspaceId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n theme: themeValue,\n setTheme: (t) => {\n store.getState().setTheme(t);\n },\n };\n }, [instruments, workspaces, savedSnapshots, themeValue, store]);\n\n const themeClass =\n themeValue === 'light'\n ? 'lk-theme-light'\n : themeValue === 'interstellar'\n ? 'lk-theme-interstellar'\n : '';\n\n // Only apply the nebula override when interstellar is active and at\n // least one color is provided. Setting a CSS custom property is the\n // sanctioned use of inline style.\n const nebulaStyle =\n themeValue === 'interstellar' && nebula && nebula.length > 0\n ? ({ ['--lk-space-nebula' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <div className={`lk-lab ${themeClass}`.trim()} style={nebulaStyle}>\n <LabShell title={title ?? 'Labkit'} theme={themeValue} header={children}>\n <WorkspaceGrid>\n {workspaces.map((w) => (\n <Workspace key={w.id} id={w.id} />\n ))}\n </WorkspaceGrid>\n </LabShell>\n </div>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { type ControlPoint, CurveEditor, dlog } from '../../passthrough/weasel-ui';\n\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import it from `@weasel-js/labkit/weasel-ui`.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i]!, y: values[i + 1]! });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i]!.y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i]!.x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i]!, y: values[i + 1]! });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i]!;\n flipped[i + 1] = 2 * mid - values[i + 1]!;\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className=\"lk-curve-field\">\n <div className=\"lk-curve-field__plot\">\n <CurveEditor\n value={points}\n onChange={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className=\"lk-curve-field__marks\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className=\"lk-curve-field__actions\">\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className=\"lk-curve-field__action\"\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from 'react';\n\n// ── Subpanel ─────────────────────────────────────────────────────────\n// Headered group of controls inside a wider panel/list. The header is a\n// label flanked by a horizontal rule — no background, padding, or border;\n// purely a typographic divider. Ported from speech-balloons styles.css:277-313.\n\nexport interface SubpanelProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Subpanel({ title, children, className }: SubpanelProps) {\n const cls = className ? `lk-subpanel ${className}` : 'lk-subpanel';\n return (\n <div className={cls}>\n <h4 className=\"lk-subpanel__title\">\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n\n// ── EffectCard ───────────────────────────────────────────────────────\n// Draggable, collapsible card for stacked effect editors. Optional --lk-panel-accent\n// per-instance recolors the title bar, border-left, and (via re-binding --lk-accent\n// inside the card) every descendant control that reads from the accent token.\n\nexport interface EffectCardProps {\n /** Card title rendered in the title bar (e.g. effect kind label or a select). */\n title: ReactNode;\n /** Optional badge/chip displayed before the remove button (e.g. primary value summary). */\n primary?: ReactNode;\n /** Optional accent color in any CSS color form. Sets --lk-panel-accent on the card. */\n accent?: string;\n /** Optional ordinal badge that doubles as the drag handle (used by tail cards in SB). */\n index?: number;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n onRemove?: () => void;\n /**\n * Drag-handle wiring. When provided, an inline handle (⋮⋮ icon or `index`)\n * activates HTML5 drag on press. Consumer owns the drag/drop coordination —\n * see EffectCardList for the batteries-included wrapper.\n */\n draggable?: boolean;\n onPressHandle?: () => void;\n onReleaseHandle?: () => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n dragging?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\nexport function EffectCard({\n title,\n primary,\n accent,\n index,\n expanded = true,\n onToggleExpanded,\n onRemove,\n draggable,\n onPressHandle,\n onReleaseHandle,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n dragging,\n children,\n className,\n}: EffectCardProps) {\n const stateClass = `${expanded ? 'is-expanded' : 'is-collapsed'}${dragging ? ' is-dragging' : ''}${accent ? ' has-accent' : ''}`;\n const cls = `lk-effect-card ${stateClass}${className ? ` ${className}` : ''}`;\n // Per-instance dynamic color → CSS custom property requires inline style.\n // The card's CSS re-binds --lk-accent to --lk-panel-accent so descendants tint.\n const style = accent ? ({ '--lk-panel-accent': accent } as CSSProperties) : undefined;\n\n // When a toggle handler is supplied the header acts as a disclosure button:\n // role + tab stop + Enter/Space. Bundled together so the interactive props are\n // applied as a set (no half-interactive element when onToggleExpanded is absent).\n const headProps = onToggleExpanded\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onToggleExpanded,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggleExpanded();\n }\n },\n }\n : {};\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: native HTML5 drag-and-drop container — drag events are not click/keyboard interactions and have no semantic element; the in-card handle and header carry the a11y affordances.\n <div\n className={cls}\n style={style}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className=\"lk-effect-card__head\" {...headProps}>\n {index != null ? (\n <button\n type=\"button\"\n className=\"lk-effect-card__index-badge lk-effect-card__handle\"\n title=\"Drag to reorder · click to toggle\"\n aria-label={`Item ${index + 1} — drag to reorder, click to toggle`}\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpanded?.();\n }}\n >\n {index + 1}\n </button>\n ) : (\n <span\n className=\"lk-effect-card__handle\"\n aria-hidden=\"true\"\n title=\"Drag to reorder\"\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n >\n <DragHandleIcon />\n </span>\n )}\n <span className=\"lk-effect-card__title\">{title}</span>\n {primary != null && <span className=\"lk-effect-card__primary\">{primary}</span>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"lk-effect-card__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n title=\"Remove\"\n aria-label=\"Remove\"\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className=\"lk-effect-card__body\">{children}</div>}\n </div>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ── EffectCardList ───────────────────────────────────────────────────\n// Batteries-included list wrapper that coordinates HTML5 drag-and-drop across\n// a list of EffectCards. Consumer supplies items + a renderItem callback;\n// onReorder fires with (sourceId, targetId, position) on drop. Mirrors the\n// LayerStack pattern from speech-balloons Lab.tsx:630-707.\n\nexport interface EffectCardListItem {\n id: string | number;\n}\n\nexport interface EffectCardListProps<T extends EffectCardListItem> {\n items: ReadonlyArray<T>;\n renderItem: (\n item: T,\n helpers: {\n isExpanded: boolean;\n isDragging: boolean;\n toggleExpanded: () => void;\n cardProps: Pick<\n EffectCardProps,\n | 'expanded'\n | 'dragging'\n | 'draggable'\n | 'onToggleExpanded'\n | 'onPressHandle'\n | 'onReleaseHandle'\n | 'onDragStart'\n | 'onDragEnd'\n | 'onDragOver'\n | 'onDragLeave'\n | 'onDrop'\n >;\n },\n ) => ReactNode;\n onReorder: (sourceId: T['id'], targetId: T['id'], position: 'before' | 'after') => void;\n /** Optional rendered when the list is empty. */\n empty?: ReactNode;\n /** IDs to render expanded on first mount. Defaults to all collapsed. */\n defaultExpandedIds?: ReadonlyArray<T['id']>;\n}\n\nexport function EffectCardList<T extends EffectCardListItem>({\n items,\n renderItem,\n onReorder,\n empty,\n defaultExpandedIds,\n}: EffectCardListProps<T>) {\n const [expanded, setExpanded] = useState<Set<T['id']>>(() => new Set(defaultExpandedIds ?? []));\n const [draggingId, setDraggingId] = useState<T['id'] | null>(null);\n const [pressedId, setPressedId] = useState<T['id'] | null>(null);\n const [dropHint, setDropHint] = useState<{ id: T['id']; position: 'before' | 'after' } | null>(\n null,\n );\n\n if (items.length === 0) {\n return <>{empty ?? <div className=\"lk-effect-card-list__empty\">No items.</div>}</>;\n }\n\n return (\n <div className=\"lk-effect-card-list\">\n {items.map((item) => {\n const isExpanded = expanded.has(item.id);\n const isDragging = draggingId === item.id;\n const isPressed = pressedId === item.id;\n const showHintBefore =\n dropHint && dropHint.id === item.id && dropHint.position === 'before';\n const showHintAfter = dropHint && dropHint.id === item.id && dropHint.position === 'after';\n\n const toggleExpanded = () =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) next.delete(item.id);\n else next.add(item.id);\n return next;\n });\n\n return (\n <div key={String(item.id)} className=\"lk-effect-card-list__wrap\">\n {showHintBefore && <div className=\"lk-effect-card-list__drop-hint\" />}\n {renderItem(item, {\n isExpanded,\n isDragging,\n toggleExpanded,\n cardProps: {\n expanded: isExpanded,\n dragging: isDragging,\n draggable: isPressed,\n onToggleExpanded: toggleExpanded,\n onPressHandle: () => setPressedId(item.id),\n onReleaseHandle: () => setPressedId(null),\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(item.id));\n setDraggingId(item.id);\n },\n onDragEnd: () => {\n setDraggingId(null);\n setPressedId(null);\n setDropHint(null);\n },\n onDragOver: (e) => {\n if (draggingId === null || draggingId === item.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n setDropHint({ id: item.id, position });\n },\n onDragLeave: () => {\n setDropHint((h) => (h && h.id === item.id ? null : h));\n },\n onDrop: (e) => {\n e.preventDefault();\n if (draggingId === null || draggingId === item.id) {\n setDropHint(null);\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n onReorder(draggingId, item.id, position);\n setDropHint(null);\n },\n },\n })}\n {showHintAfter && <div className=\"lk-effect-card-list__drop-hint\" />}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface PropertyGroupProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n */\n pack?: 'auto-color' | 'pairs';\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n */\nexport function PropertyGroup({\n title,\n hidden,\n children,\n className,\n pack = 'auto-color',\n}: PropertyGroupProps) {\n if (hidden) return null;\n const packClass = pack === 'pairs' ? ' lk-property-group--pairs' : '';\n const cls = `lk-property-group${packClass}${className ? ` ${className}` : ''}`;\n return (\n <div className={cls}>\n <h3 className=\"lk-property-group__title\">\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n <div className=\"lk-property-group__body\">{children}</div>\n </div>\n );\n}\n","// Display formatting helpers shared across the UI.\n//\n// House style: render negative numbers with the typographic MINUS SIGN\n// (U+2212, \"−\") instead of ASCII hyphen-minus (\"-\"). Editing surfaces should\n// accept either glyph on input via `parseSignedNumber`.\n\nconst MINUS = '−';\n\n/** Format a finite number for display, swapping the leading \"-\" to U+2212. */\nexport function formatNumber(n: number, fractionDigits?: number): string {\n if (!Number.isFinite(n)) return String(n);\n const s = fractionDigits == null ? String(n) : n.toFixed(fractionDigits);\n return s.startsWith('-') ? MINUS + s.slice(1) : s;\n}\n\n/** Parse a string that may use U+2212 or ASCII hyphen-minus for the negative sign. */\nexport function parseSignedNumber(s: string): number {\n return Number(s.replace(MINUS, '-'));\n}\n","import { type ReactNode, useState } from 'react';\nimport { dlog } from '../../passthrough/weasel-ui';\nimport { formatNumber, parseSignedNumber } from '../format';\n\nexport interface PropertyPanelProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function PropertyPanel({ title, children, className }: PropertyPanelProps) {\n const cls = className ? `lk-property-panel ${className}` : 'lk-property-panel';\n return (\n <div className={cls}>\n {title != null && <h2 className=\"lk-property-panel__title\">{title}</h2>}\n {children}\n </div>\n );\n}\n\nexport type PropertyListPack = 'auto-color' | 'pairs';\n\nexport interface PropertyListProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers, subpanels, and full-width children (`<hr>`, curve blocks)\n * still span via `lk-property-list__span`. Right for dense effect bodies.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport function PropertyList({ children, className, pack = 'auto-color' }: PropertyListProps) {\n const packClass = pack === 'pairs' ? ' lk-property-list--pairs' : '';\n const cls = `lk-property-list${packClass}${className ? ` ${className}` : ''}`;\n return <div className={cls}>{children}</div>;\n}\n\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\nexport type PropertyRowLayout = 'block' | 'inline';\n\nexport interface PropertyRowProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. \"block\" (default) stacks\n * label above control; \"inline\" places the label to the left.\n * Color and checkbox variants are always inline by their own nature.\n */\n layout?: PropertyRowLayout;\n children: ReactNode;\n htmlFor?: string;\n className?: string;\n}\n\nexport function PropertyRow({\n label,\n readout,\n variant = 'default',\n layout = 'block',\n children,\n htmlFor,\n className,\n}: PropertyRowProps) {\n const variantClass = variant === 'default' ? '' : ` lk-property-row--${variant}`;\n // Layout only meaningfully applies to the default variant; color and\n // checkbox have their own intrinsic orientation.\n const layoutClass =\n variant === 'default' && layout === 'inline' ? ' lk-property-row--inline' : '';\n const cls = `lk-property-row${variantClass}${layoutClass}${className ? ` ${className}` : ''}`;\n return (\n <label className={cls} htmlFor={htmlFor}>\n <span className=\"lk-property-row__label\">\n {label}\n {readout != null && <em className=\"lk-property-row__readout\">{readout}</em>}\n </span>\n {children}\n </label>\n );\n}\n\n// ── Row implementations ──────────────────────────────────────────────\n\nexport interface SliderRowProps {\n label: ReactNode;\n value: number;\n min: number;\n max: number;\n step?: number;\n onChange: (next: number) => void;\n /** Override how the value is rendered next to the label. Defaults to `value.toString()`. */\n format?: (value: number) => ReactNode;\n /**\n * Optional suffix rendered next to the readout. A string becomes a\n * baseline-aligned dim \"word\" unit (e.g. \"px\"); pass JSX like `<sup>°</sup>`\n * to get the browser's native super positioning for symbol units.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n}\n\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n onChange,\n format,\n unit,\n layout,\n}: SliderRowProps) {\n // Default readout precision tracks `step`: integer steps → 0 decimals,\n // 0.1 → 1 decimal, 0.05/0.02/0.01 → 2 decimals, 0.005 → 3, etc. Callers\n // can still pass an explicit `format` to override (e.g. for a custom\n // unit string or a non-decimal display like fractions).\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const effectiveFormat = format ?? ((n: number) => formatNumber(n, decimals));\n return (\n <PropertyRow\n label={label}\n readout={\n <EditableReadout\n value={value}\n min={min}\n max={max}\n format={effectiveFormat}\n unit={unit}\n onCommit={onChange}\n />\n }\n layout={layout}\n >\n <input\n type=\"range\"\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => {\n const v = Number(e.target.value);\n dlog('property-panel', 'slider', { label, value: v });\n onChange(v);\n }}\n />\n </PropertyRow>\n );\n}\n\ninterface EditableReadoutProps {\n value: number;\n min: number;\n max: number;\n format?: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so the wrapping <label> doesn't\n * forward focus to the slider thumb.\n */\nfunction EditableReadout({ value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused. Live value mirrors\n // into the input otherwise. Pattern mirrors speech-balloons Lab.tsx:893-942.\n const [draft, setDraft] = useState<string | null>(null);\n const fmt = (n: number) => (format ? format(n) : formatNumber(n));\n const displayValue =\n draft !== null\n ? draft\n : (() => {\n const formatted = fmt(value);\n return typeof formatted === 'string' ? formatted : String(formatted);\n })();\n\n const suffix =\n unit == null ? null : typeof unit === 'string' ? (\n <span className=\"lk-property-row__readout-unit\">{unit}</span>\n ) : (\n unit\n );\n\n const commit = () => {\n if (draft !== null) {\n const n = parseSignedNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className=\"lk-property-row__readout-group\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className=\"lk-property-row__readout-input\"\n value={displayValue}\n onFocus={(e) => {\n const formatted = fmt(value);\n setDraft(typeof formatted === 'string' ? formatted : String(formatted));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n // Stop the click from reaching the wrapping <label> (which would\n // forward focus to the slider thumb).\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {suffix}\n </span>\n );\n}\n\nexport interface ColorRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n /** 0..1 alpha. When provided, a translucent slider renders beneath the swatch. */\n alpha?: number;\n onAlphaChange?: (next: number) => void;\n /**\n * Render the alpha track as inert (dimmed, no thumb, not-allowed cursor).\n * Use when the color's consumer drops alpha so the affordance reads dead.\n */\n alphaDisabled?: boolean;\n}\n\nexport function ColorRow({\n label,\n value,\n onChange,\n alpha,\n onAlphaChange,\n alphaDisabled,\n}: ColorRowProps) {\n const showAlpha = alpha != null;\n const className = alphaDisabled ? 'lk-property-row--alpha-disabled' : undefined;\n return (\n <PropertyRow label={label} variant=\"color\" className={className}>\n <input type=\"color\" value={value} onChange={(e) => onChange(e.target.value)} />\n {showAlpha && (\n <input\n type=\"range\"\n className=\"lk-property-row__alpha\"\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={alphaDisabled}\n onChange={(e) => onAlphaChange?.(Number(e.target.value))}\n />\n )}\n </PropertyRow>\n );\n}\n\nexport interface CheckboxRowProps {\n label: ReactNode;\n value: boolean;\n onChange: (next: boolean) => void;\n}\n\nexport function CheckboxRow({ label, value, onChange }: CheckboxRowProps) {\n return (\n <PropertyRow label={label} variant=\"checkbox\">\n <input type=\"checkbox\" checked={value} onChange={(e) => onChange(e.target.checked)} />\n </PropertyRow>\n );\n}\n\nexport interface TextRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n layout?: PropertyRowLayout;\n}\n\nexport function TextRow({ label, value, onChange, placeholder, maxLength, layout }: TextRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n />\n </PropertyRow>\n );\n}\n\nexport interface NumberRowProps {\n label: ReactNode;\n value: number;\n onChange: (next: number) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n layout?: PropertyRowLayout;\n}\n\nexport function NumberRow({\n label,\n value,\n onChange,\n min,\n max,\n step,\n placeholder,\n layout,\n}: NumberRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"number\"\n value={value}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) onChange(n);\n }}\n />\n </PropertyRow>\n );\n}\n\nexport interface SelectOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SelectRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function SelectRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: SelectRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value as T;\n dlog('property-panel', 'select', { label, value: v });\n onChange(v);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {/* HTML <option> only renders text; ReactNode → string coerce */}\n {opt.label as string}\n </option>\n ))}\n </select>\n </PropertyRow>\n );\n}\n\nexport interface ToggleRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function ToggleRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: ToggleRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <div className=\"lk-property-row__toggle\">\n {options.map((opt) => {\n const selected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-pressed={selected}\n className={\n selected\n ? 'lk-property-row__toggle-button lk-property-row__toggle-button--selected'\n : 'lk-property-row__toggle-button'\n }\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </PropertyRow>\n );\n}\n"]}
|