@fuf-stack/uniform 0.14.5 → 0.15.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 (147) hide show
  1. package/dist/CheckboxGroup/index.cjs +7 -6
  2. package/dist/CheckboxGroup/index.cjs.map +1 -1
  3. package/dist/CheckboxGroup/index.js +6 -5
  4. package/dist/Controller/index.cjs +4 -2
  5. package/dist/Controller/index.cjs.map +1 -1
  6. package/dist/Controller/index.d.cts +7 -3
  7. package/dist/Controller/index.d.ts +7 -3
  8. package/dist/Controller/index.js +7 -5
  9. package/dist/Controller-8Nqugui5.d.cts +37 -0
  10. package/dist/Controller-8Nqugui5.d.ts +37 -0
  11. package/dist/FieldArray/index.cjs +6 -5
  12. package/dist/FieldArray/index.cjs.map +1 -1
  13. package/dist/FieldArray/index.d.cts +5 -3
  14. package/dist/FieldArray/index.d.ts +5 -3
  15. package/dist/FieldArray/index.js +5 -4
  16. package/dist/FieldArray-AqM2XKIh.d.cts +151 -0
  17. package/dist/FieldArray-AqM2XKIh.d.ts +151 -0
  18. package/dist/Form/index.cjs +5 -4
  19. package/dist/Form/index.cjs.map +1 -1
  20. package/dist/Form/index.js +4 -3
  21. package/dist/Grid/index.cjs +1 -0
  22. package/dist/Grid/index.cjs.map +1 -1
  23. package/dist/Grid/index.js +1 -0
  24. package/dist/Input/index.cjs +7 -6
  25. package/dist/Input/index.cjs.map +1 -1
  26. package/dist/Input/index.js +6 -5
  27. package/dist/RadioGroup/index.cjs +7 -6
  28. package/dist/RadioGroup/index.cjs.map +1 -1
  29. package/dist/RadioGroup/index.js +6 -5
  30. package/dist/Select/index.cjs +7 -6
  31. package/dist/Select/index.cjs.map +1 -1
  32. package/dist/Select/index.js +6 -5
  33. package/dist/SubmitButton/index.cjs +5 -4
  34. package/dist/SubmitButton/index.cjs.map +1 -1
  35. package/dist/SubmitButton/index.js +4 -3
  36. package/dist/Switch/index.cjs +7 -6
  37. package/dist/Switch/index.cjs.map +1 -1
  38. package/dist/Switch/index.js +6 -5
  39. package/dist/TextArea/index.cjs +7 -6
  40. package/dist/TextArea/index.cjs.map +1 -1
  41. package/dist/TextArea/index.js +6 -5
  42. package/dist/{chunk-DDZMDOSG.js → chunk-2LAPLELO.js} +21 -17
  43. package/dist/{chunk-DDZMDOSG.js.map → chunk-2LAPLELO.js.map} +1 -1
  44. package/dist/chunk-2NSCPLAA.cjs +133 -0
  45. package/dist/chunk-2NSCPLAA.cjs.map +1 -0
  46. package/dist/{chunk-QW44EUAH.js → chunk-3Q37222E.js} +8 -8
  47. package/dist/{chunk-QW44EUAH.js.map → chunk-3Q37222E.js.map} +1 -1
  48. package/dist/chunk-4AXNPSXG.cjs +82 -0
  49. package/dist/chunk-4AXNPSXG.cjs.map +1 -0
  50. package/dist/chunk-4DAZAO6Y.cjs +59 -0
  51. package/dist/chunk-4DAZAO6Y.cjs.map +1 -0
  52. package/dist/chunk-4EJS5FXY.js +51 -0
  53. package/dist/chunk-4EJS5FXY.js.map +1 -0
  54. package/dist/chunk-4EP3IGSK.cjs +372 -0
  55. package/dist/chunk-4EP3IGSK.cjs.map +1 -0
  56. package/dist/{chunk-Y3SFF6RN.cjs → chunk-4M6F2O2K.cjs} +10 -9
  57. package/dist/chunk-4M6F2O2K.cjs.map +1 -0
  58. package/dist/{chunk-BYKOCVCK.js → chunk-7HK64PN5.js} +19 -15
  59. package/dist/{chunk-BYKOCVCK.js.map → chunk-7HK64PN5.js.map} +1 -1
  60. package/dist/{chunk-OHJYXA6R.cjs → chunk-C4RM2JSD.cjs} +3 -3
  61. package/dist/{chunk-OHJYXA6R.cjs.map → chunk-C4RM2JSD.cjs.map} +1 -1
  62. package/dist/chunk-CRTRMMJ7.js +59 -0
  63. package/dist/chunk-CRTRMMJ7.js.map +1 -0
  64. package/dist/{chunk-EKE5URXQ.cjs → chunk-F6KTQXWG.cjs} +15 -12
  65. package/dist/chunk-F6KTQXWG.cjs.map +1 -0
  66. package/dist/{chunk-XCZKNTFT.cjs → chunk-FLX6VIO7.cjs} +23 -19
  67. package/dist/chunk-FLX6VIO7.cjs.map +1 -0
  68. package/dist/chunk-IEF2GJ22.js +82 -0
  69. package/dist/chunk-IEF2GJ22.js.map +1 -0
  70. package/dist/chunk-K43U2JVG.cjs +248 -0
  71. package/dist/chunk-K43U2JVG.cjs.map +1 -0
  72. package/dist/{chunk-XJZAS7NG.cjs → chunk-MF4JB3YT.cjs} +25 -21
  73. package/dist/chunk-MF4JB3YT.cjs.map +1 -0
  74. package/dist/{chunk-BZAPTLMC.js → chunk-MRXNKY72.js} +49 -49
  75. package/dist/chunk-MRXNKY72.js.map +1 -0
  76. package/dist/chunk-OBQDQ4RX.js +372 -0
  77. package/dist/chunk-OBQDQ4RX.js.map +1 -0
  78. package/dist/{chunk-VP7WDLJM.js → chunk-P4PRVNCH.js} +17 -13
  79. package/dist/chunk-P4PRVNCH.js.map +1 -0
  80. package/dist/{chunk-PZ4LZQI4.cjs → chunk-QLQR44AD.cjs} +19 -15
  81. package/dist/chunk-QLQR44AD.cjs.map +1 -0
  82. package/dist/{chunk-QCVTB2NI.js → chunk-U26GTLKF.js} +8 -7
  83. package/dist/{chunk-QCVTB2NI.js.map → chunk-U26GTLKF.js.map} +1 -1
  84. package/dist/{chunk-GN5NJ6ZU.js → chunk-UJYXA5AD.js} +3 -3
  85. package/dist/chunk-V5HTEMWZ.cjs +51 -0
  86. package/dist/chunk-V5HTEMWZ.cjs.map +1 -0
  87. package/dist/{chunk-VZ5MMFIF.cjs → chunk-V7LRZ5GK.cjs} +5 -5
  88. package/dist/{chunk-VZ5MMFIF.cjs.map → chunk-V7LRZ5GK.cjs.map} +1 -1
  89. package/dist/{chunk-WKM2D7LF.js → chunk-VX76MJAI.js} +2 -2
  90. package/dist/chunk-W66BVPTB.js +248 -0
  91. package/dist/{chunk-IUNDGVMC.js.map → chunk-W66BVPTB.js.map} +1 -1
  92. package/dist/{chunk-BS52M4SZ.js → chunk-WAXJ64P7.js} +14 -11
  93. package/dist/chunk-WAXJ64P7.js.map +1 -0
  94. package/dist/{chunk-RBIX6EWU.cjs → chunk-Y4AUJ2YA.cjs} +10 -10
  95. package/dist/chunk-Y4AUJ2YA.cjs.map +1 -0
  96. package/dist/helpers/index.cjs +11 -2
  97. package/dist/helpers/index.cjs.map +1 -1
  98. package/dist/helpers/index.d.cts +68 -1
  99. package/dist/helpers/index.d.ts +68 -1
  100. package/dist/helpers/index.js +12 -3
  101. package/dist/hooks/index.cjs +6 -3
  102. package/dist/hooks/index.cjs.map +1 -1
  103. package/dist/hooks/index.d.cts +3 -2
  104. package/dist/hooks/index.d.ts +3 -2
  105. package/dist/hooks/index.js +7 -4
  106. package/dist/index.cjs +26 -15
  107. package/dist/index.cjs.map +1 -1
  108. package/dist/index.d.cts +5 -3
  109. package/dist/index.d.ts +5 -3
  110. package/dist/index.js +31 -20
  111. package/dist/partials/FieldCopyTestIdButton/index.cjs +1 -0
  112. package/dist/partials/FieldCopyTestIdButton/index.cjs.map +1 -1
  113. package/dist/partials/FieldCopyTestIdButton/index.js +1 -0
  114. package/dist/partials/FieldValidationError/index.cjs +4 -3
  115. package/dist/partials/FieldValidationError/index.cjs.map +1 -1
  116. package/dist/partials/FieldValidationError/index.js +3 -2
  117. package/package.json +17 -17
  118. package/dist/FieldArray-DD9z-xZ3.d.cts +0 -37
  119. package/dist/FieldArray-DD9z-xZ3.d.ts +0 -37
  120. package/dist/chunk-BBB4FEY6.cjs +0 -22
  121. package/dist/chunk-BBB4FEY6.cjs.map +0 -1
  122. package/dist/chunk-BS52M4SZ.js.map +0 -1
  123. package/dist/chunk-BZAPTLMC.js.map +0 -1
  124. package/dist/chunk-EKE5URXQ.cjs.map +0 -1
  125. package/dist/chunk-HOETR36J.cjs +0 -299
  126. package/dist/chunk-HOETR36J.cjs.map +0 -1
  127. package/dist/chunk-HZP3EXGR.cjs +0 -241
  128. package/dist/chunk-HZP3EXGR.cjs.map +0 -1
  129. package/dist/chunk-IUNDGVMC.js +0 -241
  130. package/dist/chunk-KOKIM2ND.js +0 -9
  131. package/dist/chunk-KOKIM2ND.js.map +0 -1
  132. package/dist/chunk-PZ4LZQI4.cjs.map +0 -1
  133. package/dist/chunk-RBIX6EWU.cjs.map +0 -1
  134. package/dist/chunk-V46BHM2U.js +0 -22
  135. package/dist/chunk-V46BHM2U.js.map +0 -1
  136. package/dist/chunk-VP7WDLJM.js.map +0 -1
  137. package/dist/chunk-VQWKXSHW.cjs +0 -9
  138. package/dist/chunk-VQWKXSHW.cjs.map +0 -1
  139. package/dist/chunk-XCZKNTFT.cjs.map +0 -1
  140. package/dist/chunk-XJWEUCV3.cjs +0 -133
  141. package/dist/chunk-XJWEUCV3.cjs.map +0 -1
  142. package/dist/chunk-XJZAS7NG.cjs.map +0 -1
  143. package/dist/chunk-Y3SFF6RN.cjs.map +0 -1
  144. package/dist/chunk-Y53IHK6B.js +0 -299
  145. package/dist/chunk-Y53IHK6B.js.map +0 -1
  146. /package/dist/{chunk-GN5NJ6ZU.js.map → chunk-UJYXA5AD.js.map} +0 -0
  147. /package/dist/{chunk-WKM2D7LF.js.map → chunk-VX76MJAI.js.map} +0 -0
@@ -1,15 +1,15 @@
1
1
  import {
2
- Controller
3
- } from "./chunk-KOKIM2ND.js";
2
+ Controller_default
3
+ } from "./chunk-4EJS5FXY.js";
4
4
  import {
5
5
  FieldCopyTestIdButton_default
6
6
  } from "./chunk-2CRY7VDQ.js";
7
7
  import {
8
8
  FieldValidationError_default
9
- } from "./chunk-WKM2D7LF.js";
9
+ } from "./chunk-VX76MJAI.js";
10
10
  import {
11
11
  useFormContext
12
- } from "./chunk-BZAPTLMC.js";
12
+ } from "./chunk-MRXNKY72.js";
13
13
 
14
14
  // src/TextArea/TextArea.tsx
15
15
  import { Textarea as NextTextArea } from "@nextui-org/input";
@@ -29,7 +29,7 @@ var TextArea = ({
29
29
  const showTestIdCopyButton = debugMode === "debug-testids";
30
30
  const showLabel = label || showTestIdCopyButton;
31
31
  return /* @__PURE__ */ jsx(
32
- Controller,
32
+ Controller_default,
33
33
  {
34
34
  control,
35
35
  name,
@@ -37,7 +37,8 @@ var TextArea = ({
37
37
  render: ({
38
38
  field: { disabled: isDisabled, onChange, onBlur, value = "", ref }
39
39
  }) => {
40
- const displayValue = value?.toString() ?? "";
40
+ var _a;
41
+ const displayValue = (_a = value == null ? void 0 : value.toString()) != null ? _a : "";
41
42
  return /* @__PURE__ */ jsx(
42
43
  NextTextArea,
43
44
  {
@@ -78,4 +79,4 @@ export {
78
79
  TextArea_default,
79
80
  TextArea_default2
80
81
  };
81
- //# sourceMappingURL=chunk-QCVTB2NI.js.map
82
+ //# sourceMappingURL=chunk-U26GTLKF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TextArea/TextArea.tsx","../src/TextArea/index.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Textarea as NextTextArea } from '@nextui-org/input';\n\nimport { cn } from '@fuf-stack/pixel-utils';\n\nimport { Controller } from '../Controller';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport interface TextAreaProps {\n /** Child components. The content of the textarea. */\n children?: ReactNode;\n /** CSS class name */\n className?: string;\n /** Determines if the TextArea is disabled or not. */\n disabled?: boolean;\n /** Label displayed above the TextArea. */\n label?: ReactNode;\n /** Name the TextArea is registered at in HTML forms (react-hook-form). */\n name: string;\n /** placeholder for the textArea content. */\n placeholder?: string;\n /** Id to grab element in internal tests. */\n testId?: string;\n}\n\n/**\n * TextArea component based on [NextUI TextArea](https://nextui.org/docs/components/textarea)\n */\nconst TextArea = ({\n children = null,\n className = undefined,\n disabled = false,\n label = undefined,\n name,\n placeholder = ' ',\n testId: _testId = undefined,\n}: TextAreaProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <Controller\n control={control}\n name={name}\n disabled={disabled}\n render={({\n field: { disabled: isDisabled, onChange, onBlur, value = '', ref },\n }) => {\n /**\n * Ensures the textarea always has a defined string value to prevent uncontrolled to\n * controlled component warnings:\n *\n * 1. Warning Prevention:\n * - Sets default value to '' in field destructuring\n * - Guarantees the value prop is never undefined/null\n * - Prevents React warning: \"A component is changing from uncontrolled to controlled\"\n *\n * 2. Value Handling:\n * - Converts undefined/null to empty string\n * - Converts non-string values to strings\n * - Maintains existing string values\n *\n * Examples:\n * - undefined → \"\" (prevents uncontrolled warning)\n * - null → \"\" (prevents uncontrolled warning)\n * - \"hello\" → \"hello\" (maintains string value)\n * - 123 → \"123\" (converts to string)\n *\n * Without this handling, the textarea could switch between controlled/uncontrolled\n * states when the form value changes from undefined to defined, causing React warnings\n * and potential rendering issues.\n */\n const displayValue = value?.toString() ?? '';\n\n return (\n <NextTextArea\n className={cn(className)}\n classNames={{\n inputWrapper: 'group-data-[focus=true]:border-focus',\n }}\n data-testid={testId}\n errorMessage={error && <FieldValidationError error={error} />}\n isDisabled={isDisabled}\n isRequired={required}\n isInvalid={invalid}\n label={\n showLabel && (\n <>\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </>\n )\n }\n labelPlacement=\"outside\"\n placeholder={placeholder}\n name={name}\n value={displayValue}\n onChange={onChange}\n onBlur={onBlur}\n ref={ref}\n variant=\"bordered\"\n >\n {children}\n </NextTextArea>\n );\n }}\n />\n );\n};\n\nexport default TextArea;\n","import TextArea from './TextArea';\n\nexport type { TextAreaProps } from './TextArea';\n\nexport { TextArea };\n\nexport default TextArea;\n"],"mappings":";;;;;;;;;;;;;;AAEA,SAAS,YAAY,oBAAoB;AAEzC,SAAS,UAAU;AAmFgB,SAMnB,UANmB,KAMnB,YANmB;AAxDnC,IAAM,WAAW,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,QAAQ,UAAU;AACpB,MAAqB;AACnB,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,QACP,OAAO,EAAE,UAAU,YAAY,UAAU,QAAQ,QAAQ,IAAI,IAAI;AAAA,MACnE,MAAM;AAyBJ,cAAM,eAAe,OAAO,SAAS,KAAK;AAE1C,eACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,SAAS;AAAA,YACvB,YAAY;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,YACA,eAAa;AAAA,YACb,cAAc,SAAS,oBAAC,gCAAqB,OAAc;AAAA,YAC3D;AAAA,YACA,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,OACE,aACE,iCACG;AAAA;AAAA,cACA,wBACC,oBAAC,iCAAsB,QAAgB;AAAA,eAE3C;AAAA,YAGJ,gBAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAQ;AAAA,YAEP;AAAA;AAAA,QACH;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;;;AChHf,IAAOA,oBAAQ;","names":["TextArea_default"]}
1
+ {"version":3,"sources":["../src/TextArea/TextArea.tsx","../src/TextArea/index.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Textarea as NextTextArea } from '@nextui-org/input';\n\nimport { cn } from '@fuf-stack/pixel-utils';\n\nimport { Controller } from '../Controller';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport interface TextAreaProps {\n /** Child components. The content of the textarea. */\n children?: ReactNode;\n /** CSS class name */\n className?: string;\n /** Determines if the TextArea is disabled or not. */\n disabled?: boolean;\n /** Label displayed above the TextArea. */\n label?: ReactNode;\n /** Name the TextArea is registered at in HTML forms (react-hook-form). */\n name: string;\n /** placeholder for the textArea content. */\n placeholder?: string;\n /** Id to grab element in internal tests. */\n testId?: string;\n}\n\n/**\n * TextArea component based on [NextUI TextArea](https://nextui.org/docs/components/textarea)\n */\nconst TextArea = ({\n children = null,\n className = undefined,\n disabled = false,\n label = undefined,\n name,\n placeholder = ' ',\n testId: _testId = undefined,\n}: TextAreaProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <Controller\n control={control}\n name={name}\n disabled={disabled}\n render={({\n field: { disabled: isDisabled, onChange, onBlur, value = '', ref },\n }) => {\n /**\n * Ensures the textarea always has a defined string value to prevent uncontrolled to\n * controlled component warnings:\n *\n * 1. Warning Prevention:\n * - Sets default value to '' in field destructuring\n * - Guarantees the value prop is never undefined/null\n * - Prevents React warning: \"A component is changing from uncontrolled to controlled\"\n *\n * 2. Value Handling:\n * - Converts undefined/null to empty string\n * - Converts non-string values to strings\n * - Maintains existing string values\n *\n * Examples:\n * - undefined → \"\" (prevents uncontrolled warning)\n * - null → \"\" (prevents uncontrolled warning)\n * - \"hello\" → \"hello\" (maintains string value)\n * - 123 → \"123\" (converts to string)\n *\n * Without this handling, the textarea could switch between controlled/uncontrolled\n * states when the form value changes from undefined to defined, causing React warnings\n * and potential rendering issues.\n */\n const displayValue = value?.toString() ?? '';\n\n return (\n <NextTextArea\n className={cn(className)}\n classNames={{\n inputWrapper: 'group-data-[focus=true]:border-focus',\n }}\n data-testid={testId}\n errorMessage={error && <FieldValidationError error={error} />}\n isDisabled={isDisabled}\n isRequired={required}\n isInvalid={invalid}\n label={\n showLabel && (\n <>\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </>\n )\n }\n labelPlacement=\"outside\"\n placeholder={placeholder}\n name={name}\n value={displayValue}\n onChange={onChange}\n onBlur={onBlur}\n ref={ref}\n variant=\"bordered\"\n >\n {children}\n </NextTextArea>\n );\n }}\n />\n );\n};\n\nexport default TextArea;\n","import TextArea from './TextArea';\n\nexport type { TextAreaProps } from './TextArea';\n\nexport { TextArea };\n\nexport default TextArea;\n"],"mappings":";;;;;;;;;;;;;;AAEA,SAAS,YAAY,oBAAoB;AAEzC,SAAS,UAAU;AAmFgB,SAMnB,UANmB,KAMnB,YANmB;AAxDnC,IAAM,WAAW,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,QAAQ,UAAU;AACpB,MAAqB;AACnB,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,QACP,OAAO,EAAE,UAAU,YAAY,UAAU,QAAQ,QAAQ,IAAI,IAAI;AAAA,MACnE,MAAM;AArDZ;AA8EQ,cAAM,gBAAe,oCAAO,eAAP,YAAqB;AAE1C,eACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,SAAS;AAAA,YACvB,YAAY;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,YACA,eAAa;AAAA,YACb,cAAc,SAAS,oBAAC,gCAAqB,OAAc;AAAA,YAC3D;AAAA,YACA,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,OACE,aACE,iCACG;AAAA;AAAA,cACA,wBACC,oBAAC,iCAAsB,QAAgB;AAAA,eAE3C;AAAA,YAGJ,gBAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAQ;AAAA,YAEP;AAAA;AAAA,QACH;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;;;AChHf,IAAOA,oBAAQ;","names":["TextArea_default"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useFormContext
3
- } from "./chunk-BZAPTLMC.js";
3
+ } from "./chunk-MRXNKY72.js";
4
4
  import {
5
5
  slugify
6
- } from "./chunk-V46BHM2U.js";
6
+ } from "./chunk-IEF2GJ22.js";
7
7
 
8
8
  // src/SubmitButton/SubmitButton.tsx
9
9
  import { cn } from "@fuf-stack/pixel-utils";
@@ -45,4 +45,4 @@ export {
45
45
  SubmitButton_default,
46
46
  SubmitButton_default2
47
47
  };
48
- //# sourceMappingURL=chunk-GN5NJ6ZU.js.map
48
+ //# sourceMappingURL=chunk-UJYXA5AD.js.map
@@ -0,0 +1,51 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunk4AXNPSXGcjs = require('./chunk-4AXNPSXG.cjs');
5
+
6
+
7
+
8
+
9
+ var _chunk4DAZAO6Ycjs = require('./chunk-4DAZAO6Y.cjs');
10
+
11
+ // src/Controller/Controller.tsx
12
+ var _reacthookform = require('react-hook-form');
13
+ var _jsxruntime = require('react/jsx-runtime');
14
+ var Controller = (_a) => {
15
+ var _b = _a, {
16
+ render
17
+ } = _b, props = _chunk4DAZAO6Ycjs.__objRest.call(void 0, _b, [
18
+ "render"
19
+ ]);
20
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
21
+ _reacthookform.Controller,
22
+ _chunk4DAZAO6Ycjs.__spreadProps.call(void 0, _chunk4DAZAO6Ycjs.__spreadValues.call(void 0, {}, props), {
23
+ render: (_a2) => {
24
+ var _b2 = _a2, { field } = _b2, rest = _chunk4DAZAO6Ycjs.__objRest.call(void 0, _b2, ["field"]);
25
+ return render(_chunk4DAZAO6Ycjs.__spreadValues.call(void 0, {
26
+ field: _chunk4DAZAO6Ycjs.__spreadProps.call(void 0, _chunk4DAZAO6Ycjs.__spreadValues.call(void 0, {}, field), {
27
+ // Handles both direct values (onChange("value")) and events (onChange(event))
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ onChange: (...event) => {
30
+ var _a3, _b3, _c;
31
+ const value = (_c = (_b3 = (_a3 = event[0]) == null ? void 0 : _a3.target) == null ? void 0 : _b3.value) != null ? _c : event[0];
32
+ field.onChange(_chunk4AXNPSXGcjs.toNullishString.call(void 0, value));
33
+ },
34
+ // Convert null/undefined to empty string for UI display
35
+ value: _chunk4AXNPSXGcjs.fromNullishString.call(void 0, field.value)
36
+ })
37
+ }, rest));
38
+ }
39
+ })
40
+ );
41
+ };
42
+ var Controller_default = Controller;
43
+
44
+ // src/Controller/index.ts
45
+ var Controller_default2 = Controller_default;
46
+
47
+
48
+
49
+
50
+ exports.Controller_default = Controller_default; exports.Controller_default2 = Controller_default2;
51
+ //# sourceMappingURL=chunk-V5HTEMWZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-V5HTEMWZ.cjs","../src/Controller/Controller.tsx","../src/Controller/index.ts"],"names":["_a","_b","Controller_default"],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACHA,gDAA4C;AA8CxC,+CAAA;AALJ,IAAM,WAAA,EAAa,CAAuC,EAAA,EAAA,GAGrB;AAHqB,EAAA,IAAA,GAAA,EAAA,EAAA,EACxD;AAAA,IAAA;AAAA,EAjDF,EAAA,EAgD0D,EAAA,EAErD,MAAA,EAAA,yCAAA,EAFqD,EAErD;AAAA,IADH;AAAA,EAAA,CAAA,CAAA;AAGA,EAAA,uBACE,6BAAA;AAAA,IAAC,yBAAA;AAAA,IAAA,6CAAA,8CAAA,CAAA,CAAA,EAEK,KAAA,CAAA,EAFL;AAAA,MAGC,MAAA,EAAQ,CAACA,GAAAA,EAAAA,GAAuB;AAAvB,QAAA,IAAAC,IAAAA,EAAAD,GAAAA,EAAE,EAAA,MAxDjB,EAAA,EAwDeC,GAAAA,EAAY,KAAA,EAAA,yCAAA,GAAZA,EAAY,CAAV,OAAA,CAAA,CAAA;AACT,QAAA,OAAO,MAAA,CAAO,8CAAA;AAAA,UACZ,KAAA,EAAO,6CAAA,8CAAA,CAAA,CAAA,EACF,KAAA,CAAA,EADE;AAAA;AAAA;AAAA,YAIL,QAAA,EAAU,CAAA,GAAI,KAAA,EAAA,GAAiB;AA9D3C,cAAA,IAAAD,GAAAA,EAAAC,GAAAA,EAAA,EAAA;AA+Dc,cAAA,MAAM,MAAA,EAAA,CAAQ,GAAA,EAAA,CAAAA,IAAAA,EAAAA,CAAAD,IAAAA,EAAA,KAAA,CAAM,CAAC,CAAA,EAAA,GAAP,KAAA,EAAA,KAAA,EAAA,EAAAA,GAAAA,CAAU,MAAA,EAAA,GAAV,KAAA,EAAA,KAAA,EAAA,EAAAC,GAAAA,CAAkB,KAAA,EAAA,GAAlB,KAAA,EAAA,GAAA,EAA2B,KAAA,CAAM,CAAC,CAAA;AAChD,cAAA,KAAA,CAAM,QAAA,CAAS,+CAAA,KAAqB,CAAC,CAAA;AAAA,YACvC,CAAA;AAAA;AAAA,YAEA,KAAA,EAAO,iDAAA,KAAkB,CAAM,KAAK;AAAA,UACtC,CAAA;AAAA,QAAA,CAAA,EACG,IAAA,CACJ,CAAA;AAAA,MACH;AAAA,IAAA,CAAA;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,mBAAA,EAAQ,UAAA;ADlCf;AACA;AErCA,IAAOC,oBAAAA,EAAQ,kBAAA;AFuCf;AACA;AACE;AACA;AACF,mGAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-V5HTEMWZ.cjs","sourcesContent":[null,"import type {\n ControllerFieldState,\n ControllerRenderProps,\n ControllerProps as RHFControllerProps,\n UseFormStateReturn,\n} from 'react-hook-form';\n\nimport { Controller as RHFController } from 'react-hook-form';\n\nimport { fromNullishString, toNullishString } from '../helpers';\n\nexport type ControllerProps<TFieldValues extends object = object> = Omit<\n RHFControllerProps<TFieldValues>,\n 'render'\n> & {\n /**\n * Render prop that receives the form control props with nullish string handling.\n * The field object contains all the properties needed to control an input:\n * - onChange: Handles both direct value changes and event objects\n * - value: Always provides a string value, converting null/undefined to empty string\n * - name, ref, etc: Other standard field properties from react-hook-form\n */\n render: (props: {\n field: Omit<ControllerRenderProps<TFieldValues>, 'onChange' | 'value'> & {\n // Using any[] to support both direct value changes and React synthetic events\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => void;\n value: string;\n };\n formState: UseFormStateReturn<TFieldValues>;\n fieldState: ControllerFieldState;\n }) => React.ReactElement;\n};\n\n/**\n * A wrapper around react-hook-form's Controller that transparently handles nullish string conversions.\n *\n * Key features:\n * 1. Empty strings ('') in the UI are stored as null in form state\n * 2. Null/undefined values in form state are displayed as empty strings in the UI\n * 3. Handles both direct value changes and React synthetic events\n * 4. Maintains the same API as react-hook-form's Controller\n *\n * This enables consistent handling of empty/null values while keeping a clean API\n * for form inputs that expect string values.\n *\n * @see https://react-hook-form.com/docs/usecontroller/controller\n */\nconst Controller = <TFieldValues extends object = object>({\n render,\n ...props\n}: ControllerProps<TFieldValues>) => {\n return (\n <RHFController<TFieldValues>\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n render={({ field, ...rest }) => {\n return render({\n field: {\n ...field,\n // Handles both direct values (onChange(\"value\")) and events (onChange(event))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (...event: any[]) => {\n const value = event[0]?.target?.value ?? event[0];\n field.onChange(toNullishString(value));\n },\n // Convert null/undefined to empty string for UI display\n value: fromNullishString(field.value) as string,\n },\n ...rest,\n });\n }}\n />\n );\n};\n\nexport default Controller;\n","import Controller from './Controller';\n\nexport type { ControllerProps } from './Controller';\n\nexport { Controller };\n\nexport default Controller;\n"]}
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkXJWEUCV3cjs = require('./chunk-XJWEUCV3.cjs');
3
+ var _chunk2NSCPLAAcjs = require('./chunk-2NSCPLAA.cjs');
4
4
 
5
5
 
6
- var _chunkBBB4FEY6cjs = require('./chunk-BBB4FEY6.cjs');
6
+ var _chunk4AXNPSXGcjs = require('./chunk-4AXNPSXG.cjs');
7
7
 
8
8
  // src/SubmitButton/SubmitButton.tsx
9
9
  var _pixelutils = require('@fuf-stack/pixel-utils');
@@ -20,13 +20,13 @@ var SubmitButton = ({
20
20
  }) => {
21
21
  const {
22
22
  formState: { isSubmitting, isValidating }
23
- } = _chunkXJWEUCV3cjs.useFormContext.call(void 0, );
23
+ } = _chunk2NSCPLAAcjs.useFormContext.call(void 0, );
24
24
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
25
25
  _pixels.Button,
26
26
  {
27
27
  className: _pixelutils.cn.call(void 0, className),
28
28
  color,
29
- testId: _chunkBBB4FEY6cjs.slugify.call(void 0, testId),
29
+ testId: _chunk4AXNPSXGcjs.slugify.call(void 0, testId),
30
30
  disabled: isSubmitting || isValidating,
31
31
  loading,
32
32
  onClick,
@@ -45,4 +45,4 @@ var SubmitButton_default2 = SubmitButton_default;
45
45
 
46
46
 
47
47
  exports.SubmitButton_default = SubmitButton_default; exports.SubmitButton_default2 = SubmitButton_default2;
48
- //# sourceMappingURL=chunk-VZ5MMFIF.cjs.map
48
+ //# sourceMappingURL=chunk-V7LRZ5GK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-VZ5MMFIF.cjs","../src/SubmitButton/SubmitButton.tsx","../src/SubmitButton/index.ts"],"names":["SubmitButton_default"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,oDAAmB;AACnB,2CAAuB;AAsCnB,+CAAA;AAbJ,IAAM,aAAA,EAAe,CAAC;AAAA,EACpB,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,KAAA,CAAA;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA,CAAA;AAAA,EACV,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA,EAAA,GAAyB;AACvB,EAAA,MAAM;AAAA,IACJ,SAAA,EAAW,EAAE,YAAA,EAAc,aAAa;AAAA,EAC1C,EAAA,EAAI,8CAAA,CAAe;AACnB,EAAA,uBACE,6BAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,4BAAA,SAAY,CAAA;AAAA,MACvB,KAAA;AAAA,MACA,MAAA,EAAQ,uCAAA,MAAc,CAAA;AAAA,MACtB,QAAA,EAAU,aAAA,GAAgB,YAAA;AAAA,MAC1B,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,qBAAA,EAAQ,YAAA;ADlBf;AACA;AElCA,IAAOA,sBAAAA,EAAQ,oBAAA;AFoCf;AACA;AACE;AACA;AACF,2GAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-VZ5MMFIF.cjs","sourcesContent":[null,"import type { ButtonProps } from '@fuf-stack/pixels';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@fuf-stack/pixel-utils';\nimport { Button } from '@fuf-stack/pixels';\n\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\n\nexport interface SubmitButtonProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: string;\n /** color of the button */\n color?: ButtonProps['color'];\n /** If set loading animation is shown */\n loading?: boolean;\n /** function called when the button is pressed. */\n onClick?: ButtonProps['onClick'];\n /** size of the button */\n size?: ButtonProps['size'];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * From SubmitButton\n */\nconst SubmitButton = ({\n children = 'Submit',\n className = undefined,\n color = 'success',\n loading = false,\n onClick = undefined,\n size = 'md',\n testId = 'form_submit_button',\n}: SubmitButtonProps) => {\n const {\n formState: { isSubmitting, isValidating },\n } = useFormContext();\n return (\n <Button\n className={cn(className)}\n color={color}\n testId={slugify(testId)}\n disabled={isSubmitting || isValidating}\n loading={loading}\n onClick={onClick}\n size={size}\n type=\"submit\"\n >\n {children}\n </Button>\n );\n};\n\nexport default SubmitButton;\n","import SubmitButton from './SubmitButton';\n\nexport type { SubmitButtonProps } from './SubmitButton';\n\nexport { SubmitButton };\n\nexport default SubmitButton;\n"]}
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-V7LRZ5GK.cjs","../src/SubmitButton/SubmitButton.tsx","../src/SubmitButton/index.ts"],"names":["SubmitButton_default"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,oDAAmB;AACnB,2CAAuB;AAsCnB,+CAAA;AAbJ,IAAM,aAAA,EAAe,CAAC;AAAA,EACpB,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,KAAA,CAAA;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA,CAAA;AAAA,EACV,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA,EAAA,GAAyB;AACvB,EAAA,MAAM;AAAA,IACJ,SAAA,EAAW,EAAE,YAAA,EAAc,aAAa;AAAA,EAC1C,EAAA,EAAI,8CAAA,CAAe;AACnB,EAAA,uBACE,6BAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,4BAAA,SAAY,CAAA;AAAA,MACvB,KAAA;AAAA,MACA,MAAA,EAAQ,uCAAA,MAAc,CAAA;AAAA,MACtB,QAAA,EAAU,aAAA,GAAgB,YAAA;AAAA,MAC1B,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,qBAAA,EAAQ,YAAA;ADlBf;AACA;AElCA,IAAOA,sBAAAA,EAAQ,oBAAA;AFoCf;AACA;AACE;AACA;AACF,2GAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-V7LRZ5GK.cjs","sourcesContent":[null,"import type { ButtonProps } from '@fuf-stack/pixels';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@fuf-stack/pixel-utils';\nimport { Button } from '@fuf-stack/pixels';\n\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\n\nexport interface SubmitButtonProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: string;\n /** color of the button */\n color?: ButtonProps['color'];\n /** If set loading animation is shown */\n loading?: boolean;\n /** function called when the button is pressed. */\n onClick?: ButtonProps['onClick'];\n /** size of the button */\n size?: ButtonProps['size'];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * From SubmitButton\n */\nconst SubmitButton = ({\n children = 'Submit',\n className = undefined,\n color = 'success',\n loading = false,\n onClick = undefined,\n size = 'md',\n testId = 'form_submit_button',\n}: SubmitButtonProps) => {\n const {\n formState: { isSubmitting, isValidating },\n } = useFormContext();\n return (\n <Button\n className={cn(className)}\n color={color}\n testId={slugify(testId)}\n disabled={isSubmitting || isValidating}\n loading={loading}\n onClick={onClick}\n size={size}\n type=\"submit\"\n >\n {children}\n </Button>\n );\n};\n\nexport default SubmitButton;\n","import SubmitButton from './SubmitButton';\n\nexport type { SubmitButtonProps } from './SubmitButton';\n\nexport { SubmitButton };\n\nexport default SubmitButton;\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  slugify
3
- } from "./chunk-V46BHM2U.js";
3
+ } from "./chunk-IEF2GJ22.js";
4
4
 
5
5
  // src/partials/FieldValidationError/FieldValidationError.tsx
6
6
  import { jsx } from "react/jsx-runtime";
@@ -44,4 +44,4 @@ export {
44
44
  FieldValidationError_default,
45
45
  FieldValidationError_default2
46
46
  };
47
- //# sourceMappingURL=chunk-WKM2D7LF.js.map
47
+ //# sourceMappingURL=chunk-VX76MJAI.js.map
@@ -0,0 +1,248 @@
1
+ import {
2
+ Controller_default
3
+ } from "./chunk-4EJS5FXY.js";
4
+ import {
5
+ FieldCopyTestIdButton_default
6
+ } from "./chunk-2CRY7VDQ.js";
7
+ import {
8
+ FieldValidationError_default
9
+ } from "./chunk-VX76MJAI.js";
10
+ import {
11
+ useFormContext
12
+ } from "./chunk-MRXNKY72.js";
13
+ import {
14
+ slugify
15
+ } from "./chunk-IEF2GJ22.js";
16
+ import {
17
+ __spreadProps,
18
+ __spreadValues
19
+ } from "./chunk-CRTRMMJ7.js";
20
+
21
+ // src/Select/Select.tsx
22
+ import { useState } from "react";
23
+ import ReactSelect, { components } from "react-select";
24
+ import { useSelect } from "@nextui-org/select";
25
+ import { cn, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
26
+ import { jsx, jsxs } from "react/jsx-runtime";
27
+ var selectVariants = tv({
28
+ slots: {
29
+ base: "group leading-normal",
30
+ clearIndicator: "rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-foreground-800",
31
+ control: "rounded-lg border-2 border-default-200 !duration-150 transition-background hover:border-default-400 group-data-[invalid=true]:border-danger group-data-[invalid=true]:hover:border-danger motion-reduce:transition-none",
32
+ control_focused: "border-focus",
33
+ crossIcon: "",
34
+ downChevron: "",
35
+ dropdownIndicator: "rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-black",
36
+ group: "",
37
+ groupHeading: "mb-1 ml-3 mt-2 text-sm text-foreground-500",
38
+ indicatorsContainer: "gap-1 p-1",
39
+ indicatorSeparator: "bg-default-300",
40
+ input: "py-0.5 pl-1",
41
+ // See NextUI styles for group-data condition, e.g.: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/select.ts
42
+ label: 'pointer-events-auto relative bottom-1.5 ml-1 text-small 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-["*"]',
43
+ loadingIndicator: "",
44
+ loadingMessage: "",
45
+ menu: "mt-2 rounded-xl border border-default-200 bg-content1 p-1 shadow-lg",
46
+ menuList: "",
47
+ // ensure menu has same z-index as modal so it is visible when rendered in modal
48
+ // see: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/modal.ts (see z-50)
49
+ menuPortal: "!z-50",
50
+ multiValue: "items-center gap-1.5 rounded bg-default-100 py-0.5 pl-2 pr-1",
51
+ multiValueContainer: "",
52
+ multiValueLabel: "py-0.5 leading-6",
53
+ multiValueRemove: "rounded text-default-500 hover:cursor-pointer hover:border-default-300 hover:text-default-800",
54
+ noOptionsMessage: "rounded-sm p-2 text-foreground-500",
55
+ option_focused: "bg-default-100 active:bg-default-200",
56
+ option_selected: "bg-default-300",
57
+ option: "rounded px-3 py-2 hover:cursor-pointer",
58
+ placeholder: "ml-1 py-0.5 pl-1 text-sm text-foreground-500",
59
+ selectContainer: "",
60
+ singleValue: "!ml-1 !leading-7",
61
+ valueContainer: "gap-1 p-1"
62
+ }
63
+ });
64
+ var InputComponent = (props) => {
65
+ const testId = `${props.selectProps["data-testid"]}`;
66
+ return /* @__PURE__ */ jsx(components.Input, __spreadValues({ "data-testid": testId }, props));
67
+ };
68
+ var ControlComponent = (props) => {
69
+ const testId = `${props.selectProps["data-testid"]}_select`;
70
+ return /* @__PURE__ */ jsx("div", { "data-testid": testId, children: /* @__PURE__ */ jsx(components.Control, __spreadValues({}, props)) });
71
+ };
72
+ var OptionComponent = (props) => {
73
+ var _a, _b, _c;
74
+ const testId = `${props.selectProps["data-testid"]}_select_option_${slugify((_c = (_a = props == null ? void 0 : props.data) == null ? void 0 : _a.testId) != null ? _c : (_b = props == null ? void 0 : props.data) == null ? void 0 : _b.value)}`;
75
+ return /* @__PURE__ */ jsx("div", { "data-testid": testId, children: /* @__PURE__ */ jsx(components.Option, __spreadValues({}, props)) });
76
+ };
77
+ var DropdownIndicatorComponent = (props) => {
78
+ const testId = props == null ? void 0 : props.selectProps["data-testid"];
79
+ return /* @__PURE__ */ jsx("div", { "data-testid": `${testId}_select_dropdown`, children: /* @__PURE__ */ jsx(components.DropdownIndicator, __spreadValues({}, props)) });
80
+ };
81
+ var Select = ({
82
+ className = void 0,
83
+ clearable = true,
84
+ disabled = false,
85
+ filterOption = void 0,
86
+ renderOptionLabel = void 0,
87
+ inputValue = void 0,
88
+ label: _label = void 0,
89
+ loading = false,
90
+ multiSelect = false,
91
+ name,
92
+ onInputChange = void 0,
93
+ options,
94
+ placeholder = void 0,
95
+ testId: _testId = void 0
96
+ }) => {
97
+ const { control, debugMode, getFieldState } = useFormContext();
98
+ const { error, invalid, required, testId } = getFieldState(name, _testId);
99
+ const [isFocused, setIsFocused] = useState(false);
100
+ const variants = selectVariants();
101
+ const classNames = variantsToClassNames(variants, className, "base");
102
+ const {
103
+ getBaseProps,
104
+ getErrorMessageProps,
105
+ getHelperWrapperProps,
106
+ getLabelProps,
107
+ getTriggerProps,
108
+ getValueProps,
109
+ label
110
+ } = useSelect({
111
+ children: [],
112
+ classNames,
113
+ errorMessage: JSON.stringify(error),
114
+ isDisabled: disabled,
115
+ isInvalid: invalid,
116
+ isLoading: loading,
117
+ isRequired: required,
118
+ label: _label,
119
+ labelPlacement: "outside",
120
+ placeholder: " "
121
+ });
122
+ const showTestIdCopyButton = debugMode === "debug-testids";
123
+ const showLabel = label || showTestIdCopyButton;
124
+ return /* @__PURE__ */ jsx(
125
+ Controller_default,
126
+ {
127
+ control,
128
+ name,
129
+ render: ({
130
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
131
+ field: { onChange, value, ref, onBlur }
132
+ }) => {
133
+ var _a;
134
+ return /* @__PURE__ */ jsxs(
135
+ "div",
136
+ __spreadProps(__spreadValues({}, getBaseProps()), {
137
+ className: cn(classNames.base),
138
+ "data-testid": `${testId}_wrapper`,
139
+ "data-required": required,
140
+ children: [
141
+ showLabel && /* @__PURE__ */ jsxs(
142
+ "label",
143
+ {
144
+ className: classNames.label,
145
+ "data-slot": "label",
146
+ htmlFor: `react-select-${name}-input`,
147
+ id: getLabelProps().id,
148
+ children: [
149
+ label,
150
+ showTestIdCopyButton && /* @__PURE__ */ jsx(FieldCopyTestIdButton_default, { testId })
151
+ ]
152
+ }
153
+ ),
154
+ /* @__PURE__ */ jsx(
155
+ ReactSelect,
156
+ {
157
+ "aria-errormessage": "",
158
+ "aria-labelledby": (_a = getTriggerProps()["aria-labelledby"]) == null ? void 0 : _a.split(" ")[1],
159
+ "aria-invalid": invalid,
160
+ classNames: {
161
+ control: () => cn(classNames.control, {
162
+ [classNames.control_focused]: isFocused && !invalid
163
+ }),
164
+ clearIndicator: () => classNames.clearIndicator,
165
+ dropdownIndicator: () => classNames.dropdownIndicator,
166
+ groupHeading: () => classNames.groupHeading,
167
+ indicatorsContainer: () => classNames.indicatorsContainer,
168
+ indicatorSeparator: () => classNames.indicatorSeparator,
169
+ input: () => classNames.input,
170
+ menu: () => classNames.menu,
171
+ menuList: () => classNames.menuList,
172
+ menuPortal: () => classNames.menuPortal,
173
+ multiValue: () => classNames.multiValue,
174
+ multiValueLabel: () => cn(classNames.multiValueLabel, `${getValueProps().className}`),
175
+ multiValueRemove: () => classNames.multiValueRemove,
176
+ noOptionsMessage: () => classNames.noOptionsMessage,
177
+ option: ({
178
+ isFocused: optionIsFocused,
179
+ isSelected: optionIsSelected
180
+ }) => cn(classNames.option, {
181
+ [classNames.option_focused]: optionIsFocused,
182
+ [classNames.option_selected]: optionIsSelected
183
+ }),
184
+ placeholder: () => classNames.placeholder,
185
+ singleValue: () => cn(classNames.singleValue, `${getValueProps().className}`),
186
+ valueContainer: () => classNames.valueContainer
187
+ },
188
+ components: {
189
+ Input: InputComponent,
190
+ Option: OptionComponent,
191
+ DropdownIndicator: DropdownIndicatorComponent,
192
+ Control: ControlComponent
193
+ },
194
+ "data-testid": testId,
195
+ filterOption,
196
+ formatOptionLabel: renderOptionLabel,
197
+ inputValue,
198
+ instanceId: name,
199
+ isClearable: clearable,
200
+ isDisabled: disabled,
201
+ isLoading: loading,
202
+ isMulti: multiSelect,
203
+ name,
204
+ menuPosition: "fixed",
205
+ menuShouldBlockScroll: true,
206
+ options,
207
+ placeholder,
208
+ onBlur: (_e) => {
209
+ setIsFocused(false);
210
+ return onBlur();
211
+ },
212
+ onChange: (option) => {
213
+ if (multiSelect) {
214
+ onChange(
215
+ option == null ? void 0 : option.map((_option) => _option.value)
216
+ );
217
+ } else {
218
+ onChange(option == null ? void 0 : option.value);
219
+ }
220
+ },
221
+ onFocus: (_e) => {
222
+ setIsFocused(true);
223
+ },
224
+ onInputChange,
225
+ ref,
226
+ value: options.find((option) => option.value === value),
227
+ unstyled: true
228
+ }
229
+ ),
230
+ error && // eslint-disable-next-line react/jsx-props-no-spreading
231
+ /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getHelperWrapperProps()), { children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getErrorMessageProps()), { children: /* @__PURE__ */ jsx(FieldValidationError_default, { error }) })) }))
232
+ ]
233
+ })
234
+ );
235
+ }
236
+ }
237
+ );
238
+ };
239
+ var Select_default = Select;
240
+
241
+ // src/Select/index.ts
242
+ var Select_default2 = Select_default;
243
+
244
+ export {
245
+ Select_default,
246
+ Select_default2
247
+ };
248
+ //# sourceMappingURL=chunk-W66BVPTB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Select/Select.tsx","../src/Select/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { Props } from 'react-select';\n\nimport { useState } from 'react';\nimport ReactSelect, { components } from 'react-select';\n\nimport { useSelect } from '@nextui-org/select';\n\nimport { cn, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { Controller } from '../Controller';\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const selectVariants = tv({\n slots: {\n base: 'group leading-normal',\n clearIndicator:\n 'rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-foreground-800',\n control:\n 'rounded-lg border-2 border-default-200 !duration-150 transition-background hover:border-default-400 group-data-[invalid=true]:border-danger group-data-[invalid=true]:hover:border-danger motion-reduce:transition-none',\n control_focused: 'border-focus',\n crossIcon: '',\n downChevron: '',\n dropdownIndicator:\n 'rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-black',\n group: '',\n groupHeading: 'mb-1 ml-3 mt-2 text-sm text-foreground-500',\n indicatorsContainer: 'gap-1 p-1',\n indicatorSeparator: 'bg-default-300',\n input: 'py-0.5 pl-1',\n // See NextUI styles for group-data condition, e.g.: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/select.ts\n label:\n 'pointer-events-auto relative bottom-1.5 ml-1 text-small 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 loadingIndicator: '',\n loadingMessage: '',\n menu: 'mt-2 rounded-xl border border-default-200 bg-content1 p-1 shadow-lg',\n menuList: '',\n // ensure menu has same z-index as modal so it is visible when rendered in modal\n // see: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/modal.ts (see z-50)\n menuPortal: '!z-50',\n multiValue: 'items-center gap-1.5 rounded bg-default-100 py-0.5 pl-2 pr-1',\n multiValueContainer: '',\n multiValueLabel: 'py-0.5 leading-6',\n multiValueRemove:\n 'rounded text-default-500 hover:cursor-pointer hover:border-default-300 hover:text-default-800',\n noOptionsMessage: 'rounded-sm p-2 text-foreground-500',\n option_focused: 'bg-default-100 active:bg-default-200',\n option_selected: 'bg-default-300',\n option: 'rounded px-3 py-2 hover:cursor-pointer',\n placeholder: 'ml-1 py-0.5 pl-1 text-sm text-foreground-500',\n selectContainer: '',\n singleValue: '!ml-1 !leading-7',\n valueContainer: 'gap-1 p-1',\n },\n});\n\ntype SelectOption = {\n /** option label */\n label?: React.ReactNode;\n /** option value */\n value: string;\n};\n\ntype VariantProps = TVProps<typeof selectVariants>;\ntype ClassName = TVClassName<typeof selectVariants>;\n\nexport interface SelectProps extends VariantProps {\n /** CSS class name */\n className?: ClassName; // string;\n /** Determine if the */\n clearable?: boolean;\n /** Set the select to disabled state. */\n disabled?: boolean;\n /** Filter Select Options */\n filterOption?:\n | undefined\n | ((option?: SelectOption, inputValue?: string) => boolean);\n /** Format the label of the option */\n renderOptionLabel?: undefined | Props['formatOptionLabel'];\n /** The value of the search input */\n inputValue?: string;\n /** Label that should be associated with the select. */\n label?: React.ReactNode;\n /** Set the select to a loading state. */\n loading?: boolean;\n /** switch between single and multi select mode. */\n multiSelect?: boolean;\n /** The name for the Select component, used by react-hook-form */\n name: string;\n /** Placeholder that is displayed when nothing is selected */\n placeholder?: string;\n /** The options for the Select component */\n options: SelectOption[];\n /** Handle change events on the input */\n onInputChange?: Props['onInputChange'];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\nconst InputComponent: typeof components.Input = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}`;\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <components.Input data-testid={testId} {...props} />;\n};\n\nconst ControlComponent: typeof components.Control = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select`;\n return (\n <div data-testid={testId}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.Control {...props} />\n </div>\n );\n};\n\nconst OptionComponent: typeof components.Option = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select_option_${slugify(props?.data?.testId ?? props?.data?.value)}`;\n return (\n <div data-testid={testId}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.Option {...props} />\n </div>\n );\n};\n\nconst DropdownIndicatorComponent: typeof components.DropdownIndicator = (\n props,\n) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types\n const testId = props?.selectProps['data-testid'] as string;\n return (\n <div data-testid={`${testId}_select_dropdown`}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.DropdownIndicator {...props} />\n </div>\n );\n};\n\n/** Select component based on [NextUI Select](https://nextui.org/docs/components/select) and [React-Select](https://react-select.com/home) */\nconst Select = ({\n className = undefined,\n clearable = true,\n disabled = false,\n filterOption = undefined,\n renderOptionLabel = undefined,\n inputValue = undefined,\n label: _label = undefined,\n loading = false,\n multiSelect = false,\n name,\n onInputChange = undefined,\n options,\n placeholder = undefined,\n testId: _testId = undefined,\n}: SelectProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const [isFocused, setIsFocused] = useState(false);\n\n const variants = selectVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const {\n getBaseProps,\n getErrorMessageProps,\n getHelperWrapperProps,\n getLabelProps,\n getTriggerProps,\n getValueProps,\n label,\n } = useSelect({\n children: [],\n classNames,\n errorMessage: JSON.stringify(error),\n isDisabled: disabled,\n isInvalid: invalid,\n isLoading: loading,\n isRequired: required,\n label: _label,\n labelPlacement: 'outside',\n placeholder: ' ',\n });\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <Controller\n control={control}\n name={name}\n render={({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n field: { onChange, value, ref, onBlur },\n }) => (\n <div\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...getBaseProps()}\n className={cn(classNames.base)}\n data-testid={`${testId}_wrapper`}\n // See NextUI styles for group-data condition (data-invalid), e.g.: https://github.com/nextui-org/nextui/blob/main/packages/components/select/src/use-select.ts\n data-required={required}\n >\n {showLabel && (\n <label\n className={classNames.label}\n data-slot=\"label\"\n htmlFor={`react-select-${name}-input`}\n id={getLabelProps().id}\n >\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </label>\n )}\n <ReactSelect\n aria-errormessage=\"\"\n aria-labelledby={\n getTriggerProps()['aria-labelledby']?.split(' ')[1]\n }\n aria-invalid={invalid}\n classNames={{\n control: () =>\n cn(classNames.control, {\n [classNames.control_focused]: isFocused && !invalid,\n }),\n clearIndicator: () => classNames.clearIndicator,\n dropdownIndicator: () => classNames.dropdownIndicator,\n groupHeading: () => classNames.groupHeading,\n indicatorsContainer: () => classNames.indicatorsContainer,\n indicatorSeparator: () => classNames.indicatorSeparator,\n input: () => classNames.input,\n menu: () => classNames.menu,\n menuList: () => classNames.menuList,\n menuPortal: () => classNames.menuPortal,\n multiValue: () => classNames.multiValue,\n multiValueLabel: () =>\n cn(classNames.multiValueLabel, `${getValueProps().className}`),\n multiValueRemove: () => classNames.multiValueRemove,\n noOptionsMessage: () => classNames.noOptionsMessage,\n option: ({\n isFocused: optionIsFocused,\n isSelected: optionIsSelected,\n }) =>\n cn(classNames.option, {\n [classNames.option_focused]: optionIsFocused,\n [classNames.option_selected]: optionIsSelected,\n }),\n placeholder: () => classNames.placeholder,\n singleValue: () =>\n cn(classNames.singleValue, `${getValueProps().className}`),\n valueContainer: () => classNames.valueContainer,\n }}\n components={{\n Input: InputComponent,\n Option: OptionComponent,\n DropdownIndicator: DropdownIndicatorComponent,\n Control: ControlComponent,\n }}\n // Does not affect the testId of the select, but is needed to pass it to sub-components\n data-testid={testId}\n filterOption={filterOption}\n formatOptionLabel={renderOptionLabel}\n inputValue={inputValue}\n instanceId={name}\n isClearable={clearable}\n isDisabled={disabled}\n isLoading={loading}\n isMulti={multiSelect}\n name={name}\n // set menuPosition to fixed so that menu can be rendered\n // inside Card / Modal components, menuShouldBlockScroll\n // prevents container scroll when menu is open\n menuPosition=\"fixed\"\n menuShouldBlockScroll\n options={options}\n placeholder={placeholder}\n onBlur={(_e) => {\n setIsFocused(false);\n return onBlur();\n }}\n onChange={(option) => {\n if (multiSelect) {\n onChange(\n (option as SelectOption[])?.map((_option) => _option.value),\n );\n } else {\n onChange((option as SelectOption)?.value);\n }\n }}\n onFocus={(_e) => {\n setIsFocused(true);\n }}\n onInputChange={onInputChange}\n ref={ref}\n // set complete option as value by current field value\n value={options.find((option) => option.value === value)}\n unstyled\n />\n {error && (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <div {...getHelperWrapperProps()}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <div {...getErrorMessageProps()}>\n <FieldValidationError error={error} />\n </div>\n </div>\n )}\n </div>\n )}\n />\n );\n};\n\nexport default Select;\n","import Select from './Select';\n\nexport type { SelectProps } from './Select';\n\nexport { Select };\n\nexport default Select;\n"],"mappings":"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","names":["Select_default"]}
1
+ {"version":3,"sources":["../src/Select/Select.tsx","../src/Select/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { Props } from 'react-select';\n\nimport { useState } from 'react';\nimport ReactSelect, { components } from 'react-select';\n\nimport { useSelect } from '@nextui-org/select';\n\nimport { cn, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { Controller } from '../Controller';\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const selectVariants = tv({\n slots: {\n base: 'group leading-normal',\n clearIndicator:\n 'rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-foreground-800',\n control:\n 'rounded-lg border-2 border-default-200 !duration-150 transition-background hover:border-default-400 group-data-[invalid=true]:border-danger group-data-[invalid=true]:hover:border-danger motion-reduce:transition-none',\n control_focused: 'border-focus',\n crossIcon: '',\n downChevron: '',\n dropdownIndicator:\n 'rounded-md p-1 text-foreground-500 hover:cursor-pointer hover:bg-default-200 hover:text-black',\n group: '',\n groupHeading: 'mb-1 ml-3 mt-2 text-sm text-foreground-500',\n indicatorsContainer: 'gap-1 p-1',\n indicatorSeparator: 'bg-default-300',\n input: 'py-0.5 pl-1',\n // See NextUI styles for group-data condition, e.g.: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/select.ts\n label:\n 'pointer-events-auto relative bottom-1.5 ml-1 text-small 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 loadingIndicator: '',\n loadingMessage: '',\n menu: 'mt-2 rounded-xl border border-default-200 bg-content1 p-1 shadow-lg',\n menuList: '',\n // ensure menu has same z-index as modal so it is visible when rendered in modal\n // see: https://github.com/nextui-org/nextui/blob/main/packages/core/theme/src/components/modal.ts (see z-50)\n menuPortal: '!z-50',\n multiValue: 'items-center gap-1.5 rounded bg-default-100 py-0.5 pl-2 pr-1',\n multiValueContainer: '',\n multiValueLabel: 'py-0.5 leading-6',\n multiValueRemove:\n 'rounded text-default-500 hover:cursor-pointer hover:border-default-300 hover:text-default-800',\n noOptionsMessage: 'rounded-sm p-2 text-foreground-500',\n option_focused: 'bg-default-100 active:bg-default-200',\n option_selected: 'bg-default-300',\n option: 'rounded px-3 py-2 hover:cursor-pointer',\n placeholder: 'ml-1 py-0.5 pl-1 text-sm text-foreground-500',\n selectContainer: '',\n singleValue: '!ml-1 !leading-7',\n valueContainer: 'gap-1 p-1',\n },\n});\n\ntype SelectOption = {\n /** option label */\n label?: React.ReactNode;\n /** option value */\n value: string;\n};\n\ntype VariantProps = TVProps<typeof selectVariants>;\ntype ClassName = TVClassName<typeof selectVariants>;\n\nexport interface SelectProps extends VariantProps {\n /** CSS class name */\n className?: ClassName; // string;\n /** Determine if the */\n clearable?: boolean;\n /** Set the select to disabled state. */\n disabled?: boolean;\n /** Filter Select Options */\n filterOption?:\n | undefined\n | ((option?: SelectOption, inputValue?: string) => boolean);\n /** Format the label of the option */\n renderOptionLabel?: undefined | Props['formatOptionLabel'];\n /** The value of the search input */\n inputValue?: string;\n /** Label that should be associated with the select. */\n label?: React.ReactNode;\n /** Set the select to a loading state. */\n loading?: boolean;\n /** switch between single and multi select mode. */\n multiSelect?: boolean;\n /** The name for the Select component, used by react-hook-form */\n name: string;\n /** Placeholder that is displayed when nothing is selected */\n placeholder?: string;\n /** The options for the Select component */\n options: SelectOption[];\n /** Handle change events on the input */\n onInputChange?: Props['onInputChange'];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\nconst InputComponent: typeof components.Input = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}`;\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <components.Input data-testid={testId} {...props} />;\n};\n\nconst ControlComponent: typeof components.Control = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select`;\n return (\n <div data-testid={testId}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.Control {...props} />\n </div>\n );\n};\n\nconst OptionComponent: typeof components.Option = (props) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types, react/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select_option_${slugify(props?.data?.testId ?? props?.data?.value)}`;\n return (\n <div data-testid={testId}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.Option {...props} />\n </div>\n );\n};\n\nconst DropdownIndicatorComponent: typeof components.DropdownIndicator = (\n props,\n) => {\n // @ts-expect-error data-testid is not a default prop\n // eslint-disable-next-line react/prop-types\n const testId = props?.selectProps['data-testid'] as string;\n return (\n <div data-testid={`${testId}_select_dropdown`}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <components.DropdownIndicator {...props} />\n </div>\n );\n};\n\n/** Select component based on [NextUI Select](https://nextui.org/docs/components/select) and [React-Select](https://react-select.com/home) */\nconst Select = ({\n className = undefined,\n clearable = true,\n disabled = false,\n filterOption = undefined,\n renderOptionLabel = undefined,\n inputValue = undefined,\n label: _label = undefined,\n loading = false,\n multiSelect = false,\n name,\n onInputChange = undefined,\n options,\n placeholder = undefined,\n testId: _testId = undefined,\n}: SelectProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const [isFocused, setIsFocused] = useState(false);\n\n const variants = selectVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const {\n getBaseProps,\n getErrorMessageProps,\n getHelperWrapperProps,\n getLabelProps,\n getTriggerProps,\n getValueProps,\n label,\n } = useSelect({\n children: [],\n classNames,\n errorMessage: JSON.stringify(error),\n isDisabled: disabled,\n isInvalid: invalid,\n isLoading: loading,\n isRequired: required,\n label: _label,\n labelPlacement: 'outside',\n placeholder: ' ',\n });\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n return (\n <Controller\n control={control}\n name={name}\n render={({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n field: { onChange, value, ref, onBlur },\n }) => (\n <div\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...getBaseProps()}\n className={cn(classNames.base)}\n data-testid={`${testId}_wrapper`}\n // See NextUI styles for group-data condition (data-invalid), e.g.: https://github.com/nextui-org/nextui/blob/main/packages/components/select/src/use-select.ts\n data-required={required}\n >\n {showLabel && (\n <label\n className={classNames.label}\n data-slot=\"label\"\n htmlFor={`react-select-${name}-input`}\n id={getLabelProps().id}\n >\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </label>\n )}\n <ReactSelect\n aria-errormessage=\"\"\n aria-labelledby={\n getTriggerProps()['aria-labelledby']?.split(' ')[1]\n }\n aria-invalid={invalid}\n classNames={{\n control: () =>\n cn(classNames.control, {\n [classNames.control_focused]: isFocused && !invalid,\n }),\n clearIndicator: () => classNames.clearIndicator,\n dropdownIndicator: () => classNames.dropdownIndicator,\n groupHeading: () => classNames.groupHeading,\n indicatorsContainer: () => classNames.indicatorsContainer,\n indicatorSeparator: () => classNames.indicatorSeparator,\n input: () => classNames.input,\n menu: () => classNames.menu,\n menuList: () => classNames.menuList,\n menuPortal: () => classNames.menuPortal,\n multiValue: () => classNames.multiValue,\n multiValueLabel: () =>\n cn(classNames.multiValueLabel, `${getValueProps().className}`),\n multiValueRemove: () => classNames.multiValueRemove,\n noOptionsMessage: () => classNames.noOptionsMessage,\n option: ({\n isFocused: optionIsFocused,\n isSelected: optionIsSelected,\n }) =>\n cn(classNames.option, {\n [classNames.option_focused]: optionIsFocused,\n [classNames.option_selected]: optionIsSelected,\n }),\n placeholder: () => classNames.placeholder,\n singleValue: () =>\n cn(classNames.singleValue, `${getValueProps().className}`),\n valueContainer: () => classNames.valueContainer,\n }}\n components={{\n Input: InputComponent,\n Option: OptionComponent,\n DropdownIndicator: DropdownIndicatorComponent,\n Control: ControlComponent,\n }}\n // Does not affect the testId of the select, but is needed to pass it to sub-components\n data-testid={testId}\n filterOption={filterOption}\n formatOptionLabel={renderOptionLabel}\n inputValue={inputValue}\n instanceId={name}\n isClearable={clearable}\n isDisabled={disabled}\n isLoading={loading}\n isMulti={multiSelect}\n name={name}\n // set menuPosition to fixed so that menu can be rendered\n // inside Card / Modal components, menuShouldBlockScroll\n // prevents container scroll when menu is open\n menuPosition=\"fixed\"\n menuShouldBlockScroll\n options={options}\n placeholder={placeholder}\n onBlur={(_e) => {\n setIsFocused(false);\n return onBlur();\n }}\n onChange={(option) => {\n if (multiSelect) {\n onChange(\n (option as SelectOption[])?.map((_option) => _option.value),\n );\n } else {\n onChange((option as SelectOption)?.value);\n }\n }}\n onFocus={(_e) => {\n setIsFocused(true);\n }}\n onInputChange={onInputChange}\n ref={ref}\n // set complete option as value by current field value\n value={options.find((option) => option.value === value)}\n unstyled\n />\n {error && (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <div {...getHelperWrapperProps()}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <div {...getErrorMessageProps()}>\n <FieldValidationError error={error} />\n </div>\n </div>\n )}\n </div>\n )}\n />\n );\n};\n\nexport default Select;\n","import Select from './Select';\n\nexport type { SelectProps } from './Select';\n\nexport { Select };\n\nexport default Select;\n"],"mappings":"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","names":["Select_default"]}
@@ -1,18 +1,22 @@
1
1
  import {
2
- Controller
3
- } from "./chunk-KOKIM2ND.js";
2
+ Controller_default
3
+ } from "./chunk-4EJS5FXY.js";
4
4
  import {
5
5
  FieldCopyTestIdButton_default
6
6
  } from "./chunk-2CRY7VDQ.js";
7
7
  import {
8
8
  FieldValidationError_default
9
- } from "./chunk-WKM2D7LF.js";
9
+ } from "./chunk-VX76MJAI.js";
10
10
  import {
11
- useFormContext
12
- } from "./chunk-BZAPTLMC.js";
11
+ useFormContext,
12
+ useInput
13
+ } from "./chunk-MRXNKY72.js";
14
+ import {
15
+ __spreadProps,
16
+ __spreadValues
17
+ } from "./chunk-CRTRMMJ7.js";
13
18
 
14
19
  // src/Switch/Switch.tsx
15
- import { useInput } from "@nextui-org/input";
16
20
  import { Switch as NextSwitch } from "@nextui-org/switch";
17
21
  import { tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
18
22
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -51,7 +55,7 @@ var Switch = ({
51
55
  const classNames = variantsToClassNames(variants, className, "outerWrapper");
52
56
  const showTestIdCopyButton = debugMode === "debug-testids";
53
57
  return /* @__PURE__ */ jsx(
54
- Controller,
58
+ Controller_default,
55
59
  {
56
60
  name,
57
61
  control,
@@ -83,10 +87,9 @@ var Switch = ({
83
87
  ),
84
88
  error && /* @__PURE__ */ jsx("div", { className: classNames.errorMessage, children: /* @__PURE__ */ jsx(
85
89
  "div",
86
- {
87
- ...getErrorMessageProps(),
90
+ __spreadProps(__spreadValues({}, getErrorMessageProps()), {
88
91
  children: /* @__PURE__ */ jsx(FieldValidationError_default, { error })
89
- }
92
+ })
90
93
  ) })
91
94
  ] })
92
95
  }
@@ -101,4 +104,4 @@ export {
101
104
  Switch_default,
102
105
  Switch_default2
103
106
  };
104
- //# sourceMappingURL=chunk-BS52M4SZ.js.map
107
+ //# sourceMappingURL=chunk-WAXJ64P7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Switch/Switch.tsx","../src/Switch/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\n\nimport { Switch as NextSwitch } from '@nextui-org/switch';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { Controller } from '../Controller';\nimport { 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 NextUI styles for group-data condition, e.g.: https://github.com/nextui-org/nextui/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 /** component displayed next to the switch. */\n label?: React.ReactNode;\n /** name the field is registered under */\n name: string;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * Switch component based on [NextUI Switch](https://nextui.org/docs/components/switch)\n */\nconst Switch = ({\n className = undefined,\n disabled = false,\n label: _label = undefined,\n name,\n testId: _testId = undefined,\n}: SwitchProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, required, testId, invalid } = getFieldState(name, _testId);\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 <Controller\n name={name}\n control={control}\n disabled={disabled}\n render={({\n field: { disabled: isDisabled, value, ref, onBlur, onChange },\n }) => (\n <div className={classNames.outerWrapper}>\n <NextSwitch\n aria-describedby={getInputProps()['aria-describedby']}\n classNames={classNames}\n // See NextUI styles for group-data condition (data-invalid), e.g.: https://github.com/nextui-org/nextui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n isDisabled={isDisabled}\n isSelected={!!value}\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n ref={ref}\n required={required}\n value={value}\n >\n {label}\n {showTestIdCopyButton && <FieldCopyTestIdButton testId={testId} />}\n </NextSwitch>\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} />\n </div>\n </div>\n )}\n </div>\n )}\n />\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"],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,SAAS,UAAU,kBAAkB;AAErC,SAAS,IAAI,4BAA4B;AA2E/B,SAiB2B,KAjB3B;AApEH,IAAM,iBAAiB,GAAG;AAAA,EAC/B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,cAAc;AAAA;AAAA,IAEd,OACE;AAAA,IACF,cAAc;AAAA,IACd,cAAc;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF,CAAC;AAqBD,IAAM,SAAS,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO,SAAS;AAAA,EAChB;AAAA,EACA,QAAQ,UAAU;AACpB,MAAmB;AACjB,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,UAAU,QAAQ,QAAQ,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,EAAE,OAAO,eAAe,qBAAqB,IAAI,SAAS;AAAA,IAC9D,cAAc,KAAK,UAAU,KAAK;AAAA,IAClC,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAAW,eAAe;AAChC,QAAM,aAAa,qBAAqB,UAAU,WAAW,cAAc;AAE3E,QAAM,uBAAuB,cAAc;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,QACP,OAAO,EAAE,UAAU,YAAY,OAAO,KAAK,QAAQ,SAAS;AAAA,MAC9D,MACE,qBAAC,SAAI,WAAW,WAAW,cACzB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,oBAAkB,cAAc,EAAE,kBAAkB;AAAA,YACpD;AAAA,YAEA,gBAAc;AAAA,YACd,iBAAe;AAAA,YACf,eAAa;AAAA,YACb;AAAA,YACA,YAAY,CAAC,CAAC;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YAEC;AAAA;AAAA,cACA,wBAAwB,oBAAC,iCAAsB,QAAgB;AAAA;AAAA;AAAA,QAClE;AAAA,QACC,SACC,oBAAC,SAAI,WAAW,WAAW,cACzB;AAAA,UAAC;AAAA,2CAEK,qBAAqB,IAF1B;AAAA,YAIC,8BAAC,gCAAqB,OAAc;AAAA;AAAA,QACtC,GACF;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,iBAAQ;;;AC5Gf,IAAOA,kBAAQ;","names":["Switch_default"]}