@bildvitta/quasar-ui-asteroid 3.17.0-beta.2 → 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 (51) hide show
  1. package/package.json +2 -2
  2. package/src/assets/sounds/nave-notification.mp3 +0 -0
  3. package/src/components/actions/QasActions.vue +1 -1
  4. package/src/components/app-menu/QasAppMenu.vue +6 -1
  5. package/src/components/avatar/QasAvatar.vue +7 -8
  6. package/src/components/board-generator/QasBoardGenerator.vue +407 -40
  7. package/src/components/board-generator/QasBoardGenerator.yml +53 -12
  8. package/src/components/btn-dropdown/QasBtnDropdown.vue +14 -1
  9. package/src/components/card/QasCard.vue +13 -4
  10. package/src/components/chart-view/QasChartView.vue +44 -20
  11. package/src/components/chart-view/QasChartView.yml +10 -0
  12. package/src/components/checkbox/QasCheckbox.vue +30 -9
  13. package/src/components/checkbox/QasCheckbox.yml +5 -0
  14. package/src/components/copy/QasCopy.vue +12 -2
  15. package/src/components/copy/QasCopy.yml +8 -0
  16. package/src/components/date-time-input/QasDateTimeInput.vue +1 -1
  17. package/src/components/dialog/QasDialog.vue +3 -3
  18. package/src/components/expansion-item/QasExpansionItem.vue +120 -34
  19. package/src/components/expansion-item/QasExpansionItem.yml +38 -5
  20. package/src/components/filters/QasFilters.vue +1 -1
  21. package/src/components/filters/private/PvFiltersButton.vue +1 -1
  22. package/src/components/form-generator/QasFormGenerator.vue +39 -27
  23. package/src/components/form-generator/QasFormGenerator.yml +3 -0
  24. package/src/components/grabbable/QasGrabbable.vue +14 -6
  25. package/src/components/grabbable/QasGrabbable.yml +4 -0
  26. package/src/components/grid-generator/QasGridGenerator.vue +67 -34
  27. package/src/components/grid-generator/QasGridGenerator.yml +15 -0
  28. package/src/components/header/QasHeader.vue +58 -12
  29. package/src/components/header/QasHeader.yml +5 -0
  30. package/src/components/infinite-scroll/QasInfiniteScroll.vue +16 -17
  31. package/src/components/infinite-scroll/QasInfiniteScroll.yml +7 -0
  32. package/src/components/list-items/QasListItems.vue +28 -4
  33. package/src/components/list-items/QasListItems.yml +10 -0
  34. package/src/components/list-view/QasListView.vue +17 -5
  35. package/src/components/list-view/QasListView.yml +9 -0
  36. package/src/components/nested-fields/QasNestedFields.vue +91 -36
  37. package/src/components/nested-fields/QasNestedFields.yml +23 -0
  38. package/src/components/radio/QasRadio.vue +24 -5
  39. package/src/components/radio/QasRadio.yml +6 -0
  40. package/src/components/select/QasSelect.vue +129 -5
  41. package/src/components/select/QasSelect.yml +11 -0
  42. package/src/components/stepper-form-view/QasStepperFormView.yml +1 -1
  43. package/src/components/table-generator/QasTableGenerator.vue +10 -1
  44. package/src/components/text-truncate/QasTextTruncate.vue +11 -4
  45. package/src/components/text-truncate/QasTextTruncate.yml +4 -0
  46. package/src/composables/private/use-generator.js +3 -9
  47. package/src/composables/use-notifications.js +14 -0
  48. package/src/css/components/field.scss +13 -6
  49. package/src/css/components/item.scss +5 -1
  50. package/src/enums/Spacing.js +33 -0
  51. package/src/helpers/set-scroll-on-grab.js +9 -1
@@ -1,35 +1,37 @@
1
1
  <template>
2
- <div ref="expansionItem" class="full-width qas-expansion-item" :class="errorClasses" v-bind="expansionProps.parent">
3
- <component :is="component.is" class="qas-expansion-item__box">
4
- <q-expansion-item header-class="text-bold q-mt-sm q-pa-none qas-expansion-item__header" :label="props.label" v-bind="expansionProps.item">
2
+ <div ref="expansionItem" class="full-width qas-expansion-item" :class="classes" v-bind="expansionProps.parent">
3
+ <component :is="component.is" class="qas-expansion-item__box" v-bind="boxProps">
4
+ <q-expansion-item v-model="modelValue" v-bind="expansionProps.item" header-class="text-bold q-mt-sm q-pa-none qas-expansion-item__header" @show="setShowContent">
5
5
  <template #header>
6
- <slot name="header">
6
+ <div class="full-width justify-between no-wrap row">
7
7
  <div class="full-width">
8
- <div class="items-center q-col-gutter-sm row">
9
- <slot name="label">
10
- <h5 class="col-auto text-h5">
11
- {{ props.label }}
12
- </h5>
13
- </slot>
14
-
15
- <div class="col-auto items-center q-col-gutter-sm row">
16
- <div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex" class="col-auto">
17
- <qas-badge v-bind="badge" />
8
+ <slot name="header">
9
+ <div class="items-center q-col-gutter-sm row">
10
+ <slot name="header-label">
11
+ <qas-label class="col-auto qas-expansion-item__label" :label="props.label" margin="none" typography="h5" />
12
+ </slot>
13
+
14
+ <div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
15
+ <div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex" class="col-auto">
16
+ <qas-badge v-bind="badge" />
17
+ </div>
18
18
  </div>
19
19
  </div>
20
- </div>
21
20
 
22
- <div v-if="hasHeaderBottom" class="q-mt-sm">
23
- <slot name="header-bottom" />
24
- </div>
21
+ <div v-if="hasHeaderBottom" class="q-mt-sm">
22
+ <slot name="header-bottom" />
23
+ </div>
24
+ </slot>
25
25
  </div>
26
- </slot>
26
+
27
+ <qas-btn class="qas-expansion-item__dropdown" color="grey-10" :disable="isDisabled" icon="sym_r_keyboard_arrow_down" />
28
+ </div>
27
29
  </template>
28
30
 
29
31
  <q-separator v-if="hasHeaderSeparator" class="q-my-md" />
30
32
 
31
33
  <div :class="contentClasses">
32
- <slot name="content">
34
+ <slot v-if="showContent" name="content">
33
35
  <qas-grid-generator v-if="hasGridGenerator" use-inline v-bind="gridGeneratorProps" />
34
36
  </slot>
35
37
  </div>
@@ -60,6 +62,14 @@ const props = defineProps({
60
62
  default: () => []
61
63
  },
62
64
 
65
+ disable: {
66
+ type: Boolean
67
+ },
68
+
69
+ disableButton: {
70
+ type: Boolean
71
+ },
72
+
63
73
  error: {
64
74
  type: Boolean
65
75
  },
@@ -69,14 +79,24 @@ const props = defineProps({
69
79
  default: ''
70
80
  },
71
81
 
82
+ gridGeneratorProps: {
83
+ type: Object,
84
+ default: () => ({})
85
+ },
86
+
87
+ group: {
88
+ type: String,
89
+ default: undefined
90
+ },
91
+
72
92
  label: {
73
93
  type: String,
74
94
  default: ''
75
95
  },
76
96
 
77
- gridGeneratorProps: {
78
- type: Object,
79
- default: () => ({})
97
+ maxContentHeight: {
98
+ type: String,
99
+ default: ''
80
100
  },
81
101
 
82
102
  useHeaderSeparator: {
@@ -85,6 +105,8 @@ const props = defineProps({
85
105
  }
86
106
  })
87
107
 
108
+ const modelValue = defineModel({ type: Boolean })
109
+
88
110
  const attrs = useAttrs()
89
111
 
90
112
  provide('isExpansionItem', true)
@@ -95,16 +117,20 @@ const slots = defineSlots()
95
117
  // refs
96
118
  const expansionItem = ref(null)
97
119
  const hasNextSibling = ref(false)
120
+ const showContent = ref(false)
98
121
 
99
122
  onMounted(setHasNextSibling)
100
123
 
101
124
  // constants
102
125
  const isNestedExpansionItem = inject('isExpansionItem', false)
126
+ const isNestedBox = inject('isBox', false)
127
+
103
128
  const component = {
104
129
  is: isNestedExpansionItem ? 'div' : QasBox
105
130
  }
106
131
 
107
132
  // computed
133
+ const hasBadges = computed(() => !!props.badges.length)
108
134
  const hasError = computed(() => props.error || !!props.errorMessage)
109
135
  const hasGridGenerator = computed(() => !!Object.keys(props.gridGeneratorProps).length)
110
136
  const hasBottomSeparator = computed(() => isNestedExpansionItem && hasNextSibling.value)
@@ -121,12 +147,19 @@ const hasHeaderSeparator = computed(() => {
121
147
  return typeof props.useHeaderSeparator === 'undefined' ? !isNestedExpansionItem : props.useHeaderSeparator
122
148
  })
123
149
 
124
- const errorClasses = computed(() => ({ 'qas-expansion-item--error': hasError.value }))
150
+ const classes = computed(() => {
151
+ return {
152
+ 'qas-expansion-item--error': hasError.value,
153
+ 'qas-expansion-item--disabled': props.disable || props.disableButton,
154
+ 'qas-expansion-item--disabled-full': props.disable
155
+ }
156
+ })
125
157
 
126
158
  const contentClasses = computed(() => {
127
159
  return {
128
160
  'q-mt-sm': isNestedExpansionItem,
129
- 'q-mt-md': !isNestedExpansionItem && !props.useHeaderSeparator
161
+ 'q-mt-md': !isNestedExpansionItem && !props.useHeaderSeparator,
162
+ 'qas-expansion-item__content overflow-auto': !!props.maxContentHeight
130
163
  }
131
164
  })
132
165
 
@@ -142,11 +175,15 @@ const expansionProps = computed(() => {
142
175
  } = attrs
143
176
 
144
177
  return {
145
- parent: {
146
- ...propsPayload
147
- },
178
+ parent: propsPayload,
148
179
 
149
180
  item: {
181
+ disable: isDisabled.value,
182
+ hideExpandIcon: true,
183
+ label: props.label,
184
+ group: props.group,
185
+
186
+ // events
150
187
  onUpdateModelValue,
151
188
  onShow,
152
189
  onBeforeShow,
@@ -157,13 +194,30 @@ const expansionProps = computed(() => {
157
194
  }
158
195
  })
159
196
 
197
+ const boxProps = computed(() => {
198
+ /**
199
+ * Caso o QasExpansionItem estiver dentro de um QasBox e não for um QasExpansionItem
200
+ * dentro de outro QasExpansionItem, o componente terá uma borda.
201
+ */
202
+ const isBoxed = isNestedBox && !isNestedExpansionItem
203
+
204
+ if (!isBoxed) return {}
205
+
206
+ return {
207
+ unelevated: isBoxed,
208
+ outlined: isBoxed
209
+ }
210
+ })
211
+
212
+ const isDisabled = computed(() => props.disable || props.disableButton)
213
+
160
214
  // functions
161
215
 
162
216
  /**
163
217
  * Caso o componente esteja dentro de um QasExpansionItem, verifica se existe um próximo irmão
164
218
  * para adicionar um separador.
165
219
  */
166
- function setHasNextSibling (value) {
220
+ function setHasNextSibling () {
167
221
  if (!isNestedExpansionItem) return
168
222
 
169
223
  const hasTextContentSibling = !!expansionItem.value.nextSibling?.textContent?.trim?.()
@@ -171,21 +225,31 @@ function setHasNextSibling (value) {
171
225
 
172
226
  hasNextSibling.value = hasElementSibling || hasTextContentSibling
173
227
  }
228
+
229
+ function setShowContent () {
230
+ showContent.value = true
231
+ }
174
232
  </script>
175
233
 
176
234
  <style lang="scss">
177
235
  .qas-expansion-item {
178
236
  $root: &;
179
237
 
180
- // em alguns casos quando usado com grid, o espaçamento afetava o header, com z-index o problema é resolvido
181
- &__header {
182
- position: relative;
183
- z-index: 1;
238
+ &--disabled {
239
+ .q-item.disabled {
240
+ opacity: 1 !important;
241
+ }
242
+ }
243
+
244
+ &--disabled-full {
245
+ #{$root}__label {
246
+ color: $grey-6 !important;
247
+ }
184
248
  }
185
249
 
186
250
  &--error {
187
251
  #{$root}__box {
188
- border: 2px solid $negative;
252
+ border: 2px solid $negative !important;
189
253
  }
190
254
 
191
255
  #{$root}__error-message {
@@ -193,6 +257,28 @@ function setHasNextSibling (value) {
193
257
  }
194
258
  }
195
259
 
260
+ &__content {
261
+ max-height: v-bind("props.maxContentHeight");
262
+ }
263
+
264
+ // em alguns casos quando usado com grid, o espaçamento afetava o header, com z-index o problema é resolvido
265
+ &__header {
266
+ position: relative;
267
+ z-index: 1;
268
+ }
269
+
270
+ .q-expansion-item {
271
+ #{$root}__dropdown {
272
+ transition: transform var(--qas-generic-transition);;
273
+ }
274
+
275
+ &--expanded {
276
+ #{$root}__dropdown {
277
+ transform: rotate(180deg);
278
+ }
279
+ }
280
+ }
281
+
196
282
  .q-item {
197
283
  margin-top: 0;
198
284
  min-height: auto;
@@ -8,6 +8,16 @@ props:
8
8
  desc: Lista de badges que serão exibidas na parte superior do card.
9
9
  type: Array
10
10
 
11
+ disable:
12
+ desc: Desabilita o componente e aplica estilo de desabilitado no label e no button.
13
+ default: false
14
+ type: Boolean
15
+
16
+ disable-button:
17
+ desc: Desabilita o componente sem aplicar o estilo de desabilitado no label (usar em casos onde não tem conteúdo no slot content).
18
+ default: false
19
+ type: Boolean
20
+
11
21
  error:
12
22
  desc: Booleano que caso seja true o card passa a ter uma borda vermelha.
13
23
  type: Boolean
@@ -16,10 +26,25 @@ props:
16
26
  desc: Mensagem de erro onde será exibida na parte inferior do card.
17
27
  type: String
18
28
 
29
+ group:
30
+ desc: Agrupamento para estado aberto|fechado.
31
+ default: ''
32
+ type: String
33
+
19
34
  label:
20
35
  desc: Titulo exibido na parte superior do card.
21
36
  type: String
22
37
 
38
+ model-value:
39
+ desc: Model que controla o estado aberto|fechado.
40
+ default: false
41
+ type: Boolean
42
+
43
+ max-content-height:
44
+ desc: Define um tamanho máximo de altura do conteúdo.
45
+ default: ''
46
+ type: String
47
+
23
48
  grid-generator-props:
24
49
  desc: Propriedades que serão repassadas para o QasGridGenerator.
25
50
  type: Object
@@ -31,13 +56,21 @@ props:
31
56
 
32
57
  slots:
33
58
  header:
34
- desc: 'Slot para substituir o conteúdo do header'
59
+ desc: Slot para substituir o conteúdo do header (não inclui o botão dropdown).
35
60
 
36
61
  header-bottom:
37
- desc: 'Slot para acessar o conteúdo que fica abaixo do header.'
62
+ desc: Slot para acessar o conteúdo que fica abaixo do header.
38
63
 
39
- label:
40
- desc: 'Slot para substituir o conteúdo da label do header.'
64
+ header-label:
65
+ desc: Slot para substituir o conteúdo da label do header.
41
66
 
42
67
  content:
43
- desc: 'Slot para substituir o conteúdo principal do card.'
68
+ desc: Slot para substituir o conteúdo principal do card.
69
+
70
+ events:
71
+ '@update:model-value -> function(value)':
72
+ desc: Dispara quando o model-value altera, também usado para v-model.
73
+ params:
74
+ value:
75
+ desc: Novo valor do model.
76
+ type: Boolean
@@ -160,7 +160,7 @@ export default {
160
160
  const field = { ...this.fields[key], ...this.formattedFieldsProps?.[decamelize(key)] }
161
161
  const value = humanize(field, this.normalizeValues(filters[key], field?.multiple))
162
162
 
163
- if (!value) continue
163
+ if (!value || (Array.isArray(value) && !value.length)) continue
164
164
 
165
165
  const { label, name } = field
166
166
 
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <qas-btn data-cy="filters-btn" icon="sym_r_filter_alt" label="Filtrar" :use-label-on-small-screen="false" variant="tertiary">
3
- <q-menu ref="menu" anchor="center right" class="full-width" max-width="270px" self="top right" v-bind="menuProps">
3
+ <q-menu ref="menu" anchor="center right" class="full-width" max-width="270px" v-bind="menuProps" no-refocus self="top right">
4
4
  <div v-if="loading" class="q-pa-xl text-center">
5
5
  <q-spinner color="grey" size="2em" />
6
6
  </div>
@@ -2,22 +2,26 @@
2
2
  <div :class="fieldsetClasses">
3
3
  <div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" :class="getFieldSetColumnClass(fieldsetItem.column)">
4
4
  <component :is="containerComponent.is" v-bind="containerComponent.props">
5
- <slot v-if="hasFieldsetItem(fieldsetItem)" :name="`legend-${fieldsetItemKey}`">
6
- <qas-header v-bind="getHeaderProps(fieldsetItem)" />
5
+ <slot v-if="fieldsetItem.__hasFieldset" :name="`legend-${fieldsetItemKey}`">
6
+ <qas-header v-if="fieldsetItem.__hasHeader" v-bind="getHeaderProps(fieldsetItem)" />
7
7
  </slot>
8
8
 
9
9
  <div>
10
10
  <slot :fields="fieldsetItem.fields?.visible" :name="`legend-section-${fieldsetItemKey}`">
11
- <div class="items-end justify-end" :class="getRowContainerClasses(fieldsetItem)">
12
- <div :class="fieldContainerClasses">
13
- <div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
14
- <slot :field="field" :name="`field-${field.name}`">
15
- <qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :error="props.errors[key]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
16
- </slot>
11
+ <div class="q-col-gutter-md row">
12
+ <div class="col">
13
+ <div :class="fieldContainerClasses">
14
+ <div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
15
+ <slot :field="field" :name="`field-${field.name}`">
16
+ <qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :error="props.errors[key]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
17
+ </slot>
18
+ </div>
17
19
  </div>
18
20
  </div>
19
21
 
20
- <qas-btn v-if="hasButtonProps(fieldsetItem)" class="md:q-mt-none q-ml-md q-mt-md" v-bind="fieldsetItem.buttonProps" />
22
+ <div v-if="hasButtonProps(fieldsetItem)" class="col-12 col-sm-auto items-end justify-end row">
23
+ <qas-btn v-bind="fieldsetItem.buttonProps" />
24
+ </div>
21
25
  </div>
22
26
 
23
27
  <div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
@@ -27,6 +31,8 @@
27
31
  </div>
28
32
  </slot>
29
33
  </div>
34
+
35
+ <slot v-if="fieldsetItem.__hasFieldset" :name="`legend-bottom-${fieldsetItemKey}`" />
30
36
  </component>
31
37
  </div>
32
38
  </div>
@@ -97,7 +103,7 @@ provide('isFormGenerator', true)
97
103
  // composables
98
104
  const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
99
105
 
100
- const { fieldsetClasses, hasFieldset, hasFieldsetItem } = useFieldset({ props })
106
+ const { fieldsetClasses, hasFieldset } = useFieldset({ props })
101
107
 
102
108
  const screen = useScreen()
103
109
 
@@ -163,13 +169,29 @@ const normalizedFields = computed(() => {
163
169
  for (const fieldsetKey in props.fieldset) {
164
170
  const fieldsetItem = props.fieldset[fieldsetKey]
165
171
 
172
+ const {
173
+ label,
174
+ description,
175
+ column,
176
+ buttonProps,
177
+ headerProps
178
+ } = fieldsetItem
179
+
180
+ const hasHeader = !!(label || description || Object.keys(headerProps || {}).length)
181
+
166
182
  fields[fieldsetKey] = {
167
- label: fieldsetItem.label,
168
- description: fieldsetItem.description,
169
- column: fieldsetItem.column,
170
- buttonProps: fieldsetItem.buttonProps,
183
+ label,
184
+ description,
185
+ column,
186
+ buttonProps,
171
187
  fields: { hidden: {}, visible: {} },
172
- headerProps: fieldsetItem.headerProps
188
+ headerProps,
189
+
190
+ // Indica que existe um fieldset para que o legend-bottom possa ser renderizado.
191
+ __hasFieldset: true,
192
+
193
+ // Indica que existe props para que o header seja renderizado.
194
+ __hasHeader: hasHeader
173
195
  }
174
196
 
175
197
  fieldsetItem.fields.forEach(fieldName => {
@@ -197,7 +219,7 @@ const fieldContainerClasses = computed(() => {
197
219
  ]
198
220
  })
199
221
 
200
- // methods
222
+ // functions
201
223
  function getFieldType ({ type }) {
202
224
  return type === 'hidden' ? 'hidden' : 'visible'
203
225
  }
@@ -230,10 +252,6 @@ function hasButtonProps ({ buttonProps = {} }) {
230
252
  return !!Object.keys(buttonProps).length
231
253
  }
232
254
 
233
- function getRowContainerClasses (item) {
234
- return { row: hasButtonProps(item) }
235
- }
236
-
237
255
  // composables
238
256
  function useFieldset ({ props }) {
239
257
  const fieldsetClasses = computed(() => {
@@ -248,15 +266,9 @@ function useFieldset ({ props }) {
248
266
 
249
267
  const hasFieldset = computed(() => !!Object.keys(props.fieldset).length)
250
268
 
251
- function hasFieldsetItem (fieldset = {}) {
252
- return !!Object.keys(fieldset).length
253
- }
254
-
255
269
  return {
256
270
  fieldsetClasses,
257
- hasFieldset,
258
-
259
- hasFieldsetItem
271
+ hasFieldset
260
272
  }
261
273
  }
262
274
  </script>
@@ -97,6 +97,9 @@ slots:
97
97
  default: {}
98
98
  type: Object
99
99
 
100
+ 'legend-bottom-[nome-da-chave]':
101
+ desc: Acessa o slot da seção abaixo do conteúdo do form de um fieldset específico.
102
+
100
103
  events:
101
104
  '@update:model-value -> function(value)':
102
105
  desc: Dispara quando o model-value altera, também usado para v-model.
@@ -19,6 +19,11 @@ defineOptions({ name: 'QasGrabbable' })
19
19
  const props = defineProps({
20
20
  useScrollBar: {
21
21
  type: Boolean
22
+ },
23
+
24
+ cancelMouseDownTarget: {
25
+ type: String,
26
+ default: ''
22
27
  }
23
28
  })
24
29
 
@@ -61,17 +66,20 @@ function handleEnableScrollOnGrab () {
61
66
  function initScrollOnGrab () {
62
67
  if (hasScrollOnGrab.value) return
63
68
 
64
- scrollOnGrab.value = setScrollOnGrab(grabContainer.value, {
65
- onGrabFn: onGrab,
66
- onMoveFn: setGrabPosition,
67
- onScrollFn: setGrabPosition
68
- })
69
+ scrollOnGrab.value = setScrollOnGrab(
70
+ grabContainer.value,
71
+ {
72
+ onGrabFn: onGrab,
73
+ onMoveFn: setGrabPosition,
74
+ onScrollFn: setGrabPosition
75
+ },
76
+ props.cancelMouseDownTarget
77
+ )
69
78
  }
70
79
 
71
80
  function destroyScrollOnGrab () {
72
81
  if (!hasScrollOnGrab.value) return
73
82
 
74
- scrollOnGrab.value.destroyEvents()
75
83
  scrollOnGrab.value.element.style.cursor = 'auto'
76
84
  scrollOnGrab.value = {}
77
85
 
@@ -9,6 +9,10 @@ props:
9
9
  default: false
10
10
  type: Boolean
11
11
 
12
+ cancel-mouse-down-target:
13
+ desc: Classe do elemento no qual será ignorado para não realizar o grab.
14
+ type: String
15
+
12
16
  slots:
13
17
  default:
14
18
  desc: Slot para ter o conteúdo que terá o scroll na horizontal.