@autoafleveren/ui 1.3.2 → 1.4.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 (320) hide show
  1. package/dist/config/tailwind/config.cjs +1 -0
  2. package/dist/icons.cjs +17 -17
  3. package/dist/icons.js +1710 -1644
  4. package/dist/types/components/AppActionBar/AppActionBarItem.vue.d.ts +4 -0
  5. package/dist/types/composables/index.d.ts +2 -1
  6. package/dist/types/composables/useActionBar/index.d.ts +3 -3
  7. package/dist/types/composables/useFocusTrap/index.d.ts +10 -0
  8. package/dist/ui-storybook.css +1 -1
  9. package/dist/ui.cjs +47 -40
  10. package/dist/ui.js +12385 -11552
  11. package/package.json +5 -2
  12. package/src/App.vue +15 -0
  13. package/src/Playground.vue.example +9 -0
  14. package/src/config/eslint.cjs +199 -0
  15. package/src/config/tailwind/config.cjs +229 -0
  16. package/src/config/tailwind/screens.json +9 -0
  17. package/src/css/build.css +52 -0
  18. package/src/css/main.css +4 -0
  19. package/src/css/theme.css +208 -0
  20. package/src/css/tinymce.css +58 -0
  21. package/src/main.ts +34 -0
  22. package/src/modules/components/AppActionBar/AppActionBar.vue +96 -0
  23. package/src/modules/components/AppActionBar/AppActionBarItem.vue +149 -0
  24. package/src/modules/components/AppActionBar/AppActionBarSubMenu.vue +89 -0
  25. package/src/modules/components/AppActionBar/Components/Error.vue +11 -0
  26. package/src/modules/components/AppActionBar/Components/Loading.vue +9 -0
  27. package/src/modules/components/AppActionBar/Components/MultiSelect.vue +102 -0
  28. package/src/modules/components/AppActionBar/Components/__tests__/multi-select.spec.ts +74 -0
  29. package/src/modules/components/AppActionBar/__mocks__/index.ts +36 -0
  30. package/src/modules/components/AppActionBar/__tests__/app-action-bar-item.spec.ts +134 -0
  31. package/src/modules/components/AppActionBar/__tests__/app-action-bar-sub-menu.spec.ts +45 -0
  32. package/src/modules/components/AppActionBar/__tests__/app-action-bar.spec.ts +92 -0
  33. package/src/modules/components/AppActionBar/index.d.ts +29 -0
  34. package/src/modules/components/AppActionBar/index.ts +18 -0
  35. package/src/modules/components/AppAlert/AppAlert.vue +69 -0
  36. package/src/modules/components/AppAlert/__tests__/app-alert.spec.ts +67 -0
  37. package/src/modules/components/AppAlert/index.d.ts +3 -0
  38. package/src/modules/components/AppAlert/index.ts +18 -0
  39. package/src/modules/components/AppAvatar/AppAvatar.vue +30 -0
  40. package/src/modules/components/AppAvatar/DefaultAvatar.vue +187 -0
  41. package/src/modules/components/AppAvatar/__tests__/app-avatar.spec.ts +70 -0
  42. package/src/modules/components/AppAvatar/index.d.ts +9 -0
  43. package/src/modules/components/AppAvatar/index.ts +9 -0
  44. package/src/modules/components/AppBackButton/AppBackButton.vue +51 -0
  45. package/src/modules/components/AppBackButton/__tests__/app-back-button.spec.ts +70 -0
  46. package/src/modules/components/AppBadge/AppBadge.vue +65 -0
  47. package/src/modules/components/AppBadge/__tests__/app-badge.spec.ts +64 -0
  48. package/src/modules/components/AppBadge/index.d.ts +13 -0
  49. package/src/modules/components/AppBadge/index.ts +29 -0
  50. package/src/modules/components/AppButton/AppButton.vue +53 -0
  51. package/src/modules/components/AppButton/ButtonIconSlot.vue +26 -0
  52. package/src/modules/components/AppButton/__tests__/app-button.spec.ts +145 -0
  53. package/src/modules/components/AppButton/__tests__/button-icon-slot.spec.ts +30 -0
  54. package/src/modules/components/AppButton/index.d.ts +16 -0
  55. package/src/modules/components/AppButton/index.ts +57 -0
  56. package/src/modules/components/AppCard/AppCard.vue +88 -0
  57. package/src/modules/components/AppCard/CardAction.vue +101 -0
  58. package/src/modules/components/AppCard/CardIconSlot.vue +65 -0
  59. package/src/modules/components/AppCard/__tests__/app-card.spec.ts +109 -0
  60. package/src/modules/components/AppCard/__tests__/card-action.spec.ts +55 -0
  61. package/src/modules/components/AppCard/__tests__/card-icon-slot.spec.ts +27 -0
  62. package/src/modules/components/AppCard/index.d.ts +12 -0
  63. package/src/modules/components/AppCard/index.ts +5 -0
  64. package/src/modules/components/AppColor/AppColor.vue +74 -0
  65. package/src/modules/components/AppColor/__tests__/app-color.spec.ts +53 -0
  66. package/src/modules/components/AppColor/index.d.ts +10 -0
  67. package/src/modules/components/AppColorCard/AppColorCard.vue +41 -0
  68. package/src/modules/components/AppColorCard/__tests__/app-color-card.spec.ts +55 -0
  69. package/src/modules/components/AppConfirm/AppConfirm.vue +237 -0
  70. package/src/modules/components/AppConfirm/__tests__/app-confirm.spec.ts +366 -0
  71. package/src/modules/components/AppConfirm/index.d.ts +31 -0
  72. package/src/modules/components/AppConfirm/index.ts +1 -0
  73. package/src/modules/components/AppContextMenu/AppContextMenu.vue +109 -0
  74. package/src/modules/components/AppContextMenu/ShortcutItem.vue +38 -0
  75. package/src/modules/components/AppContextMenu/__mocks__/index.ts +25 -0
  76. package/src/modules/components/AppContextMenu/__tests__/app-context-menu.spec.ts +71 -0
  77. package/src/modules/components/AppContextMenu/__tests__/shortcut-item.spec.ts +29 -0
  78. package/src/modules/components/AppContextMenu/index.d.ts +23 -0
  79. package/src/modules/components/AppDataTable/AppDataTable.vue +323 -0
  80. package/src/modules/components/AppDataTable/AppDataTableFooter.vue +91 -0
  81. package/src/modules/components/AppDataTable/__mocks__/index.ts +71 -0
  82. package/src/modules/components/AppDataTable/__tests__/app-data-table-footer.spec.ts +107 -0
  83. package/src/modules/components/AppDataTable/__tests__/app-data-table.spec.ts +153 -0
  84. package/src/modules/components/AppDataTable/index.d.ts +29 -0
  85. package/src/modules/components/AppDefinitionList/AppDefinitionItem.vue +57 -0
  86. package/src/modules/components/AppDefinitionList/AppDefinitionList.vue +32 -0
  87. package/src/modules/components/AppDefinitionList/__mocks__/index.ts +31 -0
  88. package/src/modules/components/AppDefinitionList/__tests__/app-definition-item.spec.ts +93 -0
  89. package/src/modules/components/AppDefinitionList/__tests__/app-definition-list.spec.ts +35 -0
  90. package/src/modules/components/AppDefinitionList/index.d.ts +8 -0
  91. package/src/modules/components/AppDisclosure/AppDisclosure.vue +19 -0
  92. package/src/modules/components/AppDisclosure/AppDisclosureButton.vue +43 -0
  93. package/src/modules/components/AppDisclosure/AppDisclosurePanel.vue +31 -0
  94. package/src/modules/components/AppDisclosure/__tests__/app-disclosure-button.spec.ts +70 -0
  95. package/src/modules/components/AppDisclosure/__tests__/app-disclosure-panel.spec.ts +64 -0
  96. package/src/modules/components/AppDisclosure/__tests__/app-disclosure.spec.ts +41 -0
  97. package/src/modules/components/AppDrawer/AppDrawer.vue +149 -0
  98. package/src/modules/components/AppDrawer/__tests__/app-drawer.spec.ts +120 -0
  99. package/src/modules/components/AppDrawer/index.d.ts +27 -0
  100. package/src/modules/components/AppDropdownButton/AppDropdownButton.vue +82 -0
  101. package/src/modules/components/AppDropdownButton/AppDropdownItem.vue +67 -0
  102. package/src/modules/components/AppDropdownButton/__mocks__/index.ts +25 -0
  103. package/src/modules/components/AppDropdownButton/__tests__/app-dropdown-button.spec.ts +81 -0
  104. package/src/modules/components/AppDropdownButton/__tests__/app-dropdown-item.spec.ts +108 -0
  105. package/src/modules/components/AppDropdownButton/index.d.ts +26 -0
  106. package/src/modules/components/AppDropdownButton/index.ts +8 -0
  107. package/src/modules/components/AppError/AppError.vue +233 -0
  108. package/src/modules/components/AppError/__tests__/app-error.spec.ts +366 -0
  109. package/src/modules/components/AppError/index.d.ts +30 -0
  110. package/src/modules/components/AppError/index.ts +1 -0
  111. package/src/modules/components/AppImageDropzone/AppImageDropzone.vue +130 -0
  112. package/src/modules/components/AppImageDropzone/__tests__/app-image-dropzone.spec.ts +92 -0
  113. package/src/modules/components/AppImageDropzone/index.d.ts +8 -0
  114. package/src/modules/components/AppInput/AppInput.vue +247 -0
  115. package/src/modules/components/AppInput/FileInput.vue +58 -0
  116. package/src/modules/components/AppInput/Input.vue +141 -0
  117. package/src/modules/components/AppInput/InputIconSlot.vue +27 -0
  118. package/src/modules/components/AppInput/LocationInput.vue +150 -0
  119. package/src/modules/components/AppInput/__mocks__/location.ts +13 -0
  120. package/src/modules/components/AppInput/__tests__/app-input.spec.ts +255 -0
  121. package/src/modules/components/AppInput/__tests__/file-input.spec.ts +48 -0
  122. package/src/modules/components/AppInput/__tests__/input-icon-slot.spec.ts +27 -0
  123. package/src/modules/components/AppInput/__tests__/input.spec.ts +260 -0
  124. package/src/modules/components/AppInput/__tests__/location-input.spec.ts +159 -0
  125. package/src/modules/components/AppInput/choice.ts +24 -0
  126. package/src/modules/components/AppInput/datepicker.ts +62 -0
  127. package/src/modules/components/AppInput/index.d.ts +68 -0
  128. package/src/modules/components/AppInput/index.ts +133 -0
  129. package/src/modules/components/AppInput/location.ts +8 -0
  130. package/src/modules/components/AppInput/richText.ts +45 -0
  131. package/src/modules/components/AppInputLabel/AppInputLabel.vue +15 -0
  132. package/src/modules/components/AppInputLabel/__tests__/app-input-label.spec.ts +38 -0
  133. package/src/modules/components/AppInputLabel/index.d.ts +6 -0
  134. package/src/modules/components/AppLicensePlate/AppLicensePlate.vue +34 -0
  135. package/src/modules/components/AppLicensePlate/__tests__/app-license-plate.spec.ts +46 -0
  136. package/src/modules/components/AppLicensePlate/index.d.ts +1 -0
  137. package/src/modules/components/AppLoader/AppLoader.vue +37 -0
  138. package/src/modules/components/AppLoader/index.d.ts +1 -0
  139. package/src/modules/components/AppLoader/index.ts +8 -0
  140. package/src/modules/components/AppMaps/AppMaps.vue +105 -0
  141. package/src/modules/components/AppMaps/index.ts +44 -0
  142. package/src/modules/components/AppMenu/AppMenu.vue +79 -0
  143. package/src/modules/components/AppMenu/AppMenuItem.vue +40 -0
  144. package/src/modules/components/AppMenu/__mocks__/index.ts +23 -0
  145. package/src/modules/components/AppMenu/__tests__/app-menu-item.spec.ts +47 -0
  146. package/src/modules/components/AppMenu/__tests__/app-menu.spec.ts +53 -0
  147. package/src/modules/components/AppMenu/index.d.ts +15 -0
  148. package/src/modules/components/AppModal/AppModal.vue +261 -0
  149. package/src/modules/components/AppModal/__tests__/app-modal.spec.ts +282 -0
  150. package/src/modules/components/AppModal/index.d.ts +36 -0
  151. package/src/modules/components/AppNavigationMenu/AppNavigationMenu.vue +95 -0
  152. package/src/modules/components/AppNavigationMenu/Mobile.vue +126 -0
  153. package/src/modules/components/AppNavigationMenu/NavigationItem.vue +82 -0
  154. package/src/modules/components/AppNavigationMenu/SupportItem.vue +29 -0
  155. package/src/modules/components/AppNavigationMenu/__tests__/app-navigation-menu.spec.ts +104 -0
  156. package/src/modules/components/AppNavigationMenu/__tests__/mobile.spec.ts +155 -0
  157. package/src/modules/components/AppNavigationMenu/__tests__/navigation-item.spec.ts +91 -0
  158. package/src/modules/components/AppNavigationMenu/__tests__/support-item.spec.ts +48 -0
  159. package/src/modules/components/AppPagination/AppPagination.vue +133 -0
  160. package/src/modules/components/AppPagination/AppPaginationItem.vue +28 -0
  161. package/src/modules/components/AppPagination/__mocks__/index.ts +20 -0
  162. package/src/modules/components/AppPagination/__tests__/app-pagination.spec.ts +143 -0
  163. package/src/modules/components/AppPagination/index.d.ts +24 -0
  164. package/src/modules/components/AppProgressBar/AppProgressBar.vue +93 -0
  165. package/src/modules/components/AppProgressBar/AppProgressBarStep.vue +5 -0
  166. package/src/modules/components/AppProgressBar/__mocks__/index.ts +17 -0
  167. package/src/modules/components/AppProgressBar/__tests__/app-progress-bar-step.spec.ts +18 -0
  168. package/src/modules/components/AppProgressBar/__tests__/app-progress-bar.spec.ts +77 -0
  169. package/src/modules/components/AppProgressBar/index.d.ts +21 -0
  170. package/src/modules/components/AppRating/AppRating.vue +42 -0
  171. package/src/modules/components/AppRating/VueStarRating/Star.vue +215 -0
  172. package/src/modules/components/AppRating/VueStarRating/StarRating.vue +231 -0
  173. package/src/modules/components/AppRating/VueStarRating/classes/AlphaColor.ts +68 -0
  174. package/src/modules/components/AppRating/VueStarRating/readme.md +279 -0
  175. package/src/modules/components/AppRating/__tests__/app-rating.spec.ts +36 -0
  176. package/src/modules/components/AppSection/AppSection.vue +35 -0
  177. package/src/modules/components/AppSection/__tests__/app-section.spec.ts +53 -0
  178. package/src/modules/components/AppSelect/AppSelect.vue +176 -0
  179. package/src/modules/components/AppSelect/__mocks__/index.ts +24 -0
  180. package/src/modules/components/AppSelect/__tests__/app-select.spec.ts +73 -0
  181. package/src/modules/components/AppSelect/index.d.ts +43 -0
  182. package/src/modules/components/AppSelect/index.ts +69 -0
  183. package/src/modules/components/AppStepper/AppStepper.vue +79 -0
  184. package/src/modules/components/AppStepper/__tests__/app-stepper.spec.ts +59 -0
  185. package/src/modules/components/AppTable/AppTable.vue +40 -0
  186. package/src/modules/components/AppTimeline/AppTimeline.vue +22 -0
  187. package/src/modules/components/AppTimeline/AppTimelineItem.vue +97 -0
  188. package/src/modules/components/AppTimeline/AppTimelineItemIcon.vue +55 -0
  189. package/src/modules/components/AppTimeline/__mocks__/timeline.ts +29 -0
  190. package/src/modules/components/AppTimeline/__tests__/app-timeline-item-Icon.spec.ts +35 -0
  191. package/src/modules/components/AppTimeline/__tests__/app-timeline-item.spec.ts +121 -0
  192. package/src/modules/components/AppTimeline/__tests__/app-timeline.spec.ts +55 -0
  193. package/src/modules/components/AppTimeline/index.d.ts +30 -0
  194. package/src/modules/components/AppTimeline/index.ts +13 -0
  195. package/src/modules/components/AppToggle/AppToggle.vue +36 -0
  196. package/src/modules/components/AppToggle/__tests__/app-toggle.spec.ts +54 -0
  197. package/src/modules/components/AppToggle/index.d.ts +3 -0
  198. package/src/modules/components/AppToggleCard/AppToggleCard.vue +45 -0
  199. package/src/modules/components/AppToggleCard/__tests__/app-toggle-card.spec.ts +55 -0
  200. package/src/modules/components/index.ts +43 -0
  201. package/src/modules/composables/index.ts +14 -0
  202. package/src/modules/composables/useActionBar/__mocks__/index.ts +17 -0
  203. package/src/modules/composables/useActionBar/__tests__/index.spec.ts +62 -0
  204. package/src/modules/composables/useActionBar/index.d.ts +1 -0
  205. package/src/modules/composables/useActionBar/index.ts +67 -0
  206. package/src/modules/composables/useComputedPosition/index.d.ts +16 -0
  207. package/src/modules/composables/useComputedPosition/index.ts +199 -0
  208. package/src/modules/composables/useConfirm/__tests__/index.spec.ts +29 -0
  209. package/src/modules/composables/useConfirm/index.ts +63 -0
  210. package/src/modules/composables/useContextMenu/index.ts +127 -0
  211. package/src/modules/composables/useDrawer/__tests__/index.spec.ts +34 -0
  212. package/src/modules/composables/useDrawer/index.ts +136 -0
  213. package/src/modules/composables/useEcho/index.ts +167 -0
  214. package/src/modules/composables/useError/__tests__/index.spec.ts +29 -0
  215. package/src/modules/composables/useError/index.ts +61 -0
  216. package/src/modules/composables/useFocusTrap/index.d.ts +3 -0
  217. package/src/modules/composables/useFocusTrap/index.ts +98 -0
  218. package/src/modules/composables/useGoogleApi/__tests__/index.spec.ts +39 -0
  219. package/src/modules/composables/useGoogleApi/index.ts +26 -0
  220. package/src/modules/composables/useLayout/__tests__/index.spec.ts +34 -0
  221. package/src/modules/composables/useLayout/index.d.ts +1 -0
  222. package/src/modules/composables/useLayout/index.ts +68 -0
  223. package/src/modules/composables/useModal/__tests__/index.spec.ts +34 -0
  224. package/src/modules/composables/useModal/index.ts +97 -0
  225. package/src/modules/composables/useNavigation/__mocks__/navigation.ts +22 -0
  226. package/src/modules/composables/useNavigation/__tests__/index.spec.ts +88 -0
  227. package/src/modules/composables/useNavigation/index.d.ts +17 -0
  228. package/src/modules/composables/useNavigation/index.ts +97 -0
  229. package/src/modules/icons/BuildingCircleCheck.vue +32 -0
  230. package/src/modules/icons/BuildingCircleXmark.vue +20 -0
  231. package/src/modules/icons/CarsIcon.vue +29 -0
  232. package/src/modules/icons/ChatPersonRoundedIcon.vue +184 -0
  233. package/src/modules/icons/CompanyIcon.vue +18 -0
  234. package/src/modules/icons/HeroGirlIcon.vue +246 -0
  235. package/src/modules/icons/HeroPersonIcon.vue +402 -0
  236. package/src/modules/icons/HeroPersonRoundedIcon.vue +412 -0
  237. package/src/modules/icons/HeroPersonWithBgIcon.vue +4503 -0
  238. package/src/modules/icons/LocationMarkerIcon.vue +33 -0
  239. package/src/modules/icons/PartyPopperIcon.vue +146 -0
  240. package/src/modules/icons/index.ts +32 -0
  241. package/src/modules/icons/status/ErrorIcon.vue +24 -0
  242. package/src/modules/icons/status/SuccessIcon.vue +24 -0
  243. package/src/modules/icons/status/WarningIcon.vue +27 -0
  244. package/src/modules/icons/status/index.ts +3 -0
  245. package/src/modules/index.ts +8 -0
  246. package/src/modules/layouts/Auth/Auth.vue +36 -0
  247. package/src/modules/layouts/Auth/__tests__/auth.spec.ts +63 -0
  248. package/src/modules/layouts/Base/Base.vue +69 -0
  249. package/src/modules/layouts/Base/__tests__/base.spec.ts +56 -0
  250. package/src/modules/layouts/Platform/Platform.vue +96 -0
  251. package/src/modules/layouts/Platform/__tests__/platform.spec.ts +56 -0
  252. package/src/modules/layouts/index.ts +9 -0
  253. package/src/modules/plugins/Sentry/index.d.ts +16 -0
  254. package/src/modules/plugins/Sentry/index.ts +65 -0
  255. package/src/modules/plugins/Sentry/language/nl.ts +13 -0
  256. package/src/modules/plugins/TinyMCE/lang/nl.js +430 -0
  257. package/src/modules/plugins/Toast/Toast.vue +58 -0
  258. package/src/modules/plugins/Toast/__tests__/toast.spec.ts +90 -0
  259. package/src/modules/plugins/Toast/index.ts +36 -0
  260. package/src/modules/plugins/Toast/types.d.ts +265 -0
  261. package/src/modules/plugins/index.ts +63 -0
  262. package/src/stories/Introduction.mdx +4 -0
  263. package/src/stories/assets/code-brackets.svg +1 -0
  264. package/src/stories/assets/colors.svg +1 -0
  265. package/src/stories/assets/comments.svg +1 -0
  266. package/src/stories/assets/direction.svg +1 -0
  267. package/src/stories/assets/flow.svg +1 -0
  268. package/src/stories/assets/images/logo.png +0 -0
  269. package/src/stories/assets/images/road.png +0 -0
  270. package/src/stories/assets/plugin.svg +1 -0
  271. package/src/stories/assets/repo.svg +1 -0
  272. package/src/stories/assets/stackalt.svg +1 -0
  273. package/src/stories/components/ActionBar/ActionBar.stories.ts +67 -0
  274. package/src/stories/components/Alert/Alert.stories.ts +53 -0
  275. package/src/stories/components/Avatar/Avatar.stories.ts +44 -0
  276. package/src/stories/components/BackButton/BackButton.stories.ts +39 -0
  277. package/src/stories/components/Badge/Badge.stories.ts +42 -0
  278. package/src/stories/components/Button/Button.stories.ts +132 -0
  279. package/src/stories/components/Card/Card.stories.ts +70 -0
  280. package/src/stories/components/Color/Color.stories.ts +41 -0
  281. package/src/stories/components/ColorCard/ColorCard.stories.ts +43 -0
  282. package/src/stories/components/Confirm/Confirm.stories.ts +110 -0
  283. package/src/stories/components/ContextMenu/ContextMenu.stories.ts +85 -0
  284. package/src/stories/components/DefinitionList/DefinitionList.stories.ts +32 -0
  285. package/src/stories/components/Disclosure/Disclosure.stories.ts +61 -0
  286. package/src/stories/components/DropdownButton/DropdownButton.stories.ts +121 -0
  287. package/src/stories/components/Error/Error.stories.ts +106 -0
  288. package/src/stories/components/ImageDropzone/ImageDropzone.stories.ts +41 -0
  289. package/src/stories/components/Input/Input.stories.ts +180 -0
  290. package/src/stories/components/Input/LocationInput.stories.ts +77 -0
  291. package/src/stories/components/LicensePlate/LicensePlate.stories.ts +39 -0
  292. package/src/stories/components/Maps/Maps.stories.ts +36 -0
  293. package/src/stories/components/Menu/Menu.stories.ts +41 -0
  294. package/src/stories/components/Modal/Modal.stories.ts +68 -0
  295. package/src/stories/components/Navigation/Navigation.stories.ts +62 -0
  296. package/src/stories/components/Pagination/Pagination.stories.ts +62 -0
  297. package/src/stories/components/ProgressBar/ProgressBar.stories.ts +48 -0
  298. package/src/stories/components/Rating/Rating.stories.ts +38 -0
  299. package/src/stories/components/Section/Section.stories.ts +44 -0
  300. package/src/stories/components/Select/Select.stories.ts +90 -0
  301. package/src/stories/components/Stepper/Stepper.stories.ts +38 -0
  302. package/src/stories/components/Table/DataTable.stories.ts +96 -0
  303. package/src/stories/components/Table/Table.stories.ts +45 -0
  304. package/src/stories/components/Timeline/Timeline.stories.ts +46 -0
  305. package/src/stories/components/Toast/Toast.stories.ts +47 -0
  306. package/src/stories/components/Toggle/Toggle.stories.ts +41 -0
  307. package/src/stories/components/ToggleCard/ToggleCard.stories.ts +43 -0
  308. package/src/stories/layouts/Auth.stories.ts +43 -0
  309. package/src/stories/layouts/Base.stories.ts +70 -0
  310. package/src/tests/mocks/resize-observer.ts +13 -0
  311. package/src/tests/stubs/AppSelect.ts +89 -0
  312. package/src/tests/stubs/HeadlessUiDialogStub.ts +24 -0
  313. package/src/tests/stubs/HeadlessUiTransitionChildStub.ts +20 -0
  314. package/src/tests/stubs/HeadlessUiTransitionRootStub.ts +25 -0
  315. package/src/tests/stubs/IconStub.ts +9 -0
  316. package/src/tests/stubs/Vue3EasyDataTableStub.ts +53 -0
  317. package/src/typings/plugin.d.ts +5 -0
  318. package/src/typings/shims-vue.d.ts +13 -0
  319. package/src/typings/utilities.d.ts +4 -0
  320. package/src/typings/vite-environment.d.ts +12 -0
@@ -0,0 +1,102 @@
1
+ <script lang="ts" setup>
2
+ import { computed, ref } from 'vue';
3
+ import { useActionBar } from '~composables';
4
+ import { AppButton, AppSelect } from '~components';
5
+ import { classes } from '~components/AppSelect';
6
+
7
+ import type { ActionItemProps } from '../index.d';
8
+
9
+ const props = withDefaults(
10
+ defineProps<Omit<ActionItemProps, 'context' | 'confirmed'> & { submitButtonText?: string; cancelButtonText?: string }>(),
11
+ {
12
+ submitButtonText: 'Opslaan',
13
+ cancelButtonText: 'Annuleren',
14
+ },
15
+ );
16
+
17
+ const emit = defineEmits<{ submit: []; close: [] }>();
18
+
19
+ const modelValue = defineModel<number[]>();
20
+ const submitting = ref(false);
21
+ const actionBar = useActionBar();
22
+
23
+ const selectProps = computed(() => ({
24
+ minChars: 1,
25
+ resolveOnLoad: true,
26
+ closeOnSelect: false,
27
+ multiple: true,
28
+ clearable: true,
29
+ searchable: true,
30
+ fetchOnOpen: true,
31
+ hideSelected: true,
32
+ maxHeight: 200,
33
+ mode: 'tags',
34
+ placeholder: 'Zoeken...',
35
+ noOptionsText: 'Geen opties beschikbaar',
36
+ noResultsText: 'Geen resulaten gevonden',
37
+ valueProp: 'id',
38
+ ...props.action.componentProperties,
39
+ }));
40
+
41
+ async function submit(): Promise<void> {
42
+ submitting.value = true;
43
+
44
+ const response = await props.action?.onSubmit?.(modelValue.value, props.item ?? actionBar.tableSelection.value);
45
+
46
+ submitting.value = false;
47
+
48
+ if (response) {
49
+ emit('close');
50
+ }
51
+ }
52
+ </script>
53
+
54
+ <template>
55
+ <div>
56
+ <AppSelect
57
+ v-model="modelValue"
58
+ v-bind="selectProps"
59
+ :classes="{
60
+ dropdownHidden: 'block! relative!',
61
+ option: 'hover:bg-zinc-600 px-2.5 py-2.5 rounded-lg text-base h-10',
62
+ search: classes.search,
63
+ placeholder: `${classes.placeholder} max-h-11`,
64
+ tags: `${classes.tags} bg-white rounded-lg min-h-10 mb-2 mt-0! text-secondary pt-1`,
65
+ tag: `${classes.tag} text-secondary`,
66
+ tagDisabled: classes.tagDisabled,
67
+ tagRemove: classes.tagRemove,
68
+ tagRemoveIcon: classes.tagRemoveIcon,
69
+ tagText: classes.tagText,
70
+ tagsSearchWrapper: classes.tagsSearchWrapper,
71
+ tagsSearch: classes.tagsSearch,
72
+ tagsSearchCopy: classes.tagsSearchCopy,
73
+ spinner: `${classes.spinner} absolute`,
74
+ }"
75
+ />
76
+
77
+ <div class="mt-2 flex">
78
+ <AppButton
79
+ :block="true"
80
+ color-type="plain"
81
+ size="small"
82
+ data-test-cancel-button
83
+ @click="() => emit('close')"
84
+ >
85
+ <span class="text-white">
86
+ {{ cancelButtonText }}
87
+ </span>
88
+ </AppButton>
89
+
90
+ <AppButton
91
+ :block="true"
92
+ :loading="submitting"
93
+ color-type="primary"
94
+ size="small"
95
+ data-test-submit-button
96
+ @click="submit"
97
+ >
98
+ {{ submitButtonText }}
99
+ </AppButton>
100
+ </div>
101
+ </div>
102
+ </template>
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { flushPromises, shallowMount } from '@vue/test-utils';
3
+ import { AppSelect } from '~components';
4
+ import MultiSelect from '../MultiSelect.vue';
5
+ import { submitMock, componentAction } from '../../__mocks__';
6
+
7
+ import type { VueWrapper } from '@vue/test-utils';
8
+ import type { Action } from '../../index.d';
9
+
10
+ function createWrapper(action: Action = componentAction): VueWrapper<InstanceType<typeof MultiSelect>> {
11
+ return shallowMount(MultiSelect, {
12
+ props: { action },
13
+ });
14
+ }
15
+
16
+ describe('the MultiSelect component', () => {
17
+ beforeEach(() => {
18
+ submitMock.mockClear();
19
+ });
20
+
21
+ it('should render AppSelect with props', () => {
22
+ const wrapper = createWrapper();
23
+
24
+ const select = wrapper.findComponent(AppSelect);
25
+
26
+ expect(select.exists()).toBe(true);
27
+ expect(select.props()).toStrictEqual({
28
+ additionalClasses: undefined,
29
+ cacheable: false,
30
+ dropdownClasses: undefined,
31
+ errorMessage: undefined,
32
+ fetchOnOpen: true,
33
+ hasError: false,
34
+ label: undefined,
35
+ labelClasses: undefined,
36
+ onChange: undefined,
37
+ openDirection: 'down',
38
+ optionLabel: 'name',
39
+ wrapperClasses: undefined,
40
+ searchable: true,
41
+ });
42
+ });
43
+
44
+ it('should emit when clicked on cancel button', async () => {
45
+ expect.assertions(3);
46
+
47
+ const wrapper = createWrapper();
48
+
49
+ const button = wrapper.findComponent('[data-test-cancel-button]');
50
+ expect(button.exists()).toBe(true);
51
+
52
+ expect(wrapper.emitted('close')).toBeUndefined();
53
+
54
+ await button.trigger('click');
55
+
56
+ expect(wrapper.emitted('close')).toBeDefined();
57
+ });
58
+
59
+ it('should execute onClick when clicked on submit button', async () => {
60
+ expect.assertions(3);
61
+
62
+ const wrapper = createWrapper();
63
+
64
+ const button = wrapper.findComponent('[data-test-submit-button]');
65
+ expect(button.exists()).toBe(true);
66
+
67
+ expect(submitMock).toHaveBeenCalledTimes(0);
68
+
69
+ await button.trigger('click');
70
+ await flushPromises();
71
+
72
+ expect(submitMock).toHaveBeenCalledTimes(1);
73
+ });
74
+ });
@@ -0,0 +1,36 @@
1
+ import { vi } from 'vitest';
2
+ import { TrashIcon } from '~icons';
3
+
4
+ import type { Action } from '../index.d';
5
+
6
+ export const clickMock = vi.fn().mockResolvedValue(undefined);
7
+ export const submitMock = vi.fn().mockResolvedValue(undefined);
8
+
9
+ export const action: Action = {
10
+ name: 'action',
11
+ icon: TrashIcon,
12
+ confirm: false,
13
+ onClick: clickMock,
14
+ };
15
+
16
+ export const confirmableAction: Action = {
17
+ name: 'confirmable',
18
+ icon: TrashIcon,
19
+ confirm: true,
20
+ onClick: clickMock,
21
+ };
22
+
23
+ export const actions: Action[] = [
24
+ action,
25
+ confirmableAction,
26
+ ];
27
+
28
+ export const componentAction: Action = {
29
+ name: 'confirmable',
30
+ icon: TrashIcon,
31
+ confirm: true,
32
+ component: 'multi-select',
33
+ componentProperties: { options: [{ id: 1, name: 'Option 1' }, { id: 2, name: 'Option 2' }] },
34
+ onClick: clickMock,
35
+ onSubmit: submitMock,
36
+ };
@@ -0,0 +1,134 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { flushPromises, shallowMount } from '@vue/test-utils';
3
+ import { useActionBar } from '~composables';
4
+ import AppActionBarItem from '../AppActionBarItem.vue';
5
+ import AppActionBarSubMenu from '../AppActionBarSubMenu.vue';
6
+ import { action as actionMock, confirmableAction as confirmableActionMock, clickMock } from '../__mocks__';
7
+
8
+ import type { VueWrapper } from '@vue/test-utils';
9
+ import type { Action } from '../index.d';
10
+
11
+ function createWrapper(action: Action = actionMock): VueWrapper<InstanceType<typeof AppActionBarItem>> {
12
+ return shallowMount(AppActionBarItem, {
13
+ props: { action },
14
+ });
15
+ }
16
+
17
+ describe('the AppActionBarItem component', () => {
18
+ beforeEach(() => {
19
+ clickMock.mockClear();
20
+ });
21
+
22
+ it('executes the handler when click', async () => {
23
+ expect.assertions(4);
24
+
25
+ const wrapper = createWrapper();
26
+
27
+ const icon = wrapper.find('[data-test-action-bar-icon]');
28
+
29
+ expect(wrapper.findComponent(AppActionBarSubMenu).exists()).toBe(false);
30
+
31
+ expect(clickMock).toHaveBeenCalledTimes(0);
32
+
33
+ await icon.trigger('click');
34
+
35
+ expect(clickMock).toHaveBeenCalledTimes(1);
36
+ expect(wrapper.findComponent(AppActionBarSubMenu).exists()).toBe(false);
37
+ });
38
+
39
+ it('can confirm when click and confirmable is true', async () => {
40
+ expect.assertions(5);
41
+
42
+ const wrapper = createWrapper(confirmableActionMock);
43
+ const icon = wrapper.find('[data-test-action-bar-icon]');
44
+
45
+ expect(clickMock).toHaveBeenCalledTimes(0);
46
+
47
+ await icon.trigger('click');
48
+
49
+ expect(clickMock).toHaveBeenCalledTimes(0);
50
+ expect((wrapper.vm as unknown as typeof AppActionBarItem).confirm).toBe(true);
51
+
52
+ await icon.trigger('click');
53
+
54
+ expect(clickMock).toHaveBeenCalledTimes(1);
55
+ expect((wrapper.vm as unknown as typeof AppActionBarItem).confirm).toBe(false);
56
+ });
57
+
58
+ it('should set loading state clicked', async () => {
59
+ expect.assertions(3);
60
+
61
+ const wrapper = createWrapper();
62
+ const icon = wrapper.find('[data-test-action-bar-icon]');
63
+
64
+ expect((wrapper.vm as unknown as typeof AppActionBarItem).loading).toBe(false);
65
+
66
+ icon.trigger('click');
67
+
68
+ expect((wrapper.vm as unknown as typeof AppActionBarItem).loading).toBe(true);
69
+
70
+ await flushPromises();
71
+
72
+ expect((wrapper.vm as unknown as typeof AppActionBarItem).loading).toBe(false);
73
+ });
74
+
75
+ it('should reset selection after click by default', async () => {
76
+ expect.assertions(2);
77
+
78
+ const actionBar = useActionBar();
79
+ actionBar.setSelection([1, 2]);
80
+ expect(actionBar.selection.value).toStrictEqual([1, 2]);
81
+
82
+ const wrapper = createWrapper();
83
+ const icon = wrapper.find('[data-test-action-bar-icon]');
84
+
85
+ await icon.trigger('click');
86
+
87
+ expect(actionBar.selection.value).toStrictEqual([]);
88
+ });
89
+
90
+ it('should not reset selection after click when resetSelection is false', async () => {
91
+ expect.assertions(1);
92
+
93
+ const actionBar = useActionBar();
94
+ actionBar.setSelection([1, 2]);
95
+
96
+ const wrapper = createWrapper({ ...actionMock, resetSelection: false });
97
+
98
+ await wrapper.trigger('click');
99
+
100
+ expect(actionBar.selection.value).toStrictEqual([1, 2]);
101
+ });
102
+
103
+ it('should render sub menu when action has subActions', async () => {
104
+ expect.assertions(2);
105
+
106
+ const wrapper = createWrapper({ ...actionMock, component: 'multi-select' });
107
+ const icon = wrapper.find('[data-test-action-bar-icon]');
108
+
109
+ expect(wrapper.findComponent(AppActionBarSubMenu).exists()).toBe(false);
110
+
111
+ await icon.trigger('click');
112
+
113
+ expect(wrapper.findComponent(AppActionBarSubMenu).exists()).toBe(true);
114
+ });
115
+
116
+ it('should emit when AppActionBarSubMenu emits "close"', async () => {
117
+ expect.assertions(3);
118
+
119
+ const wrapper = createWrapper({ ...actionMock, component: 'multi-select' });
120
+ const icon = wrapper.find('[data-test-action-bar-icon]');
121
+
122
+ await icon.trigger('click');
123
+
124
+ const subMenu = wrapper.findComponent(AppActionBarSubMenu);
125
+
126
+ expect(subMenu.exists()).toBe(true);
127
+
128
+ expect(wrapper.emitted('confirmed')).toBeUndefined();
129
+
130
+ subMenu.vm.$emit('close');
131
+
132
+ expect(wrapper.emitted('confirmed')).toBeDefined();
133
+ });
134
+ });
@@ -0,0 +1,45 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { flushPromises, shallowMount } from '@vue/test-utils';
3
+ import AppActionBarSubMenu from '../AppActionBarSubMenu.vue';
4
+ import MultiSelect from '../Components/MultiSelect.vue';
5
+ import { componentAction } from '../__mocks__';
6
+
7
+ import type { VueWrapper } from '@vue/test-utils';
8
+ import type { Action } from '../index.d';
9
+
10
+ function createWrapper(action: Action = componentAction): VueWrapper<InstanceType<typeof AppActionBarSubMenu>> {
11
+ return shallowMount(AppActionBarSubMenu, {
12
+ props: { action },
13
+ });
14
+ }
15
+
16
+ describe('the AppActionBarSubMenu component', () => {
17
+ it('renders variable component based on name', async () => {
18
+ expect.assertions(3);
19
+
20
+ const wrapper = createWrapper();
21
+
22
+ await flushPromises();
23
+
24
+ const menu = wrapper.findComponent('[data-test-action-menu]');
25
+
26
+ expect(wrapper.findComponent(MultiSelect).exists()).toBe(true);
27
+
28
+ expect(menu.exists()).toBe(true);
29
+ expect(menu.attributes('options')).toBeDefined();
30
+ });
31
+
32
+ it('should emit when compoment emits "close"', async () => {
33
+ expect.assertions(2);
34
+
35
+ const wrapper = createWrapper();
36
+
37
+ await flushPromises();
38
+
39
+ expect(wrapper.emitted('close')).toBeUndefined();
40
+
41
+ wrapper.findComponent(MultiSelect).vm.$emit('close');
42
+
43
+ expect(wrapper.emitted('close')).toBeDefined();
44
+ });
45
+ });
@@ -0,0 +1,92 @@
1
+ import { nextTick } from 'vue';
2
+ import { describe, it, expect, beforeEach } from 'vitest';
3
+ import { shallowMount } from '@vue/test-utils';
4
+ import { XMarkIcon } from '~icons';
5
+ import { useActionBar } from '~composables';
6
+ import { AppInput } from '~components';
7
+ import AppActionBar from '../AppActionBar.vue';
8
+ import AppActionBarItem from '../AppActionBarItem.vue';
9
+ import { actions as actionsMock } from '../__mocks__';
10
+
11
+ import type { VueWrapper } from '@vue/test-utils';
12
+
13
+ const actionBar = useActionBar();
14
+
15
+ function createWrapper(): VueWrapper<InstanceType<typeof AppActionBar>> {
16
+ return shallowMount(AppActionBar);
17
+ }
18
+
19
+ describe('the AppActionBar component', () => {
20
+ beforeEach(async () => {
21
+ actionBar.setSelection([1, 2]);
22
+ actionBar.setActions(actionsMock);
23
+ actionBar.open();
24
+
25
+ await nextTick();
26
+ });
27
+
28
+ it('should add classes to wrapper div when actionBar is open', async () => {
29
+ expect.assertions(2);
30
+
31
+ const wrapper = createWrapper();
32
+
33
+ expect(wrapper.find('[data-test-action-bar-wrapper]').classes('translate-y-0!')).toBe(true);
34
+
35
+ actionBar.close();
36
+
37
+ await nextTick();
38
+
39
+ expect(wrapper.find('[data-test-action-bar-wrapper]').classes('translate-y-0!')).toBe(false);
40
+ });
41
+
42
+ it('renders checkbox', () => {
43
+ const wrapper = createWrapper();
44
+
45
+ // @ts-expect-error input wrong type, need upgrade ts
46
+ const checkbox = wrapper.findComponent(AppInput);
47
+ expect(checkbox.exists()).toBe(true);
48
+ // @ts-expect-error input wrong type, need upgrade ts
49
+ expect(checkbox.props('modelValue')).toStrictEqual([1]);
50
+ });
51
+
52
+ it('renders the selection text', async () => {
53
+ expect.assertions(3);
54
+
55
+ const wrapper = createWrapper();
56
+
57
+ let selectionText = wrapper.find('[data-test-selection-text]');
58
+ expect(selectionText.exists()).toBe(true);
59
+ expect(selectionText.text()).toBe('2 selected');
60
+
61
+ actionBar.setSelectionText(':selection items geselected');
62
+ actionBar.setSelection([1, 2, 3, 4]);
63
+
64
+ await nextTick();
65
+
66
+ selectionText = wrapper.find('[data-test-selection-text]');
67
+ expect(selectionText.text()).toBe('4 items geselected');
68
+ });
69
+
70
+ it('renders the AppActionBarItems', () => {
71
+ const wrapper = createWrapper();
72
+
73
+ const actionBarItems = wrapper.findAllComponents(AppActionBarItem);
74
+ expect(actionBarItems).toHaveLength(actionsMock.length);
75
+ expect(actionBarItems[0].props('action')).toStrictEqual(actionsMock[0]);
76
+ expect(actionBarItems[1].props('action')).toStrictEqual(actionsMock[1]);
77
+ });
78
+
79
+ it('can close the actionbar with the close icon', async () => {
80
+ expect.assertions(3);
81
+
82
+ const wrapper = createWrapper();
83
+
84
+ const closeIcon = wrapper.findComponent(XMarkIcon);
85
+ expect(closeIcon.exists()).toBe(true);
86
+
87
+ await closeIcon.trigger('click');
88
+
89
+ expect(actionBar.selection.value).toHaveLength(0);
90
+ expect(actionBar.isOpen.value).toBe(false);
91
+ });
92
+ });
@@ -0,0 +1,29 @@
1
+ import type { Component } from 'vue';
2
+ import type { types } from '.';
3
+
4
+ export type Type = typeof types[number];
5
+
6
+ export type ActionComponent = 'multi-select';
7
+
8
+ export interface Action {
9
+ name: string;
10
+ key?: string;
11
+ icon: Component;
12
+ confirm?: boolean;
13
+ type?: Type;
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ hidden?: boolean | ((items: any[], context: boolean) => boolean);
16
+ onClick?: (item: unknown) => Promise<unknown>;
17
+ onSubmit?: (modelValue: unknown, item: unknown) => Promise<boolean>;
18
+ resetSelection?: boolean;
19
+ component?: Component | ActionComponent;
20
+ componentProperties?: Record<string, unknown>;
21
+ }
22
+
23
+ export interface ActionItemProps {
24
+ action: Action;
25
+ context?: boolean;
26
+ confirmed?: boolean;
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ item?: any;
29
+ }
@@ -0,0 +1,18 @@
1
+ import type { Type } from './index.d';
2
+
3
+ export const types = ['default', 'danger'] as const;
4
+
5
+ export const domClassesPerType: Record<Type, string[]> = {
6
+ default: ['text-white'],
7
+ danger: ['text-red-500'],
8
+ };
9
+
10
+ export const domClassesPerMenu: Record<'contextMenu' | 'actionBar', string[]> = {
11
+ contextMenu: ['focus:bg-zinc-600', 'px-2', 'py-1'],
12
+ actionBar: ['hover:bg-black-100/20'],
13
+ };
14
+
15
+ export const arrowClassPerMenu: Record<'contextMenu' | 'actionBar', string> = {
16
+ actionBar: 'before:-top-4 before:left-1/2 before:border-x-10 before:border-b-10 before:border-x-transparent before:border-b-secondary',
17
+ contextMenu: '',
18
+ };
@@ -0,0 +1,69 @@
1
+ <script lang="ts" setup>
2
+ import { useSlots } from 'vue';
3
+ import { domClassesPerType, statusIconPerType } from '.';
4
+
5
+ import type { Type } from './index.d';
6
+
7
+ withDefaults(defineProps<{
8
+ type: Type;
9
+ title?: string;
10
+ description?: string;
11
+ withIcon?: boolean;
12
+ }>(), {
13
+ title: undefined,
14
+ description: undefined,
15
+ withIcon: true,
16
+ });
17
+
18
+ const slots = useSlots();
19
+ </script>
20
+
21
+ <template>
22
+ <div
23
+ :class="domClassesPerType[type]"
24
+ class="app-alert inline-flex max-w-[410px] flex-col rounded-lg px-4 py-2 text-sm text-zinc-900"
25
+ >
26
+ <div class="flex items-center font-bold">
27
+ <span
28
+ v-if="withIcon"
29
+ class="mr-2"
30
+ >
31
+ <slot
32
+ :type="type"
33
+ name="icon"
34
+ >
35
+ <Component
36
+ :is="statusIconPerType[type]"
37
+ class="size-5"
38
+ />
39
+ </slot>
40
+ </span>
41
+
42
+ <span data-test-title>
43
+ <slot name="title">
44
+ {{ title }}
45
+ </slot>
46
+ </span>
47
+ </div>
48
+
49
+ <div
50
+ v-if="description || slots.description"
51
+ class="mt-1 text-zinc-700"
52
+ data-test-description
53
+ >
54
+ <slot name="description">
55
+ {{ description }}
56
+ </slot>
57
+ </div>
58
+ </div>
59
+ </template>
60
+
61
+ <style scoped>
62
+ @reference "./../../../css/main.css";
63
+
64
+ .app-alert > :deep(*) {
65
+ a {
66
+ @apply underline;
67
+ }
68
+ }
69
+ </style>
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { shallowMount } from '@vue/test-utils';
3
+ import AppAlert from '../AppAlert.vue';
4
+
5
+ import type { ComponentMountingOptions, VueWrapper } from '@vue/test-utils';
6
+ import type { Type } from '../index.d';
7
+
8
+ function createWrapper(
9
+ type: Type,
10
+ title: string,
11
+ description?: string,
12
+ slots?: ComponentMountingOptions<typeof AppAlert>['slots'],
13
+ ): VueWrapper<InstanceType<typeof AppAlert>> {
14
+ return shallowMount(AppAlert, {
15
+ props: {
16
+ type,
17
+ title,
18
+ description,
19
+ withIcon: false,
20
+ },
21
+ slots,
22
+ });
23
+ }
24
+
25
+ describe('the AppAlert component', () => {
26
+ it('can render an alert with a title via the title prop', () => {
27
+ const title = 'Example alert title';
28
+ const wrapper = createWrapper('success', title);
29
+
30
+ const titleWrapper = wrapper.find('[data-test-title]');
31
+ expect(titleWrapper.exists()).toBe(true);
32
+ expect(titleWrapper.text()).toBe(title);
33
+ });
34
+
35
+ it('can render an alert with a title via the title slot', () => {
36
+ const title = 'Example alert title';
37
+ const titleSlotSelector = 'data-test-title-slot';
38
+ const titleSlotText = 'Example slot alert title';
39
+ const titleSlot = `<i ${titleSlotSelector}>${titleSlotText}</i>`;
40
+ const wrapper = createWrapper('success', title, undefined, { title: titleSlot });
41
+
42
+ const titleSlotWrapper = wrapper.find(`[data-test-title] > [${titleSlotSelector}]`);
43
+ expect(titleSlotWrapper.exists()).toBe(true);
44
+ expect(titleSlotWrapper.text()).toBe(titleSlotText);
45
+ });
46
+
47
+ it('can render an alert with a description via the description prop', () => {
48
+ const description = 'Example alert description';
49
+ const wrapper = createWrapper('success', 'title', description);
50
+
51
+ const descriptionWrapper = wrapper.find('[data-test-description]');
52
+ expect(descriptionWrapper.exists()).toBe(true);
53
+ expect(descriptionWrapper.text()).toBe(description);
54
+ });
55
+
56
+ it('can render an alert with a description via the description slot', () => {
57
+ const description = 'Example alert description';
58
+ const descriptionSlotSelector = 'data-test-description-slot';
59
+ const descriptionSlotText = 'Example slot alert description';
60
+ const descriptionSlot = `<i ${descriptionSlotSelector}>${descriptionSlotText}</i>`;
61
+ const wrapper = createWrapper('success', 'title', description, { description: descriptionSlot });
62
+
63
+ const descriptionSlotWrapper = wrapper.find(`[data-test-description] > [${descriptionSlotSelector}]`);
64
+ expect(descriptionSlotWrapper.exists()).toBe(true);
65
+ expect(descriptionSlotWrapper.text()).toBe(descriptionSlotText);
66
+ });
67
+ });
@@ -0,0 +1,3 @@
1
+ import type { types } from '.';
2
+
3
+ export type Type = typeof types[number];
@@ -0,0 +1,18 @@
1
+ import { SuccessIcon, WarningIcon, ErrorIcon } from '~icons/status';
2
+
3
+ import type { Component } from 'vue';
4
+ import type { Type } from './index.d';
5
+
6
+ export const types = ['success', 'warning', 'error'] as const;
7
+
8
+ export const domClassesPerType: Record<Type, string[]> = {
9
+ success: ['bg-green-100'],
10
+ warning: ['bg-yellow-100'],
11
+ error: ['bg-red-100'],
12
+ };
13
+
14
+ export const statusIconPerType: Record<Type, Component> = {
15
+ success: SuccessIcon,
16
+ warning: WarningIcon,
17
+ error: ErrorIcon,
18
+ };