@techzyapp/ui-library 1.0.25 → 1.0.28
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-BTvmassR.js +55 -0
- package/dist/AdminRoot-BTvmassR.js.map +1 -0
- package/dist/AdminRoot-DM-cZCpN.cjs +2 -0
- package/dist/AdminRoot-DM-cZCpN.cjs.map +1 -0
- package/dist/{Alert-udX1ybuC.cjs → Alert-CFm6MU0u.cjs} +2 -2
- package/dist/{Alert-udX1ybuC.cjs.map → Alert-CFm6MU0u.cjs.map} +1 -1
- package/dist/{Alert-DXmzM_rh.js → Alert-v-lelDih.js} +3 -3
- package/dist/{Alert-DXmzM_rh.js.map → Alert-v-lelDih.js.map} +1 -1
- package/dist/{AuthLayout-CP9qu6Bv.js → AuthLayout-DOFYw_z5.js} +3 -3
- package/dist/{AuthLayout-CP9qu6Bv.js.map → AuthLayout-DOFYw_z5.js.map} +1 -1
- package/dist/{AuthLayout-BRUxDgzs.cjs → AuthLayout-QAtW2GAT.cjs} +2 -2
- package/dist/{AuthLayout-BRUxDgzs.cjs.map → AuthLayout-QAtW2GAT.cjs.map} +1 -1
- package/dist/Avatar-DXNPg23a.js +90 -0
- package/dist/Avatar-DXNPg23a.js.map +1 -0
- package/dist/Avatar-DrV_F7Ex.cjs +2 -0
- package/dist/Avatar-DrV_F7Ex.cjs.map +1 -0
- package/dist/{AvatarGroup-uW0SD5P4.cjs → AvatarGroup-CHesdo-M.cjs} +2 -2
- package/dist/{AvatarGroup-uW0SD5P4.cjs.map → AvatarGroup-CHesdo-M.cjs.map} +1 -1
- package/dist/{AvatarGroup-YaNasLMS.js → AvatarGroup-CwlYqDCI.js} +2 -2
- package/dist/{AvatarGroup-YaNasLMS.js.map → AvatarGroup-CwlYqDCI.js.map} +1 -1
- package/dist/Badge-BmFgusOa.js +50 -0
- package/dist/{Badge-DSWigoGC.js.map → Badge-BmFgusOa.js.map} +1 -1
- package/dist/Badge-DVbe1rAI.cjs +2 -0
- package/dist/{Badge-BQpr2Jee.cjs.map → Badge-DVbe1rAI.cjs.map} +1 -1
- package/dist/{Breadcrumbs-CsYTiX2h.cjs → Breadcrumbs-3wHPNa0P.cjs} +2 -2
- package/dist/{Breadcrumbs-CsYTiX2h.cjs.map → Breadcrumbs-3wHPNa0P.cjs.map} +1 -1
- package/dist/{Breadcrumbs-DQHHeLId.js → Breadcrumbs-Cgd-u3aK.js} +3 -3
- package/dist/{Breadcrumbs-DQHHeLId.js.map → Breadcrumbs-Cgd-u3aK.js.map} +1 -1
- package/dist/Button-BLW9yV8W.js +72 -0
- package/dist/{Button-DBs8xnA5.js.map → Button-BLW9yV8W.js.map} +1 -1
- package/dist/Button-KRGjJdMV.cjs +2 -0
- package/dist/{Button-CXmDOzPk.cjs.map → Button-KRGjJdMV.cjs.map} +1 -1
- package/dist/{Calendar-B2nMXk4C.cjs → Calendar-CoTCOOUu.cjs} +2 -2
- package/dist/{Calendar-B2nMXk4C.cjs.map → Calendar-CoTCOOUu.cjs.map} +1 -1
- package/dist/{Calendar-CtteUt82.js → Calendar-sLA-xa0B.js} +4 -4
- package/dist/{Calendar-CtteUt82.js.map → Calendar-sLA-xa0B.js.map} +1 -1
- package/dist/Card-6fiSEC0z.js +121 -0
- package/dist/Card-6fiSEC0z.js.map +1 -0
- package/dist/Card-zTkvreQu.cjs +2 -0
- package/dist/Card-zTkvreQu.cjs.map +1 -0
- package/dist/Checkbox-CTp1xFW7.cjs +2 -0
- package/dist/{Checkbox-fzJCwe0j.cjs.map → Checkbox-CTp1xFW7.cjs.map} +1 -1
- package/dist/Checkbox-DyKBIgVT.js +98 -0
- package/dist/{Checkbox-ZYOSBYRt.js.map → Checkbox-DyKBIgVT.js.map} +1 -1
- package/dist/{Chip-DdKhcstm.js → Chip-C-5Z5wsC.js} +31 -31
- package/dist/{Chip-DdKhcstm.js.map → Chip-C-5Z5wsC.js.map} +1 -1
- package/dist/Chip-CqOqfafx.cjs +2 -0
- package/dist/{Chip-gUH_7nQc.cjs.map → Chip-CqOqfafx.cjs.map} +1 -1
- package/dist/ChoiceCardGroup-BSagRbPI.cjs +2 -0
- package/dist/{ChoiceCardGroup-d0VVTUi5.cjs.map → ChoiceCardGroup-BSagRbPI.cjs.map} +1 -1
- package/dist/ChoiceCardGroup-CEniY_HJ.js +181 -0
- package/dist/{ChoiceCardGroup-DBohUnRj.js.map → ChoiceCardGroup-CEniY_HJ.js.map} +1 -1
- package/dist/{CodeBlock-C6tQtbHU.cjs → CodeBlock-DFiHDZXh.cjs} +2 -2
- package/dist/{CodeBlock-C6tQtbHU.cjs.map → CodeBlock-DFiHDZXh.cjs.map} +1 -1
- package/dist/{CodeBlock-DD_d3-sM.js → CodeBlock-rPaqO7yD.js} +3 -3
- package/dist/{CodeBlock-DD_d3-sM.js.map → CodeBlock-rPaqO7yD.js.map} +1 -1
- package/dist/ColorPicker-Bqypsy5E.cjs +2 -0
- package/dist/ColorPicker-Bqypsy5E.cjs.map +1 -0
- package/dist/{ColorPicker-Dw6Qk0iy.js → ColorPicker-DXDAXvlA.js} +36 -27
- package/dist/ColorPicker-DXDAXvlA.js.map +1 -0
- package/dist/ColorPickerPanel-6lQC1URc.js +322 -0
- package/dist/ColorPickerPanel-6lQC1URc.js.map +1 -0
- package/dist/ColorPickerPanel-C9ARc_uD.cjs +2 -0
- package/dist/ColorPickerPanel-C9ARc_uD.cjs.map +1 -0
- package/dist/ColorRamp-B9OWxCOK.cjs +2 -0
- package/dist/ColorRamp-B9OWxCOK.cjs.map +1 -0
- package/dist/ColorRamp-DQ8wkgvF.js +126 -0
- package/dist/ColorRamp-DQ8wkgvF.js.map +1 -0
- package/dist/{ConfigProvider-Bszl3Wr3.cjs → ConfigProvider-BElY0HuV.cjs} +2 -2
- package/dist/ConfigProvider-BElY0HuV.cjs.map +1 -0
- package/dist/{ConfigProvider-DR9YMy9U.js → ConfigProvider-B_RSn9bb.js} +2 -2
- package/dist/ConfigProvider-B_RSn9bb.js.map +1 -0
- package/dist/CopyButton-B5aicGl3.cjs +2 -0
- package/dist/{CopyButton-Ct-8AmmX.cjs.map → CopyButton-B5aicGl3.cjs.map} +1 -1
- package/dist/CopyButton-BplPYm8i.js +43 -0
- package/dist/{CopyButton-DJ1PSJZU.js.map → CopyButton-BplPYm8i.js.map} +1 -1
- package/dist/DashedButton-B7xodc3N.cjs +2 -0
- package/dist/{DashedButton-3C4IZuo4.cjs.map → DashedButton-B7xodc3N.cjs.map} +1 -1
- package/dist/DashedButton-iM7kzopW.js +59 -0
- package/dist/{DashedButton-BXZAyMtw.js.map → DashedButton-iM7kzopW.js.map} +1 -1
- package/dist/{DatePicker-BxEydgfu.cjs → DatePicker-Cdl2JYBd.cjs} +2 -2
- package/dist/{DatePicker-BxEydgfu.cjs.map → DatePicker-Cdl2JYBd.cjs.map} +1 -1
- package/dist/{DatePicker-CJioG5M7.js → DatePicker-U5TJ9FYM.js} +7 -7
- package/dist/{DatePicker-CJioG5M7.js.map → DatePicker-U5TJ9FYM.js.map} +1 -1
- package/dist/DatePicker.module-BDtTsg8M.cjs +2 -0
- package/dist/{DatePicker.module-tE-tGNBd.cjs.map → DatePicker.module-BDtTsg8M.cjs.map} +1 -1
- package/dist/DatePicker.module-CMMQyEhG.js +138 -0
- package/dist/{DatePicker.module-BZDftL4g.js.map → DatePicker.module-CMMQyEhG.js.map} +1 -1
- package/dist/{DateTimePicker-COEj2Z0F.cjs → DateTimePicker-DUFtddxJ.cjs} +2 -2
- package/dist/{DateTimePicker-COEj2Z0F.cjs.map → DateTimePicker-DUFtddxJ.cjs.map} +1 -1
- package/dist/{DateTimePicker-e2zj2bhS.js → DateTimePicker-laJsZYJX.js} +10 -10
- package/dist/{DateTimePicker-e2zj2bhS.js.map → DateTimePicker-laJsZYJX.js.map} +1 -1
- package/dist/DescriptionList-BCvOX8fg.cjs +2 -0
- package/dist/DescriptionList-BCvOX8fg.cjs.map +1 -0
- package/dist/DescriptionList-Y9jF_4L0.js +176 -0
- package/dist/DescriptionList-Y9jF_4L0.js.map +1 -0
- package/dist/{Dropdown-FfkmluRu.js → Dropdown--1mNTVZJ.js} +2 -2
- package/dist/{Dropdown-FfkmluRu.js.map → Dropdown--1mNTVZJ.js.map} +1 -1
- package/dist/{Dropdown-Ui7h2TGd.cjs → Dropdown-DNZ9S_zQ.cjs} +2 -2
- package/dist/{Dropdown-Ui7h2TGd.cjs.map → Dropdown-DNZ9S_zQ.cjs.map} +1 -1
- package/dist/EmptyState-BtwuzX9Z.js +58 -0
- package/dist/EmptyState-BtwuzX9Z.js.map +1 -0
- package/dist/EmptyState-CO_NRZ6w.cjs +2 -0
- package/dist/EmptyState-CO_NRZ6w.cjs.map +1 -0
- package/dist/ErrorBoundary-DJ6R1M9k.js +126 -0
- package/dist/ErrorBoundary-DJ6R1M9k.js.map +1 -0
- package/dist/ErrorBoundary-unvC1vZQ.cjs +2 -0
- package/dist/ErrorBoundary-unvC1vZQ.cjs.map +1 -0
- package/dist/FileCard-C3a2yDhK.js +149 -0
- package/dist/FileCard-C3a2yDhK.js.map +1 -0
- package/dist/FileCard-DKjDQRzZ.cjs +2 -0
- package/dist/FileCard-DKjDQRzZ.cjs.map +1 -0
- package/dist/FileUploader-CuOHWkiG.js +707 -0
- package/dist/FileUploader-CuOHWkiG.js.map +1 -0
- package/dist/FileUploader-VIOg03pl.cjs +2 -0
- package/dist/FileUploader-VIOg03pl.cjs.map +1 -0
- package/dist/{Flag-CB4YyPj3.cjs → Flag-aOQncoEZ.cjs} +2 -2
- package/dist/{Flag-CB4YyPj3.cjs.map → Flag-aOQncoEZ.cjs.map} +1 -1
- package/dist/{Flag-yA1y5XzR.js → Flag-kpUfmrwC.js} +2 -2
- package/dist/{Flag-yA1y5XzR.js.map → Flag-kpUfmrwC.js.map} +1 -1
- package/dist/FloatingPanel-BIC4WrFa.cjs +2 -0
- package/dist/FloatingPanel-BIC4WrFa.cjs.map +1 -0
- package/dist/FloatingPanel-CeSOtE_D.js +135 -0
- package/dist/FloatingPanel-CeSOtE_D.js.map +1 -0
- package/dist/{FullscreenToggle-0lskYnpx.cjs → FullscreenToggle-BSwxQEaG.cjs} +2 -2
- package/dist/{FullscreenToggle-0lskYnpx.cjs.map → FullscreenToggle-BSwxQEaG.cjs.map} +1 -1
- package/dist/{FullscreenToggle-jSLruiKt.js → FullscreenToggle-CMifmPD3.js} +3 -3
- package/dist/{FullscreenToggle-jSLruiKt.js.map → FullscreenToggle-CMifmPD3.js.map} +1 -1
- package/dist/IconButton-A2B0bqC-.cjs +2 -0
- package/dist/{IconButton-BN-bZxEi.cjs.map → IconButton-A2B0bqC-.cjs.map} +1 -1
- package/dist/IconButton-Dq17Fekm.js +68 -0
- package/dist/{IconButton-BEGWfcVc.js.map → IconButton-Dq17Fekm.js.map} +1 -1
- package/dist/List-9lUjapQ5.cjs +2 -0
- package/dist/List-9lUjapQ5.cjs.map +1 -0
- package/dist/List-CZwNGxuP.js +107 -0
- package/dist/List-CZwNGxuP.js.map +1 -0
- package/dist/Loader-CwyoKoWY.js +28 -0
- package/dist/{Loader-BZIa8hwv.js.map → Loader-CwyoKoWY.js.map} +1 -1
- package/dist/Loader-D9nteBXt.cjs +2 -0
- package/dist/{Loader-B5YqzEYy.cjs.map → Loader-D9nteBXt.cjs.map} +1 -1
- package/dist/MobileFrame-8FSsYA_w.js +91 -0
- package/dist/MobileFrame-8FSsYA_w.js.map +1 -0
- package/dist/MobileFrame-Dsfgd_4k.cjs +2 -0
- package/dist/MobileFrame-Dsfgd_4k.cjs.map +1 -0
- package/dist/Modal-CQDcYS-Y.cjs +2 -0
- package/dist/Modal-CQDcYS-Y.cjs.map +1 -0
- package/dist/Modal-cz6JIsZn.js +196 -0
- package/dist/Modal-cz6JIsZn.js.map +1 -0
- package/dist/MultiSelect-BIwE6wb7.cjs +2 -0
- package/dist/MultiSelect-BIwE6wb7.cjs.map +1 -0
- package/dist/MultiSelect-C6l0LpIs.js +219 -0
- package/dist/MultiSelect-C6l0LpIs.js.map +1 -0
- package/dist/{MultilineTextField-Dz6Fg8RJ.cjs → MultilineTextField-B6EYAdik.cjs} +2 -2
- package/dist/{MultilineTextField-Dz6Fg8RJ.cjs.map → MultilineTextField-B6EYAdik.cjs.map} +1 -1
- package/dist/{MultilineTextField-CwNCJ9lZ.js → MultilineTextField-BgfBFeeF.js} +2 -2
- package/dist/{MultilineTextField-CwNCJ9lZ.js.map → MultilineTextField-BgfBFeeF.js.map} +1 -1
- package/dist/{NumberField-2yM0mmyj.js → NumberField-BpUTV_Qn.js} +5 -5
- package/dist/{NumberField-2yM0mmyj.js.map → NumberField-BpUTV_Qn.js.map} +1 -1
- package/dist/{NumberField-CEt95jcC.cjs → NumberField-IyhO4OpJ.cjs} +2 -2
- package/dist/{NumberField-CEt95jcC.cjs.map → NumberField-IyhO4OpJ.cjs.map} +1 -1
- package/dist/{OtpField-CkliY82J.js → OtpField-BoLxbGtY.js} +4 -4
- package/dist/{OtpField-CkliY82J.js.map → OtpField-BoLxbGtY.js.map} +1 -1
- package/dist/{OtpField-on-K0_fM.cjs → OtpField-HMrxkdiy.cjs} +2 -2
- package/dist/{OtpField-on-K0_fM.cjs.map → OtpField-HMrxkdiy.cjs.map} +1 -1
- package/dist/{PageLayout-DGHu7Vm3.cjs → PageLayout-DtWG-6dn.cjs} +2 -2
- package/dist/{PageLayout-DGHu7Vm3.cjs.map → PageLayout-DtWG-6dn.cjs.map} +1 -1
- package/dist/{PageLayout-DzPh_G6H.js → PageLayout-G8F1WgC-.js} +2 -2
- package/dist/{PageLayout-DzPh_G6H.js.map → PageLayout-G8F1WgC-.js.map} +1 -1
- package/dist/{PageNotFound-CCFfPHgA.js → PageNotFound-CeKIMZ55.js} +9 -9
- package/dist/PageNotFound-CeKIMZ55.js.map +1 -0
- package/dist/PageNotFound-DG8xXPL3.cjs +2 -0
- package/dist/PageNotFound-DG8xXPL3.cjs.map +1 -0
- package/dist/Pagination-Br8P3KwE.cjs +2 -0
- package/dist/{Pagination-BdVebW2L.cjs.map → Pagination-Br8P3KwE.cjs.map} +1 -1
- package/dist/Pagination-CE1uKrR4.js +139 -0
- package/dist/{Pagination-CmskZjcz.js.map → Pagination-CE1uKrR4.js.map} +1 -1
- package/dist/PaletteField-BBPbkDcp.js +54 -0
- package/dist/PaletteField-BBPbkDcp.js.map +1 -0
- package/dist/PaletteField-DwvSn6V6.cjs +2 -0
- package/dist/PaletteField-DwvSn6V6.cjs.map +1 -0
- package/dist/PhoneField-B-L0xAtD.js +372 -0
- package/dist/PhoneField-B-L0xAtD.js.map +1 -0
- package/dist/PhoneField-BclMbl7L.cjs +2 -0
- package/dist/PhoneField-BclMbl7L.cjs.map +1 -0
- package/dist/Popconfirm-BgpvCBy1.js +113 -0
- package/dist/Popconfirm-BgpvCBy1.js.map +1 -0
- package/dist/Popconfirm-DD8F8SXn.cjs +2 -0
- package/dist/Popconfirm-DD8F8SXn.cjs.map +1 -0
- package/dist/{Popover-CgIU4Rhg.js → Popover-B82Id9Ut.js} +2 -2
- package/dist/{Popover-CgIU4Rhg.js.map → Popover-B82Id9Ut.js.map} +1 -1
- package/dist/{Popover-CBI1icIM.cjs → Popover-DAT6DcM9.cjs} +2 -2
- package/dist/{Popover-CBI1icIM.cjs.map → Popover-DAT6DcM9.cjs.map} +1 -1
- package/dist/Progress-L5koRRJp.js +119 -0
- package/dist/Progress-L5koRRJp.js.map +1 -0
- package/dist/Progress-_aZ8XOJr.cjs +2 -0
- package/dist/Progress-_aZ8XOJr.cjs.map +1 -0
- package/dist/QrCode-BQ1eUiAJ.cjs +2 -0
- package/dist/QrCode-BQ1eUiAJ.cjs.map +1 -0
- package/dist/QrCode-osD23Vkt.js +80 -0
- package/dist/QrCode-osD23Vkt.js.map +1 -0
- package/dist/QueryError-BMH8X69O.cjs +2 -0
- package/dist/QueryError-BMH8X69O.cjs.map +1 -0
- package/dist/QueryError-tBuIQRgv.js +19 -0
- package/dist/QueryError-tBuIQRgv.js.map +1 -0
- package/dist/RadioGroup-BcFBdFhh.cjs +2 -0
- package/dist/{RadioGroup-C8u7eNBS.cjs.map → RadioGroup-BcFBdFhh.cjs.map} +1 -1
- package/dist/RadioGroup-dVx_hMCY.js +141 -0
- package/dist/{RadioGroup-DbodUJW8.js.map → RadioGroup-dVx_hMCY.js.map} +1 -1
- package/dist/RemoveDialog-C9_UzFBf.js +109 -0
- package/dist/RemoveDialog-C9_UzFBf.js.map +1 -0
- package/dist/RemoveDialog-DBKYnTYU.cjs +2 -0
- package/dist/RemoveDialog-DBKYnTYU.cjs.map +1 -0
- package/dist/RichTextEditor-DTz7Qcn_.cjs +2 -0
- package/dist/RichTextEditor-DTz7Qcn_.cjs.map +1 -0
- package/dist/{RichTextEditor-Bm8FFbcR.js → RichTextEditor-fXcbUjTl.js} +13 -13
- package/dist/RichTextEditor-fXcbUjTl.js.map +1 -0
- package/dist/RootLayout-DG2dXhXn.cjs +2 -0
- package/dist/{RootLayout-kssj9exn.cjs.map → RootLayout-DG2dXhXn.cjs.map} +1 -1
- package/dist/RootLayout-p8ArA6wA.js +515 -0
- package/dist/{RootLayout-Cf7Rr9Iz.js.map → RootLayout-p8ArA6wA.js.map} +1 -1
- package/dist/Select-BAR_aVSz.js +199 -0
- package/dist/Select-BAR_aVSz.js.map +1 -0
- package/dist/Select-BuVfUiw-.cjs +2 -0
- package/dist/Select-BuVfUiw-.cjs.map +1 -0
- package/dist/{Sidebar-YH-DoNG9.js → Sidebar-CsWcjSTx.js} +193 -183
- package/dist/Sidebar-CsWcjSTx.js.map +1 -0
- package/dist/Sidebar-NI5HGGYF.cjs +2 -0
- package/dist/Sidebar-NI5HGGYF.cjs.map +1 -0
- package/dist/Skeleton-DK0lAjS9.cjs +2 -0
- package/dist/Skeleton-DK0lAjS9.cjs.map +1 -0
- package/dist/Skeleton-_-uGax2j.js +56 -0
- package/dist/Skeleton-_-uGax2j.js.map +1 -0
- package/dist/Slider-Cu1FhxR2.cjs +2 -0
- package/dist/{Slider-dxYVXRev.cjs.map → Slider-Cu1FhxR2.cjs.map} +1 -1
- package/dist/Slider-DoQJWgGU.js +184 -0
- package/dist/{Slider-oGXd5e9X.js.map → Slider-DoQJWgGU.js.map} +1 -1
- package/dist/{SpeedDial-9_Yk8AGx.cjs → SpeedDial-C_rZkHmF.cjs} +2 -2
- package/dist/{SpeedDial-9_Yk8AGx.cjs.map → SpeedDial-C_rZkHmF.cjs.map} +1 -1
- package/dist/{SpeedDial-DWNuC6f8.js → SpeedDial-DF-ILheU.js} +2 -2
- package/dist/{SpeedDial-DWNuC6f8.js.map → SpeedDial-DF-ILheU.js.map} +1 -1
- package/dist/{Stepper-CuqFpamY.js → Stepper-B39Ax_w6.js} +70 -70
- package/dist/{Stepper-CuqFpamY.js.map → Stepper-B39Ax_w6.js.map} +1 -1
- package/dist/Stepper-CT7n113R.cjs +2 -0
- package/dist/{Stepper-B1z_u650.cjs.map → Stepper-CT7n113R.cjs.map} +1 -1
- package/dist/{SwatchPicker-CCJltwHI.cjs → SwatchPicker-BWXqgsEy.cjs} +2 -2
- package/dist/{SwatchPicker-CCJltwHI.cjs.map → SwatchPicker-BWXqgsEy.cjs.map} +1 -1
- package/dist/{SwatchPicker-CqyWngFJ.js → SwatchPicker-Bpxk0IOe.js} +3 -3
- package/dist/{SwatchPicker-CqyWngFJ.js.map → SwatchPicker-Bpxk0IOe.js.map} +1 -1
- package/dist/Switch-DSs2Y0IR.cjs +2 -0
- package/dist/{Switch-DRkZ6kHJ.cjs.map → Switch-DSs2Y0IR.cjs.map} +1 -1
- package/dist/Switch-Jh2Ch8GO.js +85 -0
- package/dist/{Switch-DMPJ0fhB.js.map → Switch-Jh2Ch8GO.js.map} +1 -1
- package/dist/Table-CH_oiEP3.js +1170 -0
- package/dist/Table-CH_oiEP3.js.map +1 -0
- package/dist/Table-DD_uysnY.cjs +2 -0
- package/dist/Table-DD_uysnY.cjs.map +1 -0
- package/dist/Tabs-By86Cmpw.js +190 -0
- package/dist/{Tabs-ytbBzAxG.js.map → Tabs-By86Cmpw.js.map} +1 -1
- package/dist/Tabs-C1N9FgAq.cjs +2 -0
- package/dist/{Tabs-BiKDy_fv.cjs.map → Tabs-C1N9FgAq.cjs.map} +1 -1
- package/dist/{TagsField-CEt_PC5y.js → TagsField-BiOyAadf.js} +5 -5
- package/dist/{TagsField-CEt_PC5y.js.map → TagsField-BiOyAadf.js.map} +1 -1
- package/dist/{TagsField-DpDbf0ru.cjs → TagsField-RX-x45-j.cjs} +2 -2
- package/dist/{TagsField-DpDbf0ru.cjs.map → TagsField-RX-x45-j.cjs.map} +1 -1
- package/dist/{TextField-Df_kGy2l.cjs → TextField-CdbanZuk.cjs} +2 -2
- package/dist/{TextField-Df_kGy2l.cjs.map → TextField-CdbanZuk.cjs.map} +1 -1
- package/dist/{TextField-BWdmF-HE.js → TextField-CkronCRC.js} +5 -5
- package/dist/{TextField-BWdmF-HE.js.map → TextField-CkronCRC.js.map} +1 -1
- package/dist/TextField.module-6gYcR9TL.js +27 -0
- package/dist/TextField.module-6gYcR9TL.js.map +1 -0
- package/dist/TextField.module-DsNCo8vN.cjs +2 -0
- package/dist/TextField.module-DsNCo8vN.cjs.map +1 -0
- package/dist/{ThemeToggle-CgxF6oUu.js → ThemeToggle-BYUEH6be.js} +3 -3
- package/dist/{ThemeToggle-CgxF6oUu.js.map → ThemeToggle-BYUEH6be.js.map} +1 -1
- package/dist/{ThemeToggle-BJdXhmfc.cjs → ThemeToggle-C4QhDd76.cjs} +2 -2
- package/dist/{ThemeToggle-BJdXhmfc.cjs.map → ThemeToggle-C4QhDd76.cjs.map} +1 -1
- package/dist/{TimeColumns-DxVN0V8l.cjs → TimeColumns-Cl0_IRf0.cjs} +2 -2
- package/dist/{TimeColumns-DxVN0V8l.cjs.map → TimeColumns-Cl0_IRf0.cjs.map} +1 -1
- package/dist/{TimeColumns-n-fz50mr.js → TimeColumns-yzjScNU8.js} +3 -3
- package/dist/{TimeColumns-n-fz50mr.js.map → TimeColumns-yzjScNU8.js.map} +1 -1
- package/dist/{TimePicker-DvoemiGz.cjs → TimePicker-CJGVGETl.cjs} +2 -2
- package/dist/{TimePicker-DvoemiGz.cjs.map → TimePicker-CJGVGETl.cjs.map} +1 -1
- package/dist/{TimePicker-Bopxx3zU.js → TimePicker-CoIdMv1S.js} +8 -8
- package/dist/{TimePicker-Bopxx3zU.js.map → TimePicker-CoIdMv1S.js.map} +1 -1
- package/dist/Timeline-CKEosWka.cjs +2 -0
- package/dist/{Timeline-ONU_3gi3.cjs.map → Timeline-CKEosWka.cjs.map} +1 -1
- package/dist/Timeline-ufVXmpMY.js +71 -0
- package/dist/{Timeline-D3kzt1dy.js.map → Timeline-ufVXmpMY.js.map} +1 -1
- package/dist/{Toaster-BxIY2H4V.js → Toaster-Dhz2mYq_.js} +2 -2
- package/dist/{Toaster-BxIY2H4V.js.map → Toaster-Dhz2mYq_.js.map} +1 -1
- package/dist/{Toaster-DZSzFse_.cjs → Toaster-lv5cJhib.cjs} +2 -2
- package/dist/{Toaster-DZSzFse_.cjs.map → Toaster-lv5cJhib.cjs.map} +1 -1
- package/dist/{TranslatedFields-BtDLkQy7.cjs → TranslatedFields-BCJ86Tqp.cjs} +2 -2
- package/dist/{TranslatedFields-BtDLkQy7.cjs.map → TranslatedFields-BCJ86Tqp.cjs.map} +1 -1
- package/dist/{TranslatedFields-DmR8LKSG.js → TranslatedFields-BtNUAyrY.js} +5 -5
- package/dist/{TranslatedFields-DmR8LKSG.js.map → TranslatedFields-BtNUAyrY.js.map} +1 -1
- package/dist/Typography-B6ASPrzT.cjs +2 -0
- package/dist/Typography-B6ASPrzT.cjs.map +1 -0
- package/dist/Typography-CJv5AnRP.js +70 -0
- package/dist/Typography-CJv5AnRP.js.map +1 -0
- package/dist/UserCard-B-eNyZuT.js +78 -0
- package/dist/UserCard-B-eNyZuT.js.map +1 -0
- package/dist/UserCard-CiQUrZjb.cjs +2 -0
- package/dist/UserCard-CiQUrZjb.cjs.map +1 -0
- package/dist/app/AdminRoot.d.cts +10 -3
- package/dist/app/AdminRoot.d.ts +10 -3
- package/dist/color-CgR8ybWZ.cjs +2 -0
- package/dist/color-CgR8ybWZ.cjs.map +1 -0
- package/dist/color-EQJ2DrcQ.js +24 -0
- package/dist/color-EQJ2DrcQ.js.map +1 -0
- 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/Avatar/Avatar.d.cts +7 -1
- package/dist/components/Avatar/Avatar.d.ts +7 -1
- package/dist/components/Avatar/index.cjs +1 -1
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Badge/index.cjs +1 -1
- package/dist/components/Badge/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/Card.d.cts +2 -0
- package/dist/components/Card/Card.d.ts +2 -0
- package/dist/components/Card/index.cjs +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Checkbox/index.cjs +1 -1
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/Chip/index.cjs +1 -1
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/ChoiceCard/index.cjs +1 -1
- package/dist/components/ChoiceCard/index.js +1 -1
- package/dist/components/CodeBlock/index.cjs +1 -1
- package/dist/components/CodeBlock/index.js +1 -1
- package/dist/components/ColorPicker/ColorPicker.d.cts +5 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts +5 -0
- package/dist/components/ColorPicker/ColorPickerPanel.d.cts +6 -1
- package/dist/components/ColorPicker/ColorPickerPanel.d.ts +6 -1
- package/dist/components/ColorPicker/colorUtils.d.cts +3 -12
- package/dist/components/ColorPicker/colorUtils.d.ts +3 -12
- package/dist/components/ColorPicker/index.cjs +1 -1
- package/dist/components/ColorPicker/index.js +1 -1
- package/dist/components/ColorRamp/ColorRamp.d.cts +36 -0
- package/dist/components/ColorRamp/ColorRamp.d.ts +36 -0
- package/dist/components/ColorRamp/index.cjs +2 -0
- package/dist/components/ColorRamp/index.cjs.map +1 -0
- package/dist/components/ColorRamp/index.d.cts +3 -0
- package/dist/components/ColorRamp/index.d.ts +3 -0
- package/dist/components/ColorRamp/index.js +6 -0
- package/dist/components/ColorRamp/index.js.map +1 -0
- package/dist/components/CopyButton/index.cjs +1 -1
- package/dist/components/CopyButton/index.js +1 -1
- package/dist/components/DashedButton/index.cjs +1 -1
- package/dist/components/DashedButton/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/DescriptionList/DescriptionList.d.cts +76 -0
- package/dist/components/DescriptionList/DescriptionList.d.ts +76 -0
- package/dist/components/DescriptionList/index.cjs +2 -0
- package/dist/components/DescriptionList/index.cjs.map +1 -0
- package/dist/components/DescriptionList/index.d.cts +2 -0
- package/dist/components/DescriptionList/index.d.ts +2 -0
- package/dist/components/DescriptionList/index.js +6 -0
- package/dist/components/DescriptionList/index.js.map +1 -0
- package/dist/components/Dropdown/index.cjs +1 -1
- package/dist/components/Dropdown/index.js +1 -1
- package/dist/components/EmptyState/EmptyState.d.cts +4 -1
- package/dist/components/EmptyState/EmptyState.d.ts +4 -1
- package/dist/components/EmptyState/index.cjs +1 -1
- package/dist/components/EmptyState/index.js +1 -1
- package/dist/components/ErrorState/ErrorBoundary.d.cts +35 -0
- package/dist/components/ErrorState/ErrorBoundary.d.ts +35 -0
- package/dist/components/ErrorState/ErrorState.d.cts +36 -0
- package/dist/components/ErrorState/ErrorState.d.ts +36 -0
- package/dist/components/ErrorState/QueryError.d.cts +18 -0
- package/dist/components/ErrorState/QueryError.d.ts +18 -0
- package/dist/components/ErrorState/errorMessage.d.cts +14 -0
- package/dist/components/ErrorState/errorMessage.d.ts +14 -0
- package/dist/components/ErrorState/index.cjs +2 -0
- package/dist/components/ErrorState/index.cjs.map +1 -0
- package/dist/components/ErrorState/index.d.cts +7 -0
- package/dist/components/ErrorState/index.d.ts +7 -0
- package/dist/components/ErrorState/index.js +11 -0
- package/dist/components/ErrorState/index.js.map +1 -0
- 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/FloatingPanel/FloatingPanel.d.cts +4 -0
- package/dist/components/FloatingPanel/FloatingPanel.d.ts +4 -0
- 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/List/List.d.cts +13 -3
- package/dist/components/List/List.d.ts +13 -3
- package/dist/components/List/ListItem.d.cts +5 -0
- package/dist/components/List/ListItem.d.ts +5 -0
- package/dist/components/List/index.cjs +1 -1
- package/dist/components/List/index.js +4 -5
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/List/listContext.d.cts +9 -3
- package/dist/components/List/listContext.d.ts +9 -3
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/index.js +1 -1
- package/dist/components/MobileFrame/MobileFrame.d.cts +45 -0
- package/dist/components/MobileFrame/MobileFrame.d.ts +45 -0
- package/dist/components/MobileFrame/frames.d.cts +27 -0
- package/dist/components/MobileFrame/frames.d.ts +27 -0
- package/dist/components/MobileFrame/index.cjs +2 -0
- package/dist/components/MobileFrame/index.cjs.map +1 -0
- package/dist/components/MobileFrame/index.d.cts +4 -0
- package/dist/components/MobileFrame/index.d.ts +4 -0
- package/dist/components/MobileFrame/index.js +8 -0
- package/dist/components/MobileFrame/index.js.map +1 -0
- package/dist/components/Modal/Modal.d.cts +2 -0
- package/dist/components/Modal/Modal.d.ts +2 -0
- 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/MultilineTextField/index.cjs +1 -1
- package/dist/components/MultilineTextField/index.js +1 -1
- package/dist/components/NumberField/index.cjs +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OptionMenu/OptionMenu.d.cts +40 -0
- package/dist/components/OptionMenu/OptionMenu.d.ts +40 -0
- package/dist/components/OptionMenu/useOptionMenu.d.cts +81 -0
- package/dist/components/OptionMenu/useOptionMenu.d.ts +81 -0
- 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/PageNotFound.d.cts +1 -1
- package/dist/components/PageNotFound/PageNotFound.d.ts +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/PaletteField/PaletteField.d.cts +30 -0
- package/dist/components/PaletteField/PaletteField.d.ts +30 -0
- package/dist/components/PaletteField/index.cjs +2 -0
- package/dist/components/PaletteField/index.cjs.map +1 -0
- package/dist/components/PaletteField/index.d.cts +2 -0
- package/dist/components/PaletteField/index.d.ts +2 -0
- package/dist/components/PaletteField/index.js +6 -0
- package/dist/components/PaletteField/index.js.map +1 -0
- package/dist/components/PhoneField/PhoneField.d.cts +54 -0
- package/dist/components/PhoneField/PhoneField.d.ts +54 -0
- package/dist/components/PhoneField/index.cjs +2 -0
- package/dist/components/PhoneField/index.cjs.map +1 -0
- package/dist/components/PhoneField/index.d.cts +4 -0
- package/dist/components/PhoneField/index.d.ts +4 -0
- package/dist/components/PhoneField/index.js +7 -0
- package/dist/components/PhoneField/index.js.map +1 -0
- package/dist/components/PhoneField/phone.d.cts +50 -0
- package/dist/components/PhoneField/phone.d.ts +50 -0
- package/dist/components/Popconfirm/Popconfirm.d.cts +53 -0
- package/dist/components/Popconfirm/Popconfirm.d.ts +53 -0
- package/dist/components/Popconfirm/index.cjs +2 -0
- package/dist/components/Popconfirm/index.cjs.map +1 -0
- package/dist/components/Popconfirm/index.d.cts +2 -0
- package/dist/components/Popconfirm/index.d.ts +2 -0
- package/dist/components/Popconfirm/index.js +6 -0
- package/dist/components/Popconfirm/index.js.map +1 -0
- package/dist/components/Popover/index.cjs +1 -1
- package/dist/components/Popover/index.js +1 -1
- package/dist/components/Progress/Progress.d.cts +50 -0
- package/dist/components/Progress/Progress.d.ts +50 -0
- package/dist/components/Progress/index.cjs +2 -0
- package/dist/components/Progress/index.cjs.map +1 -0
- package/dist/components/Progress/index.d.cts +2 -0
- package/dist/components/Progress/index.d.ts +2 -0
- package/dist/components/Progress/index.js +6 -0
- package/dist/components/Progress/index.js.map +1 -0
- package/dist/components/QrCode/QrCode.d.cts +3 -0
- package/dist/components/QrCode/QrCode.d.ts +3 -0
- package/dist/components/QrCode/index.cjs +1 -1
- package/dist/components/QrCode/index.js +1 -1
- package/dist/components/Radio/index.cjs +1 -1
- package/dist/components/Radio/index.js +1 -1
- package/dist/components/RemoveDialog/RemoveDialog.d.cts +8 -1
- package/dist/components/RemoveDialog/RemoveDialog.d.ts +8 -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/Select.d.cts +2 -12
- package/dist/components/Select/Select.d.ts +2 -12
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/Skeleton/Skeleton.d.cts +31 -0
- package/dist/components/Skeleton/Skeleton.d.ts +31 -0
- package/dist/components/Skeleton/index.cjs +2 -0
- package/dist/components/Skeleton/index.cjs.map +1 -0
- package/dist/components/Skeleton/index.d.cts +2 -0
- package/dist/components/Skeleton/index.d.ts +2 -0
- package/dist/components/Skeleton/index.js +6 -0
- package/dist/components/Skeleton/index.js.map +1 -0
- package/dist/components/Slider/index.cjs +1 -1
- package/dist/components/Slider/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/SwatchPicker/index.cjs +1 -1
- package/dist/components/SwatchPicker/index.js +1 -1
- package/dist/components/Switch/index.cjs +1 -1
- package/dist/components/Switch/index.js +1 -1
- package/dist/components/Table/Table.d.cts +7 -1
- package/dist/components/Table/Table.d.ts +7 -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/Timeline/index.cjs +1 -1
- package/dist/components/Timeline/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/Typography/Typography.d.cts +10 -3
- package/dist/components/Typography/Typography.d.ts +10 -3
- package/dist/components/Typography/index.cjs +1 -1
- package/dist/components/Typography/index.js +1 -1
- package/dist/components/UserCard/UserCard.d.cts +3 -1
- package/dist/components/UserCard/UserCard.d.ts +3 -1
- package/dist/components/UserCard/index.cjs +1 -1
- package/dist/components/UserCard/index.js +1 -1
- package/dist/components/index.d.cts +9 -0
- package/dist/components/index.d.ts +9 -0
- 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 +171 -146
- package/dist/entries/components.js.map +1 -1
- package/dist/entries/helpers.cjs +1 -1
- package/dist/entries/helpers.d.cts +2 -0
- package/dist/entries/helpers.d.ts +2 -0
- package/dist/entries/helpers.js +18 -8
- package/dist/entries/helpers.js.map +1 -1
- package/dist/entries/i18n.cjs +1 -1
- package/dist/entries/i18n.js +2 -2
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.js +1 -1
- package/dist/helpers/color.d.cts +17 -0
- package/dist/helpers/color.d.ts +17 -0
- package/dist/helpers/palette.d.cts +68 -0
- package/dist/helpers/palette.d.ts +68 -0
- package/dist/hooks/useOptionalPeer.d.cts +21 -0
- package/dist/hooks/useOptionalPeer.d.ts +21 -0
- package/dist/i18n/messages.d.cts +24 -0
- package/dist/i18n/messages.d.ts +24 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +16 -12
- package/dist/index.js +224 -189
- package/dist/index.js.map +1 -1
- package/dist/{messages-ogohLC5P.js → messages-BF2ft7yD.js} +201 -33
- package/dist/messages-BF2ft7yD.js.map +1 -0
- package/dist/messages-ihnE1jVG.cjs +36 -0
- package/dist/messages-ihnE1jVG.cjs.map +1 -0
- package/dist/palette-B031dM4E.js +70 -0
- package/dist/palette-B031dM4E.js.map +1 -0
- package/dist/palette-BycMHbED.cjs +2 -0
- package/dist/palette-BycMHbED.cjs.map +1 -0
- package/dist/theme/ConfigProvider.d.cts +8 -8
- package/dist/theme/ConfigProvider.d.ts +8 -8
- package/dist/useOptionMenu-C0xSaZ4t.cjs +2 -0
- package/dist/useOptionMenu-C0xSaZ4t.cjs.map +1 -0
- package/dist/useOptionMenu-Cq_eHdab.js +286 -0
- package/dist/useOptionMenu-Cq_eHdab.js.map +1 -0
- package/dist/useOptionalPeer-49f3XcO5.js +28 -0
- package/dist/useOptionalPeer-49f3XcO5.js.map +1 -0
- package/dist/useOptionalPeer-9Fkx5Leb.cjs +2 -0
- package/dist/useOptionalPeer-9Fkx5Leb.cjs.map +1 -0
- package/package.json +6 -1
- package/dist/AdminRoot-BkPPRkyQ.cjs +0 -2
- package/dist/AdminRoot-BkPPRkyQ.cjs.map +0 -1
- package/dist/AdminRoot-CgvtgUpW.js +0 -50
- package/dist/AdminRoot-CgvtgUpW.js.map +0 -1
- package/dist/Avatar-Dgf04PBC.cjs +0 -2
- package/dist/Avatar-Dgf04PBC.cjs.map +0 -1
- package/dist/Avatar-Q50J8wdN.js +0 -60
- package/dist/Avatar-Q50J8wdN.js.map +0 -1
- package/dist/Badge-BQpr2Jee.cjs +0 -2
- package/dist/Badge-DSWigoGC.js +0 -50
- package/dist/Button-CXmDOzPk.cjs +0 -2
- package/dist/Button-DBs8xnA5.js +0 -72
- package/dist/Card-DGF22HbS.cjs +0 -2
- package/dist/Card-DGF22HbS.cjs.map +0 -1
- package/dist/Card-DYKnWt-L.js +0 -118
- package/dist/Card-DYKnWt-L.js.map +0 -1
- package/dist/Checkbox-ZYOSBYRt.js +0 -98
- package/dist/Checkbox-fzJCwe0j.cjs +0 -2
- package/dist/Chip-gUH_7nQc.cjs +0 -2
- package/dist/ChoiceCardGroup-DBohUnRj.js +0 -181
- package/dist/ChoiceCardGroup-d0VVTUi5.cjs +0 -2
- package/dist/ColorPicker-DtzFwNWk.cjs +0 -2
- package/dist/ColorPicker-DtzFwNWk.cjs.map +0 -1
- package/dist/ColorPicker-Dw6Qk0iy.js.map +0 -1
- package/dist/ColorPickerPanel--wBX-m7J.cjs +0 -2
- package/dist/ColorPickerPanel--wBX-m7J.cjs.map +0 -1
- package/dist/ColorPickerPanel-Dp7bnnVf.js +0 -336
- package/dist/ColorPickerPanel-Dp7bnnVf.js.map +0 -1
- package/dist/ConfigProvider-Bszl3Wr3.cjs.map +0 -1
- package/dist/ConfigProvider-DR9YMy9U.js.map +0 -1
- package/dist/CopyButton-Ct-8AmmX.cjs +0 -2
- package/dist/CopyButton-DJ1PSJZU.js +0 -31
- package/dist/DashedButton-3C4IZuo4.cjs +0 -2
- package/dist/DashedButton-BXZAyMtw.js +0 -59
- package/dist/DatePicker.module-BZDftL4g.js +0 -138
- package/dist/DatePicker.module-tE-tGNBd.cjs +0 -2
- package/dist/EmptyState-BTd7aVgu.js +0 -38
- package/dist/EmptyState-BTd7aVgu.js.map +0 -1
- package/dist/EmptyState-Bv4XXnD1.cjs +0 -2
- package/dist/EmptyState-Bv4XXnD1.cjs.map +0 -1
- package/dist/FileCard-DW5Ur8Aj.cjs +0 -2
- package/dist/FileCard-DW5Ur8Aj.cjs.map +0 -1
- package/dist/FileCard-DY8N9Lzz.js +0 -148
- package/dist/FileCard-DY8N9Lzz.js.map +0 -1
- package/dist/FileUploader-B7VfhcR7.cjs +0 -2
- package/dist/FileUploader-B7VfhcR7.cjs.map +0 -1
- package/dist/FileUploader-BYF5FvUc.js +0 -684
- package/dist/FileUploader-BYF5FvUc.js.map +0 -1
- package/dist/FloatingPanel-BG9Uag__.js +0 -131
- package/dist/FloatingPanel-BG9Uag__.js.map +0 -1
- package/dist/FloatingPanel-U6sGYiSK.cjs +0 -2
- package/dist/FloatingPanel-U6sGYiSK.cjs.map +0 -1
- package/dist/IconButton-BEGWfcVc.js +0 -68
- package/dist/IconButton-BN-bZxEi.cjs +0 -2
- package/dist/List-ChXO0Hz-.cjs +0 -2
- package/dist/List-ChXO0Hz-.cjs.map +0 -1
- package/dist/List-LqbfF6gU.js +0 -26
- package/dist/List-LqbfF6gU.js.map +0 -1
- package/dist/ListItem-Cn15lJBr.js +0 -74
- package/dist/ListItem-Cn15lJBr.js.map +0 -1
- package/dist/ListItem-yXXjtepZ.cjs +0 -2
- package/dist/ListItem-yXXjtepZ.cjs.map +0 -1
- package/dist/Loader-B5YqzEYy.cjs +0 -2
- package/dist/Loader-BZIa8hwv.js +0 -29
- package/dist/Modal-0V-REVV-.cjs +0 -2
- package/dist/Modal-0V-REVV-.cjs.map +0 -1
- package/dist/Modal-B7yoFC3o.js +0 -195
- package/dist/Modal-B7yoFC3o.js.map +0 -1
- package/dist/MultiSelect-C8xuXaoR.js +0 -350
- package/dist/MultiSelect-C8xuXaoR.js.map +0 -1
- package/dist/MultiSelect-gj9Ymeh2.cjs +0 -2
- package/dist/MultiSelect-gj9Ymeh2.cjs.map +0 -1
- package/dist/PageNotFound-B8_eIT8p.cjs +0 -2
- package/dist/PageNotFound-B8_eIT8p.cjs.map +0 -1
- package/dist/PageNotFound-CCFfPHgA.js.map +0 -1
- package/dist/Pagination-BdVebW2L.cjs +0 -2
- package/dist/Pagination-CmskZjcz.js +0 -139
- package/dist/QrCode-Bcj9_Emc.js +0 -70
- package/dist/QrCode-Bcj9_Emc.js.map +0 -1
- package/dist/QrCode-DfDfGhG-.cjs +0 -2
- package/dist/QrCode-DfDfGhG-.cjs.map +0 -1
- package/dist/RadioGroup-C8u7eNBS.cjs +0 -2
- package/dist/RadioGroup-DbodUJW8.js +0 -141
- package/dist/RemoveDialog-CV75B0aN.js +0 -47
- package/dist/RemoveDialog-CV75B0aN.js.map +0 -1
- package/dist/RemoveDialog-DmOk0ezc.cjs +0 -2
- package/dist/RemoveDialog-DmOk0ezc.cjs.map +0 -1
- package/dist/RichTextEditor-Bm8FFbcR.js.map +0 -1
- package/dist/RichTextEditor-uXddgtlk.cjs +0 -2
- package/dist/RichTextEditor-uXddgtlk.cjs.map +0 -1
- package/dist/RootLayout-Cf7Rr9Iz.js +0 -515
- package/dist/RootLayout-kssj9exn.cjs +0 -2
- package/dist/Select-7vEGJCvA.cjs +0 -2
- package/dist/Select-7vEGJCvA.cjs.map +0 -1
- package/dist/Select-CdX3Ks7y.js +0 -338
- package/dist/Select-CdX3Ks7y.js.map +0 -1
- package/dist/Sidebar-DcKIEfhy.cjs +0 -2
- package/dist/Sidebar-DcKIEfhy.cjs.map +0 -1
- package/dist/Sidebar-YH-DoNG9.js.map +0 -1
- package/dist/Slider-dxYVXRev.cjs +0 -2
- package/dist/Slider-oGXd5e9X.js +0 -184
- package/dist/Stepper-B1z_u650.cjs +0 -2
- package/dist/Switch-DMPJ0fhB.js +0 -85
- package/dist/Switch-DRkZ6kHJ.cjs +0 -2
- package/dist/Table-BPit83Pn.cjs +0 -2
- package/dist/Table-BPit83Pn.cjs.map +0 -1
- package/dist/Table-Drdhfm99.js +0 -1090
- package/dist/Table-Drdhfm99.js.map +0 -1
- package/dist/Tabs-BiKDy_fv.cjs +0 -2
- package/dist/Tabs-ytbBzAxG.js +0 -190
- package/dist/TextField.module-QePvGeJ3.js +0 -27
- package/dist/TextField.module-QePvGeJ3.js.map +0 -1
- package/dist/TextField.module-m-UllwzG.cjs +0 -2
- package/dist/TextField.module-m-UllwzG.cjs.map +0 -1
- package/dist/Timeline-D3kzt1dy.js +0 -71
- package/dist/Timeline-ONU_3gi3.cjs +0 -2
- package/dist/Typography-BFatE1_A.cjs +0 -2
- package/dist/Typography-BFatE1_A.cjs.map +0 -1
- package/dist/Typography-Cta6Rg4L.js +0 -51
- package/dist/Typography-Cta6Rg4L.js.map +0 -1
- package/dist/UserCard-C1yFvVIc.cjs +0 -2
- package/dist/UserCard-C1yFvVIc.cjs.map +0 -1
- package/dist/UserCard-J8Bpbh3x.js +0 -74
- package/dist/UserCard-J8Bpbh3x.js.map +0 -1
- package/dist/messages-DKT0SRM0.cjs +0 -36
- package/dist/messages-DKT0SRM0.cjs.map +0 -1
- package/dist/messages-ogohLC5P.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DescriptionList-BCvOX8fg.cjs","sources":["../src/components/DescriptionList/DescriptionList.tsx"],"sourcesContent":["import { forwardRef, useId, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { resolveResponsive, type Breakpoint, type Responsive } from '../../theme/breakpoints'\nimport { useBreakpointMatches } from '../../hooks/useMediaQuery'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { CopyButton } from '../CopyButton'\nimport { IconButton } from '../IconButton'\nimport { Skeleton } from '../Skeleton'\nimport { Typography } from '../Typography'\nimport styles from './DescriptionList.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type DescriptionListSize = 'sm' | 'md' | 'lg'\nexport type DescriptionListLayout = 'vertical' | 'horizontal'\nexport type DescriptionListColumns = 1 | 2 | 3 | 4\nexport type DescriptionListValueWeight = 'regular' | 'medium' | 'bold'\n\nexport interface DescriptionItem {\n /** Stable key (defaults to the index). */\n key?: string\n /** The term — \"Entry fee\". */\n label: ReactNode\n /** The value. `null` / `undefined` / `''` / `false` render the `emptyText` placeholder (\"—\"). */\n value?: ReactNode\n /** Columns this pair spans (clamped to the resolved column count) — for long text, addresses, lists. */\n span?: DescriptionListColumns\n /** Show a copy button: `true` copies a string/number `value`; pass a string to copy something else (an id behind a label). */\n copyable?: boolean | string\n /** Drop the pair entirely (e.g. by role). */\n hidden?: boolean\n /** Small leading icon in the label — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n}\n\nexport interface DescriptionListProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title' | 'color'\n> {\n /** The label / value pairs, in order. Declarative so `loading` skeletons and `hidden` stay trivial. */\n items: DescriptionItem[]\n /** Column count — a number or a desktop-first breakpoint map. Defaults to `{ xs: 1, sm: 2, lg: 3 }`. */\n columns?: Responsive<DescriptionListColumns>\n /** `vertical` (label above value, default) or `horizontal` (label beside value; stacks again on phones). */\n layout?: DescriptionListLayout\n /** Text + spacing scale. Defaults to `md`. */\n size?: DescriptionListSize\n /** Font weight of the values. Defaults to `regular` (the library's body default); `medium` / `bold` add emphasis. */\n valueWeight?: DescriptionListValueWeight\n /** Frame the list as a surface card (border + radius); `horizontal` also tints the label column. */\n bordered?: boolean\n /** Hairlines between rows. Defaults to `true` (turn off inside an already-ruled container). */\n dividers?: boolean\n /** Label column width for `horizontal` (px number or CSS length). Defaults to `160px`. */\n labelWidth?: number | string\n /**\n * `horizontal` only — the breakpoint at (and below) which the label stacks back above the value.\n * A breakpoint token (`'xxs'` ≤ 576px default, `'xs'` ≤ 768px, …) or `false` to keep the two columns\n * side by side at every width. Uses the shared JS breakpoint layer, so `config.theme.breakpoints` applies.\n */\n stackBelow?: Breakpoint | false\n /** Render shimmering placeholders instead of values — `true` uses `items.length` rows, a number sets the count. */\n loading?: boolean | number\n /** Placeholder for an empty value. Defaults to `\"—\"`. */\n emptyText?: ReactNode\n /** Optional header title. */\n title?: ReactNode\n /** Leading header icon (a tinted box before the title, like `Card`) — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Theme color that tints the header icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Muted line under the title. */\n subtitle?: ReactNode\n /** Header slot on the right (buttons, a status chip …). */\n actions?: ReactNode\n}\n\nconst DEFAULT_COLUMNS: Responsive<DescriptionListColumns> = { xs: 1, sm: 2, lg: 3 }\n\nconst isEmpty = (value: ReactNode) => value == null || value === '' || value === false\n\n/** What `copyable` copies: an explicit string, else a string / number value; nothing for rich nodes. */\nconst copyTextOf = (item: DescriptionItem): string | undefined => {\n if (typeof item.copyable === 'string') return item.copyable\n if (typeof item.value === 'string' || typeof item.value === 'number') return String(item.value)\n return undefined\n}\n\n/** Lay the items on a `cols`-wide grid the way CSS auto-placement will (spans clamped, wrapping rows). */\nconst placeItems = (items: DescriptionItem[], cols: number) => {\n let row = 0\n let col = 0\n return items.map((item) => {\n const span = Math.min(item.span ?? 1, cols)\n if (col + span > cols) {\n row += 1\n col = 0\n }\n const placed = { item, span, row, col }\n col += span\n if (col >= cols) {\n row += 1\n col = 0\n }\n return placed\n })\n}\n\nconst renderIcon = (icon: IconName | ReactNode, size: 'sm' | 'md' = 'sm') =>\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n/**\n * Label / value pairs for a **detail page** (the read-only twin of a form: \"User #42\" → Name, Email,\n * Role …). Renders a semantic `<dl>` of `<dt>` / `<dd>` groups laid out on a responsive CSS grid\n * (`columns`, desktop-first breakpoint map — default 1 → 2 → 3), each pair optionally spanning several\n * columns. An optional Card-style header carries an `icon` box (tinted by `color`), `title`,\n * `subtitle` and `actions`. Values are regular weight by default (`valueWeight` adds emphasis) and any node: `null` / `''` show a muted \"—\" placeholder (`emptyText`), string / number\n * values can grow a `CopyButton` (revealed on hover / focus; always visible without hover), and\n * `hidden` drops a pair (e.g. by role). `layout=\"horizontal\"` puts the label beside the value in a\n * `labelWidth` column and stacks back on phones (`stackBelow` — a breakpoint, or `false` to never stack); `bordered` frames the list as a surface card (tinting the\n * label column when horizontal). `loading` swaps the values for `Skeleton` lines of the same shape.\n * Rows are separated by hairline `dividers`. Token-only; the grid is never `overflow: hidden` so the\n * copy tooltip is never clipped. `forwardRef` to the root `<div>`.\n */\nexport const DescriptionList = forwardRef<HTMLDivElement, DescriptionListProps>(\n function DescriptionList(\n {\n items,\n columns = DEFAULT_COLUMNS,\n layout = 'vertical',\n size = 'md',\n valueWeight = 'regular',\n bordered = false,\n dividers = true,\n labelWidth = 160,\n stackBelow = 'xxs',\n loading = false,\n emptyText = '\\u2014',\n title,\n icon,\n color = 'accent',\n subtitle,\n actions,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const t = useT()\n const id = useId()\n const titleId = `${id}-title`\n const matches = useBreakpointMatches()\n const cols = resolveResponsive(columns, matches) ?? 1\n const stacked = layout === 'horizontal' && stackBelow !== false && matches[stackBelow]\n\n const visible = items.filter((item) => !item.hidden)\n // Grid placement (span-aware) — the last row drops its hairline (nothing follows it, and in `bordered`\n // it would double the frame's border), and its first cell rounds the frame's bottom-left corner\n // (`bordered` + `horizontal` tints the label column, and that tint must not bleed past the radius).\n const placed = placeItems(visible, cols)\n const lastRow = placed.length ? placed[placed.length - 1].row : 0\n const skeletonRows = typeof loading === 'number' ? loading : visible.length || 6\n const hasHeader = title != null || subtitle != null || actions != null || icon != null\n\n const vars = {\n '--dl-cols': cols,\n '--dl-label-w': typeof labelWidth === 'number' ? `${labelWidth}px` : labelWidth,\n } as CSSProperties\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.root,\n styles[size],\n styles[layout],\n valueWeight !== 'regular' && styles[`value${valueWeight === 'bold' ? 'Bold' : 'Medium'}`],\n bordered && styles.bordered,\n dividers && styles.dividers,\n stacked && styles.stacked,\n className,\n )}\n style={{ ...vars, ...style }}\n {...props}\n >\n {hasHeader && (\n <div className={styles.header}>\n <div className={styles.headerMain}>\n {icon != null && (\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={color}\n nonClickable\n aria-hidden\n className={styles.headerIcon}\n >\n {renderIcon(icon, 'md')}\n </IconButton>\n )}\n {(title != null || subtitle != null) && (\n <div className={styles.headerText}>\n {title != null && (\n <Typography as=\"h3\" id={titleId} variant=\"subtitle\" className={styles.title}>\n {title}\n </Typography>\n )}\n {subtitle != null && (\n <Typography as=\"p\" variant=\"bodySmall\" color=\"muted\">\n {subtitle}\n </Typography>\n )}\n </div>\n )}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n )}\n\n <dl\n className={styles.grid}\n aria-labelledby={title != null ? titleId : undefined}\n aria-busy={loading ? true : undefined}\n aria-label={loading ? t('descriptionList.loading') : undefined}\n >\n {loading\n ? Array.from({ length: skeletonRows }, (_, i) => (\n <div key={i} className={styles.item} aria-hidden=\"true\">\n <dt className={styles.label}>\n <Skeleton width=\"40%\" height=\"0.9em\" />\n </dt>\n <dd className={styles.value}>\n <Skeleton width=\"70%\" height=\"1.1em\" />\n </dd>\n </div>\n ))\n : placed.map(({ item, span, row, col }, i) => {\n const empty = isEmpty(item.value)\n const copy = !empty && item.copyable ? copyTextOf(item) : undefined\n return (\n <div\n key={item.key ?? i}\n className={clsx(\n styles.item,\n row === lastRow && styles.lastRow,\n row === lastRow && col === 0 && styles.lastRowStart,\n )}\n style={{ '--dl-span': span } as CSSProperties}\n >\n <dt className={styles.label}>\n {item.icon != null && (\n <span className={styles.labelIcon} aria-hidden=\"true\">\n {renderIcon(item.icon)}\n </span>\n )}\n {item.label}\n </dt>\n <dd className={styles.value}>\n <span className={styles.valueText}>\n {empty ? (\n <span\n className={styles.placeholder}\n aria-label={t('descriptionList.empty')}\n >\n {emptyText}\n </span>\n ) : (\n item.value\n )}\n </span>\n {copy != null && (\n <span className={styles.copy}>\n <CopyButton\n value={copy}\n size=\"sm\"\n variant=\"text\"\n className={styles.copyButton}\n />\n </span>\n )}\n </dd>\n </div>\n )\n })}\n </dl>\n </div>\n )\n },\n)\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_COLUMNS","isEmpty","value","copyTextOf","item","placeItems","items","cols","row","col","span","placed","renderIcon","icon","size","jsx","Icon","DescriptionList","forwardRef","columns","layout","valueWeight","bordered","dividers","labelWidth","stackBelow","loading","emptyText","title","color","subtitle","actions","className","style","props","ref","t","useT","titleId","useId","matches","useBreakpointMatches","resolveResponsive","stacked","visible","lastRow","skeletonRows","hasHeader","vars","jsxs","clsx","styles","IconButton","Typography","_","i","Skeleton","empty","copy","CopyButton"],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { jsxs as o, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as K, useId as P } from "react";
|
|
3
|
+
import { clsx as B } from "clsx";
|
|
4
|
+
import { r as Q } from "./breakpoints-BbDakdqF.js";
|
|
5
|
+
import { u as V } from "./useMediaQuery-DrDUrkmJ.js";
|
|
6
|
+
import { a as X } from "./names-r21QPjcU.js";
|
|
7
|
+
import { I as Y } from "./Icon-DaTvzLBu.js";
|
|
8
|
+
import { C as Z } from "./CopyButton-BplPYm8i.js";
|
|
9
|
+
import { I as W } from "./IconButton-Dq17Fekm.js";
|
|
10
|
+
import { S as k } from "./Skeleton-_-uGax2j.js";
|
|
11
|
+
import { T as z } from "./Typography-CJv5AnRP.js";
|
|
12
|
+
import { a as ee } from "./ConfigProvider-B_RSn9bb.js";
|
|
13
|
+
const ae = "_root_1hhb1_4", se = "_sm_1hhb1_14", le = "_md_1hhb1_22", te = "_lg_1hhb1_30", oe = "_header_1hhb1_40", ne = "_headerMain_1hhb1_49", re = "_headerIcon_1hhb1_56", ce = "_headerText_1hhb1_59", de = "_title_1hhb1_65", he = "_actions_1hhb1_68", ie = "_grid_1hhb1_80", _e = "_item_1hhb1_87", me = "_dividers_1hhb1_95", ue = "_lastRow_1hhb1_99", pe = "_label_1hhb1_103", be = "_labelIcon_1hhb1_111", ve = "_value_1hhb1_116", fe = "_valueMedium_1hhb1_125", ye = "_valueBold_1hhb1_128", Ne = "_valueText_1hhb1_131", xe = "_placeholder_1hhb1_135", Ie = "_copy_1hhb1_148", ge = "_copyButton_1hhb1_156", we = "_horizontal_1hhb1_172", Te = "_stacked_1hhb1_170", Me = "_bordered_1hhb1_184", Re = "_lastRowStart_1hhb1_213", e = {
|
|
14
|
+
root: ae,
|
|
15
|
+
sm: se,
|
|
16
|
+
md: le,
|
|
17
|
+
lg: te,
|
|
18
|
+
header: oe,
|
|
19
|
+
headerMain: ne,
|
|
20
|
+
headerIcon: re,
|
|
21
|
+
headerText: ce,
|
|
22
|
+
title: de,
|
|
23
|
+
actions: he,
|
|
24
|
+
grid: ie,
|
|
25
|
+
item: _e,
|
|
26
|
+
dividers: me,
|
|
27
|
+
lastRow: ue,
|
|
28
|
+
label: pe,
|
|
29
|
+
labelIcon: be,
|
|
30
|
+
value: ve,
|
|
31
|
+
valueMedium: fe,
|
|
32
|
+
valueBold: ye,
|
|
33
|
+
valueText: Ne,
|
|
34
|
+
placeholder: xe,
|
|
35
|
+
copy: Ie,
|
|
36
|
+
copyButton: ge,
|
|
37
|
+
horizontal: we,
|
|
38
|
+
stacked: Te,
|
|
39
|
+
bordered: Me,
|
|
40
|
+
lastRowStart: Re
|
|
41
|
+
}, Se = new Set(X), Be = { xs: 1, sm: 2, lg: 3 }, ke = (a) => a == null || a === "" || a === !1, ze = (a) => {
|
|
42
|
+
if (typeof a.copyable == "string") return a.copyable;
|
|
43
|
+
if (typeof a.value == "string" || typeof a.value == "number") return String(a.value);
|
|
44
|
+
}, Ce = (a, n) => {
|
|
45
|
+
let c = 0, t = 0;
|
|
46
|
+
return a.map((i) => {
|
|
47
|
+
const r = Math.min(i.span ?? 1, n);
|
|
48
|
+
t + r > n && (c += 1, t = 0);
|
|
49
|
+
const u = { item: i, span: r, row: c, col: t };
|
|
50
|
+
return t += r, t >= n && (c += 1, t = 0), u;
|
|
51
|
+
});
|
|
52
|
+
}, C = (a, n = "sm") => typeof a == "string" && Se.has(a) ? /* @__PURE__ */ s(Y, { name: a, size: n }) : a, Ke = K(
|
|
53
|
+
function({
|
|
54
|
+
items: n,
|
|
55
|
+
columns: c = Be,
|
|
56
|
+
layout: t = "vertical",
|
|
57
|
+
size: i = "md",
|
|
58
|
+
valueWeight: r = "regular",
|
|
59
|
+
bordered: u = !1,
|
|
60
|
+
dividers: L = !0,
|
|
61
|
+
labelWidth: p = 160,
|
|
62
|
+
stackBelow: y = "xxs",
|
|
63
|
+
loading: d = !1,
|
|
64
|
+
emptyText: E = "—",
|
|
65
|
+
title: h,
|
|
66
|
+
icon: b,
|
|
67
|
+
color: A = "accent",
|
|
68
|
+
subtitle: _,
|
|
69
|
+
actions: v,
|
|
70
|
+
className: D,
|
|
71
|
+
style: O,
|
|
72
|
+
...$
|
|
73
|
+
}, j) {
|
|
74
|
+
const N = ee(), x = `${P()}-title`, I = V(), g = Q(c, I) ?? 1, U = t === "horizontal" && y !== !1 && I[y], w = n.filter((l) => !l.hidden), m = Ce(w, g), T = m.length ? m[m.length - 1].row : 0, F = typeof d == "number" ? d : w.length || 6, H = h != null || _ != null || v != null || b != null, q = {
|
|
75
|
+
"--dl-cols": g,
|
|
76
|
+
"--dl-label-w": typeof p == "number" ? `${p}px` : p
|
|
77
|
+
};
|
|
78
|
+
return /* @__PURE__ */ o(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
ref: j,
|
|
82
|
+
className: B(
|
|
83
|
+
e.root,
|
|
84
|
+
e[i],
|
|
85
|
+
e[t],
|
|
86
|
+
r !== "regular" && e[`value${r === "bold" ? "Bold" : "Medium"}`],
|
|
87
|
+
u && e.bordered,
|
|
88
|
+
L && e.dividers,
|
|
89
|
+
U && e.stacked,
|
|
90
|
+
D
|
|
91
|
+
),
|
|
92
|
+
style: { ...q, ...O },
|
|
93
|
+
...$,
|
|
94
|
+
children: [
|
|
95
|
+
H && /* @__PURE__ */ o("div", { className: e.header, children: [
|
|
96
|
+
/* @__PURE__ */ o("div", { className: e.headerMain, children: [
|
|
97
|
+
b != null && /* @__PURE__ */ s(
|
|
98
|
+
W,
|
|
99
|
+
{
|
|
100
|
+
variant: "filled",
|
|
101
|
+
size: "sm",
|
|
102
|
+
color: A,
|
|
103
|
+
nonClickable: !0,
|
|
104
|
+
"aria-hidden": !0,
|
|
105
|
+
className: e.headerIcon,
|
|
106
|
+
children: C(b, "md")
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
(h != null || _ != null) && /* @__PURE__ */ o("div", { className: e.headerText, children: [
|
|
110
|
+
h != null && /* @__PURE__ */ s(z, { as: "h3", id: x, variant: "subtitle", className: e.title, children: h }),
|
|
111
|
+
_ != null && /* @__PURE__ */ s(z, { as: "p", variant: "bodySmall", color: "muted", children: _ })
|
|
112
|
+
] })
|
|
113
|
+
] }),
|
|
114
|
+
v != null && /* @__PURE__ */ s("div", { className: e.actions, children: v })
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ s(
|
|
117
|
+
"dl",
|
|
118
|
+
{
|
|
119
|
+
className: e.grid,
|
|
120
|
+
"aria-labelledby": h != null ? x : void 0,
|
|
121
|
+
"aria-busy": d ? !0 : void 0,
|
|
122
|
+
"aria-label": d ? N("descriptionList.loading") : void 0,
|
|
123
|
+
children: d ? Array.from({ length: F }, (l, f) => /* @__PURE__ */ o("div", { className: e.item, "aria-hidden": "true", children: [
|
|
124
|
+
/* @__PURE__ */ s("dt", { className: e.label, children: /* @__PURE__ */ s(k, { width: "40%", height: "0.9em" }) }),
|
|
125
|
+
/* @__PURE__ */ s("dd", { className: e.value, children: /* @__PURE__ */ s(k, { width: "70%", height: "1.1em" }) })
|
|
126
|
+
] }, f)) : m.map(({ item: l, span: f, row: M, col: G }, J) => {
|
|
127
|
+
const R = ke(l.value), S = !R && l.copyable ? ze(l) : void 0;
|
|
128
|
+
return /* @__PURE__ */ o(
|
|
129
|
+
"div",
|
|
130
|
+
{
|
|
131
|
+
className: B(
|
|
132
|
+
e.item,
|
|
133
|
+
M === T && e.lastRow,
|
|
134
|
+
M === T && G === 0 && e.lastRowStart
|
|
135
|
+
),
|
|
136
|
+
style: { "--dl-span": f },
|
|
137
|
+
children: [
|
|
138
|
+
/* @__PURE__ */ o("dt", { className: e.label, children: [
|
|
139
|
+
l.icon != null && /* @__PURE__ */ s("span", { className: e.labelIcon, "aria-hidden": "true", children: C(l.icon) }),
|
|
140
|
+
l.label
|
|
141
|
+
] }),
|
|
142
|
+
/* @__PURE__ */ o("dd", { className: e.value, children: [
|
|
143
|
+
/* @__PURE__ */ s("span", { className: e.valueText, children: R ? /* @__PURE__ */ s(
|
|
144
|
+
"span",
|
|
145
|
+
{
|
|
146
|
+
className: e.placeholder,
|
|
147
|
+
"aria-label": N("descriptionList.empty"),
|
|
148
|
+
children: E
|
|
149
|
+
}
|
|
150
|
+
) : l.value }),
|
|
151
|
+
S != null && /* @__PURE__ */ s("span", { className: e.copy, children: /* @__PURE__ */ s(
|
|
152
|
+
Z,
|
|
153
|
+
{
|
|
154
|
+
value: S,
|
|
155
|
+
size: "sm",
|
|
156
|
+
variant: "text",
|
|
157
|
+
className: e.copyButton
|
|
158
|
+
}
|
|
159
|
+
) })
|
|
160
|
+
] })
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
l.key ?? J
|
|
164
|
+
);
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
export {
|
|
174
|
+
Ke as D
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=DescriptionList-Y9jF_4L0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DescriptionList-Y9jF_4L0.js","sources":["../src/components/DescriptionList/DescriptionList.tsx"],"sourcesContent":["import { forwardRef, useId, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { resolveResponsive, type Breakpoint, type Responsive } from '../../theme/breakpoints'\nimport { useBreakpointMatches } from '../../hooks/useMediaQuery'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { CopyButton } from '../CopyButton'\nimport { IconButton } from '../IconButton'\nimport { Skeleton } from '../Skeleton'\nimport { Typography } from '../Typography'\nimport styles from './DescriptionList.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type DescriptionListSize = 'sm' | 'md' | 'lg'\nexport type DescriptionListLayout = 'vertical' | 'horizontal'\nexport type DescriptionListColumns = 1 | 2 | 3 | 4\nexport type DescriptionListValueWeight = 'regular' | 'medium' | 'bold'\n\nexport interface DescriptionItem {\n /** Stable key (defaults to the index). */\n key?: string\n /** The term — \"Entry fee\". */\n label: ReactNode\n /** The value. `null` / `undefined` / `''` / `false` render the `emptyText` placeholder (\"—\"). */\n value?: ReactNode\n /** Columns this pair spans (clamped to the resolved column count) — for long text, addresses, lists. */\n span?: DescriptionListColumns\n /** Show a copy button: `true` copies a string/number `value`; pass a string to copy something else (an id behind a label). */\n copyable?: boolean | string\n /** Drop the pair entirely (e.g. by role). */\n hidden?: boolean\n /** Small leading icon in the label — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n}\n\nexport interface DescriptionListProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title' | 'color'\n> {\n /** The label / value pairs, in order. Declarative so `loading` skeletons and `hidden` stay trivial. */\n items: DescriptionItem[]\n /** Column count — a number or a desktop-first breakpoint map. Defaults to `{ xs: 1, sm: 2, lg: 3 }`. */\n columns?: Responsive<DescriptionListColumns>\n /** `vertical` (label above value, default) or `horizontal` (label beside value; stacks again on phones). */\n layout?: DescriptionListLayout\n /** Text + spacing scale. Defaults to `md`. */\n size?: DescriptionListSize\n /** Font weight of the values. Defaults to `regular` (the library's body default); `medium` / `bold` add emphasis. */\n valueWeight?: DescriptionListValueWeight\n /** Frame the list as a surface card (border + radius); `horizontal` also tints the label column. */\n bordered?: boolean\n /** Hairlines between rows. Defaults to `true` (turn off inside an already-ruled container). */\n dividers?: boolean\n /** Label column width for `horizontal` (px number or CSS length). Defaults to `160px`. */\n labelWidth?: number | string\n /**\n * `horizontal` only — the breakpoint at (and below) which the label stacks back above the value.\n * A breakpoint token (`'xxs'` ≤ 576px default, `'xs'` ≤ 768px, …) or `false` to keep the two columns\n * side by side at every width. Uses the shared JS breakpoint layer, so `config.theme.breakpoints` applies.\n */\n stackBelow?: Breakpoint | false\n /** Render shimmering placeholders instead of values — `true` uses `items.length` rows, a number sets the count. */\n loading?: boolean | number\n /** Placeholder for an empty value. Defaults to `\"—\"`. */\n emptyText?: ReactNode\n /** Optional header title. */\n title?: ReactNode\n /** Leading header icon (a tinted box before the title, like `Card`) — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Theme color that tints the header icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Muted line under the title. */\n subtitle?: ReactNode\n /** Header slot on the right (buttons, a status chip …). */\n actions?: ReactNode\n}\n\nconst DEFAULT_COLUMNS: Responsive<DescriptionListColumns> = { xs: 1, sm: 2, lg: 3 }\n\nconst isEmpty = (value: ReactNode) => value == null || value === '' || value === false\n\n/** What `copyable` copies: an explicit string, else a string / number value; nothing for rich nodes. */\nconst copyTextOf = (item: DescriptionItem): string | undefined => {\n if (typeof item.copyable === 'string') return item.copyable\n if (typeof item.value === 'string' || typeof item.value === 'number') return String(item.value)\n return undefined\n}\n\n/** Lay the items on a `cols`-wide grid the way CSS auto-placement will (spans clamped, wrapping rows). */\nconst placeItems = (items: DescriptionItem[], cols: number) => {\n let row = 0\n let col = 0\n return items.map((item) => {\n const span = Math.min(item.span ?? 1, cols)\n if (col + span > cols) {\n row += 1\n col = 0\n }\n const placed = { item, span, row, col }\n col += span\n if (col >= cols) {\n row += 1\n col = 0\n }\n return placed\n })\n}\n\nconst renderIcon = (icon: IconName | ReactNode, size: 'sm' | 'md' = 'sm') =>\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n/**\n * Label / value pairs for a **detail page** (the read-only twin of a form: \"User #42\" → Name, Email,\n * Role …). Renders a semantic `<dl>` of `<dt>` / `<dd>` groups laid out on a responsive CSS grid\n * (`columns`, desktop-first breakpoint map — default 1 → 2 → 3), each pair optionally spanning several\n * columns. An optional Card-style header carries an `icon` box (tinted by `color`), `title`,\n * `subtitle` and `actions`. Values are regular weight by default (`valueWeight` adds emphasis) and any node: `null` / `''` show a muted \"—\" placeholder (`emptyText`), string / number\n * values can grow a `CopyButton` (revealed on hover / focus; always visible without hover), and\n * `hidden` drops a pair (e.g. by role). `layout=\"horizontal\"` puts the label beside the value in a\n * `labelWidth` column and stacks back on phones (`stackBelow` — a breakpoint, or `false` to never stack); `bordered` frames the list as a surface card (tinting the\n * label column when horizontal). `loading` swaps the values for `Skeleton` lines of the same shape.\n * Rows are separated by hairline `dividers`. Token-only; the grid is never `overflow: hidden` so the\n * copy tooltip is never clipped. `forwardRef` to the root `<div>`.\n */\nexport const DescriptionList = forwardRef<HTMLDivElement, DescriptionListProps>(\n function DescriptionList(\n {\n items,\n columns = DEFAULT_COLUMNS,\n layout = 'vertical',\n size = 'md',\n valueWeight = 'regular',\n bordered = false,\n dividers = true,\n labelWidth = 160,\n stackBelow = 'xxs',\n loading = false,\n emptyText = '\\u2014',\n title,\n icon,\n color = 'accent',\n subtitle,\n actions,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const t = useT()\n const id = useId()\n const titleId = `${id}-title`\n const matches = useBreakpointMatches()\n const cols = resolveResponsive(columns, matches) ?? 1\n const stacked = layout === 'horizontal' && stackBelow !== false && matches[stackBelow]\n\n const visible = items.filter((item) => !item.hidden)\n // Grid placement (span-aware) — the last row drops its hairline (nothing follows it, and in `bordered`\n // it would double the frame's border), and its first cell rounds the frame's bottom-left corner\n // (`bordered` + `horizontal` tints the label column, and that tint must not bleed past the radius).\n const placed = placeItems(visible, cols)\n const lastRow = placed.length ? placed[placed.length - 1].row : 0\n const skeletonRows = typeof loading === 'number' ? loading : visible.length || 6\n const hasHeader = title != null || subtitle != null || actions != null || icon != null\n\n const vars = {\n '--dl-cols': cols,\n '--dl-label-w': typeof labelWidth === 'number' ? `${labelWidth}px` : labelWidth,\n } as CSSProperties\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.root,\n styles[size],\n styles[layout],\n valueWeight !== 'regular' && styles[`value${valueWeight === 'bold' ? 'Bold' : 'Medium'}`],\n bordered && styles.bordered,\n dividers && styles.dividers,\n stacked && styles.stacked,\n className,\n )}\n style={{ ...vars, ...style }}\n {...props}\n >\n {hasHeader && (\n <div className={styles.header}>\n <div className={styles.headerMain}>\n {icon != null && (\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={color}\n nonClickable\n aria-hidden\n className={styles.headerIcon}\n >\n {renderIcon(icon, 'md')}\n </IconButton>\n )}\n {(title != null || subtitle != null) && (\n <div className={styles.headerText}>\n {title != null && (\n <Typography as=\"h3\" id={titleId} variant=\"subtitle\" className={styles.title}>\n {title}\n </Typography>\n )}\n {subtitle != null && (\n <Typography as=\"p\" variant=\"bodySmall\" color=\"muted\">\n {subtitle}\n </Typography>\n )}\n </div>\n )}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n )}\n\n <dl\n className={styles.grid}\n aria-labelledby={title != null ? titleId : undefined}\n aria-busy={loading ? true : undefined}\n aria-label={loading ? t('descriptionList.loading') : undefined}\n >\n {loading\n ? Array.from({ length: skeletonRows }, (_, i) => (\n <div key={i} className={styles.item} aria-hidden=\"true\">\n <dt className={styles.label}>\n <Skeleton width=\"40%\" height=\"0.9em\" />\n </dt>\n <dd className={styles.value}>\n <Skeleton width=\"70%\" height=\"1.1em\" />\n </dd>\n </div>\n ))\n : placed.map(({ item, span, row, col }, i) => {\n const empty = isEmpty(item.value)\n const copy = !empty && item.copyable ? copyTextOf(item) : undefined\n return (\n <div\n key={item.key ?? i}\n className={clsx(\n styles.item,\n row === lastRow && styles.lastRow,\n row === lastRow && col === 0 && styles.lastRowStart,\n )}\n style={{ '--dl-span': span } as CSSProperties}\n >\n <dt className={styles.label}>\n {item.icon != null && (\n <span className={styles.labelIcon} aria-hidden=\"true\">\n {renderIcon(item.icon)}\n </span>\n )}\n {item.label}\n </dt>\n <dd className={styles.value}>\n <span className={styles.valueText}>\n {empty ? (\n <span\n className={styles.placeholder}\n aria-label={t('descriptionList.empty')}\n >\n {emptyText}\n </span>\n ) : (\n item.value\n )}\n </span>\n {copy != null && (\n <span className={styles.copy}>\n <CopyButton\n value={copy}\n size=\"sm\"\n variant=\"text\"\n className={styles.copyButton}\n />\n </span>\n )}\n </dd>\n </div>\n )\n })}\n </dl>\n </div>\n )\n },\n)\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_COLUMNS","isEmpty","value","copyTextOf","item","placeItems","items","cols","row","col","span","placed","renderIcon","icon","size","jsx","Icon","DescriptionList","forwardRef","columns","layout","valueWeight","bordered","dividers","labelWidth","stackBelow","loading","emptyText","title","color","subtitle","actions","className","style","props","ref","t","useT","titleId","useId","matches","useBreakpointMatches","resolveResponsive","stacked","visible","lastRow","skeletonRows","hasHeader","vars","jsxs","clsx","styles","IconButton","Typography","_","i","Skeleton","empty","copy","CopyButton"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as et, Fragment as nt, jsx as q } from "react/jsx-runtime";
|
|
|
2
2
|
import { useId as ot, useRef as z, useState as R, useCallback as M, useLayoutEffect as rt, useEffect as W, cloneElement as it } from "react";
|
|
3
3
|
import { createPortal as st } from "react-dom";
|
|
4
4
|
import { clsx as ct } from "clsx";
|
|
5
|
-
import { L as at } from "./List-
|
|
5
|
+
import { L as at } from "./List-CZwNGxuP.js";
|
|
6
6
|
import { u as lt } from "./useLockBodyScroll-DwBILLPK.js";
|
|
7
7
|
const ut = "_panel_ntp6g_4", dt = "_sm_ntp6g_21", mt = "_md_ntp6g_24", ft = "_lg_ntp6g_27", C = {
|
|
8
8
|
panel: ut,
|
|
@@ -143,4 +143,4 @@ function Et({
|
|
|
143
143
|
export {
|
|
144
144
|
Et as D
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=Dropdown
|
|
146
|
+
//# sourceMappingURL=Dropdown--1mNTVZJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown-FfkmluRu.js","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport { List, type ListItemSize } from '../List'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport styles from './Dropdown.module.css'\n\nexport type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end'\n\ninterface Position {\n top: number\n left: number\n side: 'top' | 'bottom'\n maxHeight: number\n minWidth?: number\n}\n\nexport interface DropdownProps {\n /** The element that opens the menu (e.g. a `Button` / `IconButton`). Cloned to wire click + a11y. */\n trigger: ReactElement\n /** Menu content — typically `ListItem`s (composed inside a `role=\"menu\"` `List`). */\n children: ReactNode\n /** Preferred placement. Flips to the opposite side automatically when it would overflow. Default `bottom-start`. */\n placement?: DropdownPlacement\n /** Menu size — sets the panel min-width (`sm` 150 · `md` 190 · `lg` 220) and the items' density. Default `md`. */\n size?: ListItemSize\n /**\n * Apply the size-based min-width (`sm` 150 · `md` 190 · `lg` 220px). Defaults to `true`; set `false`\n * to let the menu size to its content instead (the items' density still tracks `size`).\n */\n minWidth?: boolean\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Close the menu when an item inside is clicked. Defaults to `true`. */\n closeOnSelect?: boolean\n /** Make the menu at least as wide as the trigger (select-like). Defaults to `false`. */\n matchTriggerWidth?: boolean\n /** Prevents opening. */\n disabled?: boolean\n /** Gap between the trigger and the menu, in px. Defaults to `6`. */\n offset?: number\n /** Class applied to the floating panel. */\n className?: string\n /** Style applied to the floating panel. */\n style?: CSSProperties\n}\n\n/** Distance the menu is kept from the viewport edges (px). */\nconst VIEWPORT_PADDING = 8\n/** Focusable menu items, used for arrow-key roving. */\nconst FOCUSABLE =\n '[role=\"menuitem\"],[role=\"button\"],a[href],button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nfunction focusableItems(panel: HTMLElement | null): HTMLElement[] {\n if (!panel) return []\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getAttribute('aria-disabled') !== 'true' && el.offsetParent !== null,\n )\n}\n\n/**\n * A floating menu anchored to a `trigger`. Opens on trigger click; closes on outside click, `Escape`,\n * or selecting an item. The panel is portaled to `document.body` and positioned with collision\n * handling — it **flips** to the opposite side when it would overflow, clamps within the viewport, and\n * re-positions on scroll/resize (a too-tall menu caps its height and scrolls). Arrow keys move between\n * items; `Escape` returns focus to the trigger. Compose `ListItem`s as `children`.\n */\nexport function Dropdown({\n trigger,\n children,\n placement = 'bottom-start',\n size = 'md',\n minWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnSelect = true,\n matchTriggerWidth = false,\n disabled = false,\n offset = 6,\n className,\n style,\n}: DropdownProps) {\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const panelRef = useRef<HTMLDivElement | null>(null)\n\n const isControlled = open !== undefined\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = isControlled ? open : internalOpen\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<Position | null>(null)\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next)\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n const close = useCallback(() => setOpen(false), [setOpen])\n\n // lock page scroll while the menu is open (no scrollbar shift)\n useLockBodyScroll(isOpen)\n\n // ── positioning: flip when it would overflow, clamp inside the viewport ──\n const update = useCallback(() => {\n const triggerEl = triggerRef.current\n const panel = panelRef.current\n if (!triggerEl || !panel) return\n\n const rect = triggerEl.getBoundingClientRect()\n const panelW = panel.offsetWidth\n const panelH = panel.offsetHeight\n const vw = window.innerWidth\n const vh = window.innerHeight\n const pad = VIEWPORT_PADDING\n\n const spaceBelow = vh - rect.bottom - offset - pad\n const spaceAbove = rect.top - offset - pad\n let side: 'top' | 'bottom' = placement.startsWith('bottom') ? 'bottom' : 'top'\n // flip only when the preferred side can't fit AND the opposite side has more room\n if (side === 'bottom' && panelH > spaceBelow && spaceAbove > spaceBelow) side = 'top'\n else if (side === 'top' && panelH > spaceAbove && spaceBelow > spaceAbove) side = 'bottom'\n\n const available = side === 'bottom' ? spaceBelow : spaceAbove\n const maxHeight = Math.max(0, available)\n const usedH = Math.min(panelH, maxHeight)\n\n let top = side === 'bottom' ? rect.bottom + offset : rect.top - offset - usedH\n top = Math.min(Math.max(top, pad), Math.max(pad, vh - pad - usedH))\n\n let left = placement.endsWith('end') ? rect.right - panelW : rect.left\n left = Math.min(Math.max(left, pad), Math.max(pad, vw - pad - panelW))\n\n setPos({ top, left, side, maxHeight, minWidth: matchTriggerWidth ? rect.width : undefined })\n }, [placement, offset, matchTriggerWidth])\n\n // position synchronously before paint whenever the menu is open\n useLayoutEffect(() => {\n if (!isOpen) {\n setVisible(false)\n return\n }\n update()\n }, [isOpen, update])\n\n // enter transition + reposition listeners while open\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => setVisible(true))\n\n const onReposition = () => update()\n window.addEventListener('resize', onReposition)\n window.addEventListener('scroll', onReposition, true)\n let ro: ResizeObserver | undefined\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(onReposition)\n if (panelRef.current) ro.observe(panelRef.current)\n if (triggerRef.current) ro.observe(triggerRef.current)\n }\n\n return () => {\n cancelAnimationFrame(raf)\n window.removeEventListener('resize', onReposition)\n window.removeEventListener('scroll', onReposition, true)\n ro?.disconnect()\n }\n }, [isOpen, update])\n\n // outside click + keyboard (Escape, arrow roving)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n close()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n triggerRef.current?.focus()\n } else if (event.key === 'Tab') {\n // Tab would move focus by portal DOM order (end of <body>), orphaning the open menu — close it\n // and let focus continue naturally from the trigger (Select/MultiSelect do the same)\n close()\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n const items = focusableItems(panelRef.current)\n if (!items.length) return\n const current = items.indexOf(document.activeElement as HTMLElement)\n const delta = event.key === 'ArrowDown' ? 1 : -1\n const next = (current + delta + items.length) % items.length\n items[next]?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen, close])\n\n // focus the first item once the menu is open and positioned\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => focusableItems(panelRef.current)[0]?.focus())\n return () => cancelAnimationFrame(raf)\n }, [isOpen])\n\n const triggerProps = trigger.props as {\n onClick?: (event: ReactMouseEvent) => void\n ref?: Ref<HTMLElement>\n }\n const originalRef = triggerProps.ref\n\n const clonedTrigger = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node\n if (typeof originalRef === 'function') originalRef(node)\n else if (originalRef) (originalRef as { current: HTMLElement | null }).current = node\n },\n onClick: (event: ReactMouseEvent) => {\n triggerProps.onClick?.(event)\n if (!disabled) setOpen(!isOpen)\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? menuId : undefined,\n })\n\n const handlePanelClick = (event: ReactMouseEvent) => {\n if (!closeOnSelect) return\n const item = (event.target as HTMLElement).closest(FOCUSABLE)\n if (item && item.getAttribute('aria-disabled') !== 'true') {\n close()\n triggerRef.current?.focus()\n }\n }\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n id={menuId}\n className={clsx(styles.panel, minWidth && styles[size], className)}\n data-open={visible ? 'true' : 'false'}\n data-side={pos?.side ?? 'bottom'}\n style={{\n position: 'fixed',\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n maxHeight: pos?.maxHeight,\n minWidth: pos?.minWidth,\n visibility: pos ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={handlePanelClick}\n >\n <List role=\"menu\" size={size} padding=\"xs\">\n {children}\n </List>\n </div>,\n document.body,\n )}\n </>\n )\n}\n"],"names":["VIEWPORT_PADDING","FOCUSABLE","focusableItems","panel","el","Dropdown","trigger","children","placement","size","minWidth","open","defaultOpen","onOpenChange","closeOnSelect","matchTriggerWidth","disabled","offset","className","style","menuId","useId","triggerRef","useRef","panelRef","isControlled","internalOpen","setInternalOpen","useState","isOpen","visible","setVisible","pos","setPos","setOpen","useCallback","next","close","useLockBodyScroll","update","triggerEl","rect","panelW","panelH","vw","vh","pad","spaceBelow","spaceAbove","side","maxHeight","usedH","top","left","useLayoutEffect","useEffect","raf","onReposition","ro","onPointerDown","event","target","_a","_b","onKeyDown","items","current","delta","triggerProps","originalRef","clonedTrigger","cloneElement","node","handlePanelClick","item","jsxs","Fragment","createPortal","jsx","clsx","styles","List"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown--1mNTVZJ.js","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport { List, type ListItemSize } from '../List'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport styles from './Dropdown.module.css'\n\nexport type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end'\n\ninterface Position {\n top: number\n left: number\n side: 'top' | 'bottom'\n maxHeight: number\n minWidth?: number\n}\n\nexport interface DropdownProps {\n /** The element that opens the menu (e.g. a `Button` / `IconButton`). Cloned to wire click + a11y. */\n trigger: ReactElement\n /** Menu content — typically `ListItem`s (composed inside a `role=\"menu\"` `List`). */\n children: ReactNode\n /** Preferred placement. Flips to the opposite side automatically when it would overflow. Default `bottom-start`. */\n placement?: DropdownPlacement\n /** Menu size — sets the panel min-width (`sm` 150 · `md` 190 · `lg` 220) and the items' density. Default `md`. */\n size?: ListItemSize\n /**\n * Apply the size-based min-width (`sm` 150 · `md` 190 · `lg` 220px). Defaults to `true`; set `false`\n * to let the menu size to its content instead (the items' density still tracks `size`).\n */\n minWidth?: boolean\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Close the menu when an item inside is clicked. Defaults to `true`. */\n closeOnSelect?: boolean\n /** Make the menu at least as wide as the trigger (select-like). Defaults to `false`. */\n matchTriggerWidth?: boolean\n /** Prevents opening. */\n disabled?: boolean\n /** Gap between the trigger and the menu, in px. Defaults to `6`. */\n offset?: number\n /** Class applied to the floating panel. */\n className?: string\n /** Style applied to the floating panel. */\n style?: CSSProperties\n}\n\n/** Distance the menu is kept from the viewport edges (px). */\nconst VIEWPORT_PADDING = 8\n/** Focusable menu items, used for arrow-key roving. */\nconst FOCUSABLE =\n '[role=\"menuitem\"],[role=\"button\"],a[href],button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nfunction focusableItems(panel: HTMLElement | null): HTMLElement[] {\n if (!panel) return []\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getAttribute('aria-disabled') !== 'true' && el.offsetParent !== null,\n )\n}\n\n/**\n * A floating menu anchored to a `trigger`. Opens on trigger click; closes on outside click, `Escape`,\n * or selecting an item. The panel is portaled to `document.body` and positioned with collision\n * handling — it **flips** to the opposite side when it would overflow, clamps within the viewport, and\n * re-positions on scroll/resize (a too-tall menu caps its height and scrolls). Arrow keys move between\n * items; `Escape` returns focus to the trigger. Compose `ListItem`s as `children`.\n */\nexport function Dropdown({\n trigger,\n children,\n placement = 'bottom-start',\n size = 'md',\n minWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnSelect = true,\n matchTriggerWidth = false,\n disabled = false,\n offset = 6,\n className,\n style,\n}: DropdownProps) {\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const panelRef = useRef<HTMLDivElement | null>(null)\n\n const isControlled = open !== undefined\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = isControlled ? open : internalOpen\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<Position | null>(null)\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next)\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n const close = useCallback(() => setOpen(false), [setOpen])\n\n // lock page scroll while the menu is open (no scrollbar shift)\n useLockBodyScroll(isOpen)\n\n // ── positioning: flip when it would overflow, clamp inside the viewport ──\n const update = useCallback(() => {\n const triggerEl = triggerRef.current\n const panel = panelRef.current\n if (!triggerEl || !panel) return\n\n const rect = triggerEl.getBoundingClientRect()\n const panelW = panel.offsetWidth\n const panelH = panel.offsetHeight\n const vw = window.innerWidth\n const vh = window.innerHeight\n const pad = VIEWPORT_PADDING\n\n const spaceBelow = vh - rect.bottom - offset - pad\n const spaceAbove = rect.top - offset - pad\n let side: 'top' | 'bottom' = placement.startsWith('bottom') ? 'bottom' : 'top'\n // flip only when the preferred side can't fit AND the opposite side has more room\n if (side === 'bottom' && panelH > spaceBelow && spaceAbove > spaceBelow) side = 'top'\n else if (side === 'top' && panelH > spaceAbove && spaceBelow > spaceAbove) side = 'bottom'\n\n const available = side === 'bottom' ? spaceBelow : spaceAbove\n const maxHeight = Math.max(0, available)\n const usedH = Math.min(panelH, maxHeight)\n\n let top = side === 'bottom' ? rect.bottom + offset : rect.top - offset - usedH\n top = Math.min(Math.max(top, pad), Math.max(pad, vh - pad - usedH))\n\n let left = placement.endsWith('end') ? rect.right - panelW : rect.left\n left = Math.min(Math.max(left, pad), Math.max(pad, vw - pad - panelW))\n\n setPos({ top, left, side, maxHeight, minWidth: matchTriggerWidth ? rect.width : undefined })\n }, [placement, offset, matchTriggerWidth])\n\n // position synchronously before paint whenever the menu is open\n useLayoutEffect(() => {\n if (!isOpen) {\n setVisible(false)\n return\n }\n update()\n }, [isOpen, update])\n\n // enter transition + reposition listeners while open\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => setVisible(true))\n\n const onReposition = () => update()\n window.addEventListener('resize', onReposition)\n window.addEventListener('scroll', onReposition, true)\n let ro: ResizeObserver | undefined\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(onReposition)\n if (panelRef.current) ro.observe(panelRef.current)\n if (triggerRef.current) ro.observe(triggerRef.current)\n }\n\n return () => {\n cancelAnimationFrame(raf)\n window.removeEventListener('resize', onReposition)\n window.removeEventListener('scroll', onReposition, true)\n ro?.disconnect()\n }\n }, [isOpen, update])\n\n // outside click + keyboard (Escape, arrow roving)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n close()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n triggerRef.current?.focus()\n } else if (event.key === 'Tab') {\n // Tab would move focus by portal DOM order (end of <body>), orphaning the open menu — close it\n // and let focus continue naturally from the trigger (Select/MultiSelect do the same)\n close()\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n const items = focusableItems(panelRef.current)\n if (!items.length) return\n const current = items.indexOf(document.activeElement as HTMLElement)\n const delta = event.key === 'ArrowDown' ? 1 : -1\n const next = (current + delta + items.length) % items.length\n items[next]?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen, close])\n\n // focus the first item once the menu is open and positioned\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => focusableItems(panelRef.current)[0]?.focus())\n return () => cancelAnimationFrame(raf)\n }, [isOpen])\n\n const triggerProps = trigger.props as {\n onClick?: (event: ReactMouseEvent) => void\n ref?: Ref<HTMLElement>\n }\n const originalRef = triggerProps.ref\n\n const clonedTrigger = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node\n if (typeof originalRef === 'function') originalRef(node)\n else if (originalRef) (originalRef as { current: HTMLElement | null }).current = node\n },\n onClick: (event: ReactMouseEvent) => {\n triggerProps.onClick?.(event)\n if (!disabled) setOpen(!isOpen)\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? menuId : undefined,\n })\n\n const handlePanelClick = (event: ReactMouseEvent) => {\n if (!closeOnSelect) return\n const item = (event.target as HTMLElement).closest(FOCUSABLE)\n if (item && item.getAttribute('aria-disabled') !== 'true') {\n close()\n triggerRef.current?.focus()\n }\n }\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n id={menuId}\n className={clsx(styles.panel, minWidth && styles[size], className)}\n data-open={visible ? 'true' : 'false'}\n data-side={pos?.side ?? 'bottom'}\n style={{\n position: 'fixed',\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n maxHeight: pos?.maxHeight,\n minWidth: pos?.minWidth,\n visibility: pos ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={handlePanelClick}\n >\n <List role=\"menu\" size={size} padding=\"xs\">\n {children}\n </List>\n </div>,\n document.body,\n )}\n </>\n )\n}\n"],"names":["VIEWPORT_PADDING","FOCUSABLE","focusableItems","panel","el","Dropdown","trigger","children","placement","size","minWidth","open","defaultOpen","onOpenChange","closeOnSelect","matchTriggerWidth","disabled","offset","className","style","menuId","useId","triggerRef","useRef","panelRef","isControlled","internalOpen","setInternalOpen","useState","isOpen","visible","setVisible","pos","setPos","setOpen","useCallback","next","close","useLockBodyScroll","update","triggerEl","rect","panelW","panelH","vw","vh","pad","spaceBelow","spaceAbove","side","maxHeight","usedH","top","left","useLayoutEffect","useEffect","raf","onReposition","ro","onPointerDown","event","target","_a","_b","onKeyDown","items","current","delta","triggerProps","originalRef","clonedTrigger","cloneElement","node","handlePanelClick","item","jsxs","Fragment","createPortal","jsx","clsx","styles","List"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const A=require("react/jsx-runtime"),o=require("react"),Z=require("react-dom"),$=require("clsx"),ee=require("./List-
|
|
2
|
-
//# sourceMappingURL=Dropdown-
|
|
1
|
+
"use strict";const A=require("react/jsx-runtime"),o=require("react"),Z=require("react-dom"),$=require("clsx"),ee=require("./List-9lUjapQ5.cjs"),te=require("./useLockBodyScroll-CIXHZo-Q.cjs"),ne="_panel_ntp6g_4",re="_sm_ntp6g_21",oe="_md_ntp6g_24",se="_lg_ntp6g_27",B={panel:ne,sm:re,md:oe,lg:se},ie=8,j='[role="menuitem"],[role="button"],a[href],button:not([disabled]),[tabindex]:not([tabindex="-1"])';function C(b){return b?Array.from(b.querySelectorAll(j)).filter(h=>h.getAttribute("aria-disabled")!=="true"&&h.offsetParent!==null):[]}function ce({trigger:b,children:h,placement:L="bottom-start",size:M="md",minWidth:O=!0,open:W,defaultOpen:z=!1,onOpenChange:v,closeOnSelect:N=!0,matchTriggerWidth:H=!1,disabled:T=!1,offset:p=6,className:U,style:V}){const S=o.useId(),u=o.useRef(null),d=o.useRef(null),_=W!==void 0,[G,K]=o.useState(z),s=_?W:G,[J,F]=o.useState(!1),[r,Q]=o.useState(null),D=o.useCallback(n=>{_||K(n),v==null||v(n)},[_,v]),w=o.useCallback(()=>D(!1),[D]);te.useLockBodyScroll(s);const g=o.useCallback(()=>{const n=u.current,t=d.current;if(!n||!t)return;const e=n.getBoundingClientRect(),l=t.offsetWidth,a=t.offsetHeight,i=window.innerWidth,E=window.innerHeight,c=ie,m=E-e.bottom-p-c,k=e.top-p-c;let f=L.startsWith("bottom")?"bottom":"top";f==="bottom"&&a>m&&k>m?f="top":f==="top"&&a>k&&m>k&&(f="bottom");const I=Math.max(0,f==="bottom"?m:k),P=Math.min(a,I);let R=f==="bottom"?e.bottom+p:e.top-p-P;R=Math.min(Math.max(R,c),Math.max(c,E-c-P));let q=L.endsWith("end")?e.right-l:e.left;q=Math.min(Math.max(q,c),Math.max(c,i-c-l)),Q({top:R,left:q,side:f,maxHeight:I,minWidth:H?e.width:void 0})},[L,p,H]);o.useLayoutEffect(()=>{if(!s){F(!1);return}g()},[s,g]),o.useEffect(()=>{if(!s)return;const n=requestAnimationFrame(()=>F(!0)),t=()=>g();window.addEventListener("resize",t),window.addEventListener("scroll",t,!0);let e;return typeof ResizeObserver<"u"&&(e=new ResizeObserver(t),d.current&&e.observe(d.current),u.current&&e.observe(u.current)),()=>{cancelAnimationFrame(n),window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0),e==null||e.disconnect()}},[s,g]),o.useEffect(()=>{if(!s)return;const n=e=>{var a,i;const l=e.target;(a=u.current)!=null&&a.contains(l)||(i=d.current)!=null&&i.contains(l)||w()},t=e=>{var l,a;if(e.key==="Escape")e.preventDefault(),w(),(l=u.current)==null||l.focus();else if(e.key==="Tab")w();else if(e.key==="ArrowDown"||e.key==="ArrowUp"){e.preventDefault();const i=C(d.current);if(!i.length)return;const E=i.indexOf(document.activeElement),c=e.key==="ArrowDown"?1:-1,m=(E+c+i.length)%i.length;(a=i[m])==null||a.focus()}};return document.addEventListener("pointerdown",n,!0),document.addEventListener("keydown",t),()=>{document.removeEventListener("pointerdown",n,!0),document.removeEventListener("keydown",t)}},[s,w]),o.useEffect(()=>{if(!s)return;const n=requestAnimationFrame(()=>{var t;return(t=C(d.current)[0])==null?void 0:t.focus()});return()=>cancelAnimationFrame(n)},[s]);const x=b.props,y=x.ref,X=o.cloneElement(b,{ref:n=>{u.current=n,typeof y=="function"?y(n):y&&(y.current=n)},onClick:n=>{var t;(t=x.onClick)==null||t.call(x,n),T||D(!s)},"aria-haspopup":"menu","aria-expanded":s,"aria-controls":s?S:void 0}),Y=n=>{var e;if(!N)return;const t=n.target.closest(j);t&&t.getAttribute("aria-disabled")!=="true"&&(w(),(e=u.current)==null||e.focus())};return A.jsxs(A.Fragment,{children:[X,s&&Z.createPortal(A.jsx("div",{ref:d,id:S,className:$.clsx(B.panel,O&&B[M],U),"data-open":J?"true":"false","data-side":(r==null?void 0:r.side)??"bottom",style:{position:"fixed",top:(r==null?void 0:r.top)??0,left:(r==null?void 0:r.left)??0,maxHeight:r==null?void 0:r.maxHeight,minWidth:r==null?void 0:r.minWidth,visibility:r?"visible":"hidden",...V},onClick:Y,children:A.jsx(ee.List,{role:"menu",size:M,padding:"xs",children:h})}),document.body)]})}exports.Dropdown=ce;
|
|
2
|
+
//# sourceMappingURL=Dropdown-DNZ9S_zQ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown-Ui7h2TGd.cjs","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport { List, type ListItemSize } from '../List'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport styles from './Dropdown.module.css'\n\nexport type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end'\n\ninterface Position {\n top: number\n left: number\n side: 'top' | 'bottom'\n maxHeight: number\n minWidth?: number\n}\n\nexport interface DropdownProps {\n /** The element that opens the menu (e.g. a `Button` / `IconButton`). Cloned to wire click + a11y. */\n trigger: ReactElement\n /** Menu content — typically `ListItem`s (composed inside a `role=\"menu\"` `List`). */\n children: ReactNode\n /** Preferred placement. Flips to the opposite side automatically when it would overflow. Default `bottom-start`. */\n placement?: DropdownPlacement\n /** Menu size — sets the panel min-width (`sm` 150 · `md` 190 · `lg` 220) and the items' density. Default `md`. */\n size?: ListItemSize\n /**\n * Apply the size-based min-width (`sm` 150 · `md` 190 · `lg` 220px). Defaults to `true`; set `false`\n * to let the menu size to its content instead (the items' density still tracks `size`).\n */\n minWidth?: boolean\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Close the menu when an item inside is clicked. Defaults to `true`. */\n closeOnSelect?: boolean\n /** Make the menu at least as wide as the trigger (select-like). Defaults to `false`. */\n matchTriggerWidth?: boolean\n /** Prevents opening. */\n disabled?: boolean\n /** Gap between the trigger and the menu, in px. Defaults to `6`. */\n offset?: number\n /** Class applied to the floating panel. */\n className?: string\n /** Style applied to the floating panel. */\n style?: CSSProperties\n}\n\n/** Distance the menu is kept from the viewport edges (px). */\nconst VIEWPORT_PADDING = 8\n/** Focusable menu items, used for arrow-key roving. */\nconst FOCUSABLE =\n '[role=\"menuitem\"],[role=\"button\"],a[href],button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nfunction focusableItems(panel: HTMLElement | null): HTMLElement[] {\n if (!panel) return []\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getAttribute('aria-disabled') !== 'true' && el.offsetParent !== null,\n )\n}\n\n/**\n * A floating menu anchored to a `trigger`. Opens on trigger click; closes on outside click, `Escape`,\n * or selecting an item. The panel is portaled to `document.body` and positioned with collision\n * handling — it **flips** to the opposite side when it would overflow, clamps within the viewport, and\n * re-positions on scroll/resize (a too-tall menu caps its height and scrolls). Arrow keys move between\n * items; `Escape` returns focus to the trigger. Compose `ListItem`s as `children`.\n */\nexport function Dropdown({\n trigger,\n children,\n placement = 'bottom-start',\n size = 'md',\n minWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnSelect = true,\n matchTriggerWidth = false,\n disabled = false,\n offset = 6,\n className,\n style,\n}: DropdownProps) {\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const panelRef = useRef<HTMLDivElement | null>(null)\n\n const isControlled = open !== undefined\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = isControlled ? open : internalOpen\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<Position | null>(null)\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next)\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n const close = useCallback(() => setOpen(false), [setOpen])\n\n // lock page scroll while the menu is open (no scrollbar shift)\n useLockBodyScroll(isOpen)\n\n // ── positioning: flip when it would overflow, clamp inside the viewport ──\n const update = useCallback(() => {\n const triggerEl = triggerRef.current\n const panel = panelRef.current\n if (!triggerEl || !panel) return\n\n const rect = triggerEl.getBoundingClientRect()\n const panelW = panel.offsetWidth\n const panelH = panel.offsetHeight\n const vw = window.innerWidth\n const vh = window.innerHeight\n const pad = VIEWPORT_PADDING\n\n const spaceBelow = vh - rect.bottom - offset - pad\n const spaceAbove = rect.top - offset - pad\n let side: 'top' | 'bottom' = placement.startsWith('bottom') ? 'bottom' : 'top'\n // flip only when the preferred side can't fit AND the opposite side has more room\n if (side === 'bottom' && panelH > spaceBelow && spaceAbove > spaceBelow) side = 'top'\n else if (side === 'top' && panelH > spaceAbove && spaceBelow > spaceAbove) side = 'bottom'\n\n const available = side === 'bottom' ? spaceBelow : spaceAbove\n const maxHeight = Math.max(0, available)\n const usedH = Math.min(panelH, maxHeight)\n\n let top = side === 'bottom' ? rect.bottom + offset : rect.top - offset - usedH\n top = Math.min(Math.max(top, pad), Math.max(pad, vh - pad - usedH))\n\n let left = placement.endsWith('end') ? rect.right - panelW : rect.left\n left = Math.min(Math.max(left, pad), Math.max(pad, vw - pad - panelW))\n\n setPos({ top, left, side, maxHeight, minWidth: matchTriggerWidth ? rect.width : undefined })\n }, [placement, offset, matchTriggerWidth])\n\n // position synchronously before paint whenever the menu is open\n useLayoutEffect(() => {\n if (!isOpen) {\n setVisible(false)\n return\n }\n update()\n }, [isOpen, update])\n\n // enter transition + reposition listeners while open\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => setVisible(true))\n\n const onReposition = () => update()\n window.addEventListener('resize', onReposition)\n window.addEventListener('scroll', onReposition, true)\n let ro: ResizeObserver | undefined\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(onReposition)\n if (panelRef.current) ro.observe(panelRef.current)\n if (triggerRef.current) ro.observe(triggerRef.current)\n }\n\n return () => {\n cancelAnimationFrame(raf)\n window.removeEventListener('resize', onReposition)\n window.removeEventListener('scroll', onReposition, true)\n ro?.disconnect()\n }\n }, [isOpen, update])\n\n // outside click + keyboard (Escape, arrow roving)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n close()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n triggerRef.current?.focus()\n } else if (event.key === 'Tab') {\n // Tab would move focus by portal DOM order (end of <body>), orphaning the open menu — close it\n // and let focus continue naturally from the trigger (Select/MultiSelect do the same)\n close()\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n const items = focusableItems(panelRef.current)\n if (!items.length) return\n const current = items.indexOf(document.activeElement as HTMLElement)\n const delta = event.key === 'ArrowDown' ? 1 : -1\n const next = (current + delta + items.length) % items.length\n items[next]?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen, close])\n\n // focus the first item once the menu is open and positioned\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => focusableItems(panelRef.current)[0]?.focus())\n return () => cancelAnimationFrame(raf)\n }, [isOpen])\n\n const triggerProps = trigger.props as {\n onClick?: (event: ReactMouseEvent) => void\n ref?: Ref<HTMLElement>\n }\n const originalRef = triggerProps.ref\n\n const clonedTrigger = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node\n if (typeof originalRef === 'function') originalRef(node)\n else if (originalRef) (originalRef as { current: HTMLElement | null }).current = node\n },\n onClick: (event: ReactMouseEvent) => {\n triggerProps.onClick?.(event)\n if (!disabled) setOpen(!isOpen)\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? menuId : undefined,\n })\n\n const handlePanelClick = (event: ReactMouseEvent) => {\n if (!closeOnSelect) return\n const item = (event.target as HTMLElement).closest(FOCUSABLE)\n if (item && item.getAttribute('aria-disabled') !== 'true') {\n close()\n triggerRef.current?.focus()\n }\n }\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n id={menuId}\n className={clsx(styles.panel, minWidth && styles[size], className)}\n data-open={visible ? 'true' : 'false'}\n data-side={pos?.side ?? 'bottom'}\n style={{\n position: 'fixed',\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n maxHeight: pos?.maxHeight,\n minWidth: pos?.minWidth,\n visibility: pos ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={handlePanelClick}\n >\n <List role=\"menu\" size={size} padding=\"xs\">\n {children}\n </List>\n </div>,\n document.body,\n )}\n </>\n )\n}\n"],"names":["VIEWPORT_PADDING","FOCUSABLE","focusableItems","panel","el","Dropdown","trigger","children","placement","size","minWidth","open","defaultOpen","onOpenChange","closeOnSelect","matchTriggerWidth","disabled","offset","className","style","menuId","useId","triggerRef","useRef","panelRef","isControlled","internalOpen","setInternalOpen","useState","isOpen","visible","setVisible","pos","setPos","setOpen","useCallback","next","close","useLockBodyScroll","update","triggerEl","rect","panelW","panelH","vw","vh","pad","spaceBelow","spaceAbove","side","maxHeight","usedH","top","left","useLayoutEffect","useEffect","raf","onReposition","ro","onPointerDown","event","target","_a","_b","onKeyDown","items","current","delta","triggerProps","originalRef","clonedTrigger","cloneElement","node","handlePanelClick","item","jsxs","Fragment","createPortal","jsx","clsx","styles","List"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown-DNZ9S_zQ.cjs","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport { List, type ListItemSize } from '../List'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport styles from './Dropdown.module.css'\n\nexport type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end'\n\ninterface Position {\n top: number\n left: number\n side: 'top' | 'bottom'\n maxHeight: number\n minWidth?: number\n}\n\nexport interface DropdownProps {\n /** The element that opens the menu (e.g. a `Button` / `IconButton`). Cloned to wire click + a11y. */\n trigger: ReactElement\n /** Menu content — typically `ListItem`s (composed inside a `role=\"menu\"` `List`). */\n children: ReactNode\n /** Preferred placement. Flips to the opposite side automatically when it would overflow. Default `bottom-start`. */\n placement?: DropdownPlacement\n /** Menu size — sets the panel min-width (`sm` 150 · `md` 190 · `lg` 220) and the items' density. Default `md`. */\n size?: ListItemSize\n /**\n * Apply the size-based min-width (`sm` 150 · `md` 190 · `lg` 220px). Defaults to `true`; set `false`\n * to let the menu size to its content instead (the items' density still tracks `size`).\n */\n minWidth?: boolean\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Close the menu when an item inside is clicked. Defaults to `true`. */\n closeOnSelect?: boolean\n /** Make the menu at least as wide as the trigger (select-like). Defaults to `false`. */\n matchTriggerWidth?: boolean\n /** Prevents opening. */\n disabled?: boolean\n /** Gap between the trigger and the menu, in px. Defaults to `6`. */\n offset?: number\n /** Class applied to the floating panel. */\n className?: string\n /** Style applied to the floating panel. */\n style?: CSSProperties\n}\n\n/** Distance the menu is kept from the viewport edges (px). */\nconst VIEWPORT_PADDING = 8\n/** Focusable menu items, used for arrow-key roving. */\nconst FOCUSABLE =\n '[role=\"menuitem\"],[role=\"button\"],a[href],button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nfunction focusableItems(panel: HTMLElement | null): HTMLElement[] {\n if (!panel) return []\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getAttribute('aria-disabled') !== 'true' && el.offsetParent !== null,\n )\n}\n\n/**\n * A floating menu anchored to a `trigger`. Opens on trigger click; closes on outside click, `Escape`,\n * or selecting an item. The panel is portaled to `document.body` and positioned with collision\n * handling — it **flips** to the opposite side when it would overflow, clamps within the viewport, and\n * re-positions on scroll/resize (a too-tall menu caps its height and scrolls). Arrow keys move between\n * items; `Escape` returns focus to the trigger. Compose `ListItem`s as `children`.\n */\nexport function Dropdown({\n trigger,\n children,\n placement = 'bottom-start',\n size = 'md',\n minWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnSelect = true,\n matchTriggerWidth = false,\n disabled = false,\n offset = 6,\n className,\n style,\n}: DropdownProps) {\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const panelRef = useRef<HTMLDivElement | null>(null)\n\n const isControlled = open !== undefined\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = isControlled ? open : internalOpen\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<Position | null>(null)\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next)\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n const close = useCallback(() => setOpen(false), [setOpen])\n\n // lock page scroll while the menu is open (no scrollbar shift)\n useLockBodyScroll(isOpen)\n\n // ── positioning: flip when it would overflow, clamp inside the viewport ──\n const update = useCallback(() => {\n const triggerEl = triggerRef.current\n const panel = panelRef.current\n if (!triggerEl || !panel) return\n\n const rect = triggerEl.getBoundingClientRect()\n const panelW = panel.offsetWidth\n const panelH = panel.offsetHeight\n const vw = window.innerWidth\n const vh = window.innerHeight\n const pad = VIEWPORT_PADDING\n\n const spaceBelow = vh - rect.bottom - offset - pad\n const spaceAbove = rect.top - offset - pad\n let side: 'top' | 'bottom' = placement.startsWith('bottom') ? 'bottom' : 'top'\n // flip only when the preferred side can't fit AND the opposite side has more room\n if (side === 'bottom' && panelH > spaceBelow && spaceAbove > spaceBelow) side = 'top'\n else if (side === 'top' && panelH > spaceAbove && spaceBelow > spaceAbove) side = 'bottom'\n\n const available = side === 'bottom' ? spaceBelow : spaceAbove\n const maxHeight = Math.max(0, available)\n const usedH = Math.min(panelH, maxHeight)\n\n let top = side === 'bottom' ? rect.bottom + offset : rect.top - offset - usedH\n top = Math.min(Math.max(top, pad), Math.max(pad, vh - pad - usedH))\n\n let left = placement.endsWith('end') ? rect.right - panelW : rect.left\n left = Math.min(Math.max(left, pad), Math.max(pad, vw - pad - panelW))\n\n setPos({ top, left, side, maxHeight, minWidth: matchTriggerWidth ? rect.width : undefined })\n }, [placement, offset, matchTriggerWidth])\n\n // position synchronously before paint whenever the menu is open\n useLayoutEffect(() => {\n if (!isOpen) {\n setVisible(false)\n return\n }\n update()\n }, [isOpen, update])\n\n // enter transition + reposition listeners while open\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => setVisible(true))\n\n const onReposition = () => update()\n window.addEventListener('resize', onReposition)\n window.addEventListener('scroll', onReposition, true)\n let ro: ResizeObserver | undefined\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(onReposition)\n if (panelRef.current) ro.observe(panelRef.current)\n if (triggerRef.current) ro.observe(triggerRef.current)\n }\n\n return () => {\n cancelAnimationFrame(raf)\n window.removeEventListener('resize', onReposition)\n window.removeEventListener('scroll', onReposition, true)\n ro?.disconnect()\n }\n }, [isOpen, update])\n\n // outside click + keyboard (Escape, arrow roving)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n close()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n triggerRef.current?.focus()\n } else if (event.key === 'Tab') {\n // Tab would move focus by portal DOM order (end of <body>), orphaning the open menu — close it\n // and let focus continue naturally from the trigger (Select/MultiSelect do the same)\n close()\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n const items = focusableItems(panelRef.current)\n if (!items.length) return\n const current = items.indexOf(document.activeElement as HTMLElement)\n const delta = event.key === 'ArrowDown' ? 1 : -1\n const next = (current + delta + items.length) % items.length\n items[next]?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen, close])\n\n // focus the first item once the menu is open and positioned\n useEffect(() => {\n if (!isOpen) return\n const raf = requestAnimationFrame(() => focusableItems(panelRef.current)[0]?.focus())\n return () => cancelAnimationFrame(raf)\n }, [isOpen])\n\n const triggerProps = trigger.props as {\n onClick?: (event: ReactMouseEvent) => void\n ref?: Ref<HTMLElement>\n }\n const originalRef = triggerProps.ref\n\n const clonedTrigger = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node\n if (typeof originalRef === 'function') originalRef(node)\n else if (originalRef) (originalRef as { current: HTMLElement | null }).current = node\n },\n onClick: (event: ReactMouseEvent) => {\n triggerProps.onClick?.(event)\n if (!disabled) setOpen(!isOpen)\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? menuId : undefined,\n })\n\n const handlePanelClick = (event: ReactMouseEvent) => {\n if (!closeOnSelect) return\n const item = (event.target as HTMLElement).closest(FOCUSABLE)\n if (item && item.getAttribute('aria-disabled') !== 'true') {\n close()\n triggerRef.current?.focus()\n }\n }\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n id={menuId}\n className={clsx(styles.panel, minWidth && styles[size], className)}\n data-open={visible ? 'true' : 'false'}\n data-side={pos?.side ?? 'bottom'}\n style={{\n position: 'fixed',\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n maxHeight: pos?.maxHeight,\n minWidth: pos?.minWidth,\n visibility: pos ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={handlePanelClick}\n >\n <List role=\"menu\" size={size} padding=\"xs\">\n {children}\n </List>\n </div>,\n document.body,\n )}\n </>\n )\n}\n"],"names":["VIEWPORT_PADDING","FOCUSABLE","focusableItems","panel","el","Dropdown","trigger","children","placement","size","minWidth","open","defaultOpen","onOpenChange","closeOnSelect","matchTriggerWidth","disabled","offset","className","style","menuId","useId","triggerRef","useRef","panelRef","isControlled","internalOpen","setInternalOpen","useState","isOpen","visible","setVisible","pos","setPos","setOpen","useCallback","next","close","useLockBodyScroll","update","triggerEl","rect","panelW","panelH","vw","vh","pad","spaceBelow","spaceAbove","side","maxHeight","usedH","top","left","useLayoutEffect","useEffect","raf","onReposition","ro","onPointerDown","event","target","_a","_b","onKeyDown","items","current","delta","triggerProps","originalRef","clonedTrigger","cloneElement","node","handlePanelClick","item","jsxs","Fragment","createPortal","jsx","clsx","styles","List"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as n, jsxs as u } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as S } from "react";
|
|
3
|
+
import { clsx as N } from "clsx";
|
|
4
|
+
import { I as c } from "./Icon-DaTvzLBu.js";
|
|
5
|
+
import { a as h } from "./names-r21QPjcU.js";
|
|
6
|
+
import { a as g } from "./ConfigProvider-B_RSn9bb.js";
|
|
7
|
+
const E = "_emptyState_1vpxy_3", I = "_sm_1vpxy_17", b = "_md_1vpxy_23", O = "_lg_1vpxy_29", T = "_icon_1vpxy_37", j = "_title_1vpxy_55", w = "_description_1vpxy_61", z = "_action_1vpxy_70", A = "_pattern_1vpxy_77", C = "_tinted_1vpxy_100", t = {
|
|
8
|
+
emptyState: E,
|
|
9
|
+
sm: I,
|
|
10
|
+
md: b,
|
|
11
|
+
lg: O,
|
|
12
|
+
icon: T,
|
|
13
|
+
title: j,
|
|
14
|
+
description: w,
|
|
15
|
+
action: z,
|
|
16
|
+
pattern: A,
|
|
17
|
+
tinted: C
|
|
18
|
+
}, M = new Set(h), G = S(function({
|
|
19
|
+
icon: e,
|
|
20
|
+
title: m,
|
|
21
|
+
description: o,
|
|
22
|
+
action: r,
|
|
23
|
+
size: p = "md",
|
|
24
|
+
pattern: _ = !0,
|
|
25
|
+
color: s,
|
|
26
|
+
className: d,
|
|
27
|
+
style: a,
|
|
28
|
+
children: y,
|
|
29
|
+
...v
|
|
30
|
+
}, x) {
|
|
31
|
+
const f = g(), i = m ?? f("emptyState.title"), l = e === !1 ? null : e == null ? /* @__PURE__ */ n(c, { name: "FolderOpen" }) : typeof e == "string" && M.has(e) ? /* @__PURE__ */ n(c, { name: e }) : e;
|
|
32
|
+
return /* @__PURE__ */ u(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
ref: x,
|
|
36
|
+
className: N(
|
|
37
|
+
t.emptyState,
|
|
38
|
+
t[p],
|
|
39
|
+
_ && t.pattern,
|
|
40
|
+
s && t.tinted,
|
|
41
|
+
d
|
|
42
|
+
),
|
|
43
|
+
style: s ? { "--tz-btn-rgb": `var(--tz-color-${s}-rgb)`, ...a } : a,
|
|
44
|
+
...v,
|
|
45
|
+
children: [
|
|
46
|
+
l != null && /* @__PURE__ */ n("div", { className: t.icon, "aria-hidden": !0, children: l }),
|
|
47
|
+
i != null && /* @__PURE__ */ n("div", { className: t.title, children: i }),
|
|
48
|
+
o != null && /* @__PURE__ */ n("div", { className: t.description, children: o }),
|
|
49
|
+
r != null && /* @__PURE__ */ n("div", { className: t.action, children: r }),
|
|
50
|
+
y
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
export {
|
|
56
|
+
G as E
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=EmptyState-BtwuzX9Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState-BtwuzX9Z.js","sources":["../src/components/EmptyState/EmptyState.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport styles from './EmptyState.module.css'\n\nexport type EmptyStateSize = 'sm' | 'md' | 'lg'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** Leading glyph shown in a soft circle — an `IconName`, any node, or `false` to hide it. Defaults to `FolderOpen`. */\n icon?: IconName | ReactNode | false\n /** Heading line. Defaults to `\"No Results Found\"`. */\n title?: ReactNode\n /** Muted description under the title (e.g. a hint on what to do next). */\n description?: ReactNode\n /** Action slot under the text — e.g. an \"Add Item\" or \"Clear Filters\" button. */\n action?: ReactNode\n /** Size — scales the icon, text, and vertical padding. Defaults to `md`. */\n size?: EmptyStateSize\n /**\n * Polished \"hero\" look: a faded grid backdrop (fades out toward the edges) + an elevated icon\n * (gradient + drop shadow). Defaults to `true`; pass `pattern={false}` for the flat, compact placeholder.\n */\n pattern?: boolean\n /** Tint the icon puck with a theme color (e.g. `error` for a failure). Omitted → the neutral muted puck. */\n color?: ThemeColor\n /** Extra content rendered below the action. */\n children?: ReactNode\n}\n\n/**\n * The empty-state placeholder — drop it in wherever a page, table, list, or gallery has nothing to\n * show (no records yet, no search matches). A centered, muted glyph in a soft circle + a `title` +\n * an optional `description` and `action` (e.g. a \"Add Item\" / \"Clear Filters\" button). Neutral by\n * design; pass a custom `icon` node for a tinted glyph. Token-only styling.\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n {\n icon,\n title,\n description,\n action,\n size = 'md',\n pattern = true,\n color,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const resolvedTitle = title ?? t('emptyState.title')\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name=\"FolderOpen\" />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.emptyState,\n styles[size],\n pattern && styles.pattern,\n color && styles.tinted,\n className,\n )}\n style={\n (color\n ? { '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style }\n : style) as CSSProperties\n }\n {...props}\n >\n {renderedIcon != null && (\n <div className={styles.icon} aria-hidden>\n {renderedIcon}\n </div>\n )}\n {resolvedTitle != null && <div className={styles.title}>{resolvedTitle}</div>}\n {description != null && <div className={styles.description}>{description}</div>}\n {action != null && <div className={styles.action}>{action}</div>}\n {children}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","EmptyState","forwardRef","icon","title","description","action","size","pattern","color","className","style","children","props","ref","t","useT","resolvedTitle","renderedIcon","jsx","Icon","jsxs","clsx","styles"],"mappings":";;;;;;;;;;;;;;;;;GASMA,IAAgB,IAAI,IAAYC,CAAU,GA8BnCC,IAAaC,EAA4C,SACpE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJC,IAAgBb,KAASW,EAAE,kBAAkB,GAC7CG,IACJf,MAAS,KAAQ,OAAOA,KAAQ,OAC9B,gBAAAgB,EAACC,GAAA,EAAK,MAAK,aAAA,CAAa,IACtB,OAAOjB,KAAS,YAAYJ,EAAc,IAAII,CAAI,IACpD,gBAAAgB,EAACC,GAAA,EAAK,MAAMjB,EAAA,CAAkB,IAE9BA;AAGJ,SACE,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAP;AAAA,MACA,WAAWQ;AAAA,QACTC,EAAO;AAAA,QACPA,EAAOhB,CAAI;AAAA,QACXC,KAAWe,EAAO;AAAA,QAClBd,KAASc,EAAO;AAAA,QAChBb;AAAA,MAAA;AAAA,MAEF,OACGD,IACG,EAAE,gBAAgB,kBAAkBA,CAAK,SAAS,GAAGE,EAAA,IACrDA;AAAA,MAEL,GAAGE;AAAA,MAEH,UAAA;AAAA,QAAAK,KAAgB,0BACd,OAAA,EAAI,WAAWK,EAAO,MAAM,eAAW,IACrC,UAAAL,EAAA,CACH;AAAA,QAEDD,KAAiB,QAAQ,gBAAAE,EAAC,SAAI,WAAWI,EAAO,OAAQ,UAAAN,GAAc;AAAA,QACtEZ,KAAe,QAAQ,gBAAAc,EAAC,SAAI,WAAWI,EAAO,aAAc,UAAAlB,GAAY;AAAA,QACxEC,KAAU,QAAQ,gBAAAa,EAAC,SAAI,WAAWI,EAAO,QAAS,UAAAjB,GAAO;AAAA,QACzDM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),S=require("react"),N=require("clsx"),a=require("./Icon-BVULqOJD.cjs"),j=require("./names-BJnFU_5m.cjs"),g=require("./ConfigProvider-BElY0HuV.cjs"),h="_emptyState_1vpxy_3",f="_sm_1vpxy_17",q="_md_1vpxy_23",E="_lg_1vpxy_29",I="_icon_1vpxy_37",b="_title_1vpxy_55",C="_description_1vpxy_61",O="_action_1vpxy_70",T="_pattern_1vpxy_77",w="_tinted_1vpxy_100",t={emptyState:h,sm:f,md:q,lg:E,icon:I,title:b,description:C,action:O,pattern:T,tinted:w},z=new Set(j.ICON_NAMES),A=S.forwardRef(function({icon:n,title:_,description:c,action:i,size:d="md",pattern:p=!0,color:s,className:m,style:r,children:x,...y},u){const v=g.useT(),l=_??v("emptyState.title"),o=n===!1?null:n==null?e.jsx(a.Icon,{name:"FolderOpen"}):typeof n=="string"&&z.has(n)?e.jsx(a.Icon,{name:n}):n;return e.jsxs("div",{ref:u,className:N.clsx(t.emptyState,t[d],p&&t.pattern,s&&t.tinted,m),style:s?{"--tz-btn-rgb":`var(--tz-color-${s}-rgb)`,...r}:r,...y,children:[o!=null&&e.jsx("div",{className:t.icon,"aria-hidden":!0,children:o}),l!=null&&e.jsx("div",{className:t.title,children:l}),c!=null&&e.jsx("div",{className:t.description,children:c}),i!=null&&e.jsx("div",{className:t.action,children:i}),x]})});exports.EmptyState=A;
|
|
2
|
+
//# sourceMappingURL=EmptyState-CO_NRZ6w.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState-CO_NRZ6w.cjs","sources":["../src/components/EmptyState/EmptyState.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport styles from './EmptyState.module.css'\n\nexport type EmptyStateSize = 'sm' | 'md' | 'lg'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** Leading glyph shown in a soft circle — an `IconName`, any node, or `false` to hide it. Defaults to `FolderOpen`. */\n icon?: IconName | ReactNode | false\n /** Heading line. Defaults to `\"No Results Found\"`. */\n title?: ReactNode\n /** Muted description under the title (e.g. a hint on what to do next). */\n description?: ReactNode\n /** Action slot under the text — e.g. an \"Add Item\" or \"Clear Filters\" button. */\n action?: ReactNode\n /** Size — scales the icon, text, and vertical padding. Defaults to `md`. */\n size?: EmptyStateSize\n /**\n * Polished \"hero\" look: a faded grid backdrop (fades out toward the edges) + an elevated icon\n * (gradient + drop shadow). Defaults to `true`; pass `pattern={false}` for the flat, compact placeholder.\n */\n pattern?: boolean\n /** Tint the icon puck with a theme color (e.g. `error` for a failure). Omitted → the neutral muted puck. */\n color?: ThemeColor\n /** Extra content rendered below the action. */\n children?: ReactNode\n}\n\n/**\n * The empty-state placeholder — drop it in wherever a page, table, list, or gallery has nothing to\n * show (no records yet, no search matches). A centered, muted glyph in a soft circle + a `title` +\n * an optional `description` and `action` (e.g. a \"Add Item\" / \"Clear Filters\" button). Neutral by\n * design; pass a custom `icon` node for a tinted glyph. Token-only styling.\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n {\n icon,\n title,\n description,\n action,\n size = 'md',\n pattern = true,\n color,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const resolvedTitle = title ?? t('emptyState.title')\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name=\"FolderOpen\" />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.emptyState,\n styles[size],\n pattern && styles.pattern,\n color && styles.tinted,\n className,\n )}\n style={\n (color\n ? { '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style }\n : style) as CSSProperties\n }\n {...props}\n >\n {renderedIcon != null && (\n <div className={styles.icon} aria-hidden>\n {renderedIcon}\n </div>\n )}\n {resolvedTitle != null && <div className={styles.title}>{resolvedTitle}</div>}\n {description != null && <div className={styles.description}>{description}</div>}\n {action != null && <div className={styles.action}>{action}</div>}\n {children}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","EmptyState","forwardRef","icon","title","description","action","size","pattern","color","className","style","children","props","ref","t","useT","resolvedTitle","renderedIcon","jsx","Icon","jsxs","clsx","styles"],"mappings":"2eASMA,EAAgB,IAAI,IAAYC,YAAU,EA8BnCC,EAAaC,EAAAA,WAA4C,SACpE,CACE,KAAAC,EACA,MAAAC,EACA,YAAAC,EACA,OAAAC,EACA,KAAAC,EAAO,KACP,QAAAC,EAAU,GACV,MAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EAAgBb,GAASW,EAAE,kBAAkB,EAC7CG,EACJf,IAAS,GAAQ,KAAOA,GAAQ,KAC9BgB,MAACC,EAAAA,KAAA,CAAK,KAAK,YAAA,CAAa,EACtB,OAAOjB,GAAS,UAAYJ,EAAc,IAAII,CAAI,EACpDgB,MAACC,EAAAA,KAAA,CAAK,KAAMjB,CAAA,CAAkB,EAE9BA,EAGJ,OACEkB,EAAAA,KAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAAA,KACTC,EAAO,WACPA,EAAOhB,CAAI,EACXC,GAAWe,EAAO,QAClBd,GAASc,EAAO,OAChBb,CAAA,EAEF,MACGD,EACG,CAAE,eAAgB,kBAAkBA,CAAK,QAAS,GAAGE,CAAA,EACrDA,EAEL,GAAGE,EAEH,SAAA,CAAAK,GAAgB,YACd,MAAA,CAAI,UAAWK,EAAO,KAAM,cAAW,GACrC,SAAAL,CAAA,CACH,EAEDD,GAAiB,MAAQE,EAAAA,IAAC,OAAI,UAAWI,EAAO,MAAQ,SAAAN,EAAc,EACtEZ,GAAe,MAAQc,EAAAA,IAAC,OAAI,UAAWI,EAAO,YAAc,SAAAlB,EAAY,EACxEC,GAAU,MAAQa,EAAAA,IAAC,OAAI,UAAWI,EAAO,OAAS,SAAAjB,EAAO,EACzDM,CAAA,CAAA,CAAA,CAGP,CAAC"}
|