@womp/kookie-ui 0.23.0 → 0.24.0
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/components.css +190 -185
- package/dist/cjs/components/_internal/base-button.d.ts +11 -1
- package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
- package/dist/cjs/components/_internal/base-button.js +1 -1
- package/dist/cjs/components/_internal/base-button.js.map +4 -4
- package/dist/cjs/components/_internal/menu-context.d.ts +2 -0
- package/dist/cjs/components/_internal/menu-context.d.ts.map +1 -1
- package/dist/cjs/components/_internal/menu-context.js +1 -1
- package/dist/cjs/components/_internal/menu-context.js.map +3 -3
- package/dist/cjs/components/_internal/pane-chrome.d.ts +17 -2
- package/dist/cjs/components/_internal/pane-chrome.d.ts.map +1 -1
- package/dist/cjs/components/_internal/pane-chrome.js +1 -1
- package/dist/cjs/components/_internal/pane-chrome.js.map +4 -4
- package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js.map +4 -4
- package/dist/cjs/components/accordion.d.ts +2 -2
- package/dist/cjs/components/accordion.d.ts.map +1 -1
- package/dist/cjs/components/accordion.js +1 -1
- package/dist/cjs/components/accordion.js.map +4 -4
- package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
- package/dist/cjs/components/alert-dialog.js +1 -1
- package/dist/cjs/components/alert-dialog.js.map +3 -3
- package/dist/cjs/components/avatar.d.ts +1 -1
- package/dist/cjs/components/avatar.d.ts.map +1 -1
- package/dist/cjs/components/avatar.js +1 -1
- package/dist/cjs/components/avatar.js.map +3 -3
- package/dist/cjs/components/avatar.props.d.ts +8 -0
- package/dist/cjs/components/avatar.props.d.ts.map +1 -1
- package/dist/cjs/components/avatar.props.js +1 -1
- package/dist/cjs/components/avatar.props.js.map +2 -2
- package/dist/cjs/components/blockquote.d.ts +1 -1
- package/dist/cjs/components/blockquote.d.ts.map +1 -1
- package/dist/cjs/components/blockquote.js +1 -1
- package/dist/cjs/components/blockquote.js.map +4 -4
- package/dist/cjs/components/button.js +1 -1
- package/dist/cjs/components/button.js.map +4 -4
- package/dist/cjs/components/chatbar.d.ts.map +1 -1
- package/dist/cjs/components/chatbar.js +1 -1
- package/dist/cjs/components/chatbar.js.map +4 -4
- package/dist/cjs/components/checkbox-group.d.ts.map +1 -1
- package/dist/cjs/components/checkbox-group.js +1 -1
- package/dist/cjs/components/checkbox-group.js.map +3 -3
- package/dist/cjs/components/checkbox-group.primitive.d.ts +12 -5
- package/dist/cjs/components/checkbox-group.primitive.d.ts.map +1 -1
- package/dist/cjs/components/checkbox-group.primitive.js +1 -1
- package/dist/cjs/components/checkbox-group.primitive.js.map +3 -3
- package/dist/cjs/components/checkbox.js +1 -1
- package/dist/cjs/components/checkbox.js.map +3 -3
- package/dist/cjs/components/chip.d.ts.map +1 -1
- package/dist/cjs/components/chip.js +1 -1
- package/dist/cjs/components/chip.js.map +3 -3
- package/dist/cjs/components/code.d.ts.map +1 -1
- package/dist/cjs/components/code.js +1 -1
- package/dist/cjs/components/code.js.map +2 -2
- package/dist/cjs/components/combobox.js +1 -1
- package/dist/cjs/components/combobox.js.map +3 -3
- package/dist/cjs/components/context-menu.d.ts.map +1 -1
- package/dist/cjs/components/context-menu.js +1 -1
- package/dist/cjs/components/context-menu.js.map +4 -4
- package/dist/cjs/components/dialog.d.ts +1 -1
- package/dist/cjs/components/dialog.d.ts.map +1 -1
- package/dist/cjs/components/dialog.js +1 -1
- package/dist/cjs/components/dialog.js.map +3 -3
- package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
- package/dist/cjs/components/dropdown-menu.js +1 -1
- package/dist/cjs/components/dropdown-menu.js.map +4 -4
- package/dist/cjs/components/icons.d.ts +3 -1
- package/dist/cjs/components/icons.d.ts.map +1 -1
- package/dist/cjs/components/icons.js +1 -1
- package/dist/cjs/components/icons.js.map +3 -3
- package/dist/cjs/components/index.d.ts +1 -1
- package/dist/cjs/components/index.d.ts.map +1 -1
- package/dist/cjs/components/index.js +2 -10
- package/dist/cjs/components/index.js.map +4 -4
- package/dist/cjs/components/message-scroller.d.ts.map +1 -1
- package/dist/cjs/components/message-scroller.js +1 -1
- package/dist/cjs/components/message-scroller.js.map +4 -4
- package/dist/cjs/components/navbar.d.ts.map +1 -1
- package/dist/cjs/components/navbar.js +1 -1
- package/dist/cjs/components/navbar.js.map +3 -3
- package/dist/cjs/components/notice.d.ts +4 -1
- package/dist/cjs/components/notice.d.ts.map +1 -1
- package/dist/cjs/components/notice.js +1 -1
- package/dist/cjs/components/notice.js.map +4 -4
- package/dist/cjs/components/progress.d.ts.map +1 -1
- package/dist/cjs/components/progress.js +1 -1
- package/dist/cjs/components/progress.js.map +3 -3
- package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
- package/dist/cjs/components/schemas/toggle.schema.d.ts +1 -1
- package/dist/cjs/components/scroll-area.d.ts +3 -1
- package/dist/cjs/components/scroll-area.d.ts.map +1 -1
- package/dist/cjs/components/scroll-area.js +1 -1
- package/dist/cjs/components/scroll-area.js.map +4 -4
- package/dist/cjs/components/segmented-control.d.ts +3 -1
- package/dist/cjs/components/segmented-control.d.ts.map +1 -1
- package/dist/cjs/components/segmented-control.js +1 -1
- package/dist/cjs/components/segmented-control.js.map +3 -3
- package/dist/cjs/components/select.d.ts.map +1 -1
- package/dist/cjs/components/select.js +1 -1
- package/dist/cjs/components/select.js.map +3 -3
- package/dist/cjs/components/separator.d.ts.map +1 -1
- package/dist/cjs/components/separator.js +1 -1
- package/dist/cjs/components/separator.js.map +3 -3
- package/dist/cjs/components/sheet.d.ts +1 -0
- package/dist/cjs/components/sheet.d.ts.map +1 -1
- package/dist/cjs/components/sheet.js +1 -1
- package/dist/cjs/components/sheet.js.map +3 -3
- package/dist/cjs/components/shell.d.ts +12 -1
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +4 -4
- package/dist/cjs/components/sidebar.d.ts.map +1 -1
- package/dist/cjs/components/sidebar.js +1 -1
- package/dist/cjs/components/sidebar.js.map +4 -4
- package/dist/cjs/components/slider.d.ts.map +1 -1
- package/dist/cjs/components/slider.js +1 -1
- package/dist/cjs/components/slider.js.map +3 -3
- package/dist/cjs/components/spinner.d.ts.map +1 -1
- package/dist/cjs/components/spinner.js +1 -1
- package/dist/cjs/components/spinner.js.map +3 -3
- package/dist/cjs/components/table.d.ts.map +1 -1
- package/dist/cjs/components/table.js +1 -1
- package/dist/cjs/components/table.js.map +4 -4
- package/dist/cjs/components/tabs.d.ts.map +1 -1
- package/dist/cjs/components/tabs.js +1 -1
- package/dist/cjs/components/tabs.js.map +2 -2
- package/dist/cjs/components/text-area.js +1 -1
- package/dist/cjs/components/text-area.js.map +2 -2
- package/dist/cjs/components/text-field.js +2 -2
- package/dist/cjs/components/text-field.js.map +2 -2
- package/dist/cjs/components/toggle.d.ts +3 -2
- package/dist/cjs/components/toggle.d.ts.map +1 -1
- package/dist/cjs/components/toggle.js +1 -9
- package/dist/cjs/components/toggle.js.map +4 -4
- package/dist/cjs/components/toolbar.d.ts +80 -8
- package/dist/cjs/components/toolbar.d.ts.map +1 -1
- package/dist/cjs/components/toolbar.js +1 -1
- package/dist/cjs/components/toolbar.js.map +4 -4
- package/dist/cjs/components/virtual-menu.d.ts +3 -5
- package/dist/cjs/components/virtual-menu.d.ts.map +1 -1
- package/dist/cjs/components/virtual-menu.js +1 -1
- package/dist/cjs/components/virtual-menu.js.map +3 -3
- package/dist/cjs/helpers/extract-margin-props.d.ts +7 -7
- package/dist/cjs/hooks/use-scroll-edges.d.ts +4 -2
- package/dist/cjs/hooks/use-scroll-edges.d.ts.map +1 -1
- package/dist/cjs/hooks/use-scroll-edges.js +1 -1
- package/dist/cjs/hooks/use-scroll-edges.js.map +3 -3
- package/dist/cjs/index.js +5 -5
- package/dist/cjs/index.js.map +4 -4
- package/dist/cjs/props/index.js +1 -1
- package/dist/cjs/props/index.js.map +2 -2
- package/dist/esm/chunk-3VTS4C63.js +2 -0
- package/dist/esm/chunk-3VTS4C63.js.map +7 -0
- package/dist/esm/chunk-3WE4E2WQ.js +2 -0
- package/dist/esm/chunk-3WE4E2WQ.js.map +7 -0
- package/dist/esm/chunk-3XUY5WFA.js +2 -0
- package/dist/esm/chunk-3XUY5WFA.js.map +7 -0
- package/dist/esm/chunk-3XZOE2IQ.js +2 -0
- package/dist/esm/chunk-3XZOE2IQ.js.map +7 -0
- package/dist/esm/chunk-432YLNB3.js +2 -0
- package/dist/esm/chunk-432YLNB3.js.map +7 -0
- package/dist/esm/chunk-4QKZYCCH.js +2 -0
- package/dist/esm/chunk-4QKZYCCH.js.map +7 -0
- package/dist/esm/chunk-4R5EMVB3.js +2 -0
- package/dist/esm/chunk-4R5EMVB3.js.map +7 -0
- package/dist/esm/chunk-4ZOVV3TY.js +2 -0
- package/dist/esm/chunk-4ZOVV3TY.js.map +7 -0
- package/dist/esm/{chunk-IX5HIHVI.js → chunk-62ZGP4ET.js} +2 -2
- package/dist/esm/{chunk-IX5HIHVI.js.map → chunk-62ZGP4ET.js.map} +3 -3
- package/dist/esm/chunk-BGAJ2MDF.js +2 -0
- package/dist/esm/chunk-BGAJ2MDF.js.map +7 -0
- package/dist/esm/chunk-CHPT42BY.js +2 -0
- package/dist/esm/{chunk-Y3JYEEFB.js.map → chunk-CHPT42BY.js.map} +2 -2
- package/dist/esm/{chunk-KS4U4VPH.js → chunk-CMHUK7OG.js} +2 -2
- package/dist/esm/{chunk-KS4U4VPH.js.map → chunk-CMHUK7OG.js.map} +2 -2
- package/dist/esm/chunk-CN6F4REJ.js +2 -0
- package/dist/esm/chunk-CN6F4REJ.js.map +7 -0
- package/dist/esm/chunk-DUTZUWZP.js +2 -0
- package/dist/esm/chunk-DUTZUWZP.js.map +7 -0
- package/dist/esm/chunk-FDJV5RXX.js +2 -0
- package/dist/esm/chunk-FDJV5RXX.js.map +7 -0
- package/dist/esm/chunk-G2JD52O5.js +2 -0
- package/dist/esm/{chunk-23KT3D2Z.js.map → chunk-G2JD52O5.js.map} +3 -3
- package/dist/esm/{chunk-6DDOR73D.js → chunk-G4ETY2NP.js} +2 -2
- package/dist/esm/chunk-GPOCLDBR.js +2 -0
- package/dist/esm/chunk-GPOCLDBR.js.map +7 -0
- package/dist/esm/chunk-GYP66ZK2.js +2 -0
- package/dist/esm/chunk-GYP66ZK2.js.map +7 -0
- package/dist/esm/chunk-H5BYPX6V.js +2 -0
- package/dist/esm/chunk-H5BYPX6V.js.map +7 -0
- package/dist/esm/chunk-H5G7UECV.js +2 -0
- package/dist/esm/chunk-H5G7UECV.js.map +7 -0
- package/dist/esm/chunk-I4FLQELQ.js +2 -0
- package/dist/esm/chunk-I4FLQELQ.js.map +7 -0
- package/dist/esm/chunk-JYQGCXXI.js +2 -0
- package/dist/esm/chunk-JYQGCXXI.js.map +7 -0
- package/dist/esm/chunk-KA5UE2VN.js +2 -0
- package/dist/esm/chunk-KA5UE2VN.js.map +7 -0
- package/dist/esm/{chunk-QGCXTULQ.js → chunk-KEGCX5VM.js} +2 -2
- package/dist/esm/chunk-KVHKPUZ2.js +2 -0
- package/dist/esm/chunk-KVHKPUZ2.js.map +7 -0
- package/dist/esm/{chunk-FFG32ERA.js → chunk-N3WBEQWL.js} +3 -3
- package/dist/esm/chunk-N3WBEQWL.js.map +7 -0
- package/dist/esm/{chunk-HKPXDQ2B.js → chunk-NC3CJUE3.js} +2 -2
- package/dist/esm/chunk-P2MV6HLA.js +2 -0
- package/dist/esm/{chunk-7SS4UUJH.js.map → chunk-P2MV6HLA.js.map} +3 -3
- package/dist/esm/chunk-PALE5UWK.js +2 -0
- package/dist/esm/{chunk-DSPYHO3L.js.map → chunk-PALE5UWK.js.map} +2 -2
- package/dist/esm/chunk-PDMCLVYT.js +2 -0
- package/dist/esm/chunk-PDMCLVYT.js.map +7 -0
- package/dist/esm/chunk-PM6QY3JO.js +2 -0
- package/dist/esm/{chunk-ZEX2DECM.js.map → chunk-PM6QY3JO.js.map} +3 -3
- package/dist/esm/chunk-RKZVXVBN.js +2 -0
- package/dist/esm/chunk-RKZVXVBN.js.map +7 -0
- package/dist/esm/chunk-TXQZ5HLV.js +2 -0
- package/dist/esm/chunk-TXQZ5HLV.js.map +7 -0
- package/dist/esm/chunk-UKASIY6M.js +2 -0
- package/dist/esm/chunk-UKASIY6M.js.map +7 -0
- package/dist/esm/{chunk-OJQNLROL.js → chunk-UY6WJUNA.js} +2 -2
- package/dist/esm/chunk-V5O3TF57.js +2 -0
- package/dist/esm/{chunk-3KQE2PSJ.js.map → chunk-V5O3TF57.js.map} +3 -3
- package/dist/esm/chunk-VUNCI6A6.js +2 -0
- package/dist/esm/chunk-VUNCI6A6.js.map +7 -0
- package/dist/esm/{chunk-JBHRV364.js → chunk-VUPIJNG2.js} +2 -2
- package/dist/esm/chunk-W6BN5QLH.js +2 -0
- package/dist/esm/{chunk-ZNDCZM5A.js.map → chunk-W6BN5QLH.js.map} +2 -2
- package/dist/esm/chunk-WG5ORTIW.js +2 -0
- package/dist/esm/chunk-WG5ORTIW.js.map +7 -0
- package/dist/esm/chunk-WMVR2XBR.js +2 -0
- package/dist/esm/{chunk-XKSU3NLG.js.map → chunk-WMVR2XBR.js.map} +2 -2
- package/dist/esm/{chunk-NNZTSXKH.js → chunk-WX7SX5BN.js} +2 -2
- package/dist/esm/chunk-XOACTIBL.js +2 -0
- package/dist/esm/chunk-XOACTIBL.js.map +7 -0
- package/dist/esm/components/_internal/base-button.d.ts +11 -1
- package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
- package/dist/esm/components/_internal/base-button.js +1 -1
- package/dist/esm/components/_internal/menu-context.d.ts +2 -0
- package/dist/esm/components/_internal/menu-context.d.ts.map +1 -1
- package/dist/esm/components/_internal/menu-context.js +1 -1
- package/dist/esm/components/_internal/pane-chrome.d.ts +17 -2
- package/dist/esm/components/_internal/pane-chrome.d.ts.map +1 -1
- package/dist/esm/components/_internal/pane-chrome.js +1 -1
- package/dist/esm/components/_internal/shell-bottom.js +1 -1
- package/dist/esm/components/_internal/shell-inspector.js +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js +1 -1
- package/dist/esm/components/accordion.d.ts +2 -2
- package/dist/esm/components/accordion.d.ts.map +1 -1
- package/dist/esm/components/accordion.js +1 -1
- package/dist/esm/components/alert-dialog.d.ts.map +1 -1
- package/dist/esm/components/alert-dialog.js +1 -1
- package/dist/esm/components/avatar.d.ts +1 -1
- package/dist/esm/components/avatar.d.ts.map +1 -1
- package/dist/esm/components/avatar.js +1 -1
- package/dist/esm/components/avatar.props.d.ts +8 -0
- package/dist/esm/components/avatar.props.d.ts.map +1 -1
- package/dist/esm/components/avatar.props.js +1 -1
- package/dist/esm/components/blockquote.d.ts +1 -1
- package/dist/esm/components/blockquote.d.ts.map +1 -1
- package/dist/esm/components/blockquote.js +1 -1
- package/dist/esm/components/button.js +1 -1
- package/dist/esm/components/chatbar.d.ts.map +1 -1
- package/dist/esm/components/chatbar.js +1 -1
- package/dist/esm/components/checkbox-group.d.ts.map +1 -1
- package/dist/esm/components/checkbox-group.js +1 -1
- package/dist/esm/components/checkbox-group.primitive.d.ts +12 -5
- package/dist/esm/components/checkbox-group.primitive.d.ts.map +1 -1
- package/dist/esm/components/checkbox-group.primitive.js +1 -1
- package/dist/esm/components/checkbox.js +1 -1
- package/dist/esm/components/chip.d.ts.map +1 -1
- package/dist/esm/components/chip.js +1 -1
- package/dist/esm/components/code.d.ts.map +1 -1
- package/dist/esm/components/code.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/context-menu.d.ts.map +1 -1
- package/dist/esm/components/context-menu.js +1 -1
- package/dist/esm/components/dialog.d.ts +1 -1
- package/dist/esm/components/dialog.d.ts.map +1 -1
- package/dist/esm/components/dialog.js +1 -1
- package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
- package/dist/esm/components/dropdown-menu.js +1 -1
- package/dist/esm/components/icons.d.ts +3 -1
- package/dist/esm/components/icons.d.ts.map +1 -1
- package/dist/esm/components/icons.js +1 -1
- package/dist/esm/components/index.d.ts +1 -1
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -1
- package/dist/esm/components/message-scroller.d.ts.map +1 -1
- package/dist/esm/components/message-scroller.js +1 -1
- package/dist/esm/components/navbar.d.ts.map +1 -1
- package/dist/esm/components/navbar.js +1 -1
- package/dist/esm/components/notice.d.ts +4 -1
- package/dist/esm/components/notice.d.ts.map +1 -1
- package/dist/esm/components/notice.js +1 -1
- package/dist/esm/components/progress.d.ts.map +1 -1
- package/dist/esm/components/progress.js +1 -1
- package/dist/esm/components/schemas/button.schema.d.ts +2 -2
- package/dist/esm/components/schemas/toggle.schema.d.ts +1 -1
- package/dist/esm/components/scroll-area.d.ts +3 -1
- package/dist/esm/components/scroll-area.d.ts.map +1 -1
- package/dist/esm/components/scroll-area.js +1 -1
- package/dist/esm/components/segmented-control.d.ts +3 -1
- package/dist/esm/components/segmented-control.d.ts.map +1 -1
- package/dist/esm/components/segmented-control.js +1 -1
- package/dist/esm/components/select.d.ts.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/separator.d.ts.map +1 -1
- package/dist/esm/components/separator.js +1 -1
- package/dist/esm/components/sheet.d.ts +1 -0
- package/dist/esm/components/sheet.d.ts.map +1 -1
- package/dist/esm/components/sheet.js +1 -1
- package/dist/esm/components/shell.d.ts +12 -1
- package/dist/esm/components/shell.d.ts.map +1 -1
- package/dist/esm/components/shell.js +1 -1
- package/dist/esm/components/sidebar.d.ts.map +1 -1
- package/dist/esm/components/sidebar.js +1 -1
- package/dist/esm/components/slider.d.ts.map +1 -1
- package/dist/esm/components/slider.js +1 -1
- package/dist/esm/components/spinner.d.ts.map +1 -1
- package/dist/esm/components/spinner.js +1 -1
- package/dist/esm/components/table.d.ts.map +1 -1
- package/dist/esm/components/table.js +1 -1
- package/dist/esm/components/tabs.d.ts.map +1 -1
- package/dist/esm/components/tabs.js +1 -1
- package/dist/esm/components/text-area.js +1 -1
- package/dist/esm/components/text-field.js +1 -1
- package/dist/esm/components/toggle.d.ts +3 -2
- package/dist/esm/components/toggle.d.ts.map +1 -1
- package/dist/esm/components/toggle.js +1 -1
- package/dist/esm/components/toolbar.d.ts +80 -8
- package/dist/esm/components/toolbar.d.ts.map +1 -1
- package/dist/esm/components/toolbar.js +1 -1
- package/dist/esm/components/virtual-menu.d.ts +3 -5
- package/dist/esm/components/virtual-menu.d.ts.map +1 -1
- package/dist/esm/components/virtual-menu.js +1 -1
- package/dist/esm/helpers/extract-margin-props.d.ts +7 -7
- package/dist/esm/hooks/index.js +1 -1
- package/dist/esm/hooks/use-scroll-edges.d.ts +4 -2
- package/dist/esm/hooks/use-scroll-edges.d.ts.map +1 -1
- package/dist/esm/hooks/use-scroll-edges.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/props/index.js +1 -1
- package/package.json +1 -1
- package/src/components/_internal/base-button.tsx +51 -12
- package/src/components/_internal/base-sidebar-menu.css +8 -0
- package/src/components/_internal/menu-context.tsx +11 -0
- package/src/components/_internal/pane-chrome.tsx +45 -8
- package/src/components/accordion.css +35 -3
- package/src/components/accordion.tsx +12 -16
- package/src/components/alert-dialog.tsx +59 -161
- package/src/components/avatar.props.tsx +6 -0
- package/src/components/avatar.tsx +57 -71
- package/src/components/blockquote.tsx +8 -9
- package/src/components/chatbar.tsx +27 -20
- package/src/components/checkbox-group.primitive.tsx +40 -51
- package/src/components/checkbox-group.tsx +1 -9
- package/src/components/chip.css +18 -20
- package/src/components/chip.tsx +3 -4
- package/src/components/code.tsx +3 -2
- package/src/components/context-menu.tsx +23 -5
- package/src/components/dialog.tsx +59 -160
- package/src/components/dropdown-menu.tsx +8 -5
- package/src/components/icons.tsx +11 -1
- package/src/components/index.tsx +7 -0
- package/src/components/message-scroller.tsx +48 -26
- package/src/components/navbar.tsx +34 -69
- package/src/components/notice.tsx +6 -3
- package/src/components/progress.tsx +6 -3
- package/src/components/scroll-area.css +28 -2
- package/src/components/scroll-area.tsx +49 -3
- package/src/components/segmented-control.css +8 -130
- package/src/components/segmented-control.tsx +36 -5
- package/src/components/select.tsx +23 -3
- package/src/components/separator.tsx +13 -1
- package/src/components/sheet.css +7 -6
- package/src/components/sheet.tsx +76 -143
- package/src/components/shell.css +14 -0
- package/src/components/shell.tsx +29 -8
- package/src/components/sidebar.tsx +27 -16
- package/src/components/slider.tsx +51 -32
- package/src/components/spinner.tsx +10 -2
- package/src/components/table.tsx +18 -5
- package/src/components/tabs.css +34 -0
- package/src/components/tabs.tsx +0 -2
- package/src/components/text-area.css +2 -1
- package/src/components/text-area.tsx +1 -1
- package/src/components/text-field.tsx +1 -1
- package/src/components/toggle.tsx +21 -39
- package/src/components/toolbar.css +34 -0
- package/src/components/toolbar.tsx +432 -23
- package/src/components/virtual-menu.tsx +110 -37
- package/src/hooks/use-scroll-edges.ts +11 -2
- package/src/styles/utilities/truncate.css +10 -0
- package/styles.css +195 -185
- package/utilities.css +5 -0
- package/dist/esm/chunk-23KT3D2Z.js +0 -2
- package/dist/esm/chunk-3JA7SJDT.js +0 -2
- package/dist/esm/chunk-3JA7SJDT.js.map +0 -7
- package/dist/esm/chunk-3KQE2PSJ.js +0 -2
- package/dist/esm/chunk-5BWLY27A.js +0 -2
- package/dist/esm/chunk-5BWLY27A.js.map +0 -7
- package/dist/esm/chunk-6CK7UTNH.js +0 -2
- package/dist/esm/chunk-6CK7UTNH.js.map +0 -7
- package/dist/esm/chunk-6RK26HIY.js +0 -2
- package/dist/esm/chunk-6RK26HIY.js.map +0 -7
- package/dist/esm/chunk-7ESWH773.js +0 -2
- package/dist/esm/chunk-7ESWH773.js.map +0 -7
- package/dist/esm/chunk-7SS4UUJH.js +0 -2
- package/dist/esm/chunk-AB3QCCUM.js +0 -2
- package/dist/esm/chunk-AB3QCCUM.js.map +0 -7
- package/dist/esm/chunk-BEP4AH5V.js +0 -2
- package/dist/esm/chunk-BEP4AH5V.js.map +0 -7
- package/dist/esm/chunk-BOL3VVSN.js +0 -2
- package/dist/esm/chunk-BOL3VVSN.js.map +0 -7
- package/dist/esm/chunk-DBROSD2J.js +0 -2
- package/dist/esm/chunk-DBROSD2J.js.map +0 -7
- package/dist/esm/chunk-DSPYHO3L.js +0 -2
- package/dist/esm/chunk-E2D2VWUI.js +0 -2
- package/dist/esm/chunk-E2D2VWUI.js.map +0 -7
- package/dist/esm/chunk-EMNSA65L.js +0 -2
- package/dist/esm/chunk-EMNSA65L.js.map +0 -7
- package/dist/esm/chunk-FFG32ERA.js.map +0 -7
- package/dist/esm/chunk-FHPHEIYJ.js +0 -2
- package/dist/esm/chunk-FHPHEIYJ.js.map +0 -7
- package/dist/esm/chunk-FJFBM7HW.js +0 -2
- package/dist/esm/chunk-FJFBM7HW.js.map +0 -7
- package/dist/esm/chunk-FYT7TYGS.js +0 -2
- package/dist/esm/chunk-FYT7TYGS.js.map +0 -7
- package/dist/esm/chunk-GLV7VGBH.js +0 -2
- package/dist/esm/chunk-GLV7VGBH.js.map +0 -7
- package/dist/esm/chunk-HIKMKGPT.js +0 -2
- package/dist/esm/chunk-HIKMKGPT.js.map +0 -7
- package/dist/esm/chunk-L2R62BOB.js +0 -2
- package/dist/esm/chunk-L2R62BOB.js.map +0 -7
- package/dist/esm/chunk-LHIS3UKQ.js +0 -2
- package/dist/esm/chunk-LHIS3UKQ.js.map +0 -7
- package/dist/esm/chunk-NQDMTOGB.js +0 -2
- package/dist/esm/chunk-NQDMTOGB.js.map +0 -7
- package/dist/esm/chunk-Q6MFPATL.js +0 -2
- package/dist/esm/chunk-Q6MFPATL.js.map +0 -7
- package/dist/esm/chunk-QOHJIF25.js +0 -2
- package/dist/esm/chunk-QOHJIF25.js.map +0 -7
- package/dist/esm/chunk-R4XJNQX5.js +0 -2
- package/dist/esm/chunk-R4XJNQX5.js.map +0 -7
- package/dist/esm/chunk-UE3HATOA.js +0 -2
- package/dist/esm/chunk-UE3HATOA.js.map +0 -7
- package/dist/esm/chunk-V32EP3S7.js +0 -2
- package/dist/esm/chunk-V32EP3S7.js.map +0 -7
- package/dist/esm/chunk-XKSU3NLG.js +0 -2
- package/dist/esm/chunk-XRCMPBAY.js +0 -2
- package/dist/esm/chunk-XRCMPBAY.js.map +0 -7
- package/dist/esm/chunk-Y3JYEEFB.js +0 -2
- package/dist/esm/chunk-YZM54IJE.js +0 -2
- package/dist/esm/chunk-YZM54IJE.js.map +0 -7
- package/dist/esm/chunk-ZEX2DECM.js +0 -2
- package/dist/esm/chunk-ZJI2IK7C.js +0 -2
- package/dist/esm/chunk-ZJI2IK7C.js.map +0 -7
- package/dist/esm/chunk-ZNDCZM5A.js +0 -2
- /package/dist/esm/{chunk-6DDOR73D.js.map → chunk-G4ETY2NP.js.map} +0 -0
- /package/dist/esm/{chunk-QGCXTULQ.js.map → chunk-KEGCX5VM.js.map} +0 -0
- /package/dist/esm/{chunk-HKPXDQ2B.js.map → chunk-NC3CJUE3.js.map} +0 -0
- /package/dist/esm/{chunk-OJQNLROL.js.map → chunk-UY6WJUNA.js.map} +0 -0
- /package/dist/esm/{chunk-JBHRV364.js.map → chunk-VUPIJNG2.js.map} +0 -0
- /package/dist/esm/{chunk-NNZTSXKH.js.map → chunk-WX7SX5BN.js.map} +0 -0
|
@@ -97,6 +97,23 @@ function wrapTextNodes(node: React.ReactNode): React.ReactNode {
|
|
|
97
97
|
return node;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
// Arrow Up and Down move between the visible buttons of the same sidebar, as a
|
|
101
|
+
// convenience on top of Tab. Sub-menu triggers take part, so the one-item Accordion
|
|
102
|
+
// behind each sub-menu doesn't keep focus on its own trigger.
|
|
103
|
+
function focusAdjacentSidebarButton(event: React.KeyboardEvent<HTMLElement>) {
|
|
104
|
+
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
|
|
105
|
+
const scope = event.currentTarget.closest('.kui-SidebarContent, .kui-SidebarSearchPopover');
|
|
106
|
+
const buttons = scope
|
|
107
|
+
? Array.from(scope.querySelectorAll<HTMLElement>('.kui-SidebarMenuButton')).filter((el) => el.offsetParent !== null)
|
|
108
|
+
: [];
|
|
109
|
+
const index = buttons.indexOf(event.currentTarget);
|
|
110
|
+
const next = buttons[index + (event.key === 'ArrowDown' ? 1 : -1)];
|
|
111
|
+
if (index !== -1 && next) {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
next.focus();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
100
117
|
const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(
|
|
101
118
|
({ asChild = false, isActive = false, shortcut, badge, className, children, onKeyDown, ...props }, forwardedRef) => {
|
|
102
119
|
const visual = useSidebarVisual();
|
|
@@ -105,22 +122,10 @@ const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonP
|
|
|
105
122
|
|
|
106
123
|
const Comp = asChild ? Slot : 'button';
|
|
107
124
|
|
|
108
|
-
// Enter and Space are left to the native button or link.
|
|
109
|
-
// the visible buttons of the same sidebar, as a convenience on top of Tab.
|
|
125
|
+
// Enter and Space are left to the native button or link.
|
|
110
126
|
const handleKeyDown = React.useCallback(
|
|
111
127
|
(event: React.KeyboardEvent<HTMLButtonElement>) => {
|
|
112
|
-
|
|
113
|
-
const scope = event.currentTarget.closest('.kui-SidebarContent, .kui-SidebarSearchPopover');
|
|
114
|
-
const buttons = scope
|
|
115
|
-
? Array.from(scope.querySelectorAll<HTMLElement>('.kui-SidebarMenuButton')).filter((el) => el.offsetParent !== null)
|
|
116
|
-
: [];
|
|
117
|
-
const index = buttons.indexOf(event.currentTarget);
|
|
118
|
-
const next = buttons[index + (event.key === 'ArrowDown' ? 1 : -1)];
|
|
119
|
-
if (index !== -1 && next) {
|
|
120
|
-
event.preventDefault();
|
|
121
|
-
next.focus();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
128
|
+
focusAdjacentSidebarButton(event);
|
|
124
129
|
onKeyDown?.(event);
|
|
125
130
|
},
|
|
126
131
|
[onKeyDown],
|
|
@@ -262,7 +267,7 @@ interface SidebarMenuSubTriggerProps extends React.ComponentPropsWithoutRef<type
|
|
|
262
267
|
}
|
|
263
268
|
|
|
264
269
|
const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion.Trigger>, SidebarMenuSubTriggerProps>(
|
|
265
|
-
({ asChild = false, className, children, ...props }, forwardedRef) => {
|
|
270
|
+
({ asChild = false, className, children, onKeyDown, ...props }, forwardedRef) => {
|
|
266
271
|
const mode = React.useContext(SidebarSubMenuModeContext);
|
|
267
272
|
|
|
268
273
|
if (mode === 'dropdown') {
|
|
@@ -270,6 +275,7 @@ const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion
|
|
|
270
275
|
<DropdownMenu.Trigger>
|
|
271
276
|
<button
|
|
272
277
|
{...(props as any)}
|
|
278
|
+
onKeyDown={onKeyDown}
|
|
273
279
|
ref={forwardedRef as any}
|
|
274
280
|
type="button"
|
|
275
281
|
aria-haspopup="menu"
|
|
@@ -286,6 +292,11 @@ const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion
|
|
|
286
292
|
<div>
|
|
287
293
|
<Accordion.Trigger
|
|
288
294
|
{...props}
|
|
295
|
+
onKeyDown={(event) => {
|
|
296
|
+
// Runs before the Accordion's own arrow handling, which would keep focus here.
|
|
297
|
+
focusAdjacentSidebarButton(event);
|
|
298
|
+
onKeyDown?.(event);
|
|
299
|
+
}}
|
|
289
300
|
ref={forwardedRef}
|
|
290
301
|
asChild={asChild}
|
|
291
302
|
className={classNames('kui-reset', 'kui-BaseMenuItem', 'kui-SidebarMenuButton', 'kui-SidebarMenuSubTrigger', className)}
|
|
@@ -357,7 +368,7 @@ const SidebarMenuSubContent = React.forwardRef<React.ElementRef<typeof Accordion
|
|
|
357
368
|
|
|
358
369
|
return (
|
|
359
370
|
<Accordion.Content {...props} ref={forwardedRef} className={classNames('kui-SidebarMenuSubContent', className)}>
|
|
360
|
-
<
|
|
371
|
+
<ul className="kui-SidebarMenuSubList">{children}</ul>
|
|
361
372
|
</Accordion.Content>
|
|
362
373
|
);
|
|
363
374
|
});
|
|
@@ -26,18 +26,34 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
26
26
|
props,
|
|
27
27
|
sliderPropDefs,
|
|
28
28
|
);
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
const {
|
|
30
|
+
ticks,
|
|
31
|
+
unit,
|
|
32
|
+
value: valueProp,
|
|
33
|
+
defaultValue,
|
|
34
|
+
onValueChange,
|
|
35
|
+
onValueCommit,
|
|
36
|
+
'aria-label': ariaLabel,
|
|
37
|
+
'aria-labelledby': ariaLabelledBy,
|
|
38
|
+
...rootProps
|
|
39
|
+
} = sliderProps;
|
|
40
|
+
const { showTickLabels, snapToTicks } = props;
|
|
41
|
+
|
|
42
|
+
const min = rootProps.min ?? 0;
|
|
43
|
+
const max = rootProps.max ?? 100;
|
|
44
|
+
|
|
45
|
+
// The slider keeps its own copy of the value when uncontrolled, so the handles, their
|
|
46
|
+
// labels and a tick press all read the current value rather than the first one.
|
|
47
|
+
const [uncontrolledValue, setUncontrolledValue] = React.useState<number[]>(
|
|
48
|
+
() => defaultValue ?? [min],
|
|
49
|
+
);
|
|
50
|
+
const isControlled = valueProp !== undefined;
|
|
51
|
+
const currentValue = isControlled ? valueProp : uncontrolledValue;
|
|
52
|
+
const tickIdPrefix = React.useId();
|
|
37
53
|
|
|
38
54
|
// For snapping to ticks, we need to handle this differently
|
|
39
55
|
// Radix slider doesn't support arbitrary step values, so we'll handle snapping in the onValueChange
|
|
40
|
-
const step =
|
|
56
|
+
const step = rootProps.step;
|
|
41
57
|
|
|
42
58
|
// Optimized snap-to-ticks with memoized sorted ticks
|
|
43
59
|
const sortedTicks = React.useMemo(
|
|
@@ -108,7 +124,6 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
108
124
|
const announceRef = React.useRef<HTMLDivElement>(null);
|
|
109
125
|
const announceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
110
126
|
|
|
111
|
-
const { onValueChange } = sliderProps;
|
|
112
127
|
// Handle value changes with snapping
|
|
113
128
|
const handleValueChange = React.useCallback(
|
|
114
129
|
(newValue: number[]) => {
|
|
@@ -131,9 +146,10 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
131
146
|
}, 1000);
|
|
132
147
|
}
|
|
133
148
|
|
|
149
|
+
if (!isControlled) setUncontrolledValue(finalValue);
|
|
134
150
|
onValueChange?.(finalValue);
|
|
135
151
|
},
|
|
136
|
-
[snapToTicks, ticks, snapToNearestTick, formatValueText, onValueChange],
|
|
152
|
+
[snapToTicks, ticks, snapToNearestTick, formatValueText, onValueChange, isControlled],
|
|
137
153
|
);
|
|
138
154
|
|
|
139
155
|
// Cleanup timeout on unmount
|
|
@@ -159,35 +175,30 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
159
175
|
data-accent-color={color}
|
|
160
176
|
data-radius={radius}
|
|
161
177
|
ref={forwardedRef}
|
|
162
|
-
{...
|
|
178
|
+
{...rootProps}
|
|
179
|
+
value={currentValue}
|
|
163
180
|
step={step}
|
|
164
181
|
onValueChange={handleValueChange}
|
|
182
|
+
onValueCommit={onValueCommit}
|
|
165
183
|
asChild={false}
|
|
166
184
|
className={classNames('kui-SliderRoot', className)}
|
|
167
|
-
// Essential ARIA attributes for WCAG 2.2 AA compliance
|
|
168
|
-
aria-valuemin={min}
|
|
169
|
-
aria-valuemax={max}
|
|
170
|
-
aria-valuenow={Array.isArray(currentValue) ? currentValue[0] : (currentValue as number)}
|
|
171
|
-
aria-valuetext={formatValueText(currentValue as number[])}
|
|
172
|
-
aria-label={props['aria-label'] || `${isRange ? 'Range' : 'Value'} slider`}
|
|
173
185
|
>
|
|
174
186
|
<SliderPrimitive.Track className="kui-SliderTrack">
|
|
175
187
|
<SliderPrimitive.Range
|
|
176
188
|
className="kui-SliderRange"
|
|
177
|
-
data-inverted={
|
|
189
|
+
data-inverted={rootProps.inverted ? '' : undefined}
|
|
178
190
|
/>
|
|
179
191
|
</SliderPrimitive.Track>
|
|
180
|
-
{
|
|
192
|
+
{currentValue.map((value, index) => (
|
|
181
193
|
<SliderPrimitive.Thumb
|
|
182
194
|
key={index}
|
|
183
195
|
className="kui-SliderThumb"
|
|
184
196
|
{...(tabIndex !== undefined ? { tabIndex } : undefined)}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
aria-valuetext={unit ? `${value} ${unit}` : value.toString()}
|
|
197
|
+
// The caller's name goes to every handle. Without one, Radix names the two
|
|
198
|
+
// handles of a range "Minimum" and "Maximum".
|
|
199
|
+
aria-label={ariaLabel}
|
|
200
|
+
aria-labelledby={ariaLabelledBy}
|
|
201
|
+
aria-valuetext={unit ? `${value} ${unit}` : undefined}
|
|
191
202
|
/>
|
|
192
203
|
))}
|
|
193
204
|
</SliderPrimitive.Root>
|
|
@@ -201,15 +212,23 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
201
212
|
// Only `left` varies per tick; the centring transform lives in `.kui-SliderTick`.
|
|
202
213
|
style={{ left: `${tick.percentage}%` }}
|
|
203
214
|
onClick={() => {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
215
|
+
// Move only the handle nearest the tick. When handles share a value, a
|
|
216
|
+
// tick above it moves the last of them and a tick below moves the first.
|
|
217
|
+
let nearest = 0;
|
|
218
|
+
currentValue.forEach((v, i) => {
|
|
219
|
+
const distance = Math.abs(v - tick.value);
|
|
220
|
+
const best = Math.abs(currentValue[nearest] - tick.value);
|
|
221
|
+
if (distance < best || (distance === best && tick.value > v)) nearest = i;
|
|
222
|
+
});
|
|
223
|
+
const newValue = currentValue
|
|
224
|
+
.map((v, i) => (i === nearest ? tick.value : v))
|
|
225
|
+
.sort((x, y) => x - y);
|
|
208
226
|
|
|
209
227
|
handleValueChange(newValue);
|
|
228
|
+
onValueCommit?.(newValue);
|
|
210
229
|
}}
|
|
211
230
|
aria-label={`Set to ${tick.label || (unit ? `${tick.value} ${unit}` : tick.value)}`}
|
|
212
|
-
aria-describedby={tick.label ? undefined :
|
|
231
|
+
aria-describedby={tick.label ? undefined : `${tickIdPrefix}-tick-${tick.index}`}
|
|
213
232
|
type="button"
|
|
214
233
|
>
|
|
215
234
|
<div className="kui-SliderTickMark" />
|
|
@@ -217,7 +236,7 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
|
|
|
217
236
|
<div className="kui-SliderTickLabel">{tick.label}</div>
|
|
218
237
|
)}
|
|
219
238
|
{!tick.label && (
|
|
220
|
-
<span id={
|
|
239
|
+
<span id={`${tickIdPrefix}-tick-${tick.index}`} className="kui-sr-only">
|
|
221
240
|
{unit ? `${tick.value} ${unit}` : tick.value}
|
|
222
241
|
</span>
|
|
223
242
|
)}
|
|
@@ -21,8 +21,16 @@ const Spinner = React.forwardRef<SpinnerElement, SpinnerProps>((props, forwarded
|
|
|
21
21
|
|
|
22
22
|
if (!loading) return children;
|
|
23
23
|
|
|
24
|
+
// Decorative unless named: a named spinner is a status message, an unnamed one is hidden.
|
|
25
|
+
const named =
|
|
26
|
+
spinnerProps['aria-label'] !== undefined || spinnerProps['aria-labelledby'] !== undefined;
|
|
27
|
+
|
|
24
28
|
const spinner = (
|
|
25
|
-
<span
|
|
29
|
+
<span
|
|
30
|
+
role={named ? 'status' : undefined}
|
|
31
|
+
aria-hidden={named ? undefined : true}
|
|
32
|
+
{...spinnerProps}
|
|
33
|
+
ref={forwardedRef} className={classNames('kui-Spinner', className)}>
|
|
26
34
|
<span className="kui-SpinnerWheel">
|
|
27
35
|
<span className="kui-SpinnerLeaf" />
|
|
28
36
|
<span className="kui-SpinnerLeaf" />
|
|
@@ -40,7 +48,7 @@ const Spinner = React.forwardRef<SpinnerElement, SpinnerProps>((props, forwarded
|
|
|
40
48
|
|
|
41
49
|
return (
|
|
42
50
|
<Flex asChild position="relative" align="center" justify="center">
|
|
43
|
-
<span>
|
|
51
|
+
<span aria-busy="true">
|
|
44
52
|
{/**
|
|
45
53
|
* `display: contents` removes the content from the accessibility tree in some browsers,
|
|
46
54
|
* so we force remove it with `aria-hidden`
|
package/src/components/table.tsx
CHANGED
|
@@ -18,10 +18,16 @@ interface TableRootProps
|
|
|
18
18
|
const TableRoot = React.forwardRef<TableRootElement, TableRootProps>((ownProps, forwardedRef) => {
|
|
19
19
|
const props = useThemeSizeProps(ownProps, tableRootPropDefs.size);
|
|
20
20
|
const { layout: layoutPropDef, ...rootPropDefs } = tableRootPropDefs;
|
|
21
|
-
const {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const {
|
|
22
|
+
className,
|
|
23
|
+
children,
|
|
24
|
+
layout,
|
|
25
|
+
// The table is what gets named, not the scroll wrapper around it.
|
|
26
|
+
'aria-label': ariaLabel,
|
|
27
|
+
'aria-labelledby': ariaLabelledBy,
|
|
28
|
+
'aria-describedby': ariaDescribedBy,
|
|
29
|
+
...rootProps
|
|
30
|
+
} = extractProps(props, rootPropDefs);
|
|
25
31
|
const tableLayoutClassNames = getResponsiveClassNames({
|
|
26
32
|
value: layout,
|
|
27
33
|
className: tableRootPropDefs.layout.className,
|
|
@@ -30,7 +36,14 @@ const TableRoot = React.forwardRef<TableRootElement, TableRootProps>((ownProps,
|
|
|
30
36
|
return (
|
|
31
37
|
<div ref={forwardedRef} className={classNames('kui-TableRoot', className)} {...rootProps}>
|
|
32
38
|
<ScrollArea>
|
|
33
|
-
<table
|
|
39
|
+
<table
|
|
40
|
+
className={classNames('kui-TableRootTable', tableLayoutClassNames)}
|
|
41
|
+
aria-label={ariaLabel}
|
|
42
|
+
aria-labelledby={ariaLabelledBy}
|
|
43
|
+
aria-describedby={ariaDescribedBy}
|
|
44
|
+
>
|
|
45
|
+
{children}
|
|
46
|
+
</table>
|
|
34
47
|
</ScrollArea>
|
|
35
48
|
</div>
|
|
36
49
|
);
|
package/src/components/tabs.css
CHANGED
|
@@ -9,3 +9,37 @@
|
|
|
9
9
|
outline: var(--focus-ring-width, 2px) solid var(--focus-8);
|
|
10
10
|
outline-offset: var(--focus-ring-offset, 2px);
|
|
11
11
|
}
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Vertical: the list is a column beside the panels, its hairline on the inline end, and the
|
|
15
|
+
* active line runs down that edge.
|
|
16
|
+
*/
|
|
17
|
+
.kui-TabsRoot:where([data-orientation='vertical']) {
|
|
18
|
+
display: flex;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.kui-TabsList:where([data-orientation='vertical']) {
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
flex-shrink: 0;
|
|
24
|
+
overflow-x: hidden;
|
|
25
|
+
overflow-y: auto;
|
|
26
|
+
box-shadow: inset calc(-1 * var(--border-width-standard)) 0 0 0 var(--neutral-a5);
|
|
27
|
+
|
|
28
|
+
&:where(:dir(rtl)) {
|
|
29
|
+
box-shadow: inset var(--border-width-standard) 0 0 0 var(--neutral-a5);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
:where(&) .kui-TabsTrigger {
|
|
33
|
+
justify-content: flex-start;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:where(&) .kui-TabsTrigger:where([data-state='active'])::before {
|
|
37
|
+
top: 0;
|
|
38
|
+
bottom: 0;
|
|
39
|
+
left: auto;
|
|
40
|
+
right: auto;
|
|
41
|
+
inset-inline-end: 0;
|
|
42
|
+
width: var(--focus-ring-width, 2px);
|
|
43
|
+
height: auto;
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/components/tabs.tsx
CHANGED
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
font-style: normal;
|
|
29
29
|
text-align: start;
|
|
30
30
|
|
|
31
|
-
/* Allows the `resize` property to work on the div */
|
|
31
|
+
/* Allows the `resize` property to work on the div. Vertical by default, as in v2; the `resize` prop overrides it. */
|
|
32
32
|
overflow: hidden;
|
|
33
|
+
resize: vertical;
|
|
33
34
|
|
|
34
35
|
isolation: isolate;
|
|
35
36
|
|
|
@@ -52,7 +52,6 @@ const TextArea = React.forwardRef<TextAreaElement, TextAreaProps>((ownProps, for
|
|
|
52
52
|
const {
|
|
53
53
|
error,
|
|
54
54
|
errorMessage,
|
|
55
|
-
|
|
56
55
|
required,
|
|
57
56
|
'aria-describedby': _ariaDescribedby,
|
|
58
57
|
'aria-labelledby': _ariaLabelledby,
|
|
@@ -72,6 +71,7 @@ const TextArea = React.forwardRef<TextAreaElement, TextAreaProps>((ownProps, for
|
|
|
72
71
|
className="kui-reset kui-TextAreaInput"
|
|
73
72
|
ref={forwardedRef}
|
|
74
73
|
{...nativeTextAreaProps}
|
|
74
|
+
required={required || undefined}
|
|
75
75
|
{...ariaProps}
|
|
76
76
|
/>
|
|
77
77
|
{textAreaProps.errorMessage && (
|
|
@@ -91,7 +91,7 @@ const TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>
|
|
|
91
91
|
})}
|
|
92
92
|
onPointerDown={handlePointerDown}
|
|
93
93
|
>
|
|
94
|
-
<input
|
|
94
|
+
<input {...nativeInputProps} required={required || undefined} {...ariaProps} ref={composeRefs(inputRef, forwardedRef)} className="kui-reset kui-TextFieldInput" />
|
|
95
95
|
{children}
|
|
96
96
|
{inputProps.errorMessage && (
|
|
97
97
|
<div id={errorId} className="kui-TextFieldErrorMessage" role="alert">
|
|
@@ -3,7 +3,6 @@ import classNames from 'classnames';
|
|
|
3
3
|
import { Toggle as TogglePrimitive } from 'radix-ui';
|
|
4
4
|
import { Button } from './button.js';
|
|
5
5
|
import type { ButtonIconOnlyProps, ButtonProps, ButtonRankProps } from './button.js';
|
|
6
|
-
import { useToggleState } from '../hooks/use-toggle-state.js';
|
|
7
6
|
|
|
8
7
|
type ToggleOwnProps = {
|
|
9
8
|
/** Whether the toggle is on. The controlled counterpart of `defaultPressed`. */
|
|
@@ -15,10 +14,11 @@ type ToggleOwnProps = {
|
|
|
15
14
|
};
|
|
16
15
|
|
|
17
16
|
/**
|
|
18
|
-
* Toggle takes every `Button` prop except `as
|
|
17
|
+
* Toggle takes every `Button` prop except `as` and `done`: a toggle's state is `pressed`, and a
|
|
18
|
+
* tick in place of its icon would read as a second state. Set `iconOnly` for a square toggle holding only
|
|
19
19
|
* an icon; the type then requires `aria-label` or `aria-labelledby`.
|
|
20
20
|
*/
|
|
21
|
-
type ToggleProps = Omit<ButtonProps<'button'>, 'as' | 'variant' | 'emphasis' | 'iconOnly'> &
|
|
21
|
+
type ToggleProps = Omit<ButtonProps<'button'>, 'as' | 'variant' | 'emphasis' | 'iconOnly' | 'done'> &
|
|
22
22
|
ButtonRankProps &
|
|
23
23
|
ButtonIconOnlyProps &
|
|
24
24
|
ToggleOwnProps;
|
|
@@ -43,46 +43,28 @@ type ToggleElement = React.ElementRef<typeof Button>;
|
|
|
43
43
|
*/
|
|
44
44
|
const Toggle = React.forwardRef<ToggleElement, ToggleProps>(
|
|
45
45
|
({ pressed, onPressedChange, defaultPressed, children, className, ...buttonProps }, forwardedRef) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// The label behind aria-labelledby is read once per id, not on every press.
|
|
52
|
-
const cachedLabelRef = React.useRef<string | null>(null);
|
|
46
|
+
// `done` is not a Toggle prop; a call that slips past the type drops it rather than showing a tick.
|
|
47
|
+
delete (buttonProps as { done?: boolean }).done;
|
|
48
|
+
// aria-pressed is the whole announcement: a screen reader reads the new state on its own.
|
|
49
|
+
const warnedRef = React.useRef(false);
|
|
53
50
|
React.useEffect(() => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
return cachedLabelRef.current;
|
|
51
|
+
if (
|
|
52
|
+
process.env.NODE_ENV === 'development' &&
|
|
53
|
+
pressed !== undefined &&
|
|
54
|
+
onPressedChange === undefined &&
|
|
55
|
+
!warnedRef.current
|
|
56
|
+
) {
|
|
57
|
+
warnedRef.current = true;
|
|
58
|
+
console.warn(
|
|
59
|
+
'Toggle: You provided a `pressed` prop without an `onPressedChange` handler. ' +
|
|
60
|
+
'This will result in a read-only toggle button. If you want the button to be interactive, ' +
|
|
61
|
+
'you should provide an `onPressedChange` handler.',
|
|
62
|
+
);
|
|
68
63
|
}
|
|
69
|
-
|
|
70
|
-
if (React.isValidElement(children) && typeof (children.props as { children?: unknown })?.children === 'string') {
|
|
71
|
-
return (children.props as { children: string }).children;
|
|
72
|
-
}
|
|
73
|
-
return 'Toggle';
|
|
74
|
-
}, [ariaLabel, ariaLabelledBy, children]);
|
|
75
|
-
|
|
76
|
-
// Shared toggle state hook: accessibility announcements and controlled-state warnings.
|
|
77
|
-
const { handlePressedChange } = useToggleState({
|
|
78
|
-
pressed,
|
|
79
|
-
onPressedChange,
|
|
80
|
-
getAccessibleName,
|
|
81
|
-
componentName: 'Toggle',
|
|
82
|
-
});
|
|
64
|
+
}, [pressed, onPressedChange]);
|
|
83
65
|
|
|
84
66
|
return (
|
|
85
|
-
<TogglePrimitive.Root pressed={pressed} onPressedChange={
|
|
67
|
+
<TogglePrimitive.Root pressed={pressed} onPressedChange={onPressedChange} defaultPressed={defaultPressed} asChild>
|
|
86
68
|
<Button {...(buttonProps as ButtonProps)} ref={forwardedRef} className={classNames('kui-Toggle', className)}>
|
|
87
69
|
{children}
|
|
88
70
|
</Button>
|
|
@@ -90,6 +90,40 @@
|
|
|
90
90
|
border-radius: max(0px, calc(var(--toolbar-radius) - var(--toolbar-group-inset)));
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
/* * * * * * * * * * * * * * * * * * * */
|
|
94
|
+
/* */
|
|
95
|
+
/* Overflow */
|
|
96
|
+
/* */
|
|
97
|
+
/* * * * * * * * * * * * * * * * * * * */
|
|
98
|
+
|
|
99
|
+
/* Takes the room the row leaves and packs its controls at the end, so the ones that don't fit
|
|
100
|
+
move into the "More" menu from the end. The empty part of it lets clicks through. */
|
|
101
|
+
.kui-ToolbarOverflow {
|
|
102
|
+
display: flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
justify-content: flex-end;
|
|
105
|
+
gap: var(--toolbar-gap);
|
|
106
|
+
flex: 1 1 0%;
|
|
107
|
+
min-width: 0;
|
|
108
|
+
pointer-events: none;
|
|
109
|
+
|
|
110
|
+
& > * {
|
|
111
|
+
pointer-events: auto;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* One seat per child, so a child that renders nothing keeps every index in place. A seat never
|
|
116
|
+
shrinks, because its width is the measurement; an empty one leaves the layout and its gaps. */
|
|
117
|
+
.kui-ToolbarOverflowSeat {
|
|
118
|
+
display: flex;
|
|
119
|
+
align-items: center;
|
|
120
|
+
flex: none;
|
|
121
|
+
|
|
122
|
+
&:where(:empty) {
|
|
123
|
+
display: none;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
93
127
|
/* * * * * * * * * * * * * * * * * * * */
|
|
94
128
|
/* */
|
|
95
129
|
/* Separator */
|