@@ -54,11 +54,13 @@ import {
5454} from "../../schema"
5555import { type SyncStatus , useEditorStore } from "../../store"
5656import { isStepAligned } from "../../utils"
57- import { walkVariableRefs } from "../../variables"
57+ import { isVariableRef , walkVariableRefs , type VariableRef } from "../../variables"
58+ import { makeVariableAwareResolver } from "../../variables/resolver"
5859import AnchorField from "../common/AnchorField"
5960import CheckboxCardField from "../common/CheckboxCardField"
6061import ColorPickerField from "../common/ColorPickerField"
6162import { canBeVariable , VariableMarkerButton } from "./VariableMarkerButton"
63+ import { VariableChip } from "./VariableChip"
6264import RadiusInputField , {
6365 type RadiusErrors ,
6466 type RadiusState ,
@@ -248,7 +250,9 @@ export const TransformationConfigSidebar: React.FC = () => {
248250 control,
249251 trigger,
250252 } = useForm < Record < string , unknown > > ( {
251- resolver : zodResolver ( selectedTransformation ?. schema ?? z . object ( { } ) ) ,
253+ resolver : makeVariableAwareResolver (
254+ zodResolver ( selectedTransformation ?. schema ?? z . object ( { } ) ) ,
255+ ) ,
252256 defaultValues : defaultValues ,
253257 } )
254258
@@ -579,17 +583,55 @@ export const TransformationConfigSidebar: React.FC = () => {
579583 < FormLabel htmlFor = { field . name } fontSize = "sm" mb = { 0 } >
580584 { field . label }
581585 </ FormLabel >
582- { canBeVariable ( field . fieldType ) && (
586+ { canBeVariable ( field . fieldType ) && ! isVariableRef ( values [ field . name ] ) && (
583587 < VariableMarkerButton
584588 fieldLabel = { field . label }
585589 takenNames = { takenVariableNames }
590+ currentValue = { values [ field . name ] }
586591 onCreate = { ( variable ) => {
587- setValue ( field . name , { $var : variable . name , label : variable . label } as any , { shouldDirty : true } )
592+ setValue (
593+ field . name ,
594+ {
595+ $var : variable . name ,
596+ label : variable . label ,
597+ ...( variable . defaultValue
598+ ? { defaultValue : variable . defaultValue }
599+ : { } ) ,
600+ } as any ,
601+ { shouldDirty : true } ,
602+ )
588603 } }
589604 />
590605 ) }
591606 </ HStack >
592- { field . fieldType === "select" ? (
607+ { isVariableRef ( values [ field . name ] ) ? (
608+ < VariableChip
609+ label = { ( values [ field . name ] as VariableRef ) . label }
610+ name = { ( values [ field . name ] as VariableRef ) . $var }
611+ defaultValue = { ( values [ field . name ] as VariableRef ) . defaultValue }
612+ onDefaultValueChange = { ( next ) => {
613+ const ref = values [ field . name ] as VariableRef
614+ setValue (
615+ field . name ,
616+ {
617+ $var : ref . $var ,
618+ label : ref . label ,
619+ ...( next ? { defaultValue : next } : { } ) ,
620+ } as any ,
621+ { shouldDirty : true } ,
622+ )
623+ } }
624+ onRemove = { ( ) => {
625+ const ref = values [ field . name ] as VariableRef
626+ const restored =
627+ ref . defaultValue != null && typeof ref . defaultValue !== "object"
628+ ? ref . defaultValue
629+ : ( field . fieldProps ?. defaultValue ?? "" )
630+ setValue ( field . name , restored as any , { shouldDirty : true } )
631+ } }
632+ />
633+ ) : null }
634+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "select" ? (
593635 < Controller
594636 name = { field . name }
595637 control = { control }
@@ -692,7 +734,7 @@ export const TransformationConfigSidebar: React.FC = () => {
692734 } }
693735 />
694736 ) : null }
695- { field . fieldType === "select-creatable" ? (
737+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "select-creatable" ? (
696738 < Controller
697739 name = { field . name }
698740 control = { control }
@@ -732,7 +774,7 @@ export const TransformationConfigSidebar: React.FC = () => {
732774 ) }
733775 />
734776 ) : null }
735- { field . fieldType === "input" ? (
777+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "input" ? (
736778 < Input
737779 id = { field . name }
738780 fontSize = "sm"
@@ -755,22 +797,22 @@ export const TransformationConfigSidebar: React.FC = () => {
755797 }
756798 />
757799 ) : null }
758- { field . fieldType === "textarea" ? (
800+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "textarea" ? (
759801 < Textarea
760802 id = { field . name }
761803 fontSize = "sm"
762804 { ...register ( field . name ) }
763805 />
764806 ) : null }
765- { field . fieldType === "switch" ? (
807+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "switch" ? (
766808 < Switch
767809 id = { field . name }
768810 fontSize = "sm"
769811 isChecked = { watch ( field . name ) === true }
770812 { ...register ( field . name ) }
771813 />
772814 ) : null }
773- { field . fieldType === "slider" ? (
815+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "slider" ? (
774816 < Box pt = { 2 } pb = { 2 } >
775817 < Flex justify = "space-between" mb = { 1 } >
776818 < Input
@@ -935,7 +977,7 @@ export const TransformationConfigSidebar: React.FC = () => {
935977 </ Slider >
936978 </ Box >
937979 ) : null }
938- { field . fieldType === "color-picker" ? (
980+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "color-picker" ? (
939981 < ColorPickerField
940982 fieldName = { field . name }
941983 value = { watch ( field . name ) as string }
@@ -974,7 +1016,7 @@ export const TransformationConfigSidebar: React.FC = () => {
9741016 }
9751017 />
9761018 ) : null }
977- { field . fieldType === "radio-card" ? (
1019+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "radio-card" ? (
9781020 < RadioCardField
9791021 value = { watch ( field . name ) as string }
9801022 options = { field . fieldProps ?. options ?? [ ] }
@@ -987,7 +1029,7 @@ export const TransformationConfigSidebar: React.FC = () => {
9871029 { ...field . fieldProps }
9881030 />
9891031 ) : null }
990- { field . fieldType === "checkbox-card" ? (
1032+ { ! isVariableRef ( values [ field . name ] ) && field . fieldType === "checkbox-card" ? (
9911033 < CheckboxCardField
9921034 value = { watch ( field . name ) as string [ ] }
9931035 options = { field . fieldProps ?. options ?? [ ] }
0 commit comments