@livestorm/ui-vue 1.1.3 → 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.
Files changed (401) hide show
  1. package/README.md +164 -32
  2. package/components-vite.js +5 -5
  3. package/components.d.ts +3 -3
  4. package/dist/UiTimelineItem.vue_vue_type_style_index_0_lang-DOLFRKcb.mjs +5565 -0
  5. package/dist/a11y-DIdrv5Mn.mjs +66 -0
  6. package/dist/breakpoints.mjs +9 -0
  7. package/dist/bus.mjs +5 -0
  8. package/dist/components.mjs +214 -1663
  9. package/dist/index.mjs +84 -166
  10. package/dist/integrations.mjs +8 -0
  11. package/dist/layouts.mjs +236 -0
  12. package/dist/responsive.mjs +25 -0
  13. package/dist/slot.mjs +21 -0
  14. package/dist/toastDSV2-wMh-UMzW.mjs +74 -0
  15. package/dist/types/index.d.ts +84 -0
  16. package/dist/types/src/components/Toast/LayoutToasts.vue.d.ts +3 -0
  17. package/dist/types/src/components/Toast/ToastMessage.vue.d.ts +21 -0
  18. package/dist/types/src/components/Toast/toastDSV2.d.ts +102 -0
  19. package/dist/types/src/components/UiActionBar/UiActionBar.vue.d.ts +44 -0
  20. package/dist/types/src/components/UiActionBar/UiActionBarItem.vue.d.ts +47 -0
  21. package/dist/types/src/components/UiActionBar/UiActionBarSeparator.vue.d.ts +3 -0
  22. package/dist/types/src/components/UiActionBar/index.d.ts +4 -0
  23. package/dist/types/src/components/UiActionBar/types.d.ts +14 -0
  24. package/dist/types/src/components/UiAnimatedLogo/UiAnimatedLogo.vue.d.ts +10 -0
  25. package/dist/types/src/components/UiAnimatedLogo/animations-links.d.ts +3 -0
  26. package/dist/types/src/components/UiAvatar/UiAvatar.vue.d.ts +55 -0
  27. package/dist/types/src/components/UiAvatar/index.d.ts +1 -0
  28. package/dist/types/src/components/UiAvatarList/UiAvatarList.vue.d.ts +28 -0
  29. package/dist/types/src/components/UiAvatarList/index.d.ts +1 -0
  30. package/dist/types/src/components/UiBadge/UiBadge.vue.d.ts +47 -0
  31. package/dist/types/src/components/UiBadge/index.d.ts +1 -0
  32. package/dist/types/src/components/UiBanner/UiBanner.vue.d.ts +96 -0
  33. package/dist/types/src/components/UiBanner/index.d.ts +2 -0
  34. package/dist/types/src/components/UiBreadcrumb/UiBreadcrumb.vue.d.ts +15 -0
  35. package/dist/types/src/components/UiBreadcrumb/index.d.ts +2 -0
  36. package/dist/types/src/components/UiButton/UiButton.vue.d.ts +249 -0
  37. package/dist/types/src/components/UiButtonGroup/UiButtonGroup.vue.d.ts +42 -0
  38. package/dist/types/src/components/UiButtonGroup/UiButtonGroupItem.vue.d.ts +21 -0
  39. package/dist/types/src/components/UiButtonGroup/index.d.ts +3 -0
  40. package/dist/types/src/components/UiButtonGroup/types.d.ts +10 -0
  41. package/dist/types/src/components/UiCard/UiCard.vue.d.ts +31 -0
  42. package/dist/types/src/components/UiCarousel/UiCarousel.vue.d.ts +63 -0
  43. package/dist/types/src/components/UiCarousel/index.d.ts +2 -0
  44. package/dist/types/src/components/UiColorField/UiColorField.vue.d.ts +19 -0
  45. package/dist/types/src/components/UiColorField/index.d.ts +2 -0
  46. package/dist/types/src/components/UiColorField/types.d.ts +29 -0
  47. package/dist/types/src/components/UiColorPicker/UiColorPicker.vue.d.ts +35 -0
  48. package/dist/types/src/components/UiColorPicker/index.d.ts +2 -0
  49. package/dist/types/src/components/UiColorPicker/types.d.ts +97 -0
  50. package/dist/types/src/components/UiDialog/MarketplaceHeaderExample.vue.d.ts +28 -0
  51. package/dist/types/src/components/UiDialog/UiDialog.vue.d.ts +18 -0
  52. package/dist/types/src/components/UiDialog/UiDialogClose.vue.d.ts +10 -0
  53. package/dist/types/src/components/UiDialog/UiDialogContent.vue.d.ts +54 -0
  54. package/dist/types/src/components/UiDialog/UiDialogFooter.vue.d.ts +13 -0
  55. package/dist/types/src/components/UiDialog/UiDialogTrigger.vue.d.ts +14 -0
  56. package/dist/types/src/components/UiDialog/index.d.ts +7 -0
  57. package/dist/types/src/components/UiDropdown/UiDropdown.vue.d.ts +42 -0
  58. package/dist/types/src/components/UiDropdown/UiDropdownContent.vue.d.ts +32 -0
  59. package/dist/types/src/components/UiDropdown/UiDropdownItem.vue.d.ts +27 -0
  60. package/dist/types/src/components/UiDropdown/UiDropdownSeparator.vue.d.ts +3 -0
  61. package/dist/types/src/components/UiDropdown/UiDropdownTrigger.vue.d.ts +45 -0
  62. package/dist/types/src/components/UiDropdown/context.d.ts +7 -0
  63. package/dist/types/src/components/UiDropdown/index.d.ts +6 -0
  64. package/dist/types/src/components/UiEmptyState/UiEmptyState.vue.d.ts +29 -0
  65. package/dist/types/src/components/UiFieldWrapper/UiFieldWrapper.vue.d.ts +36 -0
  66. package/dist/types/src/components/UiFieldWrapper/index.d.ts +1 -0
  67. package/dist/types/src/components/UiForm/UiFormField.types.d.ts +22 -0
  68. package/dist/types/src/components/UiForm/UiFormField.vue.d.ts +34 -0
  69. package/dist/types/src/components/UiForm/index.d.ts +3 -0
  70. package/dist/types/src/components/UiHorizontalSeparator/UiHorizontalSeparator.vue.d.ts +6 -0
  71. package/dist/types/src/components/UiInputCheckbox/UiInputCheckbox.vue.d.ts +108 -0
  72. package/dist/types/src/components/UiInputCheckbox/index.d.ts +2 -0
  73. package/dist/types/src/components/UiInputCheckbox/types.d.ts +1 -0
  74. package/dist/types/src/components/UiInputSelect/UiInputSelect.vue.d.ts +66 -0
  75. package/dist/types/src/components/UiInputSelect/index.d.ts +2 -0
  76. package/dist/types/src/components/UiInputSelect/types.d.ts +1 -0
  77. package/dist/types/src/components/UiInputTextarea/UiInputTextarea.vue.d.ts +49 -0
  78. package/dist/types/src/components/UiInputTextarea/index.d.ts +2 -0
  79. package/dist/types/src/components/UiInputTextarea/types.d.ts +1 -0
  80. package/dist/types/src/components/UiLabel/UiLabel.vue.d.ts +17 -0
  81. package/dist/types/src/components/UiList/UiList.vue.d.ts +27 -0
  82. package/dist/types/src/components/UiListItem/UiListItem.vue.d.ts +35 -0
  83. package/dist/types/src/components/UiLoader/UiLoader.vue.d.ts +17 -0
  84. package/dist/types/src/components/UiLogo/UiLogo.vue.d.ts +20 -0
  85. package/dist/types/src/components/UiLogo/variants/PulseVariant.vue.d.ts +3 -0
  86. package/dist/types/src/components/UiLogo/variants/TornadoVariant.vue.d.ts +3 -0
  87. package/dist/types/src/components/UiMenu/UiMenu.vue.d.ts +18 -0
  88. package/dist/types/src/components/UiMenu/UiMenuContent.vue.d.ts +30 -0
  89. package/dist/types/src/components/UiMenu/UiMenuGroup.vue.d.ts +16 -0
  90. package/dist/types/src/components/UiMenu/UiMenuItem.vue.d.ts +18 -0
  91. package/dist/types/src/components/UiMenu/UiMenuLabel.vue.d.ts +13 -0
  92. package/dist/types/src/components/UiMenu/UiMenuSeparator.vue.d.ts +13 -0
  93. package/dist/types/src/components/UiMenu/UiMenuSub.vue.d.ts +18 -0
  94. package/dist/types/src/components/UiMenu/UiMenuSubContent.vue.d.ts +32 -0
  95. package/dist/types/src/components/UiMenu/UiMenuSubTrigger.vue.d.ts +14 -0
  96. package/dist/types/src/components/UiMenu/UiMenuTrigger.vue.d.ts +14 -0
  97. package/dist/types/src/components/UiMenu/index.d.ts +10 -0
  98. package/dist/types/src/components/UiPage/UiPage.vue.d.ts +37 -0
  99. package/dist/types/src/components/UiPageHeader/UiPageHeader.vue.d.ts +33 -0
  100. package/dist/types/src/components/UiPopover/UiPopover.vue.d.ts +18 -0
  101. package/dist/types/src/components/UiPopover/UiPopoverAnchor.vue.d.ts +14 -0
  102. package/dist/types/src/components/UiPopover/UiPopoverContent.vue.d.ts +28 -0
  103. package/dist/types/src/components/UiPopover/UiPopoverTrigger.vue.d.ts +14 -0
  104. package/dist/types/src/components/UiProgress/UiProgress.vue.d.ts +15 -0
  105. package/dist/types/src/components/UiProgress/index.d.ts +2 -0
  106. package/dist/types/src/components/UiProgress/types.d.ts +4 -0
  107. package/dist/types/src/components/UiRoomButton/UiRoomButton.vue.d.ts +29 -0
  108. package/dist/types/src/components/UiShell/UiShell.vue.d.ts +24 -0
  109. package/dist/types/src/components/UiSideMenu/UiSideMenu.vue.d.ts +64 -0
  110. package/dist/types/src/components/UiSideMenu/UiSideMenuBottom.vue.d.ts +7 -0
  111. package/dist/types/src/components/UiSideMenu/UiSideMenuItem.vue.d.ts +53 -0
  112. package/dist/types/src/components/UiSideMenu/UiSideMenuItemContent.vue.d.ts +43 -0
  113. package/dist/types/src/components/UiSideMenu/UiSideMenuTop.vue.d.ts +7 -0
  114. package/dist/types/src/components/UiSideMenu/injection.d.ts +7 -0
  115. package/dist/types/src/components/UiSideMenu/types.d.ts +39 -0
  116. package/dist/types/src/components/UiSideMenu/useLabelHidden.d.ts +2 -0
  117. package/dist/types/src/components/UiSideMenu/useSideMenuLayout.d.ts +7 -0
  118. package/dist/types/src/components/UiStepper/UiStepper.vue.d.ts +18 -0
  119. package/dist/types/src/components/UiStepper/UiStepperDescription.vue.d.ts +14 -0
  120. package/dist/types/src/components/UiStepper/UiStepperIndicator.vue.d.ts +20 -0
  121. package/dist/types/src/components/UiStepper/UiStepperItem.vue.d.ts +19 -0
  122. package/dist/types/src/components/UiStepper/UiStepperSeparator.vue.d.ts +10 -0
  123. package/dist/types/src/components/UiStepper/UiStepperTitle.vue.d.ts +14 -0
  124. package/dist/types/src/components/UiStepper/index.d.ts +7 -0
  125. package/dist/types/src/components/UiTable/UiTable.vue.d.ts +20 -0
  126. package/dist/types/src/components/UiTable/UiTableBody.vue.d.ts +13 -0
  127. package/dist/types/src/components/UiTable/UiTableCell.vue.d.ts +13 -0
  128. package/dist/types/src/components/UiTable/UiTableHeader.vue.d.ts +13 -0
  129. package/dist/types/src/components/UiTable/UiTableHeaderCell.vue.d.ts +13 -0
  130. package/dist/types/src/components/UiTable/UiTableRow.vue.d.ts +16 -0
  131. package/dist/types/src/components/UiTable/index.d.ts +6 -0
  132. package/dist/types/src/components/UiTabs/UiTabs.vue.d.ts +37 -0
  133. package/dist/types/src/components/UiTabs/index.d.ts +2 -0
  134. package/dist/types/src/components/UiTag/UiTag.vue.d.ts +43 -0
  135. package/dist/types/src/components/UiTag/index.d.ts +1 -0
  136. package/dist/types/src/components/UiTextField/UiTextField.vue.d.ts +65 -0
  137. package/dist/types/src/components/UiTextField/index.d.ts +2 -0
  138. package/dist/types/src/components/UiTextField/types.d.ts +2 -0
  139. package/dist/types/src/components/UiTimeline/UiTimeline.vue.d.ts +19 -0
  140. package/dist/types/src/components/UiTimeline/UiTimelineItem.vue.d.ts +28 -0
  141. package/dist/types/src/components/UiTimeline/index.d.ts +2 -0
  142. package/dist/types/src/components/UiTooltip/UiTooltip.vue.d.ts +18 -0
  143. package/dist/types/src/components/UiTooltip/UiTooltipContent.vue.d.ts +54 -0
  144. package/dist/types/src/components/UiTooltip/UiTooltipProvider.vue.d.ts +17 -0
  145. package/dist/types/src/components/UiTooltip/UiTooltipTrigger.vue.d.ts +14 -0
  146. package/dist/types/src/components/UiTooltip/index.d.ts +4 -0
  147. package/dist/types/src/composables/useButtonStyles.d.ts +20 -0
  148. package/dist/types/src/composables/useMobileMenu.d.ts +11 -0
  149. package/dist/types/src/composables/useThemeAndModes.d.ts +34 -0
  150. package/dist/types/src/constants/index.d.ts +2 -0
  151. package/dist/types/src/constants/sizes.d.ts +2 -0
  152. package/dist/types/src/constants/themes.d.ts +22 -0
  153. package/dist/types/src/integrations/index.d.ts +1 -0
  154. package/dist/types/src/layouts/index.d.ts +2 -0
  155. package/dist/types/src/mixins/DynamicAction.d.ts +30 -0
  156. package/dist/types/src/primitives.d.ts +6 -0
  157. package/dist/types/src/theme.d.ts +1 -0
  158. package/dist/types/src/utils/a11y.d.ts +2 -0
  159. package/dist/types/src/utils/breakpoints.d.ts +9 -0
  160. package/dist/types/src/utils/bus.d.ts +2 -0
  161. package/dist/types/src/utils/clipboard.d.ts +4 -0
  162. package/dist/types/src/utils/devices.d.ts +19 -0
  163. package/dist/types/src/utils/elements.d.ts +1 -0
  164. package/dist/types/src/utils/index.d.ts +9 -0
  165. package/dist/types/src/utils/numbers.d.ts +30 -0
  166. package/dist/types/src/utils/responsive.d.ts +5 -0
  167. package/dist/types/src/utils/responsive.types.d.ts +12 -0
  168. package/dist/types/src/utils/router.d.ts +1 -0
  169. package/dist/types/src/utils/slot.d.ts +8 -0
  170. package/dist/types/src/utils/stack-view.d.ts +10 -0
  171. package/dist/types/src/utils/uid.d.ts +1 -0
  172. package/dist/types/style.d.ts +1 -0
  173. package/dist/ui-vue.css +1 -0
  174. package/dist/useThemeAndModes-DY5SDC0a.mjs +109 -0
  175. package/dist/utils.mjs +111 -0
  176. package/index.d.ts +88 -2
  177. package/index.js +169 -16
  178. package/integrations.d.ts +10 -0
  179. package/package.json +131 -63
  180. package/src/components/Toast/LayoutToasts.vue +63 -0
  181. package/src/components/Toast/ToastMessage.vue +208 -0
  182. package/src/components/Toast/toastDSV2.ts +151 -0
  183. package/src/components/UiActionBar/UiActionBar.vue +86 -0
  184. package/src/components/UiActionBar/UiActionBarItem.vue +179 -0
  185. package/src/components/UiActionBar/UiActionBarSeparator.vue +18 -0
  186. package/src/components/UiActionBar/index.ts +4 -0
  187. package/src/components/UiActionBar/types.ts +24 -0
  188. package/src/components/UiAnimatedLogo/UiAnimatedLogo.vue +47 -0
  189. package/src/components/UiAnimatedLogo/animations-links.ts +6 -0
  190. package/src/components/UiAvatar/UiAvatar.vue +186 -0
  191. package/src/components/UiAvatar/index.js +1 -0
  192. package/src/components/UiAvatarList/UiAvatarList.vue +109 -0
  193. package/src/components/UiAvatarList/index.js +1 -0
  194. package/src/components/UiBadge/UiBadge.vue +161 -0
  195. package/src/components/UiBadge/index.ts +2 -0
  196. package/src/components/UiBanner/UiBanner.vue +363 -0
  197. package/src/components/UiBanner/index.ts +2 -0
  198. package/src/components/UiBreadcrumb/UiBreadcrumb.vue +93 -0
  199. package/src/components/UiBreadcrumb/index.ts +2 -0
  200. package/src/components/UiButton/UiButton.vue +319 -0
  201. package/src/components/UiButtonGroup/UiButtonGroup.vue +198 -0
  202. package/src/components/UiButtonGroup/UiButtonGroupItem.vue +123 -0
  203. package/src/components/UiButtonGroup/index.ts +3 -0
  204. package/src/components/UiButtonGroup/types.ts +24 -0
  205. package/src/components/UiCard/UiCard.vue +112 -0
  206. package/src/components/UiCarousel/UiCarousel.vue +215 -0
  207. package/src/components/UiCarousel/index.ts +2 -0
  208. package/src/components/UiColorField/UiColorField.vue +158 -0
  209. package/src/components/UiColorField/index.ts +2 -0
  210. package/src/components/UiColorField/types.ts +30 -0
  211. package/src/components/UiColorPicker/UiColorPicker.vue +487 -0
  212. package/src/components/UiColorPicker/index.ts +2 -0
  213. package/src/components/UiColorPicker/types.ts +103 -0
  214. package/src/components/UiDialog/MarketplaceHeaderExample.vue +217 -0
  215. package/src/components/UiDialog/UiDialog.md +97 -0
  216. package/src/components/UiDialog/UiDialog.vue +16 -0
  217. package/src/components/UiDialog/UiDialogClose.vue +29 -0
  218. package/src/components/UiDialog/UiDialogContent.vue +238 -0
  219. package/src/components/UiDialog/UiDialogFooter.vue +9 -0
  220. package/src/components/UiDialog/UiDialogTrigger.vue +12 -0
  221. package/src/components/UiDialog/index.ts +18 -0
  222. package/src/components/UiDropdown/UiDropdown.vue +48 -0
  223. package/src/components/UiDropdown/UiDropdownContent.vue +72 -0
  224. package/src/components/UiDropdown/UiDropdownItem.vue +75 -0
  225. package/src/components/UiDropdown/UiDropdownSeparator.vue +7 -0
  226. package/src/components/UiDropdown/UiDropdownTrigger.vue +239 -0
  227. package/src/components/UiDropdown/context.ts +9 -0
  228. package/src/components/UiDropdown/index.ts +21 -0
  229. package/src/components/UiEmptyState/UiEmptyState.vue +80 -0
  230. package/src/components/UiFieldWrapper/UiFieldWrapper.vue +79 -0
  231. package/src/components/UiFieldWrapper/index.ts +1 -0
  232. package/src/components/UiForm/UiFormField.types.ts +24 -0
  233. package/src/components/UiForm/UiFormField.vue +66 -0
  234. package/src/components/UiForm/index.ts +3 -0
  235. package/src/components/UiHorizontalSeparator/UiHorizontalSeparator.vue +28 -0
  236. package/src/components/UiInputCheckbox/UiInputCheckbox.vue +477 -0
  237. package/src/components/UiInputCheckbox/index.ts +2 -0
  238. package/src/components/UiInputCheckbox/types.ts +1 -0
  239. package/src/components/UiInputSelect/UiInputSelect.vue +166 -0
  240. package/src/components/UiInputSelect/index.ts +2 -0
  241. package/src/components/UiInputSelect/types.ts +1 -0
  242. package/src/components/UiInputTextarea/UiInputTextarea.vue +219 -0
  243. package/src/components/UiInputTextarea/index.ts +2 -0
  244. package/src/components/UiInputTextarea/types.ts +1 -0
  245. package/src/components/UiLabel/UiLabel.vue +34 -0
  246. package/src/components/UiList/UiList.vue +45 -0
  247. package/src/components/UiListItem/UiListItem.vue +108 -0
  248. package/src/components/UiLoader/UiLoader.vue +45 -0
  249. package/src/components/UiLogo/UiLogo.vue +99 -0
  250. package/src/components/UiLogo/variants/PulseVariant.vue +51 -0
  251. package/src/components/UiLogo/variants/TornadoVariant.vue +147 -0
  252. package/src/components/UiMenu/UiMenu.vue +15 -0
  253. package/src/components/UiMenu/UiMenuContent.vue +25 -0
  254. package/src/components/UiMenu/UiMenuGroup.vue +19 -0
  255. package/src/components/UiMenu/UiMenuItem.vue +18 -0
  256. package/src/components/UiMenu/UiMenuLabel.vue +9 -0
  257. package/src/components/UiMenu/UiMenuSeparator.vue +9 -0
  258. package/src/components/UiMenu/UiMenuSub.vue +15 -0
  259. package/src/components/UiMenu/UiMenuSubContent.vue +23 -0
  260. package/src/components/UiMenu/UiMenuSubTrigger.vue +17 -0
  261. package/src/components/UiMenu/UiMenuTrigger.vue +13 -0
  262. package/src/components/UiMenu/index.ts +10 -0
  263. package/src/components/UiPage/UiPage.vue +201 -0
  264. package/src/components/UiPageHeader/UiPageHeader.vue +128 -0
  265. package/src/components/UiPopover/UiPopover.vue +16 -0
  266. package/src/components/UiPopover/UiPopoverAnchor.vue +12 -0
  267. package/src/components/UiPopover/UiPopoverContent.vue +26 -0
  268. package/src/components/UiPopover/UiPopoverTrigger.vue +19 -0
  269. package/src/components/UiProgress/UiProgress.vue +92 -0
  270. package/src/components/UiProgress/index.ts +2 -0
  271. package/src/components/UiProgress/types.ts +5 -0
  272. package/src/components/UiRoomButton/UiRoomButton.vue +240 -0
  273. package/src/components/UiShell/UiShell.vue +88 -0
  274. package/src/components/UiSideMenu/UiSideMenu.vue +513 -0
  275. package/src/components/UiSideMenu/UiSideMenuBottom.vue +27 -0
  276. package/src/components/UiSideMenu/UiSideMenuItem.vue +102 -0
  277. package/src/components/UiSideMenu/UiSideMenuItemContent.vue +172 -0
  278. package/src/components/UiSideMenu/UiSideMenuTop.vue +29 -0
  279. package/src/components/UiSideMenu/injection.ts +9 -0
  280. package/src/components/UiSideMenu/types.ts +41 -0
  281. package/src/components/UiSideMenu/useLabelHidden.ts +33 -0
  282. package/src/components/UiSideMenu/useSideMenuLayout.ts +12 -0
  283. package/src/components/UiStepper/UiStepper.vue +40 -0
  284. package/src/components/UiStepper/UiStepperDescription.vue +27 -0
  285. package/src/components/UiStepper/UiStepperIndicator.vue +93 -0
  286. package/src/components/UiStepper/UiStepperItem.vue +30 -0
  287. package/src/components/UiStepper/UiStepperSeparator.vue +49 -0
  288. package/src/components/UiStepper/UiStepperTitle.vue +24 -0
  289. package/src/components/UiStepper/index.ts +17 -0
  290. package/src/components/UiTable/UiTable.vue +24 -0
  291. package/src/components/UiTable/UiTableBody.vue +5 -0
  292. package/src/components/UiTable/UiTableCell.vue +26 -0
  293. package/src/components/UiTable/UiTableHeader.vue +17 -0
  294. package/src/components/UiTable/UiTableHeaderCell.vue +19 -0
  295. package/src/components/UiTable/UiTableRow.vue +27 -0
  296. package/src/components/UiTable/index.ts +6 -0
  297. package/src/components/UiTabs/UiTabs.vue +218 -0
  298. package/src/components/UiTabs/index.ts +5 -0
  299. package/src/components/UiTag/UiTag.vue +187 -0
  300. package/src/components/UiTag/index.js +1 -0
  301. package/src/components/UiTextField/UiTextField.vue +370 -0
  302. package/src/components/UiTextField/index.ts +2 -0
  303. package/src/components/UiTextField/types.ts +2 -0
  304. package/src/components/UiTimeline/README.md +169 -0
  305. package/src/components/UiTimeline/UiTimeline.vue +58 -0
  306. package/src/components/UiTimeline/UiTimelineItem.vue +141 -0
  307. package/src/components/UiTimeline/index.ts +2 -0
  308. package/src/components/UiTooltip/UiTooltip.vue +16 -0
  309. package/src/components/UiTooltip/UiTooltipContent.vue +86 -0
  310. package/src/components/UiTooltip/UiTooltipProvider.vue +15 -0
  311. package/src/components/UiTooltip/UiTooltipTrigger.vue +19 -0
  312. package/src/components/UiTooltip/index.js +4 -0
  313. package/src/composables/useButtonStyles.ts +242 -0
  314. package/src/composables/useMobileMenu.ts +57 -0
  315. package/src/composables/useThemeAndModes.ts +225 -0
  316. package/src/constants/index.ts +2 -0
  317. package/src/constants/sizes.ts +2 -0
  318. package/src/constants/themes.ts +34 -0
  319. package/src/css/{body.postcss → body.css} +3 -2
  320. package/src/css/reka-animations.css +209 -0
  321. package/src/css/{transitions.postcss → transitions.css} +12 -5
  322. package/src/global.d.ts +181 -0
  323. package/src/integrations/index.js +1 -0
  324. package/src/layouts/index.js +5 -0
  325. package/src/mixins/DynamicAction.js +5 -3
  326. package/src/primitives.ts +6 -0
  327. package/src/theme.ts +1 -0
  328. package/src/utils/a11y.ts +8 -0
  329. package/src/utils/{breakpoints.js → breakpoints.ts} +1 -0
  330. package/src/utils/clipboard.js +2 -2
  331. package/src/utils/devices.js +0 -3
  332. package/src/utils/index.js +2 -1
  333. package/src/utils/numbers.ts +61 -0
  334. package/src/utils/responsive.types.ts +12 -0
  335. package/src/utils/{slot.js → slot.ts} +18 -1
  336. package/style.js +3 -12
  337. package/theme.d.ts +1 -0
  338. package/.env +0 -1
  339. package/.eslintignore +0 -4
  340. package/.eslintrc.js +0 -49
  341. package/.pkg +0 -11
  342. package/babel.config.js +0 -5
  343. package/build/Dockerfile +0 -31
  344. package/ci/ci.yml +0 -54
  345. package/components-webpack.js +0 -29
  346. package/dist/environment-da321c85.mjs +0 -1656
  347. package/dist/style.css +0 -1
  348. package/plugins.js +0 -17
  349. package/postcss.config.js +0 -1
  350. package/src/components/BaseAutocomplete/BaseAutocomplete.spec.js +0 -506
  351. package/src/components/BaseAutocomplete/BaseAutocomplete.stories.js +0 -184
  352. package/src/components/BaseAutocomplete/BaseAutocomplete.vue +0 -431
  353. package/src/components/BaseBanner/BaseBanner.spec.js +0 -32
  354. package/src/components/BaseBanner/BaseBanner.stories.js +0 -133
  355. package/src/components/BaseBanner/BaseBanner.vue +0 -229
  356. package/src/components/BaseButton/BaseButton.spec.js +0 -98
  357. package/src/components/BaseButton/BaseButton.stories.js +0 -300
  358. package/src/components/BaseButton/BaseButton.vue +0 -193
  359. package/src/components/BaseButton/__snapshots__/BaseButton.spec.js.snap +0 -37
  360. package/src/components/BaseButton/__snapshots__/BaseButton.spec.js.snap.old +0 -31
  361. package/src/components/BaseCheckbox/BaseCheckbox.stories.js +0 -157
  362. package/src/components/BaseCheckbox/BaseCheckbox.vue +0 -180
  363. package/src/components/BaseDropdownMenu/BaseDropdownMenu.stories.js +0 -84
  364. package/src/components/BaseDropdownMenu/BaseDropdownMenu.vue +0 -251
  365. package/src/components/BaseDropdownMenu/BaseDropdownMenuButton.vue +0 -26
  366. package/src/components/BaseDropdownMenu/BaseDropdownMenuDivider.vue +0 -10
  367. package/src/components/BaseDropdownMenu/BaseDropdownMenuItem.vue +0 -206
  368. package/src/components/BaseDropdownMenu/BaseDropdownMenuSearch.vue +0 -49
  369. package/src/components/BaseDropdownMenu/BaseDropdownMenuTitle.vue +0 -26
  370. package/src/components/BaseModal/BaseModal.stories.js +0 -155
  371. package/src/components/BaseModal/BaseModal.vue +0 -187
  372. package/src/components/BaseModal/BaseModalContent.vue +0 -166
  373. package/src/components/BaseModal/BaseModalContentOld.vue +0 -242
  374. package/src/components/BaseRadio/BaseRadio.stories.js +0 -164
  375. package/src/components/BaseRadio/BaseRadio.vue +0 -153
  376. package/src/components/BaseRating/BaseRating.spec.js +0 -46
  377. package/src/components/BaseRating/BaseRating.stories.js +0 -46
  378. package/src/components/BaseRating/BaseRating.vue +0 -119
  379. package/src/components/BaseSelect/BaseSelect.stories.js +0 -177
  380. package/src/components/BaseSelect/BaseSelect.vue +0 -443
  381. package/src/components/BaseSelect/BaseSelectGroup.vue +0 -34
  382. package/src/components/BaseSelect/BaseSelectOption.vue +0 -219
  383. package/src/components/BaseSwitch/BaseSwitch.stories.js +0 -44
  384. package/src/components/BaseSwitch/BaseSwitch.vue +0 -114
  385. package/src/components/BaseTag/BaseTag.stories.js +0 -123
  386. package/src/components/BaseTag/BaseTag.vue +0 -244
  387. package/src/css/button.postcss +0 -363
  388. package/src/css/checkbox-radio.postcss +0 -188
  389. package/src/css/icon.postcss +0 -9
  390. package/src/css/loader.postcss +0 -120
  391. package/src/css/popper.postcss +0 -161
  392. package/src/css/tailwind-utilities.postcss +0 -1
  393. package/src/css/tailwind.postcss +0 -2
  394. package/style-postcss.d.ts +0 -3
  395. package/style-postcss.js +0 -2
  396. package/tailwind.config.base.cjs +0 -88
  397. package/tailwind.config.js +0 -9
  398. package/tsconfig.check.json +0 -13
  399. package/tsconfig.json +0 -66
  400. package/vite.config.js +0 -43
  401. 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>