@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
@@ -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>
@@ -22,8 +22,6 @@
22
22
  :loadingText
23
23
  :styleType
24
24
  :actionType
25
- :svgIcon
26
- :useSVGIconColor
27
25
  :isRounded
28
26
  :isFullWidth
29
27
  :isMobileFullWidth
@@ -62,19 +60,14 @@ const props = defineProps({
62
60
  validator: (value: ButtonSize) => Object.values(ButtonSize).includes(value),
63
61
  },
64
62
  icon: {
65
- type: String as PropType<any>,
66
- default: "mdiHelp"
63
+ type: String as PropType<string>,
64
+ default: "mdi:help"
67
65
  },
68
66
  iconPosition: {
69
67
  type: String as PropType<IconPosition>,
70
68
  default: IconPosition.NONE,
71
69
  validator: (value: IconPosition) => Object.values(IconPosition).includes(value),
72
70
  },
73
- svgIcon: String as PropType<string>,
74
- useSVGIconColor: {
75
- type: Boolean as PropType<boolean>,
76
- default: false,
77
- },
78
71
  disabled: {
79
72
  type: Boolean as PropType<boolean>,
80
73
  default: false,
@@ -54,12 +54,13 @@
54
54
  ]"
55
55
  @click="toggleCheckbox"
56
56
  >
57
- <MdiIcon
57
+ <Icon
58
58
  v-if="modelValue"
59
- icon="mdiCheckBold"
60
- :size="checkboxIconSizeClass"
61
- preserveAspectRatio="xMidYMid meet"
62
- :class="disabled ? 'text-icon-neutral-disabled' : 'text-icon-neutral-on-filled-bg'"
59
+ name="mdi:check-bold"
60
+ :iconClass="[
61
+ checkboxIconSizeClass,
62
+ disabled ? '!text-icon-neutral-disabled' : '!text-icon-neutral-on-filled-bg'
63
+ ]"
63
64
  />
64
65
  </div>
65
66
 
@@ -153,10 +154,10 @@ const controlFieldSizeClass = computed(() => {
153
154
 
154
155
  const checkboxIconSizeClass = computed(() => {
155
156
  const sizeVariant = {
156
- [ControlFieldSize.MD]: '16',
157
- [ControlFieldSize.LG]: '20',
157
+ [ControlFieldSize.MD]: '!w-[16px] !h-[16px] !min-w-[16px] !min-h-[16px]',
158
+ [ControlFieldSize.LG]: '!w-[20px] !h-[20px] !min-w-[20px] !min-h-[20px]',
158
159
  }
159
- return sizeVariant[props.size as ControlFieldSize] || '16'
160
+ return sizeVariant[props.size as ControlFieldSize] || '!w-[16px] !h-[16px] !min-w-[16px] !min-h-[16px]'
160
161
  })
161
162
 
162
163
  const labelSizeClass = computed(() => {
@@ -35,7 +35,7 @@
35
35
 
36
36
  <ActionIconButton
37
37
  v-if="hasCopyToClipboardButton"
38
- icon="mdiContentCopy"
38
+ icon="mdi:content-copy"
39
39
  :size="ButtonSize.XS"
40
40
  @click="handleCopyToClipboard"
41
41
  />
@@ -48,10 +48,10 @@
48
48
  @error="handleError"
49
49
  >
50
50
  <template #placeholder-img>
51
- <MdiIcon
52
- :icon="icon"
53
- preserveAspectRatio="xMidYMid meet"
54
- class="min-w-[40px] min-h-[40px] aspect-square text-icon-default"
51
+ <Icon
52
+ name="mdi:cloud-upload-outline"
53
+ :size="IconSize.XXL"
54
+ :color="ColorAccent.NEUTRAL"
55
55
  />
56
56
  </template>
57
57
  <template #title>
@@ -109,8 +109,8 @@ const props = defineProps({
109
109
  },
110
110
  helpText: String as PropType<string>,
111
111
  icon: {
112
- type: String as PropType<any>,
113
- default: 'mdiUploadOutline',
112
+ type: String as PropType<string>,
113
+ default: 'mdi:cloud-upload-outline',
114
114
  },
115
115
  buttonText: String as PropType<string>,
116
116
  upToText: {
@@ -42,16 +42,11 @@
42
42
  ]"
43
43
  >
44
44
  <!-- Icon -->
45
- <span
45
+ <Icon
46
46
  v-if="icon"
47
- class="text-icon-neutral-subtler"
48
- >
49
- <MdiIcon
50
- :icon="icon"
51
- size="20"
52
- preserveAspectRatio="xMidYMid meet"
53
- />
54
- </span>
47
+ :name="icon"
48
+ iconClass="text-icon-neutral-subtler"
49
+ />
55
50
 
56
51
  <!-- Input -->
57
52
  <input
@@ -98,13 +93,13 @@
98
93
  'focus:outline-none',
99
94
  'transition-colors',
100
95
  'cursor-pointer',
96
+ 'h-[20px]'
101
97
  ]"
102
98
  @click="handleSuffixClick"
103
99
  >
104
- <MdiIcon
105
- :icon="suffixIcon"
106
- size="20"
107
- preserveAspectRatio="xMidYMid meet"
100
+ <Icon
101
+ v-if="suffixIcon"
102
+ :name="suffixIcon"
108
103
  />
109
104
  </button>
110
105
 
@@ -118,27 +113,21 @@
118
113
  'focus:outline-none',
119
114
  'transition-colors',
120
115
  'cursor-pointer',
116
+ 'h-[20px]'
121
117
  ]"
122
118
  @click="() => showPassword = !showPassword"
123
119
  >
124
- <MdiIcon
125
- :icon="showPassword ? 'mdiEyeOffOutline' : 'mdiEyeOutline'"
126
- size="20"
127
- preserveAspectRatio="xMidYMid meet"
120
+ <Icon
121
+ :name="showPassword ? 'mdi:eye-off-outline' : 'mdi:eye-outline'"
128
122
  />
129
123
  </button>
130
124
 
131
125
  <!-- Error Icon -->
132
- <span
126
+ <Icon
133
127
  v-if="hasError && !suffixIcon"
134
- class="text-icon-error"
135
- >
136
- <MdiIcon
137
- icon="mdiAlertCircle"
138
- size="20"
139
- preserveAspectRatio="xMidYMid meet"
140
- />
141
- </span>
128
+ name="mdi:alert-circle-outline"
129
+ iconClass="text-icon-error"
130
+ />
142
131
  </div>
143
132
 
144
133
  <!-- Help Text -->
@@ -171,8 +160,8 @@ const props = defineProps({
171
160
  default: 'Placeholder',
172
161
  },
173
162
  helpText: String as PropType<string>,
174
- icon: String as PropType<any>,
175
- suffixIcon: String as PropType<any>,
163
+ icon: String as PropType<string>,
164
+ suffixIcon: String as PropType<string>,
176
165
  linkText: String as PropType<string>,
177
166
  linkUrl: String as PropType<string>,
178
167
  size: {
@@ -19,7 +19,7 @@
19
19
  <ActionIconButton
20
20
  v-if="index === items.length - 1"
21
21
  :styleType="ButtonStyleType.NEUTRAL_OUTLINED"
22
- icon="mdiPlusCircleOutline"
22
+ icon="mdi:plus-circle-outline"
23
23
  :size="ButtonSize.SM"
24
24
  @click="addItem"
25
25
  />
@@ -28,7 +28,7 @@
28
28
  <ActionIconButton
29
29
  v-if="items.length > 1"
30
30
  :styleType="ButtonStyleType.DELETE_SOFT"
31
- icon="mdiMinusCircleOutline"
31
+ icon="mdi:minus-circle-outline"
32
32
  :size="ButtonSize.SM"
33
33
  @click="removeItem(index)"
34
34
  />
@@ -38,13 +38,10 @@
38
38
  ]"
39
39
  >
40
40
  <!-- Icon -->
41
- <span class="text-icon-neutral-subtler">
42
- <MdiIcon
43
- :icon
44
- size="20"
45
- preserveAspectRatio="xMidYMid meet"
46
- />
47
- </span>
41
+ <Icon
42
+ :name="icon"
43
+ iconClass="text-icon-neutral-subtler"
44
+ />
48
45
 
49
46
  <!-- Input -->
50
47
  <input
@@ -73,7 +70,7 @@
73
70
  v-if="filled"
74
71
  :size="ButtonSize.SM"
75
72
  :styleType="ButtonStyleType.NEUTRAL_TRANSPARENT_SUBTLE"
76
- icon="mdiCloseCircle"
73
+ icon="mdi:close-circle"
77
74
  @click="clearField"
78
75
  />
79
76
  </div>
@@ -101,8 +98,8 @@ const props = defineProps({
101
98
  },
102
99
  helpText: String as PropType<string>,
103
100
  icon: {
104
- type: String as PropType<any>,
105
- default: 'mdiMagnify',
101
+ type: String as PropType<string>,
102
+ default: 'mdi:magnify',
106
103
  },
107
104
  size: {
108
105
  type: String as PropType<InputSize>,
@@ -69,7 +69,7 @@
69
69
  'transition-all duration-200',
70
70
  disabled
71
71
  ? 'opacity-50 cursor-not-allowed'
72
- : 'hover:bg-background-neutral-sublter hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer',
72
+ : 'hover:bg-background-neutral-subtler hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer',
73
73
  'focus:outline-none focus:ring-2 focus:ring-primary-brand-200'
74
74
  ]"
75
75
  @click="startEditing(0)"
@@ -79,11 +79,10 @@
79
79
  <span>
80
80
  {{ `${currentValuePrefix || ''}${(modelValue as [number, number])[0]}${currentValueSuffix || ''}` }}
81
81
  </span>
82
- <MdiIcon
83
- icon="mdiPencil"
84
- size="14px"
85
- preserveAspectRatio="xMidYMid meet"
86
- class="ml-1 opacity-60"
82
+ <Icon
83
+ name="mdi:pencil"
84
+ :size="IconSize.SM"
85
+ iconClass="ml-1 opacity-60"
87
86
  />
88
87
  </button>
89
88
 
@@ -167,7 +166,7 @@
167
166
  'transition-all duration-200',
168
167
  disabled
169
168
  ? 'opacity-50 cursor-not-allowed'
170
- : 'hover:bg-background-neutral-sublter hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer',
169
+ : 'hover:bg-background-neutral-subtler hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer',
171
170
  'focus:outline-none focus:ring-2 focus:ring-primary-brand-200'
172
171
  ]"
173
172
  @click="startEditing(1)"
@@ -175,11 +174,10 @@
175
174
  @keydown.space.prevent="startEditing(1)"
176
175
  >
177
176
  <span>{{ `${currentValuePrefix || ''}${(modelValue as [number, number])[1]}${currentValueSuffix || ''}` }}</span>
178
- <MdiIcon
179
- icon="mdiPencil"
180
- size="14px"
181
- preserveAspectRatio="xMidYMid meet"
182
- class="ml-1 opacity-60"
177
+ <Icon
178
+ name="mdi:pencil"
179
+ :size="IconSize.SM"
180
+ iconClass="ml-1 opacity-60"
183
181
  />
184
182
  </button>
185
183
  </div>
@@ -231,7 +229,7 @@
231
229
  'transition-all duration-200',
232
230
  disabled
233
231
  ? 'opacity-50 cursor-not-allowed'
234
- : 'hover:bg-background-neutral-sublter hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer hover:shadow-sm',
232
+ : 'hover:bg-background-neutral-subtler hover:border-border-primary-brand-default hover:text-text-primary-brand-default cursor-pointer hover:shadow-sm',
235
233
  'focus:outline-none focus:ring-2 focus:ring-primary-brand-200'
236
234
  ]"
237
235
  @click="startEditing(0)"
@@ -241,11 +239,10 @@
241
239
  <span>
242
240
  {{ `${currentValuePrefix || ''}${modelValue}${currentValueSuffix || ''}` }}
243
241
  </span>
244
- <MdiIcon
245
- icon="mdiPencil"
246
- size="14px"
247
- preserveAspectRatio="xMidYMid meet"
248
- :class="[
242
+ <Icon
243
+ name="mdi:pencil"
244
+ :size="IconSize.SM"
245
+ :iconClass="[
249
246
  'ml-1',
250
247
  'opacity-60',
251
248
  'group-hover:opacity-100',
@@ -309,7 +306,7 @@
309
306
  'left-0',
310
307
  'w-full',
311
308
  'h-[4px]',
312
- 'bg-background-neutral-sublter',
309
+ 'bg-background-neutral-subtler',
313
310
  'rounded-full',
314
311
  '-translate-y-1/2',
315
312
  ]"
@@ -22,7 +22,7 @@
22
22
  <div
23
23
  :class="[
24
24
  'flex items-center gap-3',
25
- label || icon || customIcon ? 'justify-between' : 'justify-end',
25
+ label || icon ? 'justify-between' : 'justify-end',
26
26
  'text-sm w-full',
27
27
  hasError ? 'text-text-error' : 'text-text-default',
28
28
  checkboxWrapperClass && checkboxWrapperClass
@@ -30,27 +30,15 @@
30
30
  >
31
31
  <!-- Label + Icon block (only if present) -->
32
32
  <div
33
- v-if="label || icon || customIcon"
33
+ v-if="label || icon"
34
34
  class="flex gap-2.5 w-full"
35
35
  >
36
36
  <!-- Icon -->
37
- <template v-if="icon || customIcon">
38
- <MdiIcon
39
- v-if="icon && !customIcon"
40
- :icon="icon"
41
- :size="iconSize"
42
- preserveAspectRatio="xMidYMid meet"
43
- class="text-icon-default"
44
- />
45
- <div
46
- v-else
47
- :class="[
48
- customIconSizeClass,
49
- 'text-icon-default'
50
- ]"
51
- v-html="customIcon"
52
- />
53
- </template>
37
+ <Icon
38
+ v-if="icon"
39
+ :name="icon"
40
+ :iconClass="iconSizeClass"
41
+ />
54
42
 
55
43
  <!-- Label -->
56
44
  <label
@@ -59,7 +47,6 @@
59
47
  :class="[
60
48
  disabled && 'text-text-neutral-disabled',
61
49
  labelSizeClass,
62
- customIcon && 'mt-1',
63
50
  labelClass && labelClass
64
51
  ]"
65
52
  v-html="label"
@@ -151,8 +138,7 @@ const props = defineProps({
151
138
  default: ControlFieldSize.MD,
152
139
  validator: (value: ControlFieldSize) => Object.values(ControlFieldSize).includes(value),
153
140
  },
154
- icon: String as PropType<any>,
155
- customIcon: String as PropType<any>,
141
+ icon: String as PropType<string>,
156
142
  styleType: {
157
143
  type: String as PropType<SwitchStyle>,
158
144
  default: SwitchStyle.BRAND,
@@ -196,20 +182,12 @@ const labelSizeClass = computed(() => {
196
182
  return sizeVariant[props.size as ControlFieldSize] || 'text-sm'
197
183
  })
198
184
 
199
- const iconSize = computed(() => {
200
- const sizeVariant = {
201
- [ControlFieldSize.MD]: '20',
202
- [ControlFieldSize.LG]: '24',
203
- }
204
- return sizeVariant[props.size as ControlFieldSize] || '20'
205
- })
206
-
207
- const customIconSizeClass = computed(() => {
185
+ const iconSizeClass = computed(() => {
208
186
  const sizeVariant = {
209
- [ControlFieldSize.MD]: 'w-[20px] h-[20px]',
210
- [ControlFieldSize.LG]: 'w-[24px] h-[24px]',
187
+ [ControlFieldSize.MD]: 'w-[20px] h-[20px] min-w-[20px] min-h-[20px]',
188
+ [ControlFieldSize.LG]: 'w-[24px] h-[24px] min-w-[24px] min-h-[24px]',
211
189
  }
212
- return sizeVariant[props.size as ControlFieldSize] || 'w-[20px] h-[20px]'
190
+ return sizeVariant[props.size as ControlFieldSize] || 'w-[20px] h-[20px] min-w-[20px] min-h-[20px]'
213
191
  })
214
192
 
215
193
  const checkedBackgroundClass = computed(() => {
@@ -54,11 +54,13 @@
54
54
  />
55
55
 
56
56
  <!-- Error Icon -->
57
- <span v-if="hasError" class="text-icon-error absolute top-4 right-4">
58
- <MdiIcon
59
- icon="mdiAlertCircle"
60
- size="20"
61
- preserveAspectRatio="xMidYMid meet"
57
+ <span
58
+ v-if="hasError"
59
+ class="absolute top-4 right-4"
60
+ >
61
+ <Icon
62
+ name="mdi:alert-circle"
63
+ iconClass="text-icon-error"
62
64
  />
63
65
  </span>
64
66
  </div>
@@ -37,11 +37,10 @@
37
37
  modelValue === value ? selectedIconBackgroundColorClass : 'bg-background-neutral-sublter'
38
38
  ]"
39
39
  >
40
- <MdiIcon
41
- :icon="icon"
42
- size="24"
43
- preserveAspectRatio="xMidYMid meet"
44
- :class="modelValue === value ? selectedIconColorClass : 'text-icon-neutral-subtle'"
40
+ <Icon
41
+ :name="icon"
42
+ :size="IconSize.LG"
43
+ :iconClass="modelValue === value ? selectedIconColorClass : 'text-icon-neutral-subtle'"
45
44
  />
46
45
  </div>
47
46
  <!-- Label with help text -->
@@ -126,8 +125,8 @@ const props = defineProps({
126
125
  required: true,
127
126
  },
128
127
  icon: {
129
- type: String as PropType<any>,
130
- default: 'mdiHelp',
128
+ type: String as PropType<string>,
129
+ default: 'mdi:help',
131
130
  },
132
131
  type: {
133
132
  type: String as PropType<