@techzyapp/ui-library 1.0.17 → 1.0.19
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/{AdminRoot-uVDhWjN8.js → AdminRoot-B2J1cHK5.js} +4 -4
- package/dist/{AdminRoot-uVDhWjN8.js.map → AdminRoot-B2J1cHK5.js.map} +1 -1
- package/dist/{AdminRoot-D866Bc0e.cjs → AdminRoot-DlpMJNTx.cjs} +2 -2
- package/dist/{AdminRoot-D866Bc0e.cjs.map → AdminRoot-DlpMJNTx.cjs.map} +1 -1
- package/dist/{Alert-D99G0StL.cjs → Alert-DRZdNwDm.cjs} +2 -2
- package/dist/{Alert-D99G0StL.cjs.map → Alert-DRZdNwDm.cjs.map} +1 -1
- package/dist/{Alert-B3rDvpbO.js → Alert-yldGvhVM.js} +3 -3
- package/dist/{Alert-B3rDvpbO.js.map → Alert-yldGvhVM.js.map} +1 -1
- package/dist/AuthLayout-B1tzhzHo.cjs +2 -0
- package/dist/{AuthLayout-pvqB9w-B.cjs.map → AuthLayout-B1tzhzHo.cjs.map} +1 -1
- package/dist/AuthLayout-j7EAPPXT.js +43 -0
- package/dist/{AuthLayout-DGCe90w0.js.map → AuthLayout-j7EAPPXT.js.map} +1 -1
- package/dist/{Breadcrumbs-C1crufqj.js → Breadcrumbs-FpIOHx_q.js} +3 -3
- package/dist/{Breadcrumbs-C1crufqj.js.map → Breadcrumbs-FpIOHx_q.js.map} +1 -1
- package/dist/{Breadcrumbs-s90MO0PD.cjs → Breadcrumbs-f0GE4lCI.cjs} +2 -2
- package/dist/{Breadcrumbs-s90MO0PD.cjs.map → Breadcrumbs-f0GE4lCI.cjs.map} +1 -1
- package/dist/{Button-CUsXYM-m.js → Button-BkjZ7wEu.js} +2 -2
- package/dist/{Button-CUsXYM-m.js.map → Button-BkjZ7wEu.js.map} +1 -1
- package/dist/{Button-Cj6pckNl.cjs → Button-Cu0XdnW6.cjs} +2 -2
- package/dist/{Button-Cj6pckNl.cjs.map → Button-Cu0XdnW6.cjs.map} +1 -1
- package/dist/{Calendar-Br4C0x0n.cjs → Calendar-CGQCditF.cjs} +2 -2
- package/dist/{Calendar-Br4C0x0n.cjs.map → Calendar-CGQCditF.cjs.map} +1 -1
- package/dist/{Calendar-CE_9WNAB.js → Calendar-DsJ6GICt.js} +3 -3
- package/dist/{Calendar-CE_9WNAB.js.map → Calendar-DsJ6GICt.js.map} +1 -1
- package/dist/{Card-DhpudGvF.js → Card-CumMi_XB.js} +2 -2
- package/dist/{Card-DhpudGvF.js.map → Card-CumMi_XB.js.map} +1 -1
- package/dist/{Card-DD9SWHzZ.cjs → Card-DGTGdaTZ.cjs} +2 -2
- package/dist/{Card-DD9SWHzZ.cjs.map → Card-DGTGdaTZ.cjs.map} +1 -1
- package/dist/{Chip-B2lY4TJ0.cjs → Chip-CJuAvgst.cjs} +2 -2
- package/dist/{Chip-B2lY4TJ0.cjs.map → Chip-CJuAvgst.cjs.map} +1 -1
- package/dist/{Chip-DulHqhuf.js → Chip-D83svOCW.js} +2 -2
- package/dist/{Chip-DulHqhuf.js.map → Chip-D83svOCW.js.map} +1 -1
- package/dist/{CodeBlock-DwBMghs2.js → CodeBlock-BK_KXhos.js} +3 -3
- package/dist/{CodeBlock-DwBMghs2.js.map → CodeBlock-BK_KXhos.js.map} +1 -1
- package/dist/{CodeBlock-EhB7v9-R.cjs → CodeBlock-C_UDrrY6.cjs} +2 -2
- package/dist/{CodeBlock-EhB7v9-R.cjs.map → CodeBlock-C_UDrrY6.cjs.map} +1 -1
- package/dist/{ColorPicker-Dc1y9Zuu.cjs → ColorPicker-BmxZnsNC.cjs} +2 -2
- package/dist/{ColorPicker-Dc1y9Zuu.cjs.map → ColorPicker-BmxZnsNC.cjs.map} +1 -1
- package/dist/{ColorPicker-DJgTeHht.js → ColorPicker-DLnB_AvZ.js} +3 -3
- package/dist/{ColorPicker-DJgTeHht.js.map → ColorPicker-DLnB_AvZ.js.map} +1 -1
- package/dist/{ColorPickerPanel-9tOQUL38.js → ColorPickerPanel-CG9idF4A.js} +2 -2
- package/dist/{ColorPickerPanel-9tOQUL38.js.map → ColorPickerPanel-CG9idF4A.js.map} +1 -1
- package/dist/{ColorPickerPanel-nXEliruE.cjs → ColorPickerPanel-CoyKplF5.cjs} +2 -2
- package/dist/{ColorPickerPanel-nXEliruE.cjs.map → ColorPickerPanel-CoyKplF5.cjs.map} +1 -1
- package/dist/{ConfigProvider-BYruQYHC.js → ConfigProvider-DDuIJSM7.js} +2 -2
- package/dist/{ConfigProvider-BYruQYHC.js.map → ConfigProvider-DDuIJSM7.js.map} +1 -1
- package/dist/{ConfigProvider-BHNx-NHV.cjs → ConfigProvider-h1WoGC3R.cjs} +2 -2
- package/dist/{ConfigProvider-BHNx-NHV.cjs.map → ConfigProvider-h1WoGC3R.cjs.map} +1 -1
- package/dist/{CopyButton-B4-OYsYr.js → CopyButton-DdQ-8ExN.js} +3 -3
- package/dist/{CopyButton-B4-OYsYr.js.map → CopyButton-DdQ-8ExN.js.map} +1 -1
- package/dist/{CopyButton-D_DCLHhb.cjs → CopyButton-tRMAy59I.cjs} +2 -2
- package/dist/{CopyButton-D_DCLHhb.cjs.map → CopyButton-tRMAy59I.cjs.map} +1 -1
- package/dist/{DatePicker-CEczjGZy.cjs → DatePicker-eryY6Xmx.cjs} +2 -2
- package/dist/{DatePicker-CEczjGZy.cjs.map → DatePicker-eryY6Xmx.cjs.map} +1 -1
- package/dist/{DatePicker-DkvfSN1K.js → DatePicker-pz634ktl.js} +4 -4
- package/dist/{DatePicker-DkvfSN1K.js.map → DatePicker-pz634ktl.js.map} +1 -1
- package/dist/{DateTimePicker-DPomyrnN.js → DateTimePicker-BJLq9Fud.js} +7 -7
- package/dist/{DateTimePicker-DPomyrnN.js.map → DateTimePicker-BJLq9Fud.js.map} +1 -1
- package/dist/{DateTimePicker-CDyGxUBX.cjs → DateTimePicker-CmH3ZuzN.cjs} +2 -2
- package/dist/{DateTimePicker-CDyGxUBX.cjs.map → DateTimePicker-CmH3ZuzN.cjs.map} +1 -1
- package/dist/{EmptyState-CVyFXprK.js → EmptyState-B2QPNhWW.js} +2 -2
- package/dist/{EmptyState-CVyFXprK.js.map → EmptyState-B2QPNhWW.js.map} +1 -1
- package/dist/{EmptyState-B77utgEn.cjs → EmptyState-Cxf4H8Cc.cjs} +2 -2
- package/dist/{EmptyState-B77utgEn.cjs.map → EmptyState-Cxf4H8Cc.cjs.map} +1 -1
- package/dist/{FileCard-CsGW2sxE.cjs → FileCard-D0Sa7WJt.cjs} +2 -2
- package/dist/{FileCard-CsGW2sxE.cjs.map → FileCard-D0Sa7WJt.cjs.map} +1 -1
- package/dist/{FileCard-Cpc5frNm.js → FileCard-Do9D72NA.js} +3 -3
- package/dist/{FileCard-Cpc5frNm.js.map → FileCard-Do9D72NA.js.map} +1 -1
- package/dist/{FileUploader-B_nKMh_K.js → FileUploader-4900qKEE.js} +5 -5
- package/dist/{FileUploader-B_nKMh_K.js.map → FileUploader-4900qKEE.js.map} +1 -1
- package/dist/{FileUploader-DDi_uzIx.cjs → FileUploader-B1Arfj1a.cjs} +2 -2
- package/dist/{FileUploader-DDi_uzIx.cjs.map → FileUploader-B1Arfj1a.cjs.map} +1 -1
- package/dist/{Flag-BJLWKB9J.cjs → Flag-D7Vlczlw.cjs} +2 -2
- package/dist/{Flag-BJLWKB9J.cjs.map → Flag-D7Vlczlw.cjs.map} +1 -1
- package/dist/{Flag-Ck1xK22A.js → Flag-DNhhLtCC.js} +2 -2
- package/dist/{Flag-Ck1xK22A.js.map → Flag-DNhhLtCC.js.map} +1 -1
- package/dist/{FullscreenToggle-DmC0jTay.js → FullscreenToggle-Bc4fB-Mi.js} +3 -3
- package/dist/{FullscreenToggle-DmC0jTay.js.map → FullscreenToggle-Bc4fB-Mi.js.map} +1 -1
- package/dist/{FullscreenToggle-MCxGzAEe.cjs → FullscreenToggle-dU2ai_OZ.cjs} +2 -2
- package/dist/{FullscreenToggle-MCxGzAEe.cjs.map → FullscreenToggle-dU2ai_OZ.cjs.map} +1 -1
- package/dist/{IconButton-B8FPGgDn.js → IconButton-DpTxmj3d.js} +2 -2
- package/dist/{IconButton-B8FPGgDn.js.map → IconButton-DpTxmj3d.js.map} +1 -1
- package/dist/{IconButton-BoY2y_pV.cjs → IconButton-DyRC514t.cjs} +2 -2
- package/dist/{IconButton-BoY2y_pV.cjs.map → IconButton-DyRC514t.cjs.map} +1 -1
- package/dist/{Loader-Cwb1bOHj.cjs → Loader-B45H2SMP.cjs} +2 -2
- package/dist/{Loader-Cwb1bOHj.cjs.map → Loader-B45H2SMP.cjs.map} +1 -1
- package/dist/{Loader-UzzqvFyo.js → Loader-B9VXX401.js} +2 -2
- package/dist/{Loader-UzzqvFyo.js.map → Loader-B9VXX401.js.map} +1 -1
- package/dist/{Modal-CO3c3sGY.cjs → Modal-DsoSz0Sp.cjs} +2 -2
- package/dist/{Modal-CO3c3sGY.cjs.map → Modal-DsoSz0Sp.cjs.map} +1 -1
- package/dist/{Modal-XMRDPHvQ.js → Modal-Us_E-lb2.js} +3 -3
- package/dist/{Modal-XMRDPHvQ.js.map → Modal-Us_E-lb2.js.map} +1 -1
- package/dist/{MultiSelect-DVOVHuIm.cjs → MultiSelect-CtLpWaBX.cjs} +2 -2
- package/dist/{MultiSelect-DVOVHuIm.cjs.map → MultiSelect-CtLpWaBX.cjs.map} +1 -1
- package/dist/{MultiSelect-BPLctumx.js → MultiSelect-sKk2KzOd.js} +4 -4
- package/dist/{MultiSelect-BPLctumx.js.map → MultiSelect-sKk2KzOd.js.map} +1 -1
- package/dist/{NumberField-BH237Vt2.cjs → NumberField-C6qj3nCa.cjs} +2 -2
- package/dist/{NumberField-BH237Vt2.cjs.map → NumberField-C6qj3nCa.cjs.map} +1 -1
- package/dist/{NumberField-X2HsSpu9.js → NumberField-Cz03nksO.js} +3 -3
- package/dist/{NumberField-X2HsSpu9.js.map → NumberField-Cz03nksO.js.map} +1 -1
- package/dist/{OtpField-CXP59zM2.cjs → OtpField-B46P6aMy.cjs} +2 -2
- package/dist/{OtpField-CXP59zM2.cjs.map → OtpField-B46P6aMy.cjs.map} +1 -1
- package/dist/{OtpField-CB05q0NX.js → OtpField-DLXQYMw1.js} +2 -2
- package/dist/{OtpField-CB05q0NX.js.map → OtpField-DLXQYMw1.js.map} +1 -1
- package/dist/{PageLayout-WKWnj5cw.js → PageLayout-BWU-p_N9.js} +2 -2
- package/dist/{PageLayout-WKWnj5cw.js.map → PageLayout-BWU-p_N9.js.map} +1 -1
- package/dist/{PageLayout-CuVuZEbR.cjs → PageLayout-BfeRjBek.cjs} +2 -2
- package/dist/{PageLayout-CuVuZEbR.cjs.map → PageLayout-BfeRjBek.cjs.map} +1 -1
- package/dist/{PageNotFound-DVh_Tyqf.js → PageNotFound-B_nTMrCD.js} +5 -5
- package/dist/{PageNotFound-DVh_Tyqf.js.map → PageNotFound-B_nTMrCD.js.map} +1 -1
- package/dist/{PageNotFound-D3ZjMKYD.cjs → PageNotFound-nvZm-UCG.cjs} +2 -2
- package/dist/{PageNotFound-D3ZjMKYD.cjs.map → PageNotFound-nvZm-UCG.cjs.map} +1 -1
- package/dist/{Pagination-BuP4N1bj.js → Pagination-BYXUhmSz.js} +2 -2
- package/dist/{Pagination-BuP4N1bj.js.map → Pagination-BYXUhmSz.js.map} +1 -1
- package/dist/{Pagination-Dcs_Znx3.cjs → Pagination-CsClNqIu.cjs} +2 -2
- package/dist/{Pagination-Dcs_Znx3.cjs.map → Pagination-CsClNqIu.cjs.map} +1 -1
- package/dist/{RemoveDialog-Cwtq9wAt.cjs → RemoveDialog-D5J9TYap.cjs} +2 -2
- package/dist/{RemoveDialog-Cwtq9wAt.cjs.map → RemoveDialog-D5J9TYap.cjs.map} +1 -1
- package/dist/{RemoveDialog-DU6MqkO8.js → RemoveDialog-PHdZi9-d.js} +4 -4
- package/dist/{RemoveDialog-DU6MqkO8.js.map → RemoveDialog-PHdZi9-d.js.map} +1 -1
- package/dist/{RichTextEditor-k-NlWb4Y.js → RichTextEditor-BcmsnYGJ.js} +7 -7
- package/dist/{RichTextEditor-k-NlWb4Y.js.map → RichTextEditor-BcmsnYGJ.js.map} +1 -1
- package/dist/{RichTextEditor-GxbnzLRe.cjs → RichTextEditor-jWv0t3vJ.cjs} +2 -2
- package/dist/{RichTextEditor-GxbnzLRe.cjs.map → RichTextEditor-jWv0t3vJ.cjs.map} +1 -1
- package/dist/RootLayout-DtZcqk9N.cjs +2 -0
- package/dist/RootLayout-DtZcqk9N.cjs.map +1 -0
- package/dist/RootLayout-q_oWf5et.js +422 -0
- package/dist/RootLayout-q_oWf5et.js.map +1 -0
- package/dist/{Select-DjMZec8c.cjs → Select-CWCeBQ8Q.cjs} +2 -2
- package/dist/{Select-DjMZec8c.cjs.map → Select-CWCeBQ8Q.cjs.map} +1 -1
- package/dist/{Select-D7KJ-YMU.js → Select-UygxT1Ry.js} +3 -3
- package/dist/{Select-D7KJ-YMU.js.map → Select-UygxT1Ry.js.map} +1 -1
- package/dist/Sidebar-BfBggyuh.cjs +2 -0
- package/dist/Sidebar-BfBggyuh.cjs.map +1 -0
- package/dist/Sidebar-C0OJK29L.js +513 -0
- package/dist/Sidebar-C0OJK29L.js.map +1 -0
- package/dist/{SpeedDial-DEWzAGXi.js → SpeedDial-DbvOJ4no.js} +2 -2
- package/dist/{SpeedDial-DEWzAGXi.js.map → SpeedDial-DbvOJ4no.js.map} +1 -1
- package/dist/{SpeedDial-CyiPagdu.cjs → SpeedDial-cKvuSMuk.cjs} +2 -2
- package/dist/{SpeedDial-CyiPagdu.cjs.map → SpeedDial-cKvuSMuk.cjs.map} +1 -1
- package/dist/{Stepper-CS6s0dMF.js → Stepper-BxGrP6JZ.js} +2 -2
- package/dist/{Stepper-CS6s0dMF.js.map → Stepper-BxGrP6JZ.js.map} +1 -1
- package/dist/{Stepper-PW7c45PV.cjs → Stepper-Db_ALAc4.cjs} +2 -2
- package/dist/{Stepper-PW7c45PV.cjs.map → Stepper-Db_ALAc4.cjs.map} +1 -1
- package/dist/{Table-C_Ov-kvK.cjs → Table-Dvna5_TR.cjs} +2 -2
- package/dist/{Table-C_Ov-kvK.cjs.map → Table-Dvna5_TR.cjs.map} +1 -1
- package/dist/{Table-IIAKXYOh.js → Table-tPOJ9umi.js} +15 -15
- package/dist/{Table-IIAKXYOh.js.map → Table-tPOJ9umi.js.map} +1 -1
- package/dist/{Tabs-D3wztVB1.js → Tabs-B0mWCNaC.js} +2 -2
- package/dist/{Tabs-D3wztVB1.js.map → Tabs-B0mWCNaC.js.map} +1 -1
- package/dist/{Tabs-CaHTJ99w.cjs → Tabs-ozklGWmX.cjs} +2 -2
- package/dist/{Tabs-CaHTJ99w.cjs.map → Tabs-ozklGWmX.cjs.map} +1 -1
- package/dist/{TagsField-BQIwSX5m.cjs → TagsField-BIxwLfSJ.cjs} +2 -2
- package/dist/{TagsField-BQIwSX5m.cjs.map → TagsField-BIxwLfSJ.cjs.map} +1 -1
- package/dist/{TagsField-BR9Z5pik.js → TagsField-CGFm17lP.js} +4 -4
- package/dist/{TagsField-BR9Z5pik.js.map → TagsField-CGFm17lP.js.map} +1 -1
- package/dist/{TextField-Bg4TwkVD.js → TextField-CRCYLPpr.js} +3 -3
- package/dist/{TextField-Bg4TwkVD.js.map → TextField-CRCYLPpr.js.map} +1 -1
- package/dist/{TextField-fmt7aacg.cjs → TextField-DvKEj36A.cjs} +2 -2
- package/dist/{TextField-fmt7aacg.cjs.map → TextField-DvKEj36A.cjs.map} +1 -1
- package/dist/{ThemeToggle-DEfXczDs.js → ThemeToggle-BwW9L115.js} +3 -3
- package/dist/{ThemeToggle-DEfXczDs.js.map → ThemeToggle-BwW9L115.js.map} +1 -1
- package/dist/{ThemeToggle-Cz5I2-DL.cjs → ThemeToggle-DxxLN79b.cjs} +2 -2
- package/dist/{ThemeToggle-Cz5I2-DL.cjs.map → ThemeToggle-DxxLN79b.cjs.map} +1 -1
- package/dist/{TimeColumns-B-vtakk8.js → TimeColumns-D3nqkQbh.js} +2 -2
- package/dist/{TimeColumns-B-vtakk8.js.map → TimeColumns-D3nqkQbh.js.map} +1 -1
- package/dist/{TimeColumns-IBmjExao.cjs → TimeColumns-DB-V4KpQ.cjs} +2 -2
- package/dist/{TimeColumns-IBmjExao.cjs.map → TimeColumns-DB-V4KpQ.cjs.map} +1 -1
- package/dist/{TimePicker-i2RnZHV1.js → TimePicker-D51QkQYy.js} +5 -5
- package/dist/{TimePicker-i2RnZHV1.js.map → TimePicker-D51QkQYy.js.map} +1 -1
- package/dist/{TimePicker-B-c6uIaY.cjs → TimePicker-D__72q2J.cjs} +2 -2
- package/dist/{TimePicker-B-c6uIaY.cjs.map → TimePicker-D__72q2J.cjs.map} +1 -1
- package/dist/{Toaster-Da8F_SFV.js → Toaster-BynCHvUr.js} +2 -2
- package/dist/{Toaster-Da8F_SFV.js.map → Toaster-BynCHvUr.js.map} +1 -1
- package/dist/{Toaster-qdS8Urgy.cjs → Toaster-tHet1M-T.cjs} +2 -2
- package/dist/{Toaster-qdS8Urgy.cjs.map → Toaster-tHet1M-T.cjs.map} +1 -1
- package/dist/{TranslatedFields-C30ww45c.cjs → TranslatedFields-B3Gli3TZ.cjs} +2 -2
- package/dist/{TranslatedFields-C30ww45c.cjs.map → TranslatedFields-B3Gli3TZ.cjs.map} +1 -1
- package/dist/{TranslatedFields-Ck9JTF27.js → TranslatedFields-DHRFcB3n.js} +5 -5
- package/dist/{TranslatedFields-Ck9JTF27.js.map → TranslatedFields-DHRFcB3n.js.map} +1 -1
- package/dist/{UserCard-0ZF29bkK.js → UserCard-D7U-CLbM.js} +3 -3
- package/dist/{UserCard-0ZF29bkK.js.map → UserCard-D7U-CLbM.js.map} +1 -1
- package/dist/{UserCard-C8rC_gzD.cjs → UserCard-GHw2gTx9.cjs} +2 -2
- package/dist/{UserCard-C8rC_gzD.cjs.map → UserCard-GHw2gTx9.cjs.map} +1 -1
- package/dist/components/Alert/index.cjs +1 -1
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AuthLayout/index.cjs +1 -1
- package/dist/components/AuthLayout/index.js +1 -1
- 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/index.cjs +1 -1
- package/dist/components/CopyButton/index.js +1 -1
- 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/index.cjs +1 -1
- package/dist/components/FileCard/index.js +1 -1
- 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/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/Sidebar.d.cts +47 -6
- package/dist/components/Sidebar/Sidebar.d.ts +47 -6
- 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/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/entries/app.cjs +1 -1
- package/dist/entries/app.js +1 -1
- package/dist/entries/components.cjs +1 -1
- package/dist/entries/components.js +41 -41
- 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/i18n/messages.d.cts +1 -0
- package/dist/i18n/messages.d.ts +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +24 -1
- package/dist/index.js +44 -44
- package/dist/messages-C0YutUM1.cjs +36 -0
- package/dist/messages-C0YutUM1.cjs.map +1 -0
- package/dist/{messages-BOKick2l.js → messages-FciBtnCL.js} +8 -1
- package/dist/messages-FciBtnCL.js.map +1 -0
- package/package.json +1 -1
- package/dist/AuthLayout-DGCe90w0.js +0 -43
- package/dist/AuthLayout-pvqB9w-B.cjs +0 -2
- package/dist/RootLayout-BEOofnxb.js +0 -407
- package/dist/RootLayout-BEOofnxb.js.map +0 -1
- package/dist/RootLayout-DGYOCwOK.cjs +0 -2
- package/dist/RootLayout-DGYOCwOK.cjs.map +0 -1
- package/dist/Sidebar-BYqUTa8D.cjs +0 -2
- package/dist/Sidebar-BYqUTa8D.cjs.map +0 -1
- package/dist/Sidebar-D2RZH5m5.js +0 -484
- package/dist/Sidebar-D2RZH5m5.js.map +0 -1
- package/dist/messages-BOKick2l.js.map +0 -1
- package/dist/messages-Jxz2YMcA.cjs +0 -36
- package/dist/messages-Jxz2YMcA.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar-Br4C0x0n.cjs","sources":["../src/components/DatePicker/Calendar.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { buildMonthGrid, isDisabled, today, toISO, yearList, type Dayjs } from './dateUtils'\nimport styles from './DatePicker.module.css'\n\nexport interface CalendarProps {\n /** Currently selected date (UTC dayjs) or null. */\n value: Dayjs | null\n /** The month currently shown (UTC dayjs). */\n month: Dayjs\n /** Change the shown month. */\n onMonthChange: (month: Dayjs) => void\n /** Commit a selected date as an ISO `'YYYY-MM-DD'` string. */\n onSelect: (iso: string) => void\n min: Dayjs | null\n max: Dayjs | null\n disabledDate?: (iso: string) => boolean\n /** 0 = Sunday … 6 = Saturday. */\n weekStartsOn: number\n /** Focus the active cell on mount (when the popover opens). */\n autoFocus?: boolean\n /** Id of the element labelling the grid. */\n labelId?: string\n}\n\ntype View = 'day' | 'month' | 'year'\n\n/** Picks the day that should hold roving focus for a given month. */\nfunction focusableDay(value: Dayjs | null, month: Dayjs): Dayjs {\n if (value && value.isSame(month, 'month')) return value\n const now = today()\n if (now.isSame(month, 'month')) return now\n return month.startOf('month')\n}\n\n/** Number of columns in the month / year picker grids (drives Up/Down arrow steps). */\nconst PICK_COLS = 3\n\n/**\n * The calendar grid used by the date components. Three views — a `role=\"grid\"` **day** view with full\n * keyboard navigation (Arrows move days, Home/End the week, PageUp/Down the month, Shift+PageUp/Down\n * the year, Enter/Space to select), plus separate **month** and **year** picker views reached from the\n * header (the month and year labels are independently clickable). Picking a year advances to the month\n * view; picking a month returns to the day view. The year view lists every year in range and scrolls.\n * Controlled: the consumer owns `value` + `month`; `onSelect`/`onMonthChange` lift changes up.\n */\nexport function Calendar({\n value,\n month,\n onMonthChange,\n onSelect,\n min,\n max,\n disabledDate,\n weekStartsOn,\n autoFocus,\n labelId,\n}: CalendarProps) {\n const t = useT()\n const [view, setView] = useState<View>('day')\n const [focused, setFocused] = useState<Dayjs>(() => focusableDay(value, month))\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n\n // re-anchor the roving focus into the month whenever it changes from outside (nav buttons, pickers)\n useEffect(() => {\n setFocused((f) => (f.isSame(month, 'month') ? f : focusableDay(value, month)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [month])\n\n // move DOM focus to the roving cell after a keyboard move, a view switch, or the initial autoFocus\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = bodyRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focused, view, month])\n\n const switchTo = (next: View) => {\n focusOnRender.current = true\n setView(next)\n }\n\n // ── navigation helpers ─────────────────────────────────────────────────────────────────────────\n const moveDay = (next: Dayjs) => {\n focusOnRender.current = true\n if (!next.isSame(month, 'month')) onMonthChange(next.startOf('month'))\n setFocused(next)\n }\n const stepMonthBy = (delta: number) => {\n const next = focused.add(delta, 'month')\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // keep the rendered grid + header in sync with focus\n }\n const stepYearBy = (delta: number) => {\n let year = focused.year() + delta\n if (min) year = Math.max(year, min.year())\n if (max) year = Math.min(year, max.year())\n const next = focused.year(year)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // re-anchor the year window so focus never leaves it\n }\n\n const pickYear = (y: number) => {\n const next = month.year(y)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next)\n setView('month') // picking a year advances to the month view\n }\n const pickMonth = (m: number) => {\n const next = month.month(m)\n focusOnRender.current = true\n setFocused(focusableDay(value, next))\n onMonthChange(next)\n setView('day') // picking a month returns to the day view\n }\n\n // ── keyboard ─────────────────────────────────────────────────────────────────────────────────────\n const handleDayKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offsetInWeek = (focused.day() - weekStartsOn + 7) % 7\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n moveDay(focused.subtract(1, 'day'))\n break\n case 'ArrowRight':\n event.preventDefault()\n moveDay(focused.add(1, 'day'))\n break\n case 'ArrowUp':\n event.preventDefault()\n moveDay(focused.subtract(7, 'day'))\n break\n case 'ArrowDown':\n event.preventDefault()\n moveDay(focused.add(7, 'day'))\n break\n case 'Home':\n event.preventDefault()\n moveDay(focused.subtract(offsetInWeek, 'day'))\n break\n case 'End':\n event.preventDefault()\n moveDay(focused.add(6 - offsetInWeek, 'day'))\n break\n case 'PageUp':\n event.preventDefault()\n moveDay(focused.subtract(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'PageDown':\n event.preventDefault()\n moveDay(focused.add(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!isDisabled(focused, min, max, disabledDate)) onSelect(toISO(focused))\n break\n }\n }\n\n const handleMonthKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepMonthBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepMonthBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepMonthBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepMonthBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickMonth(focused.month())\n break\n }\n }\n\n const handleYearKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepYearBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepYearBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepYearBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepYearBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickYear(focused.year())\n break\n }\n }\n\n // ── derived data (built once per render) ─────────────────────────────────────────────────────────\n const now = today()\n // month names + short weekday labels come from the i18n catalog (localized), not dayjs\n const monthName = (m: number) => t(`calendar.month${m}` as MessageKey)\n const weekdays = Array.from({ length: 7 }, (_, i) =>\n t(`calendar.weekday${(weekStartsOn + i) % 7}` as MessageKey),\n )\n const monthGrid = view === 'day' ? buildMonthGrid(month, weekStartsOn) : []\n const months = view === 'month' ? Array.from({ length: 12 }, (_, m) => monthName(m)) : []\n const years = view === 'year' ? yearList(min, max, month.year()) : []\n\n return (\n <div className={styles.calendar}>\n <div className={styles.calHeader}>\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.prevMonth')}\n onClick={() => onMonthChange(month.subtract(1, 'month'))}\n >\n <Icon name=\"ArrowCircleLeft\" />\n </IconButton>\n )}\n\n <div className={styles.calTitleGroup}>\n {(view === 'day' || view === 'month') && (\n <button\n type=\"button\"\n id={labelId}\n className={styles.calTitle}\n onClick={() => switchTo('year')}\n >\n {month.format('YYYY')}\n </button>\n )}\n {view === 'day' && (\n <button type=\"button\" className={styles.calTitle} onClick={() => switchTo('month')}>\n {monthName(month.month())}\n </button>\n )}\n {view === 'year' && (\n <span id={labelId} className={styles.calTitleStatic}>\n {t('calendar.selectYear')}\n </span>\n )}\n </div>\n\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.nextMonth')}\n onClick={() => onMonthChange(month.add(1, 'month'))}\n >\n <Icon name=\"ArrowCircleRight\" />\n </IconButton>\n )}\n </div>\n\n {view === 'year' ? (\n <div\n ref={bodyRef}\n className={clsx(styles.pickGrid, styles.pickScroll)}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleYearKeyDown}\n >\n {years.map((y) => {\n const isSelected = value ? value.year() === y : false\n return (\n <button\n key={y}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && y === now.year() && styles.pickToday,\n )}\n tabIndex={y === focused.year() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickYear(y)}\n >\n {y}\n </button>\n )\n })}\n </div>\n ) : view === 'month' ? (\n <div\n ref={bodyRef}\n className={styles.pickGrid}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleMonthKeyDown}\n >\n {months.map((label, m) => {\n const isSelected = value ? value.isSame(month.month(m), 'month') : false\n const isCurrent = now.isSame(month.month(m), 'month')\n return (\n <button\n key={label}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && isCurrent && styles.pickToday,\n )}\n tabIndex={m === focused.month() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickMonth(m)}\n >\n {label}\n </button>\n )\n })}\n </div>\n ) : (\n <div\n ref={bodyRef}\n className={styles.grid}\n role=\"grid\"\n aria-label={`${monthName(month.month())} ${month.format('YYYY')}`}\n onKeyDown={handleDayKeyDown}\n >\n <div className={styles.weekdays} role=\"row\">\n {weekdays.map((w, i) => (\n <span key={i} role=\"columnheader\" className={styles.weekday}>\n {w}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, wk) => (\n <div key={wk} role=\"row\" className={styles.week}>\n {monthGrid.slice(wk * 7, wk * 7 + 7).map((d) => {\n const selected = value ? d.date.isSame(value, 'day') : false\n const disabled = isDisabled(d.date, min, max, disabledDate)\n return (\n <button\n key={d.iso}\n type=\"button\"\n role=\"gridcell\"\n className={clsx(\n styles.day,\n !d.inMonth && styles.dayOutside,\n selected && styles.daySelected,\n d.isToday && styles.dayToday,\n disabled && styles.dayDisabled,\n )}\n tabIndex={d.date.isSame(focused, 'day') ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={d.isToday ? 'date' : undefined}\n onClick={() => !disabled && onSelect(d.iso)}\n >\n {d.date.date()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"names":["focusableDay","value","month","now","today","PICK_COLS","Calendar","onMonthChange","onSelect","min","max","disabledDate","weekStartsOn","autoFocus","labelId","t","useT","view","setView","useState","focused","setFocused","bodyRef","useRef","focusOnRender","useEffect","f","el","_a","_b","switchTo","next","moveDay","stepMonthBy","delta","stepYearBy","year","pickYear","y","pickMonth","m","handleDayKeyDown","event","offsetInWeek","isDisabled","toISO","handleMonthKeyDown","handleYearKeyDown","monthName","weekdays","_","i","monthGrid","buildMonthGrid","months","years","yearList","jsxs","styles","jsx","IconButton","Icon","clsx","isSelected","label","isCurrent","w","wk","d","selected","disabled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar-CGQCditF.cjs","sources":["../src/components/DatePicker/Calendar.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { buildMonthGrid, isDisabled, today, toISO, yearList, type Dayjs } from './dateUtils'\nimport styles from './DatePicker.module.css'\n\nexport interface CalendarProps {\n /** Currently selected date (UTC dayjs) or null. */\n value: Dayjs | null\n /** The month currently shown (UTC dayjs). */\n month: Dayjs\n /** Change the shown month. */\n onMonthChange: (month: Dayjs) => void\n /** Commit a selected date as an ISO `'YYYY-MM-DD'` string. */\n onSelect: (iso: string) => void\n min: Dayjs | null\n max: Dayjs | null\n disabledDate?: (iso: string) => boolean\n /** 0 = Sunday … 6 = Saturday. */\n weekStartsOn: number\n /** Focus the active cell on mount (when the popover opens). */\n autoFocus?: boolean\n /** Id of the element labelling the grid. */\n labelId?: string\n}\n\ntype View = 'day' | 'month' | 'year'\n\n/** Picks the day that should hold roving focus for a given month. */\nfunction focusableDay(value: Dayjs | null, month: Dayjs): Dayjs {\n if (value && value.isSame(month, 'month')) return value\n const now = today()\n if (now.isSame(month, 'month')) return now\n return month.startOf('month')\n}\n\n/** Number of columns in the month / year picker grids (drives Up/Down arrow steps). */\nconst PICK_COLS = 3\n\n/**\n * The calendar grid used by the date components. Three views — a `role=\"grid\"` **day** view with full\n * keyboard navigation (Arrows move days, Home/End the week, PageUp/Down the month, Shift+PageUp/Down\n * the year, Enter/Space to select), plus separate **month** and **year** picker views reached from the\n * header (the month and year labels are independently clickable). Picking a year advances to the month\n * view; picking a month returns to the day view. The year view lists every year in range and scrolls.\n * Controlled: the consumer owns `value` + `month`; `onSelect`/`onMonthChange` lift changes up.\n */\nexport function Calendar({\n value,\n month,\n onMonthChange,\n onSelect,\n min,\n max,\n disabledDate,\n weekStartsOn,\n autoFocus,\n labelId,\n}: CalendarProps) {\n const t = useT()\n const [view, setView] = useState<View>('day')\n const [focused, setFocused] = useState<Dayjs>(() => focusableDay(value, month))\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n\n // re-anchor the roving focus into the month whenever it changes from outside (nav buttons, pickers)\n useEffect(() => {\n setFocused((f) => (f.isSame(month, 'month') ? f : focusableDay(value, month)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [month])\n\n // move DOM focus to the roving cell after a keyboard move, a view switch, or the initial autoFocus\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = bodyRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focused, view, month])\n\n const switchTo = (next: View) => {\n focusOnRender.current = true\n setView(next)\n }\n\n // ── navigation helpers ─────────────────────────────────────────────────────────────────────────\n const moveDay = (next: Dayjs) => {\n focusOnRender.current = true\n if (!next.isSame(month, 'month')) onMonthChange(next.startOf('month'))\n setFocused(next)\n }\n const stepMonthBy = (delta: number) => {\n const next = focused.add(delta, 'month')\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // keep the rendered grid + header in sync with focus\n }\n const stepYearBy = (delta: number) => {\n let year = focused.year() + delta\n if (min) year = Math.max(year, min.year())\n if (max) year = Math.min(year, max.year())\n const next = focused.year(year)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // re-anchor the year window so focus never leaves it\n }\n\n const pickYear = (y: number) => {\n const next = month.year(y)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next)\n setView('month') // picking a year advances to the month view\n }\n const pickMonth = (m: number) => {\n const next = month.month(m)\n focusOnRender.current = true\n setFocused(focusableDay(value, next))\n onMonthChange(next)\n setView('day') // picking a month returns to the day view\n }\n\n // ── keyboard ─────────────────────────────────────────────────────────────────────────────────────\n const handleDayKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offsetInWeek = (focused.day() - weekStartsOn + 7) % 7\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n moveDay(focused.subtract(1, 'day'))\n break\n case 'ArrowRight':\n event.preventDefault()\n moveDay(focused.add(1, 'day'))\n break\n case 'ArrowUp':\n event.preventDefault()\n moveDay(focused.subtract(7, 'day'))\n break\n case 'ArrowDown':\n event.preventDefault()\n moveDay(focused.add(7, 'day'))\n break\n case 'Home':\n event.preventDefault()\n moveDay(focused.subtract(offsetInWeek, 'day'))\n break\n case 'End':\n event.preventDefault()\n moveDay(focused.add(6 - offsetInWeek, 'day'))\n break\n case 'PageUp':\n event.preventDefault()\n moveDay(focused.subtract(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'PageDown':\n event.preventDefault()\n moveDay(focused.add(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!isDisabled(focused, min, max, disabledDate)) onSelect(toISO(focused))\n break\n }\n }\n\n const handleMonthKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepMonthBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepMonthBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepMonthBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepMonthBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickMonth(focused.month())\n break\n }\n }\n\n const handleYearKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepYearBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepYearBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepYearBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepYearBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickYear(focused.year())\n break\n }\n }\n\n // ── derived data (built once per render) ─────────────────────────────────────────────────────────\n const now = today()\n // month names + short weekday labels come from the i18n catalog (localized), not dayjs\n const monthName = (m: number) => t(`calendar.month${m}` as MessageKey)\n const weekdays = Array.from({ length: 7 }, (_, i) =>\n t(`calendar.weekday${(weekStartsOn + i) % 7}` as MessageKey),\n )\n const monthGrid = view === 'day' ? buildMonthGrid(month, weekStartsOn) : []\n const months = view === 'month' ? Array.from({ length: 12 }, (_, m) => monthName(m)) : []\n const years = view === 'year' ? yearList(min, max, month.year()) : []\n\n return (\n <div className={styles.calendar}>\n <div className={styles.calHeader}>\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.prevMonth')}\n onClick={() => onMonthChange(month.subtract(1, 'month'))}\n >\n <Icon name=\"ArrowCircleLeft\" />\n </IconButton>\n )}\n\n <div className={styles.calTitleGroup}>\n {(view === 'day' || view === 'month') && (\n <button\n type=\"button\"\n id={labelId}\n className={styles.calTitle}\n onClick={() => switchTo('year')}\n >\n {month.format('YYYY')}\n </button>\n )}\n {view === 'day' && (\n <button type=\"button\" className={styles.calTitle} onClick={() => switchTo('month')}>\n {monthName(month.month())}\n </button>\n )}\n {view === 'year' && (\n <span id={labelId} className={styles.calTitleStatic}>\n {t('calendar.selectYear')}\n </span>\n )}\n </div>\n\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.nextMonth')}\n onClick={() => onMonthChange(month.add(1, 'month'))}\n >\n <Icon name=\"ArrowCircleRight\" />\n </IconButton>\n )}\n </div>\n\n {view === 'year' ? (\n <div\n ref={bodyRef}\n className={clsx(styles.pickGrid, styles.pickScroll)}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleYearKeyDown}\n >\n {years.map((y) => {\n const isSelected = value ? value.year() === y : false\n return (\n <button\n key={y}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && y === now.year() && styles.pickToday,\n )}\n tabIndex={y === focused.year() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickYear(y)}\n >\n {y}\n </button>\n )\n })}\n </div>\n ) : view === 'month' ? (\n <div\n ref={bodyRef}\n className={styles.pickGrid}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleMonthKeyDown}\n >\n {months.map((label, m) => {\n const isSelected = value ? value.isSame(month.month(m), 'month') : false\n const isCurrent = now.isSame(month.month(m), 'month')\n return (\n <button\n key={label}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && isCurrent && styles.pickToday,\n )}\n tabIndex={m === focused.month() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickMonth(m)}\n >\n {label}\n </button>\n )\n })}\n </div>\n ) : (\n <div\n ref={bodyRef}\n className={styles.grid}\n role=\"grid\"\n aria-label={`${monthName(month.month())} ${month.format('YYYY')}`}\n onKeyDown={handleDayKeyDown}\n >\n <div className={styles.weekdays} role=\"row\">\n {weekdays.map((w, i) => (\n <span key={i} role=\"columnheader\" className={styles.weekday}>\n {w}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, wk) => (\n <div key={wk} role=\"row\" className={styles.week}>\n {monthGrid.slice(wk * 7, wk * 7 + 7).map((d) => {\n const selected = value ? d.date.isSame(value, 'day') : false\n const disabled = isDisabled(d.date, min, max, disabledDate)\n return (\n <button\n key={d.iso}\n type=\"button\"\n role=\"gridcell\"\n className={clsx(\n styles.day,\n !d.inMonth && styles.dayOutside,\n selected && styles.daySelected,\n d.isToday && styles.dayToday,\n disabled && styles.dayDisabled,\n )}\n tabIndex={d.date.isSame(focused, 'day') ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={d.isToday ? 'date' : undefined}\n onClick={() => !disabled && onSelect(d.iso)}\n >\n {d.date.date()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"names":["focusableDay","value","month","now","today","PICK_COLS","Calendar","onMonthChange","onSelect","min","max","disabledDate","weekStartsOn","autoFocus","labelId","t","useT","view","setView","useState","focused","setFocused","bodyRef","useRef","focusOnRender","useEffect","f","el","_a","_b","switchTo","next","moveDay","stepMonthBy","delta","stepYearBy","year","pickYear","y","pickMonth","m","handleDayKeyDown","event","offsetInWeek","isDisabled","toISO","handleMonthKeyDown","handleYearKeyDown","monthName","weekdays","_","i","monthGrid","buildMonthGrid","months","years","yearList","jsxs","styles","jsx","IconButton","Icon","clsx","isSelected","label","isCurrent","w","wk","d","selected","disabled"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsxs as A, jsx as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as G, useRef as B, useEffect as U } from "react";
|
|
3
3
|
import { clsx as N } from "clsx";
|
|
4
4
|
import { I as _ } from "./Icon-CophpkHo.js";
|
|
5
|
-
import { I as $ } from "./IconButton-
|
|
5
|
+
import { I as $ } from "./IconButton-DpTxmj3d.js";
|
|
6
6
|
import { t as M, e as J, y as Q, s as r, i as v, d as X } from "./DatePicker.module-BZDftL4g.js";
|
|
7
|
-
import { a as Z } from "./ConfigProvider-
|
|
7
|
+
import { a as Z } from "./ConfigProvider-DDuIJSM7.js";
|
|
8
8
|
function K(n, t) {
|
|
9
9
|
if (n && n.isSame(t, "month")) return n;
|
|
10
10
|
const l = M();
|
|
@@ -264,4 +264,4 @@ function ne({
|
|
|
264
264
|
export {
|
|
265
265
|
ne as C
|
|
266
266
|
};
|
|
267
|
-
//# sourceMappingURL=Calendar-
|
|
267
|
+
//# sourceMappingURL=Calendar-DsJ6GICt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar-CE_9WNAB.js","sources":["../src/components/DatePicker/Calendar.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { buildMonthGrid, isDisabled, today, toISO, yearList, type Dayjs } from './dateUtils'\nimport styles from './DatePicker.module.css'\n\nexport interface CalendarProps {\n /** Currently selected date (UTC dayjs) or null. */\n value: Dayjs | null\n /** The month currently shown (UTC dayjs). */\n month: Dayjs\n /** Change the shown month. */\n onMonthChange: (month: Dayjs) => void\n /** Commit a selected date as an ISO `'YYYY-MM-DD'` string. */\n onSelect: (iso: string) => void\n min: Dayjs | null\n max: Dayjs | null\n disabledDate?: (iso: string) => boolean\n /** 0 = Sunday … 6 = Saturday. */\n weekStartsOn: number\n /** Focus the active cell on mount (when the popover opens). */\n autoFocus?: boolean\n /** Id of the element labelling the grid. */\n labelId?: string\n}\n\ntype View = 'day' | 'month' | 'year'\n\n/** Picks the day that should hold roving focus for a given month. */\nfunction focusableDay(value: Dayjs | null, month: Dayjs): Dayjs {\n if (value && value.isSame(month, 'month')) return value\n const now = today()\n if (now.isSame(month, 'month')) return now\n return month.startOf('month')\n}\n\n/** Number of columns in the month / year picker grids (drives Up/Down arrow steps). */\nconst PICK_COLS = 3\n\n/**\n * The calendar grid used by the date components. Three views — a `role=\"grid\"` **day** view with full\n * keyboard navigation (Arrows move days, Home/End the week, PageUp/Down the month, Shift+PageUp/Down\n * the year, Enter/Space to select), plus separate **month** and **year** picker views reached from the\n * header (the month and year labels are independently clickable). Picking a year advances to the month\n * view; picking a month returns to the day view. The year view lists every year in range and scrolls.\n * Controlled: the consumer owns `value` + `month`; `onSelect`/`onMonthChange` lift changes up.\n */\nexport function Calendar({\n value,\n month,\n onMonthChange,\n onSelect,\n min,\n max,\n disabledDate,\n weekStartsOn,\n autoFocus,\n labelId,\n}: CalendarProps) {\n const t = useT()\n const [view, setView] = useState<View>('day')\n const [focused, setFocused] = useState<Dayjs>(() => focusableDay(value, month))\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n\n // re-anchor the roving focus into the month whenever it changes from outside (nav buttons, pickers)\n useEffect(() => {\n setFocused((f) => (f.isSame(month, 'month') ? f : focusableDay(value, month)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [month])\n\n // move DOM focus to the roving cell after a keyboard move, a view switch, or the initial autoFocus\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = bodyRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focused, view, month])\n\n const switchTo = (next: View) => {\n focusOnRender.current = true\n setView(next)\n }\n\n // ── navigation helpers ─────────────────────────────────────────────────────────────────────────\n const moveDay = (next: Dayjs) => {\n focusOnRender.current = true\n if (!next.isSame(month, 'month')) onMonthChange(next.startOf('month'))\n setFocused(next)\n }\n const stepMonthBy = (delta: number) => {\n const next = focused.add(delta, 'month')\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // keep the rendered grid + header in sync with focus\n }\n const stepYearBy = (delta: number) => {\n let year = focused.year() + delta\n if (min) year = Math.max(year, min.year())\n if (max) year = Math.min(year, max.year())\n const next = focused.year(year)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // re-anchor the year window so focus never leaves it\n }\n\n const pickYear = (y: number) => {\n const next = month.year(y)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next)\n setView('month') // picking a year advances to the month view\n }\n const pickMonth = (m: number) => {\n const next = month.month(m)\n focusOnRender.current = true\n setFocused(focusableDay(value, next))\n onMonthChange(next)\n setView('day') // picking a month returns to the day view\n }\n\n // ── keyboard ─────────────────────────────────────────────────────────────────────────────────────\n const handleDayKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offsetInWeek = (focused.day() - weekStartsOn + 7) % 7\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n moveDay(focused.subtract(1, 'day'))\n break\n case 'ArrowRight':\n event.preventDefault()\n moveDay(focused.add(1, 'day'))\n break\n case 'ArrowUp':\n event.preventDefault()\n moveDay(focused.subtract(7, 'day'))\n break\n case 'ArrowDown':\n event.preventDefault()\n moveDay(focused.add(7, 'day'))\n break\n case 'Home':\n event.preventDefault()\n moveDay(focused.subtract(offsetInWeek, 'day'))\n break\n case 'End':\n event.preventDefault()\n moveDay(focused.add(6 - offsetInWeek, 'day'))\n break\n case 'PageUp':\n event.preventDefault()\n moveDay(focused.subtract(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'PageDown':\n event.preventDefault()\n moveDay(focused.add(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!isDisabled(focused, min, max, disabledDate)) onSelect(toISO(focused))\n break\n }\n }\n\n const handleMonthKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepMonthBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepMonthBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepMonthBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepMonthBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickMonth(focused.month())\n break\n }\n }\n\n const handleYearKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepYearBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepYearBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepYearBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepYearBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickYear(focused.year())\n break\n }\n }\n\n // ── derived data (built once per render) ─────────────────────────────────────────────────────────\n const now = today()\n // month names + short weekday labels come from the i18n catalog (localized), not dayjs\n const monthName = (m: number) => t(`calendar.month${m}` as MessageKey)\n const weekdays = Array.from({ length: 7 }, (_, i) =>\n t(`calendar.weekday${(weekStartsOn + i) % 7}` as MessageKey),\n )\n const monthGrid = view === 'day' ? buildMonthGrid(month, weekStartsOn) : []\n const months = view === 'month' ? Array.from({ length: 12 }, (_, m) => monthName(m)) : []\n const years = view === 'year' ? yearList(min, max, month.year()) : []\n\n return (\n <div className={styles.calendar}>\n <div className={styles.calHeader}>\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.prevMonth')}\n onClick={() => onMonthChange(month.subtract(1, 'month'))}\n >\n <Icon name=\"ArrowCircleLeft\" />\n </IconButton>\n )}\n\n <div className={styles.calTitleGroup}>\n {(view === 'day' || view === 'month') && (\n <button\n type=\"button\"\n id={labelId}\n className={styles.calTitle}\n onClick={() => switchTo('year')}\n >\n {month.format('YYYY')}\n </button>\n )}\n {view === 'day' && (\n <button type=\"button\" className={styles.calTitle} onClick={() => switchTo('month')}>\n {monthName(month.month())}\n </button>\n )}\n {view === 'year' && (\n <span id={labelId} className={styles.calTitleStatic}>\n {t('calendar.selectYear')}\n </span>\n )}\n </div>\n\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.nextMonth')}\n onClick={() => onMonthChange(month.add(1, 'month'))}\n >\n <Icon name=\"ArrowCircleRight\" />\n </IconButton>\n )}\n </div>\n\n {view === 'year' ? (\n <div\n ref={bodyRef}\n className={clsx(styles.pickGrid, styles.pickScroll)}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleYearKeyDown}\n >\n {years.map((y) => {\n const isSelected = value ? value.year() === y : false\n return (\n <button\n key={y}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && y === now.year() && styles.pickToday,\n )}\n tabIndex={y === focused.year() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickYear(y)}\n >\n {y}\n </button>\n )\n })}\n </div>\n ) : view === 'month' ? (\n <div\n ref={bodyRef}\n className={styles.pickGrid}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleMonthKeyDown}\n >\n {months.map((label, m) => {\n const isSelected = value ? value.isSame(month.month(m), 'month') : false\n const isCurrent = now.isSame(month.month(m), 'month')\n return (\n <button\n key={label}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && isCurrent && styles.pickToday,\n )}\n tabIndex={m === focused.month() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickMonth(m)}\n >\n {label}\n </button>\n )\n })}\n </div>\n ) : (\n <div\n ref={bodyRef}\n className={styles.grid}\n role=\"grid\"\n aria-label={`${monthName(month.month())} ${month.format('YYYY')}`}\n onKeyDown={handleDayKeyDown}\n >\n <div className={styles.weekdays} role=\"row\">\n {weekdays.map((w, i) => (\n <span key={i} role=\"columnheader\" className={styles.weekday}>\n {w}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, wk) => (\n <div key={wk} role=\"row\" className={styles.week}>\n {monthGrid.slice(wk * 7, wk * 7 + 7).map((d) => {\n const selected = value ? d.date.isSame(value, 'day') : false\n const disabled = isDisabled(d.date, min, max, disabledDate)\n return (\n <button\n key={d.iso}\n type=\"button\"\n role=\"gridcell\"\n className={clsx(\n styles.day,\n !d.inMonth && styles.dayOutside,\n selected && styles.daySelected,\n d.isToday && styles.dayToday,\n disabled && styles.dayDisabled,\n )}\n tabIndex={d.date.isSame(focused, 'day') ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={d.isToday ? 'date' : undefined}\n onClick={() => !disabled && onSelect(d.iso)}\n >\n {d.date.date()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"names":["focusableDay","value","month","now","today","PICK_COLS","Calendar","onMonthChange","onSelect","min","max","disabledDate","weekStartsOn","autoFocus","labelId","t","useT","view","setView","useState","focused","setFocused","bodyRef","useRef","focusOnRender","useEffect","f","el","_a","_b","switchTo","next","moveDay","stepMonthBy","delta","stepYearBy","year","pickYear","y","pickMonth","m","handleDayKeyDown","event","offsetInWeek","isDisabled","toISO","handleMonthKeyDown","handleYearKeyDown","monthName","weekdays","_","i","monthGrid","buildMonthGrid","months","years","yearList","jsxs","styles","jsx","IconButton","Icon","clsx","isSelected","label","isCurrent","w","wk","d","selected","disabled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar-DsJ6GICt.js","sources":["../src/components/DatePicker/Calendar.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { buildMonthGrid, isDisabled, today, toISO, yearList, type Dayjs } from './dateUtils'\nimport styles from './DatePicker.module.css'\n\nexport interface CalendarProps {\n /** Currently selected date (UTC dayjs) or null. */\n value: Dayjs | null\n /** The month currently shown (UTC dayjs). */\n month: Dayjs\n /** Change the shown month. */\n onMonthChange: (month: Dayjs) => void\n /** Commit a selected date as an ISO `'YYYY-MM-DD'` string. */\n onSelect: (iso: string) => void\n min: Dayjs | null\n max: Dayjs | null\n disabledDate?: (iso: string) => boolean\n /** 0 = Sunday … 6 = Saturday. */\n weekStartsOn: number\n /** Focus the active cell on mount (when the popover opens). */\n autoFocus?: boolean\n /** Id of the element labelling the grid. */\n labelId?: string\n}\n\ntype View = 'day' | 'month' | 'year'\n\n/** Picks the day that should hold roving focus for a given month. */\nfunction focusableDay(value: Dayjs | null, month: Dayjs): Dayjs {\n if (value && value.isSame(month, 'month')) return value\n const now = today()\n if (now.isSame(month, 'month')) return now\n return month.startOf('month')\n}\n\n/** Number of columns in the month / year picker grids (drives Up/Down arrow steps). */\nconst PICK_COLS = 3\n\n/**\n * The calendar grid used by the date components. Three views — a `role=\"grid\"` **day** view with full\n * keyboard navigation (Arrows move days, Home/End the week, PageUp/Down the month, Shift+PageUp/Down\n * the year, Enter/Space to select), plus separate **month** and **year** picker views reached from the\n * header (the month and year labels are independently clickable). Picking a year advances to the month\n * view; picking a month returns to the day view. The year view lists every year in range and scrolls.\n * Controlled: the consumer owns `value` + `month`; `onSelect`/`onMonthChange` lift changes up.\n */\nexport function Calendar({\n value,\n month,\n onMonthChange,\n onSelect,\n min,\n max,\n disabledDate,\n weekStartsOn,\n autoFocus,\n labelId,\n}: CalendarProps) {\n const t = useT()\n const [view, setView] = useState<View>('day')\n const [focused, setFocused] = useState<Dayjs>(() => focusableDay(value, month))\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n\n // re-anchor the roving focus into the month whenever it changes from outside (nav buttons, pickers)\n useEffect(() => {\n setFocused((f) => (f.isSame(month, 'month') ? f : focusableDay(value, month)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [month])\n\n // move DOM focus to the roving cell after a keyboard move, a view switch, or the initial autoFocus\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = bodyRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focused, view, month])\n\n const switchTo = (next: View) => {\n focusOnRender.current = true\n setView(next)\n }\n\n // ── navigation helpers ─────────────────────────────────────────────────────────────────────────\n const moveDay = (next: Dayjs) => {\n focusOnRender.current = true\n if (!next.isSame(month, 'month')) onMonthChange(next.startOf('month'))\n setFocused(next)\n }\n const stepMonthBy = (delta: number) => {\n const next = focused.add(delta, 'month')\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // keep the rendered grid + header in sync with focus\n }\n const stepYearBy = (delta: number) => {\n let year = focused.year() + delta\n if (min) year = Math.max(year, min.year())\n if (max) year = Math.min(year, max.year())\n const next = focused.year(year)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next.startOf('month')) // re-anchor the year window so focus never leaves it\n }\n\n const pickYear = (y: number) => {\n const next = month.year(y)\n focusOnRender.current = true\n setFocused(next)\n onMonthChange(next)\n setView('month') // picking a year advances to the month view\n }\n const pickMonth = (m: number) => {\n const next = month.month(m)\n focusOnRender.current = true\n setFocused(focusableDay(value, next))\n onMonthChange(next)\n setView('day') // picking a month returns to the day view\n }\n\n // ── keyboard ─────────────────────────────────────────────────────────────────────────────────────\n const handleDayKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offsetInWeek = (focused.day() - weekStartsOn + 7) % 7\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n moveDay(focused.subtract(1, 'day'))\n break\n case 'ArrowRight':\n event.preventDefault()\n moveDay(focused.add(1, 'day'))\n break\n case 'ArrowUp':\n event.preventDefault()\n moveDay(focused.subtract(7, 'day'))\n break\n case 'ArrowDown':\n event.preventDefault()\n moveDay(focused.add(7, 'day'))\n break\n case 'Home':\n event.preventDefault()\n moveDay(focused.subtract(offsetInWeek, 'day'))\n break\n case 'End':\n event.preventDefault()\n moveDay(focused.add(6 - offsetInWeek, 'day'))\n break\n case 'PageUp':\n event.preventDefault()\n moveDay(focused.subtract(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'PageDown':\n event.preventDefault()\n moveDay(focused.add(1, event.shiftKey ? 'year' : 'month'))\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!isDisabled(focused, min, max, disabledDate)) onSelect(toISO(focused))\n break\n }\n }\n\n const handleMonthKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepMonthBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepMonthBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepMonthBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepMonthBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickMonth(focused.month())\n break\n }\n }\n\n const handleYearKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n stepYearBy(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n stepYearBy(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n stepYearBy(-PICK_COLS)\n break\n case 'ArrowDown':\n event.preventDefault()\n stepYearBy(PICK_COLS)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n pickYear(focused.year())\n break\n }\n }\n\n // ── derived data (built once per render) ─────────────────────────────────────────────────────────\n const now = today()\n // month names + short weekday labels come from the i18n catalog (localized), not dayjs\n const monthName = (m: number) => t(`calendar.month${m}` as MessageKey)\n const weekdays = Array.from({ length: 7 }, (_, i) =>\n t(`calendar.weekday${(weekStartsOn + i) % 7}` as MessageKey),\n )\n const monthGrid = view === 'day' ? buildMonthGrid(month, weekStartsOn) : []\n const months = view === 'month' ? Array.from({ length: 12 }, (_, m) => monthName(m)) : []\n const years = view === 'year' ? yearList(min, max, month.year()) : []\n\n return (\n <div className={styles.calendar}>\n <div className={styles.calHeader}>\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.prevMonth')}\n onClick={() => onMonthChange(month.subtract(1, 'month'))}\n >\n <Icon name=\"ArrowCircleLeft\" />\n </IconButton>\n )}\n\n <div className={styles.calTitleGroup}>\n {(view === 'day' || view === 'month') && (\n <button\n type=\"button\"\n id={labelId}\n className={styles.calTitle}\n onClick={() => switchTo('year')}\n >\n {month.format('YYYY')}\n </button>\n )}\n {view === 'day' && (\n <button type=\"button\" className={styles.calTitle} onClick={() => switchTo('month')}>\n {monthName(month.month())}\n </button>\n )}\n {view === 'year' && (\n <span id={labelId} className={styles.calTitleStatic}>\n {t('calendar.selectYear')}\n </span>\n )}\n </div>\n\n {view === 'day' && (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n aria-label={t('calendar.nextMonth')}\n onClick={() => onMonthChange(month.add(1, 'month'))}\n >\n <Icon name=\"ArrowCircleRight\" />\n </IconButton>\n )}\n </div>\n\n {view === 'year' ? (\n <div\n ref={bodyRef}\n className={clsx(styles.pickGrid, styles.pickScroll)}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleYearKeyDown}\n >\n {years.map((y) => {\n const isSelected = value ? value.year() === y : false\n return (\n <button\n key={y}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && y === now.year() && styles.pickToday,\n )}\n tabIndex={y === focused.year() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickYear(y)}\n >\n {y}\n </button>\n )\n })}\n </div>\n ) : view === 'month' ? (\n <div\n ref={bodyRef}\n className={styles.pickGrid}\n role=\"listbox\"\n aria-labelledby={labelId}\n onKeyDown={handleMonthKeyDown}\n >\n {months.map((label, m) => {\n const isSelected = value ? value.isSame(month.month(m), 'month') : false\n const isCurrent = now.isSame(month.month(m), 'month')\n return (\n <button\n key={label}\n type=\"button\"\n role=\"option\"\n className={clsx(\n styles.pickCell,\n isSelected && styles.pickSelected,\n !isSelected && isCurrent && styles.pickToday,\n )}\n tabIndex={m === focused.month() ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => pickMonth(m)}\n >\n {label}\n </button>\n )\n })}\n </div>\n ) : (\n <div\n ref={bodyRef}\n className={styles.grid}\n role=\"grid\"\n aria-label={`${monthName(month.month())} ${month.format('YYYY')}`}\n onKeyDown={handleDayKeyDown}\n >\n <div className={styles.weekdays} role=\"row\">\n {weekdays.map((w, i) => (\n <span key={i} role=\"columnheader\" className={styles.weekday}>\n {w}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, wk) => (\n <div key={wk} role=\"row\" className={styles.week}>\n {monthGrid.slice(wk * 7, wk * 7 + 7).map((d) => {\n const selected = value ? d.date.isSame(value, 'day') : false\n const disabled = isDisabled(d.date, min, max, disabledDate)\n return (\n <button\n key={d.iso}\n type=\"button\"\n role=\"gridcell\"\n className={clsx(\n styles.day,\n !d.inMonth && styles.dayOutside,\n selected && styles.daySelected,\n d.isToday && styles.dayToday,\n disabled && styles.dayDisabled,\n )}\n tabIndex={d.date.isSame(focused, 'day') ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={d.isToday ? 'date' : undefined}\n onClick={() => !disabled && onSelect(d.iso)}\n >\n {d.date.date()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"names":["focusableDay","value","month","now","today","PICK_COLS","Calendar","onMonthChange","onSelect","min","max","disabledDate","weekStartsOn","autoFocus","labelId","t","useT","view","setView","useState","focused","setFocused","bodyRef","useRef","focusOnRender","useEffect","f","el","_a","_b","switchTo","next","moveDay","stepMonthBy","delta","stepYearBy","year","pickYear","y","pickMonth","m","handleDayKeyDown","event","offsetInWeek","isDisabled","toISO","handleMonthKeyDown","handleYearKeyDown","monthName","weekdays","_","i","monthGrid","buildMonthGrid","months","years","yearList","jsxs","styles","jsx","IconButton","Icon","clsx","isSelected","label","isCurrent","w","wk","d","selected","disabled"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { forwardRef as B, useState as O, useId as F } from "react";
|
|
|
3
3
|
import { clsx as v } from "clsx";
|
|
4
4
|
import { I as x } from "./Icon-CophpkHo.js";
|
|
5
5
|
import { a as H } from "./names-D8ABK2Wk.js";
|
|
6
|
-
import { I as E } from "./IconButton-
|
|
6
|
+
import { I as E } from "./IconButton-DpTxmj3d.js";
|
|
7
7
|
const R = "_card_voi4g_3", U = "_flat_voi4g_14", q = "_header_voi4g_18", G = "_headerDivided_voi4g_27", J = "_headerMain_voi4g_31", K = "_icon_voi4g_39", L = "_headerText_voi4g_43", P = "_title_voi4g_51", Q = "_subtitle_voi4g_64", V = "_actions_voi4g_78", W = "_chevron_voi4g_85", X = "_collapsible_voi4g_93", Y = "_collapsed_voi4g_98", Z = "_collapsibleInner_voi4g_101", $ = "_foldable_voi4g_110", ee = "_body_voi4g_114", oe = "_footer_voi4g_118", ae = "_footerStart_voi4g_127", le = "_footerEnd_voi4g_128", e = {
|
|
8
8
|
card: R,
|
|
9
9
|
flat: U,
|
|
@@ -115,4 +115,4 @@ const R = "_card_voi4g_3", U = "_flat_voi4g_14", q = "_header_voi4g_18", G = "_h
|
|
|
115
115
|
export {
|
|
116
116
|
ve as C
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=Card-
|
|
118
|
+
//# sourceMappingURL=Card-CumMi_XB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card-
|
|
1
|
+
{"version":3,"file":"Card-CumMi_XB.js","sources":["../src/components/Card/Card.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport styles from './Card.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** Header title (left, next to the icon). */\n title?: ReactNode\n /** Secondary muted line shown under the `title` (e.g. a short description). */\n subtitle?: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Theme color that tints the leading icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Marks the card flat (used by `PageLayout`). Cards are shadowless, so this currently adds no visual difference — it's a styling hook, not a distinct look. */\n flat?: boolean\n /** Header actions, placed at the end of the header row (before the collapse toggle). */\n actions?: ReactNode\n /** Footer content (e.g. actions), pinned to the **right** of the footer row. */\n footer?: ReactNode\n /** Footer content pinned to the **left** of the footer row (opposite `footer`). */\n footerStart?: ReactNode\n /** Adds a collapse/expand toggle to the header that folds the body + footer. */\n collapsible?: boolean\n /** Controlled collapsed state. */\n collapsed?: boolean\n /** Initial collapsed state for uncontrolled use. Defaults to `false`. */\n defaultCollapsed?: boolean\n /** Fires with the next collapsed state when the toggle is clicked. */\n onCollapsedChange?: (collapsed: boolean) => void\n /** Card body. */\n children?: ReactNode\n}\n\n/**\n * A surface card with an optional header (icon + title + actions), a body, and a footer for actions.\n * `collapsible` adds a chevron that smoothly folds the body + footer (controlled via `collapsed`/\n * `onCollapsedChange`, or uncontrolled via `defaultCollapsed`). Token-only styling.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n title,\n subtitle,\n icon,\n color = 'accent',\n flat = false,\n actions,\n footer,\n footerStart,\n collapsible = false,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = collapsed !== undefined\n const [internal, setInternal] = useState(defaultCollapsed)\n const isCollapsed = collapsible && (isControlled ? collapsed! : internal)\n const collapsibleId = useId() // ties the toggle to the fold region via aria-controls\n\n const toggle = () => {\n const next = !isCollapsed\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n }\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n const hasHeader =\n title != null || subtitle != null || renderedIcon != null || actions != null || collapsible\n const hasBody = children != null && children !== ''\n const hasFooter = footer != null || footerStart != null\n const hasCollapsibleContent = hasBody || hasFooter\n // The header is separated by a divider only while content is visible beneath it.\n const headerDivided = hasCollapsibleContent && !isCollapsed\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, flat && styles.flat, isCollapsed && styles.collapsed, className)}\n {...props}\n >\n {hasHeader && (\n <div className={clsx(styles.header, headerDivided && styles.headerDivided)}>\n <div className={styles.headerMain}>\n {renderedIcon != null && (\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={color}\n nonClickable\n aria-hidden\n className={styles.icon}\n >\n {renderedIcon}\n </IconButton>\n )}\n {(title != null || subtitle != null) && (\n <div className={styles.headerText}>\n {title != null && <div className={styles.title}>{title}</div>}\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n )}\n </div>\n {(actions != null || collapsible) && (\n <div className={styles.actions}>\n {!isCollapsed && actions}\n {collapsible && (\n <IconButton\n variant=\"text\"\n size=\"sm\"\n aria-label={isCollapsed ? 'Expand' : 'Collapse'}\n aria-expanded={!isCollapsed}\n aria-controls={collapsibleId}\n onClick={toggle}\n >\n <Icon\n name=\"ArrowUp3\"\n className={styles.chevron}\n data-collapsed={isCollapsed ? 'true' : 'false'}\n />\n </IconButton>\n )}\n </div>\n )}\n </div>\n )}\n {hasCollapsibleContent && (\n <div\n id={collapsibleId}\n className={clsx(styles.collapsible, collapsible && styles.foldable)}\n >\n <div className={styles.collapsibleInner}>\n {hasBody && <div className={styles.body}>{children}</div>}\n {hasFooter && (\n <div className={styles.footer}>\n <div className={styles.footerStart}>{footerStart}</div>\n <div className={styles.footerEnd}>{footer}</div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","Card","forwardRef","title","subtitle","icon","color","flat","actions","footer","footerStart","collapsible","collapsed","defaultCollapsed","onCollapsedChange","className","children","props","ref","isControlled","internal","setInternal","useState","isCollapsed","collapsibleId","useId","toggle","next","renderedIcon","jsx","Icon","hasHeader","hasBody","hasFooter","hasCollapsibleContent","headerDivided","jsxs","clsx","styles","IconButton"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const s=require("react/jsx-runtime"),_=require("react"),v=require("clsx"),I=require("./Icon-CXTl_QAP.cjs"),k=require("./names-C2Yj1p3u.cjs"),p=require("./IconButton-
|
|
2
|
-
//# sourceMappingURL=Card-
|
|
1
|
+
"use strict";const s=require("react/jsx-runtime"),_=require("react"),v=require("clsx"),I=require("./Icon-CXTl_QAP.cjs"),k=require("./names-C2Yj1p3u.cjs"),p=require("./IconButton-DyRC514t.cjs"),z="_card_voi4g_3",O="_flat_voi4g_14",R="_header_voi4g_18",F="_headerDivided_voi4g_27",H="_headerMain_voi4g_31",U="_icon_voi4g_39",G="_headerText_voi4g_43",J="_title_voi4g_51",K="_subtitle_voi4g_64",L="_actions_voi4g_78",P="_chevron_voi4g_85",Q="_collapsible_voi4g_93",V="_collapsed_voi4g_98",W="_collapsibleInner_voi4g_101",X="_foldable_voi4g_110",Y="_body_voi4g_114",Z="_footer_voi4g_118",$="_footerStart_voi4g_127",ee="_footerEnd_voi4g_128",e={card:z,flat:O,header:R,headerDivided:F,headerMain:H,icon:U,headerText:G,title:J,subtitle:K,actions:L,chevron:P,collapsible:Q,collapsed:V,collapsibleInner:W,foldable:X,body:Y,footer:Z,footerStart:$,footerEnd:ee},se=new Set(k.ICON_NAMES),oe=_.forwardRef(function({title:a,subtitle:t,icon:n,color:E="accent",flat:y=!1,actions:c,footer:h,footerStart:u,collapsible:l=!1,collapsed:x,defaultCollapsed:S=!1,onCollapsedChange:i,className:q,children:r,...M},D){const f=x!==void 0,[T,B]=_.useState(S),o=l&&(f?x:T),m=_.useId(),C=()=>{const b=!o;f||B(b),i==null||i(b)},d=n==null?null:typeof n=="string"&&se.has(n)?s.jsx(I.Icon,{name:n}):n,w=a!=null||t!=null||d!=null||c!=null||l,N=r!=null&&r!=="",g=h!=null||u!=null,j=N||g,A=j&&!o;return s.jsxs("div",{ref:D,className:v.clsx(e.card,y&&e.flat,o&&e.collapsed,q),...M,children:[w&&s.jsxs("div",{className:v.clsx(e.header,A&&e.headerDivided),children:[s.jsxs("div",{className:e.headerMain,children:[d!=null&&s.jsx(p.IconButton,{variant:"filled",size:"sm",color:E,nonClickable:!0,"aria-hidden":!0,className:e.icon,children:d}),(a!=null||t!=null)&&s.jsxs("div",{className:e.headerText,children:[a!=null&&s.jsx("div",{className:e.title,children:a}),t!=null&&s.jsx("div",{className:e.subtitle,children:t})]})]}),(c!=null||l)&&s.jsxs("div",{className:e.actions,children:[!o&&c,l&&s.jsx(p.IconButton,{variant:"text",size:"sm","aria-label":o?"Expand":"Collapse","aria-expanded":!o,"aria-controls":m,onClick:C,children:s.jsx(I.Icon,{name:"ArrowUp3",className:e.chevron,"data-collapsed":o?"true":"false"})})]})]}),j&&s.jsx("div",{id:m,className:v.clsx(e.collapsible,l&&e.foldable),children:s.jsxs("div",{className:e.collapsibleInner,children:[N&&s.jsx("div",{className:e.body,children:r}),g&&s.jsxs("div",{className:e.footer,children:[s.jsx("div",{className:e.footerStart,children:u}),s.jsx("div",{className:e.footerEnd,children:h})]})]})})]})});exports.Card=oe;
|
|
2
|
+
//# sourceMappingURL=Card-DGTGdaTZ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card-
|
|
1
|
+
{"version":3,"file":"Card-DGTGdaTZ.cjs","sources":["../src/components/Card/Card.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport styles from './Card.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** Header title (left, next to the icon). */\n title?: ReactNode\n /** Secondary muted line shown under the `title` (e.g. a short description). */\n subtitle?: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Theme color that tints the leading icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Marks the card flat (used by `PageLayout`). Cards are shadowless, so this currently adds no visual difference — it's a styling hook, not a distinct look. */\n flat?: boolean\n /** Header actions, placed at the end of the header row (before the collapse toggle). */\n actions?: ReactNode\n /** Footer content (e.g. actions), pinned to the **right** of the footer row. */\n footer?: ReactNode\n /** Footer content pinned to the **left** of the footer row (opposite `footer`). */\n footerStart?: ReactNode\n /** Adds a collapse/expand toggle to the header that folds the body + footer. */\n collapsible?: boolean\n /** Controlled collapsed state. */\n collapsed?: boolean\n /** Initial collapsed state for uncontrolled use. Defaults to `false`. */\n defaultCollapsed?: boolean\n /** Fires with the next collapsed state when the toggle is clicked. */\n onCollapsedChange?: (collapsed: boolean) => void\n /** Card body. */\n children?: ReactNode\n}\n\n/**\n * A surface card with an optional header (icon + title + actions), a body, and a footer for actions.\n * `collapsible` adds a chevron that smoothly folds the body + footer (controlled via `collapsed`/\n * `onCollapsedChange`, or uncontrolled via `defaultCollapsed`). Token-only styling.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n title,\n subtitle,\n icon,\n color = 'accent',\n flat = false,\n actions,\n footer,\n footerStart,\n collapsible = false,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = collapsed !== undefined\n const [internal, setInternal] = useState(defaultCollapsed)\n const isCollapsed = collapsible && (isControlled ? collapsed! : internal)\n const collapsibleId = useId() // ties the toggle to the fold region via aria-controls\n\n const toggle = () => {\n const next = !isCollapsed\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n }\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n const hasHeader =\n title != null || subtitle != null || renderedIcon != null || actions != null || collapsible\n const hasBody = children != null && children !== ''\n const hasFooter = footer != null || footerStart != null\n const hasCollapsibleContent = hasBody || hasFooter\n // The header is separated by a divider only while content is visible beneath it.\n const headerDivided = hasCollapsibleContent && !isCollapsed\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, flat && styles.flat, isCollapsed && styles.collapsed, className)}\n {...props}\n >\n {hasHeader && (\n <div className={clsx(styles.header, headerDivided && styles.headerDivided)}>\n <div className={styles.headerMain}>\n {renderedIcon != null && (\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={color}\n nonClickable\n aria-hidden\n className={styles.icon}\n >\n {renderedIcon}\n </IconButton>\n )}\n {(title != null || subtitle != null) && (\n <div className={styles.headerText}>\n {title != null && <div className={styles.title}>{title}</div>}\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n )}\n </div>\n {(actions != null || collapsible) && (\n <div className={styles.actions}>\n {!isCollapsed && actions}\n {collapsible && (\n <IconButton\n variant=\"text\"\n size=\"sm\"\n aria-label={isCollapsed ? 'Expand' : 'Collapse'}\n aria-expanded={!isCollapsed}\n aria-controls={collapsibleId}\n onClick={toggle}\n >\n <Icon\n name=\"ArrowUp3\"\n className={styles.chevron}\n data-collapsed={isCollapsed ? 'true' : 'false'}\n />\n </IconButton>\n )}\n </div>\n )}\n </div>\n )}\n {hasCollapsibleContent && (\n <div\n id={collapsibleId}\n className={clsx(styles.collapsible, collapsible && styles.foldable)}\n >\n <div className={styles.collapsibleInner}>\n {hasBody && <div className={styles.body}>{children}</div>}\n {hasFooter && (\n <div className={styles.footer}>\n <div className={styles.footerStart}>{footerStart}</div>\n <div className={styles.footerEnd}>{footer}</div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","Card","forwardRef","title","subtitle","icon","color","flat","actions","footer","footerStart","collapsible","collapsed","defaultCollapsed","onCollapsedChange","className","children","props","ref","isControlled","internal","setInternal","useState","isCollapsed","collapsibleId","useId","toggle","next","renderedIcon","jsx","Icon","hasHeader","hasBody","hasFooter","hasCollapsibleContent","headerDivided","jsxs","clsx","styles","IconButton"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const c=require("react/jsx-runtime"),w=require("react"),C=require("clsx"),I=require("./Icon-CXTl_QAP.cjs"),q=require("./ConfigProvider-
|
|
2
|
-
//# sourceMappingURL=Chip-
|
|
1
|
+
"use strict";const c=require("react/jsx-runtime"),w=require("react"),C=require("clsx"),I=require("./Icon-CXTl_QAP.cjs"),q=require("./ConfigProvider-h1WoGC3R.cjs"),A="_chip_1yjgf_3",B="_sm_1yjgf_20",N="_md_1yjgf_25",z="_lg_1yjgf_30",P="_contained_1yjgf_37",R="_filled_1yjgf_42",T="_outlined_1yjgf_46",$="_text_1yjgf_51",E="_clickable_1yjgf_57",M="_disabled_1yjgf_82",D="_startIcon_1yjgf_89",F="_avatar_1yjgf_95",G="_withAvatar_1yjgf_102",H="_withDelete_1yjgf_106",J="_deleteBtn_1yjgf_127",t={chip:A,sm:B,md:N,lg:z,contained:P,filled:R,outlined:T,text:$,clickable:E,disabled:M,startIcon:D,avatar:F,withAvatar:G,withDelete:H,deleteBtn:J},L=w.forwardRef(function({variant:f="filled",color:r="primary",size:_="md",clickable:u=!1,disabled:n=!1,startIcon:d,avatar:l,onDelete:s,deleteIcon:g,deleteLabel:j,deleteTabIndex:h,className:y,style:m,children:i,onKeyDown:o,...p},b){const x=q.useT(),a=u&&!n,v=e=>{e.stopPropagation(),n||s==null||s()},k=e=>{a&&(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),e.currentTarget.click()),o==null||o(e)};return c.jsxs("div",{ref:b,className:C.clsx(t.chip,t[f],t[_],a&&t.clickable,n&&t.disabled,l&&t.withAvatar,s&&t.withDelete,y),style:{"--tz-btn-rgb":`var(--tz-color-${r}-rgb)`,"--tz-btn-on":`var(--tz-color-${r}-contrast, #fff)`,...m},role:a?"button":void 0,tabIndex:a?0:void 0,"aria-disabled":n||void 0,onKeyDown:k,...p,children:[l?c.jsx("span",{className:t.avatar,children:l}):d?c.jsx("span",{className:t.startIcon,children:d}):null,i!=null&&i!==""?c.jsx("span",{children:i}):null,s?c.jsx("button",{type:"button",className:t.deleteBtn,onClick:v,onMouseDown:e=>e.preventDefault(),"aria-label":j??x("common.remove"),tabIndex:h,disabled:n,children:g??c.jsx(I.Icon,{name:"CloseCircle",size:_})}):null]})});exports.Chip=L;
|
|
2
|
+
//# sourceMappingURL=Chip-CJuAvgst.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip-
|
|
1
|
+
{"version":3,"file":"Chip-CJuAvgst.cjs","sources":["../src/components/Chip/Chip.tsx"],"sourcesContent":["import {\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport styles from './Chip.module.css'\n\nexport type ChipVariant = 'contained' | 'filled' | 'outlined' | 'text'\nexport type ChipSize = 'sm' | 'md' | 'lg'\n\nexport interface ChipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Visual style. Defaults to `filled` (a soft tinted chip). */\n variant?: ChipVariant\n /** Theme palette token that tints the chip. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size — height + font. Defaults to `md`. */\n size?: ChipSize\n /** Makes the chip interactive (hover, pointer, keyboard, `onClick`). Off by default (a static tag). */\n clickable?: boolean\n /** Dims the chip and disables all interaction. */\n disabled?: boolean\n /** Leading icon (e.g. an `<Icon />`). Ignored when `avatar` is set. */\n startIcon?: ReactNode\n /** Leading avatar (e.g. an `<Avatar />`), sized to the chip and flush to the left. */\n avatar?: ReactNode\n /** When provided, shows a trailing delete button that calls this (its click won't trigger `onClick`). */\n onDelete?: () => void\n /** Custom delete icon. Defaults to a `CloseCircle`. */\n deleteIcon?: ReactNode\n /** Accessible label for the delete button. Defaults to `\"Remove\"`. */\n deleteLabel?: string\n /** Tab index for the delete button — pass `-1` when the chip lives inside a composite widget (e.g. a multi-select) that owns keyboard focus. */\n deleteTabIndex?: number\n /** Chip label. */\n children?: ReactNode\n}\n\n/**\n * A compact tag/token. Static by default; `clickable` makes it an interactive `role=\"button\"`\n * (hover + Enter/Space). Supports a leading `startIcon` or `avatar` and a trailing delete button via\n * `onDelete`. Tinted by `color` through the shared `--tz-btn-rgb` / `--tz-btn-on` pattern across the\n * four standard variants. Token-only styling.\n */\nexport const Chip = forwardRef<HTMLDivElement, ChipProps>(function Chip(\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n clickable = false,\n disabled = false,\n startIcon,\n avatar,\n onDelete,\n deleteIcon,\n deleteLabel,\n deleteTabIndex,\n className,\n style,\n children,\n onKeyDown,\n ...props\n },\n ref,\n) {\n const t = useT()\n const interactive = clickable && !disabled\n\n const handleDelete = (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation()\n if (!disabled) onDelete?.()\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (interactive && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.chip,\n styles[variant],\n styles[size],\n interactive && styles.clickable,\n disabled && styles.disabled,\n avatar && styles.withAvatar,\n onDelete && styles.withDelete,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n }\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {avatar ? (\n <span className={styles.avatar}>{avatar}</span>\n ) : startIcon ? (\n <span className={styles.startIcon}>{startIcon}</span>\n ) : null}\n {children != null && children !== '' ? <span>{children}</span> : null}\n {onDelete ? (\n <button\n type=\"button\"\n className={styles.deleteBtn}\n onClick={handleDelete}\n onMouseDown={(event) => event.preventDefault()}\n aria-label={deleteLabel ?? t('common.remove')}\n tabIndex={deleteTabIndex}\n disabled={disabled}\n >\n {deleteIcon ?? <Icon name=\"CloseCircle\" size={size} />}\n </button>\n ) : null}\n </div>\n )\n})\n"],"names":["Chip","forwardRef","variant","color","size","clickable","disabled","startIcon","avatar","onDelete","deleteIcon","deleteLabel","deleteTabIndex","className","style","children","onKeyDown","props","ref","t","useT","interactive","handleDelete","event","handleKeyDown","jsxs","clsx","styles","jsx","Icon"],"mappings":"2nBAiDaA,EAAOC,EAAAA,WAAsC,SACxD,CACE,QAAAC,EAAU,SACV,MAAAC,EAAQ,UACR,KAAAC,EAAO,KACP,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,UAAAC,EACA,OAAAC,EACA,SAAAC,EACA,WAAAC,EACA,YAAAC,EACA,eAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EAAchB,GAAa,CAACC,EAE5BgB,EAAgBC,GAAyC,CAC7DA,EAAM,gBAAA,EACDjB,GAAUG,GAAA,MAAAA,GACjB,EAEMe,EAAiBD,GAAyC,CAC1DF,IAAgBE,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzDA,EAAM,eAAA,EACNA,EAAM,cAAc,MAAA,GAEtBP,GAAA,MAAAA,EAAYO,EACd,EAEA,OACEE,EAAAA,KAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAAA,KACTC,EAAO,KACPA,EAAOzB,CAAO,EACdyB,EAAOvB,CAAI,EACXiB,GAAeM,EAAO,UACtBrB,GAAYqB,EAAO,SACnBnB,GAAUmB,EAAO,WACjBlB,GAAYkB,EAAO,WACnBd,CAAA,EAEF,MACE,CACE,eAAgB,kBAAkBV,CAAK,QACvC,cAAe,kBAAkBA,CAAK,mBACtC,GAAGW,CAAA,EAGP,KAAMO,EAAc,SAAW,OAC/B,SAAUA,EAAc,EAAI,OAC5B,gBAAef,GAAY,OAC3B,UAAWkB,EACV,GAAGP,EAEH,SAAA,CAAAT,EACCoB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,OAAS,SAAAnB,EAAO,EACtCD,EACFqB,MAAC,OAAA,CAAK,UAAWD,EAAO,UAAY,WAAU,EAC5C,KACHZ,GAAY,MAAQA,IAAa,GAAKa,EAAAA,IAAC,OAAA,CAAM,SAAAb,EAAS,EAAU,KAChEN,EACCmB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWD,EAAO,UAClB,QAASL,EACT,YAAcC,GAAUA,EAAM,eAAA,EAC9B,aAAYZ,GAAeQ,EAAE,eAAe,EAC5C,SAAUP,EACV,SAAAN,EAEC,SAAAI,GAAckB,MAACC,EAAAA,KAAA,CAAK,KAAK,cAAc,KAAAzB,CAAA,CAAY,CAAA,CAAA,EAEpD,IAAA,CAAA,CAAA,CAGV,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as w, jsx as n } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as I } from "react";
|
|
3
3
|
import { clsx as C } from "clsx";
|
|
4
4
|
import { I as A } from "./Icon-CophpkHo.js";
|
|
5
|
-
import { a as B } from "./ConfigProvider-
|
|
5
|
+
import { a as B } from "./ConfigProvider-DDuIJSM7.js";
|
|
6
6
|
const N = "_chip_1yjgf_3", z = "_sm_1yjgf_20", T = "_md_1yjgf_25", $ = "_lg_1yjgf_30", E = "_contained_1yjgf_37", M = "_filled_1yjgf_42", P = "_outlined_1yjgf_46", R = "_text_1yjgf_51", q = "_clickable_1yjgf_57", D = "_disabled_1yjgf_82", F = "_startIcon_1yjgf_89", G = "_avatar_1yjgf_95", H = "_withAvatar_1yjgf_102", J = "_withDelete_1yjgf_106", L = "_deleteBtn_1yjgf_127", t = {
|
|
7
7
|
chip: N,
|
|
8
8
|
sm: z,
|
|
@@ -89,4 +89,4 @@ const N = "_chip_1yjgf_3", z = "_sm_1yjgf_20", T = "_md_1yjgf_25", $ = "_lg_1yjg
|
|
|
89
89
|
export {
|
|
90
90
|
X as C
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=Chip-
|
|
92
|
+
//# sourceMappingURL=Chip-D83svOCW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip-
|
|
1
|
+
{"version":3,"file":"Chip-D83svOCW.js","sources":["../src/components/Chip/Chip.tsx"],"sourcesContent":["import {\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport styles from './Chip.module.css'\n\nexport type ChipVariant = 'contained' | 'filled' | 'outlined' | 'text'\nexport type ChipSize = 'sm' | 'md' | 'lg'\n\nexport interface ChipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Visual style. Defaults to `filled` (a soft tinted chip). */\n variant?: ChipVariant\n /** Theme palette token that tints the chip. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size — height + font. Defaults to `md`. */\n size?: ChipSize\n /** Makes the chip interactive (hover, pointer, keyboard, `onClick`). Off by default (a static tag). */\n clickable?: boolean\n /** Dims the chip and disables all interaction. */\n disabled?: boolean\n /** Leading icon (e.g. an `<Icon />`). Ignored when `avatar` is set. */\n startIcon?: ReactNode\n /** Leading avatar (e.g. an `<Avatar />`), sized to the chip and flush to the left. */\n avatar?: ReactNode\n /** When provided, shows a trailing delete button that calls this (its click won't trigger `onClick`). */\n onDelete?: () => void\n /** Custom delete icon. Defaults to a `CloseCircle`. */\n deleteIcon?: ReactNode\n /** Accessible label for the delete button. Defaults to `\"Remove\"`. */\n deleteLabel?: string\n /** Tab index for the delete button — pass `-1` when the chip lives inside a composite widget (e.g. a multi-select) that owns keyboard focus. */\n deleteTabIndex?: number\n /** Chip label. */\n children?: ReactNode\n}\n\n/**\n * A compact tag/token. Static by default; `clickable` makes it an interactive `role=\"button\"`\n * (hover + Enter/Space). Supports a leading `startIcon` or `avatar` and a trailing delete button via\n * `onDelete`. Tinted by `color` through the shared `--tz-btn-rgb` / `--tz-btn-on` pattern across the\n * four standard variants. Token-only styling.\n */\nexport const Chip = forwardRef<HTMLDivElement, ChipProps>(function Chip(\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n clickable = false,\n disabled = false,\n startIcon,\n avatar,\n onDelete,\n deleteIcon,\n deleteLabel,\n deleteTabIndex,\n className,\n style,\n children,\n onKeyDown,\n ...props\n },\n ref,\n) {\n const t = useT()\n const interactive = clickable && !disabled\n\n const handleDelete = (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation()\n if (!disabled) onDelete?.()\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (interactive && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.chip,\n styles[variant],\n styles[size],\n interactive && styles.clickable,\n disabled && styles.disabled,\n avatar && styles.withAvatar,\n onDelete && styles.withDelete,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n }\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {avatar ? (\n <span className={styles.avatar}>{avatar}</span>\n ) : startIcon ? (\n <span className={styles.startIcon}>{startIcon}</span>\n ) : null}\n {children != null && children !== '' ? <span>{children}</span> : null}\n {onDelete ? (\n <button\n type=\"button\"\n className={styles.deleteBtn}\n onClick={handleDelete}\n onMouseDown={(event) => event.preventDefault()}\n aria-label={deleteLabel ?? t('common.remove')}\n tabIndex={deleteTabIndex}\n disabled={disabled}\n >\n {deleteIcon ?? <Icon name=\"CloseCircle\" size={size} />}\n </button>\n ) : null}\n </div>\n )\n})\n"],"names":["Chip","forwardRef","variant","color","size","clickable","disabled","startIcon","avatar","onDelete","deleteIcon","deleteLabel","deleteTabIndex","className","style","children","onKeyDown","props","ref","t","useT","interactive","handleDelete","event","handleKeyDown","jsxs","clsx","styles","jsx","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;GAiDaA,IAAOC,EAAsC,SACxD;AAAA,EACE,SAAAC,IAAU;AAAA,EACV,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJC,IAAchB,KAAa,CAACC,GAE5BgB,IAAe,CAACC,MAAyC;AAC7D,IAAAA,EAAM,gBAAA,GACDjB,KAAUG,KAAA,QAAAA;AAAA,EACjB,GAEMe,IAAgB,CAACD,MAAyC;AAC9D,IAAIF,MAAgBE,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACzDA,EAAM,eAAA,GACNA,EAAM,cAAc,MAAA,IAEtBP,KAAA,QAAAA,EAAYO;AAAA,EACd;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAP;AAAA,MACA,WAAWQ;AAAA,QACTC,EAAO;AAAA,QACPA,EAAOzB,CAAO;AAAA,QACdyB,EAAOvB,CAAI;AAAA,QACXiB,KAAeM,EAAO;AAAA,QACtBrB,KAAYqB,EAAO;AAAA,QACnBnB,KAAUmB,EAAO;AAAA,QACjBlB,KAAYkB,EAAO;AAAA,QACnBd;AAAA,MAAA;AAAA,MAEF,OACE;AAAA,QACE,gBAAgB,kBAAkBV,CAAK;AAAA,QACvC,eAAe,kBAAkBA,CAAK;AAAA,QACtC,GAAGW;AAAA,MAAA;AAAA,MAGP,MAAMO,IAAc,WAAW;AAAA,MAC/B,UAAUA,IAAc,IAAI;AAAA,MAC5B,iBAAef,KAAY;AAAA,MAC3B,WAAWkB;AAAA,MACV,GAAGP;AAAA,MAEH,UAAA;AAAA,QAAAT,IACC,gBAAAoB,EAAC,QAAA,EAAK,WAAWD,EAAO,QAAS,UAAAnB,GAAO,IACtCD,IACF,gBAAAqB,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,aAAU,IAC5C;AAAA,QACHZ,KAAY,QAAQA,MAAa,KAAK,gBAAAa,EAAC,QAAA,EAAM,UAAAb,GAAS,IAAU;AAAA,QAChEN,IACC,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWD,EAAO;AAAA,YAClB,SAASL;AAAA,YACT,aAAa,CAACC,MAAUA,EAAM,eAAA;AAAA,YAC9B,cAAYZ,KAAeQ,EAAE,eAAe;AAAA,YAC5C,UAAUP;AAAA,YACV,UAAAN;AAAA,YAEC,UAAAI,KAAc,gBAAAkB,EAACC,GAAA,EAAK,MAAK,eAAc,MAAAzB,EAAA,CAAY;AAAA,UAAA;AAAA,QAAA,IAEpD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as o, jsxs as _ } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as I, useState as h, useRef as S, useEffect as y } from "react";
|
|
3
3
|
import { clsx as w } from "clsx";
|
|
4
|
-
import { I as g } from "./IconButton-
|
|
4
|
+
import { I as g } from "./IconButton-DpTxmj3d.js";
|
|
5
5
|
import { I as z } from "./Icon-CophpkHo.js";
|
|
6
6
|
import { T as E } from "./Tooltip-Cb_FKxT9.js";
|
|
7
|
-
import { a as R } from "./ConfigProvider-
|
|
7
|
+
import { a as R } from "./ConfigProvider-DDuIJSM7.js";
|
|
8
8
|
const j = "_root_floau_4", M = "_header_floau_15", D = "_title_floau_24", H = "_code_floau_34", L = "_plain_floau_50", O = "_wrap_floau_56", P = "_lineNumbers_floau_62", q = "_copy_floau_77", e = {
|
|
9
9
|
root: j,
|
|
10
10
|
header: M,
|
|
@@ -93,4 +93,4 @@ const j = "_root_floau_4", M = "_header_floau_15", D = "_title_floau_24", H = "_
|
|
|
93
93
|
export {
|
|
94
94
|
X as C
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=CodeBlock-
|
|
96
|
+
//# sourceMappingURL=CodeBlock-BK_KXhos.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock-
|
|
1
|
+
{"version":3,"file":"CodeBlock-BK_KXhos.js","sources":["../src/components/CodeBlock/CodeBlock.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Tooltip } from '../Tooltip'\nimport styles from './CodeBlock.module.css'\n\n// how long the copy button shows the \"copied\" tick before reverting\nconst COPIED_RESET_MS = 1600\n\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n /** The source code to render. */\n code: string\n /** Shiki language id (`'tsx'`, `'json'`, `'bash'`, `'css'`, …). Defaults to `'tsx'`. */\n language?: string\n /**\n * Optional label shown on the left of the header bar (e.g. a filename). The header bar itself always\n * renders (whenever `copyable`), so the copy button lives in it with or without a `title`.\n */\n title?: ReactNode\n /** Show a copy-to-clipboard button (in the header bar). Defaults to `true`. */\n copyable?: boolean\n /** Show line numbers. Defaults to `true`. */\n showLineNumbers?: boolean\n /** Cap the block height in px — taller code scrolls inside. */\n maxHeight?: number\n /** Soft-wrap long lines instead of scrolling horizontally. Defaults to `false`. */\n wrap?: boolean\n}\n\n/**\n * A syntax-highlighted code block with **VS Code colors** — powered by **Shiki** (an optional peer,\n * `npm i shiki`), the actual VS Code highlighting engine, using its **`dark-plus`** theme. The block\n * is **always dark** (in both app modes) — code reads best on a dark surface, and the deep background\n * anchors it regardless of the surrounding light/dark theme. Highlighting is **async and lazy**\n * (`import('shiki')` on first render); until it lands — or if `shiki` isn't installed / the language\n * is unknown — the block shows the plain code (on the same dark surface), so nothing breaks. A header\n * bar always renders (whenever `copyable`, default `true`) and holds the copy button — which flips to a\n * tick on click — with an optional `title` (e.g. a filename) on its left; `showLineNumbers` (default\n * `true`), `maxHeight` (scrolls inside) and `wrap` shape the body. The whole block\n * keeps VS Code's own dark colors (a deliberate literal-color exception, like the Modal scrim); only\n * the outer border/radius uses `--tz-*` tokens.\n */\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language = 'tsx',\n title,\n copyable = true,\n showLineNumbers = true,\n maxHeight,\n wrap = false,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const [html, setHtml] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n const copyTimer = useRef<number | undefined>(undefined)\n\n // highlight asynchronously — shiki is an optional peer, loaded lazily on first use; a missing\n // package or an unknown language just leaves the plain (unhighlighted) fallback in place\n useEffect(() => {\n let cancelled = false\n import('shiki')\n .then(({ codeToHtml }) =>\n codeToHtml(code, {\n lang: language,\n // always VS Code's dark theme — the block stays dark in both app modes\n theme: 'dark-plus',\n }),\n )\n .then((out) => {\n if (!cancelled) setHtml(out)\n })\n .catch(() => {\n if (!cancelled) setHtml(null)\n })\n return () => {\n cancelled = true\n }\n }, [code, language])\n\n useEffect(() => () => window.clearTimeout(copyTimer.current), [])\n\n const handleCopy = () => {\n navigator.clipboard\n ?.writeText(code)\n .then(() => {\n setCopied(true)\n window.clearTimeout(copyTimer.current)\n copyTimer.current = window.setTimeout(() => setCopied(false), COPIED_RESET_MS)\n })\n .catch(() => {})\n }\n\n const copyButton = copyable && (\n // the tooltip is hover/focus-driven; clicking flips `copied`, so its content updates to \"Copied!\"\n // while it's still open (the pointer is on the button). `left` keeps it inside the block's\n // `overflow: hidden` bounds.\n <Tooltip\n content={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n placement=\"left\"\n // always a white pill with dark text over the (always-dark) block — set via `style` so it beats\n // Tooltip's own color-derived --tz-btn-rgb (which is spread before the consumer `style`)\n style={{ '--tz-btn-rgb': '255, 255, 255', '--tz-btn-on': '#1e1e1e' } as CSSProperties}\n >\n <IconButton\n variant=\"text\"\n size=\"sm\"\n className={styles.copy}\n // force the button light over the dark surface — passed via `style` so it beats IconButton's\n // own inline `--tz-btn-rgb` (which is spread before the consumer `style`, so this wins)\n style={{ '--tz-btn-rgb': '255, 255, 255' } as CSSProperties}\n aria-label={copied ? t('codeBlock.copied') : t('codeBlock.copy')}\n onClick={handleCopy}\n >\n <Icon name={copied ? 'CopySuccess' : 'Copy'} />\n </IconButton>\n </Tooltip>\n )\n\n return (\n <div ref={ref} className={clsx(styles.root, className)} style={style} {...props}>\n {/* the header bar always renders whenever there's a title or a copy button — so the copy icon\n lives in the bar (top-right), never floating over the code */}\n {(title != null || copyButton) && (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {copyButton}\n </div>\n )}\n <div\n className={clsx(styles.code, wrap && styles.wrap, showLineNumbers && styles.lineNumbers)}\n style={maxHeight != null ? ({ maxHeight } as CSSProperties) : undefined}\n >\n {html != null ? (\n // shiki output is trusted markup — it escapes the source code itself\n <div className={styles.highlighted} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <pre className={styles.plain}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n </div>\n )\n})\n"],"names":["COPIED_RESET_MS","CodeBlock","forwardRef","code","language","title","copyable","showLineNumbers","maxHeight","wrap","className","style","props","ref","t","useT","html","setHtml","useState","copied","setCopied","copyTimer","useRef","useEffect","cancelled","codeToHtml","out","handleCopy","_a","copyButton","jsx","Tooltip","IconButton","styles","Icon","jsxs","clsx"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var v=Object.create;var y=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var E=(t,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of I(e))!g.call(t,n)&&n!==s&&y(t,n,{get:()=>e[n],enumerable:!(i=q(e,n))||i.enumerable});return t};var z=(t,e,s)=>(s=t!=null?v(S(t)):{},E(e||!t||!t.__esModule?y(s,"default",{value:t,enumerable:!0}):s,t));const o=require("react/jsx-runtime"),r=require("react"),w=require("clsx"),R=require("./IconButton-
|
|
2
|
-
//# sourceMappingURL=CodeBlock-
|
|
1
|
+
"use strict";var v=Object.create;var y=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var E=(t,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of I(e))!g.call(t,n)&&n!==s&&y(t,n,{get:()=>e[n],enumerable:!(i=q(e,n))||i.enumerable});return t};var z=(t,e,s)=>(s=t!=null?v(S(t)):{},E(e||!t||!t.__esModule?y(s,"default",{value:t,enumerable:!0}):s,t));const o=require("react/jsx-runtime"),r=require("react"),w=require("clsx"),R=require("./IconButton-DyRC514t.cjs"),M=require("./Icon-CXTl_QAP.cjs"),P=require("./Tooltip-Ao7az09p.cjs"),D=require("./ConfigProvider-h1WoGC3R.cjs"),H="_root_floau_4",L="_header_floau_15",O="_title_floau_24",A="_code_floau_34",F="_plain_floau_50",G="_wrap_floau_56",J="_lineNumbers_floau_62",K="_copy_floau_77",c={root:H,header:L,title:O,code:A,plain:F,wrap:G,lineNumbers:J,copy:K},Q=1600,U=r.forwardRef(function({code:e,language:s="tsx",title:i,copyable:n=!0,showLineNumbers:b=!0,maxHeight:_,wrap:j=!1,className:N,style:B,...C},T){const a=D.useT(),[f,h]=r.useState(null),[u,m]=r.useState(!1),d=r.useRef(void 0);r.useEffect(()=>{let l=!1;return import("shiki").then(({codeToHtml:p})=>p(e,{lang:s,theme:"dark-plus"})).then(p=>{l||h(p)}).catch(()=>{l||h(null)}),()=>{l=!0}},[e,s]),r.useEffect(()=>()=>window.clearTimeout(d.current),[]);const k=()=>{var l;(l=navigator.clipboard)==null||l.writeText(e).then(()=>{m(!0),window.clearTimeout(d.current),d.current=window.setTimeout(()=>m(!1),Q)}).catch(()=>{})},x=n&&o.jsx(P.Tooltip,{content:a(u?"codeBlock.copied":"codeBlock.copy"),placement:"left",style:{"--tz-btn-rgb":"255, 255, 255","--tz-btn-on":"#1e1e1e"},children:o.jsx(R.IconButton,{variant:"text",size:"sm",className:c.copy,style:{"--tz-btn-rgb":"255, 255, 255"},"aria-label":a(u?"codeBlock.copied":"codeBlock.copy"),onClick:k,children:o.jsx(M.Icon,{name:u?"CopySuccess":"Copy"})})});return o.jsxs("div",{ref:T,className:w.clsx(c.root,N),style:B,...C,children:[(i!=null||x)&&o.jsxs("div",{className:c.header,children:[o.jsx("span",{className:c.title,children:i}),x]}),o.jsx("div",{className:w.clsx(c.code,j&&c.wrap,b&&c.lineNumbers),style:_!=null?{maxHeight:_}:void 0,children:f!=null?o.jsx("div",{className:c.highlighted,dangerouslySetInnerHTML:{__html:f}}):o.jsx("pre",{className:c.plain,children:o.jsx("code",{children:e})})})]})});exports.CodeBlock=U;
|
|
2
|
+
//# sourceMappingURL=CodeBlock-C_UDrrY6.cjs.map
|