@fuf-stack/uniform 1.4.2 → 1.5.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 (187) hide show
  1. package/dist/Checkboxes/index.cjs +16 -0
  2. package/dist/{RadioGroup → Checkboxes}/index.cjs.map +1 -1
  3. package/dist/Checkboxes/index.d.cts +10 -0
  4. package/dist/Checkboxes/index.d.ts +10 -0
  5. package/dist/Checkboxes/index.js +16 -0
  6. package/dist/{CheckboxGroup-B1g42iP0.d.cts → Checkboxes-CR0Uu2g9.d.cts} +9 -9
  7. package/dist/{CheckboxGroup-B1g42iP0.d.ts → Checkboxes-CR0Uu2g9.d.ts} +9 -9
  8. package/dist/FieldArray/index.cjs +5 -5
  9. package/dist/FieldArray/index.d.cts +2 -2
  10. package/dist/FieldArray/index.d.ts +2 -2
  11. package/dist/FieldArray/index.js +4 -4
  12. package/dist/FieldArray-EP4otr2x.d.cts +160 -0
  13. package/dist/FieldArray-EP4otr2x.d.ts +160 -0
  14. package/dist/{FieldValidationError-CU_xw0BL.d.ts → FieldValidationError-DwtLkGMo.d.cts} +2 -2
  15. package/dist/{FieldValidationError-CU_xw0BL.d.cts → FieldValidationError-DwtLkGMo.d.ts} +2 -2
  16. package/dist/Form/index.cjs +6 -4
  17. package/dist/Form/index.cjs.map +1 -1
  18. package/dist/Form/index.js +5 -3
  19. package/dist/Input/index.cjs +5 -5
  20. package/dist/Input/index.d.cts +2 -2
  21. package/dist/Input/index.d.ts +2 -2
  22. package/dist/Input/index.js +4 -4
  23. package/dist/{Input-C6ujfEkn.d.ts → Input-CCIEnvIp.d.ts} +1 -1
  24. package/dist/{Input-BQkZtJx8.d.cts → Input-D7HT_8jf.d.cts} +1 -1
  25. package/dist/RadioBoxes/index.cjs +5 -5
  26. package/dist/RadioBoxes/index.d.cts +3 -2
  27. package/dist/RadioBoxes/index.d.ts +3 -2
  28. package/dist/RadioBoxes/index.js +4 -4
  29. package/dist/{RadioBoxes-CE3mYoFk.d.cts → RadioBoxes-DpkI28l0.d.cts} +3 -2
  30. package/dist/{RadioBoxes-CE3mYoFk.d.ts → RadioBoxes-DpkI28l0.d.ts} +3 -2
  31. package/dist/RadioTabs/index.cjs +5 -5
  32. package/dist/RadioTabs/index.d.cts +2 -2
  33. package/dist/RadioTabs/index.d.ts +2 -2
  34. package/dist/RadioTabs/index.js +4 -4
  35. package/dist/{RadioTabs-BCWW3tru.d.cts → RadioTabs-DTDcAZoH.d.cts} +1 -1
  36. package/dist/{RadioTabs-BCWW3tru.d.ts → RadioTabs-DTDcAZoH.d.ts} +1 -1
  37. package/dist/Radios/index.cjs +16 -0
  38. package/dist/Radios/index.cjs.map +1 -0
  39. package/dist/Radios/index.d.cts +9 -0
  40. package/dist/Radios/index.d.ts +9 -0
  41. package/dist/Radios/index.js +16 -0
  42. package/dist/{RadioGroup-CAOX80Xx.d.cts → Radios-DprlJhoq.d.cts} +9 -9
  43. package/dist/{RadioGroup-CAOX80Xx.d.ts → Radios-DprlJhoq.d.ts} +9 -9
  44. package/dist/Select/index.cjs +5 -5
  45. package/dist/Select/index.d.cts +2 -2
  46. package/dist/Select/index.d.ts +2 -2
  47. package/dist/Select/index.js +4 -4
  48. package/dist/{Select-CTRWinmO.d.cts → Select-CDkZmZp2.d.cts} +1 -1
  49. package/dist/{Select-CTRWinmO.d.ts → Select-CDkZmZp2.d.ts} +1 -1
  50. package/dist/SubmitButton/index.cjs +6 -4
  51. package/dist/SubmitButton/index.cjs.map +1 -1
  52. package/dist/SubmitButton/index.js +5 -3
  53. package/dist/Switch/index.cjs +5 -5
  54. package/dist/Switch/index.js +4 -4
  55. package/dist/TextArea/index.cjs +5 -5
  56. package/dist/TextArea/index.d.cts +4 -2
  57. package/dist/TextArea/index.d.ts +4 -2
  58. package/dist/TextArea/index.js +4 -4
  59. package/dist/TextArea-DhxNWYNg.d.cts +86 -0
  60. package/dist/TextArea-DhxNWYNg.d.ts +86 -0
  61. package/dist/chunk-2DHTL4PW.cjs +117 -0
  62. package/dist/chunk-2DHTL4PW.cjs.map +1 -0
  63. package/dist/{chunk-FOVP54XP.cjs → chunk-3NH4MEMM.cjs} +18 -27
  64. package/dist/chunk-3NH4MEMM.cjs.map +1 -0
  65. package/dist/{chunk-M2DNMSQZ.js → chunk-3Q3IUEGL.js} +52 -49
  66. package/dist/chunk-3Q3IUEGL.js.map +1 -0
  67. package/dist/{chunk-C52NGPIF.js → chunk-4WRUHOGY.js} +48 -46
  68. package/dist/chunk-4WRUHOGY.js.map +1 -0
  69. package/dist/{chunk-KG4XCEPW.js → chunk-53XSXUNE.js} +42 -40
  70. package/dist/chunk-53XSXUNE.js.map +1 -0
  71. package/dist/{chunk-77C6VN4L.cjs → chunk-5LWD6VRV.cjs} +50 -47
  72. package/dist/chunk-5LWD6VRV.cjs.map +1 -0
  73. package/dist/{chunk-C64RKQEW.cjs → chunk-62AYJT2H.cjs} +3 -3
  74. package/dist/{chunk-C64RKQEW.cjs.map → chunk-62AYJT2H.cjs.map} +1 -1
  75. package/dist/chunk-76KOVUDN.js +138 -0
  76. package/dist/chunk-76KOVUDN.js.map +1 -0
  77. package/dist/{chunk-FHRMVL6B.js → chunk-AYWMAPAX.js} +134 -89
  78. package/dist/chunk-AYWMAPAX.js.map +1 -0
  79. package/dist/chunk-BWPTCHL7.cjs +103 -0
  80. package/dist/chunk-BWPTCHL7.cjs.map +1 -0
  81. package/dist/{chunk-2GYFDVXX.cjs → chunk-C5GIWGQR.cjs} +173 -33
  82. package/dist/chunk-C5GIWGQR.cjs.map +1 -0
  83. package/dist/{chunk-IYDCKENI.js → chunk-CJD3DW4J.js} +166 -26
  84. package/dist/chunk-CJD3DW4J.js.map +1 -0
  85. package/dist/{chunk-N2EEOWEP.cjs → chunk-CW4VK77Z.cjs} +59 -64
  86. package/dist/chunk-CW4VK77Z.cjs.map +1 -0
  87. package/dist/{chunk-LJQ35BUK.js → chunk-D2HI4KE4.js} +2 -2
  88. package/dist/chunk-DYTE5N3B.cjs +684 -0
  89. package/dist/chunk-DYTE5N3B.cjs.map +1 -0
  90. package/dist/chunk-ELYGQTXB.js +47 -0
  91. package/dist/chunk-ELYGQTXB.js.map +1 -0
  92. package/dist/chunk-GST3AQOR.js +684 -0
  93. package/dist/chunk-GST3AQOR.js.map +1 -0
  94. package/dist/{chunk-AYNTZPKL.cjs → chunk-HQNZYWJX.cjs} +132 -87
  95. package/dist/chunk-HQNZYWJX.cjs.map +1 -0
  96. package/dist/chunk-LLQLEDOO.js +103 -0
  97. package/dist/chunk-LLQLEDOO.js.map +1 -0
  98. package/dist/chunk-NHEZXA4H.cjs +47 -0
  99. package/dist/chunk-NHEZXA4H.cjs.map +1 -0
  100. package/dist/{chunk-M7VM7XBE.js → chunk-OCYJFIPV.js} +8 -8
  101. package/dist/chunk-OCYJFIPV.js.map +1 -0
  102. package/dist/{chunk-YEKHVKS3.cjs → chunk-S36CKKDV.cjs} +44 -42
  103. package/dist/chunk-S36CKKDV.cjs.map +1 -0
  104. package/dist/chunk-S7K35LVS.js +117 -0
  105. package/dist/chunk-S7K35LVS.js.map +1 -0
  106. package/dist/{chunk-Y3GELCDP.js → chunk-VLEYEBRE.js} +62 -67
  107. package/dist/chunk-VLEYEBRE.js.map +1 -0
  108. package/dist/{chunk-UGCZORU3.cjs → chunk-YIBISSMT.cjs} +9 -9
  109. package/dist/chunk-YIBISSMT.cjs.map +1 -0
  110. package/dist/chunk-Z353BLWI.cjs +138 -0
  111. package/dist/chunk-Z353BLWI.cjs.map +1 -0
  112. package/dist/{chunk-ULR4573W.cjs → chunk-ZLQCMOVU.cjs} +40 -38
  113. package/dist/chunk-ZLQCMOVU.cjs.map +1 -0
  114. package/dist/{chunk-2B6CDMOZ.js → chunk-ZN3ESUQR.js} +16 -25
  115. package/dist/chunk-ZN3ESUQR.js.map +1 -0
  116. package/dist/helpers/index.cjs +4 -2
  117. package/dist/helpers/index.cjs.map +1 -1
  118. package/dist/helpers/index.d.cts +54 -10
  119. package/dist/helpers/index.d.ts +54 -10
  120. package/dist/helpers/index.js +3 -1
  121. package/dist/hooks/index.cjs +7 -3
  122. package/dist/hooks/index.cjs.map +1 -1
  123. package/dist/hooks/index.d.cts +86 -4
  124. package/dist/hooks/index.d.ts +86 -4
  125. package/dist/hooks/index.js +8 -4
  126. package/dist/index.cjs +20 -16
  127. package/dist/index.cjs.map +1 -1
  128. package/dist/index.d.cts +11 -11
  129. package/dist/index.d.ts +11 -11
  130. package/dist/index.js +30 -26
  131. package/dist/partials/FieldValidationError/index.cjs +2 -2
  132. package/dist/partials/FieldValidationError/index.d.cts +2 -2
  133. package/dist/partials/FieldValidationError/index.d.ts +2 -2
  134. package/dist/partials/FieldValidationError/index.js +1 -1
  135. package/package.json +12 -11
  136. package/dist/CheckboxGroup/index.cjs +0 -16
  137. package/dist/CheckboxGroup/index.cjs.map +0 -1
  138. package/dist/CheckboxGroup/index.d.cts +0 -10
  139. package/dist/CheckboxGroup/index.d.ts +0 -10
  140. package/dist/CheckboxGroup/index.js +0 -16
  141. package/dist/FieldArray-DVQka7Bh.d.cts +0 -130
  142. package/dist/FieldArray-DVQka7Bh.d.ts +0 -130
  143. package/dist/RadioGroup/index.cjs +0 -16
  144. package/dist/RadioGroup/index.d.cts +0 -9
  145. package/dist/RadioGroup/index.d.ts +0 -9
  146. package/dist/RadioGroup/index.js +0 -16
  147. package/dist/TextArea-DnFGyl4a.d.cts +0 -27
  148. package/dist/TextArea-DnFGyl4a.d.ts +0 -27
  149. package/dist/chunk-2B6CDMOZ.js.map +0 -1
  150. package/dist/chunk-2GYFDVXX.cjs.map +0 -1
  151. package/dist/chunk-77C6VN4L.cjs.map +0 -1
  152. package/dist/chunk-AYNTZPKL.cjs.map +0 -1
  153. package/dist/chunk-C52NGPIF.js.map +0 -1
  154. package/dist/chunk-CQWA2DFV.js +0 -37
  155. package/dist/chunk-CQWA2DFV.js.map +0 -1
  156. package/dist/chunk-EEBHFSBY.cjs +0 -112
  157. package/dist/chunk-EEBHFSBY.cjs.map +0 -1
  158. package/dist/chunk-FHRMVL6B.js.map +0 -1
  159. package/dist/chunk-FOVP54XP.cjs.map +0 -1
  160. package/dist/chunk-IYDCKENI.js.map +0 -1
  161. package/dist/chunk-JZF4HUYO.cjs +0 -409
  162. package/dist/chunk-JZF4HUYO.cjs.map +0 -1
  163. package/dist/chunk-KG4XCEPW.js.map +0 -1
  164. package/dist/chunk-KQN55PEW.js +0 -76
  165. package/dist/chunk-KQN55PEW.js.map +0 -1
  166. package/dist/chunk-M2DNMSQZ.js.map +0 -1
  167. package/dist/chunk-M7VM7XBE.js.map +0 -1
  168. package/dist/chunk-N2EEOWEP.cjs.map +0 -1
  169. package/dist/chunk-NAZIH6HV.js +0 -409
  170. package/dist/chunk-NAZIH6HV.js.map +0 -1
  171. package/dist/chunk-RDBCJJI7.cjs +0 -88
  172. package/dist/chunk-RDBCJJI7.cjs.map +0 -1
  173. package/dist/chunk-RF7KNUCI.js +0 -88
  174. package/dist/chunk-RF7KNUCI.js.map +0 -1
  175. package/dist/chunk-UGCZORU3.cjs.map +0 -1
  176. package/dist/chunk-ULR4573W.cjs.map +0 -1
  177. package/dist/chunk-XKMLCM5K.js +0 -112
  178. package/dist/chunk-XKMLCM5K.js.map +0 -1
  179. package/dist/chunk-Y3AB4GV6.cjs +0 -37
  180. package/dist/chunk-Y3AB4GV6.cjs.map +0 -1
  181. package/dist/chunk-Y3GELCDP.js.map +0 -1
  182. package/dist/chunk-YEKHVKS3.cjs.map +0 -1
  183. package/dist/chunk-YGNY6CKU.cjs +0 -76
  184. package/dist/chunk-YGNY6CKU.cjs.map +0 -1
  185. /package/dist/{CheckboxGroup → Checkboxes}/index.js.map +0 -0
  186. /package/dist/{RadioGroup → Radios}/index.js.map +0 -0
  187. /package/dist/{chunk-LJQ35BUK.js.map → chunk-D2HI4KE4.js.map} +0 -0
@@ -0,0 +1,138 @@
1
+ // src/helpers/nullishFields/nullishFields.ts
2
+ var flatArrayKey = "__FLAT__";
3
+ var nullString = "__NULL__";
4
+ var falseString = "__FALSE__";
5
+ var zeroString = "__ZERO__";
6
+ var fromNullishString = (value) => {
7
+ if (Array.isArray(value)) {
8
+ return value.map((entry) => {
9
+ if (entry && typeof entry === "object") {
10
+ const record = entry;
11
+ if (flatArrayKey in record) {
12
+ const inner = record[flatArrayKey];
13
+ if (inner === "") {
14
+ return null;
15
+ }
16
+ return fromNullishString(inner);
17
+ }
18
+ }
19
+ return fromNullishString(entry);
20
+ });
21
+ }
22
+ if (typeof value !== "string") {
23
+ return value;
24
+ }
25
+ switch (value) {
26
+ case nullString:
27
+ return null;
28
+ case falseString:
29
+ return false;
30
+ case zeroString:
31
+ return 0;
32
+ default:
33
+ return value;
34
+ }
35
+ };
36
+ var toNullishString = (value) => {
37
+ if (Array.isArray(value)) {
38
+ const isPrimitive = (v) => {
39
+ return v === null || ["string", "number", "boolean"].includes(typeof v);
40
+ };
41
+ const isPrimitiveArray = value.every(isPrimitive);
42
+ if (isPrimitiveArray) {
43
+ return value.map((v) => {
44
+ return { [flatArrayKey]: v };
45
+ });
46
+ }
47
+ return value;
48
+ }
49
+ if (value === null || value === "") {
50
+ return nullString;
51
+ }
52
+ if (value === false) {
53
+ return falseString;
54
+ }
55
+ if (value === 0) {
56
+ return zeroString;
57
+ }
58
+ return value;
59
+ };
60
+ var toFormFormat = (fields) => {
61
+ const formFormatJson = JSON.stringify(fields, (_, value) => {
62
+ if (Array.isArray(value)) {
63
+ return toNullishString(value);
64
+ }
65
+ if (value && typeof value === "object") {
66
+ const record = value;
67
+ if (flatArrayKey in record) {
68
+ return value;
69
+ }
70
+ return Object.fromEntries(
71
+ Object.entries(value).filter(([_key, v]) => {
72
+ return v !== "" && v !== null;
73
+ })
74
+ );
75
+ }
76
+ return value;
77
+ });
78
+ return JSON.parse(formFormatJson);
79
+ };
80
+ var toValidationFormat = (formState) => {
81
+ if (formState === void 0 || formState === null) {
82
+ return formState;
83
+ }
84
+ const validationFormatJson = JSON.stringify(formState, (_, value) => {
85
+ if (Array.isArray(value)) {
86
+ return value.map((v) => {
87
+ if (v && typeof v === "object") {
88
+ const record = v;
89
+ if (flatArrayKey in record) {
90
+ const inner = record[flatArrayKey];
91
+ if (inner === "") {
92
+ return null;
93
+ }
94
+ return fromNullishString(inner);
95
+ }
96
+ }
97
+ return fromNullishString(v);
98
+ });
99
+ }
100
+ if (value && typeof value === "object") {
101
+ return Object.fromEntries(
102
+ Object.entries(value).filter(([_key, v]) => {
103
+ if (v && typeof v === "object") {
104
+ const record = v;
105
+ if (flatArrayKey in record) {
106
+ const convertedInner = fromNullishString(record[flatArrayKey]);
107
+ return convertedInner !== "" && convertedInner !== null;
108
+ }
109
+ }
110
+ if (Array.isArray(v) && v.length === 0) {
111
+ return false;
112
+ }
113
+ const converted = fromNullishString(v);
114
+ return converted !== "" && converted !== null;
115
+ }).map(([k, v]) => {
116
+ if (v && typeof v === "object") {
117
+ const record = v;
118
+ if (flatArrayKey in record) {
119
+ return [k, fromNullishString(record[flatArrayKey])];
120
+ }
121
+ }
122
+ return [k, fromNullishString(v)];
123
+ })
124
+ );
125
+ }
126
+ return value;
127
+ });
128
+ return JSON.parse(validationFormatJson);
129
+ };
130
+
131
+ export {
132
+ flatArrayKey,
133
+ fromNullishString,
134
+ toNullishString,
135
+ toFormFormat,
136
+ toValidationFormat
137
+ };
138
+ //# sourceMappingURL=chunk-76KOVUDN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/nullishFields/nullishFields.ts"],"sourcesContent":["/** Key used to wrap flat array elements when converting to form format */\nexport const flatArrayKey = '__FLAT__';\n\n/**\n * String markers used to preserve null, false, and 0 values during JSON processing\n */\nconst nullString = '__NULL__';\nconst falseString = '__FALSE__';\nconst zeroString = '__ZERO__';\n\n/**\n * Converts marker strings back to their original values when processing arrays\n */\nexport const fromNullishString = (value: unknown): unknown => {\n // Support arrays: unwrap flat wrappers and convert marker strings per entry\n if (Array.isArray(value)) {\n return (value as unknown[]).map((entry) => {\n if (entry && typeof entry === 'object') {\n const record = entry as Record<string, unknown>;\n if (flatArrayKey in record) {\n const inner = record[flatArrayKey];\n // For arrays, treat empty string as null (placeholder input)\n if (inner === '') {\n return null;\n }\n return fromNullishString(inner);\n }\n }\n return fromNullishString(entry);\n });\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n\n switch (value) {\n case nullString:\n return null;\n case falseString:\n return false;\n case zeroString:\n return 0;\n default:\n return value;\n }\n};\n\n/**\n * Converts null/falsy values to marker strings for JSON processing\n */\nexport const toNullishString = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n // Only wrap arrays of primitives; leave arrays of objects as-is\n const isPrimitive = (v: unknown) => {\n return v === null || ['string', 'number', 'boolean'].includes(typeof v);\n };\n const isPrimitiveArray = (value as unknown[]).every(isPrimitive);\n if (isPrimitiveArray) {\n return (value as unknown[]).map((v) => {\n // Store raw primitive; do not convert to marker strings inside the wrapper\n return { [flatArrayKey]: v } as Record<string, unknown>;\n });\n }\n return value;\n }\n if (value === null || value === '') {\n return nullString;\n }\n if (value === false) {\n return falseString;\n }\n if (value === 0) {\n return zeroString;\n }\n return value;\n};\n\n/**\n * Converts field values to a format suitable for forms by:\n * - Wrapping arrays of primitives as objects using the flatArrayKey `__FLAT__`\n * to satisfy RHF's requirement that array fields contain objects\n * - Removing empty strings and null values from objects\n *\n * This conversion is required because React Hook Form does not support arrays with\n * flat values (string, number, boolean, null). Array fields must contain objects.\n * We work around this by wrapping primitive entries: `{ __FLAT__: <value> }`.\n *\n * @example\n * const fields = {\n * name: 'John',\n * scores: [0, null, 75, false],\n * scoresDetailed: [\n * { score: 1 },\n * { score: null },\n * { score: 0 },\n * { score: false },\n * { score: '' },\n * ],\n * contact: {\n * email: '',\n * phone: null,\n * address: '123 Main St'\n * }\n * };\n *\n * // Result:\n * {\n * name: 'John',\n * scores: [\n * { __FLAT__: 0 },\n * { __FLAT__: null },\n * { __FLAT__: 75 },\n * { __FLAT__: false }\n * ],\n * // Arrays of objects are left as objects; empty/null properties are removed\n * scoresDetailed: [\n * { score: 1 },\n * {}, // null score removed\n * { score: 0 },\n * { score: false },\n * {}, // empty string removed\n * ],\n * contact: {\n * address: '123 Main St'\n * }\n * }\n */\nexport const toFormFormat = (fields: Record<string, unknown>) => {\n const formFormatJson = JSON.stringify(fields, (_, value) => {\n if (Array.isArray(value)) {\n // Delegate to toNullishString to ensure consistent handling\n return toNullishString(value);\n }\n\n if (value && typeof value === 'object') {\n // Preserve flat-array wrappers as-is (do not filter their inner values here)\n const record = value as Record<string, unknown>;\n if (flatArrayKey in record) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).filter(([_key, v]) => {\n return v !== '' && v !== null;\n }),\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n });\n\n return JSON.parse(formFormatJson) as Record<string, unknown>;\n};\n\n/**\n * Converts form state to a format suitable for validation by:\n * - Unwrapping flat array wrappers `{ __FLAT__: <value> }` back to primitives\n * - Converting legacy string markers (__NULL__, __FALSE__, __ZERO__) back to their original values\n * - Removing fields whose converted value is empty string or null\n * - Removing empty arrays\n *\n * @example\n * const formState = {\n * name: 'John',\n * scores: [\n * { __FLAT__: 75 },\n * { __FLAT__: 0 },\n * { __FLAT__: null },\n * { __FLAT__: false }\n * ],\n * emptyArray: [],\n * scoresDetailed: [\n * { score: 1 },\n * {},\n * { score: 0 },\n * { score: false },\n * {},\n * ],\n * contact: {\n * address: '123 Main St',\n * fax: null\n * }\n * };\n *\n * // Result:\n * {\n * name: 'John',\n * scores: [75, 0, null, false],\n * // emptyArray is removed\n * // Objects inside arrays remain objects; empty entries remain empty objects\n * scoresDetailed: [\n * { score: 1 },\n * {},\n * { score: 0 },\n * { score: false },\n * {},\n * ],\n * contact: {\n * address: '123 Main St'\n * }\n * }\n */\nexport const toValidationFormat = (\n formState: Record<string, unknown> | null | undefined,\n): Record<string, unknown> | null | undefined => {\n // Handle null or undefined input\n if (formState === undefined || formState === null) {\n return formState;\n }\n\n const validationFormatJson = JSON.stringify(formState, (_, value) => {\n if (Array.isArray(value)) {\n return value.map((v) => {\n // Unwrap new wrapper format { __FLAT__: <value> }\n if (v && typeof v === 'object') {\n const record = v as Record<string, unknown>;\n if (flatArrayKey in record) {\n const inner = record[flatArrayKey];\n // Treat empty string from forms as null in validation format\n if (inner === '') {\n return null;\n }\n return fromNullishString(inner);\n }\n }\n // Backward compatibility for string markers\n return fromNullishString(v);\n });\n }\n\n if (value && typeof value === 'object') {\n // Object branch: remove keys that resolve to empty/null after marker conversion\n // and unwrap flat-array wrappers if present.\n //\n // Why this shape?\n // - Forms may contain objects with placeholder/empty values that should not\n // be part of the validation payload (e.g. \"\" or __NULL__ markers).\n // - Arrays of primitives are stored as wrapper objects { __FLAT__: <value> }\n // to satisfy RHF structure constraints. When converting back for\n // validation, we need to treat wrappers whose inner value resolves to\n // empty/null as removable, and unwrap non-empty wrappers to the primitive.\n return Object.fromEntries(\n Object.entries(value)\n .filter(([_key, v]) => {\n // If this is a flat-array wrapper, convert the inner value first and\n // drop the key when the inner resolves to empty string or null.\n if (v && typeof v === 'object') {\n const record = v as Record<string, unknown>;\n if (flatArrayKey in record) {\n const convertedInner = fromNullishString(record[flatArrayKey]);\n return convertedInner !== '' && convertedInner !== null;\n }\n }\n // Drop empty arrays\n if (Array.isArray(v) && v.length === 0) {\n return false;\n }\n // For regular values, convert markers and drop when empty/null.\n const converted = fromNullishString(v);\n return converted !== '' && converted !== null;\n })\n .map(([k, v]) => {\n // Unwrap flat-array wrappers to raw primitives after conversion.\n if (v && typeof v === 'object') {\n const record = v as Record<string, unknown>;\n if (flatArrayKey in record) {\n return [k, fromNullishString(record[flatArrayKey])];\n }\n }\n // For other values, just convert markers.\n return [k, fromNullishString(v)];\n }),\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n });\n\n return JSON.parse(validationFormatJson) as Record<string, unknown>;\n};\n"],"mappings":"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","names":[]}
@@ -1,14 +1,8 @@
1
1
  import {
2
- FieldCopyTestIdButton_default
3
- } from "./chunk-NTDKZW4E.js";
4
- import {
5
- FieldValidationError_default
6
- } from "./chunk-CQWA2DFV.js";
7
- import {
8
- useController,
9
- useFormContext
10
- } from "./chunk-IYDCKENI.js";
2
+ useUniformField
3
+ } from "./chunk-CJD3DW4J.js";
11
4
  import {
5
+ __objRest,
12
6
  __spreadProps,
13
7
  __spreadValues
14
8
  } from "./chunk-K2V4ULA2.js";
@@ -74,86 +68,85 @@ var DropdownIndicatorComponent = (props) => {
74
68
  const testId = props == null ? void 0 : props.selectProps["data-testid"];
75
69
  return /* @__PURE__ */ jsx("div", { "data-testid": `${testId}_select_dropdown`, children: /* @__PURE__ */ jsx(components.DropdownIndicator, __spreadValues({}, props)) });
76
70
  };
77
- var Select = ({
78
- className = void 0,
79
- clearable = true,
80
- disabled = false,
81
- filterOption = void 0,
82
- renderOptionLabel = void 0,
83
- inputValue = void 0,
84
- label: _label = void 0,
85
- loading = false,
86
- multiSelect = false,
87
- name,
88
- onInputChange = void 0,
89
- options,
90
- placeholder = void 0,
91
- testId: _testId = void 0
92
- }) => {
93
- var _a;
94
- const { control, debugMode, getFieldState } = useFormContext();
95
- const { error, invalid, required, testId } = getFieldState(name, _testId);
96
- const { field } = useController({ control, disabled, name });
97
- const { onChange, value, ref, onBlur } = field;
98
- const [isFocused, setIsFocused] = useState(false);
99
- const variants = selectVariants();
100
- const classNames = variantsToClassNames(variants, className, "base");
71
+ var Select = (_a) => {
72
+ var _b = _a, {
73
+ className = void 0,
74
+ clearable = true,
75
+ filterOption = void 0,
76
+ renderOptionLabel = void 0,
77
+ inputValue = void 0,
78
+ loading = false,
79
+ multiSelect = false,
80
+ name,
81
+ onInputChange = void 0,
82
+ options,
83
+ placeholder = void 0
84
+ } = _b, uniformFieldProps = __objRest(_b, [
85
+ "className",
86
+ "clearable",
87
+ "filterOption",
88
+ "renderOptionLabel",
89
+ "inputValue",
90
+ "loading",
91
+ "multiSelect",
92
+ "name",
93
+ "onInputChange",
94
+ "options",
95
+ "placeholder"
96
+ ]);
97
+ var _a2;
101
98
  const {
102
- getBaseProps,
99
+ disabled,
100
+ errorMessage,
101
+ field: { onBlur, onChange, ref, value },
103
102
  getErrorMessageProps,
104
103
  getHelperWrapperProps,
105
104
  getLabelProps,
106
- getTriggerProps,
107
- getValueProps,
108
- label
109
- } = useSelect({
105
+ invalid,
106
+ label,
107
+ required,
108
+ testId
109
+ } = useUniformField(__spreadValues({ name }, uniformFieldProps));
110
+ const [isFocused, setIsFocused] = useState(false);
111
+ const variants = selectVariants();
112
+ const classNames = variantsToClassNames(variants, className, "base");
113
+ const { getBaseProps, getTriggerProps, getValueProps } = useSelect({
110
114
  children: [],
111
115
  classNames,
112
- errorMessage: JSON.stringify(error),
116
+ errorMessage,
113
117
  isDisabled: disabled,
114
118
  isInvalid: invalid,
115
119
  isLoading: loading,
116
120
  isRequired: required,
117
- label: _label,
118
- labelPlacement: "outside",
119
- placeholder: " "
121
+ label,
122
+ labelPlacement: "outside"
120
123
  });
121
- const showTestIdCopyButton = debugMode === "debug-testids";
122
- const showLabel = label || showTestIdCopyButton;
123
124
  return /* @__PURE__ */ jsxs(
124
125
  "div",
125
126
  __spreadProps(__spreadValues({}, getBaseProps()), {
126
127
  className: cn(classNames.base),
127
- "data-testid": `${testId}_wrapper`,
128
128
  "data-required": required,
129
+ "data-testid": `${testId}_wrapper`,
129
130
  children: [
130
- showLabel ? /* @__PURE__ */ jsxs(
131
+ label ? /* @__PURE__ */ jsx(
131
132
  "label",
132
133
  {
133
134
  className: classNames.label,
134
135
  "data-slot": "label",
135
136
  htmlFor: `react-select-${name}-input`,
136
137
  id: getLabelProps().id,
137
- children: [
138
- label,
139
- showTestIdCopyButton ? /* @__PURE__ */ jsx(FieldCopyTestIdButton_default, { testId }) : null
140
- ]
138
+ children: label
141
139
  }
142
140
  ) : null,
143
141
  /* @__PURE__ */ jsx(
144
142
  ReactSelect,
145
143
  {
144
+ ref,
146
145
  menuShouldBlockScroll: true,
147
146
  unstyled: true,
148
147
  "aria-errormessage": "",
149
148
  "aria-invalid": invalid,
150
- components: {
151
- Input: InputComponent,
152
- Option: OptionComponent,
153
- DropdownIndicator: DropdownIndicatorComponent,
154
- Control: ControlComponent
155
- },
156
- "aria-labelledby": (_a = getTriggerProps()["aria-labelledby"]) == null ? void 0 : _a.split(" ")[1],
149
+ "aria-labelledby": (_a2 = getTriggerProps()["aria-labelledby"]) == null ? void 0 : _a2.split(" ")[1],
157
150
  "data-testid": testId,
158
151
  filterOption,
159
152
  formatOptionLabel: renderOptionLabel,
@@ -162,50 +155,101 @@ var Select = ({
162
155
  isClearable: clearable,
163
156
  isDisabled: disabled,
164
157
  isLoading: loading,
165
- name,
166
158
  isMulti: multiSelect,
167
159
  menuPosition: "fixed",
160
+ name,
168
161
  onInputChange,
169
162
  options,
170
163
  placeholder,
171
164
  classNames: {
172
- control: () => cn(classNames.control, {
173
- [classNames.control_focused]: isFocused && !invalid
174
- }),
175
- clearIndicator: () => classNames.clearIndicator,
176
- dropdownIndicator: () => classNames.dropdownIndicator,
177
- groupHeading: () => classNames.groupHeading,
178
- indicatorsContainer: () => classNames.indicatorsContainer,
179
- indicatorSeparator: () => classNames.indicatorSeparator,
180
- loadingIndicator: () => classNames.loadingIndicator,
181
- loadingMessage: () => classNames.loadingMessage,
182
- input: () => classNames.input,
183
- menu: () => classNames.menu,
184
- menuList: () => classNames.menuList,
185
- menuPortal: () => classNames.menuPortal,
186
- multiValue: () => classNames.multiValue,
187
- multiValueLabel: () => cn(classNames.multiValueLabel, `${getValueProps().className}`),
188
- multiValueRemove: () => classNames.multiValueRemove,
189
- noOptionsMessage: () => classNames.noOptionsMessage,
165
+ control: () => {
166
+ return cn(classNames.control, {
167
+ [classNames.control_focused]: isFocused && !invalid
168
+ });
169
+ },
170
+ clearIndicator: () => {
171
+ return classNames.clearIndicator;
172
+ },
173
+ dropdownIndicator: () => {
174
+ return classNames.dropdownIndicator;
175
+ },
176
+ groupHeading: () => {
177
+ return classNames.groupHeading;
178
+ },
179
+ indicatorsContainer: () => {
180
+ return classNames.indicatorsContainer;
181
+ },
182
+ indicatorSeparator: () => {
183
+ return classNames.indicatorSeparator;
184
+ },
185
+ loadingIndicator: () => {
186
+ return classNames.loadingIndicator;
187
+ },
188
+ loadingMessage: () => {
189
+ return classNames.loadingMessage;
190
+ },
191
+ input: () => {
192
+ return classNames.input;
193
+ },
194
+ menu: () => {
195
+ return classNames.menu;
196
+ },
197
+ menuList: () => {
198
+ return classNames.menuList;
199
+ },
200
+ menuPortal: () => {
201
+ return classNames.menuPortal;
202
+ },
203
+ multiValue: () => {
204
+ return classNames.multiValue;
205
+ },
206
+ multiValueLabel: () => {
207
+ return cn(
208
+ classNames.multiValueLabel,
209
+ `${getValueProps().className}`
210
+ );
211
+ },
212
+ multiValueRemove: () => {
213
+ return classNames.multiValueRemove;
214
+ },
215
+ noOptionsMessage: () => {
216
+ return classNames.noOptionsMessage;
217
+ },
190
218
  option: ({
191
219
  isFocused: optionIsFocused,
192
220
  isSelected: optionIsSelected
193
- }) => cn(classNames.option, {
194
- [classNames.option_focused]: optionIsFocused,
195
- [classNames.option_selected]: optionIsSelected
196
- }),
197
- placeholder: () => classNames.placeholder,
198
- singleValue: () => cn(classNames.singleValue, `${getValueProps().className}`),
199
- valueContainer: () => classNames.valueContainer
221
+ }) => {
222
+ return cn(classNames.option, {
223
+ [classNames.option_focused]: optionIsFocused,
224
+ [classNames.option_selected]: optionIsSelected
225
+ });
226
+ },
227
+ placeholder: () => {
228
+ return classNames.placeholder;
229
+ },
230
+ singleValue: () => {
231
+ return cn(classNames.singleValue, `${getValueProps().className}`);
232
+ },
233
+ valueContainer: () => {
234
+ return classNames.valueContainer;
235
+ }
236
+ },
237
+ components: {
238
+ Input: InputComponent,
239
+ Option: OptionComponent,
240
+ DropdownIndicator: DropdownIndicatorComponent,
241
+ Control: ControlComponent
200
242
  },
201
243
  onBlur: (_e) => {
202
244
  setIsFocused(false);
203
- return onBlur();
245
+ onBlur();
204
246
  },
205
247
  onChange: (option) => {
206
248
  if (multiSelect) {
207
249
  onChange(
208
- option == null ? void 0 : option.map((_option) => _option.value)
250
+ option == null ? void 0 : option.map((_option) => {
251
+ return _option.value;
252
+ })
209
253
  );
210
254
  } else {
211
255
  onChange(option == null ? void 0 : option.value);
@@ -214,11 +258,12 @@ var Select = ({
214
258
  onFocus: (_e) => {
215
259
  setIsFocused(true);
216
260
  },
217
- ref,
218
- value: options.find((option) => option.value === value)
261
+ value: options.find((option) => {
262
+ return option.value === value;
263
+ })
219
264
  }
220
265
  ),
221
- error ? /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getHelperWrapperProps()), { children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getErrorMessageProps()), { children: /* @__PURE__ */ jsx(FieldValidationError_default, { error, testId }) })) })) : null
266
+ invalid ? /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getHelperWrapperProps()), { children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getErrorMessageProps()), { children: errorMessage })) })) : null
222
267
  ]
223
268
  })
224
269
  );
@@ -232,4 +277,4 @@ export {
232
277
  Select_default,
233
278
  Select_default2
234
279
  };
235
- //# sourceMappingURL=chunk-FHRMVL6B.js.map
280
+ //# sourceMappingURL=chunk-AYWMAPAX.js.map
@@ -0,0 +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 '@heroui/select';\n\nimport { cn, slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { useUniformField } from '../hooks';\n\nexport const selectVariants = tv({\n slots: {\n base: 'group leading-normal',\n clearIndicator:\n 'text-foreground-500 hover:bg-default-200 hover:text-foreground-800 rounded-md p-1 hover:cursor-pointer',\n control:\n 'border-default-200 bg-content1 transition-background hover:border-default-400 group-data-[invalid=true]:border-danger group-data-[invalid=true]:hover:border-danger rounded-lg border-2 duration-150! motion-reduce:transition-none',\n control_focused: 'border-focus',\n crossIcon: '',\n downChevron: '',\n dropdownIndicator:\n 'text-foreground-500 hover:bg-default-200 rounded-md p-1 hover:cursor-pointer hover:text-black',\n group: '',\n groupHeading: 'text-foreground-500 mt-2 mb-1 ml-3 text-sm',\n indicatorsContainer: 'gap-1 p-1',\n indicatorSeparator: 'bg-default-300',\n input: 'py-0.5 pl-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-small group-data-[invalid=true]:!text-danger group-data-[required=true]:after:text-danger pointer-events-auto relative bottom-1.5 ml-1 subpixel-antialiased group-data-[required=true]:after:ml-0.5 group-data-[required=true]:after:content-[\"*\"]',\n loadingIndicator: '',\n loadingMessage: 'text-foreground-500 rounded-sm p-2',\n menu: 'border-default-200 bg-content1 mt-2 rounded-xl border 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/heroui-inc/heroui/blob/main/packages/core/theme/src/components/modal.ts (see z-50)\n menuPortal: 'z-50!',\n multiValue: 'bg-default-100 items-center gap-1.5 rounded py-0.5 pr-1 pl-2',\n multiValueContainer: '',\n multiValueLabel: 'py-0.5 leading-6',\n multiValueRemove:\n 'text-default-500 hover:border-default-300 hover:text-default-800 rounded hover:cursor-pointer',\n noOptionsMessage: 'text-foreground-500 rounded-sm p-2',\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: 'text-foreground-500 ml-1 py-0.5 pl-1 text-sm',\n selectContainer: '',\n singleValue: 'ml-1! leading-7!',\n valueContainer: 'gap-1 p-1',\n },\n});\n\ninterface 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/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}`;\n\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/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select`;\n return (\n <div data-testid={testId}>\n {}\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/destructuring-assignment\n const testId = `${props.selectProps['data-testid']}_select_option_${slugify(props?.data?.testId ?? props?.data?.value, { replaceDots: true })}`;\n return (\n <div data-testid={testId}>\n {}\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\n const testId = props?.selectProps['data-testid'] as string;\n return (\n <div data-testid={`${testId}_select_dropdown`}>\n {}\n <components.DropdownIndicator {...props} />\n </div>\n );\n};\n\n/** Select component based on [HeroUI Select](https://www.heroui.com//docs/components/select) and [React-Select](https://react-select.com/home) */\nconst Select = ({\n className = undefined,\n clearable = true,\n filterOption = undefined,\n renderOptionLabel = undefined,\n inputValue = undefined,\n loading = false,\n multiSelect = false,\n name,\n onInputChange = undefined,\n options,\n placeholder = undefined,\n ...uniformFieldProps\n}: SelectProps) => {\n const {\n disabled,\n errorMessage,\n field: { onBlur, onChange, ref, value },\n getErrorMessageProps,\n getHelperWrapperProps,\n getLabelProps,\n invalid,\n label,\n required,\n testId,\n } = useUniformField({ name, ...uniformFieldProps });\n\n const [isFocused, setIsFocused] = useState(false);\n\n // classNames from slots\n const variants = selectVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const { getBaseProps, getTriggerProps, getValueProps } = useSelect({\n children: [],\n classNames,\n errorMessage,\n isDisabled: disabled,\n isInvalid: invalid,\n isLoading: loading,\n isRequired: required,\n label,\n labelPlacement: 'outside',\n });\n\n return (\n <div\n {...getBaseProps()}\n className={cn(classNames.base)}\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-required={required}\n data-testid={`${testId}_wrapper`}\n >\n {label ? (\n <label\n className={classNames.label}\n data-slot=\"label\"\n htmlFor={`react-select-${name}-input`}\n id={getLabelProps().id}\n >\n {label}\n </label>\n ) : null}\n <ReactSelect\n ref={ref}\n menuShouldBlockScroll\n unstyled\n aria-errormessage=\"\"\n aria-invalid={invalid}\n aria-labelledby={getTriggerProps()['aria-labelledby']?.split(' ')[1]}\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 // 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 name={name}\n onInputChange={onInputChange}\n options={options}\n placeholder={placeholder}\n classNames={{\n control: () => {\n return cn(classNames.control, {\n [classNames.control_focused]: isFocused && !invalid,\n });\n },\n clearIndicator: () => {\n return classNames.clearIndicator;\n },\n dropdownIndicator: () => {\n return classNames.dropdownIndicator;\n },\n groupHeading: () => {\n return classNames.groupHeading;\n },\n indicatorsContainer: () => {\n return classNames.indicatorsContainer;\n },\n indicatorSeparator: () => {\n return classNames.indicatorSeparator;\n },\n loadingIndicator: () => {\n return classNames.loadingIndicator;\n },\n loadingMessage: () => {\n return classNames.loadingMessage;\n },\n input: () => {\n return classNames.input;\n },\n menu: () => {\n return classNames.menu;\n },\n menuList: () => {\n return classNames.menuList;\n },\n menuPortal: () => {\n return classNames.menuPortal;\n },\n multiValue: () => {\n return classNames.multiValue;\n },\n multiValueLabel: () => {\n return cn(\n classNames.multiValueLabel,\n `${getValueProps().className}`,\n );\n },\n multiValueRemove: () => {\n return classNames.multiValueRemove;\n },\n noOptionsMessage: () => {\n return classNames.noOptionsMessage;\n },\n option: ({\n isFocused: optionIsFocused,\n isSelected: optionIsSelected,\n }) => {\n return cn(classNames.option, {\n [classNames.option_focused]: optionIsFocused,\n [classNames.option_selected]: optionIsSelected,\n });\n },\n placeholder: () => {\n return classNames.placeholder;\n },\n singleValue: () => {\n return cn(classNames.singleValue, `${getValueProps().className}`);\n },\n valueContainer: () => {\n return classNames.valueContainer;\n },\n }}\n components={{\n Input: InputComponent,\n Option: OptionComponent,\n DropdownIndicator: DropdownIndicatorComponent,\n Control: ControlComponent,\n }}\n onBlur={(_e) => {\n setIsFocused(false);\n onBlur();\n }}\n onChange={(option) => {\n if (multiSelect) {\n onChange(\n (option as SelectOption[])?.map((_option) => {\n return _option.value;\n }),\n );\n } else {\n onChange((option as SelectOption)?.value);\n }\n }}\n onFocus={(_e) => {\n setIsFocused(true);\n }}\n // set complete option as value by current field value\n value={options.find((option) => {\n return option.value === value;\n })}\n />\n {invalid ? (\n <div {...getHelperWrapperProps()}>\n {}\n <div {...getErrorMessageProps()}>{errorMessage}</div>\n </div>\n ) : null}\n </div>\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":["_a","Select_default"]}
@@ -0,0 +1,103 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkC5GIWGQRcjs = require('./chunk-C5GIWGQR.cjs');
4
+
5
+
6
+ var _chunkFLK6OPFYcjs = require('./chunk-FLK6OPFY.cjs');
7
+
8
+
9
+
10
+ var _chunk555JRYCScjs = require('./chunk-555JRYCS.cjs');
11
+
12
+ // src/TextArea/TextArea.tsx
13
+ var _input = require('@heroui/input');
14
+ var _pixelutils = require('@fuf-stack/pixel-utils');
15
+ var _jsxruntime = require('react/jsx-runtime');
16
+ var textAreaVariants = _pixelutils.tv.call(void 0, {
17
+ slots: {
18
+ /** wrapper around the whole input */
19
+ base: "",
20
+ /** clear button */
21
+ clearButton: "",
22
+ /** actual input element */
23
+ input: "",
24
+ /** inner wrapper (HeroUI inputWrapper slot) */
25
+ inputWrapper: "bg-content1 group-data-[focus=true]:border-focus"
26
+ }
27
+ });
28
+ var TextArea = (_a) => {
29
+ var _b = _a, {
30
+ children = null,
31
+ className: _className = void 0,
32
+ debounceDelay = 300,
33
+ name,
34
+ placeholder = " "
35
+ } = _b, uniformFieldProps = _chunk555JRYCScjs.__objRest.call(void 0, _b, [
36
+ "children",
37
+ "className",
38
+ "debounceDelay",
39
+ "name",
40
+ "placeholder"
41
+ ]);
42
+ const {
43
+ disabled,
44
+ errorMessage,
45
+ field: {
46
+ onChange: fieldOnChange,
47
+ onBlur: fieldOnBlur,
48
+ value: fieldValue,
49
+ ref
50
+ },
51
+ invalid,
52
+ label,
53
+ required,
54
+ testId
55
+ } = _chunkC5GIWGQRcjs.useUniformField.call(void 0, _chunk555JRYCScjs.__spreadValues.call(void 0, { name }, uniformFieldProps));
56
+ const { onChange, onBlur, value } = _chunkFLK6OPFYcjs.useInputValueDebounce.call(void 0, {
57
+ debounceDelay,
58
+ onBlur: fieldOnBlur,
59
+ onChange: fieldOnChange,
60
+ value: fieldValue
61
+ });
62
+ const variants = textAreaVariants();
63
+ const classNames = _pixelutils.variantsToClassNames.call(void 0, variants, _className, "base");
64
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
65
+ _input.Textarea,
66
+ {
67
+ ref,
68
+ "data-testid": testId,
69
+ errorMessage,
70
+ id: testId,
71
+ isDisabled: disabled,
72
+ isInvalid: invalid,
73
+ isRequired: required,
74
+ label,
75
+ labelPlacement: "outside",
76
+ name,
77
+ onBlur,
78
+ onChange,
79
+ placeholder,
80
+ value,
81
+ variant: "bordered",
82
+ classNames: {
83
+ base: classNames.base,
84
+ clearButton: classNames.clearButton,
85
+ // set padding to 0 for error message exit animation
86
+ helperWrapper: "p-0",
87
+ input: classNames.input,
88
+ inputWrapper: classNames.inputWrapper
89
+ },
90
+ children
91
+ }
92
+ );
93
+ };
94
+ var TextArea_default = TextArea;
95
+
96
+ // src/TextArea/index.ts
97
+ var TextArea_default2 = TextArea_default;
98
+
99
+
100
+
101
+
102
+ exports.TextArea_default = TextArea_default; exports.TextArea_default2 = TextArea_default2;
103
+ //# sourceMappingURL=chunk-BWPTCHL7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-BWPTCHL7.cjs","../src/TextArea/TextArea.tsx","../src/TextArea/index.ts"],"names":["TextArea_default"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACRA,sCAAyC;AAEzC,oDAAyC;AA+ErC,+CAAA;AA1EG,IAAM,iBAAA,EAAmB,4BAAA;AAAG,EACjC,KAAA,EAAO;AAAA;AAAA,IAEL,IAAA,EAAM,EAAA;AAAA;AAAA,IAEN,WAAA,EAAa,EAAA;AAAA;AAAA,IAEb,KAAA,EAAO,EAAA;AAAA;AAAA,IAEP,YAAA,EAAc;AAAA,EAChB;AACF,CAAC,CAAA;AA2BD,IAAM,SAAA,EAAW,CAAC,EAAA,EAAA,GAOG;AAPH,EAAA,IAAA,GAAA,EAAA,EAAA,EAChB;AAAA,IAAA,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,WAAA,EAAa,KAAA,CAAA;AAAA,IACxB,cAAA,EAAgB,GAAA;AAAA,IAChB,IAAA;AAAA,IACA,YAAA,EAAc;AAAA,EArDhB,EAAA,EAgDkB,EAAA,EAMb,kBAAA,EAAA,yCAAA,EANa,EAMb;AAAA,IALH,UAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,EAAA,CAAA,CAAA;AAGA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,aAAA;AAAA,MACV,MAAA,EAAQ,WAAA;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP;AAAA,IACF,CAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,EACF,EAAA,EAAI,+CAAA,8CAAgB,EAAE,KAAA,CAAA,EAAS,iBAAA,CAAmB,CAAA;AAGlD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,EAAA,EAAI,qDAAA;AAAsB,IACxD,aAAA;AAAA,IACA,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,aAAA;AAAA,IACV,KAAA,EAAO;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,SAAA,EAAW,gBAAA,CAAiB,CAAA;AAClC,EAAA,MAAM,WAAA,EAAa,8CAAA,QAAqB,EAAU,UAAA,EAAY,MAAM,CAAA;AAEpE,EAAA,uBACE,6BAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MACb,YAAA;AAAA,MACA,EAAA,EAAI,MAAA;AAAA,MACJ,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW,OAAA;AAAA,MACX,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA;AAAA,MACA,cAAA,EAAe,SAAA;AAAA,MACf,IAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAQ,UAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,UAAA,CAAW,IAAA;AAAA,QACjB,WAAA,EAAa,UAAA,CAAW,WAAA;AAAA;AAAA,QAExB,aAAA,EAAe,KAAA;AAAA,QACf,KAAA,EAAO,UAAA,CAAW,KAAA;AAAA,QAClB,YAAA,EAAc,UAAA,CAAW;AAAA,MAC3B,CAAA;AAAA,MAEC;AAAA,IAAA;AAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,EAAQ,QAAA;ADpBf;AACA;AEzFA,IAAOA,kBAAAA,EAAQ,gBAAA;AF2Ff;AACA;AACE;AACA;AACF,2FAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-BWPTCHL7.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ReactNode } from 'react';\n\nimport { Textarea as HeroTextArea } from '@heroui/input';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport { useInputValueDebounce, useUniformField } from '../hooks';\n\n// input variants\nexport const textAreaVariants = tv({\n slots: {\n /** wrapper around the whole input */\n base: '',\n /** clear button */\n clearButton: '',\n /** actual input element */\n input: '',\n /** inner wrapper (HeroUI inputWrapper slot) */\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n },\n});\n\ntype VariantProps = TVProps<typeof textAreaVariants>;\ntype ClassName = TVClassName<typeof textAreaVariants>;\n\nexport interface TextAreaProps extends VariantProps {\n /** Child components. The content of the textarea. */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** debounce delay in milliseconds for form state updates (default: 300ms) */\n debounceDelay?: number;\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 [HeroUI TextArea](https://www.heroui.com//docs/components/textarea)\n */\nconst TextArea = ({\n children = null,\n className: _className = undefined,\n debounceDelay = 300,\n name,\n placeholder = ' ',\n ...uniformFieldProps\n}: TextAreaProps) => {\n const {\n disabled,\n errorMessage,\n field: {\n onChange: fieldOnChange,\n onBlur: fieldOnBlur,\n value: fieldValue,\n ref,\n },\n invalid,\n label,\n required,\n testId,\n } = useUniformField({ name, ...uniformFieldProps });\n\n // Use debounced handlers for form updates\n const { onChange, onBlur, value } = useInputValueDebounce({\n debounceDelay,\n onBlur: fieldOnBlur,\n onChange: fieldOnChange,\n value: fieldValue,\n });\n\n // classNames from slots\n const variants = textAreaVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroTextArea\n ref={ref}\n data-testid={testId}\n errorMessage={errorMessage}\n id={testId}\n isDisabled={disabled}\n isInvalid={invalid}\n isRequired={required}\n label={label}\n labelPlacement=\"outside\"\n name={name}\n onBlur={onBlur}\n onChange={onChange}\n placeholder={placeholder}\n value={value as string}\n variant=\"bordered\"\n classNames={{\n base: classNames.base,\n clearButton: classNames.clearButton,\n // set padding to 0 for error message exit animation\n helperWrapper: 'p-0',\n input: classNames.input,\n inputWrapper: classNames.inputWrapper,\n }}\n >\n {children}\n </HeroTextArea>\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"]}