@autoafleveren/ui 1.3.2 → 1.3.3

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 (315) 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/composables/index.d.ts +1 -1
  5. package/dist/types/composables/useActionBar/index.d.ts +3 -3
  6. package/dist/ui.cjs +36 -36
  7. package/dist/ui.js +6766 -6696
  8. package/package.json +3 -2
  9. package/src/App.vue +15 -0
  10. package/src/Playground.vue.example +9 -0
  11. package/src/config/eslint.cjs +199 -0
  12. package/src/config/tailwind/config.cjs +229 -0
  13. package/src/config/tailwind/screens.json +9 -0
  14. package/src/css/build.css +52 -0
  15. package/src/css/main.css +4 -0
  16. package/src/css/theme.css +208 -0
  17. package/src/css/tinymce.css +58 -0
  18. package/src/main.ts +34 -0
  19. package/src/modules/components/AppActionBar/AppActionBar.vue +96 -0
  20. package/src/modules/components/AppActionBar/AppActionBarItem.vue +123 -0
  21. package/src/modules/components/AppActionBar/AppActionBarSubMenu.vue +89 -0
  22. package/src/modules/components/AppActionBar/Components/Error.vue +11 -0
  23. package/src/modules/components/AppActionBar/Components/Loading.vue +9 -0
  24. package/src/modules/components/AppActionBar/Components/MultiSelect.vue +102 -0
  25. package/src/modules/components/AppActionBar/Components/__tests__/multi-select.spec.ts +74 -0
  26. package/src/modules/components/AppActionBar/__mocks__/index.ts +36 -0
  27. package/src/modules/components/AppActionBar/__tests__/app-action-bar-item.spec.ts +134 -0
  28. package/src/modules/components/AppActionBar/__tests__/app-action-bar-sub-menu.spec.ts +45 -0
  29. package/src/modules/components/AppActionBar/__tests__/app-action-bar.spec.ts +92 -0
  30. package/src/modules/components/AppActionBar/index.d.ts +29 -0
  31. package/src/modules/components/AppActionBar/index.ts +18 -0
  32. package/src/modules/components/AppAlert/AppAlert.vue +69 -0
  33. package/src/modules/components/AppAlert/__tests__/app-alert.spec.ts +67 -0
  34. package/src/modules/components/AppAlert/index.d.ts +3 -0
  35. package/src/modules/components/AppAlert/index.ts +18 -0
  36. package/src/modules/components/AppAvatar/AppAvatar.vue +30 -0
  37. package/src/modules/components/AppAvatar/DefaultAvatar.vue +187 -0
  38. package/src/modules/components/AppAvatar/__tests__/app-avatar.spec.ts +70 -0
  39. package/src/modules/components/AppAvatar/index.d.ts +9 -0
  40. package/src/modules/components/AppAvatar/index.ts +9 -0
  41. package/src/modules/components/AppBackButton/AppBackButton.vue +51 -0
  42. package/src/modules/components/AppBackButton/__tests__/app-back-button.spec.ts +70 -0
  43. package/src/modules/components/AppBadge/AppBadge.vue +65 -0
  44. package/src/modules/components/AppBadge/__tests__/app-badge.spec.ts +64 -0
  45. package/src/modules/components/AppBadge/index.d.ts +13 -0
  46. package/src/modules/components/AppBadge/index.ts +29 -0
  47. package/src/modules/components/AppButton/AppButton.vue +53 -0
  48. package/src/modules/components/AppButton/ButtonIconSlot.vue +26 -0
  49. package/src/modules/components/AppButton/__tests__/app-button.spec.ts +145 -0
  50. package/src/modules/components/AppButton/__tests__/button-icon-slot.spec.ts +30 -0
  51. package/src/modules/components/AppButton/index.d.ts +16 -0
  52. package/src/modules/components/AppButton/index.ts +57 -0
  53. package/src/modules/components/AppCard/AppCard.vue +88 -0
  54. package/src/modules/components/AppCard/CardAction.vue +101 -0
  55. package/src/modules/components/AppCard/CardIconSlot.vue +65 -0
  56. package/src/modules/components/AppCard/__tests__/app-card.spec.ts +109 -0
  57. package/src/modules/components/AppCard/__tests__/card-action.spec.ts +55 -0
  58. package/src/modules/components/AppCard/__tests__/card-icon-slot.spec.ts +27 -0
  59. package/src/modules/components/AppCard/index.d.ts +12 -0
  60. package/src/modules/components/AppCard/index.ts +5 -0
  61. package/src/modules/components/AppColor/AppColor.vue +74 -0
  62. package/src/modules/components/AppColor/__tests__/app-color.spec.ts +53 -0
  63. package/src/modules/components/AppColor/index.d.ts +10 -0
  64. package/src/modules/components/AppColorCard/AppColorCard.vue +41 -0
  65. package/src/modules/components/AppColorCard/__tests__/app-color-card.spec.ts +55 -0
  66. package/src/modules/components/AppConfirm/AppConfirm.vue +237 -0
  67. package/src/modules/components/AppConfirm/__tests__/app-confirm.spec.ts +366 -0
  68. package/src/modules/components/AppConfirm/index.d.ts +31 -0
  69. package/src/modules/components/AppConfirm/index.ts +1 -0
  70. package/src/modules/components/AppContextMenu/AppContextMenu.vue +100 -0
  71. package/src/modules/components/AppContextMenu/ShortcutItem.vue +37 -0
  72. package/src/modules/components/AppContextMenu/__mocks__/index.ts +25 -0
  73. package/src/modules/components/AppContextMenu/__tests__/app-context-menu.spec.ts +71 -0
  74. package/src/modules/components/AppContextMenu/__tests__/shortcut-item.spec.ts +29 -0
  75. package/src/modules/components/AppContextMenu/index.d.ts +23 -0
  76. package/src/modules/components/AppDataTable/AppDataTable.vue +323 -0
  77. package/src/modules/components/AppDataTable/AppDataTableFooter.vue +91 -0
  78. package/src/modules/components/AppDataTable/__mocks__/index.ts +71 -0
  79. package/src/modules/components/AppDataTable/__tests__/app-data-table-footer.spec.ts +107 -0
  80. package/src/modules/components/AppDataTable/__tests__/app-data-table.spec.ts +153 -0
  81. package/src/modules/components/AppDataTable/index.d.ts +29 -0
  82. package/src/modules/components/AppDefinitionList/AppDefinitionItem.vue +57 -0
  83. package/src/modules/components/AppDefinitionList/AppDefinitionList.vue +31 -0
  84. package/src/modules/components/AppDefinitionList/__mocks__/index.ts +31 -0
  85. package/src/modules/components/AppDefinitionList/__tests__/app-definition-item.spec.ts +93 -0
  86. package/src/modules/components/AppDefinitionList/__tests__/app-definition-list.spec.ts +35 -0
  87. package/src/modules/components/AppDefinitionList/index.d.ts +8 -0
  88. package/src/modules/components/AppDisclosure/AppDisclosure.vue +19 -0
  89. package/src/modules/components/AppDisclosure/AppDisclosureButton.vue +43 -0
  90. package/src/modules/components/AppDisclosure/AppDisclosurePanel.vue +31 -0
  91. package/src/modules/components/AppDisclosure/__tests__/app-disclosure-button.spec.ts +70 -0
  92. package/src/modules/components/AppDisclosure/__tests__/app-disclosure-panel.spec.ts +64 -0
  93. package/src/modules/components/AppDisclosure/__tests__/app-disclosure.spec.ts +41 -0
  94. package/src/modules/components/AppDrawer/AppDrawer.vue +149 -0
  95. package/src/modules/components/AppDrawer/__tests__/app-drawer.spec.ts +120 -0
  96. package/src/modules/components/AppDrawer/index.d.ts +27 -0
  97. package/src/modules/components/AppDropdownButton/AppDropdownButton.vue +82 -0
  98. package/src/modules/components/AppDropdownButton/AppDropdownItem.vue +67 -0
  99. package/src/modules/components/AppDropdownButton/__mocks__/index.ts +25 -0
  100. package/src/modules/components/AppDropdownButton/__tests__/app-dropdown-button.spec.ts +81 -0
  101. package/src/modules/components/AppDropdownButton/__tests__/app-dropdown-item.spec.ts +108 -0
  102. package/src/modules/components/AppDropdownButton/index.d.ts +26 -0
  103. package/src/modules/components/AppDropdownButton/index.ts +8 -0
  104. package/src/modules/components/AppError/AppError.vue +233 -0
  105. package/src/modules/components/AppError/__tests__/app-error.spec.ts +366 -0
  106. package/src/modules/components/AppError/index.d.ts +30 -0
  107. package/src/modules/components/AppError/index.ts +1 -0
  108. package/src/modules/components/AppImageDropzone/AppImageDropzone.vue +130 -0
  109. package/src/modules/components/AppImageDropzone/__tests__/app-image-dropzone.spec.ts +92 -0
  110. package/src/modules/components/AppImageDropzone/index.d.ts +8 -0
  111. package/src/modules/components/AppInput/AppInput.vue +247 -0
  112. package/src/modules/components/AppInput/FileInput.vue +58 -0
  113. package/src/modules/components/AppInput/Input.vue +141 -0
  114. package/src/modules/components/AppInput/InputIconSlot.vue +27 -0
  115. package/src/modules/components/AppInput/LocationInput.vue +150 -0
  116. package/src/modules/components/AppInput/__mocks__/location.ts +13 -0
  117. package/src/modules/components/AppInput/__tests__/app-input.spec.ts +255 -0
  118. package/src/modules/components/AppInput/__tests__/file-input.spec.ts +48 -0
  119. package/src/modules/components/AppInput/__tests__/input-icon-slot.spec.ts +27 -0
  120. package/src/modules/components/AppInput/__tests__/input.spec.ts +260 -0
  121. package/src/modules/components/AppInput/__tests__/location-input.spec.ts +159 -0
  122. package/src/modules/components/AppInput/choice.ts +24 -0
  123. package/src/modules/components/AppInput/datepicker.ts +62 -0
  124. package/src/modules/components/AppInput/index.d.ts +68 -0
  125. package/src/modules/components/AppInput/index.ts +133 -0
  126. package/src/modules/components/AppInput/location.ts +8 -0
  127. package/src/modules/components/AppInput/richText.ts +45 -0
  128. package/src/modules/components/AppInputLabel/AppInputLabel.vue +15 -0
  129. package/src/modules/components/AppInputLabel/__tests__/app-input-label.spec.ts +38 -0
  130. package/src/modules/components/AppInputLabel/index.d.ts +6 -0
  131. package/src/modules/components/AppLicensePlate/AppLicensePlate.vue +34 -0
  132. package/src/modules/components/AppLicensePlate/__tests__/app-license-plate.spec.ts +46 -0
  133. package/src/modules/components/AppLicensePlate/index.d.ts +1 -0
  134. package/src/modules/components/AppLoader/AppLoader.vue +37 -0
  135. package/src/modules/components/AppLoader/index.d.ts +1 -0
  136. package/src/modules/components/AppLoader/index.ts +8 -0
  137. package/src/modules/components/AppMaps/AppMaps.vue +105 -0
  138. package/src/modules/components/AppMaps/index.ts +44 -0
  139. package/src/modules/components/AppMenu/AppMenu.vue +79 -0
  140. package/src/modules/components/AppMenu/AppMenuItem.vue +40 -0
  141. package/src/modules/components/AppMenu/__mocks__/index.ts +23 -0
  142. package/src/modules/components/AppMenu/__tests__/app-menu-item.spec.ts +47 -0
  143. package/src/modules/components/AppMenu/__tests__/app-menu.spec.ts +53 -0
  144. package/src/modules/components/AppMenu/index.d.ts +15 -0
  145. package/src/modules/components/AppModal/AppModal.vue +261 -0
  146. package/src/modules/components/AppModal/__tests__/app-modal.spec.ts +282 -0
  147. package/src/modules/components/AppModal/index.d.ts +36 -0
  148. package/src/modules/components/AppNavigationMenu/AppNavigationMenu.vue +95 -0
  149. package/src/modules/components/AppNavigationMenu/Mobile.vue +126 -0
  150. package/src/modules/components/AppNavigationMenu/NavigationItem.vue +82 -0
  151. package/src/modules/components/AppNavigationMenu/SupportItem.vue +29 -0
  152. package/src/modules/components/AppNavigationMenu/__tests__/app-navigation-menu.spec.ts +104 -0
  153. package/src/modules/components/AppNavigationMenu/__tests__/mobile.spec.ts +155 -0
  154. package/src/modules/components/AppNavigationMenu/__tests__/navigation-item.spec.ts +91 -0
  155. package/src/modules/components/AppNavigationMenu/__tests__/support-item.spec.ts +48 -0
  156. package/src/modules/components/AppPagination/AppPagination.vue +133 -0
  157. package/src/modules/components/AppPagination/AppPaginationItem.vue +28 -0
  158. package/src/modules/components/AppPagination/__mocks__/index.ts +20 -0
  159. package/src/modules/components/AppPagination/__tests__/app-pagination.spec.ts +143 -0
  160. package/src/modules/components/AppPagination/index.d.ts +24 -0
  161. package/src/modules/components/AppProgressBar/AppProgressBar.vue +93 -0
  162. package/src/modules/components/AppProgressBar/AppProgressBarStep.vue +5 -0
  163. package/src/modules/components/AppProgressBar/__mocks__/index.ts +17 -0
  164. package/src/modules/components/AppProgressBar/__tests__/app-progress-bar-step.spec.ts +18 -0
  165. package/src/modules/components/AppProgressBar/__tests__/app-progress-bar.spec.ts +77 -0
  166. package/src/modules/components/AppProgressBar/index.d.ts +21 -0
  167. package/src/modules/components/AppRating/AppRating.vue +42 -0
  168. package/src/modules/components/AppRating/VueStarRating/Star.vue +215 -0
  169. package/src/modules/components/AppRating/VueStarRating/StarRating.vue +231 -0
  170. package/src/modules/components/AppRating/VueStarRating/classes/AlphaColor.ts +68 -0
  171. package/src/modules/components/AppRating/VueStarRating/readme.md +279 -0
  172. package/src/modules/components/AppRating/__tests__/app-rating.spec.ts +36 -0
  173. package/src/modules/components/AppSection/AppSection.vue +35 -0
  174. package/src/modules/components/AppSection/__tests__/app-section.spec.ts +53 -0
  175. package/src/modules/components/AppSelect/AppSelect.vue +176 -0
  176. package/src/modules/components/AppSelect/__mocks__/index.ts +24 -0
  177. package/src/modules/components/AppSelect/__tests__/app-select.spec.ts +73 -0
  178. package/src/modules/components/AppSelect/index.d.ts +43 -0
  179. package/src/modules/components/AppSelect/index.ts +69 -0
  180. package/src/modules/components/AppStepper/AppStepper.vue +79 -0
  181. package/src/modules/components/AppStepper/__tests__/app-stepper.spec.ts +59 -0
  182. package/src/modules/components/AppTable/AppTable.vue +40 -0
  183. package/src/modules/components/AppTimeline/AppTimeline.vue +22 -0
  184. package/src/modules/components/AppTimeline/AppTimelineItem.vue +97 -0
  185. package/src/modules/components/AppTimeline/AppTimelineItemIcon.vue +55 -0
  186. package/src/modules/components/AppTimeline/__mocks__/timeline.ts +29 -0
  187. package/src/modules/components/AppTimeline/__tests__/app-timeline-item-Icon.spec.ts +35 -0
  188. package/src/modules/components/AppTimeline/__tests__/app-timeline-item.spec.ts +121 -0
  189. package/src/modules/components/AppTimeline/__tests__/app-timeline.spec.ts +55 -0
  190. package/src/modules/components/AppTimeline/index.d.ts +30 -0
  191. package/src/modules/components/AppTimeline/index.ts +13 -0
  192. package/src/modules/components/AppToggle/AppToggle.vue +36 -0
  193. package/src/modules/components/AppToggle/__tests__/app-toggle.spec.ts +54 -0
  194. package/src/modules/components/AppToggle/index.d.ts +3 -0
  195. package/src/modules/components/AppToggleCard/AppToggleCard.vue +45 -0
  196. package/src/modules/components/AppToggleCard/__tests__/app-toggle-card.spec.ts +55 -0
  197. package/src/modules/components/index.ts +43 -0
  198. package/src/modules/composables/index.ts +13 -0
  199. package/src/modules/composables/useActionBar/__mocks__/index.ts +17 -0
  200. package/src/modules/composables/useActionBar/__tests__/index.spec.ts +62 -0
  201. package/src/modules/composables/useActionBar/index.d.ts +1 -0
  202. package/src/modules/composables/useActionBar/index.ts +67 -0
  203. package/src/modules/composables/useComputedPosition/index.d.ts +16 -0
  204. package/src/modules/composables/useComputedPosition/index.ts +199 -0
  205. package/src/modules/composables/useConfirm/__tests__/index.spec.ts +29 -0
  206. package/src/modules/composables/useConfirm/index.ts +63 -0
  207. package/src/modules/composables/useContextMenu/index.ts +127 -0
  208. package/src/modules/composables/useDrawer/__tests__/index.spec.ts +34 -0
  209. package/src/modules/composables/useDrawer/index.ts +136 -0
  210. package/src/modules/composables/useEcho/index.ts +167 -0
  211. package/src/modules/composables/useError/__tests__/index.spec.ts +29 -0
  212. package/src/modules/composables/useError/index.ts +61 -0
  213. package/src/modules/composables/useGoogleApi/__tests__/index.spec.ts +39 -0
  214. package/src/modules/composables/useGoogleApi/index.ts +26 -0
  215. package/src/modules/composables/useLayout/__tests__/index.spec.ts +34 -0
  216. package/src/modules/composables/useLayout/index.d.ts +1 -0
  217. package/src/modules/composables/useLayout/index.ts +68 -0
  218. package/src/modules/composables/useModal/__tests__/index.spec.ts +34 -0
  219. package/src/modules/composables/useModal/index.ts +97 -0
  220. package/src/modules/composables/useNavigation/__mocks__/navigation.ts +22 -0
  221. package/src/modules/composables/useNavigation/__tests__/index.spec.ts +88 -0
  222. package/src/modules/composables/useNavigation/index.d.ts +17 -0
  223. package/src/modules/composables/useNavigation/index.ts +97 -0
  224. package/src/modules/icons/BuildingCircleCheck.vue +32 -0
  225. package/src/modules/icons/BuildingCircleXmark.vue +20 -0
  226. package/src/modules/icons/CarsIcon.vue +29 -0
  227. package/src/modules/icons/ChatPersonRoundedIcon.vue +184 -0
  228. package/src/modules/icons/CompanyIcon.vue +18 -0
  229. package/src/modules/icons/HeroGirlIcon.vue +246 -0
  230. package/src/modules/icons/HeroPersonIcon.vue +402 -0
  231. package/src/modules/icons/HeroPersonRoundedIcon.vue +412 -0
  232. package/src/modules/icons/HeroPersonWithBgIcon.vue +4503 -0
  233. package/src/modules/icons/LocationMarkerIcon.vue +33 -0
  234. package/src/modules/icons/PartyPopperIcon.vue +146 -0
  235. package/src/modules/icons/index.ts +32 -0
  236. package/src/modules/icons/status/ErrorIcon.vue +24 -0
  237. package/src/modules/icons/status/SuccessIcon.vue +24 -0
  238. package/src/modules/icons/status/WarningIcon.vue +27 -0
  239. package/src/modules/icons/status/index.ts +3 -0
  240. package/src/modules/index.ts +8 -0
  241. package/src/modules/layouts/Auth/Auth.vue +36 -0
  242. package/src/modules/layouts/Auth/__tests__/auth.spec.ts +63 -0
  243. package/src/modules/layouts/Base/Base.vue +69 -0
  244. package/src/modules/layouts/Base/__tests__/base.spec.ts +56 -0
  245. package/src/modules/layouts/Platform/Platform.vue +96 -0
  246. package/src/modules/layouts/Platform/__tests__/platform.spec.ts +56 -0
  247. package/src/modules/layouts/index.ts +9 -0
  248. package/src/modules/plugins/Sentry/index.d.ts +16 -0
  249. package/src/modules/plugins/Sentry/index.ts +65 -0
  250. package/src/modules/plugins/Sentry/language/nl.ts +13 -0
  251. package/src/modules/plugins/TinyMCE/lang/nl.js +430 -0
  252. package/src/modules/plugins/Toast/Toast.vue +58 -0
  253. package/src/modules/plugins/Toast/__tests__/toast.spec.ts +90 -0
  254. package/src/modules/plugins/Toast/index.ts +36 -0
  255. package/src/modules/plugins/Toast/types.d.ts +265 -0
  256. package/src/modules/plugins/index.ts +63 -0
  257. package/src/stories/Introduction.mdx +4 -0
  258. package/src/stories/assets/code-brackets.svg +1 -0
  259. package/src/stories/assets/colors.svg +1 -0
  260. package/src/stories/assets/comments.svg +1 -0
  261. package/src/stories/assets/direction.svg +1 -0
  262. package/src/stories/assets/flow.svg +1 -0
  263. package/src/stories/assets/images/logo.png +0 -0
  264. package/src/stories/assets/images/road.png +0 -0
  265. package/src/stories/assets/plugin.svg +1 -0
  266. package/src/stories/assets/repo.svg +1 -0
  267. package/src/stories/assets/stackalt.svg +1 -0
  268. package/src/stories/components/ActionBar/ActionBar.stories.ts +67 -0
  269. package/src/stories/components/Alert/Alert.stories.ts +53 -0
  270. package/src/stories/components/Avatar/Avatar.stories.ts +44 -0
  271. package/src/stories/components/BackButton/BackButton.stories.ts +39 -0
  272. package/src/stories/components/Badge/Badge.stories.ts +42 -0
  273. package/src/stories/components/Button/Button.stories.ts +132 -0
  274. package/src/stories/components/Card/Card.stories.ts +70 -0
  275. package/src/stories/components/Color/Color.stories.ts +41 -0
  276. package/src/stories/components/ColorCard/ColorCard.stories.ts +43 -0
  277. package/src/stories/components/Confirm/Confirm.stories.ts +110 -0
  278. package/src/stories/components/ContextMenu/ContextMenu.stories.ts +85 -0
  279. package/src/stories/components/DefinitionList/DefinitionList.stories.ts +32 -0
  280. package/src/stories/components/Disclosure/Disclosure.stories.ts +61 -0
  281. package/src/stories/components/DropdownButton/DropdownButton.stories.ts +121 -0
  282. package/src/stories/components/Error/Error.stories.ts +106 -0
  283. package/src/stories/components/ImageDropzone/ImageDropzone.stories.ts +41 -0
  284. package/src/stories/components/Input/Input.stories.ts +180 -0
  285. package/src/stories/components/Input/LocationInput.stories.ts +77 -0
  286. package/src/stories/components/LicensePlate/LicensePlate.stories.ts +39 -0
  287. package/src/stories/components/Maps/Maps.stories.ts +36 -0
  288. package/src/stories/components/Menu/Menu.stories.ts +41 -0
  289. package/src/stories/components/Modal/Modal.stories.ts +68 -0
  290. package/src/stories/components/Navigation/Navigation.stories.ts +62 -0
  291. package/src/stories/components/Pagination/Pagination.stories.ts +62 -0
  292. package/src/stories/components/ProgressBar/ProgressBar.stories.ts +48 -0
  293. package/src/stories/components/Rating/Rating.stories.ts +38 -0
  294. package/src/stories/components/Section/Section.stories.ts +44 -0
  295. package/src/stories/components/Select/Select.stories.ts +90 -0
  296. package/src/stories/components/Stepper/Stepper.stories.ts +38 -0
  297. package/src/stories/components/Table/DataTable.stories.ts +96 -0
  298. package/src/stories/components/Table/Table.stories.ts +45 -0
  299. package/src/stories/components/Timeline/Timeline.stories.ts +46 -0
  300. package/src/stories/components/Toast/Toast.stories.ts +47 -0
  301. package/src/stories/components/Toggle/Toggle.stories.ts +41 -0
  302. package/src/stories/components/ToggleCard/ToggleCard.stories.ts +43 -0
  303. package/src/stories/layouts/Auth.stories.ts +43 -0
  304. package/src/stories/layouts/Base.stories.ts +70 -0
  305. package/src/tests/mocks/resize-observer.ts +13 -0
  306. package/src/tests/stubs/AppSelect.ts +89 -0
  307. package/src/tests/stubs/HeadlessUiDialogStub.ts +24 -0
  308. package/src/tests/stubs/HeadlessUiTransitionChildStub.ts +20 -0
  309. package/src/tests/stubs/HeadlessUiTransitionRootStub.ts +25 -0
  310. package/src/tests/stubs/IconStub.ts +9 -0
  311. package/src/tests/stubs/Vue3EasyDataTableStub.ts +53 -0
  312. package/src/typings/plugin.d.ts +5 -0
  313. package/src/typings/shims-vue.d.ts +13 -0
  314. package/src/typings/utilities.d.ts +4 -0
  315. package/src/typings/vite-environment.d.ts +12 -0
@@ -0,0 +1,247 @@
1
+ <script lang="ts" generic="ModelValue" setup>
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { computed, h, ref, useAttrs } from 'vue';
4
+ import '@vuepic/vue-datepicker/dist/main.css';
5
+ import { AppInputLabel, AppLicensePlate } from '~components';
6
+ import { FontAwesomeIcon, byPrefixAndName } from '~icons';
7
+ import InputIconSlot from './InputIconSlot.vue';
8
+ import { datePickerIconPerType, isDatePickerCheck, getDatePickerProps } from './datepicker';
9
+ import { getRichTextProps, isRichTextCheck } from './richText';
10
+ import { isLocationInputCheck } from './location';
11
+ import { isChoiceInputCheck } from './choice';
12
+ import InputComponent from './Input.vue';
13
+ import { appInputPropDefaults, mustRenderDefaultSlot, mustRenderIconSlot, getInputDomClasses } from '.';
14
+
15
+ import type { Component, VNode } from 'vue';
16
+ import type { VueDatePickerProps } from '@vuepic/vue-datepicker';
17
+ import type { AppInputProps, DatePickerType, RichTextType, RichtextProps } from './index.d';
18
+
19
+ const props = withDefaults(
20
+ defineProps<AppInputProps<ModelValue>>(),
21
+ appInputPropDefaults,
22
+ );
23
+
24
+ const emit = defineEmits<{ (event: 'update:modelValue', value: ModelValue): void }>();
25
+
26
+ const uuid = uuidv4();
27
+ const inputUuid = `input-${uuid}`;
28
+ const isOpen = ref(false);
29
+ const isFocused = ref(false);
30
+ const attrs = useAttrs();
31
+
32
+ const model = computed({
33
+ get: (): ModelValue => {
34
+ if (props.modelModifiers.dotToComma) {
35
+ const toParse = String(props.modelValue).replace(/,/g, '.');
36
+
37
+ if (!isFocused.value && parseFloat(toParse)) {
38
+ return String(parseFloat(toParse).toFixed(2)).replace(/\./g, ',') as ModelValue;
39
+ }
40
+
41
+ return String(props.modelValue).replace(/\./g, ',') as ModelValue;
42
+ }
43
+
44
+ return props.modelValue as ModelValue;
45
+ },
46
+ set: (value: ModelValue): void => {
47
+ if (props.modelModifiers.dotToComma) {
48
+ emit('update:modelValue', String(value).replace(/,/g, '.') as ModelValue);
49
+ } else {
50
+ emit('update:modelValue', value);
51
+ }
52
+ },
53
+ });
54
+ const isDatePicker = computed(() => isDatePickerCheck(props.type));
55
+ const isRichText = computed(() => isRichTextCheck(props.type));
56
+ const isChoiceInput = computed(() => isChoiceInputCheck(props.type));
57
+ const isLocationInput = computed(() => isLocationInputCheck(props.type));
58
+ const defaultTrailingIcon = computed((): Component | undefined => {
59
+ if (isDatePicker.value) {
60
+ const type = props.type as DatePickerType;
61
+
62
+ return h(FontAwesomeIcon, { icon: byPrefixAndName.far?.[datePickerIconPerType[type]], size: 'xs', class: 'size-4' });
63
+ }
64
+
65
+ if (isLocationInput.value) {
66
+ return h(FontAwesomeIcon, { icon: byPrefixAndName.far?.['location-dot'], size: 'xs' });
67
+ }
68
+
69
+ if (props.type === 'search') {
70
+ return h(FontAwesomeIcon, { icon: byPrefixAndName.far?.['magnifying-glass'], size: 'xs', class: 'size-4' });
71
+ }
72
+
73
+ return undefined;
74
+ });
75
+ const datePickerProps = computed((): VueDatePickerProps | undefined => {
76
+ const type = props.type as DatePickerType;
77
+
78
+ return isDatePicker.value ? getDatePickerProps(type, inputUuid) : undefined;
79
+ });
80
+ const richTextProps = computed((): RichtextProps | undefined => {
81
+ const type = props.type as RichTextType;
82
+ const defaultProps = getRichTextProps(type);
83
+
84
+ return isRichText.value ? { ...defaultProps, init: { ...defaultProps.init, ...props.init } } : undefined;
85
+ });
86
+ const inputType = computed(() => (props.type === 'license' ? 'text' : props.type));
87
+ const inputAttrs = computed(() => ({
88
+ id: inputUuid,
89
+ type: inputType.value,
90
+ required: props.required,
91
+ // @ts-expect-error multiple only exists on file inputs
92
+ multiple: props.multiple,
93
+ disabled: props.disabled,
94
+ readonly: props.readonly,
95
+ }));
96
+ const inputWrapperComponent = computed((): VNode => {
97
+ if (props.type === 'license') {
98
+ return h(AppLicensePlate, { licensePlateClasses: 'p-0!' });
99
+ }
100
+
101
+ return h('div');
102
+ });
103
+ const inputWrapperComponentClasses = computed((): string => {
104
+ const classes = props.inputWrapperClasses;
105
+ const additionalClasses = props.type === 'license'
106
+ ? 'items-stretch'
107
+ : 'relative w-full items-center justify-center';
108
+
109
+ return `${classes} ${additionalClasses}`;
110
+ });
111
+
112
+ function check(): void {
113
+ model.value = attrs.value as ModelValue;
114
+ }
115
+
116
+ function onlyAllowDecimalNumbers(event: KeyboardEvent): void {
117
+ if (props.modelModifiers.dotToComma) {
118
+ const key = event.key;
119
+
120
+ if (!/[\d,.]/.test(key)) {
121
+ event.preventDefault();
122
+ }
123
+ }
124
+ }
125
+
126
+ function onBlur(): void {
127
+ isFocused.value = false;
128
+
129
+ if (props.modelModifiers.dotToComma && parseFloat((String(model.value) as string))) {
130
+ model.value = String(parseFloat((String(model.value) as string).replace(/,/g, '.')).toFixed(2)).replace(/\./g, ',') as ModelValue;
131
+ }
132
+ }
133
+
134
+ function onFocus(): void {
135
+ isFocused.value = true;
136
+ }
137
+
138
+ defineOptions({ inheritAttrs: false });
139
+ </script>
140
+
141
+ <template>
142
+ <div
143
+ :class="wrapperClasses"
144
+ :aria-expanded="plain"
145
+ class="group"
146
+ >
147
+ <!--
148
+ eslint-disable vue/no-duplicate-attr-inheritance
149
+ Note: Must disable because defineOptions is not recognized in eslint-plugin-vue yet
150
+ TODO: Remove when eslint-plugin-vue fully supports all features in Vue 3.3
151
+ -->
152
+ <AppInputLabel
153
+ v-if="(label || $slots.label) && !isChoiceInput"
154
+ :type="type"
155
+ :has-error="hasError"
156
+ :disabled="disabled"
157
+ :for="isDatePicker ? `dp-input-${inputUuid}` : inputUuid"
158
+ :class="labelClasses"
159
+ >
160
+ <slot name="label">
161
+ {{ label }}
162
+ </slot>
163
+ </AppInputLabel>
164
+
165
+ <Component
166
+ :is="inputWrapperComponent"
167
+ :class="inputWrapperComponentClasses"
168
+ class="flex"
169
+ >
170
+ <InputIconSlot
171
+ v-if="mustRenderIconSlot('leading', type, loading, plain, disabled, readonly, $slots)"
172
+ :loading="loading"
173
+ :class="iconClasses"
174
+ class="left-3.5 top-2.5"
175
+ data-test-leading-icon
176
+ >
177
+ <slot name="leadingIcon"></slot>
178
+ </InputIconSlot>
179
+
180
+ <InputComponent
181
+ v-model="model"
182
+ v-bind="{ ...inputAttrs, ...datePickerProps, ...richTextProps, ...$attrs }"
183
+ :custom="props.custom"
184
+ :tabindex="props.tabindex"
185
+ :class="getInputDomClasses(type, disabled, readonly, loading, hasError, isOpen, plain, $slots, $attrs)"
186
+ :data-error="hasError ? 'input' : undefined"
187
+ @open="() => isOpen = true"
188
+ @blur="onBlur"
189
+ @focus="onFocus"
190
+ @closed="() => isOpen = false"
191
+ @keypress="onlyAllowDecimalNumbers"
192
+ >
193
+ <slot></slot>
194
+ </InputComponent>
195
+
196
+ <template v-if="custom">
197
+ <slot
198
+ name="input"
199
+ v-bind="{ check, checked: attrs.value === model }"
200
+ ></slot>
201
+ </template>
202
+
203
+ <FontAwesomeIcon
204
+ v-if="!custom && type === 'checkbox'"
205
+ :icon="byPrefixAndName.far?.check"
206
+ class="pointer-events-none -ml-4 size-4 -translate-x-0.5 text-white"
207
+ />
208
+
209
+ <!-- Checkbox and radio label (default slot) -->
210
+ <label
211
+ v-if="mustRenderDefaultSlot(type, $slots, label)"
212
+ :for="inputUuid"
213
+ :class="`{ 'text-error!': hasError, ${labelClasses}}`"
214
+ :data-error="hasError ? type : undefined"
215
+ class="cursor-pointer select-none pl-2 text-base peer-disabled:cursor-not-allowed peer-disabled:text-zinc-300"
216
+ data-test-choice-label
217
+ >
218
+ <slot>{{ label }}</slot>
219
+ </label>
220
+
221
+ <InputIconSlot
222
+ v-if="mustRenderIconSlot('trailing', type, loading, plain, disabled, readonly, $slots)"
223
+ :loading="loading"
224
+ :class="iconClasses"
225
+ class="right-3.5 top-2.5"
226
+ data-test-trailing-icon
227
+ >
228
+ <slot name="trailingIcon">
229
+ <Component
230
+ :is="defaultTrailingIcon"
231
+ v-if="defaultTrailingIcon"
232
+ />
233
+ </slot>
234
+ </InputIconSlot>
235
+ </Component>
236
+
237
+ <p
238
+ v-if="hasError && errorMessage"
239
+ :class="errorWrapperClasses"
240
+ :data-error="hasError ? 'message' : undefined"
241
+ class="order-2 mt-1.5 flex items-center gap-x-1 text-xs italic text-error"
242
+ data-test-error-message
243
+ >
244
+ {{ errorMessage }}
245
+ </p>
246
+ </div>
247
+ </template>
@@ -0,0 +1,58 @@
1
+ <script lang="ts" setup>
2
+ import { computed } from 'vue';
3
+ import { FontAwesomeIcon, byPrefixAndName } from '~icons';
4
+ import { AppButton } from '~components';
5
+
6
+ import type { FileInputProps } from './index.d';
7
+
8
+ const props = defineProps<FileInputProps>();
9
+
10
+ const emit = defineEmits<{
11
+ (event: 'update:modelValue', value: FileInputProps['modelValue']): void;
12
+ }>();
13
+
14
+ const model = computed({
15
+ get: (): FileInputProps['modelValue'] => props.modelValue,
16
+ set: (value: FileInputProps['modelValue']): void => emit('update:modelValue', value),
17
+ });
18
+
19
+ function onFileSelected(event: Event): void {
20
+ const target = event.target as HTMLInputElement;
21
+ const files = target.files;
22
+
23
+ if (!files) { return; }
24
+
25
+ // eslint-disable-next-line unicorn/prefer-spread
26
+ model.value = Array.from(files);
27
+ }
28
+
29
+ defineOptions({ inheritAttrs: false });
30
+ </script>
31
+
32
+ <template>
33
+ <div>
34
+ <label>
35
+ <input
36
+ v-bind="{ ...$attrs }"
37
+ :multiple="multiple"
38
+ type="file"
39
+ class="hidden"
40
+ data-test-input
41
+ @change="onFileSelected"
42
+ >
43
+
44
+ <slot>
45
+ <AppButton
46
+ as="span"
47
+ color-type="secondary"
48
+ class="size-10 p-2.5!"
49
+ >
50
+ <FontAwesomeIcon
51
+ :icon="byPrefixAndName.far?.paperclip"
52
+ class="size-5"
53
+ />
54
+ </AppButton>
55
+ </slot>
56
+ </label>
57
+ </div>
58
+ </template>
@@ -0,0 +1,141 @@
1
+ <script lang="ts" generic="ModelValue" setup>
2
+ /* eslint-disable @programic/vue-no-multiple-template-root */
3
+ import { computed } from 'vue';
4
+ import { getInputComponent } from '.';
5
+
6
+ import type { Component } from 'vue';
7
+ import type { InputProps } from './index.d';
8
+
9
+ const props = defineProps<InputProps<ModelValue> & { custom?: boolean }>();
10
+
11
+ const emit = defineEmits<{
12
+ (event: 'update:modelValue', value: ModelValue): void;
13
+ (event: 'open'): void;
14
+ }>();
15
+
16
+ /*
17
+ 'defineModel' cannot be used with generic components yet.
18
+ See https://github.com/vuejs/language-tools/issues/3164
19
+ TODO: Change to defineModel when it's supported
20
+ */
21
+ const model = computed({
22
+ get: (): ModelValue => props.modelValue,
23
+ set: (value: ModelValue): void => emit('update:modelValue', value),
24
+ });
25
+ const inputComponent = computed((): string | Component => {
26
+ return getInputComponent(props.type);
27
+ });
28
+
29
+ function onInputTextarea(event: Event): void {
30
+ // @ts-expect-error cannot set string to ModelValue
31
+ model.value = event.target.value;
32
+ }
33
+ </script>
34
+
35
+ <template>
36
+ <!--
37
+ v-model is not working on dynamic components acting as native html element.
38
+ That's why we use v-if/v-else-if/v-else. TODO: Change to dynamic component if Vue changes this behaviour.
39
+ See https://vuejs.org/api/built-in-special-elements.html#component
40
+ -->
41
+ <input
42
+ v-if="inputComponent === 'input'"
43
+ v-show="!custom"
44
+ v-model="model"
45
+ :type="type"
46
+ :tabindex="tabindex"
47
+ data-test-input
48
+ >
49
+
50
+ <textarea
51
+ v-else-if="inputComponent === 'textarea'"
52
+ :value="modelValue as string"
53
+ :tabindex="tabindex"
54
+ data-test-textarea
55
+ @input="onInputTextarea"
56
+ ></textarea>
57
+
58
+ <Component
59
+ :is="inputComponent"
60
+ v-else
61
+ v-model="model"
62
+ :tabindex="tabindex"
63
+ @open="() => emit('open')"
64
+ >
65
+ <slot></slot>
66
+ </Component>
67
+ </template>
68
+
69
+ <style>
70
+ @reference "./../../../css/main.css";
71
+
72
+ .dp__menu .dp__overlay {
73
+ @apply bg-white rounded-lg;
74
+ }
75
+ </style>
76
+
77
+ <style scoped>
78
+ @reference "./../../../css/main.css";
79
+
80
+ :deep(> div) {
81
+ @apply h-full;
82
+ }
83
+
84
+ .dp__main {
85
+ @apply h-[44px]! bg-white group-aria-expanded:bg-transparent!;
86
+ }
87
+
88
+ :deep(*) {
89
+ > .dp__theme_light {
90
+ @apply bg-white!;
91
+
92
+ --dp-primary-color: var(--color-primary);
93
+ --dp-primary-text-color: #fff;
94
+
95
+ > div:not(.dp__arrow_top):not(.dp__arrow_bottom) {
96
+ @apply h-full;
97
+ }
98
+ }
99
+
100
+ > .dp__input_wrap {
101
+ --dp-font-family: 'Inter', sans-serif;
102
+ --dp-font-size: 14px;
103
+
104
+ @apply h-full;
105
+
106
+ > .dp--clear-btn {
107
+ @apply right-10 bg-center bg-no-repeat w-2.5 h-4 py-px box-content inline-block;
108
+
109
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 320 512' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M207.6 256l107.72-107.72c6.23-6.23 6.23-16.34 0-22.58l-25.03-25.03c-6.23-6.23-16.34-6.23-22.58 0L160 208.4 52.28 100.68c-6.23-6.23-16.34-6.23-22.58 0L4.68 125.7c-6.23 6.23-6.23 16.34 0 22.58L112.4 256 4.68 363.72c-6.23 6.23-6.23 16.34 0 22.58l25.03 25.03c6.23 6.23 16.34 6.23 22.58 0L160 303.6l107.72 107.72c6.23 6.23 16.34 6.23 22.58 0l25.03-25.03c6.23-6.23 6.23-16.34 0-22.58L207.6 256z'%3e%3c/path%3e%3c/svg%3e");
110
+
111
+ > svg {
112
+ @apply hidden;
113
+ }
114
+ }
115
+ }
116
+
117
+ > .dp__input {
118
+ @apply pl-3! pr-10! py-3! h-full! border-none! bg-transparent! hover:bg-zinc-100! rounded-lg placeholder:text-zinc-500!;
119
+
120
+ &.dp__disabled {
121
+ @apply cursor-not-allowed border-zinc-100! bg-zinc-100! group-aria-expanded:bg-transparent!;
122
+ }
123
+
124
+ &.dp__input_readonly {
125
+ @apply cursor-default border-zinc-300! bg-zinc-50! group-aria-expanded:bg-transparent!;
126
+ }
127
+ }
128
+
129
+ .dp__icon {
130
+ @apply text-zinc-700 -mr-4;
131
+ }
132
+
133
+ > .dp__input_icon {
134
+ @apply hidden mr-3;
135
+ }
136
+
137
+ > .dp__active_date {
138
+ @apply bg-primary!;
139
+ }
140
+ }
141
+ </style>
@@ -0,0 +1,27 @@
1
+ <script lang="ts" setup>
2
+ import AppLoader from '../AppLoader/AppLoader.vue';
3
+
4
+ defineProps<{
5
+ loading?: boolean;
6
+ }>();
7
+ </script>
8
+
9
+ <template>
10
+ <span class="app-input__icon pointer-events-none absolute z-10 mt-px h-5">
11
+ <AppLoader
12
+ v-if="loading"
13
+ size="small"
14
+ class="w-4"
15
+ />
16
+
17
+ <slot v-else></slot>
18
+ </span>
19
+ </template>
20
+
21
+ <style scoped>
22
+ @reference "./../../../css/main.css";
23
+
24
+ .app-input__icon > :deep(*) {
25
+ @apply h-full!;
26
+ }
27
+ </style>
@@ -0,0 +1,150 @@
1
+ <script lang="ts" setup>
2
+ import { computed, onMounted, ref } from 'vue';
3
+ import { AppBadge } from '~components';
4
+
5
+ import type { LocationModelValue, LocationInputProps } from './index.d';
6
+
7
+ const props = withDefaults(defineProps<LocationInputProps>(), {
8
+ placeholder: '',
9
+ placeOptions: null,
10
+ });
11
+
12
+ const emit = defineEmits<{
13
+ (event: 'update:modelValue', value: LocationModelValue): void;
14
+ }>();
15
+
16
+ const input = ref<HTMLInputElement | null>(null);
17
+ const inputModel = ref('');
18
+
19
+ const hasLocation = computed((): boolean => {
20
+ return !!props.modelValue?.postcode || !!props.modelValue?.street || !!props.modelValue?.number;
21
+ });
22
+
23
+ onMounted(async () => {
24
+ if (!input.value) {
25
+ return;
26
+ }
27
+
28
+ if (!window?.google) {
29
+ console.error('Google not defined. use composable useGoogleApi at setup');
30
+ return;
31
+ }
32
+
33
+ // eslint-disable-next-line @typescript-eslint/naming-convention
34
+ const { Autocomplete } = await google.maps.importLibrary('places') as google.maps.PlacesLibrary;
35
+
36
+ const autocomplete = new Autocomplete(input.value as HTMLInputElement, {
37
+ strictBounds: false,
38
+ types: ['address'],
39
+ componentRestrictions: {
40
+ country: 'nl',
41
+ },
42
+ ...props.placeOptions,
43
+ });
44
+
45
+ autocomplete.addListener('place_changed', () => {
46
+ inputModel.value = '';
47
+
48
+ const place = autocomplete.getPlace();
49
+ const geoLocation = place.geometry?.location;
50
+ const addressComponents = place.address_components ?? [];
51
+
52
+ const lat = geoLocation?.lat();
53
+ const lng = geoLocation?.lng();
54
+
55
+ const postcode = addressComponents.find(component => {
56
+ return component.types.includes('postal_code');
57
+ })?.long_name;
58
+ const street = addressComponents.find(component => {
59
+ return component.types.includes('route');
60
+ })?.long_name;
61
+ const number = parseInt(addressComponents.find(component => {
62
+ return component.types.includes('street_number');
63
+ })?.long_name.split(/(\d*)(.*)/s)?.[1] ?? '', 10);
64
+ const numberSuffix = addressComponents.find(component => {
65
+ return component.types.includes('street_number');
66
+ })?.long_name.split(/(\d*)(.*)/s)?.[2];
67
+ const city = addressComponents.find(component => {
68
+ return component.types.includes('locality');
69
+ })?.long_name;
70
+ const province = addressComponents.find(component => {
71
+ return component.types.includes('administrative_area_level_1');
72
+ })?.long_name;
73
+ const provinceShort = addressComponents.find(component => {
74
+ return component.types.includes('administrative_area_level_1');
75
+ })?.short_name;
76
+
77
+ input.value?.blur();
78
+
79
+ emit('update:modelValue', {
80
+ postcode,
81
+ street,
82
+ number: number > 0 ? number : undefined,
83
+ numberSuffix,
84
+ city,
85
+ province,
86
+ provinceShort,
87
+ lat,
88
+ lng,
89
+ });
90
+ });
91
+ });
92
+
93
+ defineOptions({ inheritAttrs: false });
94
+ </script>
95
+
96
+ <template>
97
+ <div class="relative w-full">
98
+ <!--
99
+ eslint-disable vue/no-duplicate-attr-inheritance
100
+ Note: Must disable because defineOptions is not recognized in eslint-plugin-vue yet
101
+ TODO: Remove when eslint-plugin-vue fully supports all features in Vue 3.3
102
+ -->
103
+ <input
104
+ ref="input"
105
+ :value="inputModel"
106
+ :placeholder="hasLocation ? '' : placeholder"
107
+ v-bind="{ ...$attrs }"
108
+ class="peer text-zinc-900"
109
+ @keydown.enter.prevent
110
+ >
111
+
112
+ <div
113
+ v-if="hasLocation"
114
+ class="pointer-events-none absolute inset-0 flex items-center px-2 peer-focus:hidden"
115
+ data-test-location-labels
116
+ >
117
+ <div class="flex space-x-2">
118
+ <AppBadge
119
+ class="empty:hidden"
120
+ data-test-street-label
121
+ >
122
+ {{ modelValue?.street }} {{ modelValue?.number }}{{ modelValue?.numberSuffix }}
123
+ </AppBadge>
124
+
125
+ <AppBadge
126
+ class="empty:hidden"
127
+ data-test-postcode-label
128
+ >
129
+ {{ modelValue?.postcode }}
130
+ </AppBadge>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </template>
135
+
136
+ <style>
137
+ @reference "./../../../css/main.css";
138
+
139
+ .pac-container {
140
+ @apply rounded-b-xl shadow-none drop-shadow-lg after:hidden;
141
+
142
+ .pac-item {
143
+ @apply py-2! px-4! cursor-pointer text-zinc-900 hover:bg-zinc-50;
144
+
145
+ .pac-icon-marker {
146
+ @apply hidden;
147
+ }
148
+ }
149
+ }
150
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { LocationModelValue } from '../index.d';
2
+
3
+ export const location: LocationModelValue = {
4
+ postcode: '0000 AB',
5
+ city: 'Chicago',
6
+ street: 'johndoelane',
7
+ number: 4,
8
+ numberSuffix: 'a',
9
+ provinceShort: 'GE',
10
+ province: 'Gelderland',
11
+ lat: 51.000_000_3,
12
+ lng: 24.214_905_4,
13
+ };