@alpic-ai/ui 0.0.0-dev.fffc79a → 0.0.0-dev.gd42dbb4

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.
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/badge.d.ts
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "warning" | "success" | "secondary" | "primary" | "error" | null | undefined;
7
+ variant?: "warning" | "success" | "primary" | "secondary" | "error" | null | undefined;
8
8
  size?: "sm" | "md" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface BadgeProps extends React.ComponentProps<"span">, VariantProps<typeof badgeVariants> {}
@@ -5,7 +5,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
5
5
 
6
6
  //#region src/components/button.d.ts
7
7
  declare const buttonVariants: (props?: ({
8
- variant?: "destructive" | "secondary" | "primary" | "tertiary" | "link" | "link-muted" | "cta" | null | undefined;
8
+ variant?: "destructive" | "primary" | "secondary" | "tertiary" | "link" | "link-muted" | "cta" | null | undefined;
9
9
  size?: "default" | "icon" | "icon-rounded" | "pill" | null | undefined;
10
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
11
11
  interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
@@ -115,5 +115,40 @@ declare function SelectField<TFieldValues extends FieldValues, TName extends Fie
115
115
  options,
116
116
  placeholder
117
117
  }: SelectFieldProps<TFieldValues, TName>): _$react_jsx_runtime0.JSX.Element;
118
+ interface RadioFieldProps<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>> extends FormFieldBaseProps<TFieldValues, TName> {
119
+ options: SelectFieldOption[];
120
+ }
121
+ declare function RadioField<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>({
122
+ control,
123
+ name,
124
+ rules,
125
+ required,
126
+ label,
127
+ description,
128
+ tooltip,
129
+ options
130
+ }: RadioFieldProps<TFieldValues, TName>): _$react_jsx_runtime0.JSX.Element;
131
+ interface ChecklistFieldProps<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>> extends FormFieldBaseProps<TFieldValues, TName> {
132
+ options: SelectFieldOption[];
133
+ }
134
+ declare function ChecklistField<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>({
135
+ control,
136
+ name,
137
+ rules,
138
+ required,
139
+ label,
140
+ description,
141
+ tooltip,
142
+ options
143
+ }: ChecklistFieldProps<TFieldValues, TName>): _$react_jsx_runtime0.JSX.Element;
144
+ interface CheckboxFieldProps<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>> extends Omit<FormFieldBaseProps<TFieldValues, TName>, "required"> {}
145
+ declare function CheckboxField<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>({
146
+ control,
147
+ name,
148
+ rules,
149
+ label,
150
+ description,
151
+ tooltip
152
+ }: CheckboxFieldProps<TFieldValues, TName>): _$react_jsx_runtime0.JSX.Element;
118
153
  //#endregion
119
- export { Form, FormControl, FormDescription, FormField, FormFields, FormHeader, FormItem, FormLabel, FormMessage, InputField, SelectField, type SelectFieldOption, TextareaField, useFormField };
154
+ export { CheckboxField, ChecklistField, Form, FormControl, FormDescription, FormField, FormFields, FormHeader, FormItem, FormLabel, FormMessage, InputField, RadioField, SelectField, type SelectFieldOption, TextareaField, useFormField };
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.mjs";
3
3
  import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.mjs";
4
+ import { Checkbox } from "./checkbox.mjs";
4
5
  import { Label } from "./label.mjs";
5
6
  import { Input } from "./input.mjs";
7
+ import { RadioGroup, RadioGroupItem } from "./radio-group.mjs";
6
8
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.mjs";
7
9
  import { Textarea } from "./textarea.mjs";
8
10
  import { Info } from "lucide-react";
@@ -88,7 +90,7 @@ function FormDescription({ className, ...props }) {
88
90
  return /* @__PURE__ */ jsx("p", {
89
91
  "data-slot": "form-description",
90
92
  id: formDescriptionId,
91
- className: cn("text-muted-foreground text-sm", className),
93
+ className: cn("text-muted-foreground type-text-sm whitespace-pre-line", className),
92
94
  ...props
93
95
  });
94
96
  }
@@ -134,11 +136,11 @@ function InputField({ control, name, rules, required, label, description, toolti
134
136
  tooltip,
135
137
  children: label
136
138
  }),
139
+ description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
137
140
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, {
138
141
  ...inputProps,
139
142
  ...field
140
143
  }) }),
141
- description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
142
144
  /* @__PURE__ */ jsx(FormMessage, {})
143
145
  ] })
144
146
  });
@@ -154,11 +156,11 @@ function TextareaField({ control, name, rules, required, label, description, too
154
156
  tooltip,
155
157
  children: label
156
158
  }),
159
+ description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
157
160
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Textarea, {
158
161
  ...textareaProps,
159
162
  ...field
160
163
  }) }),
161
- description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
162
164
  /* @__PURE__ */ jsx(FormMessage, {})
163
165
  ] })
164
166
  });
@@ -174,6 +176,7 @@ function SelectField({ control, name, rules, required, label, description, toolt
174
176
  tooltip,
175
177
  children: label
176
178
  }),
179
+ description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
177
180
  /* @__PURE__ */ jsxs(Select, {
178
181
  value: field.value,
179
182
  onValueChange: field.onChange,
@@ -183,10 +186,117 @@ function SelectField({ control, name, rules, required, label, description, toolt
183
186
  children: option.label
184
187
  }, option.value)) })]
185
188
  }),
189
+ /* @__PURE__ */ jsx(FormMessage, {})
190
+ ] })
191
+ });
192
+ }
193
+ function RadioField({ control, name, rules, required, label, description, tooltip, options }) {
194
+ return /* @__PURE__ */ jsx(FormField, {
195
+ control,
196
+ name,
197
+ rules,
198
+ render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
199
+ label && /* @__PURE__ */ jsx(FormLabel, {
200
+ required,
201
+ tooltip,
202
+ children: label
203
+ }),
186
204
  description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
205
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(RadioGroup, {
206
+ value: field.value ?? "",
207
+ onValueChange: field.onChange,
208
+ onBlur: field.onBlur,
209
+ children: options.map((option) => {
210
+ const itemId = `${field.name}-${option.value}`;
211
+ return /* @__PURE__ */ jsxs("div", {
212
+ className: "flex items-center gap-2",
213
+ children: [/* @__PURE__ */ jsx(RadioGroupItem, {
214
+ id: itemId,
215
+ value: option.value,
216
+ disabled: option.disabled
217
+ }), /* @__PURE__ */ jsx(Label, {
218
+ htmlFor: itemId,
219
+ className: "type-text-sm font-normal",
220
+ children: option.label
221
+ })]
222
+ }, option.value);
223
+ })
224
+ }) }),
187
225
  /* @__PURE__ */ jsx(FormMessage, {})
188
226
  ] })
189
227
  });
190
228
  }
229
+ function ChecklistField({ control, name, rules, required, label, description, tooltip, options }) {
230
+ return /* @__PURE__ */ jsx(FormField, {
231
+ control,
232
+ name,
233
+ rules,
234
+ render: ({ field }) => {
235
+ const selected = Array.isArray(field.value) ? field.value : [];
236
+ const toggle = (value, checked) => {
237
+ if (checked) field.onChange([...selected, value]);
238
+ else field.onChange(selected.filter((existing) => existing !== value));
239
+ };
240
+ return /* @__PURE__ */ jsxs(FormItem, { children: [
241
+ label && /* @__PURE__ */ jsx(FormLabel, {
242
+ required,
243
+ tooltip,
244
+ children: label
245
+ }),
246
+ description && /* @__PURE__ */ jsx(FormDescription, { children: description }),
247
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx("fieldset", {
248
+ className: "m-0 flex flex-col gap-2 border-0 p-0",
249
+ onBlur: field.onBlur,
250
+ children: options.map((option) => {
251
+ const itemId = `${field.name}-${option.value}`;
252
+ return /* @__PURE__ */ jsxs("div", {
253
+ className: "flex items-start gap-2",
254
+ children: [/* @__PURE__ */ jsx(Checkbox, {
255
+ id: itemId,
256
+ checked: selected.includes(option.value),
257
+ onCheckedChange: (next) => toggle(option.value, Boolean(next)),
258
+ disabled: option.disabled
259
+ }), /* @__PURE__ */ jsx(Label, {
260
+ htmlFor: itemId,
261
+ className: "type-text-sm font-normal leading-tight",
262
+ children: option.label
263
+ })]
264
+ }, option.value);
265
+ })
266
+ }) }),
267
+ /* @__PURE__ */ jsx(FormMessage, {})
268
+ ] });
269
+ }
270
+ });
271
+ }
272
+ function CheckboxField({ control, name, rules, label, description, tooltip }) {
273
+ return /* @__PURE__ */ jsx(FormField, {
274
+ control,
275
+ name,
276
+ rules,
277
+ render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, {
278
+ className: "gap-1.5",
279
+ children: [
280
+ /* @__PURE__ */ jsxs("div", {
281
+ className: "flex items-start gap-2",
282
+ children: [/* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Checkbox, {
283
+ checked: field.value ?? false,
284
+ onCheckedChange: (next) => field.onChange(Boolean(next)),
285
+ onBlur: field.onBlur
286
+ }) }), label && /* @__PURE__ */ jsx(FormLabel, {
287
+ tooltip,
288
+ className: "font-normal",
289
+ children: label
290
+ })]
291
+ }),
292
+ description && /* @__PURE__ */ jsx(FormDescription, {
293
+ className: "ml-6",
294
+ children: description
295
+ }),
296
+ /* @__PURE__ */ jsx(FormMessage, { className: "ml-6" })
297
+ ]
298
+ })
299
+ });
300
+ }
191
301
  //#endregion
192
- export { Form, FormControl, FormDescription, FormField, FormFields, FormHeader, FormItem, FormLabel, FormMessage, InputField, SelectField, TextareaField, useFormField };
302
+ export { CheckboxField, ChecklistField, Form, FormControl, FormDescription, FormField, FormFields, FormHeader, FormItem, FormLabel, FormMessage, InputField, RadioField, SelectField, TextareaField, useFormField };
@@ -0,0 +1,12 @@
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/components/shimmer-text.d.ts
4
+ declare function ShimmerText({
5
+ children,
6
+ className
7
+ }: {
8
+ children: string | number;
9
+ className?: string;
10
+ }): _$react_jsx_runtime0.JSX.Element;
11
+ //#endregion
12
+ export { ShimmerText };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/shimmer-text.tsx
5
+ const shimmerStyle = {
6
+ background: `linear-gradient(90deg, #0000 calc(50% - 60px), var(--color-foreground), #0000 calc(50% + 60px)), linear-gradient(color-mix(in oklab, var(--color-muted-foreground) 70%, transparent), color-mix(in oklab, var(--color-muted-foreground) 70%, transparent))`,
7
+ backgroundSize: "250% 100%, auto",
8
+ backgroundRepeat: "no-repeat, padding-box",
9
+ WebkitBackgroundClip: "text",
10
+ WebkitTextFillColor: "transparent",
11
+ backgroundClip: "text",
12
+ animation: "shimmer-text 2.5s linear infinite"
13
+ };
14
+ function ShimmerText({ children, className }) {
15
+ return /* @__PURE__ */ jsx("span", {
16
+ className: cn(className),
17
+ style: shimmerStyle,
18
+ children
19
+ });
20
+ }
21
+ //#endregion
22
+ export { ShimmerText };
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/spinner.d.ts
6
6
  declare const spinnerVariants: (props?: ({
7
- variant?: "secondary" | "primary" | null | undefined;
7
+ variant?: "primary" | "secondary" | null | undefined;
8
8
  size?: "sm" | "md" | "lg" | "xl" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface SpinnerProps extends Omit<React.ComponentProps<"svg">, "children">, VariantProps<typeof spinnerVariants> {}
@@ -36,21 +36,21 @@ function TableFooter({ className, ...props }) {
36
36
  function TableRow({ className, ...props }) {
37
37
  return /* @__PURE__ */ jsx("tr", {
38
38
  "data-slot": "table-row",
39
- className: cn("border-b border-border-secondary transition-colors", "data-[state=selected]:bg-muted", "[@media(hover:hover)]:hover:bg-background-hover dark:[@media(hover:hover)]:hover:bg-muted", "[@media(hover:hover)]:[&:hover_button:hover]:bg-subtle", className),
39
+ className: cn("border-b border-border-secondary transition-colors", "data-[state=selected]:bg-muted", "[@media(hover:hover)]:hover:bg-background-hover dark:[@media(hover:hover)]:hover:bg-muted", className),
40
40
  ...props
41
41
  });
42
42
  }
43
43
  function TableHead({ className, ...props }) {
44
44
  return /* @__PURE__ */ jsx("th", {
45
45
  "data-slot": "table-head",
46
- className: cn("h-11 px-6 py-3 bg-muted text-left align-middle type-text-xs font-semibold text-placeholder dark:text-subtle-foreground whitespace-nowrap", "[&:has([role=checkbox])]:w-px [&:has([role=checkbox])]:pr-3", className),
46
+ className: cn("h-11 px-6 py-3 bg-muted text-left align-middle type-text-xs font-semibold text-placeholder dark:text-subtle-foreground whitespace-nowrap", "[&:has([role=checkbox])]:w-px [&:has([role=checkbox])]:px-0", className),
47
47
  ...props
48
48
  });
49
49
  }
50
50
  function TableCell({ className, interactive = false, ...props }) {
51
51
  return /* @__PURE__ */ jsx("td", {
52
52
  "data-slot": "table-cell",
53
- className: cn("align-middle", interactive ? "h-px p-0" : "px-6 py-2", "[&:has([role=checkbox])]:w-px [&:has([role=checkbox])]:pr-3", className),
53
+ className: cn("align-middle", interactive ? "h-px p-0" : "px-6 py-2", "[&:has([role=checkbox])]:w-px [&:has([role=checkbox])]:px-0", className),
54
54
  ...props
55
55
  });
56
56
  }
@@ -21,10 +21,10 @@ const tabsTriggerVariants = cva([
21
21
  "data-[state=active]:border-b-2 data-[state=active]:border-foreground data-[state=active]:text-foreground"
22
22
  ],
23
23
  pill: [
24
- "rounded-lg px-4 py-2",
25
- "text-muted-foreground",
26
- "[@media(hover:hover)]:hover:bg-accent [@media(hover:hover)]:hover:text-accent-foreground",
27
- "data-[state=active]:bg-accent data-[state=active]:text-accent-foreground"
24
+ "rounded-md px-2 py-1.5",
25
+ "text-quaternary-foreground",
26
+ "[@media(hover:hover)]:hover:bg-accent [@media(hover:hover)]:hover:text-muted-foreground",
27
+ "data-[state=active]:bg-accent data-[state=active]:text-muted-foreground"
28
28
  ]
29
29
  } },
30
30
  defaultVariants: { variant: "default" }
@@ -0,0 +1,27 @@
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/components/task-progress.d.ts
4
+ type TaskProgressStatus = "pending" | "running" | "done";
5
+ interface TaskProgressStep {
6
+ id: string;
7
+ label: string;
8
+ status: TaskProgressStatus;
9
+ }
10
+ interface TaskProgressProps extends Omit<React.ComponentProps<"div">, "children"> {
11
+ steps: readonly TaskProgressStep[];
12
+ trailingLabel?: string;
13
+ /**
14
+ * Optional mount-time stagger: each row fades + slides in with `animation-delay = index × stepRevealDelayMs`.
15
+ * Pure CSS, runs once on mount. Omit for no animation.
16
+ */
17
+ stepRevealDelayMs?: number;
18
+ }
19
+ declare function TaskProgress({
20
+ steps,
21
+ trailingLabel,
22
+ stepRevealDelayMs,
23
+ className,
24
+ ...props
25
+ }: TaskProgressProps): _$react_jsx_runtime0.JSX.Element;
26
+ //#endregion
27
+ export { TaskProgress, type TaskProgressStatus, type TaskProgressStep };
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.mjs";
3
+ import { Separator } from "./separator.mjs";
4
+ import { CheckIcon } from "lucide-react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/task-progress.tsx
7
+ const REVEAL_CLASSES = "animate-in fade-in slide-in-from-bottom-2 duration-300";
8
+ function TaskProgress({ steps, trailingLabel, stepRevealDelayMs, className, ...props }) {
9
+ const total = steps.length;
10
+ const doneCount = steps.filter((step) => step.status === "done").length;
11
+ const percent = total > 0 ? Math.round(doneCount / total * 100) : 0;
12
+ const stagger = stepRevealDelayMs != null;
13
+ return /* @__PURE__ */ jsxs("div", {
14
+ className: cn("flex flex-col gap-4", className),
15
+ ...props,
16
+ children: [/* @__PURE__ */ jsx("div", {
17
+ className: "bg-muted h-2 w-full overflow-hidden rounded-full",
18
+ children: /* @__PURE__ */ jsx("div", {
19
+ className: "h-full rounded-full bg-success transition-all duration-500",
20
+ style: { width: `${percent}%` }
21
+ })
22
+ }), /* @__PURE__ */ jsxs("div", { children: [steps.map((step, idx) => /* @__PURE__ */ jsxs("div", {
23
+ className: stagger ? REVEAL_CLASSES : void 0,
24
+ style: stagger ? {
25
+ animationDelay: `${idx * (stepRevealDelayMs ?? 0)}ms`,
26
+ animationFillMode: "both"
27
+ } : void 0,
28
+ children: [/* @__PURE__ */ jsx(TaskProgressRow, {
29
+ label: step.label,
30
+ status: step.status
31
+ }), idx < steps.length - 1 && /* @__PURE__ */ jsx(Separator, {})]
32
+ }, step.id)), trailingLabel && /* @__PURE__ */ jsxs("div", {
33
+ className: stagger ? REVEAL_CLASSES : void 0,
34
+ children: [/* @__PURE__ */ jsx(Separator, {}), /* @__PURE__ */ jsx(TaskProgressRow, {
35
+ label: trailingLabel,
36
+ status: "running",
37
+ muted: true
38
+ })]
39
+ })] })]
40
+ });
41
+ }
42
+ function TaskProgressRow({ label, status, muted }) {
43
+ return /* @__PURE__ */ jsxs("div", {
44
+ className: "flex items-center justify-between py-2",
45
+ children: [
46
+ /* @__PURE__ */ jsx("span", {
47
+ className: cn("type-text-sm", muted && "text-muted-foreground"),
48
+ children: label
49
+ }),
50
+ status === "done" && /* @__PURE__ */ jsxs("span", {
51
+ className: "flex items-center gap-1 type-text-sm text-success",
52
+ children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5" }), /* @__PURE__ */ jsx("span", { children: "done" })]
53
+ }),
54
+ status === "running" && /* @__PURE__ */ jsxs("span", {
55
+ className: "flex items-center gap-1.5 type-text-sm text-warning",
56
+ children: [/* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-warning" }), /* @__PURE__ */ jsx("span", { children: "running…" })]
57
+ }),
58
+ status === "pending" && /* @__PURE__ */ jsxs("span", {
59
+ className: "flex items-center gap-1.5 type-text-sm text-muted-foreground",
60
+ children: [/* @__PURE__ */ jsx("span", { className: "size-2 rounded-full border border-muted-foreground" }), /* @__PURE__ */ jsx("span", { children: "pending" })]
61
+ })
62
+ ]
63
+ });
64
+ }
65
+ //#endregion
66
+ export { TaskProgress };
@@ -26,7 +26,7 @@ function TooltipContent({ className, sideOffset = 6, children, ...props }) {
26
26
  return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(TooltipPrimitive.Content, {
27
27
  "data-slot": "tooltip-content",
28
28
  sideOffset,
29
- className: cn("bg-inverted text-inverted-foreground dark:bg-subtle dark:text-foreground", "z-50 w-fit rounded-md px-3 py-2 shadow-lg dark:shadow-none dark:drop-shadow-[0_0_0.5px_var(--color-border)]", "type-text-xs font-semibold text-balance text-center", "animate-in fade-in-0 zoom-in-95", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "origin-(--radix-tooltip-content-transform-origin)", className),
29
+ className: cn("bg-inverted text-inverted-foreground dark:bg-subtle dark:text-foreground", "z-50 w-fit rounded-md px-3 py-2 shadow-lg dark:shadow-none dark:drop-shadow-[0_0_0.5px_var(--color-border)]", "type-text-xs font-semibold text-balance text-center whitespace-pre-line", "animate-in fade-in-0 zoom-in-95", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "origin-(--radix-tooltip-content-transform-origin)", className),
30
30
  ...props,
31
31
  children: [children, /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "bg-inverted fill-inverted dark:bg-subtle dark:fill-subtle z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })]
32
32
  }) });
@@ -0,0 +1,34 @@
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
+
4
+ //#region src/components/wizard.d.ts
5
+ interface WizardStep {
6
+ id: string;
7
+ label: string;
8
+ }
9
+ interface WizardStepsProps {
10
+ steps: readonly WizardStep[];
11
+ activeIdx: number;
12
+ onSelect: (idx: number) => void;
13
+ ariaLabel?: string;
14
+ className?: string;
15
+ }
16
+ declare function WizardSteps({
17
+ steps,
18
+ activeIdx,
19
+ onSelect,
20
+ ariaLabel,
21
+ className
22
+ }: WizardStepsProps): _$react_jsx_runtime0.JSX.Element;
23
+ interface WizardProgressProps extends React.ComponentProps<"div"> {
24
+ current: number;
25
+ total: number;
26
+ }
27
+ declare function WizardProgress({
28
+ current,
29
+ total,
30
+ className,
31
+ ...props
32
+ }: WizardProgressProps): _$react_jsx_runtime0.JSX.Element;
33
+ //#endregion
34
+ export { WizardProgress, type WizardStep, WizardSteps };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.mjs";
3
+ import { TabsNav, TabsNavList, TabsNavTrigger } from "./tabs.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/wizard.tsx
6
+ function WizardSteps({ steps, activeIdx, onSelect, ariaLabel = "Wizard steps", className }) {
7
+ return /* @__PURE__ */ jsx(TabsNav, {
8
+ orientation: "vertical",
9
+ "aria-label": ariaLabel,
10
+ className,
11
+ children: /* @__PURE__ */ jsx(TabsNavList, { children: steps.map((step, idx) => /* @__PURE__ */ jsx(TabsNavTrigger, {
12
+ active: idx === activeIdx,
13
+ asChild: true,
14
+ children: /* @__PURE__ */ jsx("button", {
15
+ type: "button",
16
+ onClick: () => onSelect(idx),
17
+ className: "w-full justify-start text-left",
18
+ children: step.label
19
+ })
20
+ }, step.id)) })
21
+ });
22
+ }
23
+ function WizardProgress({ current, total, className, ...props }) {
24
+ const percent = total > 0 ? Math.round(current / total * 100) : 0;
25
+ return /* @__PURE__ */ jsxs("div", {
26
+ className: cn("flex flex-col gap-1.5 px-2", className),
27
+ ...props,
28
+ children: [/* @__PURE__ */ jsxs("div", {
29
+ className: "text-muted-foreground flex items-center justify-between text-xs",
30
+ children: [/* @__PURE__ */ jsxs("span", { children: [
31
+ "Step ",
32
+ current,
33
+ "/",
34
+ total
35
+ ] }), /* @__PURE__ */ jsxs("span", { children: [percent, "%"] })]
36
+ }), /* @__PURE__ */ jsx("div", {
37
+ className: "bg-muted h-1.5 overflow-hidden rounded-full",
38
+ children: /* @__PURE__ */ jsx("div", {
39
+ className: "bg-primary h-full transition-all",
40
+ style: { width: `${percent}%` }
41
+ })
42
+ })]
43
+ });
44
+ }
45
+ //#endregion
46
+ export { WizardProgress, WizardSteps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/ui",
3
- "version": "0.0.0-dev.fffc79a",
3
+ "version": "0.0.0-dev.gd42dbb4",
4
4
  "description": "Alpic design system — shared UI components",
5
5
  "type": "module",
6
6
  "exports": {
@@ -23,12 +23,12 @@
23
23
  "src"
24
24
  ],
25
25
  "peerDependencies": {
26
- "lucide-react": "^1.11.0",
27
- "react": "^19.2.5",
28
- "react-dom": "^19.2.5",
29
- "react-hook-form": "^7.74.0",
26
+ "lucide-react": "^1.14.0",
27
+ "react": "^19.2.6",
28
+ "react-dom": "^19.2.6",
29
+ "react-hook-form": "^7.75.0",
30
30
  "sonner": "^2.0.7",
31
- "tailwindcss": "^4.2.4",
31
+ "tailwindcss": "^4.3.0",
32
32
  "tw-animate-css": "^1.4.0"
33
33
  },
34
34
  "dependencies": {
@@ -52,19 +52,19 @@
52
52
  "class-variance-authority": "^0.7.1",
53
53
  "clsx": "^2.1.1",
54
54
  "cmdk": "^1.1.1",
55
- "tailwind-merge": "^3.5.0"
55
+ "tailwind-merge": "^3.6.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@ladle/react": "^5.1.1",
59
- "@tailwindcss/postcss": "^4.2.4",
59
+ "@tailwindcss/postcss": "^4.3.0",
60
60
  "@types/react": "19.2.14",
61
61
  "@types/react-dom": "19.2.3",
62
- "lucide-react": "^1.11.0",
63
- "react-hook-form": "^7.74.0",
62
+ "lucide-react": "^1.14.0",
63
+ "react-hook-form": "^7.75.0",
64
64
  "shx": "^0.4.0",
65
65
  "sonner": "^2.0.7",
66
- "tailwindcss": "^4.2.4",
67
- "tsdown": "^0.21.10",
66
+ "tailwindcss": "^4.3.0",
67
+ "tsdown": "^0.22.0",
68
68
  "tw-animate-css": "^1.4.0",
69
69
  "typescript": "^6.0.3"
70
70
  },