cortena-ui 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -3
- package/dist/a2ui/catalogue-doc.d.ts +44 -0
- package/dist/a2ui/catalogue-doc.js +169 -0
- package/dist/a2ui/catalogue-doc.js.map +1 -0
- package/dist/a2ui/catalogue.d.ts +44 -0
- package/dist/a2ui/catalogue.js +942 -0
- package/dist/a2ui/catalogue.js.map +1 -0
- package/dist/a2ui/index.d.ts +7 -0
- package/dist/a2ui/message.d.ts +232 -0
- package/dist/a2ui/message.js +365 -0
- package/dist/a2ui/message.js.map +1 -0
- package/dist/a2ui/renderer.d.ts +46 -0
- package/dist/a2ui/renderer.js +252 -0
- package/dist/a2ui/renderer.js.map +1 -0
- package/dist/a2ui/views.d.ts +80 -0
- package/dist/a2ui/views.js +596 -0
- package/dist/a2ui/views.js.map +1 -0
- package/dist/a2ui.d.ts +8 -0
- package/dist/a2ui.js +7 -0
- package/dist/chart.d.ts +9 -0
- package/dist/chart.js +9 -0
- package/dist/components/accordion.d.ts +22 -0
- package/dist/components/accordion.js +63 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.d.ts +15 -0
- package/dist/components/alert.js +64 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.d.ts +18 -0
- package/dist/components/avatar.js +40 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +47 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +71 -0
- package/dist/components/breadcrumb.js +123 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-link.d.ts +28 -0
- package/dist/components/button-link.js +24 -0
- package/dist/components/button-link.js.map +1 -0
- package/dist/components/button.d.ts +24 -0
- package/dist/components/button.js +65 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +28 -0
- package/dist/components/calendar.js +123 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +32 -0
- package/dist/components/card.js +57 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart/chart.d.ts +71 -0
- package/dist/components/chart/chart.js +167 -0
- package/dist/components/chart/chart.js.map +1 -0
- package/dist/components/chart/container.d.ts +88 -0
- package/dist/components/chart/container.js +189 -0
- package/dist/components/chart/container.js.map +1 -0
- package/dist/components/chart/data.js +128 -0
- package/dist/components/chart/data.js.map +1 -0
- package/dist/components/chart/index.d.ts +9 -0
- package/dist/components/chart/index.js +10 -0
- package/dist/components/chart/nivo-charts.js +225 -0
- package/dist/components/chart/nivo-charts.js.map +1 -0
- package/dist/components/chart/nivo-lazy.js +50 -0
- package/dist/components/chart/nivo-lazy.js.map +1 -0
- package/dist/components/chart/nivo-theme.d.ts +156 -0
- package/dist/components/chart/nivo-theme.js +161 -0
- package/dist/components/chart/nivo-theme.js.map +1 -0
- package/dist/components/chart/recharts-charts.js +276 -0
- package/dist/components/chart/recharts-charts.js.map +1 -0
- package/dist/components/chart/recharts-lazy.js +58 -0
- package/dist/components/chart/recharts-lazy.js.map +1 -0
- package/dist/components/chart/recharts-parts.d.ts +10 -0
- package/dist/components/chart/recharts-parts.js +25 -0
- package/dist/components/chart/recharts-parts.js.map +1 -0
- package/dist/components/chart/tokens.d.ts +62 -0
- package/dist/components/chart/tokens.js +192 -0
- package/dist/components/chart/tokens.js.map +1 -0
- package/dist/components/chart/types.d.ts +114 -0
- package/dist/components/chart/types.js +27 -0
- package/dist/components/chart/types.js.map +1 -0
- package/dist/components/checkbox.d.ts +20 -0
- package/dist/components/checkbox.js +24 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/chip.d.ts +17 -0
- package/dist/components/chip.js +47 -0
- package/dist/components/chip.js.map +1 -0
- package/dist/components/combobox.d.ts +76 -0
- package/dist/components/combobox.js +201 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +50 -0
- package/dist/components/command.js +117 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/data-table/data-table.d.ts +65 -0
- package/dist/components/data-table/data-table.js +588 -0
- package/dist/components/data-table/data-table.js.map +1 -0
- package/dist/components/data-table/export.d.ts +23 -0
- package/dist/components/data-table/export.js +95 -0
- package/dist/components/data-table/export.js.map +1 -0
- package/dist/components/data-table/features.d.ts +66 -0
- package/dist/components/data-table/features.js +103 -0
- package/dist/components/data-table/features.js.map +1 -0
- package/dist/components/data-table/index.d.ts +8 -0
- package/dist/components/data-table/parts.d.ts +79 -0
- package/dist/components/data-table/parts.js +400 -0
- package/dist/components/data-table/parts.js.map +1 -0
- package/dist/components/data-table/system-columns.js +84 -0
- package/dist/components/data-table/system-columns.js.map +1 -0
- package/dist/components/data-table/types.d.ts +172 -0
- package/dist/components/data-table/use-data-table.d.ts +19 -0
- package/dist/components/data-table/use-data-table.js +171 -0
- package/dist/components/data-table/use-data-table.js.map +1 -0
- package/dist/components/data-table/use-server-source.js +200 -0
- package/dist/components/data-table/use-server-source.js.map +1 -0
- package/dist/components/date-field.d.ts +54 -0
- package/dist/components/date-field.js +235 -0
- package/dist/components/date-field.js.map +1 -0
- package/dist/components/date-picker.d.ts +42 -0
- package/dist/components/date-picker.js +125 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +36 -0
- package/dist/components/dialog.js +97 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +54 -0
- package/dist/components/dropdown-menu.js +191 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/dropzone.d.ts +48 -0
- package/dist/components/dropzone.js +185 -0
- package/dist/components/dropzone.js.map +1 -0
- package/dist/components/empty-state.d.ts +22 -0
- package/dist/components/empty-state.js +46 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/error-banner.d.ts +17 -0
- package/dist/components/error-banner.js +52 -0
- package/dist/components/error-banner.js.map +1 -0
- package/dist/components/field.d.ts +64 -0
- package/dist/components/field.js +133 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/form.d.ts +37 -0
- package/dist/components/form.js +103 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/input.d.ts +17 -0
- package/dist/components/input.js +26 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kbd.d.ts +11 -0
- package/dist/components/kbd.js +20 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +14 -0
- package/dist/components/label.js +28 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/loading-skeleton.d.ts +22 -0
- package/dist/components/loading-skeleton.js +123 -0
- package/dist/components/loading-skeleton.js.map +1 -0
- package/dist/components/markdown.d.ts +44 -0
- package/dist/components/markdown.js +231 -0
- package/dist/components/markdown.js.map +1 -0
- package/dist/components/page-header.d.ts +26 -0
- package/dist/components/page-header.js +53 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/popover.d.ts +29 -0
- package/dist/components/popover.js +74 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +22 -0
- package/dist/components/progress.js +49 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +20 -0
- package/dist/components/radio-group.js +29 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.d.ts +25 -0
- package/dist/components/scroll-area.js +39 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section-card.d.ts +29 -0
- package/dist/components/section-card.js +55 -0
- package/dist/components/section-card.js.map +1 -0
- package/dist/components/segmented.d.ts +27 -0
- package/dist/components/segmented.js +32 -0
- package/dist/components/segmented.js.map +1 -0
- package/dist/components/select.d.ts +62 -0
- package/dist/components/select.js +97 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +19 -0
- package/dist/components/separator.js +23 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +35 -0
- package/dist/components/sheet.js +131 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/skeleton.d.ts +12 -0
- package/dist/components/skeleton.js +22 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/sortable-list.d.ts +67 -0
- package/dist/components/sortable-list.js +206 -0
- package/dist/components/sortable-list.js.map +1 -0
- package/dist/components/spinner.d.ts +29 -0
- package/dist/components/spinner.js +34 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/status-dot.d.ts +26 -0
- package/dist/components/status-dot.js +47 -0
- package/dist/components/status-dot.js.map +1 -0
- package/dist/components/switch.d.ts +21 -0
- package/dist/components/switch.js +21 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.d.ts +24 -0
- package/dist/components/tabs.js +60 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +19 -0
- package/dist/components/textarea.js +47 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +47 -0
- package/dist/components/toast.js +106 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toolbar.d.ts +19 -0
- package/dist/components/toolbar.js +45 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.d.ts +28 -0
- package/dist/components/tooltip.js +59 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/core.d.ts +44 -0
- package/dist/core.js +44 -0
- package/dist/data-table.d.ts +9 -0
- package/dist/data-table.js +7 -0
- package/dist/form.d.ts +7 -0
- package/dist/form.js +7 -0
- package/dist/hooks/use-cortena-theme.d.ts +98 -0
- package/dist/hooks/use-cortena-theme.js +145 -0
- package/dist/hooks/use-cortena-theme.js.map +1 -0
- package/dist/index.d.ts +75 -2678
- package/dist/index.js +66 -8598
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.js +15 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/render.d.ts +23 -0
- package/dist/lib/render.js +20 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/lib/shakeable.js +39 -0
- package/dist/lib/shakeable.js.map +1 -0
- package/dist/markdown.d.ts +3 -0
- package/dist/markdown.js +3 -0
- package/dist/sortable-list.d.ts +3 -0
- package/dist/sortable-list.js +3 -0
- package/package.json +37 -14
- package/src/a2ui/catalogue.ts +140 -103
- package/src/a2ui/views.tsx +5 -2
- package/src/components/alert.tsx +1 -1
- package/src/components/badge.tsx +1 -1
- package/src/components/button.tsx +1 -1
- package/src/components/chart/chart.tsx +72 -25
- package/src/components/chart/container.tsx +24 -39
- package/src/components/chart/index.tsx +4 -2
- package/src/components/chart/nivo-charts.tsx +41 -13
- package/src/components/chart/nivo-lazy.tsx +52 -0
- package/src/components/chart/recharts-charts.tsx +98 -3
- package/src/components/chart/recharts-lazy.tsx +72 -0
- package/src/components/chart/recharts-parts.tsx +34 -0
- package/src/components/chart/tokens.ts +1 -1
- package/src/components/chart/types.ts +14 -0
- package/src/components/chip.tsx +1 -1
- package/src/components/combobox.tsx +2 -2
- package/src/components/data-table/export.ts +18 -2
- package/src/components/data-table/features.ts +77 -45
- package/src/components/data-table/parts.tsx +15 -0
- package/src/components/data-table/use-data-table.ts +7 -2
- package/src/components/data-table/use-server-source.ts +17 -4
- package/src/components/date-field.tsx +1 -1
- package/src/components/error-banner.tsx +1 -1
- package/src/components/field.tsx +2 -2
- package/src/components/form.tsx +2 -2
- package/src/components/input.tsx +1 -1
- package/src/components/label.tsx +1 -1
- package/src/components/markdown.tsx +5 -4
- package/src/components/sheet.tsx +2 -2
- package/src/components/sortable-list.tsx +2 -2
- package/src/components/textarea.tsx +1 -1
- package/src/components/toast.tsx +1 -1
- package/src/entries/a2ui.ts +11 -0
- package/src/entries/chart.ts +10 -0
- package/src/entries/core.ts +91 -0
- package/src/entries/data-table.ts +9 -0
- package/src/entries/form.ts +24 -0
- package/src/entries/markdown.ts +9 -0
- package/src/entries/sortable-list.ts +13 -0
- package/src/index.ts +32 -98
- package/src/lib/shakeable.ts +33 -0
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { Check, ChevronDown } from "lucide-react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Select } from "@base-ui/react/select";
|
|
7
|
+
//#region src/components/select.tsx
|
|
8
|
+
function Select$1(props) {
|
|
9
|
+
return /* @__PURE__ */ jsx(Select.Root, { ...props });
|
|
10
|
+
}
|
|
11
|
+
function SelectGroup({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(Select.Group, {
|
|
13
|
+
"data-slot": "select-group",
|
|
14
|
+
className: cn("flex flex-col", className),
|
|
15
|
+
...props
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function SelectValue({ className, ...props }) {
|
|
19
|
+
return /* @__PURE__ */ jsx(Select.Value, {
|
|
20
|
+
"data-slot": "select-value",
|
|
21
|
+
className: cn("flex-1 truncate text-left data-[placeholder]:text-[color:var(--ds-muted-foreground)]", className),
|
|
22
|
+
...props
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function SelectTrigger({ className, size = "md", children, ...props }) {
|
|
26
|
+
return /* @__PURE__ */ jsxs(Select.Trigger, {
|
|
27
|
+
"data-slot": "select-trigger",
|
|
28
|
+
"data-size": size,
|
|
29
|
+
className: cn("flex w-fit min-w-40 items-center justify-between gap-2 whitespace-nowrap px-3", size === "sm" ? "h-8 text-[length:var(--ds-text-caption)]" : "h-9 text-[length:var(--ds-text-caption-lg)]", "rounded-[var(--ds-radius-md)] border border-[var(--ds-input)]", "bg-[var(--ds-background)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]", "transition-[border-color,box-shadow,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]", "outline-none hover:border-[var(--ds-border-strong)]", "focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40", "data-[popup-open]:border-[var(--ds-ring)]", "data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[var(--ds-destructive)]/30", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
|
|
30
|
+
...props,
|
|
31
|
+
children: [children, /* @__PURE__ */ jsx(Select.Icon, {
|
|
32
|
+
"data-slot": "select-icon",
|
|
33
|
+
className: "flex text-[color:var(--ds-muted-foreground)] transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180",
|
|
34
|
+
children: /* @__PURE__ */ jsx(ChevronDown, {})
|
|
35
|
+
})]
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function SelectContent({ className, children, side = "bottom", align = "start", sideOffset = 4, alignOffset, anchor, collisionBoundary, collisionPadding, collisionAvoidance, sticky, positionMethod, alignItemWithTrigger = false, container, ...props }) {
|
|
39
|
+
return /* @__PURE__ */ jsx(Select.Portal, {
|
|
40
|
+
container,
|
|
41
|
+
children: /* @__PURE__ */ jsx(Select.Positioner, {
|
|
42
|
+
"data-slot": "select-positioner",
|
|
43
|
+
side,
|
|
44
|
+
align,
|
|
45
|
+
sideOffset,
|
|
46
|
+
alignOffset,
|
|
47
|
+
anchor,
|
|
48
|
+
collisionBoundary,
|
|
49
|
+
collisionPadding,
|
|
50
|
+
collisionAvoidance,
|
|
51
|
+
sticky,
|
|
52
|
+
positionMethod,
|
|
53
|
+
alignItemWithTrigger,
|
|
54
|
+
className: "isolate z-50 outline-none",
|
|
55
|
+
children: /* @__PURE__ */ jsx(Select.Popup, {
|
|
56
|
+
"data-slot": "select-content",
|
|
57
|
+
className: cn("relative max-h-[var(--available-height,none)] min-w-[var(--anchor-width,auto)] overflow-y-auto overflow-x-hidden p-1", "rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]", "bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]", "outline-none", "open:animate-in open:fade-in-0 open:zoom-in-95", "closed:animate-out closed:fade-out-0 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", "duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]", className),
|
|
58
|
+
...props,
|
|
59
|
+
children
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function SelectLabel({ className, ...props }) {
|
|
65
|
+
return /* @__PURE__ */ jsx(Select.GroupLabel, {
|
|
66
|
+
"data-slot": "select-label",
|
|
67
|
+
className: cn("px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]", className),
|
|
68
|
+
...props
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function SelectItem({ className, children, ...props }) {
|
|
72
|
+
return /* @__PURE__ */ jsxs(Select.Item, {
|
|
73
|
+
"data-slot": "select-item",
|
|
74
|
+
className: cn("relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2", "rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none", "data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]", "data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
|
|
75
|
+
...props,
|
|
76
|
+
children: [/* @__PURE__ */ jsx(Select.ItemText, {
|
|
77
|
+
"data-slot": "select-item-text",
|
|
78
|
+
className: "flex-1 truncate",
|
|
79
|
+
children
|
|
80
|
+
}), /* @__PURE__ */ jsx(Select.ItemIndicator, {
|
|
81
|
+
"data-slot": "select-item-indicator",
|
|
82
|
+
className: "absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]",
|
|
83
|
+
children: /* @__PURE__ */ jsx(Check, { className: "size-4" })
|
|
84
|
+
})]
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function SelectSeparator({ className, ...props }) {
|
|
88
|
+
return /* @__PURE__ */ jsx(Select.Separator, {
|
|
89
|
+
"data-slot": "select-separator",
|
|
90
|
+
className: cn("-mx-1 my-1 h-px bg-[var(--ds-border)]", className),
|
|
91
|
+
...props
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { Select$1 as Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","names":["Select","SelectPrimitive"],"sources":["../../src/components/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Select.\n *\n * `SelectContent` composes Base UI's Portal + Positioner + Popup so consumers\n * keep writing `<SelectContent side=\"bottom\" align=\"start\">`; positioning\n * props are forwarded to the Positioner, which is where Base UI reads them.\n *\n * Radix users:\n * - `SelectValue` shows the raw value unless the Root is given `items`\n * (`{ [value]: label }` or `[{ value, label }]`) or `itemToStringLabel`;\n * Base UI does not read the label out of an unmounted `SelectItem`.\n * - `onValueChange` receives `(value, eventDetails)`.\n * - `SelectContent` defaults to the dropdown layout; pass\n * `alignItemWithTrigger` for Base UI's native-like overlay of the selected item.\n *\n * ## Typing the value\n *\n * `null` is the cleared / placeholder state, so `onValueChange` always hands\n * back `Value | null`, never bare `Value`. Name the value type on the element\n * to keep that union at `string | null` instead of letting inference widen it:\n *\n * ```tsx\n * const [status, setStatus] = useState(\"\");\n *\n * <Select<string>\n * // \"\" is not a value any item carries; `|| null` is the placeholder state,\n * // which is what makes SelectValue fall back to its `placeholder`.\n * value={status || null}\n * onValueChange={(next) => setStatus(next ?? \"\")} // next: string | null\n * >\n * ```\n *\n * Without the explicit `<string>` the type argument is inferred from `value`,\n * so a `string | null` value widens `Value` and the handler's parameter turns\n * into `string | null | null`. Multi-select narrows too:\n * `<Select<string, true> multiple>` hands back `string[]`, never `null`.\n *\n * `SelectProps` is the same props type, for a wrapper that forwards them.\n */\nexport type SelectProps<\n Value = string,\n Multiple extends boolean | undefined = false,\n> = SelectPrimitive.Root.Props<Value, Multiple>;\n\nfunction Select<Value, Multiple extends boolean | undefined = false>(\n props: SelectProps<Value, Multiple>,\n) {\n return <SelectPrimitive.Root {...props} />;\n}\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"flex flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\n \"flex-1 truncate text-left data-[placeholder]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface SelectTriggerProps extends SelectPrimitive.Trigger.Props {\n size?: \"sm\" | \"md\";\n}\n\nfunction SelectTrigger({ className, size = \"md\", children, ...props }: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit min-w-40 items-center justify-between gap-2 whitespace-nowrap px-3\",\n size === \"sm\" ? \"h-8 text-[length:var(--ds-text-caption)]\" : \"h-9 text-[length:var(--ds-text-caption-lg)]\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-input)]\",\n \"bg-[var(--ds-background)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]\",\n \"transition-[border-color,box-shadow,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none hover:border-[var(--ds-border-strong)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[popup-open]:border-[var(--ds-ring)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[var(--ds-destructive)]/30\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n data-slot=\"select-icon\"\n className=\"flex text-[color:var(--ds-muted-foreground)] transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180\"\n >\n <ChevronDown />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\ntype PositionerProps = Pick<\n SelectPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n | \"alignItemWithTrigger\"\n>;\n\nexport interface SelectContentProps extends SelectPrimitive.Popup.Props, PositionerProps {\n /** Where to portal the popup; defaults to `<body>`. */\n container?: SelectPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n alignItemWithTrigger = false,\n container,\n ...props\n}: SelectContentProps) {\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Positioner\n data-slot=\"select-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50 outline-none\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n className={cn(\n \"relative max-h-[var(--available-height,none)] min-w-[var(--anchor-width,auto)] overflow-y-auto overflow-x-hidden p-1\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"outline-none\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"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\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {children}\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText data-slot=\"select-item-text\" className=\"flex-1 truncate\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]\"\n >\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n};\n"],"mappings":";;;;;;;AAkDA,SAASA,SACP,OACA;CACA,OAAO,oBAACC,OAAgB,MAAjB,EAAsB,GAAI,MAAQ,CAAA;AAC3C;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,OAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,iBAAiB,SAAS;EACxC,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,OAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAMA,SAAS,cAAc,EAAE,WAAW,OAAO,MAAM,UAAU,GAAG,SAA6B;CACzF,OACE,qBAACA,OAAgB,SAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,GACT,iFACA,SAAS,OAAO,6CAA6C,+CAC7D,iEACA,4FACA,sHACA,uDACA,yGACA,6CACA,kEACA,gGACA,qFACA,SACF;EACA,GAAI;EAjBN,UAAA,CAmBG,UACD,oBAACA,OAAgB,MAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,aAAD,CAAc,CAAA;EACM,CAAA,CACC;;AAE7B;AAsBA,SAAS,cAAc,EACrB,WACA,UACA,OAAO,UACP,QAAQ,SACR,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,uBAAuB,OACvB,WACA,GAAG,SACkB;CACrB,OACE,oBAACA,OAAgB,QAAjB;EAAmC;EACjC,UAAA,oBAACA,OAAgB,YAAjB;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GACM;GACtB,WAAU;GAEV,UAAA,oBAACA,OAAgB,OAAjB;IACE,aAAU;IACV,WAAW,GACT,wHACA,kEACA,iGACA,gBACA,kDACA,2DACA,+JACA,gEACA,SACF;IACA,GAAI;IAEH;GACoB,CAAA;EACG,CAAA;CACN,CAAA;AAE5B;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA2C;CAC9E,OACE,oBAACA,OAAgB,YAAjB;EACE,aAAU;EACV,WAAW,GACT,wGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAqC;CACjF,OACE,qBAACA,OAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GACT,uFACA,wHACA,gGACA,kEACA,qFACA,SACF;EACA,GAAI;EAVN,UAAA,CAYE,oBAACA,OAAgB,UAAjB;GAA0B,aAAU;GAAmB,WAAU;GAC9D;EACuB,CAAA,GAC1B,oBAACA,OAAgB,eAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA;EACE,CAAA,CACX;;AAE1B;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAA0C;CACjF,OACE,oBAACA,OAAgB,WAAjB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,SAAS;EAChE,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { Separator } from "@base-ui/react/separator";
|
|
4
|
+
//#region src/components/separator.d.ts
|
|
5
|
+
export interface SeparatorProps extends React.ComponentProps<typeof Separator> {
|
|
6
|
+
/**
|
|
7
|
+
* Purely visual: renders with `role="none"` so screen readers skip it.
|
|
8
|
+
* Defaults to true, matching the Radix component this replaces.
|
|
9
|
+
*/
|
|
10
|
+
decorative?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Separator — a one-pixel rule on the border token. Base UI supplies the
|
|
14
|
+
* `role="separator"` and `aria-orientation` semantics when not decorative.
|
|
15
|
+
*/
|
|
16
|
+
declare function Separator$1({ className, orientation, decorative, ...props }: SeparatorProps): React.JSX.Element;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { Separator$1 as Separator };
|
|
19
|
+
//# sourceMappingURL=separator.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { Separator } from "@base-ui/react/separator";
|
|
6
|
+
//#region src/components/separator.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Separator — a one-pixel rule on the border token. Base UI supplies the
|
|
9
|
+
* `role="separator"` and `aria-orientation` semantics when not decorative.
|
|
10
|
+
*/
|
|
11
|
+
function Separator$1({ className, orientation = "horizontal", decorative = true, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(Separator, {
|
|
13
|
+
"data-slot": "separator",
|
|
14
|
+
orientation,
|
|
15
|
+
...decorative ? { role: "none" } : {},
|
|
16
|
+
className: cn("shrink-0 bg-[var(--ds-border)]", orientation === "horizontal" ? "h-px w-full" : "h-full min-h-4 w-px self-stretch", className),
|
|
17
|
+
...props
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { Separator$1 as Separator };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.js","names":["Separator","BaseSeparator"],"sources":["../../src/components/separator.tsx"],"sourcesContent":["\"use client\";\n\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SeparatorProps extends React.ComponentProps<typeof BaseSeparator> {\n /**\n * Purely visual: renders with `role=\"none\"` so screen readers skip it.\n * Defaults to true, matching the Radix component this replaces.\n */\n decorative?: boolean;\n}\n\n/**\n * Separator — a one-pixel rule on the border token. Base UI supplies the\n * `role=\"separator\"` and `aria-orientation` semantics when not decorative.\n */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: SeparatorProps) {\n return (\n <BaseSeparator\n data-slot=\"separator\"\n orientation={orientation}\n // An explicit undefined would still override Base UI's own role.\n {...(decorative ? { role: \"none\" } : {})}\n className={cn(\n \"shrink-0 bg-[var(--ds-border)]\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full min-h-4 w-px self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n"],"mappings":";;;;;;;;;;AAkBA,SAASA,YAAU,EACjB,WACA,cAAc,cACd,aAAa,MACb,GAAG,SACc;CACjB,OACE,oBAACC,WAAD;EACE,aAAU;EACG;EAEb,GAAK,aAAa,EAAE,MAAM,OAAO,IAAI,CAAC;EACtC,WAAW,GACT,kCACA,gBAAgB,eAAe,gBAAgB,oCAC/C,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { VariantProps } from "class-variance-authority";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Dialog } from "@base-ui/react/dialog";
|
|
5
|
+
//#region src/components/sheet.d.ts
|
|
6
|
+
export interface SheetProps extends Dialog.Root.Props {
|
|
7
|
+
/**
|
|
8
|
+
* `true` (default) traps focus, locks page scroll and draws a backdrop.
|
|
9
|
+
* `false` draws no backdrop and traps nothing, for a panel read alongside
|
|
10
|
+
* the app. `"trap-focus"` keeps focus in but leaves the page scrollable.
|
|
11
|
+
*/
|
|
12
|
+
modal?: boolean | "trap-focus";
|
|
13
|
+
}
|
|
14
|
+
declare function Sheet({ modal, ...props }: SheetProps): React.JSX.Element;
|
|
15
|
+
declare function SheetTrigger(props: Dialog.Trigger.Props): React.JSX.Element;
|
|
16
|
+
declare function SheetClose(props: Dialog.Close.Props): React.JSX.Element;
|
|
17
|
+
declare function SheetPortal(props: Dialog.Portal.Props): React.JSX.Element;
|
|
18
|
+
declare function SheetOverlay({ className, ...props }: Dialog.Backdrop.Props): React.JSX.Element;
|
|
19
|
+
declare const sheetVariants: (props?: ({
|
|
20
|
+
side?: "top" | "bottom" | "left" | "right" | null | undefined;
|
|
21
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
22
|
+
export interface SheetContentProps extends Dialog.Popup.Props, VariantProps<typeof sheetVariants> {
|
|
23
|
+
/** Keep the sheet mounted in the DOM while hidden. */
|
|
24
|
+
keepMounted?: boolean;
|
|
25
|
+
/** Where to portal the sheet; defaults to `<body>`. */
|
|
26
|
+
container?: Dialog.Portal.Props["container"];
|
|
27
|
+
}
|
|
28
|
+
declare function SheetContent({ side, className, children, keepMounted, container, ...props }: SheetContentProps): React.JSX.Element;
|
|
29
|
+
declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
30
|
+
declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
31
|
+
declare function SheetTitle({ className, ...props }: Dialog.Title.Props): React.JSX.Element;
|
|
32
|
+
declare function SheetDescription({ className, ...props }: Dialog.Description.Props): React.JSX.Element;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, sheetVariants };
|
|
35
|
+
//# sourceMappingURL=sheet.d.ts.map
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { Dialog } from "@base-ui/react/dialog";
|
|
8
|
+
//#region src/components/sheet.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Sheet: a Dialog whose Popup is anchored to one edge of the viewport.
|
|
11
|
+
*
|
|
12
|
+
* Same Base UI parts as Dialog (Root, Trigger, Portal, Backdrop, Popup, Title,
|
|
13
|
+
* Description, Close); only the Popup's placement differs, chosen by `side`.
|
|
14
|
+
* `SheetContent` composes Portal + Backdrop + Popup so consumers keep writing
|
|
15
|
+
* `<SheetContent side="right">…</SheetContent>`.
|
|
16
|
+
*
|
|
17
|
+
* ## Non-modal side panels
|
|
18
|
+
*
|
|
19
|
+
* `modal={false}` is the help-panel / inspector case: a sheet read *alongside*
|
|
20
|
+
* the app rather than instead of it. No backdrop is rendered, focus is not
|
|
21
|
+
* trapped, page scroll is not locked, and the rest of the page stays clickable,
|
|
22
|
+
* so a user can keep working with the panel open. `modal="trap-focus"` is the
|
|
23
|
+
* middle setting Base UI offers: focus stays inside, the page still scrolls.
|
|
24
|
+
*
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <Sheet modal={false} open={helpOpen} onOpenChange={setHelpOpen}>
|
|
27
|
+
* <SheetContent side="right" disablePointerDismissal>…</SheetContent>
|
|
28
|
+
* </Sheet>
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* A non-modal sheet closes when focus or a press leaves it; pass
|
|
32
|
+
* `disablePointerDismissal` (a Base UI Root prop, forwarded) to keep it open
|
|
33
|
+
* until the user closes it. `modal` is on the Root because that is where Base
|
|
34
|
+
* UI reads it; `SheetContent` picks the backdrop up from there through context.
|
|
35
|
+
*/
|
|
36
|
+
const SheetModalContext = /* @__PURE__ */ React.createContext(true);
|
|
37
|
+
function Sheet({ modal = true, ...props }) {
|
|
38
|
+
return /* @__PURE__ */ jsx(SheetModalContext.Provider, {
|
|
39
|
+
value: modal,
|
|
40
|
+
children: /* @__PURE__ */ jsx(Dialog.Root, {
|
|
41
|
+
modal,
|
|
42
|
+
...props
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function SheetTrigger(props) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Dialog.Trigger, {
|
|
48
|
+
"data-slot": "sheet-trigger",
|
|
49
|
+
...props
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function SheetClose(props) {
|
|
53
|
+
return /* @__PURE__ */ jsx(Dialog.Close, {
|
|
54
|
+
"data-slot": "sheet-close",
|
|
55
|
+
...props
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function SheetPortal(props) {
|
|
59
|
+
return /* @__PURE__ */ jsx(Dialog.Portal, {
|
|
60
|
+
"data-slot": "sheet-portal",
|
|
61
|
+
...props
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function SheetOverlay({ className, ...props }) {
|
|
65
|
+
return /* @__PURE__ */ jsx(Dialog.Backdrop, {
|
|
66
|
+
"data-slot": "sheet-overlay",
|
|
67
|
+
className: cn("fixed inset-0 z-50", "bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]", "open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0", "duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]", className),
|
|
68
|
+
...props
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const sheetVariants = /* @__PURE__ */ cva([
|
|
72
|
+
"fixed z-50 flex flex-col gap-4 p-6 outline-none",
|
|
73
|
+
"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]",
|
|
74
|
+
"open:animate-in closed:animate-out",
|
|
75
|
+
"open:duration-[var(--ds-duration-slow)] closed:duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]"
|
|
76
|
+
], {
|
|
77
|
+
variants: { side: {
|
|
78
|
+
top: "inset-x-0 top-0 border-b border-[var(--ds-border)] open:slide-in-from-top closed:slide-out-to-top",
|
|
79
|
+
bottom: "inset-x-0 bottom-0 border-t border-[var(--ds-border)] open:slide-in-from-bottom closed:slide-out-to-bottom",
|
|
80
|
+
left: "inset-y-0 left-0 h-full w-3/4 border-r border-[var(--ds-border)] open:slide-in-from-left closed:slide-out-to-left sm:max-w-sm",
|
|
81
|
+
right: "inset-y-0 right-0 h-full w-3/4 border-l border-[var(--ds-border)] open:slide-in-from-right closed:slide-out-to-right sm:max-w-sm"
|
|
82
|
+
} },
|
|
83
|
+
defaultVariants: { side: "right" }
|
|
84
|
+
});
|
|
85
|
+
function SheetContent({ side = "right", className, children, keepMounted, container, ...props }) {
|
|
86
|
+
const modal = React.useContext(SheetModalContext);
|
|
87
|
+
return /* @__PURE__ */ jsxs(SheetPortal, {
|
|
88
|
+
keepMounted,
|
|
89
|
+
container,
|
|
90
|
+
children: [modal === false ? null : /* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsx(Dialog.Popup, {
|
|
91
|
+
"data-slot": "sheet-content",
|
|
92
|
+
"data-side": side,
|
|
93
|
+
"data-modal": modal === false ? void 0 : modal === true ? "" : modal,
|
|
94
|
+
className: cn(sheetVariants({ side }), className),
|
|
95
|
+
...props,
|
|
96
|
+
children
|
|
97
|
+
})]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function SheetHeader({ className, ...props }) {
|
|
101
|
+
return /* @__PURE__ */ jsx("div", {
|
|
102
|
+
"data-slot": "sheet-header",
|
|
103
|
+
className: cn("flex flex-col gap-2 text-center sm:text-left", className),
|
|
104
|
+
...props
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function SheetFooter({ className, ...props }) {
|
|
108
|
+
return /* @__PURE__ */ jsx("div", {
|
|
109
|
+
"data-slot": "sheet-footer",
|
|
110
|
+
className: cn("mt-auto flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
|
|
111
|
+
...props
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function SheetTitle({ className, ...props }) {
|
|
115
|
+
return /* @__PURE__ */ jsx(Dialog.Title, {
|
|
116
|
+
"data-slot": "sheet-title",
|
|
117
|
+
className: cn("text-[length:var(--ds-text-body-md)] font-semibold text-[color:var(--ds-foreground)]", className),
|
|
118
|
+
...props
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function SheetDescription({ className, ...props }) {
|
|
122
|
+
return /* @__PURE__ */ jsx(Dialog.Description, {
|
|
123
|
+
"data-slot": "sheet-description",
|
|
124
|
+
className: cn("text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]", className),
|
|
125
|
+
...props
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, sheetVariants };
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet.js","names":["SheetPrimitive"],"sources":["../../src/components/sheet.tsx"],"sourcesContent":["\"use client\";\n\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Sheet: a Dialog whose Popup is anchored to one edge of the viewport.\n *\n * Same Base UI parts as Dialog (Root, Trigger, Portal, Backdrop, Popup, Title,\n * Description, Close); only the Popup's placement differs, chosen by `side`.\n * `SheetContent` composes Portal + Backdrop + Popup so consumers keep writing\n * `<SheetContent side=\"right\">…</SheetContent>`.\n *\n * ## Non-modal side panels\n *\n * `modal={false}` is the help-panel / inspector case: a sheet read *alongside*\n * the app rather than instead of it. No backdrop is rendered, focus is not\n * trapped, page scroll is not locked, and the rest of the page stays clickable,\n * so a user can keep working with the panel open. `modal=\"trap-focus\"` is the\n * middle setting Base UI offers: focus stays inside, the page still scrolls.\n *\n * ```tsx\n * <Sheet modal={false} open={helpOpen} onOpenChange={setHelpOpen}>\n * <SheetContent side=\"right\" disablePointerDismissal>…</SheetContent>\n * </Sheet>\n * ```\n *\n * A non-modal sheet closes when focus or a press leaves it; pass\n * `disablePointerDismissal` (a Base UI Root prop, forwarded) to keep it open\n * until the user closes it. `modal` is on the Root because that is where Base\n * UI reads it; `SheetContent` picks the backdrop up from there through context.\n */\nconst SheetModalContext = /* @__PURE__ */ React.createContext<boolean | \"trap-focus\">(true);\n\nexport interface SheetProps extends SheetPrimitive.Root.Props {\n /**\n * `true` (default) traps focus, locks page scroll and draws a backdrop.\n * `false` draws no backdrop and traps nothing, for a panel read alongside\n * the app. `\"trap-focus\"` keeps focus in but leaves the page scrollable.\n */\n modal?: boolean | \"trap-focus\";\n}\n\nfunction Sheet({ modal = true, ...props }: SheetProps) {\n return (\n <SheetModalContext.Provider value={modal}>\n <SheetPrimitive.Root modal={modal} {...props} />\n </SheetModalContext.Provider>\n );\n}\n\nfunction SheetTrigger(props: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose(props: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal(props: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50\",\n \"bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]\",\n \"open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst sheetVariants = /* @__PURE__ */ cva(\n [\n \"fixed z-50 flex flex-col gap-4 p-6 outline-none\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in closed:animate-out\",\n \"open:duration-[var(--ds-duration-slow)] closed:duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n ],\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b border-[var(--ds-border)] open:slide-in-from-top closed:slide-out-to-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t border-[var(--ds-border)] open:slide-in-from-bottom closed:slide-out-to-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r border-[var(--ds-border)] open:slide-in-from-left closed:slide-out-to-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l border-[var(--ds-border)] open:slide-in-from-right closed:slide-out-to-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\nexport interface SheetContentProps\n extends SheetPrimitive.Popup.Props, VariantProps<typeof sheetVariants> {\n /** Keep the sheet mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the sheet; defaults to `<body>`. */\n container?: SheetPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SheetContent({\n side = \"right\",\n className,\n children,\n keepMounted,\n container,\n ...props\n}: SheetContentProps) {\n const modal = React.useContext(SheetModalContext);\n return (\n <SheetPortal keepMounted={keepMounted} container={container}>\n {modal === false ? null : <SheetOverlay />}\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n data-modal={modal === false ? undefined : modal === true ? \"\" : modal}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </SheetPrimitive.Popup>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n sheetVariants,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,oBAAoC,sBAAM,cAAsC,IAAI;AAW1F,SAAS,MAAM,EAAE,QAAQ,MAAM,GAAG,SAAqB;CACrD,OACE,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;EACjC,UAAA,oBAACA,OAAe,MAAhB;GAA4B;GAAO,GAAI;EAAQ,CAAA;CACrB,CAAA;AAEhC;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,oBAACA,OAAe,SAAhB;EAAwB,aAAU;EAAgB,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,WAAW,OAAmC;CACrD,OAAO,oBAACA,OAAe,OAAhB;EAAsB,aAAU;EAAc,GAAI;CAAQ,CAAA;AACnE;AAEA,SAAS,YAAY,OAAoC;CACvD,OAAO,oBAACA,OAAe,QAAhB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAwC;CAC5E,OACE,oBAACA,OAAe,UAAhB;EACE,aAAU;EACV,WAAW,GACT,sBACA,8DACA,uEACA,gEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,gBAAgC,oBACpC;CACE;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,MAAM;EACJ,KAAK;EACL,QACE;EACF,MAAM;EACN,OACE;CACJ,EACF;CACA,iBAAiB,EACf,MAAM,QACR;AACF,CACF;AAUA,SAAS,aAAa,EACpB,OAAO,SACP,WACA,UACA,aACA,WACA,GAAG,SACiB;CACpB,MAAM,QAAQ,MAAM,WAAW,iBAAiB;CAChD,OACE,qBAAC,aAAD;EAA0B;EAAwB;EAAlD,UAAA,CACG,UAAU,QAAQ,OAAO,oBAAC,cAAD,CAAe,CAAA,GACzC,oBAACA,OAAe,OAAhB;GACE,aAAU;GACV,aAAW;GACX,cAAY,UAAU,QAAQ,KAAA,IAAY,UAAU,OAAO,KAAK;GAChE,WAAW,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,SAAS;GAChD,GAAI;GAEH;EACmB,CAAA,CACX;;AAEjB;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,kEAAkE,SAAS;EACzF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAqC;CACvE,OACE,oBAACA,OAAe,OAAhB;EACE,aAAU;EACV,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAA2C;CACnF,OACE,oBAACA,OAAe,aAAhB;EACE,aAAU;EACV,WAAW,GACT,gFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/components/skeleton.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Skeleton — a pulsing placeholder block. Sized by the consumer (`h-4 w-40`);
|
|
6
|
+
* the fill is the border token, which reads on the canvas, a card and a
|
|
7
|
+
* popover in both themes.
|
|
8
|
+
*/
|
|
9
|
+
declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { Skeleton };
|
|
12
|
+
//# sourceMappingURL=skeleton.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/skeleton.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Skeleton — a pulsing placeholder block. Sized by the consumer (`h-4 w-40`);
|
|
8
|
+
* the fill is the border token, which reads on the canvas, a card and a
|
|
9
|
+
* popover in both themes.
|
|
10
|
+
*/
|
|
11
|
+
function Skeleton({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx("div", {
|
|
13
|
+
"data-slot": "skeleton",
|
|
14
|
+
"aria-hidden": true,
|
|
15
|
+
className: cn("animate-pulse rounded-[var(--ds-radius-sm)] bg-[var(--ds-border)]", className),
|
|
16
|
+
...props
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { Skeleton };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../src/components/skeleton.tsx"],"sourcesContent":["\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Skeleton — a pulsing placeholder block. Sized by the consumer (`h-4 w-40`);\n * the fill is the border token, which reads on the canvas, a card and a\n * popover in both themes.\n */\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n aria-hidden\n className={cn(\"animate-pulse rounded-[var(--ds-radius-sm)] bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n"],"mappings":";;;;;;;;;;AAUA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,eAAA;EACA,WAAW,GAAG,qEAAqE,SAAS;EAC5F,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { DraggableAttributes, UniqueIdentifier } from "@dnd-kit/core";
|
|
4
|
+
import { arrayMove } from "@dnd-kit/sortable";
|
|
5
|
+
//#region src/components/sortable-list.d.ts
|
|
6
|
+
/** Spread onto the element that should start a drag. */
|
|
7
|
+
export interface SortableHandleProps extends Partial<DraggableAttributes> {
|
|
8
|
+
ref: (element: HTMLElement | null) => void;
|
|
9
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLElement>;
|
|
10
|
+
onPointerDown?: React.PointerEventHandler<HTMLElement>;
|
|
11
|
+
onMouseDown?: React.MouseEventHandler<HTMLElement>;
|
|
12
|
+
onTouchStart?: React.TouchEventHandler<HTMLElement>;
|
|
13
|
+
}
|
|
14
|
+
export interface SortableRenderState {
|
|
15
|
+
/** Attributes, listeners and ref for a custom drag handle. */
|
|
16
|
+
handleProps: SortableHandleProps;
|
|
17
|
+
/** True for the item being dragged (and for the overlay copy). */
|
|
18
|
+
isDragging: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** What moved where, passed to `onReorder` alongside the reordered array. */
|
|
21
|
+
export interface SortableReorderDetails {
|
|
22
|
+
/** Index the item came from, in the array as it was passed in. */
|
|
23
|
+
from: number;
|
|
24
|
+
/** Index it landed on. */
|
|
25
|
+
to: number;
|
|
26
|
+
/** Id of the item that moved (`getId` of the dragged item). */
|
|
27
|
+
activeId: UniqueIdentifier;
|
|
28
|
+
/** Id of the item it was dropped onto. */
|
|
29
|
+
overId: UniqueIdentifier;
|
|
30
|
+
}
|
|
31
|
+
export interface SortableListProps<T> extends Omit<React.ComponentProps<"ul">, "children"> {
|
|
32
|
+
items: readonly T[];
|
|
33
|
+
/** Stable id per item; must be unique within the list. */
|
|
34
|
+
getId: (item: T) => UniqueIdentifier;
|
|
35
|
+
/**
|
|
36
|
+
* Called with the reordered array after a successful drop, and with the move
|
|
37
|
+
* itself — `{ from, to, activeId, overId }` — for a server that persists a
|
|
38
|
+
* position rather than the whole list.
|
|
39
|
+
*/
|
|
40
|
+
onReorder: (next: T[], details: SortableReorderDetails) => void;
|
|
41
|
+
renderItem: (item: T, state: SortableRenderState) => React.ReactNode;
|
|
42
|
+
/** Layout axis; also selects the sorting strategy. */
|
|
43
|
+
orientation?: "vertical" | "horizontal";
|
|
44
|
+
/** Only a `<SortableHandle>` (or an element given `handleProps`) starts a drag. */
|
|
45
|
+
handle?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Let a finger scroll the page over the rows. Defaults to `handle`: `true`
|
|
48
|
+
* in handle mode, `false` in whole-row mode, which is what each already did.
|
|
49
|
+
* `true` on a whole-row list drops `touch-none` and uses a TouchSensor with
|
|
50
|
+
* delay activation, so a swipe scrolls and a held press drags.
|
|
51
|
+
*/
|
|
52
|
+
touchScroll?: boolean;
|
|
53
|
+
/** Disables every sensor and hides the handles. */
|
|
54
|
+
disabled?: boolean;
|
|
55
|
+
/** Class name for each item wrapper. */
|
|
56
|
+
itemClassName?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A grip button that starts the drag for its row. Reads the row's activator
|
|
60
|
+
* props from context, so it needs no wiring beyond being rendered inside
|
|
61
|
+
* `renderItem`. Hidden (kept in layout) when the list is disabled.
|
|
62
|
+
*/
|
|
63
|
+
declare function SortableHandle({ className, children, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
64
|
+
declare function SortableList<T>({ items, getId, onReorder, renderItem, orientation, handle, disabled, touchScroll, itemClassName: itemClass, className, ...props }: SortableListProps<T>): React.JSX.Element;
|
|
65
|
+
//#endregion
|
|
66
|
+
export { SortableHandle, SortableList, arrayMove };
|
|
67
|
+
//# sourceMappingURL=sortable-list.d.ts.map
|