@aleph-alpha/ui-library 1.8.0 → 1.10.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 (437) hide show
  1. package/README.md +14 -0
  2. package/dist/mcp/cli.js +21588 -0
  3. package/dist/mcp/index.js +7 -0
  4. package/dist/mcp/scripts/generate-component-meta.js +236 -0
  5. package/dist/mcp/server.js +21456 -0
  6. package/dist/system/index-CkH7HQaa.js +7 -0
  7. package/dist/system/index-CuHwEAQ_.js +7 -0
  8. package/dist/system/index.d.ts +1269 -540
  9. package/dist/system/lib.js +9001 -7237
  10. package/mcp/components-meta.json +1172 -0
  11. package/package.json +15 -5
  12. package/src/@types/shims-vue.d.ts +5 -0
  13. package/src/__tests__/placeholder.test.ts +7 -0
  14. package/src/compositions/UiCompositionPlaceholder/UiCompositionPlaceholder.vue +9 -0
  15. package/src/compositions/UiCompositionPlaceholder/index.ts +1 -0
  16. package/src/compositions/UiCompositionPlaceholder/types.ts +8 -0
  17. package/src/compositions/UiDataTable/UiDataTable.mock.ts +104 -0
  18. package/src/compositions/UiDataTable/UiDataTable.stories.ts +1575 -0
  19. package/src/compositions/UiDataTable/UiDataTable.vue +129 -0
  20. package/src/compositions/UiDataTable/UiDataTableColumnHeader.vue +97 -0
  21. package/src/compositions/UiDataTable/UiDataTablePagination.vue +147 -0
  22. package/src/compositions/UiDataTable/UiDataTableToolbar.vue +85 -0
  23. package/src/compositions/UiDataTable/__tests__/UiDataTable.test.ts +372 -0
  24. package/src/compositions/UiDataTable/__tests__/UiDataTableColumnHeader.test.ts +217 -0
  25. package/src/compositions/UiDataTable/__tests__/UiDataTablePagination.test.ts +274 -0
  26. package/src/compositions/UiDataTable/__tests__/UiDataTableToolbar.test.ts +198 -0
  27. package/src/compositions/UiDataTable/constants.ts +77 -0
  28. package/src/compositions/UiDataTable/index.ts +6 -0
  29. package/src/compositions/UiDataTable/types.ts +39 -0
  30. package/src/compositions/UiDatePicker/UiDatePicker.stories.ts +976 -0
  31. package/src/compositions/UiDatePicker/UiDatePicker.vue +193 -0
  32. package/src/compositions/UiDatePicker/__tests__/UiDatePicker.test.ts +325 -0
  33. package/src/compositions/UiDatePicker/index.ts +14 -0
  34. package/src/compositions/UiDatePicker/types.ts +220 -0
  35. package/src/compositions/index.ts +8 -0
  36. package/src/foundations/UiPlaceholder/UiPlaceholder.vue +9 -0
  37. package/src/foundations/UiPlaceholder/index.ts +1 -0
  38. package/src/foundations/UiPlaceholder/types.ts +8 -0
  39. package/src/foundations/index.ts +6 -0
  40. package/src/index.ts +27 -0
  41. package/src/lib/utils.ts +6 -0
  42. package/src/primitives/UiAccordion/UiAccordion.stories.ts +476 -0
  43. package/src/primitives/UiAccordion/UiAccordion.vue +31 -0
  44. package/src/primitives/UiAccordion/UiAccordionContent.vue +16 -0
  45. package/src/primitives/UiAccordion/UiAccordionItem.vue +16 -0
  46. package/src/primitives/UiAccordion/UiAccordionTrigger.vue +23 -0
  47. package/src/primitives/UiAccordion/__tests__/UiAccordion.test.ts +198 -0
  48. package/src/primitives/UiAccordion/index.ts +6 -0
  49. package/src/primitives/UiAccordion/types.ts +95 -0
  50. package/src/primitives/UiAlert/UiAlert.stories.ts +199 -0
  51. package/src/primitives/UiAlert/UiAlert.vue +27 -0
  52. package/src/primitives/UiAlert/UiAlertDescription.vue +13 -0
  53. package/src/primitives/UiAlert/UiAlertTitle.vue +13 -0
  54. package/src/primitives/UiAlert/__tests__/UiAlert.test.ts +20 -0
  55. package/src/primitives/UiAlert/constants.ts +3 -0
  56. package/src/primitives/UiAlert/index.ts +5 -0
  57. package/src/primitives/UiAlert/types.ts +14 -0
  58. package/src/primitives/UiAlertDialog/UiAlertDialog.stories.ts +186 -0
  59. package/src/primitives/UiAlertDialog/UiAlertDialog.vue +18 -0
  60. package/src/primitives/UiAlertDialog/UiAlertDialogAction.vue +16 -0
  61. package/src/primitives/UiAlertDialog/UiAlertDialogCancel.vue +16 -0
  62. package/src/primitives/UiAlertDialog/UiAlertDialogContent.vue +26 -0
  63. package/src/primitives/UiAlertDialog/UiAlertDialogDescription.vue +16 -0
  64. package/src/primitives/UiAlertDialog/UiAlertDialogFooter.vue +13 -0
  65. package/src/primitives/UiAlertDialog/UiAlertDialogHeader.vue +16 -0
  66. package/src/primitives/UiAlertDialog/UiAlertDialogTitle.vue +16 -0
  67. package/src/primitives/UiAlertDialog/UiAlertDialogTrigger.vue +17 -0
  68. package/src/primitives/UiAlertDialog/__tests__/UiAlertDialog.test.ts +184 -0
  69. package/src/primitives/UiAlertDialog/index.ts +9 -0
  70. package/src/primitives/UiAlertDialog/types.ts +83 -0
  71. package/src/primitives/UiAvatar/UiAvatar.stories.ts +194 -0
  72. package/src/primitives/UiAvatar/UiAvatar.vue +13 -0
  73. package/src/primitives/UiAvatar/UiAvatarFallback.vue +13 -0
  74. package/src/primitives/UiAvatar/UiAvatarImage.vue +14 -0
  75. package/src/primitives/UiAvatar/__tests__/UiAvatar.test.ts +36 -0
  76. package/src/primitives/UiAvatar/index.ts +3 -0
  77. package/src/primitives/UiAvatar/types.ts +17 -0
  78. package/src/primitives/UiBadge/UiBadge.stories.ts +373 -0
  79. package/src/primitives/UiBadge/UiBadge.vue +21 -0
  80. package/src/primitives/UiBadge/__tests__/UiBadge.test.ts +44 -0
  81. package/src/primitives/UiBadge/constants.ts +3 -0
  82. package/src/primitives/UiBadge/index.ts +2 -0
  83. package/src/primitives/UiBadge/types.ts +48 -0
  84. package/src/primitives/UiButton/UiButton.stories.ts +537 -0
  85. package/src/primitives/UiButton/UiButton.vue +72 -0
  86. package/src/primitives/UiButton/__tests__/UiButton.test.ts +133 -0
  87. package/src/primitives/UiButton/index.ts +2 -0
  88. package/src/primitives/UiButton/types.ts +87 -0
  89. package/src/primitives/UiCalendar/UiCalendar.stories.ts +797 -0
  90. package/src/primitives/UiCalendar/UiCalendar.vue +67 -0
  91. package/src/primitives/UiCalendar/__tests__/UiCalendar.test.ts +45 -0
  92. package/src/primitives/UiCalendar/index.ts +15 -0
  93. package/src/primitives/UiCalendar/types.ts +236 -0
  94. package/src/primitives/UiCard/UiCard.stories.ts +197 -0
  95. package/src/primitives/UiCard/UiCard.vue +13 -0
  96. package/src/primitives/UiCard/UiCardAction.vue +13 -0
  97. package/src/primitives/UiCard/UiCardContent.vue +13 -0
  98. package/src/primitives/UiCard/UiCardDescription.vue +13 -0
  99. package/src/primitives/UiCard/UiCardFooter.vue +13 -0
  100. package/src/primitives/UiCard/UiCardHeader.vue +13 -0
  101. package/src/primitives/UiCard/UiCardTitle.vue +13 -0
  102. package/src/primitives/UiCard/__tests__/UiCard.test.ts +19 -0
  103. package/src/primitives/UiCard/__tests__/UiCardAction.test.ts +19 -0
  104. package/src/primitives/UiCard/__tests__/UiCardContent.test.ts +19 -0
  105. package/src/primitives/UiCard/__tests__/UiCardDescription.test.ts +19 -0
  106. package/src/primitives/UiCard/__tests__/UiCardFooter.test.ts +19 -0
  107. package/src/primitives/UiCard/__tests__/UiCardHeader.test.ts +19 -0
  108. package/src/primitives/UiCard/__tests__/UiCardTitle.test.ts +19 -0
  109. package/src/primitives/UiCard/index.ts +7 -0
  110. package/src/primitives/UiCard/types.ts +10 -0
  111. package/src/primitives/UiCheckbox/UiCheckbox.stories.ts +231 -0
  112. package/src/primitives/UiCheckbox/UiCheckbox.vue +19 -0
  113. package/src/primitives/UiCheckbox/__tests__/UiCheckbox.test.ts +29 -0
  114. package/src/primitives/UiCheckbox/index.ts +2 -0
  115. package/src/primitives/UiCheckbox/types.ts +30 -0
  116. package/src/primitives/UiDrawer/UiDrawer.stories.ts +602 -0
  117. package/src/primitives/UiDrawer/UiDrawer.vue +19 -0
  118. package/src/primitives/UiDrawer/UiDrawerClose.vue +16 -0
  119. package/src/primitives/UiDrawer/UiDrawerContent.vue +29 -0
  120. package/src/primitives/UiDrawer/UiDrawerDescription.vue +16 -0
  121. package/src/primitives/UiDrawer/UiDrawerFooter.vue +16 -0
  122. package/src/primitives/UiDrawer/UiDrawerHeader.vue +16 -0
  123. package/src/primitives/UiDrawer/UiDrawerTitle.vue +16 -0
  124. package/src/primitives/UiDrawer/UiDrawerTrigger.vue +16 -0
  125. package/src/primitives/UiDrawer/__tests__/UiDrawer.test.ts +229 -0
  126. package/src/primitives/UiDrawer/index.ts +8 -0
  127. package/src/primitives/UiDrawer/types.ts +96 -0
  128. package/src/primitives/UiDropdownMenu/UiDropdownMenu.stories.ts +760 -0
  129. package/src/primitives/UiDropdownMenu/UiDropdownMenu.vue +25 -0
  130. package/src/primitives/UiDropdownMenu/UiDropdownMenuCheckboxItem.vue +29 -0
  131. package/src/primitives/UiDropdownMenu/UiDropdownMenuContent.vue +27 -0
  132. package/src/primitives/UiDropdownMenu/UiDropdownMenuGroup.vue +13 -0
  133. package/src/primitives/UiDropdownMenu/UiDropdownMenuItem.vue +26 -0
  134. package/src/primitives/UiDropdownMenu/UiDropdownMenuLabel.vue +18 -0
  135. package/src/primitives/UiDropdownMenu/UiDropdownMenuRadioGroup.vue +20 -0
  136. package/src/primitives/UiDropdownMenu/UiDropdownMenuRadioItem.vue +26 -0
  137. package/src/primitives/UiDropdownMenu/UiDropdownMenuSeparator.vue +11 -0
  138. package/src/primitives/UiDropdownMenu/UiDropdownMenuShortcut.vue +13 -0
  139. package/src/primitives/UiDropdownMenu/UiDropdownMenuSub.vue +26 -0
  140. package/src/primitives/UiDropdownMenu/UiDropdownMenuSubContent.vue +23 -0
  141. package/src/primitives/UiDropdownMenu/UiDropdownMenuSubTrigger.vue +24 -0
  142. package/src/primitives/UiDropdownMenu/UiDropdownMenuTrigger.vue +24 -0
  143. package/src/primitives/UiDropdownMenu/__tests__/UiDropdownMenu.test.ts +557 -0
  144. package/src/primitives/UiDropdownMenu/index.ts +16 -0
  145. package/src/primitives/UiDropdownMenu/types.ts +219 -0
  146. package/src/primitives/UiField/UiField.stories.ts +1496 -0
  147. package/src/primitives/UiField/UiField.vue +18 -0
  148. package/src/primitives/UiField/UiFieldContent.vue +13 -0
  149. package/src/primitives/UiField/UiFieldDescription.vue +13 -0
  150. package/src/primitives/UiField/UiFieldError.vue +20 -0
  151. package/src/primitives/UiField/UiFieldGroup.vue +13 -0
  152. package/src/primitives/UiField/UiFieldLabel.vue +16 -0
  153. package/src/primitives/UiField/UiFieldLegend.vue +13 -0
  154. package/src/primitives/UiField/UiFieldSeparator.vue +13 -0
  155. package/src/primitives/UiField/UiFieldSet.vue +13 -0
  156. package/src/primitives/UiField/UiFieldTitle.vue +13 -0
  157. package/src/primitives/UiField/__tests__/UiFieldError.test.ts +35 -0
  158. package/src/primitives/UiField/index.ts +10 -0
  159. package/src/primitives/UiField/types.ts +47 -0
  160. package/src/primitives/UiIcon/UiIcon.stories.ts +95 -0
  161. package/src/primitives/UiIcon/UiIcon.vue +14 -0
  162. package/src/primitives/UiIcon/__tests__/UiIcon.test.ts +24 -0
  163. package/src/primitives/UiIcon/index.ts +1 -0
  164. package/src/primitives/UiIcon/types.ts +23 -0
  165. package/src/primitives/UiIconButton/UiIconButton.stories.ts +446 -0
  166. package/src/primitives/UiIconButton/UiIconButton.vue +63 -0
  167. package/src/primitives/UiIconButton/__tests__/UiIconButton.test.ts +102 -0
  168. package/src/primitives/UiIconButton/index.ts +2 -0
  169. package/src/primitives/UiIconButton/types.ts +67 -0
  170. package/src/primitives/UiInput/UiInput.stories.ts +193 -0
  171. package/src/primitives/UiInput/UiInput.vue +19 -0
  172. package/src/primitives/UiInput/__tests__/UiInput.test.ts +38 -0
  173. package/src/primitives/UiInput/index.ts +2 -0
  174. package/src/primitives/UiInput/types.ts +31 -0
  175. package/src/primitives/UiPopover/UiPopover.stories.ts +394 -0
  176. package/src/primitives/UiPopover/UiPopover.vue +17 -0
  177. package/src/primitives/UiPopover/UiPopoverContent.vue +27 -0
  178. package/src/primitives/UiPopover/UiPopoverTrigger.vue +16 -0
  179. package/src/primitives/UiPopover/__tests__/UiPopover.test.ts +87 -0
  180. package/src/primitives/UiPopover/index.ts +5 -0
  181. package/src/primitives/UiPopover/types.ts +86 -0
  182. package/src/primitives/UiProgress/UiProgress.stories.ts +92 -0
  183. package/src/primitives/UiProgress/UiProgress.vue +25 -0
  184. package/src/primitives/UiProgress/__tests__/UiProgress.test.ts +46 -0
  185. package/src/primitives/UiProgress/index.ts +2 -0
  186. package/src/primitives/UiProgress/types.ts +16 -0
  187. package/src/primitives/UiRadioGroup/UiRadioGroup.stories.ts +291 -0
  188. package/src/primitives/UiRadioGroup/UiRadioGroup.vue +43 -0
  189. package/src/primitives/UiRadioGroup/UiRadioGroupItem.vue +18 -0
  190. package/src/primitives/UiRadioGroup/__tests__/UiRadioGroup.test.ts +404 -0
  191. package/src/primitives/UiRadioGroup/index.ts +4 -0
  192. package/src/primitives/UiRadioGroup/types.ts +66 -0
  193. package/src/primitives/UiRangeCalendar/UiRangeCalendar.stories.ts +609 -0
  194. package/src/primitives/UiRangeCalendar/UiRangeCalendar.vue +50 -0
  195. package/src/primitives/UiRangeCalendar/__tests__/UiRangeCalendar.test.ts +35 -0
  196. package/src/primitives/UiRangeCalendar/index.ts +13 -0
  197. package/src/primitives/UiRangeCalendar/types.ts +184 -0
  198. package/src/primitives/UiSelect/UiSelect.stories.ts +425 -0
  199. package/src/primitives/UiSelect/UiSelect.vue +47 -0
  200. package/src/primitives/UiSelect/UiSelectContent.vue +30 -0
  201. package/src/primitives/UiSelect/UiSelectGroup.vue +13 -0
  202. package/src/primitives/UiSelect/UiSelectItem.vue +19 -0
  203. package/src/primitives/UiSelect/UiSelectLabel.vue +13 -0
  204. package/src/primitives/UiSelect/UiSelectSeparator.vue +11 -0
  205. package/src/primitives/UiSelect/UiSelectTrigger.vue +30 -0
  206. package/src/primitives/UiSelect/UiSelectValue.vue +18 -0
  207. package/src/primitives/UiSelect/__tests__/UiSelect.test.ts +211 -0
  208. package/src/primitives/UiSelect/__tests__/UiSelectContent.test.ts +30 -0
  209. package/src/primitives/UiSelect/__tests__/UiSelectGroup.test.ts +85 -0
  210. package/src/primitives/UiSelect/__tests__/UiSelectItem.test.ts +79 -0
  211. package/src/primitives/UiSelect/__tests__/UiSelectLabel.test.ts +83 -0
  212. package/src/primitives/UiSelect/__tests__/UiSelectSeparator.test.ts +82 -0
  213. package/src/primitives/UiSelect/__tests__/UiSelectTrigger.test.ts +54 -0
  214. package/src/primitives/UiSelect/__tests__/UiSelectValue.test.ts +39 -0
  215. package/src/primitives/UiSelect/index.ts +10 -0
  216. package/src/primitives/UiSelect/types.ts +93 -0
  217. package/src/primitives/UiSlider/UiSlider.stories.ts +226 -0
  218. package/src/primitives/UiSlider/UiSlider.vue +44 -0
  219. package/src/primitives/UiSlider/__tests__/UiSlider.test.ts +76 -0
  220. package/src/primitives/UiSlider/index.ts +1 -0
  221. package/src/primitives/UiSlider/types.ts +101 -0
  222. package/src/primitives/UiSpinner/UiSpinner.stories.ts +143 -0
  223. package/src/primitives/UiSpinner/UiSpinner.vue +16 -0
  224. package/src/primitives/UiSpinner/__tests__/UiSpinner.test.ts +19 -0
  225. package/src/primitives/UiSpinner/index.ts +2 -0
  226. package/src/primitives/UiSpinner/types.ts +16 -0
  227. package/src/primitives/UiSwitch/UiSwitch.stories.ts +120 -0
  228. package/src/primitives/UiSwitch/UiSwitch.vue +21 -0
  229. package/src/primitives/UiSwitch/__tests__/UiSwitch.test.ts +47 -0
  230. package/src/primitives/UiSwitch/index.ts +2 -0
  231. package/src/primitives/UiSwitch/types.ts +25 -0
  232. package/src/primitives/UiTable/UiTable.stories.ts +505 -0
  233. package/src/primitives/UiTable/UiTable.vue +13 -0
  234. package/src/primitives/UiTable/UiTableBody.vue +13 -0
  235. package/src/primitives/UiTable/UiTableCaption.vue +13 -0
  236. package/src/primitives/UiTable/UiTableCell.vue +16 -0
  237. package/src/primitives/UiTable/UiTableEmpty.vue +18 -0
  238. package/src/primitives/UiTable/UiTableFooter.vue +13 -0
  239. package/src/primitives/UiTable/UiTableHead.vue +18 -0
  240. package/src/primitives/UiTable/UiTableHeader.vue +13 -0
  241. package/src/primitives/UiTable/UiTableRow.vue +18 -0
  242. package/src/primitives/UiTable/__tests__/UiTable.test.ts +19 -0
  243. package/src/primitives/UiTable/__tests__/UiTableBody.test.ts +19 -0
  244. package/src/primitives/UiTable/__tests__/UiTableCaption.test.ts +19 -0
  245. package/src/primitives/UiTable/__tests__/UiTableCell.test.ts +26 -0
  246. package/src/primitives/UiTable/__tests__/UiTableEmpty.test.ts +32 -0
  247. package/src/primitives/UiTable/__tests__/UiTableFooter.test.ts +19 -0
  248. package/src/primitives/UiTable/__tests__/UiTableHead.test.ts +43 -0
  249. package/src/primitives/UiTable/__tests__/UiTableHeader.test.ts +19 -0
  250. package/src/primitives/UiTable/__tests__/UiTableRow.test.ts +32 -0
  251. package/src/primitives/UiTable/index.ts +16 -0
  252. package/src/primitives/UiTable/types.ts +68 -0
  253. package/src/primitives/UiTabs/UiTabs.stories.ts +456 -0
  254. package/src/primitives/UiTabs/UiTabs.vue +31 -0
  255. package/src/primitives/UiTabs/UiTabsContent.vue +16 -0
  256. package/src/primitives/UiTabs/UiTabsList.vue +16 -0
  257. package/src/primitives/UiTabs/UiTabsTrigger.vue +16 -0
  258. package/src/primitives/UiTabs/__tests__/UiTabs.test.ts +122 -0
  259. package/src/primitives/UiTabs/index.ts +6 -0
  260. package/src/primitives/UiTabs/types.ts +68 -0
  261. package/src/primitives/UiTextarea/UiTextarea.stories.ts +107 -0
  262. package/src/primitives/UiTextarea/UiTextarea.vue +19 -0
  263. package/src/primitives/UiTextarea/__tests__/UiTextarea.test.ts +40 -0
  264. package/src/primitives/UiTextarea/index.ts +2 -0
  265. package/src/primitives/UiTextarea/types.ts +30 -0
  266. package/src/primitives/UiTooltip/UiTooltip.stories.ts +550 -0
  267. package/src/primitives/UiTooltip/UiTooltip.vue +42 -0
  268. package/src/primitives/UiTooltip/__tests__/UiTooltip.test.ts +78 -0
  269. package/src/primitives/UiTooltip/index.ts +2 -0
  270. package/src/primitives/UiTooltip/types.ts +53 -0
  271. package/src/primitives/index.ts +33 -0
  272. package/src/primitives/shadcn/accordion/Accordion.vue +15 -0
  273. package/src/primitives/shadcn/accordion/AccordionContent.vue +23 -0
  274. package/src/primitives/shadcn/accordion/AccordionItem.vue +24 -0
  275. package/src/primitives/shadcn/accordion/AccordionTrigger.vue +35 -0
  276. package/src/primitives/shadcn/accordion/index.ts +4 -0
  277. package/src/primitives/shadcn/alert/Alert.vue +17 -0
  278. package/src/primitives/shadcn/alert/AlertDescription.vue +22 -0
  279. package/src/primitives/shadcn/alert/AlertTitle.vue +17 -0
  280. package/src/primitives/shadcn/alert/index.ts +24 -0
  281. package/src/primitives/shadcn/alert-dialog/AlertDialog.vue +15 -0
  282. package/src/primitives/shadcn/alert-dialog/AlertDialogAction.vue +18 -0
  283. package/src/primitives/shadcn/alert-dialog/AlertDialogCancel.vue +21 -0
  284. package/src/primitives/shadcn/alert-dialog/AlertDialogContent.vue +44 -0
  285. package/src/primitives/shadcn/alert-dialog/AlertDialogDescription.vue +21 -0
  286. package/src/primitives/shadcn/alert-dialog/AlertDialogFooter.vue +17 -0
  287. package/src/primitives/shadcn/alert-dialog/AlertDialogHeader.vue +17 -0
  288. package/src/primitives/shadcn/alert-dialog/AlertDialogTitle.vue +21 -0
  289. package/src/primitives/shadcn/alert-dialog/AlertDialogTrigger.vue +12 -0
  290. package/src/primitives/shadcn/alert-dialog/index.ts +9 -0
  291. package/src/primitives/shadcn/avatar/Avatar.vue +18 -0
  292. package/src/primitives/shadcn/avatar/AvatarFallback.vue +21 -0
  293. package/src/primitives/shadcn/avatar/AvatarImage.vue +12 -0
  294. package/src/primitives/shadcn/avatar/index.ts +3 -0
  295. package/src/primitives/shadcn/badge/Badge.vue +28 -0
  296. package/src/primitives/shadcn/badge/index.ts +24 -0
  297. package/src/primitives/shadcn/button/Button.vue +29 -0
  298. package/src/primitives/shadcn/button/index.ts +36 -0
  299. package/src/primitives/shadcn/calendar/Calendar.vue +206 -0
  300. package/src/primitives/shadcn/calendar/CalendarCell.vue +28 -0
  301. package/src/primitives/shadcn/calendar/CalendarCellTrigger.vue +44 -0
  302. package/src/primitives/shadcn/calendar/CalendarGrid.vue +23 -0
  303. package/src/primitives/shadcn/calendar/CalendarGridBody.vue +12 -0
  304. package/src/primitives/shadcn/calendar/CalendarGridHead.vue +13 -0
  305. package/src/primitives/shadcn/calendar/CalendarGridRow.vue +23 -0
  306. package/src/primitives/shadcn/calendar/CalendarHeadCell.vue +23 -0
  307. package/src/primitives/shadcn/calendar/CalendarHeader.vue +23 -0
  308. package/src/primitives/shadcn/calendar/CalendarHeading.vue +30 -0
  309. package/src/primitives/shadcn/calendar/CalendarNextButton.vue +33 -0
  310. package/src/primitives/shadcn/calendar/CalendarPrevButton.vue +33 -0
  311. package/src/primitives/shadcn/calendar/index.ts +14 -0
  312. package/src/primitives/shadcn/card/Card.vue +22 -0
  313. package/src/primitives/shadcn/card/CardAction.vue +17 -0
  314. package/src/primitives/shadcn/card/CardContent.vue +14 -0
  315. package/src/primitives/shadcn/card/CardDescription.vue +14 -0
  316. package/src/primitives/shadcn/card/CardFooter.vue +14 -0
  317. package/src/primitives/shadcn/card/CardHeader.vue +22 -0
  318. package/src/primitives/shadcn/card/CardTitle.vue +14 -0
  319. package/src/primitives/shadcn/card/index.ts +7 -0
  320. package/src/primitives/shadcn/checkbox/Checkbox.vue +38 -0
  321. package/src/primitives/shadcn/checkbox/index.ts +1 -0
  322. package/src/primitives/shadcn/drawer/Drawer.vue +15 -0
  323. package/src/primitives/shadcn/drawer/DrawerClose.vue +12 -0
  324. package/src/primitives/shadcn/drawer/DrawerContent.vue +52 -0
  325. package/src/primitives/shadcn/drawer/DrawerDescription.vue +20 -0
  326. package/src/primitives/shadcn/drawer/DrawerFooter.vue +17 -0
  327. package/src/primitives/shadcn/drawer/DrawerHeader.vue +17 -0
  328. package/src/primitives/shadcn/drawer/DrawerTitle.vue +20 -0
  329. package/src/primitives/shadcn/drawer/DrawerTrigger.vue +12 -0
  330. package/src/primitives/shadcn/drawer/index.ts +8 -0
  331. package/src/primitives/shadcn/dropdown-menu/DropdownMenu.vue +15 -0
  332. package/src/primitives/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +41 -0
  333. package/src/primitives/shadcn/dropdown-menu/DropdownMenuContent.vue +40 -0
  334. package/src/primitives/shadcn/dropdown-menu/DropdownMenuGroup.vue +12 -0
  335. package/src/primitives/shadcn/dropdown-menu/DropdownMenuItem.vue +41 -0
  336. package/src/primitives/shadcn/dropdown-menu/DropdownMenuLabel.vue +25 -0
  337. package/src/primitives/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue +15 -0
  338. package/src/primitives/shadcn/dropdown-menu/DropdownMenuRadioItem.vue +38 -0
  339. package/src/primitives/shadcn/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  340. package/src/primitives/shadcn/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  341. package/src/primitives/shadcn/dropdown-menu/DropdownMenuSub.vue +15 -0
  342. package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubContent.vue +29 -0
  343. package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  344. package/src/primitives/shadcn/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  345. package/src/primitives/shadcn/dropdown-menu/index.ts +16 -0
  346. package/src/primitives/shadcn/field/Field.vue +22 -0
  347. package/src/primitives/shadcn/field/FieldContent.vue +17 -0
  348. package/src/primitives/shadcn/field/FieldDescription.vue +24 -0
  349. package/src/primitives/shadcn/field/FieldError.vue +69 -0
  350. package/src/primitives/shadcn/field/FieldGroup.vue +22 -0
  351. package/src/primitives/shadcn/field/FieldLabel.vue +28 -0
  352. package/src/primitives/shadcn/field/FieldLegend.vue +26 -0
  353. package/src/primitives/shadcn/field/FieldSeparator.vue +28 -0
  354. package/src/primitives/shadcn/field/FieldSet.vue +23 -0
  355. package/src/primitives/shadcn/field/FieldTitle.vue +22 -0
  356. package/src/primitives/shadcn/field/index.ts +39 -0
  357. package/src/primitives/shadcn/icon/Icon.vue +38 -0
  358. package/src/primitives/shadcn/icon/index.ts +1 -0
  359. package/src/primitives/shadcn/index.ts +3 -0
  360. package/src/primitives/shadcn/input/Input.vue +35 -0
  361. package/src/primitives/shadcn/input/index.ts +1 -0
  362. package/src/primitives/shadcn/label/Label.vue +28 -0
  363. package/src/primitives/shadcn/label/index.ts +1 -0
  364. package/src/primitives/shadcn/native-select/NativeSelect.vue +56 -0
  365. package/src/primitives/shadcn/native-select/NativeSelectOptGroup.vue +18 -0
  366. package/src/primitives/shadcn/native-select/NativeSelectOption.vue +18 -0
  367. package/src/primitives/shadcn/native-select/index.ts +3 -0
  368. package/src/primitives/shadcn/popover/Popover.vue +19 -0
  369. package/src/primitives/shadcn/popover/PopoverContent.vue +41 -0
  370. package/src/primitives/shadcn/popover/PopoverTrigger.vue +11 -0
  371. package/src/primitives/shadcn/popover/index.ts +4 -0
  372. package/src/primitives/shadcn/progress/Progress.vue +30 -0
  373. package/src/primitives/shadcn/progress/index.ts +1 -0
  374. package/src/primitives/shadcn/radio-group/RadioGroup.vue +25 -0
  375. package/src/primitives/shadcn/radio-group/RadioGroupItem.vue +38 -0
  376. package/src/primitives/shadcn/radio-group/index.ts +2 -0
  377. package/src/primitives/shadcn/range-calendar/RangeCalendar.vue +73 -0
  378. package/src/primitives/shadcn/range-calendar/RangeCalendarCell.vue +28 -0
  379. package/src/primitives/shadcn/range-calendar/RangeCalendarCellTrigger.vue +46 -0
  380. package/src/primitives/shadcn/range-calendar/RangeCalendarGrid.vue +23 -0
  381. package/src/primitives/shadcn/range-calendar/RangeCalendarGridBody.vue +12 -0
  382. package/src/primitives/shadcn/range-calendar/RangeCalendarGridHead.vue +12 -0
  383. package/src/primitives/shadcn/range-calendar/RangeCalendarGridRow.vue +23 -0
  384. package/src/primitives/shadcn/range-calendar/RangeCalendarHeadCell.vue +23 -0
  385. package/src/primitives/shadcn/range-calendar/RangeCalendarHeader.vue +23 -0
  386. package/src/primitives/shadcn/range-calendar/RangeCalendarHeading.vue +30 -0
  387. package/src/primitives/shadcn/range-calendar/RangeCalendarNextButton.vue +34 -0
  388. package/src/primitives/shadcn/range-calendar/RangeCalendarPrevButton.vue +34 -0
  389. package/src/primitives/shadcn/range-calendar/index.ts +12 -0
  390. package/src/primitives/shadcn/select/Select.vue +15 -0
  391. package/src/primitives/shadcn/select/SelectContent.vue +55 -0
  392. package/src/primitives/shadcn/select/SelectGroup.vue +12 -0
  393. package/src/primitives/shadcn/select/SelectItem.vue +39 -0
  394. package/src/primitives/shadcn/select/SelectItemText.vue +12 -0
  395. package/src/primitives/shadcn/select/SelectLabel.vue +17 -0
  396. package/src/primitives/shadcn/select/SelectScrollDownButton.vue +26 -0
  397. package/src/primitives/shadcn/select/SelectScrollUpButton.vue +26 -0
  398. package/src/primitives/shadcn/select/SelectSeparator.vue +19 -0
  399. package/src/primitives/shadcn/select/SelectTrigger.vue +37 -0
  400. package/src/primitives/shadcn/select/SelectValue.vue +12 -0
  401. package/src/primitives/shadcn/select/index.ts +11 -0
  402. package/src/primitives/shadcn/separator/Separator.vue +27 -0
  403. package/src/primitives/shadcn/separator/index.ts +1 -0
  404. package/src/primitives/shadcn/slider/Slider.vue +45 -0
  405. package/src/primitives/shadcn/slider/index.ts +1 -0
  406. package/src/primitives/shadcn/spinner/Spinner.vue +18 -0
  407. package/src/primitives/shadcn/spinner/index.ts +1 -0
  408. package/src/primitives/shadcn/switch/Switch.vue +40 -0
  409. package/src/primitives/shadcn/switch/index.ts +1 -0
  410. package/src/primitives/shadcn/table/Table.vue +16 -0
  411. package/src/primitives/shadcn/table/TableBody.vue +14 -0
  412. package/src/primitives/shadcn/table/TableCaption.vue +14 -0
  413. package/src/primitives/shadcn/table/TableCell.vue +26 -0
  414. package/src/primitives/shadcn/table/TableEmpty.vue +29 -0
  415. package/src/primitives/shadcn/table/TableFooter.vue +17 -0
  416. package/src/primitives/shadcn/table/TableHead.vue +28 -0
  417. package/src/primitives/shadcn/table/TableHeader.vue +14 -0
  418. package/src/primitives/shadcn/table/TableRow.vue +21 -0
  419. package/src/primitives/shadcn/table/index.ts +9 -0
  420. package/src/primitives/shadcn/table/utils.ts +8 -0
  421. package/src/primitives/shadcn/tabs/Tabs.vue +24 -0
  422. package/src/primitives/shadcn/tabs/TabsContent.vue +21 -0
  423. package/src/primitives/shadcn/tabs/TabsList.vue +26 -0
  424. package/src/primitives/shadcn/tabs/TabsTrigger.vue +28 -0
  425. package/src/primitives/shadcn/tabs/index.ts +4 -0
  426. package/src/primitives/shadcn/textarea/Textarea.vue +33 -0
  427. package/src/primitives/shadcn/textarea/index.ts +1 -0
  428. package/src/primitives/shadcn/tooltip/Tooltip.vue +15 -0
  429. package/src/primitives/shadcn/tooltip/TooltipContent.vue +40 -0
  430. package/src/primitives/shadcn/tooltip/TooltipProvider.vue +12 -0
  431. package/src/primitives/shadcn/tooltip/TooltipTrigger.vue +12 -0
  432. package/src/primitives/shadcn/tooltip/index.ts +4 -0
  433. package/src/styles/global.css +1 -0
  434. package/src/templates/UiTemplatePlaceholder/UiTemplatePlaceholder.vue +9 -0
  435. package/src/templates/UiTemplatePlaceholder/index.ts +1 -0
  436. package/src/templates/UiTemplatePlaceholder/types.ts +8 -0
  437. package/src/templates/index.ts +6 -0
@@ -0,0 +1,193 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import UiInput from './UiInput.vue';
3
+ import { UiButton } from '../UiButton';
4
+
5
+ const meta: Meta<typeof UiInput> = {
6
+ title: 'Primitives/UiInput',
7
+ component: UiInput,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ disabled: {
11
+ control: 'boolean',
12
+ description: 'Set component as disabled',
13
+ },
14
+ required: {
15
+ control: 'boolean',
16
+ description: 'Set component as required',
17
+ },
18
+ placeholder: {
19
+ control: 'text',
20
+ description: 'Placeholder text',
21
+ },
22
+ },
23
+ args: {
24
+ name: 'input',
25
+ disabled: false,
26
+ required: false,
27
+ },
28
+ };
29
+
30
+ export default meta;
31
+
32
+ type Story = StoryObj<typeof UiInput>;
33
+
34
+ const defaultTemplateSource = `<script setup lang="ts">
35
+ import { UiInput } from '@aleph-alpha/ui-library'
36
+ </script>
37
+
38
+ <template>
39
+ <UiInput type="email" name="email" placeholder="Email" />
40
+ </template>`;
41
+
42
+ /**
43
+ * Default input field.
44
+ */
45
+ export const Default: Story = {
46
+ render: (args) => ({
47
+ components: { UiInput },
48
+ setup() {
49
+ return { args };
50
+ },
51
+ template: `<UiInput type="email" name="email" placeholder="Email" :disabled="args.disabled" :required="args.required" />`,
52
+ }),
53
+ parameters: {
54
+ docs: {
55
+ source: {
56
+ code: defaultTemplateSource,
57
+ },
58
+ },
59
+ },
60
+ };
61
+
62
+ const withLabelTemplateSource = `<script setup lang="ts">
63
+ import { UiInput } from '@aleph-alpha/ui-library'
64
+ </script>
65
+
66
+ <template>
67
+ <div class="grid w-full max-w-sm items-center gap-1.5">
68
+ <label for="email" class="text-sm font-medium">Email</label>
69
+ <UiInput id="email" name="email" type="email" placeholder="Email" />
70
+ </div>
71
+ </template>`;
72
+
73
+ /**
74
+ * Input with label for better accessibility.
75
+ */
76
+ export const WithLabel: Story = {
77
+ render: (args) => ({
78
+ components: { UiInput },
79
+ setup() {
80
+ return { args };
81
+ },
82
+ template: `<div class="grid w-full max-w-sm items-center gap-1.5">
83
+ <label for="email" class="text-sm font-medium">Email</label>
84
+ <UiInput id="email" name="email" type="email" placeholder="Email" :disabled="args.disabled" :required="args.required" />
85
+ </div>`,
86
+ }),
87
+ parameters: {
88
+ docs: {
89
+ source: {
90
+ code: withLabelTemplateSource,
91
+ },
92
+ },
93
+ },
94
+ };
95
+
96
+ const disabledTemplateSource = `<script setup lang="ts">
97
+ import { UiInput } from '@aleph-alpha/ui-library'
98
+ </script>
99
+
100
+ <template>
101
+ <UiInput name="disabled" disabled placeholder="Disabled input" />
102
+ </template>`;
103
+
104
+ /**
105
+ * Disabled input field.
106
+ */
107
+ export const Disabled: Story = {
108
+ args: {
109
+ disabled: true,
110
+ },
111
+ render: (args) => ({
112
+ components: { UiInput },
113
+ setup() {
114
+ return { args };
115
+ },
116
+ template: `<UiInput name="disabled" :disabled="args.disabled" placeholder="Disabled input" />`,
117
+ }),
118
+ parameters: {
119
+ docs: {
120
+ source: {
121
+ code: disabledTemplateSource,
122
+ },
123
+ },
124
+ },
125
+ };
126
+
127
+ const withButtonTemplateSource = `<script setup lang="ts">
128
+ import { UiInput, UiButton } from '@aleph-alpha/ui-library'
129
+ </script>
130
+
131
+ <template>
132
+ <div class="flex w-full max-w-sm items-center space-x-2">
133
+ <UiInput name="email" type="email" placeholder="Email" />
134
+ <UiButton type="submit">Subscribe</UiButton>
135
+ </div>
136
+ </template>`;
137
+
138
+ /**
139
+ * Input with button, commonly used for subscriptions or search.
140
+ */
141
+ export const WithButton: Story = {
142
+ render: (args) => ({
143
+ components: { UiInput, UiButton },
144
+ setup() {
145
+ return { args };
146
+ },
147
+ template: `<div class="flex w-full max-w-sm items-center space-x-2">
148
+ <UiInput name="email" type="email" placeholder="Email" :disabled="args.disabled" />
149
+ <UiButton type="submit">Subscribe</UiButton>
150
+ </div>`,
151
+ }),
152
+ parameters: {
153
+ docs: {
154
+ source: {
155
+ code: withButtonTemplateSource,
156
+ },
157
+ },
158
+ },
159
+ };
160
+
161
+ const fileTemplateSource = `<script setup lang="ts">
162
+ import { UiInput } from '@aleph-alpha/ui-library'
163
+ </script>
164
+
165
+ <template>
166
+ <div class="grid w-full max-w-sm items-center gap-1.5">
167
+ <label for="picture" class="text-sm font-medium">Picture</label>
168
+ <UiInput id="picture" name="picture" type="file" />
169
+ </div>
170
+ </template>`;
171
+
172
+ /**
173
+ * File input for uploads.
174
+ */
175
+ export const File: Story = {
176
+ render: (args) => ({
177
+ components: { UiInput },
178
+ setup() {
179
+ return { args };
180
+ },
181
+ template: `<div class="grid w-full max-w-sm items-center gap-1.5">
182
+ <label for="picture" class="text-sm font-medium">Picture</label>
183
+ <UiInput id="picture" name="picture" type="file" :disabled="args.disabled" />
184
+ </div>`,
185
+ }),
186
+ parameters: {
187
+ docs: {
188
+ source: {
189
+ code: fileTemplateSource,
190
+ },
191
+ },
192
+ },
193
+ };
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { Input as ShadcnInput } from '@/primitives/shadcn/input';
3
+ import { UiInputProps } from './types';
4
+
5
+ defineOptions({
6
+ name: 'UiInput',
7
+ });
8
+
9
+ const props = withDefaults(defineProps<UiInputProps>(), {
10
+ disabled: false,
11
+ placeholder: undefined,
12
+ });
13
+
14
+ const model = defineModel<string>();
15
+ </script>
16
+
17
+ <template>
18
+ <ShadcnInput v-model="model" v-bind="props" />
19
+ </template>
@@ -0,0 +1,38 @@
1
+ import { render } from '@testing-library/vue';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, test } from 'vitest';
4
+ import UiInput from '../UiInput.vue';
5
+
6
+ describe('UiInput', () => {
7
+ test('renders input with placeholder', () => {
8
+ const placeholder = 'Input Placeholder';
9
+ const { getByPlaceholderText } = render(UiInput, {
10
+ props: {
11
+ placeholder,
12
+ },
13
+ });
14
+ expect(getByPlaceholderText(placeholder)).toBeInTheDocument();
15
+ });
16
+
17
+ test('renders input normally', () => {
18
+ const { getByRole } = render(UiInput);
19
+ expect(getByRole('textbox')).toBeEnabled();
20
+ });
21
+
22
+ test('renders input disabled', () => {
23
+ const { getByRole } = render(UiInput, {
24
+ props: {
25
+ disabled: true,
26
+ },
27
+ });
28
+ expect(getByRole('textbox')).toBeDisabled();
29
+ });
30
+
31
+ test('emits update:modelValue on user input', async () => {
32
+ const testValue = 'Hello';
33
+ const { getByRole, emitted } = render(UiInput);
34
+ await userEvent.type(getByRole('textbox'), testValue);
35
+ const emittedModelValue = emitted('update:modelValue') as string[][];
36
+ expect(emittedModelValue[emittedModelValue.length - 1][0]).toMatch(testValue);
37
+ });
38
+ });
@@ -0,0 +1,2 @@
1
+ export { default as UiInput } from './UiInput.vue';
2
+ export * from './types';
@@ -0,0 +1,31 @@
1
+ /**
2
+ * A text input field for single-line user input. Use for forms, search bars,
3
+ * and any text entry that fits on one line.
4
+ *
5
+ * @category Form Inputs
6
+ * @useCases text entry, search field, email input, password field, form field
7
+ * @keywords input, text, field, form, search, email, password, textbox
8
+ * @related UiTextarea, UiSelect, UiCheckbox
9
+ */
10
+ export interface UiInputProps {
11
+ /**
12
+ * Prop to name the element
13
+ */
14
+ name: string;
15
+ /**
16
+ * Prop to define the Input as disabled, therefore blocking all user interaction with it.
17
+ * @default false
18
+ */
19
+ disabled?: boolean;
20
+ /**
21
+ /**
22
+ * Prop to define the Input placeholder text.
23
+ * @default undefined
24
+ */
25
+ placeholder?: string;
26
+ /**
27
+ * Define the element as required on a Form.
28
+ * @default false
29
+ */
30
+ required?: boolean;
31
+ }
@@ -0,0 +1,394 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent } from '.';
3
+ import { UiButton } from '../UiButton';
4
+ import { ref, watch } from 'vue';
5
+
6
+ const meta: Meta<typeof UiPopover> = {
7
+ title: 'Primitives/UiPopover',
8
+ component: UiPopover,
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ open: {
12
+ control: 'boolean',
13
+ description: 'Controls whether the popover is open',
14
+ },
15
+ modal: {
16
+ control: 'boolean',
17
+ description: 'Whether the popover should be modal',
18
+ },
19
+ },
20
+ args: {
21
+ open: false,
22
+ modal: false,
23
+ },
24
+ };
25
+
26
+ export default meta;
27
+ type Story = StoryObj<typeof UiPopover>;
28
+
29
+ const defaultTemplateSource = `<script setup lang="ts">
30
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton } from '@aleph-alpha/ui-library'
31
+ </script>
32
+
33
+ <template>
34
+ <UiPopover>
35
+ <UiPopoverTrigger as-child>
36
+ <UiButton variant="outline">Open Popover</UiButton>
37
+ </UiPopoverTrigger>
38
+ <UiPopoverContent>
39
+ <div class="space-y-2">
40
+ <h4 class="font-medium leading-none">Dimensions</h4>
41
+ <p class="text-sm text-muted-foreground">
42
+ Set the dimensions for the layer.
43
+ </p>
44
+ </div>
45
+ </UiPopoverContent>
46
+ </UiPopover>
47
+ </template>`;
48
+
49
+ export const Default: Story = {
50
+ render: (args) => ({
51
+ components: { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton },
52
+ setup() {
53
+ const open = ref(args.open);
54
+ const modal = ref(args.modal);
55
+ watch(
56
+ () => args.open,
57
+ (val) => {
58
+ open.value = val;
59
+ },
60
+ );
61
+ watch(
62
+ () => args.modal,
63
+ (val) => {
64
+ modal.value = val;
65
+ },
66
+ );
67
+ return { open, modal };
68
+ },
69
+ template: `
70
+ <UiPopover v-model:open="open" :modal="modal">
71
+ <UiPopoverTrigger as-child>
72
+ <UiButton variant="outline">Open Popover</UiButton>
73
+ </UiPopoverTrigger>
74
+ <UiPopoverContent>
75
+ <div class="space-y-2">
76
+ <h4 class="font-medium leading-none">Dimensions</h4>
77
+ <p class="text-sm text-muted-foreground">
78
+ Set the dimensions for the layer.
79
+ </p>
80
+ </div>
81
+ </UiPopoverContent>
82
+ </UiPopover>
83
+ `,
84
+ }),
85
+ parameters: {
86
+ docs: {
87
+ source: {
88
+ code: defaultTemplateSource,
89
+ },
90
+ },
91
+ },
92
+ };
93
+
94
+ const controlledTemplateSource = `<script setup lang="ts">
95
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton } from '@aleph-alpha/ui-library'
96
+ import { ref } from 'vue'
97
+
98
+ const open = ref(false)
99
+ </script>
100
+
101
+ <template>
102
+ <UiPopover v-model:open="open">
103
+ <UiPopoverTrigger as-child>
104
+ <UiButton variant="outline">
105
+ {{ open ? 'Close' : 'Open' }} Popover
106
+ </UiButton>
107
+ </UiPopoverTrigger>
108
+ <UiPopoverContent>
109
+ <div class="space-y-2">
110
+ <h4 class="font-medium leading-none">Controlled Popover</h4>
111
+ <p class="text-sm text-muted-foreground">
112
+ This popover is controlled via v-model:open.
113
+ </p>
114
+ <UiButton size="sm" @click="open = false">Close</UiButton>
115
+ </div>
116
+ </UiPopoverContent>
117
+ </UiPopover>
118
+ </template>`;
119
+
120
+ export const Controlled: Story = {
121
+ render: () => ({
122
+ components: { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton },
123
+ setup() {
124
+ const open = ref(false);
125
+ return { open };
126
+ },
127
+ template: `
128
+ <UiPopover v-model:open="open">
129
+ <UiPopoverTrigger as-child>
130
+ <UiButton variant="outline">
131
+ {{ open ? 'Close' : 'Open' }} Popover
132
+ </UiButton>
133
+ </UiPopoverTrigger>
134
+ <UiPopoverContent>
135
+ <div class="space-y-2">
136
+ <h4 class="font-medium leading-none">Controlled Popover</h4>
137
+ <p class="text-sm text-muted-foreground">
138
+ This popover is controlled via v-model:open.
139
+ </p>
140
+ <UiButton size="sm" @click="open = false">Close</UiButton>
141
+ </div>
142
+ </UiPopoverContent>
143
+ </UiPopover>
144
+ `,
145
+ }),
146
+ parameters: {
147
+ controls: { disable: true },
148
+ docs: {
149
+ source: {
150
+ code: controlledTemplateSource,
151
+ },
152
+ },
153
+ },
154
+ };
155
+
156
+ const positionsTemplateSource = `<script setup lang="ts">
157
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton } from '@aleph-alpha/ui-library'
158
+ </script>
159
+
160
+ <template>
161
+ <div class="flex gap-4 flex-wrap">
162
+ <UiPopover>
163
+ <UiPopoverTrigger as-child>
164
+ <UiButton variant="outline">Top</UiButton>
165
+ </UiPopoverTrigger>
166
+ <UiPopoverContent side="top">
167
+ <p class="text-sm">Popover on top</p>
168
+ </UiPopoverContent>
169
+ </UiPopover>
170
+
171
+ <UiPopover>
172
+ <UiPopoverTrigger as-child>
173
+ <UiButton variant="outline">Right</UiButton>
174
+ </UiPopoverTrigger>
175
+ <UiPopoverContent side="right">
176
+ <p class="text-sm">Popover on right</p>
177
+ </UiPopoverContent>
178
+ </UiPopover>
179
+
180
+ <UiPopover>
181
+ <UiPopoverTrigger as-child>
182
+ <UiButton variant="outline">Bottom</UiButton>
183
+ </UiPopoverTrigger>
184
+ <UiPopoverContent side="bottom">
185
+ <p class="text-sm">Popover on bottom</p>
186
+ </UiPopoverContent>
187
+ </UiPopover>
188
+
189
+ <UiPopover>
190
+ <UiPopoverTrigger as-child>
191
+ <UiButton variant="outline">Left</UiButton>
192
+ </UiPopoverTrigger>
193
+ <UiPopoverContent side="left">
194
+ <p class="text-sm">Popover on left</p>
195
+ </UiPopoverContent>
196
+ </UiPopover>
197
+ </div>
198
+ </template>`;
199
+
200
+ export const Positions: Story = {
201
+ render: () => ({
202
+ components: { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton },
203
+ template: `
204
+ <div class="flex gap-4 flex-wrap">
205
+ <UiPopover>
206
+ <UiPopoverTrigger as-child>
207
+ <UiButton variant="outline">Top</UiButton>
208
+ </UiPopoverTrigger>
209
+ <UiPopoverContent side="top">
210
+ <p class="text-sm">Popover on top</p>
211
+ </UiPopoverContent>
212
+ </UiPopover>
213
+
214
+ <UiPopover>
215
+ <UiPopoverTrigger as-child>
216
+ <UiButton variant="outline">Right</UiButton>
217
+ </UiPopoverTrigger>
218
+ <UiPopoverContent side="right">
219
+ <p class="text-sm">Popover on right</p>
220
+ </UiPopoverContent>
221
+ </UiPopover>
222
+
223
+ <UiPopover>
224
+ <UiPopoverTrigger as-child>
225
+ <UiButton variant="outline">Bottom</UiButton>
226
+ </UiPopoverTrigger>
227
+ <UiPopoverContent side="bottom">
228
+ <p class="text-sm">Popover on bottom</p>
229
+ </UiPopoverContent>
230
+ </UiPopover>
231
+
232
+ <UiPopover>
233
+ <UiPopoverTrigger as-child>
234
+ <UiButton variant="outline">Left</UiButton>
235
+ </UiPopoverTrigger>
236
+ <UiPopoverContent side="left">
237
+ <p class="text-sm">Popover on left</p>
238
+ </UiPopoverContent>
239
+ </UiPopover>
240
+ </div>
241
+ `,
242
+ }),
243
+ parameters: {
244
+ controls: { disable: true },
245
+ docs: {
246
+ source: {
247
+ code: positionsTemplateSource,
248
+ },
249
+ },
250
+ },
251
+ };
252
+
253
+ const alignmentsTemplateSource = `<script setup lang="ts">
254
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton } from '@aleph-alpha/ui-library'
255
+ </script>
256
+
257
+ <template>
258
+ <div class="flex gap-4 flex-wrap">
259
+ <UiPopover>
260
+ <UiPopoverTrigger as-child>
261
+ <UiButton variant="outline">Align Start</UiButton>
262
+ </UiPopoverTrigger>
263
+ <UiPopoverContent align="start">
264
+ <p class="text-sm">Aligned to start</p>
265
+ </UiPopoverContent>
266
+ </UiPopover>
267
+
268
+ <UiPopover>
269
+ <UiPopoverTrigger as-child>
270
+ <UiButton variant="outline">Align Center</UiButton>
271
+ </UiPopoverTrigger>
272
+ <UiPopoverContent align="center">
273
+ <p class="text-sm">Aligned to center</p>
274
+ </UiPopoverContent>
275
+ </UiPopover>
276
+
277
+ <UiPopover>
278
+ <UiPopoverTrigger as-child>
279
+ <UiButton variant="outline">Align End</UiButton>
280
+ </UiPopoverTrigger>
281
+ <UiPopoverContent align="end">
282
+ <p class="text-sm">Aligned to end</p>
283
+ </UiPopoverContent>
284
+ </UiPopover>
285
+ </div>
286
+ </template>`;
287
+
288
+ export const Alignments: Story = {
289
+ render: () => ({
290
+ components: { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton },
291
+ template: `
292
+ <div class="flex gap-4 flex-wrap">
293
+ <UiPopover>
294
+ <UiPopoverTrigger as-child>
295
+ <UiButton variant="outline">Align Start</UiButton>
296
+ </UiPopoverTrigger>
297
+ <UiPopoverContent align="start">
298
+ <p class="text-sm">Aligned to start</p>
299
+ </UiPopoverContent>
300
+ </UiPopover>
301
+
302
+ <UiPopover>
303
+ <UiPopoverTrigger as-child>
304
+ <UiButton variant="outline">Align Center</UiButton>
305
+ </UiPopoverTrigger>
306
+ <UiPopoverContent align="center">
307
+ <p class="text-sm">Aligned to center</p>
308
+ </UiPopoverContent>
309
+ </UiPopover>
310
+
311
+ <UiPopover>
312
+ <UiPopoverTrigger as-child>
313
+ <UiButton variant="outline">Align End</UiButton>
314
+ </UiPopoverTrigger>
315
+ <UiPopoverContent align="end">
316
+ <p class="text-sm">Aligned to end</p>
317
+ </UiPopoverContent>
318
+ </UiPopover>
319
+ </div>
320
+ `,
321
+ }),
322
+ parameters: {
323
+ controls: { disable: true },
324
+ docs: {
325
+ source: {
326
+ code: alignmentsTemplateSource,
327
+ },
328
+ },
329
+ },
330
+ };
331
+
332
+ const openByDefaultTemplateSource = `<script setup lang="ts">
333
+ import { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton } from '@aleph-alpha/ui-library'
334
+ import { ref } from 'vue'
335
+
336
+ const open = ref(true)
337
+ </script>
338
+
339
+ <template>
340
+ <div class="pt-4">
341
+ <UiPopover v-model:open="open">
342
+ <UiPopoverTrigger as-child>
343
+ <UiButton variant="outline">Toggle Popover</UiButton>
344
+ </UiPopoverTrigger>
345
+ <UiPopoverContent>
346
+ <div class="space-y-2">
347
+ <h4 class="font-medium leading-none">Popover Content</h4>
348
+ <p class="text-sm text-muted-foreground">
349
+ This popover is open by default for visual testing.
350
+ </p>
351
+ </div>
352
+ </UiPopoverContent>
353
+ </UiPopover>
354
+ </div>
355
+ </template>`;
356
+
357
+ /**
358
+ * Popover that starts open. Useful for visual regression testing
359
+ * to capture the popover content without user interaction.
360
+ */
361
+ export const OpenByDefault: Story = {
362
+ render: () => ({
363
+ components: { UiPopover, UiPopoverTrigger, UiPopoverContent, UiButton },
364
+ setup() {
365
+ const open = ref(true);
366
+ return { open };
367
+ },
368
+ template: `
369
+ <div class="pt-4">
370
+ <UiPopover v-model:open="open">
371
+ <UiPopoverTrigger as-child>
372
+ <UiButton variant="outline">Toggle Popover</UiButton>
373
+ </UiPopoverTrigger>
374
+ <UiPopoverContent>
375
+ <div class="space-y-2">
376
+ <h4 class="font-medium leading-none">Popover Content</h4>
377
+ <p class="text-sm text-muted-foreground">
378
+ This popover is open by default for visual testing.
379
+ </p>
380
+ </div>
381
+ </UiPopoverContent>
382
+ </UiPopover>
383
+ </div>
384
+ `,
385
+ }),
386
+ parameters: {
387
+ controls: { disable: true },
388
+ docs: {
389
+ source: {
390
+ code: openByDefaultTemplateSource,
391
+ },
392
+ },
393
+ },
394
+ };
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import { Popover as ShadcnPopover } from '@/primitives/shadcn/popover';
3
+ import type { UiPopoverProps } from './types';
4
+
5
+ defineOptions({
6
+ name: 'UiPopover',
7
+ });
8
+
9
+ defineProps<UiPopoverProps>();
10
+ const open = defineModel<boolean>('open');
11
+ </script>
12
+
13
+ <template>
14
+ <ShadcnPopover v-model:open="open" :modal="$props.modal">
15
+ <slot />
16
+ </ShadcnPopover>
17
+ </template>