@livestorm/ui-vue 1.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -32
- package/components-vite.js +5 -5
- package/components.d.ts +3 -3
- package/dist/UiTimelineItem.vue_vue_type_style_index_0_lang-DOLFRKcb.mjs +5565 -0
- package/dist/a11y-DIdrv5Mn.mjs +66 -0
- package/dist/breakpoints.mjs +9 -0
- package/dist/bus.mjs +5 -0
- package/dist/components.mjs +213 -1550
- package/dist/index.mjs +84 -166
- package/dist/integrations.mjs +8 -0
- package/dist/layouts.mjs +236 -0
- package/dist/responsive.mjs +25 -0
- package/dist/slot.mjs +21 -0
- package/dist/toastDSV2-wMh-UMzW.mjs +74 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/src/components/Toast/LayoutToasts.vue.d.ts +3 -0
- package/dist/types/src/components/Toast/ToastMessage.vue.d.ts +21 -0
- package/dist/types/src/components/Toast/toastDSV2.d.ts +102 -0
- package/dist/types/src/components/UiActionBar/UiActionBar.vue.d.ts +44 -0
- package/dist/types/src/components/UiActionBar/UiActionBarItem.vue.d.ts +47 -0
- package/dist/types/src/components/UiActionBar/UiActionBarSeparator.vue.d.ts +3 -0
- package/dist/types/src/components/UiActionBar/index.d.ts +4 -0
- package/dist/types/src/components/UiActionBar/types.d.ts +14 -0
- package/dist/types/src/components/UiAnimatedLogo/UiAnimatedLogo.vue.d.ts +10 -0
- package/dist/types/src/components/UiAnimatedLogo/animations-links.d.ts +3 -0
- package/dist/types/src/components/UiAvatar/UiAvatar.vue.d.ts +55 -0
- package/dist/types/src/components/UiAvatar/index.d.ts +1 -0
- package/dist/types/src/components/UiAvatarList/UiAvatarList.vue.d.ts +28 -0
- package/dist/types/src/components/UiAvatarList/index.d.ts +1 -0
- package/dist/types/src/components/UiBadge/UiBadge.vue.d.ts +47 -0
- package/dist/types/src/components/UiBadge/index.d.ts +1 -0
- package/dist/types/src/components/UiBanner/UiBanner.vue.d.ts +96 -0
- package/dist/types/src/components/UiBanner/index.d.ts +2 -0
- package/dist/types/src/components/UiBreadcrumb/UiBreadcrumb.vue.d.ts +15 -0
- package/dist/types/src/components/UiBreadcrumb/index.d.ts +2 -0
- package/dist/types/src/components/UiButton/UiButton.vue.d.ts +249 -0
- package/dist/types/src/components/UiButtonGroup/UiButtonGroup.vue.d.ts +42 -0
- package/dist/types/src/components/UiButtonGroup/UiButtonGroupItem.vue.d.ts +21 -0
- package/dist/types/src/components/UiButtonGroup/index.d.ts +3 -0
- package/dist/types/src/components/UiButtonGroup/types.d.ts +10 -0
- package/dist/types/src/components/UiCard/UiCard.vue.d.ts +31 -0
- package/dist/types/src/components/UiCarousel/UiCarousel.vue.d.ts +63 -0
- package/dist/types/src/components/UiCarousel/index.d.ts +2 -0
- package/dist/types/src/components/UiColorField/UiColorField.vue.d.ts +19 -0
- package/dist/types/src/components/UiColorField/index.d.ts +2 -0
- package/dist/types/src/components/UiColorField/types.d.ts +29 -0
- package/dist/types/src/components/UiColorPicker/UiColorPicker.vue.d.ts +35 -0
- package/dist/types/src/components/UiColorPicker/index.d.ts +2 -0
- package/dist/types/src/components/UiColorPicker/types.d.ts +97 -0
- package/dist/types/src/components/UiDialog/MarketplaceHeaderExample.vue.d.ts +28 -0
- package/dist/types/src/components/UiDialog/UiDialog.vue.d.ts +18 -0
- package/dist/types/src/components/UiDialog/UiDialogClose.vue.d.ts +10 -0
- package/dist/types/src/components/UiDialog/UiDialogContent.vue.d.ts +54 -0
- package/dist/types/src/components/UiDialog/UiDialogFooter.vue.d.ts +13 -0
- package/dist/types/src/components/UiDialog/UiDialogTrigger.vue.d.ts +14 -0
- package/dist/types/src/components/UiDialog/index.d.ts +7 -0
- package/dist/types/src/components/UiDropdown/UiDropdown.vue.d.ts +42 -0
- package/dist/types/src/components/UiDropdown/UiDropdownContent.vue.d.ts +32 -0
- package/dist/types/src/components/UiDropdown/UiDropdownItem.vue.d.ts +27 -0
- package/dist/types/src/components/UiDropdown/UiDropdownSeparator.vue.d.ts +3 -0
- package/dist/types/src/components/UiDropdown/UiDropdownTrigger.vue.d.ts +45 -0
- package/dist/types/src/components/UiDropdown/context.d.ts +7 -0
- package/dist/types/src/components/UiDropdown/index.d.ts +6 -0
- package/dist/types/src/components/UiEmptyState/UiEmptyState.vue.d.ts +29 -0
- package/dist/types/src/components/UiFieldWrapper/UiFieldWrapper.vue.d.ts +36 -0
- package/dist/types/src/components/UiFieldWrapper/index.d.ts +1 -0
- package/dist/types/src/components/UiForm/UiFormField.types.d.ts +22 -0
- package/dist/types/src/components/UiForm/UiFormField.vue.d.ts +34 -0
- package/dist/types/src/components/UiForm/index.d.ts +3 -0
- package/dist/types/src/components/UiHorizontalSeparator/UiHorizontalSeparator.vue.d.ts +6 -0
- package/dist/types/src/components/UiInputCheckbox/UiInputCheckbox.vue.d.ts +108 -0
- package/dist/types/src/components/UiInputCheckbox/index.d.ts +2 -0
- package/dist/types/src/components/UiInputCheckbox/types.d.ts +1 -0
- package/dist/types/src/components/UiInputSelect/UiInputSelect.vue.d.ts +66 -0
- package/dist/types/src/components/UiInputSelect/index.d.ts +2 -0
- package/dist/types/src/components/UiInputSelect/types.d.ts +1 -0
- package/dist/types/src/components/UiInputTextarea/UiInputTextarea.vue.d.ts +49 -0
- package/dist/types/src/components/UiInputTextarea/index.d.ts +2 -0
- package/dist/types/src/components/UiInputTextarea/types.d.ts +1 -0
- package/dist/types/src/components/UiLabel/UiLabel.vue.d.ts +17 -0
- package/dist/types/src/components/UiList/UiList.vue.d.ts +27 -0
- package/dist/types/src/components/UiListItem/UiListItem.vue.d.ts +35 -0
- package/dist/types/src/components/UiLoader/UiLoader.vue.d.ts +17 -0
- package/dist/types/src/components/UiLogo/UiLogo.vue.d.ts +20 -0
- package/dist/types/src/components/UiLogo/variants/PulseVariant.vue.d.ts +3 -0
- package/dist/types/src/components/UiLogo/variants/TornadoVariant.vue.d.ts +3 -0
- package/dist/types/src/components/UiMenu/UiMenu.vue.d.ts +18 -0
- package/dist/types/src/components/UiMenu/UiMenuContent.vue.d.ts +30 -0
- package/dist/types/src/components/UiMenu/UiMenuGroup.vue.d.ts +16 -0
- package/dist/types/src/components/UiMenu/UiMenuItem.vue.d.ts +18 -0
- package/dist/types/src/components/UiMenu/UiMenuLabel.vue.d.ts +13 -0
- package/dist/types/src/components/UiMenu/UiMenuSeparator.vue.d.ts +13 -0
- package/dist/types/src/components/UiMenu/UiMenuSub.vue.d.ts +18 -0
- package/dist/types/src/components/UiMenu/UiMenuSubContent.vue.d.ts +32 -0
- package/dist/types/src/components/UiMenu/UiMenuSubTrigger.vue.d.ts +14 -0
- package/dist/types/src/components/UiMenu/UiMenuTrigger.vue.d.ts +14 -0
- package/dist/types/src/components/UiMenu/index.d.ts +10 -0
- package/dist/types/src/components/UiPage/UiPage.vue.d.ts +37 -0
- package/dist/types/src/components/UiPageHeader/UiPageHeader.vue.d.ts +33 -0
- package/dist/types/src/components/UiPopover/UiPopover.vue.d.ts +18 -0
- package/dist/types/src/components/UiPopover/UiPopoverAnchor.vue.d.ts +14 -0
- package/dist/types/src/components/UiPopover/UiPopoverContent.vue.d.ts +28 -0
- package/dist/types/src/components/UiPopover/UiPopoverTrigger.vue.d.ts +14 -0
- package/dist/types/src/components/UiProgress/UiProgress.vue.d.ts +15 -0
- package/dist/types/src/components/UiProgress/index.d.ts +2 -0
- package/dist/types/src/components/UiProgress/types.d.ts +4 -0
- package/dist/types/src/components/UiRoomButton/UiRoomButton.vue.d.ts +29 -0
- package/dist/types/src/components/UiShell/UiShell.vue.d.ts +24 -0
- package/dist/types/src/components/UiSideMenu/UiSideMenu.vue.d.ts +64 -0
- package/dist/types/src/components/UiSideMenu/UiSideMenuBottom.vue.d.ts +7 -0
- package/dist/types/src/components/UiSideMenu/UiSideMenuItem.vue.d.ts +53 -0
- package/dist/types/src/components/UiSideMenu/UiSideMenuItemContent.vue.d.ts +43 -0
- package/dist/types/src/components/UiSideMenu/UiSideMenuTop.vue.d.ts +7 -0
- package/dist/types/src/components/UiSideMenu/injection.d.ts +7 -0
- package/dist/types/src/components/UiSideMenu/types.d.ts +39 -0
- package/dist/types/src/components/UiSideMenu/useLabelHidden.d.ts +2 -0
- package/dist/types/src/components/UiSideMenu/useSideMenuLayout.d.ts +7 -0
- package/dist/types/src/components/UiStepper/UiStepper.vue.d.ts +18 -0
- package/dist/types/src/components/UiStepper/UiStepperDescription.vue.d.ts +14 -0
- package/dist/types/src/components/UiStepper/UiStepperIndicator.vue.d.ts +20 -0
- package/dist/types/src/components/UiStepper/UiStepperItem.vue.d.ts +19 -0
- package/dist/types/src/components/UiStepper/UiStepperSeparator.vue.d.ts +10 -0
- package/dist/types/src/components/UiStepper/UiStepperTitle.vue.d.ts +14 -0
- package/dist/types/src/components/UiStepper/index.d.ts +7 -0
- package/dist/types/src/components/UiTable/UiTable.vue.d.ts +20 -0
- package/dist/types/src/components/UiTable/UiTableBody.vue.d.ts +13 -0
- package/dist/types/src/components/UiTable/UiTableCell.vue.d.ts +13 -0
- package/dist/types/src/components/UiTable/UiTableHeader.vue.d.ts +13 -0
- package/dist/types/src/components/UiTable/UiTableHeaderCell.vue.d.ts +13 -0
- package/dist/types/src/components/UiTable/UiTableRow.vue.d.ts +16 -0
- package/dist/types/src/components/UiTable/index.d.ts +6 -0
- package/dist/types/src/components/UiTabs/UiTabs.vue.d.ts +37 -0
- package/dist/types/src/components/UiTabs/index.d.ts +2 -0
- package/dist/types/src/components/UiTag/UiTag.vue.d.ts +43 -0
- package/dist/types/src/components/UiTag/index.d.ts +1 -0
- package/dist/types/src/components/UiTextField/UiTextField.vue.d.ts +65 -0
- package/dist/types/src/components/UiTextField/index.d.ts +2 -0
- package/dist/types/src/components/UiTextField/types.d.ts +2 -0
- package/dist/types/src/components/UiTimeline/UiTimeline.vue.d.ts +19 -0
- package/dist/types/src/components/UiTimeline/UiTimelineItem.vue.d.ts +28 -0
- package/dist/types/src/components/UiTimeline/index.d.ts +2 -0
- package/dist/types/src/components/UiTooltip/UiTooltip.vue.d.ts +18 -0
- package/dist/types/src/components/UiTooltip/UiTooltipContent.vue.d.ts +54 -0
- package/dist/types/src/components/UiTooltip/UiTooltipProvider.vue.d.ts +17 -0
- package/dist/types/src/components/UiTooltip/UiTooltipTrigger.vue.d.ts +14 -0
- package/dist/types/src/components/UiTooltip/index.d.ts +4 -0
- package/dist/types/src/composables/useButtonStyles.d.ts +20 -0
- package/dist/types/src/composables/useMobileMenu.d.ts +11 -0
- package/dist/types/src/composables/useThemeAndModes.d.ts +34 -0
- package/dist/types/src/constants/index.d.ts +2 -0
- package/dist/types/src/constants/sizes.d.ts +2 -0
- package/dist/types/src/constants/themes.d.ts +22 -0
- package/dist/types/src/integrations/index.d.ts +1 -0
- package/dist/types/src/layouts/index.d.ts +2 -0
- package/dist/types/src/mixins/DynamicAction.d.ts +30 -0
- package/dist/types/src/primitives.d.ts +6 -0
- package/dist/types/src/theme.d.ts +1 -0
- package/dist/types/src/utils/a11y.d.ts +2 -0
- package/dist/types/src/utils/breakpoints.d.ts +9 -0
- package/dist/types/src/utils/bus.d.ts +2 -0
- package/dist/types/src/utils/clipboard.d.ts +4 -0
- package/dist/types/src/utils/devices.d.ts +19 -0
- package/dist/types/src/utils/elements.d.ts +1 -0
- package/dist/types/src/utils/index.d.ts +9 -0
- package/dist/types/src/utils/numbers.d.ts +30 -0
- package/dist/types/src/utils/responsive.d.ts +5 -0
- package/dist/types/src/utils/responsive.types.d.ts +12 -0
- package/dist/types/src/utils/router.d.ts +1 -0
- package/dist/types/src/utils/slot.d.ts +8 -0
- package/dist/types/src/utils/stack-view.d.ts +10 -0
- package/dist/types/src/utils/uid.d.ts +1 -0
- package/dist/types/style.d.ts +1 -0
- package/dist/ui-vue.css +1 -0
- package/dist/useThemeAndModes-DY5SDC0a.mjs +109 -0
- package/dist/utils.mjs +111 -0
- package/index.d.ts +88 -2
- package/index.js +169 -16
- package/integrations.d.ts +10 -0
- package/package.json +127 -58
- package/src/components/Toast/LayoutToasts.vue +63 -0
- package/src/components/Toast/ToastMessage.vue +208 -0
- package/src/components/Toast/toastDSV2.ts +151 -0
- package/src/components/UiActionBar/UiActionBar.vue +86 -0
- package/src/components/UiActionBar/UiActionBarItem.vue +179 -0
- package/src/components/UiActionBar/UiActionBarSeparator.vue +18 -0
- package/src/components/UiActionBar/index.ts +4 -0
- package/src/components/UiActionBar/types.ts +24 -0
- package/src/components/UiAnimatedLogo/UiAnimatedLogo.vue +47 -0
- package/src/components/UiAnimatedLogo/animations-links.ts +6 -0
- package/src/components/UiAvatar/UiAvatar.vue +186 -0
- package/src/components/UiAvatar/index.js +1 -0
- package/src/components/UiAvatarList/UiAvatarList.vue +109 -0
- package/src/components/UiAvatarList/index.js +1 -0
- package/src/components/UiBadge/UiBadge.vue +161 -0
- package/src/components/UiBadge/index.ts +2 -0
- package/src/components/UiBanner/UiBanner.vue +363 -0
- package/src/components/UiBanner/index.ts +2 -0
- package/src/components/UiBreadcrumb/UiBreadcrumb.vue +93 -0
- package/src/components/UiBreadcrumb/index.ts +2 -0
- package/src/components/UiButton/UiButton.vue +319 -0
- package/src/components/UiButtonGroup/UiButtonGroup.vue +198 -0
- package/src/components/UiButtonGroup/UiButtonGroupItem.vue +123 -0
- package/src/components/UiButtonGroup/index.ts +3 -0
- package/src/components/UiButtonGroup/types.ts +24 -0
- package/src/components/UiCard/UiCard.vue +112 -0
- package/src/components/UiCarousel/UiCarousel.vue +215 -0
- package/src/components/UiCarousel/index.ts +2 -0
- package/src/components/UiColorField/UiColorField.vue +158 -0
- package/src/components/UiColorField/index.ts +2 -0
- package/src/components/UiColorField/types.ts +30 -0
- package/src/components/UiColorPicker/UiColorPicker.vue +487 -0
- package/src/components/UiColorPicker/index.ts +2 -0
- package/src/components/UiColorPicker/types.ts +103 -0
- package/src/components/UiDialog/MarketplaceHeaderExample.vue +217 -0
- package/src/components/UiDialog/UiDialog.md +97 -0
- package/src/components/UiDialog/UiDialog.vue +16 -0
- package/src/components/UiDialog/UiDialogClose.vue +29 -0
- package/src/components/UiDialog/UiDialogContent.vue +238 -0
- package/src/components/UiDialog/UiDialogFooter.vue +9 -0
- package/src/components/UiDialog/UiDialogTrigger.vue +12 -0
- package/src/components/UiDialog/index.ts +18 -0
- package/src/components/UiDropdown/UiDropdown.vue +48 -0
- package/src/components/UiDropdown/UiDropdownContent.vue +72 -0
- package/src/components/UiDropdown/UiDropdownItem.vue +75 -0
- package/src/components/UiDropdown/UiDropdownSeparator.vue +7 -0
- package/src/components/UiDropdown/UiDropdownTrigger.vue +239 -0
- package/src/components/UiDropdown/context.ts +9 -0
- package/src/components/UiDropdown/index.ts +21 -0
- package/src/components/UiEmptyState/UiEmptyState.vue +80 -0
- package/src/components/UiFieldWrapper/UiFieldWrapper.vue +79 -0
- package/src/components/UiFieldWrapper/index.ts +1 -0
- package/src/components/UiForm/UiFormField.types.ts +24 -0
- package/src/components/UiForm/UiFormField.vue +66 -0
- package/src/components/UiForm/index.ts +3 -0
- package/src/components/UiHorizontalSeparator/UiHorizontalSeparator.vue +28 -0
- package/src/components/UiInputCheckbox/UiInputCheckbox.vue +477 -0
- package/src/components/UiInputCheckbox/index.ts +2 -0
- package/src/components/UiInputCheckbox/types.ts +1 -0
- package/src/components/UiInputSelect/UiInputSelect.vue +166 -0
- package/src/components/UiInputSelect/index.ts +2 -0
- package/src/components/UiInputSelect/types.ts +1 -0
- package/src/components/UiInputTextarea/UiInputTextarea.vue +219 -0
- package/src/components/UiInputTextarea/index.ts +2 -0
- package/src/components/UiInputTextarea/types.ts +1 -0
- package/src/components/UiLabel/UiLabel.vue +34 -0
- package/src/components/UiList/UiList.vue +45 -0
- package/src/components/UiListItem/UiListItem.vue +108 -0
- package/src/components/UiLoader/UiLoader.vue +45 -0
- package/src/components/UiLogo/UiLogo.vue +99 -0
- package/src/components/UiLogo/variants/PulseVariant.vue +51 -0
- package/src/components/UiLogo/variants/TornadoVariant.vue +147 -0
- package/src/components/UiMenu/UiMenu.vue +15 -0
- package/src/components/UiMenu/UiMenuContent.vue +25 -0
- package/src/components/UiMenu/UiMenuGroup.vue +19 -0
- package/src/components/UiMenu/UiMenuItem.vue +18 -0
- package/src/components/UiMenu/UiMenuLabel.vue +9 -0
- package/src/components/UiMenu/UiMenuSeparator.vue +9 -0
- package/src/components/UiMenu/UiMenuSub.vue +15 -0
- package/src/components/UiMenu/UiMenuSubContent.vue +23 -0
- package/src/components/UiMenu/UiMenuSubTrigger.vue +17 -0
- package/src/components/UiMenu/UiMenuTrigger.vue +13 -0
- package/src/components/UiMenu/index.ts +10 -0
- package/src/components/UiPage/UiPage.vue +201 -0
- package/src/components/UiPageHeader/UiPageHeader.vue +128 -0
- package/src/components/UiPopover/UiPopover.vue +16 -0
- package/src/components/UiPopover/UiPopoverAnchor.vue +12 -0
- package/src/components/UiPopover/UiPopoverContent.vue +26 -0
- package/src/components/UiPopover/UiPopoverTrigger.vue +19 -0
- package/src/components/UiProgress/UiProgress.vue +92 -0
- package/src/components/UiProgress/index.ts +2 -0
- package/src/components/UiProgress/types.ts +5 -0
- package/src/components/UiRoomButton/UiRoomButton.vue +240 -0
- package/src/components/UiShell/UiShell.vue +88 -0
- package/src/components/UiSideMenu/UiSideMenu.vue +513 -0
- package/src/components/UiSideMenu/UiSideMenuBottom.vue +27 -0
- package/src/components/UiSideMenu/UiSideMenuItem.vue +102 -0
- package/src/components/UiSideMenu/UiSideMenuItemContent.vue +172 -0
- package/src/components/UiSideMenu/UiSideMenuTop.vue +29 -0
- package/src/components/UiSideMenu/injection.ts +9 -0
- package/src/components/UiSideMenu/types.ts +41 -0
- package/src/components/UiSideMenu/useLabelHidden.ts +33 -0
- package/src/components/UiSideMenu/useSideMenuLayout.ts +12 -0
- package/src/components/UiStepper/UiStepper.vue +40 -0
- package/src/components/UiStepper/UiStepperDescription.vue +27 -0
- package/src/components/UiStepper/UiStepperIndicator.vue +93 -0
- package/src/components/UiStepper/UiStepperItem.vue +30 -0
- package/src/components/UiStepper/UiStepperSeparator.vue +49 -0
- package/src/components/UiStepper/UiStepperTitle.vue +24 -0
- package/src/components/UiStepper/index.ts +17 -0
- package/src/components/UiTable/UiTable.vue +24 -0
- package/src/components/UiTable/UiTableBody.vue +5 -0
- package/src/components/UiTable/UiTableCell.vue +26 -0
- package/src/components/UiTable/UiTableHeader.vue +17 -0
- package/src/components/UiTable/UiTableHeaderCell.vue +19 -0
- package/src/components/UiTable/UiTableRow.vue +27 -0
- package/src/components/UiTable/index.ts +6 -0
- package/src/components/UiTabs/UiTabs.vue +218 -0
- package/src/components/UiTabs/index.ts +5 -0
- package/src/components/UiTag/UiTag.vue +187 -0
- package/src/components/UiTag/index.js +1 -0
- package/src/components/UiTextField/UiTextField.vue +370 -0
- package/src/components/UiTextField/index.ts +2 -0
- package/src/components/UiTextField/types.ts +2 -0
- package/src/components/UiTimeline/README.md +169 -0
- package/src/components/UiTimeline/UiTimeline.vue +58 -0
- package/src/components/UiTimeline/UiTimelineItem.vue +141 -0
- package/src/components/UiTimeline/index.ts +2 -0
- package/src/components/UiTooltip/UiTooltip.vue +16 -0
- package/src/components/UiTooltip/UiTooltipContent.vue +86 -0
- package/src/components/UiTooltip/UiTooltipProvider.vue +15 -0
- package/src/components/UiTooltip/UiTooltipTrigger.vue +19 -0
- package/src/components/UiTooltip/index.js +4 -0
- package/src/composables/useButtonStyles.ts +242 -0
- package/src/composables/useMobileMenu.ts +57 -0
- package/src/composables/useThemeAndModes.ts +225 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/sizes.ts +2 -0
- package/src/constants/themes.ts +34 -0
- package/src/css/{body.postcss → body.css} +3 -2
- package/src/css/reka-animations.css +209 -0
- package/src/css/{transitions.postcss → transitions.css} +12 -5
- package/src/global.d.ts +181 -0
- package/src/integrations/index.js +1 -0
- package/src/layouts/index.js +5 -0
- package/src/mixins/DynamicAction.js +5 -3
- package/src/primitives.ts +6 -0
- package/src/theme.ts +1 -0
- package/src/utils/a11y.ts +8 -0
- package/src/utils/{breakpoints.js → breakpoints.ts} +1 -0
- package/src/utils/clipboard.js +2 -2
- package/src/utils/devices.js +0 -3
- package/src/utils/index.js +2 -1
- package/src/utils/numbers.ts +61 -0
- package/src/utils/responsive.types.ts +12 -0
- package/src/utils/{slot.js → slot.ts} +18 -1
- package/style.js +3 -12
- package/theme.d.ts +1 -0
- package/.env +0 -1
- package/.eslintignore +0 -4
- package/.eslintrc.js +0 -47
- package/.pkg +0 -11
- package/babel.config.js +0 -5
- package/build/Dockerfile +0 -31
- package/ci/ci.yml +0 -54
- package/components-webpack.js +0 -29
- package/dist/environment-e70e5768.mjs +0 -1664
- package/dist/style.css +0 -1
- package/plugins.js +0 -17
- package/postcss.config.js +0 -1
- package/src/components/BaseAutocomplete/BaseAutocomplete.spec.js +0 -506
- package/src/components/BaseAutocomplete/BaseAutocomplete.stories.js +0 -184
- package/src/components/BaseAutocomplete/BaseAutocomplete.vue +0 -431
- package/src/components/BaseBanner/BaseBanner.spec.js +0 -32
- package/src/components/BaseBanner/BaseBanner.stories.js +0 -133
- package/src/components/BaseBanner/BaseBanner.vue +0 -229
- package/src/components/BaseButton/BaseButton.spec.js +0 -98
- package/src/components/BaseButton/BaseButton.stories.js +0 -291
- package/src/components/BaseButton/BaseButton.vue +0 -193
- package/src/components/BaseButton/__snapshots__/BaseButton.spec.js.snap +0 -37
- package/src/components/BaseButton/__snapshots__/BaseButton.spec.js.snap.old +0 -31
- package/src/components/BaseCheckbox/BaseCheckbox.stories.js +0 -82
- package/src/components/BaseCheckbox/BaseCheckbox.vue +0 -161
- package/src/components/BaseDropdownMenu/BaseDropdownMenu.stories.js +0 -84
- package/src/components/BaseDropdownMenu/BaseDropdownMenu.vue +0 -251
- package/src/components/BaseDropdownMenu/BaseDropdownMenuButton.vue +0 -26
- package/src/components/BaseDropdownMenu/BaseDropdownMenuDivider.vue +0 -10
- package/src/components/BaseDropdownMenu/BaseDropdownMenuItem.vue +0 -206
- package/src/components/BaseDropdownMenu/BaseDropdownMenuSearch.vue +0 -49
- package/src/components/BaseDropdownMenu/BaseDropdownMenuTitle.vue +0 -26
- package/src/components/BaseModal/BaseModal.stories.js +0 -143
- package/src/components/BaseModal/BaseModal.vue +0 -187
- package/src/components/BaseModal/BaseModalContent.vue +0 -164
- package/src/components/BaseModal/BaseModalContentOld.vue +0 -242
- package/src/components/BaseRating/BaseRating.spec.js +0 -46
- package/src/components/BaseRating/BaseRating.stories.js +0 -46
- package/src/components/BaseRating/BaseRating.vue +0 -119
- package/src/components/BaseSelect/BaseSelect.stories.js +0 -177
- package/src/components/BaseSelect/BaseSelect.vue +0 -443
- package/src/components/BaseSelect/BaseSelectGroup.vue +0 -34
- package/src/components/BaseSelect/BaseSelectOption.vue +0 -219
- package/src/components/BaseSwitch/BaseSwitch.stories.js +0 -44
- package/src/components/BaseSwitch/BaseSwitch.vue +0 -114
- package/src/components/BaseTag/BaseTag.stories.js +0 -123
- package/src/components/BaseTag/BaseTag.vue +0 -244
- package/src/css/button.postcss +0 -354
- package/src/css/checkbox-radio.postcss +0 -152
- package/src/css/icon.postcss +0 -9
- package/src/css/loader.postcss +0 -120
- package/src/css/popper.postcss +0 -143
- package/src/css/tailwind-utilities.postcss +0 -1
- package/src/css/tailwind.postcss +0 -2
- package/style-postcss.d.ts +0 -3
- package/style-postcss.js +0 -2
- package/tailwind.config.base.cjs +0 -88
- package/tailwind.config.js +0 -9
- package/tsconfig.check.json +0 -13
- package/tsconfig.json +0 -66
- package/vite.config.js +0 -43
- package/vitest.setup.js +0 -26
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, ref, type Slot } from 'vue'
|
|
3
|
+
|
|
4
|
+
interface UiDialogMarketplaceHeaderProps {
|
|
5
|
+
icon?: string
|
|
6
|
+
logo?: string
|
|
7
|
+
title: string
|
|
8
|
+
description?: string
|
|
9
|
+
gradientColor?: string
|
|
10
|
+
images?: string[]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const props = withDefaults(defineProps<UiDialogMarketplaceHeaderProps>(), {
|
|
14
|
+
icon: undefined,
|
|
15
|
+
logo: undefined,
|
|
16
|
+
description: undefined,
|
|
17
|
+
gradientColor: '#0b42c3', // Default primary color
|
|
18
|
+
images: () => [],
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
defineSlots<{
|
|
22
|
+
switch(): Slot
|
|
23
|
+
carousel(): Slot
|
|
24
|
+
}>()
|
|
25
|
+
|
|
26
|
+
// Convert hex to HSL for gradient
|
|
27
|
+
const hexToHSL = (hex: string) => {
|
|
28
|
+
// Remove # if present
|
|
29
|
+
const sanitizedHex = hex.replace('#', '')
|
|
30
|
+
|
|
31
|
+
// Convert hex to RGB
|
|
32
|
+
const r = Number.parseInt(sanitizedHex.substring(0, 2), 16) / 255
|
|
33
|
+
const g = Number.parseInt(sanitizedHex.substring(2, 4), 16) / 255
|
|
34
|
+
const b = Number.parseInt(sanitizedHex.substring(4, 6), 16) / 255
|
|
35
|
+
|
|
36
|
+
const max = Math.max(r, g, b)
|
|
37
|
+
const min = Math.min(r, g, b)
|
|
38
|
+
let h = 0
|
|
39
|
+
|
|
40
|
+
if (max !== min) {
|
|
41
|
+
const d = max - min
|
|
42
|
+
if (max === r) {
|
|
43
|
+
h = ((g - b) / d + (g < b ? 6 : 0)) / 6
|
|
44
|
+
} else if (max === g) {
|
|
45
|
+
h = ((b - r) / d + 2) / 6
|
|
46
|
+
} else {
|
|
47
|
+
h = ((r - g) / d + 4) / 6
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return Math.round(h * 360)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const hue = computed(() => hexToHSL(props.gradientColor))
|
|
55
|
+
|
|
56
|
+
// Current image index for simple carousel
|
|
57
|
+
const currentImageIndex = ref(0)
|
|
58
|
+
|
|
59
|
+
const hasImages = computed(() => props.images.length > 0)
|
|
60
|
+
|
|
61
|
+
const nextImage = () => {
|
|
62
|
+
if (props.images.length > 0) {
|
|
63
|
+
currentImageIndex.value = (currentImageIndex.value + 1) % props.images.length
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const prevImage = () => {
|
|
68
|
+
if (props.images.length > 0) {
|
|
69
|
+
currentImageIndex.value = (currentImageIndex.value - 1 + props.images.length) % props.images.length
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const goToImage = (index: number) => {
|
|
74
|
+
currentImageIndex.value = index
|
|
75
|
+
}
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
<template>
|
|
79
|
+
<div
|
|
80
|
+
class="py-16 max-sm:py-8 flex transition-all duration-100 ease-in items-center custom-gradient bg-no-repeat bg-left-bottom"
|
|
81
|
+
>
|
|
82
|
+
<div class="w-full flex items-center relative">
|
|
83
|
+
<div class="grid grid-cols-1 md:grid-cols-[280px_1fr] w-full px-8 lg:px-16 gap-8">
|
|
84
|
+
<!-- Left side: Icon/Logo + Title + Description + Switch -->
|
|
85
|
+
<div class="flex flex-col justify-center w-full">
|
|
86
|
+
<div class="flex flex-col flex-wrap gap-4 w-full">
|
|
87
|
+
<!-- Icon -->
|
|
88
|
+
<div
|
|
89
|
+
v-if="icon"
|
|
90
|
+
class="w-12 h-12 grid place-items-center bg-cover bg-center bg-no-repeat rounded-full bg-surface-primary-alpha-100"
|
|
91
|
+
>
|
|
92
|
+
<span :class="[icon, 'text-2xl text-text-primary-base']" />
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<!-- Logo -->
|
|
96
|
+
<div
|
|
97
|
+
v-else-if="logo"
|
|
98
|
+
class="w-12 h-12 flex-none bg-center bg-contain bg-no-repeat rounded-full"
|
|
99
|
+
:style="{ backgroundImage: `url(${logo})` }"
|
|
100
|
+
/>
|
|
101
|
+
|
|
102
|
+
<!-- Title and Description -->
|
|
103
|
+
<div class="flex flex-col gap-2 flex-1 min-w-0">
|
|
104
|
+
<h2 class="text-text-neutral-base text-title-md-bold">
|
|
105
|
+
{{ title }}
|
|
106
|
+
</h2>
|
|
107
|
+
<p
|
|
108
|
+
v-if="description"
|
|
109
|
+
class="text-text-neutral-secondary text-content-text-lg-regular"
|
|
110
|
+
>
|
|
111
|
+
{{ description }}
|
|
112
|
+
</p>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<!-- Switch/Toggle Slot -->
|
|
116
|
+
<div
|
|
117
|
+
v-if="$slots.switch"
|
|
118
|
+
class="transition-all duration-400 ease-in-out"
|
|
119
|
+
>
|
|
120
|
+
<slot name="switch" />
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<!-- Right side: Carousel or custom content -->
|
|
126
|
+
<div class="w-full grid place-items-center">
|
|
127
|
+
<div class="grid relative place-items-center pt-8 lg:pt-0">
|
|
128
|
+
<!-- Custom carousel slot -->
|
|
129
|
+
<slot name="carousel">
|
|
130
|
+
<!-- Default carousel implementation -->
|
|
131
|
+
<div
|
|
132
|
+
v-if="hasImages"
|
|
133
|
+
class="relative w-full aspect-video bg-surface-neutral-alpha-100 rounded-lg overflow-hidden"
|
|
134
|
+
>
|
|
135
|
+
<!-- Images -->
|
|
136
|
+
<TransitionGroup name="fade">
|
|
137
|
+
<img
|
|
138
|
+
v-for="(image, index) in images"
|
|
139
|
+
v-show="index === currentImageIndex"
|
|
140
|
+
:key="image"
|
|
141
|
+
:src="image"
|
|
142
|
+
:alt="`Screenshot ${index + 1}`"
|
|
143
|
+
class="absolute inset-0 w-full h-full object-cover"
|
|
144
|
+
>
|
|
145
|
+
</TransitionGroup>
|
|
146
|
+
|
|
147
|
+
<!-- Navigation arrows -->
|
|
148
|
+
<button
|
|
149
|
+
v-if="images.length > 1"
|
|
150
|
+
class="absolute left-4 top-1/2 -translate-y-1/2 w-8 h-8 rounded-full bg-surface-neutral-bg-main/80 backdrop-blur-xs flex items-center justify-center hover:bg-surface-neutral-bg-main transition-colors"
|
|
151
|
+
@click="prevImage"
|
|
152
|
+
>
|
|
153
|
+
<span class="i-ls-chevron-left w-4 h-4 text-text-neutral-base" />
|
|
154
|
+
</button>
|
|
155
|
+
<button
|
|
156
|
+
v-if="images.length > 1"
|
|
157
|
+
class="absolute right-4 top-1/2 -translate-y-1/2 w-8 h-8 rounded-full bg-surface-neutral-bg-main/80 backdrop-blur-xs flex items-center justify-center hover:bg-surface-neutral-bg-main transition-colors"
|
|
158
|
+
@click="nextImage"
|
|
159
|
+
>
|
|
160
|
+
<span class="i-ls-chevron-right w-4 h-4 text-text-neutral-base" />
|
|
161
|
+
</button>
|
|
162
|
+
|
|
163
|
+
<!-- Dots indicator -->
|
|
164
|
+
<div
|
|
165
|
+
v-if="images.length > 1"
|
|
166
|
+
class="absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-2"
|
|
167
|
+
>
|
|
168
|
+
<button
|
|
169
|
+
v-for="(_, index) in images"
|
|
170
|
+
:key="index"
|
|
171
|
+
:class="[
|
|
172
|
+
'w-2 h-2 rounded-full transition-all',
|
|
173
|
+
index === currentImageIndex
|
|
174
|
+
? 'bg-surface-neutral-bg-main w-6'
|
|
175
|
+
: 'bg-surface-neutral-bg-main/50',
|
|
176
|
+
]"
|
|
177
|
+
@click="goToImage(index)"
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<!-- Placeholder when no images -->
|
|
183
|
+
<div
|
|
184
|
+
v-else
|
|
185
|
+
class="w-full aspect-video min-h-[288px] bg-surface-neutral-alpha-100 rounded-lg flex items-center justify-center"
|
|
186
|
+
>
|
|
187
|
+
<span class="text-text-neutral-tertiary text-content-text-md-regular">
|
|
188
|
+
Integration Screenshots
|
|
189
|
+
</span>
|
|
190
|
+
</div>
|
|
191
|
+
</slot>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
</template>
|
|
198
|
+
|
|
199
|
+
<style scoped>
|
|
200
|
+
.custom-gradient {
|
|
201
|
+
background:
|
|
202
|
+
radial-gradient(57.62% 57.62% at 8.3% 63.87%, hsla(v-bind(hue), 89%, 61%, 0.2) 0%, hsla(v-bind(hue), 71%, 99%, 0) 100%),
|
|
203
|
+
radial-gradient(45.83% 45.83% at 93.65% 51.82%, hsla(v-bind(hue), 89%, 61%, 0.1) 0%, hsla(0, 0%, 100%, 0.1) 100%),
|
|
204
|
+
linear-gradient(0deg, #FFFFFF, #FFFFFF);
|
|
205
|
+
background-attachment: fixed;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.fade-enter-active,
|
|
209
|
+
.fade-leave-active {
|
|
210
|
+
transition: opacity 0.5s ease;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.fade-enter-from,
|
|
214
|
+
.fade-leave-to {
|
|
215
|
+
opacity: 0;
|
|
216
|
+
}
|
|
217
|
+
</style>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# UiDialog
|
|
2
|
+
|
|
3
|
+
A modal dialog component built on top of [reka-ui](https://reka-ui.com/docs/components/dialog) with built-in open/close animations, scroll detection, and footer border.
|
|
4
|
+
|
|
5
|
+
## Components
|
|
6
|
+
|
|
7
|
+
- `UiDialog` - Root wrapper (controls open/close state)
|
|
8
|
+
- `UiDialogContent` - The dialog panel (overlay, header, content, footer)
|
|
9
|
+
- `UiDialogTrigger` - Optional inline trigger button
|
|
10
|
+
- `UiDialogFooter` - Convenience layout for footer action buttons
|
|
11
|
+
|
|
12
|
+
## Basic Usage
|
|
13
|
+
|
|
14
|
+
### Child component (the modal)
|
|
15
|
+
|
|
16
|
+
Use `useVModel` from `@vueuse/core` to create a two-way binding for the `open` prop:
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<script setup lang="ts">
|
|
20
|
+
import { useVModel } from '@vueuse/core'
|
|
21
|
+
|
|
22
|
+
const props = defineProps<{
|
|
23
|
+
open: boolean
|
|
24
|
+
}>()
|
|
25
|
+
|
|
26
|
+
const emit = defineEmits<{
|
|
27
|
+
'update:open': [value: boolean]
|
|
28
|
+
}>()
|
|
29
|
+
|
|
30
|
+
const isOpen = useVModel(props, 'open', emit)
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<template>
|
|
34
|
+
<UiDialog v-model:open="isOpen">
|
|
35
|
+
<UiDialogContent title="My Dialog">
|
|
36
|
+
<p>Dialog content goes here.</p>
|
|
37
|
+
|
|
38
|
+
<template #footer>
|
|
39
|
+
<UiDialogFooter>
|
|
40
|
+
<UiButton variant="secondary" color="neutral" @click="isOpen = false">
|
|
41
|
+
Cancel
|
|
42
|
+
</UiButton>
|
|
43
|
+
<UiButton variant="cta" color="primary" @click="handleConfirm">
|
|
44
|
+
Confirm
|
|
45
|
+
</UiButton>
|
|
46
|
+
</UiDialogFooter>
|
|
47
|
+
</template>
|
|
48
|
+
</UiDialogContent>
|
|
49
|
+
</UiDialog>
|
|
50
|
+
</template>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Parent component
|
|
54
|
+
|
|
55
|
+
Control the dialog from the parent using `v-model:open`:
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<script setup lang="ts">
|
|
59
|
+
import { ref } from 'vue'
|
|
60
|
+
import MyModal from './MyModal.vue'
|
|
61
|
+
|
|
62
|
+
const isModalOpen = ref(false)
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<template>
|
|
66
|
+
<button @click="isModalOpen = true">Open</button>
|
|
67
|
+
<MyModal v-model:open="isModalOpen" />
|
|
68
|
+
</template>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## How open/close works
|
|
72
|
+
|
|
73
|
+
1. The parent binds a `ref` via `v-model:open` on the child modal component
|
|
74
|
+
2. The child forwards it to `<UiDialog v-model:open="isOpen">` using `useVModel`
|
|
75
|
+
3. reka-ui's `DialogRoot` manages the actual visibility
|
|
76
|
+
4. On close, reka-ui sets `data-state="closed"` on overlay and content, waits for CSS animations to finish, then unmounts
|
|
77
|
+
|
|
78
|
+
**Important:** Never use `v-if` on the modal component itself — this would unmount the component before reka-ui can play the close animation. Always use `v-model:open` to let reka-ui control visibility.
|
|
79
|
+
|
|
80
|
+
## Closing the dialog
|
|
81
|
+
|
|
82
|
+
From the **template**, assign directly (Vue auto-unwraps refs):
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<UiButton @click="isOpen = false">Cancel</UiButton>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
From the **script**, use `.value`:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
async function handleSubmit() {
|
|
92
|
+
await doSomething()
|
|
93
|
+
isOpen.value = false
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The built-in close button (X) is handled automatically by reka-ui's `DialogClose`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- UiDialog.vue -->
|
|
2
|
+
<script setup lang="ts">
|
|
3
|
+
import type { DialogRootEmits, DialogRootProps } from 'reka-ui'
|
|
4
|
+
import { DialogRoot, useForwardPropsEmits } from 'reka-ui'
|
|
5
|
+
|
|
6
|
+
const props = defineProps<DialogRootProps>()
|
|
7
|
+
const emits = defineEmits<DialogRootEmits>()
|
|
8
|
+
|
|
9
|
+
const forwarded = useForwardPropsEmits(props, emits)
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<DialogRoot v-bind="{ ...forwarded, ...$attrs }">
|
|
14
|
+
<slot />
|
|
15
|
+
</DialogRoot>
|
|
16
|
+
</template>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { DialogClose } from 'reka-ui';
|
|
3
|
+
import UiButton from '../UiButton/UiButton.vue';
|
|
4
|
+
|
|
5
|
+
interface UiDialogCloseProps {
|
|
6
|
+
ariaLabel?: string;
|
|
7
|
+
mode?: 'light' | 'dark';
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
withDefaults(defineProps<UiDialogCloseProps>(), {
|
|
11
|
+
ariaLabel: 'Close',
|
|
12
|
+
mode: 'light',
|
|
13
|
+
});
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<DialogClose
|
|
18
|
+
as-child
|
|
19
|
+
>
|
|
20
|
+
<UiButton
|
|
21
|
+
variant="tertiary"
|
|
22
|
+
color="neutral"
|
|
23
|
+
size="md"
|
|
24
|
+
icon="i-ls-x-stream"
|
|
25
|
+
:aria-label="ariaLabel"
|
|
26
|
+
:data-colors-semantic="mode"
|
|
27
|
+
/>
|
|
28
|
+
</DialogClose>
|
|
29
|
+
</template>
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useMutationObserver, useThrottleFn } from '@vueuse/core'
|
|
3
|
+
import i18n from 'i18next'
|
|
4
|
+
import type { DialogContentEmits, DialogContentProps } from 'reka-ui'
|
|
5
|
+
import {
|
|
6
|
+
DialogContent,
|
|
7
|
+
DialogDescription,
|
|
8
|
+
DialogOverlay,
|
|
9
|
+
DialogPortal,
|
|
10
|
+
DialogTitle,
|
|
11
|
+
useForwardPropsEmits,
|
|
12
|
+
VisuallyHidden,
|
|
13
|
+
} from 'reka-ui'
|
|
14
|
+
import { computed, ref, useAttrs, watch } from 'vue'
|
|
15
|
+
import UiDialogClose from './UiDialogClose.vue'
|
|
16
|
+
|
|
17
|
+
interface UiDialogContentProps extends DialogContentProps {
|
|
18
|
+
title?: string
|
|
19
|
+
description?: string
|
|
20
|
+
hideClose?: boolean
|
|
21
|
+
closeButtonAriaLabel?: string
|
|
22
|
+
overlayClass?: string
|
|
23
|
+
contentMode?: 'light' | 'dark'
|
|
24
|
+
closeButtonMode?: 'light' | 'dark'
|
|
25
|
+
size?: 'sm' | 'lg' | '2xl' | '3xl' | '5xl' | '7xl'
|
|
26
|
+
noPadding?: boolean
|
|
27
|
+
/** When true, disables default scroll handling on the content wrapper, allowing custom scroll behavior */
|
|
28
|
+
customScroll?: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const props = withDefaults(defineProps<UiDialogContentProps>(), {
|
|
32
|
+
title: undefined,
|
|
33
|
+
description: undefined,
|
|
34
|
+
hideClose: false,
|
|
35
|
+
closeButtonAriaLabel: i18n.t('general_close'),
|
|
36
|
+
overlayClass: '',
|
|
37
|
+
contentMode: 'light',
|
|
38
|
+
closeButtonMode: undefined,
|
|
39
|
+
size: 'lg',
|
|
40
|
+
noPadding: false,
|
|
41
|
+
customScroll: false,
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const sizeClasses: Record<string, string> = {
|
|
45
|
+
sm: 'max-w-sm',
|
|
46
|
+
lg: 'max-w-lg',
|
|
47
|
+
'2xl': 'max-w-2xl',
|
|
48
|
+
'3xl': 'max-w-3xl',
|
|
49
|
+
'5xl': 'max-w-5xl',
|
|
50
|
+
'7xl': 'max-w-7xl',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const widthClass = computed(() => sizeClasses[props.size] ?? '')
|
|
54
|
+
|
|
55
|
+
const emits = defineEmits<DialogContentEmits>()
|
|
56
|
+
|
|
57
|
+
// Forward only the DialogContentProps, not our custom props
|
|
58
|
+
const forwarded = useForwardPropsEmits(props, emits)
|
|
59
|
+
|
|
60
|
+
// Scroll detection for conditional footer border
|
|
61
|
+
const contentRef = ref<HTMLElement | null>(null)
|
|
62
|
+
const hasScroll = ref(false)
|
|
63
|
+
|
|
64
|
+
function checkScroll () {
|
|
65
|
+
if (contentRef.value) {
|
|
66
|
+
hasScroll.value = contentRef.value.scrollHeight > contentRef.value.clientHeight
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const throttledCheckScroll = useThrottleFn(checkScroll, 100)
|
|
71
|
+
|
|
72
|
+
const attrs = useAttrs();
|
|
73
|
+
const accessibleTitle = computed(
|
|
74
|
+
() =>
|
|
75
|
+
props.title ||
|
|
76
|
+
(attrs['aria-label'] as string) ||
|
|
77
|
+
i18n.t('general_dialog_title'),
|
|
78
|
+
);
|
|
79
|
+
const accessibleDescription = computed(
|
|
80
|
+
() =>
|
|
81
|
+
props.description ||
|
|
82
|
+
(attrs['aria-description'] as string),
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
watch(contentRef, (el) => {
|
|
86
|
+
if (el) {
|
|
87
|
+
checkScroll() // Immediate, not throttled
|
|
88
|
+
}
|
|
89
|
+
}, { immediate: true })
|
|
90
|
+
|
|
91
|
+
useMutationObserver(contentRef, () => {
|
|
92
|
+
throttledCheckScroll() // Throttled for performance
|
|
93
|
+
}, {
|
|
94
|
+
childList: true,
|
|
95
|
+
subtree: true,
|
|
96
|
+
attributes: true,
|
|
97
|
+
attributeFilter: ['style', 'class'],
|
|
98
|
+
})
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<template>
|
|
102
|
+
<DialogPortal>
|
|
103
|
+
<DialogOverlay
|
|
104
|
+
:class="[
|
|
105
|
+
'fixed inset-0 bg-surface-overlay-alpha z-50',
|
|
106
|
+
'ui-dialog-overlay',
|
|
107
|
+
overlayClass,
|
|
108
|
+
]"
|
|
109
|
+
/>
|
|
110
|
+
<div class="fixed inset-0 z-50 flex items-center justify-center pointer-events-none">
|
|
111
|
+
<DialogContent
|
|
112
|
+
v-bind="{ ...forwarded, ...$attrs }"
|
|
113
|
+
:class="[
|
|
114
|
+
'bg-surface-neutral-bg-main rounded-2xl pointer-events-auto focus-indicator-none',
|
|
115
|
+
'shadow-shadows-drop-shadow-2xl',
|
|
116
|
+
'w-[95vw] max-h-[85vh]',
|
|
117
|
+
widthClass,
|
|
118
|
+
'overflow-hidden flex flex-col',
|
|
119
|
+
'ui-dialog-content animate-fade-scale',
|
|
120
|
+
'focus:outline-hidden focus-indicator-none',
|
|
121
|
+
'm-2',
|
|
122
|
+
!noPadding && 'py-6'
|
|
123
|
+
]"
|
|
124
|
+
:data-colors-semantic="contentMode"
|
|
125
|
+
>
|
|
126
|
+
<VisuallyHidden
|
|
127
|
+
v-if="!title && accessibleTitle"
|
|
128
|
+
as-child
|
|
129
|
+
>
|
|
130
|
+
<DialogTitle>{{ accessibleTitle }}</DialogTitle>
|
|
131
|
+
</VisuallyHidden>
|
|
132
|
+
<!-- Header -->
|
|
133
|
+
<div
|
|
134
|
+
v-if="title || !hideClose"
|
|
135
|
+
:class="[
|
|
136
|
+
'flex justify-between flex-col',
|
|
137
|
+
!noPadding && 'px-6',
|
|
138
|
+
]"
|
|
139
|
+
>
|
|
140
|
+
<div
|
|
141
|
+
class="flex-1 flex flex-row items-center min-h-10"
|
|
142
|
+
:class="{'justify-between': !!title, 'justify-end': !title}"
|
|
143
|
+
>
|
|
144
|
+
<DialogTitle
|
|
145
|
+
v-if="title"
|
|
146
|
+
class="text-title-sm-bold text-text-neutral-base"
|
|
147
|
+
>
|
|
148
|
+
{{ title }}
|
|
149
|
+
</DialogTitle>
|
|
150
|
+
|
|
151
|
+
<UiDialogClose
|
|
152
|
+
v-if="!hideClose"
|
|
153
|
+
:aria-label="closeButtonAriaLabel"
|
|
154
|
+
:mode="closeButtonMode ?? contentMode"
|
|
155
|
+
:class="{
|
|
156
|
+
'ml-4': !noPadding
|
|
157
|
+
}"
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
|
|
162
|
+
<VisuallyHidden
|
|
163
|
+
v-if="!description && accessibleDescription"
|
|
164
|
+
as-child
|
|
165
|
+
>
|
|
166
|
+
<DialogDescription>{{ accessibleDescription }}</DialogDescription>
|
|
167
|
+
</VisuallyHidden>
|
|
168
|
+
<DialogDescription
|
|
169
|
+
v-if="description"
|
|
170
|
+
class="text-content-text-md-regular text-text-neutral-secondary"
|
|
171
|
+
:class="{
|
|
172
|
+
'pt-6 px-6': !noPadding,
|
|
173
|
+
'pb-6': !$slots.footer && !$slots.default,
|
|
174
|
+
'pb-2': $slots.footer || $slots.default
|
|
175
|
+
}"
|
|
176
|
+
>
|
|
177
|
+
{{ description }}
|
|
178
|
+
</DialogDescription>
|
|
179
|
+
|
|
180
|
+
<!-- Content Slot -->
|
|
181
|
+
<div
|
|
182
|
+
v-if="$slots.default"
|
|
183
|
+
ref="contentRef"
|
|
184
|
+
:class="[
|
|
185
|
+
!noPadding && 'px-6',
|
|
186
|
+
!noPadding && (title || description || !hideClose ? 'pt-4' : 'pt-6'),
|
|
187
|
+
!noPadding && $slots.footer && 'pb-4',
|
|
188
|
+
!customScroll && 'overflow-y-auto',
|
|
189
|
+
'min-h-0 flex-1',
|
|
190
|
+
]"
|
|
191
|
+
>
|
|
192
|
+
<slot />
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<!-- Footer Slot (optional) -->
|
|
196
|
+
<div
|
|
197
|
+
v-if="$slots.footer"
|
|
198
|
+
:class="[
|
|
199
|
+
!noPadding && 'px-6 pt-6',
|
|
200
|
+
hasScroll && 'border-t border-borders-neutral-light',
|
|
201
|
+
]"
|
|
202
|
+
>
|
|
203
|
+
<slot name="footer" />
|
|
204
|
+
</div>
|
|
205
|
+
</DialogContent>
|
|
206
|
+
</div>
|
|
207
|
+
</DialogPortal>
|
|
208
|
+
</template>
|
|
209
|
+
|
|
210
|
+
<style scoped>
|
|
211
|
+
@keyframes fade-in {
|
|
212
|
+
from { opacity: 0; }
|
|
213
|
+
to { opacity: 1; }
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
@keyframes fade-out {
|
|
217
|
+
from { opacity: 1; }
|
|
218
|
+
to { opacity: 0; }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* Overlay animations */
|
|
222
|
+
.ui-dialog-overlay[data-state='open'] {
|
|
223
|
+
animation: fade-in 150ms ease-out;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.ui-dialog-overlay[data-state='closed'] {
|
|
227
|
+
animation: fade-out 150ms ease-in;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Content animations */
|
|
231
|
+
.ui-dialog-content[data-state='open'] {
|
|
232
|
+
animation: fade-scale 200ms ease-out;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.ui-dialog-content[data-state='closed'] {
|
|
236
|
+
animation: fade-scale 150ms ease-in reverse;
|
|
237
|
+
}
|
|
238
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { DialogTriggerProps } from 'reka-ui'
|
|
3
|
+
import { DialogTrigger } from 'reka-ui'
|
|
4
|
+
|
|
5
|
+
defineProps<DialogTriggerProps>()
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<DialogTrigger v-bind="$attrs">
|
|
10
|
+
<slot />
|
|
11
|
+
</DialogTrigger>
|
|
12
|
+
</template>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// UiDialog exports
|
|
2
|
+
export { default as UiDialog } from './UiDialog.vue'
|
|
3
|
+
export { default as UiDialogTrigger } from './UiDialogTrigger.vue'
|
|
4
|
+
export { default as UiDialogContent } from './UiDialogContent.vue'
|
|
5
|
+
export { default as UiDialogFooter } from './UiDialogFooter.vue'
|
|
6
|
+
export { default as UiDialogClose } from './UiDialogClose.vue'
|
|
7
|
+
export { default as UiDialogMarketplaceHeader } from './MarketplaceHeaderExample.vue'
|
|
8
|
+
|
|
9
|
+
// Re-export useful Reka UI types and components for advanced usage
|
|
10
|
+
export {
|
|
11
|
+
DialogClose,
|
|
12
|
+
DialogDescription,
|
|
13
|
+
DialogTitle,
|
|
14
|
+
type DialogRootProps,
|
|
15
|
+
type DialogRootEmits,
|
|
16
|
+
type DialogContentProps,
|
|
17
|
+
type DialogContentEmits,
|
|
18
|
+
} from 'reka-ui'
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SelectRootEmits, SelectRootProps } from 'reka-ui'
|
|
3
|
+
import { SelectRoot, useForwardPropsEmits } from 'reka-ui'
|
|
4
|
+
import { computed, provide } from 'vue'
|
|
5
|
+
import { UI_DROPDOWN_MULTIPLE_KEY } from './context'
|
|
6
|
+
|
|
7
|
+
// `SelectRoot` accepts many more props than we expose here; explicit prop
|
|
8
|
+
// declarations are documentation-driven. Storybook autodocs and Vue's
|
|
9
|
+
// `defineProps` cannot introspect external types like `SelectRootProps`,
|
|
10
|
+
// so anything we want surfaced in editor/type/docs must be listed here.
|
|
11
|
+
// Everything else passes through via `useForwardPropsEmits` + `$attrs`.
|
|
12
|
+
interface Props extends SelectRootProps {
|
|
13
|
+
/**
|
|
14
|
+
* Selected value. Pass a `string` for single-select, or a `string[]` when
|
|
15
|
+
* `multiple` is enabled.
|
|
16
|
+
*/
|
|
17
|
+
modelValue?: string | string[]
|
|
18
|
+
/**
|
|
19
|
+
* Enable multi-select mode. When set, `v-model` must be bound to an array;
|
|
20
|
+
* clicking an option toggles its value and the menu stays open between
|
|
21
|
+
* selections.
|
|
22
|
+
*/
|
|
23
|
+
multiple?: boolean
|
|
24
|
+
/** Open the dropdown on mount (uncontrolled). */
|
|
25
|
+
defaultOpen?: boolean
|
|
26
|
+
/** Disable the entire dropdown. */
|
|
27
|
+
disabled?: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
31
|
+
modelValue: undefined,
|
|
32
|
+
multiple: false,
|
|
33
|
+
defaultOpen: false,
|
|
34
|
+
disabled: false,
|
|
35
|
+
})
|
|
36
|
+
const emits = defineEmits<SelectRootEmits>()
|
|
37
|
+
|
|
38
|
+
const forwarded = useForwardPropsEmits(props, emits)
|
|
39
|
+
|
|
40
|
+
// Expose `multiple` to descendant `UiDropdownItem`s so they can render the
|
|
41
|
+
// leading checkbox automatically in multi-select mode.
|
|
42
|
+
provide(UI_DROPDOWN_MULTIPLE_KEY, computed(() => props.multiple))
|
|
43
|
+
</script>
|
|
44
|
+
<template>
|
|
45
|
+
<SelectRoot v-bind="{ ...forwarded, ...$attrs }">
|
|
46
|
+
<slot />
|
|
47
|
+
</SelectRoot>
|
|
48
|
+
</template>
|