@@ -530,6 +530,111 @@ export default function PropertiesPanel() {
530530 ) ;
531531 } ) ( ) }
532532
533+ { /* ── ToggleSwitchWidget ───────────────────────────────────── */ }
534+ { widget . type === 'ToggleSwitchWidget' && (
535+ < div className = "space-y-4" >
536+
537+ { /* ValueStore key */ }
538+ < div className = "space-y-2" >
539+ < Label > ValueStore Key</ Label >
540+ < Input
541+ placeholder = "e.g. generator_state"
542+ value = { draftConfig . deviceKey || '' }
543+ onChange = { ( e ) => handleConfigChange ( { deviceKey : e . target . value } ) }
544+ />
545+ < p className = "text-xs text-muted-foreground" >
546+ The key in Anedya ValueStore that holds this toggle's state.
547+ </ p >
548+ </ div >
549+
550+ { /* Data Type */ }
551+ < div className = "space-y-2" >
552+ < Label > Expected Data Type</ Label >
553+ < Select
554+ value = { draftConfig . dataType || 'auto' }
555+ onValueChange = { ( val ) => handleConfigChange ( { dataType : val === 'auto' ? undefined : val } ) }
556+ >
557+ < SelectTrigger className = "h-8" >
558+ < SelectValue placeholder = "Auto-detect" />
559+ </ SelectTrigger >
560+ < SelectContent >
561+ < SelectItem value = "auto" > Auto-detect (Default)</ SelectItem >
562+ < SelectItem value = "boolean" > Boolean (true / false)</ SelectItem >
563+ < SelectItem value = "float" > Number</ SelectItem >
564+ < SelectItem value = "string" > String</ SelectItem >
565+ </ SelectContent >
566+ </ Select >
567+ </ div >
568+
569+ { /* ON / OFF raw values */ }
570+ < div className = "grid grid-cols-2 gap-3" >
571+ < div className = "space-y-1" >
572+ < Label className = "text-xs" > Value when ON</ Label >
573+ < Input
574+ className = "h-8 text-xs"
575+ placeholder = "1"
576+ value = { draftConfig . onValue ?? '1' }
577+ onChange = { ( e ) => handleConfigChange ( { onValue : e . target . value } ) }
578+ />
579+ </ div >
580+ < div className = "space-y-1" >
581+ < Label className = "text-xs" > Value when OFF</ Label >
582+ < Input
583+ className = "h-8 text-xs"
584+ placeholder = "0"
585+ value = { draftConfig . offValue ?? '0' }
586+ onChange = { ( e ) => handleConfigChange ( { offValue : e . target . value } ) }
587+ />
588+ </ div >
589+ </ div >
590+
591+ { /* Status labels */ }
592+ < div className = "space-y-2" >
593+ < Label className = "flex items-center gap-1.5" > Status Labels</ Label >
594+ < div className = "grid grid-cols-2 gap-3" >
595+ < div className = "space-y-1" >
596+ < Label className = "text-xs" > ON label</ Label >
597+ < Input
598+ className = "h-8 text-xs"
599+ placeholder = "Active"
600+ value = { draftConfig . onLabel || '' }
601+ onChange = { ( e ) => handleConfigChange ( { onLabel : e . target . value } ) }
602+ />
603+ </ div >
604+ < div className = "space-y-1" >
605+ < Label className = "text-xs" > OFF label</ Label >
606+ < Input
607+ className = "h-8 text-xs"
608+ placeholder = "Inactive"
609+ value = { draftConfig . offLabel || '' }
610+ onChange = { ( e ) => handleConfigChange ( { offLabel : e . target . value } ) }
611+ />
612+ </ div >
613+ </ div >
614+ </ div >
615+
616+ { /* ON colour */ }
617+ < div className = "space-y-2 border-t pt-3" >
618+ < Label className = "flex items-center gap-1.5" >
619+ < Palette className = "h-3.5 w-3.5" />
620+ ON Colour
621+ </ Label >
622+ < div className = "flex items-center gap-3" >
623+ < Input
624+ type = "color"
625+ className = "h-8 w-12 p-0.5 cursor-pointer"
626+ value = { draftConfig . onColor || '#22c55e' }
627+ onChange = { ( e ) => handleConfigChange ( { onColor : e . target . value } ) }
628+ />
629+ < span className = "text-xs text-muted-foreground" >
630+ Used for the pill, status label, and glow effect when ON.
631+ </ span >
632+ </ div >
633+ </ div >
634+
635+ </ div >
636+ ) }
637+
533638 </ div >
534639 </ div >
535640 ) ;
0 commit comments