@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
package/dist/Breadcrumb.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumb.mjs","names":[],"sources":["../src/components/molecules/breadcrumb.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport Popover from '../atoms/popover';\n\nexport interface Item {\n key?: React.Key;\n title: React.ReactNode;\n href?: string;\n target?: React.HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n 'aria-label'?: string;\n /** Decorative icon placed before the title. */\n icon?: React.ReactNode;\n /** Overrides the separator after this item. */\n separator?: React.ReactNode;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'nav'>,\n 'children'\n> {\n items: Item[];\n separator?: React.ReactNode;\n /** Collapse middle items when the trail has more than this many entries. */\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n expandText?: string;\n /** Render custom router links. The renderer owns aria-current for the last item. */\n itemRender?: (\n item: Item,\n index: number,\n isCurrent: boolean,\n ) => React.ReactNode;\n classNames?: {\n list?: string;\n item?: string;\n link?: string;\n current?: string;\n separator?: string;\n collapsed?: string;\n popup?: string;\n };\n}\n\nconst safeCount = (value: number, minimum: number) =>\n Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : minimum;\n\nconst Breadcrumb = ({\n items,\n separator = '/',\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expandText = 'Show path',\n itemRender,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const limit = safeCount(maxItems, 3);\n const before = Math.min(safeCount(itemsBeforeCollapse, 1), limit - 2);\n const after = Math.min(safeCount(itemsAfterCollapse, 1), limit - before - 1);\n const collapsed = items.length > limit && items.length - before - after > 0;\n const visibleIndices = collapsed\n ? [\n ...Array.from({ length: before }, (_, index) => index),\n ...Array.from(\n { length: after },\n (_, index) => items.length - after + index,\n ),\n ]\n : items.map((_, index) => index);\n const hiddenIndices = collapsed\n ? Array.from(\n { length: items.length - before - after },\n (_, index) => before + index,\n )\n : [];\n\n const renderItem = (index: number) => {\n const item = items[index]!;\n const isCurrent = index === items.length - 1;\n\n if (itemRender) {\n return itemRender(item, index, isCurrent);\n }\n\n const content = (\n <>\n {item.icon != null && (\n <span\n data-slot=\"breadcrumb-icon\"\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0\"\n >\n {item.icon}\n </span>\n )}\n {item.title}\n </>\n );\n const itemClassName = cn(\n 'inline-flex items-center gap-1.5 rounded-sm',\n (item.href !== undefined || item.onClick) &&\n 'hover:text-foreground focus-visible:outline-ring focus-visible:outline-2',\n isCurrent ? 'text-foreground font-medium' : 'text-muted-foreground',\n (item.href !== undefined || item.onClick) && classNames?.link,\n isCurrent && classNames?.current,\n item.className,\n //\n );\n\n if (item.href !== undefined) {\n return (\n <a\n href={item.href}\n target={item.target}\n rel={item.rel}\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={cn('h-auto px-0 py-0 font-normal', itemClassName)}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <span\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </span>\n );\n };\n\n const renderSeparator = (index: number) => (\n <li\n data-slot=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground mx-2 shrink-0',\n classNames?.separator,\n //\n )}\n >\n {items[index]?.separator ?? separator}\n </li>\n );\n\n return (\n <nav\n {...props}\n data-slot=\"breadcrumb\"\n dir={dir ?? direction}\n aria-label={ariaLabel ?? 'Breadcrumb'}\n className={cn(\n 'text-sm',\n className, //\n )}\n >\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'm-0 flex min-w-0 flex-wrap items-center p-0',\n classNames?.list,\n //\n )}\n >\n {visibleIndices.map((index, position) => (\n <Fragment key={items[index]?.key ?? index}>\n {position > 0 &&\n renderSeparator(\n collapsed && position === before\n ? index - 1\n : visibleIndices[position - 1]!,\n )}\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\n 'inline-flex min-w-0 items-center',\n classNames?.item, //\n )}\n >\n {renderItem(index)}\n </li>\n {collapsed && position === before - 1 && (\n <>\n {renderSeparator(index)}\n <li\n data-slot=\"breadcrumb-collapsed\"\n className={classNames?.collapsed}\n >\n <Popover\n placement=\"bottom\"\n className={classNames?.popup}\n content={\n <ol className=\"m-0 grid list-none gap-1 p-0\">\n {hiddenIndices.map(hiddenIndex => (\n <li key={items[hiddenIndex]?.key ?? hiddenIndex}>\n {renderItem(hiddenIndex)}\n </li>\n ))}\n </ol>\n }\n >\n <Button\n variant=\"text\"\n size=\"small\"\n aria-label={expandText}\n className=\"h-auto px-1\"\n >\n …\n </Button>\n </Popover>\n </li>\n </>\n )}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n};\n\nexport default Breadcrumb;\n"],"mappings":";;;;;;;;AAqDA,MAAM,aAAa,OAAe,YAChC,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,SAAS,KAAK,MAAM,KAAK,CAAC,IAAI;AAElE,MAAM,cAAc,EAClB,OACA,YAAY,KACZ,WAAW,GACX,sBAAsB,GACtB,qBAAqB,GACrB,aAAa,aACb,YACA,WACA,YACA,KACA,cAAc,WACd,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,QAAQ,UAAU,UAAU,CAAC;CACnC,MAAM,SAAS,KAAK,IAAI,UAAU,qBAAqB,CAAC,GAAG,QAAQ,CAAC;CACpE,MAAM,QAAQ,KAAK,IAAI,UAAU,oBAAoB,CAAC,GAAG,QAAQ,SAAS,CAAC;CAC3E,MAAM,YAAY,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS,QAAQ;CAC1E,MAAM,iBAAiB,YACnB,CACE,GAAG,MAAM,KAAK,EAAE,QAAQ,OAAO,IAAI,GAAG,UAAU,KAAK,GACrD,GAAG,MAAM,KACP,EAAE,QAAQ,MAAM,IACf,GAAG,UAAU,MAAM,SAAS,QAAQ,KACvC,CACF,IACA,MAAM,KAAK,GAAG,UAAU,KAAK;CACjC,MAAM,gBAAgB,YAClB,MAAM,KACJ,EAAE,QAAQ,MAAM,SAAS,SAAS,MAAM,IACvC,GAAG,UAAU,SAAS,KACzB,IACA,CAAC;CAEL,MAAM,cAAc,UAAkB;EACpC,MAAM,OAAO,MAAM;EACnB,MAAM,YAAY,UAAU,MAAM,SAAS;EAE3C,IAAI,YACF,OAAO,WAAW,MAAM,OAAO,SAAS;EAG1C,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,QAAQ,QACZ,oBAAC,QAAD;GACE,aAAU;GACV,eAAY;GACZ,WAAU;GAET,UAAA,KAAK;EACF,CAAA,GAEP,KAAK,KACN,EAAA,CAAA;EAEJ,MAAM,gBAAgB,GACpB,gDACC,KAAK,SAAS,KAAA,KAAa,KAAK,YAC/B,4EACF,YAAY,gCAAgC,0BAC3C,KAAK,SAAS,KAAA,KAAa,KAAK,YAAY,YAAY,MACzD,aAAa,YAAY,SACzB,KAAK,SAEP;EAEA,IAAI,KAAK,SAAS,KAAA,GAChB,OACE,oBAAC,KAAD;GACE,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,SAAS,KAAK;GACd,cAAY,KAAK;GACjB,gBAAc,YAAY,SAAS,KAAA;GACnC,WAAW;GAEV,UAAA;EACA,CAAA;EAIP,IAAI,KAAK,SACP,OACE,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,SAAS,KAAK;GACd,cAAY,KAAK;GACjB,gBAAc,YAAY,SAAS,KAAA;GACnC,WAAW,GAAG,gCAAgC,aAAa;GAE1D,UAAA;EACK,CAAA;EAIZ,OACE,oBAAC,QAAD;GACE,cAAY,KAAK;GACjB,gBAAc,YAAY,SAAS,KAAA;GACnC,WAAW;GAEV,UAAA;EACG,CAAA;CAEV;CAEA,MAAM,mBAAmB,UACvB,oBAAC,MAAD;EACE,aAAU;EACV,eAAY;EACZ,WAAW,GACT,uCACA,YAAY,SAEd;EAEC,UAAA,MAAM,MAAM,EAAE,aAAa;CAC1B,CAAA;CAGN,OACE,oBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,KAAK,OAAO;EACZ,cAAY,aAAa;EACzB,WAAW,GACT,WACA,SACF;EAEA,UAAA,oBAAC,MAAD;GACE,aAAU;GACV,WAAW,GACT
|
|
1
|
+
{"version":3,"file":"Breadcrumb.mjs","names":[],"sources":["../src/components/molecules/breadcrumb.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport Popover from '../atoms/popover';\n\nexport interface Item {\n key?: React.Key;\n title: React.ReactNode;\n href?: string;\n target?: React.HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n 'aria-label'?: string;\n /** Decorative icon placed before the title. */\n icon?: React.ReactNode;\n /** Overrides the separator after this item. */\n separator?: React.ReactNode;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'nav'>,\n 'children'\n> {\n items: Item[];\n separator?: React.ReactNode;\n /** Collapse middle items when the trail has more than this many entries. */\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n expandText?: string;\n /** Render custom router links. The renderer owns aria-current for the last item. */\n itemRender?: (\n item: Item,\n index: number,\n isCurrent: boolean,\n ) => React.ReactNode;\n classNames?: {\n list?: string;\n item?: string;\n link?: string;\n current?: string;\n separator?: string;\n collapsed?: string;\n popup?: string;\n };\n}\n\nconst safeCount = (value: number, minimum: number) =>\n Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : minimum;\n\nconst Breadcrumb = ({\n items,\n separator = '/',\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expandText = 'Show path',\n itemRender,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const limit = safeCount(maxItems, 3);\n const before = Math.min(safeCount(itemsBeforeCollapse, 1), limit - 2);\n const after = Math.min(safeCount(itemsAfterCollapse, 1), limit - before - 1);\n const collapsed = items.length > limit && items.length - before - after > 0;\n const visibleIndices = collapsed\n ? [\n ...Array.from({ length: before }, (_, index) => index),\n ...Array.from(\n { length: after },\n (_, index) => items.length - after + index,\n ),\n ]\n : items.map((_, index) => index);\n const hiddenIndices = collapsed\n ? Array.from(\n { length: items.length - before - after },\n (_, index) => before + index,\n )\n : [];\n\n const renderItem = (index: number) => {\n const item = items[index]!;\n const isCurrent = index === items.length - 1;\n\n if (itemRender) {\n return itemRender(item, index, isCurrent);\n }\n\n const content = (\n <>\n {item.icon != null && (\n <span\n data-slot=\"breadcrumb-icon\"\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0\"\n >\n {item.icon}\n </span>\n )}\n {item.title}\n </>\n );\n const itemClassName = cn(\n 'inline-flex items-center gap-1.5 rounded-sm',\n (item.href !== undefined || item.onClick) &&\n 'hover:text-foreground focus-visible:outline-ring focus-visible:outline-2',\n isCurrent ? 'text-foreground font-medium' : 'text-muted-foreground',\n (item.href !== undefined || item.onClick) && classNames?.link,\n isCurrent && classNames?.current,\n item.className,\n //\n );\n\n if (item.href !== undefined) {\n return (\n <a\n href={item.href}\n target={item.target}\n rel={item.rel}\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={cn('h-auto px-0 py-0 font-normal', itemClassName)}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <span\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </span>\n );\n };\n\n const renderSeparator = (index: number) => (\n <li\n data-slot=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground mx-2 shrink-0',\n classNames?.separator,\n //\n )}\n >\n {items[index]?.separator ?? separator}\n </li>\n );\n\n return (\n <nav\n {...props}\n data-slot=\"breadcrumb\"\n dir={dir ?? direction}\n aria-label={ariaLabel ?? 'Breadcrumb'}\n className={cn(\n 'text-sm',\n className, //\n )}\n >\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'm-0 flex min-w-0 list-none flex-wrap items-center p-0',\n classNames?.list,\n //\n )}\n >\n {visibleIndices.map((index, position) => (\n <Fragment key={items[index]?.key ?? index}>\n {position > 0 &&\n renderSeparator(\n collapsed && position === before\n ? index - 1\n : visibleIndices[position - 1]!,\n )}\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\n 'inline-flex min-w-0 items-center',\n classNames?.item, //\n )}\n >\n {renderItem(index)}\n </li>\n {collapsed && position === before - 1 && (\n <>\n {renderSeparator(index)}\n <li\n data-slot=\"breadcrumb-collapsed\"\n className={classNames?.collapsed}\n >\n <Popover\n placement=\"bottom\"\n className={classNames?.popup}\n content={\n <ol className=\"m-0 grid list-none gap-1 p-0\">\n {hiddenIndices.map(hiddenIndex => (\n <li key={items[hiddenIndex]?.key ?? hiddenIndex}>\n {renderItem(hiddenIndex)}\n </li>\n ))}\n </ol>\n }\n >\n <Button\n variant=\"text\"\n size=\"small\"\n aria-label={expandText}\n className=\"h-auto px-1\"\n >\n …\n </Button>\n </Popover>\n </li>\n </>\n )}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n};\n\nexport default Breadcrumb;\n"],"mappings":"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"}
|
package/dist/Button.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button as Button$1 } from "./core/button.mjs";
|
|
1
|
+
import { Button as Button$1, button_d_exports } from "./core/button.mjs";
|
|
2
2
|
import "./core/index.mjs";
|
|
3
3
|
import { PresetColor } from "./lib/colors.mjs";
|
|
4
4
|
import * as React$1 from "react";
|
|
@@ -25,7 +25,7 @@ type ShadcnVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghos
|
|
|
25
25
|
* would render a normal padded button.
|
|
26
26
|
*/
|
|
27
27
|
type ShadcnSize = 'default' | 'xs' | 'sm' | 'lg' | 'icon' | 'icon-xs' | 'icon-sm' | 'icon-lg';
|
|
28
|
-
interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'variant' | 'type'> {
|
|
28
|
+
export interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'variant' | 'type'> {
|
|
29
29
|
icon?: React$1.ReactNode;
|
|
30
30
|
block?: boolean;
|
|
31
31
|
danger?: boolean;
|
|
@@ -92,5 +92,5 @@ interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'vari
|
|
|
92
92
|
}
|
|
93
93
|
declare const Button: ({ icon, className, type, variant, htmlType, size, color, shape, block, disabled, loading, danger, nativeButton, children, onMouseDown, ...props }: Props) => React$1.JSX.Element;
|
|
94
94
|
//#endregion
|
|
95
|
-
export {
|
|
95
|
+
export { Button as default };
|
|
96
96
|
//# sourceMappingURL=Button.d.mts.map
|
package/dist/Button.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.mts","names":[],"sources":["../src/components/atoms/button.tsx"],"mappings":";;;;;cAYM,
|
|
1
|
+
{"version":3,"file":"Button.d.mts","names":["button","button.Button","React"],"sources":["../src/components/atoms/button.tsx"],"mappings":";;;;;cAYM,aAAIC;;;;;;;;;;;;;KAcL;;;;;;;;KAUA;iBAGY,cAAc,KAC7BC,QAAM,sBAAsB;EAG5B,OAAOA,QAAM;EACb;EACA;EACA;;;;;;;;EAQA,sCAAsC;;;;;;;;;;;;;;;;;;EAkBtC;;;;;;;;;;;;;;;;EAgBA,yEAOI;;;;;;EAMJ;EACA;;;;;;;EAOA,QAAQ;EACR;IAAsB,MAAMA,QAAM;;;cAmH9B,WAAU,MAAA,WAAA,MAAA,SAAA,UAAA,MAAA,OAAA,OAAA,OAAA,UAAA,SAAA,QAAA,cAAA,UAAA,gBAAA,SAiBb,UAAKA,QAAA,IAAA"}
|
package/dist/Button.mjs
CHANGED
|
@@ -3,8 +3,8 @@ import { cn } from "./utils.mjs";
|
|
|
3
3
|
import { useConfig } from "./providers/config/context.mjs";
|
|
4
4
|
import { Button as Button$1 } from "./core/button.mjs";
|
|
5
5
|
import "react";
|
|
6
|
-
import { LoaderCircle } from "lucide-react";
|
|
7
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { LoaderCircle } from "lucide-react";
|
|
8
8
|
//#region src/components/atoms/button.tsx
|
|
9
9
|
const Core = Button$1;
|
|
10
10
|
const BUTTON_BASE = cn("gap-2 whitespace-nowrap font-medium transition-all", "has-[>svg]:px-3");
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Calendar as Calendar$1, calendar_d_exports } from "./core/calendar.mjs";
|
|
2
|
+
import "./core/index.mjs";
|
|
3
|
+
import { ComponentProps, ReactNode } from "react";
|
|
4
|
+
//#region src/components/organisms/calendar.d.ts
|
|
5
|
+
type CellRenderer = (date: Date) => ReactNode;
|
|
6
|
+
export interface Props extends Omit<ComponentProps<'div'>, 'onChange' | 'children' | 'defaultValue'> {
|
|
7
|
+
/** Pass null for an explicitly empty controlled selection. */
|
|
8
|
+
value?: Date | null;
|
|
9
|
+
defaultValue?: Date;
|
|
10
|
+
onChange?: (date: Date | undefined) => void;
|
|
11
|
+
month?: Date;
|
|
12
|
+
defaultMonth?: Date;
|
|
13
|
+
onMonthChange?: (month: Date) => void;
|
|
14
|
+
disabledDate?: (date: Date) => boolean;
|
|
15
|
+
minDate?: Date;
|
|
16
|
+
maxDate?: Date;
|
|
17
|
+
locale?: ComponentProps<typeof Calendar$1>['locale'];
|
|
18
|
+
weekStartsOn?: ComponentProps<typeof Calendar$1>['weekStartsOn'];
|
|
19
|
+
expanded?: boolean;
|
|
20
|
+
renderDate?: CellRenderer;
|
|
21
|
+
classNames?: {
|
|
22
|
+
calendar?: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
declare const Calendar: ({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, disabledDate, minDate, maxDate, locale, weekStartsOn, expanded, renderDate, className, classNames, dir, ...props }: Props) => import("react").JSX.Element;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { Calendar as default };
|
|
28
|
+
//# sourceMappingURL=Calendar.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Calendar.d.mts","names":["calendar","calendar.Calendar"],"sources":["../src/components/organisms/calendar.tsx"],"mappings":";;;;KAgBK,gBAAgB,MAAM,SAAS;iBAkBnB,cAAc,KAC7B;;EAIA,QAAQ;EACR,eAAe;EACf,YAAY,MAAM;EAClB,QAAQ;EACR,eAAe;EACf,iBAAiB,OAAO;EACxB,gBAAgB,MAAM;EACtB,UAAU;EACV,UAAU;EACV,SAAS,sBAAsBC;EAC/B,eAAe,sBAAsBA;EACrC;EACA,aAAa;EACb;IAAe;;;cAGX,aAAY,OAAA,cAAA,UAAA,OAAA,cAAA,eAAA,cAAA,SAAA,SAAA,QAAA,cAAA,UAAA,YAAA,WAAA,YAAA,QAAA,SAkBf,0BAAK,IAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import { useConfig } from "./providers/config/context.mjs";
|
|
4
|
+
import { Calendar as Calendar$1, CalendarDayButton } from "./core/calendar.mjs";
|
|
5
|
+
import { createContext, useContext } from "react";
|
|
6
|
+
import { useControllableState } from "@jbpark/use-hooks";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/components/organisms/calendar.tsx
|
|
9
|
+
const CellContext = createContext(void 0);
|
|
10
|
+
function DayButton(props) {
|
|
11
|
+
const renderDate = useContext(CellContext);
|
|
12
|
+
return /* @__PURE__ */ jsxs(CalendarDayButton, {
|
|
13
|
+
...props,
|
|
14
|
+
children: [props.children, renderDate && /* @__PURE__ */ jsx("span", {
|
|
15
|
+
"aria-hidden": "true",
|
|
16
|
+
className: "max-w-full text-xs",
|
|
17
|
+
children: renderDate(props.day.date)
|
|
18
|
+
})]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const Calendar = ({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, disabledDate, minDate, maxDate, locale, weekStartsOn, expanded = false, renderDate, className, classNames, dir, ...props }) => {
|
|
22
|
+
const { direction } = useConfig();
|
|
23
|
+
const [selected, setSelected] = useControllableState({
|
|
24
|
+
value,
|
|
25
|
+
defaultValue,
|
|
26
|
+
onChange: (date) => onChange?.(date ?? void 0)
|
|
27
|
+
});
|
|
28
|
+
const [visibleMonth, setVisibleMonth] = useControllableState({
|
|
29
|
+
value: month,
|
|
30
|
+
defaultValue: defaultMonth ?? value ?? defaultValue ?? /* @__PURE__ */ new Date(),
|
|
31
|
+
onChange: onMonthChange
|
|
32
|
+
});
|
|
33
|
+
const disabled = [
|
|
34
|
+
...disabledDate ? [disabledDate] : [],
|
|
35
|
+
...minDate ? [{ before: minDate }] : [],
|
|
36
|
+
...maxDate ? [{ after: maxDate }] : []
|
|
37
|
+
];
|
|
38
|
+
return /* @__PURE__ */ jsx("div", {
|
|
39
|
+
...props,
|
|
40
|
+
"data-slot": "calendar",
|
|
41
|
+
dir: dir ?? direction,
|
|
42
|
+
className: cn("min-w-0", className),
|
|
43
|
+
children: /* @__PURE__ */ jsx(CellContext, {
|
|
44
|
+
value: renderDate,
|
|
45
|
+
children: /* @__PURE__ */ jsx(Calendar$1, {
|
|
46
|
+
mode: "single",
|
|
47
|
+
selected: selected ?? void 0,
|
|
48
|
+
onSelect: (date) => setSelected(date ?? null),
|
|
49
|
+
month: visibleMonth,
|
|
50
|
+
onMonthChange: setVisibleMonth,
|
|
51
|
+
disabled,
|
|
52
|
+
locale,
|
|
53
|
+
weekStartsOn,
|
|
54
|
+
dir: dir ?? direction,
|
|
55
|
+
components: { DayButton },
|
|
56
|
+
className: cn(expanded && "w-full [--cell-size:3.5rem] [&_.rdp-month]:w-full", classNames?.calendar)
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
//#endregion
|
|
62
|
+
export { Calendar as default };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=Calendar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Calendar.mjs","names":["calendar.CalendarDayButton","calendar.Calendar"],"sources":["../src/components/organisms/calendar.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n type ReactNode,\n createContext,\n useContext,\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 { calendar } from '../../core';\n\ntype CellRenderer = (date: Date) => ReactNode;\nconst CellContext = createContext<CellRenderer | undefined>(undefined);\n\nfunction DayButton(props: ComponentProps<typeof calendar.CalendarDayButton>) {\n const renderDate = useContext(CellContext);\n\n return (\n <calendar.CalendarDayButton {...props}>\n {props.children}\n {renderDate && (\n <span aria-hidden=\"true\" className=\"max-w-full text-xs\">\n {renderDate(props.day.date)}\n </span>\n )}\n </calendar.CalendarDayButton>\n );\n}\n\nexport interface Props extends Omit<\n ComponentProps<'div'>,\n 'onChange' | 'children' | 'defaultValue'\n> {\n /** Pass null for an explicitly empty controlled selection. */\n value?: Date | null;\n defaultValue?: Date;\n onChange?: (date: Date | undefined) => void;\n month?: Date;\n defaultMonth?: Date;\n onMonthChange?: (month: Date) => void;\n disabledDate?: (date: Date) => boolean;\n minDate?: Date;\n maxDate?: Date;\n locale?: ComponentProps<typeof calendar.Calendar>['locale'];\n weekStartsOn?: ComponentProps<typeof calendar.Calendar>['weekStartsOn'];\n expanded?: boolean;\n renderDate?: CellRenderer;\n classNames?: { calendar?: string };\n}\n\nconst Calendar = ({\n value,\n defaultValue,\n onChange,\n month,\n defaultMonth,\n onMonthChange,\n disabledDate,\n minDate,\n maxDate,\n locale,\n weekStartsOn,\n expanded = false,\n renderDate,\n className,\n classNames,\n dir,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const [selected, setSelected] = useControllableState<Date | null | undefined>(\n {\n value,\n defaultValue,\n onChange: date => onChange?.(date ?? undefined),\n },\n );\n const [visibleMonth, setVisibleMonth] = useControllableState<Date>({\n value: month,\n defaultValue: defaultMonth ?? value ?? defaultValue ?? new Date(),\n onChange: onMonthChange,\n });\n const disabled = [\n ...(disabledDate ? [disabledDate] : []),\n ...(minDate ? [{ before: minDate }] : []),\n ...(maxDate ? [{ after: maxDate }] : []),\n ];\n\n return (\n <div\n {...props}\n data-slot=\"calendar\"\n dir={dir ?? direction}\n className={cn(\n 'min-w-0',\n className,\n //\n )}\n >\n <CellContext value={renderDate}>\n <calendar.Calendar\n mode=\"single\"\n selected={selected ?? undefined}\n onSelect={date => setSelected(date ?? null)}\n month={visibleMonth}\n onMonthChange={setVisibleMonth}\n disabled={disabled}\n locale={locale}\n weekStartsOn={weekStartsOn}\n dir={dir ?? direction}\n components={{ DayButton }}\n className={cn(\n expanded && 'w-full [--cell-size:3.5rem] [&_.rdp-month]:w-full',\n classNames?.calendar,\n //\n )}\n />\n </CellContext>\n </div>\n );\n};\n\nexport default Calendar;\n"],"mappings":";;;;;;;;AAiBA,MAAM,cAAc,cAAwC,KAAA,CAAS;AAErE,SAAS,UAAU,OAA0D;CAC3E,MAAM,aAAa,WAAW,WAAW;CAEzC,OACE,qBAACA,mBAAD;EAA4B,GAAI;EAAhC,UAAA,CACG,MAAM,UACN,cACC,oBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;GAChC,UAAA,WAAW,MAAM,IAAI,IAAI;EACtB,CAAA,CAEkB;;AAEhC;AAuBA,MAAM,YAAY,EAChB,OACA,cACA,UACA,OACA,cACA,eACA,cACA,SACA,SACA,QACA,cACA,WAAW,OACX,YACA,WACA,YACA,KACA,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,CAAC,UAAU,eAAe,qBAC9B;EACE;EACA;EACA,WAAU,SAAQ,WAAW,QAAQ,KAAA,CAAS;CAChD,CACF;CACA,MAAM,CAAC,cAAc,mBAAmB,qBAA2B;EACjE,OAAO;EACP,cAAc,gBAAgB,SAAS,gCAAgB,IAAI,KAAK;EAChE,UAAU;CACZ,CAAC;CACD,MAAM,WAAW;EACf,GAAI,eAAe,CAAC,YAAY,IAAI,CAAC;EACrC,GAAI,UAAU,CAAC,EAAE,QAAQ,QAAQ,CAAC,IAAI,CAAC;EACvC,GAAI,UAAU,CAAC,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;CACxC;CAEA,OACE,oBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,KAAK,OAAO;EACZ,WAAW,GACT,WACA,SAEF;EAEA,UAAA,oBAAC,aAAD;GAAa,OAAO;GAClB,UAAA,oBAACC,YAAD;IACE,MAAK;IACL,UAAU,YAAY,KAAA;IACtB,WAAU,SAAQ,YAAY,QAAQ,IAAI;IAC1C,OAAO;IACP,eAAe;IACL;IACF;IACM;IACd,KAAK,OAAO;IACZ,YAAY,EAAE,UAAU;IACxB,WAAW,GACT,YAAY,qDACZ,YAAY,QAEd;GACD,CAAA;EACU,CAAA;CACV,CAAA;AAET"}
|
package/dist/Card.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/molecules/card.d.ts
|
|
2
|
-
interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
|
|
2
|
+
export interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
|
|
3
3
|
title?: React.ReactNode;
|
|
4
4
|
variant?: 'outlined' | 'borderless';
|
|
5
5
|
classNames?: {
|
|
@@ -9,5 +9,5 @@ interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
|
|
|
9
9
|
}
|
|
10
10
|
declare const Card: ({ title, children, className, classNames, variant, ...props }: Props) => import("react").JSX.Element;
|
|
11
11
|
//#endregion
|
|
12
|
-
export {
|
|
12
|
+
export { Card as default };
|
|
13
13
|
//# sourceMappingURL=Card.d.mts.map
|
package/dist/Card.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.d.mts","names":[],"sources":["../src/components/molecules/card.tsx"],"mappings":";
|
|
1
|
+
{"version":3,"file":"Card.d.mts","names":[],"sources":["../src/components/molecules/card.tsx"],"mappings":";iBAEiB,cAAc,KAC7B,MAAM;EAGN,QAAQ,MAAM;EACd;EACA;IACE;IACA;;;cAIE,SAAQ,OAAA,UAAA,WAAA,YAAA,YAAA,SAOX,0BAAK,IAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ComponentPropsWithRef } from "react";
|
|
2
|
+
//#region src/components/atoms/cascader.d.ts
|
|
3
|
+
export interface Option {
|
|
4
|
+
/** Unique among siblings. Values can repeat under different parents. */
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Missing or empty children make this option a selectable leaf. */
|
|
9
|
+
children?: readonly Option[];
|
|
10
|
+
}
|
|
11
|
+
export interface Props extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'value' | 'defaultValue' | 'onChange'> {
|
|
12
|
+
options: readonly Option[];
|
|
13
|
+
value?: readonly string[];
|
|
14
|
+
defaultValue?: readonly string[];
|
|
15
|
+
onChange?: (path: string[]) => void;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
allowClear?: boolean;
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
backLabel?: string;
|
|
20
|
+
clearLabel?: string;
|
|
21
|
+
emptyText?: string;
|
|
22
|
+
getLevelLabel?: (level: number) => string;
|
|
23
|
+
classNames?: {
|
|
24
|
+
trigger?: string;
|
|
25
|
+
popup?: string;
|
|
26
|
+
breadcrumb?: string;
|
|
27
|
+
select?: string;
|
|
28
|
+
clear?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
declare const Cascader: ({ options, value, defaultValue, onChange, disabled, allowClear, placeholder, backLabel, clearLabel, emptyText, getLevelLabel, className, classNames, dir, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }: Props) => import("react").JSX.Element;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { Cascader as default };
|
|
34
|
+
//# sourceMappingURL=Cascader.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cascader.d.mts","names":[],"sources":["../src/components/atoms/cascader.tsx"],"mappings":";;iBAciB;;EAEf;EACA;EACA;;EAEA,oBAAoB;;iBAGL,cAAc,KAC7B;EAGA,kBAAkB;EAClB;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;IACE;IACA;IACA;IACA;IACA;;;cAwBE,aAAY,SAAA,OAAA,cAAA,UAAA,UAAA,YAAA,aAAA,WAAA,YAAA,WAAA,eAAA,WAAA,YAAA,mBAAA,8BAAA,oCAAA,oBAAA,SAmBf,0BAAK,IAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
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 Popover from "./components/atoms/popover.mjs";
|
|
6
|
+
import Select from "./components/atoms/select.mjs";
|
|
7
|
+
import { useId, useState } from "react";
|
|
8
|
+
import { DirectionProvider } from "@base-ui/react/direction-provider";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { ChevronDown, X } from "lucide-react";
|
|
11
|
+
//#region src/components/atoms/cascader.tsx
|
|
12
|
+
const resolvePath = (options, path) => {
|
|
13
|
+
const result = [];
|
|
14
|
+
let siblings = options;
|
|
15
|
+
for (const value of path) {
|
|
16
|
+
const option = siblings.find((item) => item.value === value && !item.disabled);
|
|
17
|
+
if (!option) break;
|
|
18
|
+
result.push(option);
|
|
19
|
+
siblings = option.children ?? [];
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
const Cascader = ({ options, value, defaultValue = [], onChange, disabled = false, allowClear = true, placeholder = "Choose a path", backLabel = "Back", clearLabel = "Clear selection", emptyText = "No options", getLevelLabel = (level) => `Level ${level}`, className, classNames, dir, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }) => {
|
|
24
|
+
const [internalValue, setInternalValue] = useState(defaultValue);
|
|
25
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
26
|
+
const [browsePath, setBrowsePath] = useState([]);
|
|
27
|
+
const selectedPath = value ?? internalValue;
|
|
28
|
+
const selectedNodes = resolvePath(options, selectedPath);
|
|
29
|
+
const lastSelected = selectedNodes.at(-1);
|
|
30
|
+
const hasSelection = selectedPath.length > 0 && selectedNodes.length === selectedPath.length && !lastSelected?.children?.length;
|
|
31
|
+
const selectedText = hasSelection ? selectedNodes.map((node) => node.label).join(" / ") : placeholder;
|
|
32
|
+
const resolvedBrowse = resolvePath(options, browsePath);
|
|
33
|
+
const activeNodes = resolvedBrowse.length === browsePath.length && (browsePath.length === 0 || resolvedBrowse.at(-1)?.children?.length) ? resolvedBrowse : [];
|
|
34
|
+
const activePath = activeNodes.map((node) => node.value);
|
|
35
|
+
const currentOptions = activeNodes.at(-1)?.children ?? options;
|
|
36
|
+
const level = activePath.length + 1;
|
|
37
|
+
const { direction } = useConfig();
|
|
38
|
+
const resolvedDirection = dir === "ltr" || dir === "rtl" ? dir : direction;
|
|
39
|
+
const statusId = useId();
|
|
40
|
+
const commit = (path) => {
|
|
41
|
+
if (disabled) return;
|
|
42
|
+
if (value === void 0) setInternalValue(path);
|
|
43
|
+
if (path.length !== selectedPath.length || path.some((part, index) => part !== selectedPath[index])) onChange?.(path);
|
|
44
|
+
setIsOpen(false);
|
|
45
|
+
};
|
|
46
|
+
const changeOpen = (open) => {
|
|
47
|
+
if (open && disabled) return;
|
|
48
|
+
if (open) setBrowsePath(hasSelection ? [...selectedPath.slice(0, -1)] : []);
|
|
49
|
+
setIsOpen(open);
|
|
50
|
+
};
|
|
51
|
+
return /* @__PURE__ */ jsx(DirectionProvider, {
|
|
52
|
+
direction: resolvedDirection,
|
|
53
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
54
|
+
...props,
|
|
55
|
+
"data-slot": "cascader",
|
|
56
|
+
dir: dir ?? resolvedDirection,
|
|
57
|
+
className: cn("flex w-full min-w-0 items-center gap-1", className),
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(Popover, {
|
|
60
|
+
open: isOpen && !disabled,
|
|
61
|
+
onOpenChange: changeOpen,
|
|
62
|
+
placement: "bottomLeft",
|
|
63
|
+
title: ariaLabel ?? placeholder,
|
|
64
|
+
dir: resolvedDirection,
|
|
65
|
+
className: cn("w-72 max-w-[calc(100vw-2rem)] p-3", classNames?.popup),
|
|
66
|
+
content: /* @__PURE__ */ jsxs("div", {
|
|
67
|
+
"data-slot": "cascader-panel",
|
|
68
|
+
className: "min-w-0 space-y-3",
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ jsx("div", {
|
|
71
|
+
"data-slot": "cascader-breadcrumb",
|
|
72
|
+
"aria-live": "polite",
|
|
73
|
+
className: cn("text-muted-foreground text-sm [overflow-wrap:anywhere]", classNames?.breadcrumb),
|
|
74
|
+
children: activeNodes.length ? activeNodes.map((node) => node.label).join(" / ") : getLevelLabel(1)
|
|
75
|
+
}),
|
|
76
|
+
activePath.length > 0 && /* @__PURE__ */ jsx(Button, {
|
|
77
|
+
variant: "text",
|
|
78
|
+
size: "small",
|
|
79
|
+
onClick: () => setBrowsePath(activePath.slice(0, -1)),
|
|
80
|
+
children: backLabel
|
|
81
|
+
}),
|
|
82
|
+
currentOptions.length ? /* @__PURE__ */ jsx(Select, {
|
|
83
|
+
value: null,
|
|
84
|
+
dir: resolvedDirection,
|
|
85
|
+
"aria-label": getLevelLabel(level),
|
|
86
|
+
placeholder: getLevelLabel(level),
|
|
87
|
+
className: cn("w-full max-w-full", classNames?.select),
|
|
88
|
+
options: currentOptions.map((option) => ({
|
|
89
|
+
label: option.label,
|
|
90
|
+
value: option.value,
|
|
91
|
+
disabled: option.disabled
|
|
92
|
+
})),
|
|
93
|
+
onChange: (next) => {
|
|
94
|
+
const option = currentOptions.find((item) => item.value === next && !item.disabled);
|
|
95
|
+
if (!option) return;
|
|
96
|
+
const path = [...activePath, option.value];
|
|
97
|
+
if (option.children?.length) setBrowsePath(path);
|
|
98
|
+
else commit(path);
|
|
99
|
+
}
|
|
100
|
+
}) : /* @__PURE__ */ jsx("p", {
|
|
101
|
+
className: "text-muted-foreground m-0 text-sm",
|
|
102
|
+
children: emptyText
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
}),
|
|
106
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
107
|
+
disabled,
|
|
108
|
+
"aria-label": ariaLabel,
|
|
109
|
+
"aria-labelledby": ariaLabelledBy,
|
|
110
|
+
"aria-describedby": [ariaDescribedBy, statusId].filter(Boolean).join(" "),
|
|
111
|
+
className: cn("min-w-0 flex-1 justify-between", classNames?.trigger),
|
|
112
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
113
|
+
className: "truncate",
|
|
114
|
+
children: selectedText
|
|
115
|
+
}), /* @__PURE__ */ jsx(ChevronDown, {
|
|
116
|
+
"aria-hidden": "true",
|
|
117
|
+
className: "size-4 shrink-0"
|
|
118
|
+
})]
|
|
119
|
+
})
|
|
120
|
+
}),
|
|
121
|
+
allowClear && selectedPath.length > 0 && /* @__PURE__ */ jsx(Button, {
|
|
122
|
+
variant: "text",
|
|
123
|
+
size: "small",
|
|
124
|
+
disabled,
|
|
125
|
+
"aria-label": clearLabel,
|
|
126
|
+
icon: /* @__PURE__ */ jsx(X, {}),
|
|
127
|
+
onClick: () => commit([]),
|
|
128
|
+
className: cn("shrink-0", classNames?.clear)
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ jsx("span", {
|
|
131
|
+
id: statusId,
|
|
132
|
+
"data-slot": "cascader-status",
|
|
133
|
+
className: "sr-only",
|
|
134
|
+
"aria-live": "polite",
|
|
135
|
+
children: selectedText
|
|
136
|
+
})
|
|
137
|
+
]
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
//#endregion
|
|
142
|
+
export { Cascader as default };
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=Cascader.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cascader.mjs","names":[],"sources":["../src/components/atoms/cascader.tsx"],"sourcesContent":["'use client';\n\nimport { type ComponentPropsWithRef, useId, useState } from 'react';\n\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { ChevronDown, X } from 'lucide-react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\nimport Popover from './popover';\nimport Select from './select';\n\nexport interface Option {\n /** Unique among siblings. Values can repeat under different parents. */\n value: string;\n label: string;\n disabled?: boolean;\n /** Missing or empty children make this option a selectable leaf. */\n children?: readonly Option[];\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'value' | 'defaultValue' | 'onChange'\n> {\n options: readonly Option[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n onChange?: (path: string[]) => void;\n disabled?: boolean;\n allowClear?: boolean;\n placeholder?: string;\n backLabel?: string;\n clearLabel?: string;\n emptyText?: string;\n getLevelLabel?: (level: number) => string;\n classNames?: {\n trigger?: string;\n popup?: string;\n breadcrumb?: string;\n select?: string;\n clear?: string;\n };\n}\n\nconst resolvePath = (options: readonly Option[], path: readonly string[]) => {\n const result: Option[] = [];\n let siblings = options;\n\n for (const value of path) {\n const option = siblings.find(\n item => item.value === value && !item.disabled,\n );\n\n if (!option) {\n break;\n }\n\n result.push(option);\n siblings = option.children ?? [];\n }\n\n return result;\n};\n\nconst Cascader = ({\n options,\n value,\n defaultValue = [],\n onChange,\n disabled = false,\n allowClear = true,\n placeholder = 'Choose a path',\n backLabel = 'Back',\n clearLabel = 'Clear selection',\n emptyText = 'No options',\n getLevelLabel = level => `Level ${level}`,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n}: Props) => {\n const [internalValue, setInternalValue] =\n useState<readonly string[]>(defaultValue);\n const [isOpen, setIsOpen] = useState(false);\n const [browsePath, setBrowsePath] = useState<string[]>([]);\n const selectedPath = value ?? internalValue;\n const selectedNodes = resolvePath(options, selectedPath);\n const lastSelected = selectedNodes.at(-1);\n const hasSelection =\n selectedPath.length > 0 &&\n selectedNodes.length === selectedPath.length &&\n !lastSelected?.children?.length;\n const selectedText = hasSelection\n ? selectedNodes.map(node => node.label).join(' / ')\n : placeholder;\n const resolvedBrowse = resolvePath(options, browsePath);\n const activeNodes =\n resolvedBrowse.length === browsePath.length &&\n (browsePath.length === 0 || resolvedBrowse.at(-1)?.children?.length)\n ? resolvedBrowse\n : [];\n const activePath = activeNodes.map(node => node.value);\n const currentOptions = activeNodes.at(-1)?.children ?? options;\n const level = activePath.length + 1;\n const { direction } = useConfig();\n const resolvedDirection = dir === 'ltr' || dir === 'rtl' ? dir : direction;\n const statusId = useId();\n\n const commit = (path: string[]) => {\n if (disabled) {\n return;\n }\n\n if (value === undefined) {\n setInternalValue(path);\n }\n\n if (\n path.length !== selectedPath.length ||\n path.some((part, index) => part !== selectedPath[index])\n ) {\n onChange?.(path);\n }\n\n setIsOpen(false);\n };\n\n const changeOpen = (open: boolean) => {\n if (open && disabled) {\n return;\n }\n\n if (open) {\n setBrowsePath(hasSelection ? [...selectedPath.slice(0, -1)] : []);\n }\n\n setIsOpen(open);\n };\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <div\n {...props}\n data-slot=\"cascader\"\n dir={dir ?? resolvedDirection}\n className={cn(\n 'flex w-full min-w-0 items-center gap-1',\n className, //\n )}\n >\n <Popover\n open={isOpen && !disabled}\n onOpenChange={changeOpen}\n placement=\"bottomLeft\"\n title={ariaLabel ?? placeholder}\n dir={resolvedDirection}\n className={cn(\n 'w-72 max-w-[calc(100vw-2rem)] p-3',\n classNames?.popup, //\n )}\n content={\n <div data-slot=\"cascader-panel\" className=\"min-w-0 space-y-3\">\n <div\n data-slot=\"cascader-breadcrumb\"\n aria-live=\"polite\"\n className={cn(\n 'text-muted-foreground text-sm [overflow-wrap:anywhere]',\n classNames?.breadcrumb, //\n )}\n >\n {activeNodes.length\n ? activeNodes.map(node => node.label).join(' / ')\n : getLevelLabel(1)}\n </div>\n {activePath.length > 0 && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setBrowsePath(activePath.slice(0, -1))}\n >\n {backLabel}\n </Button>\n )}\n {currentOptions.length ? (\n <Select\n value={null}\n dir={resolvedDirection}\n aria-label={getLevelLabel(level)}\n placeholder={getLevelLabel(level)}\n className={cn(\n 'w-full max-w-full',\n classNames?.select, //\n )}\n options={currentOptions.map(option => ({\n label: option.label,\n value: option.value,\n disabled: option.disabled,\n }))}\n onChange={next => {\n const option = currentOptions.find(\n item => item.value === next && !item.disabled,\n );\n\n if (!option) {\n return;\n }\n\n const path = [...activePath, option.value];\n\n if (option.children?.length) {\n setBrowsePath(path);\n } else {\n commit(path);\n }\n }}\n />\n ) : (\n <p className=\"text-muted-foreground m-0 text-sm\">{emptyText}</p>\n )}\n </div>\n }\n >\n <Button\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={[ariaDescribedBy, statusId]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'min-w-0 flex-1 justify-between',\n classNames?.trigger, //\n )}\n >\n <span className=\"truncate\">{selectedText}</span>\n <ChevronDown aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n </Button>\n </Popover>\n {allowClear && selectedPath.length > 0 && (\n <Button\n variant=\"text\"\n size=\"small\"\n disabled={disabled}\n aria-label={clearLabel}\n icon={<X />}\n onClick={() => commit([])}\n className={cn(\n 'shrink-0',\n classNames?.clear, //\n )}\n />\n )}\n <span\n id={statusId}\n data-slot=\"cascader-status\"\n className=\"sr-only\"\n aria-live=\"polite\"\n >\n {selectedText}\n </span>\n </div>\n </DirectionProvider>\n );\n};\n\nexport default Cascader;\n"],"mappings":"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"}
|
package/dist/CodeEditor.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import CodeMirror, { Extension } from "@uiw/react-codemirror";
|
|
2
2
|
//#region src/components/atoms/code-editor.d.ts
|
|
3
|
-
interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' | 'extensions' | 'onChange' | 'ref' | 'theme'> {
|
|
3
|
+
export interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' | 'extensions' | 'onChange' | 'ref' | 'theme'> {
|
|
4
4
|
value: string;
|
|
5
5
|
/** Passed through to CodeMirror; `'100%'` fills the wrapper. */
|
|
6
6
|
height?: string;
|
|
@@ -47,5 +47,5 @@ interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' |
|
|
|
47
47
|
}
|
|
48
48
|
declare const CodeEditor: ({ value, theme, height, className, extensions: extraExtensions, diff, formatCode, onChange, onSave, onFormatError, ...props }: Props) => import("react").JSX.Element;
|
|
49
49
|
//#endregion
|
|
50
|
-
export {
|
|
50
|
+
export { CodeEditor as default };
|
|
51
51
|
//# sourceMappingURL=CodeEditor.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.d.mts","names":[],"sources":["../src/components/atoms/code-editor.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"CodeEditor.d.mts","names":[],"sources":["../src/components/atoms/code-editor.tsx"],"mappings":";;iBA2BiB,cAAc,KAC7B,MAAM,sBAAsB;EAG5B;;EAEA;;;;;;;;;;;EAWA,6CAA6C;;EAE7C,aAAa;;;;;;EAMb;IACE;IACA;;;;;;;;EAQF,cAAc,iBAAiB;EAC/B;EACA,YAAY;;EAEZ,UAAU;;;;;;;EAOV,iBAAiB;;cAGb,eAAc,OAAA,OAAA,QAAA,WAAA,YAAA,iBAAA,MAAA,YAAA,UAAA,QAAA,kBAAA,SAYjB,0BAAK,IAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React$1 from "react";
|
|
2
|
+
import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
|
|
3
|
+
//#region src/components/molecules/context-menu.d.ts
|
|
4
|
+
export type Item = {
|
|
5
|
+
key: React$1.Key;
|
|
6
|
+
label: React$1.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
type?: 'action';
|
|
9
|
+
onSelect?: () => void;
|
|
10
|
+
} | {
|
|
11
|
+
key: React$1.Key;
|
|
12
|
+
type: 'separator';
|
|
13
|
+
};
|
|
14
|
+
export interface Props extends Omit<React$1.ComponentProps<typeof ContextMenu$1.Root>, 'children'> {
|
|
15
|
+
children: React$1.ReactNode;
|
|
16
|
+
items: Item[];
|
|
17
|
+
onSelect?: (key: React$1.Key, item: Extract<Item, {
|
|
18
|
+
label: React$1.ReactNode;
|
|
19
|
+
}>) => void;
|
|
20
|
+
/** Visible action button for touch and discoverability; omit to hide it. */
|
|
21
|
+
actionLabel?: string;
|
|
22
|
+
triggerProps?: Omit<React$1.ComponentProps<typeof ContextMenu$1.Trigger>, 'children' | 'render' | 'ref'>;
|
|
23
|
+
classNames?: {
|
|
24
|
+
trigger?: string;
|
|
25
|
+
popup?: string;
|
|
26
|
+
item?: string;
|
|
27
|
+
separator?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
declare const ContextMenu: ({ children, items, onSelect, actionLabel, triggerProps, classNames, disabled, open, defaultOpen, onOpenChange, ...props }: Props) => React$1.JSX.Element;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ContextMenu as default };
|
|
33
|
+
//# sourceMappingURL=ContextMenu.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.d.mts","names":["React","BaseContextMenu"],"sources":["../src/components/molecules/context-menu.tsx"],"mappings":";;;YAcY;EAEN,KAAKA,QAAM;EACX,OAAOA,QAAM;EACb;EACA;EACA;;EAEA,KAAKA,QAAM;EAAK;;iBAEL,cAAc,KAC7BA,QAAM,sBAAsBC,cAAgB;EAG5C,UAAUD,QAAM;EAChB,OAAO;EACP,YACE,KAAKA,QAAM,KACX,MAAM,QAAQ;IAAQ,OAAOA,QAAM;;;EAGrC;EACA,eAAe,KACbA,QAAM,sBAAsBC,cAAgB;EAG9C;IACE;IACA;IACA;IACA;;;cAIE,gBAAe,UAAA,OAAA,UAAA,aAAA,cAAA,YAAA,UAAA,MAAA,aAAA,iBAAA,SAYlB,UAAKD,QAAA,IAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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 * as React$1 from "react";
|
|
7
|
+
import { DirectionProvider } from "@base-ui/react/direction-provider";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
|
|
10
|
+
import { Menu } from "@base-ui/react/menu";
|
|
11
|
+
//#region src/components/molecules/context-menu.tsx
|
|
12
|
+
const ContextMenu = ({ children, items, onSelect, actionLabel, triggerProps, classNames, disabled = false, open, defaultOpen = false, onOpenChange, ...props }) => {
|
|
13
|
+
const { getContainer, direction } = useConfig();
|
|
14
|
+
const triggerRef = React$1.useRef(null);
|
|
15
|
+
const actionRef = React$1.useRef(null);
|
|
16
|
+
const [isOpen, setIsOpen] = React$1.useState(defaultOpen);
|
|
17
|
+
const [source, setSource] = React$1.useState("context");
|
|
18
|
+
const hasActions = items.some((item) => item.type !== "separator");
|
|
19
|
+
const isInactive = disabled || !hasActions;
|
|
20
|
+
const resolvedOpen = open ?? isOpen;
|
|
21
|
+
const resolvedDirection = triggerProps?.dir === "rtl" || triggerProps?.dir === "ltr" ? triggerProps.dir : direction;
|
|
22
|
+
const handleOpenChange = (nextOpen, details, nextSource) => {
|
|
23
|
+
onOpenChange?.(nextOpen, details);
|
|
24
|
+
if (details.isCanceled) return;
|
|
25
|
+
if (nextOpen) setSource(nextSource);
|
|
26
|
+
setIsOpen(nextOpen);
|
|
27
|
+
};
|
|
28
|
+
const popup = /* @__PURE__ */ jsx(Menu.Portal, {
|
|
29
|
+
container: getContainer(),
|
|
30
|
+
children: /* @__PURE__ */ jsx(Menu.Positioner, {
|
|
31
|
+
sideOffset: 4,
|
|
32
|
+
className: OVERLAY_LAYER,
|
|
33
|
+
children: /* @__PURE__ */ jsx(Menu.Popup, {
|
|
34
|
+
"data-slot": "context-menu",
|
|
35
|
+
dir: resolvedDirection,
|
|
36
|
+
finalFocus: source === "context" ? triggerRef : actionRef,
|
|
37
|
+
className: cn(`bg-popover text-popover-foreground border-border
|
|
38
|
+
max-h-[var(--available-height)] max-w-[var(--available-width)]
|
|
39
|
+
min-w-40 overflow-auto rounded-md border p-1 shadow-md outline-none`, classNames?.popup),
|
|
40
|
+
children: items.map((item) => item.type === "separator" ? /* @__PURE__ */ jsx(Menu.Separator, { className: cn("bg-border my-1 h-px", classNames?.separator) }, item.key) : /* @__PURE__ */ jsx(Menu.Item, {
|
|
41
|
+
disabled: item.disabled,
|
|
42
|
+
className: cn(`data-highlighted:bg-accent
|
|
43
|
+
data-highlighted:text-accent-foreground cursor-default
|
|
44
|
+
rounded-sm px-3 py-2 text-sm break-words outline-none
|
|
45
|
+
data-disabled:opacity-50`, classNames?.item),
|
|
46
|
+
onClick: () => {
|
|
47
|
+
item.onSelect?.();
|
|
48
|
+
onSelect?.(item.key, item);
|
|
49
|
+
},
|
|
50
|
+
children: item.label
|
|
51
|
+
}, item.key))
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
return /* @__PURE__ */ jsxs(DirectionProvider, {
|
|
56
|
+
direction: resolvedDirection,
|
|
57
|
+
children: [/* @__PURE__ */ jsxs(ContextMenu$1.Root, {
|
|
58
|
+
...props,
|
|
59
|
+
actionsRef: source === "context" ? props.actionsRef : void 0,
|
|
60
|
+
disabled: isInactive,
|
|
61
|
+
open: resolvedOpen && source === "context",
|
|
62
|
+
onOpenChange: (nextOpen, details) => handleOpenChange(nextOpen, details, "context"),
|
|
63
|
+
children: [/* @__PURE__ */ jsx(ContextMenu$1.Trigger, {
|
|
64
|
+
...triggerProps,
|
|
65
|
+
ref: triggerRef,
|
|
66
|
+
"data-slot": "context-menu-trigger",
|
|
67
|
+
dir: triggerProps?.dir ?? resolvedDirection,
|
|
68
|
+
tabIndex: actionLabel ? -1 : triggerProps?.tabIndex ?? 0,
|
|
69
|
+
className: cn("focus-visible:ring-ring outline-none focus-visible:ring-2", classNames?.trigger, triggerProps?.className),
|
|
70
|
+
children
|
|
71
|
+
}), popup]
|
|
72
|
+
}), actionLabel && /* @__PURE__ */ jsxs(Menu.Root, {
|
|
73
|
+
...props,
|
|
74
|
+
actionsRef: source === "action" ? props.actionsRef : void 0,
|
|
75
|
+
disabled: isInactive,
|
|
76
|
+
open: resolvedOpen && source === "action",
|
|
77
|
+
onOpenChange: (nextOpen, details) => handleOpenChange(nextOpen, details, "action"),
|
|
78
|
+
children: [/* @__PURE__ */ jsx(Menu.Trigger, {
|
|
79
|
+
ref: actionRef,
|
|
80
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
81
|
+
size: "small",
|
|
82
|
+
variant: "text"
|
|
83
|
+
}),
|
|
84
|
+
children: actionLabel
|
|
85
|
+
}), popup]
|
|
86
|
+
})]
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
//#endregion
|
|
90
|
+
export { ContextMenu as default };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=ContextMenu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.mjs","names":["React","BaseMenu","BaseContextMenu"],"sources":["../src/components/molecules/context-menu.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { OVERLAY_LAYER } from '../../lib/z-layers';\nimport Button from '../atoms/button';\n\nexport type Item =\n | {\n key: React.Key;\n label: React.ReactNode;\n disabled?: boolean;\n type?: 'action';\n onSelect?: () => void;\n }\n | { key: React.Key; type: 'separator' };\n\nexport interface Props extends Omit<\n React.ComponentProps<typeof BaseContextMenu.Root>,\n 'children'\n> {\n children: React.ReactNode;\n items: Item[];\n onSelect?: (\n key: React.Key,\n item: Extract<Item, { label: React.ReactNode }>,\n ) => void;\n /** Visible action button for touch and discoverability; omit to hide it. */\n actionLabel?: string;\n triggerProps?: Omit<\n React.ComponentProps<typeof BaseContextMenu.Trigger>,\n 'children' | 'render' | 'ref'\n >;\n classNames?: {\n trigger?: string;\n popup?: string;\n item?: string;\n separator?: string;\n };\n}\n\nconst ContextMenu = ({\n children,\n items,\n onSelect,\n actionLabel,\n triggerProps,\n classNames,\n disabled = false,\n open,\n defaultOpen = false,\n onOpenChange,\n ...props\n}: Props) => {\n const { getContainer, direction } = useConfig();\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const actionRef = React.useRef<HTMLButtonElement>(null);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const [source, setSource] = React.useState<'context' | 'action'>('context');\n const hasActions = items.some(item => item.type !== 'separator');\n const isInactive = disabled || !hasActions;\n const resolvedOpen = open ?? isOpen;\n const resolvedDirection =\n triggerProps?.dir === 'rtl' || triggerProps?.dir === 'ltr'\n ? triggerProps.dir\n : direction;\n const handleOpenChange = (\n nextOpen: boolean,\n details: Parameters<NonNullable<Props['onOpenChange']>>[1],\n nextSource: typeof source,\n ) => {\n onOpenChange?.(nextOpen, details);\n\n if (details.isCanceled) {\n return;\n }\n\n if (nextOpen) {\n setSource(nextSource);\n }\n\n setIsOpen(nextOpen);\n };\n\n const popup = (\n <BaseMenu.Portal container={getContainer()}>\n <BaseMenu.Positioner sideOffset={4} className={OVERLAY_LAYER}>\n <BaseMenu.Popup\n data-slot=\"context-menu\"\n dir={resolvedDirection}\n finalFocus={source === 'context' ? triggerRef : actionRef}\n className={cn(\n `bg-popover text-popover-foreground border-border\n max-h-[var(--available-height)] max-w-[var(--available-width)]\n min-w-40 overflow-auto rounded-md border p-1 shadow-md outline-none`,\n classNames?.popup,\n //\n )}\n >\n {items.map(item =>\n item.type === 'separator' ? (\n <BaseMenu.Separator\n key={item.key}\n className={cn(\n 'bg-border my-1 h-px',\n classNames?.separator,\n //\n )}\n />\n ) : (\n <BaseMenu.Item\n key={item.key}\n disabled={item.disabled}\n className={cn(\n `data-highlighted:bg-accent\n data-highlighted:text-accent-foreground cursor-default\n rounded-sm px-3 py-2 text-sm break-words outline-none\n data-disabled:opacity-50`,\n classNames?.item,\n //\n )}\n onClick={() => {\n item.onSelect?.();\n onSelect?.(item.key, item);\n }}\n >\n {item.label}\n </BaseMenu.Item>\n ),\n )}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <BaseContextMenu.Root\n {...props}\n actionsRef={source === 'context' ? props.actionsRef : undefined}\n disabled={isInactive}\n open={resolvedOpen && source === 'context'}\n onOpenChange={(nextOpen, details) =>\n handleOpenChange(nextOpen, details, 'context')\n }\n >\n <BaseContextMenu.Trigger\n {...triggerProps}\n ref={triggerRef}\n data-slot=\"context-menu-trigger\"\n dir={triggerProps?.dir ?? resolvedDirection}\n tabIndex={actionLabel ? -1 : (triggerProps?.tabIndex ?? 0)}\n className={cn(\n 'focus-visible:ring-ring outline-none focus-visible:ring-2',\n classNames?.trigger,\n triggerProps?.className,\n //\n )}\n >\n {children}\n </BaseContextMenu.Trigger>\n {popup}\n </BaseContextMenu.Root>\n {actionLabel && (\n <BaseMenu.Root\n {...props}\n actionsRef={source === 'action' ? props.actionsRef : undefined}\n disabled={isInactive}\n open={resolvedOpen && source === 'action'}\n onOpenChange={(nextOpen, details) =>\n handleOpenChange(nextOpen, details, 'action')\n }\n >\n <BaseMenu.Trigger\n ref={actionRef}\n render={<Button size=\"small\" variant=\"text\" />}\n >\n {actionLabel}\n </BaseMenu.Trigger>\n {popup}\n </BaseMenu.Root>\n )}\n </DirectionProvider>\n );\n};\nexport default ContextMenu;\n"],"mappings":";;;;;;;;;;;AAgDA,MAAM,eAAe,EACnB,UACA,OACA,UACA,aACA,cACA,YACA,WAAW,OACX,MACA,cAAc,OACd,cACA,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,cAAc,UAAU;CAC9C,MAAM,aAAaA,QAAM,OAAuB,IAAI;CACpD,MAAM,YAAYA,QAAM,OAA0B,IAAI;CACtD,MAAM,CAAC,QAAQ,aAAaA,QAAM,SAAS,WAAW;CACtD,MAAM,CAAC,QAAQ,aAAaA,QAAM,SAA+B,SAAS;CAC1E,MAAM,aAAa,MAAM,MAAK,SAAQ,KAAK,SAAS,WAAW;CAC/D,MAAM,aAAa,YAAY,CAAC;CAChC,MAAM,eAAe,QAAQ;CAC7B,MAAM,oBACJ,cAAc,QAAQ,SAAS,cAAc,QAAQ,QACjD,aAAa,MACb;CACN,MAAM,oBACJ,UACA,SACA,eACG;EACH,eAAe,UAAU,OAAO;EAEhC,IAAI,QAAQ,YACV;EAGF,IAAI,UACF,UAAU,UAAU;EAGtB,UAAU,QAAQ;CACpB;CAEA,MAAM,QACJ,oBAACC,KAAS,QAAV;EAAiB,WAAW,aAAa;EACvC,UAAA,oBAACA,KAAS,YAAV;GAAqB,YAAY;GAAG,WAAW;GAC7C,UAAA,oBAACA,KAAS,OAAV;IACE,aAAU;IACV,KAAK;IACL,YAAY,WAAW,YAAY,aAAa;IAChD,WAAW,GACT;;kFAGA,YAAY,KAEd;IAEC,UAAA,MAAM,KAAI,SACT,KAAK,SAAS,cACZ,oBAACA,KAAS,WAAV,EAEE,WAAW,GACT,uBACA,YAAY,SAEd,EACD,GANM,KAAK,GAMX,IAED,oBAACA,KAAS,MAAV;KAEE,UAAU,KAAK;KACf,WAAW,GACT;;;+CAIA,YAAY,IAEd;KACA,eAAe;MACb,KAAK,WAAW;MAChB,WAAW,KAAK,KAAK,IAAI;KAC3B;KAEC,UAAA,KAAK;IACO,GAhBR,KAAK,GAgBG,CAEnB;GACc,CAAA;EACG,CAAA;CACN,CAAA;CAGnB,OACE,qBAAC,mBAAD;EAAmB,WAAW;EAA9B,UAAA,CACE,qBAACC,cAAgB,MAAjB;GACE,GAAI;GACJ,YAAY,WAAW,YAAY,MAAM,aAAa,KAAA;GACtD,UAAU;GACV,MAAM,gBAAgB,WAAW;GACjC,eAAe,UAAU,YACvB,iBAAiB,UAAU,SAAS,SAAS;GANjD,UAAA,CASE,oBAACA,cAAgB,SAAjB;IACE,GAAI;IACJ,KAAK;IACL,aAAU;IACV,KAAK,cAAc,OAAO;IAC1B,UAAU,cAAc,KAAM,cAAc,YAAY;IACxD,WAAW,GACT,6DACA,YAAY,SACZ,cAAc,SAEhB;IAEC;GACsB,CAAA,GACxB,KACmB;EACrB,CAAA,GAAA,eACC,qBAACD,KAAS,MAAV;GACE,GAAI;GACJ,YAAY,WAAW,WAAW,MAAM,aAAa,KAAA;GACrD,UAAU;GACV,MAAM,gBAAgB,WAAW;GACjC,eAAe,UAAU,YACvB,iBAAiB,UAAU,SAAS,QAAQ;GANhD,UAAA,CASE,oBAACA,KAAS,SAAV;IACE,KAAK;IACL,QAAQ,oBAAC,QAAD;KAAQ,MAAK;KAAQ,SAAQ;IAAQ,CAAA;IAE5C,UAAA;GACe,CAAA,GACjB,KACY;EAEA,CAAA,CAAA;;AAEvB"}
|