@alpic-ai/ui 1.159.0 → 1.161.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/dist/components/attachment-tile.d.mts +0 -4
- package/package.json +1 -1
- package/src/components/attachment-tile.tsx +0 -4
- package/src/components/avatar.tsx +0 -2
- package/src/components/combobox.tsx +0 -24
- package/src/components/dropdown-menu.tsx +0 -10
- package/src/components/form.tsx +0 -4
- package/src/components/select.tsx +0 -10
- package/src/components/sidebar.tsx +0 -2
- package/src/components/tabs.tsx +0 -6
- package/src/components/tag.tsx +0 -6
- package/src/stories/button.stories.tsx +0 -13
- package/src/stories/combobox.stories.tsx +0 -12
- package/src/stories/dropdown-menu.stories.tsx +0 -4
- package/src/stories/form.stories.tsx +0 -6
- package/src/stories/input-group.stories.tsx +0 -4
- package/src/stories/input.stories.tsx +0 -8
- package/src/stories/skeleton.stories.tsx +0 -2
- package/src/stories/table.stories.tsx +0 -5
- package/src/stories/tabs.stories.tsx +0 -11
- package/src/stories/toggle-group.stories.tsx +0 -5
- package/src/stories/wizard.stories.tsx +0 -3
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
//#region src/components/attachment-tile.d.ts
|
|
2
2
|
interface AttachmentTileProps {
|
|
3
|
-
/** Source URL for the attachment thumbnail */
|
|
4
3
|
src?: string;
|
|
5
|
-
/** Whether the attachment is an image */
|
|
6
4
|
isImage?: boolean;
|
|
7
5
|
/** Accessible label describing the attachment */
|
|
8
6
|
label?: string;
|
|
9
|
-
/** Called when the remove button is clicked */
|
|
10
7
|
onRemove?: () => void;
|
|
11
|
-
/** Called when the tile is clicked (e.g. to open a preview) */
|
|
12
8
|
onClick?: () => void;
|
|
13
9
|
className?: string;
|
|
14
10
|
}
|
package/package.json
CHANGED
|
@@ -7,15 +7,11 @@ import { cn } from "../lib/cn";
|
|
|
7
7
|
import { TooltipIconButton } from "./tooltip-icon-button";
|
|
8
8
|
|
|
9
9
|
interface AttachmentTileProps {
|
|
10
|
-
/** Source URL for the attachment thumbnail */
|
|
11
10
|
src?: string;
|
|
12
|
-
/** Whether the attachment is an image */
|
|
13
11
|
isImage?: boolean;
|
|
14
12
|
/** Accessible label describing the attachment */
|
|
15
13
|
label?: string;
|
|
16
|
-
/** Called when the remove button is clicked */
|
|
17
14
|
onRemove?: () => void;
|
|
18
|
-
/** Called when the tile is clicked (e.g. to open a preview) */
|
|
19
15
|
onClick?: () => void;
|
|
20
16
|
className?: string;
|
|
21
17
|
}
|
|
@@ -84,8 +84,6 @@ function AvatarFallback({ className, ...props }: React.ComponentProps<typeof Ava
|
|
|
84
84
|
);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
// ─── AvatarLabelGroup ─────────────────────────────────────────────────────────
|
|
88
|
-
|
|
89
87
|
interface AvatarLabelGroupProps extends React.ComponentProps<"div"> {
|
|
90
88
|
size?: "sm" | "md";
|
|
91
89
|
src?: string;
|
|
@@ -10,8 +10,6 @@ import { Popover, PopoverContent, PopoverTrigger } from "./popover";
|
|
|
10
10
|
import { selectTriggerVariants } from "./select-trigger-variants";
|
|
11
11
|
import { TagDismissible } from "./tag";
|
|
12
12
|
|
|
13
|
-
/* ── Context ──────────────────────────────────────────────────────────────── */
|
|
14
|
-
|
|
15
13
|
interface ComboboxContextValue {
|
|
16
14
|
multiple: boolean;
|
|
17
15
|
value: string | null;
|
|
@@ -35,8 +33,6 @@ function useComboboxContext() {
|
|
|
35
33
|
return context;
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
/* ── Root ─────────────────────────────────────────────────────────────────── */
|
|
39
|
-
|
|
40
36
|
interface ComboboxBaseProps {
|
|
41
37
|
children: ReactNode;
|
|
42
38
|
open?: boolean;
|
|
@@ -194,8 +190,6 @@ function Combobox(props: ComboboxProps) {
|
|
|
194
190
|
);
|
|
195
191
|
}
|
|
196
192
|
|
|
197
|
-
/* ── Trigger ──────────────────────────────────────────────────────────────── */
|
|
198
|
-
|
|
199
193
|
interface ComboboxTriggerProps
|
|
200
194
|
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "size">,
|
|
201
195
|
VariantProps<typeof selectTriggerVariants> {
|
|
@@ -232,8 +226,6 @@ function ComboboxTrigger({ className, size, placeholder, children, ...props }: C
|
|
|
232
226
|
);
|
|
233
227
|
}
|
|
234
228
|
|
|
235
|
-
/* ── Tags (internal, for multi-select trigger) ────────────────────────────── */
|
|
236
|
-
|
|
237
229
|
function ComboboxTags({ values, onDeselect }: { values: string[]; onDeselect: (value: string) => void }) {
|
|
238
230
|
const { getOptionLabel } = useComboboxContext();
|
|
239
231
|
return (
|
|
@@ -251,8 +243,6 @@ function ComboboxTags({ values, onDeselect }: { values: string[]; onDeselect: (v
|
|
|
251
243
|
);
|
|
252
244
|
}
|
|
253
245
|
|
|
254
|
-
/* ── Content ──────────────────────────────────────────────────────────────── */
|
|
255
|
-
|
|
256
246
|
interface ComboboxContentProps extends React.ComponentProps<typeof PopoverContent> {
|
|
257
247
|
className?: string;
|
|
258
248
|
children?: ReactNode;
|
|
@@ -280,8 +270,6 @@ function ComboboxContent({ className, children, filter, ...props }: ComboboxCont
|
|
|
280
270
|
);
|
|
281
271
|
}
|
|
282
272
|
|
|
283
|
-
/* ── Search ───────────────────────────────────────────────────────────────── */
|
|
284
|
-
|
|
285
273
|
function ComboboxSearch({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {
|
|
286
274
|
return (
|
|
287
275
|
<div data-slot="combobox-search" className="flex items-center gap-2 border-b border-border-secondary px-3 py-2.5">
|
|
@@ -300,8 +288,6 @@ function ComboboxSearch({ className, ...props }: React.ComponentProps<typeof Com
|
|
|
300
288
|
);
|
|
301
289
|
}
|
|
302
290
|
|
|
303
|
-
/* ── List ─────────────────────────────────────────────────────────────────── */
|
|
304
|
-
|
|
305
291
|
function ComboboxList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {
|
|
306
292
|
return (
|
|
307
293
|
<CommandPrimitive.List
|
|
@@ -312,8 +298,6 @@ function ComboboxList({ className, ...props }: React.ComponentProps<typeof Comma
|
|
|
312
298
|
);
|
|
313
299
|
}
|
|
314
300
|
|
|
315
|
-
/* ── Empty ────────────────────────────────────────────────────────────────── */
|
|
316
|
-
|
|
317
301
|
function ComboboxEmpty({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {
|
|
318
302
|
return (
|
|
319
303
|
<CommandPrimitive.Empty
|
|
@@ -324,8 +308,6 @@ function ComboboxEmpty({ className, ...props }: React.ComponentProps<typeof Comm
|
|
|
324
308
|
);
|
|
325
309
|
}
|
|
326
310
|
|
|
327
|
-
/* ── Group ────────────────────────────────────────────────────────────────── */
|
|
328
|
-
|
|
329
311
|
function ComboboxGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {
|
|
330
312
|
return (
|
|
331
313
|
<CommandPrimitive.Group
|
|
@@ -339,8 +321,6 @@ function ComboboxGroup({ className, ...props }: React.ComponentProps<typeof Comm
|
|
|
339
321
|
);
|
|
340
322
|
}
|
|
341
323
|
|
|
342
|
-
/* ── Separator ────────────────────────────────────────────────────────────── */
|
|
343
|
-
|
|
344
324
|
function ComboboxSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {
|
|
345
325
|
return (
|
|
346
326
|
<CommandPrimitive.Separator
|
|
@@ -351,8 +331,6 @@ function ComboboxSeparator({ className, ...props }: React.ComponentProps<typeof
|
|
|
351
331
|
);
|
|
352
332
|
}
|
|
353
333
|
|
|
354
|
-
/* ── Item ─────────────────────────────────────────────────────────────────── */
|
|
355
|
-
|
|
356
334
|
interface ComboboxItemProps extends Omit<React.ComponentProps<typeof CommandPrimitive.Item>, "onSelect"> {
|
|
357
335
|
/** The value stored when this item is selected */
|
|
358
336
|
itemValue: string;
|
|
@@ -384,8 +362,6 @@ function ComboboxItem({ className, children, itemValue, ...props }: ComboboxItem
|
|
|
384
362
|
);
|
|
385
363
|
}
|
|
386
364
|
|
|
387
|
-
/* ── Item supporting text ─────────────────────────────────────────────────── */
|
|
388
|
-
|
|
389
365
|
function ComboboxItemText({ className, children, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
|
|
390
366
|
return (
|
|
391
367
|
<span
|
|
@@ -51,8 +51,6 @@ function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMen
|
|
|
51
51
|
return <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/* ── Item ─────────────────────────────────────────────────────────────────── */
|
|
55
|
-
|
|
56
54
|
const dropdownMenuItemVariants = cva(
|
|
57
55
|
[
|
|
58
56
|
"relative flex cursor-default items-center gap-2 rounded-sm px-2.5 py-2 outline-hidden select-none",
|
|
@@ -103,8 +101,6 @@ function DropdownMenuItem({
|
|
|
103
101
|
);
|
|
104
102
|
}
|
|
105
103
|
|
|
106
|
-
/* ── Label ────────────────────────────────────────────────────────────────── */
|
|
107
|
-
|
|
108
104
|
function DropdownMenuLabel({
|
|
109
105
|
className,
|
|
110
106
|
inset,
|
|
@@ -135,8 +131,6 @@ function DropdownMenuHeader({ className, children, ...props }: React.HTMLAttribu
|
|
|
135
131
|
);
|
|
136
132
|
}
|
|
137
133
|
|
|
138
|
-
/* ── Separator ────────────────────────────────────────────────────────────── */
|
|
139
|
-
|
|
140
134
|
function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
|
|
141
135
|
return (
|
|
142
136
|
<DropdownMenuPrimitive.Separator
|
|
@@ -147,8 +141,6 @@ function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typ
|
|
|
147
141
|
);
|
|
148
142
|
}
|
|
149
143
|
|
|
150
|
-
/* ── Shortcut ─────────────────────────────────────────────────────────────── */
|
|
151
|
-
|
|
152
144
|
function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) {
|
|
153
145
|
return (
|
|
154
146
|
<span
|
|
@@ -162,8 +154,6 @@ function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"spa
|
|
|
162
154
|
);
|
|
163
155
|
}
|
|
164
156
|
|
|
165
|
-
/* ── Sub menu ─────────────────────────────────────────────────────────────── */
|
|
166
|
-
|
|
167
157
|
function DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
|
|
168
158
|
return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />;
|
|
169
159
|
}
|
package/src/components/form.tsx
CHANGED
|
@@ -166,8 +166,6 @@ function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
|
|
|
166
166
|
);
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
/* ── Layout components ───────────────────────────────────────────────────── */
|
|
170
|
-
|
|
171
169
|
interface FormHeaderProps extends React.ComponentProps<"div"> {
|
|
172
170
|
title: string;
|
|
173
171
|
description?: string;
|
|
@@ -186,8 +184,6 @@ function FormFields({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
186
184
|
return <div className={cn("flex flex-col gap-6", className)} {...props} />;
|
|
187
185
|
}
|
|
188
186
|
|
|
189
|
-
/* ── Convenience field wrappers ─────────────────────────────────────────── */
|
|
190
|
-
|
|
191
187
|
interface FormFieldBaseProps<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>> {
|
|
192
188
|
control: ControllerProps<TFieldValues, TName>["control"];
|
|
193
189
|
name: TName;
|
|
@@ -20,8 +20,6 @@ function SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.V
|
|
|
20
20
|
return <SelectPrimitive.Value data-slot="select-value" {...props} />;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
/* ── Trigger ──────────────────────────────────────────────────────────────── */
|
|
24
|
-
|
|
25
23
|
function SelectTrigger({
|
|
26
24
|
className,
|
|
27
25
|
size = "md",
|
|
@@ -47,8 +45,6 @@ function SelectTrigger({
|
|
|
47
45
|
);
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
/* ── Content ──────────────────────────────────────────────────────────────── */
|
|
51
|
-
|
|
52
48
|
function SelectContent({
|
|
53
49
|
className,
|
|
54
50
|
children,
|
|
@@ -89,8 +85,6 @@ function SelectContent({
|
|
|
89
85
|
);
|
|
90
86
|
}
|
|
91
87
|
|
|
92
|
-
/* ── Label ────────────────────────────────────────────────────────────────── */
|
|
93
|
-
|
|
94
88
|
function SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {
|
|
95
89
|
return (
|
|
96
90
|
<SelectPrimitive.Label
|
|
@@ -101,8 +95,6 @@ function SelectLabel({ className, ...props }: React.ComponentProps<typeof Select
|
|
|
101
95
|
);
|
|
102
96
|
}
|
|
103
97
|
|
|
104
|
-
/* ── Item ─────────────────────────────────────────────────────────────────── */
|
|
105
|
-
|
|
106
98
|
function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {
|
|
107
99
|
return (
|
|
108
100
|
<SelectPrimitive.Item
|
|
@@ -128,8 +120,6 @@ function SelectItem({ className, children, ...props }: React.ComponentProps<type
|
|
|
128
120
|
);
|
|
129
121
|
}
|
|
130
122
|
|
|
131
|
-
/* ── Separator ────────────────────────────────────────────────────────────── */
|
|
132
|
-
|
|
133
123
|
function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {
|
|
134
124
|
return (
|
|
135
125
|
<SelectPrimitive.Separator
|
|
@@ -88,7 +88,6 @@ function SidebarProvider({
|
|
|
88
88
|
[setOpenProp, open],
|
|
89
89
|
);
|
|
90
90
|
|
|
91
|
-
// Helper to toggle the sidebar.
|
|
92
91
|
const toggleSidebar = React.useCallback(() => {
|
|
93
92
|
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
|
|
94
93
|
}, [isMobile, setOpen]);
|
|
@@ -240,7 +239,6 @@ function Sidebar({
|
|
|
240
239
|
side === "left"
|
|
241
240
|
? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
|
|
242
241
|
: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
243
|
-
// Adjust the padding for floating and inset variants.
|
|
244
242
|
variant === "floating" || variant === "inset"
|
|
245
243
|
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
|
|
246
244
|
: "border-sidebar-border group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
package/src/components/tabs.tsx
CHANGED
|
@@ -21,8 +21,6 @@ import { createContext, use } from "react";
|
|
|
21
21
|
|
|
22
22
|
import { cn } from "../lib/cn";
|
|
23
23
|
|
|
24
|
-
/* ─── Shared trigger styles ──────────────────────────────────────────────── */
|
|
25
|
-
|
|
26
24
|
const tabsTriggerVariants = cva(
|
|
27
25
|
[
|
|
28
26
|
"type-text-sm items-center gap-1.5 font-medium",
|
|
@@ -57,8 +55,6 @@ const tabsTriggerVariants = cva(
|
|
|
57
55
|
},
|
|
58
56
|
);
|
|
59
57
|
|
|
60
|
-
/* ─── Tabs (state-based, in-page content switching) ────────────────── */
|
|
61
|
-
|
|
62
58
|
function Tabs({ className, orientation = "horizontal", ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
63
59
|
return (
|
|
64
60
|
<TabsPrimitive.Root
|
|
@@ -134,8 +130,6 @@ function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPr
|
|
|
134
130
|
return <TabsPrimitive.Content data-slot="tabs-content" className={cn("flex-1 outline-none", className)} {...props} />;
|
|
135
131
|
}
|
|
136
132
|
|
|
137
|
-
/* ─── Navigation tabs (semantic <nav>/<ul>/<a>, for URL-based routing) ──── */
|
|
138
|
-
|
|
139
133
|
type TabsNavVariant = "line" | "pill";
|
|
140
134
|
type TabsNavOrientation = "horizontal" | "vertical";
|
|
141
135
|
|
package/src/components/tag.tsx
CHANGED
|
@@ -9,8 +9,6 @@ interface TagBaseProps {
|
|
|
9
9
|
icon?: React.ReactNode;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* ── Tag (text only) ──────────────────────────────────────────── */
|
|
13
|
-
|
|
14
12
|
interface TagProps extends React.ComponentProps<"span">, TagBaseProps {}
|
|
15
13
|
|
|
16
14
|
function Tag({ className, icon, children, ...props }: TagProps) {
|
|
@@ -22,8 +20,6 @@ function Tag({ className, icon, children, ...props }: TagProps) {
|
|
|
22
20
|
);
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
/* ── TagDismissible (with × button) ───────────────────────────── */
|
|
26
|
-
|
|
27
23
|
interface TagDismissibleProps extends React.ComponentProps<"span">, TagBaseProps {
|
|
28
24
|
onDismiss?: () => void;
|
|
29
25
|
}
|
|
@@ -61,8 +57,6 @@ function TagDismissible({ className, icon, children, onDismiss, ...props }: TagD
|
|
|
61
57
|
);
|
|
62
58
|
}
|
|
63
59
|
|
|
64
|
-
/* ── TagCount (with count badge) ──────────────────────────────── */
|
|
65
|
-
|
|
66
60
|
interface TagCountProps extends React.ComponentProps<"span">, TagBaseProps {
|
|
67
61
|
count: number;
|
|
68
62
|
}
|
|
@@ -16,7 +16,6 @@ const ICON_STATE_HEADER = "type-text-xs text-muted-foreground font-medium w-16 t
|
|
|
16
16
|
export const AllVariants = () => {
|
|
17
17
|
return (
|
|
18
18
|
<div className="flex flex-col gap-3 p-8">
|
|
19
|
-
{/* ── Text buttons ────────────────────────────────────────────────── */}
|
|
20
19
|
<span className={SECTION_HEADER}>Text</span>
|
|
21
20
|
|
|
22
21
|
<div className={ROW}>
|
|
@@ -26,7 +25,6 @@ export const AllVariants = () => {
|
|
|
26
25
|
<div className={STATE_HEADER}>Loading</div>
|
|
27
26
|
</div>
|
|
28
27
|
|
|
29
|
-
{/* Primary */}
|
|
30
28
|
<div className={ROW}>
|
|
31
29
|
<span className={VARIANT_LABEL}>Primary</span>
|
|
32
30
|
<div className={CELL}>
|
|
@@ -46,7 +44,6 @@ export const AllVariants = () => {
|
|
|
46
44
|
</div>
|
|
47
45
|
</div>
|
|
48
46
|
|
|
49
|
-
{/* Secondary */}
|
|
50
47
|
<div className={ROW}>
|
|
51
48
|
<span className={VARIANT_LABEL}>Secondary</span>
|
|
52
49
|
<div className={CELL}>
|
|
@@ -66,7 +63,6 @@ export const AllVariants = () => {
|
|
|
66
63
|
</div>
|
|
67
64
|
</div>
|
|
68
65
|
|
|
69
|
-
{/* Tertiary */}
|
|
70
66
|
<div className={ROW}>
|
|
71
67
|
<span className={VARIANT_LABEL}>Tertiary</span>
|
|
72
68
|
<div className={CELL}>
|
|
@@ -86,7 +82,6 @@ export const AllVariants = () => {
|
|
|
86
82
|
</div>
|
|
87
83
|
</div>
|
|
88
84
|
|
|
89
|
-
{/* Link color */}
|
|
90
85
|
<div className={ROW}>
|
|
91
86
|
<span className={VARIANT_LABEL}>Link</span>
|
|
92
87
|
<div className={CELL}>
|
|
@@ -104,7 +99,6 @@ export const AllVariants = () => {
|
|
|
104
99
|
</div>
|
|
105
100
|
</div>
|
|
106
101
|
|
|
107
|
-
{/* Link gray */}
|
|
108
102
|
<div className={ROW}>
|
|
109
103
|
<span className={VARIANT_LABEL}>Link muted</span>
|
|
110
104
|
<div className={CELL}>
|
|
@@ -122,7 +116,6 @@ export const AllVariants = () => {
|
|
|
122
116
|
</div>
|
|
123
117
|
</div>
|
|
124
118
|
|
|
125
|
-
{/* Destructive */}
|
|
126
119
|
<div className={ROW}>
|
|
127
120
|
<span className={VARIANT_LABEL}>Destructive</span>
|
|
128
121
|
<div className={CELL}>
|
|
@@ -142,7 +135,6 @@ export const AllVariants = () => {
|
|
|
142
135
|
</div>
|
|
143
136
|
</div>
|
|
144
137
|
|
|
145
|
-
{/* ── Icon only ───────────────────────────────────────────────────── */}
|
|
146
138
|
<span className={SECTION_HEADER}>Icon only</span>
|
|
147
139
|
|
|
148
140
|
<div className={ROW}>
|
|
@@ -213,7 +205,6 @@ export const AllVariants = () => {
|
|
|
213
205
|
</div>
|
|
214
206
|
</div>
|
|
215
207
|
|
|
216
|
-
{/* ── Icon rounded ────────────────────────────────────────────────── */}
|
|
217
208
|
<span className={SECTION_HEADER}>Icon rounded</span>
|
|
218
209
|
|
|
219
210
|
<div className={ROW}>
|
|
@@ -284,7 +275,6 @@ export const AllVariants = () => {
|
|
|
284
275
|
</div>
|
|
285
276
|
</div>
|
|
286
277
|
|
|
287
|
-
{/* ── Pill ──────────────────────────────────────────────────────────── */}
|
|
288
278
|
<span className={SECTION_HEADER}>Pill</span>
|
|
289
279
|
|
|
290
280
|
<div className="flex items-center gap-3">
|
|
@@ -302,7 +292,6 @@ export const AllVariants = () => {
|
|
|
302
292
|
</Button>
|
|
303
293
|
</div>
|
|
304
294
|
|
|
305
|
-
{/* ── With icon (leading) ──────────────────────────────────────────── */}
|
|
306
295
|
<span className={SECTION_HEADER}>With icon</span>
|
|
307
296
|
|
|
308
297
|
<div className="flex items-center gap-3">
|
|
@@ -323,7 +312,6 @@ export const AllVariants = () => {
|
|
|
323
312
|
</Button>
|
|
324
313
|
</div>
|
|
325
314
|
|
|
326
|
-
{/* ── CTA (animated gradient ring) ────────────────────────────────── */}
|
|
327
315
|
<span className={SECTION_HEADER}>CTA — animated</span>
|
|
328
316
|
<p className="type-text-xs text-muted-foreground -mt-2 max-w-md">
|
|
329
317
|
Hover to rotate the conic gradient around the border and ignite the soft halo.
|
|
@@ -345,7 +333,6 @@ export const AllVariants = () => {
|
|
|
345
333
|
</Button>
|
|
346
334
|
</div>
|
|
347
335
|
|
|
348
|
-
{/* ── asChild ─────────────────────────────────────────────────────── */}
|
|
349
336
|
<span className={SECTION_HEADER}>asChild</span>
|
|
350
337
|
|
|
351
338
|
<div className="flex items-center gap-3">
|
|
@@ -15,8 +15,6 @@ import {
|
|
|
15
15
|
} from "../components/combobox";
|
|
16
16
|
import { CommandItem } from "../components/command";
|
|
17
17
|
|
|
18
|
-
/* ── With search ──────────────────────────────────────────────────────────── */
|
|
19
|
-
|
|
20
18
|
const branches = ["main", "develop", "feature/auth", "feature/dashboard", "fix/login-bug", "release/v2.0"];
|
|
21
19
|
|
|
22
20
|
function SearchCombobox() {
|
|
@@ -44,8 +42,6 @@ function SearchCombobox() {
|
|
|
44
42
|
);
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
/* ── Custom trigger content (avatars + supporting text) ──────────────────── */
|
|
48
|
-
|
|
49
45
|
const people = [
|
|
50
46
|
{ id: "olivia", name: "Olivia Rhye", handle: "@olivia" },
|
|
51
47
|
{ id: "phoenix", name: "Phoenix Baker", handle: "@phoenix" },
|
|
@@ -90,8 +86,6 @@ function AvatarCombobox() {
|
|
|
90
86
|
);
|
|
91
87
|
}
|
|
92
88
|
|
|
93
|
-
/* ── With CommandItem action ─────────────────────────────────────────────── */
|
|
94
|
-
|
|
95
89
|
const namespaces = [
|
|
96
90
|
{ id: "acme", name: "acme-corp" },
|
|
97
91
|
{ id: "personal", name: "johndoe" },
|
|
@@ -127,8 +121,6 @@ function CommandActionCombobox() {
|
|
|
127
121
|
);
|
|
128
122
|
}
|
|
129
123
|
|
|
130
|
-
/* ── Grouped with headings ───────────────────────────────────────────────── */
|
|
131
|
-
|
|
132
124
|
function GroupedCombobox() {
|
|
133
125
|
const [value, setValue] = useState<string | null>(null);
|
|
134
126
|
return (
|
|
@@ -154,8 +146,6 @@ function GroupedCombobox() {
|
|
|
154
146
|
);
|
|
155
147
|
}
|
|
156
148
|
|
|
157
|
-
/* ── Multi-select with tags ───────────────────────────────────────────────── */
|
|
158
|
-
|
|
159
149
|
function MultiCombobox() {
|
|
160
150
|
const [values, setValues] = useState<string[]>(["phoenix", "olivia"]);
|
|
161
151
|
return (
|
|
@@ -182,8 +172,6 @@ function MultiCombobox() {
|
|
|
182
172
|
);
|
|
183
173
|
}
|
|
184
174
|
|
|
185
|
-
/* ── Story ────────────────────────────────────────────────────────────────── */
|
|
186
|
-
|
|
187
175
|
export const AllVariants: Story = () => (
|
|
188
176
|
<div className="grid grid-cols-1 gap-10 p-10 md:grid-cols-2">
|
|
189
177
|
<div className="flex flex-col gap-1.5">
|
|
@@ -34,7 +34,6 @@ import {
|
|
|
34
34
|
|
|
35
35
|
export const AllVariants: Story = () => (
|
|
36
36
|
<div className="flex flex-col gap-10 p-10">
|
|
37
|
-
{/* Basic with icons & shortcuts */}
|
|
38
37
|
<div className="flex flex-col gap-1.5">
|
|
39
38
|
<p className="type-text-xs font-medium text-subtle-foreground">Default with icons & shortcuts</p>
|
|
40
39
|
<DropdownMenu>
|
|
@@ -122,7 +121,6 @@ export const AllVariants: Story = () => (
|
|
|
122
121
|
</DropdownMenu>
|
|
123
122
|
</div>
|
|
124
123
|
|
|
125
|
-
{/* Destructive variant */}
|
|
126
124
|
<div className="flex flex-col gap-1.5">
|
|
127
125
|
<p className="type-text-xs font-medium text-subtle-foreground">Destructive item</p>
|
|
128
126
|
<DropdownMenu>
|
|
@@ -143,7 +141,6 @@ export const AllVariants: Story = () => (
|
|
|
143
141
|
</DropdownMenu>
|
|
144
142
|
</div>
|
|
145
143
|
|
|
146
|
-
{/* Header with avatar */}
|
|
147
144
|
<div className="flex flex-col gap-1.5">
|
|
148
145
|
<p className="type-text-xs font-medium text-subtle-foreground">With header (avatar group)</p>
|
|
149
146
|
<DropdownMenu>
|
|
@@ -173,7 +170,6 @@ export const AllVariants: Story = () => (
|
|
|
173
170
|
</DropdownMenu>
|
|
174
171
|
</div>
|
|
175
172
|
|
|
176
|
-
{/* Disabled items */}
|
|
177
173
|
<div className="flex flex-col gap-1.5">
|
|
178
174
|
<p className="type-text-xs font-medium text-subtle-foreground">Disabled items</p>
|
|
179
175
|
<DropdownMenu>
|
|
@@ -13,8 +13,6 @@ import {
|
|
|
13
13
|
TextareaField,
|
|
14
14
|
} from "../components/form";
|
|
15
15
|
|
|
16
|
-
/* ── Types ───────────────────────────────────────────────────────────────── */
|
|
17
|
-
|
|
18
16
|
interface CreateProjectForm {
|
|
19
17
|
email: string;
|
|
20
18
|
role: string;
|
|
@@ -43,8 +41,6 @@ const capabilities = [
|
|
|
43
41
|
{ value: "admin", label: "Admin" },
|
|
44
42
|
];
|
|
45
43
|
|
|
46
|
-
/* ── Composed Form ───────────────────────────────────────────────────────── */
|
|
47
|
-
|
|
48
44
|
function ComposedForm() {
|
|
49
45
|
const form = useForm<CreateProjectForm>({
|
|
50
46
|
defaultValues: {
|
|
@@ -141,8 +137,6 @@ function ComposedForm() {
|
|
|
141
137
|
);
|
|
142
138
|
}
|
|
143
139
|
|
|
144
|
-
/* ── Story ────────────────────────────────────────────────────────────────── */
|
|
145
|
-
|
|
146
140
|
export const AllVariants: Story = () => (
|
|
147
141
|
<div className="flex flex-col gap-3">
|
|
148
142
|
<p className="type-text-xs font-medium text-subtle-foreground uppercase tracking-wide">
|
|
@@ -7,7 +7,6 @@ const SECTION_HEADER = "type-text-xs font-medium text-muted-foreground uppercase
|
|
|
7
7
|
|
|
8
8
|
export const AllVariants: Story = () => (
|
|
9
9
|
<div className="flex flex-col gap-6 p-8 max-w-lg">
|
|
10
|
-
{/* Textarea with block-end addon */}
|
|
11
10
|
<span className={SECTION_HEADER}>Textarea + block-end footer</span>
|
|
12
11
|
<InputGroup>
|
|
13
12
|
<InputGroupTextarea placeholder="Type a message…" />
|
|
@@ -21,7 +20,6 @@ export const AllVariants: Story = () => (
|
|
|
21
20
|
</InputGroupAddon>
|
|
22
21
|
</InputGroup>
|
|
23
22
|
|
|
24
|
-
{/* Inline-start addon */}
|
|
25
23
|
<span className={SECTION_HEADER}>Inline-start addon (icon)</span>
|
|
26
24
|
<InputGroup>
|
|
27
25
|
<InputGroupAddon align="inline-start">
|
|
@@ -34,7 +32,6 @@ export const AllVariants: Story = () => (
|
|
|
34
32
|
/>
|
|
35
33
|
</InputGroup>
|
|
36
34
|
|
|
37
|
-
{/* Inline-end addon */}
|
|
38
35
|
<span className={SECTION_HEADER}>Inline-end addon (button)</span>
|
|
39
36
|
<InputGroup>
|
|
40
37
|
<input
|
|
@@ -49,7 +46,6 @@ export const AllVariants: Story = () => (
|
|
|
49
46
|
</InputGroupAddon>
|
|
50
47
|
</InputGroup>
|
|
51
48
|
|
|
52
|
-
{/* Disabled state */}
|
|
53
49
|
<span className={SECTION_HEADER}>Disabled</span>
|
|
54
50
|
<InputGroup>
|
|
55
51
|
<InputGroupTextarea placeholder="Cannot type here…" disabled />
|
|
@@ -7,11 +7,9 @@ const SECTION_HEADER = "type-text-xs font-medium text-muted-foreground uppercase
|
|
|
7
7
|
|
|
8
8
|
export const AllVariants: Story = () => (
|
|
9
9
|
<div className="flex flex-col gap-6 p-8 max-w-sm">
|
|
10
|
-
{/* Default */}
|
|
11
10
|
<span className={SECTION_HEADER}>Default</span>
|
|
12
11
|
<Input id="default" placeholder="alice@example.com" />
|
|
13
12
|
|
|
14
|
-
{/* With label + hint */}
|
|
15
13
|
<span className={SECTION_HEADER}>With label + hint</span>
|
|
16
14
|
<Input
|
|
17
15
|
id="with-label"
|
|
@@ -21,7 +19,6 @@ export const AllVariants: Story = () => (
|
|
|
21
19
|
hint="This is a hint text to help user."
|
|
22
20
|
/>
|
|
23
21
|
|
|
24
|
-
{/* With tooltip */}
|
|
25
22
|
<span className={SECTION_HEADER}>With tooltip</span>
|
|
26
23
|
<Input
|
|
27
24
|
id="with-tooltip"
|
|
@@ -31,7 +28,6 @@ export const AllVariants: Story = () => (
|
|
|
31
28
|
placeholder="alice@example.com"
|
|
32
29
|
/>
|
|
33
30
|
|
|
34
|
-
{/* Error */}
|
|
35
31
|
<span className={SECTION_HEADER}>Error</span>
|
|
36
32
|
<Input
|
|
37
33
|
id="error"
|
|
@@ -41,7 +37,6 @@ export const AllVariants: Story = () => (
|
|
|
41
37
|
error="Please enter a valid email address."
|
|
42
38
|
/>
|
|
43
39
|
|
|
44
|
-
{/* Disabled */}
|
|
45
40
|
<span className={SECTION_HEADER}>Disabled</span>
|
|
46
41
|
<Input
|
|
47
42
|
id="disabled"
|
|
@@ -51,15 +46,12 @@ export const AllVariants: Story = () => (
|
|
|
51
46
|
disabled
|
|
52
47
|
/>
|
|
53
48
|
|
|
54
|
-
{/* Leading icon */}
|
|
55
49
|
<span className={SECTION_HEADER}>Leading icon (email)</span>
|
|
56
50
|
<Input id="leading-icon" label="Email" required placeholder="alice@example.com" leadingIcon={<Mail />} />
|
|
57
51
|
|
|
58
|
-
{/* Leading text (website) */}
|
|
59
52
|
<span className={SECTION_HEADER}>Leading text</span>
|
|
60
53
|
<Input id="leading-text" label="Website" required placeholder="www.example.com" leadingText="http://" />
|
|
61
54
|
|
|
62
|
-
{/* Small size */}
|
|
63
55
|
<span className={SECTION_HEADER}>Small size</span>
|
|
64
56
|
<Input id="sm-default" size="sm" placeholder="alice@example.com" label="Email" />
|
|
65
57
|
|
|
@@ -4,7 +4,6 @@ import { Skeleton } from "../components/skeleton";
|
|
|
4
4
|
|
|
5
5
|
export const AllVariants: Story = () => (
|
|
6
6
|
<div className="flex flex-col gap-8">
|
|
7
|
-
{/* Shape variants */}
|
|
8
7
|
<div className="flex flex-col gap-1.5">
|
|
9
8
|
<p className="type-text-xs font-medium text-subtle-foreground">Rectangle (default)</p>
|
|
10
9
|
<div className="flex flex-col gap-2">
|
|
@@ -23,7 +22,6 @@ export const AllVariants: Story = () => (
|
|
|
23
22
|
</div>
|
|
24
23
|
</div>
|
|
25
24
|
|
|
26
|
-
{/* Common compositions */}
|
|
27
25
|
<div className="flex flex-col gap-1.5">
|
|
28
26
|
<p className="type-text-xs font-medium text-subtle-foreground">Card placeholder</p>
|
|
29
27
|
<div className="flex flex-col gap-3 rounded-lg border border-border p-4">
|
|
@@ -88,7 +88,6 @@ const PAGE_SIZE = 3;
|
|
|
88
88
|
|
|
89
89
|
export const AllVariants: Story = () => (
|
|
90
90
|
<div className="flex flex-col gap-8 p-6 bg-background max-w-4xl">
|
|
91
|
-
{/* Text-only table */}
|
|
92
91
|
<div className="flex flex-col gap-1.5">
|
|
93
92
|
<p className="type-text-xs font-medium text-subtle-foreground">Text cells</p>
|
|
94
93
|
<Table>
|
|
@@ -115,7 +114,6 @@ export const AllVariants: Story = () => (
|
|
|
115
114
|
</Table>
|
|
116
115
|
</div>
|
|
117
116
|
|
|
118
|
-
{/* Avatar cells + checkbox */}
|
|
119
117
|
<div className="flex flex-col gap-1.5">
|
|
120
118
|
<p className="type-text-xs font-medium text-subtle-foreground">Avatar cells + checkbox</p>
|
|
121
119
|
<Table>
|
|
@@ -148,7 +146,6 @@ export const AllVariants: Story = () => (
|
|
|
148
146
|
</Table>
|
|
149
147
|
</div>
|
|
150
148
|
|
|
151
|
-
{/* With footer */}
|
|
152
149
|
<div className="flex flex-col gap-1.5">
|
|
153
150
|
<p className="type-text-xs font-medium text-subtle-foreground">With caption + footer</p>
|
|
154
151
|
<Table>
|
|
@@ -178,7 +175,6 @@ export const AllVariants: Story = () => (
|
|
|
178
175
|
</Table>
|
|
179
176
|
</div>
|
|
180
177
|
|
|
181
|
-
{/* Selected row state */}
|
|
182
178
|
<div className="flex flex-col gap-1.5">
|
|
183
179
|
<p className="type-text-xs font-medium text-subtle-foreground">Selected row state</p>
|
|
184
180
|
<Table>
|
|
@@ -201,7 +197,6 @@ export const AllVariants: Story = () => (
|
|
|
201
197
|
</Table>
|
|
202
198
|
</div>
|
|
203
199
|
|
|
204
|
-
{/* Paginated table */}
|
|
205
200
|
<PaginatedTableExample />
|
|
206
201
|
</div>
|
|
207
202
|
);
|
|
@@ -42,9 +42,6 @@ export const AllVariants: Story = () => {
|
|
|
42
42
|
|
|
43
43
|
return (
|
|
44
44
|
<div className="flex flex-col gap-10 p-8">
|
|
45
|
-
{/* ─── Navigation tabs ─────────────────────────────────────── */}
|
|
46
|
-
|
|
47
|
-
{/* Horizontal + line (default) */}
|
|
48
45
|
<div>
|
|
49
46
|
<p className={SECTION_HEADER}>Nav — horizontal, variant="line" (default)</p>
|
|
50
47
|
<div className="mt-4">
|
|
@@ -61,7 +58,6 @@ export const AllVariants: Story = () => {
|
|
|
61
58
|
</div>
|
|
62
59
|
</div>
|
|
63
60
|
|
|
64
|
-
{/* Horizontal + pill */}
|
|
65
61
|
<div>
|
|
66
62
|
<p className={SECTION_HEADER}>Nav — horizontal, variant="pill"</p>
|
|
67
63
|
<div className="mt-4">
|
|
@@ -78,7 +74,6 @@ export const AllVariants: Story = () => {
|
|
|
78
74
|
</div>
|
|
79
75
|
</div>
|
|
80
76
|
|
|
81
|
-
{/* Vertical + pill (default) */}
|
|
82
77
|
<div>
|
|
83
78
|
<p className={SECTION_HEADER}>Nav — vertical, variant="pill" (default)</p>
|
|
84
79
|
<div className="mt-4 flex gap-6">
|
|
@@ -99,9 +94,6 @@ export const AllVariants: Story = () => {
|
|
|
99
94
|
</div>
|
|
100
95
|
</div>
|
|
101
96
|
|
|
102
|
-
{/* ─── Tabs (state-based) ────────────────────────────── */}
|
|
103
|
-
|
|
104
|
-
{/* Tabs — line */}
|
|
105
97
|
<div>
|
|
106
98
|
<p className={SECTION_HEADER}>Tabs — line variant</p>
|
|
107
99
|
<Tabs defaultValue="all" className="mt-4">
|
|
@@ -118,7 +110,6 @@ export const AllVariants: Story = () => {
|
|
|
118
110
|
</Tabs>
|
|
119
111
|
</div>
|
|
120
112
|
|
|
121
|
-
{/* Tabs — default (horizontal) */}
|
|
122
113
|
<div>
|
|
123
114
|
<p className={SECTION_HEADER}>Tabs — default variant (horizontal)</p>
|
|
124
115
|
<Tabs defaultValue="all" className="mt-4">
|
|
@@ -135,7 +126,6 @@ export const AllVariants: Story = () => {
|
|
|
135
126
|
</Tabs>
|
|
136
127
|
</div>
|
|
137
128
|
|
|
138
|
-
{/* Tabs — default (vertical) */}
|
|
139
129
|
<div>
|
|
140
130
|
<p className={SECTION_HEADER}>Tabs — default variant (vertical)</p>
|
|
141
131
|
<Tabs defaultValue="overview" orientation="vertical" className="mt-4">
|
|
@@ -150,7 +140,6 @@ export const AllVariants: Story = () => {
|
|
|
150
140
|
</Tabs>
|
|
151
141
|
</div>
|
|
152
142
|
|
|
153
|
-
{/* Tabs — disabled */}
|
|
154
143
|
<div>
|
|
155
144
|
<p className={SECTION_HEADER}>Tabs — disabled trigger</p>
|
|
156
145
|
<Tabs defaultValue="one" className="mt-4">
|
|
@@ -8,7 +8,6 @@ const LABEL = "type-text-xs text-muted-foreground w-20 shrink-0";
|
|
|
8
8
|
|
|
9
9
|
export const AllVariants = () => (
|
|
10
10
|
<div className="flex flex-col gap-4 p-8">
|
|
11
|
-
{/* ── Default variant ──────────────────────────────────────────────── */}
|
|
12
11
|
<span className={SECTION_HEADER}>Default variant</span>
|
|
13
12
|
|
|
14
13
|
<div className={ROW}>
|
|
@@ -44,7 +43,6 @@ export const AllVariants = () => (
|
|
|
44
43
|
</ToggleGroup>
|
|
45
44
|
</div>
|
|
46
45
|
|
|
47
|
-
{/* ── Outline variant ─────────────────────────────────────────────── */}
|
|
48
46
|
<span className={SECTION_HEADER}>Outline variant</span>
|
|
49
47
|
|
|
50
48
|
<div className={ROW}>
|
|
@@ -77,7 +75,6 @@ export const AllVariants = () => (
|
|
|
77
75
|
</ToggleGroup>
|
|
78
76
|
</div>
|
|
79
77
|
|
|
80
|
-
{/* ── Sizes ───────────────────────────────────────────────────────── */}
|
|
81
78
|
<span className={SECTION_HEADER}>Sizes</span>
|
|
82
79
|
|
|
83
80
|
<div className={ROW}>
|
|
@@ -104,7 +101,6 @@ export const AllVariants = () => (
|
|
|
104
101
|
</ToggleGroup>
|
|
105
102
|
</div>
|
|
106
103
|
|
|
107
|
-
{/* ── Disabled ────────────────────────────────────────────────────── */}
|
|
108
104
|
<span className={SECTION_HEADER}>Disabled</span>
|
|
109
105
|
|
|
110
106
|
<div className={ROW}>
|
|
@@ -119,7 +115,6 @@ export const AllVariants = () => (
|
|
|
119
115
|
</ToggleGroup>
|
|
120
116
|
</div>
|
|
121
117
|
|
|
122
|
-
{/* ── Real-world: Log level filter ────────────────────────────────── */}
|
|
123
118
|
<span className={SECTION_HEADER}>Log level filter (real-world)</span>
|
|
124
119
|
|
|
125
120
|
<div className={ROW}>
|
|
@@ -36,7 +36,6 @@ export const AllVariants: Story = () => {
|
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
38
|
<div className="flex flex-col gap-10 p-8">
|
|
39
|
-
{/* Full rail (steps + progress) */}
|
|
40
39
|
<div>
|
|
41
40
|
<p className={SECTION_HEADER}>Full rail — steps + progress</p>
|
|
42
41
|
<div className="mt-4 flex gap-6">
|
|
@@ -50,7 +49,6 @@ export const AllVariants: Story = () => {
|
|
|
50
49
|
</div>
|
|
51
50
|
</div>
|
|
52
51
|
|
|
53
|
-
{/* Steps only */}
|
|
54
52
|
<div>
|
|
55
53
|
<p className={SECTION_HEADER}>Steps only</p>
|
|
56
54
|
<div className="mt-4 max-w-56">
|
|
@@ -58,7 +56,6 @@ export const AllVariants: Story = () => {
|
|
|
58
56
|
</div>
|
|
59
57
|
</div>
|
|
60
58
|
|
|
61
|
-
{/* Progress only — various positions */}
|
|
62
59
|
<div>
|
|
63
60
|
<p className={SECTION_HEADER}>Progress — first step</p>
|
|
64
61
|
<div className="mt-4 max-w-56">
|