@techzyapp/ui-library 1.0.8 → 1.0.10
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.
- package/dist/{Alert-BL8hDdEl.js → Alert-B3rDvpbO.js} +3 -3
- package/dist/{Alert-BL8hDdEl.js.map → Alert-B3rDvpbO.js.map} +1 -1
- package/dist/{Alert-C9yBIMq0.cjs → Alert-D99G0StL.cjs} +2 -2
- package/dist/{Alert-C9yBIMq0.cjs.map → Alert-D99G0StL.cjs.map} +1 -1
- package/dist/AuthLayout-DGCe90w0.js +43 -0
- package/dist/AuthLayout-DGCe90w0.js.map +1 -0
- package/dist/AuthLayout-pvqB9w-B.cjs +2 -0
- package/dist/AuthLayout-pvqB9w-B.cjs.map +1 -0
- package/dist/{Breadcrumbs-DhBx2UgK.cjs → Breadcrumbs-BnxhmyK5.cjs} +2 -2
- package/dist/{Breadcrumbs-DhBx2UgK.cjs.map → Breadcrumbs-BnxhmyK5.cjs.map} +1 -1
- package/dist/{Breadcrumbs-BC_QSlJZ.js → Breadcrumbs-DvgctFLS.js} +3 -3
- package/dist/{Breadcrumbs-BC_QSlJZ.js.map → Breadcrumbs-DvgctFLS.js.map} +1 -1
- package/dist/{Button-BT8XmR_T.js → Button-CUsXYM-m.js} +2 -2
- package/dist/{Button-BT8XmR_T.js.map → Button-CUsXYM-m.js.map} +1 -1
- package/dist/{Button-C_HPI97g.cjs → Button-Cj6pckNl.cjs} +2 -2
- package/dist/{Button-C_HPI97g.cjs.map → Button-Cj6pckNl.cjs.map} +1 -1
- package/dist/{Calendar-CCCife5b.cjs → Calendar-Br4C0x0n.cjs} +2 -2
- package/dist/{Calendar-CCCife5b.cjs.map → Calendar-Br4C0x0n.cjs.map} +1 -1
- package/dist/{Calendar-B9mXn_zD.js → Calendar-CE_9WNAB.js} +3 -3
- package/dist/{Calendar-B9mXn_zD.js.map → Calendar-CE_9WNAB.js.map} +1 -1
- package/dist/{Card-DfVntHqn.cjs → Card-DD9SWHzZ.cjs} +2 -2
- package/dist/{Card-DfVntHqn.cjs.map → Card-DD9SWHzZ.cjs.map} +1 -1
- package/dist/{Card-DHPAefzg.js → Card-DhpudGvF.js} +2 -2
- package/dist/{Card-DHPAefzg.js.map → Card-DhpudGvF.js.map} +1 -1
- package/dist/{Chip-BoHt3WYS.cjs → Chip-B2lY4TJ0.cjs} +2 -2
- package/dist/{Chip-BoHt3WYS.cjs.map → Chip-B2lY4TJ0.cjs.map} +1 -1
- package/dist/{Chip-DX3QECcs.js → Chip-DulHqhuf.js} +2 -2
- package/dist/{Chip-DX3QECcs.js.map → Chip-DulHqhuf.js.map} +1 -1
- package/dist/{CodeBlock-CPWEOym2.js → CodeBlock-DwBMghs2.js} +3 -3
- package/dist/{CodeBlock-CPWEOym2.js.map → CodeBlock-DwBMghs2.js.map} +1 -1
- package/dist/{CodeBlock-DKhIGQBg.cjs → CodeBlock-EhB7v9-R.cjs} +2 -2
- package/dist/{CodeBlock-DKhIGQBg.cjs.map → CodeBlock-EhB7v9-R.cjs.map} +1 -1
- package/dist/{ColorPicker-2qD8vZkR.js → ColorPicker-DJgTeHht.js} +3 -3
- package/dist/{ColorPicker-2qD8vZkR.js.map → ColorPicker-DJgTeHht.js.map} +1 -1
- package/dist/{ColorPicker-BAJWvC3h.cjs → ColorPicker-Dc1y9Zuu.cjs} +2 -2
- package/dist/{ColorPicker-BAJWvC3h.cjs.map → ColorPicker-Dc1y9Zuu.cjs.map} +1 -1
- package/dist/{ColorPickerPanel-CovWDIRt.js → ColorPickerPanel-9tOQUL38.js} +2 -2
- package/dist/{ColorPickerPanel-CovWDIRt.js.map → ColorPickerPanel-9tOQUL38.js.map} +1 -1
- package/dist/{ColorPickerPanel-CkB2pNnX.cjs → ColorPickerPanel-nXEliruE.cjs} +2 -2
- package/dist/{ColorPickerPanel-CkB2pNnX.cjs.map → ColorPickerPanel-nXEliruE.cjs.map} +1 -1
- package/dist/{ConfigProvider-DFy6pL-C.cjs → ConfigProvider-BHNx-NHV.cjs} +2 -2
- package/dist/{ConfigProvider-DFy6pL-C.cjs.map → ConfigProvider-BHNx-NHV.cjs.map} +1 -1
- package/dist/{ConfigProvider-sEZzNTeU.js → ConfigProvider-BYruQYHC.js} +2 -2
- package/dist/{ConfigProvider-sEZzNTeU.js.map → ConfigProvider-BYruQYHC.js.map} +1 -1
- package/dist/CopyButton-B4-OYsYr.js +31 -0
- package/dist/CopyButton-B4-OYsYr.js.map +1 -0
- package/dist/CopyButton-D_DCLHhb.cjs +2 -0
- package/dist/CopyButton-D_DCLHhb.cjs.map +1 -0
- package/dist/{DatePicker-TLaQ3ZyB.cjs → DatePicker-CEczjGZy.cjs} +2 -2
- package/dist/{DatePicker-TLaQ3ZyB.cjs.map → DatePicker-CEczjGZy.cjs.map} +1 -1
- package/dist/{DatePicker-BVHriq5B.js → DatePicker-DkvfSN1K.js} +4 -4
- package/dist/{DatePicker-BVHriq5B.js.map → DatePicker-DkvfSN1K.js.map} +1 -1
- package/dist/{DateTimePicker-Dq2jJ2yb.cjs → DateTimePicker-CDyGxUBX.cjs} +2 -2
- package/dist/{DateTimePicker-Dq2jJ2yb.cjs.map → DateTimePicker-CDyGxUBX.cjs.map} +1 -1
- package/dist/{DateTimePicker-BWxsgyGB.js → DateTimePicker-DPomyrnN.js} +7 -7
- package/dist/{DateTimePicker-BWxsgyGB.js.map → DateTimePicker-DPomyrnN.js.map} +1 -1
- package/dist/{EmptyState-B2WgeL-H.cjs → EmptyState-B77utgEn.cjs} +2 -2
- package/dist/{EmptyState-B2WgeL-H.cjs.map → EmptyState-B77utgEn.cjs.map} +1 -1
- package/dist/{EmptyState-D8eUxb8v.js → EmptyState-CVyFXprK.js} +2 -2
- package/dist/{EmptyState-D8eUxb8v.js.map → EmptyState-CVyFXprK.js.map} +1 -1
- package/dist/FileCard-Cpc5frNm.js +148 -0
- package/dist/FileCard-Cpc5frNm.js.map +1 -0
- package/dist/FileCard-CsGW2sxE.cjs +2 -0
- package/dist/FileCard-CsGW2sxE.cjs.map +1 -0
- package/dist/{FileUploader-I0G-2WSe.js → FileUploader-B_nKMh_K.js} +5 -5
- package/dist/{FileUploader-I0G-2WSe.js.map → FileUploader-B_nKMh_K.js.map} +1 -1
- package/dist/{FileUploader-qsnWX-i5.cjs → FileUploader-DDi_uzIx.cjs} +2 -2
- package/dist/{FileUploader-qsnWX-i5.cjs.map → FileUploader-DDi_uzIx.cjs.map} +1 -1
- package/dist/{Flag-Bxl1Pa9m.cjs → Flag-BJLWKB9J.cjs} +2 -2
- package/dist/{Flag-Bxl1Pa9m.cjs.map → Flag-BJLWKB9J.cjs.map} +1 -1
- package/dist/{Flag-CvIo_Eqp.js → Flag-Ck1xK22A.js} +2 -2
- package/dist/{Flag-CvIo_Eqp.js.map → Flag-Ck1xK22A.js.map} +1 -1
- package/dist/{FullscreenToggle-CRMGYmB8.js → FullscreenToggle-DmC0jTay.js} +3 -3
- package/dist/{FullscreenToggle-CRMGYmB8.js.map → FullscreenToggle-DmC0jTay.js.map} +1 -1
- package/dist/{FullscreenToggle-CEOkPSLp.cjs → FullscreenToggle-MCxGzAEe.cjs} +2 -2
- package/dist/{FullscreenToggle-CEOkPSLp.cjs.map → FullscreenToggle-MCxGzAEe.cjs.map} +1 -1
- package/dist/{IconButton-BZ2jJn_T.js → IconButton-B8FPGgDn.js} +2 -2
- package/dist/{IconButton-BZ2jJn_T.js.map → IconButton-B8FPGgDn.js.map} +1 -1
- package/dist/{IconButton-ChUfK0pG.cjs → IconButton-BoY2y_pV.cjs} +2 -2
- package/dist/{IconButton-ChUfK0pG.cjs.map → IconButton-BoY2y_pV.cjs.map} +1 -1
- package/dist/{Loader-plA9fgHf.cjs → Loader-Cwb1bOHj.cjs} +2 -2
- package/dist/{Loader-plA9fgHf.cjs.map → Loader-Cwb1bOHj.cjs.map} +1 -1
- package/dist/{Loader-DFlpw5Zc.js → Loader-UzzqvFyo.js} +2 -2
- package/dist/{Loader-DFlpw5Zc.js.map → Loader-UzzqvFyo.js.map} +1 -1
- package/dist/Masonry-9LrJKlhI.cjs +2 -0
- package/dist/Masonry-9LrJKlhI.cjs.map +1 -0
- package/dist/Masonry-BsRWG-oN.js +92 -0
- package/dist/Masonry-BsRWG-oN.js.map +1 -0
- package/dist/{Modal-BaieUdge.cjs → Modal-CO3c3sGY.cjs} +2 -2
- package/dist/{Modal-BaieUdge.cjs.map → Modal-CO3c3sGY.cjs.map} +1 -1
- package/dist/{Modal-CRH_i5uU.js → Modal-XMRDPHvQ.js} +3 -3
- package/dist/{Modal-CRH_i5uU.js.map → Modal-XMRDPHvQ.js.map} +1 -1
- package/dist/{MultiSelect-BmkzNHTE.js → MultiSelect-BPLctumx.js} +4 -4
- package/dist/{MultiSelect-BmkzNHTE.js.map → MultiSelect-BPLctumx.js.map} +1 -1
- package/dist/{MultiSelect-Cb-N8GIs.cjs → MultiSelect-DVOVHuIm.cjs} +2 -2
- package/dist/{MultiSelect-Cb-N8GIs.cjs.map → MultiSelect-DVOVHuIm.cjs.map} +1 -1
- package/dist/{NumberField-DBwNn3-f.cjs → NumberField-BH237Vt2.cjs} +2 -2
- package/dist/{NumberField-DBwNn3-f.cjs.map → NumberField-BH237Vt2.cjs.map} +1 -1
- package/dist/{NumberField-D71JI2Wv.js → NumberField-X2HsSpu9.js} +3 -3
- package/dist/{NumberField-D71JI2Wv.js.map → NumberField-X2HsSpu9.js.map} +1 -1
- package/dist/{OtpField-DOz-JmuX.js → OtpField-CB05q0NX.js} +2 -2
- package/dist/{OtpField-DOz-JmuX.js.map → OtpField-CB05q0NX.js.map} +1 -1
- package/dist/{OtpField-C-SiHxKa.cjs → OtpField-CXP59zM2.cjs} +2 -2
- package/dist/{OtpField-C-SiHxKa.cjs.map → OtpField-CXP59zM2.cjs.map} +1 -1
- package/dist/{PageLayout-qF5ThZKO.cjs → PageLayout-CuVuZEbR.cjs} +2 -2
- package/dist/{PageLayout-qF5ThZKO.cjs.map → PageLayout-CuVuZEbR.cjs.map} +1 -1
- package/dist/{PageLayout-BIdgUKsN.js → PageLayout-WKWnj5cw.js} +2 -2
- package/dist/{PageLayout-BIdgUKsN.js.map → PageLayout-WKWnj5cw.js.map} +1 -1
- package/dist/{PageNotFound-CsgH9tY0.js → PageNotFound-CmT-Wr9m.js} +5 -5
- package/dist/{PageNotFound-CsgH9tY0.js.map → PageNotFound-CmT-Wr9m.js.map} +1 -1
- package/dist/{PageNotFound-DObWgQ0Z.cjs → PageNotFound-CxLUFoJa.cjs} +2 -2
- package/dist/{PageNotFound-DObWgQ0Z.cjs.map → PageNotFound-CxLUFoJa.cjs.map} +1 -1
- package/dist/{Pagination-Kj7ZDi3N.js → Pagination-BuP4N1bj.js} +2 -2
- package/dist/{Pagination-Kj7ZDi3N.js.map → Pagination-BuP4N1bj.js.map} +1 -1
- package/dist/{Pagination-S3hENjDy.cjs → Pagination-Dcs_Znx3.cjs} +2 -2
- package/dist/{Pagination-S3hENjDy.cjs.map → Pagination-Dcs_Znx3.cjs.map} +1 -1
- package/dist/{RemoveDialog-BZ0gUf1p.cjs → RemoveDialog-Cwtq9wAt.cjs} +2 -2
- package/dist/{RemoveDialog-BZ0gUf1p.cjs.map → RemoveDialog-Cwtq9wAt.cjs.map} +1 -1
- package/dist/{RemoveDialog-D9a0GttZ.js → RemoveDialog-DU6MqkO8.js} +4 -4
- package/dist/{RemoveDialog-D9a0GttZ.js.map → RemoveDialog-DU6MqkO8.js.map} +1 -1
- package/dist/{RichTextEditor-BX6twJ9D.cjs → RichTextEditor-GxbnzLRe.cjs} +2 -2
- package/dist/{RichTextEditor-BX6twJ9D.cjs.map → RichTextEditor-GxbnzLRe.cjs.map} +1 -1
- package/dist/{RichTextEditor-D05Czeif.js → RichTextEditor-k-NlWb4Y.js} +7 -7
- package/dist/{RichTextEditor-D05Czeif.js.map → RichTextEditor-k-NlWb4Y.js.map} +1 -1
- package/dist/{RootLayout-BR_pPr3d.cjs → RootLayout-4GV6dfdB.cjs} +2 -2
- package/dist/{RootLayout-BR_pPr3d.cjs.map → RootLayout-4GV6dfdB.cjs.map} +1 -1
- package/dist/{RootLayout-CgI03ZNA.js → RootLayout-BPSWgWlI.js} +11 -11
- package/dist/{RootLayout-CgI03ZNA.js.map → RootLayout-BPSWgWlI.js.map} +1 -1
- package/dist/{Select-BZPA2Ytp.js → Select-D7KJ-YMU.js} +3 -3
- package/dist/{Select-BZPA2Ytp.js.map → Select-D7KJ-YMU.js.map} +1 -1
- package/dist/{Select-Dpl8dq_9.cjs → Select-DjMZec8c.cjs} +2 -2
- package/dist/{Select-Dpl8dq_9.cjs.map → Select-DjMZec8c.cjs.map} +1 -1
- package/dist/{Sidebar-6SAObU0u.cjs → Sidebar-CT_NUo_7.cjs} +2 -2
- package/dist/{Sidebar-6SAObU0u.cjs.map → Sidebar-CT_NUo_7.cjs.map} +1 -1
- package/dist/{Sidebar-DEBW6lDA.js → Sidebar-Csd3iKbS.js} +3 -3
- package/dist/{Sidebar-DEBW6lDA.js.map → Sidebar-Csd3iKbS.js.map} +1 -1
- package/dist/{SpeedDial-Dex0rF2z.cjs → SpeedDial-CyiPagdu.cjs} +2 -2
- package/dist/{SpeedDial-Dex0rF2z.cjs.map → SpeedDial-CyiPagdu.cjs.map} +1 -1
- package/dist/{SpeedDial-C3PnANAx.js → SpeedDial-DEWzAGXi.js} +2 -2
- package/dist/{SpeedDial-C3PnANAx.js.map → SpeedDial-DEWzAGXi.js.map} +1 -1
- package/dist/{Stepper-0e90ZJaw.js → Stepper-CS6s0dMF.js} +2 -2
- package/dist/{Stepper-0e90ZJaw.js.map → Stepper-CS6s0dMF.js.map} +1 -1
- package/dist/{Stepper-yKwUaxOU.cjs → Stepper-PW7c45PV.cjs} +2 -2
- package/dist/{Stepper-yKwUaxOU.cjs.map → Stepper-PW7c45PV.cjs.map} +1 -1
- package/dist/{Table-BekBXEnW.cjs → Table-C_Ov-kvK.cjs} +2 -2
- package/dist/{Table-BekBXEnW.cjs.map → Table-C_Ov-kvK.cjs.map} +1 -1
- package/dist/{Table-KEOUL2u3.js → Table-IIAKXYOh.js} +15 -15
- package/dist/{Table-KEOUL2u3.js.map → Table-IIAKXYOh.js.map} +1 -1
- package/dist/{Tabs-DYUS945Y.cjs → Tabs-CaHTJ99w.cjs} +2 -2
- package/dist/{Tabs-DYUS945Y.cjs.map → Tabs-CaHTJ99w.cjs.map} +1 -1
- package/dist/{Tabs-BHk2B50R.js → Tabs-D3wztVB1.js} +2 -2
- package/dist/{Tabs-BHk2B50R.js.map → Tabs-D3wztVB1.js.map} +1 -1
- package/dist/{TagsField-DKh9SbG5.cjs → TagsField-BQIwSX5m.cjs} +2 -2
- package/dist/{TagsField-DKh9SbG5.cjs.map → TagsField-BQIwSX5m.cjs.map} +1 -1
- package/dist/{TagsField-BkC5OmIT.js → TagsField-BR9Z5pik.js} +4 -4
- package/dist/{TagsField-BkC5OmIT.js.map → TagsField-BR9Z5pik.js.map} +1 -1
- package/dist/{TextField-12HcFD7u.js → TextField-Bg4TwkVD.js} +3 -3
- package/dist/{TextField-12HcFD7u.js.map → TextField-Bg4TwkVD.js.map} +1 -1
- package/dist/{TextField-C9cPPP-B.cjs → TextField-fmt7aacg.cjs} +2 -2
- package/dist/{TextField-C9cPPP-B.cjs.map → TextField-fmt7aacg.cjs.map} +1 -1
- package/dist/{ThemeToggle-DIXVvqZ7.cjs → ThemeToggle-Cz5I2-DL.cjs} +2 -2
- package/dist/{ThemeToggle-DIXVvqZ7.cjs.map → ThemeToggle-Cz5I2-DL.cjs.map} +1 -1
- package/dist/{ThemeToggle-DUtDXl1Z.js → ThemeToggle-DEfXczDs.js} +3 -3
- package/dist/{ThemeToggle-DUtDXl1Z.js.map → ThemeToggle-DEfXczDs.js.map} +1 -1
- package/dist/{TimeColumns-BLhP81oI.js → TimeColumns-B-vtakk8.js} +2 -2
- package/dist/{TimeColumns-BLhP81oI.js.map → TimeColumns-B-vtakk8.js.map} +1 -1
- package/dist/{TimeColumns-CgjyPGjs.cjs → TimeColumns-IBmjExao.cjs} +2 -2
- package/dist/{TimeColumns-CgjyPGjs.cjs.map → TimeColumns-IBmjExao.cjs.map} +1 -1
- package/dist/{TimePicker-CNAXFtJa.cjs → TimePicker-B-c6uIaY.cjs} +2 -2
- package/dist/{TimePicker-CNAXFtJa.cjs.map → TimePicker-B-c6uIaY.cjs.map} +1 -1
- package/dist/{TimePicker-CJWjGVqT.js → TimePicker-i2RnZHV1.js} +5 -5
- package/dist/{TimePicker-CJWjGVqT.js.map → TimePicker-i2RnZHV1.js.map} +1 -1
- package/dist/{Toaster-B3Mut6eM.js → Toaster-Da8F_SFV.js} +2 -2
- package/dist/{Toaster-B3Mut6eM.js.map → Toaster-Da8F_SFV.js.map} +1 -1
- package/dist/{Toaster-CYt_Hvlh.cjs → Toaster-qdS8Urgy.cjs} +2 -2
- package/dist/{Toaster-CYt_Hvlh.cjs.map → Toaster-qdS8Urgy.cjs.map} +1 -1
- package/dist/TranslatedFields-C30ww45c.cjs +2 -0
- package/dist/TranslatedFields-C30ww45c.cjs.map +1 -0
- package/dist/TranslatedFields-Ck9JTF27.js +86 -0
- package/dist/TranslatedFields-Ck9JTF27.js.map +1 -0
- package/dist/{UserCard-Dve-LOSB.js → UserCard-0ZF29bkK.js} +3 -3
- package/dist/{UserCard-Dve-LOSB.js.map → UserCard-0ZF29bkK.js.map} +1 -1
- package/dist/{UserCard-sIguy8Jp.cjs → UserCard-C8rC_gzD.cjs} +2 -2
- package/dist/{UserCard-sIguy8Jp.cjs.map → UserCard-C8rC_gzD.cjs.map} +1 -1
- package/dist/components/Alert/index.cjs +1 -1
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AuthLayout/AuthLayout.d.cts +39 -0
- package/dist/components/AuthLayout/AuthLayout.d.ts +39 -0
- package/dist/components/AuthLayout/index.cjs +2 -0
- package/dist/components/AuthLayout/index.cjs.map +1 -0
- package/dist/components/AuthLayout/index.d.cts +2 -0
- package/dist/components/AuthLayout/index.d.ts +2 -0
- package/dist/components/AuthLayout/index.js +6 -0
- package/dist/components/AuthLayout/index.js.map +1 -0
- package/dist/components/Breadcrumbs/index.cjs +1 -1
- package/dist/components/Breadcrumbs/index.js +1 -1
- package/dist/components/Button/index.cjs +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Chip/index.cjs +1 -1
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/CodeBlock/index.cjs +1 -1
- package/dist/components/CodeBlock/index.js +1 -1
- package/dist/components/ColorPicker/index.cjs +1 -1
- package/dist/components/ColorPicker/index.js +1 -1
- package/dist/components/CopyButton/CopyButton.d.cts +32 -0
- package/dist/components/CopyButton/CopyButton.d.ts +32 -0
- package/dist/components/CopyButton/index.cjs +2 -0
- package/dist/components/CopyButton/index.cjs.map +1 -0
- package/dist/components/CopyButton/index.d.cts +2 -0
- package/dist/components/CopyButton/index.d.ts +2 -0
- package/dist/components/CopyButton/index.js +6 -0
- package/dist/components/CopyButton/index.js.map +1 -0
- package/dist/components/DatePicker/index.cjs +1 -1
- package/dist/components/DatePicker/index.js +1 -1
- package/dist/components/DateTimePicker/index.cjs +1 -1
- package/dist/components/DateTimePicker/index.js +1 -1
- package/dist/components/EmptyState/index.cjs +1 -1
- package/dist/components/EmptyState/index.js +1 -1
- package/dist/components/FileCard/FileCard.d.cts +45 -0
- package/dist/components/FileCard/FileCard.d.ts +45 -0
- package/dist/components/FileCard/index.cjs +2 -0
- package/dist/components/FileCard/index.cjs.map +1 -0
- package/dist/components/FileCard/index.d.cts +2 -0
- package/dist/components/FileCard/index.d.ts +2 -0
- package/dist/components/FileCard/index.js +6 -0
- package/dist/components/FileCard/index.js.map +1 -0
- package/dist/components/FileUploader/index.cjs +1 -1
- package/dist/components/FileUploader/index.js +1 -1
- package/dist/components/Flag/index.cjs +1 -1
- package/dist/components/Flag/index.js +1 -1
- package/dist/components/FullscreenToggle/index.cjs +1 -1
- package/dist/components/FullscreenToggle/index.js +1 -1
- package/dist/components/IconButton/index.cjs +1 -1
- package/dist/components/IconButton/index.js +1 -1
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/index.js +1 -1
- package/dist/components/Masonry/Masonry.d.cts +14 -7
- package/dist/components/Masonry/Masonry.d.ts +14 -7
- package/dist/components/Masonry/index.cjs +1 -1
- package/dist/components/Masonry/index.js +1 -1
- package/dist/components/Modal/index.cjs +1 -1
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/MultiSelect/index.cjs +1 -1
- package/dist/components/MultiSelect/index.js +1 -1
- package/dist/components/NumberField/index.cjs +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OtpField/index.cjs +1 -1
- package/dist/components/OtpField/index.js +1 -1
- package/dist/components/PageLayout/index.cjs +1 -1
- package/dist/components/PageLayout/index.js +1 -1
- package/dist/components/PageNotFound/index.cjs +1 -1
- package/dist/components/PageNotFound/index.js +1 -1
- package/dist/components/Pagination/index.cjs +1 -1
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/RemoveDialog/index.cjs +1 -1
- package/dist/components/RemoveDialog/index.js +1 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/RootLayout/index.cjs +1 -1
- package/dist/components/RootLayout/index.js +1 -1
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SpeedDial/index.cjs +1 -1
- package/dist/components/SpeedDial/index.js +1 -1
- package/dist/components/Stepper/index.cjs +1 -1
- package/dist/components/Stepper/index.js +1 -1
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/TagsField/index.cjs +1 -1
- package/dist/components/TagsField/index.js +1 -1
- package/dist/components/TextField/index.cjs +1 -1
- package/dist/components/TextField/index.js +1 -1
- package/dist/components/ThemeToggle/index.cjs +1 -1
- package/dist/components/ThemeToggle/index.js +1 -1
- package/dist/components/TimePicker/index.cjs +1 -1
- package/dist/components/TimePicker/index.js +1 -1
- package/dist/components/Toast/index.cjs +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/TranslatedFields/TranslatedFields.d.cts +9 -2
- package/dist/components/TranslatedFields/TranslatedFields.d.ts +9 -2
- package/dist/components/TranslatedFields/index.cjs +1 -1
- package/dist/components/TranslatedFields/index.js +1 -1
- package/dist/components/UserCard/index.cjs +1 -1
- package/dist/components/UserCard/index.js +1 -1
- package/dist/components/index.d.cts +3 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/entries/components.cjs +1 -1
- package/dist/entries/components.js +147 -141
- package/dist/entries/components.js.map +1 -1
- package/dist/entries/hooks.cjs +1 -1
- package/dist/entries/hooks.d.cts +2 -0
- package/dist/entries/hooks.d.ts +2 -0
- package/dist/entries/hooks.js +6 -4
- package/dist/entries/hooks.js.map +1 -1
- package/dist/entries/i18n.cjs +1 -1
- package/dist/entries/i18n.js +2 -2
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.js +1 -1
- package/dist/hooks/index.d.cts +2 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useClipboard.d.cts +28 -0
- package/dist/hooks/useClipboard.d.ts +28 -0
- package/dist/i18n/messages.d.cts +3 -0
- package/dist/i18n/messages.d.ts +3 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +196 -188
- package/dist/index.js.map +1 -1
- package/dist/{messages-CVISEA5N.js → messages-BOKick2l.js} +35 -14
- package/dist/messages-BOKick2l.js.map +1 -0
- package/dist/{messages-BJiUtJ2E.cjs → messages-Jxz2YMcA.cjs} +9 -9
- package/dist/messages-Jxz2YMcA.cjs.map +1 -0
- package/dist/useClipboard-BjTIX-4g.cjs +2 -0
- package/dist/useClipboard-BjTIX-4g.cjs.map +1 -0
- package/dist/useClipboard-CEw_Juiq.js +23 -0
- package/dist/useClipboard-CEw_Juiq.js.map +1 -0
- package/package.json +4 -3
- package/dist/Masonry-BObKcPmo.js +0 -82
- package/dist/Masonry-BObKcPmo.js.map +0 -1
- package/dist/Masonry-BVphuk2X.cjs +0 -2
- package/dist/Masonry-BVphuk2X.cjs.map +0 -1
- package/dist/TranslatedFields-BEaS1esD.js +0 -82
- package/dist/TranslatedFields-BEaS1esD.js.map +0 -1
- package/dist/TranslatedFields-DshwXj6d.cjs +0 -2
- package/dist/TranslatedFields-DshwXj6d.cjs.map +0 -1
- package/dist/messages-BJiUtJ2E.cjs.map +0 -1
- package/dist/messages-CVISEA5N.js.map +0 -1
|
@@ -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-
|
|
2
|
-
//# sourceMappingURL=ColorPicker-
|
|
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-nXEliruE.cjs"),Z=require("./ConfigProvider-BHNx-NHV.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-Dc1y9Zuu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPicker-BAJWvC3h.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-Dc1y9Zuu.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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"}
|
|
@@ -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-CophpkHo.js";
|
|
5
|
-
import { a as re } from "./ConfigProvider-
|
|
5
|
+
import { a as re } from "./ConfigProvider-BYruQYHC.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-
|
|
336
|
+
//# sourceMappingURL=ColorPickerPanel-9tOQUL38.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPickerPanel-CovWDIRt.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":";;;;;AAsBO,MAAMA,IAAU,CAACC,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,GAClEC,IAAW,CAACD,MAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAC,CAAC,CAAC;AAGzE,SAASE,GAAaC,GAA8B;AACzD,MAAIC,IAAID,EAAM,KAAA,EAAO,QAAQ,MAAM,EAAE;AACrC,SAAI,mBAAmB,KAAKC,CAAC,MAC3BA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,CAACC,MAAMA,IAAIA,CAAC,EAChB,KAAK,EAAE,IAEL,mBAAmB,KAAKD,CAAC,IAAI,IAAIA,EAAE,aAAa,KAAK;AAC9D;AAKO,SAASE,EAASC,GAAkB;AACzC,QAAMH,KAAKF,GAAaK,CAAG,KAAK,WAAW,MAAM,CAAC;AAClD,SAAO;AAAA,IACL,GAAG,SAASH,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAAA;AAEjC;AAEO,SAASI,EAAS,EAAE,GAAAC,GAAG,GAAAC,GAAG,GAAAC,KAAkB;AACjD,QAAMC,IAAK,CAACZ,MACV,KAAK,MAAMD,EAAQC,IAAI,GAAG,IAAI,GAAG,EAC9B,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB,SAAO,IAAIY,EAAGH,CAAC,CAAC,GAAGG,EAAGF,CAAC,CAAC,GAAGE,EAAGD,CAAC,CAAC;AAClC;AAGO,SAASE,EAAS,EAAE,GAAAJ,GAAG,GAAAC,GAAG,GAAAC,KAAe;AAC9C,QAAMG,IAAKL,IAAI,KACTM,IAAKL,IAAI,KACTM,IAAKL,IAAI,KACTM,IAAM,KAAK,IAAIH,GAAIC,GAAIC,CAAE,GACzBE,IAAM,KAAK,IAAIJ,GAAIC,GAAIC,CAAE,GACzBG,IAAIF,IAAMC;AAEhB,MAAId,IAAI;AACR,EAAIe,MAAM,MACJF,MAAQH,IAAIV,KAAMW,IAAKC,KAAMG,IAAK,IAC7BF,MAAQF,IAAIX,KAAKY,IAAKF,KAAMK,IAAI,IACpCf,KAAKU,IAAKC,KAAMI,IAAI,GACzBf,KAAK,IACDA,IAAI,MAAGA,KAAK;AAElB,QAAMgB,IAAIH,MAAQ,IAAI,IAAIE,IAAIF;AAC9B,SAAO,EAAE,GAAAb,GAAG,GAAAgB,GAAG,GAAGH,EAAA;AACpB;AAGO,SAASI,EAAS,EAAE,GAAAjB,GAAG,GAAAgB,GAAG,GAAAE,KAAe;AAC9C,QAAMjB,IAAIiB,IAAIF,GACRG,IAAIlB,KAAK,IAAI,KAAK,IAAMD,IAAI,KAAM,IAAK,CAAC,IACxCoB,IAAIF,IAAIjB;AACd,MAAII,IAAI,GACJC,IAAI,GACJC,IAAI;AACR,SAAIP,IAAI,KAAI,CAACK,GAAGC,GAAGC,CAAC,IAAI,CAACN,GAAGkB,GAAG,CAAC,IACvBnB,IAAI,MAAK,CAACK,GAAGC,GAAGC,CAAC,IAAI,CAACY,GAAGlB,GAAG,CAAC,IAC7BD,IAAI,MAAK,CAACK,GAAGC,GAAGC,CAAC,IAAI,CAAC,GAAGN,GAAGkB,CAAC,IAC7BnB,IAAI,MAAK,CAACK,GAAGC,GAAGC,CAAC,IAAI,CAAC,GAAGY,GAAGlB,CAAC,IAC7BD,IAAI,MAAK,CAACK,GAAGC,GAAGC,CAAC,IAAI,CAACY,GAAG,GAAGlB,CAAC,IACjC,CAACI,GAAGC,GAAGC,CAAC,IAAI,CAACN,GAAG,GAAGkB,CAAC,GAClB,EAAE,IAAId,IAAIe,KAAK,KAAK,IAAId,IAAIc,KAAK,KAAK,IAAIb,IAAIa,KAAK,IAAA;AAC5D;AAEO,MAAMC,KAAW,CAAClB,MAAqBM,EAASP,EAASC,CAAG,CAAC;AAI7D,SAASmB,GAAWnB,GAAqB;AAC9C,QAAM,EAAE,GAAAE,GAAG,GAAAC,GAAG,GAAAC,EAAA,IAAML,EAASC,CAAG;AAChC,UAAQE,IAAI,MAAMC,IAAI,MAAMC,IAAI,OAAO,OAAQ,MAAM,YAAY;AACnE;AAEA,MAAMgB,KACJ;AAOK,SAASC,EAAWzB,GAA4B;AACrD,QAAMiB,IAAIjB,EAAM,KAAA;AAChB,MAAI,CAACiB,EAAG,QAAO;AAGf,MAAIhB,IAAIgB,EAAE,QAAQ,MAAM,EAAE;AAO1B,MANI,qBAAqB,KAAKhB,CAAC,MAC7BA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE,IAER,mBAAmB,KAAKA,CAAC;AAC3B,WAAO;AAAA,MACL,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAG;AAAA,IAAA;AAGP,MAAI,mBAAmB,KAAKA,CAAC;AAC3B,WAAO;AAAA,MACL,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAG,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC7B,GAAGL,EAAQ,SAASK,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG;AAAA,IAAA;AAKhD,QAAMoB,IAAIJ,EAAE,MAAMO,EAAQ;AAC1B,MAAIH,GAAG;AACL,QAAIK,IAAI;AACR,WAAIL,EAAE,CAAC,KAAK,SACVK,IAAIL,EAAE,CAAC,EAAE,SAAS,GAAG,IAAIzB,EAAQ,WAAWyB,EAAE,CAAC,CAAC,IAAI,GAAG,IAAIzB,EAAQ,WAAWyB,EAAE,CAAC,CAAC,CAAC,IAE9E,EAAE,GAAGvB,EAAS,CAACuB,EAAE,CAAC,CAAC,GAAG,GAAGvB,EAAS,CAACuB,EAAE,CAAC,CAAC,GAAG,GAAGvB,EAAS,CAACuB,EAAE,CAAC,CAAC,GAAG,GAAAK,EAAA;AAAA,EACvE;AACA,SAAO;AACT;AAMO,SAASC,EAAY,EAAE,GAAArB,GAAG,GAAAC,GAAG,GAAAC,GAAG,GAAAkB,KAAmB;AACxD,SAAIA,KAAK,IAAUrB,EAAS,EAAE,GAAAC,GAAG,GAAAC,GAAG,GAAAC,GAAG,IAChC,QAAQV,EAASQ,CAAC,CAAC,KAAKR,EAASS,CAAC,CAAC,KAAKT,EAASU,CAAC,CAAC,KAAK,KAAK,MAAMZ,EAAQ8B,CAAC,IAAI,GAAG,IAAI,GAAG;AACnG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCvIaE,KAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAoBP,GAAS,SAAS;AAoBrC,SAASQ,GAAiB;AAAA,EAC/B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAWL;AAAA,EACX,WAAAM,IAAY;AACd,GAA0B;AACxB,QAAMC,IAAIC,GAAA,GACJC,IAASZ,EAAWM,KAAS,EAAE,GAE/BO,IAAeD,IAASV,EAAYU,CAAM,IAAI,MAG9C,CAACE,GAAKC,CAAM,IAAIC,EAAcJ,IAAS3B,EAAS2B,CAAM,IAAIR,CAAY,GACtEa,IAASC,EAAOJ,CAAG;AACzB,EAAAG,EAAO,UAAUH;AACjB,QAAM,CAACK,GAAOC,CAAQ,IAAIJ,GAAiBJ,KAAA,gBAAAA,EAAQ,MAAK,CAAC,GACnDS,IAAWH,EAAOC,CAAK;AAC7B,EAAAE,EAAS,UAAUF,GAGnBG,EAAU,MAAM;AACd,QAAI,CAACV,EAAQ;AACb,UAAMW,IAAMrB,EAAY,EAAE,GAAGT,EAASwB,EAAO,OAAO,GAAG,GAAGI,EAAS,SAAS;AAC5E,IAAIR,MAAiBU,MACnBR,EAAO9B,EAAS2B,CAAM,CAAC,GACvBQ,EAASR,EAAO,CAAC;AAAA,EAGrB,GAAG,CAACC,CAAY,CAAC;AAEjB,QAAMW,IAAW,CAACC,MAAc;AAC9B,IAAAV,EAAOU,CAAI,GACXlB,EAASL,EAAY,EAAE,GAAGT,EAASgC,CAAI,GAAG,GAAGJ,EAAS,QAAA,CAAS,CAAC;AAAA,EAClE,GAEMK,IAAa,CAACD,MAAiB;AACnC,IAAAL,EAASK,CAAI,GACblB,EAASL,EAAY,EAAE,GAAGT,EAASwB,EAAO,OAAO,GAAG,GAAGQ,EAAA,CAAM,CAAC;AAAA,EAChE,GAGME,IACJ,CAACC,MACD,CAACC,MAA6C;AAC5C,IAAAA,EAAM,eAAA;AACN,UAAMC,IAAKD,EAAM,eACXE,IAAO,CAACC,GAAiBC,OAC7BL,EAAOI,GAASC,IAASH,EAAG,uBAAuB;AACrD,IAAAC,EAAKF,EAAM,SAASA,EAAM,OAAO;AACjC,UAAMK,IAAgB,CAACC,MAAoBJ,EAAKI,EAAE,SAASA,EAAE,OAAO,GAC9DC,IAAc,MAAM;AACxB,aAAO,oBAAoB,eAAeF,CAAa,GACvD,OAAO,oBAAoB,aAAaE,CAAW;AAAA,IACrD;AACA,WAAO,iBAAiB,eAAeF,CAAa,GACpD,OAAO,iBAAiB,aAAaE,CAAW;AAAA,EAClD,GAEIC,IAAWV,EAAK,CAAChC,GAAG2C,GAAGC,MAAS;AACpC,UAAM/C,IAAIrB,GAASwB,IAAI4C,EAAK,QAAQA,EAAK,KAAK,GACxC7C,IAAIvB,EAAQ,KAAKmE,IAAIC,EAAK,OAAOA,EAAK,MAAM;AAClD,IAAAf,EAAS,EAAE,GAAGP,EAAO,SAAS,GAAAzB,GAAG,GAAAE,GAAG;AAAA,EACtC,CAAC,GAEK8C,IAAYb,EAAK,CAAChC,GAAG8C,GAAIF,MAAS;AACtC,UAAM/D,IAAIL,GAASwB,IAAI4C,EAAK,QAAQA,EAAK,KAAK,IAAI;AAClD,IAAAf,EAAS,EAAE,GAAGP,EAAO,SAAS,GAAAzC,GAAG;AAAA,EACnC,CAAC,GAEKkE,IAAcf,EAAK,CAAChC,GAAG8C,GAAIF,MAAS;AACxC,IAAAb,EAAWvD,GAASwB,IAAI4C,EAAK,QAAQA,EAAK,KAAK,CAAC;AAAA,EAClD,CAAC,GAGKI,IAAU,MACVC,IAAU,CAACf,MAA8C;AAC7D,UAAM,EAAE,GAAArD,GAAG,GAAAgB,GAAG,GAAAE,EAAA,IAAMuB,EAAO;AAC3B,QAAI4B,IAAKrD,GACLsD,IAAKpD;AACT,YAAQmC,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAgB,IAAK1E,EAAQqB,IAAImD,CAAO;AACxB;AAAA,MACF,KAAK;AACH,QAAAE,IAAK1E,EAAQqB,IAAImD,CAAO;AACxB;AAAA,MACF,KAAK;AACH,QAAAG,IAAK3E,EAAQuB,IAAIiD,CAAO;AACxB;AAAA,MACF,KAAK;AACH,QAAAG,IAAK3E,EAAQuB,IAAIiD,CAAO;AACxB;AAAA,MACF;AACE;AAAA,IAAA;AAEJ,IAAAd,EAAM,eAAA,GACNL,EAAS,EAAE,GAAAhD,GAAG,GAAGqE,GAAI,GAAGC,GAAI;AAAA,EAC9B,GACMC,IAAW,CAAClB,MAA8C;AAC9D,UAAM,EAAE,GAAArD,MAAMyC,EAAO;AACrB,QAAI+B,IAAKxE;AACT,YAAQqD,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,QAAAmB,IAAK,KAAK,IAAI,GAAGxE,IAAI,CAAC;AACtB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAAwE,IAAK,KAAK,IAAI,KAAKxE,IAAI,CAAC;AACxB;AAAA,MACF,KAAK;AACH,QAAAwE,IAAK;AACL;AAAA,MACF,KAAK;AACH,QAAAA,IAAK;AACL;AAAA,MACF;AACE;AAAA,IAAA;AAEJ,IAAAnB,EAAM,eAAA,GACNL,EAAS,EAAE,GAAGP,EAAO,SAAS,GAAG+B,GAAI;AAAA,EACvC,GACMC,IAAa,CAACpB,MAA8C;AAChE,QAAIqB,IAAK7B,EAAS;AAClB,YAAQQ,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,QAAAqB,IAAK/E,EAAQkD,EAAS,UAAU,IAAI;AACpC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAA6B,IAAK/E,EAAQkD,EAAS,UAAU,IAAI;AACpC;AAAA,MACF,KAAK;AACH,QAAA6B,IAAK;AACL;AAAA,MACF,KAAK;AACH,QAAAA,IAAK;AACL;AAAA,MACF;AACE;AAAA,IAAA;AAEJ,IAAArB,EAAM,eAAA,GACNH,EAAWwB,CAAE;AAAA,EACf,GAGM,CAACC,GAAYC,CAAa,IAAIpC,EAAS,EAAE;AAC/C,EAAAM,EAAU,MAAM;AACd,IAAA8B,EAAcvC,KAAgB,EAAE;AAAA,EAClC,GAAG,CAACA,CAAY,CAAC;AAEjB,QAAMwC,IAAe,CAACC,MAAgB;AACpC,IAAAF,EAAcE,CAAG;AACjB,UAAMC,IAAIvD,EAAWsD,CAAG;AACxB,IAAIC,MACFxC,EAAO9B,EAASsE,CAAC,CAAC,GAClBnC,EAASmC,EAAE,CAAC,GACZhD,EAASL,EAAYqD,CAAC,CAAC;AAAA,EAE3B,GAEMC,IAAc,MAAM;AACxB,IAAAjD,EAAS,EAAE,GACXQ,EAAOX,CAAY,GACnBgB,EAAS,CAAC;AAAA,EACZ,GAGMqC,IAAevD,EAAY,EAAE,GAAGT,EAASqB,CAAG,GAAG,GAAGK,GAAO,GACzDuC,IAAW9E,EAASa,EAASqB,CAAG,CAAC,GACjCS,IAAM9B,EAASqB,CAAG,GAClB6C,IAAQ,GAAG,KAAK,MAAMpC,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC;AAE9E,SACE,gBAAAqC,EAAC,OAAA,EAAI,WAAWC,EAAO,SAAS,OAAO,EAAE,YAAY/C,EAAI,EAAA,GACvD,UAAA;AAAA,IAAA,gBAAAgD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,EAAO;AAAA,QAClB,eAAexB;AAAA,QACf,WAAWO;AAAA,QACX,MAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAYlC,EAAE,wBAAwB;AAAA,QACtC,kBAAgB,GAAG,KAAK,MAAMI,EAAI,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAMA,EAAI,IAAI,GAAG,CAAC;AAAA,QAElF,UAAA,gBAAAgD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,OAAO,EAAE,MAAM,GAAG/C,EAAI,IAAI,GAAG,KAAK,KAAK,IAAI,IAAIA,EAAI,KAAK,GAAG,KAAK,YAAY4C,EAAA;AAAA,UAAS;AAAA,QAAA;AAAA,MACvF;AAAA,IAAA;AAAA,IAGF,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,EAAO;AAAA,QAClB,eAAerB;AAAA,QACf,WAAWO;AAAA,QACX,MAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAYrC,EAAE,iBAAiB;AAAA,QAC/B,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,KAAK,MAAMI,EAAI,CAAC;AAAA,QAE/B,UAAA,gBAAAgD,EAAC,QAAA,EAAK,WAAWD,EAAO,UAAU,OAAO,EAAE,MAAM,GAAI/C,EAAI,IAAI,MAAO,GAAG,MAAI,CAAG;AAAA,MAAA;AAAA,IAAA;AAAA,IAGhF,gBAAAgD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,EAAO;AAAA,QAClB,eAAenB;AAAA,QACf,WAAWO;AAAA,QACX,MAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAYvC,EAAE,qBAAqB;AAAA,QACnC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,KAAK,MAAMS,IAAQ,GAAG;AAAA,QACrC,OAAO,EAAE,YAAYwC,EAAA;AAAA,QAErB,UAAA,gBAAAG,EAAC,QAAA,EAAK,WAAWD,EAAO,YAAY,OAAO,EAAE,MAAM,GAAG1C,IAAQ,GAAG,IAAA,EAAI,CAAG;AAAA,MAAA;AAAA,IAAA;AAAA,IAG1E,gBAAAyC,EAAC,OAAA,EAAI,WAAWC,EAAO,QACrB,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWD,EAAO;AAAA,UAClB,OAAO,EAAE,aAAaJ,EAAA;AAAA,QAAa;AAAA,MAAA;AAAA,MAErC,gBAAAK,EAAC,QAAA,EAAK,WAAWD,EAAO,UACtB,UAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWD,EAAO;AAAA,UAClB,OAAOV;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,cAAYzC,EAAE,mBAAmB;AAAA,UACjC,UAAU,CAACyB,MAAMkB,EAAalB,EAAE,OAAO,KAAK;AAAA,QAAA;AAAA,MAAA,EAC9C,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAyB,EAAC,OAAA,EAAI,WAAWC,EAAO,UAEpB,UAAA;AAAA,MAAApD,KACC,gBAAAqD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWC,GAAKF,EAAO,QAAQA,EAAO,WAAW;AAAA,UACjD,cAAYnD,EAAE,qBAAqB;AAAA,UACnC,gBAAc,CAACE;AAAA,UACf,SAAS4C;AAAA,UAER,WAAC5C,KAAU,gBAAAkD,EAACE,KAAK,MAAK,cAAa,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAGjDxD,EAAS,IAAI,CAACyD,MAAO;AACpB,cAAMV,IAAIvD,EAAWiE,CAAE;AACvB,YAAI,CAACV,EAAG,QAAO;AACf,cAAMW,IAAQhE,EAAY,EAAE,GAAGqD,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAG,GAAG,GACpDY,IAAWtD,MAAiBqD;AAClC,eACE,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAWD,EAAO;AAAA,YAClB,OAAO,EAAE,YAAYK,GAAO,OAAOpE,GAAWoE,CAAK,EAAA;AAAA,YACnD,cAAYA;AAAA,YACZ,gBAAcC;AAAA,YACd,SAAS,MAAM;AACb,cAAApD,EAAO9B,EAASsE,CAAC,CAAC,GAClBhD,EAASL,EAAY,EAAE,GAAGqD,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGlC,EAAS,QAAA,CAAS,CAAC;AAAA,YACvE;AAAA,YAEC,eAAY,gBAAAyC,EAACE,GAAA,EAAK,MAAK,cAAa,MAAK,KAAA,CAAK;AAAA,UAAA;AAAA,UAX1CC;AAAA,QAAA;AAAA,MAcX,CAAC;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"ColorPickerPanel-9tOQUL38.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,2 +1,2 @@
|
|
|
1
|
-
"use strict";const _=require("react/jsx-runtime"),g=require("react"),Z=require("clsx"),P=require("./Icon-CXTl_QAP.cjs"),ee=require("./ConfigProvider-
|
|
2
|
-
//# sourceMappingURL=ColorPickerPanel-
|
|
1
|
+
"use strict";const _=require("react/jsx-runtime"),g=require("react"),Z=require("clsx"),P=require("./Icon-CXTl_QAP.cjs"),ee=require("./ConfigProvider-BHNx-NHV.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-nXEliruE.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPickerPanel-CkB2pNnX.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-nXEliruE.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":"oKAsBaA,EAAW,GAAsB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,CAAC,CAAC,EAClEC,EAAY,GAAsB,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,KAAK,MAAM,CAAC,CAAC,CAAC,EAGzE,SAASC,GAAaC,EAA8B,CACzD,IAAIC,EAAID,EAAM,KAAA,EAAO,QAAQ,KAAM,EAAE,EACrC,MAAI,mBAAmB,KAAKC,CAAC,IAC3BA,EAAIA,EACD,MAAM,EAAE,EACR,IAAKC,GAAMA,EAAIA,CAAC,EAChB,KAAK,EAAE,GAEL,mBAAmB,KAAKD,CAAC,EAAI,IAAIA,EAAE,aAAa,GAAK,IAC9D,CAKO,SAASE,EAASC,EAAkB,CACzC,MAAMH,GAAKF,GAAaK,CAAG,GAAK,WAAW,MAAM,CAAC,EAClD,MAAO,CACL,EAAG,SAASH,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,CAAA,CAEjC,CAEO,SAASI,EAAS,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,GAAkB,CACjD,MAAMC,EAAMC,GACV,KAAK,MAAMb,EAAQa,EAAI,GAAG,EAAI,GAAG,EAC9B,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EACpB,MAAO,IAAID,EAAGH,CAAC,CAAC,GAAGG,EAAGF,CAAC,CAAC,GAAGE,EAAGD,CAAC,CAAC,EAClC,CAGO,SAASG,EAAS,CAAE,EAAAL,EAAG,EAAAC,EAAG,EAAAC,GAAe,CAC9C,MAAMI,EAAKN,EAAI,IACTO,EAAKN,EAAI,IACTO,EAAKN,EAAI,IACTO,EAAM,KAAK,IAAIH,EAAIC,EAAIC,CAAE,EACzBE,EAAM,KAAK,IAAIJ,EAAIC,EAAIC,CAAE,EACzBG,EAAIF,EAAMC,EAEhB,IAAIf,EAAI,EACJgB,IAAM,IACJF,IAAQH,EAAIX,GAAMY,EAAKC,GAAMG,EAAK,EAC7BF,IAAQF,EAAIZ,GAAKa,EAAKF,GAAMK,EAAI,EACpChB,GAAKW,EAAKC,GAAMI,EAAI,EACzBhB,GAAK,GACDA,EAAI,IAAGA,GAAK,MAElB,MAAMiB,EAAIH,IAAQ,EAAI,EAAIE,EAAIF,EAC9B,MAAO,CAAE,EAAAd,EAAG,EAAAiB,EAAG,EAAGH,CAAA,CACpB,CAGO,SAASI,EAAS,CAAE,EAAAlB,EAAG,EAAG,EAAAmB,GAAe,CAC9C,MAAMlB,EAAIkB,EAAI,EACRC,EAAInB,GAAK,EAAI,KAAK,IAAMD,EAAI,GAAM,EAAK,CAAC,GACxCqB,EAAIF,EAAIlB,EACd,IAAII,EAAI,EACJC,EAAI,EACJC,EAAI,EACR,OAAIP,EAAI,GAAI,CAACK,EAAGC,EAAGC,CAAC,EAAI,CAACN,EAAGmB,EAAG,CAAC,EACvBpB,EAAI,IAAK,CAACK,EAAGC,EAAGC,CAAC,EAAI,CAACa,EAAGnB,EAAG,CAAC,EAC7BD,EAAI,IAAK,CAACK,EAAGC,EAAGC,CAAC,EAAI,CAAC,EAAGN,EAAGmB,CAAC,EAC7BpB,EAAI,IAAK,CAACK,EAAGC,EAAGC,CAAC,EAAI,CAAC,EAAGa,EAAGnB,CAAC,EAC7BD,EAAI,IAAK,CAACK,EAAGC,EAAGC,CAAC,EAAI,CAACa,EAAG,EAAGnB,CAAC,EACjC,CAACI,EAAGC,EAAGC,CAAC,EAAI,CAACN,EAAG,EAAGmB,CAAC,EAClB,CAAE,GAAIf,EAAIgB,GAAK,IAAK,GAAIf,EAAIe,GAAK,IAAK,GAAId,EAAIc,GAAK,GAAA,CAC5D,CAEO,MAAMC,GAAYnB,GAAqBO,EAASR,EAASC,CAAG,CAAC,EAI7D,SAASoB,GAAWpB,EAAqB,CAC9C,KAAM,CAAE,EAAAE,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAML,EAASC,CAAG,EAChC,OAAQE,EAAI,IAAMC,EAAI,IAAMC,EAAI,KAAO,KAAQ,IAAM,UAAY,SACnE,CAEA,MAAMiB,GACJ,0FAOK,SAASC,EAAW1B,EAA4B,CACrD,MAAM,EAAIA,EAAM,KAAA,EAChB,GAAI,CAAC,EAAG,OAAO,KAGf,IAAIC,EAAI,EAAE,QAAQ,KAAM,EAAE,EAO1B,GANI,qBAAqB,KAAKA,CAAC,IAC7BA,EAAIA,EACD,MAAM,EAAE,EACR,IAAK,GAAM,EAAI,CAAC,EAChB,KAAK,EAAE,GAER,mBAAmB,KAAKA,CAAC,EAC3B,MAAO,CACL,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,CAAA,EAGP,GAAI,mBAAmB,KAAKA,CAAC,EAC3B,MAAO,CACL,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAG,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,EAAGJ,EAAQ,SAASI,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,GAAG,CAAA,EAKhD,MAAMqB,EAAI,EAAE,MAAMG,EAAQ,EAC1B,GAAIH,EAAG,CACL,IAAIK,EAAI,EACR,OAAIL,EAAE,CAAC,GAAK,OACVK,EAAIL,EAAE,CAAC,EAAE,SAAS,GAAG,EAAIzB,EAAQ,WAAWyB,EAAE,CAAC,CAAC,EAAI,GAAG,EAAIzB,EAAQ,WAAWyB,EAAE,CAAC,CAAC,CAAC,GAE9E,CAAE,EAAGxB,EAAS,CAACwB,EAAE,CAAC,CAAC,EAAG,EAAGxB,EAAS,CAACwB,EAAE,CAAC,CAAC,EAAG,EAAGxB,EAAS,CAACwB,EAAE,CAAC,CAAC,EAAG,EAAAK,CAAA,CACvE,CACA,OAAO,IACT,CAMO,SAASC,EAAY,CAAE,EAAAtB,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAmB,GAAmB,CACxD,OAAIA,GAAK,EAAUtB,EAAS,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAChC,QAAQV,EAASQ,CAAC,CAAC,KAAKR,EAASS,CAAC,CAAC,KAAKT,EAASU,CAAC,CAAC,KAAK,KAAK,MAAMX,EAAQ8B,CAAC,EAAI,GAAG,EAAI,GAAG,GACnG,ogCCvIaE,EAAmB,CAC9B,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAEMC,EAAoBP,GAAS,SAAS,EAoBrC,SAASQ,GAAiB,CAC/B,MAAAC,EACA,SAAAC,EACA,SAAAC,EAAWL,EACX,UAAAM,EAAY,EACd,EAA0B,CACxB,MAAMC,EAAIC,GAAAA,KAAA,EACJC,EAASZ,EAAWM,GAAS,EAAE,EAE/BO,EAAeD,EAASV,EAAYU,CAAM,EAAI,KAG9C,CAACE,EAAKC,CAAM,EAAIC,EAAAA,SAAcJ,EAAS3B,EAAS2B,CAAM,EAAIR,CAAY,EACtEa,EAASC,EAAAA,OAAOJ,CAAG,EACzBG,EAAO,QAAUH,EACjB,KAAM,CAACK,EAAOC,CAAQ,EAAIJ,EAAAA,UAAiBJ,GAAA,YAAAA,EAAQ,IAAK,CAAC,EACnDS,EAAWH,EAAAA,OAAOC,CAAK,EAC7BE,EAAS,QAAUF,EAGnBG,EAAAA,UAAU,IAAM,CACd,GAAI,CAACV,EAAQ,OACb,MAAMW,EAAMrB,EAAY,CAAE,GAAGT,EAASwB,EAAO,OAAO,EAAG,EAAGI,EAAS,QAAS,EACxER,IAAiBU,IACnBR,EAAO9B,EAAS2B,CAAM,CAAC,EACvBQ,EAASR,EAAO,CAAC,EAGrB,EAAG,CAACC,CAAY,CAAC,EAEjB,MAAMW,EAAYC,GAAc,CAC9BV,EAAOU,CAAI,EACXlB,EAASL,EAAY,CAAE,GAAGT,EAASgC,CAAI,EAAG,EAAGJ,EAAS,OAAA,CAAS,CAAC,CAClE,EAEMK,EAAcD,GAAiB,CACnCL,EAASK,CAAI,EACblB,EAASL,EAAY,CAAE,GAAGT,EAASwB,EAAO,OAAO,EAAG,EAAGQ,CAAA,CAAM,CAAC,CAChE,EAGME,EACHC,GACAC,GAA6C,CAC5CA,EAAM,eAAA,EACN,MAAMC,EAAKD,EAAM,cACXE,EAAO,CAACC,EAAiBC,IAC7BL,EAAOI,EAASC,EAASH,EAAG,uBAAuB,EACrDC,EAAKF,EAAM,QAASA,EAAM,OAAO,EACjC,MAAMK,EAAiBC,GAAoBJ,EAAKI,EAAE,QAASA,EAAE,OAAO,EAC9DC,EAAc,IAAM,CACxB,OAAO,oBAAoB,cAAeF,CAAa,EACvD,OAAO,oBAAoB,YAAaE,CAAW,CACrD,EACA,OAAO,iBAAiB,cAAeF,CAAa,EACpD,OAAO,iBAAiB,YAAaE,CAAW,CAClD,EAEIC,EAAWV,EAAK,CAAChC,EAAG2C,EAAGC,IAAS,CACpC,MAAM/C,EAAIrB,GAASwB,EAAI4C,EAAK,MAAQA,EAAK,KAAK,EACxC7C,EAAIvB,EAAQ,GAAKmE,EAAIC,EAAK,KAAOA,EAAK,MAAM,EAClDf,EAAS,CAAE,GAAGP,EAAO,QAAS,EAAAzB,EAAG,EAAAE,EAAG,CACtC,CAAC,EAEK8C,EAAYb,EAAK,CAAChC,EAAG8C,EAAIF,IAAS,CACtC,MAAMhE,EAAIJ,GAASwB,EAAI4C,EAAK,MAAQA,EAAK,KAAK,EAAI,IAClDf,EAAS,CAAE,GAAGP,EAAO,QAAS,EAAA1C,EAAG,CACnC,CAAC,EAEKmE,EAAcf,EAAK,CAAChC,EAAG8C,EAAIF,IAAS,CACxCb,EAAWvD,GAASwB,EAAI4C,EAAK,MAAQA,EAAK,KAAK,CAAC,CAClD,CAAC,EAGKI,EAAU,IACVC,EAAWf,GAA8C,CAC7D,KAAM,CAAE,EAAAtD,EAAG,EAAAiB,EAAG,EAAAE,CAAA,EAAMuB,EAAO,QAC3B,IAAI4B,EAAKrD,EACLsD,EAAKpD,EACT,OAAQmC,EAAM,IAAA,CACZ,IAAK,YACHgB,EAAK1E,EAAQqB,EAAImD,CAAO,EACxB,MACF,IAAK,aACHE,EAAK1E,EAAQqB,EAAImD,CAAO,EACxB,MACF,IAAK,UACHG,EAAK3E,EAAQuB,EAAIiD,CAAO,EACxB,MACF,IAAK,YACHG,EAAK3E,EAAQuB,EAAIiD,CAAO,EACxB,MACF,QACE,MAAA,CAEJd,EAAM,eAAA,EACNL,EAAS,CAAE,EAAAjD,EAAG,EAAGsE,EAAI,EAAGC,EAAI,CAC9B,EACMC,EAAYlB,GAA8C,CAC9D,KAAM,CAAE,EAAAtD,GAAM0C,EAAO,QACrB,IAAI+B,EAAKzE,EACT,OAAQsD,EAAM,IAAA,CACZ,IAAK,YACL,IAAK,YACHmB,EAAK,KAAK,IAAI,EAAGzE,EAAI,CAAC,EACtB,MACF,IAAK,aACL,IAAK,UACHyE,EAAK,KAAK,IAAI,IAAKzE,EAAI,CAAC,EACxB,MACF,IAAK,OACHyE,EAAK,EACL,MACF,IAAK,MACHA,EAAK,IACL,MACF,QACE,MAAA,CAEJnB,EAAM,eAAA,EACNL,EAAS,CAAE,GAAGP,EAAO,QAAS,EAAG+B,EAAI,CACvC,EACMC,EAAcpB,GAA8C,CAChE,IAAIqB,EAAK7B,EAAS,QAClB,OAAQQ,EAAM,IAAA,CACZ,IAAK,YACL,IAAK,YACHqB,EAAK/E,EAAQkD,EAAS,QAAU,GAAI,EACpC,MACF,IAAK,aACL,IAAK,UACH6B,EAAK/E,EAAQkD,EAAS,QAAU,GAAI,EACpC,MACF,IAAK,OACH6B,EAAK,EACL,MACF,IAAK,MACHA,EAAK,EACL,MACF,QACE,MAAA,CAEJrB,EAAM,eAAA,EACNH,EAAWwB,CAAE,CACf,EAGM,CAACC,EAAYC,CAAa,EAAIpC,EAAAA,SAAS,EAAE,EAC/CM,EAAAA,UAAU,IAAM,CACd8B,EAAcvC,GAAgB,EAAE,CAClC,EAAG,CAACA,CAAY,CAAC,EAEjB,MAAMwC,EAAgBC,GAAgB,CACpCF,EAAcE,CAAG,EACjB,MAAMC,EAAIvD,EAAWsD,CAAG,EACpBC,IACFxC,EAAO9B,EAASsE,CAAC,CAAC,EAClBnC,EAASmC,EAAE,CAAC,EACZhD,EAASL,EAAYqD,CAAC,CAAC,EAE3B,EAEMC,EAAc,IAAM,CACxBjD,EAAS,EAAE,EACXQ,EAAOX,CAAY,EACnBgB,EAAS,CAAC,CACZ,EAGMqC,EAAevD,EAAY,CAAE,GAAGT,EAASqB,CAAG,EAAG,EAAGK,EAAO,EACzDuC,EAAW/E,EAASc,EAASqB,CAAG,CAAC,EACjCS,EAAM9B,EAASqB,CAAG,EAClB6C,EAAQ,GAAG,KAAK,MAAMpC,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC,GAE9E,OACEqC,OAAC,MAAA,CAAI,UAAWC,EAAO,QAAS,MAAO,CAAE,WAAY/C,EAAI,CAAA,EACvD,SAAA,CAAAgD,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAO,GAClB,cAAexB,EACf,UAAWO,EACX,KAAK,SACL,SAAU,EACV,aAAYlC,EAAE,wBAAwB,EACtC,iBAAgB,GAAG,KAAK,MAAMI,EAAI,EAAI,GAAG,CAAC,iBAAiB,KAAK,MAAMA,EAAI,EAAI,GAAG,CAAC,eAElF,SAAAgD,EAAAA,IAAC,OAAA,CACC,UAAWD,EAAO,QAClB,MAAO,CAAE,KAAM,GAAG/C,EAAI,EAAI,GAAG,IAAK,IAAK,IAAI,EAAIA,EAAI,GAAK,GAAG,IAAK,WAAY4C,CAAA,CAAS,CAAA,CACvF,CAAA,EAGFI,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAO,IAClB,cAAerB,EACf,UAAWO,EACX,KAAK,SACL,SAAU,EACV,aAAYrC,EAAE,iBAAiB,EAC/B,gBAAe,EACf,gBAAe,IACf,gBAAe,KAAK,MAAMI,EAAI,CAAC,EAE/B,SAAAgD,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,SAAU,MAAO,CAAE,KAAM,GAAI/C,EAAI,EAAI,IAAO,GAAG,IAAI,CAAG,CAAA,CAAA,EAGhFgD,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAO,MAClB,cAAenB,EACf,UAAWO,EACX,KAAK,SACL,SAAU,EACV,aAAYvC,EAAE,qBAAqB,EACnC,gBAAe,EACf,gBAAe,IACf,gBAAe,KAAK,MAAMS,EAAQ,GAAG,EACrC,MAAO,CAAE,WAAYwC,CAAA,EAErB,SAAAG,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAY,MAAO,CAAE,KAAM,GAAG1C,EAAQ,GAAG,GAAA,CAAI,CAAG,CAAA,CAAA,EAG1EyC,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,OACrB,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACC,UAAWD,EAAO,cAClB,MAAO,CAAE,YAAaJ,CAAA,CAAa,CAAA,EAErCK,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,SACtB,SAAAC,EAAAA,IAAC,QAAA,CACC,UAAWD,EAAO,SAClB,MAAOV,EACP,WAAY,GACZ,UAAW,GACX,aAAYzC,EAAE,mBAAmB,EACjC,SAAWyB,GAAMkB,EAAalB,EAAE,OAAO,KAAK,CAAA,CAAA,CAC9C,CACF,CAAA,EACF,EAEAyB,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,SAEpB,SAAA,CAAApD,GACCqD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWC,EAAAA,KAAKF,EAAO,OAAQA,EAAO,WAAW,EACjD,aAAYnD,EAAE,qBAAqB,EACnC,eAAc,CAACE,EACf,QAAS4C,EAER,UAAC5C,GAAUkD,MAACE,EAAAA,MAAK,KAAK,aAAa,KAAK,IAAA,CAAK,CAAA,CAAA,EAGjDxD,EAAS,IAAKyD,GAAO,CACpB,MAAMV,EAAIvD,EAAWiE,CAAE,EACvB,GAAI,CAACV,EAAG,OAAO,KACf,MAAMW,EAAQhE,EAAY,CAAE,EAAGqD,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAG,EAAG,EACpDY,EAAWtD,IAAiBqD,EAClC,OACEJ,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,UAAWD,EAAO,OAClB,MAAO,CAAE,WAAYK,EAAO,MAAOpE,GAAWoE,CAAK,CAAA,EACnD,aAAYA,EACZ,eAAcC,EACd,QAAS,IAAM,CACbpD,EAAO9B,EAASsE,CAAC,CAAC,EAClBhD,EAASL,EAAY,CAAE,EAAGqD,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAGlC,EAAS,OAAA,CAAS,CAAC,CACvE,EAEC,YAAYyC,EAAAA,IAACE,EAAAA,KAAA,CAAK,KAAK,aAAa,KAAK,IAAA,CAAK,CAAA,EAX1CC,CAAA,CAcX,CAAC,CAAA,CAAA,CACH,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const pe=require("react/jsx-runtime"),a=require("react"),Ee=require("./breakpoints-Dpnh6BbG.cjs"),te=require("./translations-CXEeeUDL.cjs"),A=require("./messages-
|
|
2
|
-
//# sourceMappingURL=ConfigProvider-
|
|
1
|
+
"use strict";const pe=require("react/jsx-runtime"),a=require("react"),Ee=require("./breakpoints-Dpnh6BbG.cjs"),te=require("./translations-CXEeeUDL.cjs"),A=require("./messages-Jxz2YMcA.cjs");function Se(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 Ae(e){const[s,n,u]=e.split(",").map(C=>Number(C.trim()));return(s*299+n*587+u*114)/1e3>=150?"#04202b":"#ffffff"}const he={secondary:"rgb(var(--tz-color-primary-rgb))",warning:"#ffffff"};function se(e,s=document.documentElement){for(const[n,u]of Object.entries(e)){if(!u)continue;const r=Se(u);s.style.setProperty(`--tz-color-${n}-rgb`,r),s.style.setProperty(`--tz-color-${n}-contrast`,he[n]??Ae(r))}}const o=a.createContext(null),ae="tz-theme-mode",h=e=>`tz-accent-color-${e}`,ne="tz-header-sticky",re="tz-font-family",oe="tz-locale",ue=[{code:"en-US",label:"English"}],b="Inter",be=[b],Ce=e=>`'${e}', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`;function _e(){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 Le(e){if(typeof document>"u"||be.includes(e))return;const s=`tz-font-${e.trim().replace(/\s+/g,"-").toLowerCase()}`;if(document.getElementById(s))return;_e();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 L="tab",k="nestedTab",f="step",le=[],ce={},de={},ke={primary:"#13404e",secondary:"#ffffff",background:"#f9f9f9",surface:"#ffffff",accent:"#056472",success:"#00a854",error:"#f04134",info:"#039aa1",warning:"#ffbf00"},fe={primary:"#e6e8eb",secondary:"#191919",background:"#0f0f0f",surface:"#191919",accent:"#16a6b4",success:"#00a854",error:"#f04134",info:"#039aa1",warning:"#ffbf00"};function Fe(e){const s=localStorage.getItem(ae);return s==="light"||s==="dark"?s:e}function Ie(){return{light:localStorage.getItem(h("light"))||null,dark:localStorage.getItem(h("dark"))||null}}function Ue(e){const s=localStorage.getItem(ne);return s==="1"?!0:s==="0"?!1:e}function Ke(e){return localStorage.getItem(re)||e}function Re(e,s){const n=e.map(r=>r.code),u=localStorage.getItem(oe);return u&&n.includes(u)?u:s&&n.includes(s)?s:n.find(r=>r.toLowerCase().startsWith("en"))??n[0]??"en-US"}function Ne({config:e,children:s}){var q,x,G,j,J,V,W,X,Z,ee;const[n,u]=a.useState(()=>{var t;return Fe(((t=e==null?void 0:e.theme)==null?void 0:t.mode)??"light")}),[r,C]=a.useState(Ie),[F,me]=a.useState(()=>{var t;return Ue(((t=e==null?void 0:e.header)==null?void 0:t.sticky)??!1)}),[i,ye]=a.useState(()=>{var t;return Ke(((t=e==null?void 0:e.theme)==null?void 0:t.fontFamily)??b)}),_=((q=e==null?void 0:e.i18n)==null?void 0:q.languages)??ue,I=(x=e==null?void 0:e.i18n)==null?void 0:x.messages,U=(G=e==null?void 0:e.i18n)==null?void 0:G.appMessages,[m,Te]=a.useState(()=>{var t;return Re(_,(t=e==null?void 0:e.i18n)==null?void 0:t.language)}),c=(j=e==null?void 0:e.theme)==null?void 0:j.colors,T=a.useMemo(()=>{const t={...ke,...c==null?void 0:c.light},l={...t,...fe,...c==null?void 0:c.dark};return{light:t,dark:l}},[c]),K=a.useMemo(()=>({light:T.light.accent,dark:T.dark.accent}),[T]),y=a.useCallback((t,l=r[t])=>{const d=T[t];se(l?{...d,accent:l}:d);const S=document.documentElement;S.setAttribute("data-tz-theme",t),S.style.setProperty("color-scheme",t),localStorage.setItem(ae,t)},[T,r]);a.useLayoutEffect(()=>{y(n)},[y,n]);const R=(J=e==null?void 0:e.theme)==null?void 0:J.breakpoints;a.useLayoutEffect(()=>{Ee.setBreakpoints(R)},[JSON.stringify(R??null)]);const p=a.useCallback(t=>{y(t),u(t)},[y]),N=a.useCallback(()=>p(n==="light"?"dark":"light"),[n,p]),Q=a.useCallback((t,l)=>{const d=l??n;C(S=>({...S,[d]:t})),t?localStorage.setItem(h(d),t):localStorage.removeItem(h(d)),d===n&&y(n,t)},[n,y]),D=a.useCallback(t=>{me(t),localStorage.setItem(ne,t?"1":"0")},[]),E=a.useCallback(t=>{Le(t),document.documentElement.style.setProperty("--tz-font-family",Ce(t))},[]);a.useLayoutEffect(()=>{E(i)},[E,i]);const Y=a.useCallback(t=>{const l=t.trim()||b;E(l),ye(l),localStorage.setItem(re,l)},[E]),O=a.useCallback(t=>{Te(t),localStorage.setItem(oe,t)},[]),M=a.useMemo(()=>A.createTranslator(m,I),[m,I]),g=a.useMemo(()=>A.createAppTranslator(m,U),[m,U]),P=(e==null?void 0:e.locales)??le,z=((V=e==null?void 0:e.keys)==null?void 0:V.translationsNamespace)??te.DEFAULT_TRANSLATIONS_NAMESPACE,B=((W=e==null?void 0:e.keys)==null?void 0:W.tabQueryKey)??L,v=((X=e==null?void 0:e.keys)==null?void 0:X.nestedTabQueryKey)??k,w=((Z=e==null?void 0:e.keys)==null?void 0:Z.stepQueryKey)??f,H=((ee=e==null?void 0:e.table)==null?void 0:ee.query)??ce,$=(e==null?void 0:e.header)??de,ie=a.useMemo(()=>({mode:n,setMode:p,toggleMode:N,accentColors:r,defaultAccentColors:K,setAccentColor:Q,locales:P,translationsNamespace:z,tabQueryKey:B,nestedTabQueryKey:v,stepQueryKey:w,tableQuery:H,header:$,headerSticky:F,setHeaderSticky:D,fontFamily:i,setFontFamily:Y,language:m,setLanguage:O,languages:_,t:M,appT:g}),[n,p,N,r,K,Q,P,z,B,v,w,H,$,F,D,i,Y,m,O,_,M,g]);return pe.jsx(o.Provider,{value:ie,children:s})}function Qe(){const e=a.useContext(o);if(!e)throw new Error("useTheme must be used within a <ConfigProvider>");return e}function De(){var e;return((e=a.useContext(o))==null?void 0:e.locales)??le}const Ye=A.createTranslator("en"),Oe=A.createAppTranslator("en");function Me(){var e;return((e=a.useContext(o))==null?void 0:e.t)??Ye}function ge(){var e;return((e=a.useContext(o))==null?void 0:e.appT)??Oe}function Pe(){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)??ue}}function ze(){var e;return((e=a.useContext(o))==null?void 0:e.translationsNamespace)??te.DEFAULT_TRANSLATIONS_NAMESPACE}function Be(){var e;return((e=a.useContext(o))==null?void 0:e.tabQueryKey)??L}function ve(){var e;return((e=a.useContext(o))==null?void 0:e.nestedTabQueryKey)??k}function we(){var e;return((e=a.useContext(o))==null?void 0:e.stepQueryKey)??f}function He(){var e;return((e=a.useContext(o))==null?void 0:e.tableQuery)??ce}function $e(){var e;return((e=a.useContext(o))==null?void 0:e.header)??de}exports.ConfigProvider=Ne;exports.DEFAULT_FONT_FAMILY=b;exports.DEFAULT_NESTED_TAB_QUERY_KEY=k;exports.DEFAULT_STEP_QUERY_KEY=f;exports.DEFAULT_TABS_QUERY_KEY=L;exports.applyTheme=se;exports.useHeaderConfig=$e;exports.useLanguage=Pe;exports.useLocales=De;exports.useNestedTabQueryKey=ve;exports.useStepQueryKey=we;exports.useT=Me;exports.useTableQueryConfig=He;exports.useTabsQueryKey=Be;exports.useTheme=Qe;exports.useTranslations=ge;exports.useTranslationsNamespace=ze;
|
|
2
|
+
//# sourceMappingURL=ConfigProvider-BHNx-NHV.cjs.map
|