@fuf-stack/uniform 0.22.0 → 0.23.0

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.
Files changed (80) hide show
  1. package/dist/CheckboxGroup/index.cjs +2 -2
  2. package/dist/CheckboxGroup/index.js +2 -2
  3. package/dist/FieldArray/index.cjs +2 -2
  4. package/dist/FieldArray/index.js +2 -2
  5. package/dist/Form/index.cjs +2 -2
  6. package/dist/Form/index.js +2 -2
  7. package/dist/Input/index.cjs +4 -4
  8. package/dist/Input/index.d.cts +2 -2
  9. package/dist/Input/index.d.ts +2 -2
  10. package/dist/Input/index.js +3 -3
  11. package/dist/{Input-DsBWaOSk.d.ts → Input-BpsVvxwO.d.ts} +2 -2
  12. package/dist/{Input-qD-RcDl4.d.cts → Input-Com9bFxL.d.cts} +2 -2
  13. package/dist/RadioBoxes/index.cjs +2 -2
  14. package/dist/RadioBoxes/index.js +2 -2
  15. package/dist/RadioGroup/index.cjs +2 -2
  16. package/dist/RadioGroup/index.js +2 -2
  17. package/dist/RadioTabs/index.cjs +4 -4
  18. package/dist/RadioTabs/index.js +3 -3
  19. package/dist/Select/index.cjs +2 -2
  20. package/dist/Select/index.js +2 -2
  21. package/dist/SubmitButton/index.cjs +2 -2
  22. package/dist/SubmitButton/index.js +2 -2
  23. package/dist/Switch/index.cjs +4 -4
  24. package/dist/Switch/index.d.cts +4 -2
  25. package/dist/Switch/index.d.ts +4 -2
  26. package/dist/Switch/index.js +3 -3
  27. package/dist/{Switch-CLs964dL.d.cts → Switch-BaMtW2HN.d.cts} +12 -3
  28. package/dist/{Switch-CLs964dL.d.ts → Switch-BaMtW2HN.d.ts} +12 -3
  29. package/dist/TextArea/index.cjs +4 -4
  30. package/dist/TextArea/index.js +3 -3
  31. package/dist/{chunk-NR5MV234.js → chunk-3PTHYFAU.js} +10 -2
  32. package/dist/chunk-3PTHYFAU.js.map +1 -0
  33. package/dist/{chunk-SHB3Z5GN.cjs → chunk-AZT3TDWZ.cjs} +3 -3
  34. package/dist/{chunk-SHB3Z5GN.cjs.map → chunk-AZT3TDWZ.cjs.map} +1 -1
  35. package/dist/{chunk-QTROOQ53.cjs → chunk-DOBUPJPN.cjs} +10 -2
  36. package/dist/chunk-DOBUPJPN.cjs.map +1 -0
  37. package/dist/{chunk-IZFO7YMQ.js → chunk-GHO2VFUQ.js} +2 -2
  38. package/dist/{chunk-IZFO7YMQ.js.map → chunk-GHO2VFUQ.js.map} +1 -1
  39. package/dist/{chunk-IAMV2JNU.cjs → chunk-I4OVSJFQ.cjs} +2 -2
  40. package/dist/chunk-I4OVSJFQ.cjs.map +1 -0
  41. package/dist/{chunk-XDHY7DXJ.js → chunk-NNKOK5EU.js} +2 -2
  42. package/dist/{chunk-I2PJDXWB.cjs → chunk-OWWUTKGY.cjs} +18 -41
  43. package/dist/chunk-OWWUTKGY.cjs.map +1 -0
  44. package/dist/chunk-P6HJOG7D.cjs +41 -0
  45. package/dist/chunk-P6HJOG7D.cjs.map +1 -0
  46. package/dist/chunk-Q2BOMFJ5.js +41 -0
  47. package/dist/chunk-Q2BOMFJ5.js.map +1 -0
  48. package/dist/{chunk-EPY6UDD3.js → chunk-QDFIRRB5.js} +4 -4
  49. package/dist/chunk-QDFIRRB5.js.map +1 -0
  50. package/dist/{chunk-2EYP66KF.cjs → chunk-SG6PWCRL.cjs} +5 -5
  51. package/dist/chunk-SG6PWCRL.cjs.map +1 -0
  52. package/dist/{chunk-KMDTMBYI.js → chunk-U5WBLGZV.js} +18 -41
  53. package/dist/chunk-U5WBLGZV.js.map +1 -0
  54. package/dist/hooks/index.cjs +3 -3
  55. package/dist/hooks/index.js +2 -2
  56. package/dist/hooks/useInputValueDebounce/index.cjs +3 -3
  57. package/dist/hooks/useInputValueDebounce/index.d.cts +6 -6
  58. package/dist/hooks/useInputValueDebounce/index.d.ts +6 -6
  59. package/dist/hooks/useInputValueDebounce/index.js +2 -2
  60. package/dist/hooks/useInputValueTransform/index.cjs +2 -2
  61. package/dist/hooks/useInputValueTransform/index.d.cts +28 -60
  62. package/dist/hooks/useInputValueTransform/index.d.ts +28 -60
  63. package/dist/hooks/useInputValueTransform/index.js +1 -1
  64. package/dist/index.cjs +7 -7
  65. package/dist/index.d.cts +3 -2
  66. package/dist/index.d.ts +3 -2
  67. package/dist/index.js +6 -6
  68. package/package.json +4 -4
  69. package/dist/chunk-2EYP66KF.cjs.map +0 -1
  70. package/dist/chunk-EPY6UDD3.js.map +0 -1
  71. package/dist/chunk-G5UX55XC.js +0 -37
  72. package/dist/chunk-G5UX55XC.js.map +0 -1
  73. package/dist/chunk-I2PJDXWB.cjs.map +0 -1
  74. package/dist/chunk-IAMV2JNU.cjs.map +0 -1
  75. package/dist/chunk-KMDTMBYI.js.map +0 -1
  76. package/dist/chunk-NR5MV234.js.map +0 -1
  77. package/dist/chunk-QTROOQ53.cjs.map +0 -1
  78. package/dist/chunk-TSB65253.cjs +0 -37
  79. package/dist/chunk-TSB65253.cjs.map +0 -1
  80. /package/dist/{chunk-XDHY7DXJ.js.map → chunk-NNKOK5EU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-DOBUPJPN.cjs","../src/Switch/Switch.tsx","../src/Switch/index.ts"],"names":["Switch_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-DOBUPJPN.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { SwitchProps as HeroSwitchProps } from '@heroui/switch';\nimport type { ReactNode } from 'react';\n\nimport { Switch as HeroSwitch } from '@heroui/switch';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { useController, useFormContext, useInput } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const switchVariants = tv({\n slots: {\n base: '',\n endContent: '',\n errorMessage: 'ml-1 mt-1',\n // see HeroUI styles for group-data condition,\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/core/theme/src/components/select.ts\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:!text-danger group-data-[required=true]:after:ml-0.5 group-data-[required=true]:after:text-danger group-data-[required=true]:after:content-[\"*\"]',\n outerWrapper: 'place-content-center',\n startContent: '',\n thumb: '',\n thumbIcon: '',\n wrapper: '',\n },\n});\n\ntype VariantProps = TVProps<typeof switchVariants>;\ntype ClassName = TVClassName<typeof switchVariants>;\n\nexport interface SwitchProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** whether the select should be disabled */\n disabled?: boolean;\n /** Icon to be displayed at the end of the switch (when enabled) */\n endContent?: ReactNode;\n /** component displayed next to the switch */\n label?: ReactNode;\n /** name the field is registered under */\n name: string;\n /* Size of the switch */\n size?: 'sm' | 'md' | 'lg';\n /** Icon to be displayed at the start of the switch (when disabled) */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** Icon to be displayed inside the thumb */\n thumbIcon?: HeroSwitchProps['thumbIcon'];\n}\n\n/**\n * Switch component based on [HeroUI Switch](https://www.heroui.com//docs/components/switch)\n */\nconst Switch = ({\n className = undefined,\n disabled = false,\n endContent = undefined,\n label: _label = undefined,\n name,\n size = undefined,\n startContent = undefined,\n testId: _testId = undefined,\n thumbIcon = undefined,\n}: SwitchProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, required, testId, invalid } = getFieldState(name, _testId);\n\n const { field } = useController({ name, control, disabled });\n const { disabled: isDisabled, value, ref, onBlur, onChange } = field;\n\n const { label, getInputProps, getErrorMessageProps } = useInput({\n errorMessage: JSON.stringify(error),\n isInvalid: invalid,\n isRequired: required,\n label: _label,\n labelPlacement: 'outside',\n placeholder: ' ',\n });\n\n const variants = switchVariants();\n const classNames = variantsToClassNames(variants, className, 'outerWrapper');\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n\n return (\n <div className={classNames.outerWrapper}>\n <HeroSwitch\n aria-describedby={getInputProps()['aria-describedby']}\n classNames={classNames}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n endContent={endContent}\n isDisabled={isDisabled}\n isSelected={!!value}\n name={name}\n onBlur={onBlur}\n onValueChange={onChange}\n ref={ref}\n required={required}\n size={size}\n startContent={startContent}\n thumbIcon={thumbIcon}\n value={value}\n >\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </HeroSwitch>\n {error && (\n <div className={classNames.errorMessage}>\n <div\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...getErrorMessageProps()}\n >\n <FieldValidationError error={error} testId={testId} />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default Switch;\n","import Switch from './Switch';\n\nexport type { SwitchProps } from './Switch';\n\nexport { Switch };\n\nexport default Switch;\n"]}
@@ -83,7 +83,7 @@ var RadioTabs = ({
83
83
  disabledKeys: disabled ? disabledAllKeys : void 0,
84
84
  fullWidth: false,
85
85
  onSelectionChange: onChange,
86
- selectedKey: value,
86
+ selectedKey: value != null ? value : "",
87
87
  tabs: tabOptions,
88
88
  testId,
89
89
  variant
@@ -101,4 +101,4 @@ export {
101
101
  RadioTabs_default,
102
102
  RadioTabs_default2
103
103
  };
104
- //# sourceMappingURL=chunk-IZFO7YMQ.js.map
104
+ //# sourceMappingURL=chunk-GHO2VFUQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RadioTabs/RadioTabs.tsx","../src/RadioTabs/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { TabsProps } from '@fuf-stack/pixels';\nimport type { TabProps } from '@fuf-stack/pixels/Tabs';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { RadioGroup as HeroRadioGroup } from '@heroui/radio';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\nimport Tabs from '@fuf-stack/pixels/Tabs';\n\nimport { useController, useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const radioTabsVariants = tv({\n slots: {\n base: 'group', // Needs group for group-data condition\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:text-danger',\n wrapper: '',\n tabList: '',\n tab: '',\n tabContent: '',\n cursor: '',\n panel: '',\n },\n});\n\ntype VariantProps = TVProps<typeof radioTabsVariants>;\ntype ClassName = TVClassName<typeof radioTabsVariants>;\n\nexport interface RadioTabsOption {\n /** Optional content inside of the tab */\n content?: ReactNode;\n /** disables the option */\n disabled?: boolean;\n /** option label */\n label?: React.ReactNode;\n /** option icon */\n icon?: ReactNode;\n /** HTML data-testid attribute of the option */\n testId?: string;\n /** option value */\n value: string;\n}\n\nexport interface RadioTabsProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** Determines if the Buttons are disabled or not. */\n disabled?: boolean;\n /** determines orientation of the Buttons. */\n inline?: boolean;\n /** Label displayed next to the RadioButton. */\n label?: ReactNode;\n /** Name the RadioButtons are registered at in HTML forms (react-hook-form). */\n name: string;\n /** Radio button configuration. */\n options: RadioTabsOption[];\n /** Id to grab element in internal tests. */\n testId?: string;\n /** How the RadioTabs should look like. */\n variant?: TabsProps['variant'];\n}\n\n/**\n * RadioTabs component based on [HeroUI RadioGroup](https://www.heroui.com//docs/components/radio-group)\n * and [HeroUI Tabs](https://www.heroui.com//docs/components/tabs)\n */\nconst RadioTabs = ({\n className = undefined,\n disabled = false,\n inline = false,\n label = undefined,\n name,\n options,\n testId: _testId = undefined,\n variant = undefined,\n}: RadioTabsProps): ReactElement => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const { field } = useController({ control, disabled, name });\n const { disabled: isDisabled, onBlur, onChange, ref, value } = field;\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n const variants = radioTabsVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const tabOptions = options.map<TabProps>((option) => ({\n content: option?.content,\n disabled: option?.disabled,\n key: option.value,\n label: option?.label || option?.value,\n testId: slugify(`option_${option?.testId || option?.value}`, {\n replaceDots: true,\n }),\n }));\n\n const disabledAllKeys: string[] | undefined = tabOptions?.map(\n (option) => option.key as string,\n );\n\n return (\n <HeroRadioGroup\n classNames={classNames}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </label>\n )\n }\n name={name}\n orientation={inline ? 'horizontal' : 'vertical'}\n onBlur={onBlur}\n ref={ref}\n >\n <Tabs\n disabledKeys={disabled ? disabledAllKeys : undefined}\n fullWidth={false}\n onSelectionChange={onChange}\n selectedKey={value}\n tabs={tabOptions as TabProps[]}\n testId={testId}\n variant={variant}\n />\n </HeroRadioGroup>\n );\n};\n\nexport default RadioTabs;\n","import RadioTabs from './RadioTabs';\n\nexport type { RadioTabsProps } from './RadioTabs';\n\nexport { RadioTabs };\n\nexport default RadioTabs;\n"],"mappings":";;;;;;;;;;;;AAKA,SAAS,cAAc,sBAAsB;AAE7C,SAAS,SAAS,IAAI,4BAA4B;AAClD,OAAO,UAAU;AA0GA,cAQP,YARO;AApGV,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IACN,OACE;AAAA,IACF,SAAS;AAAA,IACT,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF,CAAC;AA2CD,IAAM,YAAY,CAAC;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,UAAU;AACZ,MAAoC;AAClC,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,EAAE,MAAM,IAAI,cAAc,EAAE,SAAS,UAAU,KAAK,CAAC;AAC3D,QAAM,EAAE,UAAU,YAAY,QAAQ,UAAU,KAAK,MAAM,IAAI;AAE/D,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,kBAAkB;AACnC,QAAM,aAAa,qBAAqB,UAAU,WAAW,MAAM;AAEnE,QAAM,aAAa,QAAQ,IAAc,CAAC,YAAY;AAAA,IACpD,SAAS,iCAAQ;AAAA,IACjB,UAAU,iCAAQ;AAAA,IAClB,KAAK,OAAO;AAAA,IACZ,QAAO,iCAAQ,WAAS,iCAAQ;AAAA,IAChC,QAAQ,QAAQ,WAAU,iCAAQ,YAAU,iCAAQ,MAAK,IAAI;AAAA,MAC3D,aAAa;AAAA,IACf,CAAC;AAAA,EACH,EAAE;AAEF,QAAM,kBAAwC,yCAAY;AAAA,IACxD,CAAC,WAAW,OAAO;AAAA;AAGrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MAGA,gBAAc;AAAA,MACd,iBAAe;AAAA,MACf,eAAa;AAAA,MACb,cACE,SAAS,oBAAC,gCAAqB,OAAc,QAAgB;AAAA,MAE/D;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OACE;AAAA,MAEE,qBAAC,WACE;AAAA;AAAA,QACA,wBAAwB,oBAAC,iCAAsB,QAAgB;AAAA,SAClE;AAAA,MAGJ;AAAA,MACA,aAAa,SAAS,eAAe;AAAA,MACrC;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,cAAc,WAAW,kBAAkB;AAAA,UAC3C,WAAW;AAAA,UACX,mBAAmB;AAAA,UACnB,aAAa;AAAA,UACb,MAAM;AAAA,UACN;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oBAAQ;;;AC5If,IAAOA,qBAAQ;","names":["RadioTabs_default"]}
1
+ {"version":3,"sources":["../src/RadioTabs/RadioTabs.tsx","../src/RadioTabs/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { TabsProps } from '@fuf-stack/pixels';\nimport type { TabProps } from '@fuf-stack/pixels/Tabs';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { RadioGroup as HeroRadioGroup } from '@heroui/radio';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\nimport Tabs from '@fuf-stack/pixels/Tabs';\n\nimport { useController, useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const radioTabsVariants = tv({\n slots: {\n base: 'group', // Needs group for group-data condition\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:text-danger',\n wrapper: '',\n tabList: '',\n tab: '',\n tabContent: '',\n cursor: '',\n panel: '',\n },\n});\n\ntype VariantProps = TVProps<typeof radioTabsVariants>;\ntype ClassName = TVClassName<typeof radioTabsVariants>;\n\nexport interface RadioTabsOption {\n /** Optional content inside of the tab */\n content?: ReactNode;\n /** disables the option */\n disabled?: boolean;\n /** option label */\n label?: React.ReactNode;\n /** option icon */\n icon?: ReactNode;\n /** HTML data-testid attribute of the option */\n testId?: string;\n /** option value */\n value: string;\n}\n\nexport interface RadioTabsProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** Determines if the Buttons are disabled or not. */\n disabled?: boolean;\n /** determines orientation of the Buttons. */\n inline?: boolean;\n /** Label displayed next to the RadioButton. */\n label?: ReactNode;\n /** Name the RadioButtons are registered at in HTML forms (react-hook-form). */\n name: string;\n /** Radio button configuration. */\n options: RadioTabsOption[];\n /** Id to grab element in internal tests. */\n testId?: string;\n /** How the RadioTabs should look like. */\n variant?: TabsProps['variant'];\n}\n\n/**\n * RadioTabs component based on [HeroUI RadioGroup](https://www.heroui.com//docs/components/radio-group)\n * and [HeroUI Tabs](https://www.heroui.com//docs/components/tabs)\n */\nconst RadioTabs = ({\n className = undefined,\n disabled = false,\n inline = false,\n label = undefined,\n name,\n options,\n testId: _testId = undefined,\n variant = undefined,\n}: RadioTabsProps): ReactElement => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const { field } = useController({ control, disabled, name });\n const { disabled: isDisabled, onBlur, onChange, ref, value } = field;\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n const variants = radioTabsVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const tabOptions = options.map<TabProps>((option) => ({\n content: option?.content,\n disabled: option?.disabled,\n key: option.value,\n label: option?.label || option?.value,\n testId: slugify(`option_${option?.testId || option?.value}`, {\n replaceDots: true,\n }),\n }));\n\n const disabledAllKeys: string[] | undefined = tabOptions?.map(\n (option) => option.key as string,\n );\n\n return (\n <HeroRadioGroup\n classNames={classNames}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </label>\n )\n }\n name={name}\n orientation={inline ? 'horizontal' : 'vertical'}\n onBlur={onBlur}\n ref={ref}\n >\n <Tabs\n disabledKeys={disabled ? disabledAllKeys : undefined}\n fullWidth={false}\n onSelectionChange={onChange}\n // make sure component is controlled\n selectedKey={value ?? ''}\n tabs={tabOptions as TabProps[]}\n testId={testId}\n variant={variant}\n />\n </HeroRadioGroup>\n );\n};\n\nexport default RadioTabs;\n","import RadioTabs from './RadioTabs';\n\nexport type { RadioTabsProps } from './RadioTabs';\n\nexport { RadioTabs };\n\nexport default RadioTabs;\n"],"mappings":";;;;;;;;;;;;AAKA,SAAS,cAAc,sBAAsB;AAE7C,SAAS,SAAS,IAAI,4BAA4B;AAClD,OAAO,UAAU;AA0GA,cAQP,YARO;AApGV,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IACN,OACE;AAAA,IACF,SAAS;AAAA,IACT,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF,CAAC;AA2CD,IAAM,YAAY,CAAC;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,UAAU;AACZ,MAAoC;AAClC,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,EAAE,MAAM,IAAI,cAAc,EAAE,SAAS,UAAU,KAAK,CAAC;AAC3D,QAAM,EAAE,UAAU,YAAY,QAAQ,UAAU,KAAK,MAAM,IAAI;AAE/D,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,kBAAkB;AACnC,QAAM,aAAa,qBAAqB,UAAU,WAAW,MAAM;AAEnE,QAAM,aAAa,QAAQ,IAAc,CAAC,YAAY;AAAA,IACpD,SAAS,iCAAQ;AAAA,IACjB,UAAU,iCAAQ;AAAA,IAClB,KAAK,OAAO;AAAA,IACZ,QAAO,iCAAQ,WAAS,iCAAQ;AAAA,IAChC,QAAQ,QAAQ,WAAU,iCAAQ,YAAU,iCAAQ,MAAK,IAAI;AAAA,MAC3D,aAAa;AAAA,IACf,CAAC;AAAA,EACH,EAAE;AAEF,QAAM,kBAAwC,yCAAY;AAAA,IACxD,CAAC,WAAW,OAAO;AAAA;AAGrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MAGA,gBAAc;AAAA,MACd,iBAAe;AAAA,MACf,eAAa;AAAA,MACb,cACE,SAAS,oBAAC,gCAAqB,OAAc,QAAgB;AAAA,MAE/D;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OACE;AAAA,MAEE,qBAAC,WACE;AAAA;AAAA,QACA,wBAAwB,oBAAC,iCAAsB,QAAgB;AAAA,SAClE;AAAA,MAGJ;AAAA,MACA,aAAa,SAAS,eAAe;AAAA,MACrC;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,cAAc,WAAW,kBAAkB;AAAA,UAC3C,WAAW;AAAA,UACX,mBAAmB;AAAA,UAEnB,aAAa,wBAAS;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oBAAQ;;;AC7If,IAAOA,qBAAQ;","names":["RadioTabs_default"]}
@@ -83,7 +83,7 @@ var RadioTabs = ({
83
83
  disabledKeys: disabled ? disabledAllKeys : void 0,
84
84
  fullWidth: false,
85
85
  onSelectionChange: onChange,
86
- selectedKey: value,
86
+ selectedKey: value != null ? value : "",
87
87
  tabs: tabOptions,
88
88
  testId,
89
89
  variant
@@ -101,4 +101,4 @@ var RadioTabs_default2 = RadioTabs_default;
101
101
 
102
102
 
103
103
  exports.RadioTabs_default = RadioTabs_default; exports.RadioTabs_default2 = RadioTabs_default2;
104
- //# sourceMappingURL=chunk-IAMV2JNU.cjs.map
104
+ //# sourceMappingURL=chunk-I4OVSJFQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-I4OVSJFQ.cjs","../src/RadioTabs/RadioTabs.tsx","../src/RadioTabs/index.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACNA,sCAA6C;AAE7C,oDAAkD;AAClD,0FAAiB;AA0GA,+CAAA;AApGV,IAAM,kBAAA,EAAoB,4BAAA;AAAG,EAClC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA;AAAA,IACN,KAAA,EACE,oFAAA;AAAA,IACF,OAAA,EAAS,EAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,GAAA,EAAK,EAAA;AAAA,IACL,UAAA,EAAY,EAAA;AAAA,IACZ,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,EACT;AACF,CAAC,CAAA;AA2CD,IAAM,UAAA,EAAY,CAAC;AAAA,EACjB,UAAA,EAAY,KAAA,CAAA;AAAA,EACZ,SAAA,EAAW,KAAA;AAAA,EACX,OAAA,EAAS,KAAA;AAAA,EACT,MAAA,EAAQ,KAAA,CAAA;AAAA,EACR,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAA;AAAA,EAClB,QAAA,EAAU,KAAA;AACZ,CAAA,EAAA,GAAoC;AAClC,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,cAAc,EAAA,EAAI,8CAAA,CAAe;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAO,EAAA,EAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAExE,EAAA,MAAM,EAAE,MAAM,EAAA,EAAI,6CAAA,EAAgB,OAAA,EAAS,QAAA,EAAU,KAAK,CAAC,CAAA;AAC3D,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,MAAM,EAAA,EAAI,KAAA;AAE/D,EAAA,MAAM,qBAAA,EAAuB,UAAA,IAAc,eAAA;AAC3C,EAAA,MAAM,UAAA,EAAY,MAAA,GAAS,oBAAA;AAE3B,EAAA,MAAM,SAAA,EAAW,iBAAA,CAAkB,CAAA;AACnC,EAAA,MAAM,WAAA,EAAa,8CAAA,QAAqB,EAAU,SAAA,EAAW,MAAM,CAAA;AAEnE,EAAA,MAAM,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAc,CAAC,MAAA,EAAA,GAAA,CAAY;AAAA,IACpD,OAAA,EAAS,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,EAAU,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,QAAA;AAAA,IAClB,GAAA,EAAK,MAAA,CAAO,KAAA;AAAA,IACZ,KAAA,EAAA,CAAO,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,KAAA,EAAA,GAAA,CAAS,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,KAAA,CAAA;AAAA,IAChC,MAAA,EAAQ,iCAAA,CAAQ,OAAA,EAAA,CAAU,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,MAAA,EAAA,GAAA,CAAU,OAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,MAAA,CAAQ,KAAA,CAAK,CAAA,CAAA;AAC1C,MAAA;AACd,IAAA;AACD,EAAA;AAEwD,EAAA;AACrC,IAAA;AAAA,EAAA;AAInB,EAAA;AAAC,IAAA;AAAA,IAAA;AACC,MAAA;AAGc,MAAA;AACC,MAAA;AACF,MAAA;AAEkD,MAAA;AAE/D,MAAA;AACW,MAAA;AACC,MAAA;AAEV,MAAA;AAGK,sBAAA;AAAA,QAAA;AAC+D,QAAA;AAClE,MAAA;AAGJ,MAAA;AACqC,MAAA;AACrC,MAAA;AACA,MAAA;AAEA,MAAA;AAAC,QAAA;AAAA,QAAA;AAC4C,UAAA;AAChC,UAAA;AACQ,UAAA;AAEG,UAAA;AAChB,UAAA;AACN,UAAA;AACA,UAAA;AAAA,QAAA;AACF,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;AAEe;ADpDqG;AACA;AE1FrG;AF4FqG;AACA;AACA;AACA;AACA","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-I4OVSJFQ.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { TabsProps } from '@fuf-stack/pixels';\nimport type { TabProps } from '@fuf-stack/pixels/Tabs';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { RadioGroup as HeroRadioGroup } from '@heroui/radio';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\nimport Tabs from '@fuf-stack/pixels/Tabs';\n\nimport { useController, useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const radioTabsVariants = tv({\n slots: {\n base: 'group', // Needs group for group-data condition\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:text-danger',\n wrapper: '',\n tabList: '',\n tab: '',\n tabContent: '',\n cursor: '',\n panel: '',\n },\n});\n\ntype VariantProps = TVProps<typeof radioTabsVariants>;\ntype ClassName = TVClassName<typeof radioTabsVariants>;\n\nexport interface RadioTabsOption {\n /** Optional content inside of the tab */\n content?: ReactNode;\n /** disables the option */\n disabled?: boolean;\n /** option label */\n label?: React.ReactNode;\n /** option icon */\n icon?: ReactNode;\n /** HTML data-testid attribute of the option */\n testId?: string;\n /** option value */\n value: string;\n}\n\nexport interface RadioTabsProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** Determines if the Buttons are disabled or not. */\n disabled?: boolean;\n /** determines orientation of the Buttons. */\n inline?: boolean;\n /** Label displayed next to the RadioButton. */\n label?: ReactNode;\n /** Name the RadioButtons are registered at in HTML forms (react-hook-form). */\n name: string;\n /** Radio button configuration. */\n options: RadioTabsOption[];\n /** Id to grab element in internal tests. */\n testId?: string;\n /** How the RadioTabs should look like. */\n variant?: TabsProps['variant'];\n}\n\n/**\n * RadioTabs component based on [HeroUI RadioGroup](https://www.heroui.com//docs/components/radio-group)\n * and [HeroUI Tabs](https://www.heroui.com//docs/components/tabs)\n */\nconst RadioTabs = ({\n className = undefined,\n disabled = false,\n inline = false,\n label = undefined,\n name,\n options,\n testId: _testId = undefined,\n variant = undefined,\n}: RadioTabsProps): ReactElement => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const { field } = useController({ control, disabled, name });\n const { disabled: isDisabled, onBlur, onChange, ref, value } = field;\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n const variants = radioTabsVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const tabOptions = options.map<TabProps>((option) => ({\n content: option?.content,\n disabled: option?.disabled,\n key: option.value,\n label: option?.label || option?.value,\n testId: slugify(`option_${option?.testId || option?.value}`, {\n replaceDots: true,\n }),\n }));\n\n const disabledAllKeys: string[] | undefined = tabOptions?.map(\n (option) => option.key as string,\n );\n\n return (\n <HeroRadioGroup\n classNames={classNames}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </label>\n )\n }\n name={name}\n orientation={inline ? 'horizontal' : 'vertical'}\n onBlur={onBlur}\n ref={ref}\n >\n <Tabs\n disabledKeys={disabled ? disabledAllKeys : undefined}\n fullWidth={false}\n onSelectionChange={onChange}\n // make sure component is controlled\n selectedKey={value ?? ''}\n tabs={tabOptions as TabProps[]}\n testId={testId}\n variant={variant}\n />\n </HeroRadioGroup>\n );\n};\n\nexport default RadioTabs;\n","import RadioTabs from './RadioTabs';\n\nexport type { RadioTabsProps } from './RadioTabs';\n\nexport { RadioTabs };\n\nexport default RadioTabs;\n"]}
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-7QWLAPOT.js";
11
11
  import {
12
12
  useInputValueDebounce
13
- } from "./chunk-KMDTMBYI.js";
13
+ } from "./chunk-U5WBLGZV.js";
14
14
 
15
15
  // src/TextArea/TextArea.tsx
16
16
  import { Textarea as HeroTextArea } from "@heroui/input";
@@ -85,4 +85,4 @@ export {
85
85
  TextArea_default,
86
86
  TextArea_default2
87
87
  };
88
- //# sourceMappingURL=chunk-XDHY7DXJ.js.map
88
+ //# sourceMappingURL=chunk-NNKOK5EU.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkTSB65253cjs = require('./chunk-TSB65253.cjs');
3
+ var _chunkP6HJOG7Dcjs = require('./chunk-P6HJOG7D.cjs');
4
4
 
5
5
 
6
6
 
@@ -12,50 +12,27 @@ var useInputValueDebounce = ({
12
12
  debounceDelay = 300,
13
13
  onBlur,
14
14
  onChange,
15
- transformValue,
15
+ transform,
16
16
  type,
17
17
  value
18
18
  }) => {
19
- const transform = _chunkTSB65253cjs.useInputValueTransform.call(void 0, {
20
- transformValue,
21
- type,
22
- value
19
+ const { toDisplayValue, toFormValue } = _chunkP6HJOG7Dcjs.useInputValueTransform.call(void 0, {
20
+ transform,
21
+ type
23
22
  });
24
- const getFormValue = _react.useCallback.call(void 0,
25
- (rawValue) => {
26
- const stringValue = String(rawValue);
27
- if (transformValue) {
28
- return transformValue.formValue(stringValue);
29
- }
30
- if (type === "number" && stringValue !== "") {
31
- const numValue = Number(stringValue);
32
- return Number.isNaN(numValue) ? rawValue : numValue;
33
- }
34
- return rawValue;
35
- },
36
- [transformValue, type]
37
- );
38
- const displayValue = transformValue ? transform.displayValue : value;
39
- const [currentDisplayValue, setCurrentDisplayValue] = _react.useState.call(void 0, displayValue);
23
+ const [displayValue, setDisplayValue] = _react.useState.call(void 0, () => toDisplayValue(value));
40
24
  const timeoutRef = _react.useRef.call(void 0, null);
41
25
  _react.useEffect.call(void 0, () => {
42
- setCurrentDisplayValue(displayValue);
43
- }, [displayValue]);
26
+ setDisplayValue(toDisplayValue(value));
27
+ }, [value, toDisplayValue]);
44
28
  const handleChange = _react.useCallback.call(void 0,
45
29
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
30
  (...event) => {
47
- var _a, _b, _c, _d;
48
- const newValue = (_c = (_b = (_a = event[0]) == null ? void 0 : _a.target) == null ? void 0 : _b.value) != null ? _c : event[0];
49
- let displayVal = newValue;
50
- if (!transformValue && type === "number" && newValue !== "") {
51
- const numValue = Number(newValue);
52
- displayVal = Number.isNaN(numValue) ? newValue : numValue;
53
- }
54
- setCurrentDisplayValue(displayVal);
55
- if (transformValue && ((_d = event[0]) == null ? void 0 : _d.target)) {
56
- transform.handleInputChange(event[0]);
57
- }
58
- const formValue = getFormValue(newValue);
31
+ var _a, _b, _c;
32
+ const rawValue = (_c = (_b = (_a = event[0]) == null ? void 0 : _a.target) == null ? void 0 : _b.value) != null ? _c : event[0];
33
+ const newDisplayValue = transform ? rawValue : toDisplayValue(rawValue);
34
+ setDisplayValue(newDisplayValue);
35
+ const formValue = toFormValue(newDisplayValue);
59
36
  if (timeoutRef.current) {
60
37
  clearTimeout(timeoutRef.current);
61
38
  }
@@ -78,25 +55,25 @@ var useInputValueDebounce = ({
78
55
  timeoutRef.current = setTimeout(executeOnChange, debounceDelay);
79
56
  }
80
57
  },
81
- [onChange, debounceDelay, transformValue, transform, type, getFormValue]
58
+ [onChange, debounceDelay, toDisplayValue, toFormValue, transform]
82
59
  );
83
60
  const handleBlur = _react.useCallback.call(void 0, () => {
84
61
  if (timeoutRef.current) {
85
62
  clearTimeout(timeoutRef.current);
86
63
  timeoutRef.current = null;
87
- const formValue = getFormValue(currentDisplayValue);
64
+ const formValue = toFormValue(displayValue);
88
65
  onChange(formValue);
89
66
  }
90
67
  onBlur();
91
- }, [currentDisplayValue, onChange, onBlur, getFormValue]);
68
+ }, [onChange, onBlur, toFormValue, displayValue]);
92
69
  return {
93
70
  onChange: handleChange,
94
71
  onBlur: handleBlur,
95
- value: currentDisplayValue
72
+ value: displayValue
96
73
  };
97
74
  };
98
75
 
99
76
 
100
77
 
101
78
  exports.useInputValueDebounce = useInputValueDebounce;
102
- //# sourceMappingURL=chunk-I2PJDXWB.cjs.map
79
+ //# sourceMappingURL=chunk-OWWUTKGY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-OWWUTKGY.cjs","../src/hooks/useInputValueDebounce/useInputValueDebounce.ts"],"names":["_a"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-OWWUTKGY.cjs","sourcesContent":[null,"import type { InputValueTransform } from '../useInputValueTransform/useInputValueTransform';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useInputValueTransform } from '../useInputValueTransform/useInputValueTransform';\n\nexport interface UseInputValueDebounceOptions {\n /** Debounce delay in milliseconds (default: 300) */\n debounceDelay?: number;\n /** The onBlur function to call after flushing debounced value */\n onBlur: () => void;\n /** The onChange function to call with debounced value */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => void;\n /** Value transformation functions */\n transform?: InputValueTransform;\n /** Input type to handle number conversion (optional) */\n type?: 'text' | 'number' | 'password';\n /** The initial form value */\n value: string | number;\n}\n\nexport interface UseInputValueDebounceReturn {\n /** Enhanced onChange function with debouncing */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => void;\n /** Enhanced onBlur function that flushes current value immediately */\n onBlur: () => void;\n /** The field value that is displayed - updates immediately */\n value: string | number;\n}\n\n/**\n * Custom hook for debouncing input value changes with immediate blur support.\n *\n * Provides immediate visual feedback by updating the display value instantly,\n * while debouncing the actual form state changes. When the input loses focus,\n * any pending debounced changes are immediately flushed.\n *\n * **Key Features:**\n * - **Debouncing**: Delays form updates until user stops typing\n * - **Transform support**: Optional value transformation between display and form values\n * - **Number conversion**: Automatic conversion for number inputs\n * - **Immediate display updates**: UI stays responsive during debouncing\n * - **Blur flushing**: Immediately applies pending changes on blur\n *\n * @param options Configuration for debounced value handling\n * @param options.debounceDelay Delay in milliseconds (default: 300)\n * @param options.onBlur Function to call after flushing debounced value\n * @param options.onChange Function to call with debounced value\n * @param options.transform Optional transform functions for display ↔ form value conversion\n * @param options.type Input type for number conversion ('text' | 'number' | 'password')\n * @param options.value The initial form value\n * @returns Object containing enhanced onChange, onBlur, and immediate display value\n *\n * @example\n * Basic usage with debouncing:\n * ```tsx\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * value: field.value,\n * });\n * ```\n *\n * @example\n * Number input with automatic conversion:\n * ```tsx\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * type: 'number',\n * value: field.value, // Display: 123 (number), Form: 123 (number)\n * });\n * ```\n *\n * @example\n * Currency formatting with transforms:\n * ```tsx\n * const currencyTransform = {\n * displayValue: (val) => val ? `$${Number(val).toFixed(2)}` : '',\n * formValue: (val) => Number(val.replace(/[$,]/g, '')) || 0\n * };\n *\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * transform: currencyTransform,\n * value: field.value, // Display: \"$100.00\", Form: 100\n * });\n * ```\n */\nexport const useInputValueDebounce = ({\n debounceDelay = 300,\n onBlur,\n onChange,\n transform,\n type,\n value,\n}: UseInputValueDebounceOptions): UseInputValueDebounceReturn => {\n // Get conversion utilities from transform hook\n const { toDisplayValue, toFormValue } = useInputValueTransform({\n transform,\n type,\n });\n\n // Track display value for synchronous updates\n const [displayValue, setDisplayValue] = useState(() => toDisplayValue(value));\n\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Sync with external value changes\n useEffect(() => {\n setDisplayValue(toDisplayValue(value));\n }, [value, toDisplayValue]);\n\n // Enhanced onChange handler with debouncing\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...event: any[]) => {\n // Extract the raw input value\n const rawValue = event[0]?.target?.value ?? event[0];\n\n // For transforms, user input is already in display format\n // For number types, convert strings to numbers for display\n const newDisplayValue = transform ? rawValue : toDisplayValue(rawValue);\n setDisplayValue(newDisplayValue);\n\n // Convert to form value using transform utilities\n const formValue = toFormValue(newDisplayValue);\n\n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n const executeOnChange = () => {\n // Preserve event structure if original was an event\n if (event[0]?.target) {\n const convertedEvent = {\n ...event[0],\n target: {\n ...event[0].target,\n value: formValue,\n },\n };\n onChange(convertedEvent, ...event.slice(1));\n } else {\n onChange(formValue);\n }\n };\n\n // Execute immediately or after delay\n if (debounceDelay <= 0) {\n executeOnChange();\n } else {\n timeoutRef.current = setTimeout(executeOnChange, debounceDelay);\n }\n },\n [onChange, debounceDelay, toDisplayValue, toFormValue, transform],\n );\n\n // Enhanced blur handler\n const handleBlur = useCallback(() => {\n // Flush pending changes\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n\n // Get form value from current display value\n const formValue = toFormValue(displayValue);\n onChange(formValue);\n }\n onBlur();\n }, [onChange, onBlur, toFormValue, displayValue]);\n\n return {\n onChange: handleChange,\n onBlur: handleBlur,\n value: displayValue,\n };\n};\n"]}
@@ -0,0 +1,41 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/hooks/useInputValueTransform/useInputValueTransform.ts
2
+ var _react = require('react');
3
+ var useInputValueTransform = ({
4
+ type,
5
+ transform
6
+ }) => {
7
+ const toDisplayValue = _react.useCallback.call(void 0,
8
+ (formValue) => {
9
+ if (transform == null ? void 0 : transform.toDisplayValue) {
10
+ return transform.toDisplayValue(formValue != null ? formValue : "");
11
+ }
12
+ if (type === "number") {
13
+ if (formValue === "") return "";
14
+ const numValue = Number(formValue);
15
+ return Number.isNaN(numValue) ? formValue : numValue;
16
+ }
17
+ return formValue != null ? formValue : "";
18
+ },
19
+ [type, transform]
20
+ );
21
+ const toFormValue = _react.useCallback.call(void 0,
22
+ (displayValue) => {
23
+ if (type === "number") {
24
+ if (displayValue === "") return "";
25
+ const numValue = Number(displayValue);
26
+ return Number.isNaN(numValue) ? displayValue : numValue;
27
+ }
28
+ return (transform == null ? void 0 : transform.toFormValue) ? transform.toFormValue(displayValue) : displayValue;
29
+ },
30
+ [type, transform]
31
+ );
32
+ return {
33
+ toDisplayValue,
34
+ toFormValue
35
+ };
36
+ };
37
+
38
+
39
+
40
+ exports.useInputValueTransform = useInputValueTransform;
41
+ //# sourceMappingURL=chunk-P6HJOG7D.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-P6HJOG7D.cjs","../src/hooks/useInputValueTransform/useInputValueTransform.ts"],"names":[],"mappings":"AAAA;ACAA,8BAA4B;AAsFrB,IAAM,uBAAA,EAAyB,CAAC;AAAA,EACrC,IAAA;AAAA,EACA;AACF,CAAA,EAAA,GAAmE;AAIjE,EAAA,MAAM,eAAA,EAAiB,gCAAA;AAAA,IACrB,CAAC,SAAA,EAAA,GAAgD;AAC/C,MAAA,GAAA,CAAI,UAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,SAAA,CAAW,cAAA,EAAgB;AAC7B,QAAA,OAAO,SAAA,CAAU,cAAA,CAAe,UAAA,GAAA,KAAA,EAAA,UAAA,EAAa,EAAE,CAAA;AAAA,MACjD;AAGA,MAAA,GAAA,CAAI,KAAA,IAAS,QAAA,EAAU;AACrB,QAAA,GAAA,CAAI,UAAA,IAAc,EAAA,EAAI,OAAO,EAAA;AAC7B,QAAA,MAAM,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA;AACjC,QAAA,OAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAA,EAAI,UAAA,EAAY,QAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,UAAA,GAAA,KAAA,EAAA,UAAA,EAAa,EAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,SAAS;AAAA,EAClB,CAAA;AAKA,EAAA,MAAM,YAAA,EAAc,gCAAA;AAAA,IAClB,CAAC,YAAA,EAAA,GAAmD;AAClD,MAAA,GAAA,CAAI,KAAA,IAAS,QAAA,EAAU;AACrB,QAAA,GAAA,CAAI,aAAA,IAAiB,EAAA,EAAI,OAAO,EAAA;AAChC,QAAA,MAAM,SAAA,EAAW,MAAA,CAAO,YAAY,CAAA;AACpC,QAAA,OAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAA,EAAI,aAAA,EAAe,QAAA;AAAA,MACjD;AAEA,MAAA,OAAA,CAAO,UAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,SAAA,CAAW,WAAA,EAAA,EACd,SAAA,CAAU,WAAA,CAAY,YAAsB,EAAA,EAC5C,YAAA;AAAA,IACN,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,SAAS;AAAA,EAClB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,EACF,CAAA;AACF,CAAA;ADjGA;AACA;AACE;AACF,wDAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-P6HJOG7D.cjs","sourcesContent":[null,"import { useCallback } from 'react';\n\nexport interface InputValueTransform {\n /** Transforms the form value to display value (e.g., 1000 → \"$1,000\") */\n toDisplayValue: (value: string | number) => string | number;\n /** Transforms the display value to form value (e.g., \"$1,000\" → 1000) */\n toFormValue: (value: string) => string | number;\n}\n\nexport interface UseInputValueTransformOptions {\n /** Input type for special number handling */\n type?: 'text' | 'number' | 'password';\n /** Value transformation functions */\n transform?: InputValueTransform;\n}\n\nexport interface UseInputValueTransformReturn {\n /** Converts any form value to display value */\n toDisplayValue: (formValue: string | number) => string | number;\n /** Converts any display value to form value */\n toFormValue: (displayValue: string | number) => string | number;\n}\n\n/**\n * Custom hook providing utility functions for value transformations between display and form values.\n *\n * This hook provides pure conversion functions without any state management. It's useful for:\n * - Currency formatting ($1,000 display vs 1000 stored)\n * - Number inputs with special handling\n * - Date formatting (MM/DD/YYYY display vs ISO date stored)\n * - Phone number formatting ((555) 123-4567 display vs 5551234567 stored)\n *\n * **Key Features:**\n * - Pure conversion functions (no state)\n * - Special number input handling (empty string preservation)\n * - Bidirectional value transformations\n * - Memoized functions for performance\n *\n * @param options Configuration for value transformation\n * @returns Pure conversion utility functions\n *\n * @example\n * ```tsx\n * // Currency formatting\n * const currencyTransform = {\n * displayValue: (val) => val ? `$${Number(val).toLocaleString()}` : '',\n * formValue: (val) => parseFloat(val.replace(/[$,]/g, '')) || 0\n * };\n *\n * const { toDisplayValue, toFormValue } = useInputValueTransform({\n * transform: currencyTransform\n * });\n *\n * const displayVal = toDisplayValue(1000); // \"$1,000\"\n * const formVal = toFormValue(\"$1,500\"); // 1500\n * ```\n *\n * @example\n * ```tsx\n * // Number input (no transforms needed)\n * const { toDisplayValue, toFormValue } = useInputValueTransform({\n * type: 'number'\n * });\n *\n * // Handles empty string → empty string (not NaN)\n * // Handles \"123\" → 123 (string to number conversion)\n * ```\n *\n * @example\n * ```tsx\n * // Integration with debouncing\n * const MyInput = ({ field, transform }) => {\n * const transform = useInputValueTransform({ transform });\n *\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * ...transform,\n * initialValue: field.value,\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * });\n *\n * return <input value={value} onChange={onChange} onBlur={onBlur} />;\n * };\n * ```\n */\nexport const useInputValueTransform = ({\n type,\n transform,\n}: UseInputValueTransformOptions): UseInputValueTransformReturn => {\n /**\n * Converts any form value to display value\n */\n const toDisplayValue = useCallback(\n (formValue: string | number): string | number => {\n if (transform?.toDisplayValue) {\n return transform.toDisplayValue(formValue ?? '');\n }\n\n // For number type, convert valid strings to numbers for display\n if (type === 'number') {\n if (formValue === '') return '';\n const numValue = Number(formValue);\n return Number.isNaN(numValue) ? formValue : numValue;\n }\n\n return formValue ?? '';\n },\n [type, transform],\n );\n\n /**\n * Converts any display value to form value\n */\n const toFormValue = useCallback(\n (displayValue: string | number): string | number => {\n if (type === 'number') {\n if (displayValue === '') return '';\n const numValue = Number(displayValue);\n return Number.isNaN(numValue) ? displayValue : numValue;\n }\n\n return transform?.toFormValue\n ? transform.toFormValue(displayValue as string)\n : displayValue;\n },\n [type, transform],\n );\n\n return {\n toDisplayValue,\n toFormValue,\n };\n};\n"]}
@@ -0,0 +1,41 @@
1
+ // src/hooks/useInputValueTransform/useInputValueTransform.ts
2
+ import { useCallback } from "react";
3
+ var useInputValueTransform = ({
4
+ type,
5
+ transform
6
+ }) => {
7
+ const toDisplayValue = useCallback(
8
+ (formValue) => {
9
+ if (transform == null ? void 0 : transform.toDisplayValue) {
10
+ return transform.toDisplayValue(formValue != null ? formValue : "");
11
+ }
12
+ if (type === "number") {
13
+ if (formValue === "") return "";
14
+ const numValue = Number(formValue);
15
+ return Number.isNaN(numValue) ? formValue : numValue;
16
+ }
17
+ return formValue != null ? formValue : "";
18
+ },
19
+ [type, transform]
20
+ );
21
+ const toFormValue = useCallback(
22
+ (displayValue) => {
23
+ if (type === "number") {
24
+ if (displayValue === "") return "";
25
+ const numValue = Number(displayValue);
26
+ return Number.isNaN(numValue) ? displayValue : numValue;
27
+ }
28
+ return (transform == null ? void 0 : transform.toFormValue) ? transform.toFormValue(displayValue) : displayValue;
29
+ },
30
+ [type, transform]
31
+ );
32
+ return {
33
+ toDisplayValue,
34
+ toFormValue
35
+ };
36
+ };
37
+
38
+ export {
39
+ useInputValueTransform
40
+ };
41
+ //# sourceMappingURL=chunk-Q2BOMFJ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useInputValueTransform/useInputValueTransform.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nexport interface InputValueTransform {\n /** Transforms the form value to display value (e.g., 1000 → \"$1,000\") */\n toDisplayValue: (value: string | number) => string | number;\n /** Transforms the display value to form value (e.g., \"$1,000\" → 1000) */\n toFormValue: (value: string) => string | number;\n}\n\nexport interface UseInputValueTransformOptions {\n /** Input type for special number handling */\n type?: 'text' | 'number' | 'password';\n /** Value transformation functions */\n transform?: InputValueTransform;\n}\n\nexport interface UseInputValueTransformReturn {\n /** Converts any form value to display value */\n toDisplayValue: (formValue: string | number) => string | number;\n /** Converts any display value to form value */\n toFormValue: (displayValue: string | number) => string | number;\n}\n\n/**\n * Custom hook providing utility functions for value transformations between display and form values.\n *\n * This hook provides pure conversion functions without any state management. It's useful for:\n * - Currency formatting ($1,000 display vs 1000 stored)\n * - Number inputs with special handling\n * - Date formatting (MM/DD/YYYY display vs ISO date stored)\n * - Phone number formatting ((555) 123-4567 display vs 5551234567 stored)\n *\n * **Key Features:**\n * - Pure conversion functions (no state)\n * - Special number input handling (empty string preservation)\n * - Bidirectional value transformations\n * - Memoized functions for performance\n *\n * @param options Configuration for value transformation\n * @returns Pure conversion utility functions\n *\n * @example\n * ```tsx\n * // Currency formatting\n * const currencyTransform = {\n * displayValue: (val) => val ? `$${Number(val).toLocaleString()}` : '',\n * formValue: (val) => parseFloat(val.replace(/[$,]/g, '')) || 0\n * };\n *\n * const { toDisplayValue, toFormValue } = useInputValueTransform({\n * transform: currencyTransform\n * });\n *\n * const displayVal = toDisplayValue(1000); // \"$1,000\"\n * const formVal = toFormValue(\"$1,500\"); // 1500\n * ```\n *\n * @example\n * ```tsx\n * // Number input (no transforms needed)\n * const { toDisplayValue, toFormValue } = useInputValueTransform({\n * type: 'number'\n * });\n *\n * // Handles empty string → empty string (not NaN)\n * // Handles \"123\" → 123 (string to number conversion)\n * ```\n *\n * @example\n * ```tsx\n * // Integration with debouncing\n * const MyInput = ({ field, transform }) => {\n * const transform = useInputValueTransform({ transform });\n *\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * ...transform,\n * initialValue: field.value,\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * });\n *\n * return <input value={value} onChange={onChange} onBlur={onBlur} />;\n * };\n * ```\n */\nexport const useInputValueTransform = ({\n type,\n transform,\n}: UseInputValueTransformOptions): UseInputValueTransformReturn => {\n /**\n * Converts any form value to display value\n */\n const toDisplayValue = useCallback(\n (formValue: string | number): string | number => {\n if (transform?.toDisplayValue) {\n return transform.toDisplayValue(formValue ?? '');\n }\n\n // For number type, convert valid strings to numbers for display\n if (type === 'number') {\n if (formValue === '') return '';\n const numValue = Number(formValue);\n return Number.isNaN(numValue) ? formValue : numValue;\n }\n\n return formValue ?? '';\n },\n [type, transform],\n );\n\n /**\n * Converts any display value to form value\n */\n const toFormValue = useCallback(\n (displayValue: string | number): string | number => {\n if (type === 'number') {\n if (displayValue === '') return '';\n const numValue = Number(displayValue);\n return Number.isNaN(numValue) ? displayValue : numValue;\n }\n\n return transform?.toFormValue\n ? transform.toFormValue(displayValue as string)\n : displayValue;\n },\n [type, transform],\n );\n\n return {\n toDisplayValue,\n toFormValue,\n };\n};\n"],"mappings":";AAAA,SAAS,mBAAmB;AAsFrB,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AACF,MAAmE;AAIjE,QAAM,iBAAiB;AAAA,IACrB,CAAC,cAAgD;AAC/C,UAAI,uCAAW,gBAAgB;AAC7B,eAAO,UAAU,eAAe,gCAAa,EAAE;AAAA,MACjD;AAGA,UAAI,SAAS,UAAU;AACrB,YAAI,cAAc,GAAI,QAAO;AAC7B,cAAM,WAAW,OAAO,SAAS;AACjC,eAAO,OAAO,MAAM,QAAQ,IAAI,YAAY;AAAA,MAC9C;AAEA,aAAO,gCAAa;AAAA,IACtB;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,EAClB;AAKA,QAAM,cAAc;AAAA,IAClB,CAAC,iBAAmD;AAClD,UAAI,SAAS,UAAU;AACrB,YAAI,iBAAiB,GAAI,QAAO;AAChC,cAAM,WAAW,OAAO,YAAY;AACpC,eAAO,OAAO,MAAM,QAAQ,IAAI,eAAe;AAAA,MACjD;AAEA,cAAO,uCAAW,eACd,UAAU,YAAY,YAAsB,IAC5C;AAAA,IACN;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,EAClB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-7QWLAPOT.js";
11
11
  import {
12
12
  useInputValueDebounce
13
- } from "./chunk-KMDTMBYI.js";
13
+ } from "./chunk-U5WBLGZV.js";
14
14
 
15
15
  // src/Input/Input.tsx
16
16
  import { Input as HeroInput } from "@heroui/input";
@@ -27,7 +27,7 @@ var Input = ({
27
27
  size = void 0,
28
28
  startContent = void 0,
29
29
  testId: _testId = void 0,
30
- transformValue = void 0,
30
+ transform = void 0,
31
31
  type = void 0
32
32
  }) => {
33
33
  const { control, debugMode, getFieldState } = useFormContext();
@@ -48,7 +48,7 @@ var Input = ({
48
48
  debounceDelay,
49
49
  onBlur: fieldOnBlur,
50
50
  onChange: fieldOnChange,
51
- transformValue,
51
+ transform,
52
52
  type,
53
53
  value: fieldValue
54
54
  });
@@ -95,4 +95,4 @@ export {
95
95
  Input_default,
96
96
  Input_default2
97
97
  };
98
- //# sourceMappingURL=chunk-EPY6UDD3.js.map
98
+ //# sourceMappingURL=chunk-QDFIRRB5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Input/Input.tsx","../src/Input/index.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { InputValueTransform } from '../hooks';\n\nimport { Input as HeroInput } from '@heroui/input';\n\nimport { cn } from '@fuf-stack/pixel-utils';\n\nimport { useController, useFormContext, useInputValueDebounce } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport interface InputProps {\n /** CSS class name */\n className?: string;\n /** debounce delay in milliseconds for form state updates (default: 300ms) */\n debounceDelay?: number;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** form field label (set to false to disable label) */\n label?: string | false;\n /** form field name */\n name: string;\n /** form field placeholder */\n placeholder?: string;\n /** size of the input */\n size?: 'sm' | 'md' | 'lg';\n /** content added to the start of the input field */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** allows disentangled display and form values for a field */\n transform?: InputValueTransform;\n /** input type */\n type?: 'number' | 'password';\n}\n\n/**\n * Input component based on [HeroUI Input](https://www.heroui.com//docs/components/input)\n */\nconst Input = ({\n className = undefined,\n debounceDelay = 300,\n disabled = false,\n endContent = undefined,\n label = undefined,\n name,\n placeholder = ' ',\n size = undefined,\n startContent = undefined,\n testId: _testId = undefined,\n transform = undefined,\n type = undefined,\n}: InputProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const { field } = useController({\n control,\n disabled,\n name,\n });\n\n const {\n disabled: isDisabled,\n onChange: fieldOnChange,\n onBlur: fieldOnBlur,\n value: fieldValue,\n ref,\n } = field;\n\n // Use hook that provides debounced onChange and enhanced blur handling\n const { onChange, onBlur, value } = useInputValueDebounce({\n debounceDelay,\n onBlur: fieldOnBlur,\n onChange: fieldOnChange,\n transform,\n type,\n value: fieldValue,\n });\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <HeroInput\n className={cn(className)}\n classNames={{\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n }}\n data-testid={testId}\n endContent={endContent}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n <>\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </>\n )\n }\n labelPlacement=\"outside\"\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n radius=\"sm\"\n ref={ref}\n size={size}\n startContent={startContent}\n type={type}\n // @ts-expect-error can be number for input type number\n value={value}\n variant=\"bordered\"\n />\n );\n};\n\nexport default Input;\n","import Input from './Input';\n\nexport type { InputProps } from './Input';\n\nexport { Input };\n\nexport default Input;\n"],"mappings":";;;;;;;;;;;;;;;AAGA,SAAS,SAAS,iBAAiB;AAEnC,SAAS,UAAU;AAyFF,SAOP,UAPO,KAOP,YAPO;AArDjB,IAAM,QAAQ,CAAC;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf,QAAQ,UAAU;AAAA,EAClB,YAAY;AAAA,EACZ,OAAO;AACT,MAAkB;AAChB,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,EAAE,MAAM,IAAI,cAAc;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,EACF,IAAI;AAGJ,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI,sBAAsB;AAAA,IACxD;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,SAAS;AAAA,MACvB,YAAY;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA,cACE,SAAS,oBAAC,gCAAqB,OAAc,QAAgB;AAAA,MAE/D;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OACE,aACE,iCACG;AAAA;AAAA,QACA,wBAAwB,oBAAC,iCAAsB,QAAgB;AAAA,SAClE;AAAA,MAGJ,gBAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA,SAAQ;AAAA;AAAA,EACV;AAEJ;AAEA,IAAO,gBAAQ;;;ACtHf,IAAOA,iBAAQ;","names":["Input_default"]}
@@ -10,7 +10,7 @@ var _chunkGNYQC5IJcjs = require('./chunk-GNYQC5IJ.cjs');
10
10
  var _chunkY6EAPURVcjs = require('./chunk-Y6EAPURV.cjs');
11
11
 
12
12
 
13
- var _chunkI2PJDXWBcjs = require('./chunk-I2PJDXWB.cjs');
13
+ var _chunkOWWUTKGYcjs = require('./chunk-OWWUTKGY.cjs');
14
14
 
15
15
  // src/Input/Input.tsx
16
16
  var _input = require('@heroui/input');
@@ -27,7 +27,7 @@ var Input = ({
27
27
  size = void 0,
28
28
  startContent = void 0,
29
29
  testId: _testId = void 0,
30
- transformValue = void 0,
30
+ transform = void 0,
31
31
  type = void 0
32
32
  }) => {
33
33
  const { control, debugMode, getFieldState } = _chunkY6EAPURVcjs.useFormContext.call(void 0, );
@@ -44,11 +44,11 @@ var Input = ({
44
44
  value: fieldValue,
45
45
  ref
46
46
  } = field;
47
- const { onChange, onBlur, value } = _chunkI2PJDXWBcjs.useInputValueDebounce.call(void 0, {
47
+ const { onChange, onBlur, value } = _chunkOWWUTKGYcjs.useInputValueDebounce.call(void 0, {
48
48
  debounceDelay,
49
49
  onBlur: fieldOnBlur,
50
50
  onChange: fieldOnChange,
51
- transformValue,
51
+ transform,
52
52
  type,
53
53
  value: fieldValue
54
54
  });
@@ -95,4 +95,4 @@ var Input_default2 = Input_default;
95
95
 
96
96
 
97
97
  exports.Input_default = Input_default; exports.Input_default2 = Input_default2;
98
- //# sourceMappingURL=chunk-2EYP66KF.cjs.map
98
+ //# sourceMappingURL=chunk-SG6PWCRL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-SG6PWCRL.cjs","../src/Input/Input.tsx","../src/Input/index.ts"],"names":["Input_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-SG6PWCRL.cjs","sourcesContent":[null,"import type { ReactNode } from 'react';\nimport type { InputValueTransform } from '../hooks';\n\nimport { Input as HeroInput } from '@heroui/input';\n\nimport { cn } from '@fuf-stack/pixel-utils';\n\nimport { useController, useFormContext, useInputValueDebounce } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport interface InputProps {\n /** CSS class name */\n className?: string;\n /** debounce delay in milliseconds for form state updates (default: 300ms) */\n debounceDelay?: number;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** form field label (set to false to disable label) */\n label?: string | false;\n /** form field name */\n name: string;\n /** form field placeholder */\n placeholder?: string;\n /** size of the input */\n size?: 'sm' | 'md' | 'lg';\n /** content added to the start of the input field */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** allows disentangled display and form values for a field */\n transform?: InputValueTransform;\n /** input type */\n type?: 'number' | 'password';\n}\n\n/**\n * Input component based on [HeroUI Input](https://www.heroui.com//docs/components/input)\n */\nconst Input = ({\n className = undefined,\n debounceDelay = 300,\n disabled = false,\n endContent = undefined,\n label = undefined,\n name,\n placeholder = ' ',\n size = undefined,\n startContent = undefined,\n testId: _testId = undefined,\n transform = undefined,\n type = undefined,\n}: InputProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const { field } = useController({\n control,\n disabled,\n name,\n });\n\n const {\n disabled: isDisabled,\n onChange: fieldOnChange,\n onBlur: fieldOnBlur,\n value: fieldValue,\n ref,\n } = field;\n\n // Use hook that provides debounced onChange and enhanced blur handling\n const { onChange, onBlur, value } = useInputValueDebounce({\n debounceDelay,\n onBlur: fieldOnBlur,\n onChange: fieldOnChange,\n transform,\n type,\n value: fieldValue,\n });\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <HeroInput\n className={cn(className)}\n classNames={{\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n }}\n data-testid={testId}\n endContent={endContent}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n <>\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </>\n )\n }\n labelPlacement=\"outside\"\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n radius=\"sm\"\n ref={ref}\n size={size}\n startContent={startContent}\n type={type}\n // @ts-expect-error can be number for input type number\n value={value}\n variant=\"bordered\"\n />\n );\n};\n\nexport default Input;\n","import Input from './Input';\n\nexport type { InputProps } from './Input';\n\nexport { Input };\n\nexport default Input;\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useInputValueTransform
3
- } from "./chunk-G5UX55XC.js";
3
+ } from "./chunk-Q2BOMFJ5.js";
4
4
  import {
5
5
  __spreadProps,
6
6
  __spreadValues
@@ -12,50 +12,27 @@ var useInputValueDebounce = ({
12
12
  debounceDelay = 300,
13
13
  onBlur,
14
14
  onChange,
15
- transformValue,
15
+ transform,
16
16
  type,
17
17
  value
18
18
  }) => {
19
- const transform = useInputValueTransform({
20
- transformValue,
21
- type,
22
- value
19
+ const { toDisplayValue, toFormValue } = useInputValueTransform({
20
+ transform,
21
+ type
23
22
  });
24
- const getFormValue = useCallback(
25
- (rawValue) => {
26
- const stringValue = String(rawValue);
27
- if (transformValue) {
28
- return transformValue.formValue(stringValue);
29
- }
30
- if (type === "number" && stringValue !== "") {
31
- const numValue = Number(stringValue);
32
- return Number.isNaN(numValue) ? rawValue : numValue;
33
- }
34
- return rawValue;
35
- },
36
- [transformValue, type]
37
- );
38
- const displayValue = transformValue ? transform.displayValue : value;
39
- const [currentDisplayValue, setCurrentDisplayValue] = useState(displayValue);
23
+ const [displayValue, setDisplayValue] = useState(() => toDisplayValue(value));
40
24
  const timeoutRef = useRef(null);
41
25
  useEffect(() => {
42
- setCurrentDisplayValue(displayValue);
43
- }, [displayValue]);
26
+ setDisplayValue(toDisplayValue(value));
27
+ }, [value, toDisplayValue]);
44
28
  const handleChange = useCallback(
45
29
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
30
  (...event) => {
47
- var _a, _b, _c, _d;
48
- const newValue = (_c = (_b = (_a = event[0]) == null ? void 0 : _a.target) == null ? void 0 : _b.value) != null ? _c : event[0];
49
- let displayVal = newValue;
50
- if (!transformValue && type === "number" && newValue !== "") {
51
- const numValue = Number(newValue);
52
- displayVal = Number.isNaN(numValue) ? newValue : numValue;
53
- }
54
- setCurrentDisplayValue(displayVal);
55
- if (transformValue && ((_d = event[0]) == null ? void 0 : _d.target)) {
56
- transform.handleInputChange(event[0]);
57
- }
58
- const formValue = getFormValue(newValue);
31
+ var _a, _b, _c;
32
+ const rawValue = (_c = (_b = (_a = event[0]) == null ? void 0 : _a.target) == null ? void 0 : _b.value) != null ? _c : event[0];
33
+ const newDisplayValue = transform ? rawValue : toDisplayValue(rawValue);
34
+ setDisplayValue(newDisplayValue);
35
+ const formValue = toFormValue(newDisplayValue);
59
36
  if (timeoutRef.current) {
60
37
  clearTimeout(timeoutRef.current);
61
38
  }
@@ -78,25 +55,25 @@ var useInputValueDebounce = ({
78
55
  timeoutRef.current = setTimeout(executeOnChange, debounceDelay);
79
56
  }
80
57
  },
81
- [onChange, debounceDelay, transformValue, transform, type, getFormValue]
58
+ [onChange, debounceDelay, toDisplayValue, toFormValue, transform]
82
59
  );
83
60
  const handleBlur = useCallback(() => {
84
61
  if (timeoutRef.current) {
85
62
  clearTimeout(timeoutRef.current);
86
63
  timeoutRef.current = null;
87
- const formValue = getFormValue(currentDisplayValue);
64
+ const formValue = toFormValue(displayValue);
88
65
  onChange(formValue);
89
66
  }
90
67
  onBlur();
91
- }, [currentDisplayValue, onChange, onBlur, getFormValue]);
68
+ }, [onChange, onBlur, toFormValue, displayValue]);
92
69
  return {
93
70
  onChange: handleChange,
94
71
  onBlur: handleBlur,
95
- value: currentDisplayValue
72
+ value: displayValue
96
73
  };
97
74
  };
98
75
 
99
76
  export {
100
77
  useInputValueDebounce
101
78
  };
102
- //# sourceMappingURL=chunk-KMDTMBYI.js.map
79
+ //# sourceMappingURL=chunk-U5WBLGZV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useInputValueDebounce/useInputValueDebounce.ts"],"sourcesContent":["import type { InputValueTransform } from '../useInputValueTransform/useInputValueTransform';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useInputValueTransform } from '../useInputValueTransform/useInputValueTransform';\n\nexport interface UseInputValueDebounceOptions {\n /** Debounce delay in milliseconds (default: 300) */\n debounceDelay?: number;\n /** The onBlur function to call after flushing debounced value */\n onBlur: () => void;\n /** The onChange function to call with debounced value */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => void;\n /** Value transformation functions */\n transform?: InputValueTransform;\n /** Input type to handle number conversion (optional) */\n type?: 'text' | 'number' | 'password';\n /** The initial form value */\n value: string | number;\n}\n\nexport interface UseInputValueDebounceReturn {\n /** Enhanced onChange function with debouncing */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => void;\n /** Enhanced onBlur function that flushes current value immediately */\n onBlur: () => void;\n /** The field value that is displayed - updates immediately */\n value: string | number;\n}\n\n/**\n * Custom hook for debouncing input value changes with immediate blur support.\n *\n * Provides immediate visual feedback by updating the display value instantly,\n * while debouncing the actual form state changes. When the input loses focus,\n * any pending debounced changes are immediately flushed.\n *\n * **Key Features:**\n * - **Debouncing**: Delays form updates until user stops typing\n * - **Transform support**: Optional value transformation between display and form values\n * - **Number conversion**: Automatic conversion for number inputs\n * - **Immediate display updates**: UI stays responsive during debouncing\n * - **Blur flushing**: Immediately applies pending changes on blur\n *\n * @param options Configuration for debounced value handling\n * @param options.debounceDelay Delay in milliseconds (default: 300)\n * @param options.onBlur Function to call after flushing debounced value\n * @param options.onChange Function to call with debounced value\n * @param options.transform Optional transform functions for display ↔ form value conversion\n * @param options.type Input type for number conversion ('text' | 'number' | 'password')\n * @param options.value The initial form value\n * @returns Object containing enhanced onChange, onBlur, and immediate display value\n *\n * @example\n * Basic usage with debouncing:\n * ```tsx\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * value: field.value,\n * });\n * ```\n *\n * @example\n * Number input with automatic conversion:\n * ```tsx\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * type: 'number',\n * value: field.value, // Display: 123 (number), Form: 123 (number)\n * });\n * ```\n *\n * @example\n * Currency formatting with transforms:\n * ```tsx\n * const currencyTransform = {\n * displayValue: (val) => val ? `$${Number(val).toFixed(2)}` : '',\n * formValue: (val) => Number(val.replace(/[$,]/g, '')) || 0\n * };\n *\n * const { onChange, onBlur, value } = useInputValueDebounce({\n * debounceDelay: 300,\n * onBlur: field.onBlur,\n * onChange: field.onChange,\n * transform: currencyTransform,\n * value: field.value, // Display: \"$100.00\", Form: 100\n * });\n * ```\n */\nexport const useInputValueDebounce = ({\n debounceDelay = 300,\n onBlur,\n onChange,\n transform,\n type,\n value,\n}: UseInputValueDebounceOptions): UseInputValueDebounceReturn => {\n // Get conversion utilities from transform hook\n const { toDisplayValue, toFormValue } = useInputValueTransform({\n transform,\n type,\n });\n\n // Track display value for synchronous updates\n const [displayValue, setDisplayValue] = useState(() => toDisplayValue(value));\n\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Sync with external value changes\n useEffect(() => {\n setDisplayValue(toDisplayValue(value));\n }, [value, toDisplayValue]);\n\n // Enhanced onChange handler with debouncing\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...event: any[]) => {\n // Extract the raw input value\n const rawValue = event[0]?.target?.value ?? event[0];\n\n // For transforms, user input is already in display format\n // For number types, convert strings to numbers for display\n const newDisplayValue = transform ? rawValue : toDisplayValue(rawValue);\n setDisplayValue(newDisplayValue);\n\n // Convert to form value using transform utilities\n const formValue = toFormValue(newDisplayValue);\n\n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n const executeOnChange = () => {\n // Preserve event structure if original was an event\n if (event[0]?.target) {\n const convertedEvent = {\n ...event[0],\n target: {\n ...event[0].target,\n value: formValue,\n },\n };\n onChange(convertedEvent, ...event.slice(1));\n } else {\n onChange(formValue);\n }\n };\n\n // Execute immediately or after delay\n if (debounceDelay <= 0) {\n executeOnChange();\n } else {\n timeoutRef.current = setTimeout(executeOnChange, debounceDelay);\n }\n },\n [onChange, debounceDelay, toDisplayValue, toFormValue, transform],\n );\n\n // Enhanced blur handler\n const handleBlur = useCallback(() => {\n // Flush pending changes\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n\n // Get form value from current display value\n const formValue = toFormValue(displayValue);\n onChange(formValue);\n }\n onBlur();\n }, [onChange, onBlur, toFormValue, displayValue]);\n\n return {\n onChange: handleChange,\n onBlur: handleBlur,\n value: displayValue,\n };\n};\n"],"mappings":";;;;;;;;;AAEA,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AA6FlD,IAAM,wBAAwB,CAAC;AAAA,EACpC,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiE;AAE/D,QAAM,EAAE,gBAAgB,YAAY,IAAI,uBAAuB;AAAA,IAC7D;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,MAAM,eAAe,KAAK,CAAC;AAE5E,QAAM,aAAa,OAA8B,IAAI;AAGrD,YAAU,MAAM;AACd,oBAAgB,eAAe,KAAK,CAAC;AAAA,EACvC,GAAG,CAAC,OAAO,cAAc,CAAC;AAG1B,QAAM,eAAe;AAAA;AAAA,IAEnB,IAAI,UAAiB;AA1HzB;AA4HM,YAAM,YAAW,uBAAM,CAAC,MAAP,mBAAU,WAAV,mBAAkB,UAAlB,YAA2B,MAAM,CAAC;AAInD,YAAM,kBAAkB,YAAY,WAAW,eAAe,QAAQ;AACtE,sBAAgB,eAAe;AAG/B,YAAM,YAAY,YAAY,eAAe;AAG7C,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAEA,YAAM,kBAAkB,MAAM;AA3IpC,YAAAA;AA6IQ,aAAIA,MAAA,MAAM,CAAC,MAAP,gBAAAA,IAAU,QAAQ;AACpB,gBAAM,iBAAiB,iCAClB,MAAM,CAAC,IADW;AAAA,YAErB,QAAQ,iCACH,MAAM,CAAC,EAAE,SADN;AAAA,cAEN,OAAO;AAAA,YACT;AAAA,UACF;AACA,mBAAS,gBAAgB,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,QAC5C,OAAO;AACL,mBAAS,SAAS;AAAA,QACpB;AAAA,MACF;AAGA,UAAI,iBAAiB,GAAG;AACtB,wBAAgB;AAAA,MAClB,OAAO;AACL,mBAAW,UAAU,WAAW,iBAAiB,aAAa;AAAA,MAChE;AAAA,IACF;AAAA,IACA,CAAC,UAAU,eAAe,gBAAgB,aAAa,SAAS;AAAA,EAClE;AAGA,QAAM,aAAa,YAAY,MAAM;AAEnC,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAC/B,iBAAW,UAAU;AAGrB,YAAM,YAAY,YAAY,YAAY;AAC1C,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,QAAQ,aAAa,YAAY,CAAC;AAEhD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;","names":["_a"]}
@@ -9,10 +9,10 @@ var _chunkY6EAPURVcjs = require('../chunk-Y6EAPURV.cjs');
9
9
  require('../chunk-L4YPB7MU.cjs');
10
10
 
11
11
 
12
- var _chunkI2PJDXWBcjs = require('../chunk-I2PJDXWB.cjs');
12
+ var _chunkOWWUTKGYcjs = require('../chunk-OWWUTKGY.cjs');
13
13
 
14
14
 
15
- var _chunkTSB65253cjs = require('../chunk-TSB65253.cjs');
15
+ var _chunkP6HJOG7Dcjs = require('../chunk-P6HJOG7D.cjs');
16
16
  require('../chunk-555JRYCS.cjs');
17
17
 
18
18
 
@@ -23,5 +23,5 @@ require('../chunk-555JRYCS.cjs');
23
23
 
24
24
 
25
25
 
26
- exports.checkFieldIsRequired = _chunkY6EAPURVcjs.checkFieldIsRequired; exports.useClientValidation = _chunkY6EAPURVcjs.useClientValidation; exports.useController = _chunkY6EAPURVcjs.useController; exports.useFieldArray = _chunkY6EAPURVcjs.useFieldArray; exports.useFormContext = _chunkY6EAPURVcjs.useFormContext; exports.useInput = _chunkY6EAPURVcjs.useInput; exports.useInputValueDebounce = _chunkI2PJDXWBcjs.useInputValueDebounce; exports.useInputValueTransform = _chunkTSB65253cjs.useInputValueTransform;
26
+ exports.checkFieldIsRequired = _chunkY6EAPURVcjs.checkFieldIsRequired; exports.useClientValidation = _chunkY6EAPURVcjs.useClientValidation; exports.useController = _chunkY6EAPURVcjs.useController; exports.useFieldArray = _chunkY6EAPURVcjs.useFieldArray; exports.useFormContext = _chunkY6EAPURVcjs.useFormContext; exports.useInput = _chunkY6EAPURVcjs.useInput; exports.useInputValueDebounce = _chunkOWWUTKGYcjs.useInputValueDebounce; exports.useInputValueTransform = _chunkP6HJOG7Dcjs.useInputValueTransform;
27
27
  //# sourceMappingURL=index.cjs.map
@@ -9,10 +9,10 @@ import {
9
9
  import "../chunk-57WY5GAE.js";
10
10
  import {
11
11
  useInputValueDebounce
12
- } from "../chunk-KMDTMBYI.js";
12
+ } from "../chunk-U5WBLGZV.js";
13
13
  import {
14
14
  useInputValueTransform
15
- } from "../chunk-G5UX55XC.js";
15
+ } from "../chunk-Q2BOMFJ5.js";
16
16
  import "../chunk-K2V4ULA2.js";
17
17
  export {
18
18
  checkFieldIsRequired,