@customafk/lunas-ui 0.2.70 → 0.2.72

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 (170) hide show
  1. package/dist/{action-submit-Bzw30CUP.cjs → action-submit-C19tPHgf.cjs} +2 -2
  2. package/dist/{action-submit-Bzw30CUP.cjs.map → action-submit-C19tPHgf.cjs.map} +1 -1
  3. package/dist/{action-submit-DLv-V1JQ.mjs → action-submit-cOfq0OSY.mjs} +2 -2
  4. package/dist/{action-submit-DLv-V1JQ.mjs.map → action-submit-cOfq0OSY.mjs.map} +1 -1
  5. package/dist/{actions-form-CI1WhB90.cjs → actions-form-3ItwYOFj.cjs} +2 -2
  6. package/dist/{actions-form-CI1WhB90.cjs.map → actions-form-3ItwYOFj.cjs.map} +1 -1
  7. package/dist/{actions-form-CEBdF1N7.mjs → actions-form-DxbT1lip.mjs} +2 -2
  8. package/dist/{actions-form-CEBdF1N7.mjs.map → actions-form-DxbT1lip.mjs.map} +1 -1
  9. package/dist/{checkbox-field-B7Nh2_rB.mjs → checkbox-field-BAQN-Yno.mjs} +2 -2
  10. package/dist/{checkbox-field-B7Nh2_rB.mjs.map → checkbox-field-BAQN-Yno.mjs.map} +1 -1
  11. package/dist/{checkbox-field-CTCgnG0a.cjs → checkbox-field-BRqU_dYY.cjs} +2 -2
  12. package/dist/{checkbox-field-CTCgnG0a.cjs.map → checkbox-field-BRqU_dYY.cjs.map} +1 -1
  13. package/dist/combobox-field-DnCpN--a.cjs +2 -0
  14. package/dist/combobox-field-DnCpN--a.cjs.map +1 -0
  15. package/dist/combobox-field-yvQPJSFC.mjs +2 -0
  16. package/dist/combobox-field-yvQPJSFC.mjs.map +1 -0
  17. package/dist/date-field-DLsJBYw8.cjs +2 -0
  18. package/dist/date-field-DLsJBYw8.cjs.map +1 -0
  19. package/dist/date-field-O67C78Kw.mjs +2 -0
  20. package/dist/date-field-O67C78Kw.mjs.map +1 -0
  21. package/dist/{dialog-form-C6kJPVNp.mjs → dialog-form-BxlLrEeZ.mjs} +2 -2
  22. package/dist/{dialog-form-C6kJPVNp.mjs.map → dialog-form-BxlLrEeZ.mjs.map} +1 -1
  23. package/dist/{dialog-form-DalF7KGG.cjs → dialog-form-ClTCyJDD.cjs} +2 -2
  24. package/dist/{dialog-form-DalF7KGG.cjs.map → dialog-form-ClTCyJDD.cjs.map} +1 -1
  25. package/dist/{email-field-DH7kK--D.cjs → email-field-DZzkfVj5.cjs} +2 -2
  26. package/dist/{email-field-DH7kK--D.cjs.map → email-field-DZzkfVj5.cjs.map} +1 -1
  27. package/dist/{email-field-CadXKVIu.mjs → email-field-DqEDxkp7.mjs} +2 -2
  28. package/dist/{email-field-CadXKVIu.mjs.map → email-field-DqEDxkp7.mjs.map} +1 -1
  29. package/dist/features/tables/index.d.cts +1 -1
  30. package/dist/features/tables/index.d.mts +1 -1
  31. package/dist/features/tanstack-form/index.cjs +1 -1
  32. package/dist/features/tanstack-form/index.mjs +1 -1
  33. package/dist/{field-BV5twmKA.cjs → field-BSLi-P0Q.cjs} +2 -2
  34. package/dist/{field-BV5twmKA.cjs.map → field-BSLi-P0Q.cjs.map} +1 -1
  35. package/dist/{field-BKyUqvzh.mjs → field-V2DoD8qL.mjs} +2 -2
  36. package/dist/{field-BKyUqvzh.mjs.map → field-V2DoD8qL.mjs.map} +1 -1
  37. package/dist/{flex-CdJSaEfY.d.cts → flex-DGVZd6c6.d.cts} +4 -4
  38. package/dist/{flex-CdJSaEfY.d.mts → flex-DGVZd6c6.d.mts} +4 -4
  39. package/dist/{group-field-bviEXmo4.mjs → group-field-gejvx_Td.mjs} +2 -2
  40. package/dist/{group-field-bviEXmo4.mjs.map → group-field-gejvx_Td.mjs.map} +1 -1
  41. package/dist/{group-field-0kStiX8n.cjs → group-field-sVykO2JZ.cjs} +2 -2
  42. package/dist/{group-field-0kStiX8n.cjs.map → group-field-sVykO2JZ.cjs.map} +1 -1
  43. package/dist/{index-_GTjwUdG.d.mts → index-5R8gTzkQ.d.mts} +2 -2
  44. package/dist/{index-FEMPGfwO.d.cts → index-By6nfR2q.d.cts} +2 -2
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.d.cts +5 -5
  47. package/dist/index.d.mts +5 -5
  48. package/dist/index.mjs +1 -1
  49. package/dist/{input-BieGEIDf.d.cts → input-BQJV7ryj.d.cts} +2 -2
  50. package/dist/{input-BieGEIDf.d.mts → input-BQJV7ryj.d.mts} +2 -2
  51. package/dist/layouts/flex.d.cts +1 -1
  52. package/dist/layouts/flex.d.mts +1 -1
  53. package/dist/{number-field-CCzUIF-Q.cjs → number-field-BTLobx1F.cjs} +2 -2
  54. package/dist/{number-field-CCzUIF-Q.cjs.map → number-field-BTLobx1F.cjs.map} +1 -1
  55. package/dist/{number-field-BglMIz6D.mjs → number-field-Cx-1U_Np.mjs} +2 -2
  56. package/dist/{number-field-BglMIz6D.mjs.map → number-field-Cx-1U_Np.mjs.map} +1 -1
  57. package/dist/{password-field-7VRa9-nn.mjs → password-field-CGPjZ5hZ.mjs} +2 -2
  58. package/dist/{password-field-7VRa9-nn.mjs.map → password-field-CGPjZ5hZ.mjs.map} +1 -1
  59. package/dist/{password-field-_AoAB7nM.cjs → password-field-CuBcb4mi.cjs} +2 -2
  60. package/dist/{password-field-_AoAB7nM.cjs.map → password-field-CuBcb4mi.cjs.map} +1 -1
  61. package/dist/{popover-form-BLuCGa_z.mjs → popover-form-DVJUQ3_T.mjs} +2 -2
  62. package/dist/{popover-form-BLuCGa_z.mjs.map → popover-form-DVJUQ3_T.mjs.map} +1 -1
  63. package/dist/{popover-form-C701gLPP.cjs → popover-form-DzvgWQ2Q.cjs} +2 -2
  64. package/dist/{popover-form-C701gLPP.cjs.map → popover-form-DzvgWQ2Q.cjs.map} +1 -1
  65. package/dist/{radio-group-field-D570ZDQ1.mjs → radio-group-field-C45y9BQt.mjs} +2 -2
  66. package/dist/{radio-group-field-D570ZDQ1.mjs.map → radio-group-field-C45y9BQt.mjs.map} +1 -1
  67. package/dist/{radio-group-field-D7Q5UZNX.cjs → radio-group-field-GiEbZRkS.cjs} +2 -2
  68. package/dist/{radio-group-field-D7Q5UZNX.cjs.map → radio-group-field-GiEbZRkS.cjs.map} +1 -1
  69. package/dist/{resizable-koX293wy.d.cts → resizable-CAyWR1At.d.cts} +2 -2
  70. package/dist/{resizable-koX293wy.d.mts → resizable-CAyWR1At.d.mts} +2 -2
  71. package/dist/{search-input-Bq4enQzR.d.cts → search-input-CE9lDDeD.d.cts} +2 -2
  72. package/dist/{search-input-D51_mAY-.d.mts → search-input-D2rEfTmY.d.mts} +2 -2
  73. package/dist/{select-field-Dut7YMVy.cjs → select-field-Cd63KvgR.cjs} +2 -2
  74. package/dist/{select-field-Dut7YMVy.cjs.map → select-field-Cd63KvgR.cjs.map} +1 -1
  75. package/dist/{select-field-C5MjnCWH.mjs → select-field-y3Zttb4j.mjs} +2 -2
  76. package/dist/{select-field-C5MjnCWH.mjs.map → select-field-y3Zttb4j.mjs.map} +1 -1
  77. package/dist/{simple-array-field-CuwaS9sn.cjs → simple-array-field-BODzA766.cjs} +2 -2
  78. package/dist/{simple-array-field-CuwaS9sn.cjs.map → simple-array-field-BODzA766.cjs.map} +1 -1
  79. package/dist/{simple-array-field-Bj86iA_N.mjs → simple-array-field-DI_56dVs.mjs} +2 -2
  80. package/dist/{simple-array-field-Bj86iA_N.mjs.map → simple-array-field-DI_56dVs.mjs.map} +1 -1
  81. package/dist/{simple-boolean-field-dshsOUUK.cjs → simple-boolean-field-BjnIh9Mq.cjs} +2 -2
  82. package/dist/{simple-boolean-field-dshsOUUK.cjs.map → simple-boolean-field-BjnIh9Mq.cjs.map} +1 -1
  83. package/dist/{simple-boolean-field-BbfHAg60.mjs → simple-boolean-field-oP5yJDQL.mjs} +2 -2
  84. package/dist/{simple-boolean-field-BbfHAg60.mjs.map → simple-boolean-field-oP5yJDQL.mjs.map} +1 -1
  85. package/dist/{simple-combobox-field-poFNb-vB.mjs → simple-combobox-field-Bd-xk5kC.mjs} +2 -2
  86. package/dist/{simple-combobox-field-poFNb-vB.mjs.map → simple-combobox-field-Bd-xk5kC.mjs.map} +1 -1
  87. package/dist/{simple-combobox-field-CNbTlIg_.cjs → simple-combobox-field-Dgicw0VN.cjs} +2 -2
  88. package/dist/{simple-combobox-field-CNbTlIg_.cjs.map → simple-combobox-field-Dgicw0VN.cjs.map} +1 -1
  89. package/dist/{simple-date-field-BMADM_kf.mjs → simple-date-field-DE5Z-Zkc.mjs} +2 -2
  90. package/dist/{simple-date-field-BMADM_kf.mjs.map → simple-date-field-DE5Z-Zkc.mjs.map} +1 -1
  91. package/dist/{simple-date-field-B5RRZ_Uo.cjs → simple-date-field-hORsbXHE.cjs} +2 -2
  92. package/dist/{simple-date-field-B5RRZ_Uo.cjs.map → simple-date-field-hORsbXHE.cjs.map} +1 -1
  93. package/dist/{simple-email-field-B73GdTF_.mjs → simple-email-field-CFbpYis_.mjs} +2 -2
  94. package/dist/{simple-email-field-B73GdTF_.mjs.map → simple-email-field-CFbpYis_.mjs.map} +1 -1
  95. package/dist/{simple-email-field-dskmgGEz.cjs → simple-email-field-DpuMlzxg.cjs} +2 -2
  96. package/dist/{simple-email-field-dskmgGEz.cjs.map → simple-email-field-DpuMlzxg.cjs.map} +1 -1
  97. package/dist/{simple-number-field-ggLY5zA7.mjs → simple-number-field-BY0b4BJp.mjs} +2 -2
  98. package/dist/{simple-number-field-ggLY5zA7.mjs.map → simple-number-field-BY0b4BJp.mjs.map} +1 -1
  99. package/dist/{simple-number-field-RBxUxq_w.cjs → simple-number-field-C4y4rQcw.cjs} +2 -2
  100. package/dist/{simple-number-field-RBxUxq_w.cjs.map → simple-number-field-C4y4rQcw.cjs.map} +1 -1
  101. package/dist/{simple-password-field-BBpfmgoT.cjs → simple-password-field-BUzKJ0fu.cjs} +2 -2
  102. package/dist/{simple-password-field-BBpfmgoT.cjs.map → simple-password-field-BUzKJ0fu.cjs.map} +1 -1
  103. package/dist/{simple-password-field-CrGsdjSa.mjs → simple-password-field-CA0FuETK.mjs} +2 -2
  104. package/dist/{simple-password-field-CrGsdjSa.mjs.map → simple-password-field-CA0FuETK.mjs.map} +1 -1
  105. package/dist/{simple-radio-group-field-CZ5u-XiY.mjs → simple-radio-group-field-BM7HBTSs.mjs} +2 -2
  106. package/dist/{simple-radio-group-field-CZ5u-XiY.mjs.map → simple-radio-group-field-BM7HBTSs.mjs.map} +1 -1
  107. package/dist/{simple-radio-group-field-Dyc3SO9t.cjs → simple-radio-group-field-CCxUaYom.cjs} +2 -2
  108. package/dist/{simple-radio-group-field-Dyc3SO9t.cjs.map → simple-radio-group-field-CCxUaYom.cjs.map} +1 -1
  109. package/dist/{simple-select-field-CyFJthFb.mjs → simple-select-field-CeTVQwmP.mjs} +2 -2
  110. package/dist/{simple-select-field-CyFJthFb.mjs.map → simple-select-field-CeTVQwmP.mjs.map} +1 -1
  111. package/dist/{simple-select-field-CCmaLlAT.cjs → simple-select-field-CzN4Xb7n.cjs} +2 -2
  112. package/dist/{simple-select-field-CCmaLlAT.cjs.map → simple-select-field-CzN4Xb7n.cjs.map} +1 -1
  113. package/dist/{simple-text-field-DxZyRSy5.mjs → simple-text-field-CDsgWUFD.mjs} +2 -2
  114. package/dist/{simple-text-field-DxZyRSy5.mjs.map → simple-text-field-CDsgWUFD.mjs.map} +1 -1
  115. package/dist/{simple-text-field-DSX3rP7g.cjs → simple-text-field-DGZL0gML.cjs} +2 -2
  116. package/dist/{simple-text-field-DSX3rP7g.cjs.map → simple-text-field-DGZL0gML.cjs.map} +1 -1
  117. package/dist/{simple-textarea-field-BiaAbLgT.mjs → simple-textarea-field-BiuHXtqj.mjs} +2 -2
  118. package/dist/{simple-textarea-field-BiaAbLgT.mjs.map → simple-textarea-field-BiuHXtqj.mjs.map} +1 -1
  119. package/dist/{simple-textarea-field--FWXqgy7.cjs → simple-textarea-field-vGYOegPj.cjs} +2 -2
  120. package/dist/{simple-textarea-field--FWXqgy7.cjs.map → simple-textarea-field-vGYOegPj.cjs.map} +1 -1
  121. package/dist/{switch-field-aaA3hplb.mjs → switch-field-BVgtm94W.mjs} +2 -2
  122. package/dist/{switch-field-aaA3hplb.mjs.map → switch-field-BVgtm94W.mjs.map} +1 -1
  123. package/dist/{switch-field-BS8XStmz.cjs → switch-field-DPB3JDT3.cjs} +2 -2
  124. package/dist/{switch-field-BS8XStmz.cjs.map → switch-field-DPB3JDT3.cjs.map} +1 -1
  125. package/dist/tanstack-form-CKAWexet.mjs +2 -0
  126. package/dist/{tanstack-form-B6mzOylW.mjs.map → tanstack-form-CKAWexet.mjs.map} +1 -1
  127. package/dist/{tanstack-form-DU-ZKXxZ.cjs → tanstack-form-CX3lC3mC.cjs} +2 -2
  128. package/dist/{tanstack-form-DU-ZKXxZ.cjs.map → tanstack-form-CX3lC3mC.cjs.map} +1 -1
  129. package/dist/{text-editor-field-DG0c8wVs.cjs → text-editor-field-Ddvgdo_p.cjs} +2 -2
  130. package/dist/{text-editor-field-DG0c8wVs.cjs.map → text-editor-field-Ddvgdo_p.cjs.map} +1 -1
  131. package/dist/{text-editor-field-Dm2yxTUZ.mjs → text-editor-field-qa3t2GBg.mjs} +2 -2
  132. package/dist/{text-editor-field-Dm2yxTUZ.mjs.map → text-editor-field-qa3t2GBg.mjs.map} +1 -1
  133. package/dist/text-field-CBUTZKGH.mjs +2 -0
  134. package/dist/text-field-CBUTZKGH.mjs.map +1 -0
  135. package/dist/text-field-Cwu0xuXt.cjs +2 -0
  136. package/dist/text-field-Cwu0xuXt.cjs.map +1 -0
  137. package/dist/{textarea-field-f8E3HEkw.mjs → textarea-field-Ctj5o5my.mjs} +2 -2
  138. package/dist/{textarea-field-f8E3HEkw.mjs.map → textarea-field-Ctj5o5my.mjs.map} +1 -1
  139. package/dist/{textarea-field-DDPqESGM.cjs → textarea-field-jOqHJcAL.cjs} +2 -2
  140. package/dist/{textarea-field-DDPqESGM.cjs.map → textarea-field-jOqHJcAL.cjs.map} +1 -1
  141. package/dist/{title-field-CKxwzMOM.cjs → title-field-B2hM3S_S.cjs} +2 -2
  142. package/dist/{title-field-CKxwzMOM.cjs.map → title-field-B2hM3S_S.cjs.map} +1 -1
  143. package/dist/{title-field-84EnHPvl.mjs → title-field-oAqHRw59.mjs} +2 -2
  144. package/dist/{title-field-84EnHPvl.mjs.map → title-field-oAqHRw59.mjs.map} +1 -1
  145. package/dist/ui/input.d.cts +1 -1
  146. package/dist/ui/input.d.mts +1 -1
  147. package/dist/ui/inputs/search-input.d.cts +1 -1
  148. package/dist/ui/inputs/search-input.d.mts +1 -1
  149. package/dist/ui/resizable.d.cts +1 -1
  150. package/dist/ui/resizable.d.mts +1 -1
  151. package/dist/ui/status.cjs +2 -0
  152. package/dist/ui/status.cjs.map +1 -0
  153. package/dist/ui/status.d.cts +45 -0
  154. package/dist/ui/status.d.mts +45 -0
  155. package/dist/ui/status.mjs +2 -0
  156. package/dist/ui/status.mjs.map +1 -0
  157. package/package.json +5 -1
  158. package/dist/combobox-field-C9uneq5q.cjs +0 -2
  159. package/dist/combobox-field-C9uneq5q.cjs.map +0 -1
  160. package/dist/combobox-field-CLooFS0r.mjs +0 -2
  161. package/dist/combobox-field-CLooFS0r.mjs.map +0 -1
  162. package/dist/date-field-CJ7hYY8l.cjs +0 -2
  163. package/dist/date-field-CJ7hYY8l.cjs.map +0 -1
  164. package/dist/date-field-uYtNFRrJ.mjs +0 -2
  165. package/dist/date-field-uYtNFRrJ.mjs.map +0 -1
  166. package/dist/tanstack-form-B6mzOylW.mjs +0 -2
  167. package/dist/text-field-Dlbpos_A.mjs +0 -2
  168. package/dist/text-field-Dlbpos_A.mjs.map +0 -1
  169. package/dist/text-field-GIn2zAtc.cjs +0 -2
  170. package/dist/text-field-GIn2zAtc.cjs.map +0 -1
@@ -0,0 +1,45 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+
3
+ //#region packages/components/ui/status.variants.d.ts
4
+ declare const statusVariants: (props?: ({
5
+ variant?: "solid" | "soft" | "dot" | "bar" | null | undefined;
6
+ color?: "neutral" | "none" | "slate" | "gray" | "zinc" | "stone" | "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | null | undefined;
7
+ size?: "sm" | "md" | "lg" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ type StatusVariants = VariantProps<typeof statusVariants>;
10
+ //#endregion
11
+ //#region packages/components/ui/status.d.ts
12
+ /**
13
+ * Props for the `Status` component.
14
+ *
15
+ * @property variant - Visual style — `'dot'` (outlined pill with a colored dot, default), `'solid'`
16
+ * (filled pill with a colored dot), `'soft'` (tinted pill, no dot), or `'bar'` (plain text with a
17
+ * colored left accent bar, for lists/timelines).
18
+ * @property color - Full Tailwind color family, e.g. `'red'` | `'orange'` | `'green'` | `'cyan'` |
19
+ * `'blue'` | `'pink'` | ... , or `'none'` for an unset/dashed neutral state. Defaults to `'gray'`.
20
+ * @property size - `'sm'` | `'md'` (default) | `'lg'`.
21
+ */
22
+ type StatusProps = StatusVariants & React.ComponentPropsWithoutRef<'span'>;
23
+ /**
24
+ * Color-coded status indicator for pipeline/lifecycle states (e.g. lead, deal, order status).
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * import { Status } from '@customafk/lunas-ui/ui/status';
29
+ *
30
+ * <Status color="orange">Đang tư vấn</Status>
31
+ * <Status variant="soft" color="green">Đang đàm phán</Status>
32
+ * <Status variant="bar" color="pink">Hoàn tất giao dịch</Status>
33
+ * ```
34
+ */
35
+ declare function Status({
36
+ className,
37
+ variant,
38
+ color,
39
+ size,
40
+ children,
41
+ ...props
42
+ }: StatusProps): import("react").JSX.Element;
43
+ //#endregion
44
+ export { Status, StatusProps, statusVariants };
45
+ //# sourceMappingURL=status.d.cts.map
@@ -0,0 +1,45 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+
3
+ //#region packages/components/ui/status.variants.d.ts
4
+ declare const statusVariants: (props?: ({
5
+ variant?: "solid" | "soft" | "dot" | "bar" | null | undefined;
6
+ color?: "neutral" | "none" | "slate" | "gray" | "zinc" | "stone" | "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | null | undefined;
7
+ size?: "sm" | "md" | "lg" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ type StatusVariants = VariantProps<typeof statusVariants>;
10
+ //#endregion
11
+ //#region packages/components/ui/status.d.ts
12
+ /**
13
+ * Props for the `Status` component.
14
+ *
15
+ * @property variant - Visual style — `'dot'` (outlined pill with a colored dot, default), `'solid'`
16
+ * (filled pill with a colored dot), `'soft'` (tinted pill, no dot), or `'bar'` (plain text with a
17
+ * colored left accent bar, for lists/timelines).
18
+ * @property color - Full Tailwind color family, e.g. `'red'` | `'orange'` | `'green'` | `'cyan'` |
19
+ * `'blue'` | `'pink'` | ... , or `'none'` for an unset/dashed neutral state. Defaults to `'gray'`.
20
+ * @property size - `'sm'` | `'md'` (default) | `'lg'`.
21
+ */
22
+ type StatusProps = StatusVariants & React.ComponentPropsWithoutRef<'span'>;
23
+ /**
24
+ * Color-coded status indicator for pipeline/lifecycle states (e.g. lead, deal, order status).
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * import { Status } from '@customafk/lunas-ui/ui/status';
29
+ *
30
+ * <Status color="orange">Đang tư vấn</Status>
31
+ * <Status variant="soft" color="green">Đang đàm phán</Status>
32
+ * <Status variant="bar" color="pink">Hoàn tất giao dịch</Status>
33
+ * ```
34
+ */
35
+ declare function Status({
36
+ className,
37
+ variant,
38
+ color,
39
+ size,
40
+ children,
41
+ ...props
42
+ }: StatusProps): import("react").JSX.Element;
43
+ //#endregion
44
+ export { Status, StatusProps, statusVariants };
45
+ //# sourceMappingURL=status.d.mts.map
@@ -0,0 +1,2 @@
1
+ "use client";import{cn as e}from"@customafk/react-toolkit/utils";import{cva as t}from"class-variance-authority";import{jsx as n,jsxs as r}from"react/jsx-runtime";const i=t(`inline-flex w-fit items-center font-medium transition-colors duration-150`,{variants:{variant:{dot:`rounded border bg-background`,solid:`rounded text-white shadow-btn`,soft:`rounded`,bar:`gap-2 rounded-none border-l-4 pl-2`},color:{none:``,slate:``,gray:``,zinc:``,neutral:``,stone:``,red:``,orange:``,amber:``,yellow:``,lime:``,green:``,emerald:``,teal:``,cyan:``,sky:``,blue:``,indigo:``,violet:``,purple:``,fuchsia:``,pink:``,rose:``},size:{sm:`gap-1 px-1.5 py-0.5 text-[11px]`,md:`gap-1 px-2 py-0.5 text-xs`,lg:`gap-1.5 px-2.5 py-1 text-sm`}},defaultVariants:{variant:`dot`,color:`gray`,size:`md`},compoundVariants:[{variant:`dot`,color:`none`,className:`border-dashed border-gray-300 text-gray-400`},{variant:`dot`,color:`slate`,className:`border-slate-300 text-slate-700`},{variant:`dot`,color:`gray`,className:`border-gray-300 text-gray-700`},{variant:`dot`,color:`zinc`,className:`border-zinc-300 text-zinc-700`},{variant:`dot`,color:`neutral`,className:`border-neutral-300 text-neutral-700`},{variant:`dot`,color:`stone`,className:`border-stone-300 text-stone-700`},{variant:`dot`,color:`red`,className:`border-red-300 text-red-700`},{variant:`dot`,color:`orange`,className:`border-orange-300 text-orange-700`},{variant:`dot`,color:`amber`,className:`border-amber-300 text-amber-700`},{variant:`dot`,color:`yellow`,className:`border-yellow-300 text-yellow-700`},{variant:`dot`,color:`lime`,className:`border-lime-300 text-lime-700`},{variant:`dot`,color:`green`,className:`border-green-300 text-green-700`},{variant:`dot`,color:`emerald`,className:`border-emerald-300 text-emerald-700`},{variant:`dot`,color:`teal`,className:`border-teal-300 text-teal-700`},{variant:`dot`,color:`cyan`,className:`border-cyan-300 text-cyan-700`},{variant:`dot`,color:`sky`,className:`border-sky-300 text-sky-700`},{variant:`dot`,color:`blue`,className:`border-blue-300 text-blue-700`},{variant:`dot`,color:`indigo`,className:`border-indigo-300 text-indigo-700`},{variant:`dot`,color:`violet`,className:`border-violet-300 text-violet-700`},{variant:`dot`,color:`purple`,className:`border-purple-300 text-purple-700`},{variant:`dot`,color:`fuchsia`,className:`border-fuchsia-300 text-fuchsia-700`},{variant:`dot`,color:`pink`,className:`border-pink-300 text-pink-700`},{variant:`dot`,color:`rose`,className:`border-rose-300 text-rose-700`},{variant:`solid`,color:`none`,className:`border border-dashed border-gray-300 bg-transparent text-gray-400`},{variant:`solid`,color:`slate`,className:`bg-slate-500`},{variant:`solid`,color:`gray`,className:`bg-gray-500`},{variant:`solid`,color:`zinc`,className:`bg-zinc-500`},{variant:`solid`,color:`neutral`,className:`bg-neutral-500`},{variant:`solid`,color:`stone`,className:`bg-stone-500`},{variant:`solid`,color:`red`,className:`bg-red-500`},{variant:`solid`,color:`orange`,className:`bg-orange-500`},{variant:`solid`,color:`amber`,className:`bg-amber-500`},{variant:`solid`,color:`yellow`,className:`bg-yellow-500`},{variant:`solid`,color:`lime`,className:`bg-lime-500`},{variant:`solid`,color:`green`,className:`bg-green-500`},{variant:`solid`,color:`emerald`,className:`bg-emerald-500`},{variant:`solid`,color:`teal`,className:`bg-teal-500`},{variant:`solid`,color:`cyan`,className:`bg-cyan-500`},{variant:`solid`,color:`sky`,className:`bg-sky-500`},{variant:`solid`,color:`blue`,className:`bg-blue-500`},{variant:`solid`,color:`indigo`,className:`bg-indigo-500`},{variant:`solid`,color:`violet`,className:`bg-violet-500`},{variant:`solid`,color:`purple`,className:`bg-purple-500`},{variant:`solid`,color:`fuchsia`,className:`bg-fuchsia-500`},{variant:`solid`,color:`pink`,className:`bg-pink-500`},{variant:`solid`,color:`rose`,className:`bg-rose-500`},{variant:`soft`,color:`none`,className:`bg-gray-50 text-gray-400`},{variant:`soft`,color:`slate`,className:`bg-slate-100 text-slate-700`},{variant:`soft`,color:`gray`,className:`bg-gray-100 text-gray-700`},{variant:`soft`,color:`zinc`,className:`bg-zinc-100 text-zinc-700`},{variant:`soft`,color:`neutral`,className:`bg-neutral-100 text-neutral-700`},{variant:`soft`,color:`stone`,className:`bg-stone-100 text-stone-700`},{variant:`soft`,color:`red`,className:`bg-red-100 text-red-700`},{variant:`soft`,color:`orange`,className:`bg-orange-100 text-orange-700`},{variant:`soft`,color:`amber`,className:`bg-amber-100 text-amber-700`},{variant:`soft`,color:`yellow`,className:`bg-yellow-100 text-yellow-700`},{variant:`soft`,color:`lime`,className:`bg-lime-100 text-lime-700`},{variant:`soft`,color:`green`,className:`bg-green-100 text-green-700`},{variant:`soft`,color:`emerald`,className:`bg-emerald-100 text-emerald-700`},{variant:`soft`,color:`teal`,className:`bg-teal-100 text-teal-700`},{variant:`soft`,color:`cyan`,className:`bg-cyan-100 text-cyan-700`},{variant:`soft`,color:`sky`,className:`bg-sky-100 text-sky-700`},{variant:`soft`,color:`blue`,className:`bg-blue-100 text-blue-700`},{variant:`soft`,color:`indigo`,className:`bg-indigo-100 text-indigo-700`},{variant:`soft`,color:`violet`,className:`bg-violet-100 text-violet-700`},{variant:`soft`,color:`purple`,className:`bg-purple-100 text-purple-700`},{variant:`soft`,color:`fuchsia`,className:`bg-fuchsia-100 text-fuchsia-700`},{variant:`soft`,color:`pink`,className:`bg-pink-100 text-pink-700`},{variant:`soft`,color:`rose`,className:`bg-rose-100 text-rose-700`},{variant:`bar`,color:`none`,className:`border-gray-300 border-dashed text-gray-400`},{variant:`bar`,color:`slate`,className:`border-slate-500 text-slate-700`},{variant:`bar`,color:`gray`,className:`border-gray-500 text-gray-700`},{variant:`bar`,color:`zinc`,className:`border-zinc-500 text-zinc-700`},{variant:`bar`,color:`neutral`,className:`border-neutral-500 text-neutral-700`},{variant:`bar`,color:`stone`,className:`border-stone-500 text-stone-700`},{variant:`bar`,color:`red`,className:`border-red-500 text-red-700`},{variant:`bar`,color:`orange`,className:`border-orange-500 text-orange-700`},{variant:`bar`,color:`amber`,className:`border-amber-500 text-amber-700`},{variant:`bar`,color:`yellow`,className:`border-yellow-500 text-yellow-700`},{variant:`bar`,color:`lime`,className:`border-lime-500 text-lime-700`},{variant:`bar`,color:`green`,className:`border-green-500 text-green-700`},{variant:`bar`,color:`emerald`,className:`border-emerald-500 text-emerald-700`},{variant:`bar`,color:`teal`,className:`border-teal-500 text-teal-700`},{variant:`bar`,color:`cyan`,className:`border-cyan-500 text-cyan-700`},{variant:`bar`,color:`sky`,className:`border-sky-500 text-sky-700`},{variant:`bar`,color:`blue`,className:`border-blue-500 text-blue-700`},{variant:`bar`,color:`indigo`,className:`border-indigo-500 text-indigo-700`},{variant:`bar`,color:`violet`,className:`border-violet-500 text-violet-700`},{variant:`bar`,color:`purple`,className:`border-purple-500 text-purple-700`},{variant:`bar`,color:`fuchsia`,className:`border-fuchsia-500 text-fuchsia-700`},{variant:`bar`,color:`pink`,className:`border-pink-500 text-pink-700`},{variant:`bar`,color:`rose`,className:`border-rose-500 text-rose-700`}]}),a={none:`border border-dashed border-gray-300 bg-transparent`,slate:`bg-slate-500`,gray:`bg-gray-500`,zinc:`bg-zinc-500`,neutral:`bg-neutral-500`,stone:`bg-stone-500`,red:`bg-red-500`,orange:`bg-orange-500`,amber:`bg-amber-500`,yellow:`bg-yellow-500`,lime:`bg-lime-500`,green:`bg-green-500`,emerald:`bg-emerald-500`,teal:`bg-teal-500`,cyan:`bg-cyan-500`,sky:`bg-sky-500`,blue:`bg-blue-500`,indigo:`bg-indigo-500`,violet:`bg-violet-500`,purple:`bg-purple-500`,fuchsia:`bg-fuchsia-500`,pink:`bg-pink-500`,rose:`bg-rose-500`},o={none:`border border-dashed border-gray-300 bg-transparent`,slate:`bg-slate-300`,gray:`bg-gray-300`,zinc:`bg-zinc-300`,neutral:`bg-neutral-300`,stone:`bg-stone-300`,red:`bg-red-300`,orange:`bg-orange-300`,amber:`bg-amber-300`,yellow:`bg-yellow-300`,lime:`bg-lime-300`,green:`bg-green-300`,emerald:`bg-emerald-300`,teal:`bg-teal-300`,cyan:`bg-cyan-300`,sky:`bg-sky-300`,blue:`bg-blue-300`,indigo:`bg-indigo-300`,violet:`bg-violet-300`,purple:`bg-purple-300`,fuchsia:`bg-fuchsia-300`,pink:`bg-pink-300`,rose:`bg-rose-300`};function s({className:t,variant:s=`dot`,color:c=`gray`,size:l,children:u,...d}){let f=c??`gray`,p=s===`dot`||s===`solid`;return r(`span`,{className:e(i({variant:s,color:c,size:l}),t),...d,children:[p&&n(`span`,{"aria-hidden":!0,className:e(`inline-block size-1.5 shrink-0 rounded-full`,s===`solid`?o[f]:a[f])}),u]})}export{s as Status,i as statusVariants};
2
+ //# sourceMappingURL=status.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.mjs","names":[],"sources":["../../packages/components/ui/status.variants.ts","../../packages/components/ui/status.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const statusVariants = cva('inline-flex w-fit items-center font-medium transition-colors duration-150', {\n variants: {\n variant: {\n dot: 'rounded border bg-background',\n solid: 'rounded text-white shadow-btn',\n soft: 'rounded',\n bar: 'gap-2 rounded-none border-l-4 pl-2',\n },\n color: {\n none: '',\n slate: '',\n gray: '',\n zinc: '',\n neutral: '',\n stone: '',\n red: '',\n orange: '',\n amber: '',\n yellow: '',\n lime: '',\n green: '',\n emerald: '',\n teal: '',\n cyan: '',\n sky: '',\n blue: '',\n indigo: '',\n violet: '',\n purple: '',\n fuchsia: '',\n pink: '',\n rose: '',\n },\n size: {\n sm: 'gap-1 px-1.5 py-0.5 text-[11px]',\n md: 'gap-1 px-2 py-0.5 text-xs',\n lg: 'gap-1.5 px-2.5 py-1 text-sm',\n },\n },\n defaultVariants: { variant: 'dot', color: 'gray', size: 'md' },\n compoundVariants: [\n // dot — outlined pill, colored dot + colored text\n { variant: 'dot', color: 'none', className: 'border-dashed border-gray-300 text-gray-400' },\n { variant: 'dot', color: 'slate', className: 'border-slate-300 text-slate-700' },\n { variant: 'dot', color: 'gray', className: 'border-gray-300 text-gray-700' },\n { variant: 'dot', color: 'zinc', className: 'border-zinc-300 text-zinc-700' },\n { variant: 'dot', color: 'neutral', className: 'border-neutral-300 text-neutral-700' },\n { variant: 'dot', color: 'stone', className: 'border-stone-300 text-stone-700' },\n { variant: 'dot', color: 'red', className: 'border-red-300 text-red-700' },\n { variant: 'dot', color: 'orange', className: 'border-orange-300 text-orange-700' },\n { variant: 'dot', color: 'amber', className: 'border-amber-300 text-amber-700' },\n { variant: 'dot', color: 'yellow', className: 'border-yellow-300 text-yellow-700' },\n { variant: 'dot', color: 'lime', className: 'border-lime-300 text-lime-700' },\n { variant: 'dot', color: 'green', className: 'border-green-300 text-green-700' },\n { variant: 'dot', color: 'emerald', className: 'border-emerald-300 text-emerald-700' },\n { variant: 'dot', color: 'teal', className: 'border-teal-300 text-teal-700' },\n { variant: 'dot', color: 'cyan', className: 'border-cyan-300 text-cyan-700' },\n { variant: 'dot', color: 'sky', className: 'border-sky-300 text-sky-700' },\n { variant: 'dot', color: 'blue', className: 'border-blue-300 text-blue-700' },\n { variant: 'dot', color: 'indigo', className: 'border-indigo-300 text-indigo-700' },\n { variant: 'dot', color: 'violet', className: 'border-violet-300 text-violet-700' },\n { variant: 'dot', color: 'purple', className: 'border-purple-300 text-purple-700' },\n { variant: 'dot', color: 'fuchsia', className: 'border-fuchsia-300 text-fuchsia-700' },\n { variant: 'dot', color: 'pink', className: 'border-pink-300 text-pink-700' },\n { variant: 'dot', color: 'rose', className: 'border-rose-300 text-rose-700' },\n // solid — filled pill, white text\n {\n variant: 'solid',\n color: 'none',\n className: 'border border-dashed border-gray-300 bg-transparent text-gray-400',\n },\n { variant: 'solid', color: 'slate', className: 'bg-slate-500' },\n { variant: 'solid', color: 'gray', className: 'bg-gray-500' },\n { variant: 'solid', color: 'zinc', className: 'bg-zinc-500' },\n { variant: 'solid', color: 'neutral', className: 'bg-neutral-500' },\n { variant: 'solid', color: 'stone', className: 'bg-stone-500' },\n { variant: 'solid', color: 'red', className: 'bg-red-500' },\n { variant: 'solid', color: 'orange', className: 'bg-orange-500' },\n { variant: 'solid', color: 'amber', className: 'bg-amber-500' },\n { variant: 'solid', color: 'yellow', className: 'bg-yellow-500' },\n { variant: 'solid', color: 'lime', className: 'bg-lime-500' },\n { variant: 'solid', color: 'green', className: 'bg-green-500' },\n { variant: 'solid', color: 'emerald', className: 'bg-emerald-500' },\n { variant: 'solid', color: 'teal', className: 'bg-teal-500' },\n { variant: 'solid', color: 'cyan', className: 'bg-cyan-500' },\n { variant: 'solid', color: 'sky', className: 'bg-sky-500' },\n { variant: 'solid', color: 'blue', className: 'bg-blue-500' },\n { variant: 'solid', color: 'indigo', className: 'bg-indigo-500' },\n { variant: 'solid', color: 'violet', className: 'bg-violet-500' },\n { variant: 'solid', color: 'purple', className: 'bg-purple-500' },\n { variant: 'solid', color: 'fuchsia', className: 'bg-fuchsia-500' },\n { variant: 'solid', color: 'pink', className: 'bg-pink-500' },\n { variant: 'solid', color: 'rose', className: 'bg-rose-500' },\n // soft — tinted background, bold colored text, no dot\n { variant: 'soft', color: 'none', className: 'bg-gray-50 text-gray-400' },\n { variant: 'soft', color: 'slate', className: 'bg-slate-100 text-slate-700' },\n { variant: 'soft', color: 'gray', className: 'bg-gray-100 text-gray-700' },\n { variant: 'soft', color: 'zinc', className: 'bg-zinc-100 text-zinc-700' },\n { variant: 'soft', color: 'neutral', className: 'bg-neutral-100 text-neutral-700' },\n { variant: 'soft', color: 'stone', className: 'bg-stone-100 text-stone-700' },\n { variant: 'soft', color: 'red', className: 'bg-red-100 text-red-700' },\n { variant: 'soft', color: 'orange', className: 'bg-orange-100 text-orange-700' },\n { variant: 'soft', color: 'amber', className: 'bg-amber-100 text-amber-700' },\n { variant: 'soft', color: 'yellow', className: 'bg-yellow-100 text-yellow-700' },\n { variant: 'soft', color: 'lime', className: 'bg-lime-100 text-lime-700' },\n { variant: 'soft', color: 'green', className: 'bg-green-100 text-green-700' },\n { variant: 'soft', color: 'emerald', className: 'bg-emerald-100 text-emerald-700' },\n { variant: 'soft', color: 'teal', className: 'bg-teal-100 text-teal-700' },\n { variant: 'soft', color: 'cyan', className: 'bg-cyan-100 text-cyan-700' },\n { variant: 'soft', color: 'sky', className: 'bg-sky-100 text-sky-700' },\n { variant: 'soft', color: 'blue', className: 'bg-blue-100 text-blue-700' },\n { variant: 'soft', color: 'indigo', className: 'bg-indigo-100 text-indigo-700' },\n { variant: 'soft', color: 'violet', className: 'bg-violet-100 text-violet-700' },\n { variant: 'soft', color: 'purple', className: 'bg-purple-100 text-purple-700' },\n { variant: 'soft', color: 'fuchsia', className: 'bg-fuchsia-100 text-fuchsia-700' },\n { variant: 'soft', color: 'pink', className: 'bg-pink-100 text-pink-700' },\n { variant: 'soft', color: 'rose', className: 'bg-rose-100 text-rose-700' },\n // bar — plain text with a colored left accent bar, for lists/timelines\n { variant: 'bar', color: 'none', className: 'border-gray-300 border-dashed text-gray-400' },\n { variant: 'bar', color: 'slate', className: 'border-slate-500 text-slate-700' },\n { variant: 'bar', color: 'gray', className: 'border-gray-500 text-gray-700' },\n { variant: 'bar', color: 'zinc', className: 'border-zinc-500 text-zinc-700' },\n { variant: 'bar', color: 'neutral', className: 'border-neutral-500 text-neutral-700' },\n { variant: 'bar', color: 'stone', className: 'border-stone-500 text-stone-700' },\n { variant: 'bar', color: 'red', className: 'border-red-500 text-red-700' },\n { variant: 'bar', color: 'orange', className: 'border-orange-500 text-orange-700' },\n { variant: 'bar', color: 'amber', className: 'border-amber-500 text-amber-700' },\n { variant: 'bar', color: 'yellow', className: 'border-yellow-500 text-yellow-700' },\n { variant: 'bar', color: 'lime', className: 'border-lime-500 text-lime-700' },\n { variant: 'bar', color: 'green', className: 'border-green-500 text-green-700' },\n { variant: 'bar', color: 'emerald', className: 'border-emerald-500 text-emerald-700' },\n { variant: 'bar', color: 'teal', className: 'border-teal-500 text-teal-700' },\n { variant: 'bar', color: 'cyan', className: 'border-cyan-500 text-cyan-700' },\n { variant: 'bar', color: 'sky', className: 'border-sky-500 text-sky-700' },\n { variant: 'bar', color: 'blue', className: 'border-blue-500 text-blue-700' },\n { variant: 'bar', color: 'indigo', className: 'border-indigo-500 text-indigo-700' },\n { variant: 'bar', color: 'violet', className: 'border-violet-500 text-violet-700' },\n { variant: 'bar', color: 'purple', className: 'border-purple-500 text-purple-700' },\n { variant: 'bar', color: 'fuchsia', className: 'border-fuchsia-500 text-fuchsia-700' },\n { variant: 'bar', color: 'pink', className: 'border-pink-500 text-pink-700' },\n { variant: 'bar', color: 'rose', className: 'border-rose-500 text-rose-700' },\n ],\n});\n\nexport type StatusVariants = VariantProps<typeof statusVariants>;\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { type StatusVariants, statusVariants } from './status.variants';\n\nconst dotColorMap: Record<NonNullable<StatusVariants['color']>, string> = {\n none: 'border border-dashed border-gray-300 bg-transparent',\n slate: 'bg-slate-500',\n gray: 'bg-gray-500',\n zinc: 'bg-zinc-500',\n neutral: 'bg-neutral-500',\n stone: 'bg-stone-500',\n red: 'bg-red-500',\n orange: 'bg-orange-500',\n amber: 'bg-amber-500',\n yellow: 'bg-yellow-500',\n lime: 'bg-lime-500',\n green: 'bg-green-500',\n emerald: 'bg-emerald-500',\n teal: 'bg-teal-500',\n cyan: 'bg-cyan-500',\n sky: 'bg-sky-500',\n blue: 'bg-blue-500',\n indigo: 'bg-indigo-500',\n violet: 'bg-violet-500',\n purple: 'bg-purple-500',\n fuchsia: 'bg-fuchsia-500',\n pink: 'bg-pink-500',\n rose: 'bg-rose-500',\n};\n\nconst solidDotColorMap: Record<NonNullable<StatusVariants['color']>, string> = {\n none: 'border border-dashed border-gray-300 bg-transparent',\n slate: 'bg-slate-300',\n gray: 'bg-gray-300',\n zinc: 'bg-zinc-300',\n neutral: 'bg-neutral-300',\n stone: 'bg-stone-300',\n red: 'bg-red-300',\n orange: 'bg-orange-300',\n amber: 'bg-amber-300',\n yellow: 'bg-yellow-300',\n lime: 'bg-lime-300',\n green: 'bg-green-300',\n emerald: 'bg-emerald-300',\n teal: 'bg-teal-300',\n cyan: 'bg-cyan-300',\n sky: 'bg-sky-300',\n blue: 'bg-blue-300',\n indigo: 'bg-indigo-300',\n violet: 'bg-violet-300',\n purple: 'bg-purple-300',\n fuchsia: 'bg-fuchsia-300',\n pink: 'bg-pink-300',\n rose: 'bg-rose-300',\n};\n\n/**\n * Props for the `Status` component.\n *\n * @property variant - Visual style — `'dot'` (outlined pill with a colored dot, default), `'solid'`\n * (filled pill with a colored dot), `'soft'` (tinted pill, no dot), or `'bar'` (plain text with a\n * colored left accent bar, for lists/timelines).\n * @property color - Full Tailwind color family, e.g. `'red'` | `'orange'` | `'green'` | `'cyan'` |\n * `'blue'` | `'pink'` | ... , or `'none'` for an unset/dashed neutral state. Defaults to `'gray'`.\n * @property size - `'sm'` | `'md'` (default) | `'lg'`.\n */\nexport type StatusProps = StatusVariants & React.ComponentPropsWithoutRef<'span'>;\n\n/**\n * Color-coded status indicator for pipeline/lifecycle states (e.g. lead, deal, order status).\n *\n * @example\n * ```tsx\n * import { Status } from '@customafk/lunas-ui/ui/status';\n *\n * <Status color=\"orange\">Đang tư vấn</Status>\n * <Status variant=\"soft\" color=\"green\">Đang đàm phán</Status>\n * <Status variant=\"bar\" color=\"pink\">Hoàn tất giao dịch</Status>\n * ```\n */\nfunction Status({ className, variant = 'dot', color = 'gray', size, children, ...props }: StatusProps) {\n const resolvedColor = color ?? 'gray';\n const showDot = variant === 'dot' || variant === 'solid';\n\n return (\n <span className={cn(statusVariants({ variant, color, size }), className)} {...props}>\n {showDot && (\n <span\n aria-hidden\n className={cn('inline-block size-1.5 shrink-0 rounded-full', variant === 'solid' ? solidDotColorMap[resolvedColor] : dotColorMap[resolvedColor])}\n />\n )}\n {children}\n </span>\n );\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport { Status, statusVariants };\n"],"mappings":"kKAEA,MAAa,EAAiB,EAAI,4EAA6E,CAC7G,SAAU,CACR,QAAS,CACP,IAAK,+BACL,MAAO,gCACP,KAAM,UACN,IAAK,oCACP,EACA,MAAO,CACL,KAAM,GACN,MAAO,GACP,KAAM,GACN,KAAM,GACN,QAAS,GACT,MAAO,GACP,IAAK,GACL,OAAQ,GACR,MAAO,GACP,OAAQ,GACR,KAAM,GACN,MAAO,GACP,QAAS,GACT,KAAM,GACN,KAAM,GACN,IAAK,GACL,KAAM,GACN,OAAQ,GACR,OAAQ,GACR,OAAQ,GACR,QAAS,GACT,KAAM,GACN,KAAM,EACR,EACA,KAAM,CACJ,GAAI,kCACJ,GAAI,4BACJ,GAAI,6BACN,CACF,EACA,gBAAiB,CAAE,QAAS,MAAO,MAAO,OAAQ,KAAM,IAAK,EAC7D,iBAAkB,CAEhB,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,6CAA8C,EAC1F,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,MAAO,UAAW,6BAA8B,EACzE,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,MAAO,UAAW,6BAA8B,EACzE,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAE5E,CACE,QAAS,QACT,MAAO,OACP,UAAW,mEACb,EACA,CAAE,QAAS,QAAS,MAAO,QAAS,UAAW,cAAe,EAC9D,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,UAAW,UAAW,gBAAiB,EAClE,CAAE,QAAS,QAAS,MAAO,QAAS,UAAW,cAAe,EAC9D,CAAE,QAAS,QAAS,MAAO,MAAO,UAAW,YAAa,EAC1D,CAAE,QAAS,QAAS,MAAO,SAAU,UAAW,eAAgB,EAChE,CAAE,QAAS,QAAS,MAAO,QAAS,UAAW,cAAe,EAC9D,CAAE,QAAS,QAAS,MAAO,SAAU,UAAW,eAAgB,EAChE,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,QAAS,UAAW,cAAe,EAC9D,CAAE,QAAS,QAAS,MAAO,UAAW,UAAW,gBAAiB,EAClE,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,MAAO,UAAW,YAAa,EAC1D,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,SAAU,UAAW,eAAgB,EAChE,CAAE,QAAS,QAAS,MAAO,SAAU,UAAW,eAAgB,EAChE,CAAE,QAAS,QAAS,MAAO,SAAU,UAAW,eAAgB,EAChE,CAAE,QAAS,QAAS,MAAO,UAAW,UAAW,gBAAiB,EAClE,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAC5D,CAAE,QAAS,QAAS,MAAO,OAAQ,UAAW,aAAc,EAE5D,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,0BAA2B,EACxE,CAAE,QAAS,OAAQ,MAAO,QAAS,UAAW,6BAA8B,EAC5E,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,UAAW,UAAW,iCAAkC,EAClF,CAAE,QAAS,OAAQ,MAAO,QAAS,UAAW,6BAA8B,EAC5E,CAAE,QAAS,OAAQ,MAAO,MAAO,UAAW,yBAA0B,EACtE,CAAE,QAAS,OAAQ,MAAO,SAAU,UAAW,+BAAgC,EAC/E,CAAE,QAAS,OAAQ,MAAO,QAAS,UAAW,6BAA8B,EAC5E,CAAE,QAAS,OAAQ,MAAO,SAAU,UAAW,+BAAgC,EAC/E,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,QAAS,UAAW,6BAA8B,EAC5E,CAAE,QAAS,OAAQ,MAAO,UAAW,UAAW,iCAAkC,EAClF,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,MAAO,UAAW,yBAA0B,EACtE,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,SAAU,UAAW,+BAAgC,EAC/E,CAAE,QAAS,OAAQ,MAAO,SAAU,UAAW,+BAAgC,EAC/E,CAAE,QAAS,OAAQ,MAAO,SAAU,UAAW,+BAAgC,EAC/E,CAAE,QAAS,OAAQ,MAAO,UAAW,UAAW,iCAAkC,EAClF,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EACzE,CAAE,QAAS,OAAQ,MAAO,OAAQ,UAAW,2BAA4B,EAEzE,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,6CAA8C,EAC1F,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,MAAO,UAAW,6BAA8B,EACzE,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,QAAS,UAAW,iCAAkC,EAC/E,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,MAAO,UAAW,6BAA8B,EACzE,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,SAAU,UAAW,mCAAoC,EAClF,CAAE,QAAS,MAAO,MAAO,UAAW,UAAW,qCAAsC,EACrF,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,EAC5E,CAAE,QAAS,MAAO,MAAO,OAAQ,UAAW,+BAAgC,CAC9E,CACF,CAAC,EC1IK,EAAoE,CACxE,KAAM,sDACN,MAAO,eACP,KAAM,cACN,KAAM,cACN,QAAS,iBACT,MAAO,eACP,IAAK,aACL,OAAQ,gBACR,MAAO,eACP,OAAQ,gBACR,KAAM,cACN,MAAO,eACP,QAAS,iBACT,KAAM,cACN,KAAM,cACN,IAAK,aACL,KAAM,cACN,OAAQ,gBACR,OAAQ,gBACR,OAAQ,gBACR,QAAS,iBACT,KAAM,cACN,KAAM,aACR,EAEM,EAAyE,CAC7E,KAAM,sDACN,MAAO,eACP,KAAM,cACN,KAAM,cACN,QAAS,iBACT,MAAO,eACP,IAAK,aACL,OAAQ,gBACR,MAAO,eACP,OAAQ,gBACR,KAAM,cACN,MAAO,eACP,QAAS,iBACT,KAAM,cACN,KAAM,cACN,IAAK,aACL,KAAM,cACN,OAAQ,gBACR,OAAQ,gBACR,OAAQ,gBACR,QAAS,iBACT,KAAM,cACN,KAAM,aACR,EA0BA,SAAS,EAAO,CAAE,YAAW,UAAU,MAAO,QAAQ,OAAQ,OAAM,WAAU,GAAG,GAAsB,CACrG,IAAM,EAAgB,GAAS,OACzB,EAAU,IAAY,OAAS,IAAY,QAEjD,OACE,EAAC,OAAD,CAAM,UAAW,EAAG,EAAe,CAAE,UAAS,QAAO,MAAK,CAAC,EAAG,CAAS,EAAG,GAAI,WAA9E,CACG,GACC,EAAC,OAAD,CACE,cAAA,GACA,UAAW,EAAG,8CAA+C,IAAY,QAAU,EAAiB,GAAiB,EAAY,EAAc,CAChJ,CAAA,EAEF,CACG,GAEV"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@customafk/lunas-ui",
3
- "version": "0.2.70",
3
+ "version": "0.2.72",
4
4
  "description": "UI library for Lunas Enterprise",
5
5
  "type": "module",
6
6
  "author": {
@@ -392,6 +392,10 @@
392
392
  "require": "./dist/ui/spinner.cjs",
393
393
  "import": "./dist/ui/spinner.mjs"
394
394
  },
395
+ "./ui/status": {
396
+ "require": "./dist/ui/status.cjs",
397
+ "import": "./dist/ui/status.mjs"
398
+ },
395
399
  "./ui/switch": {
396
400
  "require": "./dist/ui/switch.cjs",
397
401
  "import": "./dist/ui/switch.mjs"
@@ -1,2 +0,0 @@
1
- const e=require("./ui/button.cjs"),t=require("./ui/dialog.cjs"),n=require("./ui/command.cjs"),r=require("./tanstack-form-DU-ZKXxZ.cjs"),i=require("./ui/popover.cjs"),a=require("./field-BV5twmKA.cjs");let o=require("lucide-react"),s=require("react"),c=require("@customafk/react-toolkit/utils"),l=require("react/jsx-runtime"),u=require("radix-ui"),d=require("@customafk/react-toolkit/hooks/useMobile"),f=require("@tanstack/react-form");const p=(0,s.memo)(({label:p,description:m,placeholder:h,tooltip:g,helperText:_,orientation:v=`responsive`,options:y,required:b=!1,disabled:x=!1,clearable:S=!1,showErrorMessage:C=!0,modal:w})=>{let T=(0,s.useId)(),E=r.G(),D=(0,d.useIsMobile)(),[O,k]=(0,s.useState)(!1),[A,j]=(0,s.useState)(!1),M=(0,f.useStore)(E.form.store,({isSubmitting:e})=>e),N=x||M,P=E.state.meta.isDirty||E.state.meta.isTouched,F=P&&!E.state.meta.isValid,I=b&&E.state.value===null,L=S&&!!E.state.value&&!N,R=y.find(({value:e})=>e===E.state.value)?.label,z=()=>{E.handleChange(null),E.handleBlur()},B=t=>(0,l.jsx)(e.Button,{variant:`outline`,color:`muted`,size:`lg`,disabled:N,"aria-invalid":F?!0:void 0,"aria-describedby":T,className:(0,c.cn)(`flex w-full items-center justify-start rounded outline-border`,`hover:bg-transparent`,`focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,L&&`pr-8`,!E.state.value&&`text-text-positive-muted`,F&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),onClick:t,children:R?(0,l.jsx)(`p`,{className:`flex min-w-0 flex-1 items-center gap-2 truncate text-start`,children:R}):(0,l.jsx)(`p`,{className:`flex-1 text-start text-text-positive-muted`,children:h})}),V=e=>(0,l.jsxs)(n.Command,{className:`border-none`,children:[(0,l.jsx)(n.CommandInput,{placeholder:h??`Tìm kiếm…`}),(0,l.jsxs)(n.CommandList,{children:[(0,l.jsx)(n.CommandEmpty,{className:`flex min-h-30 items-center justify-center text-sm text-text-positive-weak`,children:`Không tìm thấy kết quả nào phù hợp.`}),(0,l.jsx)(n.CommandGroup,{className:`max-h-60 overflow-y-auto`,children:y.map(({value:t,label:r})=>(0,l.jsx)(n.CommandItem,{value:r,onSelect:()=>e(t),children:r},t))})]})]});return(0,l.jsxs)(a.FieldGroup,{className:`gap-y-4 px-4`,children:[(0,l.jsxs)(a.Field,{orientation:v,"data-invalid":F,children:[(0,l.jsxs)(a.FieldContent,{children:[(0,l.jsxs)(a.FieldLabel,{"aria-required":I,htmlFor:E.name,children:[p,g&&(0,l.jsx)(a.FieldTooltip,{tooltip:g})]}),(0,l.jsx)(a.FieldDescription,{children:m})]}),(0,l.jsx)(a.FieldContentMain,{className:`flex justify-end`,children:(0,l.jsxs)(`div`,{className:`flex w-full flex-col`,children:[(0,l.jsxs)(`div`,{className:`relative`,children:[D?(0,l.jsxs)(l.Fragment,{children:[B(()=>k(!0)),(0,l.jsx)(t.Dialog,{open:O,onOpenChange:e=>{k(e),e||E.handleBlur()},children:(0,l.jsxs)(t.DialogPortal,{children:[(0,l.jsx)(t.DialogOverlay,{}),(0,l.jsxs)(u.Dialog.Content,{onOpenAutoFocus:e=>e.preventDefault(),className:(0,c.cn)(`fixed inset-x-0 bottom-0 z-50`,`flex flex-col bg-background rounded-t-2xl outline-none`,`max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]`,`data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0`,`data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0`,`duration-300`),children:[(0,l.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-b border-border shrink-0`,children:[(0,l.jsx)(`span`,{className:`font-semibold text-sm text-text-positive`,children:p}),(0,l.jsx)(t.DialogClose,{asChild:!0,children:(0,l.jsx)(`button`,{type:`button`,"aria-label":`Đóng`,className:`flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive`,children:(0,l.jsx)(o.XIcon,{size:16})})})]}),(0,l.jsxs)(`div`,{className:`flex flex-col overflow-y-auto`,children:[L&&(0,l.jsx)(t.DialogClose,{asChild:!0,children:(0,l.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle`,onClick:z,children:[(0,l.jsx)(o.XIcon,{size:14}),`Xóa lựa chọn`]})}),V(e=>{E.handleChange(e),k(!1),E.handleBlur()})]}),(0,l.jsx)(`div`,{className:`shrink-0 h-safe-bottom`})]})]})})]}):(0,l.jsxs)(i.Popover,{open:A,modal:w,onOpenChange:e=>{j(e),e||E.handleBlur()},children:[(0,l.jsx)(i.PopoverTrigger,{asChild:!0,children:B()}),(0,l.jsx)(i.PopoverContent,{align:`end`,side:`bottom`,className:`flex w-fit rounded p-0`,children:V(e=>{E.handleChange(e),j(!1),E.handleBlur()})})]}),L&&(0,l.jsx)(`button`,{type:`button`,"aria-label":`Xóa lựa chọn`,className:`absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:z,children:(0,l.jsx)(o.XIcon,{"aria-hidden":`true`})})]}),P&&C&&(0,l.jsx)(a.FieldError,{id:T,className:`mt-1`,errors:E.state.meta.errors}),(0,l.jsx)(a.FieldNote,{isShow:!!_,children:_})]})})]}),(0,l.jsx)(a.FieldSeparator,{})]})});p.displayName=`ComboboxField`,exports.ComboboxField=p;
2
- //# sourceMappingURL=combobox-field-C9uneq5q.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-field-C9uneq5q.cjs","names":["useTanStackFieldContext","Button","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","FieldGroup","Field","FieldContent","FieldLabel","FieldTooltip","FieldDescription","FieldContentMain","Dialog","DialogPortal","DialogOverlay","RadixDialog","DialogClose","XIcon","Popover","PopoverTrigger","PopoverContent","FieldError","FieldNote","FieldSeparator"],"sources":["../packages/components/features/tanstack-form/components/fields/combobox-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { XIcon } from 'lucide-react';\n\nimport { Dialog as RadixDialog } from 'radix-ui';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Dialog, DialogClose, DialogOverlay, DialogPortal } from '@/components/ui/dialog';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { ComboboxFieldProps } from '../../types';\n\nexport const ComboboxField = memo<ComboboxFieldProps>(\n ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n options,\n required = false,\n disabled = false,\n clearable = false,\n showErrorMessage = true,\n modal,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<string | null>();\n const isMobile = useIsMobile();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _invalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _showClear = clearable && !!field.state.value && !isDisabled;\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n const onClear = () => {\n field.handleChange(null);\n field.handleBlur();\n };\n\n const triggerButton = (onClick?: () => void) => (\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_invalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex w-full items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n _showClear && 'pr-8',\n !field.state.value && 'text-text-positive-muted',\n _invalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n onClick={onClick}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 truncate text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n );\n\n const renderCommandList = (onSelect: (value: string) => void) => (\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Tìm kiếm…'} />\n <CommandList>\n <CommandEmpty className=\"flex min-h-30 items-center justify-center text-sm text-text-positive-weak\">Không tìm thấy kết quả nào phù hợp.</CommandEmpty>\n <CommandGroup className=\"max-h-60 overflow-y-auto\">\n {options.map(({ value, label: optLabel }) => (\n <CommandItem key={value} value={optLabel} onSelect={() => onSelect(value)}>\n {optLabel}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full flex-col\">\n <div className=\"relative\">\n {isMobile ? (\n <>\n {triggerButton(() => setDialogOpen(true))}\n <Dialog\n open={dialogOpen}\n onOpenChange={open => {\n setDialogOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n onOpenAutoFocus={e => e.preventDefault()}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50',\n 'flex flex-col bg-background rounded-t-2xl outline-none',\n 'max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0',\n 'duration-300'\n )}\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border shrink-0\">\n <span className=\"font-semibold text-sm text-text-positive\">{label}</span>\n <DialogClose asChild>\n <button\n type=\"button\"\n aria-label=\"Đóng\"\n className=\"flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive\"\n >\n <XIcon size={16} />\n </button>\n </DialogClose>\n </div>\n\n <div className=\"flex flex-col overflow-y-auto\">\n {_showClear && (\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle\"\n onClick={onClear}\n >\n <XIcon size={14} />\n Xóa lựa chọn\n </button>\n </DialogClose>\n )}\n {renderCommandList(value => {\n field.handleChange(value);\n setDialogOpen(false);\n field.handleBlur();\n })}\n </div>\n\n <div className=\"shrink-0 h-safe-bottom\" />\n </RadixDialog.Content>\n </DialogPortal>\n </Dialog>\n </>\n ) : (\n <Popover\n open={popoverOpen}\n modal={modal}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>{triggerButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\">\n {renderCommandList(value => {\n field.handleChange(value);\n setPopoverOpen(false);\n field.handleBlur();\n })}\n </PopoverContent>\n </Popover>\n )}\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Xóa lựa chọn\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nComboboxField.displayName = 'ComboboxField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Button as e}from"./ui/button.mjs";import{Dialog as t,DialogClose as n,DialogOverlay as ee,DialogPortal as te}from"./ui/dialog.mjs";import{Command as r,CommandEmpty as i,CommandGroup as a,CommandInput as o,CommandItem as s,CommandList as ne}from"./ui/command.mjs";import{G as re}from"./tanstack-form-B6mzOylW.mjs";import{Popover as ie,PopoverContent as c,PopoverTrigger as l}from"./ui/popover.mjs";import{Field as u,FieldContent as d,FieldContentMain as f,FieldDescription as p,FieldError as m,FieldGroup as h,FieldLabel as g,FieldNote as ae,FieldSeparator as oe,FieldTooltip as se}from"./field-BKyUqvzh.mjs";import{XIcon as _}from"lucide-react";import{memo as v,useId as y,useState as b}from"react";import{cn as x}from"@customafk/react-toolkit/utils";import{Fragment as S,jsx as C,jsxs as w}from"react/jsx-runtime";import{Dialog as T}from"radix-ui";import{useIsMobile as E}from"@customafk/react-toolkit/hooks/useMobile";import{useStore as D}from"@tanstack/react-form";const O=v(({label:v,description:O,placeholder:k,tooltip:A,helperText:j,orientation:M=`responsive`,options:N,required:P=!1,disabled:ce=!1,clearable:F=!1,showErrorMessage:I=!0,modal:L})=>{let R=y(),z=re(),B=E(),[V,H]=b(!1),[U,W]=b(!1),G=D(z.form.store,({isSubmitting:e})=>e),K=ce||G,q=z.state.meta.isDirty||z.state.meta.isTouched,J=q&&!z.state.meta.isValid,le=P&&z.state.value===null,Y=F&&!!z.state.value&&!K,X=N.find(({value:e})=>e===z.state.value)?.label,Z=()=>{z.handleChange(null),z.handleBlur()},Q=t=>C(e,{variant:`outline`,color:`muted`,size:`lg`,disabled:K,"aria-invalid":J?!0:void 0,"aria-describedby":R,className:x(`flex w-full items-center justify-start rounded outline-border`,`hover:bg-transparent`,`focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,Y&&`pr-8`,!z.state.value&&`text-text-positive-muted`,J&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),onClick:t,children:X?C(`p`,{className:`flex min-w-0 flex-1 items-center gap-2 truncate text-start`,children:X}):C(`p`,{className:`flex-1 text-start text-text-positive-muted`,children:k})}),$=e=>w(r,{className:`border-none`,children:[C(o,{placeholder:k??`Tìm kiếm…`}),w(ne,{children:[C(i,{className:`flex min-h-30 items-center justify-center text-sm text-text-positive-weak`,children:`Không tìm thấy kết quả nào phù hợp.`}),C(a,{className:`max-h-60 overflow-y-auto`,children:N.map(({value:t,label:n})=>C(s,{value:n,onSelect:()=>e(t),children:n},t))})]})]});return w(h,{className:`gap-y-4 px-4`,children:[w(u,{orientation:M,"data-invalid":J,children:[w(d,{children:[w(g,{"aria-required":le,htmlFor:z.name,children:[v,A&&C(se,{tooltip:A})]}),C(p,{children:O})]}),C(f,{className:`flex justify-end`,children:w(`div`,{className:`flex w-full flex-col`,children:[w(`div`,{className:`relative`,children:[B?w(S,{children:[Q(()=>H(!0)),C(t,{open:V,onOpenChange:e=>{H(e),e||z.handleBlur()},children:w(te,{children:[C(ee,{}),w(T.Content,{onOpenAutoFocus:e=>e.preventDefault(),className:x(`fixed inset-x-0 bottom-0 z-50`,`flex flex-col bg-background rounded-t-2xl outline-none`,`max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]`,`data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0`,`data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0`,`duration-300`),children:[w(`div`,{className:`flex items-center justify-between px-4 py-3 border-b border-border shrink-0`,children:[C(`span`,{className:`font-semibold text-sm text-text-positive`,children:v}),C(n,{asChild:!0,children:C(`button`,{type:`button`,"aria-label":`Đóng`,className:`flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive`,children:C(_,{size:16})})})]}),w(`div`,{className:`flex flex-col overflow-y-auto`,children:[Y&&C(n,{asChild:!0,children:w(`button`,{type:`button`,className:`flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle`,onClick:Z,children:[C(_,{size:14}),`Xóa lựa chọn`]})}),$(e=>{z.handleChange(e),H(!1),z.handleBlur()})]}),C(`div`,{className:`shrink-0 h-safe-bottom`})]})]})})]}):w(ie,{open:U,modal:L,onOpenChange:e=>{W(e),e||z.handleBlur()},children:[C(l,{asChild:!0,children:Q()}),C(c,{align:`end`,side:`bottom`,className:`flex w-fit rounded p-0`,children:$(e=>{z.handleChange(e),W(!1),z.handleBlur()})})]}),Y&&C(`button`,{type:`button`,"aria-label":`Xóa lựa chọn`,className:`absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:Z,children:C(_,{"aria-hidden":`true`})})]}),q&&I&&C(m,{id:R,className:`mt-1`,errors:z.state.meta.errors}),C(ae,{isShow:!!j,children:j})]})})]}),C(oe,{})]})});O.displayName=`ComboboxField`;export{O as ComboboxField};
2
- //# sourceMappingURL=combobox-field-CLooFS0r.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-field-CLooFS0r.mjs","names":["Dialog","RadixDialog","Popover"],"sources":["../packages/components/features/tanstack-form/components/fields/combobox-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { XIcon } from 'lucide-react';\n\nimport { Dialog as RadixDialog } from 'radix-ui';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Dialog, DialogClose, DialogOverlay, DialogPortal } from '@/components/ui/dialog';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { ComboboxFieldProps } from '../../types';\n\nexport const ComboboxField = memo<ComboboxFieldProps>(\n ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n options,\n required = false,\n disabled = false,\n clearable = false,\n showErrorMessage = true,\n modal,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<string | null>();\n const isMobile = useIsMobile();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _invalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _showClear = clearable && !!field.state.value && !isDisabled;\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n const onClear = () => {\n field.handleChange(null);\n field.handleBlur();\n };\n\n const triggerButton = (onClick?: () => void) => (\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_invalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex w-full items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n _showClear && 'pr-8',\n !field.state.value && 'text-text-positive-muted',\n _invalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n onClick={onClick}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 truncate text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n );\n\n const renderCommandList = (onSelect: (value: string) => void) => (\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Tìm kiếm…'} />\n <CommandList>\n <CommandEmpty className=\"flex min-h-30 items-center justify-center text-sm text-text-positive-weak\">Không tìm thấy kết quả nào phù hợp.</CommandEmpty>\n <CommandGroup className=\"max-h-60 overflow-y-auto\">\n {options.map(({ value, label: optLabel }) => (\n <CommandItem key={value} value={optLabel} onSelect={() => onSelect(value)}>\n {optLabel}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full flex-col\">\n <div className=\"relative\">\n {isMobile ? (\n <>\n {triggerButton(() => setDialogOpen(true))}\n <Dialog\n open={dialogOpen}\n onOpenChange={open => {\n setDialogOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n onOpenAutoFocus={e => e.preventDefault()}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50',\n 'flex flex-col bg-background rounded-t-2xl outline-none',\n 'max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0',\n 'duration-300'\n )}\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border shrink-0\">\n <span className=\"font-semibold text-sm text-text-positive\">{label}</span>\n <DialogClose asChild>\n <button\n type=\"button\"\n aria-label=\"Đóng\"\n className=\"flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive\"\n >\n <XIcon size={16} />\n </button>\n </DialogClose>\n </div>\n\n <div className=\"flex flex-col overflow-y-auto\">\n {_showClear && (\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle\"\n onClick={onClear}\n >\n <XIcon size={14} />\n Xóa lựa chọn\n </button>\n </DialogClose>\n )}\n {renderCommandList(value => {\n field.handleChange(value);\n setDialogOpen(false);\n field.handleBlur();\n })}\n </div>\n\n <div className=\"shrink-0 h-safe-bottom\" />\n </RadixDialog.Content>\n </DialogPortal>\n </Dialog>\n </>\n ) : (\n <Popover\n open={popoverOpen}\n modal={modal}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>{triggerButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\">\n {renderCommandList(value => {\n field.handleChange(value);\n setPopoverOpen(false);\n field.handleBlur();\n })}\n </PopoverContent>\n </Popover>\n )}\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Xóa lựa chọn\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nComboboxField.displayName = 'ComboboxField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=require("./ui/button.cjs"),t=require("./tanstack-form-DU-ZKXxZ.cjs"),n=require("./ui/popover.cjs"),r=require("./ui/calendar.cjs"),i=require("./field-BV5twmKA.cjs");let a=require("lucide-react"),o=require("react"),s=require("@customafk/react-toolkit/utils"),c=require("react/jsx-runtime"),l=require("@customafk/react-toolkit/date-fns"),u=require("@tanstack/react-form");const d=(0,o.memo)(({label:d,description:f,placeholder:p,orientation:m=`responsive`,tooltip:h,helperText:g,showErrorMessage:_=!0,required:v=!1,disabled:y=!1,minDate:b,maxDate:x})=>{let S=(0,o.useId)(),C=t.G(),[w,T]=(0,o.useState)(!1),E=(0,u.useStore)(C.form.store,({isSubmitting:e})=>e),D=y||E,O=C.state.meta.isDirty||C.state.meta.isTouched,k=O&&!C.state.meta.isValid,A=v&&C.state.value===null,j=e=>{C.handleChange(e),T(!1)};return(0,c.jsxs)(i.FieldGroup,{className:`px-4`,children:[(0,c.jsxs)(i.Field,{orientation:m,"data-invalid":k,children:[(0,c.jsxs)(i.FieldContent,{children:[(0,c.jsxs)(i.FieldLabel,{htmlFor:C.name,"aria-required":A,children:[d,h&&(0,c.jsx)(i.FieldTooltip,{tooltip:h})]}),(0,c.jsx)(i.FieldDescription,{children:f})]}),(0,c.jsx)(i.FieldContentMain,{className:`flex flex-col space-y-1`,children:(0,c.jsxs)(`div`,{className:`flex w-full flex-col`,children:[(0,c.jsxs)(n.Popover,{open:w,onOpenChange:e=>{T(e),e||C.handleBlur()},children:[(0,c.jsx)(n.PopoverTrigger,{asChild:!0,children:(0,c.jsxs)(e.Button,{variant:`outline`,color:`muted`,size:`lg`,disabled:D,"aria-invalid":k?!0:void 0,"aria-describedby":S,className:(0,s.cn)(`flex items-center justify-between rounded font-normal outline-border`,`hover:bg-transparent`,`focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak`,`data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,C.state.value===null&&`text-text-positive-muted`,k&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),children:[(0,c.jsx)(`p`,{children:C.state.value===null?p??`Select date`:(0,l.format)(C.state.value,`PPPP`)}),(0,c.jsx)(a.CalendarDaysIcon,{strokeWidth:1})]})}),(0,c.jsxs)(n.PopoverContent,{align:`start`,side:`bottom`,className:`flex w-fit min-w-0 overflow-y-auto rounded p-0`,children:[(0,c.jsxs)(`div`,{className:`flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm`,children:[(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.endOfToday)()),children:`Hôm nay`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.endOfTomorrow)()),children:`Ngày mai`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.endOfYesterday)()),children:`Hôm qua`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.subDays)((0,l.endOfToday)(),3)),children:`3 ngày qua`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.subDays)((0,l.endOfToday)(),7)),children:`7 ngày qua`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.subDays)((0,l.endOfToday)(),30)),children:`30 ngày qua`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.startOfMonth)((0,l.endOfToday)())),children:`Tháng này`}),(0,c.jsx)(e.Button,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>j((0,l.lastDayOfMonth)((0,l.endOfToday)())),children:`Tháng trước`})]}),(0,c.jsx)(`div`,{className:`flex flex-1 flex-col`,children:(0,c.jsx)(`div`,{className:`min-w-73 border-b border-b-border p-2`,children:(0,c.jsx)(r.Calendar,{mode:`single`,selected:C.state.value??void 0,hidden:{before:b??new Date(1900,0,1),after:x??new Date(2100,11,31)},onSelect:e=>{e&&j(e)}})})})]})]}),O&&_&&(0,c.jsx)(i.FieldError,{id:S,className:`mt-1`,errors:C.state.meta.errors}),(0,c.jsx)(i.FieldNote,{isShow:!!g,children:g})]})})]}),(0,c.jsx)(i.FieldSeparator,{})]})});d.displayName=`DateField`,exports.DateField=d;
2
- //# sourceMappingURL=date-field-CJ7hYY8l.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-field-CJ7hYY8l.cjs","names":["useTanStackFieldContext","FieldGroup","Field","FieldContent","FieldLabel","FieldTooltip","FieldDescription","FieldContentMain","Popover","PopoverTrigger","Button","CalendarDaysIcon","PopoverContent","Calendar","FieldError","FieldNote","FieldSeparator"],"sources":["../packages/components/features/tanstack-form/components/fields/date-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { CalendarDaysIcon } from 'lucide-react';\n\nimport { endOfToday, endOfTomorrow, endOfYesterday, format, lastDayOfMonth, startOfMonth, subDays } from '@customafk/react-toolkit/date-fns';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { DateFieldProps as Props } from '../../types';\n\nexport const DateField = memo<Props>(\n ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n showErrorMessage = true,\n required = false,\n disabled = false,\n minDate,\n maxDate,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<Date | null>();\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _isInvalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n\n const handleSelect = (date: Date) => {\n field.handleChange(date);\n setPopoverOpen(false);\n };\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex flex-col space-y-1\">\n <div className=\"flex w-full flex-col\">\n <Popover\n open={popoverOpen}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_isInvalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex items-center justify-between rounded font-normal outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n field.state.value === null && 'text-text-positive-muted',\n _isInvalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n >\n <p>{field.state.value === null ? (placeholder ?? 'Select date') : format(field.state.value, 'PPPP')}</p>\n <CalendarDaysIcon strokeWidth={1} />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" side=\"bottom\" className=\"flex w-fit min-w-0 overflow-y-auto rounded p-0\">\n <div className=\"flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm\">\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfToday())}>\n Hôm nay\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfTomorrow())}>\n Ngày mai\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfYesterday())}>\n Hôm qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 3))}>\n 3 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 7))}>\n 7 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 30))}>\n 30 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(startOfMonth(endOfToday()))}>\n Tháng này\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(lastDayOfMonth(endOfToday()))}>\n Tháng trước\n </Button>\n </div>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"min-w-73 border-b border-b-border p-2\">\n <Calendar\n mode=\"single\"\n selected={field.state.value ?? undefined}\n hidden={{\n before: minDate ?? new Date(1900, 0, 1),\n after: maxDate ?? new Date(2100, 11, 31),\n }}\n onSelect={date => {\n if (!date) return;\n handleSelect(date);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nDateField.displayName = 'DateField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Button as e}from"./ui/button.mjs";import{G as t}from"./tanstack-form-B6mzOylW.mjs";import{Popover as n,PopoverContent as r,PopoverTrigger as i}from"./ui/popover.mjs";import{Calendar as a}from"./ui/calendar.mjs";import{Field as o,FieldContent as s,FieldContentMain as c,FieldDescription as l,FieldError as u,FieldGroup as d,FieldLabel as f,FieldNote as p,FieldSeparator as m,FieldTooltip as h}from"./field-BKyUqvzh.mjs";import{CalendarDaysIcon as g}from"lucide-react";import{memo as _,useId as v,useState as y}from"react";import{cn as b}from"@customafk/react-toolkit/utils";import{jsx as x,jsxs as S}from"react/jsx-runtime";import{endOfToday as C,endOfTomorrow as w,endOfYesterday as T,format as E,lastDayOfMonth as D,startOfMonth as O,subDays as k}from"@customafk/react-toolkit/date-fns";import{useStore as A}from"@tanstack/react-form";const j=_(({label:_,description:j,placeholder:M,orientation:N=`responsive`,tooltip:P,helperText:F,showErrorMessage:I=!0,required:L=!1,disabled:R=!1,minDate:z,maxDate:B})=>{let V=v(),H=t(),[U,W]=y(!1),G=A(H.form.store,({isSubmitting:e})=>e),K=R||G,q=H.state.meta.isDirty||H.state.meta.isTouched,J=q&&!H.state.meta.isValid,Y=L&&H.state.value===null,X=e=>{H.handleChange(e),W(!1)};return S(d,{className:`px-4`,children:[S(o,{orientation:N,"data-invalid":J,children:[S(s,{children:[S(f,{htmlFor:H.name,"aria-required":Y,children:[_,P&&x(h,{tooltip:P})]}),x(l,{children:j})]}),x(c,{className:`flex flex-col space-y-1`,children:S(`div`,{className:`flex w-full flex-col`,children:[S(n,{open:U,onOpenChange:e=>{W(e),e||H.handleBlur()},children:[x(i,{asChild:!0,children:S(e,{variant:`outline`,color:`muted`,size:`lg`,disabled:K,"aria-invalid":J?!0:void 0,"aria-describedby":V,className:b(`flex items-center justify-between rounded font-normal outline-border`,`hover:bg-transparent`,`focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak`,`data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,H.state.value===null&&`text-text-positive-muted`,J&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),children:[x(`p`,{children:H.state.value===null?M??`Select date`:E(H.state.value,`PPPP`)}),x(g,{strokeWidth:1})]})}),S(r,{align:`start`,side:`bottom`,className:`flex w-fit min-w-0 overflow-y-auto rounded p-0`,children:[S(`div`,{className:`flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm`,children:[x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(C()),children:`Hôm nay`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(w()),children:`Ngày mai`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(T()),children:`Hôm qua`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(k(C(),3)),children:`3 ngày qua`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(k(C(),7)),children:`7 ngày qua`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(k(C(),30)),children:`30 ngày qua`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(O(C())),children:`Tháng này`}),x(e,{variant:`ghost`,color:`muted`,className:`w-32`,onClick:()=>X(D(C())),children:`Tháng trước`})]}),x(`div`,{className:`flex flex-1 flex-col`,children:x(`div`,{className:`min-w-73 border-b border-b-border p-2`,children:x(a,{mode:`single`,selected:H.state.value??void 0,hidden:{before:z??new Date(1900,0,1),after:B??new Date(2100,11,31)},onSelect:e=>{e&&X(e)}})})})]})]}),q&&I&&x(u,{id:V,className:`mt-1`,errors:H.state.meta.errors}),x(p,{isShow:!!F,children:F})]})})]}),x(m,{})]})});j.displayName=`DateField`;export{j as DateField};
2
- //# sourceMappingURL=date-field-uYtNFRrJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-field-uYtNFRrJ.mjs","names":[],"sources":["../packages/components/features/tanstack-form/components/fields/date-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { CalendarDaysIcon } from 'lucide-react';\n\nimport { endOfToday, endOfTomorrow, endOfYesterday, format, lastDayOfMonth, startOfMonth, subDays } from '@customafk/react-toolkit/date-fns';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { DateFieldProps as Props } from '../../types';\n\nexport const DateField = memo<Props>(\n ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n showErrorMessage = true,\n required = false,\n disabled = false,\n minDate,\n maxDate,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<Date | null>();\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _isInvalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n\n const handleSelect = (date: Date) => {\n field.handleChange(date);\n setPopoverOpen(false);\n };\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex flex-col space-y-1\">\n <div className=\"flex w-full flex-col\">\n <Popover\n open={popoverOpen}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_isInvalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex items-center justify-between rounded font-normal outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n field.state.value === null && 'text-text-positive-muted',\n _isInvalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n >\n <p>{field.state.value === null ? (placeholder ?? 'Select date') : format(field.state.value, 'PPPP')}</p>\n <CalendarDaysIcon strokeWidth={1} />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" side=\"bottom\" className=\"flex w-fit min-w-0 overflow-y-auto rounded p-0\">\n <div className=\"flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm\">\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfToday())}>\n Hôm nay\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfTomorrow())}>\n Ngày mai\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(endOfYesterday())}>\n Hôm qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 3))}>\n 3 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 7))}>\n 7 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(subDays(endOfToday(), 30))}>\n 30 ngày qua\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(startOfMonth(endOfToday()))}>\n Tháng này\n </Button>\n <Button variant=\"ghost\" color=\"muted\" className=\"w-32\" onClick={() => handleSelect(lastDayOfMonth(endOfToday()))}>\n Tháng trước\n </Button>\n </div>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"min-w-73 border-b border-b-border p-2\">\n <Calendar\n mode=\"single\"\n selected={field.state.value ?? undefined}\n hidden={{\n before: minDate ?? new Date(1900, 0, 1),\n after: maxDate ?? new Date(2100, 11, 31),\n }}\n onSelect={date => {\n if (!date) return;\n handleSelect(date);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nDateField.displayName = 'DateField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Skeleton as e}from"./ui/skeleton.mjs";import{Suspense as t,lazy as n}from"react";import{jsx as r}from"react/jsx-runtime";import{createFormHook as i,createFormHookContexts as a}from"@tanstack/react-form";const{fieldContext:o,formContext:s,useFieldContext:c,useFormContext:l}=a();function u(){return r(e,{"data-slot":`tanstack-field-skeleton`,className:`h-9 w-full rounded`})}function d(e){let i=n(e);return e=>r(t,{fallback:r(u,{}),children:r(i,{...e})})}const f=d(()=>import(`./text-field-Dlbpos_A.mjs`).then(e=>({default:e.TextField}))),p=d(()=>import(`./textarea-field-f8E3HEkw.mjs`).then(e=>({default:e.TextareaField}))),m=d(()=>import(`./text-editor-field-Dm2yxTUZ.mjs`).then(e=>({default:e.TextEditorField}))),h=d(()=>import(`./number-field-BglMIz6D.mjs`).then(e=>({default:e.NumberField}))),g=d(()=>import(`./email-field-CadXKVIu.mjs`).then(e=>({default:e.EmailField}))),_=d(()=>import(`./password-field-7VRa9-nn.mjs`).then(e=>({default:e.PasswordField}))),v=d(()=>import(`./select-field-C5MjnCWH.mjs`).then(e=>({default:e.SelectField}))),y=d(()=>import(`./combobox-field-CLooFS0r.mjs`).then(e=>({default:e.ComboboxField}))),b=d(()=>import(`./date-field-uYtNFRrJ.mjs`).then(e=>({default:e.DateField}))),x=d(()=>import(`./switch-field-aaA3hplb.mjs`).then(e=>({default:e.SwitchField}))),S=d(()=>import(`./radio-group-field-D570ZDQ1.mjs`).then(e=>({default:e.RadioGroupField}))),C=d(()=>import(`./checkbox-field-B7Nh2_rB.mjs`).then(e=>({default:e.CheckboxField}))),w=d(()=>import(`./simple-text-field-DxZyRSy5.mjs`).then(e=>({default:e.SimpleTextField}))),T=d(()=>import(`./simple-email-field-B73GdTF_.mjs`).then(e=>({default:e.SimpleEmailField}))),E=d(()=>import(`./simple-password-field-CrGsdjSa.mjs`).then(e=>({default:e.SimplePasswordField}))),D=d(()=>import(`./simple-textarea-field-BiaAbLgT.mjs`).then(e=>({default:e.SimpleTextareaField}))),O=d(()=>import(`./simple-number-field-ggLY5zA7.mjs`).then(e=>({default:e.SimpleNumberField}))),k=d(()=>import(`./simple-select-field-CyFJthFb.mjs`).then(e=>({default:e.SimpleSelectField}))),A=n(()=>import(`./simple-array-field-Bj86iA_N.mjs`).then(e=>({default:e.SimpleArrayField})));function j(e){return r(t,{fallback:r(u,{}),children:r(A,{...e})})}const M=d(()=>import(`./simple-boolean-field-BbfHAg60.mjs`).then(e=>({default:e.SimpleBooleanField}))),N=d(()=>import(`./simple-combobox-field-poFNb-vB.mjs`).then(e=>({default:e.SimpleComboboxField}))),P=d(()=>import(`./simple-date-field-BMADM_kf.mjs`).then(e=>({default:e.SimpleDateField}))),F=d(()=>import(`./simple-radio-group-field-CZ5u-XiY.mjs`).then(e=>({default:e.SimpleRadioGroupField}))),I=d(()=>import(`./simple-array-field-Bj86iA_N.mjs`).then(e=>({default:e.ArrayCol}))),L=d(()=>import(`./simple-array-field-Bj86iA_N.mjs`).then(e=>({default:e.ArrayHeaderRow}))),R=d(()=>import(`./dialog-form-C6kJPVNp.mjs`).then(e=>({default:e.TanStackDialogForm}))),z=d(()=>import(`./popover-form-BLuCGa_z.mjs`).then(e=>({default:e.TanStackPopoverForm}))),B=d(()=>import(`./container-form-BjiGIzwm.mjs`).then(e=>({default:e.TanStackContainerForm}))),V=d(()=>import(`./section-form-BJWWflUR.mjs`).then(e=>({default:e.TanStackSectionForm}))),H=d(()=>import(`./card-form-D9fNO-6F.mjs`).then(e=>({default:e.TanStackCardForm}))),U=d(()=>import(`./group-field-bviEXmo4.mjs`).then(e=>({default:e.TanStackFieldGroup}))),W=d(()=>import(`./title-field-84EnHPvl.mjs`).then(e=>({default:e.TanStackTitleField}))),G=d(()=>import(`./actions-form-CEBdF1N7.mjs`).then(e=>({default:e.TanStackActionsForm}))),K=d(()=>import(`./action-submit-DLv-V1JQ.mjs`).then(e=>({default:e.TanStackActionSubmit}))),q=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldGroup}))),J=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.Field}))),Y=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldContent}))),X=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldLabel}))),Z=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldContentMain}))),Q=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldSeparator}))),$=d(()=>import(`./field-BKyUqvzh.mjs`).then(e=>({default:e.FieldError}))),{useAppForm:ee,withForm:te,withFieldGroup:ne}=i({fieldContext:o,formContext:s,fieldComponents:{TextField:f,TextareaField:p,TextEditorField:m,NumberField:h,EmailField:g,PasswordField:_,SelectField:v,ComboboxField:y,DateField:b,SwitchField:x,RadioGroupField:S,CheckboxField:C,SimpleTextField:w,SimpleEmailField:T,SimplePasswordField:E,SimpleTextareaField:D,SimpleNumberField:O,SimpleSelectField:k,SimpleArrayField:j,SimpleBooleanField:M,SimpleComboboxField:N,SimpleDateField:P,SimpleRadioGroupField:F,FieldGroup:q,Field:J,FieldContent:Y,FieldLabel:X,FieldContentMain:Z,FieldSeparator:Q,FieldError:$},formComponents:{TanStackDialogForm:R,TanStackPopoverForm:z,TanStackContainerForm:B,TanStackSectionForm:V,TanStackCardForm:H,TanStackFieldGroup:U,TanStackTitleField:W,TanStackActionsForm:G,TanStackActionSubmit:K,ArrayCol:I,ArrayHeaderRow:L}});export{K as A,f as B,O as C,w as D,k as E,U as F,c as G,ee as H,z as I,l as K,V as L,H as M,B as N,D as O,R as P,W as R,T as S,F as T,ne as U,p as V,te as W,v as _,b as a,N as b,Y as c,q as d,X as f,S as g,_ as h,y as i,G as j,x as k,Z as l,h as m,L as n,g as o,Q as p,C as r,J as s,I as t,$ as u,j as v,E as w,P as x,M as y,m as z};
2
- //# sourceMappingURL=tanstack-form-B6mzOylW.mjs.map
@@ -1,2 +0,0 @@
1
- import{G as e}from"./tanstack-form-B6mzOylW.mjs";import{Input as t}from"./ui/input.mjs";import{Field as n,FieldContent as r,FieldContentMain as i,FieldDescription as a,FieldError as o,FieldGroup as s,FieldLabel as c,FieldNote as l,FieldSeparator as u,FieldTooltip as d}from"./field-BKyUqvzh.mjs";import{BanIcon as f,Loader2Icon as p,XIcon as m}from"lucide-react";import{memo as h,useCallback as g,useId as _,useRef as v}from"react";import{cn as y}from"@customafk/react-toolkit/utils";import{jsx as b,jsxs as x}from"react/jsx-runtime";import{useStore as S}from"@tanstack/react-form";const C=e=>{e.key===`Enter`&&e.preventDefault()},w=h(({label:h,description:w,placeholder:T,tooltip:E,helperText:D,counter:O=!1,orientation:k=`responsive`,showClearButton:A=!1,showErrorMessage:j=!0,required:M=!1,disabled:N=!1,maxLength:P})=>{let F=_(),I=_(),L=v(null),{form:R,name:z,state:B,handleBlur:V,handleChange:H}=e(),U=S(R.store,({isSubmitting:e})=>e),W=N||U,G=B.meta.isDirty||B.meta.isTouched,K=G&&!B.meta.isValid,q=M&&B.value===null,J=B.meta.errors.length>0,Y=A&&!W&&!!B.value,X=O?B.value?.length??0:0,Z=O&&!!P&&X>=P*.8,Q=O&&!!P&&X>=P,$=O?P?`${X} / ${P} ký tự`:`${X} ký tự`:null,ee=O||G&&j,te=g(({target:{value:e}})=>{O&&P&&e.length>P||H(e||null)},[O,P,H]),ne=g(()=>{H(null),L.current?.focus()},[H]);return x(s,{className:`gap-y-4 px-4`,children:[x(n,{orientation:k,"data-invalid":K,children:[x(r,{children:[x(c,{"aria-required":q,htmlFor:F,children:[h,E&&b(d,{tooltip:E})]}),w&&b(a,{children:w})]}),x(i,{children:[b(t,{ref:L,id:F,name:z,value:B.value??``,"aria-invalid":K,"aria-describedby":I,autoComplete:`off`,placeholder:T,autoCapitalize:`none`,autoCorrect:`off`,disabled:W,className:y(`pr-6`,W&&`pointer-events-none bg-muted-muted opacity-60`),onBlur:V,onChange:te,onKeyDown:C}),Y&&b(`button`,{type:`button`,"aria-label":`Xóa`,className:`absolute inset-e-1 top-2.5 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:ne,children:b(m,{"aria-hidden":`true`})}),U&&b(`div`,{className:`absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak`,children:b(p,{size:14,className:`animate-spin text-primary-strong`})}),!Y&&G&&j&&J&&b(`div`,{className:`absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong`,children:b(f,{"aria-hidden":`true`,size:14})}),ee&&x(`div`,{className:`my-1 flex w-full items-start justify-between gap-x-2`,children:[G&&j?b(o,{id:I,className:`flex-1`,errors:B.meta.errors}):b(`div`,{}),O&&b(`p`,{className:y(`h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors`,Q?`font-medium text-danger-strong`:Z?`text-warning-strong`:`text-text-positive-weak`),children:$})]}),b(l,{isShow:!!D,children:D})]})]}),b(u,{})]})});w.displayName=`TextField`;export{w as TextField};
2
- //# sourceMappingURL=text-field-Dlbpos_A.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-field-Dlbpos_A.mjs","names":[],"sources":["../packages/components/features/tanstack-form/components/fields/text-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useCallback, useId, useRef } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon, XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '@/components/features/tanstack-form/components/ui/field';\nimport { useTanStackFieldContext } from '../form-context';\n\nimport type { TextFieldProps as Props } from '../../types';\n\n/** Fraction of maxLength at which the counter turns warning color (80%). */\nconst COUNTER_WARNING_THRESHOLD = 0.8;\n\n/** Pixel size for inline adornment icons (error ban, loading spinner). */\nconst ADORNMENT_ICON_SIZE = 14;\n\n// Static handler — no closure deps, shared across all TextField instances\nconst onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = e => {\n if (e.key === 'Enter') e.preventDefault();\n};\n\n/**\n * A TanStack Form-connected single-line text input with label, validation, and optional features.\n *\n * Must be rendered inside an `AppField` context from `useTanStackForm`.\n * The field value type is `string | null` — `null` represents an empty/unset state.\n *\n * ---\n *\n * **Basic usage**\n * @example\n * const { AppField } = useTanStackForm({ defaultValues: { name: null } });\n *\n * <AppField name=\"name\">\n * {field => <field.TextField label=\"Full name\" placeholder=\"Nguyễn Văn A\" />}\n * </AppField>\n *\n * ---\n *\n * **With validation**\n * @example\n * <AppField\n * name=\"username\"\n * validators={{ onChange: ({ value }) => !value ? 'Bắt buộc' : undefined }}\n * >\n * {field => <field.TextField label=\"Username\" required />}\n * </AppField>\n *\n * ---\n *\n * **With character counter and max length**\n * @example\n * <AppField name=\"bio\">\n * {field => (\n * <field.TextField\n * label=\"Bio\"\n * counter\n * maxLength={160}\n * placeholder=\"Giới thiệu bản thân…\"\n * />\n * )}\n * </AppField>\n *\n * ---\n *\n * **With clear button and helper note**\n * @example\n * <AppField name=\"search\">\n * {field => (\n * <field.TextField\n * label=\"Tìm kiếm\"\n * showClearButton\n * helperText=\"Nhập ít nhất 3 ký tự để tìm kiếm.\"\n * />\n * )}\n * </AppField>\n *\n * ---\n *\n * **Horizontal layout**\n * @example\n * <AppField name=\"code\">\n * {field => (\n * <field.TextField\n * label=\"Mã sản phẩm\"\n * orientation=\"horizontal\"\n * tooltip=\"Mã duy nhất định danh sản phẩm trong hệ thống.\"\n * />\n * )}\n * </AppField>\n */\nexport const TextField = memo<Props>(\n ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showClearButton = false,\n showErrorMessage = true,\n\n required = false,\n disabled = false,\n maxLength,\n }) => {\n const id = useId();\n const errorId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = state.meta.isDirty || state.meta.isTouched;\n const _invalid = _touched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _hasErrors = state.meta.errors.length > 0;\n const _showClearButton = showClearButton && !isDisabled && !!state.value;\n\n // Counter values are only computed when the feature is active\n const _count = counter ? (state.value?.length ?? 0) : 0;\n const _isNearLimit = counter && !!maxLength && _count >= maxLength * COUNTER_WARNING_THRESHOLD;\n const _isAtLimit = counter && !!maxLength && _count >= maxLength;\n const _countText = counter ? (maxLength ? `${_count} / ${maxLength} ký tự` : `${_count} ký tự`) : null;\n\n // Skip the bottom row entirely when neither error nor counter will render\n const _showBottomRow = counter || (_touched && showErrorMessage);\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [counter, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n handleChange(null);\n inputRef.current?.focus();\n }, [handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n {description && <FieldDescription>{description}</FieldDescription>}\n </FieldContent>\n <FieldContentMain>\n <Input\n ref={inputRef}\n id={id}\n name={name}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n aria-describedby={errorId}\n autoComplete=\"off\"\n placeholder={placeholder}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n disabled={isDisabled}\n className={cn('pr-6', isDisabled && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n {_showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Xóa\"\n className=\"absolute inset-e-1 top-2.5 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={ADORNMENT_ICON_SIZE} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {!_showClearButton && _touched && showErrorMessage && _hasErrors && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon aria-hidden=\"true\" size={ADORNMENT_ICON_SIZE} />\n </div>\n )}\n {_showBottomRow && (\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {_touched && showErrorMessage ? <FieldError id={errorId} className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n )}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nTextField.displayName = 'TextField';\n"],"mappings":"skBA4BA,MAMM,EAA0D,GAAK,CAC/D,EAAE,MAAQ,SAAS,EAAE,eAAe,CAC1C,EAwEa,EAAY,GACtB,CACC,QACA,cACA,cAEA,UACA,aACA,UAAU,GACV,cAAc,aACd,kBAAkB,GAClB,mBAAmB,GAEnB,WAAW,GACX,WAAW,GACX,eACI,CACJ,IAAM,EAAK,EAAM,EACX,EAAU,EAAM,EAChB,EAAW,EAAyB,IAAI,EACxC,CAAE,OAAM,OAAM,QAAO,aAAY,gBAAiB,EAAuC,EAEzF,EAAe,EAAS,EAAK,OAAQ,CAAE,kBAAmB,CAAY,EACtE,EAAa,GAAY,EAEzB,EAAW,EAAM,KAAK,SAAW,EAAM,KAAK,UAC5C,EAAW,GAAY,CAAC,EAAM,KAAK,QACnC,EAAW,GAAY,EAAM,QAAU,KACvC,EAAa,EAAM,KAAK,OAAO,OAAS,EACxC,EAAmB,GAAmB,CAAC,GAAc,CAAC,CAAC,EAAM,MAG7D,EAAS,EAAW,EAAM,OAAO,QAAU,EAAK,EAChD,EAAe,GAAW,CAAC,CAAC,GAAa,GAAU,EAAY,GAC/D,EAAa,GAAW,CAAC,CAAC,GAAa,GAAU,EACjD,EAAa,EAAW,EAAY,GAAG,EAAO,KAAK,EAAU,QAAU,GAAG,EAAO,QAAW,KAG5F,GAAiB,GAAY,GAAY,EAEzC,GAAW,GACd,CAAE,OAAQ,CAAE,YAAc,CACrB,GAAW,GAAa,EAAM,OAAS,GAC3C,EAAa,GAAS,IAAI,CAC5B,EACA,CAAC,EAAS,EAAW,CAAY,CACnC,EAEM,GAAU,MAAkB,CAChC,EAAa,IAAI,EACjB,EAAS,SAAS,MAAM,CAC1B,EAAG,CAAC,CAAY,CAAC,EAEjB,OACE,EAAC,EAAD,CAAY,UAAU,wBAAtB,CACE,EAAC,EAAD,CAAoB,cAAa,eAAc,WAA/C,CACE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAY,gBAAe,EAAU,QAAS,WAA9C,CACG,EACA,GAAW,EAAC,EAAD,CAAuB,SAAU,CAAA,CACnC,IACX,GAAe,EAAC,EAAD,CAAA,SAAmB,CAA8B,CAAA,CACrD,CAAA,CAAA,EACd,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CACE,IAAK,EACD,KACE,OACN,MAAO,EAAM,OAAS,GACtB,eAAc,EACd,mBAAkB,EAClB,aAAa,MACA,cACb,eAAe,OACf,YAAY,MACZ,SAAU,EACV,UAAW,EAAG,OAAQ,GAAc,+CAA+C,EACnF,OAAQ,EACE,YACC,WACZ,CAAA,EACA,GACC,EAAC,SAAD,CACE,KAAK,SACL,aAAW,MACX,UAAU,0SACV,QAAS,YAET,EAAC,EAAD,CAAO,cAAY,MAAQ,CAAA,CACrB,CAAA,EAET,GACC,EAAC,MAAD,CAAK,UAAU,gEACb,EAAC,EAAD,CAAa,KAAM,GAAqB,UAAU,kCAAoC,CAAA,CACnF,CAAA,EAEN,CAAC,GAAoB,GAAY,GAAoB,GACpD,EAAC,MAAD,CAAK,UAAU,mEACb,EAAC,EAAD,CAAS,cAAY,OAAO,KAAM,EAAsB,CAAA,CACrD,CAAA,EAEN,IACC,EAAC,MAAD,CAAK,UAAU,gEAAf,CACG,GAAY,EAAmB,EAAC,EAAD,CAAY,GAAI,EAAS,UAAU,SAAS,OAAQ,EAAM,KAAK,MAAS,CAAA,EAAI,EAAC,MAAD,CAAM,CAAA,EACjH,GACC,EAAC,IAAD,CACE,UAAW,EACT,yEACA,EAAa,iCAAmC,EAAe,sBAAwB,yBACzF,WAEC,CACA,CAAA,CAEF,IAEP,EAAC,EAAD,CAAW,OAAQ,CAAC,CAAC,WAAa,CAAsB,CAAA,CACxC,CAAA,CAAA,CACb,IACP,EAAC,EAAD,CAAiB,CAAA,CACP,GAEhB,CACF,EAEA,EAAU,YAAc"}
@@ -1,2 +0,0 @@
1
- const e=require("./tanstack-form-DU-ZKXxZ.cjs"),t=require("./ui/input.cjs"),n=require("./field-BV5twmKA.cjs");let r=require("lucide-react"),i=require("react"),a=require("@customafk/react-toolkit/utils"),o=require("react/jsx-runtime"),s=require("@tanstack/react-form");const c=e=>{e.key===`Enter`&&e.preventDefault()},l=(0,i.memo)(({label:l,description:u,placeholder:d,tooltip:f,helperText:p,counter:m=!1,orientation:h=`responsive`,showClearButton:g=!1,showErrorMessage:_=!0,required:v=!1,disabled:y=!1,maxLength:b})=>{let x=(0,i.useId)(),S=(0,i.useId)(),C=(0,i.useRef)(null),{form:w,name:T,state:E,handleBlur:D,handleChange:O}=e.G(),k=(0,s.useStore)(w.store,({isSubmitting:e})=>e),A=y||k,j=E.meta.isDirty||E.meta.isTouched,M=j&&!E.meta.isValid,N=v&&E.value===null,P=E.meta.errors.length>0,F=g&&!A&&!!E.value,I=m?E.value?.length??0:0,L=m&&!!b&&I>=b*.8,R=m&&!!b&&I>=b,z=m?b?`${I} / ${b} ký tự`:`${I} ký tự`:null,B=m||j&&_,V=(0,i.useCallback)(({target:{value:e}})=>{m&&b&&e.length>b||O(e||null)},[m,b,O]),H=(0,i.useCallback)(()=>{O(null),C.current?.focus()},[O]);return(0,o.jsxs)(n.FieldGroup,{className:`gap-y-4 px-4`,children:[(0,o.jsxs)(n.Field,{orientation:h,"data-invalid":M,children:[(0,o.jsxs)(n.FieldContent,{children:[(0,o.jsxs)(n.FieldLabel,{"aria-required":N,htmlFor:x,children:[l,f&&(0,o.jsx)(n.FieldTooltip,{tooltip:f})]}),u&&(0,o.jsx)(n.FieldDescription,{children:u})]}),(0,o.jsxs)(n.FieldContentMain,{children:[(0,o.jsx)(t.Input,{ref:C,id:x,name:T,value:E.value??``,"aria-invalid":M,"aria-describedby":S,autoComplete:`off`,placeholder:d,autoCapitalize:`none`,autoCorrect:`off`,disabled:A,className:(0,a.cn)(`pr-6`,A&&`pointer-events-none bg-muted-muted opacity-60`),onBlur:D,onChange:V,onKeyDown:c}),F&&(0,o.jsx)(`button`,{type:`button`,"aria-label":`Xóa`,className:`absolute inset-e-1 top-2.5 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:H,children:(0,o.jsx)(r.XIcon,{"aria-hidden":`true`})}),k&&(0,o.jsx)(`div`,{className:`absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak`,children:(0,o.jsx)(r.Loader2Icon,{size:14,className:`animate-spin text-primary-strong`})}),!F&&j&&_&&P&&(0,o.jsx)(`div`,{className:`absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong`,children:(0,o.jsx)(r.BanIcon,{"aria-hidden":`true`,size:14})}),B&&(0,o.jsxs)(`div`,{className:`my-1 flex w-full items-start justify-between gap-x-2`,children:[j&&_?(0,o.jsx)(n.FieldError,{id:S,className:`flex-1`,errors:E.meta.errors}):(0,o.jsx)(`div`,{}),m&&(0,o.jsx)(`p`,{className:(0,a.cn)(`h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors`,R?`font-medium text-danger-strong`:L?`text-warning-strong`:`text-text-positive-weak`),children:z})]}),(0,o.jsx)(n.FieldNote,{isShow:!!p,children:p})]})]}),(0,o.jsx)(n.FieldSeparator,{})]})});l.displayName=`TextField`,exports.TextField=l;
2
- //# sourceMappingURL=text-field-GIn2zAtc.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-field-GIn2zAtc.cjs","names":["useTanStackFieldContext","FieldGroup","Field","FieldContent","FieldLabel","FieldTooltip","FieldDescription","FieldContentMain","Input","XIcon","Loader2Icon","BanIcon","FieldError","FieldNote","FieldSeparator"],"sources":["../packages/components/features/tanstack-form/components/fields/text-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useCallback, useId, useRef } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon, XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '@/components/features/tanstack-form/components/ui/field';\nimport { useTanStackFieldContext } from '../form-context';\n\nimport type { TextFieldProps as Props } from '../../types';\n\n/** Fraction of maxLength at which the counter turns warning color (80%). */\nconst COUNTER_WARNING_THRESHOLD = 0.8;\n\n/** Pixel size for inline adornment icons (error ban, loading spinner). */\nconst ADORNMENT_ICON_SIZE = 14;\n\n// Static handler — no closure deps, shared across all TextField instances\nconst onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = e => {\n if (e.key === 'Enter') e.preventDefault();\n};\n\n/**\n * A TanStack Form-connected single-line text input with label, validation, and optional features.\n *\n * Must be rendered inside an `AppField` context from `useTanStackForm`.\n * The field value type is `string | null` — `null` represents an empty/unset state.\n *\n * ---\n *\n * **Basic usage**\n * @example\n * const { AppField } = useTanStackForm({ defaultValues: { name: null } });\n *\n * <AppField name=\"name\">\n * {field => <field.TextField label=\"Full name\" placeholder=\"Nguyễn Văn A\" />}\n * </AppField>\n *\n * ---\n *\n * **With validation**\n * @example\n * <AppField\n * name=\"username\"\n * validators={{ onChange: ({ value }) => !value ? 'Bắt buộc' : undefined }}\n * >\n * {field => <field.TextField label=\"Username\" required />}\n * </AppField>\n *\n * ---\n *\n * **With character counter and max length**\n * @example\n * <AppField name=\"bio\">\n * {field => (\n * <field.TextField\n * label=\"Bio\"\n * counter\n * maxLength={160}\n * placeholder=\"Giới thiệu bản thân…\"\n * />\n * )}\n * </AppField>\n *\n * ---\n *\n * **With clear button and helper note**\n * @example\n * <AppField name=\"search\">\n * {field => (\n * <field.TextField\n * label=\"Tìm kiếm\"\n * showClearButton\n * helperText=\"Nhập ít nhất 3 ký tự để tìm kiếm.\"\n * />\n * )}\n * </AppField>\n *\n * ---\n *\n * **Horizontal layout**\n * @example\n * <AppField name=\"code\">\n * {field => (\n * <field.TextField\n * label=\"Mã sản phẩm\"\n * orientation=\"horizontal\"\n * tooltip=\"Mã duy nhất định danh sản phẩm trong hệ thống.\"\n * />\n * )}\n * </AppField>\n */\nexport const TextField = memo<Props>(\n ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showClearButton = false,\n showErrorMessage = true,\n\n required = false,\n disabled = false,\n maxLength,\n }) => {\n const id = useId();\n const errorId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = state.meta.isDirty || state.meta.isTouched;\n const _invalid = _touched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _hasErrors = state.meta.errors.length > 0;\n const _showClearButton = showClearButton && !isDisabled && !!state.value;\n\n // Counter values are only computed when the feature is active\n const _count = counter ? (state.value?.length ?? 0) : 0;\n const _isNearLimit = counter && !!maxLength && _count >= maxLength * COUNTER_WARNING_THRESHOLD;\n const _isAtLimit = counter && !!maxLength && _count >= maxLength;\n const _countText = counter ? (maxLength ? `${_count} / ${maxLength} ký tự` : `${_count} ký tự`) : null;\n\n // Skip the bottom row entirely when neither error nor counter will render\n const _showBottomRow = counter || (_touched && showErrorMessage);\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [counter, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n handleChange(null);\n inputRef.current?.focus();\n }, [handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n {description && <FieldDescription>{description}</FieldDescription>}\n </FieldContent>\n <FieldContentMain>\n <Input\n ref={inputRef}\n id={id}\n name={name}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n aria-describedby={errorId}\n autoComplete=\"off\"\n placeholder={placeholder}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n disabled={isDisabled}\n className={cn('pr-6', isDisabled && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n {_showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Xóa\"\n className=\"absolute inset-e-1 top-2.5 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={ADORNMENT_ICON_SIZE} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {!_showClearButton && _touched && showErrorMessage && _hasErrors && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon aria-hidden=\"true\" size={ADORNMENT_ICON_SIZE} />\n </div>\n )}\n {_showBottomRow && (\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {_touched && showErrorMessage ? <FieldError id={errorId} className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n )}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nTextField.displayName = 'TextField';\n"],"mappings":"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"}