@imaginario27/air-ui-ds 1.0.23 → 1.1.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 (73) 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 +15 -15
  5. package/components/badges/IconTextBadge.vue +2 -2
  6. package/components/breadcrumbs/Breadcrumbs.vue +92 -27
  7. package/components/buttons/ActionButton.vue +40 -74
  8. package/components/buttons/ActionIconButton.vue +23 -51
  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 +14 -24
  39. package/components/icons/Icon.vue +13 -22
  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/types/buttons.ts +1 -1
  70. package/models/types/selects.ts +1 -2
  71. package/nuxt.config.ts +1 -1
  72. package/package.json +1 -2
  73. package/components/navigation/nav-menu/NavFooterMenu.vue +0 -90
@@ -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 ? 'mdiMinus' : 'mdiPlus'"
10
+ :icon="isOpen ? 'mdi:minus' : 'mdi:plus'"
11
11
  :styleType="ButtonStyleType.NEUTRAL_TRANSPARENT"
12
12
  :size="ButtonSize.MD"
13
13
  />
@@ -10,12 +10,11 @@
10
10
  ]"
11
11
  >
12
12
  <template v-if="description">
13
- <MdiIcon
14
- :icon="iconType"
15
- size="20"
16
- preserveAspectRatio="xMidYMid meet"
17
- :class="['min-w-[20px]', iconColorClass]"
13
+ <Icon
14
+ :name="iconType"
15
+ :iconClass="iconColorClass"
18
16
  />
17
+
19
18
  <div
20
19
  :class="[
21
20
  'w-full flex flex-col gap-2',
@@ -50,11 +49,9 @@
50
49
  <template v-else>
51
50
  <div class="w-full flex gap-3">
52
51
  <div class="w-full flex gap-3 pt-1.5">
53
- <MdiIcon
54
- :icon="iconType"
55
- size="20"
56
- preserveAspectRatio="xMidYMid meet"
57
- :class="['min-w-[20px]', iconColorClass]"
52
+ <Icon
53
+ :name="iconType"
54
+ :iconClass="iconColorClass"
58
55
  />
59
56
  <span :class="['text-sm font-semibold', textColorClass]">
60
57
  {{ title }}
@@ -83,7 +80,7 @@
83
80
  <AlertIconButton
84
81
  v-if="hasCloseButton"
85
82
  :type
86
- icon="mdiClose"
83
+ icon="mdi:close"
87
84
  @click="$emit('close')"
88
85
  />
89
86
  </div>
@@ -99,7 +96,7 @@ const props = defineProps({
99
96
  default: AlertType.WARNING,
100
97
  validator: (value: AlertType) => Object.values(AlertType).includes(value),
101
98
  },
102
- icon: String as PropType<any>,
99
+ icon: String as PropType<string>,
103
100
  title: {
104
101
  type: String as PropType<string>,
105
102
  default: 'Title',
@@ -129,7 +126,7 @@ const containerClass = computed(() => {
129
126
  const textColorClass = computed(() => {
130
127
  const variant = {
131
128
  [AlertType.WARNING]: 'text-text-warning-on-bg',
132
- [AlertType.DANGER]: 'text-text-danger',
129
+ [AlertType.DANGER]: 'text-icon-danger',
133
130
  [AlertType.SUCCESS]: 'text-text-success',
134
131
  [AlertType.INFO]: 'text-text-info',
135
132
  }
@@ -138,22 +135,22 @@ const textColorClass = computed(() => {
138
135
 
139
136
  const iconColorClass = computed(() => {
140
137
  const variant = {
141
- [AlertType.WARNING]: 'text-icon-warning-on-bg',
142
- [AlertType.DANGER]: 'text-icon-danger',
143
- [AlertType.SUCCESS]: 'text-icon-success',
138
+ [AlertType.WARNING]: '!text-icon-warning-on-bg',
139
+ [AlertType.DANGER]: '!text-icon-danger',
140
+ [AlertType.SUCCESS]: '!text-icon-success',
144
141
  [AlertType.INFO]: 'text-icon-info',
145
142
  }
146
- return variant[props.type as AlertType] || 'text-icon-warning-on-bg'
143
+ return variant[props.type as AlertType] || '!text-icon-warning-on-bg'
147
144
  })
148
145
 
149
146
  const iconType = computed(() => {
150
147
  const variant = {
151
- [AlertType.WARNING]: 'mdiAlertOutline',
152
- [AlertType.DANGER]: 'mdiCloseOctagonOutline',
153
- [AlertType.SUCCESS]: 'mdiCheckCircleOutline',
154
- [AlertType.INFO]: 'mdiInformationOutline',
148
+ [AlertType.WARNING]: 'mdi:alert-outline',
149
+ [AlertType.DANGER]: 'mdi:close-octagon-outline',
150
+ [AlertType.SUCCESS]: 'mdi:check-circle-outline',
151
+ [AlertType.INFO]: 'mdi:information-outline',
155
152
  }
156
- return variant[props.type as AlertType] as any || 'mdiAlertOutline'
153
+ return variant[props.type as AlertType] as string || 'mdi:alert-outline'
157
154
  })
158
155
 
159
156
  </script>
@@ -17,29 +17,36 @@
17
17
  />
18
18
 
19
19
  <!-- Icon -->
20
- <MdiIcon
20
+ <Icon
21
21
  v-if="showIcon"
22
- :icon="icon"
23
- size="12px"
24
- preserveAspectRatio="xMidYMid meet"
25
- :class="iconColorClass"
22
+ :name="icon"
23
+ :size="IconSize.XS"
24
+ :iconClass="iconColorClass"
26
25
  />
27
26
 
28
27
  <!-- Text -->
29
28
  <span :class="textClass">{{ text }}</span>
30
29
 
31
30
  <!-- Close button -->
32
- <button
31
+ <div
33
32
  v-if="closeable"
34
- :class="[textClass, 'ml-1 hover:opacity-75 focus:outline-none']"
35
- @click="emitClose"
33
+ class="ml-1 h-[24px] flex items-center"
36
34
  >
37
- <MdiIcon
38
- icon="mdiClose"
39
- size="16px"
40
- preserveAspectRatio="xMidYMid meet"
41
- />
42
- </button>
35
+ <button
36
+ class="flex items-center justify-center h-full w-[20px]"
37
+ :class="[
38
+ textClass,
39
+ 'hover:opacity-75 focus:outline-none',
40
+ ]"
41
+ @click="emitClose"
42
+ >
43
+ <Icon
44
+ name="mdi:close"
45
+ :size="IconSize.SM"
46
+ :iconClass="iconColorClass"
47
+ />
48
+ </button>
49
+ </div>
43
50
  </div>
44
51
  </template>
45
52
 
@@ -82,8 +89,8 @@ const props = defineProps({
82
89
  default: 'Badge',
83
90
  },
84
91
  icon: {
85
- type: String as PropType<any>,
86
- default: 'mdiHelp',
92
+ type: String as PropType<string>,
93
+ default: 'mdi:help',
87
94
  },
88
95
  })
89
96
 
@@ -172,19 +179,19 @@ const textClass = computed(() => {
172
179
  })
173
180
 
174
181
  const iconColorClass = computed(() => {
175
- if (props.styleType === BadgeStyle.FILLED) return "text-text-neutral-on-filled"
182
+ if (props.styleType === BadgeStyle.FILLED) return "!text-text-neutral-on-filled"
176
183
 
177
184
  const iconVariant: Record<ColorAccent, string> = {
178
- [ColorAccent.NEUTRAL]: "text-icon-neutral-subtle",
179
- [ColorAccent.SUCCESS]: "text-icon-success",
180
- [ColorAccent.WARNING]: props.isTransparent ? "text-icon-warning" : "text-icon-warning-on-bg",
181
- [ColorAccent.DANGER]: "text-icon-danger",
182
- [ColorAccent.INFO]: "text-icon-info",
183
- [ColorAccent.PRIMARY_BRAND]: "text-icon-primary-brand-default",
184
- [ColorAccent.SECONDARY_BRAND]: "text-icon-secondary-brand-default",
185
+ [ColorAccent.NEUTRAL]: "!text-icon-neutral-subtle",
186
+ [ColorAccent.SUCCESS]: "!text-icon-success",
187
+ [ColorAccent.WARNING]: props.isTransparent ? "!text-icon-warning" : "!text-icon-warning-on-bg",
188
+ [ColorAccent.DANGER]: "!text-icon-danger",
189
+ [ColorAccent.INFO]: "!text-icon-info",
190
+ [ColorAccent.PRIMARY_BRAND]: "!text-icon-primary-brand-default",
191
+ [ColorAccent.SECONDARY_BRAND]: "!text-icon-secondary-brand-default",
185
192
  }
186
193
 
187
- return iconVariant[props.color as ColorAccent] || "text-icon-secondary"
194
+ return iconVariant[props.color as ColorAccent] || "!text-icon-secondary"
188
195
  })
189
196
 
190
197
  const dotColorClass = computed(() => {
@@ -5,11 +5,11 @@
5
5
  colorClass
6
6
  ]"
7
7
  >
8
- <MdiIcon
9
- v-if="icon"
10
- :icon
11
- size="16px"
12
- :class="iconColorClass"
8
+ <Icon
9
+ v-if="icon"
10
+ :name="icon"
11
+ :size="IconSize.SM"
12
+ :iconClass="iconColorClass"
13
13
  />
14
14
  </div>
15
15
  </template>
@@ -23,8 +23,8 @@ const props = defineProps({
23
23
  validator: (value: ColorAccent) => Object.values(ColorAccent).includes(value),
24
24
  },
25
25
  icon: {
26
- type: String as PropType<any>,
27
- default: 'mdiHelp',
26
+ type: String as PropType<string>,
27
+ default: 'mdi:help',
28
28
  },
29
29
  })
30
30
 
@@ -44,14 +44,14 @@ const colorClass = computed(() => {
44
44
 
45
45
  const iconColorClass = computed(() => {
46
46
  const iconVariants = {
47
- [ColorAccent.NEUTRAL]: 'text-icon-neutral-subtle-on-subtler-bg',
48
- [ColorAccent.SUCCESS]: 'text-icon-success',
49
- [ColorAccent.WARNING]: 'text-icon-warning-on-bg',
50
- [ColorAccent.DANGER]: 'text-icon-danger',
51
- [ColorAccent.INFO]: 'text-icon-info',
52
- [ColorAccent.PRIMARY_BRAND]: 'text-icon-primary-brand-default',
53
- [ColorAccent.SECONDARY_BRAND]: 'text-icon-secondary-brand-default',
47
+ [ColorAccent.NEUTRAL]: '!text-icon-neutral-subtle-on-subtler-bg',
48
+ [ColorAccent.SUCCESS]: '!text-icon-success',
49
+ [ColorAccent.WARNING]: '!text-icon-warning-on-bg',
50
+ [ColorAccent.DANGER]: '!text-icon-danger',
51
+ [ColorAccent.INFO]: '!text-icon-info',
52
+ [ColorAccent.PRIMARY_BRAND]: '!text-icon-primary-brand-default',
53
+ [ColorAccent.SECONDARY_BRAND]: '!text-icon-secondary-brand-default',
54
54
  }
55
- return iconVariants[props.color as ColorAccent] || 'text-icon-neutral-subtle-on-subtler-bg'
55
+ return iconVariants[props.color as ColorAccent] || '!text-icon-neutral-subtle-on-subtler-bg'
56
56
  })
57
57
  </script>
@@ -29,8 +29,8 @@ const props = defineProps({
29
29
  default: 'Badge text'
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
  })
36
36
 
@@ -1,54 +1,119 @@
1
1
  <template>
2
2
  <nav aria-label="breadcrumb">
3
- <ul class="flex items-center space-x-2 text-gray-500">
3
+ <ul
4
+ :class="[
5
+ 'flex items-center space-x-2 text-icon-neutral-subtler',
6
+ ]"
7
+ >
4
8
  <!-- Home Link -->
5
- <li>
9
+ <li v-if="showHome">
6
10
  <NuxtLink to="/" class="flex items-center space-x-1">
7
- <MdiIcon
8
- icon="mdiHomeOutline"
9
- size="20"
10
- preserveAspectRatio="xMidYMid meet"
11
- class="text-icon-neutral-subtler hover:text-icon-neutral-on-monochrome-hover-bg"
11
+ <Icon
12
+ :name="homeIcon"
13
+ :iconClass="[
14
+ 'text-icon-neutral-subtler hover:text-icon-neutral-on-monochrome-hover-bg',
15
+ homeIconClass,
16
+ ]"
12
17
  />
13
18
  </NuxtLink>
14
19
  </li>
15
20
 
16
- <!-- Dynamic Breadcrumbs (Stop at Previous Level) -->
17
- <li v-for="(crumb, index) in breadcrumbs" :key="index" class="flex items-center space-x-2">
21
+ <!-- Dynamic Breadcrumbs -->
22
+ <li
23
+ v-for="(crumb, index) in displayedBreadcrumbs"
24
+ :key="index"
25
+ class="flex items-center space-x-2"
26
+ >
18
27
  <!-- Chevron Separator -->
19
- <MdiIcon
20
- icon="mdiChevronRight"
21
- size="20"
22
- preserveAspectRatio="xMidYMid meet"
23
- class="text-icon-neutral-subtler"
28
+ <Icon
29
+ v-if="index > 0 || showHome"
30
+ :name="separatorIcon"
31
+ :iconClass="[
32
+ 'text-icon-neutral-subtler',
33
+ separatorClass,
34
+ ]"
24
35
  />
25
36
 
26
- <!-- Breadcrumb Link -->
27
- <NuxtLink
28
- :to="crumb.to"
29
- class="text-sm text-text-neutral-subtler hover:text-text-neutral-on-monochrome-hover-bg"
37
+ <!-- Breadcrumb (active or not) -->
38
+ <component
39
+ :is="crumb.isCurrent ? 'span' : NuxtLink"
40
+ :to="!crumb.isCurrent ? crumb.to : undefined"
41
+ :class="[
42
+ 'text-sm',
43
+ crumb.isCurrent
44
+ ? currentCrumbClass || 'text-text-default'
45
+ : 'text-text-neutral-subtler hover:text-text-neutral-on-monochrome-hover-bg',
46
+ crumbClass,
47
+ ]"
30
48
  >
31
49
  {{ crumb.label }}
32
- </NuxtLink>
50
+ </component>
33
51
  </li>
34
52
  </ul>
35
53
  </nav>
36
54
  </template>
55
+
37
56
  <script setup lang="ts">
57
+ // Imports
58
+ import { NuxtLink } from '#components'
59
+
60
+ // Props
61
+ const props = defineProps({
62
+ showHome: {
63
+ type: Boolean as PropType<boolean>,
64
+ default: true,
65
+ },
66
+ homeIcon: {
67
+ type: String as PropType<string>,
68
+ default: 'mdi:home-outline',
69
+ },
70
+ separatorIcon: {
71
+ type: String as PropType<string>,
72
+ default: 'mdi:chevron-right',
73
+ },
74
+ includeCurrent: {
75
+ type: Boolean as PropType<boolean>,
76
+ default: false,
77
+ },
78
+ homeIconClass: {
79
+ type: String as PropType<string>,
80
+ default: '',
81
+ },
82
+ separatorClass: {
83
+ type: String as PropType<string>,
84
+ default: '',
85
+ },
86
+ crumbClass: {
87
+ type: String as PropType<string>,
88
+ default: '',
89
+ },
90
+ currentCrumbClass: {
91
+ type: String as PropType<string>,
92
+ default: '',
93
+ },
94
+ })
95
+
38
96
  // Route
39
97
  const route = useRoute()
40
98
 
41
- // Generate breadcrumbs from route path, stopping at the previous level
42
- const breadcrumbs = computed(() => {
43
- const pathSegments = route.path.split('/').filter(Boolean) // Remove empty values
44
-
45
- if (pathSegments.length <= 1) return [] // Stop at Home if only 1 segment
99
+ // Generate all breadcrumbs from route segments
100
+ const allCrumbs = computed(() => {
101
+ const pathSegments = route.path.split('/').filter(Boolean)
46
102
 
47
- return pathSegments.slice(0, -1).map((segment, index) => { // Exclude last segment
103
+ return pathSegments.map((segment, index) => {
48
104
  return {
49
- label: segment.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()), // Format text
50
- to: '/' + pathSegments.slice(0, index + 1).join('/') // Build breadcrumb path
105
+ label: segment
106
+ .replace(/-/g, ' ')
107
+ .replace(/\b\w/g, (c) => c.toUpperCase()),
108
+ to: '/' + pathSegments.slice(0, index + 1).join('/'),
109
+ isCurrent: index === pathSegments.length - 1,
51
110
  }
52
111
  })
53
112
  })
113
+
114
+ // Filter crumbs based on `includeCurrent`
115
+ const displayedBreadcrumbs = computed(() => {
116
+ if (props.includeCurrent) return allCrumbs.value
117
+ return allCrumbs.value.slice(0, -1)
118
+ })
54
119
  </script>
@@ -27,14 +27,13 @@
27
27
  <!-- Loading State -->
28
28
  <template v-if="isLoading">
29
29
  <div class="animate-spin">
30
- <MdiIcon
31
- icon="mdiLoading"
32
- preserveAspectRatio="xMidYMid meet"
33
- :class="iconSizeClass"
30
+ <Icon
31
+ name="mdi:loading"
32
+ :iconClass="[iconSizeClass, iconColorClass]"
34
33
  />
35
34
  </div>
36
35
 
37
- <span :class="[ 'font-semibold', textSizeClass, textClass ]">
36
+ <span :class="['font-semibold', textSizeClass, textClass]">
38
37
  {{ loadingText }}
39
38
  </span>
40
39
  </template>
@@ -43,44 +42,32 @@
43
42
  <template v-else>
44
43
  <!-- Left icon -->
45
44
  <template v-if="iconPosition === IconPosition.LEFT">
46
- <MdiIcon
47
- v-if="icon && !svgIcon"
48
- :icon
49
- preserveAspectRatio="xMidYMid meet"
50
- :class="[iconSizeClass, iconClass ]"
45
+ <Icon
46
+ v-if="icon"
47
+ :name="icon"
48
+ :iconClass="[
49
+ iconSizeClass,
50
+ iconColorClass,
51
+ iconClass ? iconClass : ''
52
+ ]"
51
53
  />
52
- <span
53
- v-else-if="svgIcon"
54
- :class="[iconSizeClass, iconClass ]"
55
- >
56
- <SVGImage
57
- :src="svgIcon"
58
- :color="resolvedSvgIconColor"
59
- />
60
- </span>
61
54
  </template>
62
55
 
63
- <span :class="[ 'font-semibold', textSizeClass, textClass ]">
56
+ <span :class="['font-semibold', textSizeClass, textClass]">
64
57
  {{ text }}
65
58
  </span>
66
59
 
67
60
  <!-- Right icon -->
68
61
  <template v-if="iconPosition === IconPosition.RIGHT">
69
- <MdiIcon
62
+ <Icon
70
63
  v-if="icon"
71
- :icon="icon"
72
- preserveAspectRatio="xMidYMid meet"
73
- :class="[iconSizeClass, iconClass]"
64
+ :name="icon"
65
+ :iconClass="[
66
+ iconSizeClass,
67
+ iconColorClass,
68
+ iconClass ? iconClass : ''
69
+ ]"
74
70
  />
75
- <span
76
- v-else-if="svgIcon"
77
- :class="[iconSizeClass, iconClass]"
78
- >
79
- <SVGImage
80
- :src="svgIcon"
81
- :color="resolvedSvgIconColor"
82
- />
83
- </span>
84
71
  </template>
85
72
  </template>
86
73
  </component>
@@ -124,19 +111,14 @@ const props = defineProps({
124
111
  validator: (value: ButtonSize) => Object.values(ButtonSize).includes(value),
125
112
  },
126
113
  icon: {
127
- type: String as PropType<any>,
128
- default: "mdiHelp"
114
+ type: String as PropType<string>,
115
+ default: "mdi:help"
129
116
  },
130
117
  iconPosition: {
131
118
  type: String as PropType<IconPosition>,
132
119
  default: IconPosition.NONE,
133
120
  validator: (value: IconPosition) => Object.values(IconPosition).includes(value),
134
121
  },
135
- svgIcon: String as PropType<string>,
136
- useSVGIconColor: {
137
- type: Boolean as PropType<boolean>,
138
- default: false,
139
- },
140
122
  iconClass: String as PropType<string>,
141
123
  disabled: {
142
124
  type: Boolean as PropType<boolean>,
@@ -318,27 +300,6 @@ const iconSizeClass = computed(() => {
318
300
  return variant[props.size as ButtonSize] || 'w-[20px] h-[20px] min-w-[20px] min-h-[20px]'
319
301
  })
320
302
 
321
- const svgIconColorClass = computed(() => {
322
- const variant = {
323
- [ButtonStyleType.PRIMARY_BRAND_FILLED]: 'text-text-neutral-on-filled',
324
- [ButtonStyleType.PRIMARY_BRAND_SOFT]: 'text-icon-primary-brand-on-soft-bg',
325
- [ButtonStyleType.PRIMARY_BRAND_TRANSPARENT]: [
326
- 'text-text-primary-brand-default',
327
- !props.disabled && 'hover:text-text-primary-brand-hover',
328
- ],
329
- [ButtonStyleType.SECONDARY_BRAND_FILLED]: 'text-text-neutral-on-filled',
330
- [ButtonStyleType.NEUTRAL_FILLED]: 'text-text-neutral-on-neutral-filled-bg',
331
- [ButtonStyleType.NEUTRAL_OUTLINED]: 'text-text-default',
332
- [ButtonStyleType.NEUTRAL_TRANSPARENT]: 'text-text-default',
333
- [ButtonStyleType.NEUTRAL_TRANSPARENT_SUBTLE]: 'text-text-neutral-subtler',
334
- [ButtonStyleType.DELETE_FILLED]: 'text-text-neutral-on-filled',
335
- [ButtonStyleType.DELETE_SOFT]: 'text-text-delete',
336
- [ButtonStyleType.DELETE_OUTLINED]: 'text-text-delete',
337
- [ButtonStyleType.DELETE_TRANSPARENT]: 'text-text-delete',
338
- }
339
- return variant[props.styleType as ButtonStyleType] || 'text-text-default'
340
- })
341
-
342
303
  const textSizeClass = computed(() => {
343
304
  const variant = {
344
305
  [ButtonSize.XS]: 'text-xs',
@@ -351,6 +312,24 @@ const textSizeClass = computed(() => {
351
312
  return variant[props.size as ButtonSize] || 'text-sm'
352
313
  })
353
314
 
315
+ const iconColorClass = computed(() => {
316
+ const variant = {
317
+ [ButtonStyleType.PRIMARY_BRAND_FILLED]: '!text-text-neutral-on-filled',
318
+ [ButtonStyleType.PRIMARY_BRAND_SOFT]: '!text-icon-primary-brand-on-soft-bg',
319
+ [ButtonStyleType.PRIMARY_BRAND_TRANSPARENT]: '!text-text-primary-brand-default',
320
+ [ButtonStyleType.SECONDARY_BRAND_FILLED]: '!text-text-neutral-on-filled',
321
+ [ButtonStyleType.NEUTRAL_FILLED]: '!text-text-neutral-on-neutral-filled-bg',
322
+ [ButtonStyleType.NEUTRAL_OUTLINED]: '!text-text-default',
323
+ [ButtonStyleType.NEUTRAL_TRANSPARENT]: '!text-text-default',
324
+ [ButtonStyleType.NEUTRAL_TRANSPARENT_SUBTLE]: '!text-text-neutral-subtler',
325
+ [ButtonStyleType.DELETE_FILLED]: '!text-text-neutral-on-filled',
326
+ [ButtonStyleType.DELETE_SOFT]: '!text-text-delete',
327
+ [ButtonStyleType.DELETE_OUTLINED]: '!text-text-delete',
328
+ [ButtonStyleType.DELETE_TRANSPARENT]: '!text-text-delete',
329
+ }
330
+ return variant[props.styleType as ButtonStyleType] || '!text-text-default'
331
+ })
332
+
354
333
  const horizontalPaddingClass = computed(() => {
355
334
  const variant = {
356
335
  [ButtonSize.XS]: 'px-2',
@@ -375,19 +354,6 @@ const gapClass = computed(() => {
375
354
  return variant[props.size as ButtonSize] || 'gap-2'
376
355
  })
377
356
 
378
- // Computed functions
379
- const resolvedSvgIconColor = computed(() => {
380
- if (props.useSVGIconColor) return undefined
381
-
382
- const val = svgIconColorClass.value
383
-
384
- if (Array.isArray(val)) {
385
- return val.filter(Boolean).join(' ')
386
- }
387
-
388
- return val
389
- })
390
-
391
357
  // Props for the dynamic component
392
358
  const componentProps = computed(() => {
393
359
  if (props.actionType === ButtonActionType.LINK) {