sprintify-ui 0.2.18 → 0.2.21

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