diff --git a/apps/editor/app/viewer/[id]/collections-panel.tsx b/apps/editor/app/viewer/[id]/collections-panel.tsx index 149e1414..f5a68c06 100644 --- a/apps/editor/app/viewer/[id]/collections-panel.tsx +++ b/apps/editor/app/viewer/[id]/collections-panel.tsx @@ -10,7 +10,7 @@ import { useScene, } from '@pascal-app/core' import { ChevronDown, ChevronRight } from 'lucide-react' -import { useState } from 'react' +import { useMemo, useState } from 'react' import { useShallow } from 'zustand/react/shallow' import { cn } from '@/lib/utils' @@ -145,10 +145,10 @@ function CollectionRow({ collectionId }: { collectionId: CollectionId }) { ), ) - const controlValuesByItem = useInteractive( - useShallow((s) => - Object.fromEntries(interactiveItems.map((n) => [n.id, s.items[n.id]?.controlValues ?? []])), - ), + const allItems = useInteractive((s) => s.items) + const controlValuesByItem = useMemo( + () => Object.fromEntries(interactiveItems.map((n) => [n.id, allItems[n.id]?.controlValues ?? []])), + [allItems, interactiveItems], ) const setControlValue = useInteractive((s) => s.setControlValue) diff --git a/apps/editor/components/ui/item-catalog/catalog-items.tsx b/apps/editor/components/ui/item-catalog/catalog-items.tsx index d3465ec4..99f45efb 100644 --- a/apps/editor/components/ui/item-catalog/catalog-items.tsx +++ b/apps/editor/components/ui/item-catalog/catalog-items.tsx @@ -1235,7 +1235,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ kind: 'toggle', }, { - kind: 'slider', label: 'Intensity', min: 0, max: 100, unit: '%', displayMode: 'dial' + kind: 'slider', label: 'Intensity', min: 0, max: 100, unit: '%', displayMode: 'dial', + default: 100 } ], effects: [ @@ -1266,7 +1267,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ kind: 'toggle', }, { - kind: 'slider', label: 'Intensity', min: 0, max: 100, unit: '%', displayMode: 'dial' + kind: 'slider', label: 'Intensity', min: 0, max: 100, unit: '%', displayMode: 'dial' , + default: 100 } ], effects: [ diff --git a/packages/core/src/schema/nodes/item.ts b/packages/core/src/schema/nodes/item.ts index 2146e685..374e1709 100644 --- a/packages/core/src/schema/nodes/item.ts +++ b/packages/core/src/schema/nodes/item.ts @@ -8,6 +8,7 @@ import type { CollectionId } from '../collections' const toggleControlSchema = z.object({ kind: z.literal('toggle'), label: z.string().optional(), + default: z.boolean().optional(), }) const sliderControlSchema = z.object({ @@ -18,6 +19,7 @@ const sliderControlSchema = z.object({ step: z.number().default(1), unit: z.string().optional(), displayMode: z.enum(['slider', 'stepper', 'dial']).default('slider'), + default: z.number().optional(), }) const temperatureControlSchema = z.object({ @@ -26,6 +28,7 @@ const temperatureControlSchema = z.object({ min: z.number().default(16), max: z.number().default(30), unit: z.enum(['C', 'F']).default('C'), + default: z.number().optional(), }) const controlSchema = z.discriminatedUnion('kind', [ diff --git a/packages/core/src/store/use-interactive.ts b/packages/core/src/store/use-interactive.ts index faf97b53..8b165559 100644 --- a/packages/core/src/store/use-interactive.ts +++ b/packages/core/src/store/use-interactive.ts @@ -30,11 +30,11 @@ const defaultControlValue = (interactive: Interactive, index: number): ControlVa if (!control) return false switch (control.kind) { case 'toggle': - return false + return control.default ?? false case 'slider': - return control.min + return control.default ?? control.min case 'temperature': - return control.min + return control.default ?? control.min } }