@aleph-alpha/ui-library 1.11.0 → 1.12.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 (104) hide show
  1. package/README.md +0 -2
  2. package/dist/system/index.d.ts +860 -179
  3. package/dist/system/lib.js +33936 -9729
  4. package/package.json +1 -2
  5. package/src/compositions/UiDataTable/UiDataTable.stories.ts +6 -7
  6. package/src/compositions/UiDataTable/UiDataTableColumnHeader.vue +22 -8
  7. package/src/compositions/UiDataTable/UiDataTablePagination.vue +5 -5
  8. package/src/compositions/UiDatePicker/UiDatePicker.vue +2 -2
  9. package/src/primitives/UiAlert/UiAlert.stories.ts +8 -8
  10. package/src/primitives/UiBadge/UiBadge.stories.ts +9 -9
  11. package/src/primitives/UiButton/UiButton.stories.ts +12 -12
  12. package/src/primitives/UiCalendar/UiCalendar.stories.ts +4 -4
  13. package/src/primitives/UiDropdownMenu/UiDropdownMenu.stories.ts +2 -2
  14. package/src/primitives/UiIcon/UiIcon.stories.ts +59 -13
  15. package/src/primitives/UiIcon/UiIcon.vue +41 -3
  16. package/src/primitives/UiIcon/__tests__/UiIcon.test.ts +33 -4
  17. package/src/primitives/UiIcon/index.ts +1 -0
  18. package/src/primitives/UiIcon/types.ts +24 -5
  19. package/src/primitives/UiIconButton/UiIconButton.stories.ts +36 -36
  20. package/src/primitives/UiKbd/UiKbd.stories.ts +551 -0
  21. package/src/primitives/UiKbd/UiKbd.vue +62 -0
  22. package/src/primitives/UiKbd/UiKbdGroup.vue +16 -0
  23. package/src/primitives/UiKbd/__tests__/UiKbd.test.ts +46 -0
  24. package/src/primitives/UiKbd/index.ts +3 -0
  25. package/src/primitives/UiKbd/types.ts +32 -0
  26. package/src/primitives/UiLabel/UiLabel.stories.ts +192 -0
  27. package/src/primitives/UiLabel/UiLabel.vue +16 -0
  28. package/src/primitives/UiLabel/__tests__/UiLabel.test.ts +43 -0
  29. package/src/primitives/UiLabel/index.ts +2 -0
  30. package/src/primitives/UiLabel/types.ts +16 -0
  31. package/src/primitives/UiListbox/UiListbox.stories.ts +607 -0
  32. package/src/primitives/UiListbox/UiListbox.vue +30 -0
  33. package/src/primitives/UiListbox/UiListboxContent.vue +16 -0
  34. package/src/primitives/UiListbox/UiListboxFilter.vue +16 -0
  35. package/src/primitives/UiListbox/UiListboxGroup.vue +16 -0
  36. package/src/primitives/UiListbox/UiListboxGroupLabel.vue +16 -0
  37. package/src/primitives/UiListbox/UiListboxItem.vue +20 -0
  38. package/src/primitives/UiListbox/UiListboxItemIndicator.vue +16 -0
  39. package/src/primitives/UiListbox/__tests__/UiListbox.test.ts +42 -0
  40. package/src/primitives/UiListbox/index.ts +8 -0
  41. package/src/primitives/UiListbox/types.ts +119 -0
  42. package/src/primitives/UiPopover/index.ts +1 -0
  43. package/src/primitives/UiSeparator/UiSeparator.stories.ts +177 -0
  44. package/src/primitives/UiSeparator/UiSeparator.vue +17 -0
  45. package/src/primitives/UiSeparator/__tests__/UiSeparator.test.ts +34 -0
  46. package/src/primitives/UiSeparator/index.ts +2 -0
  47. package/src/primitives/UiSeparator/types.ts +23 -0
  48. package/src/primitives/UiSkeleton/UiSkeleton.stories.ts +247 -0
  49. package/src/primitives/UiSkeleton/UiSkeleton.vue +24 -0
  50. package/src/primitives/UiSkeleton/__tests__/UiSkeleton.test.ts +47 -0
  51. package/src/primitives/UiSkeleton/index.ts +2 -0
  52. package/src/primitives/UiSkeleton/types.ts +26 -0
  53. package/src/primitives/UiTable/UiTable.stories.ts +2 -2
  54. package/src/primitives/UiTagsInput/UiTagsInput.stories.ts +538 -0
  55. package/src/primitives/UiTagsInput/UiTagsInput.vue +27 -0
  56. package/src/primitives/UiTagsInput/UiTagsInputInput.vue +14 -0
  57. package/src/primitives/UiTagsInput/UiTagsInputItem.vue +16 -0
  58. package/src/primitives/UiTagsInput/UiTagsInputItemDelete.vue +16 -0
  59. package/src/primitives/UiTagsInput/UiTagsInputItemText.vue +14 -0
  60. package/src/primitives/UiTagsInput/__tests__/UiTagsInput.test.ts +44 -0
  61. package/src/primitives/UiTagsInput/index.ts +6 -0
  62. package/src/primitives/UiTagsInput/types.ts +60 -0
  63. package/src/primitives/UiToggle/UiToggle.stories.ts +370 -0
  64. package/src/primitives/UiToggle/UiToggle.vue +28 -0
  65. package/src/primitives/UiToggle/__tests__/UiToggle.test.ts +62 -0
  66. package/src/primitives/UiToggle/index.ts +2 -0
  67. package/src/primitives/UiToggle/types.ts +35 -0
  68. package/src/primitives/UiTooltip/UiTooltip.stories.ts +8 -8
  69. package/src/primitives/index.ts +7 -0
  70. package/src/primitives/shadcn/accordion/AccordionTrigger.vue +5 -4
  71. package/src/primitives/shadcn/calendar/CalendarNextButton.vue +2 -2
  72. package/src/primitives/shadcn/calendar/CalendarPrevButton.vue +2 -2
  73. package/src/primitives/shadcn/checkbox/Checkbox.vue +2 -2
  74. package/src/primitives/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +2 -2
  75. package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +2 -2
  76. package/src/primitives/shadcn/kbd/Kbd.vue +20 -0
  77. package/src/primitives/shadcn/kbd/KbdGroup.vue +12 -0
  78. package/src/primitives/shadcn/kbd/index.ts +2 -0
  79. package/src/primitives/shadcn/listbox/Listbox.vue +23 -0
  80. package/src/primitives/shadcn/listbox/ListboxContent.vue +26 -0
  81. package/src/primitives/shadcn/listbox/ListboxFilter.vue +30 -0
  82. package/src/primitives/shadcn/listbox/ListboxGroup.vue +26 -0
  83. package/src/primitives/shadcn/listbox/ListboxGroupLabel.vue +26 -0
  84. package/src/primitives/shadcn/listbox/ListboxItem.vue +32 -0
  85. package/src/primitives/shadcn/listbox/ListboxItemIndicator.vue +40 -0
  86. package/src/primitives/shadcn/listbox/index.ts +7 -0
  87. package/src/primitives/shadcn/native-select/NativeSelect.vue +5 -4
  88. package/src/primitives/shadcn/range-calendar/RangeCalendarNextButton.vue +2 -2
  89. package/src/primitives/shadcn/range-calendar/RangeCalendarPrevButton.vue +2 -2
  90. package/src/primitives/shadcn/select/SelectItem.vue +2 -2
  91. package/src/primitives/shadcn/select/SelectScrollDownButton.vue +2 -2
  92. package/src/primitives/shadcn/select/SelectScrollUpButton.vue +2 -2
  93. package/src/primitives/shadcn/select/SelectTrigger.vue +2 -2
  94. package/src/primitives/shadcn/skeleton/Skeleton.vue +10 -0
  95. package/src/primitives/shadcn/skeleton/index.ts +1 -0
  96. package/src/primitives/shadcn/spinner/Spinner.vue +5 -4
  97. package/src/primitives/shadcn/tags-input/TagsInput.vue +33 -0
  98. package/src/primitives/shadcn/tags-input/TagsInputInput.vue +24 -0
  99. package/src/primitives/shadcn/tags-input/TagsInputItem.vue +31 -0
  100. package/src/primitives/shadcn/tags-input/TagsInputItemDelete.vue +46 -0
  101. package/src/primitives/shadcn/tags-input/TagsInputItemText.vue +24 -0
  102. package/src/primitives/shadcn/tags-input/index.ts +5 -0
  103. package/src/primitives/shadcn/toggle/Toggle.vue +34 -0
  104. package/src/primitives/shadcn/toggle/index.ts +27 -0
@@ -1,14 +1,52 @@
1
1
  <script setup lang="ts">
2
- import { Icon as ShadcnIcon } from '@/primitives/shadcn/icon';
2
+ import { computed, type Component } from 'vue';
3
+ import * as lucideIcons from 'lucide-vue-next';
4
+ import { cn } from '@/lib/utils';
3
5
  import type { UiIconProps } from './types';
4
6
 
5
7
  defineOptions({
6
8
  name: 'UiIcon',
7
9
  });
8
10
 
9
- const props = defineProps<UiIconProps>();
11
+ const props = withDefaults(defineProps<UiIconProps>(), {
12
+ size: 24,
13
+ strokeWidth: 2,
14
+ });
15
+
16
+ // Type-safe lookup for Lucide icons
17
+ const iconLookup = lucideIcons as unknown as Record<string, Component>;
18
+
19
+ /**
20
+ * Convert kebab-case or lowercase to PascalCase for Lucide icon lookup.
21
+ * Examples: "circle-help" -> "CircleHelp", "star" -> "Star", "ChevronDown" -> "ChevronDown"
22
+ */
23
+ function toPascalCase(str: string): string {
24
+ // If already PascalCase (starts with uppercase, no hyphens), return as-is
25
+ if (!str.includes('-') && str[0] === str[0].toUpperCase()) {
26
+ return str;
27
+ }
28
+ return str
29
+ .split('-')
30
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
31
+ .join('');
32
+ }
33
+
34
+ const iconComponent = computed<Component | null>(() => {
35
+ const pascalName = toPascalCase(props.name);
36
+ return iconLookup[pascalName] ?? null;
37
+ });
10
38
  </script>
11
39
 
12
40
  <template>
13
- <ShadcnIcon :icon="props.icon" :aria-label="props.ariaLabel" />
41
+ <component
42
+ :is="iconComponent"
43
+ v-if="iconComponent"
44
+ data-slot="icon"
45
+ :size="props.size"
46
+ :stroke-width="props.strokeWidth"
47
+ :class="cn(props.class)"
48
+ :role="props.ariaLabel ? 'img' : undefined"
49
+ :aria-label="props.ariaLabel"
50
+ :aria-hidden="props.ariaLabel ? undefined : 'true'"
51
+ />
14
52
  </template>
@@ -3,22 +3,51 @@ import { describe, expect, test } from 'vitest';
3
3
  import { UiIcon } from '../index';
4
4
 
5
5
  describe('UiIcon', () => {
6
- test('renders a material-symbols icon class by default', () => {
6
+ test('renders a Lucide icon by name (kebab-case)', () => {
7
7
  const { container } = render(UiIcon, {
8
- props: { icon: 'i-material-symbols-help' },
8
+ props: { name: 'circle-help' },
9
9
  });
10
10
 
11
11
  const el = container.querySelector('[data-slot="icon"]');
12
12
  expect(el).toBeInTheDocument();
13
- expect(el).toHaveClass('i-material-symbols-help');
13
+ expect(el?.tagName.toLowerCase()).toBe('svg');
14
14
  expect(el).toHaveAttribute('aria-hidden', 'true');
15
15
  });
16
16
 
17
+ test('renders a Lucide icon by name (PascalCase)', () => {
18
+ const { container } = render(UiIcon, {
19
+ props: { name: 'CircleHelp' },
20
+ });
21
+
22
+ const el = container.querySelector('[data-slot="icon"]');
23
+ expect(el).toBeInTheDocument();
24
+ expect(el?.tagName.toLowerCase()).toBe('svg');
25
+ });
26
+
17
27
  test('exposes role="img" when ariaLabel is provided', () => {
18
28
  const { getByRole } = render(UiIcon, {
19
- props: { icon: 'i-material-symbols-help', ariaLabel: 'Help' },
29
+ props: { name: 'circle-help', ariaLabel: 'Help' },
20
30
  });
21
31
 
22
32
  expect(getByRole('img', { name: 'Help' })).toBeInTheDocument();
23
33
  });
34
+
35
+ test('applies custom size', () => {
36
+ const { container } = render(UiIcon, {
37
+ props: { name: 'star', size: 32 },
38
+ });
39
+
40
+ const el = container.querySelector('[data-slot="icon"]');
41
+ expect(el).toHaveAttribute('width', '32');
42
+ expect(el).toHaveAttribute('height', '32');
43
+ });
44
+
45
+ test('does not render when icon name is invalid', () => {
46
+ const { container } = render(UiIcon, {
47
+ props: { name: 'non-existent-icon-xyz' },
48
+ });
49
+
50
+ const el = container.querySelector('[data-slot="icon"]');
51
+ expect(el).not.toBeInTheDocument();
52
+ });
24
53
  });
@@ -1 +1,2 @@
1
1
  export { default as UiIcon } from './UiIcon.vue';
2
+ export type { UiIconProps } from './types';
@@ -1,23 +1,42 @@
1
+ import type { HTMLAttributes } from 'vue';
2
+
1
3
  /**
2
- * An icon component using UnoCSS/Iconify icons. Use for visual indicators,
4
+ * An icon component using Lucide icons. Use for visual indicators,
3
5
  * button decorations, or standalone meaningful graphics.
4
6
  *
5
7
  * @category Data Display
6
8
  * @useCases visual indicator, button icon, status icon, decorative graphic
7
- * @keywords icon, symbol, graphic, material, iconify, svg
9
+ * @keywords icon, symbol, graphic, lucide, svg
8
10
  * @related UiIconButton, UiButton
9
11
  */
10
12
  export interface UiIconProps {
11
13
  /**
12
- * Icon class generated by UnoCSS preset-icons / ds-icons.
14
+ * Lucide icon name in kebab-case or PascalCase.
15
+ *
16
+ * Example: `circle-help`, `CircleHelp`, `chevron-down`, `ChevronDown`
13
17
  *
14
- * Example: `i-material-symbols-help`
18
+ * @see https://lucide.dev/icons for available icons
19
+ */
20
+ name: string;
21
+
22
+ /**
23
+ * Icon size in pixels. Defaults to 24.
15
24
  */
16
- icon: string;
25
+ size?: number | string;
26
+
27
+ /**
28
+ * Stroke width. Defaults to 2.
29
+ */
30
+ strokeWidth?: number | string;
17
31
 
18
32
  /**
19
33
  * Accessible label for the icon. When provided, the icon is exposed as `role="img"`.
20
34
  * If omitted, the icon is treated as decorative (`aria-hidden="true"`).
21
35
  */
22
36
  ariaLabel?: string;
37
+
38
+ /**
39
+ * Additional CSS classes to apply to the icon.
40
+ */
41
+ class?: HTMLAttributes['class'];
23
42
  }
@@ -54,7 +54,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
54
54
 
55
55
  <template>
56
56
  <UiIconButton aria-label="Next">
57
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
57
+ <UiIcon name="chevron-right" :size="16" />
58
58
  </UiIconButton>
59
59
  </template>`;
60
60
 
@@ -68,7 +68,7 @@ export const Default: Story = {
68
68
  return { args };
69
69
  },
70
70
  template: `<UiIconButton :variant="args.variant" :size="args.size" :disabled="args.disabled" :loading="args.loading" :aria-label="args.ariaLabel">
71
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
71
+ <UiIcon name="chevron-right" :size="16" />
72
72
  </UiIconButton>`,
73
73
  }),
74
74
  parameters: {
@@ -86,7 +86,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
86
86
 
87
87
  <template>
88
88
  <UiIconButton variant="secondary" aria-label="Next">
89
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
89
+ <UiIcon name="chevron-right" :size="16" />
90
90
  </UiIconButton>
91
91
  </template>`;
92
92
 
@@ -97,7 +97,7 @@ export const Secondary: Story = {
97
97
  render: () => ({
98
98
  components: { UiIconButton, UiIcon },
99
99
  template: `<UiIconButton variant="secondary" aria-label="Next">
100
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
100
+ <UiIcon name="chevron-right" :size="16" />
101
101
  </UiIconButton>`,
102
102
  }),
103
103
  parameters: {
@@ -115,7 +115,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
115
115
 
116
116
  <template>
117
117
  <UiIconButton variant="destructive" aria-label="Delete">
118
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
118
+ <UiIcon name="chevron-right" :size="16" />
119
119
  </UiIconButton>
120
120
  </template>`;
121
121
 
@@ -126,7 +126,7 @@ export const Destructive: Story = {
126
126
  render: () => ({
127
127
  components: { UiIconButton, UiIcon },
128
128
  template: `<UiIconButton variant="destructive" aria-label="Delete">
129
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
129
+ <UiIcon name="chevron-right" :size="16" />
130
130
  </UiIconButton>`,
131
131
  }),
132
132
  parameters: {
@@ -144,7 +144,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
144
144
 
145
145
  <template>
146
146
  <UiIconButton variant="outline" aria-label="Next">
147
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
147
+ <UiIcon name="chevron-right" :size="16" />
148
148
  </UiIconButton>
149
149
  </template>`;
150
150
 
@@ -155,7 +155,7 @@ export const Outline: Story = {
155
155
  render: () => ({
156
156
  components: { UiIconButton, UiIcon },
157
157
  template: `<UiIconButton variant="outline" aria-label="Next">
158
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
158
+ <UiIcon name="chevron-right" :size="16" />
159
159
  </UiIconButton>`,
160
160
  }),
161
161
  parameters: {
@@ -173,7 +173,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
173
173
 
174
174
  <template>
175
175
  <UiIconButton variant="ghost" aria-label="Next">
176
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
176
+ <UiIcon name="chevron-right" :size="16" />
177
177
  </UiIconButton>
178
178
  </template>`;
179
179
 
@@ -184,7 +184,7 @@ export const Ghost: Story = {
184
184
  render: () => ({
185
185
  components: { UiIconButton, UiIcon },
186
186
  template: `<UiIconButton variant="ghost" aria-label="Next">
187
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
187
+ <UiIcon name="chevron-right" :size="16" />
188
188
  </UiIconButton>`,
189
189
  }),
190
190
  parameters: {
@@ -202,7 +202,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
202
202
 
203
203
  <template>
204
204
  <UiIconButton variant="link" aria-label="Next">
205
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
205
+ <UiIcon name="chevron-right" :size="16" />
206
206
  </UiIconButton>
207
207
  </template>`;
208
208
 
@@ -213,7 +213,7 @@ export const Link: Story = {
213
213
  render: () => ({
214
214
  components: { UiIconButton, UiIcon },
215
215
  template: `<UiIconButton variant="link" aria-label="Next">
216
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
216
+ <UiIcon name="chevron-right" :size="16" />
217
217
  </UiIconButton>`,
218
218
  }),
219
219
  parameters: {
@@ -231,7 +231,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
231
231
 
232
232
  <template>
233
233
  <UiIconButton :loading="true" aria-label="Loading">
234
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
234
+ <UiIcon name="chevron-right" :size="16" />
235
235
  </UiIconButton>
236
236
  </template>`;
237
237
 
@@ -242,7 +242,7 @@ export const Loading: Story = {
242
242
  render: () => ({
243
243
  components: { UiIconButton, UiIcon },
244
244
  template: `<UiIconButton :loading="true" aria-label="Loading">
245
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
245
+ <UiIcon name="chevron-right" :size="16" />
246
246
  </UiIconButton>`,
247
247
  }),
248
248
  parameters: {
@@ -260,7 +260,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
260
260
 
261
261
  <template>
262
262
  <UiIconButton :disabled="true" aria-label="Disabled">
263
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
263
+ <UiIcon name="chevron-right" :size="16" />
264
264
  </UiIconButton>
265
265
  </template>`;
266
266
 
@@ -271,7 +271,7 @@ export const Disabled: Story = {
271
271
  render: () => ({
272
272
  components: { UiIconButton, UiIcon },
273
273
  template: `<UiIconButton :disabled="true" aria-label="Disabled">
274
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
274
+ <UiIcon name="chevron-right" :size="16" />
275
275
  </UiIconButton>`,
276
276
  }),
277
277
  parameters: {
@@ -290,22 +290,22 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
290
290
  <template>
291
291
  <div class="flex flex-wrap items-center gap-4">
292
292
  <UiIconButton variant="default" aria-label="Default">
293
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
293
+ <UiIcon name="chevron-right" :size="16" />
294
294
  </UiIconButton>
295
295
  <UiIconButton variant="secondary" aria-label="Secondary">
296
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
296
+ <UiIcon name="chevron-right" :size="16" />
297
297
  </UiIconButton>
298
298
  <UiIconButton variant="destructive" aria-label="Destructive">
299
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
299
+ <UiIcon name="chevron-right" :size="16" />
300
300
  </UiIconButton>
301
301
  <UiIconButton variant="outline" aria-label="Outline">
302
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
302
+ <UiIcon name="chevron-right" :size="16" />
303
303
  </UiIconButton>
304
304
  <UiIconButton variant="ghost" aria-label="Ghost">
305
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
305
+ <UiIcon name="chevron-right" :size="16" />
306
306
  </UiIconButton>
307
307
  <UiIconButton variant="link" aria-label="Link">
308
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
308
+ <UiIcon name="chevron-right" :size="16" />
309
309
  </UiIconButton>
310
310
  </div>
311
311
  </template>`;
@@ -318,22 +318,22 @@ export const AllVariants: Story = {
318
318
  components: { UiIconButton, UiIcon },
319
319
  template: `<div class="flex flex-wrap items-center gap-4">
320
320
  <UiIconButton variant="default" aria-label="Default">
321
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
321
+ <UiIcon name="chevron-right" :size="16" />
322
322
  </UiIconButton>
323
323
  <UiIconButton variant="secondary" aria-label="Secondary">
324
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
324
+ <UiIcon name="chevron-right" :size="16" />
325
325
  </UiIconButton>
326
326
  <UiIconButton variant="destructive" aria-label="Destructive">
327
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
327
+ <UiIcon name="chevron-right" :size="16" />
328
328
  </UiIconButton>
329
329
  <UiIconButton variant="outline" aria-label="Outline">
330
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
330
+ <UiIcon name="chevron-right" :size="16" />
331
331
  </UiIconButton>
332
332
  <UiIconButton variant="ghost" aria-label="Ghost">
333
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
333
+ <UiIcon name="chevron-right" :size="16" />
334
334
  </UiIconButton>
335
335
  <UiIconButton variant="link" aria-label="Link">
336
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
336
+ <UiIcon name="chevron-right" :size="16" />
337
337
  </UiIconButton>
338
338
  </div>`,
339
339
  }),
@@ -355,19 +355,19 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
355
355
  <div class="flex flex-col items-center gap-2">
356
356
  <span class="text-muted-foreground text-xs">icon-sm</span>
357
357
  <UiIconButton size="icon-sm" variant="outline" aria-label="Small Icon">
358
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
358
+ <UiIcon name="chevron-right" :size="16" />
359
359
  </UiIconButton>
360
360
  </div>
361
361
  <div class="flex flex-col items-center gap-2">
362
362
  <span class="text-muted-foreground text-xs">icon</span>
363
363
  <UiIconButton size="icon" variant="outline" aria-label="Default Icon">
364
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
364
+ <UiIcon name="chevron-right" :size="16" />
365
365
  </UiIconButton>
366
366
  </div>
367
367
  <div class="flex flex-col items-center gap-2">
368
368
  <span class="text-muted-foreground text-xs">icon-lg</span>
369
369
  <UiIconButton size="icon-lg" variant="outline" aria-label="Large Icon">
370
- <UiIcon icon="i-material-symbols-chevron-right" class="size-5" />
370
+ <UiIcon name="chevron-right" :size="20" />
371
371
  </UiIconButton>
372
372
  </div>
373
373
  </div>
@@ -383,19 +383,19 @@ export const AllSizes: Story = {
383
383
  <div class="flex flex-col items-center gap-2">
384
384
  <span class="text-muted-foreground text-xs">icon-sm</span>
385
385
  <UiIconButton size="icon-sm" variant="outline" aria-label="Small Icon">
386
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
386
+ <UiIcon name="chevron-right" :size="16" />
387
387
  </UiIconButton>
388
388
  </div>
389
389
  <div class="flex flex-col items-center gap-2">
390
390
  <span class="text-muted-foreground text-xs">icon</span>
391
391
  <UiIconButton size="icon" variant="outline" aria-label="Default Icon">
392
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
392
+ <UiIcon name="chevron-right" :size="16" />
393
393
  </UiIconButton>
394
394
  </div>
395
395
  <div class="flex flex-col items-center gap-2">
396
396
  <span class="text-muted-foreground text-xs">icon-lg</span>
397
397
  <UiIconButton size="icon-lg" variant="outline" aria-label="Large Icon">
398
- <UiIcon icon="i-material-symbols-chevron-right" class="size-5" />
398
+ <UiIcon name="chevron-right" :size="20" />
399
399
  </UiIconButton>
400
400
  </div>
401
401
  </div>`,
@@ -416,7 +416,7 @@ import { UiIconButton, UiIcon } from '@aleph-alpha/ui-library'
416
416
  <template>
417
417
  <UiIconButton :as-child="true" aria-label="Navigate">
418
418
  <a href="#">
419
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
419
+ <UiIcon name="chevron-right" :size="16" />
420
420
  </a>
421
421
  </UiIconButton>
422
422
  </template>`;
@@ -432,7 +432,7 @@ export const AsChild: Story = {
432
432
  components: { UiIconButton, UiIcon },
433
433
  template: `<UiIconButton :as-child="true" aria-label="Navigate">
434
434
  <a href="#">
435
- <UiIcon icon="i-material-symbols-chevron-right" class="size-4" />
435
+ <UiIcon name="chevron-right" :size="16" />
436
436
  </a>
437
437
  </UiIconButton>`,
438
438
  }),