@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,28 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps<{
3
+ label: string
4
+ }>()
5
+ </script>
6
+
7
+ <template>
8
+ <div class="separator text-content-legends-medium-md">
9
+ <p
10
+ class="w-full"
11
+ v-text="props.label"
12
+ />
13
+ </div>
14
+ </template>
15
+
16
+ <style scoped>
17
+ @reference '@livestorm/ui-tokens/output/supernova/index.css';
18
+
19
+ .separator {
20
+ @apply w-full grid grid-flow-col grid-cols-[1fr_auto_1fr] gap-x-2 items-center text-center text-text-neutral-tertiary;
21
+ }
22
+
23
+ .separator::before,
24
+ .separator::after {
25
+ content: '';
26
+ @apply border-t border-borders-neutral-light h-0 w-full;
27
+ }
28
+ </style>
@@ -0,0 +1,477 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref, watch, nextTick } from 'vue'
3
+ import { Label, useId } from 'reka-ui'
4
+ import type { CheckboxSize } from './types'
5
+
6
+ interface UiInputCheckboxProps {
7
+ /**
8
+ * The checkbox value (boolean for single checkbox, or value for array binding)
9
+ */
10
+ modelValue?: boolean | string | number | (string | number)[]
11
+ /**
12
+ * The value of this checkbox (used when binding to array)
13
+ */
14
+ value?: string | number
15
+ /**
16
+ * Whether the checkbox is checked (for boolean binding)
17
+ */
18
+ checked?: boolean
19
+ /**
20
+ * Whether the checkbox is disabled
21
+ * @default false
22
+ */
23
+ disabled?: boolean
24
+ /**
25
+ * Whether the checkbox is in indeterminate state
26
+ * @default false
27
+ */
28
+ indeterminate?: boolean
29
+ /**
30
+ * Whether the checkbox has an error
31
+ * @default false
32
+ */
33
+ error?: boolean
34
+ /**
35
+ * The label text
36
+ */
37
+ label?: string
38
+ /**
39
+ * Whether the label is required
40
+ * @default false
41
+ */
42
+ required?: boolean
43
+ /**
44
+ * Info tooltip for the label
45
+ */
46
+ labelInfo?: string
47
+ /**
48
+ * Description text below the label
49
+ */
50
+ description?: string
51
+ /**
52
+ * Error message to display
53
+ */
54
+ errorMessage?: string
55
+ /**
56
+ * Checkbox name attribute
57
+ */
58
+ name?: string
59
+ /**
60
+ * Checkbox id attribute
61
+ */
62
+ id?: string
63
+ /**
64
+ * Size of the checkbox
65
+ * @default 'md'
66
+ */
67
+ size?: CheckboxSize
68
+ /**
69
+ * Layout orientation
70
+ * @default 'horizontal'
71
+ */
72
+ orientation?: 'horizontal' | 'vertical'
73
+ /**
74
+ * Whether to show background color
75
+ * @default false
76
+ */
77
+ showBg?: boolean
78
+ }
79
+
80
+ const props = withDefaults(defineProps<UiInputCheckboxProps>(), {
81
+ disabled: false,
82
+ indeterminate: false,
83
+ error: false,
84
+ required: false,
85
+ size: 'md',
86
+ checked: undefined,
87
+ orientation: 'horizontal',
88
+ })
89
+
90
+ const emit = defineEmits<{
91
+ 'update:modelValue': [value: boolean | string | number | (string | number)[]]
92
+ 'change': [event: Event]
93
+ 'focus': [event: FocusEvent]
94
+ 'blur': [event: FocusEvent]
95
+ }>()
96
+
97
+ const checkboxRef = ref<HTMLInputElement | null>(null)
98
+
99
+ function triggerCheckbox () {
100
+ if (!props.disabled) {
101
+ checkboxRef.value?.click()
102
+ }
103
+ }
104
+ const isFocused = ref(false)
105
+ const inputId = useId()
106
+
107
+ // Determine if checkbox is checked
108
+ const isChecked = computed(() => {
109
+ // If checked prop is explicitly provided, use it
110
+ if (props.checked !== undefined) {
111
+ return props.checked
112
+ }
113
+
114
+ // Handle array binding (multiple checkboxes)
115
+ if (Array.isArray(props.modelValue)) {
116
+ return props.value !== undefined && props.modelValue.includes(props.value)
117
+ }
118
+
119
+ // Handle boolean binding (single checkbox)
120
+ if (typeof props.modelValue === 'boolean') {
121
+ return props.modelValue
122
+ }
123
+
124
+ // Handle value binding (single checkbox with value)
125
+ if (props.value !== undefined && props.modelValue !== undefined) {
126
+ return props.modelValue === props.value
127
+ }
128
+
129
+ return false
130
+ })
131
+
132
+ const checkboxClasses = computed(() => {
133
+ const baseClasses = [
134
+ 'appearance-none',
135
+ 'relative shrink-0 grid place-content-center',
136
+ 'border rounded-sm transition-colors',
137
+ 'focus:outline-hidden',
138
+ ]
139
+
140
+ baseClasses.push(props.disabled ? 'cursor-not-allowed' : 'cursor-pointer')
141
+
142
+ // Size classes
143
+ const sizeClasses = {
144
+ sm: 'w-3.5 h-3.5',
145
+ md: 'w-4 h-4',
146
+ lg: 'w-5 h-5',
147
+ }
148
+
149
+ baseClasses.push(sizeClasses[props.size])
150
+
151
+ // Background and border based on state
152
+ if (props.error) {
153
+ baseClasses.push('border-borders-danger-strong')
154
+ if (isChecked.value || props.indeterminate) {
155
+ baseClasses.push('bg-actions-danger-idle')
156
+ } else {
157
+ baseClasses.push('bg-surface-neutral-bg-main')
158
+ }
159
+ } else if (isChecked.value || props.indeterminate) {
160
+ baseClasses.push('bg-actions-primary-idle border-borders-primary-default')
161
+ } else {
162
+ baseClasses.push('bg-surface-neutral-bg-main border-borders-neutral-strong')
163
+ }
164
+
165
+ if (isFocused.value && !props.disabled) {
166
+ baseClasses.push('ring')
167
+ if (isChecked.value && !props.error) {
168
+ baseClasses.push('ring-borders-primary-strong')
169
+ } else if (props.error) {
170
+ baseClasses.push('ring-borders-danger-strong')
171
+ } else {
172
+ baseClasses.push('ring-2 ring-inset ring-focus-ring')
173
+ }
174
+ }
175
+
176
+ return baseClasses
177
+ })
178
+
179
+ const iconClasses = computed(() => {
180
+ const baseClasses = ['transition-opacity']
181
+
182
+ // Size classes for icon
183
+ const sizeClasses = {
184
+ sm: 'size-2.5',
185
+ md: 'size-3',
186
+ lg: 'size-3.5',
187
+ }
188
+
189
+ baseClasses.push(sizeClasses[props.size])
190
+
191
+ // Icon type and color based on state
192
+ if (props.indeterminate) {
193
+ baseClasses.push('i-ls-minus text-actions-neutral-invert-idle opacity-100')
194
+ } else if (isChecked.value) {
195
+ // Checked: always visible with light color on primary/error background
196
+ baseClasses.push('i-ls-checkbox-check text-actions-neutral-invert-idle opacity-100')
197
+ } else if (props.error) {
198
+ // Unchecked + error: show on hover only with danger color
199
+ baseClasses.push('i-ls-checkbox-check text-actions-danger-idle opacity-0 group-hover:opacity-50')
200
+ } else {
201
+ // Unchecked + no error: show on hover only with neutral color
202
+ baseClasses.push('i-ls-checkbox-check text-actions-neutral-idle opacity-0 group-hover:opacity-50')
203
+ }
204
+
205
+ return baseClasses
206
+ })
207
+
208
+ const displayMessage = computed(() => {
209
+ if (props.error && props.errorMessage) {
210
+ return props.errorMessage
211
+ }
212
+ return undefined
213
+ })
214
+
215
+ // for error/helper message
216
+ const displayMessageClasses = computed(() => {
217
+ const baseClasses = ['text-content-legends-bold-md mt-1']
218
+
219
+ if (props.error) {
220
+ baseClasses.push('text-text-danger-secondary')
221
+ } else {
222
+ baseClasses.push('text-text-neutral-secondary')
223
+ }
224
+
225
+ return baseClasses
226
+ })
227
+
228
+ const innerWrapperClasses = computed(() => {
229
+ const classes: string[] = ['group relative rounded-lg flex flex-col'];
230
+
231
+ if (props.orientation === 'vertical') {
232
+ classes.push('items-center');
233
+ }
234
+
235
+ if (props.disabled) {
236
+ classes.push('hover:cursor-not-allowed opacity-50')
237
+ } else {
238
+ classes.push('hover:cursor-pointer')
239
+ }
240
+
241
+ if (props.showBg) {
242
+ classes.push('p-2 ring-inset');
243
+ if (isChecked.value && !props.error) {
244
+ // checked
245
+ classes.push('bg-actions-primary-idle-alpha-light ring-2 ring-borders-primary-strong');
246
+ } else if (!isChecked.value && !props.error) {
247
+ // idle
248
+ classes.push('bg-surface-neutral-alpha-100 ring-transparent');
249
+ } else if (isChecked.value && props.error) {
250
+ // error + checked
251
+ classes.push('bg-actions-danger-idle-alpha-light ring-2 ring-borders-danger-strong');
252
+ } else {
253
+ // error + unchecked
254
+ classes.push('bg-actions-danger-idle-alpha-light')
255
+ }
256
+ }
257
+
258
+ if (props.disabled) {
259
+ classes.push('cursor-not-allowed')
260
+ } else {
261
+ classes.push('cursor-pointer')
262
+ }
263
+
264
+ return classes;
265
+ });
266
+
267
+ function handleChange (event: Event) {
268
+ const target = event.target as HTMLInputElement
269
+ let newValue: boolean | string | number | (string | number)[]
270
+
271
+ // Handle array binding (multiple checkboxes)
272
+ if (Array.isArray(props.modelValue)) {
273
+ newValue = [...props.modelValue]
274
+ if (target.checked) {
275
+ if (props.value !== undefined && !newValue.includes(props.value)) {
276
+ newValue.push(props.value)
277
+ }
278
+ } else {
279
+ if (props.value !== undefined) {
280
+ const index = newValue.indexOf(props.value)
281
+ if (index > -1) {
282
+ newValue.splice(index, 1)
283
+ }
284
+ }
285
+ }
286
+ } else if (props.value !== undefined) {
287
+ // Handle value binding (single checkbox with value)
288
+ newValue = target.checked ? props.value : false
289
+ } else {
290
+ // Handle boolean binding (single checkbox)
291
+ newValue = target.checked
292
+ }
293
+
294
+ emit('update:modelValue', newValue)
295
+ emit('change', event)
296
+ }
297
+
298
+ function handleFocus(event: FocusEvent) {
299
+ isFocused.value = true
300
+ emit('focus', event)
301
+ }
302
+
303
+ function handleBlur (event: FocusEvent) {
304
+ isFocused.value = false
305
+ emit('blur', event)
306
+ }
307
+
308
+ // Set indeterminate state when prop changes
309
+ watch(() => props.indeterminate, (newVal) => {
310
+ nextTick(() => {
311
+ if (checkboxRef.value) {
312
+ checkboxRef.value.indeterminate = newVal
313
+ }
314
+ })
315
+ }, { immediate: true })
316
+
317
+ defineExpose({
318
+ focus: () => checkboxRef.value?.focus(),
319
+ blur: () => checkboxRef.value?.blur(),
320
+ })
321
+ </script>
322
+
323
+ <template>
324
+ <div class="ui-input-checkbox-wrapper w-fit">
325
+ <div
326
+ :class="innerWrapperClasses"
327
+ @click="triggerCheckbox"
328
+ >
329
+ <input
330
+ :id="inputId"
331
+ ref="checkboxRef"
332
+ :checked="isChecked"
333
+ :disabled="disabled"
334
+ :name="name"
335
+ type="checkbox"
336
+ class="absolute opacity-0 pointer-events-none"
337
+ :aria-invalid="error"
338
+ :aria-describedby="displayMessage ? `${inputId}-message` : undefined"
339
+ @change="handleChange"
340
+ @focus="handleFocus"
341
+ @blur="handleBlur"
342
+ >
343
+
344
+ <!-- First row (contains checkbox for horizontal orientation) -->
345
+ <div
346
+ class="flex items-center"
347
+ :class="{ 'justify-center': orientation === 'vertical' }"
348
+ >
349
+ <!-- Checkbox - horizontal only -->
350
+ <label
351
+ v-if="orientation === 'horizontal'"
352
+ class="flex w-5 items-center justify-center shrink-0 mr-2"
353
+ :class="disabled ? 'cursor-not-allowed' : 'cursor-pointer'"
354
+ >
355
+ <span
356
+ :class="checkboxClasses"
357
+ aria-hidden="true"
358
+ >
359
+ <span
360
+ :class="iconClasses"
361
+ class="block relative z-1"
362
+ >
363
+ <div
364
+ class="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none"
365
+ :class="{
366
+ 'bg-actions-neutral-hover-overlay': !isChecked && !error,
367
+ 'bg-actions-danger-hover-overlay': error,
368
+ 'bg-actions-primary-hover-overlay': isChecked && !error,
369
+ }"
370
+ />
371
+ </span>
372
+ </span>
373
+ </label>
374
+
375
+ <Label
376
+ :for="inputId"
377
+ class="text-content-text-md-regular"
378
+ :class="{
379
+ 'text-text-neutral-base': !error && !isChecked,
380
+ 'text-text-danger-base': error,
381
+ 'text-text-primary-base': isChecked && !error,
382
+ 'cursor-not-allowed': disabled,
383
+ 'cursor-pointer': !disabled,
384
+ }"
385
+ @click.stop
386
+ >
387
+ <slot name="label">
388
+ {{ label }}{{ required ? '*' : '' }}
389
+ </slot>
390
+ </Label>
391
+
392
+ <!-- icon -->
393
+ <div
394
+ v-if="labelInfo"
395
+ v-tooltip="labelInfo"
396
+ class="flex items-center justify-center size-4 text-text-neutral-primary cursor-help shrink-0"
397
+ :class="{
398
+ 'text-text-neutral-base': !error && !isChecked,
399
+ 'text-text-danger-base': error,
400
+ 'text-text-primary-base': isChecked && !error,
401
+ }"
402
+ >
403
+ <span class="i-ls-info-fill size-4" />
404
+ </div>
405
+ </div>
406
+
407
+ <span
408
+ v-if="description"
409
+ class="text-content-text-md-regular"
410
+ :class="{
411
+ 'ml-7': orientation === 'horizontal',
412
+ 'text-center': orientation === 'vertical',
413
+ 'text-text-neutral-tertiary': !error && !isChecked,
414
+ 'text-text-danger-tertiary': error,
415
+ 'text-text-primary-tertiary': isChecked && !error,
416
+ 'cursor-not-allowed': disabled,
417
+ 'cursor-pointer': !disabled,
418
+ }"
419
+ >
420
+ {{ description }}
421
+ </span>
422
+
423
+ <!-- Checkbox - vertical only -->
424
+ <label
425
+ v-if="orientation === 'vertical'"
426
+ class="flex justify-center mt-2"
427
+ :class="disabled ? 'cursor-not-allowed' : 'cursor-pointer'"
428
+ >
429
+ <span
430
+ :class="checkboxClasses"
431
+ aria-hidden="true"
432
+ >
433
+ <span
434
+ :class="iconClasses"
435
+ class="block relative z-1"
436
+ >
437
+ <div
438
+ class="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none"
439
+ :class="{
440
+ 'bg-actions-neutral-hover-overlay': !isChecked && !error,
441
+ 'bg-actions-danger-hover-overlay': error,
442
+ 'bg-actions-primary-hover-overlay': isChecked && !error,
443
+ }"
444
+ />
445
+ </span>
446
+ </span>
447
+ </label>
448
+
449
+ <div
450
+ v-if="showBg"
451
+ class="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none rounded-lg"
452
+ :class="{
453
+ 'bg-actions-neutral-hover-overlay': !isChecked && !error,
454
+ 'bg-actions-danger-hover-overlay': error,
455
+ 'bg-actions-primary-hover-overlay': isChecked && !error,
456
+ }"
457
+ />
458
+ </div>
459
+
460
+ <!-- Helper/Error Message -->
461
+ <p
462
+ v-if="displayMessage"
463
+ :id="`${inputId}-message`"
464
+ :class="displayMessageClasses"
465
+ >
466
+ {{ displayMessage }}
467
+ </p>
468
+ </div>
469
+ </template>
470
+
471
+ <style scoped>
472
+ @reference '@livestorm/ui-tokens/output/supernova/index.css';
473
+
474
+ .ui-input-checkbox-wrapper :deep(a) {
475
+ @apply text-text-primary-secondary underline;
476
+ }
477
+ </style>
@@ -0,0 +1,2 @@
1
+ export { default as UiInputCheckbox } from './UiInputCheckbox.vue'
2
+ export type { CheckboxSize } from './types'
@@ -0,0 +1 @@
1
+ export type CheckboxSize = 'sm' | 'md' | 'lg'
@@ -0,0 +1,166 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import UiFieldWrapper from '../UiFieldWrapper/UiFieldWrapper.vue'
4
+ import UiDropdown from '../UiDropdown/UiDropdown.vue'
5
+ import UiDropdownTrigger from '../UiDropdown/UiDropdownTrigger.vue'
6
+ import UiDropdownContent from '../UiDropdown/UiDropdownContent.vue'
7
+ import UiDropdownItem from '../UiDropdown/UiDropdownItem.vue'
8
+ import type { AcceptableValue } from 'reka-ui'
9
+ import type { SelectSize } from './types'
10
+
11
+ interface UiInputSelectProps {
12
+ size?: SelectSize
13
+ /**
14
+ * Selected value. Pass a `string` for single-select, or a `string[]` when
15
+ * `multiple` is enabled.
16
+ */
17
+ modelValue?: string | string[] | null
18
+ placeholder?: string
19
+ disabled?: boolean
20
+ loading?: boolean
21
+ error?: boolean
22
+ label?: string
23
+ required?: boolean
24
+ labelInfo?: string
25
+ helperMessage?: string
26
+ errorMessage?: string
27
+ name?: string
28
+ clearable?: boolean
29
+ id?: string
30
+ ariaDescribedby?: string
31
+ defaultOpen?: boolean
32
+ /**
33
+ * Enable multi-select. When set, `v-model` must be bound to an array and
34
+ * the dropdown items render with a leading checkbox (same look as
35
+ * `UiDropdown multiple`).
36
+ */
37
+ multiple?: boolean
38
+ }
39
+
40
+ const props = withDefaults(defineProps<UiInputSelectProps>(), {
41
+ size: 'md',
42
+ disabled: false,
43
+ loading: false,
44
+ error: false,
45
+ required: false,
46
+ placeholder: 'Select',
47
+ modelValue: undefined,
48
+ name: undefined,
49
+ label: undefined,
50
+ labelInfo: undefined,
51
+ helperMessage: undefined,
52
+ errorMessage: undefined,
53
+ clearable: false,
54
+ id: undefined,
55
+ ariaDescribedby: undefined,
56
+ defaultOpen: false,
57
+ multiple: false,
58
+ })
59
+
60
+ // Sentinel value for the "clear" option — intentionally verbose to avoid collisions with real values
61
+ const CLEAR_VALUE = '__ui-input-select-clear__'
62
+
63
+ const emit = defineEmits<{
64
+ 'update:modelValue': [value: string | string[] | undefined]
65
+ 'blur': [event: FocusEvent]
66
+ }>()
67
+
68
+ // Normalize the forwarded value: single-select passes through, multi-select
69
+ // always passes an array (Reka's `SelectRoot multiple` expects one).
70
+ const forwardedValue = computed(() => {
71
+ if (props.multiple) return Array.isArray(props.modelValue) ? props.modelValue : []
72
+ return props.modelValue ?? undefined
73
+ })
74
+
75
+ // In multi-select mode, the trigger's `SelectValue` won't have a single
76
+ // matching item label to render; show a "N selected" summary instead so the
77
+ // trigger keeps a meaningful display. Empty array → placeholder.
78
+ const triggerSummary = computed(() => {
79
+ if (!props.multiple) return undefined
80
+ const list = Array.isArray(props.modelValue) ? props.modelValue : []
81
+ if (list.length === 0) return undefined
82
+ return list.length === 1 ? '1 selected' : `${list.length} selected`
83
+ })
84
+
85
+ function handleUpdate (value: AcceptableValue) {
86
+ if (props.multiple) {
87
+ // Reka emits the full array on every toggle when `multiple` is on.
88
+ emit('update:modelValue', (value as string[]) ?? [])
89
+ return
90
+ }
91
+ if (value === CLEAR_VALUE) {
92
+ emit('update:modelValue', undefined)
93
+ } else {
94
+ emit('update:modelValue', value as string)
95
+ }
96
+ }
97
+ </script>
98
+
99
+ <template>
100
+ <UiFieldWrapper
101
+ :id="id"
102
+ :label="label"
103
+ :required="required"
104
+ :label-info="labelInfo"
105
+ :error="error"
106
+ :helper-message="helperMessage"
107
+ :error-message="errorMessage"
108
+ >
109
+ <template #default="{ fieldId }">
110
+ <!-- Loading State -->
111
+ <div
112
+ v-if="loading"
113
+ class="flex items-center gap-2 w-full rounded-lg border border-solid border-borders-neutral-strong bg-actions-neutral-idle-alpha-light"
114
+ :class="{
115
+ 'h-8 px-2': size === 'sm',
116
+ 'h-10 px-3': size === 'md',
117
+ 'h-12 px-4': size === 'lg',
118
+ 'h-16 px-4': size === 'xl',
119
+ }"
120
+ >
121
+ <div class="h-3 w-24 bg-surface-neutral-alpha-400 rounded-md animate-pulse" />
122
+ </div>
123
+
124
+ <!-- Select Field -->
125
+ <UiDropdown
126
+ v-else
127
+ :model-value="forwardedValue"
128
+ :name="name"
129
+ :default-open="defaultOpen"
130
+ :multiple="multiple"
131
+ @update:model-value="handleUpdate"
132
+ >
133
+ <UiDropdownTrigger
134
+ :id="id || fieldId"
135
+ :placeholder="placeholder"
136
+ :disabled="disabled"
137
+ :size="size"
138
+ :error="error"
139
+ :aria-invalid="error || undefined"
140
+ :aria-describedby="ariaDescribedby || ((helperMessage || errorMessage) ? `${fieldId}-message` : undefined)"
141
+ @blur="emit('blur', $event)"
142
+ >
143
+ <!-- Multi-select trigger label: `SelectValue` only renders the
144
+ last-selected item's text, so for arrays we render an N-summary
145
+ instead. Single-select falls through to the default `SelectValue`. -->
146
+ <template
147
+ v-if="multiple && triggerSummary"
148
+ #value
149
+ >
150
+ {{ triggerSummary }}
151
+ </template>
152
+ </UiDropdownTrigger>
153
+
154
+ <UiDropdownContent>
155
+ <UiDropdownItem
156
+ v-if="clearable && !multiple"
157
+ :value="CLEAR_VALUE"
158
+ :title="placeholder"
159
+ class="text-text-neutral-tertiary"
160
+ />
161
+ <slot />
162
+ </UiDropdownContent>
163
+ </UiDropdown>
164
+ </template>
165
+ </UiFieldWrapper>
166
+ </template>
@@ -0,0 +1,2 @@
1
+ export { default as UiInputSelect } from './UiInputSelect.vue'
2
+ export type { SelectSize } from './types'
@@ -0,0 +1 @@
1
+ export type SelectSize = 'sm' | 'md' | 'lg' | 'xl'