@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,33 @@
1
+ <template>
2
+ <svg
3
+ width="24"
4
+ height="24"
5
+ fill="none"
6
+ viewBox="0 0 24 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <path
10
+ stroke="white"
11
+ stroke-width="2"
12
+ stroke-linecap="round"
13
+ stroke-linejoin="round"
14
+ d="M17.657 16.6567L13.414 20.8997C13.2284 21.0854 13.0081 21.2328 12.7656 21.3333C12.523 21.4339 12.2631
15
+ 21.4856 12.0005 21.4856C11.738 21.4856 11.478 21.4339 11.2354 21.3333C10.9929 21.2328 10.7726 21.0854 10.587
16
+ 20.8997L6.343 16.6567C5.22422 15.5379 4.46234 14.1124 4.15369 12.5606C3.84504 11.0087 4.00349 9.40022 4.60901
17
+ 7.93844C5.21452 6.47665 6.2399 5.22725 7.55548 4.34821C8.87107 3.46918 10.4178 3 12 3C13.5822 3 15.1289 3.46918
18
+ 16.4445 4.34821C17.7601 5.22725 18.7855 6.47665 19.391 7.93844C19.9965 9.40022 20.155 11.0087 19.8463
19
+ 12.5606C19.5377 14.1124 18.7758 15.5379 17.657 16.6567V16.6567Z"
20
+ ></path>
21
+
22
+ <path
23
+ stroke="white"
24
+ stroke-width="2"
25
+ stroke-linecap="round"
26
+ stroke-linejoin="round"
27
+ d="M15 10.9998C15 11.7954 14.6839 12.5585 14.1213 13.1211C13.5587 13.6837 12.7956 13.9998 12 13.9998C11.2044
28
+ 13.9998 10.4413 13.6837 9.87868 13.1211C9.31607 12.5585 9 11.7954 9 10.9998C9 10.2041 9.31607 9.44104 9.87868
29
+ 8.87844C10.4413 8.31583 11.2044 7.99976 12 7.99976C12.7956 7.99976 13.5587 8.31583 14.1213 8.87844C14.6839
30
+ 9.44104 15 10.2041 15 10.9998V10.9998Z"
31
+ ></path>
32
+ </svg>
33
+ </template>
@@ -0,0 +1,146 @@
1
+ <template>
2
+ <svg
3
+ enable-background="new 0 0 128 128"
4
+ viewBox="0 0 128 128"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ xmlns:xlink="http://www.w3.org/1999/xlink"
7
+ >
8
+ <linearGradient
9
+ id="a"
10
+ gradientUnits="userSpaceOnUse"
11
+ x1="74.3843"
12
+ x2="44.617"
13
+ y1="61.8385"
14
+ y2="79.6989"
15
+ ><stop
16
+ offset=".0235"
17
+ stop-color="#8f4700"
18
+ ></stop>
19
+
20
+ <stop
21
+ offset="1"
22
+ stop-color="#703e2d"
23
+ ></stop></linearGradient>
24
+
25
+ <path
26
+ d="m7.45 123.27c2.27 2.46 11.62-1.83 19-5.27 5.53-2.57 27.66-11.65 38.66-16.36 2.97-1.27 7.29-2.93 10.4-7.02 2.76-3.64
27
+ 10.08-19.1-4.66-34.76-14.96-15.9-30.37-11.51-36.13-7.43-3.39 2.4-6.15 7.81-7.39 10.56-5.24 11.62-12.71 32.91-15.75 41.28-2.23
28
+ 6.17-6.38 16.56-4.13 19z"
29
+ fill="#ffc107"
30
+ ></path>
31
+
32
+ <g fill="#ff8f00">
33
+ <path
34
+ d="m25.85 66.49c.14 1.74.49 4.57 1.69 10.02.82 3.74 2.16 7.66 3.25 10.25 3.27 7.79 7.86 10.93 12.51 13.45 7.9 4.28 13.27 5.08 13.27
35
+ 5.08l-6.44 2.63s-3.9-.81-9.22-3.43c-5.07-2.5-10.35-6.73-14.21-15.01-1.67-3.59-2.64-7.07-3.2-9.83-.69-3.42-.8-5.36-.8-5.36z"
36
+ ></path>
37
+
38
+ <path
39
+ d="m17.94 86.77s.8 6.49 6.16 14.68c6.28 9.58 15.05 11.15 15.05 11.15l-5.83
40
+ 2.4s-6.51-1.99-12.7-10.44c-3.86-5.27-4.94-11.57-4.94-11.57z"
41
+ ></path>
42
+
43
+ <path
44
+ d="m12.39 102.15s1.46 5.6 4.66 9.78c3.81 4.99 8.66 6.44 8.66 6.44l-4.47 1.98s-3.39-.71-7.1-5.41c-2.82-3.57-3.62-7.67-3.62-7.67z"
45
+ ></path>
46
+ </g>
47
+
48
+ <path
49
+ d="m9.96 116.37c-.2-.45-.2-.96.01-1.4l25.47-52.82 4.19 15.75-26.8 38.71c-.72 1.08-2.34.94-2.87-.24z"
50
+ fill="#fffde7"
51
+ opacity=".44"
52
+ ></path>
53
+
54
+ <path
55
+ d="m41.65 83.19c11.9 13.92 25.45 12.18 29.96 8.66 4.52-3.53
56
+ 8.09-15.66-3.76-29.35-12.42-14.34-26.48-10.25-29.73-7.15s-7.39 15.07 3.53 27.84z"
57
+ fill="url(#a)"
58
+ ></path>
59
+
60
+ <path
61
+ d="m82.52 88.92c-4.34-3.64-6.65-2.99-9.75-1.7-4 1.66-10.29 2.89-18.83 0l2.57-6.19c5.07 1.71 8.74.88 11.91-.99 4.08-2.4 9.66-5.69 18.34
62
+ 1.6 3.62 3.04 7.33 5.06 10.05 4.14 1.98-.66 3.03-3.61 3.56-5.96.05-.21.13-.81.19-1.34.48-3.67 1.28-11.59 7.18-15.64 6.31-4.33
63
+ 12.94-4.33 12.94-4.33l1.2 11.92c-3.05-.45-5.17.17-6.96 1.16-6.74 3.75-.87 18.15-11.36 22.99-10.09 4.69-18.34-3.4-21.04-5.66z"
64
+ fill="#03a9f4"
65
+ ></path>
66
+
67
+ <path
68
+ d="m45.4 73.72-4.34-3.89c7.97-8.9 5.87-15.44
69
+ 4.34-20.2-.31-.96-.6-1.87-.79-2.74-.68-3.08-.82-5.76-.61-8.1-3.06-3.81-4.41-7.8-4.5-8.07-1.86-5.63-.46-11.12
70
+ 2.75-16.27 6.49-10.45 18.24-10.45 18.24-10.45l3.92 10.49c-2.98-.12-12.75.03-15.75 4.76-3.79 5.96-1.3 9.64-1.12
71
+ 10.06.73-.95 1.47-1.71 2.13-2.3 4.79-4.25 8.95-4.86 11.6-4.62 2.98.27 5.68 1.77 7.61 4.23 2.11 2.7 2.98 6.21 2.31
72
+ 9.4-.65 3.11-2.72 5.74-5.83 7.41-5.43 2.92-9.95 2.52-12.98 1.51.02.07.03.15.05.22.11.5.33 1.2.59 2.01 1.77 5.48 5.06 14.18-7.62
73
+ 26.55zm7.35-37.53c.58.42 1.19.77 1.82 1.02 2.1.84 4.39.56 6.99-.84 1.53-.82 1.71-1.7
74
+ 1.77-1.99.18-.87-.12-1.98-.77-2.81-.57-.73-1.23-1.11-2.02-1.19-1.5-.13-3.53.82-5.56 2.63-.97.87-1.71 1.94-2.23 3.18z"
75
+ fill="#f44336"
76
+ ></path>
77
+
78
+ <path
79
+ d="m62.77 75.35-6.21-.17s2.95-16.66 12.5-19.46c1.79-.52 3.75-1.05 5.72-1.34 1.17-.18 3.02-.45
80
+ 3.93-.79.21-1.57-.45-3.57-1.19-5.84-.58-1.76-1.18-3.57-1.5-5.55-.62-3.86.41-7.27 2.9-9.62 3.04-2.85 7.95-3.76 13.49-2.5 3.16.72 5.49
81
+ 2.27 7.54 3.63 2.93 1.95 4.64 2.94 8.22.53 4.33-2.92-1.33-14.35-4.34-20.95l11.23-4.68c1.51 3.3 8.8 20.28 3.99 29.97-1.62 3.26-4.41
82
+ 5.42-8.07 6.23-7.96 1.78-12.62-1.32-16.02-3.58-1.61-1.07-3.02-1.91-4.55-2.35-10.63-3.03 4.21 12.61-2.74 19.64-4.17 4.21-14.36
83
+ 5.32-15.02 5.48-6.56 1.58-9.88 11.35-9.88 11.35z"
84
+ fill="#f48fb1"
85
+ ></path>
86
+
87
+ <path
88
+ d="m43.99 38.79c-.19 2.2-.28 3.51.29 6.37 2.75 2.02 8.74 2.02 8.74
89
+ 2.02-.26-.81-.49-1.51-.59-2.01-.02-.07-.03-.15-.05-.22-6.09-3.04-8.39-6.16-8.39-6.16z"
90
+ fill="#c92b27"
91
+ ></path>
92
+
93
+ <path
94
+ d="m31.53 48.64-10.34-5.07 5.15-7.44 8.11 5.37z"
95
+ fill="#ffc107"
96
+ ></path>
97
+
98
+ <path
99
+ d="m16.29 34.6c-5.28-.71-10.66-5.19-11.25-5.7l5.19-6.09c1.57 1.33 4.9 3.56 7.13 3.86z"
100
+ fill="#fb8c00"
101
+ ></path>
102
+
103
+ <path
104
+ d="m25.61 21.27-7.6-2.49c.87-2.66 1.1-5.53.65-8.3l7.9-1.27c.65 4.02.32 8.19-.95 12.06z"
105
+ fill="#03a9f4"
106
+ ></path>
107
+
108
+ <path
109
+ d="m74.11 14.35h8v10.56h-8z"
110
+ fill="#fb8c00"
111
+ transform="matrix(.9769 -.2137 .2137 .9769 -2.3917 17.1437)"
112
+ ></path>
113
+
114
+ <path
115
+ d="m92.46 17.77-5.5-5.81c2.88-2.73 3.54-6.3 3.54-6.34l7.9 1.29c-.1.63-1.11 6.29-5.94 10.86z"
116
+ fill="#ffc107"
117
+ ></path>
118
+
119
+ <path
120
+ d="m96.54 47.3h7.32v8h-7.32z"
121
+ fill="#fb8c00"
122
+ transform="matrix(.9545 -.2983 .2983 .9545 -10.7408 32.2313)"
123
+ ></path>
124
+
125
+ <path
126
+ d="m97.55 113.03-7.95-.94c.34-2.83-1.77-6.3-2.35-7.07l6.4-4.8c.48.63 4.65 6.4 3.9 12.81z"
127
+ fill="#f44336"
128
+ ></path>
129
+
130
+ <path
131
+ d="m120.37 102.89c-2.99-.45-6.05-.63-9.07-.52l-.27-8c3.51-.12 7.06.08 10.53.61z"
132
+ fill="#fb8c00"
133
+ ></path>
134
+
135
+ <path
136
+ d="m112.29 109.43h8v10.87h-8z"
137
+ fill="#f48fb1"
138
+ transform="matrix(.7026 -.7116 .7116 .7026 -47.1516 116.922)"
139
+ ></path>
140
+
141
+ <path
142
+ d="m88.29 65.14h8.78v8.78h-8.78z"
143
+ fill="#f44336"
144
+ transform="matrix(.6583 .7527 -.7527 .6583 84.0086 -46.0064)"
145
+ ></path></svg>
146
+ </template>
@@ -0,0 +1,32 @@
1
+ // Custom icons
2
+ export { default as HeroGirlIcon } from './HeroGirlIcon.vue';
3
+ export { default as HeroPersonIcon } from './HeroPersonIcon.vue';
4
+ export { default as HeroPersonWithBgIcon } from './HeroPersonWithBgIcon.vue';
5
+ export { default as LocationMarkerIcon } from './LocationMarkerIcon.vue';
6
+ export { default as BuildingCircleCheck } from './BuildingCircleCheck.vue';
7
+ export { default as BuildingCircleXmark } from './BuildingCircleXmark.vue';
8
+ export { default as PartyPopperIcon } from './PartyPopperIcon.vue';
9
+ export { default as CarsIcon } from './CarsIcon.vue';
10
+ export { default as CompanyIcon } from './CompanyIcon.vue';
11
+ export { default as HeroPersonRoundedIcon } from './HeroPersonRoundedIcon.vue';
12
+ export { default as ChatPersonRoundedIcon } from './ChatPersonRoundedIcon.vue';
13
+
14
+ // Status icons
15
+ export * from './status';
16
+
17
+ // Hero Icons solid
18
+ export {
19
+ UserIcon as UserSolidIcon,
20
+ BellIcon as BellSolidIcon,
21
+ KeyIcon as KeySolidIcon,
22
+ BugAntIcon as BugAntSolidIcon,
23
+ BuildingOfficeIcon as BuildingOfficeSolidIcon,
24
+ ArrowUpTrayIcon as ArrowUpTraySolidIcon,
25
+ } from '@heroicons/vue/24/solid/index.js';
26
+
27
+ // Hero Icons outline
28
+ export * from '@heroicons/vue/24/outline/index.js';
29
+
30
+ // FontAwesome
31
+ export { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
32
+ export { byPrefixAndName, all } from '@awesome.me/kit-6a64244790/icons';
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <svg
3
+ width="24"
4
+ height="24"
5
+ fill="none"
6
+ viewBox="0 0 24 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <circle
10
+ r="10"
11
+ cy="12"
12
+ cx="12.0269"
13
+ fill="#DC2626"
14
+ ></circle>
15
+
16
+ <path
17
+ stroke="white"
18
+ stroke-width="1.5"
19
+ stroke-linecap="round"
20
+ stroke-linejoin="round"
21
+ d="M12.0269 7V12.549M12.0269 16.9882H12.0372V17H12.0269V16.9882Z"
22
+ ></path>
23
+ </svg>
24
+ </template>
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <svg
3
+ width="24"
4
+ height="24"
5
+ fill="none"
6
+ viewBox="0 0 24 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <circle
10
+ r="10"
11
+ cy="12"
12
+ cx="12.0269"
13
+ fill="#22C55E"
14
+ ></circle>
15
+
16
+ <path
17
+ stroke="white"
18
+ stroke-width="1.5"
19
+ stroke-linecap="round"
20
+ stroke-linejoin="round"
21
+ d="M8 12.8571L10.5714 15.4286L17 9"
22
+ ></path>
23
+ </svg>
24
+ </template>
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <svg
3
+ width="24"
4
+ height="24"
5
+ fill="none"
6
+ viewBox="0 0 24 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <path
10
+ fill="#EAB308"
11
+ stroke="#EAB308"
12
+ stroke-width="1.5"
13
+ stroke-linecap="round"
14
+ stroke-linejoin="round"
15
+ d="M2.31804 17.4787C1.41423 19.0442 2.54451 21 4.35109 21H19.7033C21.5089 21 22.6391 19.0442
16
+ 21.7364 17.4787L14.0613 4.17412C13.1575 2.60863 10.8969 2.60863 9.99311 4.17412L2.31804 17.4787Z"
17
+ ></path>
18
+
19
+ <path
20
+ stroke="white"
21
+ stroke-width="1.5"
22
+ stroke-linecap="round"
23
+ stroke-linejoin="round"
24
+ d="M12 8V13.549M12 17.9882H12.0104V18H12V17.9882Z"
25
+ ></path>
26
+ </svg>
27
+ </template>
@@ -0,0 +1,3 @@
1
+ export { default as SuccessIcon } from './SuccessIcon.vue';
2
+ export { default as WarningIcon } from './WarningIcon.vue';
3
+ export { default as ErrorIcon } from './ErrorIcon.vue';
@@ -0,0 +1,8 @@
1
+ import { plugin } from './plugins';
2
+
3
+ export * from './components';
4
+ export * from './composables';
5
+ export * from './layouts';
6
+ export * from './plugins';
7
+
8
+ export default plugin;
@@ -0,0 +1,36 @@
1
+ <script lang="ts" setup>
2
+ import { AppNavigationMenu } from '~components';
3
+ import { useLayout } from '~composables';
4
+
5
+ const { layoutImage } = useLayout();
6
+ </script>
7
+
8
+ <template>
9
+ <div class="flex min-h-screen flex-col md:flex-row md:bg-secondary">
10
+ <AppNavigationMenu />
11
+
12
+ <div
13
+ class="flex h-full grow flex-col bg-white md:h-auto md:w-1/2 md:grow-0 md:rounded-l-2xl"
14
+ data-test-main-wrapper
15
+ >
16
+ <slot name="secondaryNavBar"></slot>
17
+
18
+ <main class="flex grow justify-center p-10 transition-all md:items-center md:px-24">
19
+ <div class="mx-auto md:max-w-lg">
20
+ <slot></slot>
21
+ </div>
22
+ </main>
23
+ </div>
24
+
25
+ <div
26
+ class="hidden w-1/2 md:block"
27
+ data-test-layout-image-wrapper
28
+ >
29
+ <img
30
+ v-if="layoutImage"
31
+ :src="layoutImage"
32
+ class="h-screen w-full object-fill"
33
+ >
34
+ </div>
35
+ </div>
36
+ </template>
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { shallowMount } from '@vue/test-utils';
3
+ import { useLayout } from '~/modules/composables';
4
+ import Auth from '../Auth.vue';
5
+ import { AppNavigationMenu } from '~/modules/components';
6
+
7
+ const layout = useLayout();
8
+
9
+ describe('the Auth Layout component', () => {
10
+ it('should render AppNavigationMenu', () => {
11
+ const wrapper = shallowMount(Auth);
12
+
13
+ const navigationMenu = wrapper.findComponent(AppNavigationMenu);
14
+ expect(navigationMenu.exists()).toBe(true);
15
+ });
16
+
17
+ it('should render the default slot', () => {
18
+ const wrapper = shallowMount(Auth, {
19
+ slots: {
20
+ default: 'default slot',
21
+ },
22
+ });
23
+
24
+ const mainWrapper = wrapper.find('main');
25
+ expect(mainWrapper.exists()).toBe(true);
26
+ expect(mainWrapper.text()).toBe('default slot');
27
+ });
28
+
29
+ it('should not render the layout image when null', () => {
30
+ const wrapper = shallowMount(Auth);
31
+
32
+ const layoutImageWrapper = wrapper.find('[data-test-layout-image-wrapper]');
33
+ expect(layoutImageWrapper.exists()).toBe(true);
34
+
35
+ const layoutImage = layoutImageWrapper.find('img');
36
+ expect(layoutImage.exists()).toBe(false);
37
+ });
38
+
39
+ it('should render the layout image when provided', () => {
40
+ layout.setLayoutImage('/images/image.png');
41
+
42
+ const wrapper = shallowMount(Auth);
43
+
44
+ const layoutImageWrapper = wrapper.find('[data-test-layout-image-wrapper]');
45
+ expect(layoutImageWrapper.exists()).toBe(true);
46
+
47
+ const layoutImage = layoutImageWrapper.find('img');
48
+ expect(layoutImage.exists()).toBe(true);
49
+ expect(layoutImage.attributes('src')).toBe('/images/image.png');
50
+ });
51
+
52
+ it('can have a secondary navbar', () => {
53
+ const wrapper = shallowMount(Auth, {
54
+ slots: {
55
+ secondaryNavBar: 'secondary nav bar',
56
+ },
57
+ });
58
+
59
+ const mainWrapper = wrapper.find('[data-test-main-wrapper]');
60
+ expect(mainWrapper.exists()).toBe(true);
61
+ expect(mainWrapper.text()).toBe('secondary nav bar');
62
+ });
63
+ });
@@ -0,0 +1,69 @@
1
+ <script lang="ts" setup>
2
+ import { onMounted, onUnmounted, ref, provide } from 'vue';
3
+ import { AppNavigationMenu, AppActionBar } from '~components';
4
+
5
+ const sidebarLeft = ref<HTMLDivElement | null>(null);
6
+ const sidebarLeftHasContent = ref(true);
7
+ const observer = new MutationObserver(calculateSidebarProperties);
8
+
9
+ onMounted(() => {
10
+ if (sidebarLeft.value) {
11
+ observer.observe(sidebarLeft.value, {
12
+ childList: true,
13
+ subtree: true,
14
+ });
15
+
16
+ calculateSidebarProperties();
17
+ }
18
+ });
19
+ onUnmounted(() => {
20
+ observer.disconnect();
21
+ });
22
+
23
+ function calculateSidebarProperties(): void {
24
+ const sidebarLeftWrapper = document.getElementById('sidebar-left-wrapper');
25
+
26
+ sidebarLeftHasContent.value = !!sidebarLeftWrapper?.innerHTML;
27
+ }
28
+
29
+ provide('sidebarLeftHasContent', sidebarLeftHasContent);
30
+ </script>
31
+
32
+ <template>
33
+ <div class="flex h-screen w-screen flex-col bg-zinc-100 md:flex-row md:overflow-hidden">
34
+ <AppNavigationMenu class="z-50 order-1" />
35
+
36
+ <div
37
+ id="sidebar-left-wrapper"
38
+ ref="sidebarLeft"
39
+ class="order-2 flex shrink-0 grow-0 flex-col overflow-y-auto bg-white p-4 transition-all
40
+ empty:-ml-96 empty:whitespace-nowrap empty:p-0
41
+ md:sticky md:top-0 md:mb-4 md:max-h-screen md:w-96 md:px-6 md:pt-8"
42
+ data-test-layout-sidebar-left-wrapper
43
+ >
44
+ <slot name="sidebarLeft"></slot>
45
+ </div>
46
+
47
+ <main
48
+ class="relative order-4 flex shrink-0 grow flex-col overflow-y-auto overflow-x-hidden bg-zinc-100 transition-all
49
+ duration-300 md:order-3 md:-mt-0 md:h-screen md:basis-0 md:overflow-y-auto md:overflow-x-hidden"
50
+ >
51
+ <AppActionBar />
52
+
53
+ <div class="w-full px-4 py-8 md:px-6 md:py-12">
54
+ <slot></slot>
55
+ </div>
56
+ </main>
57
+
58
+ <div
59
+ id="sidebar-wrapper"
60
+ class="order-3 flex w-full max-w-full shrink-0 grow-0 flex-col overflow-x-hidden bg-zinc-100 px-4 pt-8
61
+ transition-all empty:-mr-96 empty:ml-0 empty:whitespace-nowrap empty:p-0
62
+ md:sticky md:top-0 md:order-4 md:max-h-screen md:w-96 md:overflow-hidden md:rounded-l-3xl md:bg-white
63
+ md:p-12 xl:w-110 xl:empty:-mr-110 2xl:w-141 2xl:empty:-mr-141"
64
+ data-test-layout-sidebar-wrapper
65
+ >
66
+ <slot name="sidebar"></slot>
67
+ </div>
68
+ </div>
69
+ </template>
@@ -0,0 +1,56 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { shallowMount } from '@vue/test-utils';
3
+ import Base from '../Base.vue';
4
+ import { AppNavigationMenu, AppActionBar } from '~/modules/components';
5
+
6
+ describe('the Base Layout component', () => {
7
+ it('should render AppNavigationMenu', () => {
8
+ const wrapper = shallowMount(Base);
9
+
10
+ const navigationMenu = wrapper.findComponent(AppNavigationMenu);
11
+ expect(navigationMenu.exists()).toBe(true);
12
+ });
13
+
14
+ it('should render the default slot', () => {
15
+ const wrapper = shallowMount(Base, {
16
+ slots: {
17
+ default: 'default slot',
18
+ },
19
+ });
20
+
21
+ const mainWrapper = wrapper.find('main');
22
+ expect(mainWrapper.exists()).toBe(true);
23
+ expect(mainWrapper.text()).toBe('default slot');
24
+ });
25
+
26
+ it('should render the sidebar slot', () => {
27
+ const wrapper = shallowMount(Base, {
28
+ slots: {
29
+ sidebar: 'sidebar slot',
30
+ },
31
+ });
32
+
33
+ const layoutSidebarWrapper = wrapper.find('[data-test-layout-sidebar-wrapper]');
34
+ expect(layoutSidebarWrapper.exists()).toBe(true);
35
+ expect(layoutSidebarWrapper.text()).toBe('sidebar slot');
36
+ });
37
+
38
+ it('should render the left sidebar slot', () => {
39
+ const wrapper = shallowMount(Base, {
40
+ slots: {
41
+ sidebarLeft: 'sidebar slot',
42
+ },
43
+ });
44
+
45
+ const layoutLeftSidebarWrapper = wrapper.find('[data-test-layout-sidebar-left-wrapper]');
46
+ expect(layoutLeftSidebarWrapper.exists()).toBe(true);
47
+ expect(layoutLeftSidebarWrapper.text()).toBe('sidebar slot');
48
+ });
49
+
50
+ it('should render the AppActionBar', () => {
51
+ const wrapper = shallowMount(Base);
52
+
53
+ const actionBar = wrapper.findComponent(AppActionBar);
54
+ expect(actionBar.exists()).toBe(true);
55
+ });
56
+ });
@@ -0,0 +1,96 @@
1
+ <script lang="ts" setup>
2
+ import { onMounted, onUnmounted, ref, provide, useTemplateRef } from 'vue';
3
+ import { AppNavigationMenu, AppActionBar } from '~components';
4
+
5
+ const sidebarLeft = useTemplateRef<HTMLDivElement | null>('sidebarLeftWrapper');
6
+ const sidebarRight = useTemplateRef<HTMLDivElement | null>('sidebarRightWrapper');
7
+ const sidebarLeftHasContent = ref(true);
8
+ const rightSidebarHasContent = ref(true);
9
+ const observer = new MutationObserver(calculateSidebarProperties);
10
+ const observer2 = new MutationObserver(calculateSidebarRightProperties);
11
+
12
+ onMounted(() => {
13
+ if (sidebarLeft.value) {
14
+ observer.observe(sidebarLeft.value, {
15
+ childList: true,
16
+ subtree: true,
17
+ });
18
+
19
+ calculateSidebarProperties();
20
+ }
21
+
22
+ if (sidebarRight.value) {
23
+ observer2.observe(sidebarRight.value, {
24
+ childList: true,
25
+ subtree: true,
26
+ });
27
+
28
+ calculateSidebarRightProperties();
29
+ }
30
+ });
31
+ onUnmounted(() => {
32
+ observer.disconnect();
33
+ observer2.disconnect();
34
+ });
35
+
36
+ function calculateSidebarProperties(): void {
37
+ const sidebarLeftWrapper = document.getElementById('sidebar-left-wrapper');
38
+
39
+ sidebarLeftHasContent.value = !!sidebarLeftWrapper?.innerHTML;
40
+ }
41
+
42
+ function calculateSidebarRightProperties(): void {
43
+ const sidebarRightWrapper = document.getElementById('sidebar-wrapper');
44
+
45
+ const clientWidth = sidebarRightWrapper?.children?.[0]?.clientWidth;
46
+
47
+ rightSidebarHasContent.value = !!(clientWidth && clientWidth > 0);
48
+ }
49
+
50
+ provide('sidebarLeftHasContent', sidebarLeftHasContent);
51
+ </script>
52
+
53
+ <template>
54
+ <div class="flex h-screen w-screen flex-col bg-zinc-100 md:flex-row md:overflow-hidden">
55
+ <AppNavigationMenu class="z-50 order-1" />
56
+
57
+ <div
58
+ id="sidebar-left-wrapper"
59
+ ref="sidebarLeftWrapper"
60
+ :class="{ 'z-200': sidebarLeftHasContent }"
61
+ class="relative order-2 flex shrink-0 grow-0 flex-col overflow-y-auto rounded-l-2xl bg-white p-4 transition-all
62
+ empty:-ml-72 empty:whitespace-nowrap empty:p-0
63
+ md:sticky md:top-0 md:max-h-screen md:w-72 md:px-6 md:pt-8"
64
+ data-test-layout-sidebar-left-wrapper
65
+ >
66
+ <slot name="sidebarLeft"></slot>
67
+ </div>
68
+
69
+ <main
70
+ class="relative order-4 flex min-h-[calc(100vh-5rem)] shrink-0 flex-col overflow-y-auto overflow-x-hidden
71
+ bg-zinc-100 transition-all duration-300 context-menu-open:overflow-y-hidden justify-self-start
72
+ md:order-3 md:-mt-0 md:h-screen md:grow md:basis-0 md:overflow-y-auto md:overflow-x-hidden"
73
+ >
74
+ <AppActionBar />
75
+
76
+ <div class="w-full px-4 py-8 md:px-8 md:py-12">
77
+ <slot></slot>
78
+ </div>
79
+ </main>
80
+
81
+ <div
82
+ id="sidebar-wrapper"
83
+ ref="sidebarRightWrapper"
84
+ :data-has-content="rightSidebarHasContent"
85
+ class="@container order-5 flex w-full max-w-full shrink-0 grow-0 flex-col overflow-x-hidden bg-zinc-100 px-4 py-8 transition-all
86
+ empty:ml-0 empty:mr-[-400px] empty:whitespace-nowrap empty:p-0
87
+ md:sticky md:top-0 md:order-4 md:max-h-screen md:w-[400px] md:overflow-hidden md:rounded-l-3xl md:bg-white
88
+ md:px-6 md:pb-6 md:pt-12 xl:w-[580px] xl:empty:mr-[-580px]
89
+ data-[has-content=false]:ml-0 data-[has-content=false]:mr-[-400px] data-[has-content=false]:whitespace-nowrap
90
+ data-[has-content=false]:p-0 xl:data-[has-content=false]:mr-[-580px]"
91
+ data-test-layout-sidebar-wrapper
92
+ >
93
+ <slot name="sidebar"></slot>
94
+ </div>
95
+ </div>
96
+ </template>