@jbpark/ui-kit 10.2.0 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +97 -76
- package/README.md +91 -70
- package/dist/Alert.d.mts +2 -2
- package/dist/Alert.d.mts.map +1 -1
- package/dist/Alert.mjs +1 -1
- package/dist/Anchor.d.mts +29 -0
- package/dist/Anchor.d.mts.map +1 -0
- package/dist/Anchor.mjs +120 -0
- package/dist/Anchor.mjs.map +1 -0
- package/dist/AutoComplete.d.mts +34 -0
- package/dist/AutoComplete.d.mts.map +1 -0
- package/dist/AutoComplete.mjs +82 -0
- package/dist/AutoComplete.mjs.map +1 -0
- package/dist/Avatar.d.mts +2 -2
- package/dist/Avatar.d.mts.map +1 -1
- package/dist/Avatar.mjs +2 -2
- package/dist/Badge.d.mts +2 -2
- package/dist/Badge.d.mts.map +1 -1
- package/dist/Breadcrumb.d.mts +3 -3
- package/dist/Breadcrumb.d.mts.map +1 -1
- package/dist/Breadcrumb.mjs +2 -2
- package/dist/Breadcrumb.mjs.map +1 -1
- package/dist/Button.d.mts +3 -3
- package/dist/Button.d.mts.map +1 -1
- package/dist/Button.mjs +1 -1
- package/dist/Calendar.d.mts +28 -0
- package/dist/Calendar.d.mts.map +1 -0
- package/dist/Calendar.mjs +64 -0
- package/dist/Calendar.mjs.map +1 -0
- package/dist/Card.d.mts +2 -2
- package/dist/Card.d.mts.map +1 -1
- package/dist/Cascader.d.mts +34 -0
- package/dist/Cascader.d.mts.map +1 -0
- package/dist/Cascader.mjs +144 -0
- package/dist/Cascader.mjs.map +1 -0
- package/dist/Checkbox.d.mts +10 -0
- package/dist/Checkbox.d.mts.map +1 -0
- package/dist/Checkbox.mjs +9 -0
- package/dist/Checkbox.mjs.map +1 -0
- package/dist/CodeEditor.d.mts +10 -4
- package/dist/CodeEditor.d.mts.map +1 -1
- package/dist/CodeEditor.mjs +9 -4
- package/dist/CodeEditor.mjs.map +1 -1
- package/dist/{components/molecules/collapse.d.mts → Collapse.d.mts} +3 -3
- package/dist/Collapse.d.mts.map +1 -0
- package/dist/{components/molecules/collapse.mjs → Collapse.mjs} +3 -3
- package/dist/Collapse.mjs.map +1 -0
- package/dist/{components/atoms/color-picker.d.mts → ColorPicker.d.mts} +3 -3
- package/dist/ColorPicker.d.mts.map +1 -0
- package/dist/{components/atoms/color-picker.mjs → ColorPicker.mjs} +3 -3
- package/dist/ColorPicker.mjs.map +1 -0
- package/dist/{components/templates/container.d.mts → Container.d.mts} +3 -3
- package/dist/Container.d.mts.map +1 -0
- package/dist/{components/templates/container.mjs → Container.mjs} +2 -2
- package/dist/Container.mjs.map +1 -0
- package/dist/ContextMenu.d.mts +33 -0
- package/dist/ContextMenu.d.mts.map +1 -0
- package/dist/ContextMenu.mjs +92 -0
- package/dist/ContextMenu.mjs.map +1 -0
- package/dist/{components/atoms/date-picker.d.mts → DatePicker.d.mts} +6 -2
- package/dist/DatePicker.d.mts.map +1 -0
- package/dist/DatePicker.mjs +88 -0
- package/dist/DatePicker.mjs.map +1 -0
- package/dist/Descriptions.d.mts +31 -0
- package/dist/Descriptions.d.mts.map +1 -0
- package/dist/Descriptions.mjs +67 -0
- package/dist/Descriptions.mjs.map +1 -0
- package/dist/Divider.d.mts +18 -0
- package/dist/Divider.d.mts.map +1 -0
- package/dist/Divider.mjs +44 -0
- package/dist/Divider.mjs.map +1 -0
- package/dist/{components/organisms/drawer.d.mts → Drawer.d.mts} +3 -3
- package/dist/Drawer.d.mts.map +1 -0
- package/dist/{components/organisms/drawer.mjs → Drawer.mjs} +6 -6
- package/dist/Drawer.mjs.map +1 -0
- package/dist/{components/molecules/dropdown.d.mts → Dropdown.d.mts} +4 -4
- package/dist/Dropdown.d.mts.map +1 -0
- package/dist/{components/molecules/dropdown.mjs → Dropdown.mjs} +4 -4
- package/dist/Dropdown.mjs.map +1 -0
- package/dist/{components/templates/empty.d.mts → Empty.d.mts} +4 -4
- package/dist/Empty.d.mts.map +1 -0
- package/dist/{components/templates/empty.mjs → Empty.mjs} +4 -4
- package/dist/Empty.mjs.map +1 -0
- package/dist/FloatButton.d.mts +10 -0
- package/dist/FloatButton.d.mts.map +1 -0
- package/dist/FloatButton.mjs +9 -0
- package/dist/FloatButton.mjs.map +1 -0
- package/dist/Form.d.mts +12 -0
- package/dist/Form.d.mts.map +1 -0
- package/dist/Form.mjs +11 -0
- package/dist/Form.mjs.map +1 -0
- package/dist/Input.d.mts +16 -0
- package/dist/Input.d.mts.map +1 -0
- package/dist/Input.mjs +15 -0
- package/dist/Input.mjs.map +1 -0
- package/dist/Layout.d.mts.map +1 -1
- package/dist/{components/organisms/list/index.d.mts → List.d.mts} +3 -3
- package/dist/List.d.mts.map +1 -0
- package/dist/List.mjs +9 -0
- package/dist/List.mjs.map +1 -0
- package/dist/Marquees.d.mts +10 -0
- package/dist/Marquees.d.mts.map +1 -0
- package/dist/Marquees.mjs +9 -0
- package/dist/Marquees.mjs.map +1 -0
- package/dist/Mentions.d.mts +34 -0
- package/dist/Mentions.d.mts.map +1 -0
- package/dist/Mentions.mjs +208 -0
- package/dist/Mentions.mjs.map +1 -0
- package/dist/Menu.mjs +1 -2
- package/dist/{components/organisms/modal.d.mts → Modal.d.mts} +7 -4
- package/dist/Modal.d.mts.map +1 -0
- package/dist/{components/organisms/modal.mjs → Modal.mjs} +30 -23
- package/dist/Modal.mjs.map +1 -0
- package/dist/{components/templates/page-header.d.mts → PageHeader.d.mts} +3 -3
- package/dist/PageHeader.d.mts.map +1 -0
- package/dist/{components/templates/page-header.mjs → PageHeader.mjs} +5 -5
- package/dist/PageHeader.mjs.map +1 -0
- package/dist/Pagination.d.mts +2 -2
- package/dist/Pagination.d.mts.map +1 -1
- package/dist/Pagination.mjs +3 -3
- package/dist/Popconfirm.d.mts +33 -0
- package/dist/Popconfirm.d.mts.map +1 -0
- package/dist/Popconfirm.mjs +119 -0
- package/dist/Popconfirm.mjs.map +1 -0
- package/dist/{components/atoms/popover.d.mts → Popover.d.mts} +3 -3
- package/dist/Popover.d.mts.map +1 -0
- package/dist/{components/atoms/popover.mjs → Popover.mjs} +4 -4
- package/dist/Popover.mjs.map +1 -0
- package/dist/{components/atoms/progress.d.mts → Progress.d.mts} +3 -3
- package/dist/Progress.d.mts.map +1 -0
- package/dist/{components/atoms/progress.mjs → Progress.mjs} +3 -3
- package/dist/Progress.mjs.map +1 -0
- package/dist/Radio.d.mts +10 -0
- package/dist/Radio.d.mts.map +1 -0
- package/dist/Radio.mjs +9 -0
- package/dist/Radio.mjs.map +1 -0
- package/dist/Rate.d.mts +27 -0
- package/dist/Rate.d.mts.map +1 -0
- package/dist/Rate.mjs +81 -0
- package/dist/Rate.mjs.map +1 -0
- package/dist/{components/templates/result.d.mts → Result.d.mts} +3 -3
- package/dist/Result.d.mts.map +1 -0
- package/dist/{components/templates/result.mjs → Result.mjs} +3 -3
- package/dist/Result.mjs.map +1 -0
- package/dist/Reveals.d.mts.map +1 -1
- package/dist/RichTextEditor.d.mts +3 -0
- package/dist/RichTextEditor.mjs +1 -0
- package/dist/ScrollArea.d.mts +8 -0
- package/dist/ScrollArea.d.mts.map +1 -0
- package/dist/ScrollArea.mjs +11 -0
- package/dist/ScrollArea.mjs.map +1 -0
- package/dist/Segmented.d.mts +3 -3
- package/dist/Segmented.d.mts.map +1 -1
- package/dist/{components/atoms/select.d.mts → Select.d.mts} +7 -7
- package/dist/Select.d.mts.map +1 -0
- package/dist/{components/atoms/select.mjs → Select.mjs} +5 -5
- package/dist/Select.mjs.map +1 -0
- package/dist/Skeleton.d.mts +12 -0
- package/dist/Skeleton.d.mts.map +1 -0
- package/dist/Skeleton.mjs +11 -0
- package/dist/Skeleton.mjs.map +1 -0
- package/dist/Slider.d.mts +2 -0
- package/dist/{components/atoms/slider/index.mjs → Slider.mjs} +2 -2
- package/dist/Slider.mjs.map +1 -0
- package/dist/Space.d.mts +5 -4
- package/dist/Space.d.mts.map +1 -1
- package/dist/Space.mjs +13 -4
- package/dist/Space.mjs.map +1 -1
- package/dist/{components/atoms/spin.d.mts → Spin.d.mts} +3 -3
- package/dist/Spin.d.mts.map +1 -0
- package/dist/{components/atoms/spin.mjs → Spin.mjs} +4 -4
- package/dist/Spin.mjs.map +1 -0
- package/dist/Splitter.d.mts +10 -0
- package/dist/Splitter.d.mts.map +1 -0
- package/dist/Splitter.mjs +9 -0
- package/dist/Splitter.mjs.map +1 -0
- package/dist/Statistic.d.mts +22 -0
- package/dist/Statistic.d.mts.map +1 -0
- package/dist/Statistic.mjs +53 -0
- package/dist/Statistic.mjs.map +1 -0
- package/dist/Steps.d.mts +3 -3
- package/dist/Steps.d.mts.map +1 -1
- package/dist/Steps.mjs +1 -1
- package/dist/Swiper.d.mts +10 -0
- package/dist/Swiper.d.mts.map +1 -0
- package/dist/Swiper.mjs +9 -0
- package/dist/Swiper.mjs.map +1 -0
- package/dist/{components/atoms/switch.d.mts → Switch.d.mts} +4 -4
- package/dist/Switch.d.mts.map +1 -0
- package/dist/{components/atoms/switch.mjs → Switch.mjs} +4 -4
- package/dist/Switch.mjs.map +1 -0
- package/dist/Table.d.mts +4 -4
- package/dist/Table.d.mts.map +1 -1
- package/dist/Table.mjs +2 -2
- package/dist/Table.mjs.map +1 -1
- package/dist/{components/molecules/tabs.d.mts → Tabs.d.mts} +6 -6
- package/dist/Tabs.d.mts.map +1 -0
- package/dist/{components/molecules/tabs.mjs → Tabs.mjs} +3 -3
- package/dist/Tabs.mjs.map +1 -0
- package/dist/Tag.d.mts +3 -3
- package/dist/Tag.d.mts.map +1 -1
- package/dist/TimePicker.d.mts +26 -0
- package/dist/TimePicker.d.mts.map +1 -0
- package/dist/TimePicker.mjs +77 -0
- package/dist/TimePicker.mjs.map +1 -0
- package/dist/Timeline.d.mts +35 -0
- package/dist/Timeline.d.mts.map +1 -0
- package/dist/Timeline.mjs +59 -0
- package/dist/Timeline.mjs.map +1 -0
- package/dist/{components/organisms/toast.d.mts → Toast.d.mts} +14 -4
- package/dist/Toast.d.mts.map +1 -0
- package/dist/Toast.mjs +198 -0
- package/dist/Toast.mjs.map +1 -0
- package/dist/ToggleGroup.d.mts +28 -0
- package/dist/ToggleGroup.d.mts.map +1 -0
- package/dist/ToggleGroup.mjs +58 -0
- package/dist/ToggleGroup.mjs.map +1 -0
- package/dist/{components/atoms/tooltip.d.mts → Tooltip.d.mts} +3 -3
- package/dist/Tooltip.d.mts.map +1 -0
- package/dist/{components/atoms/tooltip.mjs → Tooltip.mjs} +2 -2
- package/dist/Tooltip.mjs.map +1 -0
- package/dist/Tour.d.mts +37 -0
- package/dist/Tour.d.mts.map +1 -0
- package/dist/Tour.mjs +175 -0
- package/dist/Tour.mjs.map +1 -0
- package/dist/Transfer.d.mts +36 -0
- package/dist/Transfer.d.mts.map +1 -0
- package/dist/Transfer.mjs +147 -0
- package/dist/Transfer.mjs.map +1 -0
- package/dist/Tree.d.mts +62 -0
- package/dist/Tree.d.mts.map +1 -0
- package/dist/Tree.mjs +462 -0
- package/dist/Tree.mjs.map +1 -0
- package/dist/TreeSelect.d.mts +34 -0
- package/dist/TreeSelect.d.mts.map +1 -0
- package/dist/TreeSelect.mjs +135 -0
- package/dist/TreeSelect.mjs.map +1 -0
- package/dist/Typography.d.mts.map +1 -1
- package/dist/{components/molecules/upload.d.mts → Upload.d.mts} +4 -4
- package/dist/Upload.d.mts.map +1 -0
- package/dist/{components/molecules/upload.mjs → Upload.mjs} +7 -7
- package/dist/Upload.mjs.map +1 -0
- package/dist/components/atoms/checkbox/checkbox.d.mts +5 -3
- package/dist/components/atoms/checkbox/checkbox.d.mts.map +1 -1
- package/dist/components/atoms/checkbox/checkbox.mjs +8 -4
- package/dist/components/atoms/checkbox/checkbox.mjs.map +1 -1
- package/dist/components/atoms/checkbox/group.d.mts +2 -2
- package/dist/components/atoms/checkbox/group.d.mts.map +1 -1
- package/dist/components/atoms/float-button/back-top.d.mts +2 -2
- package/dist/components/atoms/float-button/back-top.d.mts.map +1 -1
- package/dist/components/atoms/float-button/back-top.mjs +1 -1
- package/dist/components/atoms/float-button/float-button.d.mts +2 -2
- package/dist/components/atoms/float-button/float-button.d.mts.map +1 -1
- package/dist/components/atoms/index.d.mts +37 -23
- package/dist/components/atoms/input/input.d.mts +2 -1
- package/dist/components/atoms/input/input.d.mts.map +1 -1
- package/dist/components/atoms/input/input.mjs.map +1 -1
- package/dist/components/atoms/input/number.d.mts +2 -2
- package/dist/components/atoms/input/number.d.mts.map +1 -1
- package/dist/components/atoms/input/number.mjs +1 -1
- package/dist/components/atoms/input/otp.d.mts +26 -0
- package/dist/components/atoms/input/otp.d.mts.map +1 -0
- package/dist/components/atoms/input/otp.mjs +52 -0
- package/dist/components/atoms/input/otp.mjs.map +1 -0
- package/dist/components/atoms/input/search.d.mts +2 -2
- package/dist/components/atoms/input/search.d.mts.map +1 -1
- package/dist/components/atoms/input/search.mjs +2 -2
- package/dist/components/atoms/mentions-token.mjs +31 -0
- package/dist/components/atoms/mentions-token.mjs.map +1 -0
- package/dist/components/atoms/option-group.d.mts +4 -5
- package/dist/components/atoms/option-group.d.mts.map +1 -1
- package/dist/components/atoms/radio/group.d.mts +2 -2
- package/dist/components/atoms/radio/group.d.mts.map +1 -1
- package/dist/components/atoms/radio/group.mjs +1 -1
- package/dist/components/atoms/radio/radio.d.mts +2 -2
- package/dist/components/atoms/radio/radio.d.mts.map +1 -1
- package/dist/components/atoms/radio/radio.mjs +1 -1
- package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts +2 -2
- package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts.map +1 -1
- package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +5 -5
- package/dist/components/atoms/rich-text-editor/types.d.mts +2 -3
- package/dist/components/atoms/rich-text-editor/types.d.mts.map +1 -1
- package/dist/components/atoms/select-multiple.d.mts +2 -3
- package/dist/components/atoms/select-multiple.d.mts.map +1 -1
- package/dist/components/atoms/select-multiple.mjs +5 -4
- package/dist/components/atoms/select-multiple.mjs.map +1 -1
- package/dist/components/atoms/select-searchable-options.d.mts +3 -4
- package/dist/components/atoms/select-searchable-options.d.mts.map +1 -1
- package/dist/components/atoms/select-searchable.d.mts +2 -3
- package/dist/components/atoms/select-searchable.d.mts.map +1 -1
- package/dist/components/atoms/select-searchable.mjs +5 -4
- package/dist/components/atoms/select-searchable.mjs.map +1 -1
- package/dist/components/atoms/skeleton/button.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/node.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/skeleton.d.mts +2 -2
- package/dist/components/atoms/skeleton/skeleton.d.mts.map +1 -1
- package/dist/components/atoms/slider/slider.d.mts +3 -3
- package/dist/components/atoms/slider/slider.d.mts.map +1 -1
- package/dist/components/atoms/typography/link.d.mts +2 -2
- package/dist/components/atoms/typography/link.d.mts.map +1 -1
- package/dist/components/atoms/typography/paragraph.d.mts +2 -2
- package/dist/components/atoms/typography/paragraph.d.mts.map +1 -1
- package/dist/components/atoms/typography/text.d.mts +2 -2
- package/dist/components/atoms/typography/text.d.mts.map +1 -1
- package/dist/components/atoms/typography/title.d.mts +2 -2
- package/dist/components/atoms/typography/title.d.mts.map +1 -1
- package/dist/components/atoms/typography/typography.d.mts +2 -2
- package/dist/components/atoms/typography/typography.d.mts.map +1 -1
- package/dist/components/molecules/index.d.mts +25 -16
- package/dist/components/molecules/marquees/item.d.mts +4 -4
- package/dist/components/molecules/marquees/item.d.mts.map +1 -1
- package/dist/components/molecules/marquees/item.mjs +5 -5
- package/dist/components/molecules/marquees/item.mjs.map +1 -1
- package/dist/components/molecules/marquees/marquees.d.mts +2 -2
- package/dist/components/molecules/marquees/marquees.d.mts.map +1 -1
- package/dist/components/molecules/marquees/marquees.mjs +4 -5
- package/dist/components/molecules/marquees/marquees.mjs.map +1 -1
- package/dist/components/molecules/menu/item/item.mjs +1 -1
- package/dist/components/molecules/menu/menu.d.mts +9 -9
- package/dist/components/molecules/menu/menu.d.mts.map +1 -1
- package/dist/components/molecules/reveals/item.d.mts +2 -2
- package/dist/components/molecules/reveals/item.d.mts.map +1 -1
- package/dist/components/molecules/reveals/reveals.d.mts +5 -5
- package/dist/components/molecules/reveals/reveals.d.mts.map +1 -1
- package/dist/components/molecules/splitter/panel.d.mts +3 -3
- package/dist/components/molecules/splitter/panel.d.mts.map +1 -1
- package/dist/components/molecules/splitter/splitter.d.mts +3 -3
- package/dist/components/molecules/splitter/splitter.d.mts.map +1 -1
- package/dist/components/organisms/form/context.d.mts +4 -0
- package/dist/components/organisms/form/context.d.mts.map +1 -0
- package/dist/components/organisms/form/context.mjs +9 -0
- package/dist/components/organisms/form/context.mjs.map +1 -0
- package/dist/components/organisms/form/control.d.mts +11 -0
- package/dist/components/organisms/form/control.d.mts.map +1 -0
- package/dist/components/organisms/form/control.mjs +19 -0
- package/dist/components/organisms/form/control.mjs.map +1 -0
- package/dist/components/organisms/form/field.d.mts +25 -0
- package/dist/components/organisms/form/field.d.mts.map +1 -0
- package/dist/components/organisms/form/field.mjs +54 -0
- package/dist/components/organisms/form/field.mjs.map +1 -0
- package/dist/components/organisms/form/form.d.mts +14 -0
- package/dist/components/organisms/form/form.d.mts.map +1 -0
- package/dist/components/organisms/form/form.mjs +23 -0
- package/dist/components/organisms/form/form.mjs.map +1 -0
- package/dist/components/organisms/imperative-stack.mjs +16 -1
- package/dist/components/organisms/imperative-stack.mjs.map +1 -1
- package/dist/components/organisms/index.d.mts +17 -9
- package/dist/components/organisms/list/list.d.mts +3 -3
- package/dist/components/organisms/list/list.d.mts.map +1 -1
- package/dist/components/organisms/list/list.mjs +1 -1
- package/dist/components/organisms/swiper/swiper.d.mts +8 -2
- package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
- package/dist/components/organisms/swiper/swiper.mjs +1 -1
- package/dist/components/templates/grid/col.d.mts +2 -2
- package/dist/components/templates/grid/col.d.mts.map +1 -1
- package/dist/components/templates/grid/row.d.mts +2 -2
- package/dist/components/templates/grid/row.d.mts.map +1 -1
- package/dist/components/templates/index.d.mts +11 -12
- package/dist/components/templates/layout/content.d.mts +2 -2
- package/dist/components/templates/layout/content.d.mts.map +1 -1
- package/dist/components/templates/layout/footer.d.mts +2 -2
- package/dist/components/templates/layout/footer.d.mts.map +1 -1
- package/dist/components/templates/layout/header.d.mts +2 -2
- package/dist/components/templates/layout/header.d.mts.map +1 -1
- package/dist/components/templates/layout/layout.d.mts +2 -2
- package/dist/components/templates/layout/layout.d.mts.map +1 -1
- package/dist/components/templates/layout/sider.d.mts +2 -2
- package/dist/components/templates/layout/sider.d.mts.map +1 -1
- package/dist/components/templates/layout/sider.mjs +5 -7
- package/dist/components/templates/layout/sider.mjs.map +1 -1
- package/dist/core/accordion.mjs +1 -1
- package/dist/core/autocomplete.d.mts +2 -0
- package/dist/core/autocomplete.mjs +48 -0
- package/dist/core/autocomplete.mjs.map +1 -0
- package/dist/core/badge.d.mts +5 -3
- package/dist/core/badge.d.mts.map +1 -1
- package/dist/core/button.d.mts +5 -3
- package/dist/core/button.d.mts.map +1 -1
- package/dist/core/calendar.d.mts +13 -3
- package/dist/core/calendar.d.mts.map +1 -0
- package/dist/core/calendar.mjs +1 -1
- package/dist/core/checkbox.mjs +11 -8
- package/dist/core/checkbox.mjs.map +1 -1
- package/dist/core/combobox.d.mts +26 -4
- package/dist/core/combobox.d.mts.map +1 -1
- package/dist/core/combobox.mjs +2 -2
- package/dist/core/combobox.mjs.map +1 -1
- package/dist/core/dialog.mjs +2 -2
- package/dist/core/dialog.mjs.map +1 -1
- package/dist/core/form.d.mts +8 -0
- package/dist/core/form.d.mts.map +1 -0
- package/dist/core/form.mjs +3 -0
- package/dist/core/index.d.mts +13 -9
- package/dist/core/popover.mjs +10 -2
- package/dist/core/popover.mjs.map +1 -1
- package/dist/core/radio-group.mjs +1 -1
- package/dist/core/resizable.d.mts +7 -2
- package/dist/core/resizable.d.mts.map +1 -1
- package/dist/core/resizable.mjs +1 -1
- package/dist/core/scroll-area.d.mts +20 -0
- package/dist/core/scroll-area.d.mts.map +1 -0
- package/dist/core/scroll-area.mjs +57 -0
- package/dist/core/scroll-area.mjs.map +1 -0
- package/dist/core/select.d.mts +24 -2
- package/dist/core/select.d.mts.map +1 -1
- package/dist/core/select.mjs +1 -1
- package/dist/core/separator.d.mts +13 -2
- package/dist/core/separator.d.mts.map +1 -0
- package/dist/core/tabs.d.mts +16 -2
- package/dist/core/tabs.d.mts.map +1 -1
- package/dist/index.d.mts +87 -57
- package/dist/index.mjs +53 -33
- package/dist/lib/colors.d.mts +2 -3
- package/dist/lib/colors.d.mts.map +1 -1
- package/dist/providers/config/context.d.mts +2 -3
- package/dist/providers/config/context.d.mts.map +1 -1
- package/dist/providers/config/context.mjs +3 -1
- package/dist/providers/config/context.mjs.map +1 -1
- package/dist/providers/config/registry.d.mts +2 -3
- package/dist/providers/config/registry.d.mts.map +1 -1
- package/dist/providers/config/types.d.mts +8 -7
- package/dist/providers/config/types.d.mts.map +1 -1
- package/dist/style.css +710 -332
- package/dist/utils.d.mts +2 -3
- package/dist/utils.d.mts.map +1 -1
- package/package.json +277 -26
- package/dist/components/atoms/checkbox/index.d.mts +0 -10
- package/dist/components/atoms/checkbox/index.d.mts.map +0 -1
- package/dist/components/atoms/checkbox/index.mjs +0 -9
- package/dist/components/atoms/checkbox/index.mjs.map +0 -1
- package/dist/components/atoms/color-picker.d.mts.map +0 -1
- package/dist/components/atoms/color-picker.mjs.map +0 -1
- package/dist/components/atoms/date-picker.d.mts.map +0 -1
- package/dist/components/atoms/date-picker.mjs +0 -44
- package/dist/components/atoms/date-picker.mjs.map +0 -1
- package/dist/components/atoms/float-button/index.d.mts +0 -10
- package/dist/components/atoms/float-button/index.d.mts.map +0 -1
- package/dist/components/atoms/float-button/index.mjs +0 -9
- package/dist/components/atoms/float-button/index.mjs.map +0 -1
- package/dist/components/atoms/input/index.d.mts +0 -14
- package/dist/components/atoms/input/index.d.mts.map +0 -1
- package/dist/components/atoms/input/index.mjs +0 -13
- package/dist/components/atoms/input/index.mjs.map +0 -1
- package/dist/components/atoms/popover.d.mts.map +0 -1
- package/dist/components/atoms/popover.mjs.map +0 -1
- package/dist/components/atoms/progress.d.mts.map +0 -1
- package/dist/components/atoms/progress.mjs.map +0 -1
- package/dist/components/atoms/radio/index.d.mts +0 -10
- package/dist/components/atoms/radio/index.d.mts.map +0 -1
- package/dist/components/atoms/radio/index.mjs +0 -9
- package/dist/components/atoms/radio/index.mjs.map +0 -1
- package/dist/components/atoms/rich-text-editor/index.d.mts +0 -3
- package/dist/components/atoms/select.d.mts.map +0 -1
- package/dist/components/atoms/select.mjs.map +0 -1
- package/dist/components/atoms/skeleton/index.d.mts +0 -12
- package/dist/components/atoms/skeleton/index.d.mts.map +0 -1
- package/dist/components/atoms/skeleton/index.mjs +0 -11
- package/dist/components/atoms/skeleton/index.mjs.map +0 -1
- package/dist/components/atoms/slider/index.mjs.map +0 -1
- package/dist/components/atoms/spin.d.mts.map +0 -1
- package/dist/components/atoms/spin.mjs.map +0 -1
- package/dist/components/atoms/switch.d.mts.map +0 -1
- package/dist/components/atoms/switch.mjs.map +0 -1
- package/dist/components/atoms/tooltip.d.mts.map +0 -1
- package/dist/components/atoms/tooltip.mjs.map +0 -1
- package/dist/components/molecules/collapse.d.mts.map +0 -1
- package/dist/components/molecules/collapse.mjs.map +0 -1
- package/dist/components/molecules/dropdown.d.mts.map +0 -1
- package/dist/components/molecules/dropdown.mjs.map +0 -1
- package/dist/components/molecules/marquees/index.d.mts +0 -10
- package/dist/components/molecules/marquees/index.d.mts.map +0 -1
- package/dist/components/molecules/marquees/index.mjs +0 -9
- package/dist/components/molecules/marquees/index.mjs.map +0 -1
- package/dist/components/molecules/marquees/use-pause-on-hover.mjs +0 -26
- package/dist/components/molecules/marquees/use-pause-on-hover.mjs.map +0 -1
- package/dist/components/molecules/splitter/index.d.mts +0 -10
- package/dist/components/molecules/splitter/index.d.mts.map +0 -1
- package/dist/components/molecules/splitter/index.mjs +0 -9
- package/dist/components/molecules/splitter/index.mjs.map +0 -1
- package/dist/components/molecules/tabs.d.mts.map +0 -1
- package/dist/components/molecules/tabs.mjs.map +0 -1
- package/dist/components/molecules/upload.d.mts.map +0 -1
- package/dist/components/molecules/upload.mjs.map +0 -1
- package/dist/components/organisms/drawer.d.mts.map +0 -1
- package/dist/components/organisms/drawer.mjs.map +0 -1
- package/dist/components/organisms/list/index.d.mts.map +0 -1
- package/dist/components/organisms/list/index.mjs +0 -9
- package/dist/components/organisms/list/index.mjs.map +0 -1
- package/dist/components/organisms/modal.d.mts.map +0 -1
- package/dist/components/organisms/modal.mjs.map +0 -1
- package/dist/components/organisms/swiper/index.d.mts +0 -10
- package/dist/components/organisms/swiper/index.d.mts.map +0 -1
- package/dist/components/organisms/swiper/index.mjs +0 -9
- package/dist/components/organisms/swiper/index.mjs.map +0 -1
- package/dist/components/organisms/toast.d.mts.map +0 -1
- package/dist/components/organisms/toast.mjs +0 -126
- package/dist/components/organisms/toast.mjs.map +0 -1
- package/dist/components/templates/container.d.mts.map +0 -1
- package/dist/components/templates/container.mjs.map +0 -1
- package/dist/components/templates/empty.d.mts.map +0 -1
- package/dist/components/templates/empty.mjs.map +0 -1
- package/dist/components/templates/page-header.d.mts.map +0 -1
- package/dist/components/templates/page-header.mjs.map +0 -1
- package/dist/components/templates/result.d.mts.map +0 -1
- package/dist/components/templates/result.mjs.map +0 -1
package/dist/Toast.mjs
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import { DEFAULT_LOCALE, useConfig } from "./providers/config/context.mjs";
|
|
4
|
+
import Button from "./Button.mjs";
|
|
5
|
+
import { createImperativeStack, isBrowser } from "./components/organisms/imperative-stack.mjs";
|
|
6
|
+
import { useEffect, useRef, useState } from "react";
|
|
7
|
+
import { useTimeout } from "@jbpark/use-hooks";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { Check, Info, LoaderCircle, OctagonAlert, OctagonX, X } from "lucide-react";
|
|
10
|
+
import { createPortal } from "react-dom";
|
|
11
|
+
//#region src/components/organisms/toast.tsx
|
|
12
|
+
const STATUS_ICONS = {
|
|
13
|
+
info: /* @__PURE__ */ jsx(Info, { className: "text-blue-400" }),
|
|
14
|
+
success: /* @__PURE__ */ jsx(Check, { className: "text-green-400" }),
|
|
15
|
+
error: /* @__PURE__ */ jsx(OctagonX, { className: "text-red-400" }),
|
|
16
|
+
warning: /* @__PURE__ */ jsx(OctagonAlert, { className: "text-yellow-400" }),
|
|
17
|
+
loading: /* @__PURE__ */ jsx(LoaderCircle, { className: "text-muted-foreground animate-spin" })
|
|
18
|
+
};
|
|
19
|
+
const Toast = ({ status, title, description, icon, closable = true, action, className, onClose }) => {
|
|
20
|
+
const { locale } = useConfig();
|
|
21
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
22
|
+
"data-slot": "toast",
|
|
23
|
+
role: status === "error" ? "alert" : "status",
|
|
24
|
+
className: cn(`pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] items-start
|
|
25
|
+
gap-3 rounded-lg`, "bg-background text-foreground border p-4 shadow-lg", className),
|
|
26
|
+
children: [
|
|
27
|
+
(icon || status) && /* @__PURE__ */ jsx("div", {
|
|
28
|
+
className: "mt-0.5 shrink-0 [&_svg]:size-5",
|
|
29
|
+
children: icon || status && STATUS_ICONS[status]
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", {
|
|
32
|
+
className: "flex-1 space-y-1",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("p", {
|
|
35
|
+
className: "text-sm font-medium",
|
|
36
|
+
children: title
|
|
37
|
+
}),
|
|
38
|
+
description && /* @__PURE__ */ jsx("p", {
|
|
39
|
+
className: "text-muted-foreground text-sm",
|
|
40
|
+
children: description
|
|
41
|
+
}),
|
|
42
|
+
action && /* @__PURE__ */ jsx("div", {
|
|
43
|
+
className: "pt-1",
|
|
44
|
+
children: action
|
|
45
|
+
})
|
|
46
|
+
]
|
|
47
|
+
}),
|
|
48
|
+
closable && /* @__PURE__ */ jsx(Button, {
|
|
49
|
+
variant: "text",
|
|
50
|
+
shape: "circle",
|
|
51
|
+
size: "small",
|
|
52
|
+
"aria-label": locale.close ?? DEFAULT_LOCALE.close,
|
|
53
|
+
icon: /* @__PURE__ */ jsx(X, {}),
|
|
54
|
+
onClick: onClose
|
|
55
|
+
})
|
|
56
|
+
]
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const DEFAULT_DURATION = 4e3;
|
|
60
|
+
const PLACEMENTS = [
|
|
61
|
+
"top-start",
|
|
62
|
+
"top",
|
|
63
|
+
"top-end",
|
|
64
|
+
"bottom-start",
|
|
65
|
+
"bottom",
|
|
66
|
+
"bottom-end"
|
|
67
|
+
];
|
|
68
|
+
const EXIT_CLASSES = {
|
|
69
|
+
"top-start": "-translate-x-2",
|
|
70
|
+
top: "-translate-y-2",
|
|
71
|
+
"top-end": "translate-x-2",
|
|
72
|
+
"bottom-start": "-translate-x-2",
|
|
73
|
+
bottom: "translate-y-2",
|
|
74
|
+
"bottom-end": "translate-x-2"
|
|
75
|
+
};
|
|
76
|
+
const globalConfig = {};
|
|
77
|
+
const StaticToast = ({ id, index, revision, duration = globalConfig.duration ?? DEFAULT_DURATION, container, placement = "bottom-end", onClose, ...props }) => {
|
|
78
|
+
const [visible, setVisible] = useState(true);
|
|
79
|
+
const isClosingRef = useRef(false);
|
|
80
|
+
const maxCount = globalConfig.maxCount;
|
|
81
|
+
const isQueued = maxCount !== void 0 && index >= Math.max(1, maxCount);
|
|
82
|
+
const close = () => {
|
|
83
|
+
if (isClosingRef.current) return;
|
|
84
|
+
isClosingRef.current = true;
|
|
85
|
+
onClose?.();
|
|
86
|
+
setVisible(false);
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
destroy(id);
|
|
89
|
+
}, 200);
|
|
90
|
+
};
|
|
91
|
+
const { reset, clear } = useTimeout(close, isQueued || !duration ? null : duration);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (revision > 0) reset();
|
|
94
|
+
}, [revision, reset]);
|
|
95
|
+
if (!isBrowser || isQueued) return null;
|
|
96
|
+
return createPortal(/* @__PURE__ */ jsx("div", {
|
|
97
|
+
className: cn("transition-all duration-200", visible ? "opacity-100" : cn("opacity-0", EXIT_CLASSES[placement])),
|
|
98
|
+
onMouseEnter: clear,
|
|
99
|
+
onMouseLeave: reset,
|
|
100
|
+
onFocus: clear,
|
|
101
|
+
onBlur: reset,
|
|
102
|
+
children: /* @__PURE__ */ jsx(Toast, {
|
|
103
|
+
...props,
|
|
104
|
+
onClose: close
|
|
105
|
+
})
|
|
106
|
+
}), stacks[placement].getRootElement(container));
|
|
107
|
+
};
|
|
108
|
+
const createRootElement = (placement) => () => {
|
|
109
|
+
const el = document.createElement("div");
|
|
110
|
+
const [vertical, horizontal = "center"] = placement.split("-");
|
|
111
|
+
el.setAttribute("role", "region");
|
|
112
|
+
el.setAttribute("aria-label", "Notifications");
|
|
113
|
+
el.dataset.slot = "toast-stack";
|
|
114
|
+
el.dataset.placement = placement;
|
|
115
|
+
el.style.zIndex = "10000";
|
|
116
|
+
el.style.position = "fixed";
|
|
117
|
+
el.style.display = "flex";
|
|
118
|
+
el.style.flexDirection = vertical === "top" ? "column" : "column-reverse";
|
|
119
|
+
el.style.gap = "8px";
|
|
120
|
+
el.style.padding = "16px";
|
|
121
|
+
el.style.pointerEvents = "none";
|
|
122
|
+
el.style[vertical === "top" ? "top" : "bottom"] = "0";
|
|
123
|
+
if (horizontal === "start") {
|
|
124
|
+
el.style.insetInlineStart = "0";
|
|
125
|
+
el.style.alignItems = "flex-start";
|
|
126
|
+
} else if (horizontal === "end") {
|
|
127
|
+
el.style.insetInlineEnd = "0";
|
|
128
|
+
el.style.alignItems = "flex-end";
|
|
129
|
+
} else {
|
|
130
|
+
el.style.left = "0";
|
|
131
|
+
el.style.right = "0";
|
|
132
|
+
el.style.alignItems = "center";
|
|
133
|
+
}
|
|
134
|
+
return el;
|
|
135
|
+
};
|
|
136
|
+
const stacks = Object.fromEntries(PLACEMENTS.map((placement) => [placement, createImperativeStack({
|
|
137
|
+
createRootElement: createRootElement(placement),
|
|
138
|
+
StackItem: StaticToast
|
|
139
|
+
})]));
|
|
140
|
+
let revisionCounter = 0;
|
|
141
|
+
const show = (props) => {
|
|
142
|
+
if (props.id) {
|
|
143
|
+
const revision = revisionCounter += 1;
|
|
144
|
+
for (const placement of PLACEMENTS) if (stacks[placement].update(props.id, (current) => ({
|
|
145
|
+
...props,
|
|
146
|
+
placement: current.placement,
|
|
147
|
+
container: current.container,
|
|
148
|
+
revision
|
|
149
|
+
}))) return props.id;
|
|
150
|
+
}
|
|
151
|
+
const placement = props.placement ?? globalConfig.placement ?? "bottom-end";
|
|
152
|
+
return stacks[placement].render({
|
|
153
|
+
...props,
|
|
154
|
+
placement,
|
|
155
|
+
revision: 0
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
const destroy = (id) => {
|
|
159
|
+
for (const placement of PLACEMENTS) stacks[placement].destroy(id);
|
|
160
|
+
};
|
|
161
|
+
Toast.destroy = destroy;
|
|
162
|
+
Toast.destroyAll = () => {
|
|
163
|
+
destroy();
|
|
164
|
+
};
|
|
165
|
+
Toast.config = (config) => {
|
|
166
|
+
Object.assign(globalConfig, config);
|
|
167
|
+
};
|
|
168
|
+
Toast.open = (props) => show(props);
|
|
169
|
+
Toast.info = (title, props) => show({
|
|
170
|
+
status: "info",
|
|
171
|
+
title,
|
|
172
|
+
...props
|
|
173
|
+
});
|
|
174
|
+
Toast.success = (title, props) => show({
|
|
175
|
+
status: "success",
|
|
176
|
+
title,
|
|
177
|
+
...props
|
|
178
|
+
});
|
|
179
|
+
Toast.error = (title, props) => show({
|
|
180
|
+
status: "error",
|
|
181
|
+
title,
|
|
182
|
+
...props
|
|
183
|
+
});
|
|
184
|
+
Toast.warning = (title, props) => show({
|
|
185
|
+
status: "warning",
|
|
186
|
+
title,
|
|
187
|
+
...props
|
|
188
|
+
});
|
|
189
|
+
Toast.loading = (title, props) => show({
|
|
190
|
+
status: "loading",
|
|
191
|
+
title,
|
|
192
|
+
duration: 0,
|
|
193
|
+
...props
|
|
194
|
+
});
|
|
195
|
+
//#endregion
|
|
196
|
+
export { Toast as default };
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=Toast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.mjs","names":[],"sources":["../src/components/organisms/toast.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useTimeout } from '@jbpark/use-hooks';\nimport {\n Check,\n Info,\n LoaderCircle,\n OctagonAlert,\n OctagonX,\n X,\n} from 'lucide-react';\n\nimport { DEFAULT_LOCALE, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport {\n type ImperativeStack,\n createImperativeStack,\n isBrowser,\n} from './imperative-stack';\n\ntype ToastStatus = 'info' | 'success' | 'error' | 'warning' | 'loading';\n\nexport type Placement =\n 'top-start' | 'top' | 'top-end' | 'bottom-start' | 'bottom' | 'bottom-end';\n\nexport interface Props {\n status?: ToastStatus;\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n closable?: boolean;\n action?: React.ReactNode;\n className?: string;\n onClose?: () => void;\n}\n\ninterface StaticProps extends Props {\n id?: string;\n duration?: number;\n container?: HTMLElement;\n placement?: Placement;\n}\n\nexport interface GlobalConfig {\n placement?: Placement;\n duration?: number;\n // Visible toasts per stack; later toasts wait until one closes.\n maxCount?: number;\n}\n\ninterface StackEntry extends StaticProps {\n revision: number;\n}\n\ntype StackItemProps = StackEntry & { id: string; index: number };\n\nconst STATUS_ICONS: Record<ToastStatus, React.ReactNode> = {\n info: <Info className=\"text-blue-400\" />,\n success: <Check className=\"text-green-400\" />,\n error: <OctagonX className=\"text-red-400\" />,\n warning: <OctagonAlert className=\"text-yellow-400\" />,\n loading: <LoaderCircle className=\"text-muted-foreground animate-spin\" />,\n};\n\nconst Toast = ({\n status,\n title,\n description,\n icon,\n closable = true,\n action,\n className,\n onClose,\n}: Props) => {\n const { locale } = useConfig();\n\n return (\n <div\n data-slot=\"toast\"\n role={status === 'error' ? 'alert' : 'status'}\n className={cn(\n `pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] items-start\n gap-3 rounded-lg`,\n 'bg-background text-foreground border p-4 shadow-lg',\n className,\n //\n )}\n >\n {(icon || status) && (\n <div className=\"mt-0.5 shrink-0 [&_svg]:size-5\">\n {icon || (status && STATUS_ICONS[status])}\n </div>\n )}\n <div className=\"flex-1 space-y-1\">\n <p className=\"text-sm font-medium\">{title}</p>\n {description && (\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n )}\n {action && <div className=\"pt-1\">{action}</div>}\n </div>\n {closable && (\n <Button\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n aria-label={locale.close ?? DEFAULT_LOCALE.close}\n icon={<X />}\n onClick={onClose}\n />\n )}\n </div>\n );\n};\n\nconst DEFAULT_DURATION = 4000;\n\nconst PLACEMENTS: readonly Placement[] = [\n 'top-start',\n 'top',\n 'top-end',\n 'bottom-start',\n 'bottom',\n 'bottom-end',\n];\n\nconst EXIT_CLASSES: Record<Placement, string> = {\n 'top-start': '-translate-x-2',\n top: '-translate-y-2',\n 'top-end': 'translate-x-2',\n 'bottom-start': '-translate-x-2',\n bottom: 'translate-y-2',\n 'bottom-end': 'translate-x-2',\n};\n\nconst globalConfig: GlobalConfig = {};\n\nconst StaticToast = ({\n id,\n index,\n revision,\n duration = globalConfig.duration ?? DEFAULT_DURATION,\n container,\n placement = 'bottom-end',\n onClose,\n ...props\n}: StackItemProps): React.ReactPortal | null => {\n const [visible, setVisible] = useState(true);\n const isClosingRef = useRef(false);\n\n const maxCount = globalConfig.maxCount;\n const isQueued = maxCount !== undefined && index >= Math.max(1, maxCount);\n\n const close = () => {\n if (isClosingRef.current) {\n return;\n }\n\n isClosingRef.current = true;\n onClose?.();\n setVisible(false);\n setTimeout(() => {\n destroy(id);\n }, 200);\n };\n\n const { reset, clear } = useTimeout(\n close,\n isQueued || !duration ? null : duration,\n );\n\n // An update restarts the visible duration.\n useEffect(() => {\n if (revision > 0) {\n reset();\n }\n }, [revision, reset]);\n\n if (!isBrowser || isQueued) {\n return null;\n }\n\n return createPortal(\n <div\n className={cn(\n 'transition-all duration-200',\n visible ? 'opacity-100' : cn('opacity-0', EXIT_CLASSES[placement]),\n )}\n // Without this, a toast with a closable/action button (or one the\n // user is mid-read on) could auto-dismiss itself out from under\n // them — hovering or focusing anything inside pauses the timer,\n // moving away restarts it from the full duration.\n onMouseEnter={clear}\n onMouseLeave={reset}\n onFocus={clear}\n onBlur={reset}\n >\n <Toast {...props} onClose={close} />\n </div>,\n stacks[placement].getRootElement(container)!,\n );\n};\n\nconst createRootElement = (placement: Placement) => () => {\n const el = document.createElement('div');\n const [vertical, horizontal = 'center'] = placement.split('-');\n\n el.setAttribute('role', 'region');\n // Plain DOM, created outside any React tree — no Config to read a\n // locale override from until #226 gives the imperative stack a way\n // to inherit one.\n el.setAttribute('aria-label', 'Notifications');\n el.dataset.slot = 'toast-stack';\n el.dataset.placement = placement;\n el.style.zIndex = '10000';\n el.style.position = 'fixed';\n el.style.display = 'flex';\n // The oldest toast sits nearest the screen edge.\n el.style.flexDirection = vertical === 'top' ? 'column' : 'column-reverse';\n el.style.gap = '8px';\n el.style.padding = '16px';\n el.style.pointerEvents = 'none';\n el.style[vertical === 'top' ? 'top' : 'bottom'] = '0';\n\n if (horizontal === 'start') {\n el.style.insetInlineStart = '0';\n el.style.alignItems = 'flex-start';\n } else if (horizontal === 'end') {\n el.style.insetInlineEnd = '0';\n el.style.alignItems = 'flex-end';\n } else {\n el.style.left = '0';\n el.style.right = '0';\n el.style.alignItems = 'center';\n }\n\n return el;\n};\n\nconst stacks = Object.fromEntries(\n PLACEMENTS.map(placement => [\n placement,\n createImperativeStack<StackEntry>({\n createRootElement: createRootElement(placement),\n StackItem: StaticToast,\n }),\n ]),\n) as Record<Placement, ImperativeStack<StackEntry>>;\n\nlet revisionCounter = 0;\n\nconst show = (props: StaticProps): string | undefined => {\n if (props.id) {\n const revision = (revisionCounter += 1);\n\n // An update replaces the content but stays in the toast's stack and\n // container, so `placement` and `container` from the new call are ignored.\n for (const placement of PLACEMENTS) {\n if (\n stacks[placement].update(props.id, current => ({\n ...props,\n placement: current.placement,\n container: current.container,\n revision,\n }))\n ) {\n return props.id;\n }\n }\n }\n\n const placement = props.placement ?? globalConfig.placement ?? 'bottom-end';\n\n return stacks[placement].render({ ...props, placement, revision: 0 });\n};\n\nconst destroy = (id?: string) => {\n for (const placement of PLACEMENTS) {\n stacks[placement].destroy(id);\n }\n};\n\nToast.destroy = destroy;\n\nToast.destroyAll = () => {\n destroy();\n};\n\n// Sets defaults for toasts shown afterwards. `maxCount` also applies to\n// queued toasts the next time their stack changes.\nToast.config = (config: GlobalConfig) => {\n Object.assign(globalConfig, config);\n};\n\ntype TriggerOptions = Omit<StaticProps, 'status' | 'title'>;\n\nToast.open = (props: StaticProps) => show(props);\nToast.info = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'info', title, ...props });\nToast.success = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'success', title, ...props });\nToast.error = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'error', title, ...props });\nToast.warning = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'warning', title, ...props });\n// Stays until updated or closed unless `duration` is given.\nToast.loading = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'loading', title, duration: 0, ...props });\n\nexport default Toast;\nexport type { StaticProps as ToastOptions };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ComponentSize } from "./providers/config/types.mjs";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
|
|
4
|
+
//#region src/components/atoms/toggle-group.d.ts
|
|
5
|
+
export interface Option {
|
|
6
|
+
value: string;
|
|
7
|
+
label: string;
|
|
8
|
+
icon?: ReactNode;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
iconOnly?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Props extends Omit<ToggleGroup$1.Props, 'children' | 'value' | 'defaultValue' | 'onValueChange' | 'multiple' | 'className' | 'onChange' | 'dir'> {
|
|
13
|
+
options: readonly Option[];
|
|
14
|
+
value?: readonly string[];
|
|
15
|
+
defaultValue?: readonly string[];
|
|
16
|
+
onChange?: (values: string[]) => void;
|
|
17
|
+
size?: ComponentSize;
|
|
18
|
+
dir?: 'ltr' | 'rtl';
|
|
19
|
+
className?: string;
|
|
20
|
+
classNames?: {
|
|
21
|
+
item?: string;
|
|
22
|
+
pressedItem?: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
declare const ToggleGroup: ({ options, value, defaultValue, onChange, size, disabled, orientation, dir, className, classNames, ...props }: Props) => import("react").JSX.Element;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { ToggleGroup as default };
|
|
28
|
+
//# sourceMappingURL=ToggleGroup.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroup.d.mts","names":["ToggleGroupPrimitive"],"sources":["../src/components/atoms/toggle-group.tsx"],"mappings":";;;;iBAciB;EACf;EACA;EACA,OAAO;EACP;EAEA;;iBAGe,cAAc,KAC7BA,cAAqB;EAUrB,kBAAkB;EAClB;EACA;EAGA,YAAY;EACZ,OAAO;EACP;EACA;EACA;IACE;IACA;;;cAIE,gBAAe,SAAA,OAAA,cAAA,UAAA,MAAA,UAAA,aAAA,KAAA,WAAA,eAAA,SAYlB,0BAAK,IAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import { useConfig } from "./providers/config/context.mjs";
|
|
4
|
+
import Button from "./Button.mjs";
|
|
5
|
+
import { useControllableState } from "@jbpark/use-hooks";
|
|
6
|
+
import { DirectionProvider } from "@base-ui/react/direction-provider";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { Toggle } from "@base-ui/react/toggle";
|
|
9
|
+
import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
|
|
10
|
+
//#region src/components/atoms/toggle-group.tsx
|
|
11
|
+
const ToggleGroup = ({ options, value, defaultValue = [], onChange, size, disabled, orientation = "horizontal", dir, className, classNames, ...props }) => {
|
|
12
|
+
const { componentSize, direction } = useConfig();
|
|
13
|
+
const [pressed, setPressed] = useControllableState({
|
|
14
|
+
value,
|
|
15
|
+
defaultValue,
|
|
16
|
+
onChange: (values) => onChange?.([...values])
|
|
17
|
+
});
|
|
18
|
+
const resolvedSize = size ?? componentSize ?? "middle";
|
|
19
|
+
const resolvedDirection = dir ?? direction;
|
|
20
|
+
const pressedSet = new Set(pressed);
|
|
21
|
+
const optionValues = new Set(options.map((option) => option.value));
|
|
22
|
+
const handleValueChange = (values) => {
|
|
23
|
+
const next = new Set(values);
|
|
24
|
+
setPressed([...options.filter((option) => next.has(option.value)).map((option) => option.value), ...[...new Set(pressed)].filter((item) => !optionValues.has(item))]);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsx(DirectionProvider, {
|
|
27
|
+
direction: resolvedDirection,
|
|
28
|
+
children: /* @__PURE__ */ jsx(ToggleGroup$1, {
|
|
29
|
+
...props,
|
|
30
|
+
"data-slot": "toggle-group",
|
|
31
|
+
dir: resolvedDirection,
|
|
32
|
+
multiple: true,
|
|
33
|
+
disabled,
|
|
34
|
+
orientation,
|
|
35
|
+
value: [...pressedSet],
|
|
36
|
+
onValueChange: handleValueChange,
|
|
37
|
+
className: cn("inline-flex w-fit gap-1 data-[orientation=vertical]:flex-col", className),
|
|
38
|
+
children: options.map((option) => /* @__PURE__ */ jsx(Toggle, {
|
|
39
|
+
value: option.value,
|
|
40
|
+
disabled: option.disabled,
|
|
41
|
+
"aria-label": option.iconOnly ? option.label : void 0,
|
|
42
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
43
|
+
variant: "text",
|
|
44
|
+
size: resolvedSize,
|
|
45
|
+
shape: option.iconOnly ? "circle" : "default",
|
|
46
|
+
icon: option.icon
|
|
47
|
+
}),
|
|
48
|
+
className: cn(`data-pressed:bg-accent data-pressed:text-accent-foreground
|
|
49
|
+
aria-disabled:cursor-not-allowed`, classNames?.item, pressedSet.has(option.value) && classNames?.pressedItem),
|
|
50
|
+
children: option.iconOnly ? null : option.label
|
|
51
|
+
}, option.value))
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { ToggleGroup as default };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=ToggleGroup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroup.mjs","names":["ToggleGroupPrimitive"],"sources":["../src/components/atoms/toggle-group.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { Toggle } from '@base-ui/react/toggle';\nimport { ToggleGroup as ToggleGroupPrimitive } from '@base-ui/react/toggle-group';\nimport { useControllableState } from '@jbpark/use-hooks';\n\nimport { type ComponentSize, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\n\nexport interface Option {\n value: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n // Shows only the icon; the label stays the button's accessible name.\n iconOnly?: boolean;\n}\n\nexport interface Props extends Omit<\n ToggleGroupPrimitive.Props,\n | 'children'\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'multiple'\n | 'className'\n | 'onChange'\n | 'dir'\n> {\n options: readonly Option[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n // Receives pressed values in option order, followed by supplied values that\n // match no option.\n onChange?: (values: string[]) => void;\n size?: ComponentSize;\n dir?: 'ltr' | 'rtl';\n className?: string;\n classNames?: {\n item?: string;\n pressedItem?: string;\n };\n}\n\nconst ToggleGroup = ({\n options,\n value,\n defaultValue = [],\n onChange,\n size,\n disabled,\n orientation = 'horizontal',\n dir,\n className,\n classNames,\n ...props\n}: Props) => {\n const { componentSize, direction } = useConfig();\n const [pressed, setPressed] = useControllableState<readonly string[]>({\n value,\n defaultValue,\n onChange: values => onChange?.([...values]),\n });\n\n const resolvedSize = size ?? componentSize ?? 'middle';\n const resolvedDirection = dir ?? direction;\n const pressedSet = new Set(pressed);\n const optionValues = new Set(options.map(option => option.value));\n\n const handleValueChange = (values: string[]) => {\n const next = new Set(values);\n\n setPressed([\n ...options\n .filter(option => next.has(option.value))\n .map(option => option.value),\n ...[...new Set(pressed)].filter(item => !optionValues.has(item)),\n ]);\n };\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <ToggleGroupPrimitive\n {...props}\n data-slot=\"toggle-group\"\n dir={resolvedDirection}\n multiple\n disabled={disabled}\n orientation={orientation}\n value={[...pressedSet]}\n onValueChange={handleValueChange}\n className={cn(\n 'inline-flex w-fit gap-1 data-[orientation=vertical]:flex-col',\n className, //\n )}\n >\n {options.map(option => (\n <Toggle\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.iconOnly ? option.label : undefined}\n render={\n <Button\n variant=\"text\"\n size={resolvedSize}\n shape={option.iconOnly ? 'circle' : 'default'}\n icon={option.icon}\n />\n }\n className={cn(\n `data-pressed:bg-accent data-pressed:text-accent-foreground\n aria-disabled:cursor-not-allowed`,\n classNames?.item,\n pressedSet.has(option.value) && classNames?.pressedItem,\n //\n )}\n >\n {option.iconOnly ? null : option.label}\n </Toggle>\n ))}\n </ToggleGroupPrimitive>\n </DirectionProvider>\n );\n};\n\nexport default ToggleGroup;\n"],"mappings":";;;;;;;;;;AAiDA,MAAM,eAAe,EACnB,SACA,OACA,eAAe,CAAC,GAChB,UACA,MACA,UACA,cAAc,cACd,KACA,WACA,YACA,GAAG,YACQ;CACX,MAAM,EAAE,eAAe,cAAc,UAAU;CAC/C,MAAM,CAAC,SAAS,cAAc,qBAAwC;EACpE;EACA;EACA,WAAU,WAAU,WAAW,CAAC,GAAG,MAAM,CAAC;CAC5C,CAAC;CAED,MAAM,eAAe,QAAQ,iBAAiB;CAC9C,MAAM,oBAAoB,OAAO;CACjC,MAAM,aAAa,IAAI,IAAI,OAAO;CAClC,MAAM,eAAe,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,KAAK,CAAC;CAEhE,MAAM,qBAAqB,WAAqB;EAC9C,MAAM,OAAO,IAAI,IAAI,MAAM;EAE3B,WAAW,CACT,GAAG,QACA,QAAO,WAAU,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,CACxC,KAAI,WAAU,OAAO,KAAK,GAC7B,GAAG,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,QAAO,SAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,CACjE,CAAC;CACH;CAEA,OACE,oBAAC,mBAAD;EAAmB,WAAW;EAC5B,UAAA,oBAACA,eAAD;GACE,GAAI;GACJ,aAAU;GACV,KAAK;GACL,UAAA;GACU;GACG;GACb,OAAO,CAAC,GAAG,UAAU;GACrB,eAAe;GACf,WAAW,GACT,gEACA,SACF;GAEC,UAAA,QAAQ,KAAI,WACX,oBAAC,QAAD;IAEE,OAAO,OAAO;IACd,UAAU,OAAO;IACjB,cAAY,OAAO,WAAW,OAAO,QAAQ,KAAA;IAC7C,QACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAM;KACN,OAAO,OAAO,WAAW,WAAW;KACpC,MAAM,OAAO;IACd,CAAA;IAEH,WAAW,GACT;iDAEA,YAAY,MACZ,WAAW,IAAI,OAAO,KAAK,KAAK,YAAY,WAE9C;IAEC,UAAA,OAAO,WAAW,OAAO,OAAO;GAC3B,GArBD,OAAO,KAqBN,CACT;EACmB,CAAA;CACL,CAAA;AAEvB"}
|
|
@@ -2,7 +2,7 @@ import { ReactElement, ReactNode } from "react";
|
|
|
2
2
|
//#region src/components/atoms/tooltip.d.ts
|
|
3
3
|
declare const Core: <Payload>(props: import("@base-ui/react").TooltipRoot.Props<Payload>) => React.JSX.Element;
|
|
4
4
|
type Placement = 'top' | 'left' | 'right' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom';
|
|
5
|
-
interface Props extends Omit<React.ComponentProps<typeof Core>, 'children' | 'handle' | 'triggerId' | 'defaultTriggerId'> {
|
|
5
|
+
export interface Props extends Omit<React.ComponentProps<typeof Core>, 'children' | 'handle' | 'triggerId' | 'defaultTriggerId'> {
|
|
6
6
|
children: ReactElement;
|
|
7
7
|
/** Supplementary visual hint; keep essential information visible elsewhere. */
|
|
8
8
|
content: ReactNode;
|
|
@@ -17,5 +17,5 @@ interface Props extends Omit<React.ComponentProps<typeof Core>, 'children' | 'ha
|
|
|
17
17
|
}
|
|
18
18
|
declare const Tooltip: ({ children, content, className, placement, offset, delay, closeDelay, ...props }: Props) => import("react").JSX.Element;
|
|
19
19
|
//#endregion
|
|
20
|
-
export {
|
|
21
|
-
//# sourceMappingURL=
|
|
20
|
+
export { Tooltip as default };
|
|
21
|
+
//# sourceMappingURL=Tooltip.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.d.mts","names":[],"sources":["../src/components/atoms/tooltip.tsx"],"mappings":";;cAMiB,OAAI,SAAA,gCAAA,YAAA,MAAA,aAAA,MAAA,IAAA;KAEhB;iBAgCY,cAAc,KAC7B,MAAM,sBAAsB;EAG5B,UAAU;;EAEV,SAAS;;EAET;EACA,YAAY;;EAEZ;;EAEA;EACA;;cAGI,YAAW,UAAA,SAAA,WAAA,WAAA,QAAA,OAAA,eAAA,SASd,0BAAK,IAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { tooltip_exports } from "
|
|
2
|
+
import { tooltip_exports } from "./core/tooltip.mjs";
|
|
3
3
|
import { Children } from "react";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
//#region src/components/atoms/tooltip.tsx
|
|
@@ -75,4 +75,4 @@ const Tooltip = ({ children, content, className, placement = "top", offset = 8,
|
|
|
75
75
|
//#endregion
|
|
76
76
|
export { Tooltip as default };
|
|
77
77
|
|
|
78
|
-
//# sourceMappingURL=
|
|
78
|
+
//# sourceMappingURL=Tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.mjs","names":["tooltip"],"sources":["../src/components/atoms/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Children, type ReactElement, type ReactNode } from 'react';\n\nimport { tooltip } from '../../core';\n\nconst { Tooltip: Core, TooltipContent, TooltipTrigger } = tooltip;\n\ntype Placement =\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n\ntype Side = NonNullable<React.ComponentProps<typeof TooltipContent>['side']>;\ntype Align = NonNullable<React.ComponentProps<typeof TooltipContent>['align']>;\n\nconst placementMap: Record<Placement, { side: Side; align: Align }> = {\n top: { side: 'top', align: 'center' },\n left: { side: 'left', align: 'center' },\n right: { side: 'right', align: 'center' },\n bottom: { side: 'bottom', align: 'center' },\n topLeft: { side: 'top', align: 'start' },\n topRight: { side: 'top', align: 'end' },\n bottomLeft: { side: 'bottom', align: 'start' },\n bottomRight: { side: 'bottom', align: 'end' },\n leftTop: { side: 'left', align: 'start' },\n leftBottom: { side: 'left', align: 'end' },\n rightTop: { side: 'right', align: 'start' },\n rightBottom: { side: 'right', align: 'end' },\n};\n\nexport interface Props extends Omit<\n React.ComponentProps<typeof Core>,\n 'children' | 'handle' | 'triggerId' | 'defaultTriggerId'\n> {\n children: ReactElement;\n /** Supplementary visual hint; keep essential information visible elsewhere. */\n content: ReactNode;\n /** Popup class; the child retains its own className. */\n className?: string;\n placement?: Placement;\n /** Distance between the trigger and popup in pixels. */\n offset?: number;\n /** Hover delay in milliseconds. Keyboard focus opens without this delay. */\n delay?: number;\n closeDelay?: number;\n}\n\nconst Tooltip = ({\n children,\n content,\n className,\n placement = 'top',\n offset = 8,\n delay,\n closeDelay,\n ...props\n}: Props) => {\n const trigger = Children.only(children);\n const { side, align } = placementMap[placement];\n\n return (\n <Core {...props}>\n <TooltipTrigger render={trigger} delay={delay} closeDelay={closeDelay} />\n <TooltipContent\n side={side}\n align={align}\n sideOffset={offset}\n className={className}\n >\n {content}\n </TooltipContent>\n </Core>\n );\n};\n\nexport default Tooltip;\n"],"mappings":";;;;;AAMA,MAAM,EAAE,SAAS,MAAM,gBAAgB,mBAAmBA;AAmB1D,MAAM,eAAgE;CACpE,KAAK;EAAE,MAAM;EAAO,OAAO;CAAS;CACpC,MAAM;EAAE,MAAM;EAAQ,OAAO;CAAS;CACtC,OAAO;EAAE,MAAM;EAAS,OAAO;CAAS;CACxC,QAAQ;EAAE,MAAM;EAAU,OAAO;CAAS;CAC1C,SAAS;EAAE,MAAM;EAAO,OAAO;CAAQ;CACvC,UAAU;EAAE,MAAM;EAAO,OAAO;CAAM;CACtC,YAAY;EAAE,MAAM;EAAU,OAAO;CAAQ;CAC7C,aAAa;EAAE,MAAM;EAAU,OAAO;CAAM;CAC5C,SAAS;EAAE,MAAM;EAAQ,OAAO;CAAQ;CACxC,YAAY;EAAE,MAAM;EAAQ,OAAO;CAAM;CACzC,UAAU;EAAE,MAAM;EAAS,OAAO;CAAQ;CAC1C,aAAa;EAAE,MAAM;EAAS,OAAO;CAAM;AAC7C;AAmBA,MAAM,WAAW,EACf,UACA,SACA,WACA,YAAY,OACZ,SAAS,GACT,OACA,YACA,GAAG,YACQ;CACX,MAAM,UAAU,SAAS,KAAK,QAAQ;CACtC,MAAM,EAAE,MAAM,UAAU,aAAa;CAErC,OACE,qBAAC,MAAD;EAAM,GAAI;EAAV,UAAA,CACE,oBAAC,gBAAD;GAAgB,QAAQ;GAAgB;GAAmB;EAAa,CAAA,GACxE,oBAAC,gBAAD;GACQ;GACC;GACP,YAAY;GACD;GAEV,UAAA;EACa,CAAA,CACZ;;AAEV"}
|
package/dist/Tour.d.mts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, ReactNode } from "react";
|
|
2
|
+
//#region src/components/organisms/tour.d.ts
|
|
3
|
+
export interface Step {
|
|
4
|
+
key: string;
|
|
5
|
+
title: ReactNode;
|
|
6
|
+
description?: ReactNode;
|
|
7
|
+
/** Resolved after hydration. Missing/hidden targets use a centered popup. */
|
|
8
|
+
target?: () => HTMLElement | null;
|
|
9
|
+
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
10
|
+
}
|
|
11
|
+
export interface Props extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'onChange'> {
|
|
12
|
+
steps: readonly Step[];
|
|
13
|
+
open?: boolean;
|
|
14
|
+
defaultOpen?: boolean;
|
|
15
|
+
onOpenChange?: (open: boolean) => void;
|
|
16
|
+
current?: number;
|
|
17
|
+
defaultCurrent?: number;
|
|
18
|
+
onChange?: (current: number) => void;
|
|
19
|
+
onClose?: () => void;
|
|
20
|
+
onFinish?: () => void;
|
|
21
|
+
scrollIntoView?: boolean;
|
|
22
|
+
previousLabel?: string;
|
|
23
|
+
nextLabel?: string;
|
|
24
|
+
finishLabel?: string;
|
|
25
|
+
closeLabel?: string;
|
|
26
|
+
formatProgress?: (current: number, total: number) => string;
|
|
27
|
+
classNames?: {
|
|
28
|
+
popup?: string;
|
|
29
|
+
mask?: string;
|
|
30
|
+
highlight?: string;
|
|
31
|
+
actions?: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
declare const Tour: ({ steps, open: openProp, defaultOpen, onOpenChange, current: currentProp, defaultCurrent, onChange, onClose, onFinish, scrollIntoView, previousLabel, nextLabel, finishLabel, closeLabel, formatProgress, className, classNames, ...props }: Props) => import("react").JSX.Element;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { Tour as default };
|
|
37
|
+
//# sourceMappingURL=Tour.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tour.d.mts","names":[],"sources":["../src/components/organisms/tour.tsx"],"mappings":";;iBAmBiB;EACf;EACA,OAAO;EACP,cAAc;;EAEd,eAAe;EACf;;iBAGe,cAAc,KAC7B;EAGA,gBAAgB;EAChB;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB,iBAAiB;EACnC;IACE;IACA;IACA;IACA;;;cA6DE,SAAQ,OAAA,MAAA,UAAA,aAAA,cAAA,SAAA,aAAA,gBAAA,UAAA,SAAA,UAAA,gBAAA,eAAA,WAAA,aAAA,YAAA,gBAAA,WAAA,eAAA,SAmBX,0BAAK,IAAA"}
|
package/dist/Tour.mjs
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import { useConfig } from "./providers/config/context.mjs";
|
|
4
|
+
import { OVERLAY_LAYER } from "./lib/z-layers.mjs";
|
|
5
|
+
import Button from "./Button.mjs";
|
|
6
|
+
import { Popover, PopoverArrow, PopoverBackdrop, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle } from "./core/popover.mjs";
|
|
7
|
+
import { useEffect, useMemo, useState } from "react";
|
|
8
|
+
import { useControllableState, useElementPosition } from "@jbpark/use-hooks";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
//#region src/components/organisms/tour.tsx
|
|
11
|
+
const TARGET_MUTATION = {
|
|
12
|
+
attributes: true,
|
|
13
|
+
attributeFilter: [
|
|
14
|
+
"hidden",
|
|
15
|
+
"style",
|
|
16
|
+
"class"
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
const measureVisible = (element) => element.isConnected && element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden" ? element.getBoundingClientRect() : null;
|
|
20
|
+
const StepTarget = ({ index, step, scrollIntoView, onMeasure }) => {
|
|
21
|
+
const { rect, element } = useElementPosition(() => step.target?.() ?? null, {
|
|
22
|
+
withElement: true,
|
|
23
|
+
measure: measureVisible,
|
|
24
|
+
mutation: TARGET_MUTATION
|
|
25
|
+
});
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (element && scrollIntoView) element.scrollIntoView({
|
|
28
|
+
block: "center",
|
|
29
|
+
inline: "nearest",
|
|
30
|
+
behavior: "instant"
|
|
31
|
+
});
|
|
32
|
+
}, [element, scrollIntoView]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
onMeasure({
|
|
35
|
+
index,
|
|
36
|
+
target: element,
|
|
37
|
+
rect
|
|
38
|
+
});
|
|
39
|
+
}, [
|
|
40
|
+
onMeasure,
|
|
41
|
+
index,
|
|
42
|
+
element,
|
|
43
|
+
rect
|
|
44
|
+
]);
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
const defaultFormatProgress = (current, total) => `Step ${current} of ${total}`;
|
|
48
|
+
const Tour = ({ steps, open: openProp, defaultOpen = false, onOpenChange, current: currentProp, defaultCurrent = 0, onChange, onClose, onFinish, scrollIntoView = true, previousLabel = "Previous", nextLabel = "Next", finishLabel = "Finish", closeLabel = "Close tour", formatProgress = defaultFormatProgress, className, classNames, ...props }) => {
|
|
49
|
+
const { getContainer, direction } = useConfig();
|
|
50
|
+
const [open, setOpen] = useControllableState({
|
|
51
|
+
value: openProp,
|
|
52
|
+
defaultValue: defaultOpen,
|
|
53
|
+
onChange: onOpenChange
|
|
54
|
+
});
|
|
55
|
+
const [current, setCurrent] = useControllableState({
|
|
56
|
+
value: currentProp,
|
|
57
|
+
defaultValue: defaultCurrent,
|
|
58
|
+
onChange
|
|
59
|
+
});
|
|
60
|
+
const index = Number.isFinite(current) ? Math.max(0, Math.min(steps.length - 1, Math.floor(current))) : 0;
|
|
61
|
+
const step = steps[index];
|
|
62
|
+
const [measurement, setMeasurement] = useState(null);
|
|
63
|
+
const target = open && measurement && measurement.index === index ? measurement.target : null;
|
|
64
|
+
const rect = open && measurement && measurement.index === index ? measurement.rect : null;
|
|
65
|
+
const fallback = useMemo(() => ({ getBoundingClientRect: () => new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0) }), []);
|
|
66
|
+
const close = () => {
|
|
67
|
+
onClose?.();
|
|
68
|
+
setOpen(false);
|
|
69
|
+
};
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
71
|
+
...props,
|
|
72
|
+
"data-slot": "tour",
|
|
73
|
+
className: cn("contents", className),
|
|
74
|
+
children: [open && step && /* @__PURE__ */ jsx(StepTarget, {
|
|
75
|
+
index,
|
|
76
|
+
step,
|
|
77
|
+
scrollIntoView,
|
|
78
|
+
onMeasure: setMeasurement
|
|
79
|
+
}, index), /* @__PURE__ */ jsxs(Popover, {
|
|
80
|
+
open: open && !!step,
|
|
81
|
+
modal: true,
|
|
82
|
+
onOpenChange: (next, details) => {
|
|
83
|
+
if (details.reason === "outside-press") {
|
|
84
|
+
details.cancel();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!next) close();
|
|
88
|
+
},
|
|
89
|
+
children: [/* @__PURE__ */ jsxs(PopoverPortal, {
|
|
90
|
+
container: getContainer(),
|
|
91
|
+
children: [/* @__PURE__ */ jsx(PopoverBackdrop, {
|
|
92
|
+
"data-slot": "tour-mask",
|
|
93
|
+
className: cn("fixed inset-0 bg-black/40", OVERLAY_LAYER, classNames?.mask)
|
|
94
|
+
}), open && rect && /* @__PURE__ */ jsx("div", {
|
|
95
|
+
"data-slot": "tour-highlight",
|
|
96
|
+
"aria-hidden": "true",
|
|
97
|
+
style: {
|
|
98
|
+
position: "fixed",
|
|
99
|
+
top: rect.top - 4,
|
|
100
|
+
left: rect.left - 4,
|
|
101
|
+
width: rect.width + 8,
|
|
102
|
+
height: rect.height + 8
|
|
103
|
+
},
|
|
104
|
+
className: cn("border-primary pointer-events-none rounded-md border-2", "z-1000", classNames?.highlight)
|
|
105
|
+
})]
|
|
106
|
+
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
107
|
+
"data-slot": "tour-popup",
|
|
108
|
+
dir: props.dir ?? direction,
|
|
109
|
+
anchor: target ?? fallback,
|
|
110
|
+
side: step?.placement ?? "bottom",
|
|
111
|
+
sideOffset: 12,
|
|
112
|
+
positionerStyle: target ? void 0 : {
|
|
113
|
+
position: "fixed",
|
|
114
|
+
left: "50%",
|
|
115
|
+
top: "50%",
|
|
116
|
+
transform: "translate(-50%, -50%)"
|
|
117
|
+
},
|
|
118
|
+
className: cn(`max-h-[calc(100dvh-2rem)] w-80 max-w-[calc(100vw-2rem)]
|
|
119
|
+
overflow-y-auto`, classNames?.popup),
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ jsx(PopoverTitle, { children: step?.title }),
|
|
122
|
+
step?.description != null && /* @__PURE__ */ jsx(PopoverDescription, {
|
|
123
|
+
className: "mt-2 text-sm",
|
|
124
|
+
children: step.description
|
|
125
|
+
}),
|
|
126
|
+
/* @__PURE__ */ jsx("p", {
|
|
127
|
+
"data-slot": "tour-progress",
|
|
128
|
+
role: "status",
|
|
129
|
+
"aria-live": "polite",
|
|
130
|
+
"aria-atomic": "true",
|
|
131
|
+
className: "text-muted-foreground mt-3 text-xs",
|
|
132
|
+
children: formatProgress(index + 1, steps.length)
|
|
133
|
+
}),
|
|
134
|
+
/* @__PURE__ */ jsxs("div", {
|
|
135
|
+
className: cn("mt-4 flex flex-wrap gap-2", classNames?.actions),
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx(PopoverClose, {
|
|
138
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
139
|
+
variant: "text",
|
|
140
|
+
size: "small"
|
|
141
|
+
}),
|
|
142
|
+
children: closeLabel
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ jsx(Button, {
|
|
145
|
+
variant: "outlined",
|
|
146
|
+
size: "small",
|
|
147
|
+
disabled: index === 0,
|
|
148
|
+
focusableWhenDisabled: true,
|
|
149
|
+
className: "aria-disabled:pointer-events-none\n aria-disabled:opacity-50",
|
|
150
|
+
onClick: () => setCurrent(index - 1),
|
|
151
|
+
children: previousLabel
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ jsx(Button, {
|
|
154
|
+
size: "small",
|
|
155
|
+
onClick: () => {
|
|
156
|
+
if (index < steps.length - 1) setCurrent(index + 1);
|
|
157
|
+
else {
|
|
158
|
+
onFinish?.();
|
|
159
|
+
setOpen(false);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
children: index === steps.length - 1 ? finishLabel : nextLabel
|
|
163
|
+
})
|
|
164
|
+
]
|
|
165
|
+
}),
|
|
166
|
+
target && /* @__PURE__ */ jsx(PopoverArrow, {})
|
|
167
|
+
]
|
|
168
|
+
})]
|
|
169
|
+
})]
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
//#endregion
|
|
173
|
+
export { Tour as default };
|
|
174
|
+
|
|
175
|
+
//# sourceMappingURL=Tour.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tour.mjs","names":["popover.Popover","popover.PopoverPortal","popover.PopoverBackdrop","popover.PopoverContent","popover.PopoverTitle","popover.PopoverDescription","popover.PopoverClose","popover.PopoverArrow"],"sources":["../src/components/organisms/tour.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentPropsWithRef,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { useControllableState, useElementPosition } from '@jbpark/use-hooks';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { popover } from '../../core';\nimport { OVERLAY_LAYER } from '../../lib/z-layers';\nimport Button from '../atoms/button';\n\nexport interface Step {\n key: string;\n title: ReactNode;\n description?: ReactNode;\n /** Resolved after hydration. Missing/hidden targets use a centered popup. */\n target?: () => HTMLElement | null;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'onChange'\n> {\n steps: readonly Step[];\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n current?: number;\n defaultCurrent?: number;\n onChange?: (current: number) => void;\n onClose?: () => void;\n onFinish?: () => void;\n scrollIntoView?: boolean;\n previousLabel?: string;\n nextLabel?: string;\n finishLabel?: string;\n closeLabel?: string;\n formatProgress?: (current: number, total: number) => string;\n classNames?: {\n popup?: string;\n mask?: string;\n highlight?: string;\n actions?: string;\n };\n}\n\ninterface Measurement {\n index: number;\n target: HTMLElement | null;\n rect: DOMRect | null;\n}\n\nconst TARGET_MUTATION = {\n attributes: true,\n attributeFilter: ['hidden', 'style', 'class'],\n};\n\nconst measureVisible = (element: HTMLElement) =>\n element.isConnected &&\n element.getClientRects().length > 0 &&\n getComputedStyle(element).visibility !== 'hidden'\n ? element.getBoundingClientRect()\n : null;\n\n// Tracks one open step's target. Tour mounts it only while open and keys it by\n// step, so no listener stays attached while closed and a new step never\n// reports the previous step's element.\nconst StepTarget = ({\n index,\n step,\n scrollIntoView,\n onMeasure,\n}: {\n index: number;\n step: Step;\n scrollIntoView: boolean;\n onMeasure: (measurement: Measurement) => void;\n}) => {\n const { rect, element } = useElementPosition<HTMLElement>(\n () => step.target?.() ?? null,\n { withElement: true, measure: measureVisible, mutation: TARGET_MUTATION },\n );\n\n useEffect(() => {\n if (element && scrollIntoView) {\n element.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n behavior: 'instant',\n });\n }\n }, [element, scrollIntoView]);\n\n useEffect(() => {\n onMeasure({ index, target: element, rect });\n }, [onMeasure, index, element, rect]);\n\n return null;\n};\n\nconst defaultFormatProgress = (current: number, total: number) =>\n `Step ${current} of ${total}`;\n\nconst Tour = ({\n steps,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n current: currentProp,\n defaultCurrent = 0,\n onChange,\n onClose,\n onFinish,\n scrollIntoView = true,\n previousLabel = 'Previous',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n closeLabel = 'Close tour',\n formatProgress = defaultFormatProgress,\n className,\n classNames,\n ...props\n}: Props) => {\n const { getContainer, direction } = useConfig();\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const [current, setCurrent] = useControllableState({\n value: currentProp,\n defaultValue: defaultCurrent,\n onChange,\n });\n const index = Number.isFinite(current)\n ? Math.max(0, Math.min(steps.length - 1, Math.floor(current)))\n : 0;\n const step = steps[index];\n const [measurement, setMeasurement] = useState<Measurement | null>(null);\n const target =\n open && measurement && measurement.index === index\n ? measurement.target\n : null;\n const rect =\n open && measurement && measurement.index === index\n ? measurement.rect\n : null;\n const fallback = useMemo(\n () => ({\n getBoundingClientRect: () =>\n new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0),\n }),\n [],\n );\n\n const close = () => {\n onClose?.();\n setOpen(false);\n };\n\n return (\n <div\n {...props}\n data-slot=\"tour\"\n className={cn(\n 'contents',\n className, //\n )}\n >\n {open && step && (\n <StepTarget\n key={index}\n index={index}\n step={step}\n scrollIntoView={scrollIntoView}\n onMeasure={setMeasurement}\n />\n )}\n <popover.Popover\n open={open && !!step}\n modal\n onOpenChange={(next, details) => {\n if (details.reason === 'outside-press') {\n details.cancel();\n\n return;\n }\n\n if (!next) close();\n }}\n >\n <popover.PopoverPortal container={getContainer()}>\n <popover.PopoverBackdrop\n data-slot=\"tour-mask\"\n className={cn(\n 'fixed inset-0 bg-black/40',\n OVERLAY_LAYER,\n classNames?.mask, //\n )}\n />\n {open && rect && (\n <div\n data-slot=\"tour-highlight\"\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n top: rect.top - 4,\n left: rect.left - 4,\n width: rect.width + 8,\n height: rect.height + 8,\n }}\n className={cn(\n 'border-primary pointer-events-none rounded-md border-2',\n OVERLAY_LAYER,\n classNames?.highlight, //\n )}\n />\n )}\n </popover.PopoverPortal>\n <popover.PopoverContent\n data-slot=\"tour-popup\"\n dir={props.dir ?? direction}\n anchor={target ?? fallback}\n side={step?.placement ?? 'bottom'}\n sideOffset={12}\n positionerStyle={\n target\n ? undefined\n : {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }\n }\n className={cn(\n `max-h-[calc(100dvh-2rem)] w-80 max-w-[calc(100vw-2rem)]\n overflow-y-auto`,\n classNames?.popup, //\n )}\n >\n <popover.PopoverTitle>{step?.title}</popover.PopoverTitle>\n {step?.description != null && (\n <popover.PopoverDescription className=\"mt-2 text-sm\">\n {step.description}\n </popover.PopoverDescription>\n )}\n <p\n data-slot=\"tour-progress\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"text-muted-foreground mt-3 text-xs\"\n >\n {formatProgress(index + 1, steps.length)}\n </p>\n <div\n className={cn(\n 'mt-4 flex flex-wrap gap-2',\n classNames?.actions, //\n )}\n >\n <popover.PopoverClose\n render={<Button variant=\"text\" size=\"small\" />}\n >\n {closeLabel}\n </popover.PopoverClose>\n <Button\n variant=\"outlined\"\n size=\"small\"\n disabled={index === 0}\n focusableWhenDisabled\n className=\"aria-disabled:pointer-events-none\n aria-disabled:opacity-50\"\n onClick={() => setCurrent(index - 1)}\n >\n {previousLabel}\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n if (index < steps.length - 1) {\n setCurrent(index + 1);\n } else {\n onFinish?.();\n setOpen(false);\n }\n }}\n >\n {index === steps.length - 1 ? finishLabel : nextLabel}\n </Button>\n </div>\n {target && <popover.PopoverArrow />}\n </popover.PopoverContent>\n </popover.Popover>\n </div>\n );\n};\n\nexport default Tour;\n"],"mappings":"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"}
|