@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.
- package/README.md +0 -2
- package/dist/system/index.d.ts +860 -179
- package/dist/system/lib.js +33936 -9729
- package/package.json +1 -2
- package/src/compositions/UiDataTable/UiDataTable.stories.ts +6 -7
- package/src/compositions/UiDataTable/UiDataTableColumnHeader.vue +22 -8
- package/src/compositions/UiDataTable/UiDataTablePagination.vue +5 -5
- package/src/compositions/UiDatePicker/UiDatePicker.vue +2 -2
- package/src/primitives/UiAlert/UiAlert.stories.ts +8 -8
- package/src/primitives/UiBadge/UiBadge.stories.ts +9 -9
- package/src/primitives/UiButton/UiButton.stories.ts +12 -12
- package/src/primitives/UiCalendar/UiCalendar.stories.ts +4 -4
- package/src/primitives/UiDropdownMenu/UiDropdownMenu.stories.ts +2 -2
- package/src/primitives/UiIcon/UiIcon.stories.ts +59 -13
- package/src/primitives/UiIcon/UiIcon.vue +41 -3
- package/src/primitives/UiIcon/__tests__/UiIcon.test.ts +33 -4
- package/src/primitives/UiIcon/index.ts +1 -0
- package/src/primitives/UiIcon/types.ts +24 -5
- package/src/primitives/UiIconButton/UiIconButton.stories.ts +36 -36
- package/src/primitives/UiKbd/UiKbd.stories.ts +551 -0
- package/src/primitives/UiKbd/UiKbd.vue +62 -0
- package/src/primitives/UiKbd/UiKbdGroup.vue +16 -0
- package/src/primitives/UiKbd/__tests__/UiKbd.test.ts +46 -0
- package/src/primitives/UiKbd/index.ts +3 -0
- package/src/primitives/UiKbd/types.ts +32 -0
- package/src/primitives/UiLabel/UiLabel.stories.ts +192 -0
- package/src/primitives/UiLabel/UiLabel.vue +16 -0
- package/src/primitives/UiLabel/__tests__/UiLabel.test.ts +43 -0
- package/src/primitives/UiLabel/index.ts +2 -0
- package/src/primitives/UiLabel/types.ts +16 -0
- package/src/primitives/UiListbox/UiListbox.stories.ts +607 -0
- package/src/primitives/UiListbox/UiListbox.vue +30 -0
- package/src/primitives/UiListbox/UiListboxContent.vue +16 -0
- package/src/primitives/UiListbox/UiListboxFilter.vue +16 -0
- package/src/primitives/UiListbox/UiListboxGroup.vue +16 -0
- package/src/primitives/UiListbox/UiListboxGroupLabel.vue +16 -0
- package/src/primitives/UiListbox/UiListboxItem.vue +20 -0
- package/src/primitives/UiListbox/UiListboxItemIndicator.vue +16 -0
- package/src/primitives/UiListbox/__tests__/UiListbox.test.ts +42 -0
- package/src/primitives/UiListbox/index.ts +8 -0
- package/src/primitives/UiListbox/types.ts +119 -0
- package/src/primitives/UiPopover/index.ts +1 -0
- package/src/primitives/UiSeparator/UiSeparator.stories.ts +177 -0
- package/src/primitives/UiSeparator/UiSeparator.vue +17 -0
- package/src/primitives/UiSeparator/__tests__/UiSeparator.test.ts +34 -0
- package/src/primitives/UiSeparator/index.ts +2 -0
- package/src/primitives/UiSeparator/types.ts +23 -0
- package/src/primitives/UiSkeleton/UiSkeleton.stories.ts +247 -0
- package/src/primitives/UiSkeleton/UiSkeleton.vue +24 -0
- package/src/primitives/UiSkeleton/__tests__/UiSkeleton.test.ts +47 -0
- package/src/primitives/UiSkeleton/index.ts +2 -0
- package/src/primitives/UiSkeleton/types.ts +26 -0
- package/src/primitives/UiTable/UiTable.stories.ts +2 -2
- package/src/primitives/UiTagsInput/UiTagsInput.stories.ts +538 -0
- package/src/primitives/UiTagsInput/UiTagsInput.vue +27 -0
- package/src/primitives/UiTagsInput/UiTagsInputInput.vue +14 -0
- package/src/primitives/UiTagsInput/UiTagsInputItem.vue +16 -0
- package/src/primitives/UiTagsInput/UiTagsInputItemDelete.vue +16 -0
- package/src/primitives/UiTagsInput/UiTagsInputItemText.vue +14 -0
- package/src/primitives/UiTagsInput/__tests__/UiTagsInput.test.ts +44 -0
- package/src/primitives/UiTagsInput/index.ts +6 -0
- package/src/primitives/UiTagsInput/types.ts +60 -0
- package/src/primitives/UiToggle/UiToggle.stories.ts +370 -0
- package/src/primitives/UiToggle/UiToggle.vue +28 -0
- package/src/primitives/UiToggle/__tests__/UiToggle.test.ts +62 -0
- package/src/primitives/UiToggle/index.ts +2 -0
- package/src/primitives/UiToggle/types.ts +35 -0
- package/src/primitives/UiTooltip/UiTooltip.stories.ts +8 -8
- package/src/primitives/index.ts +7 -0
- package/src/primitives/shadcn/accordion/AccordionTrigger.vue +5 -4
- package/src/primitives/shadcn/calendar/CalendarNextButton.vue +2 -2
- package/src/primitives/shadcn/calendar/CalendarPrevButton.vue +2 -2
- package/src/primitives/shadcn/checkbox/Checkbox.vue +2 -2
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +2 -2
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +2 -2
- package/src/primitives/shadcn/kbd/Kbd.vue +20 -0
- package/src/primitives/shadcn/kbd/KbdGroup.vue +12 -0
- package/src/primitives/shadcn/kbd/index.ts +2 -0
- package/src/primitives/shadcn/listbox/Listbox.vue +23 -0
- package/src/primitives/shadcn/listbox/ListboxContent.vue +26 -0
- package/src/primitives/shadcn/listbox/ListboxFilter.vue +30 -0
- package/src/primitives/shadcn/listbox/ListboxGroup.vue +26 -0
- package/src/primitives/shadcn/listbox/ListboxGroupLabel.vue +26 -0
- package/src/primitives/shadcn/listbox/ListboxItem.vue +32 -0
- package/src/primitives/shadcn/listbox/ListboxItemIndicator.vue +40 -0
- package/src/primitives/shadcn/listbox/index.ts +7 -0
- package/src/primitives/shadcn/native-select/NativeSelect.vue +5 -4
- package/src/primitives/shadcn/range-calendar/RangeCalendarNextButton.vue +2 -2
- package/src/primitives/shadcn/range-calendar/RangeCalendarPrevButton.vue +2 -2
- package/src/primitives/shadcn/select/SelectItem.vue +2 -2
- package/src/primitives/shadcn/select/SelectScrollDownButton.vue +2 -2
- package/src/primitives/shadcn/select/SelectScrollUpButton.vue +2 -2
- package/src/primitives/shadcn/select/SelectTrigger.vue +2 -2
- package/src/primitives/shadcn/skeleton/Skeleton.vue +10 -0
- package/src/primitives/shadcn/skeleton/index.ts +1 -0
- package/src/primitives/shadcn/spinner/Spinner.vue +5 -4
- package/src/primitives/shadcn/tags-input/TagsInput.vue +33 -0
- package/src/primitives/shadcn/tags-input/TagsInputInput.vue +24 -0
- package/src/primitives/shadcn/tags-input/TagsInputItem.vue +31 -0
- package/src/primitives/shadcn/tags-input/TagsInputItemDelete.vue +46 -0
- package/src/primitives/shadcn/tags-input/TagsInputItemText.vue +24 -0
- package/src/primitives/shadcn/tags-input/index.ts +5 -0
- package/src/primitives/shadcn/toggle/Toggle.vue +34 -0
- package/src/primitives/shadcn/toggle/index.ts +27 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { TagsInputRootProps } from 'reka-ui';
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A tags input component that renders tags inside an input, followed by an actual text input.
|
|
6
|
+
* Use for entering multiple values like tags, keywords, or email addresses.
|
|
7
|
+
*
|
|
8
|
+
* @category Form Inputs
|
|
9
|
+
* @useCases tag entry, keyword input, email list, multi-value input, chip input
|
|
10
|
+
* @keywords tags, input, chips, tokens, multi, keywords, labels
|
|
11
|
+
* @related UiInput, UiBadge
|
|
12
|
+
* @extends TagsInputRootProps
|
|
13
|
+
*/
|
|
14
|
+
export interface UiTagsInputProps extends Omit<TagsInputRootProps, 'class'> {
|
|
15
|
+
/**
|
|
16
|
+
* Additional CSS classes to apply to the component.
|
|
17
|
+
*/
|
|
18
|
+
class?: HTMLAttributes['class'];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface UiTagsInputInputProps {
|
|
22
|
+
/**
|
|
23
|
+
* Placeholder text for the input field.
|
|
24
|
+
*/
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Additional CSS classes to apply to the input.
|
|
28
|
+
*/
|
|
29
|
+
class?: HTMLAttributes['class'];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface UiTagsInputItemProps {
|
|
33
|
+
/**
|
|
34
|
+
* The value of the tag item.
|
|
35
|
+
*/
|
|
36
|
+
value: string;
|
|
37
|
+
/**
|
|
38
|
+
* Whether the tag is disabled.
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Additional CSS classes to apply to the item.
|
|
44
|
+
*/
|
|
45
|
+
class?: HTMLAttributes['class'];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface UiTagsInputItemTextProps {
|
|
49
|
+
/**
|
|
50
|
+
* Additional CSS classes to apply to the text.
|
|
51
|
+
*/
|
|
52
|
+
class?: HTMLAttributes['class'];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface UiTagsInputItemDeleteProps {
|
|
56
|
+
/**
|
|
57
|
+
* Additional CSS classes to apply to the delete button.
|
|
58
|
+
*/
|
|
59
|
+
class?: HTMLAttributes['class'];
|
|
60
|
+
}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3-vite';
|
|
2
|
+
import UiToggle from './UiToggle.vue';
|
|
3
|
+
import { UiIcon } from '../UiIcon';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof UiToggle> = {
|
|
6
|
+
title: 'Primitives/UiToggle',
|
|
7
|
+
component: UiToggle,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
argTypes: {
|
|
10
|
+
variant: {
|
|
11
|
+
control: 'select',
|
|
12
|
+
options: ['default', 'outline'],
|
|
13
|
+
description: 'The visual style variant',
|
|
14
|
+
},
|
|
15
|
+
size: {
|
|
16
|
+
control: 'select',
|
|
17
|
+
options: ['default', 'sm', 'lg'],
|
|
18
|
+
description: 'The size of the toggle',
|
|
19
|
+
},
|
|
20
|
+
disabled: {
|
|
21
|
+
control: 'boolean',
|
|
22
|
+
description: 'Whether the toggle is disabled',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
args: {
|
|
26
|
+
variant: 'default',
|
|
27
|
+
size: 'default',
|
|
28
|
+
disabled: false,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default meta;
|
|
33
|
+
|
|
34
|
+
type Story = StoryObj<typeof UiToggle>;
|
|
35
|
+
|
|
36
|
+
const defaultTemplateSource = `<script setup lang="ts">
|
|
37
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<UiToggle aria-label="Toggle bold">
|
|
42
|
+
<UiIcon name="bold" />
|
|
43
|
+
</UiToggle>
|
|
44
|
+
</template>`;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Default toggle button with icon.
|
|
48
|
+
*/
|
|
49
|
+
export const Default: Story = {
|
|
50
|
+
render: (args) => ({
|
|
51
|
+
components: { UiToggle, UiIcon },
|
|
52
|
+
setup() {
|
|
53
|
+
return { args };
|
|
54
|
+
},
|
|
55
|
+
template: `<UiToggle :variant="args.variant" :size="args.size" :disabled="args.disabled" aria-label="Toggle bold">
|
|
56
|
+
<UiIcon name="bold" />
|
|
57
|
+
</UiToggle>`,
|
|
58
|
+
}),
|
|
59
|
+
parameters: {
|
|
60
|
+
docs: {
|
|
61
|
+
source: {
|
|
62
|
+
code: defaultTemplateSource,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const outlineTemplateSource = `<script setup lang="ts">
|
|
69
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<template>
|
|
73
|
+
<UiToggle variant="outline" aria-label="Toggle bold">
|
|
74
|
+
<UiIcon name="bold" />
|
|
75
|
+
</UiToggle>
|
|
76
|
+
</template>`;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Outline variant toggle.
|
|
80
|
+
*/
|
|
81
|
+
export const Outline: Story = {
|
|
82
|
+
render: () => ({
|
|
83
|
+
components: { UiToggle, UiIcon },
|
|
84
|
+
template: `<UiToggle variant="outline" aria-label="Toggle bold">
|
|
85
|
+
<UiIcon name="bold" />
|
|
86
|
+
</UiToggle>`,
|
|
87
|
+
}),
|
|
88
|
+
parameters: {
|
|
89
|
+
docs: {
|
|
90
|
+
source: {
|
|
91
|
+
code: outlineTemplateSource,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const withTextTemplateSource = `<script setup lang="ts">
|
|
98
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<template>
|
|
102
|
+
<UiToggle aria-label="Toggle italic">
|
|
103
|
+
<UiIcon name="italic" />
|
|
104
|
+
Italic
|
|
105
|
+
</UiToggle>
|
|
106
|
+
</template>`;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Toggle with text label.
|
|
110
|
+
*/
|
|
111
|
+
export const WithText: Story = {
|
|
112
|
+
render: () => ({
|
|
113
|
+
components: { UiToggle, UiIcon },
|
|
114
|
+
template: `<UiToggle aria-label="Toggle italic">
|
|
115
|
+
<UiIcon name="italic" />
|
|
116
|
+
Italic
|
|
117
|
+
</UiToggle>`,
|
|
118
|
+
}),
|
|
119
|
+
parameters: {
|
|
120
|
+
docs: {
|
|
121
|
+
source: {
|
|
122
|
+
code: withTextTemplateSource,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const smallTemplateSource = `<script setup lang="ts">
|
|
129
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<template>
|
|
133
|
+
<UiToggle size="sm" aria-label="Toggle italic">
|
|
134
|
+
<UiIcon name="italic" />
|
|
135
|
+
</UiToggle>
|
|
136
|
+
</template>`;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Small size toggle.
|
|
140
|
+
*/
|
|
141
|
+
export const Small: Story = {
|
|
142
|
+
render: () => ({
|
|
143
|
+
components: { UiToggle, UiIcon },
|
|
144
|
+
template: `<UiToggle size="sm" aria-label="Toggle italic">
|
|
145
|
+
<UiIcon name="italic" />
|
|
146
|
+
</UiToggle>`,
|
|
147
|
+
}),
|
|
148
|
+
parameters: {
|
|
149
|
+
docs: {
|
|
150
|
+
source: {
|
|
151
|
+
code: smallTemplateSource,
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const largeTemplateSource = `<script setup lang="ts">
|
|
158
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<template>
|
|
162
|
+
<UiToggle size="lg" aria-label="Toggle italic">
|
|
163
|
+
<UiIcon name="italic" />
|
|
164
|
+
</UiToggle>
|
|
165
|
+
</template>`;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Large size toggle.
|
|
169
|
+
*/
|
|
170
|
+
export const Large: Story = {
|
|
171
|
+
render: () => ({
|
|
172
|
+
components: { UiToggle, UiIcon },
|
|
173
|
+
template: `<UiToggle size="lg" aria-label="Toggle italic">
|
|
174
|
+
<UiIcon name="italic" />
|
|
175
|
+
</UiToggle>`,
|
|
176
|
+
}),
|
|
177
|
+
parameters: {
|
|
178
|
+
docs: {
|
|
179
|
+
source: {
|
|
180
|
+
code: largeTemplateSource,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const disabledTemplateSource = `<script setup lang="ts">
|
|
187
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
188
|
+
</script>
|
|
189
|
+
|
|
190
|
+
<template>
|
|
191
|
+
<UiToggle disabled aria-label="Toggle underline">
|
|
192
|
+
<UiIcon name="underline" />
|
|
193
|
+
</UiToggle>
|
|
194
|
+
</template>`;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Disabled toggle.
|
|
198
|
+
*/
|
|
199
|
+
export const Disabled: Story = {
|
|
200
|
+
render: () => ({
|
|
201
|
+
components: { UiToggle, UiIcon },
|
|
202
|
+
template: `<UiToggle disabled aria-label="Toggle underline">
|
|
203
|
+
<UiIcon name="underline" />
|
|
204
|
+
</UiToggle>`,
|
|
205
|
+
}),
|
|
206
|
+
parameters: {
|
|
207
|
+
docs: {
|
|
208
|
+
source: {
|
|
209
|
+
code: disabledTemplateSource,
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
const allStatesTemplateSource = `<script setup lang="ts">
|
|
216
|
+
import { UiToggle, UiIcon } from '@aleph-alpha/ui-library'
|
|
217
|
+
</script>
|
|
218
|
+
|
|
219
|
+
<template>
|
|
220
|
+
<div class="flex flex-col gap-6">
|
|
221
|
+
<!-- Variants -->
|
|
222
|
+
<div>
|
|
223
|
+
<p class="text-sm font-medium mb-2">Variants</p>
|
|
224
|
+
<div class="flex items-center gap-2">
|
|
225
|
+
<UiToggle aria-label="Toggle bold">
|
|
226
|
+
<UiIcon name="bold" />
|
|
227
|
+
</UiToggle>
|
|
228
|
+
<UiToggle default-value aria-label="Toggle bold (pressed)">
|
|
229
|
+
<UiIcon name="bold" />
|
|
230
|
+
</UiToggle>
|
|
231
|
+
<UiToggle variant="outline" aria-label="Toggle italic">
|
|
232
|
+
<UiIcon name="italic" />
|
|
233
|
+
</UiToggle>
|
|
234
|
+
<UiToggle variant="outline" default-value aria-label="Toggle italic (pressed)">
|
|
235
|
+
<UiIcon name="italic" />
|
|
236
|
+
</UiToggle>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<!-- Sizes -->
|
|
241
|
+
<div>
|
|
242
|
+
<p class="text-sm font-medium mb-2">Sizes</p>
|
|
243
|
+
<div class="flex items-end gap-2">
|
|
244
|
+
<UiToggle size="sm" aria-label="Toggle bold">
|
|
245
|
+
<UiIcon name="bold" />
|
|
246
|
+
</UiToggle>
|
|
247
|
+
<UiToggle aria-label="Toggle bold">
|
|
248
|
+
<UiIcon name="bold" />
|
|
249
|
+
</UiToggle>
|
|
250
|
+
<UiToggle size="lg" aria-label="Toggle bold">
|
|
251
|
+
<UiIcon name="bold" />
|
|
252
|
+
</UiToggle>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
<!-- With Text -->
|
|
257
|
+
<div>
|
|
258
|
+
<p class="text-sm font-medium mb-2">With Text</p>
|
|
259
|
+
<div class="flex items-center gap-2">
|
|
260
|
+
<UiToggle aria-label="Toggle italic">
|
|
261
|
+
<UiIcon name="italic" />
|
|
262
|
+
Italic
|
|
263
|
+
</UiToggle>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
<!-- Disabled -->
|
|
268
|
+
<div>
|
|
269
|
+
<p class="text-sm font-medium mb-2">Disabled</p>
|
|
270
|
+
<div class="flex items-center gap-2">
|
|
271
|
+
<UiToggle disabled aria-label="Toggle underline">
|
|
272
|
+
<UiIcon name="underline" />
|
|
273
|
+
</UiToggle>
|
|
274
|
+
<UiToggle disabled default-value aria-label="Toggle underline (pressed)">
|
|
275
|
+
<UiIcon name="underline" />
|
|
276
|
+
</UiToggle>
|
|
277
|
+
<UiToggle disabled variant="outline" aria-label="Toggle underline">
|
|
278
|
+
<UiIcon name="underline" />
|
|
279
|
+
</UiToggle>
|
|
280
|
+
<UiToggle disabled variant="outline" default-value aria-label="Toggle underline (pressed)">
|
|
281
|
+
<UiIcon name="underline" />
|
|
282
|
+
</UiToggle>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</template>`;
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* All toggle states displayed together: variants, sizes, with text, and disabled states.
|
|
290
|
+
*/
|
|
291
|
+
export const AllStates: Story = {
|
|
292
|
+
render: () => ({
|
|
293
|
+
components: { UiToggle, UiIcon },
|
|
294
|
+
template: `
|
|
295
|
+
<div class="flex flex-col gap-6">
|
|
296
|
+
<!-- Variants -->
|
|
297
|
+
<div>
|
|
298
|
+
<p class="text-sm font-medium mb-2">Variants</p>
|
|
299
|
+
<div class="flex items-center gap-2">
|
|
300
|
+
<UiToggle aria-label="Toggle bold">
|
|
301
|
+
<UiIcon name="bold" />
|
|
302
|
+
</UiToggle>
|
|
303
|
+
<UiToggle default-value aria-label="Toggle bold (pressed)">
|
|
304
|
+
<UiIcon name="bold" />
|
|
305
|
+
</UiToggle>
|
|
306
|
+
<UiToggle variant="outline" aria-label="Toggle italic">
|
|
307
|
+
<UiIcon name="italic" />
|
|
308
|
+
</UiToggle>
|
|
309
|
+
<UiToggle variant="outline" default-value aria-label="Toggle italic (pressed)">
|
|
310
|
+
<UiIcon name="italic" />
|
|
311
|
+
</UiToggle>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
<!-- Sizes -->
|
|
316
|
+
<div>
|
|
317
|
+
<p class="text-sm font-medium mb-2">Sizes</p>
|
|
318
|
+
<div class="flex items-end gap-2">
|
|
319
|
+
<UiToggle size="sm" aria-label="Toggle bold">
|
|
320
|
+
<UiIcon name="bold" />
|
|
321
|
+
</UiToggle>
|
|
322
|
+
<UiToggle aria-label="Toggle bold">
|
|
323
|
+
<UiIcon name="bold" />
|
|
324
|
+
</UiToggle>
|
|
325
|
+
<UiToggle size="lg" aria-label="Toggle bold">
|
|
326
|
+
<UiIcon name="bold" />
|
|
327
|
+
</UiToggle>
|
|
328
|
+
</div>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
331
|
+
<!-- With Text -->
|
|
332
|
+
<div>
|
|
333
|
+
<p class="text-sm font-medium mb-2">With Text</p>
|
|
334
|
+
<div class="flex items-center gap-2">
|
|
335
|
+
<UiToggle aria-label="Toggle italic">
|
|
336
|
+
<UiIcon name="italic" />
|
|
337
|
+
Italic
|
|
338
|
+
</UiToggle>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
|
|
342
|
+
<!-- Disabled -->
|
|
343
|
+
<div>
|
|
344
|
+
<p class="text-sm font-medium mb-2">Disabled</p>
|
|
345
|
+
<div class="flex items-center gap-2">
|
|
346
|
+
<UiToggle disabled aria-label="Toggle underline">
|
|
347
|
+
<UiIcon name="underline" />
|
|
348
|
+
</UiToggle>
|
|
349
|
+
<UiToggle disabled default-value aria-label="Toggle underline (pressed)">
|
|
350
|
+
<UiIcon name="underline" />
|
|
351
|
+
</UiToggle>
|
|
352
|
+
<UiToggle disabled variant="outline" aria-label="Toggle underline">
|
|
353
|
+
<UiIcon name="underline" />
|
|
354
|
+
</UiToggle>
|
|
355
|
+
<UiToggle disabled variant="outline" default-value aria-label="Toggle underline (pressed)">
|
|
356
|
+
<UiIcon name="underline" />
|
|
357
|
+
</UiToggle>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
</div>
|
|
361
|
+
`,
|
|
362
|
+
}),
|
|
363
|
+
parameters: {
|
|
364
|
+
docs: {
|
|
365
|
+
source: {
|
|
366
|
+
code: allStatesTemplateSource,
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Toggle as ShadcnToggle } from '@/primitives/shadcn/toggle';
|
|
3
|
+
import type { UiToggleProps } from './types';
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
name: 'UiToggle',
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const props = withDefaults(defineProps<UiToggleProps>(), {
|
|
10
|
+
disabled: false,
|
|
11
|
+
variant: 'default',
|
|
12
|
+
size: 'default',
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const modelValue = defineModel<boolean>();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<template>
|
|
19
|
+
<ShadcnToggle
|
|
20
|
+
v-model="modelValue"
|
|
21
|
+
:default-value="props.defaultValue"
|
|
22
|
+
:disabled="props.disabled"
|
|
23
|
+
:variant="props.variant"
|
|
24
|
+
:size="props.size"
|
|
25
|
+
>
|
|
26
|
+
<slot />
|
|
27
|
+
</ShadcnToggle>
|
|
28
|
+
</template>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { render } from '@testing-library/vue';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
import UiToggle from '../UiToggle.vue';
|
|
4
|
+
|
|
5
|
+
describe('UiToggle', () => {
|
|
6
|
+
test('renders toggle button', () => {
|
|
7
|
+
const { getByRole } = render(UiToggle, {
|
|
8
|
+
slots: { default: 'Toggle' },
|
|
9
|
+
});
|
|
10
|
+
expect(getByRole('button')).toBeInTheDocument();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('has data-slot attribute', () => {
|
|
14
|
+
const { container } = render(UiToggle, {
|
|
15
|
+
slots: { default: 'Toggle' },
|
|
16
|
+
});
|
|
17
|
+
const toggle = container.querySelector('[data-slot="toggle"]');
|
|
18
|
+
expect(toggle).toBeInTheDocument();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('starts in off state by default', () => {
|
|
22
|
+
const { getByRole } = render(UiToggle, {
|
|
23
|
+
slots: { default: 'Toggle' },
|
|
24
|
+
});
|
|
25
|
+
expect(getByRole('button')).toHaveAttribute('data-state', 'off');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('is disabled when disabled prop is true', () => {
|
|
29
|
+
const { getByRole } = render(UiToggle, {
|
|
30
|
+
props: { disabled: true },
|
|
31
|
+
slots: { default: 'Toggle' },
|
|
32
|
+
});
|
|
33
|
+
expect(getByRole('button')).toBeDisabled();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('applies outline variant classes', () => {
|
|
37
|
+
const { container } = render(UiToggle, {
|
|
38
|
+
props: { variant: 'outline' },
|
|
39
|
+
slots: { default: 'Toggle' },
|
|
40
|
+
});
|
|
41
|
+
const toggle = container.querySelector('button');
|
|
42
|
+
expect(toggle).toHaveClass('border');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('applies sm size classes', () => {
|
|
46
|
+
const { container } = render(UiToggle, {
|
|
47
|
+
props: { size: 'sm' },
|
|
48
|
+
slots: { default: 'Toggle' },
|
|
49
|
+
});
|
|
50
|
+
const toggle = container.querySelector('button');
|
|
51
|
+
expect(toggle).toHaveClass('h-8');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('applies lg size classes', () => {
|
|
55
|
+
const { container } = render(UiToggle, {
|
|
56
|
+
props: { size: 'lg' },
|
|
57
|
+
slots: { default: 'Toggle' },
|
|
58
|
+
});
|
|
59
|
+
const toggle = container.querySelector('button');
|
|
60
|
+
expect(toggle).toHaveClass('h-10');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A two-state button that can be toggled on or off.
|
|
3
|
+
* Use for enabling/disabling features or switching between states.
|
|
4
|
+
*
|
|
5
|
+
* @category Form Inputs
|
|
6
|
+
* @useCases toolbar button, formatting toggle, view toggle, filter toggle
|
|
7
|
+
* @keywords toggle, button, pressed, on, off, state
|
|
8
|
+
* @related UiSwitch, UiButton, UiCheckbox
|
|
9
|
+
*/
|
|
10
|
+
export interface UiToggleProps {
|
|
11
|
+
/**
|
|
12
|
+
* The controlled pressed state of the toggle. Use with v-model.
|
|
13
|
+
*/
|
|
14
|
+
modelValue?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The pressed state when initially rendered (uncontrolled mode).
|
|
17
|
+
* Use when you do not need to control its state.
|
|
18
|
+
*/
|
|
19
|
+
defaultValue?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the toggle is disabled.
|
|
22
|
+
* @default false
|
|
23
|
+
*/
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* The visual style variant.
|
|
27
|
+
* @default 'default'
|
|
28
|
+
*/
|
|
29
|
+
variant?: 'default' | 'outline';
|
|
30
|
+
/**
|
|
31
|
+
* The size of the toggle.
|
|
32
|
+
* @default 'default'
|
|
33
|
+
*/
|
|
34
|
+
size?: 'default' | 'sm' | 'lg';
|
|
35
|
+
}
|
|
@@ -115,7 +115,7 @@ import { UiIcon } from '@aleph-alpha/ui-library'
|
|
|
115
115
|
<template>
|
|
116
116
|
<UiTooltip content="More information" side="top" align="center" :delay-duration="500">
|
|
117
117
|
<UiButton size="icon" variant="ghost" aria-label="Information">
|
|
118
|
-
<UiIcon
|
|
118
|
+
<UiIcon name="info" :size="16" />
|
|
119
119
|
</UiButton>
|
|
120
120
|
</UiTooltip>
|
|
121
121
|
</template>`;
|
|
@@ -124,7 +124,7 @@ const withIconButtonTemplate = `
|
|
|
124
124
|
<div class="flex justify-center p-8">
|
|
125
125
|
<UiTooltip content="More information" side="top" align="center" :delay-duration="500">
|
|
126
126
|
<UiButton size="icon" variant="ghost" aria-label="Information">
|
|
127
|
-
<UiIcon
|
|
127
|
+
<UiIcon name="info" :size="16" />
|
|
128
128
|
</UiButton>
|
|
129
129
|
</UiTooltip>
|
|
130
130
|
</div>
|
|
@@ -404,19 +404,19 @@ import { UiIcon } from '@aleph-alpha/ui-library'
|
|
|
404
404
|
|
|
405
405
|
<UiTooltip content="Need help? Click for documentation" side="top" align="center">
|
|
406
406
|
<UiButton size="icon" variant="ghost" aria-label="Help">
|
|
407
|
-
<UiIcon
|
|
407
|
+
<UiIcon name="circle-help" :size="16" />
|
|
408
408
|
</UiButton>
|
|
409
409
|
</UiTooltip>
|
|
410
410
|
|
|
411
411
|
<UiTooltip content="Important information about this feature" side="top" align="center">
|
|
412
412
|
<UiButton size="icon" variant="outline" aria-label="Information">
|
|
413
|
-
<UiIcon
|
|
413
|
+
<UiIcon name="info" :size="16" />
|
|
414
414
|
</UiButton>
|
|
415
415
|
</UiTooltip>
|
|
416
416
|
|
|
417
417
|
<UiTooltip content="Warning: This may affect other settings" side="top" align="center">
|
|
418
418
|
<UiButton size="icon" variant="secondary" aria-label="Warning">
|
|
419
|
-
<UiIcon
|
|
419
|
+
<UiIcon name="triangle-alert" :size="16" />
|
|
420
420
|
</UiButton>
|
|
421
421
|
</UiTooltip>
|
|
422
422
|
|
|
@@ -437,19 +437,19 @@ const useCasesTemplate = `
|
|
|
437
437
|
|
|
438
438
|
<UiTooltip content="Need help? Click for documentation" side="top" align="center">
|
|
439
439
|
<UiButton size="icon" variant="ghost" aria-label="Help">
|
|
440
|
-
<UiIcon
|
|
440
|
+
<UiIcon name="circle-help" :size="16" />
|
|
441
441
|
</UiButton>
|
|
442
442
|
</UiTooltip>
|
|
443
443
|
|
|
444
444
|
<UiTooltip content="Important information about this feature" side="top" align="center">
|
|
445
445
|
<UiButton size="icon" variant="outline" aria-label="Information">
|
|
446
|
-
<UiIcon
|
|
446
|
+
<UiIcon name="info" :size="16" />
|
|
447
447
|
</UiButton>
|
|
448
448
|
</UiTooltip>
|
|
449
449
|
|
|
450
450
|
<UiTooltip content="Warning: This may affect other settings" side="top" align="center">
|
|
451
451
|
<UiButton size="icon" variant="secondary" aria-label="Warning">
|
|
452
|
-
<UiIcon
|
|
452
|
+
<UiIcon name="triangle-alert" :size="16" />
|
|
453
453
|
</UiButton>
|
|
454
454
|
</UiTooltip>
|
|
455
455
|
|
package/src/primitives/index.ts
CHANGED
|
@@ -18,16 +18,23 @@ export * from './UiField';
|
|
|
18
18
|
export * from './UiIcon';
|
|
19
19
|
export * from './UiIconButton';
|
|
20
20
|
export * from './UiInput';
|
|
21
|
+
export * from './UiKbd';
|
|
22
|
+
export * from './UiLabel';
|
|
23
|
+
export * from './UiListbox';
|
|
21
24
|
export * from './UiPopover';
|
|
22
25
|
export * from './UiProgress';
|
|
23
26
|
export * from './UiRadioGroup';
|
|
24
27
|
export * from './UiRangeCalendar';
|
|
25
28
|
export * from './UiSelect';
|
|
29
|
+
export * from './UiSeparator';
|
|
30
|
+
export * from './UiSkeleton';
|
|
26
31
|
export * from './UiSlider';
|
|
27
32
|
export * from './UiSpinner';
|
|
28
33
|
export * from './UiSwitch';
|
|
29
34
|
export * from './UiTable';
|
|
30
35
|
export * from './UiTabs';
|
|
36
|
+
export * from './UiTagsInput';
|
|
31
37
|
export * from './UiTextarea';
|
|
38
|
+
export * from './UiToggle';
|
|
32
39
|
export * from './UiTooltip';
|
|
33
40
|
export * from './shadcn';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { AccordionTriggerProps } from 'reka-ui';
|
|
3
3
|
import type { HTMLAttributes } from 'vue';
|
|
4
4
|
import { reactiveOmit } from '@vueuse/core';
|
|
5
|
-
import {
|
|
5
|
+
import { UiIcon } from '@/primitives/UiIcon';
|
|
6
6
|
import { AccordionHeader, AccordionTrigger } from 'reka-ui';
|
|
7
7
|
import { cn } from '@/lib/utils';
|
|
8
8
|
|
|
@@ -25,9 +25,10 @@
|
|
|
25
25
|
>
|
|
26
26
|
<slot />
|
|
27
27
|
<slot name="icon">
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
<UiIcon
|
|
29
|
+
name="chevron-down"
|
|
30
|
+
:size="16"
|
|
31
|
+
class="text-muted-foreground pointer-events-none shrink-0 translate-y-0.5 transition-transform duration-200"
|
|
31
32
|
/>
|
|
32
33
|
</slot>
|
|
33
34
|
</AccordionTrigger>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { CalendarNextProps } from 'reka-ui';
|
|
3
3
|
import type { HTMLAttributes } from 'vue';
|
|
4
4
|
import { reactiveOmit } from '@vueuse/core';
|
|
5
|
-
import {
|
|
5
|
+
import { UiIcon } from '@/primitives/UiIcon';
|
|
6
6
|
import { CalendarNext, useForwardProps } from 'reka-ui';
|
|
7
7
|
import { cn } from '@/lib/utils';
|
|
8
8
|
import { buttonVariants } from '@/primitives/shadcn/button';
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
v-bind="forwardedProps"
|
|
28
28
|
>
|
|
29
29
|
<slot>
|
|
30
|
-
<
|
|
30
|
+
<UiIcon name="chevron-right" :size="16" />
|
|
31
31
|
</slot>
|
|
32
32
|
</CalendarNext>
|
|
33
33
|
</template>
|