@gnome-ui/react 1.36.2 → 1.36.4
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/README.md +16 -2
- package/dist/components/AboutDialog/AboutDialog.cjs +2 -0
- package/dist/components/AboutDialog/AboutDialog.cjs.map +1 -0
- package/dist/components/AboutDialog/AboutDialog.js +185 -0
- package/dist/components/AboutDialog/AboutDialog.js.map +1 -0
- package/dist/components/AboutDialog/AboutDialog.module.css.cjs +2 -0
- package/dist/components/AboutDialog/AboutDialog.module.css.cjs.map +1 -0
- package/dist/components/AboutDialog/AboutDialog.module.css.js +35 -0
- package/dist/components/AboutDialog/AboutDialog.module.css.js.map +1 -0
- package/dist/components/AboutDialog.cjs +1 -0
- package/dist/components/AboutDialog.d.ts +2 -0
- package/dist/components/AboutDialog.js +2 -0
- package/dist/components/ActionRow/ActionRow.cjs +2 -0
- package/dist/components/ActionRow/ActionRow.cjs.map +1 -0
- package/dist/components/ActionRow/ActionRow.js +39 -0
- package/dist/components/ActionRow/ActionRow.js.map +1 -0
- package/dist/components/ActionRow/ActionRow.module.css.cjs +2 -0
- package/dist/components/ActionRow/ActionRow.module.css.cjs.map +1 -0
- package/dist/components/ActionRow/ActionRow.module.css.js +15 -0
- package/dist/components/ActionRow/ActionRow.module.css.js.map +1 -0
- package/dist/components/ActionRow.cjs +1 -0
- package/dist/components/ActionRow.d.ts +2 -0
- package/dist/components/ActionRow.js +2 -0
- package/dist/components/Avatar/Avatar.cjs +2 -0
- package/dist/components/Avatar/Avatar.cjs.map +1 -0
- package/dist/components/Avatar/Avatar.js +50 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/Avatar.module.css.cjs +2 -0
- package/dist/components/Avatar/Avatar.module.css.cjs.map +1 -0
- package/dist/components/Avatar/Avatar.module.css.js +22 -0
- package/dist/components/Avatar/Avatar.module.css.js.map +1 -0
- package/dist/components/Avatar.cjs +1 -0
- package/dist/components/Avatar.d.ts +2 -0
- package/dist/components/Avatar.js +2 -0
- package/dist/components/Badge/Badge.cjs +2 -0
- package/dist/components/Badge/Badge.cjs.map +1 -0
- package/dist/components/Badge/Badge.js +24 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/Badge.module.css.cjs +2 -0
- package/dist/components/Badge/Badge.module.css.cjs.map +1 -0
- package/dist/components/Badge/Badge.module.css.js +15 -0
- package/dist/components/Badge/Badge.module.css.js.map +1 -0
- package/dist/components/Badge.cjs +1 -0
- package/dist/components/Badge.d.ts +2 -0
- package/dist/components/Badge.js +2 -0
- package/dist/components/Banner/Banner.cjs +2 -0
- package/dist/components/Banner/Banner.cjs.map +1 -0
- package/dist/components/Banner/Banner.js +44 -0
- package/dist/components/Banner/Banner.js.map +1 -0
- package/dist/components/Banner/Banner.module.css.cjs +2 -0
- package/dist/components/Banner/Banner.module.css.cjs.map +1 -0
- package/dist/components/Banner/Banner.module.css.js +20 -0
- package/dist/components/Banner/Banner.module.css.js.map +1 -0
- package/dist/components/Banner.cjs +1 -0
- package/dist/components/Banner.d.ts +2 -0
- package/dist/components/Banner.js +2 -0
- package/dist/components/Bin/Bin.cjs +2 -0
- package/dist/components/Bin/Bin.cjs.map +1 -0
- package/dist/components/Bin/Bin.js +12 -0
- package/dist/components/Bin/Bin.js.map +1 -0
- package/dist/components/Bin.cjs +1 -0
- package/dist/components/Bin.d.ts +2 -0
- package/dist/components/Bin.js +2 -0
- package/dist/components/Blockquote/Blockquote.cjs +2 -0
- package/dist/components/Blockquote/Blockquote.cjs.map +1 -0
- package/dist/components/Blockquote/Blockquote.js +34 -0
- package/dist/components/Blockquote/Blockquote.js.map +1 -0
- package/dist/components/Blockquote/Blockquote.module.css.cjs +2 -0
- package/dist/components/Blockquote/Blockquote.module.css.cjs.map +1 -0
- package/dist/components/Blockquote/Blockquote.module.css.js +17 -0
- package/dist/components/Blockquote/Blockquote.module.css.js.map +1 -0
- package/dist/components/Blockquote.cjs +1 -0
- package/dist/components/Blockquote.d.ts +2 -0
- package/dist/components/Blockquote.js +2 -0
- package/dist/components/BottomSheet/BottomSheet.cjs +2 -0
- package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -0
- package/dist/components/BottomSheet/BottomSheet.js +60 -0
- package/dist/components/BottomSheet/BottomSheet.js.map +1 -0
- package/dist/components/BottomSheet/BottomSheet.module.css.cjs +2 -0
- package/dist/components/BottomSheet/BottomSheet.module.css.cjs.map +1 -0
- package/dist/components/BottomSheet/BottomSheet.module.css.js +15 -0
- package/dist/components/BottomSheet/BottomSheet.module.css.js.map +1 -0
- package/dist/components/BottomSheet.cjs +1 -0
- package/dist/components/BottomSheet.d.ts +2 -0
- package/dist/components/BottomSheet.js +2 -0
- package/dist/components/Box/Box.cjs +2 -0
- package/dist/components/Box/Box.cjs.map +1 -0
- package/dist/components/Box/Box.js +22 -0
- package/dist/components/Box/Box.js.map +1 -0
- package/dist/components/Box.cjs +1 -0
- package/dist/components/Box.d.ts +2 -0
- package/dist/components/Box.js +2 -0
- package/dist/components/BoxedList/BoxedList.cjs +2 -0
- package/dist/components/BoxedList/BoxedList.cjs.map +1 -0
- package/dist/components/BoxedList/BoxedList.js +25 -0
- package/dist/components/BoxedList/BoxedList.js.map +1 -0
- package/dist/components/BoxedList/BoxedList.module.css.cjs +2 -0
- package/dist/components/BoxedList/BoxedList.module.css.cjs.map +1 -0
- package/dist/components/BoxedList/BoxedList.module.css.js +11 -0
- package/dist/components/BoxedList/BoxedList.module.css.js.map +1 -0
- package/dist/components/BoxedList.cjs +1 -0
- package/dist/components/BoxedList.d.ts +2 -0
- package/dist/components/BoxedList.js +2 -0
- package/dist/components/BreakpointBin/BreakpointBin.cjs +2 -0
- package/dist/components/BreakpointBin/BreakpointBin.cjs.map +1 -0
- package/dist/components/BreakpointBin/BreakpointBin.js +37 -0
- package/dist/components/BreakpointBin/BreakpointBin.js.map +1 -0
- package/dist/components/BreakpointBin.cjs +1 -0
- package/dist/components/BreakpointBin.d.ts +2 -0
- package/dist/components/BreakpointBin.js +2 -0
- package/dist/components/Button/Button.cjs +2 -0
- package/dist/components/Button/Button.cjs.map +1 -0
- package/dist/components/Button/Button.js +25 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/Button.module.css.cjs +2 -0
- package/dist/components/Button/Button.module.css.cjs.map +1 -0
- package/dist/components/Button/Button.module.css.js +17 -0
- package/dist/components/Button/Button.module.css.js.map +1 -0
- package/dist/components/Button.cjs +1 -0
- package/dist/components/Button.d.ts +2 -0
- package/dist/components/Button.js +2 -0
- package/dist/components/ButtonContent/ButtonContent.cjs +2 -0
- package/dist/components/ButtonContent/ButtonContent.cjs.map +1 -0
- package/dist/components/ButtonContent/ButtonContent.js +33 -0
- package/dist/components/ButtonContent/ButtonContent.js.map +1 -0
- package/dist/components/ButtonContent/ButtonContent.module.css.cjs +2 -0
- package/dist/components/ButtonContent/ButtonContent.module.css.cjs.map +1 -0
- package/dist/components/ButtonContent/ButtonContent.module.css.js +9 -0
- package/dist/components/ButtonContent/ButtonContent.module.css.js.map +1 -0
- package/dist/components/ButtonContent.cjs +1 -0
- package/dist/components/ButtonContent.d.ts +2 -0
- package/dist/components/ButtonContent.js +2 -0
- package/dist/components/ButtonRow/ButtonRow.cjs +2 -0
- package/dist/components/ButtonRow/ButtonRow.cjs.map +1 -0
- package/dist/components/ButtonRow/ButtonRow.js +31 -0
- package/dist/components/ButtonRow/ButtonRow.js.map +1 -0
- package/dist/components/ButtonRow/ButtonRow.module.css.cjs +2 -0
- package/dist/components/ButtonRow/ButtonRow.module.css.cjs.map +1 -0
- package/dist/components/ButtonRow/ButtonRow.module.css.js +13 -0
- package/dist/components/ButtonRow/ButtonRow.module.css.js.map +1 -0
- package/dist/components/ButtonRow.cjs +1 -0
- package/dist/components/ButtonRow.d.ts +2 -0
- package/dist/components/ButtonRow.js +2 -0
- package/dist/components/Card/Card.cjs +2 -0
- package/dist/components/Card/Card.cjs.map +1 -0
- package/dist/components/Card/Card.js +19 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/Card.module.css.cjs +2 -0
- package/dist/components/Card/Card.module.css.cjs.map +1 -0
- package/dist/components/Card/Card.module.css.js +13 -0
- package/dist/components/Card/Card.module.css.js.map +1 -0
- package/dist/components/Card.cjs +1 -0
- package/dist/components/Card.d.ts +2 -0
- package/dist/components/Card.js +2 -0
- package/dist/components/Carousel/Carousel.cjs +2 -0
- package/dist/components/Carousel/Carousel.cjs.map +1 -0
- package/dist/components/Carousel/Carousel.js +112 -0
- package/dist/components/Carousel/Carousel.js.map +1 -0
- package/dist/components/Carousel/Carousel.module.css.cjs +2 -0
- package/dist/components/Carousel/Carousel.module.css.cjs.map +1 -0
- package/dist/components/Carousel/Carousel.module.css.js +16 -0
- package/dist/components/Carousel/Carousel.module.css.js.map +1 -0
- package/dist/components/Carousel.cjs +1 -0
- package/dist/components/Carousel.d.ts +2 -0
- package/dist/components/Carousel.js +2 -0
- package/dist/components/CheckRow/CheckRow.cjs +2 -0
- package/dist/components/CheckRow/CheckRow.cjs.map +1 -0
- package/dist/components/CheckRow/CheckRow.js +66 -0
- package/dist/components/CheckRow/CheckRow.js.map +1 -0
- package/dist/components/CheckRow/CheckRow.module.css.cjs +2 -0
- package/dist/components/CheckRow/CheckRow.module.css.cjs.map +1 -0
- package/dist/components/CheckRow/CheckRow.module.css.js +16 -0
- package/dist/components/CheckRow/CheckRow.module.css.js.map +1 -0
- package/dist/components/CheckRow.cjs +1 -0
- package/dist/components/CheckRow.d.ts +2 -0
- package/dist/components/CheckRow.js +2 -0
- package/dist/components/Checkbox/Checkbox.cjs +2 -0
- package/dist/components/Checkbox/Checkbox.cjs.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +19 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.module.css.cjs +2 -0
- package/dist/components/Checkbox/Checkbox.module.css.cjs.map +1 -0
- package/dist/components/Checkbox/Checkbox.module.css.js +5 -0
- package/dist/components/Checkbox/Checkbox.module.css.js.map +1 -0
- package/dist/components/Checkbox.cjs +1 -0
- package/dist/components/Checkbox.d.ts +2 -0
- package/dist/components/Checkbox.js +2 -0
- package/dist/components/Chip/Chip.cjs +2 -0
- package/dist/components/Chip/Chip.cjs.map +1 -0
- package/dist/components/Chip/Chip.js +61 -0
- package/dist/components/Chip/Chip.js.map +1 -0
- package/dist/components/Chip/Chip.module.css.cjs +2 -0
- package/dist/components/Chip/Chip.module.css.cjs.map +1 -0
- package/dist/components/Chip/Chip.module.css.js +13 -0
- package/dist/components/Chip/Chip.module.css.js.map +1 -0
- package/dist/components/Chip.cjs +1 -0
- package/dist/components/Chip.d.ts +2 -0
- package/dist/components/Chip.js +2 -0
- package/dist/components/Clamp/Clamp.cjs +2 -0
- package/dist/components/Clamp/Clamp.cjs.map +1 -0
- package/dist/components/Clamp/Clamp.js +18 -0
- package/dist/components/Clamp/Clamp.js.map +1 -0
- package/dist/components/Clamp/Clamp.module.css.cjs +2 -0
- package/dist/components/Clamp/Clamp.module.css.cjs.map +1 -0
- package/dist/components/Clamp/Clamp.module.css.js +5 -0
- package/dist/components/Clamp/Clamp.module.css.js.map +1 -0
- package/dist/components/Clamp.cjs +1 -0
- package/dist/components/Clamp.d.ts +2 -0
- package/dist/components/Clamp.js +2 -0
- package/dist/components/ColorPicker/ColorPicker.cjs +2 -0
- package/dist/components/ColorPicker/ColorPicker.cjs.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.js +152 -0
- package/dist/components/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.module.css.cjs +2 -0
- package/dist/components/ColorPicker/ColorPicker.module.css.cjs.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.module.css.js +17 -0
- package/dist/components/ColorPicker/ColorPicker.module.css.js.map +1 -0
- package/dist/components/ColorPicker.cjs +1 -0
- package/dist/components/ColorPicker.d.ts +2 -0
- package/dist/components/ColorPicker.js +2 -0
- package/dist/components/ColumnView/ColumnView.cjs +2 -0
- package/dist/components/ColumnView/ColumnView.cjs.map +1 -0
- package/dist/components/ColumnView/ColumnView.js +153 -0
- package/dist/components/ColumnView/ColumnView.js.map +1 -0
- package/dist/components/ColumnView/ColumnView.module.css.cjs +2 -0
- package/dist/components/ColumnView/ColumnView.module.css.cjs.map +1 -0
- package/dist/components/ColumnView/ColumnView.module.css.js +28 -0
- package/dist/components/ColumnView/ColumnView.module.css.js.map +1 -0
- package/dist/components/ColumnView.cjs +1 -0
- package/dist/components/ColumnView.d.ts +2 -0
- package/dist/components/ColumnView.js +2 -0
- package/dist/components/ComboRow/ComboRow.cjs +2 -0
- package/dist/components/ComboRow/ComboRow.cjs.map +1 -0
- package/dist/components/ComboRow/ComboRow.js +197 -0
- package/dist/components/ComboRow/ComboRow.js.map +1 -0
- package/dist/components/ComboRow/ComboRow.module.css.cjs +2 -0
- package/dist/components/ComboRow/ComboRow.module.css.cjs.map +1 -0
- package/dist/components/ComboRow/ComboRow.module.css.js +31 -0
- package/dist/components/ComboRow/ComboRow.module.css.js.map +1 -0
- package/dist/components/ComboRow.cjs +1 -0
- package/dist/components/ComboRow.d.ts +2 -0
- package/dist/components/ComboRow.js +2 -0
- package/dist/components/ContributionGraph/ContributionGraph.cjs +2 -0
- package/dist/components/ContributionGraph/ContributionGraph.cjs.map +1 -0
- package/dist/components/ContributionGraph/ContributionGraph.js +248 -0
- package/dist/components/ContributionGraph/ContributionGraph.js.map +1 -0
- package/dist/components/ContributionGraph/ContributionGraph.module.css.cjs +2 -0
- package/dist/components/ContributionGraph/ContributionGraph.module.css.cjs.map +1 -0
- package/dist/components/ContributionGraph/ContributionGraph.module.css.js +14 -0
- package/dist/components/ContributionGraph/ContributionGraph.module.css.js.map +1 -0
- package/dist/components/ContributionGraph.cjs +1 -0
- package/dist/components/ContributionGraph.d.ts +2 -0
- package/dist/components/ContributionGraph.js +2 -0
- package/dist/components/CountDownTimer/CountDownTimer.cjs +2 -0
- package/dist/components/CountDownTimer/CountDownTimer.cjs.map +1 -0
- package/dist/components/CountDownTimer/CountDownTimer.js +57 -0
- package/dist/components/CountDownTimer/CountDownTimer.js.map +1 -0
- package/dist/components/CountDownTimer/CountDownTimer.module.css.cjs +2 -0
- package/dist/components/CountDownTimer/CountDownTimer.module.css.cjs.map +1 -0
- package/dist/components/CountDownTimer/CountDownTimer.module.css.js +13 -0
- package/dist/components/CountDownTimer/CountDownTimer.module.css.js.map +1 -0
- package/dist/components/CountDownTimer.cjs +1 -0
- package/dist/components/CountDownTimer.d.ts +2 -0
- package/dist/components/CountDownTimer.js +2 -0
- package/dist/components/Dialog/Dialog.cjs +2 -0
- package/dist/components/Dialog/Dialog.cjs.map +1 -0
- package/dist/components/Dialog/Dialog.js +78 -0
- package/dist/components/Dialog/Dialog.js.map +1 -0
- package/dist/components/Dialog/Dialog.module.css.cjs +2 -0
- package/dist/components/Dialog/Dialog.module.css.cjs.map +1 -0
- package/dist/components/Dialog/Dialog.module.css.js +18 -0
- package/dist/components/Dialog/Dialog.module.css.js.map +1 -0
- package/dist/components/Dialog/dialogUtils.cjs +2 -0
- package/dist/components/Dialog/dialogUtils.cjs.map +1 -0
- package/dist/components/Dialog/dialogUtils.js +33 -0
- package/dist/components/Dialog/dialogUtils.js.map +1 -0
- package/dist/components/Dialog.cjs +1 -0
- package/dist/components/Dialog.d.ts +2 -0
- package/dist/components/Dialog.js +2 -0
- package/dist/components/Dropdown/Dropdown.cjs +2 -0
- package/dist/components/Dropdown/Dropdown.cjs.map +1 -0
- package/dist/components/Dropdown/Dropdown.js +159 -0
- package/dist/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/components/Dropdown/Dropdown.module.css.cjs +2 -0
- package/dist/components/Dropdown/Dropdown.module.css.cjs.map +1 -0
- package/dist/components/Dropdown/Dropdown.module.css.js +27 -0
- package/dist/components/Dropdown/Dropdown.module.css.js.map +1 -0
- package/dist/components/Dropdown.cjs +1 -0
- package/dist/components/Dropdown.d.ts +2 -0
- package/dist/components/Dropdown.js +2 -0
- package/dist/components/EntryRow/EntryRow.cjs +2 -0
- package/dist/components/EntryRow/EntryRow.cjs.map +1 -0
- package/dist/components/EntryRow/EntryRow.js +50 -0
- package/dist/components/EntryRow/EntryRow.js.map +1 -0
- package/dist/components/EntryRow/EntryRow.module.css.cjs +2 -0
- package/dist/components/EntryRow/EntryRow.module.css.cjs.map +1 -0
- package/dist/components/EntryRow/EntryRow.module.css.js +16 -0
- package/dist/components/EntryRow/EntryRow.module.css.js.map +1 -0
- package/dist/components/EntryRow.cjs +1 -0
- package/dist/components/EntryRow.d.ts +2 -0
- package/dist/components/EntryRow.js +2 -0
- package/dist/components/ExpanderRow/ExpanderRow.cjs +2 -0
- package/dist/components/ExpanderRow/ExpanderRow.cjs.map +1 -0
- package/dist/components/ExpanderRow/ExpanderRow.js +81 -0
- package/dist/components/ExpanderRow/ExpanderRow.js.map +1 -0
- package/dist/components/ExpanderRow/ExpanderRow.module.css.cjs +2 -0
- package/dist/components/ExpanderRow/ExpanderRow.module.css.cjs.map +1 -0
- package/dist/components/ExpanderRow/ExpanderRow.module.css.js +20 -0
- package/dist/components/ExpanderRow/ExpanderRow.module.css.js.map +1 -0
- package/dist/components/ExpanderRow.cjs +1 -0
- package/dist/components/ExpanderRow.d.ts +2 -0
- package/dist/components/ExpanderRow.js +2 -0
- package/dist/components/Footer/Footer.cjs +2 -0
- package/dist/components/Footer/Footer.cjs.map +1 -0
- package/dist/components/Footer/Footer.js +31 -0
- package/dist/components/Footer/Footer.js.map +1 -0
- package/dist/components/Footer/Footer.module.css.cjs +2 -0
- package/dist/components/Footer/Footer.module.css.cjs.map +1 -0
- package/dist/components/Footer/Footer.module.css.js +11 -0
- package/dist/components/Footer/Footer.module.css.js.map +1 -0
- package/dist/components/Footer.cjs +1 -0
- package/dist/components/Footer.d.ts +2 -0
- package/dist/components/Footer.js +2 -0
- package/dist/components/Frame/Frame.cjs +2 -0
- package/dist/components/Frame/Frame.cjs.map +1 -0
- package/dist/components/Frame/Frame.js +14 -0
- package/dist/components/Frame/Frame.js.map +1 -0
- package/dist/components/Frame/Frame.module.css.cjs +2 -0
- package/dist/components/Frame/Frame.module.css.cjs.map +1 -0
- package/dist/components/Frame/Frame.module.css.js +5 -0
- package/dist/components/Frame/Frame.module.css.js.map +1 -0
- package/dist/components/Frame.cjs +1 -0
- package/dist/components/Frame.d.ts +2 -0
- package/dist/components/Frame.js +2 -0
- package/dist/components/HeaderBar/HeaderBar.cjs +2 -0
- package/dist/components/HeaderBar/HeaderBar.cjs.map +1 -0
- package/dist/components/HeaderBar/HeaderBar.js +35 -0
- package/dist/components/HeaderBar/HeaderBar.js.map +1 -0
- package/dist/components/HeaderBar/HeaderBar.module.css.cjs +2 -0
- package/dist/components/HeaderBar/HeaderBar.module.css.cjs.map +1 -0
- package/dist/components/HeaderBar/HeaderBar.module.css.js +12 -0
- package/dist/components/HeaderBar/HeaderBar.module.css.js.map +1 -0
- package/dist/components/HeaderBar.cjs +1 -0
- package/dist/components/HeaderBar.d.ts +2 -0
- package/dist/components/HeaderBar.js +2 -0
- package/dist/components/Icon/Icon.cjs +2 -0
- package/dist/components/Icon/Icon.cjs.map +1 -0
- package/dist/components/Icon/Icon.js +31 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/Icon.cjs +1 -0
- package/dist/components/Icon.d.ts +2 -0
- package/dist/components/Icon.js +2 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs +2 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs.map +1 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js +47 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js.map +1 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.cjs +2 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.cjs.map +1 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.js +16 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.js.map +1 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.cjs +2 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.cjs.map +1 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.js +38 -0
- package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.js.map +1 -0
- package/dist/components/InlineViewSwitcher.cjs +1 -0
- package/dist/components/InlineViewSwitcher.d.ts +2 -0
- package/dist/components/InlineViewSwitcher.js +3 -0
- package/dist/components/Link/Link.cjs +2 -0
- package/dist/components/Link/Link.cjs.map +1 -0
- package/dist/components/Link/Link.js +21 -0
- package/dist/components/Link/Link.js.map +1 -0
- package/dist/components/Link/Link.module.css.cjs +2 -0
- package/dist/components/Link/Link.module.css.cjs.map +1 -0
- package/dist/components/Link/Link.module.css.js +8 -0
- package/dist/components/Link/Link.module.css.js.map +1 -0
- package/dist/components/Link.cjs +1 -0
- package/dist/components/Link.d.ts +2 -0
- package/dist/components/Link.js +2 -0
- package/dist/components/LinkedGroup/LinkedGroup.cjs +2 -0
- package/dist/components/LinkedGroup/LinkedGroup.cjs.map +1 -0
- package/dist/components/LinkedGroup/LinkedGroup.js +18 -0
- package/dist/components/LinkedGroup/LinkedGroup.js.map +1 -0
- package/dist/components/LinkedGroup/LinkedGroup.module.css.cjs +2 -0
- package/dist/components/LinkedGroup/LinkedGroup.module.css.cjs.map +1 -0
- package/dist/components/LinkedGroup/LinkedGroup.module.css.js +8 -0
- package/dist/components/LinkedGroup/LinkedGroup.module.css.js.map +1 -0
- package/dist/components/LinkedGroup.cjs +1 -0
- package/dist/components/LinkedGroup.d.ts +2 -0
- package/dist/components/LinkedGroup.js +2 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.cjs +2 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.cjs.map +1 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.js +39 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.js.map +1 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.module.css.cjs +2 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.module.css.cjs.map +1 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.module.css.js +14 -0
- package/dist/components/NavigationSplitView/NavigationSplitView.module.css.js.map +1 -0
- package/dist/components/NavigationSplitView.cjs +1 -0
- package/dist/components/NavigationSplitView.d.ts +2 -0
- package/dist/components/NavigationSplitView.js +2 -0
- package/dist/components/NavigationView/NavigationView.cjs +2 -0
- package/dist/components/NavigationView/NavigationView.cjs.map +1 -0
- package/dist/components/NavigationView/NavigationView.js +60 -0
- package/dist/components/NavigationView/NavigationView.js.map +1 -0
- package/dist/components/NavigationView/NavigationView.module.css.cjs +2 -0
- package/dist/components/NavigationView/NavigationView.module.css.cjs.map +1 -0
- package/dist/components/NavigationView/NavigationView.module.css.js +16 -0
- package/dist/components/NavigationView/NavigationView.module.css.js.map +1 -0
- package/dist/components/NavigationView.cjs +1 -0
- package/dist/components/NavigationView.d.ts +2 -0
- package/dist/components/NavigationView.js +2 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.cjs +2 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.cjs.map +1 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.js +75 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.js.map +1 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.module.css.cjs +2 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.module.css.cjs.map +1 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.module.css.js +18 -0
- package/dist/components/OverlaySplitView/OverlaySplitView.module.css.js.map +1 -0
- package/dist/components/OverlaySplitView.cjs +1 -0
- package/dist/components/OverlaySplitView.d.ts +2 -0
- package/dist/components/OverlaySplitView.js +2 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.cjs +2 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.cjs.map +1 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.js +35 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.js.map +1 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.cjs +2 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.cjs.map +1 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.js +5 -0
- package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.js.map +1 -0
- package/dist/components/PasswordEntryRow.cjs +1 -0
- package/dist/components/PasswordEntryRow.d.ts +2 -0
- package/dist/components/PasswordEntryRow.js +2 -0
- package/dist/components/PathBar/PathBar.cjs +2 -0
- package/dist/components/PathBar/PathBar.cjs.map +1 -0
- package/dist/components/PathBar/PathBar.js +59 -0
- package/dist/components/PathBar/PathBar.js.map +1 -0
- package/dist/components/PathBar/PathBar.module.css.cjs +2 -0
- package/dist/components/PathBar/PathBar.module.css.cjs.map +1 -0
- package/dist/components/PathBar/PathBar.module.css.js +13 -0
- package/dist/components/PathBar/PathBar.module.css.js.map +1 -0
- package/dist/components/PathBar.cjs +1 -0
- package/dist/components/PathBar.d.ts +2 -0
- package/dist/components/PathBar.js +2 -0
- package/dist/components/Popover/Popover.cjs +2 -0
- package/dist/components/Popover/Popover.cjs.map +1 -0
- package/dist/components/Popover/Popover.js +157 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/Popover.module.css.cjs +2 -0
- package/dist/components/Popover/Popover.module.css.cjs.map +1 -0
- package/dist/components/Popover/Popover.module.css.js +13 -0
- package/dist/components/Popover/Popover.module.css.js.map +1 -0
- package/dist/components/Popover.cjs +1 -0
- package/dist/components/Popover.d.ts +2 -0
- package/dist/components/Popover.js +2 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.cjs +2 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.cjs.map +1 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.js +119 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.js.map +1 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.module.css.cjs +2 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.module.css.cjs.map +1 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.module.css.js +25 -0
- package/dist/components/PreferencesDialog/PreferencesDialog.module.css.js.map +1 -0
- package/dist/components/PreferencesDialog.cjs +1 -0
- package/dist/components/PreferencesDialog.d.ts +2 -0
- package/dist/components/PreferencesDialog.js +2 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.cjs +2 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.cjs.map +1 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.js +33 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.js.map +1 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.module.css.cjs +2 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.module.css.cjs.map +1 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.module.css.js +13 -0
- package/dist/components/PreferencesGroup/PreferencesGroup.module.css.js.map +1 -0
- package/dist/components/PreferencesGroup.cjs +1 -0
- package/dist/components/PreferencesGroup.d.ts +2 -0
- package/dist/components/PreferencesGroup.js +2 -0
- package/dist/components/PreferencesPage/PreferencesPage.cjs +2 -0
- package/dist/components/PreferencesPage/PreferencesPage.cjs.map +1 -0
- package/dist/components/PreferencesPage/PreferencesPage.js +18 -0
- package/dist/components/PreferencesPage/PreferencesPage.js.map +1 -0
- package/dist/components/PreferencesPage/PreferencesPage.module.css.cjs +2 -0
- package/dist/components/PreferencesPage/PreferencesPage.module.css.cjs.map +1 -0
- package/dist/components/PreferencesPage/PreferencesPage.module.css.js +8 -0
- package/dist/components/PreferencesPage/PreferencesPage.module.css.js.map +1 -0
- package/dist/components/PreferencesPage.cjs +1 -0
- package/dist/components/PreferencesPage.d.ts +2 -0
- package/dist/components/PreferencesPage.js +2 -0
- package/dist/components/ProgressBar/ProgressBar.cjs +2 -0
- package/dist/components/ProgressBar/ProgressBar.cjs.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.js +28 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.module.css.cjs +2 -0
- package/dist/components/ProgressBar/ProgressBar.module.css.cjs.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.module.css.js +14 -0
- package/dist/components/ProgressBar/ProgressBar.module.css.js.map +1 -0
- package/dist/components/ProgressBar.cjs +1 -0
- package/dist/components/ProgressBar.d.ts +2 -0
- package/dist/components/ProgressBar.js +2 -0
- package/dist/components/RadioButton/RadioButton.cjs +2 -0
- package/dist/components/RadioButton/RadioButton.cjs.map +1 -0
- package/dist/components/RadioButton/RadioButton.js +14 -0
- package/dist/components/RadioButton/RadioButton.js.map +1 -0
- package/dist/components/RadioButton/RadioButton.module.css.cjs +2 -0
- package/dist/components/RadioButton/RadioButton.module.css.cjs.map +1 -0
- package/dist/components/RadioButton/RadioButton.module.css.js +5 -0
- package/dist/components/RadioButton/RadioButton.module.css.js.map +1 -0
- package/dist/components/RadioButton.cjs +1 -0
- package/dist/components/RadioButton.d.ts +2 -0
- package/dist/components/RadioButton.js +2 -0
- package/dist/components/SearchBar/SearchBar.cjs +2 -0
- package/dist/components/SearchBar/SearchBar.cjs.map +1 -0
- package/dist/components/SearchBar/SearchBar.js +160 -0
- package/dist/components/SearchBar/SearchBar.js.map +1 -0
- package/dist/components/SearchBar/SearchBar.module.css.cjs +2 -0
- package/dist/components/SearchBar/SearchBar.module.css.cjs.map +1 -0
- package/dist/components/SearchBar/SearchBar.module.css.js +19 -0
- package/dist/components/SearchBar/SearchBar.module.css.js.map +1 -0
- package/dist/components/SearchBar.cjs +1 -0
- package/dist/components/SearchBar.d.ts +2 -0
- package/dist/components/SearchBar.js +2 -0
- package/dist/components/Separator/Separator.cjs +2 -0
- package/dist/components/Separator/Separator.cjs.map +1 -0
- package/dist/components/Separator/Separator.js +23 -0
- package/dist/components/Separator/Separator.js.map +1 -0
- package/dist/components/Separator/Separator.module.css.cjs +2 -0
- package/dist/components/Separator/Separator.module.css.cjs.map +1 -0
- package/dist/components/Separator/Separator.module.css.js +9 -0
- package/dist/components/Separator/Separator.module.css.js.map +1 -0
- package/dist/components/Separator.cjs +1 -0
- package/dist/components/Separator.d.ts +2 -0
- package/dist/components/Separator.js +2 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.cjs +2 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.cjs.map +1 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.js +50 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.js.map +1 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.module.css.cjs +2 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.module.css.cjs.map +1 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.module.css.js +8 -0
- package/dist/components/ShortcutLabel/ShortcutLabel.module.css.js.map +1 -0
- package/dist/components/ShortcutLabel.cjs +1 -0
- package/dist/components/ShortcutLabel.d.ts +2 -0
- package/dist/components/ShortcutLabel.js +2 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs +2 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs.map +1 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.js +129 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.js.map +1 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.cjs +2 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.cjs.map +1 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.js +28 -0
- package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.js.map +1 -0
- package/dist/components/ShortcutsDialog.cjs +1 -0
- package/dist/components/ShortcutsDialog.d.ts +2 -0
- package/dist/components/ShortcutsDialog.js +2 -0
- package/dist/components/Sidebar/Sidebar.cjs +2 -0
- package/dist/components/Sidebar/Sidebar.cjs.map +1 -0
- package/dist/components/Sidebar/Sidebar.js +69 -0
- package/dist/components/Sidebar/Sidebar.js.map +1 -0
- package/dist/components/Sidebar/Sidebar.module.css.cjs +2 -0
- package/dist/components/Sidebar/Sidebar.module.css.cjs.map +1 -0
- package/dist/components/Sidebar/Sidebar.module.css.js +39 -0
- package/dist/components/Sidebar/Sidebar.module.css.js.map +1 -0
- package/dist/components/Sidebar/SidebarItem.cjs +2 -0
- package/dist/components/Sidebar/SidebarItem.cjs.map +1 -0
- package/dist/components/Sidebar/SidebarItem.js +105 -0
- package/dist/components/Sidebar/SidebarItem.js.map +1 -0
- package/dist/components/Sidebar/SidebarSection.cjs +2 -0
- package/dist/components/Sidebar/SidebarSection.cjs.map +1 -0
- package/dist/components/Sidebar/SidebarSection.js +89 -0
- package/dist/components/Sidebar/SidebarSection.js.map +1 -0
- package/dist/components/Sidebar.cjs +1 -0
- package/dist/components/Sidebar.d.ts +2 -0
- package/dist/components/Sidebar.js +4 -0
- package/dist/components/Slider/Slider.cjs +2 -0
- package/dist/components/Slider/Slider.cjs.map +1 -0
- package/dist/components/Slider/Slider.js +122 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Slider/Slider.module.css.cjs +2 -0
- package/dist/components/Slider/Slider.module.css.cjs.map +1 -0
- package/dist/components/Slider/Slider.module.css.js +15 -0
- package/dist/components/Slider/Slider.module.css.js.map +1 -0
- package/dist/components/Slider.cjs +1 -0
- package/dist/components/Slider.d.ts +2 -0
- package/dist/components/Slider.js +2 -0
- package/dist/components/SpinButton/SpinButton.cjs +2 -0
- package/dist/components/SpinButton/SpinButton.cjs.map +1 -0
- package/dist/components/SpinButton/SpinButton.js +92 -0
- package/dist/components/SpinButton/SpinButton.js.map +1 -0
- package/dist/components/SpinButton/SpinButton.module.css.cjs +2 -0
- package/dist/components/SpinButton/SpinButton.module.css.cjs.map +1 -0
- package/dist/components/SpinButton/SpinButton.module.css.js +10 -0
- package/dist/components/SpinButton/SpinButton.module.css.js.map +1 -0
- package/dist/components/SpinButton.cjs +1 -0
- package/dist/components/SpinButton.d.ts +2 -0
- package/dist/components/SpinButton.js +2 -0
- package/dist/components/SpinRow/SpinRow.cjs +2 -0
- package/dist/components/SpinRow/SpinRow.cjs.map +1 -0
- package/dist/components/SpinRow/SpinRow.js +119 -0
- package/dist/components/SpinRow/SpinRow.js.map +1 -0
- package/dist/components/SpinRow/SpinRow.module.css.cjs +2 -0
- package/dist/components/SpinRow/SpinRow.module.css.cjs.map +1 -0
- package/dist/components/SpinRow/SpinRow.module.css.js +15 -0
- package/dist/components/SpinRow/SpinRow.module.css.js.map +1 -0
- package/dist/components/SpinRow.cjs +1 -0
- package/dist/components/SpinRow.d.ts +2 -0
- package/dist/components/SpinRow.js +2 -0
- package/dist/components/Spinner/Spinner.cjs +2 -0
- package/dist/components/Spinner/Spinner.cjs.map +1 -0
- package/dist/components/Spinner/Spinner.js +21 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Spinner/Spinner.module.css.cjs +2 -0
- package/dist/components/Spinner/Spinner.module.css.cjs.map +1 -0
- package/dist/components/Spinner/Spinner.module.css.js +11 -0
- package/dist/components/Spinner/Spinner.module.css.js.map +1 -0
- package/dist/components/Spinner.cjs +1 -0
- package/dist/components/Spinner.d.ts +2 -0
- package/dist/components/Spinner.js +2 -0
- package/dist/components/SplitButton/SplitButton.cjs +2 -0
- package/dist/components/SplitButton/SplitButton.cjs.map +1 -0
- package/dist/components/SplitButton/SplitButton.js +104 -0
- package/dist/components/SplitButton/SplitButton.js.map +1 -0
- package/dist/components/SplitButton/SplitButton.module.css.cjs +2 -0
- package/dist/components/SplitButton/SplitButton.module.css.cjs.map +1 -0
- package/dist/components/SplitButton/SplitButton.module.css.js +16 -0
- package/dist/components/SplitButton/SplitButton.module.css.js.map +1 -0
- package/dist/components/SplitButton.cjs +1 -0
- package/dist/components/SplitButton.d.ts +2 -0
- package/dist/components/SplitButton.js +2 -0
- package/dist/components/StatusBadge/StatusBadge.cjs +2 -0
- package/dist/components/StatusBadge/StatusBadge.cjs.map +1 -0
- package/dist/components/StatusBadge/StatusBadge.js +18 -0
- package/dist/components/StatusBadge/StatusBadge.js.map +1 -0
- package/dist/components/StatusBadge/StatusBadge.module.css.cjs +2 -0
- package/dist/components/StatusBadge/StatusBadge.module.css.cjs.map +1 -0
- package/dist/components/StatusBadge/StatusBadge.module.css.js +13 -0
- package/dist/components/StatusBadge/StatusBadge.module.css.js.map +1 -0
- package/dist/components/StatusBadge.cjs +1 -0
- package/dist/components/StatusBadge.d.ts +2 -0
- package/dist/components/StatusBadge.js +2 -0
- package/dist/components/StatusPage/StatusPage.cjs +2 -0
- package/dist/components/StatusPage/StatusPage.cjs.map +1 -0
- package/dist/components/StatusPage/StatusPage.js +43 -0
- package/dist/components/StatusPage/StatusPage.js.map +1 -0
- package/dist/components/StatusPage/StatusPage.module.css.cjs +2 -0
- package/dist/components/StatusPage/StatusPage.module.css.cjs.map +1 -0
- package/dist/components/StatusPage/StatusPage.module.css.js +12 -0
- package/dist/components/StatusPage/StatusPage.module.css.js.map +1 -0
- package/dist/components/StatusPage.cjs +1 -0
- package/dist/components/StatusPage.d.ts +2 -0
- package/dist/components/StatusPage.js +2 -0
- package/dist/components/Switch/Switch.cjs +2 -0
- package/dist/components/Switch/Switch.cjs.map +1 -0
- package/dist/components/Switch/Switch.js +15 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/Switch.module.css.cjs +2 -0
- package/dist/components/Switch/Switch.module.css.cjs.map +1 -0
- package/dist/components/Switch/Switch.module.css.js +6 -0
- package/dist/components/Switch/Switch.module.css.js.map +1 -0
- package/dist/components/Switch.cjs +1 -0
- package/dist/components/Switch.d.ts +2 -0
- package/dist/components/Switch.js +2 -0
- package/dist/components/SwitchRow/SwitchRow.cjs +2 -0
- package/dist/components/SwitchRow/SwitchRow.cjs.map +1 -0
- package/dist/components/SwitchRow/SwitchRow.js +49 -0
- package/dist/components/SwitchRow/SwitchRow.js.map +1 -0
- package/dist/components/SwitchRow/SwitchRow.module.css.cjs +2 -0
- package/dist/components/SwitchRow/SwitchRow.module.css.cjs.map +1 -0
- package/dist/components/SwitchRow/SwitchRow.module.css.js +15 -0
- package/dist/components/SwitchRow/SwitchRow.module.css.js.map +1 -0
- package/dist/components/SwitchRow.cjs +1 -0
- package/dist/components/SwitchRow.d.ts +2 -0
- package/dist/components/SwitchRow.js +2 -0
- package/dist/components/Tabs/TabBar.cjs +2 -0
- package/dist/components/Tabs/TabBar.cjs.map +1 -0
- package/dist/components/Tabs/TabBar.js +38 -0
- package/dist/components/Tabs/TabBar.js.map +1 -0
- package/dist/components/Tabs/TabItem.cjs +2 -0
- package/dist/components/Tabs/TabItem.cjs.map +1 -0
- package/dist/components/Tabs/TabItem.js +52 -0
- package/dist/components/Tabs/TabItem.js.map +1 -0
- package/dist/components/Tabs/TabPanel.cjs +2 -0
- package/dist/components/Tabs/TabPanel.cjs.map +1 -0
- package/dist/components/Tabs/TabPanel.js +18 -0
- package/dist/components/Tabs/TabPanel.js.map +1 -0
- package/dist/components/Tabs/Tabs.module.css.cjs +2 -0
- package/dist/components/Tabs/Tabs.module.css.cjs.map +1 -0
- package/dist/components/Tabs/Tabs.module.css.js +15 -0
- package/dist/components/Tabs/Tabs.module.css.js.map +1 -0
- package/dist/components/Tabs.cjs +1 -0
- package/dist/components/Tabs.d.ts +2 -0
- package/dist/components/Tabs.js +4 -0
- package/dist/components/TerminalView/TerminalView.cjs +2 -0
- package/dist/components/TerminalView/TerminalView.cjs.map +1 -0
- package/dist/components/TerminalView/TerminalView.js +28 -0
- package/dist/components/TerminalView/TerminalView.js.map +1 -0
- package/dist/components/TerminalView/TerminalView.module.css.cjs +2 -0
- package/dist/components/TerminalView/TerminalView.module.css.cjs.map +1 -0
- package/dist/components/TerminalView/TerminalView.module.css.js +12 -0
- package/dist/components/TerminalView/TerminalView.module.css.js.map +1 -0
- package/dist/components/TerminalView.cjs +1 -0
- package/dist/components/TerminalView.d.ts +2 -0
- package/dist/components/TerminalView.js +2 -0
- package/dist/components/Text/Text.cjs +2 -0
- package/dist/components/Text/Text.cjs.map +1 -0
- package/dist/components/Text/Text.js +33 -0
- package/dist/components/Text/Text.js.map +1 -0
- package/dist/components/Text/Text.module.css.cjs +2 -0
- package/dist/components/Text/Text.module.css.cjs.map +1 -0
- package/dist/components/Text/Text.module.css.js +27 -0
- package/dist/components/Text/Text.module.css.js.map +1 -0
- package/dist/components/Text.cjs +1 -0
- package/dist/components/Text.d.ts +2 -0
- package/dist/components/Text.js +2 -0
- package/dist/components/TextField/TextField.cjs +2 -0
- package/dist/components/TextField/TextField.cjs.map +1 -0
- package/dist/components/TextField/TextField.js +38 -0
- package/dist/components/TextField/TextField.js.map +1 -0
- package/dist/components/TextField/TextField.module.css.cjs +2 -0
- package/dist/components/TextField/TextField.module.css.cjs.map +1 -0
- package/dist/components/TextField/TextField.module.css.js +13 -0
- package/dist/components/TextField/TextField.module.css.js.map +1 -0
- package/dist/components/TextField.cjs +1 -0
- package/dist/components/TextField.d.ts +2 -0
- package/dist/components/TextField.js +2 -0
- package/dist/components/Timeline/Timeline.cjs +2 -0
- package/dist/components/Timeline/Timeline.cjs.map +1 -0
- package/dist/components/Timeline/Timeline.js +71 -0
- package/dist/components/Timeline/Timeline.js.map +1 -0
- package/dist/components/Timeline/Timeline.module.css.cjs +2 -0
- package/dist/components/Timeline/Timeline.module.css.cjs.map +1 -0
- package/dist/components/Timeline/Timeline.module.css.js +19 -0
- package/dist/components/Timeline/Timeline.module.css.js.map +1 -0
- package/dist/components/Timeline.cjs +1 -0
- package/dist/components/Timeline.d.ts +2 -0
- package/dist/components/Timeline.js +2 -0
- package/dist/components/Toast/Toast.cjs +2 -0
- package/dist/components/Toast/Toast.cjs.map +1 -0
- package/dist/components/Toast/Toast.js +63 -0
- package/dist/components/Toast/Toast.js.map +1 -0
- package/dist/components/Toast/Toast.module.css.cjs +2 -0
- package/dist/components/Toast/Toast.module.css.cjs.map +1 -0
- package/dist/components/Toast/Toast.module.css.js +16 -0
- package/dist/components/Toast/Toast.module.css.js.map +1 -0
- package/dist/components/Toast/Toaster.cjs +2 -0
- package/dist/components/Toast/Toaster.cjs.map +1 -0
- package/dist/components/Toast/Toaster.js +21 -0
- package/dist/components/Toast/Toaster.js.map +1 -0
- package/dist/components/Toast.cjs +1 -0
- package/dist/components/Toast.d.ts +2 -0
- package/dist/components/Toast.js +3 -0
- package/dist/components/ToggleGroup/ToggleGroup.cjs +2 -0
- package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.js +43 -0
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.css.cjs +2 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.css.cjs.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.css.js +12 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.css.js.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroupItem.cjs +2 -0
- package/dist/components/ToggleGroup/ToggleGroupItem.cjs.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroupItem.js +38 -0
- package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -0
- package/dist/components/ToggleGroup.cjs +1 -0
- package/dist/components/ToggleGroup.d.ts +2 -0
- package/dist/components/ToggleGroup.js +3 -0
- package/dist/components/Toolbar/Spacer.cjs +2 -0
- package/dist/components/Toolbar/Spacer.cjs.map +1 -0
- package/dist/components/Toolbar/Spacer.js +14 -0
- package/dist/components/Toolbar/Spacer.js.map +1 -0
- package/dist/components/Toolbar/Toolbar.cjs +2 -0
- package/dist/components/Toolbar/Toolbar.cjs.map +1 -0
- package/dist/components/Toolbar/Toolbar.js +14 -0
- package/dist/components/Toolbar/Toolbar.js.map +1 -0
- package/dist/components/Toolbar/Toolbar.module.css.cjs +2 -0
- package/dist/components/Toolbar/Toolbar.module.css.cjs.map +1 -0
- package/dist/components/Toolbar/Toolbar.module.css.js +8 -0
- package/dist/components/Toolbar/Toolbar.module.css.js.map +1 -0
- package/dist/components/Toolbar.cjs +1 -0
- package/dist/components/Toolbar.d.ts +2 -0
- package/dist/components/Toolbar.js +3 -0
- package/dist/components/ToolbarView/ToolbarView.cjs +2 -0
- package/dist/components/ToolbarView/ToolbarView.cjs.map +1 -0
- package/dist/components/ToolbarView/ToolbarView.js +27 -0
- package/dist/components/ToolbarView/ToolbarView.js.map +1 -0
- package/dist/components/ToolbarView/ToolbarView.module.css.cjs +2 -0
- package/dist/components/ToolbarView/ToolbarView.module.css.cjs.map +1 -0
- package/dist/components/ToolbarView/ToolbarView.module.css.js +10 -0
- package/dist/components/ToolbarView/ToolbarView.module.css.js.map +1 -0
- package/dist/components/ToolbarView.cjs +1 -0
- package/dist/components/ToolbarView.d.ts +2 -0
- package/dist/components/ToolbarView.js +2 -0
- package/dist/components/Tooltip/Tooltip.cjs +2 -0
- package/dist/components/Tooltip/Tooltip.cjs.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +100 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/Tooltip.module.css.cjs +2 -0
- package/dist/components/Tooltip/Tooltip.module.css.cjs.map +1 -0
- package/dist/components/Tooltip/Tooltip.module.css.js +12 -0
- package/dist/components/Tooltip/Tooltip.module.css.js.map +1 -0
- package/dist/components/Tooltip.cjs +1 -0
- package/dist/components/Tooltip.d.ts +2 -0
- package/dist/components/Tooltip.js +2 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.cjs +2 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.cjs.map +1 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.js +31 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.js.map +1 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.module.css.cjs +2 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.module.css.cjs.map +1 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.module.css.js +11 -0
- package/dist/components/ViewSwitcher/ViewSwitcher.module.css.js.map +1 -0
- package/dist/components/ViewSwitcher/ViewSwitcherItem.cjs +2 -0
- package/dist/components/ViewSwitcher/ViewSwitcherItem.cjs.map +1 -0
- package/dist/components/ViewSwitcher/ViewSwitcherItem.js +34 -0
- package/dist/components/ViewSwitcher/ViewSwitcherItem.js.map +1 -0
- package/dist/components/ViewSwitcher.cjs +1 -0
- package/dist/components/ViewSwitcher.d.ts +2 -0
- package/dist/components/ViewSwitcher.js +3 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.cjs +2 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.cjs.map +1 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.js +16 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.js.map +1 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.cjs +2 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.cjs.map +1 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.js +5 -0
- package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.js.map +1 -0
- package/dist/components/ViewSwitcherBar.cjs +1 -0
- package/dist/components/ViewSwitcherBar.d.ts +2 -0
- package/dist/components/ViewSwitcherBar.js +2 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs +2 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs.map +1 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js +61 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js.map +1 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.cjs +2 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.cjs.map +1 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.js +18 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.js.map +1 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.cjs +2 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.cjs.map +1 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.js +50 -0
- package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.js.map +1 -0
- package/dist/components/ViewSwitcherSidebar.cjs +1 -0
- package/dist/components/ViewSwitcherSidebar.d.ts +2 -0
- package/dist/components/ViewSwitcherSidebar.js +3 -0
- package/dist/components/WindowTitle/WindowTitle.cjs +2 -0
- package/dist/components/WindowTitle/WindowTitle.cjs.map +1 -0
- package/dist/components/WindowTitle/WindowTitle.js +20 -0
- package/dist/components/WindowTitle/WindowTitle.js.map +1 -0
- package/dist/components/WindowTitle/WindowTitle.module.css.cjs +2 -0
- package/dist/components/WindowTitle/WindowTitle.module.css.cjs.map +1 -0
- package/dist/components/WindowTitle/WindowTitle.module.css.js +9 -0
- package/dist/components/WindowTitle/WindowTitle.module.css.js.map +1 -0
- package/dist/components/WindowTitle.cjs +1 -0
- package/dist/components/WindowTitle.d.ts +2 -0
- package/dist/components/WindowTitle.js +2 -0
- package/dist/components/WrapBox/WrapBox.cjs +2 -0
- package/dist/components/WrapBox/WrapBox.cjs.map +1 -0
- package/dist/components/WrapBox/WrapBox.js +26 -0
- package/dist/components/WrapBox/WrapBox.js.map +1 -0
- package/dist/components/WrapBox/WrapBox.module.css.cjs +2 -0
- package/dist/components/WrapBox/WrapBox.module.css.cjs.map +1 -0
- package/dist/components/WrapBox/WrapBox.module.css.js +8 -0
- package/dist/components/WrapBox/WrapBox.module.css.js.map +1 -0
- package/dist/components/WrapBox.cjs +1 -0
- package/dist/components/WrapBox.d.ts +2 -0
- package/dist/components/WrapBox.js +2 -0
- package/dist/hooks/useBreakpoint.cjs +2 -0
- package/dist/hooks/useBreakpoint.cjs.map +1 -0
- package/dist/hooks/useBreakpoint.js +26 -0
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +2 -0
- package/dist/icons/dist/icons/Check.cjs +2 -0
- package/dist/icons/dist/icons/Check.cjs.map +1 -0
- package/dist/icons/dist/icons/Check.js +12 -0
- package/dist/icons/dist/icons/Check.js.map +1 -0
- package/dist/icons/dist/icons/Close.cjs +2 -0
- package/dist/icons/dist/icons/Close.cjs.map +1 -0
- package/dist/icons/dist/icons/Close.js +12 -0
- package/dist/icons/dist/icons/Close.js.map +1 -0
- package/dist/icons/dist/icons/PanDown.cjs +2 -0
- package/dist/icons/dist/icons/PanDown.cjs.map +1 -0
- package/dist/icons/dist/icons/PanDown.js +12 -0
- package/dist/icons/dist/icons/PanDown.js.map +1 -0
- package/dist/icons/dist/icons/PanUp.cjs +2 -0
- package/dist/icons/dist/icons/PanUp.cjs.map +1 -0
- package/dist/icons/dist/icons/PanUp.js +12 -0
- package/dist/icons/dist/icons/PanUp.js.map +1 -0
- package/dist/icons/dist/icons/Search.cjs +2 -0
- package/dist/icons/dist/icons/Search.cjs.map +1 -0
- package/dist/icons/dist/icons/Search.js +12 -0
- package/dist/icons/dist/icons/Search.js.map +1 -0
- package/dist/icons/dist/icons/ViewConceal.cjs +2 -0
- package/dist/icons/dist/icons/ViewConceal.cjs.map +1 -0
- package/dist/icons/dist/icons/ViewConceal.js +12 -0
- package/dist/icons/dist/icons/ViewConceal.js.map +1 -0
- package/dist/icons/dist/icons/ViewReveal.cjs +2 -0
- package/dist/icons/dist/icons/ViewReveal.cjs.map +1 -0
- package/dist/icons/dist/icons/ViewReveal.js +12 -0
- package/dist/icons/dist/icons/ViewReveal.js.map +1 -0
- package/dist/index.cjs +1 -2
- package/dist/index.js +87 -5166
- package/dist/style.css +1 -1
- package/package.json +391 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/test/setup.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.cjs","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useId,\n useEffect,\n useCallback,\n cloneElement,\n type ReactElement,\n type HTMLAttributes,\n type ReactNode,\n type KeyboardEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /**\n * The rich content rendered inside the popover panel.\n * Can include interactive elements (buttons, links, forms).\n */\n content: ReactNode;\n /**\n * Preferred placement relative to the trigger.\n * Flips automatically when there is not enough viewport space.\n * Defaults to `\"bottom\"`.\n */\n placement?: PopoverPlacement;\n /**\n * Whether the popover is open (controlled mode).\n * Omit to use uncontrolled mode where the trigger toggles it.\n */\n open?: boolean;\n /**\n * Called when the popover requests to be closed\n * (Escape key, outside click, or trigger click while open).\n */\n onClose?: () => void;\n /**\n * Called when open state should change (controlled mode).\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * The trigger element. Must be a single React element that can\n * receive `ref` and click/keyboard event props.\n */\n children: ReactElement<HTMLAttributes<HTMLElement>>;\n}\n\ninterface Position {\n top: number;\n left: number;\n placement: PopoverPlacement;\n /** Arrow center offset in px from the near edge of the panel.\n * Horizontal (left) for top/bottom; vertical (top) for left/right.\n * Undefined means use the default 50% CSS. */\n arrowOffset?: number;\n}\n\nconst GAP = 8;\nconst MARGIN = 10;\nconst ARROW_HALF = 6; // half of the 12 px arrow\n\nfunction computePosition(\n trigger: DOMRect,\n popover: DOMRect,\n preferred: PopoverPlacement\n): Position {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const order: PopoverPlacement[] = [\n preferred,\n preferred === \"top\" ? \"bottom\"\n : preferred === \"bottom\" ? \"top\"\n : preferred === \"left\" ? \"right\"\n : \"left\",\n \"bottom\", \"top\", \"left\", \"right\",\n ];\n\n // De-duplicate while preserving order\n const candidates = [...new Set(order)];\n\n function calcRaw(p: PopoverPlacement): { top: number; left: number } {\n if (p === \"bottom\") return {\n top: trigger.bottom + GAP,\n left: trigger.left + trigger.width / 2 - popover.width / 2,\n };\n if (p === \"top\") return {\n top: trigger.top - popover.height - GAP,\n left: trigger.left + trigger.width / 2 - popover.width / 2,\n };\n if (p === \"left\") return {\n top: trigger.top + trigger.height / 2 - popover.height / 2,\n left: trigger.left - popover.width - GAP,\n };\n return {\n top: trigger.top + trigger.height / 2 - popover.height / 2,\n left: trigger.right + GAP,\n };\n }\n\n // First pass: find a placement that fits both axes perfectly.\n for (const p of candidates) {\n const { top, left } = calcRaw(p);\n const fitsH = left >= MARGIN && left + popover.width <= vw - MARGIN;\n const fitsV = top >= MARGIN && top + popover.height <= vh - MARGIN;\n if (fitsH && fitsV) {\n // Always use pixel arrowOffset (never rely on CSS left:50%) so the arrow\n // points exactly at the trigger center regardless of sub-pixel rounding.\n const arrowOffset =\n p === \"top\" || p === \"bottom\"\n ? trigger.left + trigger.width / 2 - left\n : trigger.top + trigger.height / 2 - top;\n return { top, left, placement: p, arrowOffset };\n }\n }\n\n // Second pass: fits the primary axis; clamp the secondary axis and\n // shift the arrow so it still points at the trigger center.\n for (const p of candidates) {\n const { top, left } = calcRaw(p);\n const fitsV = top >= MARGIN && top + popover.height <= vh - MARGIN;\n const fitsH = left >= MARGIN && left + popover.width <= vw - MARGIN;\n\n if ((p === \"top\" || p === \"bottom\") && fitsV) {\n const clampedLeft = Math.max(MARGIN, Math.min(left, vw - popover.width - MARGIN));\n const rawOffset = trigger.left + trigger.width / 2 - clampedLeft;\n return {\n top, left: clampedLeft, placement: p,\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawOffset, popover.width - ARROW_HALF - 4)),\n };\n }\n\n if ((p === \"left\" || p === \"right\") && fitsH) {\n const clampedTop = Math.max(MARGIN, Math.min(top, vh - popover.height - MARGIN));\n const rawOffset = trigger.top + trigger.height / 2 - clampedTop;\n return {\n top: clampedTop, left, placement: p,\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawOffset, popover.height - ARROW_HALF - 4)),\n };\n }\n }\n\n // Fallback: clamp bottom placement and shift arrow to match trigger.\n const fbTop = trigger.bottom + GAP;\n const fbLeft = trigger.left + trigger.width / 2 - popover.width / 2;\n const clampedTop = Math.max(MARGIN, Math.min(fbTop, vh - popover.height - MARGIN));\n const clampedLeft = Math.max(MARGIN, Math.min(fbLeft, vw - popover.width - MARGIN));\n const rawArrowOffset = trigger.left + trigger.width / 2 - clampedLeft;\n return {\n top: clampedTop,\n left: clampedLeft,\n placement: \"bottom\",\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawArrowOffset, popover.width - ARROW_HALF - 4)),\n };\n}\n\n/**\n * Floating panel anchored to a trigger element.\n *\n * Unlike `Tooltip`, a Popover can contain rich interactive content\n * (menus, forms, details). It follows the Adwaita `GtkPopover` pattern.\n *\n * - Supports both controlled (`open` + `onClose`) and uncontrolled modes.\n * - Auto-positions with viewport-aware flip.\n * - Closes on Escape, outside click, or trigger re-click.\n * - Focus is moved into the panel on open; returns to the trigger on close.\n * - `aria-haspopup=\"dialog\"` + `aria-expanded` wired to the trigger.\n * - `role=\"dialog\"` on the panel with `aria-labelledby` when a heading is present.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Popover.html\n */\nexport function Popover({\n content,\n placement: preferredPlacement = \"bottom\",\n open: controlledOpen,\n onClose,\n onOpenChange,\n children,\n}: PopoverProps) {\n const isControlled = controlledOpen !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const [pos, setPos] = useState<Position | null>(null);\n\n const triggerId = useId();\n const popoverId = useId();\n const triggerRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const previouslyFocused = useRef<Element | null>(null);\n\n const close = useCallback(() => {\n if (isControlled) {\n onClose?.();\n } else {\n setUncontrolledOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, onClose, onOpenChange]);\n\n const toggle = useCallback(() => {\n if (open) {\n close();\n } else {\n if (!isControlled) setUncontrolledOpen(true);\n onOpenChange?.(true);\n }\n }, [open, close, isControlled, onOpenChange]);\n\n // Position panel\n const place = useCallback(() => {\n if (!triggerRef.current || !panelRef.current) return;\n setPos(\n computePosition(\n triggerRef.current.getBoundingClientRect(),\n panelRef.current.getBoundingClientRect(),\n preferredPlacement\n )\n );\n }, [preferredPlacement]);\n\n // Reposition on open, scroll, resize\n useEffect(() => {\n if (!open) return;\n // Two RAF: first lets panel mount with hidden styles so we can measure it;\n // second applies the measured position.\n const id = requestAnimationFrame(() => {\n place();\n window.addEventListener(\"scroll\", place, { passive: true, capture: true });\n window.addEventListener(\"resize\", place, { passive: true });\n });\n return () => {\n cancelAnimationFrame(id);\n window.removeEventListener(\"scroll\", place, { capture: true });\n window.removeEventListener(\"resize\", place);\n };\n }, [open, place]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n requestAnimationFrame(() => {\n const first = panelRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n (first ?? panelRef.current)?.focus();\n });\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n setPos(null);\n }\n }, [open]);\n\n // Close on outside pointer\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (\n !triggerRef.current?.contains(e.target as Node) &&\n !panelRef.current?.contains(e.target as Node)\n ) {\n close();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, close]);\n\n // Escape key\n const handlePanelKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") { e.stopPropagation(); close(); }\n },\n [close]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const trigger = cloneElement(children as any, {\n ref: triggerRef,\n id: triggerId,\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? popoverId : undefined,\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n toggle();\n children.props.onClick?.(e);\n },\n });\n\n const panel = (\n <div\n ref={panelRef}\n id={popoverId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={[\n styles.panel,\n pos ? styles[pos.placement] : null,\n open && pos ? styles.visible : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={\n pos\n ? { top: pos.top, left: pos.left }\n : { visibility: \"hidden\", pointerEvents: \"none\", top: -9999, left: -9999 }\n }\n onKeyDown={handlePanelKeyDown}\n >\n {/* Arrow — offset shifts it to point at the trigger when the panel is clamped */}\n <div\n className={styles.arrow}\n aria-hidden=\"true\"\n style={\n pos?.arrowOffset !== undefined\n ? pos.placement === \"top\" || pos.placement === \"bottom\"\n ? { left: pos.arrowOffset - ARROW_HALF, marginLeft: 0 }\n : { top: pos.arrowOffset - ARROW_HALF, marginTop: 0 }\n : undefined\n }\n />\n {content}\n </div>\n );\n\n return (\n <>\n {trigger}\n {open &&\n (typeof document !== \"undefined\"\n ? createPortal(panel, document.body)\n : panel)}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import e from "./Popover.module.css.js";
|
|
2
|
+
import { cloneElement as t, useCallback as n, useEffect as r, useId as i, useRef as a, useState as o } from "react";
|
|
3
|
+
import { createPortal as s } from "react-dom";
|
|
4
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/Popover/Popover.tsx
|
|
6
|
+
var d = 8, f = 10, p = 6;
|
|
7
|
+
function m(e, t, n) {
|
|
8
|
+
let r = window.innerWidth, i = window.innerHeight, a = [...new Set([
|
|
9
|
+
n,
|
|
10
|
+
n === "top" ? "bottom" : n === "bottom" ? "top" : n === "left" ? "right" : "left",
|
|
11
|
+
"bottom",
|
|
12
|
+
"top",
|
|
13
|
+
"left",
|
|
14
|
+
"right"
|
|
15
|
+
])];
|
|
16
|
+
function o(n) {
|
|
17
|
+
return n === "bottom" ? {
|
|
18
|
+
top: e.bottom + d,
|
|
19
|
+
left: e.left + e.width / 2 - t.width / 2
|
|
20
|
+
} : n === "top" ? {
|
|
21
|
+
top: e.top - t.height - d,
|
|
22
|
+
left: e.left + e.width / 2 - t.width / 2
|
|
23
|
+
} : n === "left" ? {
|
|
24
|
+
top: e.top + e.height / 2 - t.height / 2,
|
|
25
|
+
left: e.left - t.width - d
|
|
26
|
+
} : {
|
|
27
|
+
top: e.top + e.height / 2 - t.height / 2,
|
|
28
|
+
left: e.right + d
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
for (let n of a) {
|
|
32
|
+
let { top: a, left: s } = o(n), c = s >= f && s + t.width <= r - f, l = a >= f && a + t.height <= i - f;
|
|
33
|
+
if (c && l) return {
|
|
34
|
+
top: a,
|
|
35
|
+
left: s,
|
|
36
|
+
placement: n,
|
|
37
|
+
arrowOffset: n === "top" || n === "bottom" ? e.left + e.width / 2 - s : e.top + e.height / 2 - a
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
for (let n of a) {
|
|
41
|
+
let { top: a, left: s } = o(n), c = a >= f && a + t.height <= i - f, l = s >= f && s + t.width <= r - f;
|
|
42
|
+
if ((n === "top" || n === "bottom") && c) {
|
|
43
|
+
let i = Math.max(f, Math.min(s, r - t.width - f)), o = e.left + e.width / 2 - i;
|
|
44
|
+
return {
|
|
45
|
+
top: a,
|
|
46
|
+
left: i,
|
|
47
|
+
placement: n,
|
|
48
|
+
arrowOffset: Math.max(p + 4, Math.min(o, t.width - p - 4))
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if ((n === "left" || n === "right") && l) {
|
|
52
|
+
let r = Math.max(f, Math.min(a, i - t.height - f)), o = e.top + e.height / 2 - r;
|
|
53
|
+
return {
|
|
54
|
+
top: r,
|
|
55
|
+
left: s,
|
|
56
|
+
placement: n,
|
|
57
|
+
arrowOffset: Math.max(p + 4, Math.min(o, t.height - p - 4))
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let s = e.bottom + d, c = e.left + e.width / 2 - t.width / 2, l = Math.max(f, Math.min(s, i - t.height - f)), u = Math.max(f, Math.min(c, r - t.width - f)), m = e.left + e.width / 2 - u;
|
|
62
|
+
return {
|
|
63
|
+
top: l,
|
|
64
|
+
left: u,
|
|
65
|
+
placement: "bottom",
|
|
66
|
+
arrowOffset: Math.max(p + 4, Math.min(m, t.width - p - 4))
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function h({ content: d, placement: f = "bottom", open: h, onClose: g, onOpenChange: _, children: v }) {
|
|
70
|
+
let y = h !== void 0, [b, x] = o(!1), S = y ? h : b, [C, w] = o(null), T = i(), E = i(), D = a(null), O = a(null), k = a(null), A = n(() => {
|
|
71
|
+
y ? g?.() : x(!1), _?.(!1);
|
|
72
|
+
}, [
|
|
73
|
+
y,
|
|
74
|
+
g,
|
|
75
|
+
_
|
|
76
|
+
]), j = n(() => {
|
|
77
|
+
S ? A() : (y || x(!0), _?.(!0));
|
|
78
|
+
}, [
|
|
79
|
+
S,
|
|
80
|
+
A,
|
|
81
|
+
y,
|
|
82
|
+
_
|
|
83
|
+
]), M = n(() => {
|
|
84
|
+
!D.current || !O.current || w(m(D.current.getBoundingClientRect(), O.current.getBoundingClientRect(), f));
|
|
85
|
+
}, [f]);
|
|
86
|
+
r(() => {
|
|
87
|
+
if (!S) return;
|
|
88
|
+
let e = requestAnimationFrame(() => {
|
|
89
|
+
M(), window.addEventListener("scroll", M, {
|
|
90
|
+
passive: !0,
|
|
91
|
+
capture: !0
|
|
92
|
+
}), window.addEventListener("resize", M, { passive: !0 });
|
|
93
|
+
});
|
|
94
|
+
return () => {
|
|
95
|
+
cancelAnimationFrame(e), window.removeEventListener("scroll", M, { capture: !0 }), window.removeEventListener("resize", M);
|
|
96
|
+
};
|
|
97
|
+
}, [S, M]), r(() => {
|
|
98
|
+
S ? (k.current = document.activeElement, requestAnimationFrame(() => {
|
|
99
|
+
(O.current?.querySelector("button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])") ?? O.current)?.focus();
|
|
100
|
+
})) : (k.current?.focus(), w(null));
|
|
101
|
+
}, [S]), r(() => {
|
|
102
|
+
if (!S) return;
|
|
103
|
+
let e = (e) => {
|
|
104
|
+
!D.current?.contains(e.target) && !O.current?.contains(e.target) && A();
|
|
105
|
+
};
|
|
106
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
107
|
+
}, [S, A]);
|
|
108
|
+
let N = n((e) => {
|
|
109
|
+
e.key === "Escape" && (e.stopPropagation(), A());
|
|
110
|
+
}, [A]), P = t(v, {
|
|
111
|
+
ref: D,
|
|
112
|
+
id: T,
|
|
113
|
+
"aria-haspopup": "dialog",
|
|
114
|
+
"aria-expanded": S,
|
|
115
|
+
"aria-controls": S ? E : void 0,
|
|
116
|
+
onClick: (e) => {
|
|
117
|
+
j(), v.props.onClick?.(e);
|
|
118
|
+
}
|
|
119
|
+
}), F = /* @__PURE__ */ u("div", {
|
|
120
|
+
ref: O,
|
|
121
|
+
id: E,
|
|
122
|
+
role: "dialog",
|
|
123
|
+
"aria-labelledby": T,
|
|
124
|
+
tabIndex: -1,
|
|
125
|
+
className: [
|
|
126
|
+
e.panel,
|
|
127
|
+
C ? e[C.placement] : null,
|
|
128
|
+
S && C ? e.visible : null
|
|
129
|
+
].filter(Boolean).join(" "),
|
|
130
|
+
style: C ? {
|
|
131
|
+
top: C.top,
|
|
132
|
+
left: C.left
|
|
133
|
+
} : {
|
|
134
|
+
visibility: "hidden",
|
|
135
|
+
pointerEvents: "none",
|
|
136
|
+
top: -9999,
|
|
137
|
+
left: -9999
|
|
138
|
+
},
|
|
139
|
+
onKeyDown: N,
|
|
140
|
+
children: [/* @__PURE__ */ l("div", {
|
|
141
|
+
className: e.arrow,
|
|
142
|
+
"aria-hidden": "true",
|
|
143
|
+
style: C?.arrowOffset === void 0 ? void 0 : C.placement === "top" || C.placement === "bottom" ? {
|
|
144
|
+
left: C.arrowOffset - p,
|
|
145
|
+
marginLeft: 0
|
|
146
|
+
} : {
|
|
147
|
+
top: C.arrowOffset - p,
|
|
148
|
+
marginTop: 0
|
|
149
|
+
}
|
|
150
|
+
}), d]
|
|
151
|
+
});
|
|
152
|
+
return /* @__PURE__ */ u(c, { children: [P, S && (typeof document < "u" ? s(F, document.body) : F)] });
|
|
153
|
+
}
|
|
154
|
+
//#endregion
|
|
155
|
+
export { h as Popover };
|
|
156
|
+
|
|
157
|
+
//# sourceMappingURL=Popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.js","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useId,\n useEffect,\n useCallback,\n cloneElement,\n type ReactElement,\n type HTMLAttributes,\n type ReactNode,\n type KeyboardEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /**\n * The rich content rendered inside the popover panel.\n * Can include interactive elements (buttons, links, forms).\n */\n content: ReactNode;\n /**\n * Preferred placement relative to the trigger.\n * Flips automatically when there is not enough viewport space.\n * Defaults to `\"bottom\"`.\n */\n placement?: PopoverPlacement;\n /**\n * Whether the popover is open (controlled mode).\n * Omit to use uncontrolled mode where the trigger toggles it.\n */\n open?: boolean;\n /**\n * Called when the popover requests to be closed\n * (Escape key, outside click, or trigger click while open).\n */\n onClose?: () => void;\n /**\n * Called when open state should change (controlled mode).\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * The trigger element. Must be a single React element that can\n * receive `ref` and click/keyboard event props.\n */\n children: ReactElement<HTMLAttributes<HTMLElement>>;\n}\n\ninterface Position {\n top: number;\n left: number;\n placement: PopoverPlacement;\n /** Arrow center offset in px from the near edge of the panel.\n * Horizontal (left) for top/bottom; vertical (top) for left/right.\n * Undefined means use the default 50% CSS. */\n arrowOffset?: number;\n}\n\nconst GAP = 8;\nconst MARGIN = 10;\nconst ARROW_HALF = 6; // half of the 12 px arrow\n\nfunction computePosition(\n trigger: DOMRect,\n popover: DOMRect,\n preferred: PopoverPlacement\n): Position {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const order: PopoverPlacement[] = [\n preferred,\n preferred === \"top\" ? \"bottom\"\n : preferred === \"bottom\" ? \"top\"\n : preferred === \"left\" ? \"right\"\n : \"left\",\n \"bottom\", \"top\", \"left\", \"right\",\n ];\n\n // De-duplicate while preserving order\n const candidates = [...new Set(order)];\n\n function calcRaw(p: PopoverPlacement): { top: number; left: number } {\n if (p === \"bottom\") return {\n top: trigger.bottom + GAP,\n left: trigger.left + trigger.width / 2 - popover.width / 2,\n };\n if (p === \"top\") return {\n top: trigger.top - popover.height - GAP,\n left: trigger.left + trigger.width / 2 - popover.width / 2,\n };\n if (p === \"left\") return {\n top: trigger.top + trigger.height / 2 - popover.height / 2,\n left: trigger.left - popover.width - GAP,\n };\n return {\n top: trigger.top + trigger.height / 2 - popover.height / 2,\n left: trigger.right + GAP,\n };\n }\n\n // First pass: find a placement that fits both axes perfectly.\n for (const p of candidates) {\n const { top, left } = calcRaw(p);\n const fitsH = left >= MARGIN && left + popover.width <= vw - MARGIN;\n const fitsV = top >= MARGIN && top + popover.height <= vh - MARGIN;\n if (fitsH && fitsV) {\n // Always use pixel arrowOffset (never rely on CSS left:50%) so the arrow\n // points exactly at the trigger center regardless of sub-pixel rounding.\n const arrowOffset =\n p === \"top\" || p === \"bottom\"\n ? trigger.left + trigger.width / 2 - left\n : trigger.top + trigger.height / 2 - top;\n return { top, left, placement: p, arrowOffset };\n }\n }\n\n // Second pass: fits the primary axis; clamp the secondary axis and\n // shift the arrow so it still points at the trigger center.\n for (const p of candidates) {\n const { top, left } = calcRaw(p);\n const fitsV = top >= MARGIN && top + popover.height <= vh - MARGIN;\n const fitsH = left >= MARGIN && left + popover.width <= vw - MARGIN;\n\n if ((p === \"top\" || p === \"bottom\") && fitsV) {\n const clampedLeft = Math.max(MARGIN, Math.min(left, vw - popover.width - MARGIN));\n const rawOffset = trigger.left + trigger.width / 2 - clampedLeft;\n return {\n top, left: clampedLeft, placement: p,\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawOffset, popover.width - ARROW_HALF - 4)),\n };\n }\n\n if ((p === \"left\" || p === \"right\") && fitsH) {\n const clampedTop = Math.max(MARGIN, Math.min(top, vh - popover.height - MARGIN));\n const rawOffset = trigger.top + trigger.height / 2 - clampedTop;\n return {\n top: clampedTop, left, placement: p,\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawOffset, popover.height - ARROW_HALF - 4)),\n };\n }\n }\n\n // Fallback: clamp bottom placement and shift arrow to match trigger.\n const fbTop = trigger.bottom + GAP;\n const fbLeft = trigger.left + trigger.width / 2 - popover.width / 2;\n const clampedTop = Math.max(MARGIN, Math.min(fbTop, vh - popover.height - MARGIN));\n const clampedLeft = Math.max(MARGIN, Math.min(fbLeft, vw - popover.width - MARGIN));\n const rawArrowOffset = trigger.left + trigger.width / 2 - clampedLeft;\n return {\n top: clampedTop,\n left: clampedLeft,\n placement: \"bottom\",\n arrowOffset: Math.max(ARROW_HALF + 4, Math.min(rawArrowOffset, popover.width - ARROW_HALF - 4)),\n };\n}\n\n/**\n * Floating panel anchored to a trigger element.\n *\n * Unlike `Tooltip`, a Popover can contain rich interactive content\n * (menus, forms, details). It follows the Adwaita `GtkPopover` pattern.\n *\n * - Supports both controlled (`open` + `onClose`) and uncontrolled modes.\n * - Auto-positions with viewport-aware flip.\n * - Closes on Escape, outside click, or trigger re-click.\n * - Focus is moved into the panel on open; returns to the trigger on close.\n * - `aria-haspopup=\"dialog\"` + `aria-expanded` wired to the trigger.\n * - `role=\"dialog\"` on the panel with `aria-labelledby` when a heading is present.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Popover.html\n */\nexport function Popover({\n content,\n placement: preferredPlacement = \"bottom\",\n open: controlledOpen,\n onClose,\n onOpenChange,\n children,\n}: PopoverProps) {\n const isControlled = controlledOpen !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const [pos, setPos] = useState<Position | null>(null);\n\n const triggerId = useId();\n const popoverId = useId();\n const triggerRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const previouslyFocused = useRef<Element | null>(null);\n\n const close = useCallback(() => {\n if (isControlled) {\n onClose?.();\n } else {\n setUncontrolledOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, onClose, onOpenChange]);\n\n const toggle = useCallback(() => {\n if (open) {\n close();\n } else {\n if (!isControlled) setUncontrolledOpen(true);\n onOpenChange?.(true);\n }\n }, [open, close, isControlled, onOpenChange]);\n\n // Position panel\n const place = useCallback(() => {\n if (!triggerRef.current || !panelRef.current) return;\n setPos(\n computePosition(\n triggerRef.current.getBoundingClientRect(),\n panelRef.current.getBoundingClientRect(),\n preferredPlacement\n )\n );\n }, [preferredPlacement]);\n\n // Reposition on open, scroll, resize\n useEffect(() => {\n if (!open) return;\n // Two RAF: first lets panel mount with hidden styles so we can measure it;\n // second applies the measured position.\n const id = requestAnimationFrame(() => {\n place();\n window.addEventListener(\"scroll\", place, { passive: true, capture: true });\n window.addEventListener(\"resize\", place, { passive: true });\n });\n return () => {\n cancelAnimationFrame(id);\n window.removeEventListener(\"scroll\", place, { capture: true });\n window.removeEventListener(\"resize\", place);\n };\n }, [open, place]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n requestAnimationFrame(() => {\n const first = panelRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n (first ?? panelRef.current)?.focus();\n });\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n setPos(null);\n }\n }, [open]);\n\n // Close on outside pointer\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (\n !triggerRef.current?.contains(e.target as Node) &&\n !panelRef.current?.contains(e.target as Node)\n ) {\n close();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, close]);\n\n // Escape key\n const handlePanelKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") { e.stopPropagation(); close(); }\n },\n [close]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const trigger = cloneElement(children as any, {\n ref: triggerRef,\n id: triggerId,\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? popoverId : undefined,\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n toggle();\n children.props.onClick?.(e);\n },\n });\n\n const panel = (\n <div\n ref={panelRef}\n id={popoverId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={[\n styles.panel,\n pos ? styles[pos.placement] : null,\n open && pos ? styles.visible : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={\n pos\n ? { top: pos.top, left: pos.left }\n : { visibility: \"hidden\", pointerEvents: \"none\", top: -9999, left: -9999 }\n }\n onKeyDown={handlePanelKeyDown}\n >\n {/* Arrow — offset shifts it to point at the trigger when the panel is clamped */}\n <div\n className={styles.arrow}\n aria-hidden=\"true\"\n style={\n pos?.arrowOffset !== undefined\n ? pos.placement === \"top\" || pos.placement === \"bottom\"\n ? { left: pos.arrowOffset - ARROW_HALF, marginLeft: 0 }\n : { top: pos.arrowOffset - ARROW_HALF, marginTop: 0 }\n : undefined\n }\n />\n {content}\n </div>\n );\n\n return (\n <>\n {trigger}\n {open &&\n (typeof document !== \"undefined\"\n ? createPortal(panel, document.body)\n : panel)}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.module.css.cjs","names":[],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":["/* ─── Panel ──────────────────────────────────────────────────────────────────── */\n\n.panel {\n position: fixed;\n z-index: 10200; /* above Toaster (9999), below Dialog (10000) */\n\n min-width: 180px;\n max-width: 320px;\n\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #ffffff));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n border-radius: var(--gnome-radius-lg, 12px);\n box-shadow:\n 0 4px 20px rgba(0, 0, 0, 0.14),\n 0 1px 4px rgba(0, 0, 0, 0.08);\n\n padding: var(--gnome-space-2, 12px);\n\n font-family: var(--gnome-font-family);\n\n /* Hidden before position is known */\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n transform var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n\n /* Don't intercept events while invisible */\n pointer-events: none;\n\n outline: none;\n}\n\n.visible {\n opacity: 1;\n transform: scale(1);\n pointer-events: auto;\n}\n\n/* ─── Arrow ──────────────────────────────────────────────────────────────────── */\n\n.arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #ffffff));\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n\n /* Arrow points toward the trigger */\n transform: rotate(45deg);\n pointer-events: none;\n z-index: -1;\n}\n\n/* Position arrow on each side */\n.bottom .arrow {\n top: -6px;\n left: 50%;\n margin-left: -6px;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.top .arrow {\n bottom: -6px;\n left: 50%;\n margin-left: -6px;\n border-left-color: transparent;\n border-top-color: transparent;\n}\n\n.left .arrow {\n right: -6px;\n top: 50%;\n margin-top: -6px;\n border-left-color: transparent;\n border-bottom-color: transparent;\n}\n\n.right .arrow {\n left: -6px;\n top: 50%;\n margin-top: -6px;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n/* ─── Dark mode ──────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .panel {\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #383838));\n border-color: rgba(255, 255, 255, 0.1);\n box-shadow:\n 0 4px 24px rgba(0, 0, 0, 0.4),\n 0 1px 4px rgba(0, 0, 0, 0.3);\n }\n\n .arrow {\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #383838));\n border-color: rgba(255, 255, 255, 0.1);\n }\n\n .bottom .arrow { border-right-color: transparent; border-bottom-color: transparent; }\n .top .arrow { border-left-color: transparent; border-top-color: transparent; }\n .left .arrow { border-left-color: transparent; border-bottom-color: transparent; }\n .right .arrow { border-right-color: transparent; border-top-color: transparent; }\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .panel {\n transition: opacity var(--gnome-duration-fast, 100ms) linear;\n transform: none;\n }\n\n .visible {\n transform: none;\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var e = {
|
|
2
|
+
panel: "_panel_1tk9v_3",
|
|
3
|
+
visible: "_visible_1tk9v_36",
|
|
4
|
+
arrow: "_arrow_1tk9v_44",
|
|
5
|
+
bottom: "_bottom_1tk9v_59",
|
|
6
|
+
top: "_top_1tk9v_67",
|
|
7
|
+
left: "_left_1tk9v_75",
|
|
8
|
+
right: "_right_1tk9v_83"
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { e as default };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=Popover.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.module.css.js","names":[],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":["/* ─── Panel ──────────────────────────────────────────────────────────────────── */\n\n.panel {\n position: fixed;\n z-index: 10200; /* above Toaster (9999), below Dialog (10000) */\n\n min-width: 180px;\n max-width: 320px;\n\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #ffffff));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n border-radius: var(--gnome-radius-lg, 12px);\n box-shadow:\n 0 4px 20px rgba(0, 0, 0, 0.14),\n 0 1px 4px rgba(0, 0, 0, 0.08);\n\n padding: var(--gnome-space-2, 12px);\n\n font-family: var(--gnome-font-family);\n\n /* Hidden before position is known */\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n transform var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n\n /* Don't intercept events while invisible */\n pointer-events: none;\n\n outline: none;\n}\n\n.visible {\n opacity: 1;\n transform: scale(1);\n pointer-events: auto;\n}\n\n/* ─── Arrow ──────────────────────────────────────────────────────────────────── */\n\n.arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #ffffff));\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n\n /* Arrow points toward the trigger */\n transform: rotate(45deg);\n pointer-events: none;\n z-index: -1;\n}\n\n/* Position arrow on each side */\n.bottom .arrow {\n top: -6px;\n left: 50%;\n margin-left: -6px;\n border-right-color: transparent;\n border-bottom-color: transparent;\n}\n\n.top .arrow {\n bottom: -6px;\n left: 50%;\n margin-left: -6px;\n border-left-color: transparent;\n border-top-color: transparent;\n}\n\n.left .arrow {\n right: -6px;\n top: 50%;\n margin-top: -6px;\n border-left-color: transparent;\n border-bottom-color: transparent;\n}\n\n.right .arrow {\n left: -6px;\n top: 50%;\n margin-top: -6px;\n border-right-color: transparent;\n border-top-color: transparent;\n}\n\n/* ─── Dark mode ──────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .panel {\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #383838));\n border-color: rgba(255, 255, 255, 0.1);\n box-shadow:\n 0 4px 24px rgba(0, 0, 0, 0.4),\n 0 1px 4px rgba(0, 0, 0, 0.3);\n }\n\n .arrow {\n background-color: var(--gnome-popover-bg-color, var(--gnome-card-bg-color, #383838));\n border-color: rgba(255, 255, 255, 0.1);\n }\n\n .bottom .arrow { border-right-color: transparent; border-bottom-color: transparent; }\n .top .arrow { border-left-color: transparent; border-top-color: transparent; }\n .left .arrow { border-left-color: transparent; border-bottom-color: transparent; }\n .right .arrow { border-right-color: transparent; border-top-color: transparent; }\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .panel {\n transition: opacity var(--gnome-duration-fast, 100ms) linear;\n transform: none;\n }\n\n .visible {\n transform: none;\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./Popover/Popover.cjs`);exports.Popover=e.Popover;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./PreferencesDialog.module.css.cjs`);let t=require(`react`),n=require(`react-dom`),r=require(`react/jsx-runtime`);var i=`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function a(e,t){if(e.key!==`Tab`)return;let n=Array.from(t.current?.querySelectorAll(i)??[]);if(!n.length)return;let r=n[0],a=n[n.length-1];e.shiftKey?document.activeElement===r&&(e.preventDefault(),a.focus()):document.activeElement===a&&(e.preventDefault(),r.focus())}function o({open:o,onClose:s,children:c,searchable:l=!0,className:u,...d}){let f=(0,t.useRef)(null),p=(0,t.useRef)(null),m=(0,t.useId)(),h=t.Children.toArray(c).filter(e=>(0,t.isValidElement)(e)),[g,_]=(0,t.useState)(0),[v,y]=(0,t.useState)(``);(0,t.useEffect)(()=>{if(o){_(0),y(``);let e=requestAnimationFrame(()=>{l&&p.current?p.current.focus():(f.current?.querySelector(i))?.focus()});return()=>cancelAnimationFrame(e)}},[o,l]);let b=(0,t.useCallback)(e=>{if(e.key===`Escape`){e.stopPropagation(),s();return}a(e,f)},[s]),x=h.length>1,S=h[g]??h[0],C=v.trim().toLowerCase();return o?(0,n.createPortal)((0,r.jsx)(`div`,{className:e.default.backdrop,onClick:e=>{e.target===e.currentTarget&&s()},role:`presentation`,children:(0,r.jsxs)(`div`,{ref:f,role:`dialog`,"aria-modal":`true`,"aria-labelledby":m,className:[e.default.dialog,x?e.default.dialogMulti:null,u].filter(Boolean).join(` `),onKeyDown:b,...d,children:[(0,r.jsxs)(`div`,{className:e.default.header,children:[(0,r.jsx)(`button`,{type:`button`,className:e.default.closeBtn,onClick:s,"aria-label":`Close preferences`,children:`✕`}),(0,r.jsx)(`span`,{id:m,className:e.default.title,children:`Preferences`}),l&&(0,r.jsx)(`div`,{className:e.default.searchWrap,children:(0,r.jsx)(`input`,{ref:p,type:`search`,placeholder:`Search…`,value:v,onChange:e=>y(e.target.value),className:e.default.searchInput,"aria-label":`Search preferences`})})]}),(0,r.jsxs)(`div`,{className:e.default.body,children:[x&&(0,r.jsx)(`nav`,{className:e.default.sidebar,"aria-label":`Preferences pages`,children:(0,r.jsx)(`ul`,{role:`tablist`,className:e.default.navList,children:h.map((t,n)=>(0,r.jsx)(`li`,{role:`presentation`,children:(0,r.jsxs)(`button`,{role:`tab`,type:`button`,"aria-selected":n===g,className:[e.default.navItem,n===g?e.default.navItemActive:null].filter(Boolean).join(` `),onClick:()=>_(n),children:[t.props.iconName&&(0,r.jsx)(`span`,{className:[e.default.navIcon,`icon`,t.props.iconName].join(` `),"aria-hidden":`true`}),(0,r.jsx)(`span`,{className:e.default.navLabel,children:t.props.title})]})},n))})}),(0,r.jsx)(`div`,{className:e.default.pageWrap,children:S&&(0,t.cloneElement)(S,{"data-search-query":C||void 0})})]})]})}),document.body):null}exports.PreferencesDialog=o;
|
|
2
|
+
//# sourceMappingURL=PreferencesDialog.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesDialog.cjs","names":[],"sources":["../../../src/components/PreferencesDialog/PreferencesDialog.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./PreferencesDialog.module.css\";\nimport type { PreferencesPageProps } from \"../PreferencesPage/PreferencesPage\";\n\n// ─── Focus trap ───────────────────────────────────────────────────────────────\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction trapFocus(\n e: KeyboardEvent<HTMLDivElement>,\n ref: React.RefObject<HTMLDivElement | null>\n) {\n if (e.key !== \"Tab\") return;\n const focusable = Array.from(\n ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []\n );\n if (!focusable.length) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PreferencesDialogProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the user requests to close the dialog. */\n onClose: () => void;\n /**\n * `PreferencesPage` children. Each page appears as a sidebar entry.\n * When only one page is provided the sidebar is hidden.\n */\n children?: ReactNode;\n /**\n * Whether to show a search bar in the header.\n * When `true` the user can filter group/row content by typing.\n * Defaults to `true`.\n */\n searchable?: boolean;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Multi-page settings dialog using `PreferencesPage` tabs.\n *\n * Renders a wide modal with an optional sidebar listing pages. Each\n * `PreferencesPage` child becomes a navigation entry. Supports built-in\n * search when `searchable` is `true` (the default).\n *\n * Mirrors `AdwPreferencesDialog`.\n *\n * @example\n * ```tsx\n * <PreferencesDialog open={open} onClose={() => setOpen(false)}>\n * <PreferencesPage title=\"General\" iconName=\"preferences-system-symbolic\">\n * <PreferencesGroup title=\"Appearance\">\n * <BoxedList>\n * <SwitchRow title=\"Dark mode\" />\n * </BoxedList>\n * </PreferencesGroup>\n * </PreferencesPage>\n * </PreferencesDialog>\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.PreferencesDialog.html\n */\nexport function PreferencesDialog({\n open,\n onClose,\n children,\n searchable = true,\n className,\n ...props\n}: PreferencesDialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const titleId = useId();\n\n const pages = Children.toArray(children).filter(\n (c): c is ReactElement<PreferencesPageProps> =>\n isValidElement(c)\n ) as ReactElement<PreferencesPageProps>[];\n\n const [activeIndex, setActiveIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Reset state when dialog opens\n useEffect(() => {\n if (open) {\n setActiveIndex(0);\n setSearchQuery(\"\");\n // Focus search or first focusable after open animation\n const id = requestAnimationFrame(() => {\n if (searchable && searchRef.current) {\n searchRef.current.focus();\n } else {\n const first = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n first?.focus();\n }\n });\n return () => cancelAnimationFrame(id);\n }\n }, [open, searchable]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onClose();\n return;\n }\n trapFocus(e, dialogRef);\n },\n [onClose]\n );\n\n const multiPage = pages.length > 1;\n const activePage = pages[activeIndex] ?? pages[0];\n\n // Filter content by search query\n const query = searchQuery.trim().toLowerCase();\n\n if (!open) return null;\n\n return createPortal(\n <div\n className={styles.backdrop}\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[\n styles.dialog,\n multiPage ? styles.dialogMulti : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {/* ── Header ─────────────────────────────────────────────────────── */}\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.closeBtn}\n onClick={onClose}\n aria-label=\"Close preferences\"\n >\n ✕\n </button>\n <span id={titleId} className={styles.title}>\n Preferences\n </span>\n {searchable && (\n <div className={styles.searchWrap}>\n <input\n ref={searchRef}\n type=\"search\"\n placeholder=\"Search…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={styles.searchInput}\n aria-label=\"Search preferences\"\n />\n </div>\n )}\n </div>\n\n {/* ── Body ───────────────────────────────────────────────────────── */}\n <div className={styles.body}>\n {/* Sidebar — only shown when there are multiple pages */}\n {multiPage && (\n <nav className={styles.sidebar} aria-label=\"Preferences pages\">\n <ul role=\"tablist\" className={styles.navList}>\n {pages.map((page, i) => (\n <li key={i} role=\"presentation\">\n <button\n role=\"tab\"\n type=\"button\"\n aria-selected={i === activeIndex}\n className={[\n styles.navItem,\n i === activeIndex ? styles.navItemActive : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveIndex(i)}\n >\n {page.props.iconName && (\n <span\n className={[\n styles.navIcon,\n \"icon\",\n page.props.iconName,\n ].join(\" \")}\n aria-hidden=\"true\"\n />\n )}\n <span className={styles.navLabel}>\n {page.props.title}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </nav>\n )}\n\n {/* Page content */}\n <div className={styles.pageWrap}>\n {activePage &&\n cloneElement(activePage, {\n \"data-search-query\": query || undefined,\n } as Partial<PreferencesPageProps>)}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n"],"mappings":"mIAoBA,IAAM,EACJ,2IAEF,SAAS,EACP,EACA,EACA,CACA,GAAI,EAAE,MAAQ,MAAO,OACrB,IAAM,EAAY,MAAM,KACtB,EAAI,SAAS,iBAA8B,EAAU,EAAI,EAAE,CAC5D,CACD,GAAI,CAAC,EAAU,OAAQ,OACvB,IAAM,EAAQ,EAAU,GAClB,EAAO,EAAU,EAAU,OAAS,GACtC,EAAE,SACA,SAAS,gBAAkB,IAC7B,EAAE,gBAAgB,CAClB,EAAK,OAAO,EAGV,SAAS,gBAAkB,IAC7B,EAAE,gBAAgB,CAClB,EAAM,OAAO,EAoDnB,SAAgB,EAAkB,CAChC,OACA,UACA,WACA,aAAa,GACb,YACA,GAAG,GACsB,CACzB,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,GAAA,EAAA,EAAA,QAAqC,KAAK,CAC1C,GAAA,EAAA,EAAA,QAAiB,CAEjB,EAAQ,EAAA,SAAS,QAAQ,EAAS,CAAC,OACtC,IAAA,EAAA,EAAA,gBACgB,EAAE,CACpB,CAEK,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,EAAE,CAC3C,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,GAAG,EAGlD,EAAA,EAAA,eAAgB,CACd,GAAI,EAAM,CACR,EAAe,EAAE,CACjB,EAAe,GAAG,CAElB,IAAM,EAAK,0BAA4B,CACjC,GAAc,EAAU,QAC1B,EAAU,QAAQ,OAAO,EAEX,EAAU,SAAS,cAA2B,EAAU,GAC/D,OAAO,EAEhB,CACF,UAAa,qBAAqB,EAAG,GAEtC,CAAC,EAAM,EAAW,CAAC,CAGtB,IAAM,GAAA,EAAA,EAAA,aACH,GAAqC,CACpC,GAAI,EAAE,MAAQ,SAAU,CACtB,EAAE,iBAAiB,CACnB,GAAS,CACT,OAEF,EAAU,EAAG,EAAU,EAEzB,CAAC,EAAQ,CACV,CAEK,EAAY,EAAM,OAAS,EAC3B,EAAa,EAAM,IAAgB,EAAM,GAGzC,EAAQ,EAAY,MAAM,CAAC,aAAa,CAI9C,OAFK,GAEL,EAAA,EAAA,eACE,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,QAAO,SAClB,QAAU,GAAM,CACV,EAAE,SAAW,EAAE,eAAe,GAAS,EAE7C,KAAK,yBAEL,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,KAAK,SACL,aAAW,OACX,kBAAiB,EACjB,UAAW,CACT,EAAA,QAAO,OACP,EAAY,EAAA,QAAO,YAAc,KACjC,EACD,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,UAAW,EACX,GAAI,WAbN,EAgBE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBAAvB,EACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAA,QAAO,SAClB,QAAS,EACT,aAAW,6BACZ,IAEQ,CAAA,EACT,EAAA,EAAA,KAAC,OAAD,CAAM,GAAI,EAAS,UAAW,EAAA,QAAO,eAAO,cAErC,CAAA,CACN,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,qBACrB,EAAA,EAAA,KAAC,QAAD,CACE,IAAK,EACL,KAAK,SACL,YAAY,UACZ,MAAO,EACP,SAAW,GAAM,EAAe,EAAE,OAAO,MAAM,CAC/C,UAAW,EAAA,QAAO,YAClB,aAAW,qBACX,CAAA,CACE,CAAA,CAEJ,IAGN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,QAAO,cAAvB,CAEG,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAS,aAAW,8BACzC,EAAA,EAAA,KAAC,KAAD,CAAI,KAAK,UAAU,UAAW,EAAA,QAAO,iBAClC,EAAM,KAAK,EAAM,KAChB,EAAA,EAAA,KAAC,KAAD,CAAY,KAAK,yBACf,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,MACL,KAAK,SACL,gBAAe,IAAM,EACrB,UAAW,CACT,EAAA,QAAO,QACP,IAAM,EAAc,EAAA,QAAO,cAAgB,KAC5C,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,YAAe,EAAe,EAAE,UAVlC,CAYG,EAAK,MAAM,WACV,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,CACT,EAAA,QAAO,QACP,OACA,EAAK,MAAM,SACZ,CAAC,KAAK,IAAI,CACX,cAAY,OACZ,CAAA,EAEJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,kBACrB,EAAK,MAAM,MACP,CAAA,CACA,GACN,CA3BI,EA2BJ,CACL,CACC,CAAA,CACD,CAAA,EAIR,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,kBACpB,IAAA,EAAA,EAAA,cACc,EAAY,CACvB,oBAAqB,GAAS,IAAA,GAC/B,CAAkC,CACjC,CAAA,CACF,GACF,GACF,CAAA,CACN,SAAS,KACV,CAxGiB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import e from "./PreferencesDialog.module.css.js";
|
|
2
|
+
import { Children as t, cloneElement as n, isValidElement as r, useCallback as i, useEffect as a, useId as o, useRef as s, useState as c } from "react";
|
|
3
|
+
import { createPortal as l } from "react-dom";
|
|
4
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/PreferencesDialog/PreferencesDialog.tsx
|
|
6
|
+
var f = "button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])";
|
|
7
|
+
function p(e, t) {
|
|
8
|
+
if (e.key !== "Tab") return;
|
|
9
|
+
let n = Array.from(t.current?.querySelectorAll(f) ?? []);
|
|
10
|
+
if (!n.length) return;
|
|
11
|
+
let r = n[0], i = n[n.length - 1];
|
|
12
|
+
e.shiftKey ? document.activeElement === r && (e.preventDefault(), i.focus()) : document.activeElement === i && (e.preventDefault(), r.focus());
|
|
13
|
+
}
|
|
14
|
+
function m({ open: m, onClose: h, children: g, searchable: _ = !0, className: v, ...y }) {
|
|
15
|
+
let b = s(null), x = s(null), S = o(), C = t.toArray(g).filter((e) => r(e)), [w, T] = c(0), [E, D] = c("");
|
|
16
|
+
a(() => {
|
|
17
|
+
if (m) {
|
|
18
|
+
T(0), D("");
|
|
19
|
+
let e = requestAnimationFrame(() => {
|
|
20
|
+
_ && x.current ? x.current.focus() : (b.current?.querySelector(f))?.focus();
|
|
21
|
+
});
|
|
22
|
+
return () => cancelAnimationFrame(e);
|
|
23
|
+
}
|
|
24
|
+
}, [m, _]);
|
|
25
|
+
let O = i((e) => {
|
|
26
|
+
if (e.key === "Escape") {
|
|
27
|
+
e.stopPropagation(), h();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
p(e, b);
|
|
31
|
+
}, [h]), k = C.length > 1, A = C[w] ?? C[0], j = E.trim().toLowerCase();
|
|
32
|
+
return m ? l(/* @__PURE__ */ u("div", {
|
|
33
|
+
className: e.backdrop,
|
|
34
|
+
onClick: (e) => {
|
|
35
|
+
e.target === e.currentTarget && h();
|
|
36
|
+
},
|
|
37
|
+
role: "presentation",
|
|
38
|
+
children: /* @__PURE__ */ d("div", {
|
|
39
|
+
ref: b,
|
|
40
|
+
role: "dialog",
|
|
41
|
+
"aria-modal": "true",
|
|
42
|
+
"aria-labelledby": S,
|
|
43
|
+
className: [
|
|
44
|
+
e.dialog,
|
|
45
|
+
k ? e.dialogMulti : null,
|
|
46
|
+
v
|
|
47
|
+
].filter(Boolean).join(" "),
|
|
48
|
+
onKeyDown: O,
|
|
49
|
+
...y,
|
|
50
|
+
children: [/* @__PURE__ */ d("div", {
|
|
51
|
+
className: e.header,
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ u("button", {
|
|
54
|
+
type: "button",
|
|
55
|
+
className: e.closeBtn,
|
|
56
|
+
onClick: h,
|
|
57
|
+
"aria-label": "Close preferences",
|
|
58
|
+
children: "✕"
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ u("span", {
|
|
61
|
+
id: S,
|
|
62
|
+
className: e.title,
|
|
63
|
+
children: "Preferences"
|
|
64
|
+
}),
|
|
65
|
+
_ && /* @__PURE__ */ u("div", {
|
|
66
|
+
className: e.searchWrap,
|
|
67
|
+
children: /* @__PURE__ */ u("input", {
|
|
68
|
+
ref: x,
|
|
69
|
+
type: "search",
|
|
70
|
+
placeholder: "Search…",
|
|
71
|
+
value: E,
|
|
72
|
+
onChange: (e) => D(e.target.value),
|
|
73
|
+
className: e.searchInput,
|
|
74
|
+
"aria-label": "Search preferences"
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
]
|
|
78
|
+
}), /* @__PURE__ */ d("div", {
|
|
79
|
+
className: e.body,
|
|
80
|
+
children: [k && /* @__PURE__ */ u("nav", {
|
|
81
|
+
className: e.sidebar,
|
|
82
|
+
"aria-label": "Preferences pages",
|
|
83
|
+
children: /* @__PURE__ */ u("ul", {
|
|
84
|
+
role: "tablist",
|
|
85
|
+
className: e.navList,
|
|
86
|
+
children: C.map((t, n) => /* @__PURE__ */ u("li", {
|
|
87
|
+
role: "presentation",
|
|
88
|
+
children: /* @__PURE__ */ d("button", {
|
|
89
|
+
role: "tab",
|
|
90
|
+
type: "button",
|
|
91
|
+
"aria-selected": n === w,
|
|
92
|
+
className: [e.navItem, n === w ? e.navItemActive : null].filter(Boolean).join(" "),
|
|
93
|
+
onClick: () => T(n),
|
|
94
|
+
children: [t.props.iconName && /* @__PURE__ */ u("span", {
|
|
95
|
+
className: [
|
|
96
|
+
e.navIcon,
|
|
97
|
+
"icon",
|
|
98
|
+
t.props.iconName
|
|
99
|
+
].join(" "),
|
|
100
|
+
"aria-hidden": "true"
|
|
101
|
+
}), /* @__PURE__ */ u("span", {
|
|
102
|
+
className: e.navLabel,
|
|
103
|
+
children: t.props.title
|
|
104
|
+
})]
|
|
105
|
+
})
|
|
106
|
+
}, n))
|
|
107
|
+
})
|
|
108
|
+
}), /* @__PURE__ */ u("div", {
|
|
109
|
+
className: e.pageWrap,
|
|
110
|
+
children: A && n(A, { "data-search-query": j || void 0 })
|
|
111
|
+
})]
|
|
112
|
+
})]
|
|
113
|
+
})
|
|
114
|
+
}), document.body) : null;
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { m as PreferencesDialog };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=PreferencesDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesDialog.js","names":[],"sources":["../../../src/components/PreferencesDialog/PreferencesDialog.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./PreferencesDialog.module.css\";\nimport type { PreferencesPageProps } from \"../PreferencesPage/PreferencesPage\";\n\n// ─── Focus trap ───────────────────────────────────────────────────────────────\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction trapFocus(\n e: KeyboardEvent<HTMLDivElement>,\n ref: React.RefObject<HTMLDivElement | null>\n) {\n if (e.key !== \"Tab\") return;\n const focusable = Array.from(\n ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []\n );\n if (!focusable.length) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PreferencesDialogProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the user requests to close the dialog. */\n onClose: () => void;\n /**\n * `PreferencesPage` children. Each page appears as a sidebar entry.\n * When only one page is provided the sidebar is hidden.\n */\n children?: ReactNode;\n /**\n * Whether to show a search bar in the header.\n * When `true` the user can filter group/row content by typing.\n * Defaults to `true`.\n */\n searchable?: boolean;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Multi-page settings dialog using `PreferencesPage` tabs.\n *\n * Renders a wide modal with an optional sidebar listing pages. Each\n * `PreferencesPage` child becomes a navigation entry. Supports built-in\n * search when `searchable` is `true` (the default).\n *\n * Mirrors `AdwPreferencesDialog`.\n *\n * @example\n * ```tsx\n * <PreferencesDialog open={open} onClose={() => setOpen(false)}>\n * <PreferencesPage title=\"General\" iconName=\"preferences-system-symbolic\">\n * <PreferencesGroup title=\"Appearance\">\n * <BoxedList>\n * <SwitchRow title=\"Dark mode\" />\n * </BoxedList>\n * </PreferencesGroup>\n * </PreferencesPage>\n * </PreferencesDialog>\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.PreferencesDialog.html\n */\nexport function PreferencesDialog({\n open,\n onClose,\n children,\n searchable = true,\n className,\n ...props\n}: PreferencesDialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const titleId = useId();\n\n const pages = Children.toArray(children).filter(\n (c): c is ReactElement<PreferencesPageProps> =>\n isValidElement(c)\n ) as ReactElement<PreferencesPageProps>[];\n\n const [activeIndex, setActiveIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Reset state when dialog opens\n useEffect(() => {\n if (open) {\n setActiveIndex(0);\n setSearchQuery(\"\");\n // Focus search or first focusable after open animation\n const id = requestAnimationFrame(() => {\n if (searchable && searchRef.current) {\n searchRef.current.focus();\n } else {\n const first = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n first?.focus();\n }\n });\n return () => cancelAnimationFrame(id);\n }\n }, [open, searchable]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onClose();\n return;\n }\n trapFocus(e, dialogRef);\n },\n [onClose]\n );\n\n const multiPage = pages.length > 1;\n const activePage = pages[activeIndex] ?? pages[0];\n\n // Filter content by search query\n const query = searchQuery.trim().toLowerCase();\n\n if (!open) return null;\n\n return createPortal(\n <div\n className={styles.backdrop}\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[\n styles.dialog,\n multiPage ? styles.dialogMulti : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {/* ── Header ─────────────────────────────────────────────────────── */}\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.closeBtn}\n onClick={onClose}\n aria-label=\"Close preferences\"\n >\n ✕\n </button>\n <span id={titleId} className={styles.title}>\n Preferences\n </span>\n {searchable && (\n <div className={styles.searchWrap}>\n <input\n ref={searchRef}\n type=\"search\"\n placeholder=\"Search…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={styles.searchInput}\n aria-label=\"Search preferences\"\n />\n </div>\n )}\n </div>\n\n {/* ── Body ───────────────────────────────────────────────────────── */}\n <div className={styles.body}>\n {/* Sidebar — only shown when there are multiple pages */}\n {multiPage && (\n <nav className={styles.sidebar} aria-label=\"Preferences pages\">\n <ul role=\"tablist\" className={styles.navList}>\n {pages.map((page, i) => (\n <li key={i} role=\"presentation\">\n <button\n role=\"tab\"\n type=\"button\"\n aria-selected={i === activeIndex}\n className={[\n styles.navItem,\n i === activeIndex ? styles.navItemActive : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveIndex(i)}\n >\n {page.props.iconName && (\n <span\n className={[\n styles.navIcon,\n \"icon\",\n page.props.iconName,\n ].join(\" \")}\n aria-hidden=\"true\"\n />\n )}\n <span className={styles.navLabel}>\n {page.props.title}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </nav>\n )}\n\n {/* Page content */}\n <div className={styles.pageWrap}>\n {activePage &&\n cloneElement(activePage, {\n \"data-search-query\": query || undefined,\n } as Partial<PreferencesPageProps>)}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=`_backdrop_1u1bd_3`,t=`_dialog_1u1bd_26`,n=`_dialogMulti_1u1bd_46`,r=`_header_1u1bd_63`,i=`_closeBtn_1u1bd_73`,a=`_title_1u1bd_102`,o=`_searchWrap_1u1bd_112`,s=`_searchInput_1u1bd_116`,c=`_body_1u1bd_143`,l=`_sidebar_1u1bd_152`,u=`_navList_1u1bd_160`,d=`_navItem_1u1bd_169`,f=`_navItemActive_1u1bd_190`,p=`_navIcon_1u1bd_205`,m=`_navLabel_1u1bd_211`,h=`_pageWrap_1u1bd_221`,g={backdrop:e,"backdrop-in":`_backdrop-in_1u1bd_1`,dialog:t,"dialog-in":`_dialog-in_1u1bd_1`,dialogMulti:n,header:r,closeBtn:i,title:a,searchWrap:o,searchInput:s,body:c,sidebar:l,navList:u,navItem:d,navItemActive:f,navIcon:p,navLabel:m,pageWrap:h};exports.default=g;
|
|
2
|
+
//# sourceMappingURL=PreferencesDialog.module.css.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesDialog.module.css.cjs","names":[],"sources":["../../../src/components/PreferencesDialog/PreferencesDialog.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ─── Dialog card ───────────────────────────────────────────────────────────── */\n\n.dialog {\n display: flex;\n flex-direction: column;\n width: min(540px, calc(100vw - 48px));\n max-height: min(640px, 90dvh);\n\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border-radius: var(--gnome-radius-xl, 16px);\n box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.25),\n 0 0 0 1px rgba(0, 0, 0, 0.08);\n\n overflow: hidden;\n\n animation: dialog-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Wider layout when sidebar is present */\n.dialogMulti {\n width: min(720px, calc(100vw - 48px));\n}\n\n@keyframes dialog-in {\n from {\n opacity: 0;\n transform: scale(0.94) translateY(-8px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* ─── Header ────────────────────────────────────────────────────────────────── */\n\n.header {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: var(--gnome-space-2, 12px);\n padding: var(--gnome-space-2, 12px) var(--gnome-space-2, 12px) var(--gnome-space-2, 12px) var(--gnome-space-3, 16px);\n border-bottom: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n flex-shrink: 0;\n}\n\n.closeBtn {\n appearance: none;\n border: none;\n background: transparent;\n cursor: pointer;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n opacity: 0.6;\n transition: background-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n opacity var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n order: -1;\n}\n\n.closeBtn:hover {\n background-color: color-mix(in srgb, currentColor 10%, transparent);\n opacity: 1;\n}\n\n.closeBtn:focus-visible {\n outline: var(--gnome-focus-ring-width, 3px) solid var(--gnome-focus-ring-color, #3584e4);\n outline-offset: 2px;\n}\n\n.title {\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-semibold, 600);\n line-height: 1;\n text-align: center;\n}\n\n/* ─── Search ────────────────────────────────────────────────────────────────── */\n\n.searchWrap {\n grid-column: 3;\n}\n\n.searchInput {\n appearance: none;\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.15));\n border-radius: var(--gnome-radius-md, 8px);\n background-color: var(--gnome-card-bg-color, rgba(0, 0, 0, 0.04));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n padding: 5px var(--gnome-space-2, 12px);\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n line-height: 1.5;\n width: 180px;\n transition: border-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n box-shadow var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n}\n\n.searchInput::placeholder {\n opacity: 0.5;\n}\n\n.searchInput:focus {\n outline: none;\n border-color: var(--gnome-accent-color, #3584e4);\n box-shadow: 0 0 0 var(--gnome-focus-ring-width, 3px) color-mix(in srgb, var(--gnome-accent-color, #3584e4) 30%, transparent);\n}\n\n/* ─── Body ──────────────────────────────────────────────────────────────────── */\n\n.body {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* ─── Sidebar ───────────────────────────────────────────────────────────────── */\n\n.sidebar {\n width: 200px;\n flex-shrink: 0;\n border-right: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n overflow-y: auto;\n padding: var(--gnome-space-2, 12px) var(--gnome-space-2, 12px);\n}\n\n.navList {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.navItem {\n appearance: none;\n border: none;\n background: transparent;\n cursor: pointer;\n width: 100%;\n padding: 8px var(--gnome-space-2, 12px);\n border-radius: var(--gnome-radius-md, 8px);\n display: flex;\n align-items: center;\n gap: var(--gnome-space-2, 12px);\n text-align: left;\n\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-normal, 400);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n transition: background-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n}\n\n.navItem:hover:not(.navItemActive) {\n background-color: color-mix(in srgb, currentColor 6%, transparent);\n}\n\n.navItemActive {\n background-color: color-mix(in srgb, var(--gnome-accent-color, #3584e4) 12%, transparent);\n color: var(--gnome-accent-color, #3584e4);\n font-weight: var(--gnome-font-weight-semibold, 600);\n}\n\n.navItem:focus-visible {\n outline: var(--gnome-focus-ring-width, 3px) solid var(--gnome-focus-ring-color, #3584e4);\n outline-offset: 2px;\n}\n\n.navIcon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n.navLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ─── Page area ─────────────────────────────────────────────────────────────── */\n\n.pageWrap {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgba(0, 0, 0, 0.65);\n }\n\n .dialog {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.5),\n 0 0 0 1px rgba(255, 255, 255, 0.08);\n }\n\n .header {\n border-bottom-color: rgba(255, 255, 255, 0.08);\n }\n\n .sidebar {\n border-right-color: rgba(255, 255, 255, 0.08);\n }\n\n .searchInput {\n background-color: rgba(255, 255, 255, 0.06);\n border-color: rgba(255, 255, 255, 0.15);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .dialog {\n animation: none;\n }\n\n .closeBtn,\n .navItem,\n .searchInput {\n transition: none;\n }\n}\n\n/* ─── High contrast ─────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .dialog {\n box-shadow: none;\n border: 2px solid var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n }\n\n .header {\n border-bottom-width: 2px;\n }\n\n .sidebar {\n border-right-width: 2px;\n }\n\n .navItemActive {\n outline: 2px solid var(--gnome-accent-color, #3584e4);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/components/PreferencesDialog/PreferencesDialog.module.css
|
|
2
|
+
var e = "_backdrop_1u1bd_3", t = "_dialog_1u1bd_26", n = "_dialogMulti_1u1bd_46", r = "_header_1u1bd_63", i = "_closeBtn_1u1bd_73", a = "_title_1u1bd_102", o = "_searchWrap_1u1bd_112", s = "_searchInput_1u1bd_116", c = "_body_1u1bd_143", l = "_sidebar_1u1bd_152", u = "_navList_1u1bd_160", d = "_navItem_1u1bd_169", f = "_navItemActive_1u1bd_190", p = "_navIcon_1u1bd_205", m = "_navLabel_1u1bd_211", h = "_pageWrap_1u1bd_221", g = {
|
|
3
|
+
backdrop: e,
|
|
4
|
+
"backdrop-in": "_backdrop-in_1u1bd_1",
|
|
5
|
+
dialog: t,
|
|
6
|
+
"dialog-in": "_dialog-in_1u1bd_1",
|
|
7
|
+
dialogMulti: n,
|
|
8
|
+
header: r,
|
|
9
|
+
closeBtn: i,
|
|
10
|
+
title: a,
|
|
11
|
+
searchWrap: o,
|
|
12
|
+
searchInput: s,
|
|
13
|
+
body: c,
|
|
14
|
+
sidebar: l,
|
|
15
|
+
navList: u,
|
|
16
|
+
navItem: d,
|
|
17
|
+
navItemActive: f,
|
|
18
|
+
navIcon: p,
|
|
19
|
+
navLabel: m,
|
|
20
|
+
pageWrap: h
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { g as default };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=PreferencesDialog.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesDialog.module.css.js","names":[],"sources":["../../../src/components/PreferencesDialog/PreferencesDialog.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ─── Dialog card ───────────────────────────────────────────────────────────── */\n\n.dialog {\n display: flex;\n flex-direction: column;\n width: min(540px, calc(100vw - 48px));\n max-height: min(640px, 90dvh);\n\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border-radius: var(--gnome-radius-xl, 16px);\n box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.25),\n 0 0 0 1px rgba(0, 0, 0, 0.08);\n\n overflow: hidden;\n\n animation: dialog-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Wider layout when sidebar is present */\n.dialogMulti {\n width: min(720px, calc(100vw - 48px));\n}\n\n@keyframes dialog-in {\n from {\n opacity: 0;\n transform: scale(0.94) translateY(-8px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* ─── Header ────────────────────────────────────────────────────────────────── */\n\n.header {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: var(--gnome-space-2, 12px);\n padding: var(--gnome-space-2, 12px) var(--gnome-space-2, 12px) var(--gnome-space-2, 12px) var(--gnome-space-3, 16px);\n border-bottom: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n flex-shrink: 0;\n}\n\n.closeBtn {\n appearance: none;\n border: none;\n background: transparent;\n cursor: pointer;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n opacity: 0.6;\n transition: background-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n opacity var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n order: -1;\n}\n\n.closeBtn:hover {\n background-color: color-mix(in srgb, currentColor 10%, transparent);\n opacity: 1;\n}\n\n.closeBtn:focus-visible {\n outline: var(--gnome-focus-ring-width, 3px) solid var(--gnome-focus-ring-color, #3584e4);\n outline-offset: 2px;\n}\n\n.title {\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-semibold, 600);\n line-height: 1;\n text-align: center;\n}\n\n/* ─── Search ────────────────────────────────────────────────────────────────── */\n\n.searchWrap {\n grid-column: 3;\n}\n\n.searchInput {\n appearance: none;\n border: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.15));\n border-radius: var(--gnome-radius-md, 8px);\n background-color: var(--gnome-card-bg-color, rgba(0, 0, 0, 0.04));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n padding: 5px var(--gnome-space-2, 12px);\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n line-height: 1.5;\n width: 180px;\n transition: border-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease),\n box-shadow var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n}\n\n.searchInput::placeholder {\n opacity: 0.5;\n}\n\n.searchInput:focus {\n outline: none;\n border-color: var(--gnome-accent-color, #3584e4);\n box-shadow: 0 0 0 var(--gnome-focus-ring-width, 3px) color-mix(in srgb, var(--gnome-accent-color, #3584e4) 30%, transparent);\n}\n\n/* ─── Body ──────────────────────────────────────────────────────────────────── */\n\n.body {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* ─── Sidebar ───────────────────────────────────────────────────────────────── */\n\n.sidebar {\n width: 200px;\n flex-shrink: 0;\n border-right: 1px solid var(--gnome-card-shade-color, rgba(0, 0, 0, 0.1));\n overflow-y: auto;\n padding: var(--gnome-space-2, 12px) var(--gnome-space-2, 12px);\n}\n\n.navList {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.navItem {\n appearance: none;\n border: none;\n background: transparent;\n cursor: pointer;\n width: 100%;\n padding: 8px var(--gnome-space-2, 12px);\n border-radius: var(--gnome-radius-md, 8px);\n display: flex;\n align-items: center;\n gap: var(--gnome-space-2, 12px);\n text-align: left;\n\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-normal, 400);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n transition: background-color var(--gnome-duration-fast, 100ms) var(--gnome-easing-default, ease);\n}\n\n.navItem:hover:not(.navItemActive) {\n background-color: color-mix(in srgb, currentColor 6%, transparent);\n}\n\n.navItemActive {\n background-color: color-mix(in srgb, var(--gnome-accent-color, #3584e4) 12%, transparent);\n color: var(--gnome-accent-color, #3584e4);\n font-weight: var(--gnome-font-weight-semibold, 600);\n}\n\n.navItem:focus-visible {\n outline: var(--gnome-focus-ring-width, 3px) solid var(--gnome-focus-ring-color, #3584e4);\n outline-offset: 2px;\n}\n\n.navIcon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n.navLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ─── Page area ─────────────────────────────────────────────────────────────── */\n\n.pageWrap {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgba(0, 0, 0, 0.65);\n }\n\n .dialog {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.5),\n 0 0 0 1px rgba(255, 255, 255, 0.08);\n }\n\n .header {\n border-bottom-color: rgba(255, 255, 255, 0.08);\n }\n\n .sidebar {\n border-right-color: rgba(255, 255, 255, 0.08);\n }\n\n .searchInput {\n background-color: rgba(255, 255, 255, 0.06);\n border-color: rgba(255, 255, 255, 0.15);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .dialog {\n animation: none;\n }\n\n .closeBtn,\n .navItem,\n .searchInput {\n transition: none;\n }\n}\n\n/* ─── High contrast ─────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .dialog {\n box-shadow: none;\n border: 2px solid var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n }\n\n .header {\n border-bottom-width: 2px;\n }\n\n .sidebar {\n border-right-width: 2px;\n }\n\n .navItemActive {\n outline: 2px solid var(--gnome-accent-color, #3584e4);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./PreferencesDialog/PreferencesDialog.cjs`);exports.PreferencesDialog=e.PreferencesDialog;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./PreferencesGroup.module.css.cjs`);let t=require(`react/jsx-runtime`);function n({title:n,description:r,headerSuffix:i,children:a,className:o,...s}){let c=n||r||i;return(0,t.jsxs)(`div`,{className:[e.default.group,o].filter(Boolean).join(` `),...s,children:[c&&(0,t.jsxs)(`div`,{className:e.default.header,children:[(0,t.jsxs)(`div`,{className:e.default.headerText,children:[n&&(0,t.jsx)(`span`,{className:e.default.title,children:n}),r&&(0,t.jsx)(`span`,{className:e.default.description,children:r})]}),i&&(0,t.jsx)(`div`,{className:e.default.suffix,children:i})]}),(0,t.jsx)(`div`,{className:e.default.content,children:a})]})}exports.PreferencesGroup=n;
|
|
2
|
+
//# sourceMappingURL=PreferencesGroup.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesGroup.cjs","names":[],"sources":["../../../src/components/PreferencesGroup/PreferencesGroup.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode } from \"react\";\nimport styles from \"./PreferencesGroup.module.css\";\n\nexport interface PreferencesGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Group heading. */\n title?: string;\n /** Optional description rendered below the title. */\n description?: string;\n /** Widget placed at the trailing edge of the title row (e.g. a reset Button). */\n headerSuffix?: ReactNode;\n /** `BoxedList` rows or any row-shaped content. */\n children?: ReactNode;\n}\n\n/**\n * Titled section that wraps a `BoxedList` with an optional description.\n *\n * Use inside a `PreferencesPage` to group related settings under a named\n * heading. The group is purely a layout and labelling wrapper — it does not\n * render the `BoxedList` itself; pass it as `children`.\n *\n * Mirrors `AdwPreferencesGroup`.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.PreferencesGroup.html\n */\nexport function PreferencesGroup({\n title,\n description,\n headerSuffix,\n children,\n className,\n ...props\n}: PreferencesGroupProps) {\n const hasHeader = title || description || headerSuffix;\n\n return (\n <div\n className={[styles.group, className].filter(Boolean).join(\" \")}\n {...props}\n >\n {hasHeader && (\n <div className={styles.header}>\n <div className={styles.headerText}>\n {title && <span className={styles.title}>{title}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </div>\n {headerSuffix && <div className={styles.suffix}>{headerSuffix}</div>}\n </div>\n )}\n <div className={styles.content}>{children}</div>\n </div>\n );\n}\n"],"mappings":"wFAyBA,SAAgB,EAAiB,CAC/B,QACA,cACA,eACA,WACA,YACA,GAAG,GACqB,CACxB,IAAM,EAAY,GAAS,GAAe,EAE1C,OACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,CAAC,EAAA,QAAO,MAAO,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAC9D,GAAI,WAFN,CAIG,IACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBAAvB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,QAAO,oBAAvB,CACG,IAAS,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAa,CAAA,CACtD,IAAe,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,qBAAc,EAAmB,CAAA,CACrE,GACL,IAAgB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBAAS,EAAmB,CAAA,CAChE,IAER,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,WAAe,CAAA,CAC5C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import e from "./PreferencesGroup.module.css.js";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/PreferencesGroup/PreferencesGroup.tsx
|
|
4
|
+
function r({ title: r, description: i, headerSuffix: a, children: o, className: s, ...c }) {
|
|
5
|
+
let l = r || i || a;
|
|
6
|
+
return /* @__PURE__ */ n("div", {
|
|
7
|
+
className: [e.group, s].filter(Boolean).join(" "),
|
|
8
|
+
...c,
|
|
9
|
+
children: [l && /* @__PURE__ */ n("div", {
|
|
10
|
+
className: e.header,
|
|
11
|
+
children: [/* @__PURE__ */ n("div", {
|
|
12
|
+
className: e.headerText,
|
|
13
|
+
children: [r && /* @__PURE__ */ t("span", {
|
|
14
|
+
className: e.title,
|
|
15
|
+
children: r
|
|
16
|
+
}), i && /* @__PURE__ */ t("span", {
|
|
17
|
+
className: e.description,
|
|
18
|
+
children: i
|
|
19
|
+
})]
|
|
20
|
+
}), a && /* @__PURE__ */ t("div", {
|
|
21
|
+
className: e.suffix,
|
|
22
|
+
children: a
|
|
23
|
+
})]
|
|
24
|
+
}), /* @__PURE__ */ t("div", {
|
|
25
|
+
className: e.content,
|
|
26
|
+
children: o
|
|
27
|
+
})]
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { r as PreferencesGroup };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=PreferencesGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferencesGroup.js","names":[],"sources":["../../../src/components/PreferencesGroup/PreferencesGroup.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode } from \"react\";\nimport styles from \"./PreferencesGroup.module.css\";\n\nexport interface PreferencesGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Group heading. */\n title?: string;\n /** Optional description rendered below the title. */\n description?: string;\n /** Widget placed at the trailing edge of the title row (e.g. a reset Button). */\n headerSuffix?: ReactNode;\n /** `BoxedList` rows or any row-shaped content. */\n children?: ReactNode;\n}\n\n/**\n * Titled section that wraps a `BoxedList` with an optional description.\n *\n * Use inside a `PreferencesPage` to group related settings under a named\n * heading. The group is purely a layout and labelling wrapper — it does not\n * render the `BoxedList` itself; pass it as `children`.\n *\n * Mirrors `AdwPreferencesGroup`.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.PreferencesGroup.html\n */\nexport function PreferencesGroup({\n title,\n description,\n headerSuffix,\n children,\n className,\n ...props\n}: PreferencesGroupProps) {\n const hasHeader = title || description || headerSuffix;\n\n return (\n <div\n className={[styles.group, className].filter(Boolean).join(\" \")}\n {...props}\n >\n {hasHeader && (\n <div className={styles.header}>\n <div className={styles.headerText}>\n {title && <span className={styles.title}>{title}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </div>\n {headerSuffix && <div className={styles.suffix}>{headerSuffix}</div>}\n </div>\n )}\n <div className={styles.content}>{children}</div>\n </div>\n );\n}\n"],"mappings":";;;AAyBA,SAAgB,EAAiB,EAC/B,UACA,gBACA,iBACA,aACA,cACA,GAAG,KACqB;CACxB,IAAM,IAAY,KAAS,KAAe;AAE1C,QACE,kBAAC,OAAD;EACE,WAAW,CAAC,EAAO,OAAO,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EAC9D,GAAI;YAFN,CAIG,KACC,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB,CACE,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACG,KAAS,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAQ;KAAa,CAAA,EACtD,KAAe,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAc;KAAmB,CAAA,CACrE;OACL,KAAgB,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAS;IAAmB,CAAA,CAChE;MAER,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAU;GAAe,CAAA,CAC5C"}
|