@fracazo/design-system 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/DESIGN.md +361 -8
  2. package/README.md +27 -5
  3. package/dist/src/cn.d.ts +8 -0
  4. package/dist/src/cn.js +11 -0
  5. package/dist/src/index.d.ts +26 -0
  6. package/dist/src/index.js +26 -0
  7. package/dist/src/ui/accordion.d.ts +14 -0
  8. package/dist/src/ui/accordion.js +25 -0
  9. package/dist/src/ui/button.d.ts +27 -0
  10. package/dist/src/ui/button.js +67 -0
  11. package/dist/src/ui/calendar.d.ts +16 -0
  12. package/dist/src/ui/calendar.js +84 -0
  13. package/dist/src/ui/card.d.ts +17 -0
  14. package/dist/src/ui/card.js +32 -0
  15. package/dist/src/ui/checkbox.d.ts +12 -0
  16. package/dist/src/ui/checkbox.js +17 -0
  17. package/dist/src/ui/dialog.d.ts +23 -0
  18. package/dist/src/ui/dialog.js +44 -0
  19. package/dist/src/ui/form.d.ts +33 -0
  20. package/dist/src/ui/form.js +68 -0
  21. package/dist/src/ui/input.d.ts +12 -0
  22. package/dist/src/ui/input.js +19 -0
  23. package/dist/src/ui/label.d.ts +11 -0
  24. package/dist/src/ui/label.js +15 -0
  25. package/dist/src/ui/popover.d.ts +17 -0
  26. package/dist/src/ui/popover.js +33 -0
  27. package/dist/src/ui/progress.d.ts +11 -0
  28. package/dist/src/ui/progress.js +15 -0
  29. package/dist/src/ui/radio-group.d.ts +12 -0
  30. package/dist/src/ui/radio-group.js +19 -0
  31. package/dist/src/ui/select.d.ts +23 -0
  32. package/dist/src/ui/select.js +46 -0
  33. package/dist/src/ui/sheet.d.ts +23 -0
  34. package/dist/src/ui/sheet.js +49 -0
  35. package/dist/src/ui/sortable-list.d.ts +26 -0
  36. package/dist/src/ui/sortable-list.js +92 -0
  37. package/dist/src/ui/tabs.d.ts +17 -0
  38. package/dist/src/ui/tabs.js +31 -0
  39. package/dist/src/ui/textarea.d.ts +10 -0
  40. package/dist/src/ui/textarea.js +13 -0
  41. package/package.json +36 -2
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import { DayPicker, type DayButton } from "react-day-picker";
3
+ import { Button } from "./button.js";
4
+ /**
5
+ * Date picker surface over react-day-picker.
6
+ *
7
+ * Use for: range selection or constrained date choice, if a surface ever
8
+ * needs more than a plain date.
9
+ * Avoid when: capturing a single date like the due date; the product uses
10
+ * native date inputs for the OS picker on mobile.
11
+ */
12
+ declare function Calendar({ className, classNames, showOutsideDays, captionLayout, buttonVariant, formatters, components, ...props }: React.ComponentProps<typeof DayPicker> & {
13
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"];
14
+ }): React.JSX.Element;
15
+ declare function CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>): React.JSX.Element;
16
+ export { Calendar, CalendarDayButton };
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, } from "lucide-react";
5
+ import { DayPicker, getDefaultClassNames, } from "react-day-picker";
6
+ import { cn } from "../cn.js";
7
+ import { Button, buttonVariants } from "./button.js";
8
+ /**
9
+ * Date picker surface over react-day-picker.
10
+ *
11
+ * Use for: range selection or constrained date choice, if a surface ever
12
+ * needs more than a plain date.
13
+ * Avoid when: capturing a single date like the due date; the product uses
14
+ * native date inputs for the OS picker on mobile.
15
+ */
16
+ function Calendar({ className, classNames, showOutsideDays = true, captionLayout = "label", buttonVariant = "ghost", formatters, components, ...props }) {
17
+ const defaultClassNames = getDefaultClassNames();
18
+ return (_jsx(DayPicker, { showOutsideDays: showOutsideDays, className: cn("bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent", String.raw `rtl:**:[.rdp-button\_next>svg]:rotate-180`, String.raw `rtl:**:[.rdp-button\_previous>svg]:rotate-180`, className), captionLayout: captionLayout, formatters: {
19
+ formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" }),
20
+ ...formatters,
21
+ }, classNames: {
22
+ root: cn("w-fit", defaultClassNames.root),
23
+ months: cn("flex gap-4 flex-col md:flex-row relative", defaultClassNames.months),
24
+ month: cn("flex flex-col w-full gap-4", defaultClassNames.month),
25
+ nav: cn("flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between", defaultClassNames.nav),
26
+ button_previous: cn(buttonVariants({ variant: buttonVariant }), "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none", defaultClassNames.button_previous),
27
+ button_next: cn(buttonVariants({ variant: buttonVariant }), "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none", defaultClassNames.button_next),
28
+ month_caption: cn("flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)", defaultClassNames.month_caption),
29
+ dropdowns: cn("w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5", defaultClassNames.dropdowns),
30
+ dropdown_root: cn("relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md", defaultClassNames.dropdown_root),
31
+ dropdown: cn("absolute bg-popover inset-0 opacity-0", defaultClassNames.dropdown),
32
+ caption_label: cn("select-none font-medium", captionLayout === "label"
33
+ ? "text-sm"
34
+ : "rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5", defaultClassNames.caption_label),
35
+ table: "w-full border-collapse",
36
+ weekdays: cn("flex", defaultClassNames.weekdays),
37
+ weekday: cn("text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none", defaultClassNames.weekday),
38
+ week: cn("flex w-full mt-2", defaultClassNames.week),
39
+ week_number_header: cn("select-none w-(--cell-size)", defaultClassNames.week_number_header),
40
+ week_number: cn("text-[0.8rem] select-none text-muted-foreground", defaultClassNames.week_number),
41
+ day: cn("relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none", props.showWeekNumber
42
+ ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-md"
43
+ : "[&:first-child[data-selected=true]_button]:rounded-l-md", defaultClassNames.day),
44
+ range_start: cn("rounded-l-md bg-accent", defaultClassNames.range_start),
45
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
46
+ range_end: cn("rounded-r-md bg-accent", defaultClassNames.range_end),
47
+ today: cn("bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none", defaultClassNames.today),
48
+ outside: cn("text-muted-foreground aria-selected:text-muted-foreground", defaultClassNames.outside),
49
+ disabled: cn("text-muted-foreground opacity-50", defaultClassNames.disabled),
50
+ hidden: cn("invisible", defaultClassNames.hidden),
51
+ ...classNames,
52
+ }, components: {
53
+ Root: ({ className, rootRef, ...props }) => {
54
+ return (_jsx("div", { "data-slot": "calendar", ref: rootRef, className: cn(className), ...props }));
55
+ },
56
+ Chevron: ({ className, orientation, ...props }) => {
57
+ if (orientation === "left") {
58
+ return (_jsx(ChevronLeftIcon, { className: cn("size-4", className), ...props }));
59
+ }
60
+ if (orientation === "right") {
61
+ return (_jsx(ChevronRightIcon, { className: cn("size-4", className), ...props }));
62
+ }
63
+ return (_jsx(ChevronDownIcon, { className: cn("size-4", className), ...props }));
64
+ },
65
+ DayButton: CalendarDayButton,
66
+ WeekNumber: ({ children, ...props }) => {
67
+ return (_jsx("td", { ...props, children: _jsx("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children: children }) }));
68
+ },
69
+ ...components,
70
+ }, ...props }));
71
+ }
72
+ function CalendarDayButton({ className, day, modifiers, ...props }) {
73
+ const defaultClassNames = getDefaultClassNames();
74
+ const ref = React.useRef(null);
75
+ React.useEffect(() => {
76
+ if (modifiers.focused)
77
+ ref.current?.focus();
78
+ }, [modifiers.focused]);
79
+ return (_jsx(Button, { ref: ref, variant: "ghost", size: "icon", "data-day": day.date.toLocaleDateString(), "data-selected-single": modifiers.selected &&
80
+ !modifiers.range_start &&
81
+ !modifiers.range_end &&
82
+ !modifiers.range_middle, "data-range-start": modifiers.range_start, "data-range-end": modifiers.range_end, "data-range-middle": modifiers.range_middle, className: cn("data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70", defaultClassNames.day, className), ...props }));
83
+ }
84
+ export { Calendar, CalendarDayButton };
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Surface family: Card with Header, Title, Description, Content, Footer.
4
+ *
5
+ * Use for: quickly composed standard surfaces where the stock look is fine.
6
+ * Avoid when: the surface must match the house card look (rounded-20 with
7
+ * warm shadows); today the app composes those from semantic utilities
8
+ * directly.
9
+ */
10
+ declare function Card({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
+ declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
12
+ declare function CardTitle({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
13
+ declare function CardDescription({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
14
+ declare function CardAction({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
15
+ declare function CardContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
16
+ declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
17
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../cn.js";
3
+ /**
4
+ * Surface family: Card with Header, Title, Description, Content, Footer.
5
+ *
6
+ * Use for: quickly composed standard surfaces where the stock look is fine.
7
+ * Avoid when: the surface must match the house card look (rounded-20 with
8
+ * warm shadows); today the app composes those from semantic utilities
9
+ * directly.
10
+ */
11
+ function Card({ className, ...props }) {
12
+ return (_jsx("div", { "data-slot": "card", className: cn("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm", className), ...props }));
13
+ }
14
+ function CardHeader({ className, ...props }) {
15
+ return (_jsx("div", { "data-slot": "card-header", className: cn("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6", className), ...props }));
16
+ }
17
+ function CardTitle({ className, ...props }) {
18
+ return (_jsx("div", { "data-slot": "card-title", className: cn("leading-none font-semibold", className), ...props }));
19
+ }
20
+ function CardDescription({ className, ...props }) {
21
+ return (_jsx("div", { "data-slot": "card-description", className: cn("text-muted-foreground text-sm", className), ...props }));
22
+ }
23
+ function CardAction({ className, ...props }) {
24
+ return (_jsx("div", { "data-slot": "card-action", className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className), ...props }));
25
+ }
26
+ function CardContent({ className, ...props }) {
27
+ return (_jsx("div", { "data-slot": "card-content", className: cn("px-6", className), ...props }));
28
+ }
29
+ function CardFooter({ className, ...props }) {
30
+ return (_jsx("div", { "data-slot": "card-footer", className: cn("flex items-center px-6 [.border-t]:pt-6", className), ...props }));
31
+ }
32
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
3
+ /**
4
+ * Standard checkbox (Radix) with the brand focus ring.
5
+ *
6
+ * Use for: dense forms and settings where a full tappable card is overkill,
7
+ * such as future account or admin surfaces.
8
+ * Avoid when: capturing questionnaire answers; the house pattern is
9
+ * MultiSelectCardGroup icon cards with 44px targets.
10
+ */
11
+ declare function Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>): React.JSX.Element;
12
+ export { Checkbox };
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { CheckIcon } from "lucide-react";
4
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
5
+ import { cn } from "../cn.js";
6
+ /**
7
+ * Standard checkbox (Radix) with the brand focus ring.
8
+ *
9
+ * Use for: dense forms and settings where a full tappable card is overkill,
10
+ * such as future account or admin surfaces.
11
+ * Avoid when: capturing questionnaire answers; the house pattern is
12
+ * MultiSelectCardGroup icon cards with 44px targets.
13
+ */
14
+ function Checkbox({ className, ...props }) {
15
+ return (_jsx(CheckboxPrimitive.Root, { "data-slot": "checkbox", className: cn("cursor-pointer peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: _jsx(CheckboxPrimitive.Indicator, { "data-slot": "checkbox-indicator", className: "grid place-content-center text-current transition-none", children: _jsx(CheckIcon, { className: "size-3.5" }) }) }));
16
+ }
17
+ export { Checkbox };
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ import { Dialog as DialogPrimitive } from "radix-ui";
3
+ /**
4
+ * Centred modal (Radix) for a focused task over dimmed content.
5
+ *
6
+ * Use for: previews and confirmations that need full attention, like the
7
+ * landing example-output preview.
8
+ * Avoid when: the surface is a mobile flow aid; use Sheet side bottom. The
9
+ * QR share overlay and paywall keep their custom overlays.
10
+ */
11
+ declare function Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element;
12
+ declare function DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>): React.JSX.Element;
13
+ declare function DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>): React.JSX.Element;
14
+ declare function DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>): React.JSX.Element;
15
+ declare function DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>): React.JSX.Element;
16
+ declare function DialogContent({ className, children, showCloseButton, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
17
+ showCloseButton?: boolean;
18
+ }): React.JSX.Element;
19
+ declare function DialogHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
20
+ declare function DialogFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
21
+ declare function DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>): React.JSX.Element;
22
+ declare function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>): React.JSX.Element;
23
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { XIcon } from "lucide-react";
4
+ import { Dialog as DialogPrimitive } from "radix-ui";
5
+ import { cn } from "../cn.js";
6
+ /**
7
+ * Centred modal (Radix) for a focused task over dimmed content.
8
+ *
9
+ * Use for: previews and confirmations that need full attention, like the
10
+ * landing example-output preview.
11
+ * Avoid when: the surface is a mobile flow aid; use Sheet side bottom. The
12
+ * QR share overlay and paywall keep their custom overlays.
13
+ */
14
+ function Dialog({ ...props }) {
15
+ return _jsx(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
16
+ }
17
+ function DialogTrigger({ ...props }) {
18
+ return _jsx(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
19
+ }
20
+ function DialogPortal({ ...props }) {
21
+ return _jsx(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
22
+ }
23
+ function DialogClose({ ...props }) {
24
+ return _jsx(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
25
+ }
26
+ function DialogOverlay({ className, ...props }) {
27
+ return (_jsx(DialogPrimitive.Overlay, { "data-slot": "dialog-overlay", className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className), ...props }));
28
+ }
29
+ function DialogContent({ className, children, showCloseButton = true, ...props }) {
30
+ return (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { "data-slot": "dialog-content", className: cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-2xl border p-6 shadow-lg duration-200 sm:max-w-lg", className), ...props, children: [children, showCloseButton && (_jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", className: "ring-offset-background focus-visible:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 grid size-8 place-items-center rounded-full opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:pointer-events-none", children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] }))] })] }));
31
+ }
32
+ function DialogHeader({ className, ...props }) {
33
+ return (_jsx("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-1.5 text-center sm:text-left", className), ...props }));
34
+ }
35
+ function DialogFooter({ className, ...props }) {
36
+ return (_jsx("div", { "data-slot": "dialog-footer", className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className), ...props }));
37
+ }
38
+ function DialogTitle({ className, ...props }) {
39
+ return (_jsx(DialogPrimitive.Title, { "data-slot": "dialog-title", className: cn("text-lg leading-none font-semibold", className), ...props }));
40
+ }
41
+ function DialogDescription({ className, ...props }) {
42
+ return (_jsx(DialogPrimitive.Description, { "data-slot": "dialog-description", className: cn("text-muted-foreground text-sm", className), ...props }));
43
+ }
44
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -0,0 +1,33 @@
1
+ import * as React from "react";
2
+ import type { Label as LabelPrimitive } from "radix-ui";
3
+ import { Slot } from "radix-ui";
4
+ import { type ControllerProps, type FieldPath, type FieldValues } from "react-hook-form";
5
+ declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>({ children, watch, getValues, getErrors, getFieldState, setError, clearErrors, setValue, setValues, trigger, formState, resetField, reset, resetDefaultValues, handleSubmit, unregister, control, register, setFocus, subscribe, }: import("react-hook-form").FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
6
+ declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ ...props }: ControllerProps<TFieldValues, TName>) => React.JSX.Element;
7
+ declare const useFormField: () => {
8
+ invalid: boolean;
9
+ isDirty: boolean;
10
+ isTouched: boolean;
11
+ isValidating: boolean;
12
+ error?: import("react-hook-form").FieldError | undefined;
13
+ id: string;
14
+ name: string;
15
+ formItemId: string;
16
+ formDescriptionId: string;
17
+ formMessageId: string;
18
+ };
19
+ /**
20
+ * react-hook-form glue: FormField, FormItem, FormLabel, FormControl,
21
+ * FormMessage, FormDescription.
22
+ *
23
+ * Use for: every RHF-driven field; one FormField per question or input.
24
+ * Avoid when: a field lives outside RHF; use Label plus Input directly.
25
+ * Note: wrap forms in FormProvider from react-hook-form itself; the Form
26
+ * alias export is unused in this app.
27
+ */
28
+ declare function FormItem({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
29
+ declare function FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): React.JSX.Element;
30
+ declare function FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>): React.JSX.Element;
31
+ declare function FormDescription({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
32
+ declare function FormMessage({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element | null;
33
+ export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Slot } from "radix-ui";
5
+ import { Controller, FormProvider, useFormContext, useFormState, } from "react-hook-form";
6
+ import { cn } from "../cn.js";
7
+ import { Label } from "./label.js";
8
+ const Form = FormProvider;
9
+ const FormFieldContext = React.createContext({});
10
+ const FormField = ({ ...props }) => {
11
+ return (_jsx(FormFieldContext.Provider, { value: { name: props.name }, children: _jsx(Controller, { ...props }) }));
12
+ };
13
+ const useFormField = () => {
14
+ const fieldContext = React.useContext(FormFieldContext);
15
+ const itemContext = React.useContext(FormItemContext);
16
+ const { getFieldState } = useFormContext();
17
+ const formState = useFormState({ name: fieldContext.name });
18
+ const fieldState = getFieldState(fieldContext.name, formState);
19
+ if (!fieldContext) {
20
+ throw new Error("useFormField should be used within <FormField>");
21
+ }
22
+ const { id } = itemContext;
23
+ return {
24
+ id,
25
+ name: fieldContext.name,
26
+ formItemId: `${id}-form-item`,
27
+ formDescriptionId: `${id}-form-item-description`,
28
+ formMessageId: `${id}-form-item-message`,
29
+ ...fieldState,
30
+ };
31
+ };
32
+ const FormItemContext = React.createContext({});
33
+ /**
34
+ * react-hook-form glue: FormField, FormItem, FormLabel, FormControl,
35
+ * FormMessage, FormDescription.
36
+ *
37
+ * Use for: every RHF-driven field; one FormField per question or input.
38
+ * Avoid when: a field lives outside RHF; use Label plus Input directly.
39
+ * Note: wrap forms in FormProvider from react-hook-form itself; the Form
40
+ * alias export is unused in this app.
41
+ */
42
+ function FormItem({ className, ...props }) {
43
+ const id = React.useId();
44
+ return (_jsx(FormItemContext.Provider, { value: { id }, children: _jsx("div", { "data-slot": "form-item", className: cn("grid gap-2", className), ...props }) }));
45
+ }
46
+ function FormLabel({ className, ...props }) {
47
+ const { error, formItemId } = useFormField();
48
+ return (_jsx(Label, { "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive", className), htmlFor: formItemId, ...props }));
49
+ }
50
+ function FormControl({ ...props }) {
51
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
52
+ return (_jsx(Slot.Root, { "data-slot": "form-control", id: formItemId, "aria-describedby": !error
53
+ ? `${formDescriptionId}`
54
+ : `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error, ...props }));
55
+ }
56
+ function FormDescription({ className, ...props }) {
57
+ const { formDescriptionId } = useFormField();
58
+ return (_jsx("p", { "data-slot": "form-description", id: formDescriptionId, className: cn("text-muted-foreground text-sm", className), ...props }));
59
+ }
60
+ function FormMessage({ className, ...props }) {
61
+ const { error, formMessageId } = useFormField();
62
+ const body = error ? String(error?.message ?? "") : props.children;
63
+ if (!body) {
64
+ return null;
65
+ }
66
+ return (_jsx("p", { "data-slot": "form-message", id: formMessageId, role: "alert", className: cn("text-destructive text-sm", className), ...props, children: body }));
67
+ }
68
+ export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ declare const inputBaseClassName: string;
3
+ /**
4
+ * Single-line text field, controlled-first (coerces value to empty string).
5
+ *
6
+ * Use for: react-hook-form fields via FormControl, and standalone controlled
7
+ * fields like the delivery email. inputBaseClassName lets lookalike inputs
8
+ * (PlaceAutocomplete) match without duplicating classes.
9
+ * Avoid when: capturing an enumerable choice; use OptionCard groups.
10
+ */
11
+ declare function Input({ className, type, value, ...props }: React.ComponentProps<"input">): React.JSX.Element;
12
+ export { Input, inputBaseClassName };
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../cn.js";
3
+ // Shared so other inputs (e.g. PlaceAutocomplete) can match the shadcn look
4
+ // without duplicating the class string.
5
+ const inputBaseClassName = cn("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input min-h-[48px] w-full min-w-0 rounded-md border bg-card px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive");
6
+ /**
7
+ * Single-line text field, controlled-first (coerces value to empty string).
8
+ *
9
+ * Use for: react-hook-form fields via FormControl, and standalone controlled
10
+ * fields like the delivery email. inputBaseClassName lets lookalike inputs
11
+ * (PlaceAutocomplete) match without duplicating classes.
12
+ * Avoid when: capturing an enumerable choice; use OptionCard groups.
13
+ */
14
+ function Input({ className, type, value, ...props }) {
15
+ return (_jsx("input", { type: type, "data-slot": "input",
16
+ // Coerce undefined/null to '' to prevent React uncontrolled-to-controlled warnings
17
+ value: value ?? '', className: cn(inputBaseClassName, className), ...props }));
18
+ }
19
+ export { Input, inputBaseClassName };
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ import { Label as LabelPrimitive } from "radix-ui";
3
+ /**
4
+ * Form field label with peer-disabled handling.
5
+ *
6
+ * Use for: labelling standalone controlled fields outside react-hook-form.
7
+ * Avoid when: inside a FormField; use FormLabel, which wires error state
8
+ * and htmlFor automatically.
9
+ */
10
+ declare function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): React.JSX.Element;
11
+ export { Label };
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Label as LabelPrimitive } from "radix-ui";
4
+ import { cn } from "../cn.js";
5
+ /**
6
+ * Form field label with peer-disabled handling.
7
+ *
8
+ * Use for: labelling standalone controlled fields outside react-hook-form.
9
+ * Avoid when: inside a FormField; use FormLabel, which wires error state
10
+ * and htmlFor automatically.
11
+ */
12
+ function Label({ className, ...props }) {
13
+ return (_jsx(LabelPrimitive.Root, { "data-slot": "label", className: cn("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className), ...props }));
14
+ }
15
+ export { Label };
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import { Popover as PopoverPrimitive } from "radix-ui";
3
+ /**
4
+ * Anchored floating panel (Radix), non-modal.
5
+ *
6
+ * Use for: attaching transient UI to a control, like the PlaceAutocomplete
7
+ * suggestion list (anchor on the input so focus never moves).
8
+ * Avoid when: the content is a task or announcement; use Dialog or Sheet.
9
+ */
10
+ declare function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
11
+ declare function PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>): React.JSX.Element;
12
+ declare function PopoverContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof PopoverPrimitive.Content>): React.JSX.Element;
13
+ declare function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>): React.JSX.Element;
14
+ declare function PopoverHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
15
+ declare function PopoverTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
16
+ declare function PopoverDescription({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
17
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Popover as PopoverPrimitive } from "radix-ui";
4
+ import { cn } from "../cn.js";
5
+ /**
6
+ * Anchored floating panel (Radix), non-modal.
7
+ *
8
+ * Use for: attaching transient UI to a control, like the PlaceAutocomplete
9
+ * suggestion list (anchor on the input so focus never moves).
10
+ * Avoid when: the content is a task or announcement; use Dialog or Sheet.
11
+ */
12
+ function Popover({ ...props }) {
13
+ return _jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
14
+ }
15
+ function PopoverTrigger({ ...props }) {
16
+ return _jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
17
+ }
18
+ function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
19
+ return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", align: align, sideOffset: sideOffset, className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden", className), ...props }) }));
20
+ }
21
+ function PopoverAnchor({ ...props }) {
22
+ return _jsx(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
23
+ }
24
+ function PopoverHeader({ className, ...props }) {
25
+ return (_jsx("div", { "data-slot": "popover-header", className: cn("flex flex-col gap-1 text-sm", className), ...props }));
26
+ }
27
+ function PopoverTitle({ className, ...props }) {
28
+ return (_jsx("div", { "data-slot": "popover-title", className: cn("font-medium", className), ...props }));
29
+ }
30
+ function PopoverDescription({ className, ...props }) {
31
+ return (_jsx("p", { "data-slot": "popover-description", className: cn("text-muted-foreground", className), ...props }));
32
+ }
33
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ import { Progress as ProgressPrimitive } from "radix-ui";
3
+ /**
4
+ * Determinate progress bar, flat primary fill.
5
+ *
6
+ * Use for: simple completion indicators in future utilitarian UI.
7
+ * Avoid when: the bar is a brand moment; the questionnaire's gradient
8
+ * progress bars are bespoke for that reason.
9
+ */
10
+ declare function Progress({ className, value, ...props }: React.ComponentProps<typeof ProgressPrimitive.Root>): React.JSX.Element;
11
+ export { Progress };
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Progress as ProgressPrimitive } from "radix-ui";
4
+ import { cn } from "../cn.js";
5
+ /**
6
+ * Determinate progress bar, flat primary fill.
7
+ *
8
+ * Use for: simple completion indicators in future utilitarian UI.
9
+ * Avoid when: the bar is a brand moment; the questionnaire's gradient
10
+ * progress bars are bespoke for that reason.
11
+ */
12
+ function Progress({ className, value, ...props }) {
13
+ return (_jsx(ProgressPrimitive.Root, { "data-slot": "progress", className: cn("bg-primary/20 relative h-2 w-full overflow-hidden rounded-full", className), ...props, children: _jsx(ProgressPrimitive.Indicator, { "data-slot": "progress-indicator", className: "bg-primary h-full w-full flex-1 transition-transform", style: { transform: `translateX(-${100 - (value || 0)}%)` } }) }));
14
+ }
15
+ export { Progress };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
3
+ /**
4
+ * Standard radio group (Radix) for compact single choice.
5
+ *
6
+ * Use for: short enumerations in dense or utilitarian UI.
7
+ * Avoid when: asking birth plan questions; the house pattern is
8
+ * SingleSelectCardGroup icon cards, not radios.
9
+ */
10
+ declare function RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>): React.JSX.Element;
11
+ declare function RadioGroupItem({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Item>): React.JSX.Element;
12
+ export { RadioGroup, RadioGroupItem };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { CircleIcon } from "lucide-react";
4
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
5
+ import { cn } from "../cn.js";
6
+ /**
7
+ * Standard radio group (Radix) for compact single choice.
8
+ *
9
+ * Use for: short enumerations in dense or utilitarian UI.
10
+ * Avoid when: asking birth plan questions; the house pattern is
11
+ * SingleSelectCardGroup icon cards, not radios.
12
+ */
13
+ function RadioGroup({ className, ...props }) {
14
+ return (_jsx(RadioGroupPrimitive.Root, { "data-slot": "radio-group", className: cn("grid gap-3", className), ...props }));
15
+ }
16
+ function RadioGroupItem({ className, ...props }) {
17
+ return (_jsx(RadioGroupPrimitive.Item, { "data-slot": "radio-group-item", className: cn("border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: _jsx(RadioGroupPrimitive.Indicator, { "data-slot": "radio-group-indicator", className: "relative flex items-center justify-center", children: _jsx(CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" }) }) }));
18
+ }
19
+ export { RadioGroup, RadioGroupItem };
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ import { Select as SelectPrimitive } from "radix-ui";
3
+ /**
4
+ * Dropdown select (Radix) for choosing one value from a longer list.
5
+ *
6
+ * Use for: long enumerations where cards or radios would sprawl,
7
+ * such as future admin or filter surfaces.
8
+ * Avoid when: the list is short and tappable; icon cards or chip toggles
9
+ * fit the product better. Date entry uses native date inputs, not Select.
10
+ */
11
+ declare function Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>): React.JSX.Element;
12
+ declare function SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>): React.JSX.Element;
13
+ declare function SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>): React.JSX.Element;
14
+ declare function SelectTrigger({ className, size, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
15
+ size?: "sm" | "default";
16
+ }): React.JSX.Element;
17
+ declare function SelectContent({ className, children, position, align, ...props }: React.ComponentProps<typeof SelectPrimitive.Content>): React.JSX.Element;
18
+ declare function SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>): React.JSX.Element;
19
+ declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>): React.JSX.Element;
20
+ declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>): React.JSX.Element;
21
+ declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>): React.JSX.Element;
22
+ declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>): React.JSX.Element;
23
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
4
+ import { Select as SelectPrimitive } from "radix-ui";
5
+ import { cn } from "../cn.js";
6
+ /**
7
+ * Dropdown select (Radix) for choosing one value from a longer list.
8
+ *
9
+ * Use for: long enumerations where cards or radios would sprawl,
10
+ * such as future admin or filter surfaces.
11
+ * Avoid when: the list is short and tappable; icon cards or chip toggles
12
+ * fit the product better. Date entry uses native date inputs, not Select.
13
+ */
14
+ function Select({ ...props }) {
15
+ return _jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
16
+ }
17
+ function SelectGroup({ ...props }) {
18
+ return _jsx(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
19
+ }
20
+ function SelectValue({ ...props }) {
21
+ return _jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
22
+ }
23
+ function SelectTrigger({ className, size = "default", children, ...props }) {
24
+ return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("cursor-pointer border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-card px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
25
+ }
26
+ function SelectContent({ className, children, position = "item-aligned", align = "center", ...props }) {
27
+ return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md", position === "popper" &&
28
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, align: align, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
29
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"), children: children }), _jsx(SelectScrollDownButton, {})] }) }));
30
+ }
31
+ function SelectLabel({ className, ...props }) {
32
+ return (_jsx(SelectPrimitive.Label, { "data-slot": "select-label", className: cn("text-muted-foreground px-2 py-1.5 text-xs", className), ...props }));
33
+ }
34
+ function SelectItem({ className, children, ...props }) {
35
+ return (_jsxs(SelectPrimitive.Item, { "data-slot": "select-item", className: cn("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className), ...props, children: [_jsx("span", { "data-slot": "select-item-indicator", className: "absolute right-2 flex size-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(CheckIcon, { className: "size-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] }));
36
+ }
37
+ function SelectSeparator({ className, ...props }) {
38
+ return (_jsx(SelectPrimitive.Separator, { "data-slot": "select-separator", className: cn("bg-border pointer-events-none -mx-1 my-1 h-px", className), ...props }));
39
+ }
40
+ function SelectScrollUpButton({ className, ...props }) {
41
+ return (_jsx(SelectPrimitive.ScrollUpButton, { "data-slot": "select-scroll-up-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronUpIcon, { className: "size-4" }) }));
42
+ }
43
+ function SelectScrollDownButton({ className, ...props }) {
44
+ return (_jsx(SelectPrimitive.ScrollDownButton, { "data-slot": "select-scroll-down-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronDownIcon, { className: "size-4" }) }));
45
+ }
46
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };