@imaginario27/air-ui-ds 1.0.22 → 1.1.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 (75) hide show
  1. package/components/accordions/AccordionItem.vue +1 -1
  2. package/components/alerts/Alert.vue +19 -22
  3. package/components/badges/Badge.vue +32 -25
  4. package/components/badges/IconBadge.vue +7 -7
  5. package/components/badges/IconTextBadge.vue +2 -2
  6. package/components/breadcrumbs/Breadcrumbs.vue +92 -27
  7. package/components/buttons/ActionButton.vue +34 -68
  8. package/components/buttons/ActionIconButton.vue +11 -39
  9. package/components/buttons/AlertButton.vue +8 -13
  10. package/components/buttons/AlertIconButton.vue +6 -7
  11. package/components/buttons/CopyButton.vue +4 -4
  12. package/components/buttons/options/OptionButton.vue +2 -2
  13. package/components/buttons/toggle/ToggleButton.vue +8 -10
  14. package/components/cards/specific/ContactDetailsCard.vue +4 -8
  15. package/components/cards/specific/FeatureCard.vue +2 -2
  16. package/components/cards/specific/HelpTopicCard.vue +4 -4
  17. package/components/cards/specific/subscription/SubscriptionPlanCard.vue +6 -6
  18. package/components/cards/specific/subscription/UniqueSubscriptionPlanCard.vue +1 -1
  19. package/components/collapsibles/Collapsible.vue +1 -1
  20. package/components/content/ContentItem.vue +2 -2
  21. package/components/content/ContentItemImage.vue +12 -14
  22. package/components/dropdowns/DropdownMenuItem.vue +10 -10
  23. package/components/dropdowns/DropdownSelect.vue +5 -16
  24. package/components/dropdowns/DropdownSelectItem.vue +13 -23
  25. package/components/empty-states/EmptyState.vue +21 -27
  26. package/components/features/Feature.vue +11 -48
  27. package/components/forms/fields/ButtonField.vue +2 -9
  28. package/components/forms/fields/CheckboxField.vue +9 -8
  29. package/components/forms/fields/DataField.vue +1 -1
  30. package/components/forms/fields/FileUploadField.vue +6 -6
  31. package/components/forms/fields/InputField.vue +17 -28
  32. package/components/forms/fields/RepeaterField.vue +2 -2
  33. package/components/forms/fields/SearchField.vue +7 -10
  34. package/components/forms/fields/SliderField.vue +16 -19
  35. package/components/forms/fields/SwitchField.vue +12 -34
  36. package/components/forms/fields/TextareaField.vue +7 -5
  37. package/components/forms/fields/radio/RadioButtonField.vue +6 -7
  38. package/components/icons/ContainedIcon.vue +18 -15
  39. package/components/icons/Icon.vue +73 -0
  40. package/components/layouts/ErrorDisplay.vue +3 -3
  41. package/components/layouts/headers/CompactHeader.vue +4 -4
  42. package/components/layouts/headers/ContentPageHeader.vue +1 -1
  43. package/components/lists/List.vue +1 -1
  44. package/components/lists/ListItem.vue +11 -14
  45. package/components/loaders/LoadingScreen.vue +3 -3
  46. package/components/modals/DangerModalDialog.vue +4 -4
  47. package/components/modals/InfoModalDialog.vue +3 -3
  48. package/components/modals/ModalDialog.vue +1 -1
  49. package/components/modals/SuccessModalDialog.vue +2 -2
  50. package/components/navigation/links/NavLink.vue +10 -10
  51. package/components/navigation/nav-sidebar/BottomUserNavBar.vue +3 -3
  52. package/components/navigation/nav-sidebar/NavSidebar.vue +9 -9
  53. package/components/navigation/nav-sidebar/NavSidebarMenuItem.vue +7 -9
  54. package/components/navigation/nav-sidebar/NavSidebarMenuSectionTitle.vue +4 -5
  55. package/components/pagination/ButtonPagination.vue +6 -10
  56. package/components/pagination/SimplePagination.vue +2 -2
  57. package/components/password/SecurePasswordCondition.vue +5 -6
  58. package/components/rating/InteractiveRating.vue +6 -6
  59. package/components/rating/Rating.vue +6 -6
  60. package/components/rating/RatingItem.vue +12 -13
  61. package/components/steppers/CircleStepper.vue +11 -13
  62. package/components/steppers/Step.vue +2 -2
  63. package/components/steppers/StepIndicator.vue +29 -28
  64. package/components/steppers/TabStepper.vue +1 -1
  65. package/components/steppers/vertical-stepper/VerticalStep.vue +2 -2
  66. package/components/steppers/vertical-stepper/VerticalStepper.vue +1 -1
  67. package/components/tabs/Tab.vue +4 -9
  68. package/models/enums/dropdowns.ts +1 -0
  69. package/models/enums/icons.ts +19 -0
  70. package/models/types/buttons.ts +1 -1
  71. package/models/types/icons.ts +6 -0
  72. package/models/types/selects.ts +1 -2
  73. package/nuxt.config.ts +8 -1
  74. package/package.json +2 -2
  75. package/components/navigation/nav-menu/NavFooterMenu.vue +0 -90
@@ -18,11 +18,10 @@
18
18
  }"
19
19
  :disabled
20
20
  >
21
- <MdiIcon
22
- :icon
23
- size="20"
24
- preserveAspectRatio="xMidYMid meet"
25
- class="min-w-[20px]"
21
+ <Icon
22
+ v-if="icon"
23
+ :name="icon"
24
+ :iconClass
26
25
  />
27
26
  </component>
28
27
  </template>
@@ -53,8 +52,8 @@ const props = defineProps({
53
52
  default: 'Button text'
54
53
  },
55
54
  icon: {
56
- type: String as PropType<any>,
57
- default: "mdiHelp"
55
+ type: String as PropType<string>,
56
+ default: "mdi:help"
58
57
  },
59
58
  disabled: {
60
59
  type: Boolean as PropType<boolean>,
@@ -83,8 +83,8 @@ const props = defineProps({
83
83
  validator: (value: ButtonSize) => Object.values(ButtonSize).includes(value),
84
84
  },
85
85
  icon: {
86
- type: String as PropType<any>,
87
- default: "mdiContentCopy",
86
+ type: String as PropType<string>,
87
+ default: "mdi:content-copy",
88
88
  },
89
89
  iconPosition: {
90
90
  type: String as PropType<IconPosition>,
@@ -114,7 +114,7 @@ const handleCopy = useThrottleFn(
114
114
  const success = await copyToClipboard(props.textToCopy)
115
115
 
116
116
  if (success) {
117
- currentCopyButtonIcon.value = 'mdiCheck'
117
+ currentCopyButtonIcon.value = 'mdi:check-circle-outline'
118
118
  currentCopyButtonText.value = props.copySuccessText
119
119
 
120
120
  if (
@@ -133,7 +133,7 @@ const handleCopy = useThrottleFn(
133
133
 
134
134
  emit('success')
135
135
  } else {
136
- currentCopyButtonIcon.value = 'mdiAlertCircleOutline'
136
+ currentCopyButtonIcon.value = 'mdi:alert-circle-outline'
137
137
  currentCopyButtonText.value = props.copyErrorText
138
138
 
139
139
  if (props.showToast) {
@@ -29,8 +29,8 @@ const props = defineProps({
29
29
  default: ButtonStyleType.NEUTRAL_OUTLINED,
30
30
  },
31
31
  icon: {
32
- type: String as PropType<any>,
33
- default: 'mdiHelp',
32
+ type: String as PropType<string>,
33
+ default: 'mdi:help',
34
34
  },
35
35
  iconPosition: {
36
36
  type: String as PropType<IconPosition>,
@@ -16,21 +16,19 @@
16
16
  @click="emitClick"
17
17
  >
18
18
  <!-- Left icon -->
19
- <MdiIcon
19
+ <Icon
20
20
  v-if="iconPosition === IconPosition.LEFT"
21
- :icon="icon"
22
- preserveAspectRatio="xMidYMid meet"
23
- :size="iconSizeClass"
21
+ :name="icon"
22
+ :iconClass="iconSizeClass"
24
23
  />
25
24
  <span :class="['font-semibold', textSizeClass]">
26
25
  {{ text }}
27
26
  </span>
28
27
  <!-- Right icon -->
29
- <MdiIcon
28
+ <Icon
30
29
  v-if="iconPosition === IconPosition.RIGHT"
31
- :icon="icon"
32
- preserveAspectRatio="xMidYMid meet"
33
- :size="iconSizeClass"
30
+ :name="icon"
31
+ :iconClass="iconSizeClass"
34
32
  />
35
33
  </button>
36
34
  </template>
@@ -47,8 +45,8 @@ const props = defineProps({
47
45
  validator: (value: ButtonSize) => Object.values(ButtonSize).includes(value),
48
46
  },
49
47
  icon: {
50
- type: String as PropType<any>,
51
- default: 'mdiHelp',
48
+ type: String as PropType<string>,
49
+ default: 'mdi:help',
52
50
  },
53
51
  iconPosition: {
54
52
  type: String as PropType<IconPosition>,
@@ -8,10 +8,8 @@
8
8
  v-if="email"
9
9
  class="flex gap-2 items-center text-text-primary-brand-default"
10
10
  >
11
- <MdiIcon
12
- icon="mdiAt"
13
- size="20"
14
- preserveAspectRatio="xMidYMid meet"
11
+ <Icon
12
+ name="mdi:at"
15
13
  />
16
14
  <span class="font-semibold text-sm">
17
15
  {{ email }}
@@ -22,10 +20,8 @@
22
20
  v-if="phone"
23
21
  class="flex gap-2 items-center text-text-neutral-subtle"
24
22
  >
25
- <MdiIcon
26
- icon="mdiPhoneOutline"
27
- size="20"
28
- preserveAspectRatio="xMidYMid meet"
23
+ <Icon
24
+ name="mdi:phone-outline"
29
25
  />
30
26
  <span class="text-sm">
31
27
  {{ phone }}
@@ -32,8 +32,8 @@ defineProps({
32
32
  default: 'Feature description'
33
33
  },
34
34
  icon: {
35
- type: String as PropType<any>,
36
- default: 'mdiHelp'
35
+ type: String as PropType<string>,
36
+ default: 'mdi:help'
37
37
  },
38
38
  containedIconShape: {
39
39
  type: String as PropType<IconContainerShape>,
@@ -35,8 +35,8 @@
35
35
  // Props
36
36
  defineProps({
37
37
  icon: {
38
- type: String as PropType<any>,
39
- default: 'mdiHelp'
38
+ type: String as PropType<string>,
39
+ default: 'mdi:help'
40
40
  },
41
41
  title: {
42
42
  type: String as PropType<string>,
@@ -55,8 +55,8 @@ defineProps({
55
55
  default: 'Learn more'
56
56
  },
57
57
  buttonIcon: {
58
- type: String as PropType<any>,
59
- default: 'mdiArrowRight'
58
+ type: String as PropType<string>,
59
+ default: 'mdi:arrow-right'
60
60
  },
61
61
  })
62
62
  </script>
@@ -28,13 +28,13 @@
28
28
  {{ computedAmount }}{{ currencySymbol }}<span class="text-text-neutral-subtle font-normal text-lg">/{{ computedPeriodicity }}</span>
29
29
  </span>
30
30
 
31
- <MdiIcon
31
+ <Icon
32
32
  v-if="isActive && !isFeatured"
33
- icon="mdiCheckCircle"
34
- size="24"
35
- preserveAspectRatio="xMidYMid meet"
36
- class="active-icon absolute top-0 right-0 text-icon-primary-brand-active"
33
+ name="mdi:check-circle"
34
+ :size="IconSize.LG"
35
+ iconClass="active-icon absolute top-0 right-0 text-icon-primary-brand-active"
37
36
  />
37
+
38
38
  </CardHeader>
39
39
 
40
40
  <CardBody class="h-full">
@@ -49,7 +49,7 @@
49
49
  >
50
50
  <ListItem
51
51
  v-for="feature in features" :key="feature"
52
- icon="mdiCheck"
52
+ icon="mdi:check"
53
53
  :spaced="hasFeatureListSeparator"
54
54
  >
55
55
  {{ feature }}
@@ -17,7 +17,7 @@
17
17
  <List :layout="ListLayout.GRID" :cols="2">
18
18
  <ListItem
19
19
  v-for="item in features" :key="item"
20
- icon="mdiCheck"
20
+ icon="mdi:check"
21
21
  >
22
22
  {{ item }}
23
23
  </ListItem>
@@ -7,7 +7,7 @@
7
7
 
8
8
  <!-- This button does not have click event because the toggle is being controlled by the accordeon header div-->
9
9
  <ActionIconButton
10
- :icon="isOpen ? 'mdiUnfoldLessHorizontal' : 'mdiUnfoldMoreHorizontal'"
10
+ :icon="isOpen ? 'mdi:unfold-less-horizontal' : 'mdi:unfold-more-horizontal'"
11
11
  :styleType="ButtonStyleType.NEUTRAL_OUTLINED"
12
12
  :size="ButtonSize.MD"
13
13
  />
@@ -100,8 +100,8 @@ const props = defineProps({
100
100
  default: ImageHoverEffect.BLUR,
101
101
  validator: (value: ImageHoverEffect) => Object.values(ImageHoverEffect).includes(value),
102
102
  },
103
- imgHoverIcon: String as PropType<any>,
104
- imgFallbackIcon: String as PropType<any>,
103
+ imgHoverIcon: String as PropType<string>,
104
+ imgFallbackIcon: String as PropType<string>,
105
105
  imgContainerClass: String as PropType<string>,
106
106
  containerClass: String as PropType<string>,
107
107
  hasCardShadow: {
@@ -29,11 +29,10 @@
29
29
  v-else
30
30
  class="w-full h-full flex items-center justify-center bg-background-neutral-subtlest"
31
31
  >
32
- <MdiIcon
33
- :icon="fallbackIcon"
34
- size="32"
35
- preserveAspectRatio="xMidYMid meet"
36
- class="text-icon-primary-brand-default"
32
+ <Icon
33
+ :name="fallbackIcon"
34
+ :size="IconSize.XL"
35
+ iconClass="text-icon-primary-brand-default"
37
36
  />
38
37
  </div>
39
38
 
@@ -53,11 +52,10 @@
53
52
  'transition-opacity duration-300',
54
53
  ]"
55
54
  >
56
- <MdiIcon
57
- :icon="hoverIcon"
58
- size="32"
59
- preserveAspectRatio="xMidYMid meet"
60
- class="text-icon-neutral-on-filled-bg"
55
+ <Icon
56
+ :name="hoverIcon"
57
+ :size="IconSize.XL"
58
+ iconClass="text-icon-neutral-on-filled-bg"
61
59
  />
62
60
  </div>
63
61
  </template>
@@ -82,12 +80,12 @@ const props = defineProps({
82
80
  default: ImageHoverEffect.BLUR,
83
81
  },
84
82
  hoverIcon: {
85
- type: String as PropType<any>,
86
- default: 'mdiEyeOutline',
83
+ type: String as PropType<string>,
84
+ default: 'mdi:eye-outline',
87
85
  },
88
86
  fallbackIcon: {
89
- type: String as PropType<any>,
90
- default: 'mdiImageOffOutline',
87
+ type: String as PropType<string>,
88
+ default: 'mdi:image-off-outline',
91
89
  },
92
90
  containerClass: String as PropType<string>,
93
91
  })
@@ -19,16 +19,12 @@
19
19
  ]"
20
20
  >
21
21
  <div class="flex items-center gap-3 w-full">
22
- <MdiIcon
22
+ <Icon
23
23
  v-if="icon && (type === DropdownItemType.ICON || type === DropdownItemType.DANGER_ICON)"
24
- :icon="icon"
25
- size="20"
26
- preserveAspectRatio="xMidYMid meet"
27
- :class="[
28
- 'min-w-[20px]',
29
- iconColorClass
30
- ]"
24
+ :name="icon"
25
+ :iconClass="iconColorClass"
31
26
  />
27
+
32
28
  <template v-if="type === DropdownItemType.IMAGE">
33
29
  <img
34
30
  v-if="imgUrl && isImageLoaded"
@@ -45,9 +41,11 @@
45
41
  class="w-[24px] h-[24px] rounded"
46
42
  >
47
43
  </template>
44
+
48
45
  <span v-if="type !== DropdownItemType.USER" class="text-sm">
49
46
  {{ text }}
50
47
  </span>
48
+
51
49
  <User
52
50
  v-if="userDisplayName && type === DropdownItemType.USER"
53
51
  :displayName="userDisplayName"
@@ -88,8 +86,8 @@ const props = defineProps({
88
86
  default: "Menu item text",
89
87
  },
90
88
  icon: {
91
- type: String as PropType<any>,
92
- default: "mdiHelp",
89
+ type: String as PropType<string>,
90
+ default: "mdi:help",
93
91
  },
94
92
  size: {
95
93
  type: String as PropType<DropdownItemSize>,
@@ -178,6 +176,7 @@ const sizeClass = computed(() => {
178
176
  const typeClass = computed(() => {
179
177
  const typeVariant = {
180
178
  [DropdownItemType.DANGER_ICON]: "text-text-delete",
179
+ [DropdownItemType.DANGER_TEXT]: "text-text-delete",
181
180
  [DropdownItemType.TEXT]: "text-text-default",
182
181
  [DropdownItemType.ICON]: "text-text-default",
183
182
  [DropdownItemType.IMAGE]: "text-text-default",
@@ -189,6 +188,7 @@ const typeClass = computed(() => {
189
188
  const iconColorClass = computed(() => {
190
189
  const colorVariant = {
191
190
  [DropdownItemType.DANGER_ICON]: "text-icon-delete",
191
+ [DropdownItemType.DANGER_TEXT]: "text-icon-delete",
192
192
  [DropdownItemType.TEXT]: "text-icon-neutral-subtle",
193
193
  [DropdownItemType.ICON]: "text-icon-neutral-subtle",
194
194
  [DropdownItemType.IMAGE]: undefined,
@@ -64,16 +64,8 @@
64
64
  </template>
65
65
  </template>
66
66
  <template v-else-if="type === SelectType.ICON && selectedOption?.icon">
67
- <MdiIcon
68
- :icon="selectedOption?.icon"
69
- size="20px"
70
- preserveAspectRatio="xMidYMid meet"
71
- />
72
- </template>
73
- <template v-else-if="type === SelectType.ICON && selectedOption?.customIcon">
74
- <div
75
- class="w-[20px] h-[20px] text-icon-neutral-subtle"
76
- v-html="selectedOption?.customIcon"
67
+ <Icon
68
+ :name="selectedOption?.icon"
77
69
  />
78
70
  </template>
79
71
  <template v-else-if="type === SelectType.IMAGE && selectedOption?.imgUrl">
@@ -106,17 +98,15 @@
106
98
  v-if="multiple && Array.isArray(selected) && selected.length"
107
99
  :size="ButtonSize.SM"
108
100
  :styleType="ButtonStyleType.NEUTRAL_TRANSPARENT_SUBTLE"
109
- icon="mdiCloseCircle"
101
+ icon="mdi:close-circle"
110
102
  @click="selected = []"
111
103
  />
112
104
 
113
105
  <!-- Show loading icon while loading instead of the icon-->
114
106
  <Spinner v-if="isLoading" />
115
- <MdiIcon
107
+ <Icon
116
108
  v-else
117
- :icon="isOpen ? 'mdiUnfoldLessHorizontal' : 'mdiUnfoldMoreHorizontal'"
118
- size="20px"
119
- preserveAspectRatio="xMidYMid meet"
109
+ :name="isOpen ? 'mdi:unfold-less-horizontal' : 'mdi:unfold-more-horizontal'"
120
110
  />
121
111
  </div>
122
112
  </div>
@@ -165,7 +155,6 @@
165
155
  :type="type"
166
156
  :text="option.text"
167
157
  :icon="option.icon"
168
- :customIcon="option.customIcon"
169
158
  :userDisplayName="option.userDisplayName"
170
159
  :userProfileImg="option.userProfileImg"
171
160
  :imgUrl="option.imgUrl"
@@ -17,23 +17,14 @@
17
17
  >
18
18
  <div class="flex justify-between items-center gap-3 w-full">
19
19
  <div class="flex items-center gap-3">
20
- <MdiIcon
21
- v-if="(type === SelectType.ICON) && !customIcon"
22
- :icon="icon"
23
- size="20"
24
- preserveAspectRatio="xMidYMid meet"
25
- :class="[
26
- 'min-w-[20px]',
27
- isSelected && activeStyle === SelectActiveStyle.FILL ? 'text-icon-on-filled' : 'text-icon-neutral-subtle'
20
+ <Icon
21
+ v-if="type === SelectType.ICON"
22
+ :name="icon"
23
+ :iconClass="[
24
+ isSelected && activeStyle === SelectActiveStyle.FILL ? '!text-icon-on-filled' : '!text-icon-neutral-subtle'
28
25
  ]"
29
26
  />
30
- <!-- Custom icon (replaces the MdiIcon if it is used)-->
31
- <div
32
- v-if="(type === SelectType.ICON) && customIcon"
33
- class="w-[20px] h-[20px]"
34
- :class="isSelected && activeStyle === SelectActiveStyle.FILL ? 'text-icon-on-filled' : 'text-icon-neutral-subtle'"
35
- v-html="customIcon"
36
- />
27
+
37
28
  <template v-if="type === SelectType.IMAGE">
38
29
  <img
39
30
  v-if="imgUrl && isImageLoaded"
@@ -50,6 +41,7 @@
50
41
  class="w-[24px] h-[24px] rounded"
51
42
  >
52
43
  </template>
44
+
53
45
  <span
54
46
  v-if="type !== SelectType.USER"
55
47
  :class="[
@@ -61,6 +53,7 @@
61
53
  >
62
54
  {{ text }}
63
55
  </span>
56
+
64
57
  <User
65
58
  v-if="type === SelectType.USER"
66
59
  :displayName="userDisplayName"
@@ -69,12 +62,10 @@
69
62
  :class="isSelected && activeStyle === SelectActiveStyle.FILL ? '!text-text-neutral-on-filled' : ''"
70
63
  />
71
64
  </div>
72
- <MdiIcon
65
+ <Icon
73
66
  v-if="isSelected && activeStyle === SelectActiveStyle.CHECK"
74
- icon="mdiCheck"
75
- size="20px"
76
- preserveAspectRatio="xMidYMid meet"
77
- class="text-icon-primary-brand-active"
67
+ name="mdi:check"
68
+ iconClass="text-icon-primary-brand-active"
78
69
  />
79
70
  </div>
80
71
  <p
@@ -97,10 +88,9 @@ const props = defineProps({
97
88
  default: 'Select menu item',
98
89
  },
99
90
  icon: {
100
- type: String as PropType<any>,
101
- default: 'mdiHelp',
91
+ type: String as PropType<string>,
92
+ default: 'mdi:help',
102
93
  },
103
- customIcon: String as PropType<string>,
104
94
  size: {
105
95
  type: String as PropType<SelectSize>,
106
96
  default: SelectSize.MD,
@@ -11,16 +11,15 @@
11
11
  ]"
12
12
  >
13
13
  <!-- Icon -->
14
- <MdiIcon
14
+ <Icon
15
15
  v-if="icon"
16
- :icon="icon"
17
- :size="iconSize"
18
- preserveAspectRatio="xMidYMid meet"
19
- :class="[
16
+ :name="icon"
17
+ :iconClass="[
20
18
  hasContainer ? isContainedIconClass : iconClass,
21
19
  iconSizeClass,
22
20
  ]"
23
21
  />
22
+
24
23
  <div
25
24
  :class="[
26
25
  'flex gap-2 flex-col',
@@ -68,8 +67,8 @@ const props = defineProps({
68
67
  },
69
68
  description: String as PropType<string>,
70
69
  icon: {
71
- type: String as PropType<any>,
72
- default: 'mdiDatabaseAlertOutline',
70
+ type: String as PropType<string>,
71
+ default: 'mdi:database-alert-outline',
73
72
  },
74
73
  iconClass: {
75
74
  type: String as PropType<string>,
@@ -87,7 +86,10 @@ const props = defineProps({
87
86
  },
88
87
  buttonText: String as PropType<string>,
89
88
  buttonIconPosition: String as PropType<IconPosition>,
90
- buttonIcon: String as PropType<any>,
89
+ buttonIcon: {
90
+ type: String as PropType<string>,
91
+ default: 'mdi:plus',
92
+ },
91
93
  buttonStyleType: {
92
94
  type: String as PropType<ButtonStyleType>,
93
95
  default: ButtonStyleType.PRIMARY_BRAND_FILLED
@@ -119,20 +121,12 @@ const orientationClass = computed(() => {
119
121
  return orientationVariant[props.orientation as Orientation] || 'flex-col gap-3 sm:flex-row sm:gap-3'
120
122
  })
121
123
 
122
- const iconSize = computed(() => {
123
- const iconSize = {
124
- [Orientation.VERTICAL]: '40px',
125
- [Orientation.HORIZONTAL]: '32px',
126
- }
127
- return iconSize[props.orientation as Orientation] || '32px'
128
- })
129
-
130
124
  const iconSizeClass = computed(() => {
131
125
  const iconSize = {
132
- [Orientation.VERTICAL]: 'min-w-[40px] max-w-[40px]',
133
- [Orientation.HORIZONTAL]: 'min-w-[32px] max-w-[32px]',
126
+ [Orientation.VERTICAL]: '!min-w-[40px] !max-w-[40px]',
127
+ [Orientation.HORIZONTAL]: '!min-w-[32px] !max-w-[32px]',
134
128
  }
135
- return iconSize[props.orientation as Orientation] || 'min-w-[32px] max-w-[32px]'
129
+ return iconSize[props.orientation as Orientation] || '!min-w-[32px] max-w-[32px]'
136
130
  })
137
131
 
138
132
  const containerClasses = computed(() => {
@@ -149,22 +143,22 @@ const containerClasses = computed(() => {
149
143
 
150
144
  const customContainerClass = computed(() => {
151
145
  const variant = {
152
- [EmptyPlaceholderContainerStyle.DASHED]: 'border-2 border-dashed border-border-default',
153
- [EmptyPlaceholderContainerStyle.FILLED_NEUTRAL]: 'bg-background-neutral-subtlest',
154
- [EmptyPlaceholderContainerStyle.FILLED_PRIMARY_BRAND]: 'bg-background-primary-brand-soft',
146
+ [EmptyPlaceholderContainerStyle.DASHED]: '!border-2 border-dashed border-border-default',
147
+ [EmptyPlaceholderContainerStyle.FILLED_NEUTRAL]: '!bg-background-neutral-subtlest',
148
+ [EmptyPlaceholderContainerStyle.FILLED_PRIMARY_BRAND]: '!bg-background-primary-brand-soft',
155
149
 
156
150
  }
157
- return variant[props.containerStyle as EmptyPlaceholderContainerStyle] || 'bg-background-neutral-subtlest'
151
+ return variant[props.containerStyle as EmptyPlaceholderContainerStyle] || '!bg-background-neutral-subtlest'
158
152
  })
159
153
 
160
154
  const isContainedIconClass = computed(() => {
161
155
  const variant = {
162
- [EmptyPlaceholderContainerStyle.DASHED]: 'text-icon-neutral-subtlest',
163
- [EmptyPlaceholderContainerStyle.FILLED_NEUTRAL]: 'text-icon-neutral-on-subtlest-bg',
164
- [EmptyPlaceholderContainerStyle.FILLED_PRIMARY_BRAND]: 'text-icon-neutral-on-primary-brand-soft-bg',
156
+ [EmptyPlaceholderContainerStyle.DASHED]: '!text-icon-neutral-subtlest',
157
+ [EmptyPlaceholderContainerStyle.FILLED_NEUTRAL]: '!text-icon-neutral-on-subtlest-bg',
158
+ [EmptyPlaceholderContainerStyle.FILLED_PRIMARY_BRAND]: '!text-icon-neutral-on-primary-brand-soft-bg',
165
159
 
166
160
  }
167
- return variant[props.containerStyle as EmptyPlaceholderContainerStyle] || 'text-icon-neutral-on-subtlest-bg'
161
+ return variant[props.containerStyle as EmptyPlaceholderContainerStyle] || '!text-icon-neutral-on-subtlest-bg'
168
162
  })
169
163
 
170
164
  </script>
@@ -1,26 +1,13 @@
1
1
  <template>
2
2
  <div class="flex gap-2.5">
3
- <div v-if="icon">
4
- <MdiIcon
5
- v-if="icon && !svgIcon"
6
- :icon
7
- preserveAspectRatio="xMidYMid meet"
8
- :class="[
9
- 'w-[24px] h-[24px] min-w-[24px] min-h-[24px]',
10
- iconColorClass,
11
- ]"
12
- />
13
- <span
14
- v-else-if="svgIcon"
15
- class="w-[24px] h-[24px] min-w-[24px] min-h-[24px]"
16
- >
17
- <SVGImage
18
- :src="svgIcon"
19
- :color="resolvedSvgIconColor?.value"
20
- />
21
- </span>
22
- </div>
23
-
3
+ <Icon
4
+ v-if="icon"
5
+ :name="icon"
6
+ :size="IconSize.LG"
7
+ :color="iconColor"
8
+ :iconClass="iconClass"
9
+ />
10
+
24
11
  <div class="w-full flex flex-col gap-1">
25
12
  <div class="text-base font-semibold">
26
13
  {{ title }}
@@ -36,42 +23,18 @@
36
23
  </template>
37
24
  <script setup lang="ts">
38
25
  // Props
39
- const props = defineProps({
26
+ defineProps({
40
27
  title: {
41
28
  type: String as PropType<string>,
42
29
  default: 'Title',
43
30
  },
44
31
  description: String as PropType<string>,
45
- icon: String as PropType<any>,
32
+ icon: String as PropType<string>,
46
33
  iconColor: {
47
34
  type: String as PropType<ColorAccent>,
48
35
  default: ColorAccent.SECONDARY_BRAND,
49
36
  validator: (value: ColorAccent) => Object.values(ColorAccent).includes(value),
50
37
  },
51
- svgIcon: String as PropType<string>,
52
- useSVGIconColor: {
53
- type: Boolean as PropType<boolean>,
54
- default: false,
55
- },
56
- })
57
-
58
- // Computed functions
59
- const resolvedSvgIconColor = computed(() => {
60
- return props.useSVGIconColor ? undefined : iconColorClass
61
- })
62
-
63
- // Class
64
- const iconColorClass = computed(() => {
65
- const variant = {
66
- [ColorAccent.NEUTRAL]: "text-icon-neutral-subtle",
67
- [ColorAccent.SUCCESS]: "text-icon-success",
68
- [ColorAccent.WARNING]: "text-icon-warning",
69
- [ColorAccent.DANGER]: "text-icon-danger",
70
- [ColorAccent.INFO]: "text-icon-info",
71
- [ColorAccent.PRIMARY_BRAND]: "text-icon-primary-brand-default",
72
- [ColorAccent.SECONDARY_BRAND]: "text-icon-secondary-brand-default",
73
- }
74
- return variant[props.iconColor as ColorAccent] || 'text-icon-secondary-brand-default"'
38
+ iconClass: String as PropType<string>,
75
39
  })
76
-
77
40
  </script>