@techzyapp/ui-library 1.0.23 → 1.0.25

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 (320) hide show
  1. package/dist/{AdminRoot-C7Idu7FQ.cjs → AdminRoot-BkPPRkyQ.cjs} +2 -2
  2. package/dist/{AdminRoot-C7Idu7FQ.cjs.map → AdminRoot-BkPPRkyQ.cjs.map} +1 -1
  3. package/dist/{AdminRoot-aDy6rNqI.js → AdminRoot-CgvtgUpW.js} +4 -4
  4. package/dist/{AdminRoot-aDy6rNqI.js.map → AdminRoot-CgvtgUpW.js.map} +1 -1
  5. package/dist/Alert-DXmzM_rh.js +71 -0
  6. package/dist/{Alert-D6VL2C-E.js.map → Alert-DXmzM_rh.js.map} +1 -1
  7. package/dist/Alert-udX1ybuC.cjs +2 -0
  8. package/dist/{Alert-Cl1zxmX9.cjs.map → Alert-udX1ybuC.cjs.map} +1 -1
  9. package/dist/Blockquote-BWGxIL_V.cjs +2 -0
  10. package/dist/{Blockquote-CxHwOecc.cjs.map → Blockquote-BWGxIL_V.cjs.map} +1 -1
  11. package/dist/Blockquote-Ma-2naET.js +46 -0
  12. package/dist/{Blockquote-CNIuJFHq.js.map → Blockquote-Ma-2naET.js.map} +1 -1
  13. package/dist/{Breadcrumbs-BnFW4LgK.cjs → Breadcrumbs-CsYTiX2h.cjs} +2 -2
  14. package/dist/{Breadcrumbs-BnFW4LgK.cjs.map → Breadcrumbs-CsYTiX2h.cjs.map} +1 -1
  15. package/dist/{Breadcrumbs-CicfjfIu.js → Breadcrumbs-DQHHeLId.js} +3 -3
  16. package/dist/{Breadcrumbs-CicfjfIu.js.map → Breadcrumbs-DQHHeLId.js.map} +1 -1
  17. package/dist/{Button-ZplrHYKw.cjs → Button-CXmDOzPk.cjs} +2 -2
  18. package/dist/{Button-ZplrHYKw.cjs.map → Button-CXmDOzPk.cjs.map} +1 -1
  19. package/dist/{Button-Cfxd7qhd.js → Button-DBs8xnA5.js} +2 -2
  20. package/dist/{Button-Cfxd7qhd.js.map → Button-DBs8xnA5.js.map} +1 -1
  21. package/dist/{Calendar-S9vyp-qv.cjs → Calendar-B2nMXk4C.cjs} +2 -2
  22. package/dist/{Calendar-S9vyp-qv.cjs.map → Calendar-B2nMXk4C.cjs.map} +1 -1
  23. package/dist/{Calendar-DTxCT-ki.js → Calendar-CtteUt82.js} +3 -3
  24. package/dist/{Calendar-DTxCT-ki.js.map → Calendar-CtteUt82.js.map} +1 -1
  25. package/dist/{Card-BeE2ohcn.cjs → Card-DGF22HbS.cjs} +2 -2
  26. package/dist/{Card-BeE2ohcn.cjs.map → Card-DGF22HbS.cjs.map} +1 -1
  27. package/dist/{Card-eXJfA4rU.js → Card-DYKnWt-L.js} +2 -2
  28. package/dist/{Card-eXJfA4rU.js.map → Card-DYKnWt-L.js.map} +1 -1
  29. package/dist/{Chip-BOXXdzap.js → Chip-DdKhcstm.js} +2 -2
  30. package/dist/{Chip-BOXXdzap.js.map → Chip-DdKhcstm.js.map} +1 -1
  31. package/dist/{Chip-B4XERWb_.cjs → Chip-gUH_7nQc.cjs} +2 -2
  32. package/dist/{Chip-B4XERWb_.cjs.map → Chip-gUH_7nQc.cjs.map} +1 -1
  33. package/dist/{CodeBlock-C7_A6CTT.cjs → CodeBlock-C6tQtbHU.cjs} +2 -2
  34. package/dist/{CodeBlock-C7_A6CTT.cjs.map → CodeBlock-C6tQtbHU.cjs.map} +1 -1
  35. package/dist/{CodeBlock-D_PRiWMq.js → CodeBlock-DD_d3-sM.js} +3 -3
  36. package/dist/{CodeBlock-D_PRiWMq.js.map → CodeBlock-DD_d3-sM.js.map} +1 -1
  37. package/dist/{ColorPicker-ClVpWf77.cjs → ColorPicker-DtzFwNWk.cjs} +2 -2
  38. package/dist/{ColorPicker-ClVpWf77.cjs.map → ColorPicker-DtzFwNWk.cjs.map} +1 -1
  39. package/dist/{ColorPicker-DAjs7PmR.js → ColorPicker-Dw6Qk0iy.js} +3 -3
  40. package/dist/{ColorPicker-DAjs7PmR.js.map → ColorPicker-Dw6Qk0iy.js.map} +1 -1
  41. package/dist/{ColorPickerPanel-Dk6bI0Xy.cjs → ColorPickerPanel--wBX-m7J.cjs} +2 -2
  42. package/dist/{ColorPickerPanel-Dk6bI0Xy.cjs.map → ColorPickerPanel--wBX-m7J.cjs.map} +1 -1
  43. package/dist/{ColorPickerPanel-BGzm2had.js → ColorPickerPanel-Dp7bnnVf.js} +2 -2
  44. package/dist/{ColorPickerPanel-BGzm2had.js.map → ColorPickerPanel-Dp7bnnVf.js.map} +1 -1
  45. package/dist/ConfigProvider-Bszl3Wr3.cjs +2 -0
  46. package/dist/ConfigProvider-Bszl3Wr3.cjs.map +1 -0
  47. package/dist/ConfigProvider-DR9YMy9U.js +320 -0
  48. package/dist/ConfigProvider-DR9YMy9U.js.map +1 -0
  49. package/dist/{CopyButton-COF3hIV-.cjs → CopyButton-Ct-8AmmX.cjs} +2 -2
  50. package/dist/{CopyButton-COF3hIV-.cjs.map → CopyButton-Ct-8AmmX.cjs.map} +1 -1
  51. package/dist/{CopyButton-Bv7L4xJf.js → CopyButton-DJ1PSJZU.js} +3 -3
  52. package/dist/{CopyButton-Bv7L4xJf.js.map → CopyButton-DJ1PSJZU.js.map} +1 -1
  53. package/dist/{DatePicker-kA-xn5ET.cjs → DatePicker-BxEydgfu.cjs} +2 -2
  54. package/dist/{DatePicker-kA-xn5ET.cjs.map → DatePicker-BxEydgfu.cjs.map} +1 -1
  55. package/dist/{DatePicker-DZfOvxUR.js → DatePicker-CJioG5M7.js} +4 -4
  56. package/dist/{DatePicker-DZfOvxUR.js.map → DatePicker-CJioG5M7.js.map} +1 -1
  57. package/dist/{DateTimePicker-DEGmn5UX.cjs → DateTimePicker-COEj2Z0F.cjs} +2 -2
  58. package/dist/{DateTimePicker-DEGmn5UX.cjs.map → DateTimePicker-COEj2Z0F.cjs.map} +1 -1
  59. package/dist/{DateTimePicker-BxBXhSN_.js → DateTimePicker-e2zj2bhS.js} +7 -7
  60. package/dist/{DateTimePicker-BxBXhSN_.js.map → DateTimePicker-e2zj2bhS.js.map} +1 -1
  61. package/dist/{EmptyState-Du4vA3bC.js → EmptyState-BTd7aVgu.js} +12 -12
  62. package/dist/{EmptyState-Du4vA3bC.js.map → EmptyState-BTd7aVgu.js.map} +1 -1
  63. package/dist/EmptyState-Bv4XXnD1.cjs +2 -0
  64. package/dist/{EmptyState-DlX-BLLI.cjs.map → EmptyState-Bv4XXnD1.cjs.map} +1 -1
  65. package/dist/{FileCard-zyCpTrJ-.cjs → FileCard-DW5Ur8Aj.cjs} +2 -2
  66. package/dist/{FileCard-zyCpTrJ-.cjs.map → FileCard-DW5Ur8Aj.cjs.map} +1 -1
  67. package/dist/{FileCard-juQ1fWbG.js → FileCard-DY8N9Lzz.js} +3 -3
  68. package/dist/{FileCard-juQ1fWbG.js.map → FileCard-DY8N9Lzz.js.map} +1 -1
  69. package/dist/{FileUploader-DOe3CyJB.cjs → FileUploader-B7VfhcR7.cjs} +2 -2
  70. package/dist/{FileUploader-DOe3CyJB.cjs.map → FileUploader-B7VfhcR7.cjs.map} +1 -1
  71. package/dist/{FileUploader-DL9atihI.js → FileUploader-BYF5FvUc.js} +5 -5
  72. package/dist/{FileUploader-DL9atihI.js.map → FileUploader-BYF5FvUc.js.map} +1 -1
  73. package/dist/{Flag-DFKHYnqk.cjs → Flag-CB4YyPj3.cjs} +2 -2
  74. package/dist/{Flag-DFKHYnqk.cjs.map → Flag-CB4YyPj3.cjs.map} +1 -1
  75. package/dist/{Flag-BxRrjCTB.js → Flag-yA1y5XzR.js} +2 -2
  76. package/dist/{Flag-BxRrjCTB.js.map → Flag-yA1y5XzR.js.map} +1 -1
  77. package/dist/{FullscreenToggle-BNK7RcRq.cjs → FullscreenToggle-0lskYnpx.cjs} +2 -2
  78. package/dist/{FullscreenToggle-BNK7RcRq.cjs.map → FullscreenToggle-0lskYnpx.cjs.map} +1 -1
  79. package/dist/{FullscreenToggle-BMCNsyzb.js → FullscreenToggle-jSLruiKt.js} +3 -3
  80. package/dist/{FullscreenToggle-BMCNsyzb.js.map → FullscreenToggle-jSLruiKt.js.map} +1 -1
  81. package/dist/{IconButton-CfvsE_p3.js → IconButton-BEGWfcVc.js} +2 -2
  82. package/dist/{IconButton-CfvsE_p3.js.map → IconButton-BEGWfcVc.js.map} +1 -1
  83. package/dist/{IconButton-B9eVM18U.cjs → IconButton-BN-bZxEi.cjs} +2 -2
  84. package/dist/{IconButton-B9eVM18U.cjs.map → IconButton-BN-bZxEi.cjs.map} +1 -1
  85. package/dist/{Loader-CxLrhAz9.cjs → Loader-B5YqzEYy.cjs} +2 -2
  86. package/dist/{Loader-CxLrhAz9.cjs.map → Loader-B5YqzEYy.cjs.map} +1 -1
  87. package/dist/Loader-BZIa8hwv.js +29 -0
  88. package/dist/{Loader-DwmyJFwG.js.map → Loader-BZIa8hwv.js.map} +1 -1
  89. package/dist/Modal-0V-REVV-.cjs +2 -0
  90. package/dist/{Modal-DXZdMmJh.cjs.map → Modal-0V-REVV-.cjs.map} +1 -1
  91. package/dist/Modal-B7yoFC3o.js +195 -0
  92. package/dist/{Modal-Cx0JEQ-j.js.map → Modal-B7yoFC3o.js.map} +1 -1
  93. package/dist/{MultiSelect-yGlvweEq.js → MultiSelect-C8xuXaoR.js} +4 -4
  94. package/dist/{MultiSelect-yGlvweEq.js.map → MultiSelect-C8xuXaoR.js.map} +1 -1
  95. package/dist/{MultiSelect-DfhyGxDU.cjs → MultiSelect-gj9Ymeh2.cjs} +2 -2
  96. package/dist/{MultiSelect-DfhyGxDU.cjs.map → MultiSelect-gj9Ymeh2.cjs.map} +1 -1
  97. package/dist/{NumberField-cAjPU1P5.js → NumberField-2yM0mmyj.js} +3 -3
  98. package/dist/{NumberField-cAjPU1P5.js.map → NumberField-2yM0mmyj.js.map} +1 -1
  99. package/dist/{NumberField-B7yPXIw_.cjs → NumberField-CEt95jcC.cjs} +2 -2
  100. package/dist/{NumberField-B7yPXIw_.cjs.map → NumberField-CEt95jcC.cjs.map} +1 -1
  101. package/dist/OtpField-CkliY82J.js +174 -0
  102. package/dist/OtpField-CkliY82J.js.map +1 -0
  103. package/dist/OtpField-on-K0_fM.cjs +2 -0
  104. package/dist/OtpField-on-K0_fM.cjs.map +1 -0
  105. package/dist/{PageLayout-BSHyKoQ4.cjs → PageLayout-DGHu7Vm3.cjs} +2 -2
  106. package/dist/{PageLayout-BSHyKoQ4.cjs.map → PageLayout-DGHu7Vm3.cjs.map} +1 -1
  107. package/dist/{PageLayout-C9Je7kfF.js → PageLayout-DzPh_G6H.js} +2 -2
  108. package/dist/{PageLayout-C9Je7kfF.js.map → PageLayout-DzPh_G6H.js.map} +1 -1
  109. package/dist/{PageNotFound-voB9ylPF.cjs → PageNotFound-B8_eIT8p.cjs} +2 -2
  110. package/dist/{PageNotFound-voB9ylPF.cjs.map → PageNotFound-B8_eIT8p.cjs.map} +1 -1
  111. package/dist/{PageNotFound-CUN2OntP.js → PageNotFound-CCFfPHgA.js} +5 -5
  112. package/dist/{PageNotFound-CUN2OntP.js.map → PageNotFound-CCFfPHgA.js.map} +1 -1
  113. package/dist/{Pagination-BUGaylZa.cjs → Pagination-BdVebW2L.cjs} +2 -2
  114. package/dist/{Pagination-BUGaylZa.cjs.map → Pagination-BdVebW2L.cjs.map} +1 -1
  115. package/dist/{Pagination-BaVHgIWT.js → Pagination-CmskZjcz.js} +2 -2
  116. package/dist/{Pagination-BaVHgIWT.js.map → Pagination-CmskZjcz.js.map} +1 -1
  117. package/dist/{RemoveDialog-BpL2-gnz.js → RemoveDialog-CV75B0aN.js} +4 -4
  118. package/dist/{RemoveDialog-BpL2-gnz.js.map → RemoveDialog-CV75B0aN.js.map} +1 -1
  119. package/dist/{RemoveDialog-DGt_72we.cjs → RemoveDialog-DmOk0ezc.cjs} +2 -2
  120. package/dist/{RemoveDialog-DGt_72we.cjs.map → RemoveDialog-DmOk0ezc.cjs.map} +1 -1
  121. package/dist/{RichTextEditor-C_6pzqYY.js → RichTextEditor-Bm8FFbcR.js} +7 -7
  122. package/dist/{RichTextEditor-C_6pzqYY.js.map → RichTextEditor-Bm8FFbcR.js.map} +1 -1
  123. package/dist/{RichTextEditor-BuoywqBu.cjs → RichTextEditor-uXddgtlk.cjs} +2 -2
  124. package/dist/{RichTextEditor-BuoywqBu.cjs.map → RichTextEditor-uXddgtlk.cjs.map} +1 -1
  125. package/dist/RootLayout-Cf7Rr9Iz.js +515 -0
  126. package/dist/RootLayout-Cf7Rr9Iz.js.map +1 -0
  127. package/dist/RootLayout-kssj9exn.cjs +2 -0
  128. package/dist/RootLayout-kssj9exn.cjs.map +1 -0
  129. package/dist/{Select-CVy5BnKe.cjs → Select-7vEGJCvA.cjs} +2 -2
  130. package/dist/{Select-CVy5BnKe.cjs.map → Select-7vEGJCvA.cjs.map} +1 -1
  131. package/dist/{Select-ChT-6_bM.js → Select-CdX3Ks7y.js} +3 -3
  132. package/dist/{Select-ChT-6_bM.js.map → Select-CdX3Ks7y.js.map} +1 -1
  133. package/dist/{Sidebar-D2MsR33k.cjs → Sidebar-DcKIEfhy.cjs} +2 -2
  134. package/dist/{Sidebar-D2MsR33k.cjs.map → Sidebar-DcKIEfhy.cjs.map} +1 -1
  135. package/dist/{Sidebar-ZA1wxCez.js → Sidebar-YH-DoNG9.js} +3 -3
  136. package/dist/{Sidebar-ZA1wxCez.js.map → Sidebar-YH-DoNG9.js.map} +1 -1
  137. package/dist/{SpeedDial-B9JTNNUU.cjs → SpeedDial-9_Yk8AGx.cjs} +2 -2
  138. package/dist/{SpeedDial-B9JTNNUU.cjs.map → SpeedDial-9_Yk8AGx.cjs.map} +1 -1
  139. package/dist/{SpeedDial-DUYQMDCY.js → SpeedDial-DWNuC6f8.js} +2 -2
  140. package/dist/{SpeedDial-DUYQMDCY.js.map → SpeedDial-DWNuC6f8.js.map} +1 -1
  141. package/dist/{Stepper-BaC934rb.cjs → Stepper-B1z_u650.cjs} +2 -2
  142. package/dist/{Stepper-BaC934rb.cjs.map → Stepper-B1z_u650.cjs.map} +1 -1
  143. package/dist/{Stepper-D89I17pC.js → Stepper-CuqFpamY.js} +2 -2
  144. package/dist/{Stepper-D89I17pC.js.map → Stepper-CuqFpamY.js.map} +1 -1
  145. package/dist/{Table-DvgBWTLx.cjs → Table-BPit83Pn.cjs} +2 -2
  146. package/dist/{Table-DvgBWTLx.cjs.map → Table-BPit83Pn.cjs.map} +1 -1
  147. package/dist/{Table-CdIQ5Wfh.js → Table-Drdhfm99.js} +15 -15
  148. package/dist/{Table-CdIQ5Wfh.js.map → Table-Drdhfm99.js.map} +1 -1
  149. package/dist/{Tabs-CejCwV3O.cjs → Tabs-BiKDy_fv.cjs} +2 -2
  150. package/dist/{Tabs-CejCwV3O.cjs.map → Tabs-BiKDy_fv.cjs.map} +1 -1
  151. package/dist/{Tabs-8-klG-y-.js → Tabs-ytbBzAxG.js} +2 -2
  152. package/dist/{Tabs-8-klG-y-.js.map → Tabs-ytbBzAxG.js.map} +1 -1
  153. package/dist/{TagsField-BQLqUckB.js → TagsField-CEt_PC5y.js} +4 -4
  154. package/dist/{TagsField-BQLqUckB.js.map → TagsField-CEt_PC5y.js.map} +1 -1
  155. package/dist/{TagsField-BSAd4eUr.cjs → TagsField-DpDbf0ru.cjs} +2 -2
  156. package/dist/{TagsField-BSAd4eUr.cjs.map → TagsField-DpDbf0ru.cjs.map} +1 -1
  157. package/dist/{TextField-B4YtjNUs.js → TextField-BWdmF-HE.js} +3 -3
  158. package/dist/{TextField-B4YtjNUs.js.map → TextField-BWdmF-HE.js.map} +1 -1
  159. package/dist/{TextField-DzYGA_St.cjs → TextField-Df_kGy2l.cjs} +2 -2
  160. package/dist/{TextField-DzYGA_St.cjs.map → TextField-Df_kGy2l.cjs.map} +1 -1
  161. package/dist/{ThemeToggle-BKk0eFiB.cjs → ThemeToggle-BJdXhmfc.cjs} +2 -2
  162. package/dist/{ThemeToggle-BKk0eFiB.cjs.map → ThemeToggle-BJdXhmfc.cjs.map} +1 -1
  163. package/dist/{ThemeToggle-B4_zRHJY.js → ThemeToggle-CgxF6oUu.js} +3 -3
  164. package/dist/{ThemeToggle-B4_zRHJY.js.map → ThemeToggle-CgxF6oUu.js.map} +1 -1
  165. package/dist/{TimeColumns-BAzRrkqY.cjs → TimeColumns-DxVN0V8l.cjs} +2 -2
  166. package/dist/{TimeColumns-BAzRrkqY.cjs.map → TimeColumns-DxVN0V8l.cjs.map} +1 -1
  167. package/dist/{TimeColumns-CAPyli9V.js → TimeColumns-n-fz50mr.js} +2 -2
  168. package/dist/{TimeColumns-CAPyli9V.js.map → TimeColumns-n-fz50mr.js.map} +1 -1
  169. package/dist/{TimePicker-BebBSlQF.js → TimePicker-Bopxx3zU.js} +5 -5
  170. package/dist/{TimePicker-BebBSlQF.js.map → TimePicker-Bopxx3zU.js.map} +1 -1
  171. package/dist/{TimePicker-BUnXYR5g.cjs → TimePicker-DvoemiGz.cjs} +2 -2
  172. package/dist/{TimePicker-BUnXYR5g.cjs.map → TimePicker-DvoemiGz.cjs.map} +1 -1
  173. package/dist/{Toaster-ywqAKP8s.js → Toaster-BxIY2H4V.js} +2 -2
  174. package/dist/{Toaster-ywqAKP8s.js.map → Toaster-BxIY2H4V.js.map} +1 -1
  175. package/dist/{Toaster-B2rO4BkG.cjs → Toaster-DZSzFse_.cjs} +2 -2
  176. package/dist/{Toaster-B2rO4BkG.cjs.map → Toaster-DZSzFse_.cjs.map} +1 -1
  177. package/dist/{TranslatedFields-DQQUb0RD.cjs → TranslatedFields-BtDLkQy7.cjs} +2 -2
  178. package/dist/{TranslatedFields-DQQUb0RD.cjs.map → TranslatedFields-BtDLkQy7.cjs.map} +1 -1
  179. package/dist/{TranslatedFields-C-wlh51E.js → TranslatedFields-DmR8LKSG.js} +5 -5
  180. package/dist/{TranslatedFields-C-wlh51E.js.map → TranslatedFields-DmR8LKSG.js.map} +1 -1
  181. package/dist/{UserCard-Be1kl0TZ.cjs → UserCard-C1yFvVIc.cjs} +2 -2
  182. package/dist/{UserCard-Be1kl0TZ.cjs.map → UserCard-C1yFvVIc.cjs.map} +1 -1
  183. package/dist/{UserCard-BqWt0S-c.js → UserCard-J8Bpbh3x.js} +3 -3
  184. package/dist/{UserCard-BqWt0S-c.js.map → UserCard-J8Bpbh3x.js.map} +1 -1
  185. package/dist/components/Alert/index.cjs +1 -1
  186. package/dist/components/Alert/index.js +1 -1
  187. package/dist/components/Blockquote/Blockquote.d.cts +1 -1
  188. package/dist/components/Blockquote/Blockquote.d.ts +1 -1
  189. package/dist/components/Blockquote/index.cjs +1 -1
  190. package/dist/components/Blockquote/index.js +1 -1
  191. package/dist/components/Breadcrumbs/index.cjs +1 -1
  192. package/dist/components/Breadcrumbs/index.js +1 -1
  193. package/dist/components/Button/index.cjs +1 -1
  194. package/dist/components/Button/index.js +1 -1
  195. package/dist/components/Card/index.cjs +1 -1
  196. package/dist/components/Card/index.js +1 -1
  197. package/dist/components/Chip/index.cjs +1 -1
  198. package/dist/components/Chip/index.js +1 -1
  199. package/dist/components/CodeBlock/index.cjs +1 -1
  200. package/dist/components/CodeBlock/index.js +1 -1
  201. package/dist/components/ColorPicker/index.cjs +1 -1
  202. package/dist/components/ColorPicker/index.js +1 -1
  203. package/dist/components/CopyButton/index.cjs +1 -1
  204. package/dist/components/CopyButton/index.js +1 -1
  205. package/dist/components/DatePicker/index.cjs +1 -1
  206. package/dist/components/DatePicker/index.js +1 -1
  207. package/dist/components/DateTimePicker/index.cjs +1 -1
  208. package/dist/components/DateTimePicker/index.js +1 -1
  209. package/dist/components/EmptyState/index.cjs +1 -1
  210. package/dist/components/EmptyState/index.js +1 -1
  211. package/dist/components/FileCard/index.cjs +1 -1
  212. package/dist/components/FileCard/index.js +1 -1
  213. package/dist/components/FileUploader/index.cjs +1 -1
  214. package/dist/components/FileUploader/index.js +1 -1
  215. package/dist/components/Flag/index.cjs +1 -1
  216. package/dist/components/Flag/index.js +1 -1
  217. package/dist/components/FullscreenToggle/index.cjs +1 -1
  218. package/dist/components/FullscreenToggle/index.js +1 -1
  219. package/dist/components/IconButton/index.cjs +1 -1
  220. package/dist/components/IconButton/index.js +1 -1
  221. package/dist/components/Loader/index.cjs +1 -1
  222. package/dist/components/Loader/index.js +1 -1
  223. package/dist/components/Modal/index.cjs +1 -1
  224. package/dist/components/Modal/index.js +1 -1
  225. package/dist/components/MultiSelect/index.cjs +1 -1
  226. package/dist/components/MultiSelect/index.js +1 -1
  227. package/dist/components/NumberField/index.cjs +1 -1
  228. package/dist/components/NumberField/index.js +1 -1
  229. package/dist/components/OtpField/OtpField.d.cts +3 -0
  230. package/dist/components/OtpField/OtpField.d.ts +3 -0
  231. package/dist/components/OtpField/index.cjs +1 -1
  232. package/dist/components/OtpField/index.d.cts +1 -1
  233. package/dist/components/OtpField/index.d.ts +1 -1
  234. package/dist/components/OtpField/index.js +1 -1
  235. package/dist/components/PageLayout/index.cjs +1 -1
  236. package/dist/components/PageLayout/index.js +1 -1
  237. package/dist/components/PageNotFound/index.cjs +1 -1
  238. package/dist/components/PageNotFound/index.js +1 -1
  239. package/dist/components/Pagination/index.cjs +1 -1
  240. package/dist/components/Pagination/index.js +1 -1
  241. package/dist/components/RemoveDialog/index.cjs +1 -1
  242. package/dist/components/RemoveDialog/index.js +1 -1
  243. package/dist/components/RichTextEditor/index.cjs +1 -1
  244. package/dist/components/RichTextEditor/index.js +1 -1
  245. package/dist/components/RootLayout/SettingsDrawer.d.cts +3 -1
  246. package/dist/components/RootLayout/SettingsDrawer.d.ts +3 -1
  247. package/dist/components/RootLayout/index.cjs +1 -1
  248. package/dist/components/RootLayout/index.js +1 -1
  249. package/dist/components/Select/index.cjs +1 -1
  250. package/dist/components/Select/index.js +1 -1
  251. package/dist/components/Sidebar/index.cjs +1 -1
  252. package/dist/components/Sidebar/index.js +1 -1
  253. package/dist/components/SpeedDial/index.cjs +1 -1
  254. package/dist/components/SpeedDial/index.js +1 -1
  255. package/dist/components/Stepper/index.cjs +1 -1
  256. package/dist/components/Stepper/index.js +1 -1
  257. package/dist/components/Table/index.cjs +1 -1
  258. package/dist/components/Table/index.js +1 -1
  259. package/dist/components/Tabs/index.cjs +1 -1
  260. package/dist/components/Tabs/index.js +1 -1
  261. package/dist/components/TagsField/index.cjs +1 -1
  262. package/dist/components/TagsField/index.js +1 -1
  263. package/dist/components/TextField/index.cjs +1 -1
  264. package/dist/components/TextField/index.js +1 -1
  265. package/dist/components/ThemeToggle/index.cjs +1 -1
  266. package/dist/components/ThemeToggle/index.js +1 -1
  267. package/dist/components/TimePicker/index.cjs +1 -1
  268. package/dist/components/TimePicker/index.js +1 -1
  269. package/dist/components/Toast/index.cjs +1 -1
  270. package/dist/components/Toast/index.js +1 -1
  271. package/dist/components/TranslatedFields/index.cjs +1 -1
  272. package/dist/components/TranslatedFields/index.js +1 -1
  273. package/dist/components/UserCard/index.cjs +1 -1
  274. package/dist/components/UserCard/index.js +1 -1
  275. package/dist/entries/app.cjs +1 -1
  276. package/dist/entries/app.js +1 -1
  277. package/dist/entries/components.cjs +1 -1
  278. package/dist/entries/components.js +41 -41
  279. package/dist/entries/i18n.cjs +1 -1
  280. package/dist/entries/i18n.js +2 -2
  281. package/dist/entries/theme.cjs +1 -1
  282. package/dist/entries/theme.d.cts +1 -1
  283. package/dist/entries/theme.d.ts +1 -1
  284. package/dist/entries/theme.js +1 -1
  285. package/dist/i18n/messages.d.cts +6 -0
  286. package/dist/i18n/messages.d.ts +6 -0
  287. package/dist/index.cjs +1 -1
  288. package/dist/index.css +25 -2
  289. package/dist/index.js +44 -44
  290. package/dist/{messages-Dvn_tEp0.cjs → messages-DKT0SRM0.cjs} +9 -9
  291. package/dist/messages-DKT0SRM0.cjs.map +1 -0
  292. package/dist/{messages-CL8uoIRj.js → messages-ogohLC5P.js} +67 -25
  293. package/dist/messages-ogohLC5P.js.map +1 -0
  294. package/dist/theme/ConfigProvider.d.cts +19 -0
  295. package/dist/theme/ConfigProvider.d.ts +19 -0
  296. package/dist/theme/index.d.cts +1 -1
  297. package/dist/theme/index.d.ts +1 -1
  298. package/package.json +1 -1
  299. package/dist/Alert-Cl1zxmX9.cjs +0 -2
  300. package/dist/Alert-D6VL2C-E.js +0 -71
  301. package/dist/Blockquote-CNIuJFHq.js +0 -46
  302. package/dist/Blockquote-CxHwOecc.cjs +0 -2
  303. package/dist/ConfigProvider-Blhvj6UQ.js +0 -296
  304. package/dist/ConfigProvider-Blhvj6UQ.js.map +0 -1
  305. package/dist/ConfigProvider-CUG8Mfy2.cjs +0 -2
  306. package/dist/ConfigProvider-CUG8Mfy2.cjs.map +0 -1
  307. package/dist/EmptyState-DlX-BLLI.cjs +0 -2
  308. package/dist/Loader-DwmyJFwG.js +0 -28
  309. package/dist/Modal-Cx0JEQ-j.js +0 -195
  310. package/dist/Modal-DXZdMmJh.cjs +0 -2
  311. package/dist/OtpField-BujZAy2A.cjs +0 -2
  312. package/dist/OtpField-BujZAy2A.cjs.map +0 -1
  313. package/dist/OtpField-D0eTOLtg.js +0 -171
  314. package/dist/OtpField-D0eTOLtg.js.map +0 -1
  315. package/dist/RootLayout-1am1CwPQ.cjs +0 -2
  316. package/dist/RootLayout-1am1CwPQ.cjs.map +0 -1
  317. package/dist/RootLayout-x7qWzXPc.js +0 -479
  318. package/dist/RootLayout-x7qWzXPc.js.map +0 -1
  319. package/dist/messages-CL8uoIRj.js.map +0 -1
  320. package/dist/messages-Dvn_tEp0.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock-D_PRiWMq.js","sources":["../src/components/CodeBlock/CodeBlock.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Tooltip } from '../Tooltip'\nimport styles from './CodeBlock.module.css'\n\n// how long the copy button shows the \"copied\" tick before reverting\nconst COPIED_RESET_MS = 1600\n\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n /** The source code to render. */\n code: string\n /** Shiki language id (`'tsx'`, `'json'`, `'bash'`, `'css'`, …). Defaults to `'tsx'`. */\n language?: string\n /**\n * Optional label shown on the left of the header bar (e.g. a filename). The header bar itself always\n * renders (whenever `copyable`), so the copy button lives in it with or without a `title`.\n */\n title?: ReactNode\n /** Show a copy-to-clipboard button (in the header bar). Defaults to `true`. */\n copyable?: boolean\n /** Show line numbers. Defaults to `true`. */\n showLineNumbers?: boolean\n /** Cap the block height in px — taller code scrolls inside. */\n maxHeight?: number\n /** Soft-wrap long lines instead of scrolling horizontally. Defaults to `false`. */\n wrap?: boolean\n}\n\n/**\n * A syntax-highlighted code block with **VS Code colors** — powered by **Shiki** (an optional peer,\n * `npm i shiki`), the actual VS Code highlighting engine, using its **`dark-plus`** theme. The block\n * is **always dark** (in both app modes) — code reads best on a dark surface, and the deep background\n * anchors it regardless of the surrounding light/dark theme. Highlighting is **async and lazy**\n * (`import('shiki')` on first render); until it lands — or if `shiki` isn't installed / the language\n * is unknown — the block shows the plain code (on the same dark surface), so nothing breaks. A header\n * bar always renders (whenever `copyable`, default `true`) and holds the copy button — which flips to a\n * tick on click — with an optional `title` (e.g. a filename) on its left; `showLineNumbers` (default\n * `true`), `maxHeight` (scrolls inside) and `wrap` shape the body. The whole block\n * keeps VS Code's own dark colors (a deliberate literal-color exception, like the Modal scrim); only\n * the outer border/radius uses `--tz-*` tokens.\n */\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language = 'tsx',\n title,\n copyable = true,\n showLineNumbers = true,\n maxHeight,\n wrap = false,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const [html, setHtml] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n const copyTimer = useRef<number | undefined>(undefined)\n\n // highlight asynchronously — shiki is an optional peer, loaded lazily on first use; a missing\n // package or an unknown language just leaves the plain (unhighlighted) fallback in place\n useEffect(() => {\n let cancelled = false\n import('shiki')\n .then(({ codeToHtml }) =>\n codeToHtml(code, {\n lang: language,\n // always VS Code's dark theme — the block stays dark in both app modes\n theme: 'dark-plus',\n }),\n )\n .then((out) => {\n if (!cancelled) setHtml(out)\n })\n .catch(() => {\n if (!cancelled) setHtml(null)\n })\n return () => {\n cancelled = true\n }\n }, [code, language])\n\n useEffect(() => () => window.clearTimeout(copyTimer.current), [])\n\n const handleCopy = () => {\n navigator.clipboard\n ?.writeText(code)\n .then(() => {\n setCopied(true)\n window.clearTimeout(copyTimer.current)\n copyTimer.current = window.setTimeout(() => setCopied(false), COPIED_RESET_MS)\n })\n .catch(() => {})\n }\n\n const copyButton = copyable && (\n // the tooltip is hover/focus-driven; clicking flips `copied`, so its content updates to \"Copied!\"\n // while it's still open (the pointer is on the button). `left` keeps it inside the block's\n // `overflow: hidden` bounds.\n <Tooltip\n content={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n placement=\"left\"\n // always a white pill with dark text over the (always-dark) block — set via `style` so it beats\n // Tooltip's own color-derived --tz-btn-rgb (which is spread before the consumer `style`)\n style={{ '--tz-btn-rgb': '255, 255, 255', '--tz-btn-on': '#1e1e1e' } as CSSProperties}\n >\n <IconButton\n variant=\"text\"\n size=\"sm\"\n className={styles.copy}\n // force the button light over the dark surface — passed via `style` so it beats IconButton's\n // own inline `--tz-btn-rgb` (which is spread before the consumer `style`, so this wins)\n style={{ '--tz-btn-rgb': '255, 255, 255' } as CSSProperties}\n aria-label={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n onClick={handleCopy}\n >\n <Icon name={copied ? 'CopySuccess' : 'Copy'} />\n </IconButton>\n </Tooltip>\n )\n\n return (\n <div ref={ref} className={clsx(styles.root, className)} style={style} {...props}>\n {/* the header bar always renders whenever there's a title or a copy button — so the copy icon\n lives in the bar (top-right), never floating over the code */}\n {(title != null || copyButton) && (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {copyButton}\n </div>\n )}\n <div\n className={clsx(styles.code, wrap && styles.wrap, showLineNumbers && styles.lineNumbers)}\n style={maxHeight != null ? ({ maxHeight } as CSSProperties) : undefined}\n >\n {html != null ? (\n // shiki output is trusted markup — it escapes the source code itself\n <div className={styles.highlighted} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <pre className={styles.plain}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n </div>\n )\n})\n"],"names":["COPIED_RESET_MS","CodeBlock","forwardRef","code","language","title","copyable","showLineNumbers","maxHeight","wrap","className","style","props","ref","t","useT","html","setHtml","useState","copied","setCopied","copyTimer","useRef","useEffect","cancelled","codeToHtml","out","handleCopy","_a","copyButton","jsx","Tooltip","IconButton","styles","Icon","jsxs","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"CodeBlock-DD_d3-sM.js","sources":["../src/components/CodeBlock/CodeBlock.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Tooltip } from '../Tooltip'\nimport styles from './CodeBlock.module.css'\n\n// how long the copy button shows the \"copied\" tick before reverting\nconst COPIED_RESET_MS = 1600\n\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n /** The source code to render. */\n code: string\n /** Shiki language id (`'tsx'`, `'json'`, `'bash'`, `'css'`, …). Defaults to `'tsx'`. */\n language?: string\n /**\n * Optional label shown on the left of the header bar (e.g. a filename). The header bar itself always\n * renders (whenever `copyable`), so the copy button lives in it with or without a `title`.\n */\n title?: ReactNode\n /** Show a copy-to-clipboard button (in the header bar). Defaults to `true`. */\n copyable?: boolean\n /** Show line numbers. Defaults to `true`. */\n showLineNumbers?: boolean\n /** Cap the block height in px — taller code scrolls inside. */\n maxHeight?: number\n /** Soft-wrap long lines instead of scrolling horizontally. Defaults to `false`. */\n wrap?: boolean\n}\n\n/**\n * A syntax-highlighted code block with **VS Code colors** — powered by **Shiki** (an optional peer,\n * `npm i shiki`), the actual VS Code highlighting engine, using its **`dark-plus`** theme. The block\n * is **always dark** (in both app modes) — code reads best on a dark surface, and the deep background\n * anchors it regardless of the surrounding light/dark theme. Highlighting is **async and lazy**\n * (`import('shiki')` on first render); until it lands — or if `shiki` isn't installed / the language\n * is unknown — the block shows the plain code (on the same dark surface), so nothing breaks. A header\n * bar always renders (whenever `copyable`, default `true`) and holds the copy button — which flips to a\n * tick on click — with an optional `title` (e.g. a filename) on its left; `showLineNumbers` (default\n * `true`), `maxHeight` (scrolls inside) and `wrap` shape the body. The whole block\n * keeps VS Code's own dark colors (a deliberate literal-color exception, like the Modal scrim); only\n * the outer border/radius uses `--tz-*` tokens.\n */\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language = 'tsx',\n title,\n copyable = true,\n showLineNumbers = true,\n maxHeight,\n wrap = false,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const [html, setHtml] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n const copyTimer = useRef<number | undefined>(undefined)\n\n // highlight asynchronously — shiki is an optional peer, loaded lazily on first use; a missing\n // package or an unknown language just leaves the plain (unhighlighted) fallback in place\n useEffect(() => {\n let cancelled = false\n import('shiki')\n .then(({ codeToHtml }) =>\n codeToHtml(code, {\n lang: language,\n // always VS Code's dark theme — the block stays dark in both app modes\n theme: 'dark-plus',\n }),\n )\n .then((out) => {\n if (!cancelled) setHtml(out)\n })\n .catch(() => {\n if (!cancelled) setHtml(null)\n })\n return () => {\n cancelled = true\n }\n }, [code, language])\n\n useEffect(() => () => window.clearTimeout(copyTimer.current), [])\n\n const handleCopy = () => {\n navigator.clipboard\n ?.writeText(code)\n .then(() => {\n setCopied(true)\n window.clearTimeout(copyTimer.current)\n copyTimer.current = window.setTimeout(() => setCopied(false), COPIED_RESET_MS)\n })\n .catch(() => {})\n }\n\n const copyButton = copyable && (\n // the tooltip is hover/focus-driven; clicking flips `copied`, so its content updates to \"Copied!\"\n // while it's still open (the pointer is on the button). `left` keeps it inside the block's\n // `overflow: hidden` bounds.\n <Tooltip\n content={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n placement=\"left\"\n // always a white pill with dark text over the (always-dark) block — set via `style` so it beats\n // Tooltip's own color-derived --tz-btn-rgb (which is spread before the consumer `style`)\n style={{ '--tz-btn-rgb': '255, 255, 255', '--tz-btn-on': '#1e1e1e' } as CSSProperties}\n >\n <IconButton\n variant=\"text\"\n size=\"sm\"\n className={styles.copy}\n // force the button light over the dark surface — passed via `style` so it beats IconButton's\n // own inline `--tz-btn-rgb` (which is spread before the consumer `style`, so this wins)\n style={{ '--tz-btn-rgb': '255, 255, 255' } as CSSProperties}\n aria-label={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n onClick={handleCopy}\n >\n <Icon name={copied ? 'CopySuccess' : 'Copy'} />\n </IconButton>\n </Tooltip>\n )\n\n return (\n <div ref={ref} className={clsx(styles.root, className)} style={style} {...props}>\n {/* the header bar always renders whenever there's a title or a copy button — so the copy icon\n lives in the bar (top-right), never floating over the code */}\n {(title != null || copyButton) && (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {copyButton}\n </div>\n )}\n <div\n className={clsx(styles.code, wrap && styles.wrap, showLineNumbers && styles.lineNumbers)}\n style={maxHeight != null ? ({ maxHeight } as CSSProperties) : undefined}\n >\n {html != null ? (\n // shiki output is trusted markup — it escapes the source code itself\n <div className={styles.highlighted} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <pre className={styles.plain}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n </div>\n )\n})\n"],"names":["COPIED_RESET_MS","CodeBlock","forwardRef","code","language","title","copyable","showLineNumbers","maxHeight","wrap","className","style","props","ref","t","useT","html","setHtml","useState","copied","setCopied","copyTimer","useRef","useEffect","cancelled","codeToHtml","out","handleCopy","_a","copyButton","jsx","Tooltip","IconButton","styles","Icon","jsxs","clsx"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("react/jsx-runtime"),t=require("react"),p=require("clsx"),X=require("./formContext-bTWrqdEV.cjs"),Y=require("./FloatingPanel-U6sGYiSK.cjs"),I=require("./Typography-BFatE1_A.cjs"),e=require("./ColorPickerPanel-Dk6bI0Xy.cjs"),Z=require("./ConfigProvider-CUG8Mfy2.cjs"),ee=232,se=t.forwardRef(function({label:y,size:w="md",error:S,helperText:V,required:E=!1,fullWidth:O=!0,disabled:C=!1,value:P,defaultValue:H,onChange:f,swatches:W,name:o,placeholder:g,id:D,className:L,style:U},a){const _=Z.useT(),$=t.useId(),x=D??$,j=`${x}-helper`,c=X.useFormContext(),k=!!(c&&o),l=c&&o?c.field(o):void 0,T=P!==void 0?P:k?c.values[o]??"":void 0,q=T!==void 0,[z,A]=t.useState(H??""),R=q?T:z,i=e.parseColor(R||""),u=i?e.formatColor(i):null,G=u?u[0]==="#"?u.toUpperCase():u:null,v=S??(l==null?void 0:l.error)??!1,h=V??(l==null?void 0:l.helperText),J=s=>{q||A(s),k&&c.setValue(o,s),f==null||f(s)},d=t.useRef(null),N=t.useRef(null),[m,b]=t.useState(!1),K=t.useCallback(s=>{d.current=s,typeof a=="function"?a(s):a&&(a.current=s)},[a]),M=t.useCallback(s=>{var n;b(!1),s&&((n=d.current)==null||n.focus())},[]),Q=s=>{var B,F;const n=s.relatedTarget;n&&((B=N.current)!=null&&B.contains(n)||(F=d.current)!=null&&F.contains(n))||l==null||l.onBlur(s)};return r.jsxs("div",{className:p.clsx(e.styles.field,e.styles[w],O&&e.styles.fullWidth,v&&e.styles.error,C&&e.styles.disabled,L),style:U,children:[y!=null&&r.jsxs("label",{htmlFor:x,className:e.styles.label,children:[r.jsx(I.Typography,{as:"span",variant:"bodySmall",color:"muted",children:y}),E&&r.jsx("span",{className:e.styles.required,"aria-hidden":"true",children:"*"})]}),r.jsxs("button",{ref:K,id:x,name:o,type:"button",className:p.clsx(e.styles.control,m&&e.styles.open),disabled:C,"aria-haspopup":"dialog","aria-expanded":m,"aria-invalid":v||void 0,"aria-describedby":h!=null?j:void 0,"aria-label":y||i||g?void 0:_("colorPicker.pick"),onClick:()=>b(s=>!s),onBlur:Q,children:[r.jsx("span",{className:p.clsx(e.styles.value,!i&&e.styles.placeholder),children:G??g}),r.jsx("span",{className:p.clsx(e.styles.preview,!i&&e.styles.previewEmpty),style:i?{"--cp-fill":u}:void 0,"aria-hidden":"true"})]}),r.jsx(Y.FloatingPanel,{ref:N,open:m,triggerRef:d,onClose:M,role:"dialog",ariaLabel:"Color picker",width:ee,children:r.jsx(e.ColorPickerPanel,{value:R,onChange:J,swatches:W})}),h!=null&&r.jsx(I.Typography,{as:"span",id:j,variant:"bodySmall",color:v?"error":"muted",className:e.styles.helper,children:h})]})});exports.ColorPicker=se;
2
- //# sourceMappingURL=ColorPicker-ClVpWf77.cjs.map
1
+ "use strict";const r=require("react/jsx-runtime"),t=require("react"),p=require("clsx"),X=require("./formContext-bTWrqdEV.cjs"),Y=require("./FloatingPanel-U6sGYiSK.cjs"),I=require("./Typography-BFatE1_A.cjs"),e=require("./ColorPickerPanel--wBX-m7J.cjs"),Z=require("./ConfigProvider-Bszl3Wr3.cjs"),ee=232,se=t.forwardRef(function({label:y,size:w="md",error:S,helperText:V,required:E=!1,fullWidth:O=!0,disabled:C=!1,value:P,defaultValue:H,onChange:f,swatches:W,name:o,placeholder:g,id:D,className:L,style:U},a){const _=Z.useT(),$=t.useId(),x=D??$,j=`${x}-helper`,c=X.useFormContext(),k=!!(c&&o),l=c&&o?c.field(o):void 0,T=P!==void 0?P:k?c.values[o]??"":void 0,q=T!==void 0,[z,A]=t.useState(H??""),R=q?T:z,i=e.parseColor(R||""),u=i?e.formatColor(i):null,G=u?u[0]==="#"?u.toUpperCase():u:null,v=S??(l==null?void 0:l.error)??!1,h=V??(l==null?void 0:l.helperText),J=s=>{q||A(s),k&&c.setValue(o,s),f==null||f(s)},d=t.useRef(null),N=t.useRef(null),[m,b]=t.useState(!1),K=t.useCallback(s=>{d.current=s,typeof a=="function"?a(s):a&&(a.current=s)},[a]),M=t.useCallback(s=>{var n;b(!1),s&&((n=d.current)==null||n.focus())},[]),Q=s=>{var B,F;const n=s.relatedTarget;n&&((B=N.current)!=null&&B.contains(n)||(F=d.current)!=null&&F.contains(n))||l==null||l.onBlur(s)};return r.jsxs("div",{className:p.clsx(e.styles.field,e.styles[w],O&&e.styles.fullWidth,v&&e.styles.error,C&&e.styles.disabled,L),style:U,children:[y!=null&&r.jsxs("label",{htmlFor:x,className:e.styles.label,children:[r.jsx(I.Typography,{as:"span",variant:"bodySmall",color:"muted",children:y}),E&&r.jsx("span",{className:e.styles.required,"aria-hidden":"true",children:"*"})]}),r.jsxs("button",{ref:K,id:x,name:o,type:"button",className:p.clsx(e.styles.control,m&&e.styles.open),disabled:C,"aria-haspopup":"dialog","aria-expanded":m,"aria-invalid":v||void 0,"aria-describedby":h!=null?j:void 0,"aria-label":y||i||g?void 0:_("colorPicker.pick"),onClick:()=>b(s=>!s),onBlur:Q,children:[r.jsx("span",{className:p.clsx(e.styles.value,!i&&e.styles.placeholder),children:G??g}),r.jsx("span",{className:p.clsx(e.styles.preview,!i&&e.styles.previewEmpty),style:i?{"--cp-fill":u}:void 0,"aria-hidden":"true"})]}),r.jsx(Y.FloatingPanel,{ref:N,open:m,triggerRef:d,onClose:M,role:"dialog",ariaLabel:"Color picker",width:ee,children:r.jsx(e.ColorPickerPanel,{value:R,onChange:J,swatches:W})}),h!=null&&r.jsx(I.Typography,{as:"span",id:j,variant:"bodySmall",color:v?"error":"muted",className:e.styles.helper,children:h})]})});exports.ColorPicker=se;
2
+ //# sourceMappingURL=ColorPicker-DtzFwNWk.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorPicker-ClVpWf77.cjs","sources":["../src/components/ColorPicker/ColorPicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Typography } from '../Typography'\nimport { ColorPickerPanel } from './ColorPickerPanel'\nimport { formatColor, parseColor } from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\nexport type ColorPickerSize = 'sm' | 'md' | 'lg'\n\n/** Popover width (px). */\nconst POPOVER_WIDTH = 232\n\nexport interface ColorPickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, swatch and font. */\n size?: ColorPickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a CSS color string: `#rrggbb` hex, or `rgba(r, g, b, a)` when translucent. */\n value?: string\n /** Initial value for uncontrolled use (hex or `rgb()`/`rgba()`). */\n defaultValue?: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when not (or `''` when cleared). */\n onChange?: (color: string) => void\n /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */\n swatches?: string[]\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */\n name?: string\n /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */\n placeholder?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A color field with a beautiful popover picker: a saturation/value square, a hue slider, an alpha\n * (opacity) slider, a color input, quick-pick swatches and a clear button. The input accepts hex\n * (`#rgb`/`#rrggbb`/`#rrggbbaa`) or `rgb()`/`rgba()`, and the value comes back as `#rrggbb` when\n * fully opaque or `rgba(r, g, b, a)` when translucent. Clicking the trigger opens the popover, which\n * — like `Dropdown` — is portaled to `<body>`, opens below (flips above only when it would\n * overflow), locks page scroll and re-positions on scroll/resize. Controlled (`value` + `onChange`)\n * or uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name` (its form value is\n * the color string; validate with e.g. `z.string().regex(/^#[0-9a-f]{6}$/i, 'Pick a color')`, or a\n * looser pattern if you allow `rgba()`). Styling uses `--tz-*` tokens (the spectrum gradients and\n * the alpha checkerboard are the unavoidable exceptions).\n */\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n swatches,\n name,\n placeholder,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is the hex string.\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue: string | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentColor = isControlled ? externalValue! : internal\n const parsed = parseColor(currentColor || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n // hex shows uppercase in the trigger; rgba() stays as-is\n const displayText = displayValue\n ? displayValue[0] === '#'\n ? displayValue.toUpperCase()\n : displayValue\n : null\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (color: string) => {\n if (!isControlled) setInternal(color)\n if (isFormBound) form!.setValue(name!, color)\n onChange?.(color)\n }\n\n // ── popover (positioning / scroll-lock / dismiss come from FloatingPanel) ──────────────────────\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLButtonElement | null }).current = node\n },\n [ref],\n )\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // mark the form field touched when focus leaves the whole widget — but not when it moves into the\n // (portaled) popover or stays on the trigger, so a form-bound picker shows its error like every\n // other popover field (Select/DatePicker) instead of only after submit\n const handleTriggerBlur = (event: FocusEvent<HTMLButtonElement>) => {\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <button\n ref={setTriggerRef}\n id={id}\n name={name}\n type=\"button\"\n className={clsx(styles.control, open && styles.open)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n aria-label={label || parsed || placeholder ? undefined : t('colorPicker.pick')}\n onClick={() => setOpen((o) => !o)}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !parsed && styles.placeholder)}>\n {displayText ?? placeholder}\n </span>\n <span\n className={clsx(styles.preview, !parsed && styles.previewEmpty)}\n style={parsed ? ({ '--cp-fill': displayValue } as CSSProperties) : undefined}\n aria-hidden=\"true\"\n />\n </button>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Color picker\"\n width={POPOVER_WIDTH}\n >\n <ColorPickerPanel value={currentColor} onChange={commit} swatches={swatches} />\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["POPOVER_WIDTH","ColorPicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","swatches","name","placeholder","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentColor","parsed","parseColor","displayValue","formatColor","displayText","resolvedError","resolvedHelperText","commit","color","triggerRef","useRef","popoverRef","open","setOpen","setTriggerRef","useCallback","node","closePopover","refocus","_a","handleTriggerBlur","event","next","_b","jsxs","clsx","styles","jsx","Typography","o","FloatingPanel","ColorPickerPanel"],"mappings":"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"}
1
+ {"version":3,"file":"ColorPicker-DtzFwNWk.cjs","sources":["../src/components/ColorPicker/ColorPicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Typography } from '../Typography'\nimport { ColorPickerPanel } from './ColorPickerPanel'\nimport { formatColor, parseColor } from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\nexport type ColorPickerSize = 'sm' | 'md' | 'lg'\n\n/** Popover width (px). */\nconst POPOVER_WIDTH = 232\n\nexport interface ColorPickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, swatch and font. */\n size?: ColorPickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a CSS color string: `#rrggbb` hex, or `rgba(r, g, b, a)` when translucent. */\n value?: string\n /** Initial value for uncontrolled use (hex or `rgb()`/`rgba()`). */\n defaultValue?: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when not (or `''` when cleared). */\n onChange?: (color: string) => void\n /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */\n swatches?: string[]\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */\n name?: string\n /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */\n placeholder?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A color field with a beautiful popover picker: a saturation/value square, a hue slider, an alpha\n * (opacity) slider, a color input, quick-pick swatches and a clear button. The input accepts hex\n * (`#rgb`/`#rrggbb`/`#rrggbbaa`) or `rgb()`/`rgba()`, and the value comes back as `#rrggbb` when\n * fully opaque or `rgba(r, g, b, a)` when translucent. Clicking the trigger opens the popover, which\n * — like `Dropdown` — is portaled to `<body>`, opens below (flips above only when it would\n * overflow), locks page scroll and re-positions on scroll/resize. Controlled (`value` + `onChange`)\n * or uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name` (its form value is\n * the color string; validate with e.g. `z.string().regex(/^#[0-9a-f]{6}$/i, 'Pick a color')`, or a\n * looser pattern if you allow `rgba()`). Styling uses `--tz-*` tokens (the spectrum gradients and\n * the alpha checkerboard are the unavoidable exceptions).\n */\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n swatches,\n name,\n placeholder,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is the hex string.\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue: string | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentColor = isControlled ? externalValue! : internal\n const parsed = parseColor(currentColor || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n // hex shows uppercase in the trigger; rgba() stays as-is\n const displayText = displayValue\n ? displayValue[0] === '#'\n ? displayValue.toUpperCase()\n : displayValue\n : null\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (color: string) => {\n if (!isControlled) setInternal(color)\n if (isFormBound) form!.setValue(name!, color)\n onChange?.(color)\n }\n\n // ── popover (positioning / scroll-lock / dismiss come from FloatingPanel) ──────────────────────\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLButtonElement | null }).current = node\n },\n [ref],\n )\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // mark the form field touched when focus leaves the whole widget — but not when it moves into the\n // (portaled) popover or stays on the trigger, so a form-bound picker shows its error like every\n // other popover field (Select/DatePicker) instead of only after submit\n const handleTriggerBlur = (event: FocusEvent<HTMLButtonElement>) => {\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <button\n ref={setTriggerRef}\n id={id}\n name={name}\n type=\"button\"\n className={clsx(styles.control, open && styles.open)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n aria-label={label || parsed || placeholder ? undefined : t('colorPicker.pick')}\n onClick={() => setOpen((o) => !o)}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !parsed && styles.placeholder)}>\n {displayText ?? placeholder}\n </span>\n <span\n className={clsx(styles.preview, !parsed && styles.previewEmpty)}\n style={parsed ? ({ '--cp-fill': displayValue } as CSSProperties) : undefined}\n aria-hidden=\"true\"\n />\n </button>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Color picker\"\n width={POPOVER_WIDTH}\n >\n <ColorPickerPanel value={currentColor} onChange={commit} swatches={swatches} />\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["POPOVER_WIDTH","ColorPicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","swatches","name","placeholder","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentColor","parsed","parseColor","displayValue","formatColor","displayText","resolvedError","resolvedHelperText","commit","color","triggerRef","useRef","popoverRef","open","setOpen","setTriggerRef","useCallback","node","closePopover","refocus","_a","handleTriggerBlur","event","next","_b","jsxs","clsx","styles","jsx","Typography","o","FloatingPanel","ColorPickerPanel"],"mappings":"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"}
@@ -4,8 +4,8 @@ import { clsx as p } from "clsx";
4
4
  import { u as or } from "./formContext-B7ln1Miy.js";
5
5
  import { F as lr } from "./FloatingPanel-BG9Uag__.js";
6
6
  import { T as S } from "./Typography-Cta6Rg4L.js";
7
- import { p as sr, f as tr, s as e, C as ar } from "./ColorPickerPanel-BGzm2had.js";
8
- import { a as ir } from "./ConfigProvider-Blhvj6UQ.js";
7
+ import { p as sr, f as tr, s as e, C as ar } from "./ColorPickerPanel-Dp7bnnVf.js";
8
+ import { a as ir } from "./ConfigProvider-DR9YMy9U.js";
9
9
  const nr = 232, Cr = rr(function({
10
10
  label: u,
11
11
  size: j = "md",
@@ -116,4 +116,4 @@ const nr = 232, Cr = rr(function({
116
116
  export {
117
117
  Cr as C
118
118
  };
119
- //# sourceMappingURL=ColorPicker-DAjs7PmR.js.map
119
+ //# sourceMappingURL=ColorPicker-Dw6Qk0iy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorPicker-DAjs7PmR.js","sources":["../src/components/ColorPicker/ColorPicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Typography } from '../Typography'\nimport { ColorPickerPanel } from './ColorPickerPanel'\nimport { formatColor, parseColor } from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\nexport type ColorPickerSize = 'sm' | 'md' | 'lg'\n\n/** Popover width (px). */\nconst POPOVER_WIDTH = 232\n\nexport interface ColorPickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, swatch and font. */\n size?: ColorPickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a CSS color string: `#rrggbb` hex, or `rgba(r, g, b, a)` when translucent. */\n value?: string\n /** Initial value for uncontrolled use (hex or `rgb()`/`rgba()`). */\n defaultValue?: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when not (or `''` when cleared). */\n onChange?: (color: string) => void\n /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */\n swatches?: string[]\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */\n name?: string\n /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */\n placeholder?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A color field with a beautiful popover picker: a saturation/value square, a hue slider, an alpha\n * (opacity) slider, a color input, quick-pick swatches and a clear button. The input accepts hex\n * (`#rgb`/`#rrggbb`/`#rrggbbaa`) or `rgb()`/`rgba()`, and the value comes back as `#rrggbb` when\n * fully opaque or `rgba(r, g, b, a)` when translucent. Clicking the trigger opens the popover, which\n * — like `Dropdown` — is portaled to `<body>`, opens below (flips above only when it would\n * overflow), locks page scroll and re-positions on scroll/resize. Controlled (`value` + `onChange`)\n * or uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name` (its form value is\n * the color string; validate with e.g. `z.string().regex(/^#[0-9a-f]{6}$/i, 'Pick a color')`, or a\n * looser pattern if you allow `rgba()`). Styling uses `--tz-*` tokens (the spectrum gradients and\n * the alpha checkerboard are the unavoidable exceptions).\n */\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n swatches,\n name,\n placeholder,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is the hex string.\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue: string | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentColor = isControlled ? externalValue! : internal\n const parsed = parseColor(currentColor || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n // hex shows uppercase in the trigger; rgba() stays as-is\n const displayText = displayValue\n ? displayValue[0] === '#'\n ? displayValue.toUpperCase()\n : displayValue\n : null\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (color: string) => {\n if (!isControlled) setInternal(color)\n if (isFormBound) form!.setValue(name!, color)\n onChange?.(color)\n }\n\n // ── popover (positioning / scroll-lock / dismiss come from FloatingPanel) ──────────────────────\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLButtonElement | null }).current = node\n },\n [ref],\n )\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // mark the form field touched when focus leaves the whole widget — but not when it moves into the\n // (portaled) popover or stays on the trigger, so a form-bound picker shows its error like every\n // other popover field (Select/DatePicker) instead of only after submit\n const handleTriggerBlur = (event: FocusEvent<HTMLButtonElement>) => {\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <button\n ref={setTriggerRef}\n id={id}\n name={name}\n type=\"button\"\n className={clsx(styles.control, open && styles.open)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n aria-label={label || parsed || placeholder ? undefined : t('colorPicker.pick')}\n onClick={() => setOpen((o) => !o)}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !parsed && styles.placeholder)}>\n {displayText ?? placeholder}\n </span>\n <span\n className={clsx(styles.preview, !parsed && styles.previewEmpty)}\n style={parsed ? ({ '--cp-fill': displayValue } as CSSProperties) : undefined}\n aria-hidden=\"true\"\n />\n </button>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Color picker\"\n width={POPOVER_WIDTH}\n >\n <ColorPickerPanel value={currentColor} onChange={commit} swatches={swatches} />\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["POPOVER_WIDTH","ColorPicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","swatches","name","placeholder","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentColor","parsed","parseColor","displayValue","formatColor","displayText","resolvedError","resolvedHelperText","commit","color","triggerRef","useRef","popoverRef","open","setOpen","setTriggerRef","useCallback","node","closePopover","refocus","_a","handleTriggerBlur","event","next","_b","jsxs","clsx","styles","jsx","Typography","o","FloatingPanel","ColorPickerPanel"],"mappings":"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"}
1
+ {"version":3,"file":"ColorPicker-Dw6Qk0iy.js","sources":["../src/components/ColorPicker/ColorPicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Typography } from '../Typography'\nimport { ColorPickerPanel } from './ColorPickerPanel'\nimport { formatColor, parseColor } from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\nexport type ColorPickerSize = 'sm' | 'md' | 'lg'\n\n/** Popover width (px). */\nconst POPOVER_WIDTH = 232\n\nexport interface ColorPickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, swatch and font. */\n size?: ColorPickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a CSS color string: `#rrggbb` hex, or `rgba(r, g, b, a)` when translucent. */\n value?: string\n /** Initial value for uncontrolled use (hex or `rgb()`/`rgba()`). */\n defaultValue?: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when not (or `''` when cleared). */\n onChange?: (color: string) => void\n /** Quick-pick swatches shown in the popover. Defaults to a curated palette. */\n swatches?: string[]\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the hex string). */\n name?: string\n /** Placeholder shown in the trigger when no color is set. Omit to show nothing. */\n placeholder?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A color field with a beautiful popover picker: a saturation/value square, a hue slider, an alpha\n * (opacity) slider, a color input, quick-pick swatches and a clear button. The input accepts hex\n * (`#rgb`/`#rrggbb`/`#rrggbbaa`) or `rgb()`/`rgba()`, and the value comes back as `#rrggbb` when\n * fully opaque or `rgba(r, g, b, a)` when translucent. Clicking the trigger opens the popover, which\n * — like `Dropdown` — is portaled to `<body>`, opens below (flips above only when it would\n * overflow), locks page scroll and re-positions on scroll/resize. Controlled (`value` + `onChange`)\n * or uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name` (its form value is\n * the color string; validate with e.g. `z.string().regex(/^#[0-9a-f]{6}$/i, 'Pick a color')`, or a\n * looser pattern if you allow `rgba()`). Styling uses `--tz-*` tokens (the spectrum gradients and\n * the alpha checkerboard are the unavoidable exceptions).\n */\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n swatches,\n name,\n placeholder,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is the hex string.\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue: string | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentColor = isControlled ? externalValue! : internal\n const parsed = parseColor(currentColor || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n // hex shows uppercase in the trigger; rgba() stays as-is\n const displayText = displayValue\n ? displayValue[0] === '#'\n ? displayValue.toUpperCase()\n : displayValue\n : null\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (color: string) => {\n if (!isControlled) setInternal(color)\n if (isFormBound) form!.setValue(name!, color)\n onChange?.(color)\n }\n\n // ── popover (positioning / scroll-lock / dismiss come from FloatingPanel) ──────────────────────\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLButtonElement | null }).current = node\n },\n [ref],\n )\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // mark the form field touched when focus leaves the whole widget — but not when it moves into the\n // (portaled) popover or stays on the trigger, so a form-bound picker shows its error like every\n // other popover field (Select/DatePicker) instead of only after submit\n const handleTriggerBlur = (event: FocusEvent<HTMLButtonElement>) => {\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <button\n ref={setTriggerRef}\n id={id}\n name={name}\n type=\"button\"\n className={clsx(styles.control, open && styles.open)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n aria-label={label || parsed || placeholder ? undefined : t('colorPicker.pick')}\n onClick={() => setOpen((o) => !o)}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !parsed && styles.placeholder)}>\n {displayText ?? placeholder}\n </span>\n <span\n className={clsx(styles.preview, !parsed && styles.previewEmpty)}\n style={parsed ? ({ '--cp-fill': displayValue } as CSSProperties) : undefined}\n aria-hidden=\"true\"\n />\n </button>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Color picker\"\n width={POPOVER_WIDTH}\n >\n <ColorPickerPanel value={currentColor} onChange={commit} swatches={swatches} />\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["POPOVER_WIDTH","ColorPicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","swatches","name","placeholder","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentColor","parsed","parseColor","displayValue","formatColor","displayText","resolvedError","resolvedHelperText","commit","color","triggerRef","useRef","popoverRef","open","setOpen","setTriggerRef","useCallback","node","closePopover","refocus","_a","handleTriggerBlur","event","next","_b","jsxs","clsx","styles","jsx","Typography","o","FloatingPanel","ColorPickerPanel"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const _=require("react/jsx-runtime"),g=require("react"),Z=require("clsx"),P=require("./Icon-BVULqOJD.cjs"),ee=require("./ConfigProvider-CUG8Mfy2.cjs"),d=n=>Math.min(1,Math.max(0,n)),A=n=>Math.min(255,Math.max(0,Math.round(n)));function te(n){let s=n.trim().replace(/^#/,"");return/^[0-9a-fA-F]{3}$/.test(s)&&(s=s.split("").map(a=>a+a).join("")),/^[0-9a-fA-F]{6}$/.test(s)?`#${s.toLowerCase()}`:null}function H(n){const s=(te(n)??"#000000").slice(1);return{r:parseInt(s.slice(0,2),16),g:parseInt(s.slice(2,4),16),b:parseInt(s.slice(4,6),16)}}function N({r:n,g:s,b:a}){const e=c=>Math.round(d(c/255)*255).toString(16).padStart(2,"0");return`#${e(n)}${e(s)}${e(a)}`}function T({r:n,g:s,b:a}){const e=n/255,c=s/255,i=a/255,u=Math.max(e,c,i),l=Math.min(e,c,i),h=u-l;let p=0;h!==0&&(u===e?p=(c-i)/h%6:u===c?p=(i-e)/h+2:p=(e-c)/h+4,p*=60,p<0&&(p+=360));const v=u===0?0:h/u;return{h:p,s:v,v:u}}function y({h:n,s,v:a}){const e=a*s,c=e*(1-Math.abs(n/60%2-1)),i=a-e;let u=0,l=0,h=0;return n<60?[u,l,h]=[e,c,0]:n<120?[u,l,h]=[c,e,0]:n<180?[u,l,h]=[0,e,c]:n<240?[u,l,h]=[0,c,e]:n<300?[u,l,h]=[c,0,e]:[u,l,h]=[e,0,c],{r:(u+i)*255,g:(l+i)*255,b:(h+i)*255}}const re=n=>T(H(n));function se(n){const{r:s,g:a,b:e}=H(n);return(s*299+a*587+e*114)/1e3>=150?"#04202b":"#ffffff"}const ne=/^rgba?\(\s*([\d.]+)\s*[, ]\s*([\d.]+)\s*[, ]\s*([\d.]+)\s*(?:[,/]\s*([\d.]+%?)\s*)?\)$/i;function M(n){const s=n.trim();if(!s)return null;let a=s.replace(/^#/,"");if(/^[0-9a-fA-F]{3,4}$/.test(a)&&(a=a.split("").map(c=>c+c).join("")),/^[0-9a-fA-F]{6}$/.test(a))return{r:parseInt(a.slice(0,2),16),g:parseInt(a.slice(2,4),16),b:parseInt(a.slice(4,6),16),a:1};if(/^[0-9a-fA-F]{8}$/.test(a))return{r:parseInt(a.slice(0,2),16),g:parseInt(a.slice(2,4),16),b:parseInt(a.slice(4,6),16),a:d(parseInt(a.slice(6,8),16)/255)};const e=s.match(ne);if(e){let c=1;return e[4]!=null&&(c=e[4].endsWith("%")?d(parseFloat(e[4])/100):d(parseFloat(e[4]))),{r:A(+e[1]),g:A(+e[2]),b:A(+e[3]),a:c}}return null}function b({r:n,g:s,b:a,a:e}){return e>=1?N({r:n,g:s,b:a}):`rgba(${A(n)}, ${A(s)}, ${A(a)}, ${Math.round(d(e)*100)/100})`}const ae="_field_5rt4i_1",oe="_fullWidth_5rt4i_6",ce="_label_5rt4i_11",le="_required_5rt4i_17",ie="_control_5rt4i_23",ue="_open_5rt4i_44",he="_error_5rt4i_49",pe="_disabled_5rt4i_57",_e="_value_5rt4i_64",fe="_placeholder_5rt4i_73",de="_preview_5rt4i_81",me="_previewEmpty_5rt4i_101",be="_helper_5rt4i_113",we="_popover_5rt4i_118",ve="_sv_5rt4i_128",xe="_svThumb_5rt4i_139",ge="_hue_5rt4i_150",ke="_hueThumb_5rt4i_168",ye="_alphaThumb_5rt4i_169",Ae="_alpha_5rt4i_169",Te="_hexRow_5rt4i_202",Ce="_currentSwatch_5rt4i_207",$e="_hexField_5rt4i_223",Ie="_hexInput_5rt4i_235",De="_swatches_5rt4i_247",Me="_swatch_5rt4i_247",je="_swatchClear_5rt4i_264",Se="_sm_5rt4i_278",Re="_md_5rt4i_282",Ee="_lg_5rt4i_286",f={field:ae,fullWidth:oe,label:ce,required:le,control:ie,open:ue,error:he,disabled:pe,value:_e,placeholder:fe,preview:de,previewEmpty:me,helper:be,popover:we,sv:ve,svThumb:xe,hue:ge,hueThumb:ke,alphaThumb:ye,alpha:Ae,hexRow:Te,currentSwatch:Ce,hexField:$e,hexInput:Ie,swatches:De,swatch:Me,swatchClear:je,sm:Se,md:Re,lg:Ee},L=["#13404e","#039aa1","#00a854","#0ea5e9","#6366f1","#7c3aed","#f04134","#f59e0b","#ffbf00","#10b981","#64748b","#0f172a","#ffffff"],F=re("#13404e");function Pe({value:n,onChange:s,swatches:a=L,clearable:e=!0}){const c=ee.useT(),i=M(n||""),u=i?b(i):null,[l,h]=g.useState(i?T(i):F),p=g.useRef(l);p.current=l;const[v,C]=g.useState((i==null?void 0:i.a)??1),x=g.useRef(v);x.current=v,g.useEffect(()=>{if(!i)return;const r=b({...y(p.current),a:x.current});u!==r&&(h(T(i)),C(i.a))},[u]);const $=r=>{h(r),s(b({...y(r),a:x.current}))},R=r=>{C(r),s(b({...y(p.current),a:r}))},j=r=>t=>{t.preventDefault();const o=t.currentTarget,m=(D,Q)=>r(D,Q,o.getBoundingClientRect());m(t.clientX,t.clientY);const w=D=>m(D.clientX,D.clientY),k=()=>{window.removeEventListener("pointermove",w),window.removeEventListener("pointerup",k)};window.addEventListener("pointermove",w),window.addEventListener("pointerup",k)},q=j((r,t,o)=>{const m=d((r-o.left)/o.width),w=d(1-(t-o.top)/o.height);$({...p.current,s:m,v:w})}),K=j((r,t,o)=>{const m=d((r-o.left)/o.width)*360;$({...p.current,h:m})}),U=j((r,t,o)=>{R(d((r-o.left)/o.width))}),I=.01,W=r=>{const{h:t,s:o,v:m}=p.current;let w=o,k=m;switch(r.key){case"ArrowLeft":w=d(o-I);break;case"ArrowRight":w=d(o+I);break;case"ArrowUp":k=d(m+I);break;case"ArrowDown":k=d(m-I);break;default:return}r.preventDefault(),$({h:t,s:w,v:k})},z=r=>{const{h:t}=p.current;let o=t;switch(r.key){case"ArrowLeft":case"ArrowDown":o=Math.max(0,t-1);break;case"ArrowRight":case"ArrowUp":o=Math.min(360,t+1);break;case"Home":o=0;break;case"End":o=360;break;default:return}r.preventDefault(),$({...p.current,h:o})},B=r=>{let t=x.current;switch(r.key){case"ArrowLeft":case"ArrowDown":t=d(x.current-.01);break;case"ArrowRight":case"ArrowUp":t=d(x.current+.01);break;case"Home":t=0;break;case"End":t=1;break;default:return}r.preventDefault(),R(t)},[V,E]=g.useState("");g.useEffect(()=>{E(u??"")},[u]);const X=r=>{E(r);const t=M(r);t&&(h(T(t)),C(t.a),s(b(t)))},Y=()=>{s(""),h(F),C(1)},G=b({...y(l),a:v}),O=N(y(l)),S=y(l),J=`${Math.round(S.r)}, ${Math.round(S.g)}, ${Math.round(S.b)}`;return _.jsxs("div",{className:f.popover,style:{"--cp-hue":l.h},children:[_.jsx("div",{className:f.sv,onPointerDown:q,onKeyDown:W,role:"slider",tabIndex:0,"aria-label":c("colorPicker.saturation"),"aria-valuetext":`${Math.round(l.s*100)}% saturation, ${Math.round(l.v*100)}% brightness`,children:_.jsx("span",{className:f.svThumb,style:{left:`${l.s*100}%`,top:`${(1-l.v)*100}%`,background:O}})}),_.jsx("div",{className:f.hue,onPointerDown:K,onKeyDown:z,role:"slider",tabIndex:0,"aria-label":c("colorPicker.hue"),"aria-valuemin":0,"aria-valuemax":360,"aria-valuenow":Math.round(l.h),children:_.jsx("span",{className:f.hueThumb,style:{left:`${l.h/360*100}%`}})}),_.jsx("div",{className:f.alpha,onPointerDown:U,onKeyDown:B,role:"slider",tabIndex:0,"aria-label":c("colorPicker.opacity"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(v*100),style:{"--cp-rgb":J},children:_.jsx("span",{className:f.alphaThumb,style:{left:`${v*100}%`}})}),_.jsxs("div",{className:f.hexRow,children:[_.jsx("span",{className:f.currentSwatch,style:{"--cp-fill":G}}),_.jsx("span",{className:f.hexField,children:_.jsx("input",{className:f.hexInput,value:V,spellCheck:!1,maxLength:28,"aria-label":c("colorPicker.value"),onChange:r=>X(r.target.value)})})]}),_.jsxs("div",{className:f.swatches,children:[e&&_.jsx("button",{type:"button",className:Z.clsx(f.swatch,f.swatchClear),"aria-label":c("colorPicker.noColor"),"aria-pressed":!i,onClick:Y,children:!i&&_.jsx(P.Icon,{name:"TickCircle",size:"sm"})}),a.map(r=>{const t=M(r);if(!t)return null;const o=b({r:t.r,g:t.g,b:t.b,a:1}),m=u===o;return _.jsx("button",{type:"button",className:f.swatch,style:{background:o,color:se(o)},"aria-label":o,"aria-pressed":m,onClick:()=>{h(T(t)),s(b({r:t.r,g:t.g,b:t.b,a:x.current}))},children:m&&_.jsx(P.Icon,{name:"TickCircle",size:"sm"})},r)})]})]})}exports.ColorPickerPanel=Pe;exports.DEFAULT_SWATCHES=L;exports.formatColor=b;exports.parseColor=M;exports.styles=f;
2
- //# sourceMappingURL=ColorPickerPanel-Dk6bI0Xy.cjs.map
1
+ "use strict";const _=require("react/jsx-runtime"),g=require("react"),Z=require("clsx"),P=require("./Icon-BVULqOJD.cjs"),ee=require("./ConfigProvider-Bszl3Wr3.cjs"),d=n=>Math.min(1,Math.max(0,n)),A=n=>Math.min(255,Math.max(0,Math.round(n)));function te(n){let s=n.trim().replace(/^#/,"");return/^[0-9a-fA-F]{3}$/.test(s)&&(s=s.split("").map(a=>a+a).join("")),/^[0-9a-fA-F]{6}$/.test(s)?`#${s.toLowerCase()}`:null}function H(n){const s=(te(n)??"#000000").slice(1);return{r:parseInt(s.slice(0,2),16),g:parseInt(s.slice(2,4),16),b:parseInt(s.slice(4,6),16)}}function N({r:n,g:s,b:a}){const e=c=>Math.round(d(c/255)*255).toString(16).padStart(2,"0");return`#${e(n)}${e(s)}${e(a)}`}function T({r:n,g:s,b:a}){const e=n/255,c=s/255,i=a/255,u=Math.max(e,c,i),l=Math.min(e,c,i),h=u-l;let p=0;h!==0&&(u===e?p=(c-i)/h%6:u===c?p=(i-e)/h+2:p=(e-c)/h+4,p*=60,p<0&&(p+=360));const v=u===0?0:h/u;return{h:p,s:v,v:u}}function y({h:n,s,v:a}){const e=a*s,c=e*(1-Math.abs(n/60%2-1)),i=a-e;let u=0,l=0,h=0;return n<60?[u,l,h]=[e,c,0]:n<120?[u,l,h]=[c,e,0]:n<180?[u,l,h]=[0,e,c]:n<240?[u,l,h]=[0,c,e]:n<300?[u,l,h]=[c,0,e]:[u,l,h]=[e,0,c],{r:(u+i)*255,g:(l+i)*255,b:(h+i)*255}}const re=n=>T(H(n));function se(n){const{r:s,g:a,b:e}=H(n);return(s*299+a*587+e*114)/1e3>=150?"#04202b":"#ffffff"}const ne=/^rgba?\(\s*([\d.]+)\s*[, ]\s*([\d.]+)\s*[, ]\s*([\d.]+)\s*(?:[,/]\s*([\d.]+%?)\s*)?\)$/i;function M(n){const s=n.trim();if(!s)return null;let a=s.replace(/^#/,"");if(/^[0-9a-fA-F]{3,4}$/.test(a)&&(a=a.split("").map(c=>c+c).join("")),/^[0-9a-fA-F]{6}$/.test(a))return{r:parseInt(a.slice(0,2),16),g:parseInt(a.slice(2,4),16),b:parseInt(a.slice(4,6),16),a:1};if(/^[0-9a-fA-F]{8}$/.test(a))return{r:parseInt(a.slice(0,2),16),g:parseInt(a.slice(2,4),16),b:parseInt(a.slice(4,6),16),a:d(parseInt(a.slice(6,8),16)/255)};const e=s.match(ne);if(e){let c=1;return e[4]!=null&&(c=e[4].endsWith("%")?d(parseFloat(e[4])/100):d(parseFloat(e[4]))),{r:A(+e[1]),g:A(+e[2]),b:A(+e[3]),a:c}}return null}function b({r:n,g:s,b:a,a:e}){return e>=1?N({r:n,g:s,b:a}):`rgba(${A(n)}, ${A(s)}, ${A(a)}, ${Math.round(d(e)*100)/100})`}const ae="_field_5rt4i_1",oe="_fullWidth_5rt4i_6",ce="_label_5rt4i_11",le="_required_5rt4i_17",ie="_control_5rt4i_23",ue="_open_5rt4i_44",he="_error_5rt4i_49",pe="_disabled_5rt4i_57",_e="_value_5rt4i_64",fe="_placeholder_5rt4i_73",de="_preview_5rt4i_81",me="_previewEmpty_5rt4i_101",be="_helper_5rt4i_113",we="_popover_5rt4i_118",ve="_sv_5rt4i_128",xe="_svThumb_5rt4i_139",ge="_hue_5rt4i_150",ke="_hueThumb_5rt4i_168",ye="_alphaThumb_5rt4i_169",Ae="_alpha_5rt4i_169",Te="_hexRow_5rt4i_202",Ce="_currentSwatch_5rt4i_207",$e="_hexField_5rt4i_223",Ie="_hexInput_5rt4i_235",De="_swatches_5rt4i_247",Me="_swatch_5rt4i_247",je="_swatchClear_5rt4i_264",Se="_sm_5rt4i_278",Re="_md_5rt4i_282",Ee="_lg_5rt4i_286",f={field:ae,fullWidth:oe,label:ce,required:le,control:ie,open:ue,error:he,disabled:pe,value:_e,placeholder:fe,preview:de,previewEmpty:me,helper:be,popover:we,sv:ve,svThumb:xe,hue:ge,hueThumb:ke,alphaThumb:ye,alpha:Ae,hexRow:Te,currentSwatch:Ce,hexField:$e,hexInput:Ie,swatches:De,swatch:Me,swatchClear:je,sm:Se,md:Re,lg:Ee},L=["#13404e","#039aa1","#00a854","#0ea5e9","#6366f1","#7c3aed","#f04134","#f59e0b","#ffbf00","#10b981","#64748b","#0f172a","#ffffff"],F=re("#13404e");function Pe({value:n,onChange:s,swatches:a=L,clearable:e=!0}){const c=ee.useT(),i=M(n||""),u=i?b(i):null,[l,h]=g.useState(i?T(i):F),p=g.useRef(l);p.current=l;const[v,C]=g.useState((i==null?void 0:i.a)??1),x=g.useRef(v);x.current=v,g.useEffect(()=>{if(!i)return;const r=b({...y(p.current),a:x.current});u!==r&&(h(T(i)),C(i.a))},[u]);const $=r=>{h(r),s(b({...y(r),a:x.current}))},R=r=>{C(r),s(b({...y(p.current),a:r}))},j=r=>t=>{t.preventDefault();const o=t.currentTarget,m=(D,Q)=>r(D,Q,o.getBoundingClientRect());m(t.clientX,t.clientY);const w=D=>m(D.clientX,D.clientY),k=()=>{window.removeEventListener("pointermove",w),window.removeEventListener("pointerup",k)};window.addEventListener("pointermove",w),window.addEventListener("pointerup",k)},q=j((r,t,o)=>{const m=d((r-o.left)/o.width),w=d(1-(t-o.top)/o.height);$({...p.current,s:m,v:w})}),K=j((r,t,o)=>{const m=d((r-o.left)/o.width)*360;$({...p.current,h:m})}),U=j((r,t,o)=>{R(d((r-o.left)/o.width))}),I=.01,W=r=>{const{h:t,s:o,v:m}=p.current;let w=o,k=m;switch(r.key){case"ArrowLeft":w=d(o-I);break;case"ArrowRight":w=d(o+I);break;case"ArrowUp":k=d(m+I);break;case"ArrowDown":k=d(m-I);break;default:return}r.preventDefault(),$({h:t,s:w,v:k})},z=r=>{const{h:t}=p.current;let o=t;switch(r.key){case"ArrowLeft":case"ArrowDown":o=Math.max(0,t-1);break;case"ArrowRight":case"ArrowUp":o=Math.min(360,t+1);break;case"Home":o=0;break;case"End":o=360;break;default:return}r.preventDefault(),$({...p.current,h:o})},B=r=>{let t=x.current;switch(r.key){case"ArrowLeft":case"ArrowDown":t=d(x.current-.01);break;case"ArrowRight":case"ArrowUp":t=d(x.current+.01);break;case"Home":t=0;break;case"End":t=1;break;default:return}r.preventDefault(),R(t)},[V,E]=g.useState("");g.useEffect(()=>{E(u??"")},[u]);const X=r=>{E(r);const t=M(r);t&&(h(T(t)),C(t.a),s(b(t)))},Y=()=>{s(""),h(F),C(1)},G=b({...y(l),a:v}),O=N(y(l)),S=y(l),J=`${Math.round(S.r)}, ${Math.round(S.g)}, ${Math.round(S.b)}`;return _.jsxs("div",{className:f.popover,style:{"--cp-hue":l.h},children:[_.jsx("div",{className:f.sv,onPointerDown:q,onKeyDown:W,role:"slider",tabIndex:0,"aria-label":c("colorPicker.saturation"),"aria-valuetext":`${Math.round(l.s*100)}% saturation, ${Math.round(l.v*100)}% brightness`,children:_.jsx("span",{className:f.svThumb,style:{left:`${l.s*100}%`,top:`${(1-l.v)*100}%`,background:O}})}),_.jsx("div",{className:f.hue,onPointerDown:K,onKeyDown:z,role:"slider",tabIndex:0,"aria-label":c("colorPicker.hue"),"aria-valuemin":0,"aria-valuemax":360,"aria-valuenow":Math.round(l.h),children:_.jsx("span",{className:f.hueThumb,style:{left:`${l.h/360*100}%`}})}),_.jsx("div",{className:f.alpha,onPointerDown:U,onKeyDown:B,role:"slider",tabIndex:0,"aria-label":c("colorPicker.opacity"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(v*100),style:{"--cp-rgb":J},children:_.jsx("span",{className:f.alphaThumb,style:{left:`${v*100}%`}})}),_.jsxs("div",{className:f.hexRow,children:[_.jsx("span",{className:f.currentSwatch,style:{"--cp-fill":G}}),_.jsx("span",{className:f.hexField,children:_.jsx("input",{className:f.hexInput,value:V,spellCheck:!1,maxLength:28,"aria-label":c("colorPicker.value"),onChange:r=>X(r.target.value)})})]}),_.jsxs("div",{className:f.swatches,children:[e&&_.jsx("button",{type:"button",className:Z.clsx(f.swatch,f.swatchClear),"aria-label":c("colorPicker.noColor"),"aria-pressed":!i,onClick:Y,children:!i&&_.jsx(P.Icon,{name:"TickCircle",size:"sm"})}),a.map(r=>{const t=M(r);if(!t)return null;const o=b({r:t.r,g:t.g,b:t.b,a:1}),m=u===o;return _.jsx("button",{type:"button",className:f.swatch,style:{background:o,color:se(o)},"aria-label":o,"aria-pressed":m,onClick:()=>{h(T(t)),s(b({r:t.r,g:t.g,b:t.b,a:x.current}))},children:m&&_.jsx(P.Icon,{name:"TickCircle",size:"sm"})},r)})]})]})}exports.ColorPickerPanel=Pe;exports.DEFAULT_SWATCHES=L;exports.formatColor=b;exports.parseColor=M;exports.styles=f;
2
+ //# sourceMappingURL=ColorPickerPanel--wBX-m7J.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorPickerPanel-Dk6bI0Xy.cjs","sources":["../src/components/ColorPicker/colorUtils.ts","../src/components/ColorPicker/ColorPickerPanel.tsx"],"sourcesContent":["/** Color math for the ColorPicker: hex ⇄ rgb ⇄ hsv, plus hex validation. All internal, no deps. */\n\nexport interface HSV {\n /** Hue 0–360 */\n h: number\n /** Saturation 0–1 */\n s: number\n /** Value/brightness 0–1 */\n v: number\n}\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface RGBA extends RGB {\n /** Alpha 0–1 */\n a: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\nconst clamp255 = (n: number): number => Math.min(255, Math.max(0, Math.round(n)))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`) 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\n/** RGB (0–255) → HSV. */\nexport function rgbToHsv({ r, g, b }: RGB): HSV {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const d = max - min\n\n let h = 0\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n }\n const s = max === 0 ? 0 : d / max\n return { h, s, v: max }\n}\n\n/** HSV → RGB (0–255). */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0\n let g = 0\n let b = 0\n if (h < 60) [r, g, b] = [c, x, 0]\n else if (h < 120) [r, g, b] = [x, c, 0]\n else if (h < 180) [r, g, b] = [0, c, x]\n else if (h < 240) [r, g, b] = [0, x, c]\n else if (h < 300) [r, g, b] = [x, 0, c]\n else [r, g, b] = [c, 0, x]\n return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 }\n}\n\nexport const hexToHsv = (hex: string): HSV => rgbToHsv(hexToRgb(hex))\nexport const hsvToHex = (hsv: HSV): string => rgbToHex(hsvToRgb(hsv))\n\n/** A readable text/handle color (near-black or white) for sitting on top of a given hex fill. */\nexport function contrastOn(hex: string): string {\n const { r, g, b } = hexToRgb(hex)\n return (r * 299 + g * 587 + b * 114) / 1000 >= 150 ? '#04202b' : '#ffffff'\n}\n\nconst RGB_FUNC =\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i\n\n/**\n * Parses any CSS color the picker understands — `#rgb` / `#rgba` / `#rrggbb` / `#rrggbbaa` hex (with\n * or without `#`), or `rgb()` / `rgba()` (alpha as `0–1` or a `%`) — to `{ r, g, b, a }` (`a` is\n * `0–1`), or `null` when it doesn't match.\n */\nexport function parseColor(input: string): RGBA | null {\n const s = input.trim()\n if (!s) return null\n\n // hex (with or without #) — 3 / 4 / 6 / 8 digits (3 & 4 expand each nibble to a byte)\n let h = s.replace(/^#/, '')\n if (/^[0-9a-fA-F]{3,4}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n if (/^[0-9a-fA-F]{6}$/.test(h)) {\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 a: 1,\n }\n }\n if (/^[0-9a-fA-F]{8}$/.test(h)) {\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 a: clamp01(parseInt(h.slice(6, 8), 16) / 255),\n }\n }\n\n // rgb() / rgba()\n const m = s.match(RGB_FUNC)\n if (m) {\n let a = 1\n if (m[4] != null) {\n a = m[4].endsWith('%') ? clamp01(parseFloat(m[4]) / 100) : clamp01(parseFloat(m[4]))\n }\n return { r: clamp255(+m[1]), g: clamp255(+m[2]), b: clamp255(+m[3]), a }\n }\n return null\n}\n\n/**\n * Formats `{ r, g, b, a }` back to a CSS string: `#rrggbb` when fully opaque (`a >= 1`), else\n * `rgba(r, g, b, a)` with alpha rounded to 2 decimals.\n */\nexport function formatColor({ r, g, b, a }: RGBA): string {\n if (a >= 1) return rgbToHex({ r, g, b })\n return `rgba(${clamp255(r)}, ${clamp255(g)}, ${clamp255(b)}, ${Math.round(clamp01(a) * 100) / 100})`\n}\n","import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport {\n clamp01,\n contrastOn,\n formatColor,\n hexToHsv,\n hsvToRgb,\n parseColor,\n rgbToHex,\n rgbToHsv,\n type HSV,\n} from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\n/** A pleasant default palette shown as quick-pick swatches. */\nexport const DEFAULT_SWATCHES = [\n '#13404e',\n '#039aa1',\n '#00a854',\n '#0ea5e9',\n '#6366f1',\n '#7c3aed',\n '#f04134',\n '#f59e0b',\n '#ffbf00',\n '#10b981',\n '#64748b',\n '#0f172a',\n '#ffffff',\n]\n\nconst FALLBACK_HSV: HSV = hexToHsv('#13404e')\n\nexport interface ColorPickerPanelProps {\n /** Current color — a CSS color string (`#rrggbb`, `rgba(...)`, or `''` when unset). */\n value: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when translucent, `''` when cleared. */\n onChange: (color: string) => void\n /** Quick-pick swatches. Defaults to a curated palette. */\n swatches?: string[]\n /** Show the leading \"no color\" swatch that clears the value. Defaults to `true`. */\n clearable?: boolean\n}\n\n/**\n * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and\n * quick-pick swatches. Controlled by a single color `string` (`value` / `onChange`), so it drops into\n * any popover. Working state is kept as HSV + alpha (hue survives dragging at grey/black), re-derived\n * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`\n * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).\n */\nexport function ColorPickerPanel({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n clearable = true,\n}: ColorPickerPanelProps) {\n const t = useT()\n const parsed = parseColor(value || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n\n // working HSV + alpha (HSV keeps hue stable while dragging at grey/black; alpha is the opacity)\n const [hsv, setHsv] = useState<HSV>(parsed ? rgbToHsv(parsed) : FALLBACK_HSV)\n const hsvRef = useRef(hsv)\n hsvRef.current = hsv\n const [alpha, setAlpha] = useState<number>(parsed?.a ?? 1)\n const alphaRef = useRef(alpha)\n alphaRef.current = alpha\n\n // re-derive HSV + alpha only when the value changes from OUTSIDE our own edits (prop/preset/input)\n useEffect(() => {\n if (!parsed) return\n const cur = formatColor({ ...hsvToRgb(hsvRef.current), a: alphaRef.current })\n if (displayValue !== cur) {\n setHsv(rgbToHsv(parsed))\n setAlpha(parsed.a)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [displayValue])\n\n const applyHsv = (next: HSV) => {\n setHsv(next)\n onChange(formatColor({ ...hsvToRgb(next), a: alphaRef.current }))\n }\n\n const applyAlpha = (next: number) => {\n setAlpha(next)\n onChange(formatColor({ ...hsvToRgb(hsvRef.current), a: next }))\n }\n\n // drag (SV square + hue/alpha sliders)\n const drag =\n (onMove: (clientX: number, clientY: number, rect: DOMRect) => void) =>\n (event: ReactPointerEvent<HTMLDivElement>) => {\n event.preventDefault()\n const el = event.currentTarget\n const move = (clientX: number, clientY: number) =>\n onMove(clientX, clientY, el.getBoundingClientRect())\n move(event.clientX, event.clientY)\n const onPointerMove = (e: PointerEvent) => move(e.clientX, e.clientY)\n const onPointerUp = () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n }\n\n const onSvDown = drag((x, y, rect) => {\n const s = clamp01((x - rect.left) / rect.width)\n const v = clamp01(1 - (y - rect.top) / rect.height)\n applyHsv({ ...hsvRef.current, s, v })\n })\n\n const onHueDown = drag((x, _y, rect) => {\n const h = clamp01((x - rect.left) / rect.width) * 360\n applyHsv({ ...hsvRef.current, h })\n })\n\n const onAlphaDown = drag((x, _y, rect) => {\n applyAlpha(clamp01((x - rect.left) / rect.width))\n })\n\n // keyboard control — arrows nudge, Home/End jump to the extents (mirrors Calendar/TimeColumns a11y)\n const SV_STEP = 0.01\n const onSvKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h, s, v } = hsvRef.current\n let ns = s\n let nv = v\n switch (event.key) {\n case 'ArrowLeft':\n ns = clamp01(s - SV_STEP)\n break\n case 'ArrowRight':\n ns = clamp01(s + SV_STEP)\n break\n case 'ArrowUp':\n nv = clamp01(v + SV_STEP)\n break\n case 'ArrowDown':\n nv = clamp01(v - SV_STEP)\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ h, s: ns, v: nv })\n }\n const onHueKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h } = hsvRef.current\n let nh = h\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n nh = Math.max(0, h - 1)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n nh = Math.min(360, h + 1)\n break\n case 'Home':\n nh = 0\n break\n case 'End':\n nh = 360\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ ...hsvRef.current, h: nh })\n }\n const onAlphaKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n let na = alphaRef.current\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n na = clamp01(alphaRef.current - 0.01)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n na = clamp01(alphaRef.current + 0.01)\n break\n case 'Home':\n na = 0\n break\n case 'End':\n na = 1\n break\n default:\n return\n }\n event.preventDefault()\n applyAlpha(na)\n }\n\n // color input (accepts hex / rgb() / rgba()) + clear\n const [colorDraft, setColorDraft] = useState('')\n useEffect(() => {\n setColorDraft(displayValue ?? '')\n }, [displayValue])\n\n const onColorInput = (raw: string) => {\n setColorDraft(raw)\n const p = parseColor(raw)\n if (p) {\n setHsv(rgbToHsv(p))\n setAlpha(p.a)\n onChange(formatColor(p))\n }\n }\n\n const handleClear = () => {\n onChange('')\n setHsv(FALLBACK_HSV)\n setAlpha(1)\n }\n\n // working color (hsv + alpha): the current swatch + the SV thumb (opaque) + the alpha track base\n const workingColor = formatColor({ ...hsvToRgb(hsv), a: alpha })\n const solidHex = rgbToHex(hsvToRgb(hsv))\n const cur = hsvToRgb(hsv)\n const cpRgb = `${Math.round(cur.r)}, ${Math.round(cur.g)}, ${Math.round(cur.b)}`\n\n return (\n <div className={styles.popover} style={{ '--cp-hue': hsv.h } as CSSProperties}>\n <div\n className={styles.sv}\n onPointerDown={onSvDown}\n onKeyDown={onSvKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.saturation')}\n aria-valuetext={`${Math.round(hsv.s * 100)}% saturation, ${Math.round(hsv.v * 100)}% brightness`}\n >\n <span\n className={styles.svThumb}\n style={{ left: `${hsv.s * 100}%`, top: `${(1 - hsv.v) * 100}%`, background: solidHex }}\n />\n </div>\n\n <div\n className={styles.hue}\n onPointerDown={onHueDown}\n onKeyDown={onHueKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.hue')}\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={Math.round(hsv.h)}\n >\n <span className={styles.hueThumb} style={{ left: `${(hsv.h / 360) * 100}%` }} />\n </div>\n\n <div\n className={styles.alpha}\n onPointerDown={onAlphaDown}\n onKeyDown={onAlphaKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.opacity')}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(alpha * 100)}\n style={{ '--cp-rgb': cpRgb } as CSSProperties}\n >\n <span className={styles.alphaThumb} style={{ left: `${alpha * 100}%` }} />\n </div>\n\n <div className={styles.hexRow}>\n <span\n className={styles.currentSwatch}\n style={{ '--cp-fill': workingColor } as CSSProperties}\n />\n <span className={styles.hexField}>\n <input\n className={styles.hexInput}\n value={colorDraft}\n spellCheck={false}\n maxLength={28}\n aria-label={t('colorPicker.value')}\n onChange={(e) => onColorInput(e.target.value)}\n />\n </span>\n </div>\n\n <div className={styles.swatches}>\n {/* \"no color\" — clears the value (the diagonal-stripe swatch); hidden when not clearable */}\n {clearable && (\n <button\n type=\"button\"\n className={clsx(styles.swatch, styles.swatchClear)}\n aria-label={t('colorPicker.noColor')}\n aria-pressed={!parsed}\n onClick={handleClear}\n >\n {!parsed && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )}\n {swatches.map((sw) => {\n const p = parseColor(sw)\n if (!p) return null\n const swHex = formatColor({ r: p.r, g: p.g, b: p.b, a: 1 })\n const selected = displayValue === swHex\n return (\n <button\n key={sw}\n type=\"button\"\n className={styles.swatch}\n style={{ background: swHex, color: contrastOn(swHex) }}\n aria-label={swHex}\n aria-pressed={selected}\n onClick={() => {\n setHsv(rgbToHsv(p))\n onChange(formatColor({ r: p.r, g: p.g, b: p.b, a: alphaRef.current }))\n }}\n >\n {selected && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"],"names":["clamp01","clamp255","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to","n","rgbToHsv","rn","gn","bn","max","min","d","s","hsvToRgb","v","x","m","hexToHsv","contrastOn","RGB_FUNC","parseColor","a","formatColor","DEFAULT_SWATCHES","FALLBACK_HSV","ColorPickerPanel","value","onChange","swatches","clearable","t","useT","parsed","displayValue","hsv","setHsv","useState","hsvRef","useRef","alpha","setAlpha","alphaRef","useEffect","cur","applyHsv","next","applyAlpha","drag","onMove","event","el","move","clientX","clientY","onPointerMove","e","onPointerUp","onSvDown","y","rect","onHueDown","_y","onAlphaDown","SV_STEP","onSvKey","ns","nv","onHueKey","nh","onAlphaKey","na","colorDraft","setColorDraft","onColorInput","raw","p","handleClear","workingColor","solidHex","cpRgb","jsxs","styles","jsx","clsx","Icon","sw","swHex","selected"],"mappings":"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"}
1
+ {"version":3,"file":"ColorPickerPanel--wBX-m7J.cjs","sources":["../src/components/ColorPicker/colorUtils.ts","../src/components/ColorPicker/ColorPickerPanel.tsx"],"sourcesContent":["/** Color math for the ColorPicker: hex ⇄ rgb ⇄ hsv, plus hex validation. All internal, no deps. */\n\nexport interface HSV {\n /** Hue 0–360 */\n h: number\n /** Saturation 0–1 */\n s: number\n /** Value/brightness 0–1 */\n v: number\n}\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface RGBA extends RGB {\n /** Alpha 0–1 */\n a: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\nconst clamp255 = (n: number): number => Math.min(255, Math.max(0, Math.round(n)))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`) 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\n/** RGB (0–255) → HSV. */\nexport function rgbToHsv({ r, g, b }: RGB): HSV {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const d = max - min\n\n let h = 0\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n }\n const s = max === 0 ? 0 : d / max\n return { h, s, v: max }\n}\n\n/** HSV → RGB (0–255). */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0\n let g = 0\n let b = 0\n if (h < 60) [r, g, b] = [c, x, 0]\n else if (h < 120) [r, g, b] = [x, c, 0]\n else if (h < 180) [r, g, b] = [0, c, x]\n else if (h < 240) [r, g, b] = [0, x, c]\n else if (h < 300) [r, g, b] = [x, 0, c]\n else [r, g, b] = [c, 0, x]\n return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 }\n}\n\nexport const hexToHsv = (hex: string): HSV => rgbToHsv(hexToRgb(hex))\nexport const hsvToHex = (hsv: HSV): string => rgbToHex(hsvToRgb(hsv))\n\n/** A readable text/handle color (near-black or white) for sitting on top of a given hex fill. */\nexport function contrastOn(hex: string): string {\n const { r, g, b } = hexToRgb(hex)\n return (r * 299 + g * 587 + b * 114) / 1000 >= 150 ? '#04202b' : '#ffffff'\n}\n\nconst RGB_FUNC =\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i\n\n/**\n * Parses any CSS color the picker understands — `#rgb` / `#rgba` / `#rrggbb` / `#rrggbbaa` hex (with\n * or without `#`), or `rgb()` / `rgba()` (alpha as `0–1` or a `%`) — to `{ r, g, b, a }` (`a` is\n * `0–1`), or `null` when it doesn't match.\n */\nexport function parseColor(input: string): RGBA | null {\n const s = input.trim()\n if (!s) return null\n\n // hex (with or without #) — 3 / 4 / 6 / 8 digits (3 & 4 expand each nibble to a byte)\n let h = s.replace(/^#/, '')\n if (/^[0-9a-fA-F]{3,4}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n if (/^[0-9a-fA-F]{6}$/.test(h)) {\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 a: 1,\n }\n }\n if (/^[0-9a-fA-F]{8}$/.test(h)) {\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 a: clamp01(parseInt(h.slice(6, 8), 16) / 255),\n }\n }\n\n // rgb() / rgba()\n const m = s.match(RGB_FUNC)\n if (m) {\n let a = 1\n if (m[4] != null) {\n a = m[4].endsWith('%') ? clamp01(parseFloat(m[4]) / 100) : clamp01(parseFloat(m[4]))\n }\n return { r: clamp255(+m[1]), g: clamp255(+m[2]), b: clamp255(+m[3]), a }\n }\n return null\n}\n\n/**\n * Formats `{ r, g, b, a }` back to a CSS string: `#rrggbb` when fully opaque (`a >= 1`), else\n * `rgba(r, g, b, a)` with alpha rounded to 2 decimals.\n */\nexport function formatColor({ r, g, b, a }: RGBA): string {\n if (a >= 1) return rgbToHex({ r, g, b })\n return `rgba(${clamp255(r)}, ${clamp255(g)}, ${clamp255(b)}, ${Math.round(clamp01(a) * 100) / 100})`\n}\n","import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport {\n clamp01,\n contrastOn,\n formatColor,\n hexToHsv,\n hsvToRgb,\n parseColor,\n rgbToHex,\n rgbToHsv,\n type HSV,\n} from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\n/** A pleasant default palette shown as quick-pick swatches. */\nexport const DEFAULT_SWATCHES = [\n '#13404e',\n '#039aa1',\n '#00a854',\n '#0ea5e9',\n '#6366f1',\n '#7c3aed',\n '#f04134',\n '#f59e0b',\n '#ffbf00',\n '#10b981',\n '#64748b',\n '#0f172a',\n '#ffffff',\n]\n\nconst FALLBACK_HSV: HSV = hexToHsv('#13404e')\n\nexport interface ColorPickerPanelProps {\n /** Current color — a CSS color string (`#rrggbb`, `rgba(...)`, or `''` when unset). */\n value: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when translucent, `''` when cleared. */\n onChange: (color: string) => void\n /** Quick-pick swatches. Defaults to a curated palette. */\n swatches?: string[]\n /** Show the leading \"no color\" swatch that clears the value. Defaults to `true`. */\n clearable?: boolean\n}\n\n/**\n * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and\n * quick-pick swatches. Controlled by a single color `string` (`value` / `onChange`), so it drops into\n * any popover. Working state is kept as HSV + alpha (hue survives dragging at grey/black), re-derived\n * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`\n * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).\n */\nexport function ColorPickerPanel({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n clearable = true,\n}: ColorPickerPanelProps) {\n const t = useT()\n const parsed = parseColor(value || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n\n // working HSV + alpha (HSV keeps hue stable while dragging at grey/black; alpha is the opacity)\n const [hsv, setHsv] = useState<HSV>(parsed ? rgbToHsv(parsed) : FALLBACK_HSV)\n const hsvRef = useRef(hsv)\n hsvRef.current = hsv\n const [alpha, setAlpha] = useState<number>(parsed?.a ?? 1)\n const alphaRef = useRef(alpha)\n alphaRef.current = alpha\n\n // re-derive HSV + alpha only when the value changes from OUTSIDE our own edits (prop/preset/input)\n useEffect(() => {\n if (!parsed) return\n const cur = formatColor({ ...hsvToRgb(hsvRef.current), a: alphaRef.current })\n if (displayValue !== cur) {\n setHsv(rgbToHsv(parsed))\n setAlpha(parsed.a)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [displayValue])\n\n const applyHsv = (next: HSV) => {\n setHsv(next)\n onChange(formatColor({ ...hsvToRgb(next), a: alphaRef.current }))\n }\n\n const applyAlpha = (next: number) => {\n setAlpha(next)\n onChange(formatColor({ ...hsvToRgb(hsvRef.current), a: next }))\n }\n\n // drag (SV square + hue/alpha sliders)\n const drag =\n (onMove: (clientX: number, clientY: number, rect: DOMRect) => void) =>\n (event: ReactPointerEvent<HTMLDivElement>) => {\n event.preventDefault()\n const el = event.currentTarget\n const move = (clientX: number, clientY: number) =>\n onMove(clientX, clientY, el.getBoundingClientRect())\n move(event.clientX, event.clientY)\n const onPointerMove = (e: PointerEvent) => move(e.clientX, e.clientY)\n const onPointerUp = () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n }\n\n const onSvDown = drag((x, y, rect) => {\n const s = clamp01((x - rect.left) / rect.width)\n const v = clamp01(1 - (y - rect.top) / rect.height)\n applyHsv({ ...hsvRef.current, s, v })\n })\n\n const onHueDown = drag((x, _y, rect) => {\n const h = clamp01((x - rect.left) / rect.width) * 360\n applyHsv({ ...hsvRef.current, h })\n })\n\n const onAlphaDown = drag((x, _y, rect) => {\n applyAlpha(clamp01((x - rect.left) / rect.width))\n })\n\n // keyboard control — arrows nudge, Home/End jump to the extents (mirrors Calendar/TimeColumns a11y)\n const SV_STEP = 0.01\n const onSvKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h, s, v } = hsvRef.current\n let ns = s\n let nv = v\n switch (event.key) {\n case 'ArrowLeft':\n ns = clamp01(s - SV_STEP)\n break\n case 'ArrowRight':\n ns = clamp01(s + SV_STEP)\n break\n case 'ArrowUp':\n nv = clamp01(v + SV_STEP)\n break\n case 'ArrowDown':\n nv = clamp01(v - SV_STEP)\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ h, s: ns, v: nv })\n }\n const onHueKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h } = hsvRef.current\n let nh = h\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n nh = Math.max(0, h - 1)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n nh = Math.min(360, h + 1)\n break\n case 'Home':\n nh = 0\n break\n case 'End':\n nh = 360\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ ...hsvRef.current, h: nh })\n }\n const onAlphaKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n let na = alphaRef.current\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n na = clamp01(alphaRef.current - 0.01)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n na = clamp01(alphaRef.current + 0.01)\n break\n case 'Home':\n na = 0\n break\n case 'End':\n na = 1\n break\n default:\n return\n }\n event.preventDefault()\n applyAlpha(na)\n }\n\n // color input (accepts hex / rgb() / rgba()) + clear\n const [colorDraft, setColorDraft] = useState('')\n useEffect(() => {\n setColorDraft(displayValue ?? '')\n }, [displayValue])\n\n const onColorInput = (raw: string) => {\n setColorDraft(raw)\n const p = parseColor(raw)\n if (p) {\n setHsv(rgbToHsv(p))\n setAlpha(p.a)\n onChange(formatColor(p))\n }\n }\n\n const handleClear = () => {\n onChange('')\n setHsv(FALLBACK_HSV)\n setAlpha(1)\n }\n\n // working color (hsv + alpha): the current swatch + the SV thumb (opaque) + the alpha track base\n const workingColor = formatColor({ ...hsvToRgb(hsv), a: alpha })\n const solidHex = rgbToHex(hsvToRgb(hsv))\n const cur = hsvToRgb(hsv)\n const cpRgb = `${Math.round(cur.r)}, ${Math.round(cur.g)}, ${Math.round(cur.b)}`\n\n return (\n <div className={styles.popover} style={{ '--cp-hue': hsv.h } as CSSProperties}>\n <div\n className={styles.sv}\n onPointerDown={onSvDown}\n onKeyDown={onSvKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.saturation')}\n aria-valuetext={`${Math.round(hsv.s * 100)}% saturation, ${Math.round(hsv.v * 100)}% brightness`}\n >\n <span\n className={styles.svThumb}\n style={{ left: `${hsv.s * 100}%`, top: `${(1 - hsv.v) * 100}%`, background: solidHex }}\n />\n </div>\n\n <div\n className={styles.hue}\n onPointerDown={onHueDown}\n onKeyDown={onHueKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.hue')}\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={Math.round(hsv.h)}\n >\n <span className={styles.hueThumb} style={{ left: `${(hsv.h / 360) * 100}%` }} />\n </div>\n\n <div\n className={styles.alpha}\n onPointerDown={onAlphaDown}\n onKeyDown={onAlphaKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.opacity')}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(alpha * 100)}\n style={{ '--cp-rgb': cpRgb } as CSSProperties}\n >\n <span className={styles.alphaThumb} style={{ left: `${alpha * 100}%` }} />\n </div>\n\n <div className={styles.hexRow}>\n <span\n className={styles.currentSwatch}\n style={{ '--cp-fill': workingColor } as CSSProperties}\n />\n <span className={styles.hexField}>\n <input\n className={styles.hexInput}\n value={colorDraft}\n spellCheck={false}\n maxLength={28}\n aria-label={t('colorPicker.value')}\n onChange={(e) => onColorInput(e.target.value)}\n />\n </span>\n </div>\n\n <div className={styles.swatches}>\n {/* \"no color\" — clears the value (the diagonal-stripe swatch); hidden when not clearable */}\n {clearable && (\n <button\n type=\"button\"\n className={clsx(styles.swatch, styles.swatchClear)}\n aria-label={t('colorPicker.noColor')}\n aria-pressed={!parsed}\n onClick={handleClear}\n >\n {!parsed && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )}\n {swatches.map((sw) => {\n const p = parseColor(sw)\n if (!p) return null\n const swHex = formatColor({ r: p.r, g: p.g, b: p.b, a: 1 })\n const selected = displayValue === swHex\n return (\n <button\n key={sw}\n type=\"button\"\n className={styles.swatch}\n style={{ background: swHex, color: contrastOn(swHex) }}\n aria-label={swHex}\n aria-pressed={selected}\n onClick={() => {\n setHsv(rgbToHsv(p))\n onChange(formatColor({ r: p.r, g: p.g, b: p.b, a: alphaRef.current }))\n }}\n >\n {selected && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"],"names":["clamp01","clamp255","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to","n","rgbToHsv","rn","gn","bn","max","min","d","s","hsvToRgb","v","x","m","hexToHsv","contrastOn","RGB_FUNC","parseColor","a","formatColor","DEFAULT_SWATCHES","FALLBACK_HSV","ColorPickerPanel","value","onChange","swatches","clearable","t","useT","parsed","displayValue","hsv","setHsv","useState","hsvRef","useRef","alpha","setAlpha","alphaRef","useEffect","cur","applyHsv","next","applyAlpha","drag","onMove","event","el","move","clientX","clientY","onPointerMove","e","onPointerUp","onSvDown","y","rect","onHueDown","_y","onAlphaDown","SV_STEP","onSvKey","ns","nv","onHueKey","nh","onAlphaKey","na","colorDraft","setColorDraft","onColorInput","raw","p","handleClear","workingColor","solidHex","cpRgb","jsxs","styles","jsx","clsx","Icon","sw","swHex","selected"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as N, jsx as m } from "react/jsx-runtime";
2
2
  import { useState as R, useRef as E, useEffect as P } from "react";
3
3
  import { clsx as te } from "clsx";
4
4
  import { I as L } from "./Icon-DaTvzLBu.js";
5
- import { a as re } from "./ConfigProvider-Blhvj6UQ.js";
5
+ import { a as re } from "./ConfigProvider-DR9YMy9U.js";
6
6
  const f = (s) => Math.min(1, Math.max(0, s)), y = (s) => Math.min(255, Math.max(0, Math.round(s)));
7
7
  function ne(s) {
8
8
  let n = s.trim().replace(/^#/, "");
@@ -333,4 +333,4 @@ export {
333
333
  F as p,
334
334
  _ as s
335
335
  };
336
- //# sourceMappingURL=ColorPickerPanel-BGzm2had.js.map
336
+ //# sourceMappingURL=ColorPickerPanel-Dp7bnnVf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorPickerPanel-BGzm2had.js","sources":["../src/components/ColorPicker/colorUtils.ts","../src/components/ColorPicker/ColorPickerPanel.tsx"],"sourcesContent":["/** Color math for the ColorPicker: hex ⇄ rgb ⇄ hsv, plus hex validation. All internal, no deps. */\n\nexport interface HSV {\n /** Hue 0–360 */\n h: number\n /** Saturation 0–1 */\n s: number\n /** Value/brightness 0–1 */\n v: number\n}\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface RGBA extends RGB {\n /** Alpha 0–1 */\n a: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\nconst clamp255 = (n: number): number => Math.min(255, Math.max(0, Math.round(n)))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`) 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\n/** RGB (0–255) → HSV. */\nexport function rgbToHsv({ r, g, b }: RGB): HSV {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const d = max - min\n\n let h = 0\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n }\n const s = max === 0 ? 0 : d / max\n return { h, s, v: max }\n}\n\n/** HSV → RGB (0–255). */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0\n let g = 0\n let b = 0\n if (h < 60) [r, g, b] = [c, x, 0]\n else if (h < 120) [r, g, b] = [x, c, 0]\n else if (h < 180) [r, g, b] = [0, c, x]\n else if (h < 240) [r, g, b] = [0, x, c]\n else if (h < 300) [r, g, b] = [x, 0, c]\n else [r, g, b] = [c, 0, x]\n return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 }\n}\n\nexport const hexToHsv = (hex: string): HSV => rgbToHsv(hexToRgb(hex))\nexport const hsvToHex = (hsv: HSV): string => rgbToHex(hsvToRgb(hsv))\n\n/** A readable text/handle color (near-black or white) for sitting on top of a given hex fill. */\nexport function contrastOn(hex: string): string {\n const { r, g, b } = hexToRgb(hex)\n return (r * 299 + g * 587 + b * 114) / 1000 >= 150 ? '#04202b' : '#ffffff'\n}\n\nconst RGB_FUNC =\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i\n\n/**\n * Parses any CSS color the picker understands — `#rgb` / `#rgba` / `#rrggbb` / `#rrggbbaa` hex (with\n * or without `#`), or `rgb()` / `rgba()` (alpha as `0–1` or a `%`) — to `{ r, g, b, a }` (`a` is\n * `0–1`), or `null` when it doesn't match.\n */\nexport function parseColor(input: string): RGBA | null {\n const s = input.trim()\n if (!s) return null\n\n // hex (with or without #) — 3 / 4 / 6 / 8 digits (3 & 4 expand each nibble to a byte)\n let h = s.replace(/^#/, '')\n if (/^[0-9a-fA-F]{3,4}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n if (/^[0-9a-fA-F]{6}$/.test(h)) {\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 a: 1,\n }\n }\n if (/^[0-9a-fA-F]{8}$/.test(h)) {\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 a: clamp01(parseInt(h.slice(6, 8), 16) / 255),\n }\n }\n\n // rgb() / rgba()\n const m = s.match(RGB_FUNC)\n if (m) {\n let a = 1\n if (m[4] != null) {\n a = m[4].endsWith('%') ? clamp01(parseFloat(m[4]) / 100) : clamp01(parseFloat(m[4]))\n }\n return { r: clamp255(+m[1]), g: clamp255(+m[2]), b: clamp255(+m[3]), a }\n }\n return null\n}\n\n/**\n * Formats `{ r, g, b, a }` back to a CSS string: `#rrggbb` when fully opaque (`a >= 1`), else\n * `rgba(r, g, b, a)` with alpha rounded to 2 decimals.\n */\nexport function formatColor({ r, g, b, a }: RGBA): string {\n if (a >= 1) return rgbToHex({ r, g, b })\n return `rgba(${clamp255(r)}, ${clamp255(g)}, ${clamp255(b)}, ${Math.round(clamp01(a) * 100) / 100})`\n}\n","import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport {\n clamp01,\n contrastOn,\n formatColor,\n hexToHsv,\n hsvToRgb,\n parseColor,\n rgbToHex,\n rgbToHsv,\n type HSV,\n} from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\n/** A pleasant default palette shown as quick-pick swatches. */\nexport const DEFAULT_SWATCHES = [\n '#13404e',\n '#039aa1',\n '#00a854',\n '#0ea5e9',\n '#6366f1',\n '#7c3aed',\n '#f04134',\n '#f59e0b',\n '#ffbf00',\n '#10b981',\n '#64748b',\n '#0f172a',\n '#ffffff',\n]\n\nconst FALLBACK_HSV: HSV = hexToHsv('#13404e')\n\nexport interface ColorPickerPanelProps {\n /** Current color — a CSS color string (`#rrggbb`, `rgba(...)`, or `''` when unset). */\n value: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when translucent, `''` when cleared. */\n onChange: (color: string) => void\n /** Quick-pick swatches. Defaults to a curated palette. */\n swatches?: string[]\n /** Show the leading \"no color\" swatch that clears the value. Defaults to `true`. */\n clearable?: boolean\n}\n\n/**\n * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and\n * quick-pick swatches. Controlled by a single color `string` (`value` / `onChange`), so it drops into\n * any popover. Working state is kept as HSV + alpha (hue survives dragging at grey/black), re-derived\n * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`\n * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).\n */\nexport function ColorPickerPanel({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n clearable = true,\n}: ColorPickerPanelProps) {\n const t = useT()\n const parsed = parseColor(value || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n\n // working HSV + alpha (HSV keeps hue stable while dragging at grey/black; alpha is the opacity)\n const [hsv, setHsv] = useState<HSV>(parsed ? rgbToHsv(parsed) : FALLBACK_HSV)\n const hsvRef = useRef(hsv)\n hsvRef.current = hsv\n const [alpha, setAlpha] = useState<number>(parsed?.a ?? 1)\n const alphaRef = useRef(alpha)\n alphaRef.current = alpha\n\n // re-derive HSV + alpha only when the value changes from OUTSIDE our own edits (prop/preset/input)\n useEffect(() => {\n if (!parsed) return\n const cur = formatColor({ ...hsvToRgb(hsvRef.current), a: alphaRef.current })\n if (displayValue !== cur) {\n setHsv(rgbToHsv(parsed))\n setAlpha(parsed.a)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [displayValue])\n\n const applyHsv = (next: HSV) => {\n setHsv(next)\n onChange(formatColor({ ...hsvToRgb(next), a: alphaRef.current }))\n }\n\n const applyAlpha = (next: number) => {\n setAlpha(next)\n onChange(formatColor({ ...hsvToRgb(hsvRef.current), a: next }))\n }\n\n // drag (SV square + hue/alpha sliders)\n const drag =\n (onMove: (clientX: number, clientY: number, rect: DOMRect) => void) =>\n (event: ReactPointerEvent<HTMLDivElement>) => {\n event.preventDefault()\n const el = event.currentTarget\n const move = (clientX: number, clientY: number) =>\n onMove(clientX, clientY, el.getBoundingClientRect())\n move(event.clientX, event.clientY)\n const onPointerMove = (e: PointerEvent) => move(e.clientX, e.clientY)\n const onPointerUp = () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n }\n\n const onSvDown = drag((x, y, rect) => {\n const s = clamp01((x - rect.left) / rect.width)\n const v = clamp01(1 - (y - rect.top) / rect.height)\n applyHsv({ ...hsvRef.current, s, v })\n })\n\n const onHueDown = drag((x, _y, rect) => {\n const h = clamp01((x - rect.left) / rect.width) * 360\n applyHsv({ ...hsvRef.current, h })\n })\n\n const onAlphaDown = drag((x, _y, rect) => {\n applyAlpha(clamp01((x - rect.left) / rect.width))\n })\n\n // keyboard control — arrows nudge, Home/End jump to the extents (mirrors Calendar/TimeColumns a11y)\n const SV_STEP = 0.01\n const onSvKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h, s, v } = hsvRef.current\n let ns = s\n let nv = v\n switch (event.key) {\n case 'ArrowLeft':\n ns = clamp01(s - SV_STEP)\n break\n case 'ArrowRight':\n ns = clamp01(s + SV_STEP)\n break\n case 'ArrowUp':\n nv = clamp01(v + SV_STEP)\n break\n case 'ArrowDown':\n nv = clamp01(v - SV_STEP)\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ h, s: ns, v: nv })\n }\n const onHueKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h } = hsvRef.current\n let nh = h\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n nh = Math.max(0, h - 1)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n nh = Math.min(360, h + 1)\n break\n case 'Home':\n nh = 0\n break\n case 'End':\n nh = 360\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ ...hsvRef.current, h: nh })\n }\n const onAlphaKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n let na = alphaRef.current\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n na = clamp01(alphaRef.current - 0.01)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n na = clamp01(alphaRef.current + 0.01)\n break\n case 'Home':\n na = 0\n break\n case 'End':\n na = 1\n break\n default:\n return\n }\n event.preventDefault()\n applyAlpha(na)\n }\n\n // color input (accepts hex / rgb() / rgba()) + clear\n const [colorDraft, setColorDraft] = useState('')\n useEffect(() => {\n setColorDraft(displayValue ?? '')\n }, [displayValue])\n\n const onColorInput = (raw: string) => {\n setColorDraft(raw)\n const p = parseColor(raw)\n if (p) {\n setHsv(rgbToHsv(p))\n setAlpha(p.a)\n onChange(formatColor(p))\n }\n }\n\n const handleClear = () => {\n onChange('')\n setHsv(FALLBACK_HSV)\n setAlpha(1)\n }\n\n // working color (hsv + alpha): the current swatch + the SV thumb (opaque) + the alpha track base\n const workingColor = formatColor({ ...hsvToRgb(hsv), a: alpha })\n const solidHex = rgbToHex(hsvToRgb(hsv))\n const cur = hsvToRgb(hsv)\n const cpRgb = `${Math.round(cur.r)}, ${Math.round(cur.g)}, ${Math.round(cur.b)}`\n\n return (\n <div className={styles.popover} style={{ '--cp-hue': hsv.h } as CSSProperties}>\n <div\n className={styles.sv}\n onPointerDown={onSvDown}\n onKeyDown={onSvKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.saturation')}\n aria-valuetext={`${Math.round(hsv.s * 100)}% saturation, ${Math.round(hsv.v * 100)}% brightness`}\n >\n <span\n className={styles.svThumb}\n style={{ left: `${hsv.s * 100}%`, top: `${(1 - hsv.v) * 100}%`, background: solidHex }}\n />\n </div>\n\n <div\n className={styles.hue}\n onPointerDown={onHueDown}\n onKeyDown={onHueKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.hue')}\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={Math.round(hsv.h)}\n >\n <span className={styles.hueThumb} style={{ left: `${(hsv.h / 360) * 100}%` }} />\n </div>\n\n <div\n className={styles.alpha}\n onPointerDown={onAlphaDown}\n onKeyDown={onAlphaKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.opacity')}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(alpha * 100)}\n style={{ '--cp-rgb': cpRgb } as CSSProperties}\n >\n <span className={styles.alphaThumb} style={{ left: `${alpha * 100}%` }} />\n </div>\n\n <div className={styles.hexRow}>\n <span\n className={styles.currentSwatch}\n style={{ '--cp-fill': workingColor } as CSSProperties}\n />\n <span className={styles.hexField}>\n <input\n className={styles.hexInput}\n value={colorDraft}\n spellCheck={false}\n maxLength={28}\n aria-label={t('colorPicker.value')}\n onChange={(e) => onColorInput(e.target.value)}\n />\n </span>\n </div>\n\n <div className={styles.swatches}>\n {/* \"no color\" — clears the value (the diagonal-stripe swatch); hidden when not clearable */}\n {clearable && (\n <button\n type=\"button\"\n className={clsx(styles.swatch, styles.swatchClear)}\n aria-label={t('colorPicker.noColor')}\n aria-pressed={!parsed}\n onClick={handleClear}\n >\n {!parsed && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )}\n {swatches.map((sw) => {\n const p = parseColor(sw)\n if (!p) return null\n const swHex = formatColor({ r: p.r, g: p.g, b: p.b, a: 1 })\n const selected = displayValue === swHex\n return (\n <button\n key={sw}\n type=\"button\"\n className={styles.swatch}\n style={{ background: swHex, color: contrastOn(swHex) }}\n aria-label={swHex}\n aria-pressed={selected}\n onClick={() => {\n setHsv(rgbToHsv(p))\n onChange(formatColor({ r: p.r, g: p.g, b: p.b, a: alphaRef.current }))\n }}\n >\n {selected && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"],"names":["clamp01","n","clamp255","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to","rgbToHsv","rn","gn","bn","max","min","d","s","hsvToRgb","v","x","m","hexToHsv","contrastOn","RGB_FUNC","parseColor","a","formatColor","DEFAULT_SWATCHES","FALLBACK_HSV","ColorPickerPanel","value","onChange","swatches","clearable","t","useT","parsed","displayValue","hsv","setHsv","useState","hsvRef","useRef","alpha","setAlpha","alphaRef","useEffect","cur","applyHsv","next","applyAlpha","drag","onMove","event","el","move","clientX","clientY","onPointerMove","e","onPointerUp","onSvDown","y","rect","onHueDown","_y","onAlphaDown","SV_STEP","onSvKey","ns","nv","onHueKey","nh","onAlphaKey","na","colorDraft","setColorDraft","onColorInput","raw","p","handleClear","workingColor","solidHex","cpRgb","jsxs","styles","jsx","clsx","Icon","sw","swHex","selected"],"mappings":"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"}
1
+ {"version":3,"file":"ColorPickerPanel-Dp7bnnVf.js","sources":["../src/components/ColorPicker/colorUtils.ts","../src/components/ColorPicker/ColorPickerPanel.tsx"],"sourcesContent":["/** Color math for the ColorPicker: hex ⇄ rgb ⇄ hsv, plus hex validation. All internal, no deps. */\n\nexport interface HSV {\n /** Hue 0–360 */\n h: number\n /** Saturation 0–1 */\n s: number\n /** Value/brightness 0–1 */\n v: number\n}\n\nexport interface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface RGBA extends RGB {\n /** Alpha 0–1 */\n a: number\n}\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\nconst clamp255 = (n: number): number => Math.min(255, Math.max(0, Math.round(n)))\n\n/** Normalizes any `#rgb`/`#rrggbb` (with or without `#`) 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\n/** RGB (0–255) → HSV. */\nexport function rgbToHsv({ r, g, b }: RGB): HSV {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const d = max - min\n\n let h = 0\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n }\n const s = max === 0 ? 0 : d / max\n return { h, s, v: max }\n}\n\n/** HSV → RGB (0–255). */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0\n let g = 0\n let b = 0\n if (h < 60) [r, g, b] = [c, x, 0]\n else if (h < 120) [r, g, b] = [x, c, 0]\n else if (h < 180) [r, g, b] = [0, c, x]\n else if (h < 240) [r, g, b] = [0, x, c]\n else if (h < 300) [r, g, b] = [x, 0, c]\n else [r, g, b] = [c, 0, x]\n return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 }\n}\n\nexport const hexToHsv = (hex: string): HSV => rgbToHsv(hexToRgb(hex))\nexport const hsvToHex = (hsv: HSV): string => rgbToHex(hsvToRgb(hsv))\n\n/** A readable text/handle color (near-black or white) for sitting on top of a given hex fill. */\nexport function contrastOn(hex: string): string {\n const { r, g, b } = hexToRgb(hex)\n return (r * 299 + g * 587 + b * 114) / 1000 >= 150 ? '#04202b' : '#ffffff'\n}\n\nconst RGB_FUNC =\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i\n\n/**\n * Parses any CSS color the picker understands — `#rgb` / `#rgba` / `#rrggbb` / `#rrggbbaa` hex (with\n * or without `#`), or `rgb()` / `rgba()` (alpha as `0–1` or a `%`) — to `{ r, g, b, a }` (`a` is\n * `0–1`), or `null` when it doesn't match.\n */\nexport function parseColor(input: string): RGBA | null {\n const s = input.trim()\n if (!s) return null\n\n // hex (with or without #) — 3 / 4 / 6 / 8 digits (3 & 4 expand each nibble to a byte)\n let h = s.replace(/^#/, '')\n if (/^[0-9a-fA-F]{3,4}$/.test(h)) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n if (/^[0-9a-fA-F]{6}$/.test(h)) {\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 a: 1,\n }\n }\n if (/^[0-9a-fA-F]{8}$/.test(h)) {\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 a: clamp01(parseInt(h.slice(6, 8), 16) / 255),\n }\n }\n\n // rgb() / rgba()\n const m = s.match(RGB_FUNC)\n if (m) {\n let a = 1\n if (m[4] != null) {\n a = m[4].endsWith('%') ? clamp01(parseFloat(m[4]) / 100) : clamp01(parseFloat(m[4]))\n }\n return { r: clamp255(+m[1]), g: clamp255(+m[2]), b: clamp255(+m[3]), a }\n }\n return null\n}\n\n/**\n * Formats `{ r, g, b, a }` back to a CSS string: `#rrggbb` when fully opaque (`a >= 1`), else\n * `rgba(r, g, b, a)` with alpha rounded to 2 decimals.\n */\nexport function formatColor({ r, g, b, a }: RGBA): string {\n if (a >= 1) return rgbToHex({ r, g, b })\n return `rgba(${clamp255(r)}, ${clamp255(g)}, ${clamp255(b)}, ${Math.round(clamp01(a) * 100) / 100})`\n}\n","import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport {\n clamp01,\n contrastOn,\n formatColor,\n hexToHsv,\n hsvToRgb,\n parseColor,\n rgbToHex,\n rgbToHsv,\n type HSV,\n} from './colorUtils'\nimport styles from './ColorPicker.module.css'\n\n/** A pleasant default palette shown as quick-pick swatches. */\nexport const DEFAULT_SWATCHES = [\n '#13404e',\n '#039aa1',\n '#00a854',\n '#0ea5e9',\n '#6366f1',\n '#7c3aed',\n '#f04134',\n '#f59e0b',\n '#ffbf00',\n '#10b981',\n '#64748b',\n '#0f172a',\n '#ffffff',\n]\n\nconst FALLBACK_HSV: HSV = hexToHsv('#13404e')\n\nexport interface ColorPickerPanelProps {\n /** Current color — a CSS color string (`#rrggbb`, `rgba(...)`, or `''` when unset). */\n value: string\n /** Fires with the next color: `#rrggbb` when opaque, `rgba(r, g, b, a)` when translucent, `''` when cleared. */\n onChange: (color: string) => void\n /** Quick-pick swatches. Defaults to a curated palette. */\n swatches?: string[]\n /** Show the leading \"no color\" swatch that clears the value. Defaults to `true`. */\n clearable?: boolean\n}\n\n/**\n * The color-picking surface — a saturation/value square, hue + alpha sliders, a color input and\n * quick-pick swatches. Controlled by a single color `string` (`value` / `onChange`), so it drops into\n * any popover. Working state is kept as HSV + alpha (hue survives dragging at grey/black), re-derived\n * from `value` only on external changes. Used by `ColorPicker` (the field) and the `RichTextEditor`\n * text-color control. Token-styled except the spectrum gradients + alpha checkerboard (literal colors).\n */\nexport function ColorPickerPanel({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n clearable = true,\n}: ColorPickerPanelProps) {\n const t = useT()\n const parsed = parseColor(value || '')\n // canonical string for the value (`#rrggbb` when opaque, `rgba(...)` when not), null when unset\n const displayValue = parsed ? formatColor(parsed) : null\n\n // working HSV + alpha (HSV keeps hue stable while dragging at grey/black; alpha is the opacity)\n const [hsv, setHsv] = useState<HSV>(parsed ? rgbToHsv(parsed) : FALLBACK_HSV)\n const hsvRef = useRef(hsv)\n hsvRef.current = hsv\n const [alpha, setAlpha] = useState<number>(parsed?.a ?? 1)\n const alphaRef = useRef(alpha)\n alphaRef.current = alpha\n\n // re-derive HSV + alpha only when the value changes from OUTSIDE our own edits (prop/preset/input)\n useEffect(() => {\n if (!parsed) return\n const cur = formatColor({ ...hsvToRgb(hsvRef.current), a: alphaRef.current })\n if (displayValue !== cur) {\n setHsv(rgbToHsv(parsed))\n setAlpha(parsed.a)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [displayValue])\n\n const applyHsv = (next: HSV) => {\n setHsv(next)\n onChange(formatColor({ ...hsvToRgb(next), a: alphaRef.current }))\n }\n\n const applyAlpha = (next: number) => {\n setAlpha(next)\n onChange(formatColor({ ...hsvToRgb(hsvRef.current), a: next }))\n }\n\n // drag (SV square + hue/alpha sliders)\n const drag =\n (onMove: (clientX: number, clientY: number, rect: DOMRect) => void) =>\n (event: ReactPointerEvent<HTMLDivElement>) => {\n event.preventDefault()\n const el = event.currentTarget\n const move = (clientX: number, clientY: number) =>\n onMove(clientX, clientY, el.getBoundingClientRect())\n move(event.clientX, event.clientY)\n const onPointerMove = (e: PointerEvent) => move(e.clientX, e.clientY)\n const onPointerUp = () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n }\n\n const onSvDown = drag((x, y, rect) => {\n const s = clamp01((x - rect.left) / rect.width)\n const v = clamp01(1 - (y - rect.top) / rect.height)\n applyHsv({ ...hsvRef.current, s, v })\n })\n\n const onHueDown = drag((x, _y, rect) => {\n const h = clamp01((x - rect.left) / rect.width) * 360\n applyHsv({ ...hsvRef.current, h })\n })\n\n const onAlphaDown = drag((x, _y, rect) => {\n applyAlpha(clamp01((x - rect.left) / rect.width))\n })\n\n // keyboard control — arrows nudge, Home/End jump to the extents (mirrors Calendar/TimeColumns a11y)\n const SV_STEP = 0.01\n const onSvKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h, s, v } = hsvRef.current\n let ns = s\n let nv = v\n switch (event.key) {\n case 'ArrowLeft':\n ns = clamp01(s - SV_STEP)\n break\n case 'ArrowRight':\n ns = clamp01(s + SV_STEP)\n break\n case 'ArrowUp':\n nv = clamp01(v + SV_STEP)\n break\n case 'ArrowDown':\n nv = clamp01(v - SV_STEP)\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ h, s: ns, v: nv })\n }\n const onHueKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const { h } = hsvRef.current\n let nh = h\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n nh = Math.max(0, h - 1)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n nh = Math.min(360, h + 1)\n break\n case 'Home':\n nh = 0\n break\n case 'End':\n nh = 360\n break\n default:\n return\n }\n event.preventDefault()\n applyHsv({ ...hsvRef.current, h: nh })\n }\n const onAlphaKey = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n let na = alphaRef.current\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n na = clamp01(alphaRef.current - 0.01)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n na = clamp01(alphaRef.current + 0.01)\n break\n case 'Home':\n na = 0\n break\n case 'End':\n na = 1\n break\n default:\n return\n }\n event.preventDefault()\n applyAlpha(na)\n }\n\n // color input (accepts hex / rgb() / rgba()) + clear\n const [colorDraft, setColorDraft] = useState('')\n useEffect(() => {\n setColorDraft(displayValue ?? '')\n }, [displayValue])\n\n const onColorInput = (raw: string) => {\n setColorDraft(raw)\n const p = parseColor(raw)\n if (p) {\n setHsv(rgbToHsv(p))\n setAlpha(p.a)\n onChange(formatColor(p))\n }\n }\n\n const handleClear = () => {\n onChange('')\n setHsv(FALLBACK_HSV)\n setAlpha(1)\n }\n\n // working color (hsv + alpha): the current swatch + the SV thumb (opaque) + the alpha track base\n const workingColor = formatColor({ ...hsvToRgb(hsv), a: alpha })\n const solidHex = rgbToHex(hsvToRgb(hsv))\n const cur = hsvToRgb(hsv)\n const cpRgb = `${Math.round(cur.r)}, ${Math.round(cur.g)}, ${Math.round(cur.b)}`\n\n return (\n <div className={styles.popover} style={{ '--cp-hue': hsv.h } as CSSProperties}>\n <div\n className={styles.sv}\n onPointerDown={onSvDown}\n onKeyDown={onSvKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.saturation')}\n aria-valuetext={`${Math.round(hsv.s * 100)}% saturation, ${Math.round(hsv.v * 100)}% brightness`}\n >\n <span\n className={styles.svThumb}\n style={{ left: `${hsv.s * 100}%`, top: `${(1 - hsv.v) * 100}%`, background: solidHex }}\n />\n </div>\n\n <div\n className={styles.hue}\n onPointerDown={onHueDown}\n onKeyDown={onHueKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.hue')}\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={Math.round(hsv.h)}\n >\n <span className={styles.hueThumb} style={{ left: `${(hsv.h / 360) * 100}%` }} />\n </div>\n\n <div\n className={styles.alpha}\n onPointerDown={onAlphaDown}\n onKeyDown={onAlphaKey}\n role=\"slider\"\n tabIndex={0}\n aria-label={t('colorPicker.opacity')}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(alpha * 100)}\n style={{ '--cp-rgb': cpRgb } as CSSProperties}\n >\n <span className={styles.alphaThumb} style={{ left: `${alpha * 100}%` }} />\n </div>\n\n <div className={styles.hexRow}>\n <span\n className={styles.currentSwatch}\n style={{ '--cp-fill': workingColor } as CSSProperties}\n />\n <span className={styles.hexField}>\n <input\n className={styles.hexInput}\n value={colorDraft}\n spellCheck={false}\n maxLength={28}\n aria-label={t('colorPicker.value')}\n onChange={(e) => onColorInput(e.target.value)}\n />\n </span>\n </div>\n\n <div className={styles.swatches}>\n {/* \"no color\" — clears the value (the diagonal-stripe swatch); hidden when not clearable */}\n {clearable && (\n <button\n type=\"button\"\n className={clsx(styles.swatch, styles.swatchClear)}\n aria-label={t('colorPicker.noColor')}\n aria-pressed={!parsed}\n onClick={handleClear}\n >\n {!parsed && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )}\n {swatches.map((sw) => {\n const p = parseColor(sw)\n if (!p) return null\n const swHex = formatColor({ r: p.r, g: p.g, b: p.b, a: 1 })\n const selected = displayValue === swHex\n return (\n <button\n key={sw}\n type=\"button\"\n className={styles.swatch}\n style={{ background: swHex, color: contrastOn(swHex) }}\n aria-label={swHex}\n aria-pressed={selected}\n onClick={() => {\n setHsv(rgbToHsv(p))\n onChange(formatColor({ r: p.r, g: p.g, b: p.b, a: alphaRef.current }))\n }}\n >\n {selected && <Icon name=\"TickCircle\" size=\"sm\" />}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"],"names":["clamp01","n","clamp255","normalizeHex","input","h","c","hexToRgb","hex","rgbToHex","r","g","b","to","rgbToHsv","rn","gn","bn","max","min","d","s","hsvToRgb","v","x","m","hexToHsv","contrastOn","RGB_FUNC","parseColor","a","formatColor","DEFAULT_SWATCHES","FALLBACK_HSV","ColorPickerPanel","value","onChange","swatches","clearable","t","useT","parsed","displayValue","hsv","setHsv","useState","hsvRef","useRef","alpha","setAlpha","alphaRef","useEffect","cur","applyHsv","next","applyAlpha","drag","onMove","event","el","move","clientX","clientY","onPointerMove","e","onPointerUp","onSvDown","y","rect","onHueDown","_y","onAlphaDown","SV_STEP","onSvKey","ns","nv","onHueKey","nh","onAlphaKey","na","colorDraft","setColorDraft","onColorInput","raw","p","handleClear","workingColor","solidHex","cpRgb","jsxs","styles","jsx","clsx","Icon","sw","swHex","selected"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const be=require("react/jsx-runtime"),a=require("react"),Ce=require("./breakpoints-Dpnh6BbG.cjs"),ne=require("./translations-CXEeeUDL.cjs"),b=require("./messages-DKT0SRM0.cjs");function _e(e){let s=e.trim().replace(/^#/,"");s.length===3&&(s=s[0]+s[0]+s[1]+s[1]+s[2]+s[2]);const n=parseInt(s,16);return`${n>>16&255}, ${n>>8&255}, ${n&255}`}function Le(e){const[s,n,u]=e.split(",").map(L=>Number(L.trim()));return(s*299+n*587+u*114)/1e3>=150?"#04202b":"#ffffff"}const ke={secondary:"rgb(var(--tz-color-primary-rgb))",warning:"#ffffff"};function re(e,s=document.documentElement){for(const[n,u]of Object.entries(e)){if(!u)continue;const r=_e(u);s.style.setProperty(`--tz-color-${n}-rgb`,r),s.style.setProperty(`--tz-color-${n}-contrast`,ke[n]??Le(r))}}const o=a.createContext(null),oe="tz-theme-mode",C=e=>`tz-accent-color-${e}`,ue="tz-header-sticky",le="tz-font-family",ce="tz-shape",de="tz-locale",me=[{code:"en-US",label:"English"}],_="Inter",Ie=[_],fe=e=>`'${e}', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`;function Fe(){if(typeof document>"u"||document.getElementById("tz-font-preconnect"))return;const e=document.createElement("link");e.id="tz-font-preconnect",e.rel="preconnect",e.href="https://fonts.googleapis.com",document.head.appendChild(e);const s=document.createElement("link");s.rel="preconnect",s.href="https://fonts.gstatic.com",s.crossOrigin="anonymous",document.head.appendChild(s)}function Ke(e){if(typeof document>"u"||Ie.includes(e))return;const s=`tz-font-${e.trim().replace(/\s+/g,"-").toLowerCase()}`;if(document.getElementById(s))return;Fe();const n=document.createElement("link");n.id=s,n.rel="stylesheet",n.href=`https://fonts.googleapis.com/css2?family=${encodeURIComponent(e.trim()).replace(/%20/g,"+")}&display=swap`,document.head.appendChild(n)}const I="tab",f="nestedTab",F="step",ye=[],pe={},Ee={},Ue={primary:"#13404e",secondary:"#ffffff",background:"#f9f9f9",surface:"#ffffff",accent:"#056472",success:"#00a854",error:"#f04134",info:"#039aa1",warning:"#ffbf00"},Re={primary:"#e6e8eb",secondary:"#191919",background:"#0f0f0f",surface:"#191919",accent:"#16a6b4",success:"#00a854",error:"#f04134",info:"#039aa1",warning:"#ffbf00"};function Ne(e){const s=localStorage.getItem(oe);return s==="light"||s==="dark"?s:e}function Qe(){return{light:localStorage.getItem(C("light"))||null,dark:localStorage.getItem(C("dark"))||null}}function Ye(e){const s=localStorage.getItem(ue);return s==="1"?!0:s==="0"?!1:e}function De(e){return localStorage.getItem(le)||e}function Oe(e){const s=localStorage.getItem(ce);return s==="rounded"||s==="square"?s:e}function Me(e,s){const n=e.map(r=>r.code),u=localStorage.getItem(de);return u&&n.includes(u)?u:s&&n.includes(s)?s:n.find(r=>r.toLowerCase().startsWith("en"))??n[0]??"en-US"}function Pe({config:e,children:s}){var j,J,V,W,X,Z,ee,te,se,ae;const[n,u]=a.useState(()=>{var t;return Ne(((t=e==null?void 0:e.theme)==null?void 0:t.mode)??"light")}),[r,L]=a.useState(Qe),[K,Te]=a.useState(()=>{var t;return Ye(((t=e==null?void 0:e.header)==null?void 0:t.sticky)??!1)}),[E,ie]=a.useState(()=>{var t;return De(((t=e==null?void 0:e.theme)==null?void 0:t.fontFamily)??_)}),[T,Se]=a.useState(()=>{var t;return Oe(((t=e==null?void 0:e.theme)==null?void 0:t.shape)??"rounded")}),k=((j=e==null?void 0:e.i18n)==null?void 0:j.languages)??me,U=(J=e==null?void 0:e.i18n)==null?void 0:J.messages,R=(V=e==null?void 0:e.i18n)==null?void 0:V.appMessages,[m,he]=a.useState(()=>{var t;return Me(k,(t=e==null?void 0:e.i18n)==null?void 0:t.language)}),c=(W=e==null?void 0:e.theme)==null?void 0:W.colors,p=a.useMemo(()=>{const t={...Ue,...c==null?void 0:c.light},l={...t,...Re,...c==null?void 0:c.dark};return{light:t,dark:l}},[c]),N=a.useMemo(()=>({light:p.light.accent,dark:p.dark.accent}),[p]),y=a.useCallback((t,l=r[t])=>{const d=p[t];re(l?{...d,accent:l}:d);const A=document.documentElement;A.setAttribute("data-tz-theme",t),A.style.setProperty("color-scheme",t),localStorage.setItem(oe,t)},[p,r]);a.useLayoutEffect(()=>{y(n)},[y,n]);const Q=(X=e==null?void 0:e.theme)==null?void 0:X.breakpoints;a.useLayoutEffect(()=>{Ce.setBreakpoints(Q)},[JSON.stringify(Q??null)]);const i=a.useCallback(t=>{y(t),u(t)},[y]),Y=a.useCallback(()=>i(n==="light"?"dark":"light"),[n,i]),D=a.useCallback((t,l)=>{const d=l??n;L(A=>({...A,[d]:t})),t?localStorage.setItem(C(d),t):localStorage.removeItem(C(d)),d===n&&y(n,t)},[n,y]),O=a.useCallback(t=>{Te(t),localStorage.setItem(ue,t?"1":"0")},[]),S=a.useCallback(t=>{Ke(t),document.documentElement.style.setProperty("--tz-font-family",fe(t))},[]);a.useLayoutEffect(()=>{S(E)},[S,E]);const M=a.useCallback(t=>{const l=t.trim()||_;S(l),ie(l),localStorage.setItem(le,l)},[S]),h=a.useCallback(t=>{document.documentElement.setAttribute("data-tz-shape",t)},[]);a.useLayoutEffect(()=>{h(T)},[h,T]);const P=a.useCallback(t=>{h(t),Se(t),localStorage.setItem(ce,t)},[h]),g=a.useCallback(t=>{he(t),localStorage.setItem(de,t)},[]),z=a.useMemo(()=>b.createTranslator(m,U),[m,U]),B=a.useMemo(()=>b.createAppTranslator(m,R),[m,R]),v=(e==null?void 0:e.locales)??ye,H=((Z=e==null?void 0:e.keys)==null?void 0:Z.translationsNamespace)??ne.DEFAULT_TRANSLATIONS_NAMESPACE,q=((ee=e==null?void 0:e.keys)==null?void 0:ee.tabQueryKey)??I,w=((te=e==null?void 0:e.keys)==null?void 0:te.nestedTabQueryKey)??f,$=((se=e==null?void 0:e.keys)==null?void 0:se.stepQueryKey)??F,G=((ae=e==null?void 0:e.table)==null?void 0:ae.query)??pe,x=(e==null?void 0:e.header)??Ee,Ae=a.useMemo(()=>({mode:n,setMode:i,toggleMode:Y,accentColors:r,defaultAccentColors:N,setAccentColor:D,locales:v,translationsNamespace:H,tabQueryKey:q,nestedTabQueryKey:w,stepQueryKey:$,tableQuery:G,header:x,headerSticky:K,setHeaderSticky:O,fontFamily:E,setFontFamily:M,shape:T,setShape:P,language:m,setLanguage:g,languages:k,t:z,appT:B}),[n,i,Y,r,N,D,v,H,q,w,$,G,x,K,O,E,M,T,P,m,g,k,z,B]);return be.jsx(o.Provider,{value:Ae,children:s})}function ge(){const e=a.useContext(o);if(!e)throw new Error("useTheme must be used within a <ConfigProvider>");return e}function ze(){var e;return((e=a.useContext(o))==null?void 0:e.locales)??ye}const Be=b.createTranslator("en"),ve=b.createAppTranslator("en");function He(){var e;return((e=a.useContext(o))==null?void 0:e.t)??Be}function qe(){var e;return((e=a.useContext(o))==null?void 0:e.appT)??ve}function we(){const e=a.useContext(o);return{language:(e==null?void 0:e.language)??"en-US",setLanguage:(e==null?void 0:e.setLanguage)??(()=>{}),languages:(e==null?void 0:e.languages)??me}}function $e(){var e;return((e=a.useContext(o))==null?void 0:e.translationsNamespace)??ne.DEFAULT_TRANSLATIONS_NAMESPACE}function Ge(){var e;return((e=a.useContext(o))==null?void 0:e.tabQueryKey)??I}function xe(){var e;return((e=a.useContext(o))==null?void 0:e.nestedTabQueryKey)??f}function je(){var e;return((e=a.useContext(o))==null?void 0:e.stepQueryKey)??F}function Je(){var e;return((e=a.useContext(o))==null?void 0:e.tableQuery)??pe}function Ve(){var e;return((e=a.useContext(o))==null?void 0:e.header)??Ee}exports.ConfigProvider=Pe;exports.DEFAULT_FONT_FAMILY=_;exports.DEFAULT_NESTED_TAB_QUERY_KEY=f;exports.DEFAULT_STEP_QUERY_KEY=F;exports.DEFAULT_TABS_QUERY_KEY=I;exports.applyTheme=re;exports.useHeaderConfig=Ve;exports.useLanguage=we;exports.useLocales=ze;exports.useNestedTabQueryKey=xe;exports.useStepQueryKey=je;exports.useT=He;exports.useTableQueryConfig=Je;exports.useTabsQueryKey=Ge;exports.useTheme=ge;exports.useTranslations=qe;exports.useTranslationsNamespace=$e;
2
+ //# sourceMappingURL=ConfigProvider-Bszl3Wr3.cjs.map