@fuf-stack/uniform 0.18.5 → 0.19.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 (172) hide show
  1. package/dist/CheckboxGroup/index.cjs +5 -6
  2. package/dist/CheckboxGroup/index.cjs.map +1 -1
  3. package/dist/CheckboxGroup/index.d.cts +2 -2
  4. package/dist/CheckboxGroup/index.d.ts +2 -2
  5. package/dist/CheckboxGroup/index.js +4 -5
  6. package/dist/FieldArray/index.cjs +5 -5
  7. package/dist/FieldArray/index.js +4 -4
  8. package/dist/Form/index.cjs +4 -4
  9. package/dist/Form/index.js +3 -3
  10. package/dist/Grid/index.cjs +1 -1
  11. package/dist/Grid/index.js +1 -1
  12. package/dist/Input/index.cjs +5 -6
  13. package/dist/Input/index.cjs.map +1 -1
  14. package/dist/Input/index.js +4 -5
  15. package/dist/RadioBoxes/index.cjs +5 -6
  16. package/dist/RadioBoxes/index.cjs.map +1 -1
  17. package/dist/RadioBoxes/index.d.cts +2 -2
  18. package/dist/RadioBoxes/index.d.ts +2 -2
  19. package/dist/RadioBoxes/index.js +4 -5
  20. package/dist/RadioGroup/index.cjs +5 -6
  21. package/dist/RadioGroup/index.cjs.map +1 -1
  22. package/dist/RadioGroup/index.d.cts +2 -2
  23. package/dist/RadioGroup/index.d.ts +2 -2
  24. package/dist/RadioGroup/index.js +4 -5
  25. package/dist/RadioTabs/index.cjs +5 -6
  26. package/dist/RadioTabs/index.cjs.map +1 -1
  27. package/dist/RadioTabs/index.d.cts +2 -2
  28. package/dist/RadioTabs/index.d.ts +2 -2
  29. package/dist/RadioTabs/index.js +4 -5
  30. package/dist/Select/index.cjs +5 -6
  31. package/dist/Select/index.cjs.map +1 -1
  32. package/dist/Select/index.d.cts +2 -2
  33. package/dist/Select/index.d.ts +2 -2
  34. package/dist/Select/index.js +4 -5
  35. package/dist/SubmitButton/index.cjs +4 -4
  36. package/dist/SubmitButton/index.js +3 -3
  37. package/dist/Switch/index.cjs +5 -6
  38. package/dist/Switch/index.cjs.map +1 -1
  39. package/dist/Switch/index.d.cts +2 -2
  40. package/dist/Switch/index.d.ts +2 -2
  41. package/dist/Switch/index.js +4 -5
  42. package/dist/TextArea/index.cjs +5 -6
  43. package/dist/TextArea/index.cjs.map +1 -1
  44. package/dist/TextArea/index.js +4 -5
  45. package/dist/chunk-25Y2Q5CX.cjs +110 -0
  46. package/dist/chunk-25Y2Q5CX.cjs.map +1 -0
  47. package/dist/{chunk-IOIYK6UC.js → chunk-35I663WR.js} +29 -29
  48. package/dist/chunk-35I663WR.js.map +1 -0
  49. package/dist/{chunk-HHENF3BD.js → chunk-3JRZ5YNE.js} +6 -6
  50. package/dist/chunk-4DVYBP2O.cjs +236 -0
  51. package/dist/chunk-4DVYBP2O.cjs.map +1 -0
  52. package/dist/chunk-4IQKCUZC.cjs +145 -0
  53. package/dist/chunk-4IQKCUZC.cjs.map +1 -0
  54. package/dist/{chunk-4DAZAO6Y.cjs → chunk-555JRYCS.cjs} +4 -2
  55. package/dist/chunk-555JRYCS.cjs.map +1 -0
  56. package/dist/{chunk-R4GZXQFD.cjs → chunk-5NKR4C73.cjs} +14 -14
  57. package/dist/{chunk-R4GZXQFD.cjs.map → chunk-5NKR4C73.cjs.map} +1 -1
  58. package/dist/chunk-5W2IWHSE.js +89 -0
  59. package/dist/chunk-5W2IWHSE.js.map +1 -0
  60. package/dist/{chunk-WD4ES4JK.cjs → chunk-6GCMM22R.cjs} +35 -47
  61. package/dist/chunk-6GCMM22R.cjs.map +1 -0
  62. package/dist/chunk-7BLVIVDU.cjs +281 -0
  63. package/dist/chunk-7BLVIVDU.cjs.map +1 -0
  64. package/dist/{chunk-3DWGHDVE.js → chunk-7NZKBUL6.js} +36 -48
  65. package/dist/chunk-7NZKBUL6.js.map +1 -0
  66. package/dist/{chunk-EAEW6SOJ.js → chunk-7R2P54VS.js} +37 -49
  67. package/dist/chunk-7R2P54VS.js.map +1 -0
  68. package/dist/{chunk-P332MPVH.js → chunk-BXQ3MVNH.js} +5 -5
  69. package/dist/chunk-BXQ3MVNH.js.map +1 -0
  70. package/dist/chunk-CN5XEGV4.js +281 -0
  71. package/dist/chunk-CN5XEGV4.js.map +1 -0
  72. package/dist/chunk-DBKDDOS2.cjs +89 -0
  73. package/dist/chunk-DBKDDOS2.cjs.map +1 -0
  74. package/dist/chunk-E62JDTFS.js +110 -0
  75. package/dist/chunk-E62JDTFS.js.map +1 -0
  76. package/dist/chunk-F2LWLSBT.cjs +98 -0
  77. package/dist/chunk-F2LWLSBT.cjs.map +1 -0
  78. package/dist/{chunk-4RDTC7R6.cjs → chunk-HECO3HXR.cjs} +31 -31
  79. package/dist/chunk-HECO3HXR.cjs.map +1 -0
  80. package/dist/{chunk-CRTRMMJ7.js → chunk-K2V4ULA2.js} +3 -1
  81. package/dist/{chunk-AEUUTAJB.cjs → chunk-LYI2IDCW.cjs} +6 -6
  82. package/dist/chunk-LYI2IDCW.cjs.map +1 -0
  83. package/dist/{chunk-737UQZOW.js → chunk-N2MRIHRX.js} +109 -122
  84. package/dist/chunk-N2MRIHRX.js.map +1 -0
  85. package/dist/{chunk-ZPNMTMGE.cjs → chunk-NEHRI4EM.cjs} +60 -70
  86. package/dist/chunk-NEHRI4EM.cjs.map +1 -0
  87. package/dist/chunk-UU7SXXNI.cjs +70 -0
  88. package/dist/chunk-UU7SXXNI.cjs.map +1 -0
  89. package/dist/chunk-W2K5WX3O.js +145 -0
  90. package/dist/chunk-W2K5WX3O.js.map +1 -0
  91. package/dist/chunk-Y4YQH2QB.js +70 -0
  92. package/dist/chunk-Y4YQH2QB.js.map +1 -0
  93. package/dist/{chunk-BXZ2SBRA.js → chunk-YK2XHKK2.js} +55 -65
  94. package/dist/chunk-YK2XHKK2.js.map +1 -0
  95. package/dist/helpers/index.cjs +1 -1
  96. package/dist/helpers/index.js +1 -1
  97. package/dist/hooks/index.cjs +7 -3
  98. package/dist/hooks/index.cjs.map +1 -1
  99. package/dist/hooks/index.d.cts +47 -6
  100. package/dist/hooks/index.d.ts +47 -6
  101. package/dist/hooks/index.js +6 -2
  102. package/dist/index.cjs +17 -17
  103. package/dist/index.cjs.map +1 -1
  104. package/dist/index.d.cts +7 -8
  105. package/dist/index.d.ts +7 -8
  106. package/dist/index.js +23 -23
  107. package/dist/partials/FieldCopyTestIdButton/index.cjs +1 -1
  108. package/dist/partials/FieldCopyTestIdButton/index.js +1 -1
  109. package/dist/partials/FieldValidationError/index.cjs +1 -1
  110. package/dist/partials/FieldValidationError/index.js +1 -1
  111. package/package.json +3 -8
  112. package/dist/Controller/index.cjs +0 -11
  113. package/dist/Controller/index.cjs.map +0 -1
  114. package/dist/Controller/index.d.cts +0 -8
  115. package/dist/Controller/index.d.ts +0 -8
  116. package/dist/Controller/index.js +0 -11
  117. package/dist/Controller-8Nqugui5.d.cts +0 -37
  118. package/dist/Controller-8Nqugui5.d.ts +0 -37
  119. package/dist/chunk-3DWGHDVE.js.map +0 -1
  120. package/dist/chunk-3MPB726A.cjs +0 -82
  121. package/dist/chunk-3MPB726A.cjs.map +0 -1
  122. package/dist/chunk-3WZNMG5K.js +0 -155
  123. package/dist/chunk-3WZNMG5K.js.map +0 -1
  124. package/dist/chunk-4DAZAO6Y.cjs.map +0 -1
  125. package/dist/chunk-4HGNEE2R.js +0 -97
  126. package/dist/chunk-4HGNEE2R.js.map +0 -1
  127. package/dist/chunk-4RDTC7R6.cjs.map +0 -1
  128. package/dist/chunk-737UQZOW.js.map +0 -1
  129. package/dist/chunk-AEUUTAJB.cjs.map +0 -1
  130. package/dist/chunk-AT2VVPRD.js +0 -52
  131. package/dist/chunk-AT2VVPRD.js.map +0 -1
  132. package/dist/chunk-BXZ2SBRA.js.map +0 -1
  133. package/dist/chunk-CRTRMMJ7.js.map +0 -1
  134. package/dist/chunk-DXMJHNP3.cjs +0 -249
  135. package/dist/chunk-DXMJHNP3.cjs.map +0 -1
  136. package/dist/chunk-EAEW6SOJ.js.map +0 -1
  137. package/dist/chunk-EPYFZXEI.cjs +0 -52
  138. package/dist/chunk-EPYFZXEI.cjs.map +0 -1
  139. package/dist/chunk-IOIYK6UC.js.map +0 -1
  140. package/dist/chunk-JH4CPQHA.cjs +0 -120
  141. package/dist/chunk-JH4CPQHA.cjs.map +0 -1
  142. package/dist/chunk-JHVW42BW.cjs +0 -97
  143. package/dist/chunk-JHVW42BW.cjs.map +0 -1
  144. package/dist/chunk-JS2D6XPO.js +0 -120
  145. package/dist/chunk-JS2D6XPO.js.map +0 -1
  146. package/dist/chunk-NBAVP4ER.js +0 -135
  147. package/dist/chunk-NBAVP4ER.js.map +0 -1
  148. package/dist/chunk-P332MPVH.js.map +0 -1
  149. package/dist/chunk-QQW2FHSC.cjs +0 -135
  150. package/dist/chunk-QQW2FHSC.cjs.map +0 -1
  151. package/dist/chunk-QX652SHY.cjs +0 -110
  152. package/dist/chunk-QX652SHY.cjs.map +0 -1
  153. package/dist/chunk-SCTQXWRU.cjs +0 -155
  154. package/dist/chunk-SCTQXWRU.cjs.map +0 -1
  155. package/dist/chunk-WD4ES4JK.cjs.map +0 -1
  156. package/dist/chunk-YLLUYAY3.js +0 -82
  157. package/dist/chunk-YLLUYAY3.js.map +0 -1
  158. package/dist/chunk-ZPNMTMGE.cjs.map +0 -1
  159. package/dist/{CheckboxGroup-Dq4voRWR.d.cts → CheckboxGroup-Dh0YW4KV.d.cts} +5 -5
  160. package/dist/{CheckboxGroup-Dq4voRWR.d.ts → CheckboxGroup-Dh0YW4KV.d.ts} +5 -5
  161. package/dist/{RadioBoxes-DJ49DctW.d.cts → RadioBoxes-C61IRDCU.d.cts} +5 -5
  162. package/dist/{RadioBoxes-DJ49DctW.d.ts → RadioBoxes-C61IRDCU.d.ts} +5 -5
  163. package/dist/{RadioGroup-BYfxswoe.d.cts → RadioGroup-C7I27oav.d.cts} +5 -5
  164. package/dist/{RadioGroup-BYfxswoe.d.ts → RadioGroup-C7I27oav.d.ts} +5 -5
  165. package/dist/{RadioTabs-BYvYukGt.d.cts → RadioTabs-CT8PT7ky.d.cts} +5 -5
  166. package/dist/{RadioTabs-BYvYukGt.d.ts → RadioTabs-CT8PT7ky.d.ts} +5 -5
  167. package/dist/{Select-D2Tn4xBh.d.cts → Select-JRwrSDew.d.cts} +15 -15
  168. package/dist/{Select-D2Tn4xBh.d.ts → Select-JRwrSDew.d.ts} +15 -15
  169. package/dist/{Switch-C1H8Kyu7.d.cts → Switch-CLs964dL.d.cts} +5 -5
  170. package/dist/{Switch-C1H8Kyu7.d.ts → Switch-CLs964dL.d.ts} +5 -5
  171. /package/dist/{chunk-HHENF3BD.js.map → chunk-3JRZ5YNE.js.map} +0 -0
  172. /package/dist/{Controller/index.js.map → chunk-K2V4ULA2.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,64 +1,62 @@
1
- import {
2
- RadioGroup_default
3
- } from "./chunk-JS2D6XPO.js";
4
1
  import {
5
2
  RadioTabs_default
6
- } from "./chunk-3DWGHDVE.js";
3
+ } from "./chunk-7NZKBUL6.js";
7
4
  import {
8
5
  Select_default
9
- } from "./chunk-737UQZOW.js";
6
+ } from "./chunk-N2MRIHRX.js";
10
7
  import {
11
8
  SubmitButton_default
12
- } from "./chunk-P332MPVH.js";
9
+ } from "./chunk-BXQ3MVNH.js";
13
10
  import {
14
11
  Switch_default
15
- } from "./chunk-EAEW6SOJ.js";
12
+ } from "./chunk-7R2P54VS.js";
16
13
  import {
17
14
  TextArea_default
18
- } from "./chunk-YLLUYAY3.js";
15
+ } from "./chunk-Y4YQH2QB.js";
19
16
  import {
20
17
  CheckboxGroup_default
21
- } from "./chunk-3WZNMG5K.js";
18
+ } from "./chunk-W2K5WX3O.js";
22
19
  import {
23
20
  FieldArray_default
24
- } from "./chunk-HHENF3BD.js";
25
- import {
26
- Form_default
27
- } from "./chunk-IOIYK6UC.js";
21
+ } from "./chunk-3JRZ5YNE.js";
28
22
  import {
29
23
  Grid_default
30
24
  } from "./chunk-PDCEKC3G.js";
25
+ import {
26
+ Form_default
27
+ } from "./chunk-35I663WR.js";
31
28
  import {
32
29
  Input_default
33
- } from "./chunk-4HGNEE2R.js";
30
+ } from "./chunk-5W2IWHSE.js";
34
31
  import {
35
32
  RadioBoxes_default
36
- } from "./chunk-BXZ2SBRA.js";
37
- import {
38
- Controller_default
39
- } from "./chunk-AT2VVPRD.js";
33
+ } from "./chunk-YK2XHKK2.js";
40
34
  import {
41
- FieldCopyTestIdButton_default
42
- } from "./chunk-BQGN3JTU.js";
35
+ RadioGroup_default
36
+ } from "./chunk-E62JDTFS.js";
43
37
  import {
44
38
  FieldValidationError_default
45
39
  } from "./chunk-UTFZRBBS.js";
40
+ import {
41
+ FieldCopyTestIdButton_default
42
+ } from "./chunk-BQGN3JTU.js";
46
43
  import {
47
44
  checkFieldIsRequired,
45
+ useClientValidation,
46
+ useController,
48
47
  useFieldArray,
49
48
  useFormContext,
50
49
  useInput
51
- } from "./chunk-NBAVP4ER.js";
50
+ } from "./chunk-CN5XEGV4.js";
52
51
  import {
53
52
  fromNullishString,
54
53
  toFormFormat,
55
54
  toNullishString,
56
55
  toValidationFormat
57
56
  } from "./chunk-UAV6PVB4.js";
58
- import "./chunk-CRTRMMJ7.js";
57
+ import "./chunk-K2V4ULA2.js";
59
58
  export {
60
59
  CheckboxGroup_default as CheckboxGroup,
61
- Controller_default as Controller,
62
60
  FieldArray_default as FieldArray,
63
61
  FieldCopyTestIdButton_default as FieldCopyTestIdButton,
64
62
  FieldValidationError_default as FieldValidationError,
@@ -77,6 +75,8 @@ export {
77
75
  toFormFormat,
78
76
  toNullishString,
79
77
  toValidationFormat,
78
+ useClientValidation,
79
+ useController,
80
80
  useFieldArray,
81
81
  useFormContext,
82
82
  useInput
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  var _chunkPA2DQCBYcjs = require('../../chunk-PA2DQCBY.cjs');
5
- require('../../chunk-4DAZAO6Y.cjs');
5
+ require('../../chunk-555JRYCS.cjs');
6
6
 
7
7
 
8
8
 
@@ -2,7 +2,7 @@ import {
2
2
  FieldCopyTestIdButton_default,
3
3
  FieldCopyTestIdButton_default2
4
4
  } from "../../chunk-BQGN3JTU.js";
5
- import "../../chunk-CRTRMMJ7.js";
5
+ import "../../chunk-K2V4ULA2.js";
6
6
  export {
7
7
  FieldCopyTestIdButton_default as FieldCopyTestIdButton,
8
8
  FieldCopyTestIdButton_default2 as default
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  var _chunkGNYQC5IJcjs = require('../../chunk-GNYQC5IJ.cjs');
5
- require('../../chunk-4DAZAO6Y.cjs');
5
+ require('../../chunk-555JRYCS.cjs');
6
6
 
7
7
 
8
8
 
@@ -2,7 +2,7 @@ import {
2
2
  FieldValidationError_default,
3
3
  FieldValidationError_default2
4
4
  } from "../../chunk-UTFZRBBS.js";
5
- import "../../chunk-CRTRMMJ7.js";
5
+ import "../../chunk-K2V4ULA2.js";
6
6
  export {
7
7
  FieldValidationError_default as FieldValidationError,
8
8
  FieldValidationError_default2 as default
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuf-stack/uniform",
3
- "version": "0.18.5",
3
+ "version": "0.19.0",
4
4
  "description": "fuf react form library",
5
5
  "author": "Hannes Tiede",
6
6
  "homepage": "https://github.com/fuf-stack/pixels#readme",
@@ -21,11 +21,6 @@
21
21
  "import": "./dist/CheckboxGroup/index.js",
22
22
  "require": "./dist/CheckboxGroup/index.cjs"
23
23
  },
24
- "./Controller": {
25
- "types": "./dist/Controller/index.d.ts",
26
- "import": "./dist/Controller/index.js",
27
- "require": "./dist/Controller/index.cjs"
28
- },
29
24
  "./FieldArray": {
30
25
  "types": "./dist/FieldArray/index.d.ts",
31
26
  "import": "./dist/FieldArray/index.js",
@@ -134,7 +129,7 @@
134
129
  "@heroui/system": "2.4.13",
135
130
  "@heroui/theme": "2.4.13",
136
131
  "@react-aria/visually-hidden": "3.8.23",
137
- "framer-motion": "12.15.0",
132
+ "framer-motion": "12.16.0",
138
133
  "react-icons": "5.5.0",
139
134
  "react-hook-form": "7.55.0",
140
135
  "react-select": "5.10.1",
@@ -149,8 +144,8 @@
149
144
  "react": "19.0.0",
150
145
  "react-dom": "19.0.0",
151
146
  "@repo/storybook-config": "0.0.1",
152
- "@repo/tailwind-config": "0.0.1",
153
147
  "@repo/tsup-config": "0.0.1",
148
+ "@repo/tailwind-config": "0.0.1",
154
149
  "@repo/vite-config": "0.0.1"
155
150
  },
156
151
  "scripts": {
@@ -1,11 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
- var _chunkEPYFZXEIcjs = require('../chunk-EPYFZXEI.cjs');
5
- require('../chunk-CESGUF6F.cjs');
6
- require('../chunk-4DAZAO6Y.cjs');
7
-
8
-
9
-
10
- exports.Controller = _chunkEPYFZXEIcjs.Controller_default; exports.default = _chunkEPYFZXEIcjs.Controller_default2;
11
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/Controller/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,mHAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/Controller/index.cjs"}
@@ -1,8 +0,0 @@
1
- import { C as Controller } from '../Controller-8Nqugui5.cjs';
2
- export { a as ControllerProps } from '../Controller-8Nqugui5.cjs';
3
- import 'react/jsx-runtime';
4
- import 'react-hook-form';
5
-
6
-
7
-
8
- export { Controller, Controller as default };
@@ -1,8 +0,0 @@
1
- import { C as Controller } from '../Controller-8Nqugui5.js';
2
- export { a as ControllerProps } from '../Controller-8Nqugui5.js';
3
- import 'react/jsx-runtime';
4
- import 'react-hook-form';
5
-
6
-
7
-
8
- export { Controller, Controller as default };
@@ -1,11 +0,0 @@
1
- import {
2
- Controller_default,
3
- Controller_default2
4
- } from "../chunk-AT2VVPRD.js";
5
- import "../chunk-UAV6PVB4.js";
6
- import "../chunk-CRTRMMJ7.js";
7
- export {
8
- Controller_default as Controller,
9
- Controller_default2 as default
10
- };
11
- //# sourceMappingURL=index.js.map
@@ -1,37 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ControllerProps as ControllerProps$1, ControllerRenderProps, UseFormStateReturn, ControllerFieldState } from 'react-hook-form';
3
-
4
- type ControllerProps<TFieldValues extends object = object> = Omit<ControllerProps$1<TFieldValues>, 'render'> & {
5
- /**
6
- * Render prop that receives the form control props with nullish string handling.
7
- * The field object contains all the properties needed to control an input:
8
- * - onChange: Handles both direct value changes and event objects
9
- * - value: Always provides a string value, converting null/undefined to empty string
10
- * - name, ref, etc: Other standard field properties from react-hook-form
11
- */
12
- render: (props: {
13
- field: Omit<ControllerRenderProps<TFieldValues>, 'onChange' | 'value'> & {
14
- onChange: (...event: any[]) => void;
15
- value: string;
16
- };
17
- formState: UseFormStateReturn<TFieldValues>;
18
- fieldState: ControllerFieldState;
19
- }) => React.ReactElement;
20
- };
21
- /**
22
- * A wrapper around react-hook-form's Controller that transparently handles nullish string conversions.
23
- *
24
- * Key features:
25
- * 1. Empty strings ('') in the UI are stored as null in form state
26
- * 2. Null/undefined values in form state are displayed as empty strings in the UI
27
- * 3. Handles both direct value changes and React synthetic events
28
- * 4. Maintains the same API as react-hook-form's Controller
29
- *
30
- * This enables consistent handling of empty/null values while keeping a clean API
31
- * for form inputs that expect string values.
32
- *
33
- * @see https://react-hook-form.com/docs/usecontroller/controller
34
- */
35
- declare const Controller: <TFieldValues extends object = object>({ render, ...props }: ControllerProps<TFieldValues>) => react_jsx_runtime.JSX.Element;
36
-
37
- export { Controller as C, type ControllerProps as a };
@@ -1,37 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ControllerProps as ControllerProps$1, ControllerRenderProps, UseFormStateReturn, ControllerFieldState } from 'react-hook-form';
3
-
4
- type ControllerProps<TFieldValues extends object = object> = Omit<ControllerProps$1<TFieldValues>, 'render'> & {
5
- /**
6
- * Render prop that receives the form control props with nullish string handling.
7
- * The field object contains all the properties needed to control an input:
8
- * - onChange: Handles both direct value changes and event objects
9
- * - value: Always provides a string value, converting null/undefined to empty string
10
- * - name, ref, etc: Other standard field properties from react-hook-form
11
- */
12
- render: (props: {
13
- field: Omit<ControllerRenderProps<TFieldValues>, 'onChange' | 'value'> & {
14
- onChange: (...event: any[]) => void;
15
- value: string;
16
- };
17
- formState: UseFormStateReturn<TFieldValues>;
18
- fieldState: ControllerFieldState;
19
- }) => React.ReactElement;
20
- };
21
- /**
22
- * A wrapper around react-hook-form's Controller that transparently handles nullish string conversions.
23
- *
24
- * Key features:
25
- * 1. Empty strings ('') in the UI are stored as null in form state
26
- * 2. Null/undefined values in form state are displayed as empty strings in the UI
27
- * 3. Handles both direct value changes and React synthetic events
28
- * 4. Maintains the same API as react-hook-form's Controller
29
- *
30
- * This enables consistent handling of empty/null values while keeping a clean API
31
- * for form inputs that expect string values.
32
- *
33
- * @see https://react-hook-form.com/docs/usecontroller/controller
34
- */
35
- declare const Controller: <TFieldValues extends object = object>({ render, ...props }: ControllerProps<TFieldValues>) => react_jsx_runtime.JSX.Element;
36
-
37
- export { Controller as C, type ControllerProps as a };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/RadioTabs/RadioTabs.tsx","../src/RadioTabs/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { TabsProps } from '@fuf-stack/pixels';\nimport type { TabProps } from '@fuf-stack/pixels/Tabs';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { RadioGroup as HeroRadioGroup } from '@heroui/radio';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\nimport Tabs from '@fuf-stack/pixels/Tabs';\n\nimport { Controller } from '../Controller';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport const radioTabsVariants = tv({\n slots: {\n base: 'group', // Needs group for group-data condition\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:text-danger',\n wrapper: '',\n tabList: '',\n tab: '',\n tabContent: '',\n cursor: '',\n panel: '',\n },\n});\n\ntype VariantProps = TVProps<typeof radioTabsVariants>;\ntype ClassName = TVClassName<typeof radioTabsVariants>;\n\nexport interface RadioTabsOption {\n /** Optional content inside of the tab */\n content?: ReactNode;\n /** disables the option */\n disabled?: boolean;\n /** option label */\n label?: React.ReactNode;\n /** option icon */\n icon?: ReactNode;\n /** HTML data-testid attribute of the option */\n testId?: string;\n /** option value */\n value: string;\n}\n\nexport interface RadioTabsProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** Determines if the Buttons are disabled or not. */\n disabled?: boolean;\n /** determines orientation of the Buttons. */\n inline?: boolean;\n /** Label displayed next to the RadioButton. */\n label?: ReactNode;\n /** Name the RadioButtons are registered at in HTML forms (react-hook-form). */\n name: string;\n /** Radio button configuration. */\n options: RadioTabsOption[];\n /** Id to grab element in internal tests. */\n testId?: string;\n /** How the RadioTabs should look like. */\n variant?: TabsProps['variant'];\n}\n\n/**\n * RadioTabs component based on [HeroUI RadioGroup](https://www.heroui.com//docs/components/radio-group)\n * and [HeroUI Tabs](https://www.heroui.com//docs/components/tabs)\n */\nconst RadioTabs = ({\n className = undefined,\n disabled = false,\n inline = false,\n label = undefined,\n name,\n options,\n testId: _testId = undefined,\n variant = undefined,\n}: RadioTabsProps): ReactElement => {\n const { control, debugMode, getFieldState } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n const variants = radioTabsVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const tabOptions = options.map<TabProps>((option) => ({\n content: option?.content,\n disabled: option?.disabled,\n label: option?.label || option?.value,\n testId: slugify(`option_${option?.testId || option?.value}`),\n key: option.value,\n }));\n\n const disabledAllKeys: string[] | undefined = tabOptions?.map(\n (option) => option.key as string,\n );\n\n return (\n <Controller\n control={control}\n disabled={disabled}\n name={name}\n render={({\n field: { disabled: isDisabled, onBlur, onChange, ref, value },\n }) => {\n return (\n <HeroRadioGroup\n classNames={classNames}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n data-required={required}\n data-testid={testId}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\n isDisabled={isDisabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </label>\n )\n }\n name={name}\n orientation={inline ? 'horizontal' : 'vertical'}\n onBlur={onBlur}\n ref={ref}\n >\n <Tabs\n disabledKeys={disabled ? disabledAllKeys : undefined}\n fullWidth={false}\n onSelectionChange={onChange}\n selectedKey={value}\n tabs={tabOptions as TabProps[]}\n testId={testId}\n variant={variant}\n />\n </HeroRadioGroup>\n );\n }}\n />\n );\n};\n\nexport default RadioTabs;\n","import RadioTabs from './RadioTabs';\n\nexport type { RadioTabsProps } from './RadioTabs';\n\nexport { RadioTabs };\n\nexport default RadioTabs;\n"],"mappings":";;;;;;;;;;;;;;AAKA,SAAS,cAAc,sBAAsB;AAE7C,SAAS,SAAS,IAAI,4BAA4B;AAClD,OAAO,UAAU;AA8GM,cAQP,YARO;AAvGhB,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IACN,OACE;AAAA,IACF,SAAS;AAAA,IACT,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF,CAAC;AA2CD,IAAM,YAAY,CAAC;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,UAAU;AACZ,MAAoC;AAClC,QAAM,EAAE,SAAS,WAAW,cAAc,IAAI,eAAe;AAC7D,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,QAAM,uBAAuB,cAAc;AAC3C,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,kBAAkB;AACnC,QAAM,aAAa,qBAAqB,UAAU,WAAW,MAAM;AAEnE,QAAM,aAAa,QAAQ,IAAc,CAAC,YAAY;AAAA,IACpD,SAAS,iCAAQ;AAAA,IACjB,UAAU,iCAAQ;AAAA,IAClB,QAAO,iCAAQ,WAAS,iCAAQ;AAAA,IAChC,QAAQ,QAAQ,WAAU,iCAAQ,YAAU,iCAAQ,MAAK,EAAE;AAAA,IAC3D,KAAK,OAAO;AAAA,EACd,EAAE;AAEF,QAAM,kBAAwC,yCAAY;AAAA,IACxD,CAAC,WAAW,OAAO;AAAA;AAGrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,QACP,OAAO,EAAE,UAAU,YAAY,QAAQ,UAAU,KAAK,MAAM;AAAA,MAC9D,MAAM;AACJ,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YAGA,gBAAc;AAAA,YACd,iBAAe;AAAA,YACf,eAAa;AAAA,YACb,cACE,SAAS,oBAAC,gCAAqB,OAAc,QAAgB;AAAA,YAE/D;AAAA,YACA,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,OACE;AAAA,YAEE,qBAAC,WACE;AAAA;AAAA,cACA,wBACC,oBAAC,iCAAsB,QAAgB;AAAA,eAE3C;AAAA,YAGJ;AAAA,YACA,aAAa,SAAS,eAAe;AAAA,YACrC;AAAA,YACA;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,cAAc,WAAW,kBAAkB;AAAA,gBAC3C,WAAW;AAAA,gBACX,mBAAmB;AAAA,gBACnB,aAAa;AAAA,gBACb,MAAM;AAAA,gBACN;AAAA,gBACA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oBAAQ;;;ACrJf,IAAOA,qBAAQ;","names":["RadioTabs_default"]}
@@ -1,82 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
- var _chunkEPYFZXEIcjs = require('./chunk-EPYFZXEI.cjs');
4
-
5
-
6
- var _chunkPA2DQCBYcjs = require('./chunk-PA2DQCBY.cjs');
7
-
8
-
9
- var _chunkGNYQC5IJcjs = require('./chunk-GNYQC5IJ.cjs');
10
-
11
-
12
- var _chunkQQW2FHSCcjs = require('./chunk-QQW2FHSC.cjs');
13
-
14
- // src/TextArea/TextArea.tsx
15
- var _input = require('@heroui/input');
16
- var _pixelutils = require('@fuf-stack/pixel-utils');
17
- var _jsxruntime = require('react/jsx-runtime');
18
- var TextArea = ({
19
- children = null,
20
- className = void 0,
21
- disabled = false,
22
- label = void 0,
23
- name,
24
- placeholder = " ",
25
- testId: _testId = void 0
26
- }) => {
27
- const { control, debugMode, getFieldState } = _chunkQQW2FHSCcjs.useFormContext.call(void 0, );
28
- const { error, invalid, required, testId } = getFieldState(name, _testId);
29
- const showTestIdCopyButton = debugMode === "debug-testids";
30
- const showLabel = label || showTestIdCopyButton;
31
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
32
- _chunkEPYFZXEIcjs.Controller_default,
33
- {
34
- control,
35
- name,
36
- disabled,
37
- render: ({
38
- field: { disabled: isDisabled, onChange, onBlur, value = "", ref }
39
- }) => {
40
- var _a;
41
- const displayValue = (_a = value == null ? void 0 : value.toString()) != null ? _a : "";
42
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
43
- _input.Textarea,
44
- {
45
- className: _pixelutils.cn.call(void 0, className),
46
- classNames: {
47
- inputWrapper: "group-data-[focus=true]:border-focus"
48
- },
49
- "data-testid": testId,
50
- errorMessage: error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGNYQC5IJcjs.FieldValidationError_default, { error, testId }),
51
- isDisabled,
52
- isRequired: required,
53
- isInvalid: invalid,
54
- label: showLabel && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
55
- label,
56
- showTestIdCopyButton && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPA2DQCBYcjs.FieldCopyTestIdButton_default, { testId })
57
- ] }),
58
- labelPlacement: "outside",
59
- placeholder,
60
- name,
61
- value: displayValue,
62
- onChange,
63
- onBlur,
64
- ref,
65
- variant: "bordered",
66
- children
67
- }
68
- );
69
- }
70
- }
71
- );
72
- };
73
- var TextArea_default = TextArea;
74
-
75
- // src/TextArea/index.ts
76
- var TextArea_default2 = TextArea_default;
77
-
78
-
79
-
80
-
81
- exports.TextArea_default = TextArea_default; exports.TextArea_default2 = TextArea_default2;
82
- //# sourceMappingURL=chunk-3MPB726A.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-3MPB726A.cjs","../src/TextArea/TextArea.tsx","../src/TextArea/index.ts"],"names":["TextArea_default"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACXA,sCAAyC;AAEzC,oDAAmB;AAoFI,+CAAA;AAzDvB,IAAM,SAAA,EAAW,CAAC;AAAA,EAChB,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,KAAA,CAAA;AAAA,EACZ,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA,CAAA;AAAA,EACR,IAAA;AAAA,EACA,YAAA,EAAc,GAAA;AAAA,EACd,MAAA,EAAQ,QAAA,EAAU,KAAA;AACpB,CAAA,EAAA,GAAqB;AACnB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,cAAc,EAAA,EAAI,8CAAA,CAAe;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAO,EAAA,EAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAExE,EAAA,MAAM,qBAAA,EAAuB,UAAA,IAAc,eAAA;AAC3C,EAAA,MAAM,UAAA,EAAY,MAAA,GAAS,oBAAA;AAE3B,EAAA,uBACE,6BAAA;AAAA,IAAC,oCAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,CAAC;AAAA,QACP,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,IAAI;AAAA,MACnE,CAAA,EAAA,GAAM;AArDZ,QAAA,IAAA,EAAA;AA8EQ,QAAA,MAAM,aAAA,EAAA,CAAe,GAAA,EAAA,MAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,KAAA,CAAO,QAAA,CAAA,CAAA,EAAA,GAAP,KAAA,EAAA,GAAA,EAAqB,EAAA;AAE1C,QAAA,uBACE,6BAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,4BAAA,SAAY,CAAA;AAAA,YACvB,UAAA,EAAY;AAAA,cACV,YAAA,EAAc;AAAA,YAChB,CAAA;AAAA,YACA,aAAA,EAAa,MAAA;AAAA,YACb,YAAA,EACE,MAAA,mBAAS,6BAAA,8CAAC,EAAA,EAAqB,KAAA,EAAc,OAAA,CAAgB,CAAA;AAAA,YAE/D,UAAA;AAAA,YACA,UAAA,EAAY,QAAA;AAAA,YACZ,SAAA,EAAW,OAAA;AAAA,YACX,KAAA,EACE,UAAA,mBACE,8BAAA,oBAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,KAAA;AAAA,cACA,qBAAA,mBACC,6BAAA,+CAAC,EAAA,EAAsB,OAAA,CAAgB;AAAA,YAAA,EAAA,CAE3C,CAAA;AAAA,YAGJ,cAAA,EAAe,SAAA;AAAA,YACf,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,YAAA;AAAA,YACP,QAAA;AAAA,YACA,MAAA;AAAA,YACA,GAAA;AAAA,YACA,OAAA,EAAQ,UAAA;AAAA,YAEP;AAAA,UAAA;AAAA,QACH,CAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,EAAQ,QAAA;AD/Cf;AACA;AEpEA,IAAOA,kBAAAA,EAAQ,gBAAA;AFsEf;AACA;AACE;AACA;AACF,2FAAC","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-3MPB726A.cjs","sourcesContent":[null,"import type { ReactNode } from 'react';\n\nimport { Textarea as HeroTextArea } from '@heroui/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 [HeroUI TextArea](https://www.heroui.com//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 <HeroTextArea\n className={cn(className)}\n classNames={{\n inputWrapper: 'group-data-[focus=true]:border-focus',\n }}\n data-testid={testId}\n errorMessage={\n error && <FieldValidationError error={error} testId={testId} />\n }\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 </HeroTextArea>\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"]}
@@ -1,155 +0,0 @@
1
- import {
2
- Controller_default
3
- } from "./chunk-AT2VVPRD.js";
4
- import {
5
- FieldCopyTestIdButton_default
6
- } from "./chunk-BQGN3JTU.js";
7
- import {
8
- FieldValidationError_default
9
- } from "./chunk-UTFZRBBS.js";
10
- import {
11
- useFormContext
12
- } from "./chunk-NBAVP4ER.js";
13
- import {
14
- __spreadProps,
15
- __spreadValues
16
- } from "./chunk-CRTRMMJ7.js";
17
-
18
- // src/CheckboxGroup/CheckboxGroup.tsx
19
- import { Checkbox, CheckboxGroup as HeroCheckboxGroup } from "@heroui/checkbox";
20
- import { slugify, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
21
- import { jsx, jsxs } from "react/jsx-runtime";
22
- var checkboxGroupVariants = tv({
23
- slots: {
24
- base: "group",
25
- // Needs group for group-data condition
26
- errorMessage: "text-tiny",
27
- itemBase: "",
28
- itemIcon: "",
29
- itemLabel: "text-sm",
30
- itemWrapper: "",
31
- // see HeroUI styles for group-data condition,
32
- // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/core/theme/src/components/select.ts
33
- label: "text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:!text-danger",
34
- wrapper: ""
35
- }
36
- });
37
- var CheckboxGroup = ({
38
- className = void 0,
39
- inline = false,
40
- label = void 0,
41
- options,
42
- disabled = false,
43
- name,
44
- testId: _testId = void 0
45
- }) => {
46
- const { control, debugMode, getFieldState } = useFormContext();
47
- const {
48
- error: _error,
49
- invalid,
50
- required,
51
- testId
52
- } = getFieldState(name, _testId);
53
- const showTestIdCopyButton = debugMode === "debug-testids";
54
- const showLabel = label || showTestIdCopyButton;
55
- const variants = checkboxGroupVariants();
56
- const classNames = variantsToClassNames(variants, className, "base");
57
- const itemClassName = {
58
- base: classNames.itemBase,
59
- wrapper: classNames.itemWrapper,
60
- icon: classNames.itemIcon,
61
- label: classNames.itemLabel
62
- };
63
- const itemGroupClassName = {
64
- base: classNames.base,
65
- wrapper: classNames.wrapper,
66
- label: classNames.label
67
- };
68
- const errorFlat = _error && Object.values(
69
- _error
70
- ).flat() || [];
71
- return /* @__PURE__ */ jsx(
72
- Controller_default,
73
- {
74
- control,
75
- name,
76
- disabled,
77
- render: ({ field: { onChange, value = [], ref, onBlur } }) => {
78
- const getCheckboxValue = (inputValue) => {
79
- if (Array.isArray(inputValue)) {
80
- return inputValue;
81
- }
82
- if (inputValue) {
83
- return [inputValue];
84
- }
85
- return [];
86
- };
87
- const singleCheckboxProps = {
88
- value: getCheckboxValue(value),
89
- onChange: (newValue) => onChange(newValue && newValue[0])
90
- };
91
- const multipleCheckboxProps = {
92
- onChange,
93
- value: getCheckboxValue(value)
94
- };
95
- const checkboxGroupProps = options.length === 1 ? singleCheckboxProps : multipleCheckboxProps;
96
- return /* @__PURE__ */ jsx(
97
- HeroCheckboxGroup,
98
- __spreadProps(__spreadValues({
99
- name,
100
- classNames: itemGroupClassName,
101
- "data-testid": testId,
102
- "data-invalid": invalid,
103
- errorMessage: errorFlat.length && /* @__PURE__ */ jsx(
104
- FieldValidationError_default,
105
- {
106
- className: classNames.errorMessage,
107
- error: errorFlat,
108
- testId
109
- }
110
- ),
111
- isDisabled: disabled,
112
- isInvalid: invalid,
113
- isRequired: required,
114
- label: showLabel && // eslint-disable-next-line jsx-a11y/label-has-associated-control
115
- /* @__PURE__ */ jsxs("label", { children: [
116
- label,
117
- showTestIdCopyButton && /* @__PURE__ */ jsx(FieldCopyTestIdButton_default, { testId })
118
- ] }),
119
- onBlur,
120
- orientation: inline ? "horizontal" : "vertical",
121
- ref
122
- }, checkboxGroupProps), {
123
- children: options == null ? void 0 : options.map((option) => {
124
- const optionTestId = slugify(
125
- `${testId}_option_${(option == null ? void 0 : option.testId) || (option == null ? void 0 : option.value)}`
126
- );
127
- return /* @__PURE__ */ jsx(
128
- Checkbox,
129
- {
130
- "data-invalid": invalid,
131
- classNames: itemClassName,
132
- isDisabled: disabled || option.disabled,
133
- value: option == null ? void 0 : option.value,
134
- "data-testid": optionTestId,
135
- children: option == null ? void 0 : option.label
136
- },
137
- `index_${option.value}`
138
- );
139
- })
140
- })
141
- );
142
- }
143
- }
144
- );
145
- };
146
- var CheckboxGroup_default = CheckboxGroup;
147
-
148
- // src/CheckboxGroup/index.ts
149
- var CheckboxGroup_default2 = CheckboxGroup_default;
150
-
151
- export {
152
- CheckboxGroup_default,
153
- CheckboxGroup_default2
154
- };
155
- //# sourceMappingURL=chunk-3WZNMG5K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/CheckboxGroup/CheckboxGroup.tsx","../src/CheckboxGroup/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { FieldError } from 'react-hook-form';\n\nimport { Checkbox, CheckboxGroup as HeroCheckboxGroup } from '@heroui/checkbox';\n\nimport { slugify, tv, variantsToClassNames } 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 const checkboxGroupVariants = tv({\n slots: {\n base: 'group', // Needs group for group-data condition\n errorMessage: 'text-tiny',\n itemBase: '',\n itemIcon: '',\n itemLabel: 'text-sm',\n itemWrapper: '',\n // see HeroUI styles for group-data condition,\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/core/theme/src/components/select.ts\n label:\n 'text-sm text-foreground subpixel-antialiased group-data-[invalid=true]:!text-danger',\n wrapper: '',\n },\n});\n\ntype VariantProps = TVProps<typeof checkboxGroupVariants>;\ntype ClassName = TVClassName<typeof checkboxGroupVariants>;\n\nexport type CheckboxGroupOption = {\n /** option label */\n label?: React.ReactNode;\n /** option value */\n value: string;\n /** disables the option */\n disabled?: boolean;\n /** HTML data-testid attribute of the option */\n testId?: string;\n};\n\nexport interface CheckboxGroupProps extends VariantProps {\n /** CSS class name. ClassName: string | { buttons?: string | { base?: string; active?: string }; base?: string;} */\n className?: ClassName;\n /** determines orientation of the boxes. */\n inline?: boolean;\n /** label displayed above the Checkboxes */\n label?: React.ReactNode;\n /** Name the Field is registered on the form. */\n name: string;\n /** Checkboxes that should be displayed. */\n options: CheckboxGroupOption[];\n /** sets all buttons disabled */\n disabled?: boolean;\n /** id for internal testing. */\n testId?: string;\n}\n\n/**\n * CheckboxGroup component based on [HeroUI CheckboxGroup](https://www.heroui.com//docs/components/checkbox-group)\n */\nconst CheckboxGroup = ({\n className = undefined,\n inline = false,\n label = undefined,\n options,\n disabled = false,\n name,\n testId: _testId = undefined,\n}: CheckboxGroupProps) => {\n const { control, debugMode, getFieldState } = useFormContext();\n const {\n error: _error,\n invalid,\n required,\n testId,\n } = getFieldState(name, _testId);\n\n const showTestIdCopyButton = debugMode === 'debug-testids';\n const showLabel = label || showTestIdCopyButton;\n\n const variants = checkboxGroupVariants();\n const classNames = variantsToClassNames(variants, className, 'base');\n\n const itemClassName = {\n base: classNames.itemBase,\n wrapper: classNames.itemWrapper,\n icon: classNames.itemIcon,\n label: classNames.itemLabel,\n };\n const itemGroupClassName = {\n base: classNames.base,\n wrapper: classNames.wrapper,\n label: classNames.label,\n };\n\n // Convert React Hook Form's nested error object structure to a flat array\n // RHF errors can be nested like: checkboxField.0 (individual checkbox errors)\n // and checkboxField._error (global field errors) - this flattens all\n // error values into a single array for rendering with FieldValidationError\n const errorFlat: FieldError[] =\n (_error &&\n Object.values(\n _error as unknown as Record<string, FieldError[]>,\n ).flat()) ||\n [];\n\n return (\n <Controller\n control={control}\n name={name}\n disabled={disabled}\n render={({ field: { onChange, value = [], ref, onBlur } }) => {\n /**\n * Handles the checkbox group value changes based on the number of options:\n * 1. For single checkbox (options.length === 1):\n * - Converts undefined/empty array to [] for consistent controlled behavior\n * - Extracts single value from array for onChange\n *\n * Example: undefined → []\n * [value] → value\n *\n * 2. For multiple checkboxes:\n * - Uses raw value array with fallback to empty array\n * - Passes through onChange directly\n *\n * Example: undefined → []\n * ['value1', 'value2'] → ['value1', 'value2']\n */\n const getCheckboxValue = (inputValue: unknown): string[] => {\n if (Array.isArray(inputValue)) {\n return inputValue;\n }\n if (inputValue) {\n return [inputValue as string];\n }\n return [];\n };\n\n const singleCheckboxProps = {\n value: getCheckboxValue(value),\n onChange: (newValue: string[]) => onChange(newValue && newValue[0]),\n };\n\n const multipleCheckboxProps = {\n onChange,\n value: getCheckboxValue(value),\n };\n\n const checkboxGroupProps =\n options.length === 1 ? singleCheckboxProps : multipleCheckboxProps;\n\n return (\n <HeroCheckboxGroup\n name={name}\n classNames={itemGroupClassName}\n data-testid={testId}\n // see HeroUI styles for group-data condition (data-invalid),\n // e.g.: https://github.com/heroui-inc/heroui/blob/main/packages/components/select/src/use-select.ts\n data-invalid={invalid}\n errorMessage={\n errorFlat.length && (\n <FieldValidationError\n className={classNames.errorMessage}\n error={errorFlat}\n testId={testId}\n />\n )\n }\n isDisabled={disabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n showLabel && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n {label}\n {showTestIdCopyButton && (\n <FieldCopyTestIdButton testId={testId} />\n )}\n </label>\n )\n }\n onBlur={onBlur}\n orientation={inline ? 'horizontal' : 'vertical'}\n ref={ref}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...checkboxGroupProps}\n >\n {options?.map((option) => {\n const optionTestId = slugify(\n `${testId}_option_${option?.testId || option?.value}`,\n );\n return (\n <Checkbox\n data-invalid={invalid}\n classNames={itemClassName}\n key={`index_${option.value}`}\n isDisabled={disabled || option.disabled}\n value={option?.value}\n data-testid={optionTestId}\n >\n {option?.label}\n </Checkbox>\n );\n })}\n </HeroCheckboxGroup>\n );\n }}\n />\n );\n};\n\nexport default CheckboxGroup;\n","import CheckboxGroup from './CheckboxGroup';\n\nexport type { CheckboxGroupProps, CheckboxGroupOption } from './CheckboxGroup';\n\nexport { CheckboxGroup };\n\nexport default CheckboxGroup;\n"],"mappings":"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","names":["CheckboxGroup_default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-4DAZAO6Y.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/uniform/dist/chunk-4DAZAO6Y.cjs"}