@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,976 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import { CalendarDate, getLocalTimeZone, today } from '@internationalized/date';
3
+ import type { DateRange, DateValue } from 'reka-ui';
4
+ import { ref, watch } from 'vue';
5
+ import UiDatePicker from './UiDatePicker.vue';
6
+
7
+ const meta: Meta<typeof UiDatePicker> = {
8
+ title: 'Compositions/UiDatePicker',
9
+ component: UiDatePicker,
10
+ tags: ['autodocs'],
11
+ decorators: [
12
+ () => ({
13
+ template: '<div class="inline-block"><story /></div>',
14
+ }),
15
+ ],
16
+ argTypes: {
17
+ mode: {
18
+ control: 'select',
19
+ options: ['single', 'range'],
20
+ description: 'The selection mode: single date or date range.',
21
+ },
22
+ placeholder: {
23
+ control: 'text',
24
+ description: 'Placeholder text when no date is selected.',
25
+ },
26
+ disabled: {
27
+ control: 'boolean',
28
+ description: 'Whether the date picker is disabled.',
29
+ },
30
+ readonly: {
31
+ control: 'boolean',
32
+ description: 'Whether the date picker is read-only.',
33
+ },
34
+ locale: {
35
+ control: 'select',
36
+ options: ['en', 'de', 'fr', 'es', 'pl'],
37
+ description: 'The locale to use for formatting dates.',
38
+ },
39
+ weekStartsOn: {
40
+ control: 'select',
41
+ options: [0, 1, 2, 3, 4, 5, 6],
42
+ description: 'The day of the week to start on. 0 = Sunday, 1 = Monday, etc.',
43
+ },
44
+ numberOfMonths: {
45
+ control: { type: 'number', min: 1, max: 3 },
46
+ description: 'The number of months to display at once.',
47
+ },
48
+ pagedNavigation: {
49
+ control: 'boolean',
50
+ description:
51
+ 'Whether to navigate by page (all visible months) or by single month. Only applies in range mode.',
52
+ },
53
+ weekdayFormat: {
54
+ control: 'select',
55
+ options: ['narrow', 'short', 'long'],
56
+ description: 'The format to use for weekday labels.',
57
+ },
58
+ fixedWeeks: {
59
+ control: 'boolean',
60
+ description: 'Whether to always show 6 weeks in the calendar.',
61
+ },
62
+ layout: {
63
+ control: 'select',
64
+ options: [undefined, 'month-and-year', 'month-only', 'year-only'],
65
+ description: 'Layout mode for the calendar header dropdowns. Only applies in single mode.',
66
+ },
67
+ preventDeselect: {
68
+ control: 'boolean',
69
+ description: 'Whether to prevent deselecting a date.',
70
+ },
71
+ closeOnSelect: {
72
+ control: 'boolean',
73
+ description: 'Whether to close the popover after selecting a date (or date range).',
74
+ },
75
+ },
76
+ args: {
77
+ mode: 'single',
78
+ disabled: false,
79
+ readonly: false,
80
+ locale: 'en',
81
+ weekStartsOn: 0,
82
+ numberOfMonths: 1,
83
+ pagedNavigation: false,
84
+ weekdayFormat: 'narrow',
85
+ fixedWeeks: false,
86
+ layout: undefined,
87
+ preventDeselect: false,
88
+ closeOnSelect: true,
89
+ },
90
+ };
91
+
92
+ export default meta;
93
+
94
+ type Story = StoryObj<typeof UiDatePicker>;
95
+
96
+ const defaultTemplateSource = `<script setup lang="ts">
97
+ import { ref } from 'vue'
98
+ import type { DateValue } from '@internationalized/date'
99
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
100
+
101
+ const date = ref<DateValue>()
102
+ </script>
103
+
104
+ <template>
105
+ <UiDatePicker v-model="date" />
106
+ </template>`;
107
+
108
+ /**
109
+ * Basic date picker with default settings.
110
+ * Click the button to open the calendar and select a date.
111
+ */
112
+ export const Default: Story = {
113
+ render: (args) => ({
114
+ components: { UiDatePicker },
115
+ setup() {
116
+ const date = ref<DateValue>();
117
+ watch(
118
+ () => args.modelValue,
119
+ (val) => {
120
+ date.value = val;
121
+ },
122
+ );
123
+ return { date, args };
124
+ },
125
+ template: `<UiDatePicker
126
+ v-model="date"
127
+ :placeholder="args.placeholder"
128
+ :disabled="args.disabled"
129
+ :readonly="args.readonly"
130
+ :locale="args.locale"
131
+ :week-starts-on="args.weekStartsOn"
132
+ :number-of-months="args.numberOfMonths"
133
+ :weekday-format="args.weekdayFormat"
134
+ :fixed-weeks="args.fixedWeeks"
135
+ :layout="args.layout"
136
+ :prevent-deselect="args.preventDeselect"
137
+ :close-on-select="args.closeOnSelect"
138
+ />`,
139
+ }),
140
+ parameters: {
141
+ docs: {
142
+ source: {
143
+ code: defaultTemplateSource,
144
+ },
145
+ },
146
+ },
147
+ };
148
+
149
+ const withPreselectedDateTemplateSource = `<script setup lang="ts">
150
+ import { ref } from 'vue'
151
+ import type { DateValue } from '@internationalized/date'
152
+ import { getLocalTimeZone, today } from '@internationalized/date'
153
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
154
+
155
+ const date = ref<DateValue>(today(getLocalTimeZone()))
156
+ </script>
157
+
158
+ <template>
159
+ <UiDatePicker v-model="date" />
160
+ </template>`;
161
+
162
+ /**
163
+ * Date picker with a pre-selected date (today).
164
+ */
165
+ export const WithPreselectedDate: Story = {
166
+ render: (args) => ({
167
+ components: { UiDatePicker },
168
+ setup() {
169
+ const date = ref<DateValue>(today(getLocalTimeZone()));
170
+ return { date, args };
171
+ },
172
+ template: `<UiDatePicker
173
+ v-model="date"
174
+ :locale="args.locale"
175
+ :disabled="args.disabled"
176
+ />`,
177
+ }),
178
+ parameters: {
179
+ docs: {
180
+ source: {
181
+ code: withPreselectedDateTemplateSource,
182
+ },
183
+ },
184
+ },
185
+ };
186
+
187
+ const withMonthYearDropdownsTemplateSource = `<script setup lang="ts">
188
+ import { ref } from 'vue'
189
+ import type { DateValue } from '@internationalized/date'
190
+ import { CalendarDate } from '@internationalized/date'
191
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
192
+
193
+ const date = ref<DateValue>()
194
+ const minValue = new CalendarDate(1925, 1, 1)
195
+ const maxValue = new CalendarDate(2035, 1, 1)
196
+ </script>
197
+
198
+ <template>
199
+ <UiDatePicker
200
+ v-model="date"
201
+ layout="month-and-year"
202
+ :min-value="minValue"
203
+ :max-value="maxValue"
204
+ placeholder="Select birth date"
205
+ />
206
+ </template>`;
207
+
208
+ /**
209
+ * Date picker with month and year dropdown selectors.
210
+ * Useful for date-of-birth pickers or when users need to navigate far from the current date.
211
+ */
212
+ export const WithMonthYearDropdowns: Story = {
213
+ args: {
214
+ layout: 'month-and-year',
215
+ placeholder: 'Select birth date',
216
+ },
217
+ render: (args) => ({
218
+ components: { UiDatePicker },
219
+ setup() {
220
+ const date = ref<DateValue>();
221
+ const minValue = new CalendarDate(1925, 1, 1);
222
+ const maxValue = new CalendarDate(2035, 1, 1);
223
+ return { date, minValue, maxValue, args };
224
+ },
225
+ template: `<UiDatePicker
226
+ v-model="date"
227
+ :layout="args.layout"
228
+ :min-value="minValue"
229
+ :max-value="maxValue"
230
+ :placeholder="args.placeholder"
231
+ :disabled="args.disabled"
232
+ :locale="args.locale"
233
+ />`,
234
+ }),
235
+ parameters: {
236
+ docs: {
237
+ source: {
238
+ code: withMonthYearDropdownsTemplateSource,
239
+ },
240
+ },
241
+ },
242
+ };
243
+
244
+ const withDateRangeTemplateSource = `<script setup lang="ts">
245
+ import { ref } from 'vue'
246
+ import type { DateValue } from '@internationalized/date'
247
+ import { getLocalTimeZone, today } from '@internationalized/date'
248
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
249
+
250
+ const date = ref<DateValue>()
251
+ const minValue = today(getLocalTimeZone())
252
+ const maxValue = today(getLocalTimeZone()).add({ months: 3 })
253
+ </script>
254
+
255
+ <template>
256
+ <UiDatePicker
257
+ v-model="date"
258
+ :min-value="minValue"
259
+ :max-value="maxValue"
260
+ placeholder="Select appointment"
261
+ />
262
+ </template>`;
263
+
264
+ /**
265
+ * Date picker with min and max date constraints.
266
+ * Only dates within the next 3 months are selectable.
267
+ */
268
+ export const WithDateRange: Story = {
269
+ args: {
270
+ placeholder: 'Select appointment',
271
+ },
272
+ render: (args) => ({
273
+ components: { UiDatePicker },
274
+ setup() {
275
+ const date = ref<DateValue>();
276
+ const todayDate = today(getLocalTimeZone());
277
+ const minValue = todayDate;
278
+ const maxValue = todayDate.add({ months: 3 });
279
+ return { date, minValue, maxValue, args };
280
+ },
281
+ template: `<UiDatePicker
282
+ v-model="date"
283
+ :min-value="minValue"
284
+ :max-value="maxValue"
285
+ :placeholder="args.placeholder"
286
+ :disabled="args.disabled"
287
+ :locale="args.locale"
288
+ />`,
289
+ }),
290
+ parameters: {
291
+ docs: {
292
+ source: {
293
+ code: withDateRangeTemplateSource,
294
+ },
295
+ },
296
+ },
297
+ };
298
+
299
+ const disabledWeekendsTemplateSource = `<script setup lang="ts">
300
+ import { ref } from 'vue'
301
+ import type { DateValue } from '@internationalized/date'
302
+ import { getLocalTimeZone } from '@internationalized/date'
303
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
304
+
305
+ const date = ref<DateValue>()
306
+
307
+ // Disable weekends (Sunday = 0, Saturday = 6)
308
+ const isDateDisabled = (date: DateValue) => {
309
+ const dayOfWeek = date.toDate(getLocalTimeZone()).getDay()
310
+ return dayOfWeek === 0 || dayOfWeek === 6
311
+ }
312
+ </script>
313
+
314
+ <template>
315
+ <UiDatePicker
316
+ v-model="date"
317
+ :is-date-disabled="isDateDisabled"
318
+ placeholder="Select weekday"
319
+ />
320
+ </template>`;
321
+
322
+ /**
323
+ * Date picker with weekends disabled.
324
+ * Use the `isDateDisabled` function to disable specific dates based on custom logic.
325
+ */
326
+ export const DisabledWeekends: Story = {
327
+ args: {
328
+ placeholder: 'Select weekday',
329
+ },
330
+ render: (args) => ({
331
+ components: { UiDatePicker },
332
+ setup() {
333
+ const date = ref<DateValue>();
334
+
335
+ // Disable weekends (Sunday = 0, Saturday = 6 in JavaScript's getDay())
336
+ const isDateDisabled = (d: DateValue) => {
337
+ const dayOfWeek = d.toDate(getLocalTimeZone()).getDay();
338
+ return dayOfWeek === 0 || dayOfWeek === 6;
339
+ };
340
+
341
+ return { date, isDateDisabled, args };
342
+ },
343
+ template: `<UiDatePicker
344
+ v-model="date"
345
+ :is-date-disabled="isDateDisabled"
346
+ :placeholder="args.placeholder"
347
+ :disabled="args.disabled"
348
+ :locale="args.locale"
349
+ />`,
350
+ }),
351
+ parameters: {
352
+ docs: {
353
+ source: {
354
+ code: disabledWeekendsTemplateSource,
355
+ },
356
+ },
357
+ },
358
+ };
359
+
360
+ const germanLocaleTemplateSource = `<script setup lang="ts">
361
+ import { ref } from 'vue'
362
+ import type { DateValue } from '@internationalized/date'
363
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
364
+
365
+ const date = ref<DateValue>()
366
+ </script>
367
+
368
+ <template>
369
+ <UiDatePicker
370
+ v-model="date"
371
+ locale="de"
372
+ :week-starts-on="1"
373
+ weekday-format="short"
374
+ placeholder="Datum auswählen"
375
+ />
376
+ </template>`;
377
+
378
+ /**
379
+ * Date picker with German locale and week starting on Monday.
380
+ * Demonstrates i18n capabilities.
381
+ */
382
+ export const GermanLocale: Story = {
383
+ args: {
384
+ locale: 'de',
385
+ weekStartsOn: 1,
386
+ weekdayFormat: 'short',
387
+ placeholder: 'Datum auswählen',
388
+ },
389
+ render: (args) => ({
390
+ components: { UiDatePicker },
391
+ setup() {
392
+ const date = ref<DateValue>();
393
+ return { date, args };
394
+ },
395
+ template: `<UiDatePicker
396
+ v-model="date"
397
+ :locale="args.locale"
398
+ :week-starts-on="args.weekStartsOn"
399
+ :weekday-format="args.weekdayFormat"
400
+ :placeholder="args.placeholder"
401
+ :disabled="args.disabled"
402
+ />`,
403
+ }),
404
+ parameters: {
405
+ docs: {
406
+ source: {
407
+ code: germanLocaleTemplateSource,
408
+ },
409
+ },
410
+ },
411
+ };
412
+
413
+ const disabledTemplateSource = `<script setup lang="ts">
414
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
415
+ </script>
416
+
417
+ <template>
418
+ <UiDatePicker disabled placeholder="Date picker disabled" />
419
+ </template>`;
420
+
421
+ /**
422
+ * Disabled date picker state.
423
+ * Users cannot interact with the date picker.
424
+ */
425
+ export const Disabled: Story = {
426
+ args: {
427
+ disabled: true,
428
+ placeholder: 'Date picker disabled',
429
+ },
430
+ render: (args) => ({
431
+ components: { UiDatePicker },
432
+ setup() {
433
+ return { args };
434
+ },
435
+ template: `<UiDatePicker
436
+ :disabled="args.disabled"
437
+ :placeholder="args.placeholder"
438
+ />`,
439
+ }),
440
+ parameters: {
441
+ docs: {
442
+ source: {
443
+ code: disabledTemplateSource,
444
+ },
445
+ },
446
+ },
447
+ };
448
+
449
+ const customWidthTemplateSource = `<script setup lang="ts">
450
+ import { ref } from 'vue'
451
+ import type { DateValue } from '@internationalized/date'
452
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
453
+
454
+ const date = ref<DateValue>()
455
+ </script>
456
+
457
+ <template>
458
+ <div class="w-[320px]">
459
+ <UiDatePicker v-model="date" class="w-full" />
460
+ </div>
461
+ </template>`;
462
+
463
+ /**
464
+ * Date picker with custom width.
465
+ * The `class` prop overrides the default width (240px for single, 300px for range).
466
+ * Useful for responsive forms and full-width layouts.
467
+ */
468
+ export const CustomWidth: Story = {
469
+ render: (args) => ({
470
+ components: { UiDatePicker },
471
+ setup() {
472
+ const date = ref<DateValue>();
473
+ return { date, args };
474
+ },
475
+ template: `<div class="w-[320px]">
476
+ <UiDatePicker
477
+ v-model="date"
478
+ class="w-full"
479
+ :disabled="args.disabled"
480
+ :locale="args.locale"
481
+ />
482
+ </div>`,
483
+ }),
484
+ parameters: {
485
+ docs: {
486
+ source: {
487
+ code: customWidthTemplateSource,
488
+ },
489
+ },
490
+ },
491
+ };
492
+
493
+ const keepOpenOnSelectTemplateSource = `<script setup lang="ts">
494
+ import { ref } from 'vue'
495
+ import type { DateValue } from '@internationalized/date'
496
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
497
+
498
+ const date = ref<DateValue>()
499
+ </script>
500
+
501
+ <template>
502
+ <UiDatePicker
503
+ v-model="date"
504
+ :close-on-select="false"
505
+ placeholder="Stays open on select"
506
+ />
507
+ </template>`;
508
+
509
+ /**
510
+ * Date picker that stays open after selecting a date.
511
+ * Useful when users might want to change their selection.
512
+ */
513
+ export const KeepOpenOnSelect: Story = {
514
+ args: {
515
+ closeOnSelect: false,
516
+ placeholder: 'Stays open on select',
517
+ },
518
+ render: (args) => ({
519
+ components: { UiDatePicker },
520
+ setup() {
521
+ const date = ref<DateValue>();
522
+ return { date, args };
523
+ },
524
+ template: `<UiDatePicker
525
+ v-model="date"
526
+ :close-on-select="args.closeOnSelect"
527
+ :placeholder="args.placeholder"
528
+ :disabled="args.disabled"
529
+ :locale="args.locale"
530
+ />`,
531
+ }),
532
+ parameters: {
533
+ docs: {
534
+ source: {
535
+ code: keepOpenOnSelectTemplateSource,
536
+ },
537
+ },
538
+ },
539
+ };
540
+
541
+ const twoMonthsTemplateSource = `<script setup lang="ts">
542
+ import { ref } from 'vue'
543
+ import type { DateValue } from '@internationalized/date'
544
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
545
+
546
+ const date = ref<DateValue>()
547
+ </script>
548
+
549
+ <template>
550
+ <UiDatePicker
551
+ v-model="date"
552
+ :number-of-months="2"
553
+ placeholder="Select date (2 months view)"
554
+ />
555
+ </template>`;
556
+
557
+ /**
558
+ * Date picker displaying two months side by side.
559
+ * Provides more context for date selection.
560
+ */
561
+ export const TwoMonthsView: Story = {
562
+ args: {
563
+ numberOfMonths: 2,
564
+ placeholder: 'Select date (2 months view)',
565
+ },
566
+ render: (args) => ({
567
+ components: { UiDatePicker },
568
+ setup() {
569
+ const date = ref<DateValue>();
570
+ return { date, args };
571
+ },
572
+ template: `<UiDatePicker
573
+ v-model="date"
574
+ :number-of-months="args.numberOfMonths"
575
+ :placeholder="args.placeholder"
576
+ :disabled="args.disabled"
577
+ :locale="args.locale"
578
+ />`,
579
+ }),
580
+ parameters: {
581
+ docs: {
582
+ source: {
583
+ code: twoMonthsTemplateSource,
584
+ },
585
+ },
586
+ },
587
+ };
588
+
589
+ const formExampleTemplateSource = `<script setup lang="ts">
590
+ import { ref } from 'vue'
591
+ import type { DateValue } from '@internationalized/date'
592
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
593
+
594
+ const appointmentDate = ref<DateValue>()
595
+ </script>
596
+
597
+ <template>
598
+ <div class="space-y-2">
599
+ <label class="text-sm font-medium">Appointment Date</label>
600
+ <UiDatePicker
601
+ v-model="appointmentDate"
602
+ placeholder="Select appointment date"
603
+ class="w-full"
604
+ aria-label="Select appointment date"
605
+ />
606
+ <p class="text-xs text-muted-foreground">
607
+ Choose a date for your appointment.
608
+ </p>
609
+ </div>
610
+ </template>`;
611
+
612
+ /**
613
+ * Date picker used in a form context with label and helper text.
614
+ * Demonstrates proper accessibility with aria-label.
615
+ */
616
+ export const FormExample: Story = {
617
+ render: (args) => ({
618
+ components: { UiDatePicker },
619
+ setup() {
620
+ const appointmentDate = ref<DateValue>();
621
+ return { appointmentDate, args };
622
+ },
623
+ template: `<div class="space-y-2">
624
+ <label class="text-sm font-medium">Appointment Date</label>
625
+ <UiDatePicker
626
+ v-model="appointmentDate"
627
+ placeholder="Select appointment date"
628
+ class="w-full"
629
+ aria-label="Select appointment date"
630
+ :disabled="args.disabled"
631
+ :locale="args.locale"
632
+ />
633
+ <p class="text-xs text-muted-foreground">
634
+ Choose a date for your appointment.
635
+ </p>
636
+ </div>`,
637
+ }),
638
+ parameters: {
639
+ docs: {
640
+ source: {
641
+ code: formExampleTemplateSource,
642
+ },
643
+ },
644
+ },
645
+ };
646
+
647
+ const rangeTemplateSource = `<script setup lang="ts">
648
+ import { ref } from 'vue'
649
+ import type { DateRange } from '@aleph-alpha/ui-library'
650
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
651
+
652
+ const dateRange = ref<DateRange>()
653
+ </script>
654
+
655
+ <template>
656
+ <UiDatePicker v-model="dateRange" mode="range" />
657
+ </template>`;
658
+
659
+ /**
660
+ * Date picker in range mode for selecting a date range.
661
+ * Click a start date, then click an end date to complete the range.
662
+ */
663
+ export const RangeMode: Story = {
664
+ args: {
665
+ mode: 'range',
666
+ },
667
+ render: (args) => ({
668
+ components: { UiDatePicker },
669
+ setup() {
670
+ const dateRange = ref<DateRange>();
671
+ return { dateRange, args };
672
+ },
673
+ template: `<UiDatePicker
674
+ v-model="dateRange"
675
+ mode="range"
676
+ :disabled="args.disabled"
677
+ :locale="args.locale"
678
+ />`,
679
+ }),
680
+ parameters: {
681
+ docs: {
682
+ source: {
683
+ code: rangeTemplateSource,
684
+ },
685
+ },
686
+ },
687
+ };
688
+
689
+ const rangeTwoMonthsTemplateSource = `<script setup lang="ts">
690
+ import { ref } from 'vue'
691
+ import type { DateRange } from '@aleph-alpha/ui-library'
692
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
693
+
694
+ const dateRange = ref<DateRange>()
695
+ </script>
696
+
697
+ <template>
698
+ <UiDatePicker
699
+ v-model="dateRange"
700
+ mode="range"
701
+ :number-of-months="2"
702
+ paged-navigation
703
+ placeholder="Select date range"
704
+ />
705
+ </template>`;
706
+
707
+ /**
708
+ * Range date picker with two months displayed side by side.
709
+ * Ideal for selecting longer date ranges with better context.
710
+ * Uses paged navigation to move both months together.
711
+ */
712
+ export const RangeTwoMonths: Story = {
713
+ args: {
714
+ mode: 'range',
715
+ numberOfMonths: 2,
716
+ pagedNavigation: true,
717
+ placeholder: 'Select date range',
718
+ },
719
+ render: (args) => ({
720
+ components: { UiDatePicker },
721
+ setup() {
722
+ const dateRange = ref<DateRange>();
723
+ return { dateRange, args };
724
+ },
725
+ template: `<UiDatePicker
726
+ v-model="dateRange"
727
+ mode="range"
728
+ :number-of-months="2"
729
+ paged-navigation
730
+ placeholder="Select date range"
731
+ :disabled="args.disabled"
732
+ :locale="args.locale"
733
+ />`,
734
+ }),
735
+ parameters: {
736
+ docs: {
737
+ source: {
738
+ code: rangeTwoMonthsTemplateSource,
739
+ },
740
+ },
741
+ },
742
+ };
743
+
744
+ const rangeWithConstraintsTemplateSource = `<script setup lang="ts">
745
+ import { ref } from 'vue'
746
+ import type { DateRange } from '@aleph-alpha/ui-library'
747
+ import { getLocalTimeZone, today } from '@aleph-alpha/ui-library'
748
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
749
+
750
+ const dateRange = ref<DateRange>()
751
+ const minValue = today(getLocalTimeZone())
752
+ const maxValue = today(getLocalTimeZone()).add({ months: 6 })
753
+ </script>
754
+
755
+ <template>
756
+ <UiDatePicker
757
+ v-model="dateRange"
758
+ mode="range"
759
+ :min-value="minValue"
760
+ :max-value="maxValue"
761
+ placeholder="Select vacation dates"
762
+ />
763
+ </template>`;
764
+
765
+ /**
766
+ * Range date picker with date constraints.
767
+ * Only dates within the next 6 months are selectable.
768
+ * Perfect for vacation planning or booking systems.
769
+ */
770
+ export const RangeWithConstraints: Story = {
771
+ args: {
772
+ mode: 'range',
773
+ placeholder: 'Select vacation dates',
774
+ },
775
+ render: (args) => ({
776
+ components: { UiDatePicker },
777
+ setup() {
778
+ const dateRange = ref<DateRange>();
779
+ const todayDate = today(getLocalTimeZone());
780
+ const minValue = todayDate;
781
+ const maxValue = todayDate.add({ months: 6 });
782
+ return { dateRange, minValue, maxValue, args };
783
+ },
784
+ template: `<UiDatePicker
785
+ v-model="dateRange"
786
+ mode="range"
787
+ :min-value="minValue"
788
+ :max-value="maxValue"
789
+ placeholder="Select vacation dates"
790
+ :disabled="args.disabled"
791
+ :locale="args.locale"
792
+ />`,
793
+ }),
794
+ parameters: {
795
+ docs: {
796
+ source: {
797
+ code: rangeWithConstraintsTemplateSource,
798
+ },
799
+ },
800
+ },
801
+ };
802
+
803
+ const rangePreselectedTemplateSource = `<script setup lang="ts">
804
+ import { ref } from 'vue'
805
+ import type { DateRange } from '@aleph-alpha/ui-library'
806
+ import { getLocalTimeZone, today } from '@aleph-alpha/ui-library'
807
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
808
+
809
+ const todayDate = today(getLocalTimeZone())
810
+ const dateRange = ref<DateRange>({
811
+ start: todayDate,
812
+ end: todayDate.add({ days: 7 }),
813
+ })
814
+ </script>
815
+
816
+ <template>
817
+ <UiDatePicker v-model="dateRange" mode="range" :number-of-months="2" />
818
+ </template>`;
819
+
820
+ /**
821
+ * Range date picker with a pre-selected 7-day range starting from today.
822
+ * Shows both months for better visualization of the selected range.
823
+ */
824
+ export const RangePreselected: Story = {
825
+ args: {
826
+ mode: 'range',
827
+ numberOfMonths: 2,
828
+ },
829
+ render: (args) => ({
830
+ components: { UiDatePicker },
831
+ setup() {
832
+ const todayDate = today(getLocalTimeZone());
833
+ const dateRange = ref<DateRange>({
834
+ start: todayDate,
835
+ end: todayDate.add({ days: 7 }),
836
+ });
837
+ return { dateRange, args };
838
+ },
839
+ template: `<UiDatePicker
840
+ v-model="dateRange"
841
+ mode="range"
842
+ :number-of-months="2"
843
+ :disabled="args.disabled"
844
+ :locale="args.locale"
845
+ />`,
846
+ }),
847
+ parameters: {
848
+ docs: {
849
+ source: {
850
+ code: rangePreselectedTemplateSource,
851
+ },
852
+ },
853
+ },
854
+ };
855
+
856
+ const rangeFormExampleTemplateSource = `<script setup lang="ts">
857
+ import { ref } from 'vue'
858
+ import type { DateRange } from '@aleph-alpha/ui-library'
859
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
860
+
861
+ const travelDates = ref<DateRange>()
862
+ </script>
863
+
864
+ <template>
865
+ <div class="space-y-2 max-w-sm">
866
+ <label for="travel-dates" class="text-sm font-medium">
867
+ Travel Dates
868
+ </label>
869
+ <UiDatePicker
870
+ id="travel-dates"
871
+ v-model="travelDates"
872
+ mode="range"
873
+ :number-of-months="2"
874
+ placeholder="Select dates"
875
+ aria-label="Select travel dates"
876
+ />
877
+ <p class="text-xs text-muted-foreground">
878
+ Choose your check-in and check-out dates.
879
+ </p>
880
+ </div>
881
+ </template>`;
882
+
883
+ /**
884
+ * Range date picker in a form context for travel booking.
885
+ * Shows how to use range mode with proper labels and helper text.
886
+ */
887
+ export const RangeFormExample: Story = {
888
+ args: {
889
+ mode: 'range',
890
+ numberOfMonths: 2,
891
+ placeholder: 'Select dates',
892
+ },
893
+ render: (args) => ({
894
+ components: { UiDatePicker },
895
+ setup() {
896
+ const travelDates = ref<DateRange>();
897
+ return { travelDates, args };
898
+ },
899
+ template: `<div class="space-y-2 max-w-sm">
900
+ <label for="travel-dates" class="text-sm font-medium">
901
+ Travel Dates
902
+ </label>
903
+ <UiDatePicker
904
+ id="travel-dates"
905
+ v-model="travelDates"
906
+ mode="range"
907
+ :number-of-months="2"
908
+ placeholder="Select dates"
909
+ aria-label="Select travel dates"
910
+ :disabled="args.disabled"
911
+ :locale="args.locale"
912
+ />
913
+ <p class="text-xs text-muted-foreground">
914
+ Choose your check-in and check-out dates.
915
+ </p>
916
+ </div>`,
917
+ }),
918
+ parameters: {
919
+ docs: {
920
+ source: {
921
+ code: rangeFormExampleTemplateSource,
922
+ },
923
+ },
924
+ },
925
+ };
926
+
927
+ const rangeKeepOpenTemplateSource = `<script setup lang="ts">
928
+ import { ref } from 'vue'
929
+ import type { DateRange } from '@aleph-alpha/ui-library'
930
+ import { UiDatePicker } from '@aleph-alpha/ui-library'
931
+
932
+ const dateRange = ref<DateRange>()
933
+ </script>
934
+
935
+ <template>
936
+ <UiDatePicker
937
+ v-model="dateRange"
938
+ mode="range"
939
+ :close-on-select="false"
940
+ placeholder="Stays open after selection"
941
+ />
942
+ </template>`;
943
+
944
+ /**
945
+ * Range date picker that stays open after selecting both dates.
946
+ * Useful when users might want to adjust their date range selection.
947
+ */
948
+ export const RangeKeepOpen: Story = {
949
+ args: {
950
+ mode: 'range',
951
+ closeOnSelect: false,
952
+ placeholder: 'Stays open after selection',
953
+ },
954
+ render: (args) => ({
955
+ components: { UiDatePicker },
956
+ setup() {
957
+ const dateRange = ref<DateRange>();
958
+ return { dateRange, args };
959
+ },
960
+ template: `<UiDatePicker
961
+ v-model="dateRange"
962
+ mode="range"
963
+ :close-on-select="args.closeOnSelect"
964
+ :placeholder="args.placeholder"
965
+ :disabled="args.disabled"
966
+ :locale="args.locale"
967
+ />`,
968
+ }),
969
+ parameters: {
970
+ docs: {
971
+ source: {
972
+ code: rangeKeepOpenTemplateSource,
973
+ },
974
+ },
975
+ },
976
+ };