@bildvitta/quasar-ui-asteroid 3.16.1 → 3.17.0-beta.0

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 (50) hide show
  1. package/package.json +1 -1
  2. package/src/components/badge/QasBadge.vue +51 -3
  3. package/src/components/badge/QasBadge.yml +29 -2
  4. package/src/components/box/QasBox.vue +26 -3
  5. package/src/components/box/QasBox.yml +16 -0
  6. package/src/components/card/QasCard.vue +38 -25
  7. package/src/components/chart-view/QasChartView.vue +13 -13
  8. package/src/components/{checkbox-group/QasCheckboxGroup.vue → checkbox/QasCheckbox.vue} +34 -12
  9. package/src/components/date-time-input/QasDateTimeInput.vue +13 -3
  10. package/src/components/field/QasField.vue +18 -13
  11. package/src/components/filters/QasFilters.vue +16 -7
  12. package/src/components/filters/private/PvFiltersButton.vue +2 -1
  13. package/src/components/form-generator/QasFormGenerator.vue +62 -26
  14. package/src/components/form-generator/QasFormGenerator.yml +21 -2
  15. package/src/components/gallery-card/QasGalleryCard.vue +10 -3
  16. package/src/components/grid-generator/QasGridGenerator.vue +22 -13
  17. package/src/components/grid-generator/QasGridGenerator.yml +18 -2
  18. package/src/components/grid-item/QasGridItem.vue +89 -0
  19. package/src/components/grid-item/QasGridItem.yml +22 -0
  20. package/src/components/header/QasHeader.vue +106 -0
  21. package/src/components/header/QasHeader.yml +45 -0
  22. package/src/components/info/QasInfo.vue +155 -0
  23. package/src/components/info/QasInfo.yml +34 -0
  24. package/src/components/input/QasInput.vue +48 -3
  25. package/src/components/input/QasInput.yml +10 -0
  26. package/src/components/nested-fields/QasNestedFields.vue +58 -47
  27. package/src/components/nested-fields/QasNestedFields.yml +5 -0
  28. package/src/components/numeric-input/QasNumericInput.vue +38 -3
  29. package/src/components/numeric-input/QasNumericInput.yml +10 -0
  30. package/src/components/page-header/QasPageHeader.vue +5 -5
  31. package/src/components/page-header/QasPageHeader.yml +2 -2
  32. package/src/components/radio/QasRadio.vue +43 -0
  33. package/src/components/radio/QasRadio.yml +5 -0
  34. package/src/components/search-input/QasSearchInput.vue +7 -19
  35. package/src/components/select/QasSelect.vue +82 -10
  36. package/src/components/table-generator/QasTableGenerator.vue +2 -5
  37. package/src/components/tabs-generator/QasTabsGenerator.vue +3 -1
  38. package/src/components/toggle/QasToggle.vue +14 -0
  39. package/src/components/toggle/QasToggle.yml +5 -0
  40. package/src/composables/private/use-generator.js +9 -1
  41. package/src/css/components/checkbox.scss +2 -0
  42. package/src/css/components/field.scss +59 -2
  43. package/src/css/components/radio.scss +3 -1
  44. package/src/css/components/toggle.scss +3 -1
  45. package/src/helpers/get-placeholder.js +19 -0
  46. package/src/helpers/index.js +1 -0
  47. package/src/vue-plugin.js +18 -6
  48. package/src/components/header-actions/QasHeaderActions.vue +0 -76
  49. package/src/components/header-actions/QasHeaderActions.yml +0 -38
  50. /package/src/components/{checkbox-group/QasCheckboxGroup.yml → checkbox/QasCheckbox.yml} +0 -0
@@ -1,26 +1,31 @@
1
1
  <template>
2
2
  <div :class="fieldsetClasses">
3
- <div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" class="full-width">
4
- <slot v-if="fieldsetItem.label" :name="`legend-${fieldsetItemKey}`">
5
- <qas-label :label="fieldsetItem.label" :margin="getLabelMargin(fieldsetItem)" />
6
- <div v-if="fieldsetItem.description" class="q-mb-md text-body1 text-grey-8">{{ fieldsetItem.description }}</div>
7
- </slot>
8
-
9
- <div>
10
- <div :class="classes">
11
- <div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
12
- <slot :field="field" :name="`field-${field.name}`">
13
- <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 })" />
14
- </slot>
15
- </div>
16
- </div>
17
-
18
- <div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
19
- <slot :field="field" :name="`field-${field.name}`">
20
- <qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
3
+ <div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" :class="getFieldSetColumnClass(fieldsetItem.column)">
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>
9
+ </slot>
10
+
11
+ <div>
12
+ <slot :fields="fieldsetItem.fields?.visible" :name="`legend-section-${fieldsetItemKey}`">
13
+ <div :class="classes">
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
+ </div>
20
+
21
+ <div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
22
+ <slot :field="field" :name="`field-${field.name}`">
23
+ <qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
24
+ </slot>
25
+ </div>
21
26
  </slot>
22
27
  </div>
23
- </div>
28
+ </component>
24
29
  </div>
25
30
  </div>
26
31
  </template>
@@ -29,13 +34,18 @@
29
34
  import { gutterValidator } from '../../helpers/private/gutter-validator'
30
35
  import useGenerator, { baseProps } from '../../composables/private/use-generator'
31
36
  import { Spacing } from '../../enums/Spacing'
32
- import { computed } from 'vue'
37
+ import { computed, provide, inject } from 'vue'
33
38
 
34
39
  defineOptions({ name: 'QasFormGenerator' })
35
40
 
36
41
  const props = defineProps({
37
42
  ...baseProps,
38
43
 
44
+ boxProps: {
45
+ default: () => ({}),
46
+ type: Object
47
+ },
48
+
39
49
  disable: {
40
50
  type: Boolean
41
51
  },
@@ -70,17 +80,42 @@ const props = defineProps({
70
80
  order: {
71
81
  default: () => [],
72
82
  type: Array
83
+ },
84
+
85
+ useBox: {
86
+ type: Boolean
73
87
  }
74
88
  })
75
89
 
76
90
  const emit = defineEmits(['update:modelValue'])
77
91
 
92
+ provide('isFormGenerator', true)
93
+
78
94
  // composables
79
- const { classes, getFieldClass } = useGenerator({ props })
95
+ const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
80
96
 
81
97
  const { fieldsetClasses, hasFieldset } = useFieldset({ props })
82
98
 
99
+ // constants
100
+ const hasNestedFormGenerator = inject('isFormGenerator', false)
101
+
83
102
  // computed
103
+
104
+ /**
105
+ * Se o QasFormGenerator tiver um elemento acima que também é um QasFormGenerator,
106
+ * mesmo que a propriedade useBox seja true, o componente não deve renderizar o box.
107
+ */
108
+ const containerComponent = computed(() => {
109
+ const hasBox = props.useBox && !hasNestedFormGenerator
110
+
111
+ return {
112
+ is: hasBox ? 'qas-box' : 'div',
113
+ props: {
114
+ ...(hasBox && { ...props.boxProps })
115
+ }
116
+ }
117
+ })
118
+
84
119
  const groupedFields = computed(() => {
85
120
  const fields = { hidden: {}, visible: {} }
86
121
 
@@ -126,6 +161,7 @@ const normalizedFields = computed(() => {
126
161
  fields[fieldsetKey] = {
127
162
  label: fieldsetItem.label,
128
163
  description: fieldsetItem.description,
164
+ column: fieldsetItem.column,
129
165
  fields: { hidden: {}, visible: {} }
130
166
  }
131
167
 
@@ -150,6 +186,10 @@ function getFieldType ({ type }) {
150
186
  return type === 'hidden' ? 'hidden' : 'visible'
151
187
  }
152
188
 
189
+ function getLabelMargin (fieldsetItem) {
190
+ return fieldsetItem.description ? 'sm' : 'md'
191
+ }
192
+
153
193
  function isFieldDisabled ({ disable }) {
154
194
  return disable || props.disable
155
195
  }
@@ -167,7 +207,7 @@ function useFieldset ({ props }) {
167
207
  const classes = ['row']
168
208
 
169
209
  if (props.fieldsetGutter) {
170
- classes.push(`q-col-gutter-y-${props.fieldsetGutter}`)
210
+ classes.push(`q-col-gutter-${props.fieldsetGutter}`)
171
211
  }
172
212
 
173
213
  return classes
@@ -180,8 +220,4 @@ function useFieldset ({ props }) {
180
220
  hasFieldset
181
221
  }
182
222
  }
183
-
184
- function getLabelMargin (fieldsetItem) {
185
- return fieldsetItem.description ? 'sm' : 'md'
186
- }
187
223
  </script>
@@ -19,6 +19,11 @@ props:
19
19
  default: "false"
20
20
  type: Boolean
21
21
 
22
+ box-props:
23
+ desc: Propriedades repassadas para o componente `QasBox`.
24
+ default: {}
25
+ type: Object
26
+
22
27
  error:
23
28
  desc: Objeto contendo propriedades contendo a mensagem de erro.
24
29
  default: {}
@@ -67,6 +72,11 @@ props:
67
72
  default: []
68
73
  type: Array
69
74
 
75
+ use-box:
76
+ desc: Contra QasBox dentro do form-generator e fieldset.
77
+ default: false
78
+ type: Boolean
79
+
70
80
  slots:
71
81
  'field-[nome-da-chave]':
72
82
  desc: Acessa o slot de um campo especifico.
@@ -75,8 +85,17 @@ slots:
75
85
  desc: Payload do campo atual.
76
86
  default: {}
77
87
  type: Object
78
- 'legend-[nome-da-chave]':
79
- desc: Acessa o slot de um rótulo (label).
88
+
89
+ 'legend-[nome-da-chave]':
90
+ desc: Acessa o slot de um rótulo (label).
91
+
92
+ 'legend-section-[nome-da-chave]':
93
+ desc: Acessa o slot da seção de fields daquele fieldset.
94
+ scope:
95
+ fields:
96
+ desc: Campos daquela seção.
97
+ default: {}
98
+ type: Object
80
99
 
81
100
  events:
82
101
  '@update:model-value -> function(value)':
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="bg-white q-pa-md qas-gallery-card rounded-borders shadow-2" :class="classes">
2
+ <qas-box class="bg-white qas-gallery-card" :class="classes" v-bind="boxProps">
3
3
  <header class="flat items-center no-wrap row" :class="headerClasses">
4
4
  <slot name="header">
5
5
  <div class="ellipsis q-mr-xs qas-gallery__name text-subtitle1">
@@ -45,11 +45,11 @@
45
45
  <qas-grid-generator v-if="hasGridGenerator" v-bind="props.gridGeneratorProps" />
46
46
  </slot>
47
47
  </div>
48
- </div>
48
+ </qas-box>
49
49
  </template>
50
50
 
51
51
  <script setup>
52
- import { computed, useSlots } from 'vue'
52
+ import { computed, useSlots, inject } from 'vue'
53
53
 
54
54
  defineOptions({ name: 'QasGalleryCard' })
55
55
 
@@ -91,6 +91,13 @@ const props = defineProps({
91
91
 
92
92
  const slots = useSlots()
93
93
 
94
+ const isInsideBox = inject('isBox', false)
95
+
96
+ const boxProps = {
97
+ outlined: isInsideBox,
98
+ unelevated: isInsideBox
99
+ }
100
+
94
101
  const errorClasses = [
95
102
  'bg-grey-4',
96
103
  'flex',
@@ -2,17 +2,27 @@
2
2
  <div :class="classes">
3
3
  <div v-for="(field, key) in fieldsByResult" :key="key" :class="getContainerClass({ key })">
4
4
  <slot :field="field" :name="`field-${field.name}`">
5
- <slot :field="field" name="header">
6
- <header :class="headerClass" :data-cy="`grid-generator-${field.name}-field`" :title="getTitle(field, 'label')">
7
- {{ field.label }}
8
- </header>
9
- </slot>
10
-
11
- <slot :field="field" name="content">
12
- <div :class="contentClass" :data-cy="`grid-generator-${field.name}-result`" :title="getTitle(field, 'formattedResult')">
13
- {{ field.formattedResult }}
14
- </div>
15
- </slot>
5
+ <qas-grid-item :use-ellipsis="props.useEllipsis" :use-inline="props.useInline">
6
+ <template #header>
7
+ <slot :field="field" :name="`header-field-${field.name}`">
8
+ <slot :field="field" name="header">
9
+ <div :class="headerClass" :data-cy="`grid-generator-${field.name}-field`" :title="getTitle(field, 'label')">
10
+ {{ field.label }}
11
+ </div>
12
+ </slot>
13
+ </slot>
14
+ </template>
15
+
16
+ <template #content>
17
+ <slot :field="field" :name="`content-field-${field.name}`">
18
+ <slot :field="field" name="content">
19
+ <div :class="contentClass" :data-cy="`grid-generator-${field.name}-result`" :title="getTitle(field, 'formattedResult')">
20
+ {{ field.formattedResult }}
21
+ </div>
22
+ </slot>
23
+ </slot>
24
+ </template>
25
+ </qas-grid-item>
16
26
  </slot>
17
27
  </div>
18
28
  </div>
@@ -91,8 +101,7 @@ const headerClass = computed(() => {
91
101
  props.headerClass,
92
102
 
93
103
  {
94
- ellipsis: !screen.isSmall && props.useEllipsis,
95
- 'text-bold': screen.isSmall || !props.useInline
104
+ ellipsis: !screen.isSmall && props.useEllipsis
96
105
  }
97
106
  ]
98
107
  })
@@ -63,7 +63,7 @@ props:
63
63
 
64
64
  slots:
65
65
  content:
66
- desc: Slot para o conteúdo (content).
66
+ desc: Slot para o conteúdo (valor) de todas os campos de uma vez.
67
67
  scope:
68
68
  field:
69
69
  desc: Conteúdo do field atual mais o resultado formatado.
@@ -79,7 +79,23 @@ slots:
79
79
  type: Object
80
80
 
81
81
  header:
82
- desc: Slot para o header.
82
+ desc: Slot para o header de todas os campos de uma vez.
83
+ scope:
84
+ field:
85
+ desc: Conteúdo do field atual mais o resultado formatado.
86
+ default: {}
87
+ type: Object
88
+
89
+ 'header-field-[nome-da-chave]':
90
+ desc: Slot para o header especifico de um field.
91
+ scope:
92
+ field:
93
+ desc: Conteúdo do field atual mais o resultado formatado.
94
+ default: {}
95
+ type: Object
96
+
97
+ 'content-field-[nome-da-chave]':
98
+ desc: Slot para o conteúdo (valor) especifico de um field.
83
99
  scope:
84
100
  field:
85
101
  desc: Conteúdo do field atual mais o resultado formatado.
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <div :class="classes.container">
3
+ <header v-bind="headerProps">
4
+ <slot name="header">
5
+ {{ props.label }}
6
+ </slot>
7
+ </header>
8
+
9
+ <div v-bind="contentProps">
10
+ <slot name="content">
11
+ {{ props.value }}
12
+ </slot>
13
+ </div>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup>
18
+ import { useScreen } from '../../composables'
19
+
20
+ import { computed } from 'vue'
21
+
22
+ defineOptions({ name: 'QasGridItem' })
23
+
24
+ const props = defineProps({
25
+ label: {
26
+ type: String,
27
+ default: ''
28
+ },
29
+
30
+ useEllipsis: {
31
+ default: true,
32
+ type: Boolean
33
+ },
34
+
35
+ useInline: {
36
+ type: Boolean
37
+ },
38
+
39
+ value: {
40
+ type: [String, Number, Boolean],
41
+ default: ''
42
+ }
43
+ })
44
+
45
+ const screen = useScreen()
46
+
47
+ // computed
48
+ const hasEllipsis = computed(() => props.useEllipsis && !screen.isSmall)
49
+
50
+ const classes = computed(() => {
51
+ const isInline = props.useInline && !screen.isSmall
52
+
53
+ return {
54
+ container: {
55
+ flex: isInline,
56
+ 'q-col-gutter-x-md': isInline,
57
+ 'justify-between': isInline,
58
+ 'col-12': isInline,
59
+ 'no-wrap': isInline
60
+ },
61
+
62
+ header: {
63
+ 'text-caption': !isInline,
64
+ 'text-body1': isInline
65
+ },
66
+
67
+ content: {
68
+ 'text-body1': !isInline,
69
+ 'text-grey-10': !isInline,
70
+ 'text-subtitle1': isInline,
71
+ ellipsis: hasEllipsis.value
72
+ }
73
+ }
74
+ })
75
+
76
+ const headerProps = computed(() => {
77
+ return {
78
+ class: classes.value.header,
79
+ ...(hasEllipsis.value && { title: props.label })
80
+ }
81
+ })
82
+
83
+ const contentProps = computed(() => {
84
+ return {
85
+ class: classes.value.content,
86
+ ...(hasEllipsis.value && { title: props.value })
87
+ }
88
+ })
89
+ </script>
@@ -0,0 +1,22 @@
1
+ type: component
2
+
3
+ meta:
4
+ desc: Componente para renderizar chave/valor comumente utilizado junto ao QasGridGenerator.
5
+
6
+ props:
7
+ label:
8
+ desc: Rótulo do header.
9
+ default: ''
10
+ type: String
11
+
12
+ value:
13
+ desc: Valor do conteúdo.
14
+ default: ''
15
+ type: [String, Number, Boolean]
16
+
17
+ slots:
18
+ content:
19
+ desc: Slot para o conteúdo (value).
20
+
21
+ header:
22
+ desc: Slot para o header (label).
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <div :class="containerClasses">
3
+ <div v-if="hasLabelSection" class="items-center justify-between no-wrap row" :class="labelSectionClasses">
4
+ <div class="items-center q-col-gutter-sm row">
5
+ <slot name="label">
6
+ <qas-label v-bind="defaultLabelProps" />
7
+ </slot>
8
+
9
+ <div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
10
+ <div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex">
11
+ <qas-badge v-bind="badge" />
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ <slot name="actions">
17
+ <qas-actions-menu v-if="hasDefaultActionsMenu" v-bind="props.actionsMenuProps" />
18
+
19
+ <qas-btn v-if="hasDefaultButton" :use-label-on-small-screen="false" v-bind="props.buttonProps" />
20
+ </slot>
21
+ </div>
22
+
23
+ <div class="items-start justify-between no-wrap q-col-gutter-sm row">
24
+ <div v-if="hasDescriptionSection" class="text-body1 text-grey-8">
25
+ <slot name="description">
26
+ {{ props.description }}
27
+ </slot>
28
+ </div>
29
+
30
+ <div v-if="!hasLabelSection" class="justify-end row">
31
+ <slot name="actions">
32
+ <qas-actions-menu v-if="hasDefaultActionsMenu" v-bind="props.actionsMenuProps" />
33
+
34
+ <qas-btn v-if="hasDefaultButton" :use-label-on-small-screen="false" v-bind="props.buttonProps" />
35
+ </slot>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </template>
40
+
41
+ <script setup>
42
+ import { Spacing } from '../../enums/Spacing'
43
+ import { gutterValidator } from '../../helpers/private/gutter-validator'
44
+
45
+ import { computed, useSlots } from 'vue'
46
+
47
+ defineOptions({ name: 'QasHeader' })
48
+
49
+ const props = defineProps({
50
+ actionsMenuProps: {
51
+ type: Object,
52
+ default: () => ({})
53
+ },
54
+
55
+ badges: {
56
+ type: Array,
57
+ default: () => []
58
+ },
59
+
60
+ buttonProps: {
61
+ default: () => ({}),
62
+ type: Object
63
+ },
64
+
65
+ description: {
66
+ type: String,
67
+ default: ''
68
+ },
69
+
70
+ labelProps: {
71
+ type: Object,
72
+ default: () => ({})
73
+ },
74
+
75
+ spacing: {
76
+ default: Spacing.Xl,
77
+ type: String,
78
+ validator: gutterValidator
79
+ }
80
+ })
81
+
82
+ const slots = useSlots()
83
+
84
+ // computed
85
+ const containerClasses = computed(() => `q-mb-${props.spacing}`)
86
+
87
+ const labelSectionClasses = computed(() => {
88
+ return {
89
+ 'q-mb-xs': hasBadges.value
90
+ }
91
+ })
92
+
93
+ const defaultLabelProps = computed(() => {
94
+ return {
95
+ margin: hasBadges.value ? 'none' : 'xs',
96
+ ...props.labelProps
97
+ }
98
+ })
99
+
100
+ const hasBadges = computed(() => !!props.badges.length)
101
+ const hasLabel = computed(() => !!Object.keys(props.labelProps).length)
102
+ const hasDefaultButton = computed(() => !!Object.keys(props.buttonProps).length)
103
+ const hasDefaultActionsMenu = computed(() => !!Object.keys(props.actionsMenuProps).length)
104
+ const hasDescriptionSection = computed(() => props.description || slots.description)
105
+ const hasLabelSection = computed(() => hasLabel.value || slots.label)
106
+ </script>
@@ -0,0 +1,45 @@
1
+ type: component
2
+
3
+ meta:
4
+ desc: Componente para cabeçalho composto por label (título), badges, descrição e ação.
5
+
6
+ props:
7
+ actions-menu-props:
8
+ desc: Propriedades do QasActionsMenu.
9
+ default: {}
10
+ type: Object
11
+
12
+ badges:
13
+ desc: Adiciona badges ao lado do titulo (QasLabel), caso não tenha titulo fica somente as bages acima da descrição.
14
+ default: []
15
+ type: Array
16
+
17
+ button-props:
18
+ desc: Propriedades do QasBtn.
19
+ default: {}
20
+ type: Object
21
+
22
+ description:
23
+ desc: Descrição da seção a esquerda.
24
+ type: String
25
+
26
+ label-props:
27
+ desc: Propriedades repassadas para o componente QasLabel.
28
+ type: Object
29
+ default: {}
30
+
31
+ spacing:
32
+ desc: Espaçamento entre o componente e o conteúdo abaixo.
33
+ default: xl
34
+ type: String
35
+ examples: [none, xs, sm, md, lg, xl, '2xl', '3xl', '4xl', '5xl']
36
+
37
+ slots:
38
+ actions:
39
+ desc: slot para acessar seção da direita (ações).
40
+
41
+ description:
42
+ desc: slot para acessar seção de descrição.
43
+
44
+ label:
45
+ desc: slot para acessar o label (título).