@bildvitta/quasar-ui-asteroid 3.17.0-beta.20 → 3.17.0-beta.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 (315) hide show
  1. package/package.json +1 -1
  2. package/src/assets/sounds/nave-notification.mp3 +0 -0
  3. package/src/asteroid.js +4 -4
  4. package/src/components/actions/QasActions.vue +81 -81
  5. package/src/components/actions/QasActions.yml +34 -34
  6. package/src/components/actions-menu/QasActionsMenu.vue +251 -251
  7. package/src/components/actions-menu/QasActionsMenu.yml +89 -89
  8. package/src/components/actions-menu/composables/use-delete.js +30 -30
  9. package/src/components/actions-menu/composables/use-double-split-actions.js +42 -42
  10. package/src/components/actions-menu/composables/use-options-actions.js +27 -27
  11. package/src/components/actions-menu/composables/use-single-action.js +17 -17
  12. package/src/components/actions-menu/composables/use-single-split-actions.js +35 -35
  13. package/src/components/actions-menu/composables/use-tooltips.js +43 -43
  14. package/src/components/actions-menu/utils/get-label.js +3 -3
  15. package/src/components/actions-menu/utils/set-click-handler.js +6 -6
  16. package/src/components/alert/QasAlert.test.js +43 -43
  17. package/src/components/alert/QasAlert.vue +110 -110
  18. package/src/components/alert/QasAlert.yml +39 -39
  19. package/src/components/app-bar/QasAppBar.vue +119 -119
  20. package/src/components/app-bar/QasAppBar.yml +44 -44
  21. package/src/components/app-menu/QasAppMenu.vue +392 -392
  22. package/src/components/app-menu/QasAppMenu.yml +73 -73
  23. package/src/components/app-menu/composables/use-app-menu-dropdown.js +71 -71
  24. package/src/components/app-menu/composables/use-app-user.js +49 -49
  25. package/src/components/app-menu/composables/use-development-badge.js +23 -23
  26. package/src/components/app-menu/private/PvAppMenuDropdown.vue +71 -71
  27. package/src/components/app-menu/private/PvAppMenuHelpChat.vue +222 -222
  28. package/src/components/app-user/QasAppUser.vue +281 -281
  29. package/src/components/app-user/QasAppUser.yml +56 -56
  30. package/src/components/avatar/QasAvatar.vue +95 -95
  31. package/src/components/avatar/QasAvatar.yml +38 -38
  32. package/src/components/avatar/enums/AvatarColors.js +10 -10
  33. package/src/components/badge/QasBadge.vue +87 -87
  34. package/src/components/badge/QasBadge.yml +55 -55
  35. package/src/components/board-generator/QasBoardGenerator.vue +712 -712
  36. package/src/components/board-generator/QasBoardGenerator.yml +167 -167
  37. package/src/components/box/QasBox.vue +51 -51
  38. package/src/components/box/QasBox.yml +29 -29
  39. package/src/components/breakline/QasBreakline.vue +38 -38
  40. package/src/components/breakline/QasBreakline.yml +25 -25
  41. package/src/components/btn/QasBtn.vue +148 -148
  42. package/src/components/btn/QasBtn.yml +48 -48
  43. package/src/components/btn-dropdown/QasBtnDropdown.vue +146 -146
  44. package/src/components/btn-dropdown/QasBtnDropdown.yml +59 -59
  45. package/src/components/card/QasCard.vue +132 -132
  46. package/src/components/card/QasCard.yml +44 -44
  47. package/src/components/card-image/QasCardImage.vue +95 -95
  48. package/src/components/card-image/QasCardImage.yml +48 -48
  49. package/src/components/chart-view/QasChartView.vue +441 -441
  50. package/src/components/chart-view/QasChartView.yml +109 -109
  51. package/src/components/chart-view/config/charts/bar.js +45 -45
  52. package/src/components/chart-view/config/charts/doughnut.js +43 -43
  53. package/src/components/chart-view/config/charts/index.js +9 -9
  54. package/src/components/chart-view/config/charts/line.js +57 -57
  55. package/src/components/chart-view/config/defaults/colors.js +19 -19
  56. package/src/components/chart-view/config/defaults/font.js +5 -5
  57. package/src/components/chart-view/config/defaults/index.js +2 -2
  58. package/src/components/chart-view/config/index.js +3 -3
  59. package/src/components/chart-view/config/plugins/index.js +3 -3
  60. package/src/components/chart-view/config/plugins/legend.js +9 -9
  61. package/src/components/chart-view/config/plugins/tooltip.js +15 -15
  62. package/src/components/chart-view/config/plugins/zoom.js +31 -31
  63. package/src/components/checkbox/QasCheckbox.vue +150 -150
  64. package/src/components/checkbox/QasCheckbox.yml +36 -36
  65. package/src/components/copy/QasCopy.vue +46 -46
  66. package/src/components/copy/QasCopy.yml +23 -23
  67. package/src/components/date/QasDate.vue +600 -600
  68. package/src/components/date/QasDate.yml +69 -69
  69. package/src/components/date/enums/DateMaskOptions.js +6 -6
  70. package/src/components/date-time-input/QasDateTimeInput.vue +269 -269
  71. package/src/components/date-time-input/QasDateTimeInput.yml +64 -64
  72. package/src/components/debugger/QasDebugger.vue +31 -31
  73. package/src/components/debugger/QasDebugger.yml +10 -10
  74. package/src/components/delete/QasDelete.vue +100 -100
  75. package/src/components/delete/QasDelete.yml +60 -60
  76. package/src/components/dialog/QasDialog.vue +217 -217
  77. package/src/components/dialog/QasDialog.yml +117 -117
  78. package/src/components/dialog/composables/use-cancel.js +40 -40
  79. package/src/components/dialog/composables/use-dynamic-components.js +86 -86
  80. package/src/components/dialog/composables/use-ok.js +45 -45
  81. package/src/components/dialog-router/QasDialogRouter.vue +86 -86
  82. package/src/components/dialog-router/QasDialogRouter.yml +23 -23
  83. package/src/components/drawer/QasDrawer.vue +118 -118
  84. package/src/components/drawer/QasDrawer.yml +58 -58
  85. package/src/components/empty-result-text/QasEmptyResultText.vue +18 -18
  86. package/src/components/empty-result-text/QasEmptyResultText.yml +14 -14
  87. package/src/components/expansion-item/QasExpansionItem.vue +291 -291
  88. package/src/components/expansion-item/QasExpansionItem.yml +76 -76
  89. package/src/components/field/QasField.vue +220 -220
  90. package/src/components/field/QasField.yml +36 -36
  91. package/src/components/filters/QasFilters.vue +472 -472
  92. package/src/components/filters/QasFilters.yml +171 -171
  93. package/src/components/filters/private/PvFiltersButton.vue +101 -101
  94. package/src/components/form-generator/QasFormGenerator.vue +274 -274
  95. package/src/components/form-generator/QasFormGenerator.yml +109 -109
  96. package/src/components/form-view/QasFormView.vue +484 -484
  97. package/src/components/form-view/QasFormView.yml +253 -253
  98. package/src/components/gallery/QasGallery.vue +243 -243
  99. package/src/components/gallery/QasGallery.yml +188 -188
  100. package/src/components/gallery/composables/use-delete.js +54 -54
  101. package/src/components/gallery/private/PvGalleryCarouselDialog.vue +92 -92
  102. package/src/components/gallery/private/PvGalleryDeleteDialog.vue +54 -54
  103. package/src/components/gallery-card/QasGalleryCard.vue +153 -153
  104. package/src/components/gallery-card/QasGalleryCard.yml +61 -61
  105. package/src/components/grabbable/QasGrabbable.vue +185 -185
  106. package/src/components/grabbable/QasGrabbable.yml +26 -26
  107. package/src/components/grid-generator/QasGridGenerator.vue +210 -210
  108. package/src/components/grid-generator/QasGridGenerator.yml +127 -127
  109. package/src/components/grid-item/QasGridItem.vue +89 -89
  110. package/src/components/grid-item/QasGridItem.yml +22 -22
  111. package/src/components/header/QasHeader.vue +152 -152
  112. package/src/components/header/QasHeader.yml +50 -50
  113. package/src/components/infinite-scroll/QasInfiniteScroll.vue +168 -168
  114. package/src/components/infinite-scroll/QasInfiniteScroll.yml +78 -78
  115. package/src/components/info/QasInfo.vue +155 -155
  116. package/src/components/info/QasInfo.yml +34 -34
  117. package/src/components/input/QasInput.vue +252 -252
  118. package/src/components/input/QasInput.yml +65 -65
  119. package/src/components/label/QasLabel.vue +61 -61
  120. package/src/components/label/QasLabel.yml +44 -44
  121. package/src/components/layout/QasLayout.vue +101 -101
  122. package/src/components/layout/QasLayout.yml +46 -46
  123. package/src/components/layout/private/PvLayoutNotificationCard.vue +86 -86
  124. package/src/components/layout/private/PvLayoutNotificationsDrawer.vue +140 -140
  125. package/src/components/list-items/QasListItems.vue +125 -125
  126. package/src/components/list-items/QasListItems.yml +71 -71
  127. package/src/components/list-view/QasListView.vue +302 -302
  128. package/src/components/list-view/QasListView.yml +169 -169
  129. package/src/components/map/QasMap.vue +75 -75
  130. package/src/components/map/QasMap.yml +33 -33
  131. package/src/components/nested-fields/QasNestedFields.vue +584 -584
  132. package/src/components/nested-fields/QasNestedFields.yml +296 -296
  133. package/src/components/numeric-input/QasNumericInput.vue +206 -206
  134. package/src/components/numeric-input/QasNumericInput.yml +85 -85
  135. package/src/components/option-group/QasOptionGroup.vue +54 -54
  136. package/src/components/option-group/QasOptionGroup.yml +30 -30
  137. package/src/components/page-header/QasPageHeader.vue +143 -143
  138. package/src/components/page-header/QasPageHeader.yml +42 -42
  139. package/src/components/pagination/QasPagination.vue +71 -71
  140. package/src/components/pagination/QasPagination.yml +4 -4
  141. package/src/components/password-input/QasPasswordInput.vue +110 -110
  142. package/src/components/password-input/QasPasswordInput.yml +111 -111
  143. package/src/components/password-strength-checker/QasPasswordStrengthChecker.vue +71 -71
  144. package/src/components/password-strength-checker/QasPasswordStrengthChecker.yml +103 -103
  145. package/src/components/profile/QasProfile.vue +98 -98
  146. package/src/components/profile/QasProfile.yml +60 -60
  147. package/src/components/radio/QasRadio.vue +62 -62
  148. package/src/components/radio/QasRadio.yml +11 -11
  149. package/src/components/resizer/QasResizer.vue +90 -90
  150. package/src/components/resizer/QasResizer.yml +24 -24
  151. package/src/components/search-box/QasSearchBox.vue +294 -294
  152. package/src/components/search-box/QasSearchBox.yml +154 -154
  153. package/src/components/search-input/QasSearchInput.vue +106 -106
  154. package/src/components/search-input/QasSearchInput.yml +48 -48
  155. package/src/components/select/QasSelect.vue +514 -514
  156. package/src/components/select/QasSelect.yml +157 -157
  157. package/src/components/select-list/QasSelectList.vue +238 -238
  158. package/src/components/select-list/QasSelectList.yml +108 -108
  159. package/src/components/select-list/private/PvSelectListCheckbox.vue +31 -31
  160. package/src/components/select-list-dialog/QasSelectListDialog.vue +395 -395
  161. package/src/components/select-list-dialog/QasSelectListDialog.yml +108 -108
  162. package/src/components/signature-pad/QasSignaturePad.vue +122 -122
  163. package/src/components/signature-pad/QasSignaturePad.yml +53 -53
  164. package/src/components/signature-uploader/QasSignatureUploader.vue +164 -164
  165. package/src/components/signature-uploader/QasSignatureUploader.yml +37 -37
  166. package/src/components/single-view/QasSingleView.vue +175 -175
  167. package/src/components/single-view/QasSingleView.yml +131 -131
  168. package/src/components/sortable/QasSortable.vue +151 -151
  169. package/src/components/sortable/QasSortable.yml +65 -65
  170. package/src/components/status/QasStatus.test.js +11 -11
  171. package/src/components/status/QasStatus.vue +29 -29
  172. package/src/components/status/QasStatus.yml +10 -10
  173. package/src/components/stepper/QasStepper.vue +152 -152
  174. package/src/components/stepper/QasStepper.yml +35 -35
  175. package/src/components/stepper-form-view/QasStepperFormView.vue +84 -84
  176. package/src/components/stepper-form-view/QasStepperFormView.yml +58 -58
  177. package/src/components/table-generator/QasTableGenerator.vue +416 -416
  178. package/src/components/table-generator/QasTableGenerator.yml +94 -94
  179. package/src/components/tabs-generator/QasTabsGenerator.vue +196 -196
  180. package/src/components/tabs-generator/QasTabsGenerator.yml +53 -53
  181. package/src/components/text-truncate/QasTextTruncate.vue +274 -274
  182. package/src/components/text-truncate/QasTextTruncate.yml +60 -60
  183. package/src/components/timeline/QasTimeline.vue +140 -140
  184. package/src/components/timeline/QasTimeline.yml +36 -36
  185. package/src/components/toggle/QasToggle.vue +14 -14
  186. package/src/components/toggle/QasToggle.yml +5 -5
  187. package/src/components/toggle-visibility/QasToggleVisibility.vue +79 -79
  188. package/src/components/toggle-visibility/QasToggleVisibility.yml +30 -30
  189. package/src/components/transfer/QasTransfer.vue +239 -239
  190. package/src/components/transfer/QasTransfer.yml +60 -60
  191. package/src/components/tree-generator/QasTreeForm.vue +62 -62
  192. package/src/components/tree-generator/QasTreeGenerator.vue +488 -488
  193. package/src/components/tree-generator/QasTreeGenerator.yml +81 -81
  194. package/src/components/uploader/QasUploader.vue +645 -645
  195. package/src/components/uploader/QasUploader.yml +192 -192
  196. package/src/components/uploader/private/PvUploaderGalleryCard.vue +357 -357
  197. package/src/components/welcome/QasWelcome.vue +125 -125
  198. package/src/components/welcome/QasWelcome.yml +23 -23
  199. package/src/components/welcome/private/PvWelcomeShortcutCard.vue +58 -58
  200. package/src/components/whatsapp-link/QasWhatsappLink.vue +34 -34
  201. package/src/components/whatsapp-link/QasWhatsappLink.yml +18 -18
  202. package/src/composables/index.js +8 -8
  203. package/src/composables/private/index.js +3 -3
  204. package/src/composables/private/use-generator.js +174 -174
  205. package/src/composables/private/use-toggle-visibility.js +48 -48
  206. package/src/composables/private/use-view.js +186 -186
  207. package/src/composables/use-context.js +15 -15
  208. package/src/composables/use-form.js +32 -32
  209. package/src/composables/use-history.js +46 -46
  210. package/src/composables/use-notifications.js +128 -114
  211. package/src/composables/use-query-cache.js +60 -60
  212. package/src/composables/use-screen.js +42 -42
  213. package/src/css/base/font-face.scss +28 -28
  214. package/src/css/base/index.scss +1 -1
  215. package/src/css/components/base.scss +12 -12
  216. package/src/css/components/button.scss +116 -116
  217. package/src/css/components/checkbox.scss +14 -14
  218. package/src/css/components/editor.scss +7 -7
  219. package/src/css/components/field.scss +88 -88
  220. package/src/css/components/index.scss +10 -10
  221. package/src/css/components/item.scss +52 -52
  222. package/src/css/components/radio.scss +18 -18
  223. package/src/css/components/scrollbar.scss +20 -20
  224. package/src/css/components/tabs.scss +3 -3
  225. package/src/css/components/toggle.scss +13 -13
  226. package/src/css/mixins/index.scss +3 -3
  227. package/src/css/mixins/set-brand.scss +15 -15
  228. package/src/css/mixins/set-button.scss +26 -26
  229. package/src/css/mixins/set-typography.scss +8 -8
  230. package/src/css/plugins/index.scss +2 -2
  231. package/src/css/plugins/loading.scss +5 -5
  232. package/src/css/plugins/notify.scss +100 -100
  233. package/src/css/utils/background.scss +34 -34
  234. package/src/css/utils/border-radius.scss +29 -29
  235. package/src/css/utils/border.scss +42 -42
  236. package/src/css/utils/container.scss +36 -36
  237. package/src/css/utils/fonts.scss +5 -5
  238. package/src/css/utils/index.scss +10 -10
  239. package/src/css/utils/line-height.scss +19 -19
  240. package/src/css/utils/opacity.scss +5 -5
  241. package/src/css/utils/scroll.scss +21 -21
  242. package/src/css/utils/text.scss +15 -15
  243. package/src/css/utils/unset.scss +8 -8
  244. package/src/css/variables/button.scss +4 -4
  245. package/src/css/variables/index.scss +6 -6
  246. package/src/css/variables/scrollbar.scss +11 -11
  247. package/src/css/variables/separator.scss +2 -2
  248. package/src/css/variables/shadow.scss +3 -3
  249. package/src/css/variables/spacing.scss +98 -98
  250. package/src/css/variables/typography.scss +149 -149
  251. package/src/directives/Test.js +13 -13
  252. package/src/enums/Align.js +7 -7
  253. package/src/enums/Spacing.js +98 -98
  254. package/src/enums/Status.js +33 -33
  255. package/src/helpers/add-counter-suffix.js +3 -3
  256. package/src/helpers/base-64-to-blob.js +21 -21
  257. package/src/helpers/camelize-fields-name.js +15 -15
  258. package/src/helpers/construct-object.js +29 -29
  259. package/src/helpers/copy-to-clipboard.js +15 -15
  260. package/src/helpers/destroy-nested-children-by-key.js +33 -33
  261. package/src/helpers/download-file.js +21 -21
  262. package/src/helpers/filter-list-by-handle.js +31 -31
  263. package/src/helpers/filter-object-to-array.js +29 -29
  264. package/src/helpers/filter-object.js +34 -34
  265. package/src/helpers/filters.js +163 -163
  266. package/src/helpers/find-children-by-key.js +14 -14
  267. package/src/helpers/get-greatest-common-divisor.js +16 -16
  268. package/src/helpers/get-normalized-options.js +20 -20
  269. package/src/helpers/get-placeholder.js +19 -19
  270. package/src/helpers/get-required-label.js +3 -3
  271. package/src/helpers/get-slot-children-text.js +15 -15
  272. package/src/helpers/handle-process.js +13 -13
  273. package/src/helpers/images.js +28 -28
  274. package/src/helpers/index.js +25 -25
  275. package/src/helpers/is-empty.js +3 -3
  276. package/src/helpers/is-local-development.js +3 -3
  277. package/src/helpers/private/gutter-validator.js +15 -15
  278. package/src/helpers/private/has-parent-by-class-name.js +15 -15
  279. package/src/helpers/promise-handler.js +40 -40
  280. package/src/helpers/rules.js +7 -7
  281. package/src/helpers/set-scroll-on-grab.js +128 -128
  282. package/src/index.cjs.js +1 -1
  283. package/src/index.esm.js +4 -4
  284. package/src/index.scss +38 -38
  285. package/src/index.umd.js +2 -2
  286. package/src/mixins/context.js +8 -8
  287. package/src/mixins/delete.js +48 -48
  288. package/src/mixins/dialog-router.js +17 -17
  289. package/src/mixins/form.js +11 -11
  290. package/src/mixins/generator.js +94 -94
  291. package/src/mixins/index.js +17 -17
  292. package/src/mixins/password.js +86 -86
  293. package/src/mixins/search-filter.js +354 -354
  294. package/src/mixins/view.js +156 -156
  295. package/src/pages/ErrorComponent.vue +74 -74
  296. package/src/pages/Forbidden.vue +29 -29
  297. package/src/pages/NotFound.vue +29 -29
  298. package/src/pages/ServerError.vue +29 -29
  299. package/src/pages/Unauthorized.vue +29 -29
  300. package/src/plugins/delete/Delete.js +107 -107
  301. package/src/plugins/delete/Delete.yml +75 -75
  302. package/src/plugins/dialog/Dialog.js +14 -14
  303. package/src/plugins/dialog/Dialog.yml +10 -10
  304. package/src/plugins/index.js +13 -13
  305. package/src/plugins/notify-error/NotifyError.js +13 -13
  306. package/src/plugins/notify-error/NotifyError.yml +11 -11
  307. package/src/plugins/notify-success/NotifySuccess.js +13 -13
  308. package/src/plugins/notify-success/NotifySuccess.yml +11 -11
  309. package/src/plugins/screen/Screen.js +35 -35
  310. package/src/plugins/screen/Screen.yml +16 -16
  311. package/src/shared/date-config.js +26 -26
  312. package/src/shared/fuse-config.js +4 -4
  313. package/src/shared/notify-config.js +7 -7
  314. package/src/vue-plugin/third-party-component-handler.js +29 -29
  315. package/src/vue-plugin.js +282 -282
@@ -1,514 +1,514 @@
1
- <template>
2
- <q-select v-model="model" v-bind="attributes" class="qas-select" :class="componentClasses" no-error-icon>
3
- <template v-if="hasIcon" #prepend>
4
- <q-icon :name="defaultIcon" />
5
- </template>
6
-
7
- <template #no-option>
8
- <slot v-if="!mx_isFetching" name="no-option">
9
- <q-item>
10
- <q-item-section class="text-grey">
11
- {{ noOptionLabel }}
12
- </q-item-section>
13
- </q-item>
14
- </slot>
15
- </template>
16
-
17
- <template #after-options>
18
- <slot v-if="mx_isFetching" name="after-options">
19
- <div class="flex justify-center q-pb-sm">
20
- <q-spinner-dots color="primary" size="20px" />
21
- </div>
22
- </slot>
23
- </template>
24
-
25
- <template v-if="attributes.useChips" #selected-item="{ opt, tabindex, index, removeAtIndex }">
26
- <qas-badge removable :tabindex @remove="removeAtIndex(index)">
27
- <div class="ellipsis" :title="opt.label">
28
- {{ opt.label }}
29
- </div>
30
- </qas-badge>
31
- </template>
32
-
33
- <template v-if="useCustomOptions" #option="scope">
34
- <q-item v-bind="scope.itemProps" class="qas-select__option">
35
- <q-item-section>
36
- <div class="items-center q-gutter-x-sm row">
37
- <q-item-label>
38
- {{ scope.opt.label }}
39
- </q-item-label>
40
-
41
- <div v-for="(badge, index) in getFilteredBadgeList(scope.opt)" :key="index">
42
- <qas-badge v-if="hasBadge(badge)" v-bind="getBadgeProps(badge)" />
43
- </div>
44
- </div>
45
-
46
- <div v-if="scope.opt.caption">
47
- <div class="items-center q-col-gutter-x-sm row">
48
- <q-item-label v-for="(caption, index) in getCaptionArray(scope.opt.caption)" :key="index" caption class="items-center q-mt-xs row">
49
- <div>
50
- {{ caption }}
51
- </div>
52
-
53
- <q-separator v-if="hasSeparator({ caption: getCaptionArray(scope.opt.caption), index })" class="q-ml-sm" vertical />
54
- </q-item-label>
55
- </div>
56
- </div>
57
- </q-item-section>
58
- </q-item>
59
- </template>
60
-
61
- <template v-for="(_, name) in $slots" #[name]="context">
62
- <slot :name="name" v-bind="context || {}" />
63
- </template>
64
- </q-select>
65
- </template>
66
-
67
- <script>
68
- import { getRequiredLabel } from '../../helpers'
69
- import { searchFilterMixin } from '../../mixins'
70
- import fuseConfig from '../../shared/fuse-config'
71
-
72
- import { uid } from 'quasar'
73
- import Fuse from 'fuse.js'
74
-
75
- export default {
76
- name: 'QasSelect',
77
-
78
- mixins: [searchFilterMixin],
79
-
80
- inject: {
81
- isBox: { default: false },
82
- isDialog: { default: false }
83
- },
84
-
85
- props: {
86
- badgeProps: {
87
- default: () => ({}),
88
- type: Object
89
- },
90
-
91
- fuseOptions: {
92
- default: () => ({}),
93
- type: Object
94
- },
95
-
96
- icon: {
97
- type: String,
98
- default: ''
99
- },
100
-
101
- label: {
102
- type: String,
103
- default: ''
104
- },
105
-
106
- modelValue: {
107
- default: () => [],
108
- type: [Array, Object, String, Number, Boolean]
109
- },
110
-
111
- noOptionLabel: {
112
- default: 'Nenhum resultado foi encontrado.',
113
- type: String
114
- },
115
-
116
- options: {
117
- default: () => [],
118
- type: Array
119
- },
120
-
121
- required: {
122
- type: Boolean
123
- },
124
-
125
- useAutoSelect: {
126
- type: Boolean
127
- },
128
-
129
- useCustomOptions: {
130
- type: Boolean
131
- },
132
-
133
- useFetchOptionsOnCreate: {
134
- default: true,
135
- type: Boolean
136
- },
137
-
138
- useFetchOptionsOnFocus: {
139
- type: Boolean
140
- },
141
-
142
- useSearch: {
143
- type: Boolean,
144
- default: undefined
145
- },
146
-
147
- useFilterMode: {
148
- type: Boolean
149
- }
150
- },
151
-
152
- emits: ['popup-hide', 'popup-show', 'update:modelValue', 'virtual-scroll'],
153
-
154
- data () {
155
- return {
156
- fuse: null,
157
- isPopupContentOpen: false
158
- }
159
- },
160
-
161
- computed: {
162
- attributes () {
163
- return {
164
- clearable: this.isSearchable,
165
- emitValue: true,
166
- mapOptions: true,
167
- outlined: this.useFilterMode,
168
- dense: true,
169
- dropdownIcon: 'sym_r_expand_more',
170
- clearIcon: 'sym_r_close',
171
- popupContentClass: `qas-select__menu ${this.popupContentClass}`,
172
- useChips: this.isMultiple && this.isPopupContentOpen,
173
-
174
- ...this.$attrs,
175
-
176
- label: this.formattedLabel,
177
- error: this.hasError,
178
- inputDebounce: this.useLazyLoading ? 1200 : 0,
179
- loading: this.hasLoading,
180
- options: this.mx_filteredOptions,
181
- useInput: this.isSearchable,
182
-
183
- ...(this.isSearchable && { onFilter: this.onFilter }),
184
-
185
- onPopupHide: this.onPopupHide,
186
- onPopupShow: this.onPopupShow,
187
-
188
- ...(this.useLazyLoading && { onVirtualScroll: this.mx_onVirtualScroll })
189
- }
190
- },
191
-
192
- defaultFuseOptions () {
193
- return {
194
- ...fuseConfig,
195
- keys: ['label', 'value'],
196
-
197
- ...this.fuseOptions
198
- }
199
- },
200
-
201
- isSearchable () {
202
- return this.hasFuse || this.useLazyLoading
203
- },
204
-
205
- isBordered () {
206
- return (this.isBox || this.isDialog) && this.useFilterMode
207
- },
208
-
209
- hasError () {
210
- return this.mx_hasFetchError || this.$attrs.error
211
- },
212
-
213
- hasLoading () {
214
- return this.mx_isFetching || this.$attrs.loading
215
- },
216
-
217
- hasFuse () {
218
- // se for "undefined" (default) cai na logica por quantidade da option
219
- if (this.useSearch === false) return false
220
-
221
- /*
222
- * quantidade de option que precisa ter para o fuse funcionar automaticamente
223
- * sem necessidade de passar prop manualmente
224
- */
225
- const autoFuseQuantity = 10
226
- const hasAutoFuseSearch = this.options.length >= autoFuseQuantity && !this.useLazyLoading
227
-
228
- return hasAutoFuseSearch
229
- },
230
-
231
- model: {
232
- get () {
233
- return this.modelValue
234
- },
235
-
236
- set (value) {
237
- this.$emit('update:modelValue', value)
238
- }
239
- },
240
-
241
- popupContentClass () {
242
- return `qas-select__popup-content-${uid()}`
243
- },
244
-
245
- formattedLabel () {
246
- return getRequiredLabel({ label: this.label, required: this.required })
247
- },
248
-
249
- canSetDefaultOption () {
250
- return (this.required || this.useAutoSelect) && this.options.length === 1 && !this.modelValue
251
- },
252
-
253
- // redesign
254
- componentClasses () {
255
- return {
256
- ...(this.useFilterMode && {
257
- 'qas-select--filter rounded-borders': true,
258
- 'shadow-2': !this.isBordered,
259
- bordered: this.isBordered
260
- }),
261
-
262
- 'qas-select--has-icon': this.hasAppend || this.hasIcon,
263
- 'qas-select--closed': !this.isPopupContentOpen,
264
- 'qas-select--loading': this.hasLoading
265
- }
266
- },
267
-
268
- isDisabled () {
269
- return this.$attrs.disable || this.$attrs.disable === ''
270
- },
271
-
272
- isMultiple () {
273
- return this.$attrs.multiple || this.$attrs.multiple === ''
274
- },
275
-
276
- hasAppend () {
277
- return !!this.$slots.append
278
- },
279
-
280
- defaultIcon () {
281
- return this.icon || 'sym_r_search'
282
- },
283
-
284
- hasIcon () {
285
- return this.isSearchable || !!this.icon
286
- }
287
- },
288
-
289
- watch: {
290
- defaultFuseOptions () {
291
- if (this.hasFuse) this.setFuse()
292
- },
293
-
294
- mx_isFetching (value) {
295
- if (!this.isPopupContentOpen || !this.useLazyLoading) return
296
-
297
- this.togglePopupContentClass(value)
298
- },
299
-
300
- required () {
301
- if (!this.canSetDefaultOption) return
302
-
303
- this.setDefaultOption()
304
- },
305
-
306
- options: {
307
- handler () {
308
- if (this.useLazyLoading && this.mx_hasFilteredOptions) return
309
-
310
- if (this.fuse || this.hasFuse) this.setFuse()
311
-
312
- if (this.canSetDefaultOption) this.setDefaultOption()
313
-
314
- this.mx_filteredOptions = [...this.options]
315
- },
316
-
317
- deep: true,
318
- immediate: true
319
- }
320
- },
321
-
322
- created () {
323
- this.setSearchMethod()
324
- },
325
-
326
- methods: {
327
- setFuse () {
328
- this.fuse = new Fuse(this.options, this.defaultFuseOptions)
329
- },
330
-
331
- async onFilter (value, update) {
332
- if (this.useLazyLoading && value !== this.mx_search) {
333
- await this.mx_filterOptionsByStore(value)
334
- }
335
-
336
- if (!this.useLazyLoading && this.hasFuse) {
337
- this.filterOptionsByFuse(value)
338
- }
339
-
340
- update()
341
- },
342
-
343
- filterOptionsByFuse (value) {
344
- if (value === '') {
345
- this.mx_filteredOptions = this.options
346
- return
347
- }
348
-
349
- const results = this.fuse.search(value)
350
-
351
- this.mx_filteredOptions = this.mx_getNormalizedFuseResults(results)
352
- },
353
-
354
- onPopupHide () {
355
- this.isPopupContentOpen = false
356
- this.$emit('popup-hide')
357
- },
358
-
359
- onPopupShow () {
360
- this.isPopupContentOpen = true
361
- this.$emit('popup-show')
362
-
363
- if (this.useFetchOptionsOnFocus && this.mx_fetchCount === 0) {
364
- this.mx_setFetchOptions('')
365
- }
366
-
367
- if (this.mx_isFetching) {
368
- this.togglePopupContentClass(true)
369
- }
370
- },
371
-
372
- setLazyLoading () {
373
- this.mx_setCachedOptions('options')
374
-
375
- if (this.useFetchOptionsOnCreate && !this.useFetchOptionsOnFocus) this.mx_setFetchOptions('')
376
- },
377
-
378
- setSearchMethod () {
379
- if (this.useLazyLoading) return this.setLazyLoading()
380
-
381
- if (this.hasFuse) this.setFuse()
382
- },
383
-
384
- async togglePopupContentClass (force) {
385
- await this.$nextTick()
386
-
387
- const popupContentElement = document.querySelector(`.${this.popupContentClass}`)
388
-
389
- if (popupContentElement) {
390
- popupContentElement.classList.toggle('qas-select__is-fetching', force)
391
- }
392
- },
393
-
394
- setDefaultOption () {
395
- const modelValue = this.attributes.emitValue
396
- ? this.options[0].value
397
- : this.options[0]
398
-
399
- this.$emit('update:modelValue', modelValue)
400
- },
401
-
402
- getFilteredBadgeList (payload = {}) {
403
- const { label, value, disable, caption, ...rest } = payload
404
-
405
- const badgeList = []
406
-
407
- /**
408
- * Exemplo de estrutura percorrida:
409
- *
410
- * @example
411
- * {
412
- * isTester: true,
413
- * isOwner: false
414
- * }
415
- */
416
- for (const [key, val] of Object.entries(rest)) {
417
- if (key in this.badgeProps) {
418
- badgeList.push({ [key]: val })
419
- }
420
- }
421
-
422
- return badgeList
423
- },
424
-
425
- getBadgeProps (badge) {
426
- const model = Object.keys(badge)[0]
427
-
428
- const isFunction = typeof this.badgeProps[model] === 'function'
429
-
430
- return isFunction ? this.badgeProps[model](badge[model]).props : this.badgeProps[model]
431
- },
432
-
433
- hasBadge (badge) {
434
- const model = Object.keys(badge)[0]
435
-
436
- return badge[model] || this.badgeProps[model](badge[model]).show
437
- },
438
-
439
- getCaptionArray (caption) {
440
- return Array.isArray(caption) ? caption : [caption]
441
- },
442
-
443
- hasSeparator ({ caption, index }) {
444
- return index !== caption.length - 1
445
- }
446
- }
447
- }
448
- </script>
449
-
450
- <style lang="scss">
451
- .qas-select {
452
- &__is-fetching {
453
- cursor: not-allowed !important;
454
-
455
- .q-virtual-scroll__content {
456
- pointer-events: none;
457
-
458
- .q-item {
459
- color: $grey-6;
460
- }
461
- }
462
- }
463
-
464
- &--filter {
465
- .q-field__control:before {
466
- border: 0;
467
- }
468
- }
469
-
470
- &__menu {
471
- .q-item {
472
- font-weight: 400 !important;
473
- }
474
- }
475
-
476
- &__option:hover .q-item__label--caption {
477
- color: var(--q-primary);
478
- }
479
-
480
- &--closed {
481
- .q-field__native span {
482
- white-space: nowrap;
483
- overflow: hidden;
484
- text-overflow: ellipsis;
485
- }
486
-
487
- &:not(.qas-select--loading) {
488
- .q-field__native .q-field__input {
489
- position: absolute;
490
- caret-color: transparent;
491
- }
492
- }
493
- }
494
-
495
- .q-field__prepend,
496
- .q-field__append {
497
- .q-icon {
498
- color: $grey-8;
499
- }
500
- }
501
-
502
- .q-field__focusable-action {
503
- opacity: 1;
504
- }
505
-
506
- .q-chip {
507
- font-size: 11px;
508
- }
509
-
510
- .q-chip__icon--remove {
511
- opacity: 1;
512
- }
513
- }
514
- </style>
1
+ <template>
2
+ <q-select v-model="model" v-bind="attributes" class="qas-select" :class="componentClasses" no-error-icon>
3
+ <template v-if="hasIcon" #prepend>
4
+ <q-icon :name="defaultIcon" />
5
+ </template>
6
+
7
+ <template #no-option>
8
+ <slot v-if="!mx_isFetching" name="no-option">
9
+ <q-item>
10
+ <q-item-section class="text-grey">
11
+ {{ noOptionLabel }}
12
+ </q-item-section>
13
+ </q-item>
14
+ </slot>
15
+ </template>
16
+
17
+ <template #after-options>
18
+ <slot v-if="mx_isFetching" name="after-options">
19
+ <div class="flex justify-center q-pb-sm">
20
+ <q-spinner-dots color="primary" size="20px" />
21
+ </div>
22
+ </slot>
23
+ </template>
24
+
25
+ <template v-if="attributes.useChips" #selected-item="{ opt, tabindex, index, removeAtIndex }">
26
+ <qas-badge removable :tabindex @remove="removeAtIndex(index)">
27
+ <div class="ellipsis" :title="opt.label">
28
+ {{ opt.label }}
29
+ </div>
30
+ </qas-badge>
31
+ </template>
32
+
33
+ <template v-if="useCustomOptions" #option="scope">
34
+ <q-item v-bind="scope.itemProps" class="qas-select__option">
35
+ <q-item-section>
36
+ <div class="items-center q-gutter-x-sm row">
37
+ <q-item-label>
38
+ {{ scope.opt.label }}
39
+ </q-item-label>
40
+
41
+ <div v-for="(badge, index) in getFilteredBadgeList(scope.opt)" :key="index">
42
+ <qas-badge v-if="hasBadge(badge)" v-bind="getBadgeProps(badge)" />
43
+ </div>
44
+ </div>
45
+
46
+ <div v-if="scope.opt.caption">
47
+ <div class="items-center q-col-gutter-x-sm row">
48
+ <q-item-label v-for="(caption, index) in getCaptionArray(scope.opt.caption)" :key="index" caption class="items-center q-mt-xs row">
49
+ <div>
50
+ {{ caption }}
51
+ </div>
52
+
53
+ <q-separator v-if="hasSeparator({ caption: getCaptionArray(scope.opt.caption), index })" class="q-ml-sm" vertical />
54
+ </q-item-label>
55
+ </div>
56
+ </div>
57
+ </q-item-section>
58
+ </q-item>
59
+ </template>
60
+
61
+ <template v-for="(_, name) in $slots" #[name]="context">
62
+ <slot :name="name" v-bind="context || {}" />
63
+ </template>
64
+ </q-select>
65
+ </template>
66
+
67
+ <script>
68
+ import { getRequiredLabel } from '../../helpers'
69
+ import { searchFilterMixin } from '../../mixins'
70
+ import fuseConfig from '../../shared/fuse-config'
71
+
72
+ import { uid } from 'quasar'
73
+ import Fuse from 'fuse.js'
74
+
75
+ export default {
76
+ name: 'QasSelect',
77
+
78
+ mixins: [searchFilterMixin],
79
+
80
+ inject: {
81
+ isBox: { default: false },
82
+ isDialog: { default: false }
83
+ },
84
+
85
+ props: {
86
+ badgeProps: {
87
+ default: () => ({}),
88
+ type: Object
89
+ },
90
+
91
+ fuseOptions: {
92
+ default: () => ({}),
93
+ type: Object
94
+ },
95
+
96
+ icon: {
97
+ type: String,
98
+ default: ''
99
+ },
100
+
101
+ label: {
102
+ type: String,
103
+ default: ''
104
+ },
105
+
106
+ modelValue: {
107
+ default: () => [],
108
+ type: [Array, Object, String, Number, Boolean]
109
+ },
110
+
111
+ noOptionLabel: {
112
+ default: 'Nenhum resultado foi encontrado.',
113
+ type: String
114
+ },
115
+
116
+ options: {
117
+ default: () => [],
118
+ type: Array
119
+ },
120
+
121
+ required: {
122
+ type: Boolean
123
+ },
124
+
125
+ useAutoSelect: {
126
+ type: Boolean
127
+ },
128
+
129
+ useCustomOptions: {
130
+ type: Boolean
131
+ },
132
+
133
+ useFetchOptionsOnCreate: {
134
+ default: true,
135
+ type: Boolean
136
+ },
137
+
138
+ useFetchOptionsOnFocus: {
139
+ type: Boolean
140
+ },
141
+
142
+ useSearch: {
143
+ type: Boolean,
144
+ default: undefined
145
+ },
146
+
147
+ useFilterMode: {
148
+ type: Boolean
149
+ }
150
+ },
151
+
152
+ emits: ['popup-hide', 'popup-show', 'update:modelValue', 'virtual-scroll'],
153
+
154
+ data () {
155
+ return {
156
+ fuse: null,
157
+ isPopupContentOpen: false
158
+ }
159
+ },
160
+
161
+ computed: {
162
+ attributes () {
163
+ return {
164
+ clearable: this.isSearchable,
165
+ emitValue: true,
166
+ mapOptions: true,
167
+ outlined: this.useFilterMode,
168
+ dense: true,
169
+ dropdownIcon: 'sym_r_expand_more',
170
+ clearIcon: 'sym_r_close',
171
+ popupContentClass: `qas-select__menu ${this.popupContentClass}`,
172
+ useChips: this.isMultiple && this.isPopupContentOpen,
173
+
174
+ ...this.$attrs,
175
+
176
+ label: this.formattedLabel,
177
+ error: this.hasError,
178
+ inputDebounce: this.useLazyLoading ? 1200 : 0,
179
+ loading: this.hasLoading,
180
+ options: this.mx_filteredOptions,
181
+ useInput: this.isSearchable,
182
+
183
+ ...(this.isSearchable && { onFilter: this.onFilter }),
184
+
185
+ onPopupHide: this.onPopupHide,
186
+ onPopupShow: this.onPopupShow,
187
+
188
+ ...(this.useLazyLoading && { onVirtualScroll: this.mx_onVirtualScroll })
189
+ }
190
+ },
191
+
192
+ defaultFuseOptions () {
193
+ return {
194
+ ...fuseConfig,
195
+ keys: ['label', 'value'],
196
+
197
+ ...this.fuseOptions
198
+ }
199
+ },
200
+
201
+ isSearchable () {
202
+ return this.hasFuse || this.useLazyLoading
203
+ },
204
+
205
+ isBordered () {
206
+ return (this.isBox || this.isDialog) && this.useFilterMode
207
+ },
208
+
209
+ hasError () {
210
+ return this.mx_hasFetchError || this.$attrs.error
211
+ },
212
+
213
+ hasLoading () {
214
+ return this.mx_isFetching || this.$attrs.loading
215
+ },
216
+
217
+ hasFuse () {
218
+ // se for "undefined" (default) cai na logica por quantidade da option
219
+ if (this.useSearch === false) return false
220
+
221
+ /*
222
+ * quantidade de option que precisa ter para o fuse funcionar automaticamente
223
+ * sem necessidade de passar prop manualmente
224
+ */
225
+ const autoFuseQuantity = 10
226
+ const hasAutoFuseSearch = this.options.length >= autoFuseQuantity && !this.useLazyLoading
227
+
228
+ return hasAutoFuseSearch
229
+ },
230
+
231
+ model: {
232
+ get () {
233
+ return this.modelValue
234
+ },
235
+
236
+ set (value) {
237
+ this.$emit('update:modelValue', value)
238
+ }
239
+ },
240
+
241
+ popupContentClass () {
242
+ return `qas-select__popup-content-${uid()}`
243
+ },
244
+
245
+ formattedLabel () {
246
+ return getRequiredLabel({ label: this.label, required: this.required })
247
+ },
248
+
249
+ canSetDefaultOption () {
250
+ return (this.required || this.useAutoSelect) && this.options.length === 1 && !this.modelValue
251
+ },
252
+
253
+ // redesign
254
+ componentClasses () {
255
+ return {
256
+ ...(this.useFilterMode && {
257
+ 'qas-select--filter rounded-borders': true,
258
+ 'shadow-2': !this.isBordered,
259
+ bordered: this.isBordered
260
+ }),
261
+
262
+ 'qas-select--has-icon': this.hasAppend || this.hasIcon,
263
+ 'qas-select--closed': !this.isPopupContentOpen,
264
+ 'qas-select--loading': this.hasLoading
265
+ }
266
+ },
267
+
268
+ isDisabled () {
269
+ return this.$attrs.disable || this.$attrs.disable === ''
270
+ },
271
+
272
+ isMultiple () {
273
+ return this.$attrs.multiple || this.$attrs.multiple === ''
274
+ },
275
+
276
+ hasAppend () {
277
+ return !!this.$slots.append
278
+ },
279
+
280
+ defaultIcon () {
281
+ return this.icon || 'sym_r_search'
282
+ },
283
+
284
+ hasIcon () {
285
+ return this.isSearchable || !!this.icon
286
+ }
287
+ },
288
+
289
+ watch: {
290
+ defaultFuseOptions () {
291
+ if (this.hasFuse) this.setFuse()
292
+ },
293
+
294
+ mx_isFetching (value) {
295
+ if (!this.isPopupContentOpen || !this.useLazyLoading) return
296
+
297
+ this.togglePopupContentClass(value)
298
+ },
299
+
300
+ required () {
301
+ if (!this.canSetDefaultOption) return
302
+
303
+ this.setDefaultOption()
304
+ },
305
+
306
+ options: {
307
+ handler () {
308
+ if (this.useLazyLoading && this.mx_hasFilteredOptions) return
309
+
310
+ if (this.fuse || this.hasFuse) this.setFuse()
311
+
312
+ if (this.canSetDefaultOption) this.setDefaultOption()
313
+
314
+ this.mx_filteredOptions = [...this.options]
315
+ },
316
+
317
+ deep: true,
318
+ immediate: true
319
+ }
320
+ },
321
+
322
+ created () {
323
+ this.setSearchMethod()
324
+ },
325
+
326
+ methods: {
327
+ setFuse () {
328
+ this.fuse = new Fuse(this.options, this.defaultFuseOptions)
329
+ },
330
+
331
+ async onFilter (value, update) {
332
+ if (this.useLazyLoading && value !== this.mx_search) {
333
+ await this.mx_filterOptionsByStore(value)
334
+ }
335
+
336
+ if (!this.useLazyLoading && this.hasFuse) {
337
+ this.filterOptionsByFuse(value)
338
+ }
339
+
340
+ update()
341
+ },
342
+
343
+ filterOptionsByFuse (value) {
344
+ if (value === '') {
345
+ this.mx_filteredOptions = this.options
346
+ return
347
+ }
348
+
349
+ const results = this.fuse.search(value)
350
+
351
+ this.mx_filteredOptions = this.mx_getNormalizedFuseResults(results)
352
+ },
353
+
354
+ onPopupHide () {
355
+ this.isPopupContentOpen = false
356
+ this.$emit('popup-hide')
357
+ },
358
+
359
+ onPopupShow () {
360
+ this.isPopupContentOpen = true
361
+ this.$emit('popup-show')
362
+
363
+ if (this.useFetchOptionsOnFocus && this.mx_fetchCount === 0) {
364
+ this.mx_setFetchOptions('')
365
+ }
366
+
367
+ if (this.mx_isFetching) {
368
+ this.togglePopupContentClass(true)
369
+ }
370
+ },
371
+
372
+ setLazyLoading () {
373
+ this.mx_setCachedOptions('options')
374
+
375
+ if (this.useFetchOptionsOnCreate && !this.useFetchOptionsOnFocus) this.mx_setFetchOptions('')
376
+ },
377
+
378
+ setSearchMethod () {
379
+ if (this.useLazyLoading) return this.setLazyLoading()
380
+
381
+ if (this.hasFuse) this.setFuse()
382
+ },
383
+
384
+ async togglePopupContentClass (force) {
385
+ await this.$nextTick()
386
+
387
+ const popupContentElement = document.querySelector(`.${this.popupContentClass}`)
388
+
389
+ if (popupContentElement) {
390
+ popupContentElement.classList.toggle('qas-select__is-fetching', force)
391
+ }
392
+ },
393
+
394
+ setDefaultOption () {
395
+ const modelValue = this.attributes.emitValue
396
+ ? this.options[0].value
397
+ : this.options[0]
398
+
399
+ this.$emit('update:modelValue', modelValue)
400
+ },
401
+
402
+ getFilteredBadgeList (payload = {}) {
403
+ const { label, value, disable, caption, ...rest } = payload
404
+
405
+ const badgeList = []
406
+
407
+ /**
408
+ * Exemplo de estrutura percorrida:
409
+ *
410
+ * @example
411
+ * {
412
+ * isTester: true,
413
+ * isOwner: false
414
+ * }
415
+ */
416
+ for (const [key, val] of Object.entries(rest)) {
417
+ if (key in this.badgeProps) {
418
+ badgeList.push({ [key]: val })
419
+ }
420
+ }
421
+
422
+ return badgeList
423
+ },
424
+
425
+ getBadgeProps (badge) {
426
+ const model = Object.keys(badge)[0]
427
+
428
+ const isFunction = typeof this.badgeProps[model] === 'function'
429
+
430
+ return isFunction ? this.badgeProps[model](badge[model]).props : this.badgeProps[model]
431
+ },
432
+
433
+ hasBadge (badge) {
434
+ const model = Object.keys(badge)[0]
435
+
436
+ return badge[model] || this.badgeProps[model](badge[model]).show
437
+ },
438
+
439
+ getCaptionArray (caption) {
440
+ return Array.isArray(caption) ? caption : [caption]
441
+ },
442
+
443
+ hasSeparator ({ caption, index }) {
444
+ return index !== caption.length - 1
445
+ }
446
+ }
447
+ }
448
+ </script>
449
+
450
+ <style lang="scss">
451
+ .qas-select {
452
+ &__is-fetching {
453
+ cursor: not-allowed !important;
454
+
455
+ .q-virtual-scroll__content {
456
+ pointer-events: none;
457
+
458
+ .q-item {
459
+ color: $grey-6;
460
+ }
461
+ }
462
+ }
463
+
464
+ &--filter {
465
+ .q-field__control:before {
466
+ border: 0;
467
+ }
468
+ }
469
+
470
+ &__menu {
471
+ .q-item {
472
+ font-weight: 400 !important;
473
+ }
474
+ }
475
+
476
+ &__option:hover .q-item__label--caption {
477
+ color: var(--q-primary);
478
+ }
479
+
480
+ &--closed {
481
+ .q-field__native span {
482
+ white-space: nowrap;
483
+ overflow: hidden;
484
+ text-overflow: ellipsis;
485
+ }
486
+
487
+ &:not(.qas-select--loading) {
488
+ .q-field__native .q-field__input {
489
+ position: absolute;
490
+ caret-color: transparent;
491
+ }
492
+ }
493
+ }
494
+
495
+ .q-field__prepend,
496
+ .q-field__append {
497
+ .q-icon {
498
+ color: $grey-8;
499
+ }
500
+ }
501
+
502
+ .q-field__focusable-action {
503
+ opacity: 1;
504
+ }
505
+
506
+ .q-chip {
507
+ font-size: 11px;
508
+ }
509
+
510
+ .q-chip__icon--remove {
511
+ opacity: 1;
512
+ }
513
+ }
514
+ </style>