@awes-io/ui 2.143.0 → 2.144.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 (86) hide show
  1. package/assets/css/components/action-card.css +1 -0
  2. package/assets/css/components/action-icon.css +2 -2
  3. package/assets/css/components/alert.css +28 -22
  4. package/assets/css/components/animation.css +14 -0
  5. package/assets/css/components/badge.css +1 -0
  6. package/assets/css/components/banner-text.css +15 -4
  7. package/assets/css/components/card.css +0 -1
  8. package/assets/css/components/content-placeholder.css +4 -3
  9. package/assets/css/components/dropdown.css +20 -7
  10. package/assets/css/components/icon-menu-item.css +12 -7
  11. package/assets/css/components/mobile-menu-nav.css +8 -4
  12. package/assets/css/components/text-field.css +4 -0
  13. package/components/1_atoms/AwActionIcon.vue +11 -2
  14. package/components/1_atoms/AwFlow.vue +26 -11
  15. package/components/1_atoms/AwGrid.vue +11 -3
  16. package/components/1_atoms/AwIcon/AwIcon.vue +5 -3
  17. package/components/1_atoms/AwIcon/AwIconSystemMono.vue +3 -2
  18. package/components/1_atoms/AwInput.vue +2 -2
  19. package/components/1_atoms/AwList.vue +3 -1
  20. package/components/1_atoms/AwRadio.vue +1 -1
  21. package/components/1_atoms/AwSlider.vue +15 -1
  22. package/components/1_atoms/AwTag.vue +6 -1
  23. package/components/2_molecules/AwAlert.vue +63 -42
  24. package/components/2_molecules/AwBadge.vue +1 -1
  25. package/components/2_molecules/AwBannerText.vue +8 -2
  26. package/components/2_molecules/AwDescriptionInput.vue +19 -1
  27. package/components/3_organisms/AwBottomBar.vue +22 -4
  28. package/components/3_organisms/AwSubnav.vue +11 -1
  29. package/components/3_organisms/AwTable/AwTableBuilder.vue +8 -0
  30. package/components/3_organisms/AwTable/_AwTableCellDropdown.vue +6 -1
  31. package/components/3_organisms/AwTable/_AwTableRow.vue +2 -1
  32. package/components/4_pages/AwPage.vue +1 -0
  33. package/components/5_layouts/_AwMenuItemIcon.vue +9 -2
  34. package/components/5_layouts/_AwMobileMenuItem.vue +5 -3
  35. package/components/_config.js +26 -1
  36. package/docs/components/atoms/aw-accordion-fold.md +55 -17
  37. package/docs/components/atoms/aw-action-card-body.md +37 -5
  38. package/docs/components/atoms/aw-action-card.md +47 -11
  39. package/docs/components/atoms/aw-action-icon.md +50 -12
  40. package/docs/components/atoms/aw-card.md +35 -10
  41. package/docs/components/atoms/aw-checkbox.md +176 -0
  42. package/docs/components/atoms/aw-content-placeholder.md +33 -2
  43. package/docs/components/atoms/aw-dock.md +20 -14
  44. package/docs/components/atoms/aw-dropdown.md +72 -22
  45. package/docs/components/atoms/aw-flow.md +71 -23
  46. package/docs/components/atoms/aw-grid.md +30 -12
  47. package/docs/components/atoms/aw-icon-system-color.md +1 -0
  48. package/docs/components/atoms/aw-icon-system-mono.md +1 -0
  49. package/docs/components/atoms/aw-icon.md +3 -3
  50. package/docs/components/atoms/aw-info.md +38 -0
  51. package/docs/components/atoms/aw-input.md +94 -2
  52. package/docs/components/atoms/aw-label.md +62 -9
  53. package/docs/components/atoms/aw-link.md +61 -9
  54. package/docs/components/atoms/aw-list.md +68 -4
  55. package/docs/components/atoms/aw-progress.md +52 -3
  56. package/docs/components/atoms/aw-radio.md +73 -0
  57. package/docs/components/atoms/aw-select-native.md +128 -0
  58. package/docs/components/atoms/aw-slider.md +114 -7
  59. package/docs/components/atoms/aw-switcher.md +77 -0
  60. package/docs/components/atoms/aw-tag.md +67 -3
  61. package/docs/components/atoms/aw-toggler.md +22 -1
  62. package/docs/components/molecules/aw-action-button.md +58 -11
  63. package/docs/components/molecules/aw-alert.md +122 -27
  64. package/docs/components/molecules/aw-badge.md +31 -10
  65. package/docs/components/molecules/aw-banner-text.md +84 -18
  66. package/docs/components/molecules/aw-button-nav.md +65 -0
  67. package/docs/components/molecules/aw-button.md +76 -6
  68. package/docs/components/molecules/aw-description-input.md +63 -6
  69. package/docs/components/molecules/aw-empty-container.md +172 -23
  70. package/docs/components/molecules/aw-island.md +282 -10
  71. package/docs/components/organisms/aw-filter-select.md +14 -0
  72. package/docs/components/pages/aw-page-single.md +47 -0
  73. package/docs/guides/page-patterns/detail-pages.md +89 -26
  74. package/docs/guides/page-patterns/list-pages.md +158 -10
  75. package/docs/reference/colors.md +232 -0
  76. package/docs/reference/icons.md +163 -0
  77. package/docs/reference/troubleshooting.md +19 -0
  78. package/package.json +2 -2
  79. package/store/awesIo.js +11 -0
  80. package/CHANGELOG.md +0 -4544
  81. package/dist/css/aw-icons.css +0 -26
  82. package/dist/fonts/aw-icons.svg +0 -18
  83. package/dist/fonts/aw-icons.ttf +0 -0
  84. package/dist/fonts/aw-icons.woff +0 -0
  85. package/dist/fonts/aw-icons.woff2 +0 -0
  86. package/nuxt/icons.css +0 -26
@@ -1,57 +1,72 @@
1
1
  <template>
2
- <div
3
- class="aw-alert"
4
- :class="{ 'aw-alert--color-default': isDefaultColor }"
5
- :style="styleVariables"
6
- >
7
- <AwDescription tag="div" class="aw-alert__title">
8
- <span v-if="icon || $scopedSlots.icon" class="aw-alert__icon">
9
- <slot name="icon">
10
- <AwIcon
11
- v-if="icon"
12
- :name="icon"
13
- :style="{
14
- color: iconColor ? `var(--c-${iconColor})` : null
15
- }"
16
- size="16"
17
- />
18
- </slot>
19
- </span>
20
-
21
- <span class="aw-alert__title-text">
22
- <slot name="title">{{ title }}</slot>
23
-
24
- <slot name="description">
25
- <span v-if="description" class="font-normal block mt-1">
26
- {{ description }}
2
+ <div class="aw-alert" :style="styleVariables">
3
+ <div>
4
+ <AwDescription tag="div" class="aw-alert__title">
5
+ <span v-if="icon || $scopedSlots.icon" class="aw-alert__icon">
6
+ <slot name="icon">
7
+ <AwIcon
8
+ v-if="icon"
9
+ :name="icon"
10
+ :color="iconColor"
11
+ size="16"
12
+ />
13
+ </slot>
14
+ </span>
15
+
16
+ <span class="aw-alert__title-text">
17
+ <slot name="title">{{ title }}</slot>
18
+
19
+ <slot name="description">
20
+ <span v-if="description" class="font-normal block mt-1">
21
+ {{ description }}
22
+ </span>
23
+ </slot>
24
+
25
+ <span v-if="$scopedSlots.default" class="aw-alert__buttons">
26
+ <slot />
27
27
  </span>
28
- </slot>
29
- </span>
30
- </AwDescription>
28
+ </span>
29
+ </AwDescription>
30
+ </div>
31
31
 
32
- <div v-if="$scopedSlots.default" class="aw-alert__buttons">
33
- <slot />
32
+ <div v-if="$scopedSlots.close" class="aw-alert__close">
33
+ <slot name="close" />
34
34
  </div>
35
35
  </div>
36
36
  </template>
37
37
 
38
38
  <script>
39
- import { toOnColor } from '@AwUtils/styles'
39
+ import { toColor, toOnColor } from '@AwUtils/styles'
40
+ import { pathOr } from 'rambdax'
41
+ import { AwAlert as _config } from '@AwConfig'
42
+ import { conf } from '@AwUtils/component'
40
43
 
41
44
  export default {
42
45
  name: 'AwAlert',
43
46
 
47
+ _config,
48
+
44
49
  props: {
45
50
  icon: {
46
51
  type: String,
47
52
  default: ''
48
53
  },
49
54
 
50
- color: {
55
+ config: {
51
56
  type: String,
52
57
  default: 'default'
53
58
  },
54
59
 
60
+ color: {
61
+ type: String,
62
+ default: ''
63
+ },
64
+
65
+ onColor: {
66
+ type: String,
67
+ default: ''
68
+ },
69
+
55
70
  iconColor: {
56
71
  type: String,
57
72
  default: ''
@@ -69,19 +84,25 @@ export default {
69
84
  },
70
85
 
71
86
  computed: {
72
- isCustomColor() {
73
- return this.color && this.color !== 'default'
74
- },
87
+ styleVariables() {
88
+ const CONFIG = conf(this, 'configColors')
75
89
 
76
- isDefaultColor() {
77
- return this.color === 'default'
78
- },
90
+ let color = pathOr('', `${this.config}.color`, CONFIG)
91
+ let onColor = pathOr('', `${this.config}.onColor`, CONFIG)
92
+
93
+ if (this.color) {
94
+ color = this.color
95
+ }
96
+
97
+ if (this.onColor) {
98
+ onColor = this.onColor
99
+ }
79
100
 
80
- styleVariables() {
81
101
  return {
82
- '--aw-alert-color': this.isCustomColor
83
- ? toOnColor(this.color)
84
- : null
102
+ '--aw-alert-color': toColor(color),
103
+ '--aw-alert-on-color': onColor
104
+ ? toOnColor(onColor)
105
+ : toOnColor(color)
85
106
  }
86
107
  }
87
108
  }
@@ -2,7 +2,7 @@
2
2
  <span
3
3
  :class="[data.staticClass, data.class]"
4
4
  :style="[data.staticStyle, data.style]"
5
- class="aw-badge inline-flex items-center"
5
+ class="aw-badge inline-flex items-center gap-1"
6
6
  >
7
7
  <!-- Content passed to component -->
8
8
  <slot></slot>
@@ -2,7 +2,10 @@
2
2
  <div class="aw-banner-text">
3
3
  <div
4
4
  class="aw-banner-text__icon"
5
- :class="{ 'aw-banner-text__icon--rounded': rounded }"
5
+ :class="{
6
+ 'aw-banner-text__icon--rounded': rounded,
7
+ 'aw-banner-text__icon--square': !rounded
8
+ }"
6
9
  :style="{ backgroundImage: src ? `url(${src})` : null }"
7
10
  >
8
11
  <slot name="icon">
@@ -19,6 +22,7 @@
19
22
  <AwSubHeadline class="aw-banner-text__title">
20
23
  <slot name="title">{{ title }}</slot>
21
24
  <AwIconSystemMono
25
+ v-if="titleArrow"
22
26
  name="angle"
23
27
  rotate="180"
24
28
  class="aw-banner-text__title-arrow"
@@ -61,7 +65,9 @@ export default {
61
65
  default: ''
62
66
  },
63
67
 
64
- rounded: {
68
+ rounded: Boolean,
69
+
70
+ titleArrow: {
65
71
  type: Boolean,
66
72
  default: true
67
73
  }
@@ -1,11 +1,25 @@
1
1
  <template>
2
2
  <div>
3
3
  <slot />
4
- <AwDescription v-if="text != ''" class="mt-2 inline-block" v-html="text" />
4
+ <AwDescription
5
+ v-if="text && !$scopedSlots.text"
6
+ key="default"
7
+ class="mt-2 inline-block"
8
+ v-html="sanitize(text)"
9
+ />
10
+ <AwDescription
11
+ v-else-if="$scopedSlots.text"
12
+ key="textslot"
13
+ class="mt-2 inline-block"
14
+ >
15
+ <slot name="text"></slot>
16
+ </AwDescription>
5
17
  </div>
6
18
  </template>
7
19
 
8
20
  <script>
21
+ import { sanitize } from '@AwUtils/string'
22
+
9
23
  export default {
10
24
  name: 'AwDescriptionInput',
11
25
 
@@ -14,6 +28,10 @@ export default {
14
28
  type: String,
15
29
  default: ''
16
30
  }
31
+ },
32
+
33
+ methods: {
34
+ sanitize
17
35
  }
18
36
  }
19
37
  </script>
@@ -1,5 +1,10 @@
1
1
  <template>
2
- <div v-if="showMenu" class="aw-bottom-bar" :style="itemMaxWidthVar" @click="scrollToTopOnCurrent">
2
+ <div
3
+ v-if="showMenu"
4
+ class="aw-bottom-bar"
5
+ :style="itemMaxWidthVar"
6
+ @click="scrollToTopOnCurrent"
7
+ >
3
8
  <slot name="bottom-bar-items">
4
9
  <AwMenuItemIcon
5
10
  v-for="(item, i) in items"
@@ -11,7 +16,13 @@
11
16
  </slot>
12
17
 
13
18
  <slot name="bottom-bar-toggler">
19
+ <Component
20
+ v-if="bottomBarMoreMenuItemComponent"
21
+ :is="bottomBarMoreMenuItemComponent.is"
22
+ />
23
+
14
24
  <AwMenuItemIcon
25
+ v-else
15
26
  :text="$t('Menu')"
16
27
  icon="menu-dots"
17
28
  :size="$options.ICON_SIZE"
@@ -43,6 +54,7 @@
43
54
  import { viewOr, lensProp, omit } from 'rambdax'
44
55
  import { getPath } from '@AwUtils/router'
45
56
  import AwMenuItemIcon from '@AwLayouts/_AwMenuItemIcon.vue'
57
+ import { mapGetters } from 'vuex'
46
58
 
47
59
  export const VISIBLE_ITEMS_COUNT = 4
48
60
 
@@ -66,8 +78,10 @@ export default {
66
78
  },
67
79
 
68
80
  computed: {
81
+ ...mapGetters('awesIo', ['bottomBarMoreMenuItemComponent']),
82
+
69
83
  itemMaxWidthVar() {
70
- return { '--item-width-percent': (100 / this.items.length + 1) + '%' }
84
+ return { '--item-width-percent': 100 / this.items.length + 1 + '%' }
71
85
  },
72
86
 
73
87
  actionButton() {
@@ -135,11 +149,15 @@ export default {
135
149
  },
136
150
 
137
151
  scrollToTopOnCurrent($event) {
138
- const link = $event.target.matches('a') ? $event.target : $event.target.closest('a')
152
+ const link = $event.target.matches('a')
153
+ ? $event.target
154
+ : $event.target.closest('a')
139
155
 
140
156
  if (!link) return
141
157
 
142
- if (getPath(link.getAttribute('href')) === getPath(this.$route.path)) {
158
+ if (
159
+ getPath(link.getAttribute('href')) === getPath(this.$route.path)
160
+ ) {
143
161
  window.scrollTo({ top: 0, behavior: 'smooth' })
144
162
  }
145
163
  }
@@ -1,5 +1,10 @@
1
1
  <template>
2
- <AwMobileMenuNav :title="_title" :items="_children" :all-divides="!hideSeparator" />
2
+ <AwMobileMenuNav
3
+ :title="_title"
4
+ :items="_children"
5
+ :all-divides="!hideSeparator"
6
+ :badge="badge"
7
+ />
3
8
  </template>
4
9
 
5
10
  <script>
@@ -24,6 +29,11 @@ export default {
24
29
  default: null
25
30
  },
26
31
 
32
+ badge: {
33
+ type: Object,
34
+ default: null
35
+ },
36
+
27
37
  hideTitle: Boolean,
28
38
 
29
39
  hideSeparator: Boolean
@@ -26,6 +26,14 @@
26
26
  theme="card"
27
27
  icon="awesio/search"
28
28
  :title="$t('No results were found for your request')"
29
+ :cta-button="{
30
+ text: $route.query.search
31
+ ? $t('Clear search')
32
+ : $t('Reset filters'),
33
+ href: { path: $route.path },
34
+ icon: 'awesio/delete',
35
+ theme: 'outline'
36
+ }"
29
37
  class="mb-5"
30
38
  />
31
39
  </slot>
@@ -14,7 +14,7 @@
14
14
  :options="{ placement: 'bottom-end' }"
15
15
  class="aw-table__aw-context-menu"
16
16
  >
17
- <slot :cell="props.rowData"></slot>
17
+ <slot :cell="props.rowData" :index="props.index"></slot>
18
18
  </Component>
19
19
  </td>
20
20
  </template>
@@ -38,6 +38,11 @@ export default {
38
38
 
39
39
  rowData: {
40
40
  default: ''
41
+ },
42
+
43
+ index: {
44
+ type: Number,
45
+ required: true
41
46
  }
42
47
  }
43
48
  }
@@ -109,7 +109,8 @@ export default {
109
109
  isDesktop &&
110
110
  (!!dropdownSlot || hasRowClickListener),
111
111
  hasRowClickListener,
112
- rowData
112
+ rowData,
113
+ index
113
114
  },
114
115
  scopedSlots: { default: dropdownSlot }
115
116
  })
@@ -61,6 +61,7 @@
61
61
  }"
62
62
  >
63
63
  {{ title }}
64
+ <slot name="after-title"></slot>
64
65
  </h1>
65
66
  </slot>
66
67
  </template>
@@ -13,7 +13,13 @@
13
13
  class="aw-icon-menu-item__icon-block"
14
14
  tabindex="-1"
15
15
  v-tooltip:right="
16
- tooltip ? { content: text, offset: [0, 7], class: 'aw-icon-menu-item-tooltip' } : null
16
+ tooltip
17
+ ? {
18
+ content: text,
19
+ offset: [0, 7],
20
+ class: 'aw-icon-menu-item-tooltip'
21
+ }
22
+ : null
17
23
  "
18
24
  >
19
25
  <AwIcon
@@ -96,7 +102,8 @@ export default {
96
102
  'bg-success',
97
103
  'bg-warning',
98
104
  'bg-error',
99
- 'bg-info'
105
+ 'bg-info',
106
+ 'bg-blue'
100
107
  ].includes('bg-' + badge.color)
101
108
  : true
102
109
  }
@@ -27,7 +27,11 @@
27
27
  </span>
28
28
 
29
29
  <span class="aw-mobile-menu-item__text" tabindex="-1">
30
- <span v-html="text" />
30
+ <span class="flex items-center gap-2">
31
+ <span v-html="text" />
32
+
33
+ <AwBadge v-if="badge" v-bind="badge" />
34
+ </span>
31
35
 
32
36
  <span
33
37
  v-if="description"
@@ -49,8 +53,6 @@
49
53
  v-on="switcher.listeners"
50
54
  />
51
55
 
52
- <AwBadge v-if="badge" v-bind="badge" />
53
-
54
56
  <AwIconSystemMono
55
57
  v-if="_linkExternal"
56
58
  name="external"
@@ -266,6 +266,30 @@ export const AwToggleShowAside = {
266
266
  }
267
267
  }
268
268
 
269
+ export const AwAlert = {
270
+ configColors: {
271
+ info: {
272
+ color: 'light-grey',
273
+ onColor: 'blue'
274
+ },
275
+ success: {
276
+ color: 'green'
277
+ },
278
+ warning: {
279
+ color: 'yellow'
280
+ },
281
+ error: {
282
+ color: 'red'
283
+ },
284
+ grey: {
285
+ color: 'light-grey'
286
+ },
287
+ default: {
288
+ color: 'light-grey'
289
+ }
290
+ }
291
+ }
292
+
269
293
  export default {
270
294
  AwAvatar,
271
295
  AwBirthdayPicker,
@@ -290,5 +314,6 @@ export default {
290
314
  AwTable,
291
315
  AwTags,
292
316
  AwTel,
293
- AwToggleShowAside
317
+ AwToggleShowAside,
318
+ AwAlert
294
319
  }
@@ -21,42 +21,80 @@ The `AwAccordionFold` component provides a collapsible content wrapper with smoo
21
21
  ### Basic Example
22
22
 
23
23
  ```markup
24
+ <AwButton
25
+ :text="isOpen ? 'Close' : 'Open'"
26
+ color="mono"
27
+ @click="isOpen = !isOpen"
28
+ />
24
29
  <AwAccordionFold :show="isOpen">
25
- <p>Collapsible content</p>
30
+ <AwCard>
31
+ <AwDescription>Your content here</AwDescription>
32
+ </AwCard>
26
33
  </AwAccordionFold>
27
34
  ```
28
35
 
29
- ### With Toggle
36
+ ### Custom Tag
37
+
38
+ ```markup
39
+ <AwButton
40
+ text="Toggle Section"
41
+ color="mono"
42
+ @click="isOpen = !isOpen"
43
+ />
44
+ <AwAccordionFold :show="isOpen" tag="section">
45
+ <AwCard>
46
+ <AwDescription>Content wrapped in a section tag</AwDescription>
47
+ </AwCard>
48
+ </AwAccordionFold>
49
+ ```
50
+
51
+ ### Multiple Accordions (Single Open)
30
52
 
31
53
  ```markup
32
54
  <template>
33
- <div>
34
- <AwButton @click="isOpen = !isOpen">Toggle</AwButton>
35
- <AwAccordionFold :show="isOpen">
36
- <div>Content that expands and collapses</div>
37
- </AwAccordionFold>
38
- </div>
55
+ <AwGrid :gap="1">
56
+ <div v-for="(item, index) in items" :key="index">
57
+ <AwButton
58
+ :text="item.title"
59
+ color="mono"
60
+ class="w-full"
61
+ @click="toggleItem(index)"
62
+ />
63
+ <AwAccordionFold :show="openItems.includes(index)">
64
+ <AwCard>
65
+ {{ item.content }}
66
+ </AwCard>
67
+ </AwAccordionFold>
68
+ </div>
69
+ </AwGrid>
39
70
  </template>
40
71
 
41
72
  <script>
42
73
  export default {
43
74
  data() {
44
75
  return {
45
- isOpen: false
76
+ openItems: [],
77
+ items: [
78
+ { title: 'First Item', content: 'Content for the first accordion item.' },
79
+ { title: 'Second Item', content: 'Content for the second accordion item.' },
80
+ { title: 'Third Item', content: 'Content for the third accordion item.' }
81
+ ]
82
+ }
83
+ },
84
+ methods: {
85
+ toggleItem(index) {
86
+ const pos = this.openItems.indexOf(index)
87
+ if (pos > -1) {
88
+ this.openItems = []
89
+ } else {
90
+ this.openItems = [index]
91
+ }
46
92
  }
47
93
  }
48
94
  }
49
95
  </script>
50
96
  ```
51
97
 
52
- ### Custom Tag
53
-
54
- ```markup
55
- <AwAccordionFold :show="show" tag="section">
56
- <p>Content in a section tag</p>
57
- </AwAccordionFold>
58
- ```
59
-
60
98
  ## API
61
99
 
62
100
  ### Props
@@ -21,9 +21,9 @@ The `AwActionCardBody` component provides a structured body section for `AwActio
21
21
  ### Basic Example
22
22
 
23
23
  ```markup
24
- <AwActionCard title="Card Title">
24
+ <AwActionCard title="Parent Card">
25
25
  <AwActionCardBody>
26
- <p>Card content goes here</p>
26
+ <AwDescription tag="div">Body content here</AwDescription>
27
27
  </AwActionCardBody>
28
28
  </AwActionCard>
29
29
  ```
@@ -31,9 +31,39 @@ The `AwActionCardBody` component provides a structured body section for `AwActio
31
31
  ### With Title
32
32
 
33
33
  ```markup
34
- <AwActionCardBody title="Section Title">
35
- <p>Content with section title</p>
36
- </AwActionCardBody>
34
+ <AwActionCard title="Order Details">
35
+ <AwActionCardBody title="Order #12345">
36
+ <AwDescription tag="div">Status: Shipped</AwDescription>
37
+ </AwActionCardBody>
38
+ </AwActionCard>
39
+ ```
40
+
41
+ ### Multiple Bodies
42
+
43
+ ```markup
44
+ <AwActionCard title="User Profile">
45
+ <AwActionCardBody title="Personal Information">
46
+ <AwDescription tag="div">Name: John Doe</AwDescription>
47
+ </AwActionCardBody>
48
+ <AwActionCardBody title="Preferences">
49
+ <AwDescription tag="div">Language: English</AwDescription>
50
+ </AwActionCardBody>
51
+ </AwActionCard>
52
+ ```
53
+
54
+ ### With AwInfo for Stats
55
+
56
+ ```markup
57
+ <AwActionCard title="Dashboard Stats">
58
+ <AwActionCardBody>
59
+ <AwGrid :col="{ sm: 2 }">
60
+ <AwInfo label="Users" text="1,234" />
61
+ <AwInfo label="Revenue" text="$45,678" />
62
+ <AwInfo label="Orders" text="890" />
63
+ <AwInfo label="Growth" text="+12%" />
64
+ </AwGrid>
65
+ </AwActionCardBody>
66
+ </AwActionCard>
37
67
  ```
38
68
 
39
69
  ## API
@@ -58,6 +88,8 @@ No events are emitted by this component.
58
88
 
59
89
  - `AwActionCard` - Parent card component
60
90
  - `AwActionIcon` - Icon component for action cards
91
+ - `AwInfo` - Info component for displaying key-value pairs
92
+ - `AwDescription` - Description text component
61
93
 
62
94
  ## Notes
63
95