@jbpark/ui-kit 10.1.0 → 10.3.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/dist/Alert.d.mts +24 -0
- package/dist/Alert.d.mts.map +1 -0
- package/dist/Alert.mjs +68 -0
- package/dist/Alert.mjs.map +1 -0
- 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 +19 -0
- package/dist/Avatar.d.mts.map +1 -0
- package/dist/Avatar.mjs +43 -0
- package/dist/Avatar.mjs.map +1 -0
- package/dist/Badge.d.mts +23 -0
- package/dist/Badge.d.mts.map +1 -0
- package/dist/Badge.mjs +41 -0
- package/dist/Badge.mjs.map +1 -0
- package/dist/Breadcrumb.d.mts +3 -3
- package/dist/Breadcrumb.d.mts.map +1 -1
- package/dist/Breadcrumb.mjs +1 -1
- 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/CodeEditor.d.mts +2 -2
- package/dist/CodeEditor.d.mts.map +1 -1
- 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/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/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/Layout.d.mts.map +1 -1
- package/dist/Mentions.d.mts +34 -0
- package/dist/Mentions.d.mts.map +1 -0
- package/dist/Mentions.mjs +207 -0
- package/dist/Mentions.mjs.map +1 -0
- package/dist/Menu.mjs +1 -2
- package/dist/Pagination.d.mts +2 -2
- package/dist/Pagination.d.mts.map +1 -1
- package/dist/Pagination.mjs +1 -1
- 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/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/Reveals.d.mts.map +1 -1
- 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 +26 -0
- package/dist/Segmented.d.mts.map +1 -0
- package/dist/Segmented.mjs +57 -0
- package/dist/Segmented.mjs.map +1 -0
- package/dist/Space.d.mts +2 -2
- package/dist/Space.d.mts.map +1 -1
- 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 +28 -0
- package/dist/Steps.d.mts.map +1 -0
- package/dist/Steps.mjs +70 -0
- package/dist/Steps.mjs.map +1 -0
- package/dist/Table.d.mts +4 -4
- package/dist/Table.d.mts.map +1 -1
- 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/Tour.d.mts +37 -0
- package/dist/Tour.d.mts.map +1 -0
- package/dist/Tour.mjs +192 -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/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/checkbox/index.d.mts.map +1 -1
- package/dist/components/atoms/color-picker.d.mts +2 -2
- package/dist/components/atoms/color-picker.d.mts.map +1 -1
- package/dist/components/atoms/date-picker.d.mts +5 -1
- package/dist/components/atoms/date-picker.d.mts.map +1 -1
- package/dist/components/atoms/date-picker.mjs +54 -10
- package/dist/components/atoms/date-picker.mjs.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/float-button/index.d.mts.map +1 -1
- package/dist/components/atoms/index.d.mts +13 -2
- package/dist/components/atoms/input/index.d.mts +5 -1
- package/dist/components/atoms/input/index.d.mts.map +1 -1
- package/dist/components/atoms/input/index.mjs +5 -1
- package/dist/components/atoms/input/index.mjs.map +1 -1
- package/dist/components/atoms/input/number.d.mts +23 -0
- package/dist/components/atoms/input/number.d.mts.map +1 -0
- package/dist/components/atoms/input/number.mjs +71 -0
- package/dist/components/atoms/input/number.mjs.map +1 -0
- 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 -7
- package/dist/components/atoms/input/search.d.mts.map +1 -1
- package/dist/components/atoms/input/search.mjs +6 -8
- package/dist/components/atoms/input/search.mjs.map +1 -1
- 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/popover.d.mts +2 -2
- package/dist/components/atoms/popover.d.mts.map +1 -1
- package/dist/components/atoms/progress.d.mts +5 -3
- package/dist/components/atoms/progress.d.mts.map +1 -1
- package/dist/components/atoms/progress.mjs +2 -2
- package/dist/components/atoms/progress.mjs.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/index.d.mts.map +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 +8 -3
- package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts.map +1 -1
- package/dist/components/atoms/rich-text-editor/rich-text-editor.mjs +7 -2
- package/dist/components/atoms/rich-text-editor/rich-text-editor.mjs.map +1 -1
- package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +2 -2
- 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 +4 -3
- 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 +4 -3
- package/dist/components/atoms/select-searchable.mjs.map +1 -1
- package/dist/components/atoms/select.d.mts +4 -4
- package/dist/components/atoms/select.d.mts.map +1 -1
- package/dist/components/atoms/select.mjs +1 -1
- package/dist/components/atoms/select.mjs.map +1 -1
- package/dist/components/atoms/skeleton/button.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/index.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/node.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/skeleton.d.mts +5 -3
- package/dist/components/atoms/skeleton/skeleton.d.mts.map +1 -1
- package/dist/components/atoms/skeleton/skeleton.mjs +2 -2
- package/dist/components/atoms/skeleton/skeleton.mjs.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/spin.d.mts +2 -2
- package/dist/components/atoms/spin.d.mts.map +1 -1
- package/dist/components/atoms/spin.mjs +1 -1
- package/dist/components/atoms/switch.d.mts +2 -2
- package/dist/components/atoms/switch.d.mts.map +1 -1
- package/dist/components/atoms/tooltip.d.mts +2 -2
- package/dist/components/atoms/tooltip.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/collapse.d.mts +9 -9
- package/dist/components/molecules/collapse.d.mts.map +1 -1
- package/dist/components/molecules/collapse.mjs +11 -2
- package/dist/components/molecules/collapse.mjs.map +1 -1
- package/dist/components/molecules/dropdown.d.mts +2 -2
- package/dist/components/molecules/dropdown.d.mts.map +1 -1
- package/dist/components/molecules/index.d.mts +23 -13
- package/dist/components/molecules/marquees/index.d.mts.map +1 -1
- 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/menu/menu.mjs +3 -1
- package/dist/components/molecules/menu/menu.mjs.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/index.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/molecules/tabs.d.mts +9 -5
- package/dist/components/molecules/tabs.d.mts.map +1 -1
- package/dist/components/molecules/tabs.mjs +5 -1
- package/dist/components/molecules/tabs.mjs.map +1 -1
- package/dist/components/molecules/upload.d.mts +3 -3
- package/dist/components/molecules/upload.d.mts.map +1 -1
- package/dist/components/molecules/upload.mjs +1 -1
- package/dist/components/organisms/drawer.d.mts +3 -3
- package/dist/components/organisms/drawer.d.mts.map +1 -1
- package/dist/components/organisms/drawer.mjs +4 -3
- package/dist/components/organisms/drawer.mjs.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/index.d.mts +14 -6
- package/dist/components/organisms/list/index.d.mts.map +1 -1
- package/dist/components/organisms/list/list.d.mts +2 -2
- package/dist/components/organisms/list/list.d.mts.map +1 -1
- package/dist/components/organisms/modal.d.mts +6 -3
- package/dist/components/organisms/modal.d.mts.map +1 -1
- package/dist/components/organisms/modal.mjs +25 -18
- package/dist/components/organisms/modal.mjs.map +1 -1
- package/dist/components/organisms/swiper/index.d.mts.map +1 -1
- package/dist/components/organisms/swiper/swiper.d.mts +2 -2
- package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
- package/dist/components/organisms/toast.d.mts +2 -2
- package/dist/components/organisms/toast.d.mts.map +1 -1
- package/dist/components/organisms/toast.mjs +1 -1
- package/dist/components/templates/container.d.mts +2 -2
- package/dist/components/templates/container.d.mts.map +1 -1
- package/dist/components/templates/empty.d.mts +2 -2
- package/dist/components/templates/empty.d.mts.map +1 -1
- package/dist/components/templates/empty.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/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 +1 -1
- package/dist/components/templates/page-header.d.mts +2 -2
- package/dist/components/templates/page-header.d.mts.map +1 -1
- package/dist/components/templates/page-header.mjs +1 -1
- package/dist/components/templates/result.d.mts +2 -2
- package/dist/components/templates/result.d.mts.map +1 -1
- package/dist/components/templates/result.mjs +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 +6 -4
- 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 +63 -34
- package/dist/index.mjs +29 -5
- 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 +838 -288
- package/dist/utils.d.mts +2 -3
- package/dist/utils.d.mts.map +1 -1
- package/package.json +147 -26
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Steps.mjs","names":[],"sources":["../src/components/molecules/steps.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { Check, TriangleAlert } from 'lucide-react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nexport interface Item {\n key?: React.Key;\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n /** Mark a failed step regardless of its position. */\n status?: 'error';\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'nav'>,\n 'children'\n> {\n items: readonly Item[];\n /** Zero-based index of the current step. */\n current?: number;\n orientation?: 'horizontal' | 'vertical';\n classNames?: {\n list?: string;\n item?: string;\n indicator?: string;\n title?: string;\n description?: string;\n connector?: string;\n };\n}\n\nconst Steps = ({\n items,\n current = 0,\n orientation = 'horizontal',\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const currentIndex = items.length\n ? Math.min(\n Math.max(Number.isFinite(current) ? Math.floor(current) : 0, 0),\n items.length - 1,\n )\n : -1;\n\n return (\n <nav\n {...props}\n data-slot=\"steps\"\n data-orientation={orientation}\n dir={dir ?? direction}\n aria-label={ariaLabel ?? 'Progress'}\n className={cn('w-full', className)}\n >\n <ol\n data-slot=\"steps-list\"\n className={cn(\n 'm-0 flex list-none p-0',\n orientation === 'vertical' && 'flex-col',\n classNames?.list,\n //\n )}\n >\n {items.map((item, index) => {\n const status =\n item.status === 'error'\n ? 'error'\n : index < currentIndex\n ? 'complete'\n : index === currentIndex\n ? 'current'\n : 'upcoming';\n const isCurrent = index === currentIndex;\n\n return (\n <li\n key={item.key ?? index}\n data-slot=\"steps-item\"\n data-status={status}\n aria-current={isCurrent ? 'step' : undefined}\n className={cn(\n 'm-0 flex min-w-0',\n orientation === 'horizontal'\n ? 'flex-1 items-start'\n : 'flex-col',\n classNames?.item,\n //\n )}\n >\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span\n data-slot=\"steps-indicator\"\n aria-hidden=\"true\"\n className={cn(\n `border-border text-muted-foreground flex size-7 shrink-0\n items-center justify-center rounded-full border text-sm\n font-medium`,\n status === 'complete' &&\n 'border-primary bg-primary text-primary-foreground',\n status === 'current' && 'border-primary text-primary',\n status === 'error' &&\n `border-destructive bg-destructive\n text-destructive-foreground`,\n classNames?.indicator,\n //\n )}\n >\n {item.icon ??\n (status === 'complete' ? (\n <Check className=\"size-4\" />\n ) : status === 'error' ? (\n <TriangleAlert className=\"size-4\" />\n ) : (\n index + 1\n ))}\n </span>\n <span className=\"min-w-0\">\n <span\n data-slot=\"steps-title\"\n className={cn(\n 'block text-sm font-medium',\n status === 'upcoming'\n ? 'text-muted-foreground'\n : status === 'error'\n ? 'text-destructive'\n : 'text-foreground',\n classNames?.title,\n //\n )}\n >\n {item.title}\n </span>\n {item.description != null && (\n <span\n data-slot=\"steps-description\"\n className={cn(\n 'text-muted-foreground block text-xs',\n classNames?.description,\n )}\n >\n {item.description}\n </span>\n )}\n <span className=\"sr-only\">\n {status === 'complete'\n ? 'Completed'\n : status === 'current'\n ? 'Current step'\n : status === 'error'\n ? 'Error'\n : 'Upcoming'}\n </span>\n </span>\n </div>\n {index < items.length - 1 && (\n <span\n data-slot=\"steps-connector\"\n aria-hidden=\"true\"\n className={cn(\n 'bg-border shrink-0',\n orientation === 'horizontal'\n ? 'mx-3 mt-3.5 h-px min-w-3 flex-1'\n : 'my-2 ms-3.5 h-7 w-px',\n index < currentIndex && 'bg-primary',\n classNames?.connector,\n //\n )}\n />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default Steps;\n"],"mappings":";;;;;;;AAoCA,MAAM,SAAS,EACb,OACA,UAAU,GACV,cAAc,cACd,WACA,YACA,KACA,cAAc,WACd,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,eAAe,MAAM,SACvB,KAAK,IACH,KAAK,IAAI,OAAO,SAAS,OAAO,IAAI,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,GAC9D,MAAM,SAAS,CACjB,IACA;CAEJ,OACE,oBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,oBAAkB;EAClB,KAAK,OAAO;EACZ,cAAY,aAAa;EACzB,WAAW,GAAG,UAAU,SAAS;EAEjC,UAAA,oBAAC,MAAD;GACE,aAAU;GACV,WAAW,GACT,0BACA,gBAAgB,cAAc,YAC9B,YAAY,IAEd;GAEC,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,SACJ,KAAK,WAAW,UACZ,UACA,QAAQ,eACN,aACA,UAAU,eACR,YACA;IAGV,OACE,qBAAC,MAAD;KAEE,aAAU;KACV,eAAa;KACb,gBAPc,UAAU,eAOE,SAAS,KAAA;KACnC,WAAW,GACT,oBACA,gBAAgB,eACZ,uBACA,YACJ,YAAY,IAEd;KAZF,UAAA,CAcE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OACE,aAAU;OACV,eAAY;OACZ,WAAW,GACT;;kCAGA,WAAW,cACT,qDACF,WAAW,aAAa,+BACxB,WAAW,WACT;oDAEF,YAAY,SAEd;OAEC,UAAA,KAAK,SACH,WAAW,aACV,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA,IACzB,WAAW,UACb,oBAAC,eAAD,EAAe,WAAU,SAAU,CAAA,IAEnC,QAAQ;MAER,CAAA,GACN,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA;QACE,oBAAC,QAAD;SACE,aAAU;SACV,WAAW,GACT,6BACA,WAAW,aACP,0BACA,WAAW,UACT,qBACA,mBACN,YAAY,KAEd;SAEC,UAAA,KAAK;QACF,CAAA;QACL,KAAK,eAAe,QACnB,oBAAC,QAAD;SACE,aAAU;SACV,WAAW,GACT,uCACA,YAAY,WACd;SAEC,UAAA,KAAK;QACF,CAAA;QAER,oBAAC,QAAD;SAAM,WAAU;SACb,UAAA,WAAW,aACR,cACA,WAAW,YACT,iBACA,WAAW,UACT,UACA;QACJ,CAAA;OACF;MACH,CAAA,CAAA;KACJ,CAAA,GAAA,QAAQ,MAAM,SAAS,KACtB,oBAAC,QAAD;MACE,aAAU;MACV,eAAY;MACZ,WAAW,GACT,sBACA,gBAAgB,eACZ,oCACA,wBACJ,QAAQ,gBAAgB,cACxB,YAAY,SAEd;KACD,CAAA,CAED;IA7FG,GAAA,KAAK,OAAO,KA6Ff;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET"}
|
package/dist/Table.d.mts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Props as Props$1 } from "./Pagination.mjs";
|
|
2
2
|
//#region src/components/organisms/table.d.ts
|
|
3
|
-
type PaginationOptions = Omit<Props$1, 'total'> & ({
|
|
3
|
+
export type PaginationOptions = Omit<Props$1, 'total'> & ({
|
|
4
4
|
mode?: 'client';
|
|
5
5
|
total?: never;
|
|
6
6
|
} | {
|
|
7
7
|
mode: 'server';
|
|
8
8
|
total: number;
|
|
9
9
|
});
|
|
10
|
-
interface Column<T> {
|
|
10
|
+
export interface Column<T> {
|
|
11
11
|
key: React.Key;
|
|
12
12
|
title: React.ReactNode;
|
|
13
13
|
/** Field displayed when render is omitted. */
|
|
@@ -18,7 +18,7 @@ interface Column<T> {
|
|
|
18
18
|
className?: string;
|
|
19
19
|
headerClassName?: string;
|
|
20
20
|
}
|
|
21
|
-
interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'children'> {
|
|
21
|
+
export interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'children'> {
|
|
22
22
|
columns: Column<T>[];
|
|
23
23
|
data?: T[];
|
|
24
24
|
/** Use a stable key when rows may be reordered or paged. */
|
|
@@ -44,5 +44,5 @@ interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'childr
|
|
|
44
44
|
}
|
|
45
45
|
declare const Table: <T>({ columns, data, rowKey, loading, empty, size, bordered, striped, hoverable, pagination, caption, className, classNames, ...props }: Props<T>) => import("react").JSX.Element;
|
|
46
46
|
//#endregion
|
|
47
|
-
export {
|
|
47
|
+
export { Table as default };
|
|
48
48
|
//# sourceMappingURL=Table.d.mts.map
|
package/dist/Table.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.mts","names":[],"sources":["../src/components/organisms/table.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Table.d.mts","names":["PaginationProps"],"sources":["../src/components/organisms/table.tsx"],"mappings":";;YAaY,oBAAoB,KAAKA;EAChC;EAAiB;;EAAoB;EAAgB;;iBAEzC,OAAO;EACtB,KAAK,MAAM;EACX,OAAO,MAAM;;EAEb,kBAAkB;EAClB,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C;EACA;EACA;EACA;;iBAGe,MAAM,WAAW,KAChC,MAAM;EAGN,SAAS,OAAO;EAChB,OAAO;;EAEP,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C,UAAU,MAAM;EAChB;EACA,QAAQ,MAAM;EACd;EACA;EACA;EACA;;EAEA,uBAAuB;EACvB;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAaE,QAAS,KAAI,SAAA,MAAA,QAAA,SAAA,OAAA,MAAA,UAAA,SAAA,WAAA,YAAA,SAAA,WAAA,eAAA,SAehB,MAAM,uBAAE,IAAA"}
|
package/dist/Tag.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Badge } from "./core/badge.mjs";
|
|
1
|
+
import { Badge, badge_d_exports } from "./core/badge.mjs";
|
|
2
2
|
import "./core/index.mjs";
|
|
3
3
|
import { PresetColor } from "./lib/colors.mjs";
|
|
4
4
|
import * as React$1 from "react";
|
|
5
5
|
//#region src/components/atoms/tag.d.ts
|
|
6
6
|
declare const Core: typeof Badge;
|
|
7
|
-
interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'color'> {
|
|
7
|
+
export interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'color'> {
|
|
8
8
|
/**
|
|
9
9
|
* Fill style, aligned with `Button`'s vocabulary (#320). The pre-7.0
|
|
10
10
|
* `'default'` spelling was removed — use `'filled'`, which renders
|
|
@@ -26,5 +26,5 @@ interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'c
|
|
|
26
26
|
}
|
|
27
27
|
declare const Tag: ({ className, variant, color, children, ...props }: Props) => React$1.JSX.Element;
|
|
28
28
|
//#endregion
|
|
29
|
-
export {
|
|
29
|
+
export { Tag as default };
|
|
30
30
|
//# sourceMappingURL=Tag.d.mts.map
|
package/dist/Tag.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tag.d.mts","names":[],"sources":["../src/components/atoms/tag.tsx"],"mappings":";;;;;cAUM,
|
|
1
|
+
{"version":3,"file":"Tag.d.mts","names":["badge","badge.Badge","React"],"sources":["../src/components/atoms/tag.tsx"],"mappings":";;;;;cAUM,aAAIC;iBAEO,cAAc,KAC7BC,QAAM,sBAAsB;;;;;;EAQ5B;;;;;;;;;;;;EAYA,mEAC6D;;cAuBzD,QAAO,WAAA,SAAA,OAAA,aAAA,SAAmD,UAAKA,QAAA,IAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ComponentSize } from "./providers/config/types.mjs";
|
|
2
|
+
import * as React$1 from "react";
|
|
3
|
+
//#region src/components/atoms/time-picker.d.ts
|
|
4
|
+
export interface Props extends Omit<React$1.ComponentPropsWithRef<'input'>, 'children' | 'defaultValue' | 'onChange' | 'size' | 'step' | 'type' | 'value'> {
|
|
5
|
+
/** Visible label. An external label or aria-label can be used instead. */
|
|
6
|
+
label?: string;
|
|
7
|
+
/** A local time in 24-hour HH:mm form; null keeps a controlled field empty. */
|
|
8
|
+
value?: string | null;
|
|
9
|
+
defaultValue?: string;
|
|
10
|
+
/** Called with HH:mm, or null when the field is cleared. */
|
|
11
|
+
onChange?: (value: string | null) => void;
|
|
12
|
+
/** Positive whole-minute interval. Native time inputs use seconds for step. */
|
|
13
|
+
minuteStep?: number;
|
|
14
|
+
allowClear?: boolean;
|
|
15
|
+
clearLabel?: string;
|
|
16
|
+
size?: ComponentSize;
|
|
17
|
+
classNames?: {
|
|
18
|
+
label?: string;
|
|
19
|
+
input?: string;
|
|
20
|
+
clear?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
declare const TimePicker: ({ ref, id, label, value, defaultValue, onChange, minuteStep, allowClear, clearLabel, size, disabled, readOnly, className, classNames, ...props }: Props) => React$1.JSX.Element;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { TimePicker as default };
|
|
26
|
+
//# sourceMappingURL=TimePicker.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.d.mts","names":["React"],"sources":["../src/components/atoms/time-picker.tsx"],"mappings":";;;iBAmBiB,cAAc,KAC7BA,QAAM;;EAIN;;EAEA;EACA;;EAEA,YAAY;;EAEZ;EACA;EACA;EACA,OAAO;EACP;IACE;IACA;IACA;;;cAIE,eAAc,KAAA,IAAA,OAAA,OAAA,cAAA,UAAA,YAAA,YAAA,YAAA,MAAA,UAAA,UAAA,WAAA,eAAA,SAgBjB,UAAKA,QAAA,IAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 Input from "./components/atoms/input/index.mjs";
|
|
6
|
+
import * as React$1 from "react";
|
|
7
|
+
import { useMergedRef } from "@jbpark/use-hooks";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { CircleX } from "lucide-react";
|
|
10
|
+
//#region src/components/atoms/time-picker.tsx
|
|
11
|
+
const sizes = {
|
|
12
|
+
small: "h-8",
|
|
13
|
+
middle: "h-9",
|
|
14
|
+
large: "h-10"
|
|
15
|
+
};
|
|
16
|
+
const TimePicker = ({ ref, id, label, value, defaultValue, onChange, minuteStep = 1, allowClear = true, clearLabel = "Clear time", size, disabled, readOnly, className, classNames, ...props }) => {
|
|
17
|
+
const generatedId = React$1.useId();
|
|
18
|
+
const inputId = id ?? generatedId;
|
|
19
|
+
const inputRef = React$1.useRef(null);
|
|
20
|
+
const mergedRef = useMergedRef(inputRef, ref);
|
|
21
|
+
const { componentSize } = useConfig();
|
|
22
|
+
const resolvedSize = size ?? componentSize ?? "middle";
|
|
23
|
+
const isControlled = value !== void 0;
|
|
24
|
+
const [uncontrolledValue, setUncontrolledValue] = React$1.useState(defaultValue ?? "");
|
|
25
|
+
const currentValue = isControlled ? value ?? "" : uncontrolledValue;
|
|
26
|
+
const handleChange = (event) => {
|
|
27
|
+
const nextValue = event.currentTarget.value;
|
|
28
|
+
if (!isControlled) setUncontrolledValue(nextValue);
|
|
29
|
+
onChange?.(nextValue || null);
|
|
30
|
+
};
|
|
31
|
+
const handleClear = () => {
|
|
32
|
+
if (!isControlled && inputRef.current) {
|
|
33
|
+
inputRef.current.value = "";
|
|
34
|
+
setUncontrolledValue("");
|
|
35
|
+
}
|
|
36
|
+
onChange?.(null);
|
|
37
|
+
inputRef.current?.focus();
|
|
38
|
+
};
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
40
|
+
"data-slot": "time-picker",
|
|
41
|
+
className: cn("w-full", className),
|
|
42
|
+
children: [label && /* @__PURE__ */ jsx("label", {
|
|
43
|
+
htmlFor: inputId,
|
|
44
|
+
className: cn("mb-1.5 block text-sm font-medium", classNames?.label),
|
|
45
|
+
children: label
|
|
46
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
47
|
+
className: "flex items-center gap-1",
|
|
48
|
+
children: [/* @__PURE__ */ jsx(Input, {
|
|
49
|
+
...props,
|
|
50
|
+
ref: mergedRef,
|
|
51
|
+
id: inputId,
|
|
52
|
+
type: "time",
|
|
53
|
+
step: minuteStep * 60,
|
|
54
|
+
disabled,
|
|
55
|
+
readOnly,
|
|
56
|
+
value: isControlled ? value ?? "" : void 0,
|
|
57
|
+
defaultValue: isControlled ? void 0 : defaultValue,
|
|
58
|
+
onChange: handleChange,
|
|
59
|
+
className: cn("min-w-0 flex-1", sizes[resolvedSize], classNames?.input)
|
|
60
|
+
}), allowClear && currentValue && !disabled && !readOnly && /* @__PURE__ */ jsx(Button, {
|
|
61
|
+
htmlType: "button",
|
|
62
|
+
variant: "text",
|
|
63
|
+
shape: "circle",
|
|
64
|
+
size: resolvedSize,
|
|
65
|
+
icon: /* @__PURE__ */ jsx(CircleX, {}),
|
|
66
|
+
"aria-label": clearLabel,
|
|
67
|
+
"data-time-picker-clear": "",
|
|
68
|
+
className: cn(classNames?.clear),
|
|
69
|
+
onClick: handleClear
|
|
70
|
+
})]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
//#endregion
|
|
75
|
+
export { TimePicker as default };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=TimePicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.mjs","names":["React"],"sources":["../src/components/atoms/time-picker.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { useMergedRef } from '@jbpark/use-hooks';\nimport { CircleX } from 'lucide-react';\n\nimport { type ComponentSize, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\nimport Input from './input';\n\nconst sizes: Record<ComponentSize, string> = {\n small: 'h-8',\n middle: 'h-9',\n large: 'h-10',\n};\n\nexport interface Props extends Omit<\n React.ComponentPropsWithRef<'input'>,\n 'children' | 'defaultValue' | 'onChange' | 'size' | 'step' | 'type' | 'value'\n> {\n /** Visible label. An external label or aria-label can be used instead. */\n label?: string;\n /** A local time in 24-hour HH:mm form; null keeps a controlled field empty. */\n value?: string | null;\n defaultValue?: string;\n /** Called with HH:mm, or null when the field is cleared. */\n onChange?: (value: string | null) => void;\n /** Positive whole-minute interval. Native time inputs use seconds for step. */\n minuteStep?: number;\n allowClear?: boolean;\n clearLabel?: string;\n size?: ComponentSize;\n classNames?: {\n label?: string;\n input?: string;\n clear?: string;\n };\n}\n\nconst TimePicker = ({\n ref,\n id,\n label,\n value,\n defaultValue,\n onChange,\n minuteStep = 1,\n allowClear = true,\n clearLabel = 'Clear time',\n size,\n disabled,\n readOnly,\n className,\n classNames,\n ...props\n}: Props) => {\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const mergedRef = useMergedRef(inputRef, ref);\n const { componentSize } = useConfig();\n const resolvedSize = size ?? componentSize ?? 'middle';\n const isControlled = value !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = React.useState(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : uncontrolledValue;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.currentTarget.value;\n\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n\n onChange?.(nextValue || null);\n };\n\n const handleClear = () => {\n if (!isControlled && inputRef.current) {\n inputRef.current.value = '';\n setUncontrolledValue('');\n }\n\n onChange?.(null);\n inputRef.current?.focus();\n };\n\n return (\n <div data-slot=\"time-picker\" className={cn('w-full', className)}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn('mb-1.5 block text-sm font-medium', classNames?.label)}\n >\n {label}\n </label>\n )}\n <div className=\"flex items-center gap-1\">\n <Input\n {...props}\n ref={mergedRef}\n id={inputId}\n type=\"time\"\n step={minuteStep * 60}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? (value ?? '') : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n className={cn(\n 'min-w-0 flex-1',\n sizes[resolvedSize],\n classNames?.input,\n //\n )}\n />\n {allowClear && currentValue && !disabled && !readOnly && (\n <Button\n htmlType=\"button\"\n variant=\"text\"\n shape=\"circle\"\n size={resolvedSize}\n icon={<CircleX />}\n aria-label={clearLabel}\n data-time-picker-clear=\"\"\n className={cn(classNames?.clear)}\n onClick={handleClear}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TimePicker;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,QAAuC;CAC3C,OAAO;CACP,QAAQ;CACR,OAAO;AACT;AAyBA,MAAM,cAAc,EAClB,KACA,IACA,OACA,OACA,cACA,UACA,aAAa,GACb,aAAa,MACb,aAAa,cACb,MACA,UACA,UACA,WACA,YACA,GAAG,YACQ;CACX,MAAM,cAAcA,QAAM,MAAM;CAChC,MAAM,UAAU,MAAM;CACtB,MAAM,WAAWA,QAAM,OAAyB,IAAI;CACpD,MAAM,YAAY,aAAa,UAAU,GAAG;CAC5C,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,eAAe,QAAQ,iBAAiB;CAC9C,MAAM,eAAe,UAAU,KAAA;CAC/B,MAAM,CAAC,mBAAmB,wBAAwBA,QAAM,SACtD,gBAAgB,EAClB;CACA,MAAM,eAAe,eAAgB,SAAS,KAAM;CAEpD,MAAM,gBAAgB,UAA+C;EACnE,MAAM,YAAY,MAAM,cAAc;EAEtC,IAAI,CAAC,cACH,qBAAqB,SAAS;EAGhC,WAAW,aAAa,IAAI;CAC9B;CAEA,MAAM,oBAAoB;EACxB,IAAI,CAAC,gBAAgB,SAAS,SAAS;GACrC,SAAS,QAAQ,QAAQ;GACzB,qBAAqB,EAAE;EACzB;EAEA,WAAW,IAAI;EACf,SAAS,SAAS,MAAM;CAC1B;CAEA,OACE,qBAAC,OAAD;EAAK,aAAU;EAAc,WAAW,GAAG,UAAU,SAAS;EAA9D,UAAA,CACG,SACC,oBAAC,SAAD;GACE,SAAS;GACT,WAAW,GAAG,oCAAoC,YAAY,KAAK;GAElE,UAAA;EACI,CAAA,GAET,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,OAAD;IACE,GAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAK;IACL,MAAM,aAAa;IACT;IACA;IACV,OAAO,eAAgB,SAAS,KAAM,KAAA;IACtC,cAAc,eAAe,KAAA,IAAY;IACzC,UAAU;IACV,WAAW,GACT,kBACA,MAAM,eACN,YAAY,KAEd;GACD,CAAA,GACA,cAAc,gBAAgB,CAAC,YAAY,CAAC,YAC3C,oBAAC,QAAD;IACE,UAAS;IACT,SAAQ;IACR,OAAM;IACN,MAAM;IACN,MAAM,oBAAC,SAAD,CAAU,CAAA;IAChB,cAAY;IACZ,0BAAuB;IACvB,WAAW,GAAG,YAAY,KAAK;IAC/B,SAAS;GACV,CAAA,CAEA;EACF,CAAA,CAAA;;AAET"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, Key, ReactNode } from "react";
|
|
2
|
+
//#region src/components/molecules/timeline.d.ts
|
|
3
|
+
export interface Timestamp {
|
|
4
|
+
/** Caller-formatted text. No locale or timezone conversion is performed. */
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
/** A valid HTML time value, such as an ISO date or timestamp. */
|
|
7
|
+
dateTime?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Item {
|
|
10
|
+
key: Key;
|
|
11
|
+
title: ReactNode;
|
|
12
|
+
description?: ReactNode;
|
|
13
|
+
timestamp?: Timestamp;
|
|
14
|
+
/** Decorative marker treatment. Include meaningful status in the event text. */
|
|
15
|
+
status?: 'neutral' | 'primary' | 'error';
|
|
16
|
+
/** Decorative content, such as an icon; do not supply interactive elements. */
|
|
17
|
+
marker?: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export interface Props extends Omit<ComponentPropsWithRef<'ol'>, 'children' | 'reversed' | 'start' | 'type'> {
|
|
20
|
+
/** Events render in this order; the component does not sort by timestamp. */
|
|
21
|
+
items: readonly Item[];
|
|
22
|
+
classNames?: {
|
|
23
|
+
item?: string;
|
|
24
|
+
marker?: string;
|
|
25
|
+
connector?: string;
|
|
26
|
+
content?: string;
|
|
27
|
+
title?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
timestamp?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
declare const Timeline: ({ items, className, classNames, ...props }: Props) => import("react").JSX.Element;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { Timeline as default };
|
|
35
|
+
//# sourceMappingURL=Timeline.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Timeline.d.mts","names":[],"sources":["../src/components/molecules/timeline.tsx"],"mappings":";;iBAIiB;;EAEf,OAAO;;EAEP;;iBAGe;EACf,KAAK;EACL,OAAO;EACP,cAAc;EACd,YAAY;;EAEZ;;EAEA,SAAS;;iBAGM,cAAc,KAC7B;;EAIA,gBAAgB;EAChB;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAIE,aAAY,OAAA,WAAA,eAAA,SAA4C,0BAAK,IAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { cn } from "./utils.mjs";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/molecules/timeline.tsx
|
|
4
|
+
const Timeline = ({ items, className, classNames, ...props }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx("ol", {
|
|
6
|
+
...props,
|
|
7
|
+
"data-slot": "timeline",
|
|
8
|
+
role: "list",
|
|
9
|
+
className: cn("text-foreground m-0 w-full min-w-0 list-none p-0", className),
|
|
10
|
+
children: items.map((item, index) => {
|
|
11
|
+
const TimestampElement = item.timestamp?.dateTime ? "time" : "span";
|
|
12
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
13
|
+
"data-slot": "timeline-item",
|
|
14
|
+
"data-status": item.status ?? "neutral",
|
|
15
|
+
className: cn("relative m-0 flex min-w-0 gap-3", index < items.length - 1 && "pb-6", classNames?.item),
|
|
16
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
17
|
+
"aria-hidden": "true",
|
|
18
|
+
className: "relative w-5 shrink-0",
|
|
19
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
20
|
+
"data-slot": "timeline-marker",
|
|
21
|
+
className: cn(`border-border bg-background text-muted-foreground relative
|
|
22
|
+
z-10 flex size-5 items-center justify-center rounded-full
|
|
23
|
+
border-2 [&>svg]:size-3`, item.status === "primary" && "border-primary text-primary", item.status === "error" && "border-destructive text-destructive", classNames?.marker),
|
|
24
|
+
children: item.marker
|
|
25
|
+
}), index < items.length - 1 && /* @__PURE__ */ jsx("span", {
|
|
26
|
+
"data-slot": "timeline-connector",
|
|
27
|
+
className: cn(`bg-border absolute start-[calc(50%-0.5px)] top-5 -bottom-6
|
|
28
|
+
w-px`, classNames?.connector)
|
|
29
|
+
})]
|
|
30
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
31
|
+
"data-slot": "timeline-content",
|
|
32
|
+
className: cn("min-w-0 flex-1 text-sm [overflow-wrap:anywhere]", classNames?.content),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", {
|
|
35
|
+
"data-slot": "timeline-title",
|
|
36
|
+
className: cn("leading-5 font-medium", classNames?.title),
|
|
37
|
+
children: item.title
|
|
38
|
+
}),
|
|
39
|
+
item.timestamp != null && /* @__PURE__ */ jsx(TimestampElement, {
|
|
40
|
+
"data-slot": "timeline-timestamp",
|
|
41
|
+
dateTime: TimestampElement === "time" ? item.timestamp.dateTime : void 0,
|
|
42
|
+
className: cn("text-muted-foreground mt-1 block text-xs", classNames?.timestamp),
|
|
43
|
+
children: item.timestamp.label
|
|
44
|
+
}),
|
|
45
|
+
item.description != null && /* @__PURE__ */ jsx("div", {
|
|
46
|
+
"data-slot": "timeline-description",
|
|
47
|
+
className: cn("text-muted-foreground mt-2", classNames?.description),
|
|
48
|
+
children: item.description
|
|
49
|
+
})
|
|
50
|
+
]
|
|
51
|
+
})]
|
|
52
|
+
}, item.key);
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { Timeline as default };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=Timeline.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Timeline.mjs","names":[],"sources":["../src/components/molecules/timeline.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, Key, ReactNode } from 'react';\n\nimport { cn } from '@repo/ui/utils';\n\nexport interface Timestamp {\n /** Caller-formatted text. No locale or timezone conversion is performed. */\n label: ReactNode;\n /** A valid HTML time value, such as an ISO date or timestamp. */\n dateTime?: string;\n}\n\nexport interface Item {\n key: Key;\n title: ReactNode;\n description?: ReactNode;\n timestamp?: Timestamp;\n /** Decorative marker treatment. Include meaningful status in the event text. */\n status?: 'neutral' | 'primary' | 'error';\n /** Decorative content, such as an icon; do not supply interactive elements. */\n marker?: ReactNode;\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'ol'>,\n 'children' | 'reversed' | 'start' | 'type'\n> {\n /** Events render in this order; the component does not sort by timestamp. */\n items: readonly Item[];\n classNames?: {\n item?: string;\n marker?: string;\n connector?: string;\n content?: string;\n title?: string;\n description?: string;\n timestamp?: string;\n };\n}\n\nconst Timeline = ({ items, className, classNames, ...props }: Props) => {\n return (\n <ol\n {...props}\n data-slot=\"timeline\"\n role=\"list\"\n className={cn(\n 'text-foreground m-0 w-full min-w-0 list-none p-0',\n className, //\n )}\n >\n {items.map((item, index) => {\n const TimestampElement = item.timestamp?.dateTime ? 'time' : 'span';\n\n return (\n <li\n key={item.key}\n data-slot=\"timeline-item\"\n data-status={item.status ?? 'neutral'}\n className={cn(\n 'relative m-0 flex min-w-0 gap-3',\n index < items.length - 1 && 'pb-6',\n classNames?.item, //\n )}\n >\n <div aria-hidden=\"true\" className=\"relative w-5 shrink-0\">\n <span\n data-slot=\"timeline-marker\"\n className={cn(\n `border-border bg-background text-muted-foreground relative\n z-10 flex size-5 items-center justify-center rounded-full\n border-2 [&>svg]:size-3`,\n item.status === 'primary' && 'border-primary text-primary',\n item.status === 'error' &&\n 'border-destructive text-destructive',\n classNames?.marker, //\n )}\n >\n {item.marker}\n </span>\n {index < items.length - 1 && (\n <span\n data-slot=\"timeline-connector\"\n className={cn(\n `bg-border absolute start-[calc(50%-0.5px)] top-5 -bottom-6\n w-px`,\n classNames?.connector, //\n )}\n />\n )}\n </div>\n <div\n data-slot=\"timeline-content\"\n className={cn(\n 'min-w-0 flex-1 text-sm [overflow-wrap:anywhere]',\n classNames?.content, //\n )}\n >\n <div\n data-slot=\"timeline-title\"\n className={cn(\n 'leading-5 font-medium',\n classNames?.title, //\n )}\n >\n {item.title}\n </div>\n {item.timestamp != null && (\n <TimestampElement\n data-slot=\"timeline-timestamp\"\n dateTime={\n TimestampElement === 'time'\n ? item.timestamp.dateTime\n : undefined\n }\n className={cn(\n 'text-muted-foreground mt-1 block text-xs',\n classNames?.timestamp, //\n )}\n >\n {item.timestamp.label}\n </TimestampElement>\n )}\n {item.description != null && (\n <div\n data-slot=\"timeline-description\"\n className={cn(\n 'text-muted-foreground mt-2',\n classNames?.description, //\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default Timeline;\n"],"mappings":";;;AAuCA,MAAM,YAAY,EAAE,OAAO,WAAW,YAAY,GAAG,YAAmB;CACtE,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,aAAU;EACV,MAAK;EACL,WAAW,GACT,oDACA,SACF;EAEC,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,mBAAmB,KAAK,WAAW,WAAW,SAAS;GAE7D,OACE,qBAAC,MAAD;IAEE,aAAU;IACV,eAAa,KAAK,UAAU;IAC5B,WAAW,GACT,mCACA,QAAQ,MAAM,SAAS,KAAK,QAC5B,YAAY,IACd;IARF,UAAA,CAUE,qBAAC,OAAD;KAAK,eAAY;KAAO,WAAU;KAAlC,UAAA,CACE,oBAAC,QAAD;MACE,aAAU;MACV,WAAW,GACT;;4CAGA,KAAK,WAAW,aAAa,+BAC7B,KAAK,WAAW,WACd,uCACF,YAAY,MACd;MAEC,UAAA,KAAK;KACF,CAAA,GACL,QAAQ,MAAM,SAAS,KACtB,oBAAC,QAAD;MACE,aAAU;MACV,WAAW,GACT;2BAEA,YAAY,SACd;KACD,CAAA,CAEA;IACL,CAAA,GAAA,qBAAC,OAAD;KACE,aAAU;KACV,WAAW,GACT,mDACA,YAAY,OACd;KALF,UAAA;MAOE,oBAAC,OAAD;OACE,aAAU;OACV,WAAW,GACT,yBACA,YAAY,KACd;OAEC,UAAA,KAAK;MACH,CAAA;MACJ,KAAK,aAAa,QACjB,oBAAC,kBAAD;OACE,aAAU;OACV,UACE,qBAAqB,SACjB,KAAK,UAAU,WACf,KAAA;OAEN,WAAW,GACT,4CACA,YAAY,SACd;OAEC,UAAA,KAAK,UAAU;MACA,CAAA;MAEnB,KAAK,eAAe,QACnB,oBAAC,OAAD;OACE,aAAU;OACV,WAAW,GACT,8BACA,YAAY,WACd;OAEC,UAAA,KAAK;MACH,CAAA;KAEJ;IACH,CAAA,CAAA;GA/EG,GAAA,KAAK,GA+ER;EAER,CAAC;CACC,CAAA;AAER"}
|
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;;;cAOE,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,192 @@
|
|
|
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 } from "@jbpark/use-hooks";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
//#region src/components/organisms/tour.tsx
|
|
11
|
+
const defaultFormatProgress = (current, total) => `Step ${current} of ${total}`;
|
|
12
|
+
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 }) => {
|
|
13
|
+
const { getContainer, direction } = useConfig();
|
|
14
|
+
const [open, setOpen] = useControllableState({
|
|
15
|
+
value: openProp,
|
|
16
|
+
defaultValue: defaultOpen,
|
|
17
|
+
onChange: onOpenChange
|
|
18
|
+
});
|
|
19
|
+
const [current, setCurrent] = useControllableState({
|
|
20
|
+
value: currentProp,
|
|
21
|
+
defaultValue: defaultCurrent,
|
|
22
|
+
onChange
|
|
23
|
+
});
|
|
24
|
+
const index = Number.isFinite(current) ? Math.max(0, Math.min(steps.length - 1, Math.floor(current))) : 0;
|
|
25
|
+
const step = steps[index];
|
|
26
|
+
const [measurement, setMeasurement] = useState(null);
|
|
27
|
+
const target = open && measurement && measurement.step === step ? measurement.target : null;
|
|
28
|
+
const rect = open && measurement && measurement.step === step ? measurement.rect : null;
|
|
29
|
+
const fallback = useMemo(() => ({ getBoundingClientRect: () => new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0) }), []);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!open || !step) return;
|
|
32
|
+
let previous = null;
|
|
33
|
+
const update = () => {
|
|
34
|
+
const element = step.target?.() ?? null;
|
|
35
|
+
const resolved = !!element?.isConnected && element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden" ? element : null;
|
|
36
|
+
if (resolved !== previous) {
|
|
37
|
+
if (previous) resizeObserver.unobserve(previous);
|
|
38
|
+
if (resolved) {
|
|
39
|
+
resizeObserver.observe(resolved);
|
|
40
|
+
if (scrollIntoView) resolved.scrollIntoView({
|
|
41
|
+
block: "center",
|
|
42
|
+
inline: "nearest",
|
|
43
|
+
behavior: "instant"
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
previous = resolved;
|
|
48
|
+
const bounds = resolved?.getBoundingClientRect();
|
|
49
|
+
const next = bounds ? {
|
|
50
|
+
top: bounds.top,
|
|
51
|
+
left: bounds.left,
|
|
52
|
+
width: bounds.width,
|
|
53
|
+
height: bounds.height
|
|
54
|
+
} : null;
|
|
55
|
+
setMeasurement((existing) => existing?.step === step && existing.target === resolved && existing.rect?.top === next?.top && existing.rect?.left === next?.left && existing.rect?.width === next?.width && existing.rect?.height === next?.height ? existing : {
|
|
56
|
+
step,
|
|
57
|
+
target: resolved,
|
|
58
|
+
rect: next
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const frame = requestAnimationFrame(update);
|
|
62
|
+
const observer = new MutationObserver(update);
|
|
63
|
+
observer.observe(document.body, {
|
|
64
|
+
childList: true,
|
|
65
|
+
subtree: true,
|
|
66
|
+
attributes: true,
|
|
67
|
+
attributeFilter: [
|
|
68
|
+
"hidden",
|
|
69
|
+
"style",
|
|
70
|
+
"class"
|
|
71
|
+
]
|
|
72
|
+
});
|
|
73
|
+
const resizeObserver = new ResizeObserver(update);
|
|
74
|
+
window.addEventListener("resize", update);
|
|
75
|
+
window.addEventListener("scroll", update, true);
|
|
76
|
+
return () => {
|
|
77
|
+
cancelAnimationFrame(frame);
|
|
78
|
+
observer.disconnect();
|
|
79
|
+
resizeObserver.disconnect();
|
|
80
|
+
window.removeEventListener("resize", update);
|
|
81
|
+
window.removeEventListener("scroll", update, true);
|
|
82
|
+
};
|
|
83
|
+
}, [
|
|
84
|
+
open,
|
|
85
|
+
step,
|
|
86
|
+
scrollIntoView
|
|
87
|
+
]);
|
|
88
|
+
const close = () => {
|
|
89
|
+
onClose?.();
|
|
90
|
+
setOpen(false);
|
|
91
|
+
};
|
|
92
|
+
return /* @__PURE__ */ jsx("div", {
|
|
93
|
+
...props,
|
|
94
|
+
"data-slot": "tour",
|
|
95
|
+
className: cn("contents", className),
|
|
96
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
97
|
+
open: open && !!step,
|
|
98
|
+
modal: true,
|
|
99
|
+
onOpenChange: (next, details) => {
|
|
100
|
+
if (details.reason === "outside-press") {
|
|
101
|
+
details.cancel();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!next) close();
|
|
105
|
+
},
|
|
106
|
+
children: [/* @__PURE__ */ jsxs(PopoverPortal, {
|
|
107
|
+
container: getContainer(),
|
|
108
|
+
children: [/* @__PURE__ */ jsx(PopoverBackdrop, {
|
|
109
|
+
"data-slot": "tour-mask",
|
|
110
|
+
className: cn("fixed inset-0 bg-black/40", OVERLAY_LAYER, classNames?.mask)
|
|
111
|
+
}), open && rect && /* @__PURE__ */ jsx("div", {
|
|
112
|
+
"data-slot": "tour-highlight",
|
|
113
|
+
"aria-hidden": "true",
|
|
114
|
+
style: {
|
|
115
|
+
position: "fixed",
|
|
116
|
+
top: rect.top - 4,
|
|
117
|
+
left: rect.left - 4,
|
|
118
|
+
width: rect.width + 8,
|
|
119
|
+
height: rect.height + 8
|
|
120
|
+
},
|
|
121
|
+
className: cn("border-primary pointer-events-none rounded-md border-2", "z-1000", classNames?.highlight)
|
|
122
|
+
})]
|
|
123
|
+
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
124
|
+
"data-slot": "tour-popup",
|
|
125
|
+
dir: props.dir ?? direction,
|
|
126
|
+
anchor: target ?? fallback,
|
|
127
|
+
side: step?.placement ?? "bottom",
|
|
128
|
+
sideOffset: 12,
|
|
129
|
+
positionerStyle: target ? void 0 : {
|
|
130
|
+
position: "fixed",
|
|
131
|
+
left: "50%",
|
|
132
|
+
top: "50%",
|
|
133
|
+
transform: "translate(-50%, -50%)"
|
|
134
|
+
},
|
|
135
|
+
className: cn(`max-h-[calc(100dvh-2rem)] w-80 max-w-[calc(100vw-2rem)]
|
|
136
|
+
overflow-y-auto`, classNames?.popup),
|
|
137
|
+
children: [
|
|
138
|
+
/* @__PURE__ */ jsx(PopoverTitle, { children: step?.title }),
|
|
139
|
+
step?.description != null && /* @__PURE__ */ jsx(PopoverDescription, {
|
|
140
|
+
className: "mt-2 text-sm",
|
|
141
|
+
children: step.description
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ jsx("p", {
|
|
144
|
+
"data-slot": "tour-progress",
|
|
145
|
+
role: "status",
|
|
146
|
+
"aria-live": "polite",
|
|
147
|
+
"aria-atomic": "true",
|
|
148
|
+
className: "text-muted-foreground mt-3 text-xs",
|
|
149
|
+
children: formatProgress(index + 1, steps.length)
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ jsxs("div", {
|
|
152
|
+
className: cn("mt-4 flex flex-wrap gap-2", classNames?.actions),
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ jsx(PopoverClose, {
|
|
155
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
156
|
+
variant: "text",
|
|
157
|
+
size: "small"
|
|
158
|
+
}),
|
|
159
|
+
children: closeLabel
|
|
160
|
+
}),
|
|
161
|
+
/* @__PURE__ */ jsx(Button, {
|
|
162
|
+
variant: "outlined",
|
|
163
|
+
size: "small",
|
|
164
|
+
disabled: index === 0,
|
|
165
|
+
focusableWhenDisabled: true,
|
|
166
|
+
className: "aria-disabled:pointer-events-none\n aria-disabled:opacity-50",
|
|
167
|
+
onClick: () => setCurrent(index - 1),
|
|
168
|
+
children: previousLabel
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ jsx(Button, {
|
|
171
|
+
size: "small",
|
|
172
|
+
onClick: () => {
|
|
173
|
+
if (index < steps.length - 1) setCurrent(index + 1);
|
|
174
|
+
else {
|
|
175
|
+
onFinish?.();
|
|
176
|
+
setOpen(false);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
children: index === steps.length - 1 ? finishLabel : nextLabel
|
|
180
|
+
})
|
|
181
|
+
]
|
|
182
|
+
}),
|
|
183
|
+
target && /* @__PURE__ */ jsx(PopoverArrow, {})
|
|
184
|
+
]
|
|
185
|
+
})]
|
|
186
|
+
})
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
//#endregion
|
|
190
|
+
export { Tour as default };
|
|
191
|
+
|
|
192
|
+
//# 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 } 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\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<{\n step: Step;\n target: HTMLElement | null;\n rect: { top: number; left: number; width: number; height: number } | null;\n } | null>(null);\n const target =\n open && measurement && measurement.step === step\n ? measurement.target\n : null;\n const rect =\n open && measurement && measurement.step === step ? measurement.rect : null;\n const fallback = useMemo(\n () => ({\n getBoundingClientRect: () =>\n new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0),\n }),\n [],\n );\n\n useEffect(() => {\n if (!open || !step) return;\n\n let previous: HTMLElement | null = null;\n const update = () => {\n const element = step.target?.() ?? null;\n const isVisible =\n !!element?.isConnected &&\n element.getClientRects().length > 0 &&\n getComputedStyle(element).visibility !== 'hidden';\n const resolved = isVisible ? element : null;\n\n if (resolved !== previous) {\n if (previous) resizeObserver.unobserve(previous);\n\n if (resolved) {\n resizeObserver.observe(resolved);\n\n if (scrollIntoView) {\n resolved.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n behavior: 'instant',\n });\n }\n }\n }\n\n previous = resolved;\n const bounds = resolved?.getBoundingClientRect();\n const next = bounds\n ? {\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n height: bounds.height,\n }\n : null;\n\n setMeasurement(existing =>\n existing?.step === step &&\n existing.target === resolved &&\n existing.rect?.top === next?.top &&\n existing.rect?.left === next?.left &&\n existing.rect?.width === next?.width &&\n existing.rect?.height === next?.height\n ? existing\n : { step, target: resolved, rect: next },\n );\n };\n\n const frame = requestAnimationFrame(update);\n const observer = new MutationObserver(update);\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['hidden', 'style', 'class'],\n });\n const resizeObserver = new ResizeObserver(update);\n\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n resizeObserver.disconnect();\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n };\n }, [open, step, scrollIntoView]);\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 <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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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, ReactNode } from "react";
|
|
2
|
+
//#region src/components/molecules/transfer.d.ts
|
|
3
|
+
export interface Item {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description?: ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface Props extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'onChange'> {
|
|
10
|
+
/** Stable, unique keys; both panels follow this array's order. */
|
|
11
|
+
items: readonly Item[];
|
|
12
|
+
targetKeys: readonly string[];
|
|
13
|
+
onChange?: (targetKeys: string[]) => void;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
searchable?: boolean;
|
|
16
|
+
titles?: readonly [string, string];
|
|
17
|
+
moveLabels?: readonly [string, string];
|
|
18
|
+
selectAllLabel?: string;
|
|
19
|
+
searchLabel?: string;
|
|
20
|
+
emptyText?: ReactNode;
|
|
21
|
+
/** Visible / total / visible selected counts, also used by the live region. */
|
|
22
|
+
formatCount?: (visible: number, total: number, selected: number) => string;
|
|
23
|
+
classNames?: {
|
|
24
|
+
panel?: string;
|
|
25
|
+
header?: string;
|
|
26
|
+
search?: string;
|
|
27
|
+
list?: string;
|
|
28
|
+
item?: string;
|
|
29
|
+
actions?: string;
|
|
30
|
+
empty?: string;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
declare const Transfer: ({ items, targetKeys, onChange, disabled, searchable, titles, moveLabels, selectAllLabel, searchLabel, emptyText, formatCount, className, classNames, ...props }: Props) => import("react").JSX.Element;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { Transfer as default };
|
|
36
|
+
//# sourceMappingURL=Transfer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transfer.d.mts","names":[],"sources":["../src/components/molecules/transfer.tsx"],"mappings":";;iBAeiB;EACf;EACA;EACA,cAAc;EACd;;iBAGe,cAAc,KAC7B;;EAIA,gBAAgB;EAChB;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,YAAY;;EAEZ,eAAe,iBAAiB,eAAe;EAC/C;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAOE,aAAY,OAAA,YAAA,UAAA,UAAA,YAAA,QAAA,YAAA,gBAAA,aAAA,WAAA,aAAA,WAAA,eAAA,SAef,0BAAK,IAAA"}
|