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

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 (54) 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/dialog/QasDialog.vue +3 -1
  11. package/src/components/field/QasField.vue +18 -13
  12. package/src/components/filters/QasFilters.vue +16 -7
  13. package/src/components/filters/private/PvFiltersButton.vue +2 -1
  14. package/src/components/form-generator/QasFormGenerator.vue +87 -26
  15. package/src/components/form-generator/QasFormGenerator.yml +21 -2
  16. package/src/components/gallery-card/QasGalleryCard.vue +10 -3
  17. package/src/components/grid-generator/QasGridGenerator.vue +22 -13
  18. package/src/components/grid-generator/QasGridGenerator.yml +18 -2
  19. package/src/components/grid-item/QasGridItem.vue +89 -0
  20. package/src/components/grid-item/QasGridItem.yml +22 -0
  21. package/src/components/header/QasHeader.vue +106 -0
  22. package/src/components/header/QasHeader.yml +45 -0
  23. package/src/components/info/QasInfo.vue +155 -0
  24. package/src/components/info/QasInfo.yml +34 -0
  25. package/src/components/input/QasInput.vue +48 -3
  26. package/src/components/input/QasInput.yml +10 -0
  27. package/src/components/nested-fields/QasNestedFields.vue +58 -47
  28. package/src/components/nested-fields/QasNestedFields.yml +5 -0
  29. package/src/components/numeric-input/QasNumericInput.vue +38 -3
  30. package/src/components/numeric-input/QasNumericInput.yml +10 -0
  31. package/src/components/page-header/QasPageHeader.vue +5 -5
  32. package/src/components/page-header/QasPageHeader.yml +2 -2
  33. package/src/components/radio/QasRadio.vue +43 -0
  34. package/src/components/radio/QasRadio.yml +5 -0
  35. package/src/components/search-input/QasSearchInput.vue +26 -19
  36. package/src/components/select/QasSelect.vue +82 -10
  37. package/src/components/select-list-dialog/QasSelectListDialog.vue +14 -7
  38. package/src/components/table-generator/QasTableGenerator.vue +30 -5
  39. package/src/components/table-generator/QasTableGenerator.yml +9 -0
  40. package/src/components/tabs-generator/QasTabsGenerator.vue +3 -1
  41. package/src/components/toggle/QasToggle.vue +14 -0
  42. package/src/components/toggle/QasToggle.yml +5 -0
  43. package/src/composables/private/use-generator.js +9 -1
  44. package/src/css/components/checkbox.scss +2 -0
  45. package/src/css/components/field.scss +59 -2
  46. package/src/css/components/radio.scss +3 -1
  47. package/src/css/components/toggle.scss +3 -1
  48. package/src/css/utils/border.scss +5 -0
  49. package/src/helpers/get-placeholder.js +19 -0
  50. package/src/helpers/index.js +1 -0
  51. package/src/vue-plugin.js +18 -6
  52. package/src/components/header-actions/QasHeaderActions.vue +0 -76
  53. package/src/components/header-actions/QasHeaderActions.yml +0 -38
  54. /package/src/components/{checkbox-group/QasCheckboxGroup.yml → checkbox/QasCheckbox.yml} +0 -0
@@ -1,26 +1,35 @@
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="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>
19
+ </div>
20
+ </div>
21
+
22
+ <qas-btn v-if="hasButtonProps(fieldsetItem)" class="md:q-mt-none q-ml-md q-mt-md" v-bind="fieldsetItem.buttonProps" />
23
+ </div>
24
+
25
+ <div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
26
+ <slot :field="field" :name="`field-${field.name}`">
27
+ <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 })" />
28
+ </slot>
29
+ </div>
21
30
  </slot>
22
31
  </div>
23
- </div>
32
+ </component>
24
33
  </div>
25
34
  </div>
26
35
  </template>
@@ -29,13 +38,19 @@
29
38
  import { gutterValidator } from '../../helpers/private/gutter-validator'
30
39
  import useGenerator, { baseProps } from '../../composables/private/use-generator'
31
40
  import { Spacing } from '../../enums/Spacing'
32
- import { computed } from 'vue'
41
+ import { useScreen } from '../../composables'
42
+ import { computed, provide, inject } from 'vue'
33
43
 
34
44
  defineOptions({ name: 'QasFormGenerator' })
35
45
 
36
46
  const props = defineProps({
37
47
  ...baseProps,
38
48
 
49
+ boxProps: {
50
+ default: () => ({}),
51
+ type: Object
52
+ },
53
+
39
54
  disable: {
40
55
  type: Boolean
41
56
  },
@@ -70,17 +85,44 @@ const props = defineProps({
70
85
  order: {
71
86
  default: () => [],
72
87
  type: Array
88
+ },
89
+
90
+ useBox: {
91
+ type: Boolean
73
92
  }
74
93
  })
75
94
 
76
95
  const emit = defineEmits(['update:modelValue'])
77
96
 
97
+ provide('isFormGenerator', true)
98
+
78
99
  // composables
79
- const { classes, getFieldClass } = useGenerator({ props })
100
+ const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
80
101
 
81
102
  const { fieldsetClasses, hasFieldset } = useFieldset({ props })
82
103
 
104
+ const screen = useScreen()
105
+
106
+ // constants
107
+ const hasNestedFormGenerator = inject('isFormGenerator', false)
108
+
83
109
  // computed
110
+
111
+ /**
112
+ * Se o QasFormGenerator tiver um elemento acima que também é um QasFormGenerator,
113
+ * mesmo que a propriedade useBox seja true, o componente não deve renderizar o box.
114
+ */
115
+ const containerComponent = computed(() => {
116
+ const hasBox = props.useBox && !hasNestedFormGenerator
117
+
118
+ return {
119
+ is: hasBox ? 'qas-box' : 'div',
120
+ props: {
121
+ ...(hasBox && { ...props.boxProps })
122
+ }
123
+ }
124
+ })
125
+
84
126
  const groupedFields = computed(() => {
85
127
  const fields = { hidden: {}, visible: {} }
86
128
 
@@ -126,6 +168,8 @@ const normalizedFields = computed(() => {
126
168
  fields[fieldsetKey] = {
127
169
  label: fieldsetItem.label,
128
170
  description: fieldsetItem.description,
171
+ column: fieldsetItem.column,
172
+ buttonProps: fieldsetItem.buttonProps,
129
173
  fields: { hidden: {}, visible: {} }
130
174
  }
131
175
 
@@ -145,11 +189,24 @@ const normalizedFields = computed(() => {
145
189
  return fields
146
190
  })
147
191
 
192
+ const fieldContainerClasses = computed(() => {
193
+ return [
194
+ ...classes.value,
195
+ {
196
+ col: !screen.isSmall
197
+ }
198
+ ]
199
+ })
200
+
148
201
  // methods
149
202
  function getFieldType ({ type }) {
150
203
  return type === 'hidden' ? 'hidden' : 'visible'
151
204
  }
152
205
 
206
+ function getLabelMargin (fieldsetItem) {
207
+ return fieldsetItem.description ? 'sm' : 'md'
208
+ }
209
+
153
210
  function isFieldDisabled ({ disable }) {
154
211
  return disable || props.disable
155
212
  }
@@ -161,13 +218,21 @@ function updateModelValue ({ key, value }) {
161
218
  emit('update:modelValue', models)
162
219
  }
163
220
 
221
+ function hasButtonProps ({ buttonProps = {} }) {
222
+ return !!Object.keys(buttonProps).length
223
+ }
224
+
225
+ function getRowContainerClasses (item) {
226
+ return { row: hasButtonProps(item) }
227
+ }
228
+
164
229
  // composables
165
230
  function useFieldset ({ props }) {
166
231
  const fieldsetClasses = computed(() => {
167
232
  const classes = ['row']
168
233
 
169
234
  if (props.fieldsetGutter) {
170
- classes.push(`q-col-gutter-y-${props.fieldsetGutter}`)
235
+ classes.push(`q-col-gutter-${props.fieldsetGutter}`)
171
236
  }
172
237
 
173
238
  return classes
@@ -180,8 +245,4 @@ function useFieldset ({ props }) {
180
245
  hasFieldset
181
246
  }
182
247
  }
183
-
184
- function getLabelMargin (fieldsetItem) {
185
- return fieldsetItem.description ? 'sm' : 'md'
186
- }
187
248
  </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).