@ensolid/radix 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Accordion/Accordion.d.ts +79 -0
- package/dist/components/Accordion/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion/Accordion.js +193 -0
- package/dist/components/Accordion/Accordion.js.map +1 -0
- package/dist/components/Accordion/index.d.ts +2 -0
- package/dist/components/Accordion/index.d.ts.map +1 -0
- package/dist/components/AlertDialog/AlertDialog.d.ts +89 -0
- package/dist/components/AlertDialog/AlertDialog.d.ts.map +1 -0
- package/dist/components/AlertDialog/AlertDialog.js +235 -0
- package/dist/components/AlertDialog/AlertDialog.js.map +1 -0
- package/dist/components/AlertDialog/index.d.ts +2 -0
- package/dist/components/AlertDialog/index.d.ts.map +1 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts +14 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts.map +1 -0
- package/dist/components/AspectRatio/AspectRatio.js +25 -0
- package/dist/components/AspectRatio/AspectRatio.js.map +1 -0
- package/dist/components/AspectRatio/index.d.ts +2 -0
- package/dist/components/AspectRatio/index.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.d.ts +41 -0
- package/dist/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.js +144 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +27 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +49 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/index.d.ts +2 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -0
- package/dist/components/Collapsible/Collapsible.d.ts +54 -0
- package/dist/components/Collapsible/Collapsible.d.ts.map +1 -0
- package/dist/components/Collapsible/Collapsible.js +110 -0
- package/dist/components/Collapsible/Collapsible.js.map +1 -0
- package/dist/components/Collapsible/index.d.ts +2 -0
- package/dist/components/Collapsible/index.d.ts.map +1 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +89 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu/ContextMenu.js +263 -0
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/components/ContextMenu/index.d.ts +2 -0
- package/dist/components/ContextMenu/index.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.d.ts +87 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.js +218 -0
- package/dist/components/Dialog/Dialog.js.map +1 -0
- package/dist/components/Dialog/index.d.ts +2 -0
- package/dist/components/Dialog/index.d.ts.map +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +81 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts.map +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +244 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/DropdownMenu/index.d.ts +2 -0
- package/dist/components/DropdownMenu/index.d.ts.map +1 -0
- package/dist/components/HoverCard/HoverCard.d.ts +63 -0
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -0
- package/dist/components/HoverCard/HoverCard.js +199 -0
- package/dist/components/HoverCard/HoverCard.js.map +1 -0
- package/dist/components/HoverCard/index.d.ts +2 -0
- package/dist/components/HoverCard/index.d.ts.map +1 -0
- package/dist/components/Label/Label.d.ts +14 -0
- package/dist/components/Label/Label.d.ts.map +1 -0
- package/dist/components/Label/Label.js +23 -0
- package/dist/components/Label/Label.js.map +1 -0
- package/dist/components/Label/index.d.ts +2 -0
- package/dist/components/Label/index.d.ts.map +1 -0
- package/dist/components/Menubar/Menubar.d.ts +85 -0
- package/dist/components/Menubar/Menubar.d.ts.map +1 -0
- package/dist/components/Menubar/Menubar.js +299 -0
- package/dist/components/Menubar/Menubar.js.map +1 -0
- package/dist/components/Menubar/index.d.ts +2 -0
- package/dist/components/Menubar/index.d.ts.map +1 -0
- package/dist/components/NavigationMenu/NavigationMenu.d.ts +105 -0
- package/dist/components/NavigationMenu/NavigationMenu.d.ts.map +1 -0
- package/dist/components/NavigationMenu/NavigationMenu.js +320 -0
- package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -0
- package/dist/components/NavigationMenu/index.d.ts +2 -0
- package/dist/components/NavigationMenu/index.d.ts.map +1 -0
- package/dist/components/Popover/Popover.d.ts +52 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/Popover.js +176 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/index.d.ts +2 -0
- package/dist/components/Popover/index.d.ts.map +1 -0
- package/dist/components/Progress/Progress.d.ts +19 -0
- package/dist/components/Progress/Progress.d.ts.map +1 -0
- package/dist/components/Progress/Progress.js +44 -0
- package/dist/components/Progress/Progress.js.map +1 -0
- package/dist/components/Progress/index.d.ts +2 -0
- package/dist/components/Progress/index.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +54 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.js +100 -0
- package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/components/RadioGroup/index.d.ts +2 -0
- package/dist/components/RadioGroup/index.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +58 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.js +91 -0
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
- package/dist/components/ScrollArea/index.d.ts +2 -0
- package/dist/components/ScrollArea/index.d.ts.map +1 -0
- package/dist/components/Select/Select.d.ts +80 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.js +240 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/index.d.ts +2 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Separator/Separator.d.ts +15 -0
- package/dist/components/Separator/Separator.d.ts.map +1 -0
- package/dist/components/Separator/Separator.js +30 -0
- package/dist/components/Separator/Separator.js.map +1 -0
- package/dist/components/Separator/index.d.ts +2 -0
- package/dist/components/Separator/index.d.ts.map +1 -0
- package/dist/components/Slider/Slider.d.ts +37 -0
- package/dist/components/Slider/Slider.d.ts.map +1 -0
- package/dist/components/Slider/Slider.js +63 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/Switch/Switch.d.ts +27 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -0
- package/dist/components/Switch/Switch.js +50 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/index.d.ts +2 -0
- package/dist/components/Switch/index.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts +72 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.js +150 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Tabs/index.d.ts.map +1 -0
- package/dist/components/Toggle/Toggle.d.ts +22 -0
- package/dist/components/Toggle/Toggle.d.ts.map +1 -0
- package/dist/components/Toggle/Toggle.js +51 -0
- package/dist/components/Toggle/Toggle.js.map +1 -0
- package/dist/components/Toggle/index.d.ts +2 -0
- package/dist/components/Toggle/index.d.ts.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +67 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.js +119 -0
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -0
- package/dist/components/ToggleGroup/index.d.ts +2 -0
- package/dist/components/ToggleGroup/index.d.ts.map +1 -0
- package/dist/components/Toolbar/Toolbar.d.ts +82 -0
- package/dist/components/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/components/Toolbar/Toolbar.js +110 -0
- package/dist/components/Toolbar/Toolbar.js.map +1 -0
- package/dist/components/Toolbar/index.d.ts +2 -0
- package/dist/components/Toolbar/index.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +56 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +155 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/components/Tooltip/index.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +9 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js +23 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -0
- package/dist/components/VisuallyHidden/index.d.ts +2 -0
- package/dist/components/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +28 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +140 -0
- package/dist/index.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { delegateEvents, isServer, createComponent, template, spread, mergeProps, insert, Portal } from "solid-js/web";
|
|
2
|
+
import { createContext, splitProps, createSignal, onMount, createEffect, onCleanup, Show, useContext } from "solid-js";
|
|
3
|
+
var _tmpl$ = /* @__PURE__ */ template(`<button type=button>`), _tmpl$2 = /* @__PURE__ */ template(`<div>`), _tmpl$3 = /* @__PURE__ */ template(`<div role=dialog>`), _tmpl$4 = /* @__PURE__ */ template(`<h2>`), _tmpl$5 = /* @__PURE__ */ template(`<p>`);
|
|
4
|
+
const DialogContext = createContext();
|
|
5
|
+
const useDialogContext = () => {
|
|
6
|
+
const context = useContext(DialogContext);
|
|
7
|
+
if (!context) {
|
|
8
|
+
throw new Error("Dialog components must be used within Dialog");
|
|
9
|
+
}
|
|
10
|
+
return context;
|
|
11
|
+
};
|
|
12
|
+
const DialogBase = (props) => {
|
|
13
|
+
const [local] = splitProps(props, ["open", "defaultOpen", "onOpenChange", "modal", "class", "children"]);
|
|
14
|
+
const [internalOpen, setInternalOpen] = createSignal(local.open ?? local.defaultOpen ?? false);
|
|
15
|
+
const isControlled = () => local.open !== void 0;
|
|
16
|
+
const open = () => isControlled() ? local.open : internalOpen();
|
|
17
|
+
const handleOpenChange = (newOpen) => {
|
|
18
|
+
if (!isControlled()) {
|
|
19
|
+
setInternalOpen(newOpen);
|
|
20
|
+
}
|
|
21
|
+
local.onOpenChange?.(newOpen);
|
|
22
|
+
};
|
|
23
|
+
const handleKeyDown = (e) => {
|
|
24
|
+
if (e.key === "Escape" && open()) {
|
|
25
|
+
handleOpenChange(false);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
onMount(() => {
|
|
29
|
+
if (!isServer && open()) {
|
|
30
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
31
|
+
document.body.style.overflow = "hidden";
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
createEffect(() => {
|
|
35
|
+
if (!isServer) {
|
|
36
|
+
if (open()) {
|
|
37
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
38
|
+
document.body.style.overflow = "hidden";
|
|
39
|
+
} else {
|
|
40
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
41
|
+
document.body.style.overflow = "";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
onCleanup(() => {
|
|
46
|
+
if (!isServer) {
|
|
47
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
48
|
+
document.body.style.overflow = "";
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const contextValue = {
|
|
52
|
+
open,
|
|
53
|
+
setOpen: handleOpenChange,
|
|
54
|
+
modal: local.modal ?? true
|
|
55
|
+
};
|
|
56
|
+
return createComponent(DialogContext.Provider, {
|
|
57
|
+
value: contextValue,
|
|
58
|
+
get children() {
|
|
59
|
+
return local.children;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
const Dialog = Object.assign(DialogBase, {
|
|
64
|
+
Trigger: null,
|
|
65
|
+
Overlay: null,
|
|
66
|
+
Content: null,
|
|
67
|
+
Title: null,
|
|
68
|
+
Description: null,
|
|
69
|
+
Close: null
|
|
70
|
+
});
|
|
71
|
+
const DialogTrigger = (props) => {
|
|
72
|
+
const [local, others] = splitProps(props, ["children", "asChild", "class", "onClick"]);
|
|
73
|
+
const context = useDialogContext();
|
|
74
|
+
const handleClick = (e) => {
|
|
75
|
+
if (typeof local.onClick === "function") {
|
|
76
|
+
local.onClick(e);
|
|
77
|
+
}
|
|
78
|
+
context.setOpen(true);
|
|
79
|
+
};
|
|
80
|
+
return (() => {
|
|
81
|
+
var _el$ = _tmpl$();
|
|
82
|
+
_el$.$$click = handleClick;
|
|
83
|
+
spread(_el$, mergeProps({
|
|
84
|
+
get ["class"]() {
|
|
85
|
+
return local.class;
|
|
86
|
+
}
|
|
87
|
+
}, others), false, true);
|
|
88
|
+
insert(_el$, () => local.children);
|
|
89
|
+
return _el$;
|
|
90
|
+
})();
|
|
91
|
+
};
|
|
92
|
+
const DialogOverlay = (props) => {
|
|
93
|
+
const [local, others] = splitProps(props, ["children", "class", "onClick"]);
|
|
94
|
+
const context = useDialogContext();
|
|
95
|
+
const handleClick = (e) => {
|
|
96
|
+
if (typeof local.onClick === "function") {
|
|
97
|
+
local.onClick(e);
|
|
98
|
+
}
|
|
99
|
+
if (e.target === e.currentTarget && context.modal) {
|
|
100
|
+
context.setOpen(false);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
return (() => {
|
|
104
|
+
var _el$2 = _tmpl$2();
|
|
105
|
+
_el$2.$$click = handleClick;
|
|
106
|
+
spread(_el$2, mergeProps({
|
|
107
|
+
get ["class"]() {
|
|
108
|
+
return local.class;
|
|
109
|
+
},
|
|
110
|
+
get ["data-state"]() {
|
|
111
|
+
return context.open() ? "open" : "closed";
|
|
112
|
+
}
|
|
113
|
+
}, others), false, true);
|
|
114
|
+
insert(_el$2, () => local.children);
|
|
115
|
+
return _el$2;
|
|
116
|
+
})();
|
|
117
|
+
};
|
|
118
|
+
const DialogContent = (props) => {
|
|
119
|
+
const [local, others] = splitProps(props, ["children", "class"]);
|
|
120
|
+
const context = useDialogContext();
|
|
121
|
+
return createComponent(Show, {
|
|
122
|
+
get when() {
|
|
123
|
+
return context.open();
|
|
124
|
+
},
|
|
125
|
+
get children() {
|
|
126
|
+
return createComponent(Portal, {
|
|
127
|
+
get mount() {
|
|
128
|
+
return !isServer ? document.body : void 0;
|
|
129
|
+
},
|
|
130
|
+
get children() {
|
|
131
|
+
return [createComponent(DialogOverlay, {
|
|
132
|
+
"class": "fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
|
|
133
|
+
}), (() => {
|
|
134
|
+
var _el$3 = _tmpl$3();
|
|
135
|
+
spread(_el$3, mergeProps({
|
|
136
|
+
get ["class"]() {
|
|
137
|
+
return local.class;
|
|
138
|
+
},
|
|
139
|
+
get ["aria-modal"]() {
|
|
140
|
+
return context.modal;
|
|
141
|
+
},
|
|
142
|
+
get ["data-state"]() {
|
|
143
|
+
return context.open() ? "open" : "closed";
|
|
144
|
+
}
|
|
145
|
+
}, others), false, true);
|
|
146
|
+
insert(_el$3, () => local.children);
|
|
147
|
+
return _el$3;
|
|
148
|
+
})()];
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const DialogTitle = (props) => {
|
|
155
|
+
const [local, others] = splitProps(props, ["children", "class"]);
|
|
156
|
+
return (() => {
|
|
157
|
+
var _el$4 = _tmpl$4();
|
|
158
|
+
spread(_el$4, mergeProps({
|
|
159
|
+
get ["class"]() {
|
|
160
|
+
return local.class;
|
|
161
|
+
}
|
|
162
|
+
}, others), false, true);
|
|
163
|
+
insert(_el$4, () => local.children);
|
|
164
|
+
return _el$4;
|
|
165
|
+
})();
|
|
166
|
+
};
|
|
167
|
+
const DialogDescription = (props) => {
|
|
168
|
+
const [local, others] = splitProps(props, ["children", "class"]);
|
|
169
|
+
return (() => {
|
|
170
|
+
var _el$5 = _tmpl$5();
|
|
171
|
+
spread(_el$5, mergeProps({
|
|
172
|
+
get ["class"]() {
|
|
173
|
+
return local.class;
|
|
174
|
+
}
|
|
175
|
+
}, others), false, true);
|
|
176
|
+
insert(_el$5, () => local.children);
|
|
177
|
+
return _el$5;
|
|
178
|
+
})();
|
|
179
|
+
};
|
|
180
|
+
const DialogClose = (props) => {
|
|
181
|
+
const [local, others] = splitProps(props, ["children", "class", "onClick"]);
|
|
182
|
+
const context = useDialogContext();
|
|
183
|
+
const handleClick = (e) => {
|
|
184
|
+
if (typeof local.onClick === "function") {
|
|
185
|
+
local.onClick(e);
|
|
186
|
+
}
|
|
187
|
+
context.setOpen(false);
|
|
188
|
+
};
|
|
189
|
+
return (() => {
|
|
190
|
+
var _el$6 = _tmpl$();
|
|
191
|
+
_el$6.$$click = handleClick;
|
|
192
|
+
spread(_el$6, mergeProps({
|
|
193
|
+
get ["class"]() {
|
|
194
|
+
return local.class;
|
|
195
|
+
}
|
|
196
|
+
}, others), false, true);
|
|
197
|
+
insert(_el$6, () => local.children);
|
|
198
|
+
return _el$6;
|
|
199
|
+
})();
|
|
200
|
+
};
|
|
201
|
+
Dialog.Trigger = DialogTrigger;
|
|
202
|
+
Dialog.Overlay = DialogOverlay;
|
|
203
|
+
Dialog.Content = DialogContent;
|
|
204
|
+
Dialog.Title = DialogTitle;
|
|
205
|
+
Dialog.Description = DialogDescription;
|
|
206
|
+
Dialog.Close = DialogClose;
|
|
207
|
+
delegateEvents(["click"]);
|
|
208
|
+
export {
|
|
209
|
+
Dialog,
|
|
210
|
+
DialogClose,
|
|
211
|
+
DialogContent,
|
|
212
|
+
DialogDescription,
|
|
213
|
+
DialogOverlay,
|
|
214
|
+
DialogTitle,
|
|
215
|
+
DialogTrigger,
|
|
216
|
+
useDialogContext
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=Dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { isServer } from \"solid-js/web\";\nimport type { Component, JSX } from \"solid-js\";\n\ninterface DialogContextValue {\n open: () => boolean;\n setOpen: (open: boolean) => void;\n modal: boolean;\n}\n\nconst DialogContext = createContext<DialogContextValue>();\n\nexport const useDialogContext = () => {\n const context = useContext(DialogContext);\n if (!context) {\n throw new Error(\"Dialog components must be used within Dialog\");\n }\n return context;\n};\n\nexport interface DialogProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 是否打开\n */\n open?: boolean;\n /**\n * 默认打开状态\n */\n defaultOpen?: boolean;\n /**\n * 打开状态变化回调\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * 是否模态对话框\n * @default true\n */\n modal?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst DialogBase: Component<DialogProps> = (props) => {\n const [local] = splitProps(props, [\n \"open\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"modal\",\n \"class\",\n \"children\",\n ]);\n\n const [internalOpen, setInternalOpen] = createSignal(\n local.open ?? local.defaultOpen ?? false,\n );\n\n const isControlled = () => local.open !== undefined;\n const open = () => (isControlled() ? local.open! : internalOpen());\n\n const handleOpenChange = (newOpen: boolean) => {\n if (!isControlled()) {\n setInternalOpen(newOpen);\n }\n local.onOpenChange?.(newOpen);\n };\n\n // ESC 键关闭\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open()) {\n handleOpenChange(false);\n }\n };\n\n onMount(() => {\n if (!isServer && open()) {\n document.addEventListener(\"keydown\", handleKeyDown);\n // 防止背景滚动\n document.body.style.overflow = \"hidden\";\n }\n });\n\n createEffect(() => {\n if (!isServer) {\n if (open()) {\n document.addEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"hidden\";\n } else {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"\";\n }\n }\n });\n\n onCleanup(() => {\n if (!isServer) {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"\";\n }\n });\n\n const contextValue: DialogContextValue = {\n open,\n setOpen: handleOpenChange,\n modal: local.modal ?? true,\n };\n\n return (\n <DialogContext.Provider value={contextValue}>\n {local.children}\n </DialogContext.Provider>\n );\n};\n\nexport interface DialogComponent extends Component<DialogProps> {\n Trigger: Component<DialogTriggerProps>;\n Overlay: Component<DialogOverlayProps>;\n Content: Component<DialogContentProps>;\n Title: Component<DialogTitleProps>;\n Description: Component<DialogDescriptionProps>;\n Close: Component<DialogCloseProps>;\n}\n\nexport const Dialog = Object.assign(DialogBase, {\n Trigger: null as unknown as Component<DialogTriggerProps>,\n Overlay: null as unknown as Component<DialogOverlayProps>,\n Content: null as unknown as Component<DialogContentProps>,\n Title: null as unknown as Component<DialogTitleProps>,\n Description: null as unknown as Component<DialogDescriptionProps>,\n Close: null as unknown as Component<DialogCloseProps>,\n}) as DialogComponent;\n\nexport interface DialogTriggerProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 对话框实例(通过 asChild 模式传递)\n */\n asChild?: boolean;\n}\n\nexport const DialogTrigger: Component<DialogTriggerProps> = (props) => {\n const [local, others] = splitProps(props, [\n \"children\",\n \"asChild\",\n \"class\",\n \"onClick\",\n ]);\n const context = useDialogContext();\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === \"function\") {\n local.onClick(e);\n }\n context.setOpen(true);\n };\n\n return (\n <button type=\"button\" class={local.class} onClick={handleClick} {...others}>\n {local.children}\n </button>\n );\n};\n\nexport interface DialogContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport interface DialogOverlayProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const DialogOverlay: Component<DialogOverlayProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\", \"onClick\"]);\n const context = useDialogContext();\n\n const handleClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (typeof local.onClick === \"function\") {\n local.onClick(e);\n }\n // 点击遮罩层关闭对话框\n if (e.target === e.currentTarget && context.modal) {\n context.setOpen(false);\n }\n };\n\n return (\n <div\n class={local.class}\n data-state={context.open() ? \"open\" : \"closed\"}\n onClick={handleClick}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport const DialogContent: Component<DialogContentProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"]);\n const context = useDialogContext();\n\n return (\n <Show when={context.open()}>\n <Portal mount={!isServer ? document.body : undefined}>\n <DialogOverlay class=\"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" />\n <div\n class={local.class}\n role=\"dialog\"\n aria-modal={context.modal}\n data-state={context.open() ? \"open\" : \"closed\"}\n {...others}\n >\n {local.children}\n </div>\n </Portal>\n </Show>\n );\n};\n\nexport interface DialogTitleProps\n extends JSX.HTMLAttributes<HTMLHeadingElement> {\n /**\n * 标题文本\n */\n children?: JSX.Element;\n}\n\nexport const DialogTitle: Component<DialogTitleProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"]);\n\n return (\n <h2 class={local.class} {...others}>\n {local.children}\n </h2>\n );\n};\n\nexport interface DialogDescriptionProps\n extends JSX.HTMLAttributes<HTMLParagraphElement> {\n /**\n * 描述文本\n */\n children?: JSX.Element;\n}\n\nexport const DialogDescription: Component<DialogDescriptionProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"]);\n\n return (\n <p class={local.class} {...others}>\n {local.children}\n </p>\n );\n};\n\nexport interface DialogCloseProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const DialogClose: Component<DialogCloseProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\", \"onClick\"]);\n const context = useDialogContext();\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === \"function\") {\n local.onClick(e);\n }\n context.setOpen(false);\n };\n\n return (\n <button type=\"button\" class={local.class} onClick={handleClick} {...others}>\n {local.children}\n </button>\n );\n};\n\nDialog.Trigger = DialogTrigger;\nDialog.Overlay = DialogOverlay;\nDialog.Content = DialogContent;\nDialog.Title = DialogTitle;\nDialog.Description = DialogDescription;\nDialog.Close = DialogClose;\n"],"names":["DialogContext","createContext","useDialogContext","context","useContext","Error","DialogBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","isControlled","undefined","handleOpenChange","newOpen","onOpenChange","handleKeyDown","e","key","onMount","isServer","document","addEventListener","body","style","overflow","createEffect","removeEventListener","onCleanup","contextValue","setOpen","modal","_$createComponent","Provider","value","children","Dialog","Object","assign","Trigger","Overlay","Content","Title","Description","Close","DialogTrigger","others","handleClick","onClick","_el$","_tmpl$","$$click","_$spread","_$mergeProps","class","_$insert","DialogOverlay","target","currentTarget","_el$2","_tmpl$2","DialogContent","Show","when","Portal","mount","_el$3","_tmpl$3","DialogTitle","_el$4","_tmpl$4","DialogDescription","_el$5","_tmpl$5","DialogClose","_el$6","_$delegateEvents"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Dialog/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Component, JSX } from 'solid-js';
|
|
2
|
+
interface DropdownMenuContextValue {
|
|
3
|
+
open: () => boolean;
|
|
4
|
+
setOpen: (open: boolean) => void;
|
|
5
|
+
triggerRef: () => HTMLElement | undefined;
|
|
6
|
+
setTriggerRef: (ref: HTMLElement | undefined) => void;
|
|
7
|
+
setContentElement: (el: HTMLElement | undefined) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const useDropdownMenuContext: () => DropdownMenuContextValue;
|
|
10
|
+
export interface DropdownMenuProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
11
|
+
/**
|
|
12
|
+
* 是否打开
|
|
13
|
+
*/
|
|
14
|
+
open?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* 默认打开状态
|
|
17
|
+
*/
|
|
18
|
+
defaultOpen?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 打开状态变化回调
|
|
21
|
+
*/
|
|
22
|
+
onOpenChange?: (open: boolean) => void;
|
|
23
|
+
/**
|
|
24
|
+
* 子元素
|
|
25
|
+
*/
|
|
26
|
+
children?: JSX.Element;
|
|
27
|
+
}
|
|
28
|
+
export interface DropdownMenuComponent extends Component<DropdownMenuProps> {
|
|
29
|
+
Trigger: Component<DropdownMenuTriggerProps>;
|
|
30
|
+
Content: Component<DropdownMenuContentProps>;
|
|
31
|
+
Item: Component<DropdownMenuItemProps>;
|
|
32
|
+
Label: Component<DropdownMenuLabelProps>;
|
|
33
|
+
Separator: Component<DropdownMenuSeparatorProps>;
|
|
34
|
+
}
|
|
35
|
+
export declare const DropdownMenu: DropdownMenuComponent;
|
|
36
|
+
export interface DropdownMenuTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
37
|
+
/**
|
|
38
|
+
* 子元素
|
|
39
|
+
*/
|
|
40
|
+
children?: JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* 是否作为子元素传递
|
|
43
|
+
*/
|
|
44
|
+
asChild?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare const DropdownMenuTrigger: Component<DropdownMenuTriggerProps>;
|
|
47
|
+
export interface DropdownMenuContentProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
48
|
+
/**
|
|
49
|
+
* 子元素
|
|
50
|
+
*/
|
|
51
|
+
children?: JSX.Element;
|
|
52
|
+
}
|
|
53
|
+
export declare const DropdownMenuContent: Component<DropdownMenuContentProps>;
|
|
54
|
+
export interface DropdownMenuItemProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
55
|
+
/**
|
|
56
|
+
* 子元素
|
|
57
|
+
*/
|
|
58
|
+
children?: JSX.Element;
|
|
59
|
+
/**
|
|
60
|
+
* 是否禁用
|
|
61
|
+
* @default false
|
|
62
|
+
*/
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export declare const DropdownMenuItem: Component<DropdownMenuItemProps>;
|
|
66
|
+
export interface DropdownMenuLabelProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
67
|
+
/**
|
|
68
|
+
* 子元素
|
|
69
|
+
*/
|
|
70
|
+
children?: JSX.Element;
|
|
71
|
+
}
|
|
72
|
+
export declare const DropdownMenuLabel: Component<DropdownMenuLabelProps>;
|
|
73
|
+
export interface DropdownMenuSeparatorProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
74
|
+
/**
|
|
75
|
+
* 子元素
|
|
76
|
+
*/
|
|
77
|
+
children?: JSX.Element;
|
|
78
|
+
}
|
|
79
|
+
export declare const DropdownMenuSeparator: Component<DropdownMenuSeparatorProps>;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=DropdownMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/C,UAAU,wBAAwB;IAChC,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,aAAa,EAAE,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,CAAC;IACtD,iBAAiB,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,CAAC;CAC1D;AAID,eAAO,MAAM,sBAAsB,gCAMlC,CAAC;AAEF,MAAM,WAAW,iBAAkB,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IAC3E;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACxB;AAwFD,MAAM,WAAW,qBAAsB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACzE,OAAO,EAAE,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC7C,OAAO,EAAE,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC7C,IAAI,EAAE,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACzC,SAAS,EAAE,SAAS,CAAC,0BAA0B,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,YAAY,EAMnB,qBAAqB,CAAC;AAE5B,MAAM,WAAW,wBAAyB,SAAQ,GAAG,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAC3F;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,wBAAwB,CA6BnE,CAAC;AAEF,MAAM,WAAW,wBAAyB,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IAClF;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,wBAAwB,CAoEnE,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IAC/E;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CAwB7D,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IAChF;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,EAAE,SAAS,CAAC,sBAAsB,CAQ/D,CAAC;AAEF,MAAM,WAAW,0BAA2B,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IACpF;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,0BAA0B,CAUvE,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { delegateEvents, isServer, createComponent, template, spread, mergeProps, insert, Portal, use } from "solid-js/web";
|
|
2
|
+
import { createContext, splitProps, createSignal, createEffect, onCleanup, onMount, Show, useContext } from "solid-js";
|
|
3
|
+
var _tmpl$ = /* @__PURE__ */ template(`<button type=button>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=menu style=top:0px;left:0px>`), _tmpl$3 = /* @__PURE__ */ template(`<div role=menuitem>`), _tmpl$4 = /* @__PURE__ */ template(`<div>`), _tmpl$5 = /* @__PURE__ */ template(`<div role=separator>`);
|
|
4
|
+
const DropdownMenuContext = createContext();
|
|
5
|
+
const useDropdownMenuContext = () => {
|
|
6
|
+
const context = useContext(DropdownMenuContext);
|
|
7
|
+
if (!context) {
|
|
8
|
+
throw new Error("DropdownMenu components must be used within DropdownMenu");
|
|
9
|
+
}
|
|
10
|
+
return context;
|
|
11
|
+
};
|
|
12
|
+
const DropdownMenuBase = (props) => {
|
|
13
|
+
const [local] = splitProps(props, ["open", "defaultOpen", "onOpenChange", "children"]);
|
|
14
|
+
const [internalOpen, setInternalOpen] = createSignal(local.open ?? local.defaultOpen ?? false);
|
|
15
|
+
const [triggerRef, setTriggerRef] = createSignal();
|
|
16
|
+
const isControlled = () => local.open !== void 0;
|
|
17
|
+
const open = () => isControlled() ? local.open : internalOpen();
|
|
18
|
+
const handleOpenChange = (newOpen) => {
|
|
19
|
+
if (!isControlled()) {
|
|
20
|
+
setInternalOpen(newOpen);
|
|
21
|
+
}
|
|
22
|
+
local.onOpenChange?.(newOpen);
|
|
23
|
+
};
|
|
24
|
+
let contentElement;
|
|
25
|
+
const setContentElement = (el) => {
|
|
26
|
+
contentElement = el;
|
|
27
|
+
};
|
|
28
|
+
const handleClickOutside = (e) => {
|
|
29
|
+
if (open() && !isServer) {
|
|
30
|
+
const target = e.target;
|
|
31
|
+
const trigger = triggerRef();
|
|
32
|
+
if (trigger && contentElement) {
|
|
33
|
+
if (!trigger.contains(target) && !contentElement.contains(target)) {
|
|
34
|
+
handleOpenChange(false);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const handleKeyDown = (e) => {
|
|
40
|
+
if (e.key === "Escape" && open()) {
|
|
41
|
+
handleOpenChange(false);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
createEffect(() => {
|
|
45
|
+
if (!isServer) {
|
|
46
|
+
if (open()) {
|
|
47
|
+
setTimeout(() => {
|
|
48
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
49
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
50
|
+
}, 0);
|
|
51
|
+
} else {
|
|
52
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
53
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
onCleanup(() => {
|
|
58
|
+
if (!isServer) {
|
|
59
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
60
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const contextValue = {
|
|
64
|
+
open,
|
|
65
|
+
setOpen: handleOpenChange,
|
|
66
|
+
triggerRef,
|
|
67
|
+
setTriggerRef,
|
|
68
|
+
setContentElement
|
|
69
|
+
};
|
|
70
|
+
return createComponent(DropdownMenuContext.Provider, {
|
|
71
|
+
value: contextValue,
|
|
72
|
+
get children() {
|
|
73
|
+
return local.children;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const DropdownMenu = Object.assign(DropdownMenuBase, {
|
|
78
|
+
Trigger: null,
|
|
79
|
+
Content: null,
|
|
80
|
+
Item: null,
|
|
81
|
+
Label: null,
|
|
82
|
+
Separator: null
|
|
83
|
+
});
|
|
84
|
+
const DropdownMenuTrigger = (props) => {
|
|
85
|
+
const [local, others] = splitProps(props, ["children", "asChild", "class", "onClick"]);
|
|
86
|
+
const context = useDropdownMenuContext();
|
|
87
|
+
let triggerElement;
|
|
88
|
+
const handleClick = (e) => {
|
|
89
|
+
if (typeof local.onClick === "function") {
|
|
90
|
+
local.onClick(e);
|
|
91
|
+
}
|
|
92
|
+
context.setOpen(!context.open());
|
|
93
|
+
};
|
|
94
|
+
onMount(() => {
|
|
95
|
+
if (triggerElement) {
|
|
96
|
+
context.setTriggerRef(triggerElement);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return (() => {
|
|
100
|
+
var _el$ = _tmpl$();
|
|
101
|
+
_el$.$$click = handleClick;
|
|
102
|
+
var _ref$ = triggerElement;
|
|
103
|
+
typeof _ref$ === "function" ? use(_ref$, _el$) : triggerElement = _el$;
|
|
104
|
+
spread(_el$, mergeProps({
|
|
105
|
+
get ["class"]() {
|
|
106
|
+
return local.class;
|
|
107
|
+
}
|
|
108
|
+
}, others), false, true);
|
|
109
|
+
insert(_el$, () => local.children);
|
|
110
|
+
return _el$;
|
|
111
|
+
})();
|
|
112
|
+
};
|
|
113
|
+
const DropdownMenuContent = (props) => {
|
|
114
|
+
const [local, others] = splitProps(props, ["class", "children"]);
|
|
115
|
+
const context = useDropdownMenuContext();
|
|
116
|
+
let contentElement;
|
|
117
|
+
const updatePosition = () => {
|
|
118
|
+
if (!isServer && contentElement && context.triggerRef()) {
|
|
119
|
+
const trigger = context.triggerRef();
|
|
120
|
+
const rect = trigger.getBoundingClientRect();
|
|
121
|
+
const contentRect = contentElement.getBoundingClientRect();
|
|
122
|
+
const top = rect.bottom + 4;
|
|
123
|
+
const left = rect.left;
|
|
124
|
+
const viewportWidth = window.innerWidth;
|
|
125
|
+
const viewportHeight = window.innerHeight;
|
|
126
|
+
let finalTop = top;
|
|
127
|
+
let finalLeft = left;
|
|
128
|
+
if (left + contentRect.width > viewportWidth) {
|
|
129
|
+
finalLeft = viewportWidth - contentRect.width - 16;
|
|
130
|
+
}
|
|
131
|
+
if (top + contentRect.height > viewportHeight) {
|
|
132
|
+
finalTop = rect.top - contentRect.height - 4;
|
|
133
|
+
}
|
|
134
|
+
contentElement.style.top = `${finalTop}px`;
|
|
135
|
+
contentElement.style.left = `${finalLeft}px`;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
onMount(() => {
|
|
139
|
+
if (contentElement) {
|
|
140
|
+
context.setContentElement(contentElement);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
createEffect(() => {
|
|
144
|
+
if (context.open() && !isServer) {
|
|
145
|
+
requestAnimationFrame(() => {
|
|
146
|
+
updatePosition();
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
return createComponent(Show, {
|
|
151
|
+
get when() {
|
|
152
|
+
return context.open();
|
|
153
|
+
},
|
|
154
|
+
get children() {
|
|
155
|
+
return createComponent(Portal, {
|
|
156
|
+
get mount() {
|
|
157
|
+
return !isServer ? document.body : void 0;
|
|
158
|
+
},
|
|
159
|
+
get children() {
|
|
160
|
+
var _el$2 = _tmpl$2();
|
|
161
|
+
var _ref$2 = contentElement;
|
|
162
|
+
typeof _ref$2 === "function" ? use(_ref$2, _el$2) : contentElement = _el$2;
|
|
163
|
+
spread(_el$2, mergeProps({
|
|
164
|
+
get ["class"]() {
|
|
165
|
+
return `fixed z-50 ${local.class || ""}`;
|
|
166
|
+
},
|
|
167
|
+
get ["data-state"]() {
|
|
168
|
+
return context.open() ? "open" : "closed";
|
|
169
|
+
}
|
|
170
|
+
}, others), false, true);
|
|
171
|
+
insert(_el$2, () => local.children);
|
|
172
|
+
return _el$2;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
const DropdownMenuItem = (props) => {
|
|
179
|
+
const [local, others] = splitProps(props, ["children", "disabled", "class", "onClick"]);
|
|
180
|
+
const handleClick = (e) => {
|
|
181
|
+
if (local.disabled) {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (typeof local.onClick === "function") {
|
|
186
|
+
local.onClick(e);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
return (() => {
|
|
190
|
+
var _el$3 = _tmpl$3();
|
|
191
|
+
_el$3.$$click = handleClick;
|
|
192
|
+
spread(_el$3, mergeProps({
|
|
193
|
+
get ["class"]() {
|
|
194
|
+
return local.class;
|
|
195
|
+
},
|
|
196
|
+
get ["data-disabled"]() {
|
|
197
|
+
return local.disabled ? "" : void 0;
|
|
198
|
+
}
|
|
199
|
+
}, others), false, true);
|
|
200
|
+
insert(_el$3, () => local.children);
|
|
201
|
+
return _el$3;
|
|
202
|
+
})();
|
|
203
|
+
};
|
|
204
|
+
const DropdownMenuLabel = (props) => {
|
|
205
|
+
const [local, others] = splitProps(props, ["children", "class"]);
|
|
206
|
+
return (() => {
|
|
207
|
+
var _el$4 = _tmpl$4();
|
|
208
|
+
spread(_el$4, mergeProps({
|
|
209
|
+
get ["class"]() {
|
|
210
|
+
return local.class;
|
|
211
|
+
}
|
|
212
|
+
}, others), false, true);
|
|
213
|
+
insert(_el$4, () => local.children);
|
|
214
|
+
return _el$4;
|
|
215
|
+
})();
|
|
216
|
+
};
|
|
217
|
+
const DropdownMenuSeparator = (props) => {
|
|
218
|
+
const [local, others] = splitProps(props, ["class"]);
|
|
219
|
+
return (() => {
|
|
220
|
+
var _el$5 = _tmpl$5();
|
|
221
|
+
spread(_el$5, mergeProps({
|
|
222
|
+
get ["class"]() {
|
|
223
|
+
return local.class;
|
|
224
|
+
}
|
|
225
|
+
}, others), false, false);
|
|
226
|
+
return _el$5;
|
|
227
|
+
})();
|
|
228
|
+
};
|
|
229
|
+
DropdownMenu.Trigger = DropdownMenuTrigger;
|
|
230
|
+
DropdownMenu.Content = DropdownMenuContent;
|
|
231
|
+
DropdownMenu.Item = DropdownMenuItem;
|
|
232
|
+
DropdownMenu.Label = DropdownMenuLabel;
|
|
233
|
+
DropdownMenu.Separator = DropdownMenuSeparator;
|
|
234
|
+
delegateEvents(["click"]);
|
|
235
|
+
export {
|
|
236
|
+
DropdownMenu,
|
|
237
|
+
DropdownMenuContent,
|
|
238
|
+
DropdownMenuItem,
|
|
239
|
+
DropdownMenuLabel,
|
|
240
|
+
DropdownMenuSeparator,
|
|
241
|
+
DropdownMenuTrigger,
|
|
242
|
+
useDropdownMenuContext
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=DropdownMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext, Show, onMount, onCleanup, createEffect } from 'solid-js';\nimport { Portal, isServer } from 'solid-js/web';\nimport type { Component, JSX } from 'solid-js';\n\ninterface DropdownMenuContextValue {\n open: () => boolean;\n setOpen: (open: boolean) => void;\n triggerRef: () => HTMLElement | undefined;\n setTriggerRef: (ref: HTMLElement | undefined) => void;\n setContentElement: (el: HTMLElement | undefined) => void;\n}\n\nconst DropdownMenuContext = createContext<DropdownMenuContextValue>();\n\nexport const useDropdownMenuContext = () => {\n const context = useContext(DropdownMenuContext);\n if (!context) {\n throw new Error('DropdownMenu components must be used within DropdownMenu');\n }\n return context;\n};\n\nexport interface DropdownMenuProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 是否打开\n */\n open?: boolean;\n /**\n * 默认打开状态\n */\n defaultOpen?: boolean;\n /**\n * 打开状态变化回调\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst DropdownMenuBase: Component<DropdownMenuProps> = (props) => {\n const [local] = splitProps(props, [\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'children',\n ]);\n\n const [internalOpen, setInternalOpen] = createSignal(\n local.open ?? local.defaultOpen ?? false\n );\n const [triggerRef, setTriggerRef] = createSignal<HTMLElement | undefined>();\n\n const isControlled = () => local.open !== undefined;\n const open = () => (isControlled() ? local.open! : internalOpen());\n\n const handleOpenChange = (newOpen: boolean) => {\n if (!isControlled()) {\n setInternalOpen(newOpen);\n }\n local.onOpenChange?.(newOpen);\n };\n\n // 点击外部关闭\n let contentElement: HTMLElement | undefined;\n const setContentElement = (el: HTMLElement | undefined) => {\n contentElement = el;\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (open() && !isServer) {\n const target = e.target as HTMLElement;\n const trigger = triggerRef();\n\n if (trigger && contentElement) {\n if (!trigger.contains(target) && !contentElement.contains(target)) {\n handleOpenChange(false);\n }\n }\n }\n };\n\n // ESC 键关闭\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open()) {\n handleOpenChange(false);\n }\n };\n\n createEffect(() => {\n if (!isServer) {\n if (open()) {\n // 延迟添加事件监听器,确保 DOM 已更新\n setTimeout(() => {\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n } else {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }\n });\n\n onCleanup(() => {\n if (!isServer) {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n }\n });\n\n const contextValue: DropdownMenuContextValue = {\n open,\n setOpen: handleOpenChange,\n triggerRef,\n setTriggerRef,\n setContentElement,\n };\n\n return (\n <DropdownMenuContext.Provider value={contextValue}>\n {local.children}\n </DropdownMenuContext.Provider>\n );\n};\n\nexport interface DropdownMenuComponent extends Component<DropdownMenuProps> {\n Trigger: Component<DropdownMenuTriggerProps>;\n Content: Component<DropdownMenuContentProps>;\n Item: Component<DropdownMenuItemProps>;\n Label: Component<DropdownMenuLabelProps>;\n Separator: Component<DropdownMenuSeparatorProps>;\n}\n\nexport const DropdownMenu = Object.assign(DropdownMenuBase, {\n Trigger: null as unknown as Component<DropdownMenuTriggerProps>,\n Content: null as unknown as Component<DropdownMenuContentProps>,\n Item: null as unknown as Component<DropdownMenuItemProps>,\n Label: null as unknown as Component<DropdownMenuLabelProps>,\n Separator: null as unknown as Component<DropdownMenuSeparatorProps>,\n}) as DropdownMenuComponent;\n\nexport interface DropdownMenuTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const DropdownMenuTrigger: Component<DropdownMenuTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onClick']);\n const context = useDropdownMenuContext();\n let triggerElement: HTMLButtonElement | undefined;\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n context.setOpen(!context.open());\n };\n\n onMount(() => {\n if (triggerElement) {\n context.setTriggerRef(triggerElement);\n }\n });\n\n return (\n <button \n type=\"button\" \n ref={triggerElement}\n class={local.class} \n onClick={handleClick} \n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface DropdownMenuContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const DropdownMenuContent: Component<DropdownMenuContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useDropdownMenuContext();\n let contentElement: HTMLDivElement | undefined;\n\n const updatePosition = () => {\n if (!isServer && contentElement && context.triggerRef()) {\n const trigger = context.triggerRef()!;\n const rect = trigger.getBoundingClientRect();\n const contentRect = contentElement.getBoundingClientRect();\n\n // 默认在触发元素下方显示\n const top = rect.bottom + 4;\n const left = rect.left;\n\n // 检查是否会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let finalTop = top;\n let finalLeft = left;\n\n // 如果右侧超出,则左对齐\n if (left + contentRect.width > viewportWidth) {\n finalLeft = viewportWidth - contentRect.width - 16;\n }\n\n // 如果下方超出,则在上方显示\n if (top + contentRect.height > viewportHeight) {\n finalTop = rect.top - contentRect.height - 4;\n }\n\n contentElement.style.top = `${finalTop}px`;\n contentElement.style.left = `${finalLeft}px`;\n }\n };\n\n onMount(() => {\n if (contentElement) {\n context.setContentElement(contentElement);\n }\n });\n\n createEffect(() => {\n if (context.open() && !isServer) {\n // 延迟一帧确保 DOM 已渲染\n requestAnimationFrame(() => {\n updatePosition();\n });\n }\n });\n\n return (\n <Show when={context.open()}>\n <Portal mount={!isServer ? document.body : undefined}>\n <div\n ref={contentElement}\n role=\"menu\"\n class={`fixed z-50 ${local.class || ''}`}\n data-state={context.open() ? 'open' : 'closed'}\n style={{ top: '0px', left: '0px' }}\n {...others}\n >\n {local.children}\n </div>\n </Portal>\n </Show>\n );\n};\n\nexport interface DropdownMenuItemProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n}\n\nexport const DropdownMenuItem: Component<DropdownMenuItemProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'disabled', 'class', 'onClick']);\n\n const handleClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (local.disabled) {\n e.preventDefault();\n return;\n }\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n };\n\n return (\n <div\n role=\"menuitem\"\n class={local.class}\n data-disabled={local.disabled ? '' : undefined}\n onClick={handleClick}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface DropdownMenuLabelProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const DropdownMenuLabel: Component<DropdownMenuLabelProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class'] as const);\n\n return (\n <div class={local.class} {...others}>\n {local.children}\n </div>\n );\n};\n\nexport interface DropdownMenuSeparatorProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const DropdownMenuSeparator: Component<DropdownMenuSeparatorProps> = (props) => {\n const [local, others] = splitProps(props, ['class'] as const);\n\n return (\n <div\n role=\"separator\"\n class={local.class}\n {...others}\n />\n );\n};\n\nDropdownMenu.Trigger = DropdownMenuTrigger;\nDropdownMenu.Content = DropdownMenuContent;\nDropdownMenu.Item = DropdownMenuItem;\nDropdownMenu.Label = DropdownMenuLabel;\nDropdownMenu.Separator = DropdownMenuSeparator;\n\n"],"names":["DropdownMenuContext","createContext","useDropdownMenuContext","context","useContext","Error","DropdownMenuBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","triggerRef","setTriggerRef","isControlled","undefined","handleOpenChange","newOpen","onOpenChange","contentElement","setContentElement","el","handleClickOutside","e","isServer","target","trigger","contains","handleKeyDown","key","createEffect","setTimeout","document","addEventListener","removeEventListener","onCleanup","contextValue","setOpen","_$createComponent","Provider","value","children","DropdownMenu","Object","assign","Trigger","Content","Item","Label","Separator","DropdownMenuTrigger","others","triggerElement","handleClick","onClick","onMount","_el$","_tmpl$","$$click","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","DropdownMenuContent","updatePosition","rect","getBoundingClientRect","contentRect","top","bottom","left","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","width","height","style","requestAnimationFrame","Show","when","Portal","mount","body","_el$2","_tmpl$2","_ref$2","DropdownMenuItem","disabled","preventDefault","_el$3","_tmpl$3","DropdownMenuLabel","_el$4","_tmpl$4","DropdownMenuSeparator","_el$5","_tmpl$5","_$delegateEvents"],"mappings":";;;AAYA,MAAMA,sBAAsBC,cAAAA;AAErB,MAAMC,yBAAyBA,MAAM;AAC1C,QAAMC,UAAUC,WAAWJ,mBAAmB;AAC9C,MAAI,CAACG,SAAS;AACZ,UAAM,IAAIE,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAOF;AACT;AAqBA,MAAMG,mBAAkDC,CAAAA,UAAU;AAChE,QAAM,CAACC,KAAK,IAAIC,WAAWF,OAAO,CAChC,QACA,eACA,gBACA,UAAU,CACX;AAED,QAAM,CAACG,cAAcC,eAAe,IAAIC,aACtCJ,MAAMK,QAAQL,MAAMM,eAAe,KACrC;AACA,QAAM,CAACC,YAAYC,aAAa,IAAIJ,aAAAA;AAEpC,QAAMK,eAAeA,MAAMT,MAAMK,SAASK;AAC1C,QAAML,OAAOA,MAAOI,aAAAA,IAAiBT,MAAMK,OAAQH,aAAAA;AAEnD,QAAMS,mBAAmBA,CAACC,YAAqB;AAC7C,QAAI,CAACH,gBAAgB;AACnBN,sBAAgBS,OAAO;AAAA,IACzB;AACAZ,UAAMa,eAAeD,OAAO;AAAA,EAC9B;AAGA,MAAIE;AACJ,QAAMC,oBAAoBA,CAACC,OAAgC;AACzDF,qBAAiBE;AAAAA,EACnB;AAEA,QAAMC,qBAAqBA,CAACC,MAAkB;AAC5C,QAAIb,KAAAA,KAAU,CAACc,UAAU;AACvB,YAAMC,SAASF,EAAEE;AACjB,YAAMC,UAAUd,WAAAA;AAEhB,UAAIc,WAAWP,gBAAgB;AAC7B,YAAI,CAACO,QAAQC,SAASF,MAAM,KAAK,CAACN,eAAeQ,SAASF,MAAM,GAAG;AACjET,2BAAiB,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAMY,gBAAgBA,CAACL,MAAqB;AAC1C,QAAIA,EAAEM,QAAQ,YAAYnB,KAAAA,GAAQ;AAChCM,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEAc,eAAa,MAAM;AACjB,QAAI,CAACN,UAAU;AACb,UAAId,QAAQ;AAEVqB,mBAAW,MAAM;AACfC,mBAASC,iBAAiB,WAAWL,aAAa;AAClDI,mBAASC,iBAAiB,aAAaX,kBAAkB;AAAA,QAC3D,GAAG,CAAC;AAAA,MACN,OAAO;AACLU,iBAASE,oBAAoB,WAAWN,aAAa;AACrDI,iBAASE,oBAAoB,aAAaZ,kBAAkB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,CAAC;AAEDa,YAAU,MAAM;AACd,QAAI,CAACX,UAAU;AACbQ,eAASE,oBAAoB,WAAWN,aAAa;AACrDI,eAASE,oBAAoB,aAAaZ,kBAAkB;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAMc,eAAyC;AAAA,IAC7C1B;AAAAA,IACA2B,SAASrB;AAAAA,IACTJ;AAAAA,IACAC;AAAAA,IACAO;AAAAA,EAAAA;AAGF,SAAAkB,gBACGzC,oBAAoB0C,UAAQ;AAAA,IAACC,OAAOJ;AAAAA,IAAY,IAAAK,WAAA;AAAA,aAC9CpC,MAAMoC;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;AAUO,MAAMC,eAAeC,OAAOC,OAAOzC,kBAAkB;AAAA,EAC1D0C,SAAS;AAAA,EACTC,SAAS;AAAA,EACTC,MAAM;AAAA,EACNC,OAAO;AAAA,EACPC,WAAW;AACb,CAAC;AAaM,MAAMC,sBAA4D9C,CAAAA,UAAU;AACjF,QAAM,CAACC,OAAO8C,MAAM,IAAI7C,WAAWF,OAAO,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AACrF,QAAMJ,UAAUD,uBAAAA;AAChB,MAAIqD;AAEJ,QAAMC,cAAgE9B,CAAAA,MAAM;AAC1E,QAAI,OAAOlB,MAAMiD,YAAY,YAAY;AACvCjD,YAAMiD,QAAQ/B,CAAC;AAAA,IACjB;AACAvB,YAAQqC,QAAQ,CAACrC,QAAQU,KAAAA,CAAM;AAAA,EACjC;AAEA6C,UAAQ,MAAM;AACZ,QAAIH,gBAAgB;AAClBpD,cAAQa,cAAcuC,cAAc;AAAA,IACtC;AAAA,EACF,CAAC;AAED,UAAA,MAAA;AAAA,QAAAI,OAAAC,OAAAA;AAAAD,SAAAE,UAKaL;AAAW,QAAAM,QAFfP;AAAc,WAAAO,UAAA,aAAAC,IAAAD,OAAAH,IAAA,IAAdJ,iBAAcI;AAAAK,WAAAL,MAAAM,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACZzD,MAAM0D;AAAAA,MAAK;AAAA,IAAA,GAEdZ,MAAM,GAAA,OAAA,IAAA;AAAAa,WAAAR,MAAA,MAETnD,MAAMoC,QAAQ;AAAA,WAAAe;AAAAA,EAAA,GAAA;AAGrB;AASO,MAAMS,sBAA4D7D,CAAAA,UAAU;AACjF,QAAM,CAACC,OAAO8C,MAAM,IAAI7C,WAAWF,OAAO,CAAC,SAAS,UAAU,CAAU;AACxE,QAAMJ,UAAUD,uBAAAA;AAChB,MAAIoB;AAEJ,QAAM+C,iBAAiBA,MAAM;AAC3B,QAAI,CAAC1C,YAAYL,kBAAkBnB,QAAQY,cAAc;AACvD,YAAMc,UAAU1B,QAAQY,WAAAA;AACxB,YAAMuD,OAAOzC,QAAQ0C,sBAAAA;AACrB,YAAMC,cAAclD,eAAeiD,sBAAAA;AAGnC,YAAME,MAAMH,KAAKI,SAAS;AAC1B,YAAMC,OAAOL,KAAKK;AAGlB,YAAMC,gBAAgBC,OAAOC;AAC7B,YAAMC,iBAAiBF,OAAOG;AAE9B,UAAIC,WAAWR;AACf,UAAIS,YAAYP;AAGhB,UAAIA,OAAOH,YAAYW,QAAQP,eAAe;AAC5CM,oBAAYN,gBAAgBJ,YAAYW,QAAQ;AAAA,MAClD;AAGA,UAAIV,MAAMD,YAAYY,SAASL,gBAAgB;AAC7CE,mBAAWX,KAAKG,MAAMD,YAAYY,SAAS;AAAA,MAC7C;AAEA9D,qBAAe+D,MAAMZ,MAAM,GAAGQ,QAAQ;AACtC3D,qBAAe+D,MAAMV,OAAO,GAAGO,SAAS;AAAA,IAC1C;AAAA,EACF;AAEAxB,UAAQ,MAAM;AACZ,QAAIpC,gBAAgB;AAClBnB,cAAQoB,kBAAkBD,cAAc;AAAA,IAC1C;AAAA,EACF,CAAC;AAEDW,eAAa,MAAM;AACjB,QAAI9B,QAAQU,UAAU,CAACc,UAAU;AAE/B2D,4BAAsB,MAAM;AAC1BjB,uBAAAA;AAAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAA5B,gBACG8C,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAErF,QAAQU,KAAAA;AAAAA,IAAM;AAAA,IAAA,IAAA+B,WAAA;AAAA,aAAAH,gBACvBgD,QAAM;AAAA,QAAA,IAACC,QAAK;AAAA,iBAAE,CAAC/D,WAAWQ,SAASwD,OAAOzE;AAAAA,QAAS;AAAA,QAAA,IAAA0B,WAAA;AAAA,cAAAgD,QAAAC,QAAAA;AAAA,cAAAC,SAE3CxE;AAAc,iBAAAwE,WAAA,aAAA/B,IAAA+B,QAAAF,KAAA,IAAdtE,iBAAcsE;AAAA5B,iBAAA4B,OAAA3B,WAAA;AAAA,YAAA,KAAA,OAAA,IAAA;AAAA,qBAEZ,cAAczD,MAAM0D,SAAS,EAAE;AAAA,YAAE;AAAA,YAAA,KAAA,YAAA,IAAA;AAAA,qBAC5B/D,QAAQU,SAAS,SAAS;AAAA,YAAQ;AAAA,UAAA,GAE1CyC,MAAM,GAAA,OAAA,IAAA;AAAAa,iBAAAyB,OAAA,MAETpF,MAAMoC,QAAQ;AAAA,iBAAAgD;AAAAA,QAAA;AAAA,MAAA,CAAA;AAAA,IAAA;AAAA,EAAA,CAAA;AAKzB;AAcO,MAAMG,mBAAsDxF,CAAAA,UAAU;AAC3E,QAAM,CAACC,OAAO8C,MAAM,IAAI7C,WAAWF,OAAO,CAAC,YAAY,YAAY,SAAS,SAAS,CAAC;AAEtF,QAAMiD,cAA6D9B,CAAAA,MAAM;AACvE,QAAIlB,MAAMwF,UAAU;AAClBtE,QAAEuE,eAAAA;AACF;AAAA,IACF;AACA,QAAI,OAAOzF,MAAMiD,YAAY,YAAY;AACvCjD,YAAMiD,QAAQ/B,CAAC;AAAA,IACjB;AAAA,EACF;AAEA,UAAA,MAAA;AAAA,QAAAwE,QAAAC,QAAAA;AAAAD,UAAArC,UAKaL;AAAWQ,WAAAkC,OAAAjC,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAFbzD,MAAM0D;AAAAA,MAAK;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eACH1D,MAAMwF,WAAW,KAAK9E;AAAAA,MAAS;AAAA,IAAA,GAE1CoC,MAAM,GAAA,OAAA,IAAA;AAAAa,WAAA+B,OAAA,MAET1F,MAAMoC,QAAQ;AAAA,WAAAsD;AAAAA,EAAA,GAAA;AAGrB;AASO,MAAME,oBAAwD7F,CAAAA,UAAU;AAC7E,QAAM,CAACC,OAAO8C,MAAM,IAAI7C,WAAWF,OAAO,CAAC,YAAY,OAAO,CAAU;AAExE,UAAA,MAAA;AAAA,QAAA8F,QAAAC,QAAAA;AAAAtC,WAAAqC,OAAApC,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACczD,MAAM0D;AAAAA,MAAK;AAAA,IAAA,GAAMZ,MAAM,GAAA,OAAA,IAAA;AAAAa,WAAAkC,OAAA,MAChC7F,MAAMoC,QAAQ;AAAA,WAAAyD;AAAAA,EAAA,GAAA;AAGrB;AASO,MAAME,wBAAgEhG,CAAAA,UAAU;AACrF,QAAM,CAACC,OAAO8C,MAAM,IAAI7C,WAAWF,OAAO,CAAC,OAAO,CAAU;AAE5D,UAAA,MAAA;AAAA,QAAAiG,QAAAC,QAAAA;AAAAzC,WAAAwC,OAAAvC,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAGWzD,MAAM0D;AAAAA,MAAK;AAAA,IAAA,GACdZ,MAAM,GAAA,OAAA,KAAA;AAAA,WAAAkD;AAAAA,EAAA,GAAA;AAGhB;AAEA3D,aAAaG,UAAUK;AACvBR,aAAaI,UAAUmB;AACvBvB,aAAaK,OAAO6C;AACpBlD,aAAaM,QAAQiD;AACrBvD,aAAaO,YAAYmD;AAAsBG,eAAA,CAAA,OAAA,CAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|