sprintify-ui 0.1.17 → 0.1.18

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 (395) hide show
  1. package/README.md +229 -229
  2. package/dist/sprintify-ui.es.js +97 -92
  3. package/dist/style.css +1 -1
  4. package/dist/tailwindcss/index.js +306 -306
  5. package/dist/types/src/components/BaseActionItem.vue.d.ts +33 -33
  6. package/dist/types/src/components/BaseActionItemButton.vue.d.ts +29 -29
  7. package/dist/types/src/components/BaseAddressForm.vue.d.ts +81 -81
  8. package/dist/types/src/components/BaseAlert.vue.d.ts +51 -51
  9. package/dist/types/src/components/BaseApp.vue.d.ts +9 -9
  10. package/dist/types/src/components/BaseAppDialogs.vue.d.ts +14 -14
  11. package/dist/types/src/components/BaseAppNotifications.vue.d.ts +2 -2
  12. package/dist/types/src/components/BaseAutocomplete.vue.d.ts +232 -232
  13. package/dist/types/src/components/BaseAutocompleteDrawer.vue.d.ts +90 -90
  14. package/dist/types/src/components/BaseAutocompleteFetch.vue.d.ts +213 -213
  15. package/dist/types/src/components/BaseAvatar.vue.d.ts +52 -52
  16. package/dist/types/src/components/BaseAvatarGroup.vue.d.ts +43 -43
  17. package/dist/types/src/components/BaseBadge.vue.d.ts +50 -50
  18. package/dist/types/src/components/BaseBelongsTo.vue.d.ts +219 -219
  19. package/dist/types/src/components/BaseBoolean.vue.d.ts +15 -15
  20. package/dist/types/src/components/BaseBreadcrumbs.vue.d.ts +14 -14
  21. package/dist/types/src/components/BaseButton.vue.d.ts +23 -23
  22. package/dist/types/src/components/BaseButtonGroup.vue.d.ts +143 -143
  23. package/dist/types/src/components/BaseCard.vue.d.ts +21 -21
  24. package/dist/types/src/components/BaseCardRow.vue.d.ts +16 -16
  25. package/dist/types/src/components/BaseCharacterCounter.vue.d.ts +49 -49
  26. package/dist/types/src/components/BaseClickOutside.vue.d.ts +26 -26
  27. package/dist/types/src/components/BaseClipboard.vue.d.ts +21 -21
  28. package/dist/types/src/components/BaseColor.vue.d.ts +80 -80
  29. package/dist/types/src/components/BaseContainer.vue.d.ts +34 -34
  30. package/dist/types/src/components/BaseCounter.vue.d.ts +42 -42
  31. package/dist/types/src/components/BaseCropper.vue.d.ts +57 -57
  32. package/dist/types/src/components/BaseCropperModal.vue.d.ts +27 -27
  33. package/dist/types/src/components/BaseDataIterator.vue.d.ts +212 -212
  34. package/dist/types/src/components/BaseDataIteratorSectionBox.vue.d.ts +23 -23
  35. package/dist/types/src/components/BaseDataIteratorSectionButton.vue.d.ts +20 -20
  36. package/dist/types/src/components/BaseDataIteratorSectionColumns.vue.d.ts +665 -665
  37. package/dist/types/src/components/BaseDataIteratorSectionModal.vue.d.ts +29 -29
  38. package/dist/types/src/components/BaseDataTable.vue.d.ts +383 -383
  39. package/dist/types/src/components/BaseDataTableRowAction.vue.d.ts +18 -18
  40. package/dist/types/src/components/BaseDatePicker.vue.d.ts +84 -84
  41. package/dist/types/src/components/BaseDateSelect.vue.d.ts +70 -70
  42. package/dist/types/src/components/BaseDescriptionList.vue.d.ts +9 -9
  43. package/dist/types/src/components/BaseDescriptionListItem.vue.d.ts +10 -10
  44. package/dist/types/src/components/BaseDialog.vue.d.ts +60 -60
  45. package/dist/types/src/components/BaseDisplayRelativeTime.vue.d.ts +68 -68
  46. package/dist/types/src/components/BaseDraggable.vue.d.ts +34 -34
  47. package/dist/types/src/components/BaseDropdown.vue.d.ts +62 -62
  48. package/dist/types/src/components/BaseDropdownAutocomplete.vue.d.ts +132 -132
  49. package/dist/types/src/components/BaseField.vue.d.ts +58 -58
  50. package/dist/types/src/components/BaseFieldI18n.vue.d.ts +96 -96
  51. package/dist/types/src/components/BaseFilePicker.vue.d.ts +59 -59
  52. package/dist/types/src/components/BaseFilePickerCrop.vue.d.ts +57 -57
  53. package/dist/types/src/components/BaseFileUploader.vue.d.ts +85 -85
  54. package/dist/types/src/components/BaseForm.vue.d.ts +131 -131
  55. package/dist/types/src/components/BaseHasMany.vue.d.ts +152 -152
  56. package/dist/types/src/components/BaseHeader.vue.d.ts +80 -80
  57. package/dist/types/src/components/BaseIconPicker.vue.d.ts +38 -38
  58. package/dist/types/src/components/BaseInput.vue.d.ts +169 -169
  59. package/dist/types/src/components/BaseInputError.vue.d.ts +9 -9
  60. package/dist/types/src/components/BaseInputLabel.vue.d.ts +43 -43
  61. package/dist/types/src/components/BaseInputPercent.vue.d.ts +133 -133
  62. package/dist/types/src/components/BaseLayoutNotificationDropdown.vue.d.ts +36 -36
  63. package/dist/types/src/components/BaseLayoutNotificationItem.vue.d.ts +16 -16
  64. package/dist/types/src/components/BaseLayoutNotificationItemContent.vue.d.ts +18 -18
  65. package/dist/types/src/components/BaseLayoutSidebar.vue.d.ts +51 -51
  66. package/dist/types/src/components/BaseLayoutSidebarConfigurable.vue.d.ts +87 -87
  67. package/dist/types/src/components/BaseLayoutStacked.vue.d.ts +23 -23
  68. package/dist/types/src/components/BaseLayoutStackedConfigurable.vue.d.ts +78 -78
  69. package/dist/types/src/components/BaseLoadingCover.vue.d.ts +96 -96
  70. package/dist/types/src/components/BaseMediaGallery.vue.d.ts +64 -64
  71. package/dist/types/src/components/BaseMediaGalleryItem.vue.d.ts +45 -45
  72. package/dist/types/src/components/BaseMediaItem.vue.d.ts +27 -27
  73. package/dist/types/src/components/BaseMediaLibrary.vue.d.ts +172 -172
  74. package/dist/types/src/components/BaseMediaList.vue.d.ts +47 -47
  75. package/dist/types/src/components/BaseMediaListItem.vue.d.ts +47 -47
  76. package/dist/types/src/components/BaseMediaPictures.vue.d.ts +55 -55
  77. package/dist/types/src/components/BaseMediaPicturesItem.vue.d.ts +54 -54
  78. package/dist/types/src/components/BaseMediaPreview.vue.d.ts +36 -36
  79. package/dist/types/src/components/BaseMenu.vue.d.ts +68 -68
  80. package/dist/types/src/components/BaseMenuItem.vue.d.ts +61 -61
  81. package/dist/types/src/components/BaseModalCenter.vue.d.ts +79 -79
  82. package/dist/types/src/components/BaseModalSide.vue.d.ts +61 -61
  83. package/dist/types/src/components/BaseNavbar.vue.d.ts +35 -35
  84. package/dist/types/src/components/BaseNavbarItem.vue.d.ts +26 -26
  85. package/dist/types/src/components/BaseNavbarItemContent.vue.d.ts +60 -60
  86. package/dist/types/src/components/BaseNavbarSideItem.vue.d.ts +44 -44
  87. package/dist/types/src/components/BaseNavbarSideItemContent.vue.d.ts +60 -60
  88. package/dist/types/src/components/BaseNumber.vue.d.ts +125 -125
  89. package/dist/types/src/components/BasePagination.vue.d.ts +35 -35
  90. package/dist/types/src/components/BasePanel.vue.d.ts +31 -31
  91. package/dist/types/src/components/BasePassword.vue.d.ts +62 -62
  92. package/dist/types/src/components/BaseProgressCircle.vue.d.ts +37 -37
  93. package/dist/types/src/components/BaseRadioGroup.vue.d.ts +105 -105
  94. package/dist/types/src/components/BaseReadMore.vue.d.ts +21 -21
  95. package/dist/types/src/components/BaseRichText.vue.d.ts +92 -92
  96. package/dist/types/src/components/BaseSelect.vue.d.ts +97 -97
  97. package/dist/types/src/components/BaseShortcut.vue.d.ts +86 -86
  98. package/dist/types/src/components/BaseSideNavigation.vue.d.ts +33 -33
  99. package/dist/types/src/components/BaseSideNavigationItem.vue.d.ts +43 -43
  100. package/dist/types/src/components/BaseSkeleton.vue.d.ts +30 -30
  101. package/dist/types/src/components/BaseStatistic.vue.d.ts +56 -56
  102. package/dist/types/src/components/BaseStepper.vue.d.ts +16 -16
  103. package/dist/types/src/components/BaseStepperItem.vue.d.ts +51 -51
  104. package/dist/types/src/components/BaseSwitch.vue.d.ts +87 -87
  105. package/dist/types/src/components/BaseSystemAlert.vue.d.ts +52 -52
  106. package/dist/types/src/components/BaseTabItem.vue.d.ts +43 -43
  107. package/dist/types/src/components/BaseTable.vue.d.ts +212 -212
  108. package/dist/types/src/components/BaseTableColumn.vue.d.ts +174 -174
  109. package/dist/types/src/components/BaseTabs.vue.d.ts +33 -33
  110. package/dist/types/src/components/BaseTagAutocomplete.vue.d.ts +204 -204
  111. package/dist/types/src/components/BaseTagAutocompleteFetch.vue.d.ts +144 -144
  112. package/dist/types/src/components/BaseTextarea.vue.d.ts +98 -98
  113. package/dist/types/src/components/BaseTextareaAutoresize.vue.d.ts +98 -98
  114. package/dist/types/src/components/BaseTimeline.vue.d.ts +14 -14
  115. package/dist/types/src/components/BaseTimelineItem.vue.d.ts +14 -14
  116. package/dist/types/src/components/SlotComponent.d.ts +43 -43
  117. package/dist/types/src/components/index.d.ts +93 -93
  118. package/dist/types/src/composables/breakpoints.d.ts +27 -27
  119. package/dist/types/src/composables/clickOutside.d.ts +8 -8
  120. package/dist/types/src/composables/field.d.ts +19 -19
  121. package/dist/types/src/composables/hasOptions.d.ts +7 -7
  122. package/dist/types/src/composables/mediaQuery.d.ts +2 -2
  123. package/dist/types/src/composables/modal.d.ts +6 -6
  124. package/dist/types/src/composables/paginatedData.d.ts +7 -7
  125. package/dist/types/src/constants/MyConstants.d.ts +1 -1
  126. package/dist/types/src/constants/index.d.ts +2 -2
  127. package/dist/types/src/i18n/index.d.ts +1 -1
  128. package/dist/types/src/index.d.ts +220 -220
  129. package/dist/types/src/stores/dialogs.d.ts +9 -9
  130. package/dist/types/src/stores/i18n.d.ts +5 -5
  131. package/dist/types/src/stores/notifications.d.ts +10 -10
  132. package/dist/types/src/stores/systemAlerts.d.ts +9 -9
  133. package/dist/types/src/svg/BaseEmptyState.vue.d.ts +2 -2
  134. package/dist/types/src/svg/BaseSpinnerLarge.vue.d.ts +2 -2
  135. package/dist/types/src/svg/BaseSpinnerSmall.vue.d.ts +2 -2
  136. package/dist/types/src/types/Color.d.ts +9 -9
  137. package/dist/types/src/types/Country.d.ts +4 -4
  138. package/dist/types/src/types/ImagePickerResult.d.ts +5 -5
  139. package/dist/types/src/types/Media.d.ts +9 -9
  140. package/dist/types/src/types/Notification.d.ts +8 -8
  141. package/dist/types/src/types/Region.d.ts +5 -5
  142. package/dist/types/src/types/Status.d.ts +5 -5
  143. package/dist/types/src/types/StepperItem.d.ts +7 -7
  144. package/dist/types/src/types/TimelineItem.d.ts +8 -8
  145. package/dist/types/src/types/UploadedFile.d.ts +10 -10
  146. package/dist/types/src/types/User.d.ts +6 -6
  147. package/dist/types/src/types/index.d.ts +218 -218
  148. package/dist/types/src/utils/blob.d.ts +3 -3
  149. package/dist/types/src/utils/colors.d.ts +13 -13
  150. package/dist/types/src/utils/cropper/avatar.d.ts +5 -5
  151. package/dist/types/src/utils/cropper/cover.d.ts +5 -5
  152. package/dist/types/src/utils/cropper/presetInterface.d.ts +7 -7
  153. package/dist/types/src/utils/cropper/presets.d.ts +6 -6
  154. package/dist/types/src/utils/fileSizeFormat.d.ts +1 -1
  155. package/dist/types/src/utils/fileValidations.d.ts +2 -2
  156. package/dist/types/src/utils/index.d.ts +6 -6
  157. package/dist/types/src/utils/resizeImageFromURI.d.ts +1 -1
  158. package/dist/types/src/utils/scrollPreventer.d.ts +3 -3
  159. package/dist/types/src/utils/toHumanList.d.ts +1 -1
  160. package/package.json +139 -139
  161. package/src/assets/form.css +6 -6
  162. package/src/assets/main.css +35 -35
  163. package/src/assets/tailwind.css +2 -2
  164. package/src/components/BaseActionItem.vue +63 -63
  165. package/src/components/BaseActionItemButton.vue +75 -75
  166. package/src/components/BaseAddressForm.stories.js +103 -103
  167. package/src/components/BaseAddressForm.vue +353 -353
  168. package/src/components/BaseAlert.stories.js +52 -52
  169. package/src/components/BaseAlert.vue +152 -152
  170. package/src/components/BaseApp.vue +16 -16
  171. package/src/components/BaseAppDialogs.vue +124 -124
  172. package/src/components/BaseAppNotifications.vue +73 -73
  173. package/src/components/BaseAutocomplete.stories.js +236 -236
  174. package/src/components/BaseAutocomplete.vue +514 -514
  175. package/src/components/BaseAutocompleteDrawer.vue +354 -354
  176. package/src/components/BaseAutocompleteFetch.stories.js +224 -224
  177. package/src/components/BaseAutocompleteFetch.vue +277 -277
  178. package/src/components/BaseAvatar.stories.js +39 -39
  179. package/src/components/BaseAvatar.vue +120 -120
  180. package/src/components/BaseAvatarGroup.stories.js +71 -71
  181. package/src/components/BaseAvatarGroup.vue +148 -148
  182. package/src/components/BaseBadge.stories.js +124 -124
  183. package/src/components/BaseBadge.vue +79 -79
  184. package/src/components/BaseBelongsTo.stories.js +223 -223
  185. package/src/components/BaseBelongsTo.vue +184 -184
  186. package/src/components/BaseBoolean.stories.js +35 -35
  187. package/src/components/BaseBoolean.vue +26 -26
  188. package/src/components/BaseBreadcrumbs.stories.js +45 -45
  189. package/src/components/BaseBreadcrumbs.vue +98 -98
  190. package/src/components/BaseButton.stories.js +88 -88
  191. package/src/components/BaseButton.vue +39 -39
  192. package/src/components/BaseButtonGroup.stories.js +85 -85
  193. package/src/components/BaseButtonGroup.vue +147 -147
  194. package/src/components/BaseCard.stories.js +61 -61
  195. package/src/components/BaseCard.vue +49 -49
  196. package/src/components/BaseCardRow.vue +34 -34
  197. package/src/components/BaseCharacterCounter.stories.js +30 -30
  198. package/src/components/BaseCharacterCounter.vue +61 -61
  199. package/src/components/BaseClickOutside.vue +37 -37
  200. package/src/components/BaseClipboard.stories.js +31 -31
  201. package/src/components/BaseClipboard.vue +96 -96
  202. package/src/components/BaseColor.stories.js +46 -46
  203. package/src/components/BaseColor.vue +151 -151
  204. package/src/components/BaseContainer.stories.js +34 -34
  205. package/src/components/BaseContainer.vue +50 -50
  206. package/src/components/BaseCounter.stories.js +47 -47
  207. package/src/components/BaseCounter.vue +82 -82
  208. package/src/components/BaseCropper.stories.js +113 -113
  209. package/src/components/BaseCropper.vue +446 -446
  210. package/src/components/BaseCropperModal.stories.js +54 -54
  211. package/src/components/BaseCropperModal.vue +140 -140
  212. package/src/components/BaseDataIterator.stories.js +197 -197
  213. package/src/components/BaseDataIterator.vue +784 -777
  214. package/src/components/BaseDataIteratorSectionBox.vue +33 -33
  215. package/src/components/BaseDataIteratorSectionButton.vue +40 -40
  216. package/src/components/BaseDataIteratorSectionColumns.vue +67 -67
  217. package/src/components/BaseDataIteratorSectionModal.vue +41 -41
  218. package/src/components/BaseDataTable.stories.js +341 -341
  219. package/src/components/BaseDataTable.vue +724 -724
  220. package/src/components/BaseDataTableRowAction.vue +28 -28
  221. package/src/components/BaseDatePicker.stories.js +130 -130
  222. package/src/components/BaseDatePicker.vue +374 -374
  223. package/src/components/BaseDateSelect.stories.js +47 -47
  224. package/src/components/BaseDateSelect.vue +209 -209
  225. package/src/components/BaseDescriptionList.stories.js +35 -35
  226. package/src/components/BaseDescriptionList.vue +13 -13
  227. package/src/components/BaseDescriptionListItem.vue +47 -47
  228. package/src/components/BaseDialog.stories.js +51 -51
  229. package/src/components/BaseDialog.vue +119 -119
  230. package/src/components/BaseDisplayRelativeTime.stories.js +59 -59
  231. package/src/components/BaseDisplayRelativeTime.vue +120 -120
  232. package/src/components/BaseDraggable.vue +71 -71
  233. package/src/components/BaseDropdown.stories.js +210 -210
  234. package/src/components/BaseDropdown.vue +269 -269
  235. package/src/components/BaseDropdownAutocomplete.stories.js +187 -187
  236. package/src/components/BaseDropdownAutocomplete.vue +230 -230
  237. package/src/components/BaseField.vue +109 -109
  238. package/src/components/BaseFieldI18n.stories.js +38 -38
  239. package/src/components/BaseFieldI18n.vue +162 -162
  240. package/src/components/BaseFilePicker.stories.js +78 -78
  241. package/src/components/BaseFilePicker.vue +132 -132
  242. package/src/components/BaseFilePickerCrop.stories.js +134 -134
  243. package/src/components/BaseFilePickerCrop.vue +127 -127
  244. package/src/components/BaseFileUploader.stories.js +84 -84
  245. package/src/components/BaseFileUploader.vue +163 -163
  246. package/src/components/BaseForm.stories.js +48 -48
  247. package/src/components/BaseForm.vue +323 -323
  248. package/src/components/BaseHasMany.stories.js +189 -189
  249. package/src/components/BaseHasMany.vue +125 -125
  250. package/src/components/BaseHeader.stories.js +127 -127
  251. package/src/components/BaseHeader.vue +188 -188
  252. package/src/components/BaseIconPicker.stories.js +22 -22
  253. package/src/components/BaseIconPicker.vue +215 -215
  254. package/src/components/BaseInput.stories.js +151 -151
  255. package/src/components/BaseInput.vue +266 -266
  256. package/src/components/BaseInputError.vue +7 -7
  257. package/src/components/BaseInputLabel.stories.js +36 -36
  258. package/src/components/BaseInputLabel.vue +72 -72
  259. package/src/components/BaseInputPercent.stories.js +50 -50
  260. package/src/components/BaseInputPercent.vue +123 -123
  261. package/src/components/BaseLayoutNotificationDropdown.vue +144 -144
  262. package/src/components/BaseLayoutNotificationItem.vue +43 -43
  263. package/src/components/BaseLayoutNotificationItemContent.vue +27 -27
  264. package/src/components/BaseLayoutSidebar.vue +219 -219
  265. package/src/components/BaseLayoutSidebarConfigurable.stories.js +166 -166
  266. package/src/components/BaseLayoutSidebarConfigurable.vue +167 -167
  267. package/src/components/BaseLayoutStacked.vue +52 -52
  268. package/src/components/BaseLayoutStackedConfigurable.stories.js +109 -109
  269. package/src/components/BaseLayoutStackedConfigurable.vue +141 -141
  270. package/src/components/BaseLoadingCover.stories.js +55 -55
  271. package/src/components/BaseLoadingCover.vue +94 -94
  272. package/src/components/BaseMediaGallery.vue +93 -93
  273. package/src/components/BaseMediaGalleryItem.vue +92 -92
  274. package/src/components/BaseMediaItem.stories.js +41 -41
  275. package/src/components/BaseMediaItem.vue +71 -71
  276. package/src/components/BaseMediaLibrary.stories.js +262 -262
  277. package/src/components/BaseMediaLibrary.vue +313 -313
  278. package/src/components/BaseMediaList.vue +68 -68
  279. package/src/components/BaseMediaListItem.vue +172 -172
  280. package/src/components/BaseMediaPictures.vue +64 -64
  281. package/src/components/BaseMediaPicturesItem.vue +94 -94
  282. package/src/components/BaseMediaPreview.stories.js +72 -72
  283. package/src/components/BaseMediaPreview.vue +106 -106
  284. package/src/components/BaseMenu.stories.js +125 -125
  285. package/src/components/BaseMenu.vue +129 -129
  286. package/src/components/BaseMenuItem.vue +107 -107
  287. package/src/components/BaseModalCenter.stories.js +68 -68
  288. package/src/components/BaseModalCenter.vue +125 -125
  289. package/src/components/BaseModalSide.stories.js +55 -55
  290. package/src/components/BaseModalSide.vue +116 -116
  291. package/src/components/BaseNavbar.stories.js +151 -151
  292. package/src/components/BaseNavbar.vue +91 -91
  293. package/src/components/BaseNavbarItem.vue +49 -49
  294. package/src/components/BaseNavbarItemContent.vue +86 -86
  295. package/src/components/BaseNavbarSideItem.vue +111 -111
  296. package/src/components/BaseNavbarSideItemContent.vue +104 -104
  297. package/src/components/BaseNumber.stories.js +66 -66
  298. package/src/components/BaseNumber.vue +366 -366
  299. package/src/components/BasePagination.stories.js +35 -35
  300. package/src/components/BasePagination.vue +266 -266
  301. package/src/components/BasePanel.stories.js +56 -56
  302. package/src/components/BasePanel.vue +39 -39
  303. package/src/components/BasePassword.stories.js +41 -41
  304. package/src/components/BasePassword.vue +88 -88
  305. package/src/components/BaseProgressCircle.stories.js +27 -27
  306. package/src/components/BaseProgressCircle.vue +77 -77
  307. package/src/components/BaseRadioGroup.stories.js +88 -88
  308. package/src/components/BaseRadioGroup.vue +122 -122
  309. package/src/components/BaseReadMore.stories.js +30 -30
  310. package/src/components/BaseReadMore.vue +73 -73
  311. package/src/components/BaseRichText.stories.js +102 -102
  312. package/src/components/BaseRichText.vue +183 -183
  313. package/src/components/BaseSelect.stories.js +118 -118
  314. package/src/components/BaseSelect.vue +220 -220
  315. package/src/components/BaseShortcut.stories.js +102 -102
  316. package/src/components/BaseShortcut.vue +105 -105
  317. package/src/components/BaseSideNavigation.stories.js +80 -80
  318. package/src/components/BaseSideNavigation.vue +29 -29
  319. package/src/components/BaseSideNavigationItem.vue +92 -92
  320. package/src/components/BaseSkeleton.stories.js +36 -36
  321. package/src/components/BaseSkeleton.vue +24 -24
  322. package/src/components/BaseStatistic.stories.js +51 -51
  323. package/src/components/BaseStatistic.vue +98 -98
  324. package/src/components/BaseStepper.stories.js +94 -94
  325. package/src/components/BaseStepper.vue +69 -69
  326. package/src/components/BaseStepperItem.stories.js +65 -65
  327. package/src/components/BaseStepperItem.vue +149 -149
  328. package/src/components/BaseSwitch.stories.js +131 -131
  329. package/src/components/BaseSwitch.vue +209 -209
  330. package/src/components/BaseSystemAlert.stories.js +63 -63
  331. package/src/components/BaseSystemAlert.vue +86 -86
  332. package/src/components/BaseTabItem.vue +93 -93
  333. package/src/components/BaseTable.vue +880 -880
  334. package/src/components/BaseTableColumn.vue +124 -124
  335. package/src/components/BaseTabs.stories.js +85 -85
  336. package/src/components/BaseTabs.vue +73 -73
  337. package/src/components/BaseTagAutocomplete.stories.js +258 -258
  338. package/src/components/BaseTagAutocomplete.vue +428 -428
  339. package/src/components/BaseTagAutocompleteFetch.stories.js +185 -185
  340. package/src/components/BaseTagAutocompleteFetch.vue +206 -206
  341. package/src/components/BaseTextarea.stories.js +43 -43
  342. package/src/components/BaseTextarea.vue +87 -87
  343. package/src/components/BaseTextareaAutoresize.stories.js +58 -58
  344. package/src/components/BaseTextareaAutoresize.vue +140 -140
  345. package/src/components/BaseTimeline.stories.js +53 -53
  346. package/src/components/BaseTimeline.vue +29 -29
  347. package/src/components/BaseTimelineItem.stories.js +78 -78
  348. package/src/components/BaseTimelineItem.vue +79 -79
  349. package/src/components/SlotComponent.ts +37 -37
  350. package/src/components/index.ts +188 -188
  351. package/src/composables/breakpoints.ts +94 -94
  352. package/src/composables/clickOutside.ts +80 -80
  353. package/src/composables/field.ts +117 -117
  354. package/src/composables/hasOptions.ts +68 -68
  355. package/src/composables/mediaQuery.ts +42 -42
  356. package/src/composables/modal.ts +73 -73
  357. package/src/composables/paginatedData.ts +65 -65
  358. package/src/constants/MyConstants.ts +1 -1
  359. package/src/constants/index.ts +5 -5
  360. package/src/env.d.ts +15 -15
  361. package/src/i18n/index.ts +60 -60
  362. package/src/index.ts +111 -111
  363. package/src/lang/en.json +87 -87
  364. package/src/lang/fr.json +87 -87
  365. package/src/stores/dialogs.ts +45 -45
  366. package/src/stores/i18n.ts +14 -14
  367. package/src/stores/notifications.ts +47 -47
  368. package/src/stores/systemAlerts.ts +33 -33
  369. package/src/svg/BaseEmptyState.vue +34 -34
  370. package/src/svg/BaseSpinnerLarge.vue +47 -47
  371. package/src/svg/BaseSpinnerSmall.vue +9 -9
  372. package/src/types/Color.ts +9 -9
  373. package/src/types/Country.ts +4 -4
  374. package/src/types/ImagePickerResult.ts +5 -5
  375. package/src/types/Media.ts +10 -10
  376. package/src/types/Notification.ts +10 -10
  377. package/src/types/Region.ts +5 -5
  378. package/src/types/Status.ts +5 -5
  379. package/src/types/StepperItem.ts +8 -8
  380. package/src/types/TimelineItem.ts +8 -8
  381. package/src/types/UploadedFile.ts +11 -11
  382. package/src/types/User.ts +7 -7
  383. package/src/types/index.ts +267 -267
  384. package/src/utils/blob.ts +30 -30
  385. package/src/utils/colors.ts +200 -200
  386. package/src/utils/cropper/avatar.ts +33 -33
  387. package/src/utils/cropper/cover.ts +41 -41
  388. package/src/utils/cropper/presetInterface.ts +16 -16
  389. package/src/utils/cropper/presets.ts +7 -7
  390. package/src/utils/fileSizeFormat.ts +15 -15
  391. package/src/utils/fileValidations.ts +26 -26
  392. package/src/utils/index.ts +16 -16
  393. package/src/utils/resizeImageFromURI.ts +118 -118
  394. package/src/utils/scrollPreventer.ts +11 -11
  395. package/src/utils/toHumanList.ts +20 -20
@@ -1,514 +1,514 @@
1
- <template>
2
- <div ref="autocomplete">
3
- <div class="relative z-[1]">
4
- <div class="flex">
5
- <select
6
- v-if="select"
7
- v-model="selection"
8
- :disabled="disabled"
9
- class="rounded-l border-r-transparent focus:z-[1] focus:border-r-blue-500 disabled:cursor-not-allowed disabled:text-slate-300 disabled:opacity-100"
10
- :class="[
11
- hasErrorInternal ? 'border-red-600' : 'border-slate-300',
12
- inputSelectClass,
13
- ]"
14
- @change="onSelectChange"
15
- >
16
- <option
17
- v-for="option in select.options"
18
- :key="option.value + ''"
19
- :value="option.value"
20
- >
21
- {{ option.label }}
22
- </option>
23
- </select>
24
- <div class="relative grow">
25
- <input
26
- ref="inputElement"
27
- :value="keywords"
28
- type="text"
29
- :placeholder="
30
- placeholder ? placeholder : t('sui.autocomplete_placeholder')
31
- "
32
- class="relative w-full pr-9 disabled:cursor-not-allowed disabled:text-slate-300"
33
- :class="[
34
- select ? '-left-px rounded-r' : 'rounded',
35
- hasErrorInternal ? 'border-red-600' : 'border-slate-300',
36
- inputSizeClass,
37
- !visibleFocus
38
- ? [
39
- 'focus:ring-0',
40
- hasErrorInternal
41
- ? 'focus:border-red-600'
42
- : 'focus:border-slate-300',
43
- ]
44
- : '',
45
- ]"
46
- autocomplete="off"
47
- :disabled="disabled"
48
- @click="open"
49
- @input="onTextInput"
50
- @keydown="onTextKeydown"
51
- />
52
- <div
53
- class="pointer-events-none absolute top-0 left-0 flex h-full items-center justify-center"
54
- :class="[iconWrapClass]"
55
- >
56
- <BaseIcon
57
- class="text-slate-400"
58
- :class="[iconClass]"
59
- icon="heroicons:magnifying-glass-solid"
60
- />
61
- </div>
62
- </div>
63
- </div>
64
-
65
- <div
66
- v-if="normalizedModelValue && !disabled && showModelValue"
67
- class="absolute top-0 right-0 flex h-full items-center p-1"
68
- >
69
- <button
70
- type="button"
71
- class="group flex h-full items-center rounded p-1.5 enabled:hover:bg-slate-100"
72
- @click="clear()"
73
- >
74
- <BaseIcon
75
- icon="heroicons:x-mark"
76
- class="text-slate-500 group-hover:text-slate-700"
77
- :class="[iconClass]"
78
- />
79
- </button>
80
- </div>
81
- </div>
82
-
83
- <div class="relative">
84
- <div
85
- v-show="opened || dropdownShow == 'always'"
86
- class="w-full overflow-hidden"
87
- :class="[
88
- inline
89
- ? 'relative'
90
- : 'absolute top-1 z-menu min-h-[110px] w-full overflow-hidden rounded border border-slate-300 bg-white shadow-md',
91
- ]"
92
- >
93
- <BaseAutocompleteDrawer
94
- ref="drawer"
95
- :selected="normalizedModelValue"
96
- :options="filteredNormalizedOptions"
97
- :size="size"
98
- :loading="loading"
99
- :loading-bottom="loadingBottom"
100
- :drawer-class="inline ? 'pt-1' : 'p-1'"
101
- :keywords="keywords"
102
- @select="onSelect"
103
- @scroll-bottom="emit('scrollBottom')"
104
- >
105
- <template #empty="emptyProps">
106
- <slot name="empty" v-bind="{ ...emptyProps, ...slotProps }" />
107
- </template>
108
- <template #option="optionProps">
109
- <slot name="option" v-bind="{ ...optionProps, ...slotProps }" />
110
- </template>
111
- <template #footer="footerProps">
112
- <slot name="footer" v-bind="{ ...footerProps, ...slotProps }" />
113
- </template>
114
- </BaseAutocompleteDrawer>
115
- </div>
116
- </div>
117
- </div>
118
- </template>
119
-
120
- <script lang="ts" setup>
121
- import { get } from 'lodash';
122
- import { PropType, ComputedRef } from 'vue';
123
- import { NormalizedOption, Option, OptionValue } from '@/types';
124
- import { useHasOptions } from '@/composables/hasOptions';
125
- import { useField } from '@/composables/field';
126
- import { Icon as BaseIcon } from '@iconify/vue';
127
- import { useClickOutside } from '@/composables/clickOutside';
128
- import BaseAutocompleteDrawer from './BaseAutocompleteDrawer.vue';
129
- import { SelectConfiguration } from '@/types';
130
- import { t } from '@/i18n';
131
-
132
- const props = defineProps({
133
- modelValue: {
134
- default: undefined,
135
- type: [Object, null] as PropType<Option | null | undefined>,
136
- },
137
- options: {
138
- required: true,
139
- type: Array as PropType<Option[]>,
140
- },
141
- labelKey: {
142
- required: true,
143
- type: String,
144
- },
145
- valueKey: {
146
- required: true,
147
- type: String,
148
- },
149
- name: {
150
- default: undefined,
151
- type: String,
152
- },
153
- placeholder: {
154
- default: undefined,
155
- type: String,
156
- },
157
- loading: {
158
- default: false,
159
- type: Boolean,
160
- },
161
- loadingBottom: {
162
- default: false,
163
- type: Boolean,
164
- },
165
- required: {
166
- default: false,
167
- type: Boolean,
168
- },
169
- disabled: {
170
- default: false,
171
- type: Boolean,
172
- },
173
- filter: {
174
- default: undefined,
175
- type: Function as PropType<(option: NormalizedOption) => boolean>,
176
- },
177
- hasError: {
178
- default: false,
179
- type: Boolean,
180
- },
181
- inline: {
182
- default: false,
183
- type: Boolean,
184
- },
185
- size: {
186
- default: 'base',
187
- type: String as PropType<'xs' | 'sm' | 'base'>,
188
- },
189
- dropdownShow: {
190
- default: 'focus',
191
- type: String as PropType<'focus' | 'always'>,
192
- },
193
- showModelValue: {
194
- default: true,
195
- type: Boolean,
196
- },
197
- visibleFocus: {
198
- default: true,
199
- type: Boolean,
200
- },
201
- /** Show an 'empty option', should use with showModelValue = true for better UX */
202
- showEmptyOption: {
203
- default: false,
204
- type: Boolean,
205
- },
206
- emptyOptionLabel: {
207
- default() {
208
- return t('sui.none');
209
- },
210
- type: String,
211
- },
212
- select: {
213
- default: undefined,
214
- type: Object as PropType<SelectConfiguration | undefined>,
215
- },
216
- });
217
-
218
- const emit = defineEmits([
219
- 'update:modelValue',
220
- 'typing',
221
- 'clear',
222
- 'open',
223
- 'close',
224
- 'scrollBottom',
225
- 'select',
226
- ]);
227
-
228
- const { hasErrorInternal, emitUpdate } = useField({
229
- name: computed(() => props.name),
230
- required: computed(() => props.required),
231
- hasError: computed(() => props.hasError),
232
- emit: emit,
233
- });
234
-
235
- const hasOptions = useHasOptions(
236
- computed(() => props.modelValue),
237
- computed(() => props.options),
238
- computed(() => props.labelKey),
239
- computed(() => props.valueKey),
240
- computed(() => false)
241
- );
242
-
243
- const drawer = ref<InstanceType<typeof BaseAutocompleteDrawer> | null>(null);
244
-
245
- let timerId = 0;
246
- const keywords = ref('');
247
- const autocomplete = ref<HTMLElement | null>(null);
248
- const inputElement = ref<HTMLInputElement | null>(null);
249
- const shouldFilter = ref(false);
250
- const opened = ref(false);
251
-
252
- const normalizedOptions = hasOptions.normalizedOptions;
253
- const normalizedModelValue =
254
- hasOptions.normalizedModelValue as ComputedRef<NormalizedOption | null>;
255
-
256
- const filteredNormalizedOptions = computed((): NormalizedOption[] => {
257
- let options = normalizedOptions.value;
258
-
259
- if (props.showEmptyOption) {
260
- const emptyOption = {
261
- [props.valueKey]: null,
262
- [props.labelKey]: props.emptyOptionLabel,
263
- option: null,
264
- };
265
-
266
- options = [
267
- { value: null, label: props.emptyOptionLabel, option: emptyOption },
268
- ...options,
269
- ];
270
- }
271
-
272
- if (shouldFilter.value === false) {
273
- return options;
274
- }
275
-
276
- return options.filter((option) => {
277
- if (props.filter !== undefined) {
278
- return props.filter(option);
279
- }
280
- if (!option.label) {
281
- return false;
282
- }
283
- return option.label.toLowerCase().includes(keywords.value.toLowerCase());
284
- });
285
- });
286
-
287
- // Update the keywords when the model value changes
288
- watch(
289
- () => normalizedModelValue.value,
290
- () => {
291
- if (normalizedModelValue.value) {
292
- if (props.showModelValue) {
293
- setKeywords(normalizedModelValue.value?.label);
294
- }
295
- } else {
296
- if (props.showModelValue) {
297
- if (props.showEmptyOption) {
298
- setKeywords(props.emptyOptionLabel);
299
- } else {
300
- setKeywords('');
301
- }
302
- }
303
- }
304
- },
305
- { immediate: true }
306
- );
307
-
308
- useClickOutside(autocomplete, () => {
309
- close();
310
- });
311
-
312
- function open() {
313
- clearInterval(timerId);
314
- // Always focus as a safety
315
- focus();
316
- // Only emit open if value changes
317
- if (!opened.value) {
318
- opened.value = true;
319
- emit('open');
320
- }
321
- }
322
-
323
- function close() {
324
- shouldFilter.value = false;
325
- opened.value = false;
326
- blur();
327
- timerId = setTimeout(() => {
328
- // If no valid modelValue is set on close, set the keywords to the original value
329
- if (props.showModelValue) {
330
- if (normalizedModelValue.value) {
331
- setKeywords(normalizedModelValue.value.label);
332
- } else {
333
- if (props.showEmptyOption) {
334
- setKeywords(props.emptyOptionLabel);
335
- } else {
336
- setKeywords('');
337
- }
338
- }
339
- }
340
- }, 10);
341
- emit('close');
342
- }
343
-
344
- const onTextInput = (event: Event) => {
345
- open();
346
- shouldFilter.value = true;
347
- setKeywords(get(event, 'target.value') + '');
348
- emit('typing', keywords.value);
349
-
350
- // If keywords is empty, emit null
351
- if (keywords.value == '' && !props.showEmptyOption) {
352
- update(null);
353
- }
354
- };
355
-
356
- const onTextKeydown = (event: KeyboardEvent) => {
357
- const key = event.key;
358
-
359
- drawer.value?.onKeydown(event);
360
-
361
- // Prevent default behavior for up/down arrows
362
-
363
- if (key === 'ArrowUp') {
364
- event.preventDefault();
365
- return;
366
- }
367
-
368
- if (key === 'ArrowDown') {
369
- event.preventDefault();
370
- return;
371
- }
372
- };
373
-
374
- const clear = () => {
375
- update(null);
376
- emit('clear');
377
- };
378
-
379
- function onSelect(normalizedModelValue: Option | null | undefined) {
380
- focus();
381
- update(normalizedModelValue);
382
- if (props.dropdownShow == 'focus') {
383
- close();
384
- }
385
- }
386
-
387
- function update(normalizedSelection: Option | null | undefined) {
388
- // Re-activate filter
389
- shouldFilter.value = false;
390
-
391
- // Emit update
392
- let selection = normalizedSelection ? normalizedSelection.option : null;
393
-
394
- if (
395
- props.showEmptyOption &&
396
- normalizedSelection &&
397
- normalizedSelection.value == null
398
- ) {
399
- selection = null;
400
- }
401
-
402
- emitUpdate(selection);
403
- }
404
-
405
- function setKeywords(input: string) {
406
- keywords.value = input;
407
- }
408
-
409
- function focus() {
410
- inputElement.value?.focus();
411
- }
412
-
413
- function blur() {
414
- inputElement.value?.blur();
415
- }
416
-
417
- function highlight() {
418
- inputElement.value?.select();
419
- }
420
-
421
- const selection = ref<OptionValue>(null);
422
-
423
- watch(
424
- () => props.select,
425
- (select) => {
426
- if (select) {
427
- if (select.option) {
428
- selection.value = select.option.value;
429
- } else if (select.options.length) {
430
- selection.value = select.options[0].value;
431
- }
432
- } else {
433
- selection.value = null;
434
- }
435
- },
436
- { immediate: true }
437
- );
438
-
439
- function onSelectChange(event: Event) {
440
- const value = get(event, 'target.value', null);
441
- const option = props.select?.options.find((option) => option.value == value);
442
-
443
- if (props.select && props.select.onChange) {
444
- props.select.onChange(option ?? null);
445
- }
446
-
447
- emit('select', value);
448
-
449
- // Let the emitted select event propagate before opening the dropdown
450
- nextTick(() => {
451
- focus();
452
- open();
453
- highlight();
454
- });
455
- }
456
-
457
- const slotProps = {
458
- focus,
459
- blur,
460
- open,
461
- close,
462
- keywords: computed(() => keywords.value),
463
- };
464
-
465
- // Element Classes
466
-
467
- const inputSizeClass = computed(() => {
468
- if (props.size == 'xs') {
469
- return 'xs:text-xs xs:pl-7 text-base pl-9';
470
- }
471
- if (props.size == 'sm') {
472
- return 'xs:text-sm xs:pl-8 text-base pl-9';
473
- }
474
- return 'text-base pl-9';
475
- });
476
-
477
- const inputSelectClass = computed(() => {
478
- if (props.size == 'xs') {
479
- return 'xs:text-xs text-base';
480
- }
481
- if (props.size == 'sm') {
482
- return 'xs:text-sm text-base';
483
- }
484
- return 'text-base';
485
- });
486
-
487
- const iconClass = computed(() => {
488
- if (props.size == 'xs') {
489
- return 'xs:h-4 xs:w-4 h-5 w-5';
490
- }
491
- if (props.size == 'sm') {
492
- return 'xs:h-5 xs:w-5 h-5 w-5';
493
- }
494
- return 'h-5 w-5';
495
- });
496
-
497
- const iconWrapClass = computed(() => {
498
- if (props.size == 'xs') {
499
- return 'xs:pl-2 pl-2.5';
500
- }
501
- if (props.size == 'sm') {
502
- return 'xs:pl-2 pl-2.5';
503
- }
504
- return 'pl-2.5';
505
- });
506
-
507
- defineExpose({
508
- focus,
509
- blur,
510
- close,
511
- open,
512
- setKeywords,
513
- });
514
- </script>
1
+ <template>
2
+ <div ref="autocomplete">
3
+ <div class="relative z-[1]">
4
+ <div class="flex">
5
+ <select
6
+ v-if="select"
7
+ v-model="selection"
8
+ :disabled="disabled"
9
+ class="rounded-l border-r-transparent focus:z-[1] focus:border-r-blue-500 disabled:cursor-not-allowed disabled:text-slate-300 disabled:opacity-100"
10
+ :class="[
11
+ hasErrorInternal ? 'border-red-600' : 'border-slate-300',
12
+ inputSelectClass,
13
+ ]"
14
+ @change="onSelectChange"
15
+ >
16
+ <option
17
+ v-for="option in select.options"
18
+ :key="option.value + ''"
19
+ :value="option.value"
20
+ >
21
+ {{ option.label }}
22
+ </option>
23
+ </select>
24
+ <div class="relative grow">
25
+ <input
26
+ ref="inputElement"
27
+ :value="keywords"
28
+ type="text"
29
+ :placeholder="
30
+ placeholder ? placeholder : t('sui.autocomplete_placeholder')
31
+ "
32
+ class="relative w-full pr-9 disabled:cursor-not-allowed disabled:text-slate-300"
33
+ :class="[
34
+ select ? '-left-px rounded-r' : 'rounded',
35
+ hasErrorInternal ? 'border-red-600' : 'border-slate-300',
36
+ inputSizeClass,
37
+ !visibleFocus
38
+ ? [
39
+ 'focus:ring-0',
40
+ hasErrorInternal
41
+ ? 'focus:border-red-600'
42
+ : 'focus:border-slate-300',
43
+ ]
44
+ : '',
45
+ ]"
46
+ autocomplete="off"
47
+ :disabled="disabled"
48
+ @click="open"
49
+ @input="onTextInput"
50
+ @keydown="onTextKeydown"
51
+ />
52
+ <div
53
+ class="pointer-events-none absolute top-0 left-0 flex h-full items-center justify-center"
54
+ :class="[iconWrapClass]"
55
+ >
56
+ <BaseIcon
57
+ class="text-slate-400"
58
+ :class="[iconClass]"
59
+ icon="heroicons:magnifying-glass-solid"
60
+ />
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <div
66
+ v-if="normalizedModelValue && !disabled && showModelValue"
67
+ class="absolute top-0 right-0 flex h-full items-center p-1"
68
+ >
69
+ <button
70
+ type="button"
71
+ class="group flex h-full items-center rounded p-1.5 enabled:hover:bg-slate-100"
72
+ @click="clear()"
73
+ >
74
+ <BaseIcon
75
+ icon="heroicons:x-mark"
76
+ class="text-slate-500 group-hover:text-slate-700"
77
+ :class="[iconClass]"
78
+ />
79
+ </button>
80
+ </div>
81
+ </div>
82
+
83
+ <div class="relative">
84
+ <div
85
+ v-show="opened || dropdownShow == 'always'"
86
+ class="w-full overflow-hidden"
87
+ :class="[
88
+ inline
89
+ ? 'relative'
90
+ : 'absolute top-1 z-menu min-h-[110px] w-full overflow-hidden rounded border border-slate-300 bg-white shadow-md',
91
+ ]"
92
+ >
93
+ <BaseAutocompleteDrawer
94
+ ref="drawer"
95
+ :selected="normalizedModelValue"
96
+ :options="filteredNormalizedOptions"
97
+ :size="size"
98
+ :loading="loading"
99
+ :loading-bottom="loadingBottom"
100
+ :drawer-class="inline ? 'pt-1' : 'p-1'"
101
+ :keywords="keywords"
102
+ @select="onSelect"
103
+ @scroll-bottom="emit('scrollBottom')"
104
+ >
105
+ <template #empty="emptyProps">
106
+ <slot name="empty" v-bind="{ ...emptyProps, ...slotProps }" />
107
+ </template>
108
+ <template #option="optionProps">
109
+ <slot name="option" v-bind="{ ...optionProps, ...slotProps }" />
110
+ </template>
111
+ <template #footer="footerProps">
112
+ <slot name="footer" v-bind="{ ...footerProps, ...slotProps }" />
113
+ </template>
114
+ </BaseAutocompleteDrawer>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </template>
119
+
120
+ <script lang="ts" setup>
121
+ import { get } from 'lodash';
122
+ import { PropType, ComputedRef } from 'vue';
123
+ import { NormalizedOption, Option, OptionValue } from '@/types';
124
+ import { useHasOptions } from '@/composables/hasOptions';
125
+ import { useField } from '@/composables/field';
126
+ import { Icon as BaseIcon } from '@iconify/vue';
127
+ import { useClickOutside } from '@/composables/clickOutside';
128
+ import BaseAutocompleteDrawer from './BaseAutocompleteDrawer.vue';
129
+ import { SelectConfiguration } from '@/types';
130
+ import { t } from '@/i18n';
131
+
132
+ const props = defineProps({
133
+ modelValue: {
134
+ default: undefined,
135
+ type: [Object, null] as PropType<Option | null | undefined>,
136
+ },
137
+ options: {
138
+ required: true,
139
+ type: Array as PropType<Option[]>,
140
+ },
141
+ labelKey: {
142
+ required: true,
143
+ type: String,
144
+ },
145
+ valueKey: {
146
+ required: true,
147
+ type: String,
148
+ },
149
+ name: {
150
+ default: undefined,
151
+ type: String,
152
+ },
153
+ placeholder: {
154
+ default: undefined,
155
+ type: String,
156
+ },
157
+ loading: {
158
+ default: false,
159
+ type: Boolean,
160
+ },
161
+ loadingBottom: {
162
+ default: false,
163
+ type: Boolean,
164
+ },
165
+ required: {
166
+ default: false,
167
+ type: Boolean,
168
+ },
169
+ disabled: {
170
+ default: false,
171
+ type: Boolean,
172
+ },
173
+ filter: {
174
+ default: undefined,
175
+ type: Function as PropType<(option: NormalizedOption) => boolean>,
176
+ },
177
+ hasError: {
178
+ default: false,
179
+ type: Boolean,
180
+ },
181
+ inline: {
182
+ default: false,
183
+ type: Boolean,
184
+ },
185
+ size: {
186
+ default: 'base',
187
+ type: String as PropType<'xs' | 'sm' | 'base'>,
188
+ },
189
+ dropdownShow: {
190
+ default: 'focus',
191
+ type: String as PropType<'focus' | 'always'>,
192
+ },
193
+ showModelValue: {
194
+ default: true,
195
+ type: Boolean,
196
+ },
197
+ visibleFocus: {
198
+ default: true,
199
+ type: Boolean,
200
+ },
201
+ /** Show an 'empty option', should use with showModelValue = true for better UX */
202
+ showEmptyOption: {
203
+ default: false,
204
+ type: Boolean,
205
+ },
206
+ emptyOptionLabel: {
207
+ default() {
208
+ return t('sui.none');
209
+ },
210
+ type: String,
211
+ },
212
+ select: {
213
+ default: undefined,
214
+ type: Object as PropType<SelectConfiguration | undefined>,
215
+ },
216
+ });
217
+
218
+ const emit = defineEmits([
219
+ 'update:modelValue',
220
+ 'typing',
221
+ 'clear',
222
+ 'open',
223
+ 'close',
224
+ 'scrollBottom',
225
+ 'select',
226
+ ]);
227
+
228
+ const { hasErrorInternal, emitUpdate } = useField({
229
+ name: computed(() => props.name),
230
+ required: computed(() => props.required),
231
+ hasError: computed(() => props.hasError),
232
+ emit: emit,
233
+ });
234
+
235
+ const hasOptions = useHasOptions(
236
+ computed(() => props.modelValue),
237
+ computed(() => props.options),
238
+ computed(() => props.labelKey),
239
+ computed(() => props.valueKey),
240
+ computed(() => false)
241
+ );
242
+
243
+ const drawer = ref<InstanceType<typeof BaseAutocompleteDrawer> | null>(null);
244
+
245
+ let timerId = 0;
246
+ const keywords = ref('');
247
+ const autocomplete = ref<HTMLElement | null>(null);
248
+ const inputElement = ref<HTMLInputElement | null>(null);
249
+ const shouldFilter = ref(false);
250
+ const opened = ref(false);
251
+
252
+ const normalizedOptions = hasOptions.normalizedOptions;
253
+ const normalizedModelValue =
254
+ hasOptions.normalizedModelValue as ComputedRef<NormalizedOption | null>;
255
+
256
+ const filteredNormalizedOptions = computed((): NormalizedOption[] => {
257
+ let options = normalizedOptions.value;
258
+
259
+ if (props.showEmptyOption) {
260
+ const emptyOption = {
261
+ [props.valueKey]: null,
262
+ [props.labelKey]: props.emptyOptionLabel,
263
+ option: null,
264
+ };
265
+
266
+ options = [
267
+ { value: null, label: props.emptyOptionLabel, option: emptyOption },
268
+ ...options,
269
+ ];
270
+ }
271
+
272
+ if (shouldFilter.value === false) {
273
+ return options;
274
+ }
275
+
276
+ return options.filter((option) => {
277
+ if (props.filter !== undefined) {
278
+ return props.filter(option);
279
+ }
280
+ if (!option.label) {
281
+ return false;
282
+ }
283
+ return option.label.toLowerCase().includes(keywords.value.toLowerCase());
284
+ });
285
+ });
286
+
287
+ // Update the keywords when the model value changes
288
+ watch(
289
+ () => normalizedModelValue.value,
290
+ () => {
291
+ if (normalizedModelValue.value) {
292
+ if (props.showModelValue) {
293
+ setKeywords(normalizedModelValue.value?.label);
294
+ }
295
+ } else {
296
+ if (props.showModelValue) {
297
+ if (props.showEmptyOption) {
298
+ setKeywords(props.emptyOptionLabel);
299
+ } else {
300
+ setKeywords('');
301
+ }
302
+ }
303
+ }
304
+ },
305
+ { immediate: true }
306
+ );
307
+
308
+ useClickOutside(autocomplete, () => {
309
+ close();
310
+ });
311
+
312
+ function open() {
313
+ clearInterval(timerId);
314
+ // Always focus as a safety
315
+ focus();
316
+ // Only emit open if value changes
317
+ if (!opened.value) {
318
+ opened.value = true;
319
+ emit('open');
320
+ }
321
+ }
322
+
323
+ function close() {
324
+ shouldFilter.value = false;
325
+ opened.value = false;
326
+ blur();
327
+ timerId = setTimeout(() => {
328
+ // If no valid modelValue is set on close, set the keywords to the original value
329
+ if (props.showModelValue) {
330
+ if (normalizedModelValue.value) {
331
+ setKeywords(normalizedModelValue.value.label);
332
+ } else {
333
+ if (props.showEmptyOption) {
334
+ setKeywords(props.emptyOptionLabel);
335
+ } else {
336
+ setKeywords('');
337
+ }
338
+ }
339
+ }
340
+ }, 10);
341
+ emit('close');
342
+ }
343
+
344
+ const onTextInput = (event: Event) => {
345
+ open();
346
+ shouldFilter.value = true;
347
+ setKeywords(get(event, 'target.value') + '');
348
+ emit('typing', keywords.value);
349
+
350
+ // If keywords is empty, emit null
351
+ if (keywords.value == '' && !props.showEmptyOption) {
352
+ update(null);
353
+ }
354
+ };
355
+
356
+ const onTextKeydown = (event: KeyboardEvent) => {
357
+ const key = event.key;
358
+
359
+ drawer.value?.onKeydown(event);
360
+
361
+ // Prevent default behavior for up/down arrows
362
+
363
+ if (key === 'ArrowUp') {
364
+ event.preventDefault();
365
+ return;
366
+ }
367
+
368
+ if (key === 'ArrowDown') {
369
+ event.preventDefault();
370
+ return;
371
+ }
372
+ };
373
+
374
+ const clear = () => {
375
+ update(null);
376
+ emit('clear');
377
+ };
378
+
379
+ function onSelect(normalizedModelValue: Option | null | undefined) {
380
+ focus();
381
+ update(normalizedModelValue);
382
+ if (props.dropdownShow == 'focus') {
383
+ close();
384
+ }
385
+ }
386
+
387
+ function update(normalizedSelection: Option | null | undefined) {
388
+ // Re-activate filter
389
+ shouldFilter.value = false;
390
+
391
+ // Emit update
392
+ let selection = normalizedSelection ? normalizedSelection.option : null;
393
+
394
+ if (
395
+ props.showEmptyOption &&
396
+ normalizedSelection &&
397
+ normalizedSelection.value == null
398
+ ) {
399
+ selection = null;
400
+ }
401
+
402
+ emitUpdate(selection);
403
+ }
404
+
405
+ function setKeywords(input: string) {
406
+ keywords.value = input;
407
+ }
408
+
409
+ function focus() {
410
+ inputElement.value?.focus();
411
+ }
412
+
413
+ function blur() {
414
+ inputElement.value?.blur();
415
+ }
416
+
417
+ function highlight() {
418
+ inputElement.value?.select();
419
+ }
420
+
421
+ const selection = ref<OptionValue>(null);
422
+
423
+ watch(
424
+ () => props.select,
425
+ (select) => {
426
+ if (select) {
427
+ if (select.option) {
428
+ selection.value = select.option.value;
429
+ } else if (select.options.length) {
430
+ selection.value = select.options[0].value;
431
+ }
432
+ } else {
433
+ selection.value = null;
434
+ }
435
+ },
436
+ { immediate: true }
437
+ );
438
+
439
+ function onSelectChange(event: Event) {
440
+ const value = get(event, 'target.value', null);
441
+ const option = props.select?.options.find((option) => option.value == value);
442
+
443
+ if (props.select && props.select.onChange) {
444
+ props.select.onChange(option ?? null);
445
+ }
446
+
447
+ emit('select', value);
448
+
449
+ // Let the emitted select event propagate before opening the dropdown
450
+ nextTick(() => {
451
+ focus();
452
+ open();
453
+ highlight();
454
+ });
455
+ }
456
+
457
+ const slotProps = {
458
+ focus,
459
+ blur,
460
+ open,
461
+ close,
462
+ keywords: computed(() => keywords.value),
463
+ };
464
+
465
+ // Element Classes
466
+
467
+ const inputSizeClass = computed(() => {
468
+ if (props.size == 'xs') {
469
+ return 'xs:text-xs xs:pl-7 text-base pl-9';
470
+ }
471
+ if (props.size == 'sm') {
472
+ return 'xs:text-sm xs:pl-8 text-base pl-9';
473
+ }
474
+ return 'text-base pl-9';
475
+ });
476
+
477
+ const inputSelectClass = computed(() => {
478
+ if (props.size == 'xs') {
479
+ return 'xs:text-xs text-base';
480
+ }
481
+ if (props.size == 'sm') {
482
+ return 'xs:text-sm text-base';
483
+ }
484
+ return 'text-base';
485
+ });
486
+
487
+ const iconClass = computed(() => {
488
+ if (props.size == 'xs') {
489
+ return 'xs:h-4 xs:w-4 h-5 w-5';
490
+ }
491
+ if (props.size == 'sm') {
492
+ return 'xs:h-5 xs:w-5 h-5 w-5';
493
+ }
494
+ return 'h-5 w-5';
495
+ });
496
+
497
+ const iconWrapClass = computed(() => {
498
+ if (props.size == 'xs') {
499
+ return 'xs:pl-2 pl-2.5';
500
+ }
501
+ if (props.size == 'sm') {
502
+ return 'xs:pl-2 pl-2.5';
503
+ }
504
+ return 'pl-2.5';
505
+ });
506
+
507
+ defineExpose({
508
+ focus,
509
+ blur,
510
+ close,
511
+ open,
512
+ setKeywords,
513
+ });
514
+ </script>