@bildvitta/quasar-ui-asteroid 3.17.0-beta.1 → 3.17.0-beta.10

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 (31) hide show
  1. package/package.json +1 -1
  2. package/src/components/actions/QasActions.vue +1 -1
  3. package/src/components/btn-dropdown/QasBtnDropdown.vue +14 -1
  4. package/src/components/chart-view/QasChartView.vue +43 -19
  5. package/src/components/chart-view/QasChartView.yml +10 -0
  6. package/src/components/date-time-input/QasDateTimeInput.vue +1 -1
  7. package/src/components/dialog/QasDialog.vue +3 -3
  8. package/src/components/expansion-item/QasExpansionItem.vue +100 -25
  9. package/src/components/expansion-item/QasExpansionItem.yml +35 -4
  10. package/src/components/filters/QasFilters.vue +1 -1
  11. package/src/components/filters/private/PvFiltersButton.vue +1 -1
  12. package/src/components/form-generator/QasFormGenerator.vue +32 -19
  13. package/src/components/form-generator/QasFormGenerator.yml +3 -0
  14. package/src/components/grid-generator/QasGridGenerator.vue +67 -34
  15. package/src/components/grid-generator/QasGridGenerator.yml +15 -0
  16. package/src/components/header/QasHeader.vue +56 -12
  17. package/src/components/header/QasHeader.yml +5 -0
  18. package/src/components/list-items/QasListItems.vue +28 -4
  19. package/src/components/list-items/QasListItems.yml +10 -0
  20. package/src/components/list-view/QasListView.vue +4 -4
  21. package/src/components/nested-fields/QasNestedFields.vue +91 -36
  22. package/src/components/nested-fields/QasNestedFields.yml +23 -0
  23. package/src/components/select/QasSelect.vue +154 -5
  24. package/src/components/select/QasSelect.yml +15 -0
  25. package/src/components/table-generator/QasTableGenerator.vue +7 -1
  26. package/src/components/text-truncate/QasTextTruncate.vue +11 -4
  27. package/src/components/text-truncate/QasTextTruncate.yml +4 -0
  28. package/src/composables/private/use-generator.js +3 -9
  29. package/src/css/components/field.scss +13 -6
  30. package/src/css/components/item.scss +5 -1
  31. package/src/enums/Spacing.js +33 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bildvitta/quasar-ui-asteroid",
3
3
  "description": "Asteroid",
4
- "version": "3.17.0-beta.1",
4
+ "version": "3.17.0-beta.10",
5
5
  "author": "Bild & Vitta <systemteam@bild.com.br>",
6
6
  "license": "MIT",
7
7
  "main": "dist/asteroid.cjs.min.js",
@@ -72,7 +72,7 @@ const classes = computed(() => {
72
72
  const columnClasses = computed(() => {
73
73
  if (props.useEqualWidth) return 'col-12 col-sm-6'
74
74
 
75
- return props.useFullWidth ? 'col-12' : 'col-12 col-sm-auto'
75
+ return props.useFullWidth ? 'full-width' : 'col-12 col-sm-auto'
76
76
  })
77
77
 
78
78
  const hasPrimarySlot = computed(() => !!slots.primary)
@@ -19,7 +19,7 @@
19
19
  </div>
20
20
 
21
21
  <div v-if="props.useSplit">
22
- <qas-btn color="grey-10" :disable="disable" :icon="props.dropdownIcon" variant="tertiary">
22
+ <qas-btn v-bind="splittedButtonProps">
23
23
  <q-menu v-if="hasDefaultSlot" anchor="bottom right" auto-close self="top right">
24
24
  <div :class="classes.menuContent">
25
25
  <slot />
@@ -103,6 +103,19 @@ const hasButtons = computed(() => !screen.isSmall || !props.useSplit)
103
103
  const hasDefaultSlot = computed(() => !!slots.default)
104
104
  const hasMenuOnLeftSide = computed(() => hasDefaultSlot.value && !props.useSplit && isSingleButton.value)
105
105
 
106
+ const splittedButtonProps = computed(() => {
107
+ const iconKey = screen.isSmall ? 'icon' : 'iconRight'
108
+
109
+ return {
110
+ color: 'grey-10',
111
+ disable: props.disable,
112
+ [iconKey]: props.dropdownIcon,
113
+ variant: 'tertiary',
114
+ label: 'Opções',
115
+ useLabelOnSmallScreen: false
116
+ }
117
+ })
118
+
106
119
  watch(() => props.menu, value => {
107
120
  isMenuOpened.value = value
108
121
  }, { immediate: true })
@@ -1,23 +1,25 @@
1
1
  <template>
2
- <qas-header v-if="hasHeader" v-bind="headerProps">
3
- <template #right>
4
- <qas-filters v-bind="chartFiltersProps" />
5
- </template>
6
- </qas-header>
7
-
8
- <div v-bind="parentComponentProps">
9
- <component :is="chartComponent.is" v-if="showChart" v-bind="chartComponent.props" />
10
-
11
- <div v-else-if="!isFetching">
12
- <slot name="empty-results">
13
- <qas-empty-result-text />
14
- </slot>
2
+ <component :is="parentComponent.is" v-bind="parentComponent.props">
3
+ <qas-header v-if="hasHeader" v-bind="headerProps">
4
+ <template #right>
5
+ <qas-filters v-bind="chartFiltersProps" />
6
+ </template>
7
+ </qas-header>
8
+
9
+ <div v-bind="parentComponentProps">
10
+ <component :is="chartComponent.is" v-if="showChart" v-bind="chartComponent.props" />
11
+
12
+ <div v-else-if="!isFetching">
13
+ <slot name="empty-results">
14
+ <qas-empty-result-text />
15
+ </slot>
16
+ </div>
17
+
18
+ <q-inner-loading :showing="isFetching">
19
+ <q-spinner color="grey" size="3em" />
20
+ </q-inner-loading>
15
21
  </div>
16
-
17
- <q-inner-loading :showing="isFetching">
18
- <q-spinner color="grey" size="3em" />
19
- </q-inner-loading>
20
- </div>
22
+ </component>
21
23
  </template>
22
24
 
23
25
  <script>
@@ -69,6 +71,11 @@ export default {
69
71
  type: Function
70
72
  },
71
73
 
74
+ boxProps: {
75
+ default: () => ({}),
76
+ type: Object
77
+ },
78
+
72
79
  colorsList: {
73
80
  type: Array,
74
81
  default: () => []
@@ -124,6 +131,11 @@ export default {
124
131
  type: String
125
132
  },
126
133
 
134
+ useBox: {
135
+ type: Boolean,
136
+ default: true
137
+ },
138
+
127
139
  useFilterButton: {
128
140
  type: Boolean
129
141
  }
@@ -251,9 +263,11 @@ export default {
251
263
  },
252
264
 
253
265
  parentComponentProps () {
266
+ const hasMinHeight = this.isFetching || this.hasDataSets
267
+
254
268
  return {
255
269
  class: 'relative-position',
256
- style: `min-height: ${this.height}`
270
+ style: `min-height: ${hasMinHeight ? this.height : 'auto'}`
257
271
  }
258
272
  },
259
273
 
@@ -308,6 +322,16 @@ export default {
308
322
  label: this.title
309
323
  }
310
324
  }
325
+ },
326
+
327
+ parentComponent () {
328
+ return {
329
+ is: this.useBox ? 'qas-box' : 'div',
330
+
331
+ props: {
332
+ ...(this.useBox && { ...this.boxProps })
333
+ }
334
+ }
311
335
  }
312
336
  },
313
337
 
@@ -10,6 +10,11 @@ props:
10
10
  type: Function
11
11
  examples: ['beforeFetch({ payload, resolve, done })']
12
12
 
13
+ box-props:
14
+ desc: Propriedades do "QasBox" que envolve o conteúdo.
15
+ default: {}
16
+ type: Object
17
+
13
18
  colors-list:
14
19
  desc: Lista de cores personalizadas para utilizar nos gráficos
15
20
  default: []
@@ -65,6 +70,11 @@ props:
65
70
  desc: Envia como parâmetro para a action "fetchList" do modulo correspondente a "entity".
66
71
  type: String
67
72
 
73
+ use-box:
74
+ desc: Controla se o componente vai ter o QasBox englobando ou não.
75
+ default: true
76
+ type: Boolean
77
+
68
78
  use-filter-button:
69
79
  desc: Controla se o componente vai usar ou não o componente "QasFilters".
70
80
  type: Boolean
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <qas-input ref="input" v-bind="attributes" v-model="currentValue" inputmode="numeric" :unmasked-value="false" @blur="validateDateTimeOnBlur" @focus="resetError" @update:model-value="updateModelValue">
3
3
  <template #append>
4
- <qas-btn v-if="!props.useTimeOnly" color="grey-10" :disable="attrs.readonly" icon="sym_r_event" variant="tertiary">
4
+ <qas-btn v-if="!props.useTimeOnly" color="grey-10" :disable="attrs.readonly" icon="sym_r_calendar_today" variant="tertiary">
5
5
  <q-popup-proxy ref="dateProxy" transition-hide="scale" transition-show="scale" v-bind="props.datePopupProxyProps">
6
6
  <qas-date v-model="currentValue" v-bind="defaultDateProps" :mask="maskDate" width="290px" @update:model-value="updateModelValue" />
7
7
  </q-popup-proxy>
@@ -1,10 +1,10 @@
1
1
  <template>
2
2
  <q-dialog ref="dialogRef" class="qas-dialog" :class="classes" data-cy="dialog" v-bind="dialogProps" :persistent="props.persistent" @update:model-value="updateModelValue">
3
- <div class="bg-white q-pa-lg" :style="style">
4
- <header v-if="hasHeader" class="q-mb-lg">
3
+ <div class="bg-white q-pa-md" :style="style">
4
+ <header v-if="hasHeader" class="q-mb-md">
5
5
  <slot name="header">
6
6
  <div class="items-center justify-between row">
7
- <h5 class="text-h5" data-cy="dialog-title">{{ props.card.title }}</h5>
7
+ <qas-label data-cy="dialog-title" :label="props.card.title" margin="none" />
8
8
 
9
9
  <qas-btn v-if="isInfoDialog" v-close-popup color="grey-10" data-cy="dialog-close-btn" icon="sym_r_close" variant="tertiary" />
10
10
  </div>
@@ -1,27 +1,33 @@
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">
5
5
  <template #header>
6
6
  <slot name="header">
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>
7
+ <div class="full-width justify-between no-wrap row">
8
+ <div>
9
+ <slot name="header-left">
10
+ <div class="items-center q-col-gutter-sm row">
11
+ <slot name="label">
12
+ <h5 class="col-auto qas-expansion-item__label text-h5">
13
+ {{ props.label }}
14
+ </h5>
15
+ </slot>
16
+
17
+ <div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
18
+ <div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex" class="col-auto">
19
+ <qas-badge v-bind="badge" />
20
+ </div>
21
+ </div>
22
+ </div>
14
23
 
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" />
24
+ <div v-if="hasHeaderBottom" class="q-mt-sm">
25
+ <slot name="header-bottom" />
18
26
  </div>
19
- </div>
27
+ </slot>
20
28
  </div>
21
29
 
22
- <div v-if="hasHeaderBottom" class="q-mt-sm">
23
- <slot name="header-bottom" />
24
- </div>
30
+ <qas-btn class="qas-expansion-item__dropdown" color="grey-10" :disable="isDisabled" icon="sym_r_keyboard_arrow_up" />
25
31
  </div>
26
32
  </slot>
27
33
  </template>
@@ -60,6 +66,14 @@ const props = defineProps({
60
66
  default: () => []
61
67
  },
62
68
 
69
+ disable: {
70
+ type: Boolean
71
+ },
72
+
73
+ disableButton: {
74
+ type: Boolean
75
+ },
76
+
63
77
  error: {
64
78
  type: Boolean
65
79
  },
@@ -69,6 +83,11 @@ const props = defineProps({
69
83
  default: ''
70
84
  },
71
85
 
86
+ group: {
87
+ type: String,
88
+ default: ''
89
+ },
90
+
72
91
  label: {
73
92
  type: String,
74
93
  default: ''
@@ -85,6 +104,8 @@ const props = defineProps({
85
104
  }
86
105
  })
87
106
 
107
+ const modelValue = defineModel({ type: Boolean })
108
+
88
109
  const attrs = useAttrs()
89
110
 
90
111
  provide('isExpansionItem', true)
@@ -100,11 +121,14 @@ onMounted(setHasNextSibling)
100
121
 
101
122
  // constants
102
123
  const isNestedExpansionItem = inject('isExpansionItem', false)
124
+ const isNestedBox = inject('isBox', false)
125
+
103
126
  const component = {
104
127
  is: isNestedExpansionItem ? 'div' : QasBox
105
128
  }
106
129
 
107
130
  // computed
131
+ const hasBadges = computed(() => !!props.badges.length)
108
132
  const hasError = computed(() => props.error || !!props.errorMessage)
109
133
  const hasGridGenerator = computed(() => !!Object.keys(props.gridGeneratorProps).length)
110
134
  const hasBottomSeparator = computed(() => isNestedExpansionItem && hasNextSibling.value)
@@ -121,7 +145,13 @@ const hasHeaderSeparator = computed(() => {
121
145
  return typeof props.useHeaderSeparator === 'undefined' ? !isNestedExpansionItem : props.useHeaderSeparator
122
146
  })
123
147
 
124
- const errorClasses = computed(() => ({ 'qas-expansion-item--error': hasError.value }))
148
+ const classes = computed(() => {
149
+ return {
150
+ 'qas-expansion-item--error': hasError.value,
151
+ 'qas-expansion-item--disabled': props.disable || props.disableButton,
152
+ 'qas-expansion-item--disabled-full': props.disable
153
+ }
154
+ })
125
155
 
126
156
  const contentClasses = computed(() => {
127
157
  return {
@@ -142,11 +172,15 @@ const expansionProps = computed(() => {
142
172
  } = attrs
143
173
 
144
174
  return {
145
- parent: {
146
- ...propsPayload
147
- },
175
+ parent: propsPayload,
148
176
 
149
177
  item: {
178
+ disable: isDisabled.value,
179
+ hideExpandIcon: true,
180
+ label: props.label,
181
+ group: props.group,
182
+
183
+ // events
150
184
  onUpdateModelValue,
151
185
  onShow,
152
186
  onBeforeShow,
@@ -157,6 +191,23 @@ const expansionProps = computed(() => {
157
191
  }
158
192
  })
159
193
 
194
+ const boxProps = computed(() => {
195
+ /**
196
+ * Caso o QasExpansionItem estiver dentro de um QasBox e não for um QasExpansionItem
197
+ * dentro de outro QasExpansionItem, o componente terá uma borda.
198
+ */
199
+ const isBoxed = isNestedBox && !isNestedExpansionItem
200
+
201
+ if (!isBoxed) return {}
202
+
203
+ return {
204
+ unelevated: isBoxed,
205
+ outlined: isBoxed
206
+ }
207
+ })
208
+
209
+ const isDisabled = computed(() => props.disable || props.disableButton)
210
+
160
211
  // functions
161
212
 
162
213
  /**
@@ -177,10 +228,16 @@ function setHasNextSibling (value) {
177
228
  .qas-expansion-item {
178
229
  $root: &;
179
230
 
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;
231
+ &--disabled {
232
+ .q-item.disabled {
233
+ opacity: 1 !important;
234
+ }
235
+ }
236
+
237
+ &--disabled-full {
238
+ #{$root}__label {
239
+ color: $grey-6 !important;
240
+ }
184
241
  }
185
242
 
186
243
  &--error {
@@ -193,6 +250,24 @@ function setHasNextSibling (value) {
193
250
  }
194
251
  }
195
252
 
253
+ // em alguns casos quando usado com grid, o espaçamento afetava o header, com z-index o problema é resolvido
254
+ &__header {
255
+ position: relative;
256
+ z-index: 1;
257
+ }
258
+
259
+ .q-expansion-item {
260
+ #{$root}__dropdown {
261
+ transition: transform var(--qas-generic-transition);;
262
+ }
263
+
264
+ &--expanded {
265
+ #{$root}__dropdown {
266
+ transform: rotate(180deg);
267
+ }
268
+ }
269
+ }
270
+
196
271
  .q-item {
197
272
  margin-top: 0;
198
273
  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,20 @@ 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
+
23
43
  grid-generator-props:
24
44
  desc: Propriedades que serão repassadas para o QasGridGenerator.
25
45
  type: Object
@@ -31,13 +51,24 @@ props:
31
51
 
32
52
  slots:
33
53
  header:
34
- desc: 'Slot para substituir o conteúdo do header'
54
+ desc: Slot para substituir o conteúdo do header (incluindo o botão dropdown).
35
55
 
36
56
  header-bottom:
37
- desc: 'Slot para acessar o conteúdo que fica abaixo do header.'
57
+ desc: Slot para acessar o conteúdo que fica abaixo do header.
58
+
59
+ header-left:
60
+ desc: Slot para substituir o conteúdo do header á esquerda (não inclui o botão dropdown).
38
61
 
39
62
  label:
40
- desc: 'Slot para substituir o conteúdo da label do header.'
63
+ desc: Slot para substituir o conteúdo da label do header.
41
64
 
42
65
  content:
43
- desc: 'Slot para substituir o conteúdo principal do card.'
66
+ desc: Slot para substituir o conteúdo principal do card.
67
+
68
+ events:
69
+ '@update:model-value -> function(value)':
70
+ desc: Dispara quando o model-value altera, também usado para v-model.
71
+ params:
72
+ value:
73
+ desc: Novo valor do model.
74
+ 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,24 +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="fieldsetItem.label" :name="`legend-${fieldsetItemKey}`">
6
- <qas-label :label="fieldsetItem.label" :margin="getLabelMargin(fieldsetItem)" />
7
-
8
- <div v-if="fieldsetItem.description" class="q-mb-md text-body1 text-grey-8">{{ fieldsetItem.description }}</div>
5
+ <slot v-if="fieldsetItem.__isFieldset" :name="`legend-${fieldsetItemKey}`">
6
+ <qas-header v-bind="getHeaderProps(fieldsetItem)" />
9
7
  </slot>
10
8
 
11
9
  <div>
12
10
  <slot :fields="fieldsetItem.fields?.visible" :name="`legend-section-${fieldsetItemKey}`">
13
- <div class="items-end justify-end" :class="getRowContainerClasses(fieldsetItem)">
14
- <div :class="fieldContainerClasses">
15
- <div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
16
- <slot :field="field" :name="`field-${field.name}`">
17
- <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 })" />
18
- </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>
19
19
  </div>
20
20
  </div>
21
21
 
22
- <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>
23
25
  </div>
24
26
 
25
27
  <div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
@@ -29,6 +31,8 @@
29
31
  </div>
30
32
  </slot>
31
33
  </div>
34
+
35
+ <slot v-if="fieldsetItem.__isFieldset" :name="`legend-bottom-${fieldsetItemKey}`" />
32
36
  </component>
33
37
  </div>
34
38
  </div>
@@ -170,7 +174,11 @@ const normalizedFields = computed(() => {
170
174
  description: fieldsetItem.description,
171
175
  column: fieldsetItem.column,
172
176
  buttonProps: fieldsetItem.buttonProps,
173
- fields: { hidden: {}, visible: {} }
177
+ fields: { hidden: {}, visible: {} },
178
+ headerProps: fieldsetItem.headerProps,
179
+
180
+ // Indica que existe um fieldset para que o QasHeader possa ser renderizado
181
+ __isFieldset: true
174
182
  }
175
183
 
176
184
  fieldsetItem.fields.forEach(fieldName => {
@@ -198,13 +206,22 @@ const fieldContainerClasses = computed(() => {
198
206
  ]
199
207
  })
200
208
 
201
- // methods
209
+ // functions
202
210
  function getFieldType ({ type }) {
203
211
  return type === 'hidden' ? 'hidden' : 'visible'
204
212
  }
205
213
 
206
- function getLabelMargin (fieldsetItem) {
207
- return fieldsetItem.description ? 'sm' : 'md'
214
+ function getHeaderProps (fieldsetItem) {
215
+ return {
216
+ description: fieldsetItem.description,
217
+
218
+ labelProps: {
219
+ ...fieldsetItem.headerProps?.labelProps,
220
+ ...(fieldsetItem.label && { label: fieldsetItem.label })
221
+ },
222
+
223
+ ...fieldsetItem.headerProps
224
+ }
208
225
  }
209
226
 
210
227
  function isFieldDisabled ({ disable }) {
@@ -222,10 +239,6 @@ function hasButtonProps ({ buttonProps = {} }) {
222
239
  return !!Object.keys(buttonProps).length
223
240
  }
224
241
 
225
- function getRowContainerClasses (item) {
226
- return { row: hasButtonProps(item) }
227
- }
228
-
229
242
  // composables
230
243
  function useFieldset ({ props }) {
231
244
  const fieldsetClasses = computed(() => {
@@ -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.