@techzyapp/ui-library 1.0.25 → 1.0.27

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 (478) hide show
  1. package/dist/{AdminRoot-CgvtgUpW.js → AdminRoot-C4OyuOIr.js} +4 -4
  2. package/dist/{AdminRoot-CgvtgUpW.js.map → AdminRoot-C4OyuOIr.js.map} +1 -1
  3. package/dist/{AdminRoot-BkPPRkyQ.cjs → AdminRoot-bHywlbML.cjs} +2 -2
  4. package/dist/{AdminRoot-BkPPRkyQ.cjs.map → AdminRoot-bHywlbML.cjs.map} +1 -1
  5. package/dist/{Alert-udX1ybuC.cjs → Alert-DeGgilkH.cjs} +2 -2
  6. package/dist/{Alert-udX1ybuC.cjs.map → Alert-DeGgilkH.cjs.map} +1 -1
  7. package/dist/{Alert-DXmzM_rh.js → Alert-rNjfqj2Z.js} +3 -3
  8. package/dist/{Alert-DXmzM_rh.js.map → Alert-rNjfqj2Z.js.map} +1 -1
  9. package/dist/{AuthLayout-BRUxDgzs.cjs → AuthLayout-ChILVWZ-.cjs} +2 -2
  10. package/dist/{AuthLayout-BRUxDgzs.cjs.map → AuthLayout-ChILVWZ-.cjs.map} +1 -1
  11. package/dist/{AuthLayout-CP9qu6Bv.js → AuthLayout-zAS3jlYc.js} +2 -2
  12. package/dist/{AuthLayout-CP9qu6Bv.js.map → AuthLayout-zAS3jlYc.js.map} +1 -1
  13. package/dist/{Avatar-Q50J8wdN.js → Avatar-BGPGxry2.js} +25 -25
  14. package/dist/{Avatar-Q50J8wdN.js.map → Avatar-BGPGxry2.js.map} +1 -1
  15. package/dist/Avatar-D_YivyqV.cjs +2 -0
  16. package/dist/{Avatar-Dgf04PBC.cjs.map → Avatar-D_YivyqV.cjs.map} +1 -1
  17. package/dist/{AvatarGroup-uW0SD5P4.cjs → AvatarGroup-Bnf_RSc9.cjs} +2 -2
  18. package/dist/{AvatarGroup-uW0SD5P4.cjs.map → AvatarGroup-Bnf_RSc9.cjs.map} +1 -1
  19. package/dist/{AvatarGroup-YaNasLMS.js → AvatarGroup-Difz4lLR.js} +2 -2
  20. package/dist/{AvatarGroup-YaNasLMS.js.map → AvatarGroup-Difz4lLR.js.map} +1 -1
  21. package/dist/Badge-BmFgusOa.js +50 -0
  22. package/dist/{Badge-DSWigoGC.js.map → Badge-BmFgusOa.js.map} +1 -1
  23. package/dist/Badge-DVbe1rAI.cjs +2 -0
  24. package/dist/{Badge-BQpr2Jee.cjs.map → Badge-DVbe1rAI.cjs.map} +1 -1
  25. package/dist/{Breadcrumbs-DQHHeLId.js → Breadcrumbs-BJHKk0Sn.js} +3 -3
  26. package/dist/{Breadcrumbs-DQHHeLId.js.map → Breadcrumbs-BJHKk0Sn.js.map} +1 -1
  27. package/dist/{Breadcrumbs-CsYTiX2h.cjs → Breadcrumbs-CGcpMlxm.cjs} +2 -2
  28. package/dist/{Breadcrumbs-CsYTiX2h.cjs.map → Breadcrumbs-CGcpMlxm.cjs.map} +1 -1
  29. package/dist/Button-BZ_o-akc.cjs +2 -0
  30. package/dist/{Button-CXmDOzPk.cjs.map → Button-BZ_o-akc.cjs.map} +1 -1
  31. package/dist/Button-obe6rono.js +72 -0
  32. package/dist/{Button-DBs8xnA5.js.map → Button-obe6rono.js.map} +1 -1
  33. package/dist/{Calendar-CtteUt82.js → Calendar-SCih0NtS.js} +4 -4
  34. package/dist/{Calendar-CtteUt82.js.map → Calendar-SCih0NtS.js.map} +1 -1
  35. package/dist/{Calendar-B2nMXk4C.cjs → Calendar-lfpNwivC.cjs} +2 -2
  36. package/dist/{Calendar-B2nMXk4C.cjs.map → Calendar-lfpNwivC.cjs.map} +1 -1
  37. package/dist/{Card-DYKnWt-L.js → Card-BRJV2JZE.js} +2 -2
  38. package/dist/{Card-DYKnWt-L.js.map → Card-BRJV2JZE.js.map} +1 -1
  39. package/dist/{Card-DGF22HbS.cjs → Card-KvvNlchc.cjs} +2 -2
  40. package/dist/{Card-DGF22HbS.cjs.map → Card-KvvNlchc.cjs.map} +1 -1
  41. package/dist/{Chip-DdKhcstm.js → Chip-CQ4cYVl_.js} +31 -31
  42. package/dist/{Chip-DdKhcstm.js.map → Chip-CQ4cYVl_.js.map} +1 -1
  43. package/dist/Chip-CYz4vxHm.cjs +2 -0
  44. package/dist/{Chip-gUH_7nQc.cjs.map → Chip-CYz4vxHm.cjs.map} +1 -1
  45. package/dist/ChoiceCardGroup-D3HL7dHj.js +181 -0
  46. package/dist/{ChoiceCardGroup-DBohUnRj.js.map → ChoiceCardGroup-D3HL7dHj.js.map} +1 -1
  47. package/dist/ChoiceCardGroup-pIOKIUI0.cjs +2 -0
  48. package/dist/{ChoiceCardGroup-d0VVTUi5.cjs.map → ChoiceCardGroup-pIOKIUI0.cjs.map} +1 -1
  49. package/dist/{CodeBlock-DD_d3-sM.js → CodeBlock-DddGTLu1.js} +3 -3
  50. package/dist/{CodeBlock-DD_d3-sM.js.map → CodeBlock-DddGTLu1.js.map} +1 -1
  51. package/dist/{CodeBlock-C6tQtbHU.cjs → CodeBlock-H75dbOvg.cjs} +2 -2
  52. package/dist/{CodeBlock-C6tQtbHU.cjs.map → CodeBlock-H75dbOvg.cjs.map} +1 -1
  53. package/dist/ColorPicker-CKc8k-Dp.cjs +2 -0
  54. package/dist/ColorPicker-CKc8k-Dp.cjs.map +1 -0
  55. package/dist/{ColorPicker-Dw6Qk0iy.js → ColorPicker-Cw-2X6u9.js} +35 -26
  56. package/dist/ColorPicker-Cw-2X6u9.js.map +1 -0
  57. package/dist/ColorPickerPanel-DQ4CFnGa.cjs +2 -0
  58. package/dist/ColorPickerPanel-DQ4CFnGa.cjs.map +1 -0
  59. package/dist/ColorPickerPanel-PYaF5wPL.js +322 -0
  60. package/dist/ColorPickerPanel-PYaF5wPL.js.map +1 -0
  61. package/dist/ColorRamp-AkY9gq6Y.cjs +2 -0
  62. package/dist/ColorRamp-AkY9gq6Y.cjs.map +1 -0
  63. package/dist/ColorRamp-DnlJNKfy.js +126 -0
  64. package/dist/ColorRamp-DnlJNKfy.js.map +1 -0
  65. package/dist/{ConfigProvider-Bszl3Wr3.cjs → ConfigProvider-BicoaBLj.cjs} +2 -2
  66. package/dist/ConfigProvider-BicoaBLj.cjs.map +1 -0
  67. package/dist/{ConfigProvider-DR9YMy9U.js → ConfigProvider-DL9fylMo.js} +2 -2
  68. package/dist/ConfigProvider-DL9fylMo.js.map +1 -0
  69. package/dist/CopyButton-BqFGC-Ca.cjs +2 -0
  70. package/dist/{CopyButton-Ct-8AmmX.cjs.map → CopyButton-BqFGC-Ca.cjs.map} +1 -1
  71. package/dist/CopyButton-D6-kcVCA.js +43 -0
  72. package/dist/{CopyButton-DJ1PSJZU.js.map → CopyButton-D6-kcVCA.js.map} +1 -1
  73. package/dist/DashedButton-B7xodc3N.cjs +2 -0
  74. package/dist/{DashedButton-3C4IZuo4.cjs.map → DashedButton-B7xodc3N.cjs.map} +1 -1
  75. package/dist/DashedButton-iM7kzopW.js +59 -0
  76. package/dist/{DashedButton-BXZAyMtw.js.map → DashedButton-iM7kzopW.js.map} +1 -1
  77. package/dist/{DatePicker-BxEydgfu.cjs → DatePicker-BvGFP2AL.cjs} +2 -2
  78. package/dist/{DatePicker-BxEydgfu.cjs.map → DatePicker-BvGFP2AL.cjs.map} +1 -1
  79. package/dist/{DatePicker-CJioG5M7.js → DatePicker-DP7yASzq.js} +5 -5
  80. package/dist/{DatePicker-CJioG5M7.js.map → DatePicker-DP7yASzq.js.map} +1 -1
  81. package/dist/DatePicker.module-BDtTsg8M.cjs +2 -0
  82. package/dist/{DatePicker.module-tE-tGNBd.cjs.map → DatePicker.module-BDtTsg8M.cjs.map} +1 -1
  83. package/dist/DatePicker.module-CMMQyEhG.js +138 -0
  84. package/dist/{DatePicker.module-BZDftL4g.js.map → DatePicker.module-CMMQyEhG.js.map} +1 -1
  85. package/dist/{DateTimePicker-e2zj2bhS.js → DateTimePicker-CzRduOFz.js} +8 -8
  86. package/dist/{DateTimePicker-e2zj2bhS.js.map → DateTimePicker-CzRduOFz.js.map} +1 -1
  87. package/dist/{DateTimePicker-COEj2Z0F.cjs → DateTimePicker-DOzft9kg.cjs} +2 -2
  88. package/dist/{DateTimePicker-COEj2Z0F.cjs.map → DateTimePicker-DOzft9kg.cjs.map} +1 -1
  89. package/dist/EmptyState-A5nPGnHA.js +38 -0
  90. package/dist/{EmptyState-BTd7aVgu.js.map → EmptyState-A5nPGnHA.js.map} +1 -1
  91. package/dist/EmptyState-CTTOy9aY.cjs +2 -0
  92. package/dist/{EmptyState-Bv4XXnD1.cjs.map → EmptyState-CTTOy9aY.cjs.map} +1 -1
  93. package/dist/{FileCard-DY8N9Lzz.js → FileCard-BmPEEcue.js} +4 -4
  94. package/dist/{FileCard-DY8N9Lzz.js.map → FileCard-BmPEEcue.js.map} +1 -1
  95. package/dist/{FileCard-DW5Ur8Aj.cjs → FileCard-C4BkGMtK.cjs} +2 -2
  96. package/dist/{FileCard-DW5Ur8Aj.cjs.map → FileCard-C4BkGMtK.cjs.map} +1 -1
  97. package/dist/FileUploader-D_F64mob.cjs +2 -0
  98. package/dist/FileUploader-D_F64mob.cjs.map +1 -0
  99. package/dist/{FileUploader-BYF5FvUc.js → FileUploader-Dv_3bjZA.js} +217 -217
  100. package/dist/FileUploader-Dv_3bjZA.js.map +1 -0
  101. package/dist/{Flag-CB4YyPj3.cjs → Flag-BM_2VJ1v.cjs} +2 -2
  102. package/dist/{Flag-CB4YyPj3.cjs.map → Flag-BM_2VJ1v.cjs.map} +1 -1
  103. package/dist/{Flag-yA1y5XzR.js → Flag-CzCEpB8E.js} +2 -2
  104. package/dist/{Flag-yA1y5XzR.js.map → Flag-CzCEpB8E.js.map} +1 -1
  105. package/dist/{FullscreenToggle-0lskYnpx.cjs → FullscreenToggle-BL0nBrsL.cjs} +2 -2
  106. package/dist/{FullscreenToggle-0lskYnpx.cjs.map → FullscreenToggle-BL0nBrsL.cjs.map} +1 -1
  107. package/dist/{FullscreenToggle-jSLruiKt.js → FullscreenToggle-HZQOIa21.js} +3 -3
  108. package/dist/{FullscreenToggle-jSLruiKt.js.map → FullscreenToggle-HZQOIa21.js.map} +1 -1
  109. package/dist/IconButton-B87ipBK3.cjs +2 -0
  110. package/dist/{IconButton-BN-bZxEi.cjs.map → IconButton-B87ipBK3.cjs.map} +1 -1
  111. package/dist/IconButton-CBp8QuTO.js +68 -0
  112. package/dist/{IconButton-BEGWfcVc.js.map → IconButton-CBp8QuTO.js.map} +1 -1
  113. package/dist/Loader-0Imnbael.cjs +2 -0
  114. package/dist/{Loader-B5YqzEYy.cjs.map → Loader-0Imnbael.cjs.map} +1 -1
  115. package/dist/Loader-fffFnQqS.js +28 -0
  116. package/dist/{Loader-BZIa8hwv.js.map → Loader-fffFnQqS.js.map} +1 -1
  117. package/dist/MobileFrame-8FSsYA_w.js +91 -0
  118. package/dist/MobileFrame-8FSsYA_w.js.map +1 -0
  119. package/dist/MobileFrame-Dsfgd_4k.cjs +2 -0
  120. package/dist/MobileFrame-Dsfgd_4k.cjs.map +1 -0
  121. package/dist/{Modal-0V-REVV-.cjs → Modal--e2qGisF.cjs} +2 -2
  122. package/dist/{Modal-0V-REVV-.cjs.map → Modal--e2qGisF.cjs.map} +1 -1
  123. package/dist/{Modal-B7yoFC3o.js → Modal-DJljaPqV.js} +3 -3
  124. package/dist/{Modal-B7yoFC3o.js.map → Modal-DJljaPqV.js.map} +1 -1
  125. package/dist/{MultiSelect-gj9Ymeh2.cjs → MultiSelect-CvecZeMU.cjs} +2 -2
  126. package/dist/{MultiSelect-gj9Ymeh2.cjs.map → MultiSelect-CvecZeMU.cjs.map} +1 -1
  127. package/dist/{MultiSelect-C8xuXaoR.js → MultiSelect-DLoS04lZ.js} +4 -4
  128. package/dist/{MultiSelect-C8xuXaoR.js.map → MultiSelect-DLoS04lZ.js.map} +1 -1
  129. package/dist/{NumberField-CEt95jcC.cjs → NumberField-C_HZXBuw.cjs} +2 -2
  130. package/dist/{NumberField-CEt95jcC.cjs.map → NumberField-C_HZXBuw.cjs.map} +1 -1
  131. package/dist/{NumberField-2yM0mmyj.js → NumberField-DYGVQdL5.js} +4 -4
  132. package/dist/{NumberField-2yM0mmyj.js.map → NumberField-DYGVQdL5.js.map} +1 -1
  133. package/dist/{OtpField-CkliY82J.js → OtpField-CpQr_ZqL.js} +3 -3
  134. package/dist/{OtpField-CkliY82J.js.map → OtpField-CpQr_ZqL.js.map} +1 -1
  135. package/dist/{OtpField-on-K0_fM.cjs → OtpField-DKbUP0F6.cjs} +2 -2
  136. package/dist/{OtpField-on-K0_fM.cjs.map → OtpField-DKbUP0F6.cjs.map} +1 -1
  137. package/dist/{PageLayout-DzPh_G6H.js → PageLayout-CCcPCfJF.js} +2 -2
  138. package/dist/{PageLayout-DzPh_G6H.js.map → PageLayout-CCcPCfJF.js.map} +1 -1
  139. package/dist/{PageLayout-DGHu7Vm3.cjs → PageLayout-CuWXukUv.cjs} +2 -2
  140. package/dist/{PageLayout-DGHu7Vm3.cjs.map → PageLayout-CuWXukUv.cjs.map} +1 -1
  141. package/dist/PageNotFound-JKOnpyHD.cjs +2 -0
  142. package/dist/{PageNotFound-B8_eIT8p.cjs.map → PageNotFound-JKOnpyHD.cjs.map} +1 -1
  143. package/dist/{PageNotFound-CCFfPHgA.js → PageNotFound-LWH2tU5E.js} +9 -9
  144. package/dist/{PageNotFound-CCFfPHgA.js.map → PageNotFound-LWH2tU5E.js.map} +1 -1
  145. package/dist/Pagination-BwtbmITJ.js +139 -0
  146. package/dist/{Pagination-CmskZjcz.js.map → Pagination-BwtbmITJ.js.map} +1 -1
  147. package/dist/Pagination-M7njqOUt.cjs +2 -0
  148. package/dist/{Pagination-BdVebW2L.cjs.map → Pagination-M7njqOUt.cjs.map} +1 -1
  149. package/dist/PaletteField-CUyzLrny.js +54 -0
  150. package/dist/PaletteField-CUyzLrny.js.map +1 -0
  151. package/dist/PaletteField-iBIvOvNi.cjs +2 -0
  152. package/dist/PaletteField-iBIvOvNi.cjs.map +1 -0
  153. package/dist/RadioGroup-Byy-eSY3.cjs +2 -0
  154. package/dist/{RadioGroup-C8u7eNBS.cjs.map → RadioGroup-Byy-eSY3.cjs.map} +1 -1
  155. package/dist/RadioGroup-D_1_Heta.js +141 -0
  156. package/dist/{RadioGroup-DbodUJW8.js.map → RadioGroup-D_1_Heta.js.map} +1 -1
  157. package/dist/RemoveDialog-DUrD2Em8.js +47 -0
  158. package/dist/{RemoveDialog-CV75B0aN.js.map → RemoveDialog-DUrD2Em8.js.map} +1 -1
  159. package/dist/RemoveDialog-FZWYAxRy.cjs +2 -0
  160. package/dist/{RemoveDialog-DmOk0ezc.cjs.map → RemoveDialog-FZWYAxRy.cjs.map} +1 -1
  161. package/dist/{RichTextEditor-Bm8FFbcR.js → RichTextEditor-CG6LoNiw.js} +9 -9
  162. package/dist/RichTextEditor-CG6LoNiw.js.map +1 -0
  163. package/dist/{RichTextEditor-uXddgtlk.cjs → RichTextEditor-mpMCG8jX.cjs} +2 -2
  164. package/dist/RichTextEditor-mpMCG8jX.cjs.map +1 -0
  165. package/dist/RootLayout-CPxDqfGb.cjs +2 -0
  166. package/dist/{RootLayout-kssj9exn.cjs.map → RootLayout-CPxDqfGb.cjs.map} +1 -1
  167. package/dist/RootLayout-D3K-pAMO.js +515 -0
  168. package/dist/{RootLayout-Cf7Rr9Iz.js.map → RootLayout-D3K-pAMO.js.map} +1 -1
  169. package/dist/{Select-CdX3Ks7y.js → Select-BB9oOoWZ.js} +3 -3
  170. package/dist/{Select-CdX3Ks7y.js.map → Select-BB9oOoWZ.js.map} +1 -1
  171. package/dist/{Select-7vEGJCvA.cjs → Select-iP2p5jad.cjs} +2 -2
  172. package/dist/{Select-7vEGJCvA.cjs.map → Select-iP2p5jad.cjs.map} +1 -1
  173. package/dist/{Sidebar-DcKIEfhy.cjs → Sidebar-Boi7UgHV.cjs} +2 -2
  174. package/dist/{Sidebar-DcKIEfhy.cjs.map → Sidebar-Boi7UgHV.cjs.map} +1 -1
  175. package/dist/{Sidebar-YH-DoNG9.js → Sidebar-CsPnv4mu.js} +60 -60
  176. package/dist/{Sidebar-YH-DoNG9.js.map → Sidebar-CsPnv4mu.js.map} +1 -1
  177. package/dist/Slider-D3dbEOQY.cjs +2 -0
  178. package/dist/{Slider-dxYVXRev.cjs.map → Slider-D3dbEOQY.cjs.map} +1 -1
  179. package/dist/Slider-D7SvowmM.js +184 -0
  180. package/dist/{Slider-oGXd5e9X.js.map → Slider-D7SvowmM.js.map} +1 -1
  181. package/dist/{SpeedDial-DWNuC6f8.js → SpeedDial-B8XMUATN.js} +2 -2
  182. package/dist/{SpeedDial-DWNuC6f8.js.map → SpeedDial-B8XMUATN.js.map} +1 -1
  183. package/dist/{SpeedDial-9_Yk8AGx.cjs → SpeedDial-CZ22T8GL.cjs} +2 -2
  184. package/dist/{SpeedDial-9_Yk8AGx.cjs.map → SpeedDial-CZ22T8GL.cjs.map} +1 -1
  185. package/dist/{Stepper-CuqFpamY.js → Stepper-B_e_PGZE.js} +70 -70
  186. package/dist/{Stepper-CuqFpamY.js.map → Stepper-B_e_PGZE.js.map} +1 -1
  187. package/dist/Stepper-BjkkWawQ.cjs +2 -0
  188. package/dist/{Stepper-B1z_u650.cjs.map → Stepper-BjkkWawQ.cjs.map} +1 -1
  189. package/dist/{SwatchPicker-CCJltwHI.cjs → SwatchPicker-C8amdDnA.cjs} +2 -2
  190. package/dist/{SwatchPicker-CCJltwHI.cjs.map → SwatchPicker-C8amdDnA.cjs.map} +1 -1
  191. package/dist/{SwatchPicker-CqyWngFJ.js → SwatchPicker-DXEE9xqY.js} +2 -2
  192. package/dist/{SwatchPicker-CqyWngFJ.js.map → SwatchPicker-DXEE9xqY.js.map} +1 -1
  193. package/dist/Switch-CodRZD3y.cjs +2 -0
  194. package/dist/{Switch-DRkZ6kHJ.cjs.map → Switch-CodRZD3y.cjs.map} +1 -1
  195. package/dist/Switch-ESrhkpJC.js +85 -0
  196. package/dist/{Switch-DMPJ0fhB.js.map → Switch-ESrhkpJC.js.map} +1 -1
  197. package/dist/Table-Cr1zUtNQ.cjs +2 -0
  198. package/dist/Table-Cr1zUtNQ.cjs.map +1 -0
  199. package/dist/{Table-Drdhfm99.js → Table-DdoUcZoN.js} +60 -51
  200. package/dist/Table-DdoUcZoN.js.map +1 -0
  201. package/dist/Tabs-CZDX7BN-.cjs +2 -0
  202. package/dist/{Tabs-BiKDy_fv.cjs.map → Tabs-CZDX7BN-.cjs.map} +1 -1
  203. package/dist/Tabs-v1GEGUDQ.js +190 -0
  204. package/dist/{Tabs-ytbBzAxG.js.map → Tabs-v1GEGUDQ.js.map} +1 -1
  205. package/dist/{TagsField-CEt_PC5y.js → TagsField-B389eDp4.js} +4 -4
  206. package/dist/{TagsField-CEt_PC5y.js.map → TagsField-B389eDp4.js.map} +1 -1
  207. package/dist/{TagsField-DpDbf0ru.cjs → TagsField-OfrpyHZO.cjs} +2 -2
  208. package/dist/{TagsField-DpDbf0ru.cjs.map → TagsField-OfrpyHZO.cjs.map} +1 -1
  209. package/dist/{TextField-BWdmF-HE.js → TextField-7MobCad5.js} +4 -4
  210. package/dist/{TextField-BWdmF-HE.js.map → TextField-7MobCad5.js.map} +1 -1
  211. package/dist/{TextField-Df_kGy2l.cjs → TextField-B785pRgK.cjs} +2 -2
  212. package/dist/{TextField-Df_kGy2l.cjs.map → TextField-B785pRgK.cjs.map} +1 -1
  213. package/dist/TextField.module-6gYcR9TL.js +27 -0
  214. package/dist/TextField.module-6gYcR9TL.js.map +1 -0
  215. package/dist/TextField.module-DsNCo8vN.cjs +2 -0
  216. package/dist/TextField.module-DsNCo8vN.cjs.map +1 -0
  217. package/dist/{ThemeToggle-CgxF6oUu.js → ThemeToggle-BGdvqXad.js} +3 -3
  218. package/dist/{ThemeToggle-CgxF6oUu.js.map → ThemeToggle-BGdvqXad.js.map} +1 -1
  219. package/dist/{ThemeToggle-BJdXhmfc.cjs → ThemeToggle-BkmZ7s_u.cjs} +2 -2
  220. package/dist/{ThemeToggle-BJdXhmfc.cjs.map → ThemeToggle-BkmZ7s_u.cjs.map} +1 -1
  221. package/dist/{TimeColumns-DxVN0V8l.cjs → TimeColumns-B-xm1DGM.cjs} +2 -2
  222. package/dist/{TimeColumns-DxVN0V8l.cjs.map → TimeColumns-B-xm1DGM.cjs.map} +1 -1
  223. package/dist/{TimeColumns-n-fz50mr.js → TimeColumns-BRlDKx_i.js} +3 -3
  224. package/dist/{TimeColumns-n-fz50mr.js.map → TimeColumns-BRlDKx_i.js.map} +1 -1
  225. package/dist/{TimePicker-Bopxx3zU.js → TimePicker-B_3Ubip0.js} +6 -6
  226. package/dist/{TimePicker-Bopxx3zU.js.map → TimePicker-B_3Ubip0.js.map} +1 -1
  227. package/dist/{TimePicker-DvoemiGz.cjs → TimePicker-DvEIdE4v.cjs} +2 -2
  228. package/dist/{TimePicker-DvoemiGz.cjs.map → TimePicker-DvEIdE4v.cjs.map} +1 -1
  229. package/dist/Timeline-CKEosWka.cjs +2 -0
  230. package/dist/{Timeline-ONU_3gi3.cjs.map → Timeline-CKEosWka.cjs.map} +1 -1
  231. package/dist/Timeline-ufVXmpMY.js +71 -0
  232. package/dist/{Timeline-D3kzt1dy.js.map → Timeline-ufVXmpMY.js.map} +1 -1
  233. package/dist/{Toaster-DZSzFse_.cjs → Toaster-BIFRuqbC.cjs} +2 -2
  234. package/dist/{Toaster-DZSzFse_.cjs.map → Toaster-BIFRuqbC.cjs.map} +1 -1
  235. package/dist/{Toaster-BxIY2H4V.js → Toaster-DuzcRbio.js} +2 -2
  236. package/dist/{Toaster-BxIY2H4V.js.map → Toaster-DuzcRbio.js.map} +1 -1
  237. package/dist/{TranslatedFields-BtDLkQy7.cjs → TranslatedFields-D_a0NVKI.cjs} +2 -2
  238. package/dist/{TranslatedFields-BtDLkQy7.cjs.map → TranslatedFields-D_a0NVKI.cjs.map} +1 -1
  239. package/dist/{TranslatedFields-DmR8LKSG.js → TranslatedFields-HmP0Mg5t.js} +5 -5
  240. package/dist/{TranslatedFields-DmR8LKSG.js.map → TranslatedFields-HmP0Mg5t.js.map} +1 -1
  241. package/dist/{UserCard-J8Bpbh3x.js → UserCard-B1phOVKj.js} +4 -4
  242. package/dist/{UserCard-J8Bpbh3x.js.map → UserCard-B1phOVKj.js.map} +1 -1
  243. package/dist/{UserCard-C1yFvVIc.cjs → UserCard-BvOcDm5W.cjs} +2 -2
  244. package/dist/{UserCard-C1yFvVIc.cjs.map → UserCard-BvOcDm5W.cjs.map} +1 -1
  245. package/dist/color-CgR8ybWZ.cjs +2 -0
  246. package/dist/color-CgR8ybWZ.cjs.map +1 -0
  247. package/dist/color-EQJ2DrcQ.js +24 -0
  248. package/dist/color-EQJ2DrcQ.js.map +1 -0
  249. package/dist/components/Alert/index.cjs +1 -1
  250. package/dist/components/Alert/index.js +1 -1
  251. package/dist/components/AuthLayout/index.cjs +1 -1
  252. package/dist/components/AuthLayout/index.js +1 -1
  253. package/dist/components/Avatar/index.cjs +1 -1
  254. package/dist/components/Avatar/index.js +2 -2
  255. package/dist/components/Badge/index.cjs +1 -1
  256. package/dist/components/Badge/index.js +1 -1
  257. package/dist/components/Breadcrumbs/index.cjs +1 -1
  258. package/dist/components/Breadcrumbs/index.js +1 -1
  259. package/dist/components/Button/index.cjs +1 -1
  260. package/dist/components/Button/index.js +1 -1
  261. package/dist/components/Card/index.cjs +1 -1
  262. package/dist/components/Card/index.js +1 -1
  263. package/dist/components/Chip/index.cjs +1 -1
  264. package/dist/components/Chip/index.js +1 -1
  265. package/dist/components/ChoiceCard/index.cjs +1 -1
  266. package/dist/components/ChoiceCard/index.js +1 -1
  267. package/dist/components/CodeBlock/index.cjs +1 -1
  268. package/dist/components/CodeBlock/index.js +1 -1
  269. package/dist/components/ColorPicker/ColorPicker.d.cts +5 -0
  270. package/dist/components/ColorPicker/ColorPicker.d.ts +5 -0
  271. package/dist/components/ColorPicker/ColorPickerPanel.d.cts +6 -1
  272. package/dist/components/ColorPicker/ColorPickerPanel.d.ts +6 -1
  273. package/dist/components/ColorPicker/colorUtils.d.cts +3 -12
  274. package/dist/components/ColorPicker/colorUtils.d.ts +3 -12
  275. package/dist/components/ColorPicker/index.cjs +1 -1
  276. package/dist/components/ColorPicker/index.js +1 -1
  277. package/dist/components/ColorRamp/ColorRamp.d.cts +36 -0
  278. package/dist/components/ColorRamp/ColorRamp.d.ts +36 -0
  279. package/dist/components/ColorRamp/index.cjs +2 -0
  280. package/dist/components/ColorRamp/index.cjs.map +1 -0
  281. package/dist/components/ColorRamp/index.d.cts +3 -0
  282. package/dist/components/ColorRamp/index.d.ts +3 -0
  283. package/dist/components/ColorRamp/index.js +6 -0
  284. package/dist/components/ColorRamp/index.js.map +1 -0
  285. package/dist/components/CopyButton/index.cjs +1 -1
  286. package/dist/components/CopyButton/index.js +1 -1
  287. package/dist/components/DashedButton/index.cjs +1 -1
  288. package/dist/components/DashedButton/index.js +1 -1
  289. package/dist/components/DatePicker/index.cjs +1 -1
  290. package/dist/components/DatePicker/index.js +1 -1
  291. package/dist/components/DateTimePicker/index.cjs +1 -1
  292. package/dist/components/DateTimePicker/index.js +1 -1
  293. package/dist/components/EmptyState/index.cjs +1 -1
  294. package/dist/components/EmptyState/index.js +1 -1
  295. package/dist/components/FileCard/index.cjs +1 -1
  296. package/dist/components/FileCard/index.js +1 -1
  297. package/dist/components/FileUploader/index.cjs +1 -1
  298. package/dist/components/FileUploader/index.js +1 -1
  299. package/dist/components/Flag/index.cjs +1 -1
  300. package/dist/components/Flag/index.js +1 -1
  301. package/dist/components/FullscreenToggle/index.cjs +1 -1
  302. package/dist/components/FullscreenToggle/index.js +1 -1
  303. package/dist/components/IconButton/index.cjs +1 -1
  304. package/dist/components/IconButton/index.js +1 -1
  305. package/dist/components/Loader/index.cjs +1 -1
  306. package/dist/components/Loader/index.js +1 -1
  307. package/dist/components/MobileFrame/MobileFrame.d.cts +45 -0
  308. package/dist/components/MobileFrame/MobileFrame.d.ts +45 -0
  309. package/dist/components/MobileFrame/frames.d.cts +27 -0
  310. package/dist/components/MobileFrame/frames.d.ts +27 -0
  311. package/dist/components/MobileFrame/index.cjs +2 -0
  312. package/dist/components/MobileFrame/index.cjs.map +1 -0
  313. package/dist/components/MobileFrame/index.d.cts +4 -0
  314. package/dist/components/MobileFrame/index.d.ts +4 -0
  315. package/dist/components/MobileFrame/index.js +8 -0
  316. package/dist/components/MobileFrame/index.js.map +1 -0
  317. package/dist/components/Modal/index.cjs +1 -1
  318. package/dist/components/Modal/index.js +1 -1
  319. package/dist/components/MultiSelect/index.cjs +1 -1
  320. package/dist/components/MultiSelect/index.js +1 -1
  321. package/dist/components/NumberField/index.cjs +1 -1
  322. package/dist/components/NumberField/index.js +1 -1
  323. package/dist/components/OtpField/index.cjs +1 -1
  324. package/dist/components/OtpField/index.js +1 -1
  325. package/dist/components/PageLayout/index.cjs +1 -1
  326. package/dist/components/PageLayout/index.js +1 -1
  327. package/dist/components/PageNotFound/index.cjs +1 -1
  328. package/dist/components/PageNotFound/index.js +1 -1
  329. package/dist/components/Pagination/index.cjs +1 -1
  330. package/dist/components/Pagination/index.js +1 -1
  331. package/dist/components/PaletteField/PaletteField.d.cts +30 -0
  332. package/dist/components/PaletteField/PaletteField.d.ts +30 -0
  333. package/dist/components/PaletteField/index.cjs +2 -0
  334. package/dist/components/PaletteField/index.cjs.map +1 -0
  335. package/dist/components/PaletteField/index.d.cts +2 -0
  336. package/dist/components/PaletteField/index.d.ts +2 -0
  337. package/dist/components/PaletteField/index.js +6 -0
  338. package/dist/components/PaletteField/index.js.map +1 -0
  339. package/dist/components/Radio/index.cjs +1 -1
  340. package/dist/components/Radio/index.js +1 -1
  341. package/dist/components/RemoveDialog/index.cjs +1 -1
  342. package/dist/components/RemoveDialog/index.js +1 -1
  343. package/dist/components/RichTextEditor/index.cjs +1 -1
  344. package/dist/components/RichTextEditor/index.js +1 -1
  345. package/dist/components/RootLayout/index.cjs +1 -1
  346. package/dist/components/RootLayout/index.js +1 -1
  347. package/dist/components/Select/index.cjs +1 -1
  348. package/dist/components/Select/index.js +1 -1
  349. package/dist/components/Sidebar/index.cjs +1 -1
  350. package/dist/components/Sidebar/index.js +1 -1
  351. package/dist/components/Slider/index.cjs +1 -1
  352. package/dist/components/Slider/index.js +1 -1
  353. package/dist/components/SpeedDial/index.cjs +1 -1
  354. package/dist/components/SpeedDial/index.js +1 -1
  355. package/dist/components/Stepper/index.cjs +1 -1
  356. package/dist/components/Stepper/index.js +1 -1
  357. package/dist/components/SwatchPicker/index.cjs +1 -1
  358. package/dist/components/SwatchPicker/index.js +1 -1
  359. package/dist/components/Switch/index.cjs +1 -1
  360. package/dist/components/Switch/index.js +1 -1
  361. package/dist/components/Table/index.cjs +1 -1
  362. package/dist/components/Table/index.js +1 -1
  363. package/dist/components/Tabs/index.cjs +1 -1
  364. package/dist/components/Tabs/index.js +1 -1
  365. package/dist/components/TagsField/index.cjs +1 -1
  366. package/dist/components/TagsField/index.js +1 -1
  367. package/dist/components/TextField/index.cjs +1 -1
  368. package/dist/components/TextField/index.js +1 -1
  369. package/dist/components/ThemeToggle/index.cjs +1 -1
  370. package/dist/components/ThemeToggle/index.js +1 -1
  371. package/dist/components/TimePicker/index.cjs +1 -1
  372. package/dist/components/TimePicker/index.js +1 -1
  373. package/dist/components/Timeline/index.cjs +1 -1
  374. package/dist/components/Timeline/index.js +1 -1
  375. package/dist/components/Toast/index.cjs +1 -1
  376. package/dist/components/Toast/index.js +1 -1
  377. package/dist/components/TranslatedFields/index.cjs +1 -1
  378. package/dist/components/TranslatedFields/index.js +1 -1
  379. package/dist/components/UserCard/index.cjs +1 -1
  380. package/dist/components/UserCard/index.js +1 -1
  381. package/dist/components/index.d.cts +3 -0
  382. package/dist/components/index.d.ts +3 -0
  383. package/dist/entries/app.cjs +1 -1
  384. package/dist/entries/app.js +1 -1
  385. package/dist/entries/components.cjs +1 -1
  386. package/dist/entries/components.js +149 -141
  387. package/dist/entries/components.js.map +1 -1
  388. package/dist/entries/helpers.cjs +1 -1
  389. package/dist/entries/helpers.d.cts +2 -0
  390. package/dist/entries/helpers.d.ts +2 -0
  391. package/dist/entries/helpers.js +18 -8
  392. package/dist/entries/helpers.js.map +1 -1
  393. package/dist/entries/i18n.cjs +1 -1
  394. package/dist/entries/i18n.js +2 -2
  395. package/dist/entries/theme.cjs +1 -1
  396. package/dist/entries/theme.js +1 -1
  397. package/dist/helpers/color.d.cts +17 -0
  398. package/dist/helpers/color.d.ts +17 -0
  399. package/dist/helpers/palette.d.cts +68 -0
  400. package/dist/helpers/palette.d.ts +68 -0
  401. package/dist/i18n/messages.d.cts +11 -0
  402. package/dist/i18n/messages.d.ts +11 -0
  403. package/dist/index.cjs +1 -1
  404. package/dist/index.css +16 -12
  405. package/dist/index.js +211 -193
  406. package/dist/index.js.map +1 -1
  407. package/dist/{messages-ogohLC5P.js → messages-B06Kl5rI.js} +100 -23
  408. package/dist/messages-B06Kl5rI.js.map +1 -0
  409. package/dist/{messages-DKT0SRM0.cjs → messages-CJqxqL3t.cjs} +9 -9
  410. package/dist/messages-CJqxqL3t.cjs.map +1 -0
  411. package/dist/palette-B031dM4E.js +70 -0
  412. package/dist/palette-B031dM4E.js.map +1 -0
  413. package/dist/palette-BycMHbED.cjs +2 -0
  414. package/dist/palette-BycMHbED.cjs.map +1 -0
  415. package/dist/theme/ConfigProvider.d.cts +8 -8
  416. package/dist/theme/ConfigProvider.d.ts +8 -8
  417. package/package.json +1 -1
  418. package/dist/Avatar-Dgf04PBC.cjs +0 -2
  419. package/dist/Badge-BQpr2Jee.cjs +0 -2
  420. package/dist/Badge-DSWigoGC.js +0 -50
  421. package/dist/Button-CXmDOzPk.cjs +0 -2
  422. package/dist/Button-DBs8xnA5.js +0 -72
  423. package/dist/Chip-gUH_7nQc.cjs +0 -2
  424. package/dist/ChoiceCardGroup-DBohUnRj.js +0 -181
  425. package/dist/ChoiceCardGroup-d0VVTUi5.cjs +0 -2
  426. package/dist/ColorPicker-DtzFwNWk.cjs +0 -2
  427. package/dist/ColorPicker-DtzFwNWk.cjs.map +0 -1
  428. package/dist/ColorPicker-Dw6Qk0iy.js.map +0 -1
  429. package/dist/ColorPickerPanel--wBX-m7J.cjs +0 -2
  430. package/dist/ColorPickerPanel--wBX-m7J.cjs.map +0 -1
  431. package/dist/ColorPickerPanel-Dp7bnnVf.js +0 -336
  432. package/dist/ColorPickerPanel-Dp7bnnVf.js.map +0 -1
  433. package/dist/ConfigProvider-Bszl3Wr3.cjs.map +0 -1
  434. package/dist/ConfigProvider-DR9YMy9U.js.map +0 -1
  435. package/dist/CopyButton-Ct-8AmmX.cjs +0 -2
  436. package/dist/CopyButton-DJ1PSJZU.js +0 -31
  437. package/dist/DashedButton-3C4IZuo4.cjs +0 -2
  438. package/dist/DashedButton-BXZAyMtw.js +0 -59
  439. package/dist/DatePicker.module-BZDftL4g.js +0 -138
  440. package/dist/DatePicker.module-tE-tGNBd.cjs +0 -2
  441. package/dist/EmptyState-BTd7aVgu.js +0 -38
  442. package/dist/EmptyState-Bv4XXnD1.cjs +0 -2
  443. package/dist/FileUploader-B7VfhcR7.cjs +0 -2
  444. package/dist/FileUploader-B7VfhcR7.cjs.map +0 -1
  445. package/dist/FileUploader-BYF5FvUc.js.map +0 -1
  446. package/dist/IconButton-BEGWfcVc.js +0 -68
  447. package/dist/IconButton-BN-bZxEi.cjs +0 -2
  448. package/dist/Loader-B5YqzEYy.cjs +0 -2
  449. package/dist/Loader-BZIa8hwv.js +0 -29
  450. package/dist/PageNotFound-B8_eIT8p.cjs +0 -2
  451. package/dist/Pagination-BdVebW2L.cjs +0 -2
  452. package/dist/Pagination-CmskZjcz.js +0 -139
  453. package/dist/RadioGroup-C8u7eNBS.cjs +0 -2
  454. package/dist/RadioGroup-DbodUJW8.js +0 -141
  455. package/dist/RemoveDialog-CV75B0aN.js +0 -47
  456. package/dist/RemoveDialog-DmOk0ezc.cjs +0 -2
  457. package/dist/RichTextEditor-Bm8FFbcR.js.map +0 -1
  458. package/dist/RichTextEditor-uXddgtlk.cjs.map +0 -1
  459. package/dist/RootLayout-Cf7Rr9Iz.js +0 -515
  460. package/dist/RootLayout-kssj9exn.cjs +0 -2
  461. package/dist/Slider-dxYVXRev.cjs +0 -2
  462. package/dist/Slider-oGXd5e9X.js +0 -184
  463. package/dist/Stepper-B1z_u650.cjs +0 -2
  464. package/dist/Switch-DMPJ0fhB.js +0 -85
  465. package/dist/Switch-DRkZ6kHJ.cjs +0 -2
  466. package/dist/Table-BPit83Pn.cjs +0 -2
  467. package/dist/Table-BPit83Pn.cjs.map +0 -1
  468. package/dist/Table-Drdhfm99.js.map +0 -1
  469. package/dist/Tabs-BiKDy_fv.cjs +0 -2
  470. package/dist/Tabs-ytbBzAxG.js +0 -190
  471. package/dist/TextField.module-QePvGeJ3.js +0 -27
  472. package/dist/TextField.module-QePvGeJ3.js.map +0 -1
  473. package/dist/TextField.module-m-UllwzG.cjs +0 -2
  474. package/dist/TextField.module-m-UllwzG.cjs.map +0 -1
  475. package/dist/Timeline-D3kzt1dy.js +0 -71
  476. package/dist/Timeline-ONU_3gi3.cjs +0 -2
  477. package/dist/messages-DKT0SRM0.cjs.map +0 -1
  478. package/dist/messages-ogohLC5P.js.map +0 -1
@@ -2,7 +2,7 @@ import { jsx as o } from "react/jsx-runtime";
2
2
  import { useState as b, useRef as l, useEffect as m, useSyncExternalStore as x } from "react";
3
3
  import { createPortal as g } from "react-dom";
4
4
  import { r as y, c as w, s as A, g as T } from "./toastStore-Cx_JOKwS.js";
5
- import { A as h } from "./Alert-DXmzM_rh.js";
5
+ import { A as h } from "./Alert-rNjfqj2Z.js";
6
6
  const E = "_viewport_zx7eo_3", S = "_item_zx7eo_40", z = "_alert_zx7eo_63", d = {
7
7
  viewport: E,
8
8
  item: S,
@@ -60,4 +60,4 @@ function C({ position: e = "bottom-right", duration: i = 4e3 }) {
60
60
  export {
61
61
  C as T
62
62
  };
63
- //# sourceMappingURL=Toaster-BxIY2H4V.js.map
63
+ //# sourceMappingURL=Toaster-DuzcRbio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toaster-BxIY2H4V.js","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":";;;;;;;;;GAMMA,IAAU;AAaT,SAASC,EAAU,EAAE,OAAAC,GAAO,UAAAC,GAAU,UAAAC,KAA4B;AACvE,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAMN,EAAM,YAAYC,GACxBM,IAAQC,EAA2B,MAAS,GAC5CC,IAAYD,EAAOF,CAAG,GACtBI,IAAYF,EAAO,CAAC;AAG1B,EAAAG,EAAU,MAAM;AACd,UAAMC,IAAM,sBAAsB,MAAMR,EAAW,EAAI,CAAC;AACxD,WAAO,MAAM,qBAAqBQ,CAAG;AAAA,EACvC,GAAG,CAAA,CAAE,GAGLD,EAAU,MAAM;AACd,QAAIX,EAAM,KAAM;AAChB,IAAAI,EAAW,EAAK;AAChB,UAAMS,IAAI,OAAO,WAAW,MAAMC,EAAYd,EAAM,EAAE,GAAGF,CAAO;AAChE,WAAO,MAAM,OAAO,aAAae,CAAC;AAAA,EACpC,GAAG,CAACb,EAAM,MAAMA,EAAM,EAAE,CAAC;AAGzB,QAAMe,IAAa,MAAM;AACvB,IAAIR,EAAM,WAAW,SACnB,OAAO,aAAaA,EAAM,OAAO,GACjCA,EAAM,UAAU;AAAA,EAEpB,GACMS,IAAS,MAAM;AACnB,IAAI,CAAChB,EAAM,QAAQS,EAAU,YAAY,UACzCM,EAAA,GACAL,EAAU,UAAU,KAAK,IAAA,GACzBH,EAAM,UAAU,OAAO,WAAW,MAAMU,EAAWjB,EAAM,EAAE,GAAGS,EAAU,OAAO;AAAA,EACjF,GACMS,IAAQ,MAAM;AAClB,IAAIX,EAAM,WAAW,SACrBQ,EAAA,GACAN,EAAU,WAAW,KAAK,IAAA,IAAQC,EAAU;AAAA,EAC9C;AACA,SAAAC,EAAU,OAGRF,EAAU,UAAUH,GACpBU,EAAA,GACOD,IAEN,CAACf,EAAM,MAAMM,CAAG,CAAC,GAGlB,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO;AAAA,MAClB,aAAWjB,IAAU,SAAS;AAAA,MAC9B,iBAAeD;AAAA,MACf,cAAcgB;AAAA,MACd,cAAcF;AAAA,MAEd,UAAA,gBAAAG;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAOrB,EAAM;AAAA,UACb,SAASA,EAAM,WAAW;AAAA,UAC1B,MAAMA,EAAM;AAAA,UACZ,QAAQA,EAAM;AAAA,UACd,SAAS,MAAMiB,EAAWjB,EAAM,EAAE;AAAA,UAClC,MAAK;AAAA,UACL,WAAWoB,EAAO;AAAA,UAEjB,UAAApB,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAAA;AAGN;ACjEO,SAASsB,EAAQ,EAAE,UAAApB,IAAW,gBAAgB,UAAAD,IAAW,OAAsB;AACpF,QAAMsB,IAASC,EAAqBC,GAAiBC,GAAWA,CAAS;AAEzE,SAAI,OAAO,WAAa,MAAoB,OAErCC;AAAA,IACL,gBAAAR,EAAC,SAAI,WAAWC,EAAO,UAAU,iBAAelB,GAAU,aAAU,UACjE,UAAAqB,EAAO,IAAI,CAAC,MACX,gBAAAJ,EAACpB,KAAqB,OAAO,GAAG,UAAAE,GAAoB,UAAAC,KAApC,EAAE,EAAsD,CACzE,EAAA,CACH;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"Toaster-DuzcRbio.js","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":";;;;;;;;;GAMMA,IAAU;AAaT,SAASC,EAAU,EAAE,OAAAC,GAAO,UAAAC,GAAU,UAAAC,KAA4B;AACvE,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAMN,EAAM,YAAYC,GACxBM,IAAQC,EAA2B,MAAS,GAC5CC,IAAYD,EAAOF,CAAG,GACtBI,IAAYF,EAAO,CAAC;AAG1B,EAAAG,EAAU,MAAM;AACd,UAAMC,IAAM,sBAAsB,MAAMR,EAAW,EAAI,CAAC;AACxD,WAAO,MAAM,qBAAqBQ,CAAG;AAAA,EACvC,GAAG,CAAA,CAAE,GAGLD,EAAU,MAAM;AACd,QAAIX,EAAM,KAAM;AAChB,IAAAI,EAAW,EAAK;AAChB,UAAMS,IAAI,OAAO,WAAW,MAAMC,EAAYd,EAAM,EAAE,GAAGF,CAAO;AAChE,WAAO,MAAM,OAAO,aAAae,CAAC;AAAA,EACpC,GAAG,CAACb,EAAM,MAAMA,EAAM,EAAE,CAAC;AAGzB,QAAMe,IAAa,MAAM;AACvB,IAAIR,EAAM,WAAW,SACnB,OAAO,aAAaA,EAAM,OAAO,GACjCA,EAAM,UAAU;AAAA,EAEpB,GACMS,IAAS,MAAM;AACnB,IAAI,CAAChB,EAAM,QAAQS,EAAU,YAAY,UACzCM,EAAA,GACAL,EAAU,UAAU,KAAK,IAAA,GACzBH,EAAM,UAAU,OAAO,WAAW,MAAMU,EAAWjB,EAAM,EAAE,GAAGS,EAAU,OAAO;AAAA,EACjF,GACMS,IAAQ,MAAM;AAClB,IAAIX,EAAM,WAAW,SACrBQ,EAAA,GACAN,EAAU,WAAW,KAAK,IAAA,IAAQC,EAAU;AAAA,EAC9C;AACA,SAAAC,EAAU,OAGRF,EAAU,UAAUH,GACpBU,EAAA,GACOD,IAEN,CAACf,EAAM,MAAMM,CAAG,CAAC,GAGlB,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO;AAAA,MAClB,aAAWjB,IAAU,SAAS;AAAA,MAC9B,iBAAeD;AAAA,MACf,cAAcgB;AAAA,MACd,cAAcF;AAAA,MAEd,UAAA,gBAAAG;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAOrB,EAAM;AAAA,UACb,SAASA,EAAM,WAAW;AAAA,UAC1B,MAAMA,EAAM;AAAA,UACZ,QAAQA,EAAM;AAAA,UACd,SAAS,MAAMiB,EAAWjB,EAAM,EAAE;AAAA,UAClC,MAAK;AAAA,UACL,WAAWoB,EAAO;AAAA,UAEjB,UAAApB,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAAA;AAGN;ACjEO,SAASsB,EAAQ,EAAE,UAAApB,IAAW,gBAAgB,UAAAD,IAAW,OAAsB;AACpF,QAAMsB,IAASC,EAAqBC,GAAiBC,GAAWA,CAAS;AAEzE,SAAI,OAAO,WAAa,MAAoB,OAErCC;AAAA,IACL,gBAAAR,EAAC,SAAI,WAAWC,EAAO,UAAU,iBAAelB,GAAU,aAAU,UACjE,UAAAqB,EAAO,IAAI,CAAC,MACX,gBAAAJ,EAACpB,KAAqB,OAAO,GAAG,UAAAE,GAAoB,UAAAC,KAApC,EAAE,EAAsD,CACzE,EAAA,CACH;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;"}
@@ -1,2 +1,2 @@
1
- "use strict";const b=require("react/jsx-runtime"),c=require("react"),P=require("./formContext-bTWrqdEV.cjs"),R=require("./translations-CXEeeUDL.cjs"),V=require("./messages-DKT0SRM0.cjs"),z=require("./Flag-CB4YyPj3.cjs"),D=require("./Tabs-BiKDy_fv.cjs"),j=require("./ConfigProvider-Bszl3Wr3.cjs"),J="_fields_aawaf_4",M={fields:J},Q=c.forwardRef(function({children:x,locales:S,namespace:N,value:y,defaultValue:w,onChange:f,showFlags:A=!0,icon:K="Global",variant:O,size:W,"aria-label":g="Translations",className:k,style:C},l){var F;const E=j.useLocales(),i=S??E,_=j.useTranslationsNamespace(),q=N??_,s=P.useFormContext(),T=y!==void 0,[I,L]=c.useState(w),a=(T?y:I)??((F=i[0])==null?void 0:F.code)??"",p=e=>{T||L(e),f==null||f(e)},u=e=>R.buildTranslationName(e,"",q),B=e=>!!s&&Object.keys(s.errors).some(t=>t.startsWith(u(e))&&(s.isSubmitted||s.touched[t]===!0)),v=c.useRef(null),G=e=>{v.current=e,typeof l=="function"?l(e):l&&(l.current=e)},h=c.useRef(0),d=c.useRef(null);if(c.useEffect(()=>{const e=(s==null?void 0:s.submitCount)??0;if(!s||e===h.current)return;h.current=e;const t=Object.keys(s.errors);if(t.length===0)return;const r=o=>i.some(m=>o.startsWith(u(m.code)));if(!t.every(r)||t.some(o=>o.startsWith(u(a))))return;const n=i.find(o=>t.some(m=>m.startsWith(u(o.code))));n&&n.code!==a&&(d.current=n.code,p(n.code))},[s==null?void 0:s.submitCount]),c.useEffect(()=>{var n;if(d.current==null||d.current!==a)return;d.current=null;const e=v.current;if(!e||!s)return;const t=new Set(Object.keys(s.errors)),r=Array.from(e.querySelectorAll("[name]")).find(o=>t.has(o.getAttribute("name")??""));(n=r==null?void 0:r.scrollIntoView)==null||n.call(r,{behavior:"smooth",block:"center"}),r==null||r.focus({preventScroll:!0})},[a]),i.length===0)return null;const H=i.map(e=>({value:e.code,label:e.label??e.code,icon:A&&V.flagFor(e.code)?b.jsx(z.Flag,{code:e.code}):K,error:B(e.code),content:b.jsx("div",{className:M.fields,children:x(t=>R.buildTranslationName(e.code,t,q),e.code)},e.code)}));return b.jsx(D.Tabs,{ref:G,className:k,style:C,items:H,value:a,onChange:p,variant:O,size:W,queryKey:null,"aria-label":g})});exports.TranslatedFields=Q;
2
- //# sourceMappingURL=TranslatedFields-BtDLkQy7.cjs.map
1
+ "use strict";const b=require("react/jsx-runtime"),c=require("react"),P=require("./formContext-bTWrqdEV.cjs"),R=require("./translations-CXEeeUDL.cjs"),V=require("./messages-CJqxqL3t.cjs"),z=require("./Flag-BM_2VJ1v.cjs"),D=require("./Tabs-CZDX7BN-.cjs"),j=require("./ConfigProvider-BicoaBLj.cjs"),J="_fields_aawaf_4",M={fields:J},Q=c.forwardRef(function({children:x,locales:S,namespace:N,value:y,defaultValue:w,onChange:f,showFlags:A=!0,icon:K="Global",variant:O,size:W,"aria-label":g="Translations",className:k,style:C},l){var F;const E=j.useLocales(),i=S??E,_=j.useTranslationsNamespace(),q=N??_,s=P.useFormContext(),T=y!==void 0,[I,L]=c.useState(w),a=(T?y:I)??((F=i[0])==null?void 0:F.code)??"",p=e=>{T||L(e),f==null||f(e)},u=e=>R.buildTranslationName(e,"",q),B=e=>!!s&&Object.keys(s.errors).some(t=>t.startsWith(u(e))&&(s.isSubmitted||s.touched[t]===!0)),v=c.useRef(null),G=e=>{v.current=e,typeof l=="function"?l(e):l&&(l.current=e)},h=c.useRef(0),d=c.useRef(null);if(c.useEffect(()=>{const e=(s==null?void 0:s.submitCount)??0;if(!s||e===h.current)return;h.current=e;const t=Object.keys(s.errors);if(t.length===0)return;const r=o=>i.some(m=>o.startsWith(u(m.code)));if(!t.every(r)||t.some(o=>o.startsWith(u(a))))return;const n=i.find(o=>t.some(m=>m.startsWith(u(o.code))));n&&n.code!==a&&(d.current=n.code,p(n.code))},[s==null?void 0:s.submitCount]),c.useEffect(()=>{var n;if(d.current==null||d.current!==a)return;d.current=null;const e=v.current;if(!e||!s)return;const t=new Set(Object.keys(s.errors)),r=Array.from(e.querySelectorAll("[name]")).find(o=>t.has(o.getAttribute("name")??""));(n=r==null?void 0:r.scrollIntoView)==null||n.call(r,{behavior:"smooth",block:"center"}),r==null||r.focus({preventScroll:!0})},[a]),i.length===0)return null;const H=i.map(e=>({value:e.code,label:e.label??e.code,icon:A&&V.flagFor(e.code)?b.jsx(z.Flag,{code:e.code}):K,error:B(e.code),content:b.jsx("div",{className:M.fields,children:x(t=>R.buildTranslationName(e.code,t,q),e.code)},e.code)}));return b.jsx(D.Tabs,{ref:G,className:k,style:C,items:H,value:a,onChange:p,variant:O,size:W,queryKey:null,"aria-label":g})});exports.TranslatedFields=Q;
2
+ //# sourceMappingURL=TranslatedFields-D_a0NVKI.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslatedFields-BtDLkQy7.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
1
+ {"version":3,"file":"TranslatedFields-D_a0NVKI.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsx as d } from "react/jsx-runtime";
2
2
  import { forwardRef as g, useState as z, useRef as b, useEffect as R } from "react";
3
3
  import { u as D } from "./formContext-B7ln1Miy.js";
4
4
  import { b as j } from "./translations-D15tFHM1.js";
5
- import { f as J } from "./messages-ogohLC5P.js";
6
- import { F as M } from "./Flag-yA1y5XzR.js";
7
- import { T as P } from "./Tabs-ytbBzAxG.js";
8
- import { h as Q, n as U } from "./ConfigProvider-DR9YMy9U.js";
5
+ import { f as J } from "./messages-B06Kl5rI.js";
6
+ import { F as M } from "./Flag-CzCEpB8E.js";
7
+ import { T as P } from "./Tabs-v1GEGUDQ.js";
8
+ import { h as Q, n as U } from "./ConfigProvider-DL9fylMo.js";
9
9
  const X = "_fields_aawaf_4", Y = {
10
10
  fields: X
11
11
  }, ie = g(
@@ -83,4 +83,4 @@ const X = "_fields_aawaf_4", Y = {
83
83
  export {
84
84
  ie as T
85
85
  };
86
- //# sourceMappingURL=TranslatedFields-DmR8LKSG.js.map
86
+ //# sourceMappingURL=TranslatedFields-HmP0Mg5t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslatedFields-DmR8LKSG.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
1
+ {"version":3,"file":"TranslatedFields-HmP0Mg5t.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { jsxs as c, jsx as t } from "react/jsx-runtime";
2
2
  import { forwardRef as x } from "react";
3
3
  import { clsx as k } from "clsx";
4
- import { A as C } from "./Avatar-Q50J8wdN.js";
5
- import { B as U } from "./Button-DBs8xnA5.js";
4
+ import { A as C } from "./Avatar-BGPGxry2.js";
5
+ import { B as U } from "./Button-obe6rono.js";
6
6
  import { I } from "./Icon-DaTvzLBu.js";
7
7
  import { T as n } from "./Typography-Cta6Rg4L.js";
8
- import { a as N } from "./ConfigProvider-DR9YMy9U.js";
8
+ import { a as N } from "./ConfigProvider-DL9fylMo.js";
9
9
  const S = "_card_1fykc_3", T = "_identity_1fykc_16", b = "_text_1fykc_20", j = "_sm_1fykc_33", w = "_lg_1fykc_37", o = {
10
10
  card: S,
11
11
  identity: T,
@@ -71,4 +71,4 @@ const S = "_card_1fykc_3", T = "_identity_1fykc_16", b = "_text_1fykc_20", j = "
71
71
  export {
72
72
  F as U
73
73
  };
74
- //# sourceMappingURL=UserCard-J8Bpbh3x.js.map
74
+ //# sourceMappingURL=UserCard-B1phOVKj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCard-J8Bpbh3x.js","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {name ?? t('userCard.welcome')}\n </Typography>\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":";;;;;;;;;;;;;;GA4CaA,IAAWC,EAA0C,SAChE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAAaV,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO,MAC3DW,IAAaX,MAAS,OAAO,OAAO;AAE1C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAWM,EAAKC,EAAO,MAAMA,EAAOd,CAAI,GAAGI,CAAS;AAAA,MACpD,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWE,EAAO,UAGrB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMN;AAAA,cACN,MAAAf;AAAA,cACA,KAAKE;AAAA,cACL,MAAMF,IAAO,SAAYG;AAAA,cACzB,OAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAa,EAAC,OAAA,EAAI,WAAWE,EAAO,MAErB,UAAA;AAAA,YAAA,gBAAAC,EAACE,GAAA,EAAW,SAAQ,aAAY,UAAQ,IACrC,UAAAtB,KAAQa,EAAE,kBAAkB,EAAA,CAC/B;AAAA,YACCZ,KAAS,QACR,gBAAAmB,EAACE,GAAA,EAAW,SAAQ,WAAU,OAAM,SAAQ,UAAQ,IACjD,UAAArB,EAAA,CACH;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAECO;AAAA,QAEAF,IACC,gBAAAc;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAMP;AAAA,YACN,WAAS;AAAA,YACT,WAAW,gBAAAI,EAACI,GAAA,EAAK,MAAK,UAAA,CAAU;AAAA,YAChC,SAASlB;AAAA,YAER,UAAAC,KAAeM,EAAE,kBAAkB;AAAA,UAAA;AAAA,QAAA,IAEpC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
1
+ {"version":3,"file":"UserCard-B1phOVKj.js","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {name ?? t('userCard.welcome')}\n </Typography>\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":";;;;;;;;;;;;;;GA4CaA,IAAWC,EAA0C,SAChE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAAaV,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO,MAC3DW,IAAaX,MAAS,OAAO,OAAO;AAE1C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAWM,EAAKC,EAAO,MAAMA,EAAOd,CAAI,GAAGI,CAAS;AAAA,MACpD,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWE,EAAO,UAGrB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMN;AAAA,cACN,MAAAf;AAAA,cACA,KAAKE;AAAA,cACL,MAAMF,IAAO,SAAYG;AAAA,cACzB,OAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAa,EAAC,OAAA,EAAI,WAAWE,EAAO,MAErB,UAAA;AAAA,YAAA,gBAAAC,EAACE,GAAA,EAAW,SAAQ,aAAY,UAAQ,IACrC,UAAAtB,KAAQa,EAAE,kBAAkB,EAAA,CAC/B;AAAA,YACCZ,KAAS,QACR,gBAAAmB,EAACE,GAAA,EAAW,SAAQ,WAAU,OAAM,SAAQ,UAAQ,IACjD,UAAArB,EAAA,CACH;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAECO;AAAA,QAEAF,IACC,gBAAAc;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAMP;AAAA,YACN,WAAS;AAAA,YACT,WAAW,gBAAAI,EAACI,GAAA,EAAK,MAAK,UAAA,CAAU;AAAA,YAChC,SAASlB;AAAA,YAER,UAAAC,KAAeM,EAAE,kBAAkB;AAAA,UAAA;AAAA,QAAA,IAEpC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("react/jsx-runtime"),h=require("react"),j=require("clsx"),p=require("./Avatar-Dgf04PBC.cjs"),q=require("./Button-CXmDOzPk.cjs"),C=require("./Icon-BVULqOJD.cjs"),o=require("./Typography-BFatE1_A.cjs"),k=require("./ConfigProvider-Bszl3Wr3.cjs"),T="_card_1fykc_3",U="_identity_1fykc_16",I="_text_1fykc_20",N="_sm_1fykc_33",S="_lg_1fykc_37",s={card:T,identity:U,text:I,sm:N,lg:S},b=h.forwardRef(function({name:e,email:c,avatar:a,icon:d="User",color:l="primary",size:t="md",onLogout:n,logoutLabel:u,children:y,className:m,style:x,..._},f){const i=k.useT(),g=t==="lg"?"lg":t==="sm"?"sm":"md",v=t==="lg"?"md":"sm";return r.jsxs("div",{ref:f,className:j.clsx(s.card,s[t],m),style:x,..._,children:[r.jsxs("div",{className:s.identity,children:[r.jsx(p.Avatar,{size:g,name:e,src:a,icon:e?void 0:d,color:l}),r.jsxs("div",{className:s.text,children:[r.jsx(o.Typography,{variant:"bodySmall",truncate:!0,children:e??i("userCard.welcome")}),c!=null&&r.jsx(o.Typography,{variant:"caption",color:"muted",truncate:!0,children:c})]})]}),y,n?r.jsx(q.Button,{variant:"filled",color:"error",size:v,fullWidth:!0,startIcon:r.jsx(C.Icon,{name:"Logout2"}),onClick:n,children:u??i("userCard.signOut")}):null]})});exports.UserCard=b;
2
- //# sourceMappingURL=UserCard-C1yFvVIc.cjs.map
1
+ "use strict";const r=require("react/jsx-runtime"),h=require("react"),j=require("clsx"),p=require("./Avatar-D_YivyqV.cjs"),q=require("./Button-BZ_o-akc.cjs"),C=require("./Icon-BVULqOJD.cjs"),o=require("./Typography-BFatE1_A.cjs"),k=require("./ConfigProvider-BicoaBLj.cjs"),T="_card_1fykc_3",U="_identity_1fykc_16",I="_text_1fykc_20",N="_sm_1fykc_33",S="_lg_1fykc_37",s={card:T,identity:U,text:I,sm:N,lg:S},b=h.forwardRef(function({name:e,email:c,avatar:a,icon:d="User",color:l="primary",size:t="md",onLogout:n,logoutLabel:u,children:y,className:m,style:x,..._},f){const i=k.useT(),g=t==="lg"?"lg":t==="sm"?"sm":"md",v=t==="lg"?"md":"sm";return r.jsxs("div",{ref:f,className:j.clsx(s.card,s[t],m),style:x,..._,children:[r.jsxs("div",{className:s.identity,children:[r.jsx(p.Avatar,{size:g,name:e,src:a,icon:e?void 0:d,color:l}),r.jsxs("div",{className:s.text,children:[r.jsx(o.Typography,{variant:"bodySmall",truncate:!0,children:e??i("userCard.welcome")}),c!=null&&r.jsx(o.Typography,{variant:"caption",color:"muted",truncate:!0,children:c})]})]}),y,n?r.jsx(q.Button,{variant:"filled",color:"error",size:v,fullWidth:!0,startIcon:r.jsx(C.Icon,{name:"Logout2"}),onClick:n,children:u??i("userCard.signOut")}):null]})});exports.UserCard=b;
2
+ //# sourceMappingURL=UserCard-BvOcDm5W.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCard-C1yFvVIc.cjs","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {name ?? t('userCard.welcome')}\n </Typography>\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":"qZA4CaA,EAAWC,EAAAA,WAA0C,SAChE,CACE,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,UACR,KAAAC,EAAO,KACP,SAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EAEJC,EAAaV,IAAS,KAAO,KAAOA,IAAS,KAAO,KAAO,KAC3DW,EAAaX,IAAS,KAAO,KAAO,KAE1C,OACEY,EAAAA,KAAC,MAAA,CACC,IAAAL,EACA,UAAWM,EAAAA,KAAKC,EAAO,KAAMA,EAAOd,CAAI,EAAGI,CAAS,EACpD,MAAAC,EACC,GAAGC,EAEJ,SAAA,CAAAM,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,SAGrB,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAMN,EACN,KAAAf,EACA,IAAKE,EACL,KAAMF,EAAO,OAAYG,EACzB,MAAAC,CAAA,CAAA,EAEFa,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,KAErB,SAAA,CAAAC,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,YAAY,SAAQ,GACrC,SAAAtB,GAAQa,EAAE,kBAAkB,CAAA,CAC/B,EACCZ,GAAS,MACRmB,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,UAAU,MAAM,QAAQ,SAAQ,GACjD,SAAArB,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,EACF,EAECO,EAEAF,EACCc,EAAAA,IAACG,EAAAA,OAAA,CACC,QAAQ,SACR,MAAM,QACN,KAAMP,EACN,UAAS,GACT,UAAWI,EAAAA,IAACI,EAAAA,KAAA,CAAK,KAAK,SAAA,CAAU,EAChC,QAASlB,EAER,SAAAC,GAAeM,EAAE,kBAAkB,CAAA,CAAA,EAEpC,IAAA,CAAA,CAAA,CAGV,CAAC"}
1
+ {"version":3,"file":"UserCard-BvOcDm5W.cjs","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {name ?? t('userCard.welcome')}\n </Typography>\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":"qZA4CaA,EAAWC,EAAAA,WAA0C,SAChE,CACE,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,UACR,KAAAC,EAAO,KACP,SAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EAEJC,EAAaV,IAAS,KAAO,KAAOA,IAAS,KAAO,KAAO,KAC3DW,EAAaX,IAAS,KAAO,KAAO,KAE1C,OACEY,EAAAA,KAAC,MAAA,CACC,IAAAL,EACA,UAAWM,EAAAA,KAAKC,EAAO,KAAMA,EAAOd,CAAI,EAAGI,CAAS,EACpD,MAAAC,EACC,GAAGC,EAEJ,SAAA,CAAAM,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,SAGrB,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAMN,EACN,KAAAf,EACA,IAAKE,EACL,KAAMF,EAAO,OAAYG,EACzB,MAAAC,CAAA,CAAA,EAEFa,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,KAErB,SAAA,CAAAC,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,YAAY,SAAQ,GACrC,SAAAtB,GAAQa,EAAE,kBAAkB,CAAA,CAC/B,EACCZ,GAAS,MACRmB,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,UAAU,MAAM,QAAQ,SAAQ,GACjD,SAAArB,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,EACF,EAECO,EAEAF,EACCc,EAAAA,IAACG,EAAAA,OAAA,CACC,QAAQ,SACR,MAAM,QACN,KAAMP,EACN,UAAS,GACT,UAAWI,EAAAA,IAACI,EAAAA,KAAA,CAAK,KAAK,SAAA,CAAU,EAChC,QAASlB,EAER,SAAAC,GAAeM,EAAE,kBAAkB,CAAA,CAAA,EAEpC,IAAA,CAAA,CAAA,CAGV,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";const a=e=>Math.min(1,Math.max(0,e));function o(e){let t=e.trim().replace(/^#/,"");return/^[0-9a-fA-F]{3}$/.test(t)&&(t=t.split("").map(n=>n+n).join("")),/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toLowerCase()}`:null}function s(e){const t=(o(e)??"#000000").slice(1);return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}function c({r:e,g:t,b:n}){const r=i=>Math.round(a(i/255)*255).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`}exports.clamp01=a;exports.hexToRgb=s;exports.normalizeHex=o;exports.rgbToHex=c;
2
+ //# sourceMappingURL=color-CgR8ybWZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-CgR8ybWZ.cjs","sources":["../src/helpers/color.ts"],"sourcesContent":["/**\n * Shared hex ⇄ rgb parsing — framework-agnostic, no deps. Lives in `helpers/` so both the\n * `ColorPicker` (via `colorUtils.ts`, which re-exports these) and the palette helpers can use the\n * one parser without a helpers→components import.\n */\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`, any case, trimmed) to a lowercase `#rrggbb`, or `null` if invalid. */\nexport function normalizeHex(input: string): string | null {\n let h = input.trim().replace(/^#/, '')\n if (/^[0-9a-fA-F]{3}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n return /^[0-9a-fA-F]{6}$/.test(h) ? `#${h.toLowerCase()}` : null\n}\n\n/** True for a complete `#rrggbb` (or `#rgb`) color. */\nexport const isValidHex = (input: string): boolean => normalizeHex(input) !== null\n\nexport function hexToRgb(hex: string): RGB {\n const h = (normalizeHex(hex) ?? '#000000').slice(1)\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n}\n\nexport function rgbToHex({ r, g, b }: RGB): string {\n const to = (n: number) =>\n Math.round(clamp01(n / 255) * 255)\n .toString(16)\n .padStart(2, '0')\n return `#${to(r)}${to(g)}${to(b)}`\n}\n"],"names":["clamp01","n","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to"],"mappings":"aAYO,MAAMA,EAAWC,GAAsB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAC,CAAC,EAGjE,SAASC,EAAaC,EAA8B,CACzD,IAAIC,EAAID,EAAM,KAAA,EAAO,QAAQ,KAAM,EAAE,EACrC,MAAI,mBAAmB,KAAKC,CAAC,IAC3BA,EAAIA,EACD,MAAM,EAAE,EACR,IAAKC,GAAMA,EAAIA,CAAC,EAChB,KAAK,EAAE,GAEL,mBAAmB,KAAKD,CAAC,EAAI,IAAIA,EAAE,aAAa,GAAK,IAC9D,CAKO,SAASE,EAASC,EAAkB,CACzC,MAAMH,GAAKF,EAAaK,CAAG,GAAK,WAAW,MAAM,CAAC,EAClD,MAAO,CACL,EAAG,SAASH,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,CAAA,CAEjC,CAEO,SAASI,EAAS,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,GAAkB,CACjD,MAAMC,EAAMX,GACV,KAAK,MAAMD,EAAQC,EAAI,GAAG,EAAI,GAAG,EAC9B,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EACpB,MAAO,IAAIW,EAAGH,CAAC,CAAC,GAAGG,EAAGF,CAAC,CAAC,GAAGE,EAAGD,CAAC,CAAC,EAClC"}
@@ -0,0 +1,24 @@
1
+ const s = (e) => Math.min(1, Math.max(0, e));
2
+ function o(e) {
3
+ let t = e.trim().replace(/^#/, "");
4
+ return /^[0-9a-fA-F]{3}$/.test(t) && (t = t.split("").map((n) => n + n).join("")), /^[0-9a-fA-F]{6}$/.test(t) ? `#${t.toLowerCase()}` : null;
5
+ }
6
+ function i(e) {
7
+ const t = (o(e) ?? "#000000").slice(1);
8
+ return {
9
+ r: parseInt(t.slice(0, 2), 16),
10
+ g: parseInt(t.slice(2, 4), 16),
11
+ b: parseInt(t.slice(4, 6), 16)
12
+ };
13
+ }
14
+ function c({ r: e, g: t, b: n }) {
15
+ const a = (r) => Math.round(s(r / 255) * 255).toString(16).padStart(2, "0");
16
+ return `#${a(e)}${a(t)}${a(n)}`;
17
+ }
18
+ export {
19
+ s as c,
20
+ i as h,
21
+ o as n,
22
+ c as r
23
+ };
24
+ //# sourceMappingURL=color-EQJ2DrcQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-EQJ2DrcQ.js","sources":["../src/helpers/color.ts"],"sourcesContent":["/**\n * Shared hex ⇄ rgb parsing — framework-agnostic, no deps. Lives in `helpers/` so both the\n * `ColorPicker` (via `colorUtils.ts`, which re-exports these) and the palette helpers can use the\n * one parser without a helpers→components import.\n */\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`, any case, trimmed) to a lowercase `#rrggbb`, or `null` if invalid. */\nexport function normalizeHex(input: string): string | null {\n let h = input.trim().replace(/^#/, '')\n if (/^[0-9a-fA-F]{3}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n return /^[0-9a-fA-F]{6}$/.test(h) ? `#${h.toLowerCase()}` : null\n}\n\n/** True for a complete `#rrggbb` (or `#rgb`) color. */\nexport const isValidHex = (input: string): boolean => normalizeHex(input) !== null\n\nexport function hexToRgb(hex: string): RGB {\n const h = (normalizeHex(hex) ?? '#000000').slice(1)\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n}\n\nexport function rgbToHex({ r, g, b }: RGB): string {\n const to = (n: number) =>\n Math.round(clamp01(n / 255) * 255)\n .toString(16)\n .padStart(2, '0')\n return `#${to(r)}${to(g)}${to(b)}`\n}\n"],"names":["clamp01","n","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to"],"mappings":"AAYO,MAAMA,IAAU,CAACC,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC;AAGjE,SAASC,EAAaC,GAA8B;AACzD,MAAIC,IAAID,EAAM,KAAA,EAAO,QAAQ,MAAM,EAAE;AACrC,SAAI,mBAAmB,KAAKC,CAAC,MAC3BA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,CAACC,MAAMA,IAAIA,CAAC,EAChB,KAAK,EAAE,IAEL,mBAAmB,KAAKD,CAAC,IAAI,IAAIA,EAAE,aAAa,KAAK;AAC9D;AAKO,SAASE,EAASC,GAAkB;AACzC,QAAMH,KAAKF,EAAaK,CAAG,KAAK,WAAW,MAAM,CAAC;AAClD,SAAO;AAAA,IACL,GAAG,SAASH,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAAA;AAEjC;AAEO,SAASI,EAAS,EAAE,GAAAC,GAAG,GAAAC,GAAG,GAAAC,KAAkB;AACjD,QAAMC,IAAK,CAACX,MACV,KAAK,MAAMD,EAAQC,IAAI,GAAG,IAAI,GAAG,EAC9B,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB,SAAO,IAAIW,EAAGH,CAAC,CAAC,GAAGG,EAAGF,CAAC,CAAC,GAAGE,EAAGD,CAAC,CAAC;AAClC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Alert-udX1ybuC.cjs");exports.Alert=e.Alert;exports.default=e.Alert;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Alert-DeGgilkH.cjs");exports.Alert=e.Alert;exports.default=e.Alert;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { A as r, A as t } from "../../Alert-DXmzM_rh.js";
1
+ import { A as r, A as t } from "../../Alert-rNjfqj2Z.js";
2
2
  export {
3
3
  r as Alert,
4
4
  t as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("../../AuthLayout-BRUxDgzs.cjs");exports.AuthLayout=t.AuthLayout;exports.default=t.AuthLayout;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("../../AuthLayout-ChILVWZ-.cjs");exports.AuthLayout=t.AuthLayout;exports.default=t.AuthLayout;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { A as o, A as u } from "../../AuthLayout-CP9qu6Bv.js";
1
+ import { A as o, A as u } from "../../AuthLayout-zAS3jlYc.js";
2
2
  export {
3
3
  o as AuthLayout,
4
4
  u as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../Avatar-Dgf04PBC.cjs"),a=require("../../AvatarGroup-uW0SD5P4.cjs");exports.Avatar=r.Avatar;exports.default=r.Avatar;exports.AvatarGroup=a.AvatarGroup;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../Avatar-D_YivyqV.cjs"),a=require("../../AvatarGroup-Bnf_RSc9.cjs");exports.Avatar=r.Avatar;exports.default=r.Avatar;exports.AvatarGroup=a.AvatarGroup;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
- import { A as o, A as t } from "../../Avatar-Q50J8wdN.js";
2
- import { A as e } from "../../AvatarGroup-YaNasLMS.js";
1
+ import { A as o, A as t } from "../../Avatar-BGPGxry2.js";
2
+ import { A as e } from "../../AvatarGroup-Difz4lLR.js";
3
3
  export {
4
4
  o as Avatar,
5
5
  e as AvatarGroup,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Badge-BQpr2Jee.cjs");exports.Badge=e.Badge;exports.default=e.Badge;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Badge-DVbe1rAI.cjs");exports.Badge=e.Badge;exports.default=e.Badge;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { B, B as d } from "../../Badge-DSWigoGC.js";
1
+ import { B, B as d } from "../../Badge-BmFgusOa.js";
2
2
  export {
3
3
  B as Badge,
4
4
  d as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Breadcrumbs-CsYTiX2h.cjs");exports.Breadcrumbs=e.Breadcrumbs;exports.default=e.Breadcrumbs;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Breadcrumbs-CGcpMlxm.cjs");exports.Breadcrumbs=e.Breadcrumbs;exports.default=e.Breadcrumbs;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { B as e, B as s } from "../../Breadcrumbs-DQHHeLId.js";
1
+ import { B as e, B as s } from "../../Breadcrumbs-BJHKk0Sn.js";
2
2
  export {
3
3
  e as Breadcrumbs,
4
4
  s as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("../../Button-CXmDOzPk.cjs");exports.Button=t.Button;exports.default=t.Button;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("../../Button-BZ_o-akc.cjs");exports.Button=t.Button;exports.default=t.Button;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { B as o, B } from "../../Button-DBs8xnA5.js";
1
+ import { B as o, B } from "../../Button-obe6rono.js";
2
2
  export {
3
3
  o as Button,
4
4
  B as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Card-DGF22HbS.cjs");exports.Card=e.Card;exports.default=e.Card;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Card-KvvNlchc.cjs");exports.Card=e.Card;exports.default=e.Card;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { C, C as d } from "../../Card-DYKnWt-L.js";
1
+ import { C, C as d } from "../../Card-BRJV2JZE.js";
2
2
  export {
3
3
  C as Card,
4
4
  d as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Chip-gUH_7nQc.cjs");exports.Chip=e.Chip;exports.default=e.Chip;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../Chip-CYz4vxHm.cjs");exports.Chip=e.Chip;exports.default=e.Chip;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as e, C as f } from "../../Chip-DdKhcstm.js";
1
+ import { C as e, C as f } from "../../Chip-CQ4cYVl_.js";
2
2
  export {
3
3
  e as Chip,
4
4
  f as default
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../ChoiceCardGroup-d0VVTUi5.cjs");exports.ChoiceCard=e.ChoiceCard;exports.ChoiceCardGroup=e.ChoiceCardGroup;exports.default=e.ChoiceCard;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../ChoiceCardGroup-pIOKIUI0.cjs");exports.ChoiceCard=e.ChoiceCard;exports.ChoiceCardGroup=e.ChoiceCardGroup;exports.default=e.ChoiceCard;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as o, a as r, C as e } from "../../ChoiceCardGroup-DBohUnRj.js";
1
+ import { C as o, a as r, C as e } from "../../ChoiceCardGroup-D3HL7dHj.js";
2
2
  export {
3
3
  o as ChoiceCard,
4
4
  r as ChoiceCardGroup,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../CodeBlock-C6tQtbHU.cjs");exports.CodeBlock=e.CodeBlock;exports.default=e.CodeBlock;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../CodeBlock-H75dbOvg.cjs");exports.CodeBlock=e.CodeBlock;exports.default=e.CodeBlock;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as e, C } from "../../CodeBlock-DD_d3-sM.js";
1
+ import { C as e, C } from "../../CodeBlock-DddGTLu1.js";
2
2
  export {
3
3
  e as CodeBlock,
4
4
  C as default
@@ -23,6 +23,11 @@ export interface ColorPickerProps {
23
23
  onChange?: (color: string) => void;
24
24
  /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */
25
25
  swatches?: string[];
26
+ /**
27
+ * Offer opacity. Defaults to `true`. `false` hides the alpha slider and the field only ever emits
28
+ * `#rrggbb` (never `rgba()`) — for colors that must be opaque, e.g. brand colors.
29
+ */
30
+ alpha?: boolean;
26
31
  /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */
27
32
  name?: string;
28
33
  /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */
@@ -23,6 +23,11 @@ export interface ColorPickerProps {
23
23
  onChange?: (color: string) => void;
24
24
  /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */
25
25
  swatches?: string[];
26
+ /**
27
+ * Offer opacity. Defaults to `true`. `false` hides the alpha slider and the field only ever emits
28
+ * `#rrggbb` (never `rgba()`) — for colors that must be opaque, e.g. brand colors.
29
+ */
30
+ alpha?: boolean;
26
31
  /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */
27
32
  name?: string;
28
33
  /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */
@@ -9,6 +9,11 @@ export interface ColorPickerPanelProps {
9
9
  swatches?: string[];
10
10
  /** Show the leading "no color" swatch that clears the value. Defaults to `true`. */
11
11
  clearable?: boolean;
12
+ /**
13
+ * Offer opacity. Defaults to `true`. `false` hides the alpha rail and pins alpha to `1`, so the
14
+ * panel only ever emits `#rrggbb` — for values that must be opaque (brand colors).
15
+ */
16
+ alpha?: boolean;
12
17
  }
13
18
  /**
14
19
  * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and
@@ -17,4 +22,4 @@ export interface ColorPickerPanelProps {
17
22
  * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`
18
23
  * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).
19
24
  */
20
- export declare function ColorPickerPanel({ value, onChange, swatches, clearable, }: ColorPickerPanelProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function ColorPickerPanel({ value, onChange, swatches, clearable, alpha: alphaEnabled, }: ColorPickerPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -9,6 +9,11 @@ export interface ColorPickerPanelProps {
9
9
  swatches?: string[];
10
10
  /** Show the leading "no color" swatch that clears the value. Defaults to `true`. */
11
11
  clearable?: boolean;
12
+ /**
13
+ * Offer opacity. Defaults to `true`. `false` hides the alpha rail and pins alpha to `1`, so the
14
+ * panel only ever emits `#rrggbb` — for values that must be opaque (brand colors).
15
+ */
16
+ alpha?: boolean;
12
17
  }
13
18
  /**
14
19
  * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and
@@ -17,4 +22,4 @@ export interface ColorPickerPanelProps {
17
22
  * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`
18
23
  * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).
19
24
  */
20
- export declare function ColorPickerPanel({ value, onChange, swatches, clearable, }: ColorPickerPanelProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function ColorPickerPanel({ value, onChange, swatches, clearable, alpha: alphaEnabled, }: ColorPickerPanelProps): import("react/jsx-runtime").JSX.Element;