@livestorm/ui-vue 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) 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 +213 -1550
  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 +127 -58
  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 -47
  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-e70e5768.mjs +0 -1664
  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 -291
  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 -82
  362. package/src/components/BaseCheckbox/BaseCheckbox.vue +0 -161
  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 -143
  371. package/src/components/BaseModal/BaseModal.vue +0 -187
  372. package/src/components/BaseModal/BaseModalContent.vue +0 -164
  373. package/src/components/BaseModal/BaseModalContentOld.vue +0 -242
  374. package/src/components/BaseRating/BaseRating.spec.js +0 -46
  375. package/src/components/BaseRating/BaseRating.stories.js +0 -46
  376. package/src/components/BaseRating/BaseRating.vue +0 -119
  377. package/src/components/BaseSelect/BaseSelect.stories.js +0 -177
  378. package/src/components/BaseSelect/BaseSelect.vue +0 -443
  379. package/src/components/BaseSelect/BaseSelectGroup.vue +0 -34
  380. package/src/components/BaseSelect/BaseSelectOption.vue +0 -219
  381. package/src/components/BaseSwitch/BaseSwitch.stories.js +0 -44
  382. package/src/components/BaseSwitch/BaseSwitch.vue +0 -114
  383. package/src/components/BaseTag/BaseTag.stories.js +0 -123
  384. package/src/components/BaseTag/BaseTag.vue +0 -244
  385. package/src/css/button.postcss +0 -354
  386. package/src/css/checkbox-radio.postcss +0 -152
  387. package/src/css/icon.postcss +0 -9
  388. package/src/css/loader.postcss +0 -120
  389. package/src/css/popper.postcss +0 -143
  390. package/src/css/tailwind-utilities.postcss +0 -1
  391. package/src/css/tailwind.postcss +0 -2
  392. package/style-postcss.d.ts +0 -3
  393. package/style-postcss.js +0 -2
  394. package/tailwind.config.base.cjs +0 -88
  395. package/tailwind.config.js +0 -9
  396. package/tsconfig.check.json +0 -13
  397. package/tsconfig.json +0 -66
  398. package/vite.config.js +0 -43
  399. package/vitest.setup.js +0 -26
@@ -0,0 +1,147 @@
1
+ <script lang="ts" setup>
2
+ import { useId } from "vue";
3
+
4
+ // The lottie tornado rebuilt in CSS. The source hides the mark behind
5
+ // inverted alpha mattes that sweep a gap across each bar; same trick here
6
+ // with black shapes in luminance masks. Timing comes straight from the
7
+ // bodymovin json (50fps, frames 50-132 = one 1640ms loop), each segment
8
+ // keeping its original easing. Snap-backs between sweeps are step-end holds
9
+ // so no in-between frame ever paints.
10
+ //
11
+ // The top bar runs full-width under the dot: the resting gap between them is
12
+ // carved by the matte.
13
+
14
+ const uid = useId();
15
+ const maskTop = `${uid}-top`;
16
+ const maskMid = `${uid}-mid`;
17
+ const maskBot = `${uid}-bot`;
18
+ </script>
19
+
20
+ <template>
21
+ <defs>
22
+ <mask
23
+ :id="maskTop"
24
+ maskUnits="userSpaceOnUse"
25
+ >
26
+ <path
27
+ fill="#fff"
28
+ d="M423.38 178.08L176.97 177.96C163.72 177.96 152.97 188.71 152.97 201.97C152.97 215.23 163.72 225.98 176.97 225.98L423.38 226.1C436.64 226.1 447.39 215.35 447.39 202.09C447.39 188.83 436.64 178.08 423.38 178.08Z"
29
+ />
30
+ <path
31
+ fill="#fff"
32
+ d="M447.98 201.97C447.98 188.71 437.23 177.96 423.97 177.96C410.71 177.96 399.97 188.71 399.97 201.97C399.97 215.23 410.71 225.98 423.97 225.98C437.23 225.98 447.98 215.23 447.98 201.97Z"
33
+ />
34
+ <path
35
+ class="motion sweep--top"
36
+ fill="#000"
37
+ d="M434.45 260.27L434.45 227.26C430.77 227.26 427.96 226.64 423.87 226.64L424.06 226.64C410.5 226.64 399.51 215.99 399.51 202.16L399.32 202.16C399.32 188.33 410.5 177.31 424.06 177.31L423.87 177.31L423.12 157.76L318.0 157.99L317.8 177.19L326.25 177.19C339.8 177.19 350.79 188.4 350.79 202.23L350.79 202.23C350.79 216.06 339.8 227.27 326.25 227.27L319.59 227.27L319.49 260.27L434.45 260.27Z"
38
+ />
39
+ </mask>
40
+ <mask
41
+ :id="maskMid"
42
+ maskUnits="userSpaceOnUse"
43
+ >
44
+ <path
45
+ fill="#fff"
46
+ d="M375.96 276.45L226.06 276.45C212.8 276.45 202.05 287.2 202.05 300.46C202.05 313.72 212.8 324.47 226.06 324.47L375.96 324.47C389.22 324.47 399.97 313.72 399.97 300.46C399.97 287.2 389.22 276.45 375.96 276.45Z"
47
+ />
48
+ <path
49
+ class="motion sweep--mid"
50
+ fill="#000"
51
+ d="M237.83 358.97L237.83 325.96C234.15 325.96 230.59 325.96 226.51 325.96L226.51 325.96C212.95 325.96 201.96 314.75 201.96 300.92L201.96 300.92C201.96 287.1 212.95 275.89 226.51 275.89L226.51 275.89L226.51 256.46L86.77 256.79L86.56 275.4L95.02 275.99C108.57 275.99 119.56 287.2 119.56 301.03L119.56 301.03C119.56 314.86 108.57 326.07 95.02 326.07L88.36 327.03L88.26 359.07L237.83 358.97Z"
52
+ />
53
+ </mask>
54
+ <mask
55
+ :id="maskBot"
56
+ maskUnits="userSpaceOnUse"
57
+ >
58
+ <path
59
+ fill="#fff"
60
+ d="M326.88 374.98L275.13 374.98C261.88 374.98 251.13 385.73 251.13 398.99C251.13 412.25 261.88 422.99 275.13 422.99L326.88 422.99C340.14 422.99 350.89 412.25 350.89 398.99C350.89 385.73 340.14 374.98 326.88 374.98Z"
61
+ />
62
+ <path
63
+ class="motion sweep--bot"
64
+ fill="#000"
65
+ d="M287.08 457.17L287.08 424.16C283.4 424.16 279.84 424.16 275.75 424.16L275.75 424.16C262.2 424.16 251.21 412.95 251.21 399.12L251.21 399.12C251.21 385.29 262.2 374.08 275.75 374.08L275.75 374.08L275.75 354.66L183.89 354.8L183.68 373.41L192.14 374.0C205.69 374.0 216.68 385.21 216.68 399.04L216.68 399.04C216.68 412.87 205.69 424.08 192.14 424.08L185.48 425.04L185.38 457.08L287.08 457.17Z"
66
+ />
67
+ </mask>
68
+ </defs>
69
+
70
+ <path
71
+ class="badge"
72
+ d="M532.48 300.0C532.48 364.22 534.64 439.0 486.84 486.96C439.04 534.92 364.22 532.48 300.0 532.48C235.78 532.48 161.0 534.63 113.04 486.84C65.08 439.04 67.52 364.22 67.52 300.0C67.52 235.79 65.41 161.0 113.2 113.04C161.0 65.08 235.83 67.52 300.0 67.52C364.18 67.52 439.0 65.41 486.96 113.2C534.92 161.0 532.48 235.83 532.48 300.0Z"
73
+ />
74
+
75
+ <g :mask="`url(#${maskTop})`">
76
+ <path
77
+ class="mark"
78
+ d="M423.38 178.08L176.97 177.96C163.72 177.96 152.97 188.71 152.97 201.97C152.97 215.23 163.72 225.98 176.97 225.98L423.38 226.1C436.64 226.1 447.39 215.35 447.39 202.09C447.39 188.83 436.64 178.08 423.38 178.08Z"
79
+ />
80
+ <path
81
+ class="mark"
82
+ d="M447.98 201.97C447.98 188.71 437.23 177.96 423.97 177.96C410.71 177.96 399.97 188.71 399.97 201.97C399.97 215.23 410.71 225.98 423.97 225.98C437.23 225.98 447.98 215.23 447.98 201.97Z"
83
+ />
84
+ </g>
85
+
86
+ <path
87
+ class="mark"
88
+ :mask="`url(#${maskMid})`"
89
+ d="M375.96 276.45L226.06 276.45C212.8 276.45 202.05 287.2 202.05 300.46C202.05 313.72 212.8 324.47 226.06 324.47L375.96 324.47C389.22 324.47 399.97 313.72 399.97 300.46C399.97 287.2 389.22 276.45 375.96 276.45Z"
90
+ />
91
+
92
+ <path
93
+ class="mark"
94
+ :mask="`url(#${maskBot})`"
95
+ d="M326.88 374.98L275.13 374.98C261.88 374.98 251.13 385.73 251.13 398.99C251.13 412.25 261.88 422.99 275.13 422.99L326.88 422.99C340.14 422.99 350.89 412.25 350.89 398.99C350.89 385.73 340.14 374.98 326.88 374.98Z"
96
+ />
97
+ </template>
98
+
99
+ <style scoped>
100
+ .motion {
101
+ animation-duration: 1640ms;
102
+ animation-iteration-count: infinite;
103
+ animation-fill-mode: both;
104
+ }
105
+
106
+ .sweep--top {
107
+ animation-name: tornado-sweep-top;
108
+ }
109
+
110
+ .sweep--mid {
111
+ animation-name: tornado-sweep-mid;
112
+ }
113
+
114
+ .sweep--bot {
115
+ animation-name: tornado-sweep-bot;
116
+ }
117
+
118
+ /* source keyframes converted to % of the 82-frame loop */
119
+ @keyframes tornado-sweep-top {
120
+ 0% { transform: translateX(0); animation-timing-function: cubic-bezier(0.97, 0, 0.833, 1); }
121
+ 19.512% { transform: translateX(98.4px); animation-timing-function: step-end; }
122
+ 20.732% { transform: translateX(-246.4px); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
123
+ 36.585% { transform: translateX(99.3px); animation-timing-function: step-end; }
124
+ 37.805% { transform: translateX(-244.8px); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
125
+ 56.098% { transform: translateX(99.3px); animation-timing-function: step-end; }
126
+ 57.317% { transform: translateX(-244.8px); animation-timing-function: cubic-bezier(0.167, 0, 0.03, 1); }
127
+ 92.683%, 100% { transform: translateX(0); }
128
+ }
129
+
130
+ @keyframes tornado-sweep-mid {
131
+ 0%, 23.171% { transform: translateX(0); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
132
+ 39.024% { transform: translateX(283px); animation-timing-function: step-end; }
133
+ 40.244% { transform: translateX(0.8px); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
134
+ 58.537% { transform: translateX(283px); animation-timing-function: step-end; }
135
+ 59.756% { transform: translateX(0.8px); animation-timing-function: cubic-bezier(0.167, 0, 0.03, 1); }
136
+ 95.122%, 100% { transform: translateX(282.2px); }
137
+ }
138
+
139
+ @keyframes tornado-sweep-bot {
140
+ 0%, 25.61% { transform: translateX(0); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
141
+ 41.463% { transform: translateX(135px); animation-timing-function: step-end; }
142
+ 42.683% { transform: translateX(0); animation-timing-function: cubic-bezier(0.167, 0, 0.833, 1); }
143
+ 60.976% { transform: translateX(135px); animation-timing-function: step-end; }
144
+ 62.195% { transform: translateX(0); animation-timing-function: cubic-bezier(0.167, 0, 0.03, 1); }
145
+ 97.561%, 100% { transform: translateX(134.6px); }
146
+ }
147
+ </style>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui'
3
+ import { DropdownMenuRoot, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuRootProps>()
6
+ const emits = defineEmits<DropdownMenuRootEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <DropdownMenuRoot v-bind="{ ...forwarded, ...$attrs }">
13
+ <slot />
14
+ </DropdownMenuRoot>
15
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuContentEmits, DropdownMenuContentProps } from 'reka-ui'
3
+ import { DropdownMenuContent, DropdownMenuPortal, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = withDefaults(defineProps<DropdownMenuContentProps>(), {
6
+ sideOffset: 8,
7
+ align: 'start',
8
+ side: 'bottom',
9
+ })
10
+
11
+ const emits = defineEmits<DropdownMenuContentEmits>()
12
+ const forwarded = useForwardPropsEmits(props, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <DropdownMenuPortal>
17
+ <DropdownMenuContent
18
+ v-bind="{ ...forwarded, ...$attrs }"
19
+ class="bg-surface-neutral-bg-main rounded-xl border border-borders-neutral-light shadow-lg p-1 z-50"
20
+ data-colors-semantic="light"
21
+ >
22
+ <slot />
23
+ </DropdownMenuContent>
24
+ </DropdownMenuPortal>
25
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuGroup, DropdownMenuLabel } from 'reka-ui'
3
+
4
+ defineProps<{
5
+ label?: string
6
+ }>()
7
+ </script>
8
+
9
+ <template>
10
+ <DropdownMenuGroup v-bind="$attrs">
11
+ <DropdownMenuLabel
12
+ v-if="label"
13
+ class="text-content-legends-bold-md text-text-neutral-tertiary px-3 pt-3 pb-1"
14
+ >
15
+ {{ label }}
16
+ </DropdownMenuLabel>
17
+ <slot />
18
+ </DropdownMenuGroup>
19
+ </template>
@@ -0,0 +1,18 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuItemEmits, DropdownMenuItemProps } from 'reka-ui'
3
+ import { DropdownMenuItem, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuItemProps>()
6
+ const emits = defineEmits<DropdownMenuItemEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <DropdownMenuItem
13
+ v-bind="{ ...forwarded, ...$attrs }"
14
+ class="w-full flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-actions-primary-hover-overlay data-[highlighted]:bg-actions-primary-hover-overlay transition-colors text-left outline-none cursor-pointer text-content-text-md-regular text-text-neutral-base"
15
+ >
16
+ <slot />
17
+ </DropdownMenuItem>
18
+ </template>
@@ -0,0 +1,9 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuLabel } from 'reka-ui'
3
+ </script>
4
+
5
+ <template>
6
+ <DropdownMenuLabel v-bind="$attrs">
7
+ <slot />
8
+ </DropdownMenuLabel>
9
+ </template>
@@ -0,0 +1,9 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuSeparator } from 'reka-ui'
3
+ </script>
4
+
5
+ <template>
6
+ <DropdownMenuSeparator v-bind="$attrs">
7
+ <slot />
8
+ </DropdownMenuSeparator>
9
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSubEmits, DropdownMenuSubProps } from 'reka-ui'
3
+ import { DropdownMenuSub, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuSubProps>()
6
+ const emits = defineEmits<DropdownMenuSubEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <DropdownMenuSub v-bind="{ ...forwarded, ...$attrs }">
13
+ <slot />
14
+ </DropdownMenuSub>
15
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSubContentEmits, DropdownMenuSubContentProps } from 'reka-ui'
3
+ import { DropdownMenuSubContent, DropdownMenuPortal, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = withDefaults(defineProps<DropdownMenuSubContentProps>(), {
6
+ sideOffset: 4,
7
+ })
8
+
9
+ const emits = defineEmits<DropdownMenuSubContentEmits>()
10
+ const forwarded = useForwardPropsEmits(props, emits)
11
+ </script>
12
+
13
+ <template>
14
+ <DropdownMenuPortal>
15
+ <DropdownMenuSubContent
16
+ v-bind="{ ...forwarded, ...$attrs }"
17
+ class="bg-surface-neutral-bg-main rounded-xl border border-borders-neutral-light shadow-lg p-1 z-50"
18
+ data-colors-semantic="light"
19
+ >
20
+ <slot />
21
+ </DropdownMenuSubContent>
22
+ </DropdownMenuPortal>
23
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSubTriggerProps } from 'reka-ui'
3
+ import { DropdownMenuSubTrigger, useForwardProps } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuSubTriggerProps>()
6
+ const forwarded = useForwardProps(props)
7
+ </script>
8
+
9
+ <template>
10
+ <DropdownMenuSubTrigger
11
+ v-bind="{ ...forwarded, ...$attrs }"
12
+ class="w-full flex items-center justify-between gap-3 px-3 py-2 rounded-lg hover:bg-actions-primary-hover-overlay data-[highlighted]:bg-actions-primary-hover-overlay data-[state=open]:bg-actions-primary-hover-overlay transition-colors text-left outline-none cursor-pointer"
13
+ >
14
+ <slot />
15
+ <span class="i-ls-chevron-right w-4 h-4 text-text-neutral-tertiary shrink-0" />
16
+ </DropdownMenuSubTrigger>
17
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuTriggerProps } from 'reka-ui'
3
+ import { DropdownMenuTrigger, useForwardProps } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuTriggerProps>()
6
+ const forwarded = useForwardProps(props)
7
+ </script>
8
+
9
+ <template>
10
+ <DropdownMenuTrigger v-bind="{ ...forwarded, ...$attrs }">
11
+ <slot />
12
+ </DropdownMenuTrigger>
13
+ </template>
@@ -0,0 +1,10 @@
1
+ export { default as UiMenu } from './UiMenu.vue'
2
+ export { default as UiMenuTrigger } from './UiMenuTrigger.vue'
3
+ export { default as UiMenuContent } from './UiMenuContent.vue'
4
+ export { default as UiMenuItem } from './UiMenuItem.vue'
5
+ export { default as UiMenuGroup } from './UiMenuGroup.vue'
6
+ export { default as UiMenuLabel } from './UiMenuLabel.vue'
7
+ export { default as UiMenuSub } from './UiMenuSub.vue'
8
+ export { default as UiMenuSubTrigger } from './UiMenuSubTrigger.vue'
9
+ export { default as UiMenuSubContent } from './UiMenuSubContent.vue'
10
+ export { default as UiMenuSeparator } from './UiMenuSeparator.vue'
@@ -0,0 +1,201 @@
1
+ <script setup lang="ts">
2
+ import { computed, onBeforeUnmount, onMounted, ref, watch, getCurrentInstance, type Slot } from 'vue'
3
+ import { BREAKPOINT_LG } from '../../utils/breakpoints'
4
+ import useThemeAndModes from '../../composables/useThemeAndModes'
5
+ import { useMobileMenu } from '../../composables/useMobileMenu'
6
+ import UiLoader from '../UiLoader/UiLoader.vue'
7
+
8
+ // UiShell structure
9
+ // ┌───────────────────────────────────────────────────────┐
10
+ // │ UiShell │
11
+ // │ ┌───────────────────────────────────────────────────┐ │
12
+ // │ │ #banner │ │
13
+ // │ ├───────────────────────────────────────────────────┤ │
14
+ // │ │ ┌─┬─────────────────────────────────────────────┐ │ │
15
+ // │ │ │s│ UiPage │ │ │
16
+ // │ │ │i│ ┌─────────────────────────────────────────┐ │ │ │
17
+ // │ │ │d│ │ #pageHeader │ │ │ │
18
+ // │ │ │e│ ├─────────────────────────────────────────┤ │ │ │
19
+ // │ │ │m│ │ #pageTabs │ │ │ │
20
+ // │ │ │e│ ├─────────────────────────────────────────┤ │ │ │
21
+ // │ │ │n│ │ page-content │ │ │ │
22
+ // │ │ │u│ │ ┌──────────┬──────────────────────────┐ │ │ │ │
23
+ // │ │ │ │ │ │#leftSlot │ content (2/3) │ │ │ │ │
24
+ // │ │ │ │ │ │ (1/3) │ ┌──────────────────────┐ │ │ │ │ │
25
+ // │ │ │ │ │ │ │ │ #header │ │ │ │ │ │
26
+ // │ │ │ │ │ │ │ ├──────────────────────┤ │ │ │ │ │
27
+ // │ │ │ │ │ │ │ │ #default │ │ │ │ │ │
28
+ // │ │ │ │ │ │ │ │ │ │ │ │ │ │
29
+ // │ │ │ │ │ │ │ ├──────────────────────┤ │ │ │ │ │
30
+ // │ │ │ │ │ │ │ │ #footer │ │ │ │ │ │
31
+ // │ │ │ │ │ │ │ └──────────────────────┘ │ │ │ │ │
32
+ // │ │ │ │ │ └──────────┴──────────────────────────┘ │ │ │ │
33
+ // │ │ │ │ └─────────────────────────────────────────┘ │ │ │
34
+ // │ │ │ └─────────────────────────────────────────────┘ │ │
35
+ // │ │ └─────────────────────────────────────────────────┘ │
36
+ // └─┴─────────────────────────────────────────────────────┘
37
+
38
+ const props = withDefaults(defineProps<{
39
+ /**
40
+ * Extra classes for the inner content `<section>`. Use to override the
41
+ * default surface, e.g. `bg-surface-neutral-300` instead of the standard
42
+ * `bg-surface-neutral-bg-main`. Appended after the defaults so it wins on
43
+ * conflicting utilities.
44
+ */
45
+ pageContentClasses?: string
46
+ /**
47
+ * Page title surfaced as the label of UiShell's fallback mobile menu topbar
48
+ * (shown on a headerless page that has a side menu). Lets a page name its
49
+ * menu row — e.g. "Home" — without reaching into useMobileMenu directly.
50
+ */
51
+ title?: string
52
+ }>(), {
53
+ pageContentClasses: '',
54
+ title: undefined,
55
+ })
56
+
57
+ const slots = defineSlots<{
58
+ banner?(): Slot
59
+ pageHeader?(): Slot
60
+ pageTabs?(): Slot
61
+ leftSlot?(): Slot
62
+ header?(): Slot
63
+ footer?(): Slot
64
+ default?(): Slot
65
+ }>()
66
+
67
+ // Check for slot presence
68
+ const bannerSlot = computed(() => !!slots.banner)
69
+ const pageHeaderSlot = computed(() => !!slots.pageHeader)
70
+ const pageTabsSlot = computed(() => !!slots.pageTabs)
71
+ const leftSlot = computed(() => !!slots.leftSlot)
72
+ const headerSlot = computed(() => !!slots.header)
73
+ const footerSlot = computed(() => !!slots.footer)
74
+
75
+ // Feed the page title to UiShell's fallback mobile menu topbar. Watched so a
76
+ // reactive title updates live, and cleared on unmount so it doesn't leak to
77
+ // the next route.
78
+ const { setMenuLabel } = useMobileMenu()
79
+ watch(() => props.title, (title) => setMenuLabel(title ?? null), { immediate: true })
80
+ onBeforeUnmount(() => setMenuLabel(null))
81
+
82
+ const app = getCurrentInstance()
83
+ if (!app) {
84
+ throw new Error('No current instance found')
85
+ }
86
+ const responsive = computed(() => app.appContext.config.globalProperties.$responsive)
87
+ const displayLeftSlot = computed(() => responsive.value.width >= BREAKPOINT_LG)
88
+
89
+ const UiPage = ref<HTMLElement | undefined>()
90
+ const PageContent = ref<HTMLElement | undefined>()
91
+
92
+ const { addElementToWatch } = useThemeAndModes()
93
+
94
+ // The page content historically forces light mode. Only lift that pin when
95
+ // the internal theming tooling is enabled, so the stored content mode
96
+ // (driven by the ThemePicker) can apply; for everyone else the content
97
+ // stays light regardless of what localStorage may hold.
98
+ const isInternalThemingEnabled = localStorage.getItem('ls-internal-theming') === 'true'
99
+
100
+ onMounted(() => {
101
+ addElementToWatch(
102
+ 'content',
103
+ {
104
+ selector: '[data-name="ui-page-content"]',
105
+ element: PageContent.value!,
106
+ ...(isInternalThemingEnabled ? {} : { modeOverride: 'light' }),
107
+ })
108
+ })
109
+
110
+ </script>
111
+
112
+ <template>
113
+ <main
114
+ ref="UiPage"
115
+ data-name="ui-page-wrapper"
116
+ class="ui-page h-full flex flex-col"
117
+ >
118
+ <section
119
+ v-if="bannerSlot"
120
+ data-name="banner"
121
+ >
122
+ <slot name="banner" />
123
+ </section>
124
+
125
+ <section
126
+ class="page-view flex-1 flex flex-col min-h-0"
127
+ >
128
+ <section
129
+ v-if="pageHeaderSlot"
130
+ ref="pageHeader"
131
+ data-name="pageHeader"
132
+ class="page-header p-4 md:p-8 md:pl-0 relative"
133
+ >
134
+ <slot name="pageHeader" />
135
+ </section>
136
+
137
+ <!-- Teleport Target to the pageTabs slot -->
138
+ <div id="ui-page-tabs-teleport-target" />
139
+
140
+ <section
141
+ v-if="pageTabsSlot"
142
+ data-name="pageTabs"
143
+ >
144
+ <slot name="pageTabs" />
145
+ </section>
146
+
147
+ <section
148
+ ref="PageContent"
149
+ data-name="pageContent"
150
+ class="page-content flex-1 overflow-y-auto w-full grid has-[>:nth-child(2)]:lg:grid-cols-[1fr_2fr] lg:gap-x-8 min-h-0"
151
+ :data-colors-semantic="isInternalThemingEnabled ? undefined : 'light'"
152
+ >
153
+ <aside
154
+ v-if="leftSlot && displayLeftSlot"
155
+ data-name="leftSlot"
156
+ class="left-slot"
157
+ >
158
+ <slot name="leftSlot" />
159
+ </aside>
160
+
161
+ <div class="min-w-0 overflow-hidden rounded-tl-xl">
162
+ <section
163
+ :class="[
164
+ 'content min-w-0 overflow-y-auto h-full bg-surface-neutral-bg-main grid shadow-shadows-drop-shadow-2xl rounded-tl-xl',
165
+ // Nudge the content down only when it sits flush at the top — i.e.
166
+ // no page header and no left slot to align against.
167
+ !pageHeaderSlot && !leftSlot ? 'mt-1' : '',
168
+ headerSlot ? 'grid-rows-[min-content]' : '',
169
+ props.pageContentClasses,
170
+ ]"
171
+ data-name="ui-shell-content"
172
+ >
173
+ <section
174
+ v-if="headerSlot"
175
+ data-name="header"
176
+ class="content-header p-4 sm:p-6"
177
+ >
178
+ <slot name="header" />
179
+ </section>
180
+
181
+ <section
182
+ data-name="main-content"
183
+ class="route-content w-full min-w-0 flex flex-col"
184
+ >
185
+ <slot>
186
+ <UiLoader />
187
+ </slot>
188
+ </section>
189
+
190
+ <section
191
+ v-if="footerSlot"
192
+ name="footer"
193
+ >
194
+ <slot name="footer" />
195
+ </section>
196
+ </section>
197
+ </div>
198
+ </section>
199
+ </section>
200
+ </main>
201
+ </template>
@@ -0,0 +1,128 @@
1
+ <script setup lang="ts">
2
+ import { computed, onBeforeUnmount, useSlots, watch, type Slot } from 'vue'
3
+ import LivestormLogo from '@livestorm/ui-tokens/output/vectors/logos/livestorm-white.svg'
4
+ import UiButton from '../UiButton/UiButton.vue'
5
+ import { useMobileMenu } from '../../composables/useMobileMenu'
6
+ import type { RouteLocationRaw } from 'vue-router'
7
+
8
+ const slots = useSlots()
9
+
10
+ const props = withDefaults(defineProps<{
11
+ title?: string
12
+ iconStart?: string
13
+ showBackButton?: boolean
14
+ showLogo?: boolean
15
+ showMobileMenu?: boolean
16
+ allowGlobalMobileMenu?: boolean
17
+ logoTo?: RouteLocationRaw | null
18
+ titleSize?: 'sm' | 'md' | 'lg' | 'xl'
19
+ }>(), {
20
+ showLogo: false,
21
+ showBackButton: false,
22
+ showMobileMenu: true,
23
+ titleSize: 'md',
24
+ logoTo: '/',
25
+ allowGlobalMobileMenu: true,
26
+ })
27
+
28
+ defineSlots<{
29
+ slotA?: () => Slot
30
+ slotB?: () => Slot
31
+ title?: () => Slot
32
+ }>()
33
+
34
+ const hasSlotA = computed(() => !!slots.slotA)
35
+ const hasSlotB = computed(() => !!slots.slotB)
36
+
37
+ // Title is one step smaller on mobile, scaling up to the configured size at
38
+ // `md+` so long titles don't dominate narrow screens.
39
+ const fontSizeMap: Record<'sm' | 'md' | 'lg' | 'xl', string> = {
40
+ sm: 'text-title-sm-bold',
41
+ md: 'text-title-sm-bold md:text-title-md-bold',
42
+ lg: 'text-title-md-bold md:text-title-lg-bold',
43
+ xl: 'text-title-lg-bold md:text-title-xl',
44
+ }
45
+
46
+ const { toggle, registerTrigger, unregisterTrigger } = useMobileMenu()
47
+
48
+ // Let UiShell know a header-owned open-menu trigger exists, so it skips its
49
+ // own fallback hamburger. Only count it while the header actually renders one.
50
+ let registered = false
51
+ const syncTrigger = (active: boolean) => {
52
+ if (active && !registered) {
53
+ registerTrigger()
54
+ registered = true
55
+ } else if (!active && registered) {
56
+ unregisterTrigger()
57
+ registered = false
58
+ }
59
+ }
60
+
61
+ watch(() => props.allowGlobalMobileMenu, syncTrigger, { immediate: true })
62
+
63
+ onBeforeUnmount(() => syncTrigger(false))
64
+
65
+ </script>
66
+
67
+ <template>
68
+ <div
69
+ class="flex flex-1 min-w-0 justify-between gap-5 md:gap-8 items-center"
70
+ >
71
+ <div class="flex min-w-0 items-center gap-2">
72
+ <div v-if="showLogo">
73
+ <router-link
74
+ :to="logoTo ? logoTo : '#'"
75
+ class="grid items-center w-8 h-8"
76
+ >
77
+ <img
78
+ :src="LivestormLogo"
79
+ alt="Livestorm logo"
80
+ class="w-6 h-6"
81
+ >
82
+ </router-link>
83
+ </div>
84
+ <div
85
+ v-if="allowGlobalMobileMenu"
86
+ class="md:hidden"
87
+ >
88
+ <UiButton
89
+ color="neutral"
90
+ variant="tertiary"
91
+ icon="i-ls-menu"
92
+ @click="toggle"
93
+ />
94
+ </div>
95
+ <div v-if="showBackButton">
96
+ <UiButton
97
+ color="neutral"
98
+ variant="tertiary"
99
+ icon="i-ls-back"
100
+ />
101
+ </div>
102
+ <div
103
+ v-if="iconStart"
104
+ :class="[iconStart, 'w-8 h-8 text-text-neutral-base']"
105
+ />
106
+ <div
107
+ :class="[fontSizeMap[props.titleSize], 'text-text-neutral-base']"
108
+ class="min-w-0 grow truncate"
109
+ >
110
+ {{ title }}
111
+ </div>
112
+ <slot name="title" />
113
+ </div>
114
+ <div
115
+ v-if="hasSlotA"
116
+ class="min-w-0 flex-1"
117
+ >
118
+ <slot name="slotA" />
119
+ </div>
120
+
121
+ <div
122
+ v-if="hasSlotB"
123
+ class="flex shrink-0 items-center gap-4"
124
+ >
125
+ <slot name="slotB" />
126
+ </div>
127
+ </div>
128
+ </template>