@livestorm/ui-vue 1.1.3 → 2.0.1
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 +154 -32
- package/components-vite.js +5 -5
- package/components.d.ts +3 -3
- package/dist/UiTimelineItem.vue_vue_type_style_index_0_lang-BN5208td.mjs +5452 -0
- package/dist/a11y--y7uaY4j.mjs +217 -0
- package/dist/breakpoints.mjs +9 -0
- package/dist/bus.mjs +5 -0
- package/dist/components.mjs +215 -1663
- package/dist/index.mjs +85 -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 +280 -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 +41 -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 +146 -0
- package/index.d.ts +88 -2
- package/index.js +169 -16
- package/integrations.d.ts +10 -0
- package/package.json +130 -63
- 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 +322 -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 +81 -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 +481 -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 +36 -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 +68 -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 +81 -14
- 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 -49
- 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-da321c85.mjs +0 -1656
- 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 -300
- 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 -157
- package/src/components/BaseCheckbox/BaseCheckbox.vue +0 -180
- 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 -155
- package/src/components/BaseModal/BaseModal.vue +0 -187
- package/src/components/BaseModal/BaseModalContent.vue +0 -166
- package/src/components/BaseModal/BaseModalContentOld.vue +0 -242
- package/src/components/BaseRadio/BaseRadio.stories.js +0 -164
- package/src/components/BaseRadio/BaseRadio.vue +0 -153
- 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 -363
- package/src/css/checkbox-radio.postcss +0 -188
- package/src/css/icon.postcss +0 -9
- package/src/css/loader.postcss +0 -120
- package/src/css/popper.postcss +0 -161
- 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,513 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import LivestormLogo from '@livestorm/ui-tokens/output/vectors/logos/livestorm-white.svg'
|
|
3
|
+
import type { Slot } from 'vue'
|
|
4
|
+
import type { SideMenuCollapsedItem, SideMenuItemProps, SideMenuMoreItem } from './types'
|
|
5
|
+
import UiSideMenuItem from './UiSideMenuItem.vue'
|
|
6
|
+
import UiButton from '../UiButton/UiButton.vue'
|
|
7
|
+
import UiPopover from '../UiPopover/UiPopover.vue'
|
|
8
|
+
import UiPopoverTrigger from '../UiPopover/UiPopoverTrigger.vue'
|
|
9
|
+
import UiPopoverContent from '../UiPopover/UiPopoverContent.vue'
|
|
10
|
+
import { useMobileMenu } from '../../composables/useMobileMenu'
|
|
11
|
+
import i18next from 'i18next'
|
|
12
|
+
import { focusFirstMenuItem } from '../../utils'
|
|
13
|
+
import { computed, onBeforeUnmount, onMounted, provide, ref } from 'vue'
|
|
14
|
+
import { SIDE_MENU_LAYOUT_KEY } from './injection'
|
|
15
|
+
const { close, isOpen } = useMobileMenu()
|
|
16
|
+
|
|
17
|
+
// State for the responsive (short-height) more menu popover, which surfaces
|
|
18
|
+
// the otherwise-hidden #bottom slot items.
|
|
19
|
+
const isMoreMenuOpen = ref(false)
|
|
20
|
+
|
|
21
|
+
// State for the persistent "More" popover that holds collapsedMenuItems
|
|
22
|
+
// (Instant, Apps, Updates…). Shown at every height, independent of the
|
|
23
|
+
// short-height fallback above.
|
|
24
|
+
const isCollapsedMenuOpen = ref(false)
|
|
25
|
+
|
|
26
|
+
// Ref to the More button DOM element so the #bottom slot can anchor
|
|
27
|
+
// nested popovers to it on short-height screens.
|
|
28
|
+
const moreButtonEl = ref<HTMLElement | null>(null)
|
|
29
|
+
|
|
30
|
+
// Track whether the layout is in "short height" mode (More popover visible,
|
|
31
|
+
// bottom menu items hidden). Mirrors the CSS media queries below.
|
|
32
|
+
const isShortHeight = ref(false)
|
|
33
|
+
let shortHeightMql: MediaQueryList | null = null
|
|
34
|
+
|
|
35
|
+
const updateShortHeight = (e: MediaQueryListEvent | MediaQueryList) => {
|
|
36
|
+
isShortHeight.value = e.matches
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
onMounted(() => {
|
|
40
|
+
if (typeof window === 'undefined') return
|
|
41
|
+
shortHeightMql = window.matchMedia('(max-height: 768px) and (hover: hover) and (pointer: fine)')
|
|
42
|
+
isShortHeight.value = shortHeightMql.matches
|
|
43
|
+
shortHeightMql.addEventListener('change', updateShortHeight)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Track the mobile (full-screen overlay) layout — below the `md` breakpoint.
|
|
47
|
+
// The side menu spans the viewport there, so the "More" popover opens upward
|
|
48
|
+
// (side="top") instead of to the right, which would land off-screen.
|
|
49
|
+
const isMobile = ref(false)
|
|
50
|
+
let mobileMql: MediaQueryList | null = null
|
|
51
|
+
|
|
52
|
+
const updateIsMobile = (e: MediaQueryListEvent | MediaQueryList) => {
|
|
53
|
+
isMobile.value = e.matches
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
onMounted(() => {
|
|
57
|
+
if (typeof window === 'undefined') return
|
|
58
|
+
mobileMql = window.matchMedia('(width < 768px)')
|
|
59
|
+
isMobile.value = mobileMql.matches
|
|
60
|
+
mobileMql.addEventListener('change', updateIsMobile)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
onBeforeUnmount(() => {
|
|
64
|
+
shortHeightMql?.removeEventListener('change', updateShortHeight)
|
|
65
|
+
mobileMql?.removeEventListener('change', updateIsMobile)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
provide(SIDE_MENU_LAYOUT_KEY, {
|
|
69
|
+
isShortHeight,
|
|
70
|
+
moreButtonEl,
|
|
71
|
+
closeMoreMenu: () => { isMoreMenuOpen.value = false },
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
const slots = defineSlots<{
|
|
75
|
+
default?(): Slot
|
|
76
|
+
bottom?(): Slot
|
|
77
|
+
settingsMenu?(): Slot
|
|
78
|
+
/**
|
|
79
|
+
* Extra entries rendered inside the persistent "More" popover. Receives a
|
|
80
|
+
* `close` callback to dismiss the popover (e.g. when a nested popover opens).
|
|
81
|
+
*/
|
|
82
|
+
collapsedMenuExtra?(props: { close: () => void }): Slot
|
|
83
|
+
}>()
|
|
84
|
+
|
|
85
|
+
const props = withDefaults(defineProps<{
|
|
86
|
+
topMenuItems?: SideMenuItemProps[]
|
|
87
|
+
bottomMenuItems?: SideMenuItemProps[]
|
|
88
|
+
/**
|
|
89
|
+
* Proxy entries shown inside the More popover on short-height screens.
|
|
90
|
+
* Use these to surface #bottom slot items (Help, Updates, …) that are
|
|
91
|
+
* visually hidden in that layout.
|
|
92
|
+
*/
|
|
93
|
+
moreMenuItems?: SideMenuMoreItem[]
|
|
94
|
+
/**
|
|
95
|
+
* Entries shown inside the persistent "More" popover (the always-visible
|
|
96
|
+
* collapsed menu). Each entry can navigate (`to`/`href`) or run an
|
|
97
|
+
* `onClick` handler — e.g. Instant meeting, Apps, Updates.
|
|
98
|
+
*/
|
|
99
|
+
collapsedMenuItems?: SideMenuCollapsedItem[]
|
|
100
|
+
/**
|
|
101
|
+
* Notification indicator shown on the persistent "More" trigger — a count
|
|
102
|
+
* pill (number) or a dot (`true`). Use to surface counts from items hidden
|
|
103
|
+
* inside the collapsed popover (e.g. Updates).
|
|
104
|
+
*/
|
|
105
|
+
moreBadge?: number | boolean
|
|
106
|
+
showLivestormLogo?: boolean
|
|
107
|
+
// Accessibility labels
|
|
108
|
+
logoAlt?: string
|
|
109
|
+
closeMenuLabel?: string
|
|
110
|
+
mainNavigationLabel?: string
|
|
111
|
+
primaryNavigationLabel?: string
|
|
112
|
+
secondaryNavigationLabel?: string
|
|
113
|
+
toolsAndSettingsLabel?: string
|
|
114
|
+
skipToMainContentLabel?: string
|
|
115
|
+
organizationId?: string
|
|
116
|
+
}>(), {
|
|
117
|
+
showLivestormLogo: true,
|
|
118
|
+
logoAlt: 'Livestorm',
|
|
119
|
+
closeMenuLabel: 'Close navigation menu',
|
|
120
|
+
mainNavigationLabel: 'Main navigation',
|
|
121
|
+
primaryNavigationLabel: 'Primary navigation',
|
|
122
|
+
secondaryNavigationLabel: 'Secondary navigation',
|
|
123
|
+
toolsAndSettingsLabel: 'Tools and settings',
|
|
124
|
+
skipToMainContentLabel: 'Skip to main content',
|
|
125
|
+
organizationId: undefined,
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
const handleOpenAutoFocus = (event: Event) => {
|
|
129
|
+
focusFirstMenuItem(event)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const closeMoreMenu = () => {
|
|
133
|
+
isMoreMenuOpen.value = false
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const handleMoreProxyClick = (item: SideMenuMoreItem) => {
|
|
137
|
+
// Close More first, then defer the proxy action so the next popover
|
|
138
|
+
// (Help/Updates) opens cleanly anchored to the More button via injection.
|
|
139
|
+
closeMoreMenu()
|
|
140
|
+
setTimeout(() => item.onClick(), 0)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const closeCollapsedMenu = () => {
|
|
144
|
+
isCollapsedMenuOpen.value = false
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const handleCollapsedItemClick = (item: SideMenuCollapsedItem) => {
|
|
148
|
+
closeCollapsedMenu()
|
|
149
|
+
item.onClick?.()
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// On short-height screens the persistent collapsed popover also surfaces the
|
|
153
|
+
// #bottom slot proxies (Help). Mirror handleMoreProxyClick: close first, then
|
|
154
|
+
// defer so the proxied popover opens cleanly anchored to the More button.
|
|
155
|
+
const handleCollapsedProxyClick = (item: SideMenuMoreItem) => {
|
|
156
|
+
closeCollapsedMenu()
|
|
157
|
+
setTimeout(() => item.onClick(), 0)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const hasCollapsedMenu = computed(
|
|
161
|
+
() => (!!props.collapsedMenuItems && props.collapsedMenuItems.length > 0) || !!slots.collapsedMenuExtra,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
function handleLogoClick (event: MouseEvent) {
|
|
165
|
+
if (event.detail === 4) {
|
|
166
|
+
if (navigator.clipboard && props.organizationId) {
|
|
167
|
+
navigator.clipboard.writeText(props.organizationId)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
</script>
|
|
172
|
+
|
|
173
|
+
<template>
|
|
174
|
+
<div
|
|
175
|
+
class="p-4 md:pt-8 md:pb-2 h-full flex flex-col justify-between top-0 fixed md:relative w-full md:transition-none transition-all duration-300 bg-gradient-to-tl from-surface-primary-100 to-surface-primary-300 md:bg-none"
|
|
176
|
+
:class="{
|
|
177
|
+
'left-0 md:left-auto ': isOpen,
|
|
178
|
+
'-left-[100%] md:left-0': !isOpen,
|
|
179
|
+
}"
|
|
180
|
+
>
|
|
181
|
+
<!-- Skip link for accessibility -->
|
|
182
|
+
<router-link
|
|
183
|
+
to="/"
|
|
184
|
+
class="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-50 focus:bg-blue-600 focus:text-white focus:px-4 focus:py-2 focus:rounded bg-surface-overlay-alpha"
|
|
185
|
+
>
|
|
186
|
+
{{ skipToMainContentLabel }}
|
|
187
|
+
</router-link>
|
|
188
|
+
<!-- Top -->
|
|
189
|
+
<div class="flex flex-col md:items-center gap-8">
|
|
190
|
+
<div class="flex items-center justify-between">
|
|
191
|
+
<img
|
|
192
|
+
v-if="showLivestormLogo"
|
|
193
|
+
:src="LivestormLogo"
|
|
194
|
+
:alt="logoAlt"
|
|
195
|
+
class="w-10 h-10 ml-4 md:ml-0"
|
|
196
|
+
role="img"
|
|
197
|
+
@click="handleLogoClick"
|
|
198
|
+
>
|
|
199
|
+
<div class="md:hidden">
|
|
200
|
+
<UiButton
|
|
201
|
+
icon="i-ls-x-stream"
|
|
202
|
+
variant="tertiary"
|
|
203
|
+
color="neutral"
|
|
204
|
+
size="lg"
|
|
205
|
+
:aria-label="closeMenuLabel"
|
|
206
|
+
@click="close"
|
|
207
|
+
/>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<nav
|
|
212
|
+
v-if="topMenuItems"
|
|
213
|
+
class="flex flex-col md:gap-2"
|
|
214
|
+
role="navigation"
|
|
215
|
+
:aria-label="mainNavigationLabel"
|
|
216
|
+
>
|
|
217
|
+
<h2 class="sr-only">
|
|
218
|
+
{{ primaryNavigationLabel }}
|
|
219
|
+
</h2>
|
|
220
|
+
<ul
|
|
221
|
+
class="flex flex-col md:gap-2"
|
|
222
|
+
role="menubar"
|
|
223
|
+
>
|
|
224
|
+
<li
|
|
225
|
+
v-for="item in topMenuItems"
|
|
226
|
+
:key="`side-menu-item-${item.label}`"
|
|
227
|
+
role="menuitem"
|
|
228
|
+
>
|
|
229
|
+
<UiSideMenuItem
|
|
230
|
+
:label="item.label"
|
|
231
|
+
:icon="item.icon"
|
|
232
|
+
:to="item.to"
|
|
233
|
+
:href="item.href"
|
|
234
|
+
:is-active="item.isActive"
|
|
235
|
+
show-label-tooltip
|
|
236
|
+
/>
|
|
237
|
+
</li>
|
|
238
|
+
</ul>
|
|
239
|
+
</nav>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
<slot
|
|
243
|
+
v-if="slots.default"
|
|
244
|
+
name="default"
|
|
245
|
+
/>
|
|
246
|
+
|
|
247
|
+
<!-- Bottom -->
|
|
248
|
+
<div class="flex flex-col md:items-center mt-2">
|
|
249
|
+
<nav
|
|
250
|
+
class="flex flex-col md:gap-2"
|
|
251
|
+
role="navigation"
|
|
252
|
+
:aria-label="secondaryNavigationLabel"
|
|
253
|
+
>
|
|
254
|
+
<h2 class="sr-only">
|
|
255
|
+
{{ secondaryNavigationLabel }}
|
|
256
|
+
</h2>
|
|
257
|
+
<ul
|
|
258
|
+
v-if="bottomMenuItems"
|
|
259
|
+
class="flex flex-col md:gap-2 hidden-on-short-height"
|
|
260
|
+
role="menu"
|
|
261
|
+
>
|
|
262
|
+
<li
|
|
263
|
+
v-for="item in bottomMenuItems"
|
|
264
|
+
:key="`side-menu-item-${item.label}`"
|
|
265
|
+
role="listitem"
|
|
266
|
+
>
|
|
267
|
+
<UiSideMenuItem
|
|
268
|
+
:label="item.label"
|
|
269
|
+
:icon="item.icon"
|
|
270
|
+
:to="item.to"
|
|
271
|
+
:is-active="item.isActive"
|
|
272
|
+
/>
|
|
273
|
+
</li>
|
|
274
|
+
</ul>
|
|
275
|
+
|
|
276
|
+
<!--
|
|
277
|
+
Persistent "More" popover — the collapsed menu shown at every height.
|
|
278
|
+
Holds collapsedMenuItems (Instant, Apps, Updates…). Rendered before
|
|
279
|
+
the #bottom slot (Help) to match the design's ordering. Distinct from
|
|
280
|
+
the short-height fallback below, which only surfaces #bottom items.
|
|
281
|
+
-->
|
|
282
|
+
<div
|
|
283
|
+
v-if="hasCollapsedMenu"
|
|
284
|
+
ref="moreButtonEl"
|
|
285
|
+
class="more-menu-container"
|
|
286
|
+
>
|
|
287
|
+
<UiPopover v-model:open="isCollapsedMenuOpen">
|
|
288
|
+
<UiPopoverTrigger class="w-full cursor-pointer">
|
|
289
|
+
<UiSideMenuItem
|
|
290
|
+
:label="i18next.t('room_bottom-bar_controls-label_more')"
|
|
291
|
+
icon="i-ls-more-horizontal"
|
|
292
|
+
:is-active="false"
|
|
293
|
+
:inside-interactive="true"
|
|
294
|
+
:badge="moreBadge"
|
|
295
|
+
show-label-tooltip
|
|
296
|
+
/>
|
|
297
|
+
</UiPopoverTrigger>
|
|
298
|
+
<!--
|
|
299
|
+
force-mount keeps the popover (and its #collapsedMenuExtra slot,
|
|
300
|
+
e.g. the Headway "Updates" host) mounted on page load instead of
|
|
301
|
+
lazily on first open, so its notification count is available
|
|
302
|
+
immediately. It's hidden while closed so the menu only shows on open.
|
|
303
|
+
-->
|
|
304
|
+
<UiPopoverContent
|
|
305
|
+
force-mount
|
|
306
|
+
:side="isMobile ? 'top' : 'right'"
|
|
307
|
+
:align="isMobile ? 'center' : 'end'"
|
|
308
|
+
:side-offset="8"
|
|
309
|
+
:collision-padding="16"
|
|
310
|
+
class="border-none bg-surface-neutral-300 rounded-2xl shadow-shadows-drop-shadow-2xl overflow-hidden data-[state=closed]:hidden"
|
|
311
|
+
:class="isMobile
|
|
312
|
+
? 'w-(--reka-popover-trigger-width)'
|
|
313
|
+
: 'w-[calc(var(--reka-popover-trigger-width)+2rem)]'"
|
|
314
|
+
data-colors-semantic="light"
|
|
315
|
+
@open-auto-focus="handleOpenAutoFocus"
|
|
316
|
+
>
|
|
317
|
+
<ul class="flex flex-col md:items-center gap-2 p-2">
|
|
318
|
+
<li
|
|
319
|
+
v-for="item in collapsedMenuItems"
|
|
320
|
+
:key="`collapsed-menu-item-${item.label}`"
|
|
321
|
+
role="listitem"
|
|
322
|
+
>
|
|
323
|
+
<UiSideMenuItem
|
|
324
|
+
variant="default"
|
|
325
|
+
:label="item.label"
|
|
326
|
+
:icon="item.icon"
|
|
327
|
+
:to="item.to"
|
|
328
|
+
:href="item.href"
|
|
329
|
+
:is-active="item.isActive"
|
|
330
|
+
:badge="item.badge"
|
|
331
|
+
show-label-tooltip
|
|
332
|
+
@click="handleCollapsedItemClick(item)"
|
|
333
|
+
/>
|
|
334
|
+
</li>
|
|
335
|
+
|
|
336
|
+
<!--
|
|
337
|
+
Extra entries rendered as real components inside the popover.
|
|
338
|
+
Use for items that own their own trigger/popover (e.g. the
|
|
339
|
+
Headway "Updates" button) and can't be expressed as a plain
|
|
340
|
+
collapsedMenuItems entry. The `close` slot prop lets such an
|
|
341
|
+
item dismiss this popover when its own popover opens.
|
|
342
|
+
-->
|
|
343
|
+
<slot
|
|
344
|
+
name="collapsedMenuExtra"
|
|
345
|
+
:close="closeCollapsedMenu"
|
|
346
|
+
/>
|
|
347
|
+
|
|
348
|
+
<!--
|
|
349
|
+
On short-height screens the #bottom slot (Help) and bottom
|
|
350
|
+
nav items are hidden, so fold them into this one popover —
|
|
351
|
+
otherwise they'd need a second "More" button.
|
|
352
|
+
-->
|
|
353
|
+
<template v-if="isShortHeight">
|
|
354
|
+
<li
|
|
355
|
+
v-for="item in bottomMenuItems"
|
|
356
|
+
:key="`collapsed-bottom-item-${item.label}`"
|
|
357
|
+
role="listitem"
|
|
358
|
+
>
|
|
359
|
+
<UiSideMenuItem
|
|
360
|
+
variant="default"
|
|
361
|
+
:label="item.label"
|
|
362
|
+
:icon="item.icon"
|
|
363
|
+
:to="item.to"
|
|
364
|
+
:is-active="item.isActive"
|
|
365
|
+
show-label-tooltip
|
|
366
|
+
@click="closeCollapsedMenu"
|
|
367
|
+
/>
|
|
368
|
+
</li>
|
|
369
|
+
<li
|
|
370
|
+
v-for="item in moreMenuItems"
|
|
371
|
+
:key="`collapsed-proxy-item-${item.label}`"
|
|
372
|
+
role="listitem"
|
|
373
|
+
>
|
|
374
|
+
<UiSideMenuItem
|
|
375
|
+
variant="default"
|
|
376
|
+
:label="item.label"
|
|
377
|
+
:icon="item.icon"
|
|
378
|
+
:is-active="false"
|
|
379
|
+
show-label-tooltip
|
|
380
|
+
@click="handleCollapsedProxyClick(item)"
|
|
381
|
+
/>
|
|
382
|
+
</li>
|
|
383
|
+
</template>
|
|
384
|
+
</ul>
|
|
385
|
+
</UiPopoverContent>
|
|
386
|
+
</UiPopover>
|
|
387
|
+
</div>
|
|
388
|
+
|
|
389
|
+
<!--
|
|
390
|
+
#bottom slot (Help/Updates) stays mounted at all heights so its
|
|
391
|
+
internal popover state survives layout changes. On short-height
|
|
392
|
+
screens it's visually hidden — consumers anchor their popovers
|
|
393
|
+
to the More button via UiPopoverAnchor (see SIDE_MENU_LAYOUT_KEY).
|
|
394
|
+
-->
|
|
395
|
+
<div
|
|
396
|
+
v-if="slots.bottom"
|
|
397
|
+
class="flex flex-col md:gap-2"
|
|
398
|
+
:class="{ 'sr-only pointer-events-none': isShortHeight }"
|
|
399
|
+
:aria-hidden="isShortHeight ? 'true' : undefined"
|
|
400
|
+
:inert="isShortHeight || undefined"
|
|
401
|
+
>
|
|
402
|
+
<slot name="bottom" />
|
|
403
|
+
</div>
|
|
404
|
+
|
|
405
|
+
<!--
|
|
406
|
+
Short-height fallback "More" — only when there's no persistent
|
|
407
|
+
collapsed menu (otherwise that menu absorbs these items, see above).
|
|
408
|
+
Shown when the bottom menu is hidden on short-height desktop screens.
|
|
409
|
+
-->
|
|
410
|
+
<div
|
|
411
|
+
v-if="!hasCollapsedMenu"
|
|
412
|
+
ref="moreButtonEl"
|
|
413
|
+
class="more-menu-container show-on-short-height-desktop-only"
|
|
414
|
+
>
|
|
415
|
+
<UiPopover
|
|
416
|
+
v-if="(bottomMenuItems && bottomMenuItems.length > 0) || (moreMenuItems && moreMenuItems.length > 0)"
|
|
417
|
+
v-model:open="isMoreMenuOpen"
|
|
418
|
+
>
|
|
419
|
+
<UiPopoverTrigger class="cursor-pointer">
|
|
420
|
+
<UiSideMenuItem
|
|
421
|
+
:label="i18next.t('room_bottom-bar_controls-label_more')"
|
|
422
|
+
icon="i-ls-more-vertical"
|
|
423
|
+
:is-active="false"
|
|
424
|
+
:inside-interactive="true"
|
|
425
|
+
/>
|
|
426
|
+
</UiPopoverTrigger>
|
|
427
|
+
<UiPopoverContent
|
|
428
|
+
side="right"
|
|
429
|
+
align="end"
|
|
430
|
+
:side-offset="8"
|
|
431
|
+
class="border-none bg-surface-neutral-300 rounded-2xl shadow-shadows-drop-shadow-2xl overflow-hidden"
|
|
432
|
+
data-colors-semantic="light"
|
|
433
|
+
@open-auto-focus="handleOpenAutoFocus"
|
|
434
|
+
>
|
|
435
|
+
<div class="flex flex-col md:items-center gap-2 p-2">
|
|
436
|
+
<li
|
|
437
|
+
v-for="item in bottomMenuItems"
|
|
438
|
+
:key="`popover-menu-item-${item.label}`"
|
|
439
|
+
role="listitem"
|
|
440
|
+
>
|
|
441
|
+
<UiSideMenuItem
|
|
442
|
+
variant="default"
|
|
443
|
+
:label="item.label"
|
|
444
|
+
:icon="item.icon"
|
|
445
|
+
:to="item.to"
|
|
446
|
+
:is-active="item.isActive"
|
|
447
|
+
@click="closeMoreMenu"
|
|
448
|
+
/>
|
|
449
|
+
</li>
|
|
450
|
+
<li
|
|
451
|
+
v-for="item in moreMenuItems"
|
|
452
|
+
:key="`more-proxy-item-${item.label}`"
|
|
453
|
+
role="listitem"
|
|
454
|
+
>
|
|
455
|
+
<UiSideMenuItem
|
|
456
|
+
variant="default"
|
|
457
|
+
:label="item.label"
|
|
458
|
+
:icon="item.icon"
|
|
459
|
+
:is-active="false"
|
|
460
|
+
@click="handleMoreProxyClick(item)"
|
|
461
|
+
/>
|
|
462
|
+
</li>
|
|
463
|
+
</div>
|
|
464
|
+
</UiPopoverContent>
|
|
465
|
+
</UiPopover>
|
|
466
|
+
</div>
|
|
467
|
+
|
|
468
|
+
<!--
|
|
469
|
+
Profile / settings sits in its own group, separated from the
|
|
470
|
+
More/Help buttons by a 32px gap per the design (8px flex gap + mt-6).
|
|
471
|
+
-->
|
|
472
|
+
<div
|
|
473
|
+
role="complementary"
|
|
474
|
+
class="md:mt-6"
|
|
475
|
+
:aria-label="toolsAndSettingsLabel"
|
|
476
|
+
>
|
|
477
|
+
<slot
|
|
478
|
+
v-if="slots.settingsMenu"
|
|
479
|
+
name="settingsMenu"
|
|
480
|
+
/>
|
|
481
|
+
</div>
|
|
482
|
+
</nav>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
</template>
|
|
486
|
+
|
|
487
|
+
<style scoped>
|
|
488
|
+
/* Hide the more menu by default */
|
|
489
|
+
.show-on-short-height-desktop-only {
|
|
490
|
+
display: none;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/* Hide bottom menu items when screen is short and its's not a touch device */
|
|
494
|
+
@media (max-height: 768px) and (hover: hover) {
|
|
495
|
+
.hidden-on-short-height {
|
|
496
|
+
display: none;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/* Show more menu only on desktop (non-touch) devices with short height */
|
|
501
|
+
@media (max-height: 768px) and (hover: hover) and (pointer: fine) {
|
|
502
|
+
.show-on-short-height-desktop-only {
|
|
503
|
+
display: block;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/* Hide the 'more' menu item when there's enough space or on touch devices */
|
|
508
|
+
@media (min-height: 768px), (hover: none), (pointer: coarse) {
|
|
509
|
+
.show-on-short-height-desktop-only {
|
|
510
|
+
display: none;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import UiSideMenuItem from './UiSideMenuItem.vue'
|
|
3
|
+
import type { SideMenuItemProps } from './types'
|
|
4
|
+
|
|
5
|
+
defineProps<{
|
|
6
|
+
menuItems: SideMenuItemProps[]
|
|
7
|
+
}>()
|
|
8
|
+
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<div class="flex flex-col items-center">
|
|
13
|
+
<div class="flex flex-col gap-2">
|
|
14
|
+
<template
|
|
15
|
+
v-for="(item, index) in menuItems"
|
|
16
|
+
:key="`${item.label}-${index}`"
|
|
17
|
+
>
|
|
18
|
+
<UiSideMenuItem
|
|
19
|
+
:label="item.label"
|
|
20
|
+
:icon="item.icon"
|
|
21
|
+
:to="item.to"
|
|
22
|
+
:is-active="item.isActive"
|
|
23
|
+
/>
|
|
24
|
+
</template>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SideMenuItemProps } from './types'
|
|
3
|
+
import { computed } from 'vue'
|
|
4
|
+
import UiSideMenuItemContent from './UiSideMenuItemContent.vue'
|
|
5
|
+
import UiTooltipProvider from '../UiTooltip/UiTooltipProvider.vue'
|
|
6
|
+
import UiTooltip from '../UiTooltip/UiTooltip.vue'
|
|
7
|
+
import UiTooltipTrigger from '../UiTooltip/UiTooltipTrigger.vue'
|
|
8
|
+
import UiTooltipContent from '../UiTooltip/UiTooltipContent.vue'
|
|
9
|
+
import { useLabelHidden } from './useLabelHidden'
|
|
10
|
+
|
|
11
|
+
// Forward attrs (id, class, data-*, and crucially @click listeners) onto the
|
|
12
|
+
// content element ourselves: in the tooltip branch the root is the renderless
|
|
13
|
+
// UiTooltipProvider, which would otherwise swallow them.
|
|
14
|
+
defineOptions({ inheritAttrs: false })
|
|
15
|
+
|
|
16
|
+
const props = withDefaults(defineProps<SideMenuItemProps & {
|
|
17
|
+
navigateToLabel?: string
|
|
18
|
+
/**
|
|
19
|
+
* When true, removes the interactive overlay (router-link/button) from
|
|
20
|
+
* the tab order. Use when wrapped by an interactive ancestor (e.g.
|
|
21
|
+
* UiPopoverTrigger) that already owns focus and click semantics —
|
|
22
|
+
* otherwise the component contributes a second tab stop.
|
|
23
|
+
*/
|
|
24
|
+
insideInteractive?: boolean
|
|
25
|
+
/**
|
|
26
|
+
* Notification indicator shown at the top-right of the icon. A number
|
|
27
|
+
* renders a count pill (values > 99 display as "99+"); `true` renders a
|
|
28
|
+
* plain dot. Omit / 0 / false to hide.
|
|
29
|
+
*/
|
|
30
|
+
badge?: number | boolean
|
|
31
|
+
/**
|
|
32
|
+
* Show the `label` as a hover tooltip when the text label is hidden
|
|
33
|
+
* (short-height / narrow screens). Off by default — do NOT enable for items
|
|
34
|
+
* already wrapped by an interactive ancestor (popover/Headway triggers), as
|
|
35
|
+
* the tooltip's own trigger would conflict with that ancestor.
|
|
36
|
+
*/
|
|
37
|
+
showLabelTooltip?: boolean
|
|
38
|
+
/**
|
|
39
|
+
* Keep the label visible on short-height screens (forwarded to the content).
|
|
40
|
+
*/
|
|
41
|
+
alwaysShowLabel?: boolean
|
|
42
|
+
}>(), {
|
|
43
|
+
textAlign: undefined,
|
|
44
|
+
insideInteractive: false,
|
|
45
|
+
badge: undefined,
|
|
46
|
+
showLabelTooltip: false,
|
|
47
|
+
alwaysShowLabel: false,
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// Props forwarded to the content component — everything except the tooltip
|
|
51
|
+
// control flag, which is consumed here and would otherwise leak onto the DOM.
|
|
52
|
+
const contentProps = computed(() => {
|
|
53
|
+
const { showLabelTooltip: _ignored, ...rest } = props
|
|
54
|
+
return rest
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// Enable the tooltip only while the text label is hidden (short-height /
|
|
58
|
+
// narrow screens), surfacing the same label value on hover.
|
|
59
|
+
const labelHidden = useLabelHidden()
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<template>
|
|
63
|
+
<UiTooltipProvider
|
|
64
|
+
v-if="showLabelTooltip"
|
|
65
|
+
:delay-duration="0"
|
|
66
|
+
>
|
|
67
|
+
<UiTooltip :disabled="!labelHidden">
|
|
68
|
+
<UiTooltipTrigger as-child>
|
|
69
|
+
<UiSideMenuItemContent
|
|
70
|
+
v-bind="{ ...contentProps, ...$attrs }"
|
|
71
|
+
>
|
|
72
|
+
<template
|
|
73
|
+
v-if="$slots.avatar"
|
|
74
|
+
#avatar
|
|
75
|
+
>
|
|
76
|
+
<slot name="avatar" />
|
|
77
|
+
</template>
|
|
78
|
+
<slot />
|
|
79
|
+
</UiSideMenuItemContent>
|
|
80
|
+
</UiTooltipTrigger>
|
|
81
|
+
<UiTooltipContent
|
|
82
|
+
side="right"
|
|
83
|
+
:side-offset="0"
|
|
84
|
+
>
|
|
85
|
+
{{ label }}
|
|
86
|
+
</UiTooltipContent>
|
|
87
|
+
</UiTooltip>
|
|
88
|
+
</UiTooltipProvider>
|
|
89
|
+
|
|
90
|
+
<UiSideMenuItemContent
|
|
91
|
+
v-else
|
|
92
|
+
v-bind="{ ...contentProps, ...$attrs }"
|
|
93
|
+
>
|
|
94
|
+
<template
|
|
95
|
+
v-if="$slots.avatar"
|
|
96
|
+
#avatar
|
|
97
|
+
>
|
|
98
|
+
<slot name="avatar" />
|
|
99
|
+
</template>
|
|
100
|
+
<slot />
|
|
101
|
+
</UiSideMenuItemContent>
|
|
102
|
+
</template>
|