@evinvest/uikit 0.18.0 → 0.20.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 +210 -13
- package/dist/chunk-3IPB4QQJ.js +306 -0
- package/dist/chunk-3IPB4QQJ.js.map +1 -0
- package/dist/components/accordion.js +136 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.js +175 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.js +49 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.js +54 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.js +25 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/band.js +75 -0
- package/dist/components/band.js.map +1 -0
- package/dist/components/breadcrumb.js +132 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-group.js +61 -0
- package/dist/components/button-group.js.map +1 -0
- package/dist/components/button.js +55 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.js +226 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.js +98 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.js +262 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.js +151 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.js +68 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.js +60 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/command.js +274 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/container.js +18 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/context-menu.js +337 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/date-time-picker.js +301 -0
- package/dist/components/date-time-picker.js.map +1 -0
- package/dist/components/dialog.js +207 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.js +351 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.js +356 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.js +91 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field-context.js +30 -0
- package/dist/components/field-context.js.map +1 -0
- package/dist/components/field.js +216 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/footer.js +89 -0
- package/dist/components/footer.js.map +1 -0
- package/dist/components/form.js +101 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/hover-card.js +90 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/info-tip.js +161 -0
- package/dist/components/info-tip.js.map +1 -0
- package/dist/components/input-group.js +124 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input-otp.js +120 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.js +26 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/item.js +167 -0
- package/dist/components/item.js.map +1 -0
- package/dist/components/kbd.js +29 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.js +11 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/logo.js +41 -0
- package/dist/components/logo.js.map +1 -0
- package/dist/components/menubar.js +330 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/native-select.js +62 -0
- package/dist/components/native-select.js.map +1 -0
- package/dist/components/navigation-menu.js +204 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/pagination.js +138 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.js +104 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.js +30 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.js +113 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/resizable.js +193 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scroll-area.js +40 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section-descriptor.js +88 -0
- package/dist/components/section-descriptor.js.map +1 -0
- package/dist/components/select-chevron.js +25 -0
- package/dist/components/select-chevron.js.map +1 -0
- package/dist/components/select.js +288 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.js +31 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.js +200 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.js +326 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.js +18 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.js +138 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.js +319 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/spinner.js +23 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/status-screen.js +145 -0
- package/dist/components/status-screen.js.map +1 -0
- package/dist/components/switch.js +54 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.js +124 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.js +133 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/terminal.js +206 -0
- package/dist/components/terminal.js.map +1 -0
- package/dist/components/textarea.js +22 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toggle-group.js +105 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.js +53 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.js +102 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/generated/accent.js +27 -0
- package/dist/generated/accent.js.map +1 -0
- package/dist/generated/accordion.js +13 -0
- package/dist/generated/accordion.js.map +1 -0
- package/dist/generated/alert-dialog.js +15 -0
- package/dist/generated/alert-dialog.js.map +1 -0
- package/dist/generated/alert.js +16 -0
- package/dist/generated/alert.js.map +1 -0
- package/dist/generated/avatar.js +9 -0
- package/dist/generated/avatar.js.map +1 -0
- package/dist/generated/badge.js +13 -0
- package/dist/generated/badge.js.map +1 -0
- package/dist/generated/band.js +39 -0
- package/dist/generated/band.js.map +1 -0
- package/dist/generated/breadcrumb.js +15 -0
- package/dist/generated/breadcrumb.js.map +1 -0
- package/dist/generated/button-group.js +14 -0
- package/dist/generated/button-group.js.map +1 -0
- package/dist/generated/button.js +30 -0
- package/dist/generated/button.js.map +1 -0
- package/dist/generated/calendar.js +29 -0
- package/dist/generated/calendar.js.map +1 -0
- package/dist/generated/card.js +17 -0
- package/dist/generated/card.js.map +1 -0
- package/dist/generated/carousel.js +31 -0
- package/dist/generated/carousel.js.map +1 -0
- package/dist/generated/chart.js +9 -0
- package/dist/generated/chart.js.map +1 -0
- package/dist/generated/checkbox.js +7 -0
- package/dist/generated/checkbox.js.map +1 -0
- package/dist/generated/command.js +27 -0
- package/dist/generated/command.js.map +1 -0
- package/dist/generated/container.js +5 -0
- package/dist/generated/container.js.map +1 -0
- package/dist/generated/context-menu.js +19 -0
- package/dist/generated/context-menu.js.map +1 -0
- package/dist/generated/date-time-picker.js +15 -0
- package/dist/generated/date-time-picker.js.map +1 -0
- package/dist/generated/dialog.js +17 -0
- package/dist/generated/dialog.js.map +1 -0
- package/dist/generated/drawer.js +26 -0
- package/dist/generated/drawer.js.map +1 -0
- package/dist/generated/dropdown-menu.js +21 -0
- package/dist/generated/dropdown-menu.js.map +1 -0
- package/dist/generated/empty.js +20 -0
- package/dist/generated/empty.js.map +1 -0
- package/dist/generated/field.js +33 -0
- package/dist/generated/field.js.map +1 -0
- package/dist/generated/focus.js +5 -0
- package/dist/generated/focus.js.map +1 -0
- package/dist/generated/form.js +11 -0
- package/dist/generated/form.js.map +1 -0
- package/dist/generated/hover-card.js +5 -0
- package/dist/generated/hover-card.js.map +1 -0
- package/dist/generated/input-group.js +29 -0
- package/dist/generated/input-group.js.map +1 -0
- package/dist/generated/input-otp.js +15 -0
- package/dist/generated/input-otp.js.map +1 -0
- package/dist/generated/input.js +11 -0
- package/dist/generated/input.js.map +1 -0
- package/dist/generated/item.js +40 -0
- package/dist/generated/item.js.map +1 -0
- package/dist/generated/kbd.js +7 -0
- package/dist/generated/kbd.js.map +1 -0
- package/dist/generated/label.js +5 -0
- package/dist/generated/label.js.map +1 -0
- package/dist/generated/menubar.js +27 -0
- package/dist/generated/menubar.js.map +1 -0
- package/dist/generated/navigation-menu.js +19 -0
- package/dist/generated/navigation-menu.js.map +1 -0
- package/dist/generated/popover.js +5 -0
- package/dist/generated/popover.js.map +1 -0
- package/dist/generated/progress.js +7 -0
- package/dist/generated/progress.js.map +1 -0
- package/dist/generated/radio-group.js +7 -0
- package/dist/generated/radio-group.js.map +1 -0
- package/dist/generated/resizable.js +11 -0
- package/dist/generated/resizable.js.map +1 -0
- package/dist/generated/scroll-area.js +14 -0
- package/dist/generated/scroll-area.js.map +1 -0
- package/dist/generated/select.js +15 -0
- package/dist/generated/select.js.map +1 -0
- package/dist/generated/separator.js +10 -0
- package/dist/generated/separator.js.map +1 -0
- package/dist/generated/sheet.js +25 -0
- package/dist/generated/sheet.js.map +1 -0
- package/dist/generated/sidebar.js +41 -0
- package/dist/generated/sidebar.js.map +1 -0
- package/dist/generated/skeleton.js +5 -0
- package/dist/generated/skeleton.js.map +1 -0
- package/dist/generated/slider.js +11 -0
- package/dist/generated/slider.js.map +1 -0
- package/dist/generated/sonner.js +30 -0
- package/dist/generated/sonner.js.map +1 -0
- package/dist/generated/switch.js +7 -0
- package/dist/generated/switch.js.map +1 -0
- package/dist/generated/table.js +21 -0
- package/dist/generated/table.js.map +1 -0
- package/dist/generated/tabs.js +11 -0
- package/dist/generated/tabs.js.map +1 -0
- package/dist/generated/terminal.js +70 -0
- package/dist/generated/terminal.js.map +1 -0
- package/dist/generated/textarea.js +11 -0
- package/dist/generated/textarea.js.map +1 -0
- package/dist/generated/toggle.js +18 -0
- package/dist/generated/toggle.js.map +1 -0
- package/dist/generated/tooltip.js +5 -0
- package/dist/generated/tooltip.js.map +1 -0
- package/dist/index.d.ts +141 -34
- package/dist/index.js +73 -8623
- package/dist/lib/cn.js +12 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/focus.js +5 -0
- package/dist/lib/focus.js.map +1 -0
- package/dist/palette-cli.js +41 -0
- package/dist/palette-cli.js.map +1 -0
- package/dist/palette.d.ts +80 -0
- package/dist/palette.js +25 -0
- package/dist/palette.js.map +1 -0
- package/dist/primitives/dismissable-layer.js +35 -0
- package/dist/primitives/dismissable-layer.js.map +1 -0
- package/dist/primitives/focus-scope.js +58 -0
- package/dist/primitives/focus-scope.js.map +1 -0
- package/dist/primitives/merge-refs.js +13 -0
- package/dist/primitives/merge-refs.js.map +1 -0
- package/dist/primitives/portal.js +19 -0
- package/dist/primitives/portal.js.map +1 -0
- package/dist/primitives/presence.js +45 -0
- package/dist/primitives/presence.js.map +1 -0
- package/dist/primitives/slot.js +39 -0
- package/dist/primitives/slot.js.map +1 -0
- package/dist/primitives/use-controllable-state.js +24 -0
- package/dist/primitives/use-controllable-state.js.map +1 -0
- package/dist/primitives/use-floating.js +128 -0
- package/dist/primitives/use-floating.js.map +1 -0
- package/dist/primitives/use-hover-intent.js +50 -0
- package/dist/primitives/use-hover-intent.js.map +1 -0
- package/dist/primitives/use-roving-focus.js +40 -0
- package/dist/primitives/use-roving-focus.js.map +1 -0
- package/dist/primitives/walk-elements.js +13 -0
- package/dist/primitives/walk-elements.js.map +1 -0
- package/package.json +15 -5
- package/styles/ev.css +73 -0
- package/styles/theme.css +470 -0
- package/styles/tokens.css +129 -90
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { useControllableState } from "../primitives/use-controllable-state.js";
|
|
6
|
+
import { useFloating } from "../primitives/use-floating.js";
|
|
7
|
+
import { useDismissableLayer } from "../primitives/dismissable-layer.js";
|
|
8
|
+
import { usePresence } from "../primitives/presence.js";
|
|
9
|
+
import { useRovingFocus } from "../primitives/use-roving-focus.js";
|
|
10
|
+
import { mergeRefs } from "../primitives/merge-refs.js";
|
|
11
|
+
import { Portal } from "../primitives/portal.js";
|
|
12
|
+
import { Slot } from "../primitives/slot.js";
|
|
13
|
+
import {
|
|
14
|
+
DROPDOWN_MENU_CHECK_ITEM,
|
|
15
|
+
DROPDOWN_MENU_CONTENT,
|
|
16
|
+
DROPDOWN_MENU_ITEM,
|
|
17
|
+
DROPDOWN_MENU_ITEM_INDICATOR,
|
|
18
|
+
DROPDOWN_MENU_LABEL,
|
|
19
|
+
DROPDOWN_MENU_SEPARATOR,
|
|
20
|
+
DROPDOWN_MENU_SHORTCUT,
|
|
21
|
+
DROPDOWN_MENU_SUB_CONTENT,
|
|
22
|
+
DROPDOWN_MENU_SUB_TRIGGER
|
|
23
|
+
} from "../generated/dropdown-menu.js";
|
|
24
|
+
const DropdownMenuContext = React.createContext(
|
|
25
|
+
null
|
|
26
|
+
);
|
|
27
|
+
function useDropdownMenu() {
|
|
28
|
+
const ctx = React.useContext(DropdownMenuContext);
|
|
29
|
+
if (!ctx) throw new Error("DropdownMenu parts must be used within <DropdownMenu>");
|
|
30
|
+
return ctx;
|
|
31
|
+
}
|
|
32
|
+
function DropdownMenu({ open, defaultOpen = false, onOpenChange, children }) {
|
|
33
|
+
const [isOpen, setOpen] = useControllableState({
|
|
34
|
+
...open !== void 0 ? { value: open } : {},
|
|
35
|
+
defaultValue: defaultOpen,
|
|
36
|
+
...onOpenChange ? { onChange: onOpenChange } : {}
|
|
37
|
+
});
|
|
38
|
+
const anchorRef = React.useRef(null);
|
|
39
|
+
return /* @__PURE__ */ jsx(DropdownMenuContext.Provider, { value: { open: isOpen, setOpen, anchorRef }, children: /* @__PURE__ */ jsx("div", { "data-slot": "dropdown-menu", children }) });
|
|
40
|
+
}
|
|
41
|
+
function DropdownMenuPortal({ children }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(Portal, { children });
|
|
43
|
+
}
|
|
44
|
+
function DropdownMenuTrigger({ asChild = false, onClick, ...props }) {
|
|
45
|
+
const { open, setOpen, anchorRef } = useDropdownMenu();
|
|
46
|
+
const Comp = asChild ? Slot : "button";
|
|
47
|
+
return /* @__PURE__ */ jsx(
|
|
48
|
+
Comp,
|
|
49
|
+
{
|
|
50
|
+
"data-slot": "dropdown-menu-trigger",
|
|
51
|
+
"aria-haspopup": "menu",
|
|
52
|
+
"aria-expanded": open,
|
|
53
|
+
"data-state": open ? "open" : "closed",
|
|
54
|
+
ref: anchorRef,
|
|
55
|
+
onClick: (e) => {
|
|
56
|
+
onClick?.(e);
|
|
57
|
+
setOpen(!open);
|
|
58
|
+
},
|
|
59
|
+
...props
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
function DropdownMenuContent({
|
|
64
|
+
className,
|
|
65
|
+
sideOffset = 4,
|
|
66
|
+
children,
|
|
67
|
+
...props
|
|
68
|
+
}) {
|
|
69
|
+
const { open, setOpen, anchorRef } = useDropdownMenu();
|
|
70
|
+
const { isPresent, ref: presRef } = usePresence(open);
|
|
71
|
+
const { floatingRef, style, side } = useFloating({
|
|
72
|
+
anchorRef,
|
|
73
|
+
open,
|
|
74
|
+
side: "bottom",
|
|
75
|
+
align: "start",
|
|
76
|
+
offset: sideOffset
|
|
77
|
+
});
|
|
78
|
+
const dismissRef = useDismissableLayer({
|
|
79
|
+
enabled: open,
|
|
80
|
+
onDismiss: () => setOpen(false),
|
|
81
|
+
exclude: [anchorRef]
|
|
82
|
+
});
|
|
83
|
+
const contentRef = React.useRef(null);
|
|
84
|
+
const items = () => Array.from(
|
|
85
|
+
contentRef.current?.querySelectorAll("[role^='menuitem']") ?? []
|
|
86
|
+
).filter((el) => el.getAttribute("data-disabled") === null);
|
|
87
|
+
const { activeIndex, onKeyDown: rovingKeyDown } = useRovingFocus({
|
|
88
|
+
count: 64,
|
|
89
|
+
orientation: "vertical",
|
|
90
|
+
loop: true
|
|
91
|
+
});
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
if (!open) return;
|
|
94
|
+
items()[activeIndex]?.focus();
|
|
95
|
+
}, [open, activeIndex]);
|
|
96
|
+
const close = React.useCallback(() => setOpen(false), [setOpen]);
|
|
97
|
+
if (!isPresent) return null;
|
|
98
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(DropdownMenuCloseContext.Provider, { value: close, children: /* @__PURE__ */ jsx(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
"data-slot": "dropdown-menu-content",
|
|
102
|
+
"data-state": open ? "open" : "closed",
|
|
103
|
+
"data-side": side,
|
|
104
|
+
role: "menu",
|
|
105
|
+
tabIndex: -1,
|
|
106
|
+
onKeyDown: (e) => {
|
|
107
|
+
rovingKeyDown(e);
|
|
108
|
+
if (e.key === "Escape") setOpen(false);
|
|
109
|
+
},
|
|
110
|
+
ref: mergeRefs(floatingRef, dismissRef, presRef, contentRef),
|
|
111
|
+
style,
|
|
112
|
+
className: cn(
|
|
113
|
+
DROPDOWN_MENU_CONTENT,
|
|
114
|
+
className
|
|
115
|
+
),
|
|
116
|
+
...props,
|
|
117
|
+
children
|
|
118
|
+
}
|
|
119
|
+
) }) });
|
|
120
|
+
}
|
|
121
|
+
const DropdownMenuCloseContext = React.createContext(() => {
|
|
122
|
+
});
|
|
123
|
+
function DropdownMenuGroup({ className, ...props }) {
|
|
124
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "dropdown-menu-group", role: "group", className, ...props });
|
|
125
|
+
}
|
|
126
|
+
function DropdownMenuItem({
|
|
127
|
+
className,
|
|
128
|
+
inset,
|
|
129
|
+
variant = "neutral",
|
|
130
|
+
disabled,
|
|
131
|
+
onClick,
|
|
132
|
+
onKeyDown,
|
|
133
|
+
...props
|
|
134
|
+
}) {
|
|
135
|
+
const close = React.useContext(DropdownMenuCloseContext);
|
|
136
|
+
return /* @__PURE__ */ jsx(
|
|
137
|
+
"div",
|
|
138
|
+
{
|
|
139
|
+
"data-slot": "dropdown-menu-item",
|
|
140
|
+
"data-inset": inset ? "" : void 0,
|
|
141
|
+
"data-variant": variant,
|
|
142
|
+
"data-disabled": disabled ? "" : void 0,
|
|
143
|
+
role: "menuitem",
|
|
144
|
+
tabIndex: disabled ? void 0 : -1,
|
|
145
|
+
className: cn(
|
|
146
|
+
DROPDOWN_MENU_ITEM,
|
|
147
|
+
className
|
|
148
|
+
),
|
|
149
|
+
onClick: (e) => {
|
|
150
|
+
if (disabled) return;
|
|
151
|
+
onClick?.(e);
|
|
152
|
+
close();
|
|
153
|
+
},
|
|
154
|
+
onKeyDown: (e) => {
|
|
155
|
+
onKeyDown?.(e);
|
|
156
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
e.currentTarget.click();
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
...props
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
function DropdownMenuCheckboxItem({
|
|
166
|
+
className,
|
|
167
|
+
children,
|
|
168
|
+
checked,
|
|
169
|
+
disabled,
|
|
170
|
+
onClick,
|
|
171
|
+
...props
|
|
172
|
+
}) {
|
|
173
|
+
const close = React.useContext(DropdownMenuCloseContext);
|
|
174
|
+
return /* @__PURE__ */ jsxs(
|
|
175
|
+
"div",
|
|
176
|
+
{
|
|
177
|
+
"data-slot": "dropdown-menu-checkbox-item",
|
|
178
|
+
role: "menuitemcheckbox",
|
|
179
|
+
"aria-checked": checked,
|
|
180
|
+
"data-state": checked ? "checked" : "unchecked",
|
|
181
|
+
"data-disabled": disabled ? "" : void 0,
|
|
182
|
+
tabIndex: disabled ? void 0 : -1,
|
|
183
|
+
className: cn(
|
|
184
|
+
DROPDOWN_MENU_CHECK_ITEM,
|
|
185
|
+
className
|
|
186
|
+
),
|
|
187
|
+
onClick: (e) => {
|
|
188
|
+
if (disabled) return;
|
|
189
|
+
onClick?.(e);
|
|
190
|
+
close();
|
|
191
|
+
},
|
|
192
|
+
...props,
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ jsx("span", { className: DROPDOWN_MENU_ITEM_INDICATOR, children: checked ? /* @__PURE__ */ jsx("svg", { className: "size-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) }) : null }),
|
|
195
|
+
children
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
const DropdownMenuRadioGroupContext = React.createContext(null);
|
|
201
|
+
function DropdownMenuRadioGroup({
|
|
202
|
+
className,
|
|
203
|
+
value,
|
|
204
|
+
onValueChange,
|
|
205
|
+
children,
|
|
206
|
+
...props
|
|
207
|
+
}) {
|
|
208
|
+
const ctx = React.useMemo(
|
|
209
|
+
() => ({ value, setValue: (next) => onValueChange?.(next) }),
|
|
210
|
+
[value, onValueChange]
|
|
211
|
+
);
|
|
212
|
+
return /* @__PURE__ */ jsx(DropdownMenuRadioGroupContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx("div", { "data-slot": "dropdown-menu-radio-group", role: "group", className, ...props, children }) });
|
|
213
|
+
}
|
|
214
|
+
function DropdownMenuRadioItem({
|
|
215
|
+
className,
|
|
216
|
+
children,
|
|
217
|
+
value,
|
|
218
|
+
disabled,
|
|
219
|
+
onClick,
|
|
220
|
+
...props
|
|
221
|
+
}) {
|
|
222
|
+
const close = React.useContext(DropdownMenuCloseContext);
|
|
223
|
+
const group = React.useContext(DropdownMenuRadioGroupContext);
|
|
224
|
+
const checked = group?.value === value;
|
|
225
|
+
return /* @__PURE__ */ jsxs(
|
|
226
|
+
"div",
|
|
227
|
+
{
|
|
228
|
+
"data-slot": "dropdown-menu-radio-item",
|
|
229
|
+
role: "menuitemradio",
|
|
230
|
+
"aria-checked": checked,
|
|
231
|
+
"data-state": checked ? "checked" : "unchecked",
|
|
232
|
+
"data-disabled": disabled ? "" : void 0,
|
|
233
|
+
tabIndex: disabled ? void 0 : -1,
|
|
234
|
+
className: cn(
|
|
235
|
+
DROPDOWN_MENU_CHECK_ITEM,
|
|
236
|
+
className
|
|
237
|
+
),
|
|
238
|
+
onClick: (e) => {
|
|
239
|
+
if (disabled) return;
|
|
240
|
+
onClick?.(e);
|
|
241
|
+
group?.setValue(value);
|
|
242
|
+
close();
|
|
243
|
+
},
|
|
244
|
+
...props,
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ jsx("span", { className: DROPDOWN_MENU_ITEM_INDICATOR, children: checked ? /* @__PURE__ */ jsx("svg", { className: "size-2 fill-current", viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }) }) : null }),
|
|
247
|
+
children
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
function DropdownMenuLabel({ className, inset, ...props }) {
|
|
253
|
+
return /* @__PURE__ */ jsx(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
"data-slot": "dropdown-menu-label",
|
|
257
|
+
"data-inset": inset ? "" : void 0,
|
|
258
|
+
className: cn(DROPDOWN_MENU_LABEL, className),
|
|
259
|
+
...props
|
|
260
|
+
}
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
function DropdownMenuSeparator({ className, ...props }) {
|
|
264
|
+
return /* @__PURE__ */ jsx(
|
|
265
|
+
"div",
|
|
266
|
+
{
|
|
267
|
+
"data-slot": "dropdown-menu-separator",
|
|
268
|
+
role: "separator",
|
|
269
|
+
className: cn(DROPDOWN_MENU_SEPARATOR, className),
|
|
270
|
+
...props
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
function DropdownMenuShortcut({ className, ...props }) {
|
|
275
|
+
return /* @__PURE__ */ jsx(
|
|
276
|
+
"span",
|
|
277
|
+
{
|
|
278
|
+
"data-slot": "dropdown-menu-shortcut",
|
|
279
|
+
className: cn(DROPDOWN_MENU_SHORTCUT, className),
|
|
280
|
+
...props
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
const DropdownMenuSubContext = React.createContext(null);
|
|
285
|
+
function DropdownMenuSub({ open, defaultOpen = false, onOpenChange, children }) {
|
|
286
|
+
const [isOpen, setOpen] = useControllableState({
|
|
287
|
+
...open !== void 0 ? { value: open } : {},
|
|
288
|
+
defaultValue: defaultOpen,
|
|
289
|
+
...onOpenChange ? { onChange: onOpenChange } : {}
|
|
290
|
+
});
|
|
291
|
+
return /* @__PURE__ */ jsx(DropdownMenuSubContext.Provider, { value: { open: isOpen, setOpen }, children: /* @__PURE__ */ jsx("div", { "data-slot": "dropdown-menu-sub", children }) });
|
|
292
|
+
}
|
|
293
|
+
function DropdownMenuSubTrigger({ className, inset, children, onClick, ...props }) {
|
|
294
|
+
const ctx = React.useContext(DropdownMenuSubContext);
|
|
295
|
+
return /* @__PURE__ */ jsxs(
|
|
296
|
+
"div",
|
|
297
|
+
{
|
|
298
|
+
"data-slot": "dropdown-menu-sub-trigger",
|
|
299
|
+
"data-inset": inset ? "" : void 0,
|
|
300
|
+
"data-state": ctx?.open ? "open" : "closed",
|
|
301
|
+
role: "menuitem",
|
|
302
|
+
"aria-haspopup": "menu",
|
|
303
|
+
"aria-expanded": ctx?.open,
|
|
304
|
+
tabIndex: -1,
|
|
305
|
+
className: cn(
|
|
306
|
+
DROPDOWN_MENU_SUB_TRIGGER,
|
|
307
|
+
className
|
|
308
|
+
),
|
|
309
|
+
onClick: (e) => {
|
|
310
|
+
onClick?.(e);
|
|
311
|
+
ctx?.setOpen(!ctx.open);
|
|
312
|
+
},
|
|
313
|
+
...props,
|
|
314
|
+
children: [
|
|
315
|
+
children,
|
|
316
|
+
/* @__PURE__ */ jsx("svg", { className: "ml-auto size-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) })
|
|
317
|
+
]
|
|
318
|
+
}
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
function DropdownMenuSubContent({ className, children, ...props }) {
|
|
322
|
+
const ctx = React.useContext(DropdownMenuSubContext);
|
|
323
|
+
if (!ctx?.open) return null;
|
|
324
|
+
return /* @__PURE__ */ jsx(
|
|
325
|
+
"div",
|
|
326
|
+
{
|
|
327
|
+
"data-slot": "dropdown-menu-sub-content",
|
|
328
|
+
"data-state": "open",
|
|
329
|
+
role: "menu",
|
|
330
|
+
className: cn(
|
|
331
|
+
DROPDOWN_MENU_SUB_CONTENT,
|
|
332
|
+
className
|
|
333
|
+
),
|
|
334
|
+
...props,
|
|
335
|
+
children
|
|
336
|
+
}
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
export {
|
|
340
|
+
DropdownMenu,
|
|
341
|
+
DropdownMenuCheckboxItem,
|
|
342
|
+
DropdownMenuContent,
|
|
343
|
+
DropdownMenuGroup,
|
|
344
|
+
DropdownMenuItem,
|
|
345
|
+
DropdownMenuLabel,
|
|
346
|
+
DropdownMenuPortal,
|
|
347
|
+
DropdownMenuRadioGroup,
|
|
348
|
+
DropdownMenuRadioItem,
|
|
349
|
+
DropdownMenuSeparator,
|
|
350
|
+
DropdownMenuShortcut,
|
|
351
|
+
DropdownMenuSub,
|
|
352
|
+
DropdownMenuSubContent,
|
|
353
|
+
DropdownMenuSubTrigger,
|
|
354
|
+
DropdownMenuTrigger
|
|
355
|
+
};
|
|
356
|
+
//# sourceMappingURL=dropdown-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/dropdown-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport { useFloating } from \"../primitives/use-floating\";\nimport { useDismissableLayer } from \"../primitives/dismissable-layer\";\nimport { usePresence } from \"../primitives/presence\";\nimport { useRovingFocus } from \"../primitives/use-roving-focus\";\nimport { mergeRefs } from \"../primitives/merge-refs\";\nimport { Portal } from \"../primitives/portal\";\nimport { Slot } from \"../primitives/slot\";\nimport {\n DROPDOWN_MENU_CHECK_ITEM,\n DROPDOWN_MENU_CONTENT,\n DROPDOWN_MENU_ITEM,\n DROPDOWN_MENU_ITEM_INDICATOR,\n DROPDOWN_MENU_LABEL,\n DROPDOWN_MENU_SEPARATOR,\n DROPDOWN_MENU_SHORTCUT,\n DROPDOWN_MENU_SUB_CONTENT,\n DROPDOWN_MENU_SUB_TRIGGER,\n} from \"../generated/dropdown-menu\";\n\ninterface DropdownMenuContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(\n null,\n);\n\nfunction useDropdownMenu(): DropdownMenuContextValue {\n const ctx = React.useContext(DropdownMenuContext);\n if (!ctx) throw new Error(\"DropdownMenu parts must be used within <DropdownMenu>\");\n return ctx;\n}\n\nexport interface DropdownMenuProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function DropdownMenu({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const anchorRef = React.useRef<HTMLElement | null>(null);\n return (\n <DropdownMenuContext.Provider value={{ open: isOpen, setOpen, anchorRef }}>\n <div data-slot=\"dropdown-menu\">{children}</div>\n </DropdownMenuContext.Provider>\n );\n}\n\nexport function DropdownMenuPortal({ children }: { children?: React.ReactNode }) {\n return <Portal>{children}</Portal>;\n}\n\nexport interface DropdownMenuTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function DropdownMenuTrigger({ asChild = false, onClick, ...props }: DropdownMenuTriggerProps) {\n const { open, setOpen, anchorRef } = useDropdownMenu();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"dropdown-menu-trigger\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-state={open ? \"open\" : \"closed\"}\n ref={anchorRef as React.Ref<HTMLButtonElement>}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(!open);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface DropdownMenuContentProps extends React.ComponentProps<\"div\"> {\n sideOffset?: number;\n}\n\nexport function DropdownMenuContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: DropdownMenuContentProps) {\n const { open, setOpen, anchorRef } = useDropdownMenu();\n const { isPresent, ref: presRef } = usePresence(open);\n const { floatingRef, style, side } = useFloating({\n anchorRef,\n open,\n side: \"bottom\",\n align: \"start\",\n offset: sideOffset,\n });\n const dismissRef = useDismissableLayer({\n enabled: open,\n onDismiss: () => setOpen(false),\n exclude: [anchorRef],\n });\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n // Roving focus across rendered menu items: ArrowUp/Down move the active item.\n const items = () =>\n Array.from(\n contentRef.current?.querySelectorAll<HTMLElement>(\"[role^='menuitem']\") ?? [],\n ).filter((el) => el.getAttribute(\"data-disabled\") === null);\n const { activeIndex, onKeyDown: rovingKeyDown } = useRovingFocus({\n count: 64,\n orientation: \"vertical\",\n loop: true,\n });\n React.useEffect(() => {\n if (!open) return;\n items()[activeIndex]?.focus();\n }, [open, activeIndex]);\n // Selecting an item closes the menu: items call this through context.\n const close = React.useCallback(() => setOpen(false), [setOpen]);\n if (!isPresent) return null;\n return (\n <Portal>\n <DropdownMenuCloseContext.Provider value={close}>\n <div\n data-slot=\"dropdown-menu-content\"\n data-state={open ? \"open\" : \"closed\"}\n data-side={side}\n role=\"menu\"\n tabIndex={-1}\n onKeyDown={(e) => {\n rovingKeyDown(e);\n if (e.key === \"Escape\") setOpen(false);\n }}\n ref={mergeRefs(floatingRef, dismissRef, presRef, contentRef)}\n style={style}\n className={cn(\n DROPDOWN_MENU_CONTENT,\n className,\n )}\n {...(props as Record<string, unknown>)}\n >\n {children}\n </div>\n </DropdownMenuCloseContext.Provider>\n </Portal>\n );\n}\n\nconst DropdownMenuCloseContext = React.createContext<() => void>(() => {});\n\nexport function DropdownMenuGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"dropdown-menu-group\" role=\"group\" className={className} {...props} />;\n}\n\nexport interface DropdownMenuItemProps extends React.ComponentProps<\"div\"> {\n inset?: boolean;\n variant?: \"neutral\" | \"destructive\";\n disabled?: boolean;\n}\n\nexport function DropdownMenuItem({\n className,\n inset,\n variant = \"neutral\",\n disabled,\n onClick,\n onKeyDown,\n ...props\n}: DropdownMenuItemProps) {\n const close = React.useContext(DropdownMenuCloseContext);\n return (\n <div\n data-slot=\"dropdown-menu-item\"\n data-inset={inset ? \"\" : undefined}\n data-variant={variant}\n data-disabled={disabled ? \"\" : undefined}\n role=\"menuitem\"\n tabIndex={disabled ? undefined : -1}\n className={cn(\n DROPDOWN_MENU_ITEM,\n className,\n )}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n close();\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n }}\n {...props}\n />\n );\n}\n\nexport interface DropdownMenuCheckboxItemProps extends React.ComponentProps<\"div\"> {\n checked?: boolean;\n disabled?: boolean;\n}\n\nexport function DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n disabled,\n onClick,\n ...props\n}: DropdownMenuCheckboxItemProps) {\n const close = React.useContext(DropdownMenuCloseContext);\n return (\n <div\n data-slot=\"dropdown-menu-checkbox-item\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-disabled={disabled ? \"\" : undefined}\n tabIndex={disabled ? undefined : -1}\n className={cn(\n DROPDOWN_MENU_CHECK_ITEM,\n className,\n )}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n close();\n }}\n {...props}\n >\n <span className={DROPDOWN_MENU_ITEM_INDICATOR}>\n {checked ? (\n <svg className=\"size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ) : null}\n </span>\n {children}\n </div>\n );\n}\n\ninterface DropdownMenuRadioGroupContextValue {\n value: string | undefined;\n setValue: (next: string) => void;\n}\n\nconst DropdownMenuRadioGroupContext =\n React.createContext<DropdownMenuRadioGroupContextValue | null>(null);\n\nexport interface DropdownMenuRadioGroupProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value?: string;\n onValueChange?: (value: string) => void;\n}\n\nexport function DropdownMenuRadioGroup({\n className,\n value,\n onValueChange,\n children,\n ...props\n}: DropdownMenuRadioGroupProps) {\n const ctx = React.useMemo<DropdownMenuRadioGroupContextValue>(\n () => ({ value, setValue: (next) => onValueChange?.(next) }),\n [value, onValueChange],\n );\n return (\n <DropdownMenuRadioGroupContext.Provider value={ctx}>\n <div data-slot=\"dropdown-menu-radio-group\" role=\"group\" className={className} {...props}>\n {children}\n </div>\n </DropdownMenuRadioGroupContext.Provider>\n );\n}\n\nexport interface DropdownMenuRadioItemProps extends React.ComponentProps<\"div\"> {\n value: string;\n disabled?: boolean;\n}\n\nexport function DropdownMenuRadioItem({\n className,\n children,\n value,\n disabled,\n onClick,\n ...props\n}: DropdownMenuRadioItemProps) {\n const close = React.useContext(DropdownMenuCloseContext);\n const group = React.useContext(DropdownMenuRadioGroupContext);\n const checked = group?.value === value;\n return (\n <div\n data-slot=\"dropdown-menu-radio-item\"\n role=\"menuitemradio\"\n aria-checked={checked}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-disabled={disabled ? \"\" : undefined}\n tabIndex={disabled ? undefined : -1}\n className={cn(\n DROPDOWN_MENU_CHECK_ITEM,\n className,\n )}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n group?.setValue(value);\n close();\n }}\n {...props}\n >\n <span className={DROPDOWN_MENU_ITEM_INDICATOR}>\n {checked ? (\n <svg className=\"size-2 fill-current\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n ) : null}\n </span>\n {children}\n </div>\n );\n}\n\nexport interface DropdownMenuLabelProps extends React.ComponentProps<\"div\"> {\n inset?: boolean;\n}\n\nexport function DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps) {\n return (\n <div\n data-slot=\"dropdown-menu-label\"\n data-inset={inset ? \"\" : undefined}\n className={cn(DROPDOWN_MENU_LABEL, className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dropdown-menu-separator\"\n role=\"separator\"\n className={cn(DROPDOWN_MENU_SEPARATOR, className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(DROPDOWN_MENU_SHORTCUT, className)}\n {...props}\n />\n );\n}\n\n// Sub-menus render inline (nested) rather than in a separate floating layer: the\n// sub-content is revealed in place when its trigger toggles, simplifying the\n// nesting Radix portals each level. data-state still reflects open/closed.\ninterface DropdownMenuSubContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n}\n\nconst DropdownMenuSubContext = React.createContext<DropdownMenuSubContextValue | null>(null);\n\nexport interface DropdownMenuSubProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function DropdownMenuSub({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuSubProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n return (\n <DropdownMenuSubContext.Provider value={{ open: isOpen, setOpen }}>\n <div data-slot=\"dropdown-menu-sub\">{children}</div>\n </DropdownMenuSubContext.Provider>\n );\n}\n\nexport interface DropdownMenuSubTriggerProps extends React.ComponentProps<\"div\"> {\n inset?: boolean;\n}\n\nexport function DropdownMenuSubTrigger({ className, inset, children, onClick, ...props }: DropdownMenuSubTriggerProps) {\n const ctx = React.useContext(DropdownMenuSubContext);\n return (\n <div\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset ? \"\" : undefined}\n data-state={ctx?.open ? \"open\" : \"closed\"}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={ctx?.open}\n tabIndex={-1}\n className={cn(\n DROPDOWN_MENU_SUB_TRIGGER,\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n ctx?.setOpen(!ctx.open);\n }}\n {...props}\n >\n {children}\n <svg className=\"ml-auto size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n );\n}\n\nexport function DropdownMenuSubContent({ className, children, ...props }: React.ComponentProps<\"div\">) {\n const ctx = React.useContext(DropdownMenuSubContext);\n if (!ctx?.open) return null;\n return (\n <div\n data-slot=\"dropdown-menu-sub-content\"\n data-state=\"open\"\n role=\"menu\"\n className={cn(\n DROPDOWN_MENU_SUB_CONTENT,\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import {
|
|
5
|
+
EMPTY,
|
|
6
|
+
EMPTY_CONTENT,
|
|
7
|
+
EMPTY_DESCRIPTION,
|
|
8
|
+
EMPTY_HEADER,
|
|
9
|
+
EMPTY_MEDIA_BASE,
|
|
10
|
+
EMPTY_TITLE,
|
|
11
|
+
emptyMediaVariants
|
|
12
|
+
} from "../generated/empty.js";
|
|
13
|
+
function Empty({ className, ...props }) {
|
|
14
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "empty", className: cn(EMPTY, className), ...props });
|
|
15
|
+
}
|
|
16
|
+
function EmptyHeader({
|
|
17
|
+
className,
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
"data-slot": "empty-header",
|
|
24
|
+
className: cn(EMPTY_HEADER, className),
|
|
25
|
+
...props
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
function EmptyMedia({
|
|
30
|
+
className,
|
|
31
|
+
variant = "bare",
|
|
32
|
+
...props
|
|
33
|
+
}) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
"data-slot": "empty-icon",
|
|
38
|
+
"data-variant": variant,
|
|
39
|
+
className: cn(EMPTY_MEDIA_BASE, emptyMediaVariants[variant], className),
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
function EmptyTitle({
|
|
45
|
+
className,
|
|
46
|
+
...props
|
|
47
|
+
}) {
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
"data-slot": "empty-title",
|
|
52
|
+
className: cn(EMPTY_TITLE, className),
|
|
53
|
+
...props
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
function EmptyDescription({
|
|
58
|
+
className,
|
|
59
|
+
...props
|
|
60
|
+
}) {
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
"data-slot": "empty-description",
|
|
65
|
+
className: cn(EMPTY_DESCRIPTION, className),
|
|
66
|
+
...props
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
function EmptyContent({
|
|
71
|
+
className,
|
|
72
|
+
...props
|
|
73
|
+
}) {
|
|
74
|
+
return /* @__PURE__ */ jsx(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
"data-slot": "empty-content",
|
|
78
|
+
className: cn(EMPTY_CONTENT, className),
|
|
79
|
+
...props
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
Empty,
|
|
85
|
+
EmptyContent,
|
|
86
|
+
EmptyDescription,
|
|
87
|
+
EmptyHeader,
|
|
88
|
+
EmptyMedia,
|
|
89
|
+
EmptyTitle
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=empty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/empty.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n EMPTY,\n EMPTY_CONTENT,\n EMPTY_DESCRIPTION,\n EMPTY_HEADER,\n EMPTY_MEDIA_BASE,\n EMPTY_TITLE,\n emptyMediaVariants,\n type EmptyMediaVariant,\n} from \"../generated/empty\";\n\nexport type { EmptyMediaVariant };\n\nexport function Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"empty\" className={cn(EMPTY, className)} {...props} />\n );\n}\n\nexport function EmptyHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(EMPTY_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport interface EmptyMediaProps extends React.ComponentProps<\"div\"> {\n variant?: EmptyMediaVariant;\n}\n\nexport function EmptyMedia({\n className,\n variant = \"bare\",\n ...props\n}: EmptyMediaProps) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(EMPTY_MEDIA_BASE, emptyMediaVariants[variant], className)}\n {...props}\n />\n );\n}\n\nexport function EmptyTitle({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(EMPTY_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function EmptyDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(EMPTY_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n\nexport function EmptyContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(EMPTY_CONTENT, className)}\n {...props}\n />\n );\n}\n"],"mappings":"AAiBI;AAjBJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAIA,SAAS,MAAM,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE,oBAAC,SAAI,aAAU,SAAQ,WAAW,GAAG,OAAO,SAAS,GAAI,GAAG,OAAO;AAEvE;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,SAAS;AAAA,MACpC,GAAG;AAAA;AAAA,EACN;AAEJ;AAMO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,kBAAkB,mBAAmB,OAAO,GAAG,SAAS;AAAA,MACrE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,aAAa,SAAS;AAAA,MACnC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mBAAmB,SAAS;AAAA,MACzC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,eAAe,SAAS;AAAA,MACrC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
const FieldControlContext = React.createContext(null);
|
|
4
|
+
const DEV = typeof process !== "undefined" && process.env.NODE_ENV !== "production";
|
|
5
|
+
function useFieldClaims() {
|
|
6
|
+
const claims = React.useRef(0);
|
|
7
|
+
return React.useCallback(() => {
|
|
8
|
+
claims.current += 1;
|
|
9
|
+
if (DEV && claims.current === 2) {
|
|
10
|
+
console.warn(
|
|
11
|
+
"@evinvest/uikit: two controls took the same <Field> id. A Field labels one control; give the others an `id` of their own."
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
return () => {
|
|
15
|
+
claims.current -= 1;
|
|
16
|
+
};
|
|
17
|
+
}, []);
|
|
18
|
+
}
|
|
19
|
+
function useFieldControlId(id) {
|
|
20
|
+
const field = React.useContext(FieldControlContext);
|
|
21
|
+
const fromField = id === void 0 ? field : null;
|
|
22
|
+
React.useEffect(() => fromField?.claim(), [fromField]);
|
|
23
|
+
return id ?? fromField?.id;
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
FieldControlContext,
|
|
27
|
+
useFieldClaims,
|
|
28
|
+
useFieldControlId
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=field-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/field-context.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\n/**\n * The id a `<Field>` hands to the one control it labels. `React.useId` is\n * derived from the position in the tree, so the server render and the hydrating\n * client agree on it — a module counter would not, and the label's `for` would\n * point at nothing after hydration.\n */\nexport interface FieldControl {\n id: string;\n /** Records a control taking the id; returns the release. */\n claim: () => () => void;\n}\n\nexport const FieldControlContext = React.createContext<FieldControl | null>(null);\n\nconst DEV = typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\";\n\n/** The `claim` of a `Field`: warns in development when a second control takes the id. */\nexport function useFieldClaims(): () => () => void {\n const claims = React.useRef(0);\n return React.useCallback(() => {\n claims.current += 1;\n if (DEV && claims.current === 2) {\n console.warn(\n \"@evinvest/uikit: two controls took the same <Field> id. A Field labels one control; \" +\n \"give the others an `id` of their own.\",\n );\n }\n return () => {\n claims.current -= 1;\n };\n }, []);\n}\n\n/** The caller's `id` when given, else the enclosing `<Field>`'s, else none. */\nexport function useFieldControlId(id: string | undefined): string | undefined {\n const field = React.useContext(FieldControlContext);\n const fromField = id === undefined ? field : null;\n React.useEffect(() => fromField?.claim(), [fromField]);\n return id ?? fromField?.id;\n}\n"],"mappings":";AAEA,YAAY,WAAW;AAchB,MAAM,sBAAsB,MAAM,cAAmC,IAAI;AAEhF,MAAM,MAAM,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa;AAGhE,SAAS,iBAAmC;AACjD,QAAM,SAAS,MAAM,OAAO,CAAC;AAC7B,SAAO,MAAM,YAAY,MAAM;AAC7B,WAAO,WAAW;AAClB,QAAI,OAAO,OAAO,YAAY,GAAG;AAC/B,cAAQ;AAAA,QACN;AAAA,MAEF;AAAA,IACF;AACA,WAAO,MAAM;AACX,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AACP;AAGO,SAAS,kBAAkB,IAA4C;AAC5E,QAAM,QAAQ,MAAM,WAAW,mBAAmB;AAClD,QAAM,YAAY,OAAO,SAAY,QAAQ;AAC7C,QAAM,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC,SAAS,CAAC;AACrD,SAAO,MAAM,WAAW;AAC1B;","names":[]}
|