@customafk/lunas-ui 0.2.69 → 0.2.71

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 (164) hide show
  1. package/dist/{action-submit-Dzo0A7Ew.cjs → action-submit-C19tPHgf.cjs} +2 -2
  2. package/dist/{action-submit-Dzo0A7Ew.cjs.map → action-submit-C19tPHgf.cjs.map} +1 -1
  3. package/dist/{action-submit-Bew9PJtF.mjs → action-submit-cOfq0OSY.mjs} +2 -2
  4. package/dist/{action-submit-Bew9PJtF.mjs.map → action-submit-cOfq0OSY.mjs.map} +1 -1
  5. package/dist/{actions-form-BnDcdbd-.cjs → actions-form-3ItwYOFj.cjs} +2 -2
  6. package/dist/{actions-form-BnDcdbd-.cjs.map → actions-form-3ItwYOFj.cjs.map} +1 -1
  7. package/dist/{actions-form-Z8BX9Hmy.mjs → actions-form-DxbT1lip.mjs} +2 -2
  8. package/dist/{actions-form-Z8BX9Hmy.mjs.map → actions-form-DxbT1lip.mjs.map} +1 -1
  9. package/dist/{checkbox-field-BaqE-eVv.mjs → checkbox-field-BAQN-Yno.mjs} +2 -2
  10. package/dist/{checkbox-field-BaqE-eVv.mjs.map → checkbox-field-BAQN-Yno.mjs.map} +1 -1
  11. package/dist/{checkbox-field-BsGsZz_N.cjs → checkbox-field-BRqU_dYY.cjs} +2 -2
  12. package/dist/{checkbox-field-BsGsZz_N.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/container-form-BjiGIzwm.mjs +2 -0
  18. package/dist/container-form-BjiGIzwm.mjs.map +1 -0
  19. package/dist/container-form-D8QNEn8M.cjs +2 -0
  20. package/dist/container-form-D8QNEn8M.cjs.map +1 -0
  21. package/dist/date-field-DLsJBYw8.cjs +2 -0
  22. package/dist/date-field-DLsJBYw8.cjs.map +1 -0
  23. package/dist/date-field-O67C78Kw.mjs +2 -0
  24. package/dist/date-field-O67C78Kw.mjs.map +1 -0
  25. package/dist/{dialog-form-BbumLQqe.mjs → dialog-form-BxlLrEeZ.mjs} +2 -2
  26. package/dist/{dialog-form-BbumLQqe.mjs.map → dialog-form-BxlLrEeZ.mjs.map} +1 -1
  27. package/dist/{dialog-form-CEiuEMXD.cjs → dialog-form-ClTCyJDD.cjs} +2 -2
  28. package/dist/{dialog-form-CEiuEMXD.cjs.map → dialog-form-ClTCyJDD.cjs.map} +1 -1
  29. package/dist/{email-field-DRb71gQI.cjs → email-field-DZzkfVj5.cjs} +2 -2
  30. package/dist/{email-field-DRb71gQI.cjs.map → email-field-DZzkfVj5.cjs.map} +1 -1
  31. package/dist/{email-field-HFmUE81o.mjs → email-field-DqEDxkp7.mjs} +2 -2
  32. package/dist/{email-field-HFmUE81o.mjs.map → email-field-DqEDxkp7.mjs.map} +1 -1
  33. package/dist/features/tanstack-form/index.cjs +1 -1
  34. package/dist/features/tanstack-form/index.d.cts +1 -1
  35. package/dist/features/tanstack-form/index.d.mts +1 -1
  36. package/dist/features/tanstack-form/index.mjs +1 -1
  37. package/dist/{field-BV5twmKA.cjs → field-BSLi-P0Q.cjs} +2 -2
  38. package/dist/{field-BV5twmKA.cjs.map → field-BSLi-P0Q.cjs.map} +1 -1
  39. package/dist/{field-BKyUqvzh.mjs → field-V2DoD8qL.mjs} +2 -2
  40. package/dist/{field-BKyUqvzh.mjs.map → field-V2DoD8qL.mjs.map} +1 -1
  41. package/dist/{group-field-bviEXmo4.mjs → group-field-gejvx_Td.mjs} +2 -2
  42. package/dist/{group-field-bviEXmo4.mjs.map → group-field-gejvx_Td.mjs.map} +1 -1
  43. package/dist/{group-field-0kStiX8n.cjs → group-field-sVykO2JZ.cjs} +2 -2
  44. package/dist/{group-field-0kStiX8n.cjs.map → group-field-sVykO2JZ.cjs.map} +1 -1
  45. package/dist/{index-CgP5OCy0.d.cts → index-BGnN6Vax.d.cts} +22 -1
  46. package/dist/{index-CgP5OCy0.d.mts → index-BGnN6Vax.d.mts} +22 -1
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.d.cts +1 -1
  49. package/dist/index.d.mts +1 -1
  50. package/dist/index.mjs +1 -1
  51. package/dist/{number-field-y0H7X4Ka.cjs → number-field-BTLobx1F.cjs} +2 -2
  52. package/dist/{number-field-y0H7X4Ka.cjs.map → number-field-BTLobx1F.cjs.map} +1 -1
  53. package/dist/{number-field-CZ06Uzb3.mjs → number-field-Cx-1U_Np.mjs} +2 -2
  54. package/dist/{number-field-CZ06Uzb3.mjs.map → number-field-Cx-1U_Np.mjs.map} +1 -1
  55. package/dist/{password-field-DSeObMIU.mjs → password-field-CGPjZ5hZ.mjs} +2 -2
  56. package/dist/{password-field-DSeObMIU.mjs.map → password-field-CGPjZ5hZ.mjs.map} +1 -1
  57. package/dist/{password-field-D0drFRG2.cjs → password-field-CuBcb4mi.cjs} +2 -2
  58. package/dist/{password-field-D0drFRG2.cjs.map → password-field-CuBcb4mi.cjs.map} +1 -1
  59. package/dist/{popover-form-rwhAulOD.mjs → popover-form-DVJUQ3_T.mjs} +2 -2
  60. package/dist/{popover-form-rwhAulOD.mjs.map → popover-form-DVJUQ3_T.mjs.map} +1 -1
  61. package/dist/{popover-form-nkdwopLv.cjs → popover-form-DzvgWQ2Q.cjs} +2 -2
  62. package/dist/{popover-form-nkdwopLv.cjs.map → popover-form-DzvgWQ2Q.cjs.map} +1 -1
  63. package/dist/{radio-group-field-0BXRGTJx.mjs → radio-group-field-C45y9BQt.mjs} +2 -2
  64. package/dist/{radio-group-field-0BXRGTJx.mjs.map → radio-group-field-C45y9BQt.mjs.map} +1 -1
  65. package/dist/{radio-group-field-wX3cWjyq.cjs → radio-group-field-GiEbZRkS.cjs} +2 -2
  66. package/dist/{radio-group-field-wX3cWjyq.cjs.map → radio-group-field-GiEbZRkS.cjs.map} +1 -1
  67. package/dist/section-form-BJWWflUR.mjs +2 -0
  68. package/dist/section-form-BJWWflUR.mjs.map +1 -0
  69. package/dist/section-form-C_pHiBEW.cjs +2 -0
  70. package/dist/section-form-C_pHiBEW.cjs.map +1 -0
  71. package/dist/{select-field-DR36Hpe0.cjs → select-field-Cd63KvgR.cjs} +2 -2
  72. package/dist/{select-field-DR36Hpe0.cjs.map → select-field-Cd63KvgR.cjs.map} +1 -1
  73. package/dist/{select-field-B-bbY7td.mjs → select-field-y3Zttb4j.mjs} +2 -2
  74. package/dist/{select-field-B-bbY7td.mjs.map → select-field-y3Zttb4j.mjs.map} +1 -1
  75. package/dist/{simple-array-field-CZb-E4GS.cjs → simple-array-field-BODzA766.cjs} +2 -2
  76. package/dist/{simple-array-field-CZb-E4GS.cjs.map → simple-array-field-BODzA766.cjs.map} +1 -1
  77. package/dist/{simple-array-field-CBG9o26e.mjs → simple-array-field-DI_56dVs.mjs} +2 -2
  78. package/dist/{simple-array-field-CBG9o26e.mjs.map → simple-array-field-DI_56dVs.mjs.map} +1 -1
  79. package/dist/{simple-boolean-field-BZ9paBNQ.cjs → simple-boolean-field-BjnIh9Mq.cjs} +2 -2
  80. package/dist/{simple-boolean-field-BZ9paBNQ.cjs.map → simple-boolean-field-BjnIh9Mq.cjs.map} +1 -1
  81. package/dist/{simple-boolean-field-BEsGOyof.mjs → simple-boolean-field-oP5yJDQL.mjs} +2 -2
  82. package/dist/{simple-boolean-field-BEsGOyof.mjs.map → simple-boolean-field-oP5yJDQL.mjs.map} +1 -1
  83. package/dist/{simple-combobox-field-BbhxP-te.mjs → simple-combobox-field-Bd-xk5kC.mjs} +2 -2
  84. package/dist/{simple-combobox-field-BbhxP-te.mjs.map → simple-combobox-field-Bd-xk5kC.mjs.map} +1 -1
  85. package/dist/{simple-combobox-field-C4Jmm1AJ.cjs → simple-combobox-field-Dgicw0VN.cjs} +2 -2
  86. package/dist/{simple-combobox-field-C4Jmm1AJ.cjs.map → simple-combobox-field-Dgicw0VN.cjs.map} +1 -1
  87. package/dist/{simple-date-field-D7-UWd6G.mjs → simple-date-field-DE5Z-Zkc.mjs} +2 -2
  88. package/dist/{simple-date-field-D7-UWd6G.mjs.map → simple-date-field-DE5Z-Zkc.mjs.map} +1 -1
  89. package/dist/{simple-date-field-JVkBTfCc.cjs → simple-date-field-hORsbXHE.cjs} +2 -2
  90. package/dist/{simple-date-field-JVkBTfCc.cjs.map → simple-date-field-hORsbXHE.cjs.map} +1 -1
  91. package/dist/{simple-email-field-DHnUuabs.mjs → simple-email-field-CFbpYis_.mjs} +2 -2
  92. package/dist/{simple-email-field-DHnUuabs.mjs.map → simple-email-field-CFbpYis_.mjs.map} +1 -1
  93. package/dist/{simple-email-field-BBrdKmN8.cjs → simple-email-field-DpuMlzxg.cjs} +2 -2
  94. package/dist/{simple-email-field-BBrdKmN8.cjs.map → simple-email-field-DpuMlzxg.cjs.map} +1 -1
  95. package/dist/{simple-number-field-DGaUnBOr.mjs → simple-number-field-BY0b4BJp.mjs} +2 -2
  96. package/dist/{simple-number-field-DGaUnBOr.mjs.map → simple-number-field-BY0b4BJp.mjs.map} +1 -1
  97. package/dist/{simple-number-field-CZ-ycDza.cjs → simple-number-field-C4y4rQcw.cjs} +2 -2
  98. package/dist/{simple-number-field-CZ-ycDza.cjs.map → simple-number-field-C4y4rQcw.cjs.map} +1 -1
  99. package/dist/{simple-password-field-BUSJzB-t.cjs → simple-password-field-BUzKJ0fu.cjs} +2 -2
  100. package/dist/{simple-password-field-BUSJzB-t.cjs.map → simple-password-field-BUzKJ0fu.cjs.map} +1 -1
  101. package/dist/{simple-password-field-BxYeEv-p.mjs → simple-password-field-CA0FuETK.mjs} +2 -2
  102. package/dist/{simple-password-field-BxYeEv-p.mjs.map → simple-password-field-CA0FuETK.mjs.map} +1 -1
  103. package/dist/{simple-radio-group-field-yJdq-reX.mjs → simple-radio-group-field-BM7HBTSs.mjs} +2 -2
  104. package/dist/{simple-radio-group-field-yJdq-reX.mjs.map → simple-radio-group-field-BM7HBTSs.mjs.map} +1 -1
  105. package/dist/{simple-radio-group-field-CQTkbvt9.cjs → simple-radio-group-field-CCxUaYom.cjs} +2 -2
  106. package/dist/{simple-radio-group-field-CQTkbvt9.cjs.map → simple-radio-group-field-CCxUaYom.cjs.map} +1 -1
  107. package/dist/{simple-select-field-Cp64m8Aa.mjs → simple-select-field-CeTVQwmP.mjs} +2 -2
  108. package/dist/{simple-select-field-Cp64m8Aa.mjs.map → simple-select-field-CeTVQwmP.mjs.map} +1 -1
  109. package/dist/{simple-select-field-CUFuptbH.cjs → simple-select-field-CzN4Xb7n.cjs} +2 -2
  110. package/dist/{simple-select-field-CUFuptbH.cjs.map → simple-select-field-CzN4Xb7n.cjs.map} +1 -1
  111. package/dist/{simple-text-field-Dl2IOsO3.mjs → simple-text-field-CDsgWUFD.mjs} +2 -2
  112. package/dist/{simple-text-field-Dl2IOsO3.mjs.map → simple-text-field-CDsgWUFD.mjs.map} +1 -1
  113. package/dist/{simple-text-field-B2Z1E4sG.cjs → simple-text-field-DGZL0gML.cjs} +2 -2
  114. package/dist/{simple-text-field-B2Z1E4sG.cjs.map → simple-text-field-DGZL0gML.cjs.map} +1 -1
  115. package/dist/{simple-textarea-field-CM9aHy-q.mjs → simple-textarea-field-BiuHXtqj.mjs} +2 -2
  116. package/dist/{simple-textarea-field-CM9aHy-q.mjs.map → simple-textarea-field-BiuHXtqj.mjs.map} +1 -1
  117. package/dist/{simple-textarea-field-Cjjk9WOW.cjs → simple-textarea-field-vGYOegPj.cjs} +2 -2
  118. package/dist/{simple-textarea-field-Cjjk9WOW.cjs.map → simple-textarea-field-vGYOegPj.cjs.map} +1 -1
  119. package/dist/{switch-field-IXQ1Blrd.mjs → switch-field-BVgtm94W.mjs} +2 -2
  120. package/dist/{switch-field-IXQ1Blrd.mjs.map → switch-field-BVgtm94W.mjs.map} +1 -1
  121. package/dist/{switch-field-CO5M4qiM.cjs → switch-field-DPB3JDT3.cjs} +2 -2
  122. package/dist/{switch-field-CO5M4qiM.cjs.map → switch-field-DPB3JDT3.cjs.map} +1 -1
  123. package/dist/tanstack-form-CKAWexet.mjs +2 -0
  124. package/dist/{tanstack-form-DJMaMeUh.mjs.map → tanstack-form-CKAWexet.mjs.map} +1 -1
  125. package/dist/{tanstack-form-BC61U3F-.cjs → tanstack-form-CX3lC3mC.cjs} +2 -2
  126. package/dist/{tanstack-form-BC61U3F-.cjs.map → tanstack-form-CX3lC3mC.cjs.map} +1 -1
  127. package/dist/{text-editor-field-D_l4zp_y.cjs → text-editor-field-Ddvgdo_p.cjs} +2 -2
  128. package/dist/{text-editor-field-D_l4zp_y.cjs.map → text-editor-field-Ddvgdo_p.cjs.map} +1 -1
  129. package/dist/{text-editor-field-DxLBaxTL.mjs → text-editor-field-qa3t2GBg.mjs} +2 -2
  130. package/dist/{text-editor-field-DxLBaxTL.mjs.map → text-editor-field-qa3t2GBg.mjs.map} +1 -1
  131. package/dist/text-field-CBUTZKGH.mjs +2 -0
  132. package/dist/text-field-CBUTZKGH.mjs.map +1 -0
  133. package/dist/text-field-Cwu0xuXt.cjs +2 -0
  134. package/dist/text-field-Cwu0xuXt.cjs.map +1 -0
  135. package/dist/{textarea-field-BoQtVUI-.mjs → textarea-field-Ctj5o5my.mjs} +2 -2
  136. package/dist/{textarea-field-BoQtVUI-.mjs.map → textarea-field-Ctj5o5my.mjs.map} +1 -1
  137. package/dist/{textarea-field-IZUGVQjJ.cjs → textarea-field-jOqHJcAL.cjs} +2 -2
  138. package/dist/{textarea-field-IZUGVQjJ.cjs.map → textarea-field-jOqHJcAL.cjs.map} +1 -1
  139. package/dist/{title-field-CKxwzMOM.cjs → title-field-B2hM3S_S.cjs} +2 -2
  140. package/dist/{title-field-CKxwzMOM.cjs.map → title-field-B2hM3S_S.cjs.map} +1 -1
  141. package/dist/{title-field-84EnHPvl.mjs → title-field-oAqHRw59.mjs} +2 -2
  142. package/dist/{title-field-84EnHPvl.mjs.map → title-field-oAqHRw59.mjs.map} +1 -1
  143. package/package.json +1 -1
  144. package/dist/combobox-field-CAN8g_xv.mjs +0 -2
  145. package/dist/combobox-field-CAN8g_xv.mjs.map +0 -1
  146. package/dist/combobox-field-DERJQd5o.cjs +0 -2
  147. package/dist/combobox-field-DERJQd5o.cjs.map +0 -1
  148. package/dist/container-form-BdsEX0NH.mjs +0 -2
  149. package/dist/container-form-BdsEX0NH.mjs.map +0 -1
  150. package/dist/container-form-CxxUYctk.cjs +0 -2
  151. package/dist/container-form-CxxUYctk.cjs.map +0 -1
  152. package/dist/date-field--jOKZ2x1.cjs +0 -2
  153. package/dist/date-field--jOKZ2x1.cjs.map +0 -1
  154. package/dist/date-field-CXzcsnjn.mjs +0 -2
  155. package/dist/date-field-CXzcsnjn.mjs.map +0 -1
  156. package/dist/section-form-Dv9fKWmB.mjs +0 -2
  157. package/dist/section-form-Dv9fKWmB.mjs.map +0 -1
  158. package/dist/section-form-cH13fOhg.cjs +0 -2
  159. package/dist/section-form-cH13fOhg.cjs.map +0 -1
  160. package/dist/tanstack-form-DJMaMeUh.mjs +0 -2
  161. package/dist/text-field-B8xQe0U9.cjs +0 -2
  162. package/dist/text-field-B8xQe0U9.cjs.map +0 -1
  163. package/dist/text-field-BrxKYCui.mjs +0 -2
  164. package/dist/text-field-BrxKYCui.mjs.map +0 -1
@@ -1,2 +0,0 @@
1
- const e=require("./separator-sBz__BXC.cjs");let t=require("react/jsx-runtime");const n=({children:e})=>(0,t.jsx)(`header`,{"data-slot":`section-header`,className:`flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight gap-x-2 [&>svg]:size-5 [&>svg]:min-w-5`,children:e}),r=({children:e})=>(0,t.jsx)(`main`,{"data-slot":`section-main`,className:`relative flex flex-col py-4`,children:e}),i=({title:i,icon:a,children:o})=>(0,t.jsxs)(`section`,{"data-slot":`section-form`,className:`flex flex-col rounded-md bg-background shadow-card ring-1 ring-border`,children:[(0,t.jsxs)(n,{children:[a,i]}),(0,t.jsx)(e.t,{}),(0,t.jsx)(r,{children:o})]});exports.TanStackSectionForm=i;
2
- //# sourceMappingURL=section-form-cH13fOhg.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"section-form-cH13fOhg.cjs","names":["Separator"],"sources":["../packages/components/features/tanstack-form/components/forms/section-form.tsx"],"sourcesContent":["'use client';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Internal header sub-component for `TanStackSectionForm` that renders a styled section title.\n */\nconst SectionHeader: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <header\n data-slot=\"section-header\"\n className=\"flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight gap-x-2 [&>svg]:size-5 [&>svg]:min-w-5\"\n >\n {children}\n </header>\n );\n};\n\n/**\n * Internal body sub-component for `TanStackSectionForm` that wraps field content with vertical padding.\n */\nconst SectionMain: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <main data-slot=\"section-main\" className=\"relative flex flex-col py-4\">\n {children}\n </main>\n );\n};\n\n/**\n * Renders a card-like form section with a titled header, separator, and a content area for form fields.\n *\n * @example\n * import { TanStackSectionForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackSectionForm title=\"Account Settings\">\n * <EmailField />\n * <PasswordField />\n * </TanStackSectionForm>\n */\nexport const TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n icon?: React.ReactNode;\n }>\n> = ({ title, icon: Icon, children }) => {\n return (\n <section data-slot=\"section-form\" className=\"flex flex-col rounded-md bg-background shadow-card ring-1 ring-border\">\n <SectionHeader>\n {Icon}\n {title}\n </SectionHeader>\n <Separator />\n <SectionMain>{children}</SectionMain>\n </section>\n );\n};\n"],"mappings":"+EAOA,MAAM,GAAoD,CAAE,eAExD,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,YAAU,iBACV,UAAU,+HAET,UACK,CAAA,EAON,GAAkD,CAAE,eAEtD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,eAAe,UAAU,8BACtC,UACG,CAAA,EAeG,GAMR,CAAE,QAAO,KAAM,EAAM,eAEtB,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,YAAU,eAAe,UAAU,iFAA5C,EACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,CACG,EACA,CACY,CAAA,CAAA,GACf,EAAA,EAAA,IAAA,CAACA,EAAAA,EAAD,CAAY,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,UAAsB,CAAA,CAC7B"}
@@ -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-BrxKYCui.mjs`).then(e=>({default:e.TextField}))),p=d(()=>import(`./textarea-field-BoQtVUI-.mjs`).then(e=>({default:e.TextareaField}))),m=d(()=>import(`./text-editor-field-DxLBaxTL.mjs`).then(e=>({default:e.TextEditorField}))),h=d(()=>import(`./number-field-CZ06Uzb3.mjs`).then(e=>({default:e.NumberField}))),g=d(()=>import(`./email-field-HFmUE81o.mjs`).then(e=>({default:e.EmailField}))),_=d(()=>import(`./password-field-DSeObMIU.mjs`).then(e=>({default:e.PasswordField}))),v=d(()=>import(`./select-field-B-bbY7td.mjs`).then(e=>({default:e.SelectField}))),y=d(()=>import(`./combobox-field-CAN8g_xv.mjs`).then(e=>({default:e.ComboboxField}))),b=d(()=>import(`./date-field-CXzcsnjn.mjs`).then(e=>({default:e.DateField}))),x=d(()=>import(`./switch-field-IXQ1Blrd.mjs`).then(e=>({default:e.SwitchField}))),S=d(()=>import(`./radio-group-field-0BXRGTJx.mjs`).then(e=>({default:e.RadioGroupField}))),C=d(()=>import(`./checkbox-field-BaqE-eVv.mjs`).then(e=>({default:e.CheckboxField}))),w=d(()=>import(`./simple-text-field-Dl2IOsO3.mjs`).then(e=>({default:e.SimpleTextField}))),T=d(()=>import(`./simple-email-field-DHnUuabs.mjs`).then(e=>({default:e.SimpleEmailField}))),E=d(()=>import(`./simple-password-field-BxYeEv-p.mjs`).then(e=>({default:e.SimplePasswordField}))),D=d(()=>import(`./simple-textarea-field-CM9aHy-q.mjs`).then(e=>({default:e.SimpleTextareaField}))),O=d(()=>import(`./simple-number-field-DGaUnBOr.mjs`).then(e=>({default:e.SimpleNumberField}))),k=d(()=>import(`./simple-select-field-Cp64m8Aa.mjs`).then(e=>({default:e.SimpleSelectField}))),A=n(()=>import(`./simple-array-field-CBG9o26e.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-BEsGOyof.mjs`).then(e=>({default:e.SimpleBooleanField}))),N=d(()=>import(`./simple-combobox-field-BbhxP-te.mjs`).then(e=>({default:e.SimpleComboboxField}))),P=d(()=>import(`./simple-date-field-D7-UWd6G.mjs`).then(e=>({default:e.SimpleDateField}))),F=d(()=>import(`./simple-radio-group-field-yJdq-reX.mjs`).then(e=>({default:e.SimpleRadioGroupField}))),I=d(()=>import(`./simple-array-field-CBG9o26e.mjs`).then(e=>({default:e.ArrayCol}))),L=d(()=>import(`./simple-array-field-CBG9o26e.mjs`).then(e=>({default:e.ArrayHeaderRow}))),R=d(()=>import(`./dialog-form-BbumLQqe.mjs`).then(e=>({default:e.TanStackDialogForm}))),z=d(()=>import(`./popover-form-rwhAulOD.mjs`).then(e=>({default:e.TanStackPopoverForm}))),B=d(()=>import(`./container-form-BdsEX0NH.mjs`).then(e=>({default:e.TanStackContainerForm}))),V=d(()=>import(`./section-form-Dv9fKWmB.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-Z8BX9Hmy.mjs`).then(e=>({default:e.TanStackActionsForm}))),K=d(()=>import(`./action-submit-Bew9PJtF.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-DJMaMeUh.mjs.map
@@ -1,2 +0,0 @@
1
- const e=require("./tanstack-form-BC61U3F-.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-B8xQe0U9.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-field-B8xQe0U9.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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"}
@@ -1,2 +0,0 @@
1
- import{G as e}from"./tanstack-form-DJMaMeUh.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-BrxKYCui.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-field-BrxKYCui.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":"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"}