@ensolid/radix 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/components/Accordion/Accordion.js +2 -3
  2. package/dist/components/AlertDialog/AlertDialog.js +2 -3
  3. package/dist/components/AspectRatio/AspectRatio.js +0 -1
  4. package/dist/components/Avatar/Avatar.js +1 -2
  5. package/dist/components/Checkbox/Checkbox.js +0 -1
  6. package/dist/components/Collapsible/Collapsible.js +2 -3
  7. package/dist/components/ContextMenu/ContextMenu.js +2 -3
  8. package/dist/components/Dialog/Dialog.js +2 -3
  9. package/dist/components/DropdownMenu/DropdownMenu.js +2 -3
  10. package/dist/components/HoverCard/HoverCard.js +2 -3
  11. package/dist/components/Label/Label.js +0 -1
  12. package/dist/components/Menubar/Menubar.js +2 -3
  13. package/dist/components/NavigationMenu/NavigationMenu.js +2 -3
  14. package/dist/components/Popover/Popover.js +2 -3
  15. package/dist/components/Progress/Progress.js +0 -1
  16. package/dist/components/RadioGroup/RadioGroup.js +2 -3
  17. package/dist/components/ScrollArea/ScrollArea.js +0 -1
  18. package/dist/components/Select/Select.js +2 -3
  19. package/dist/components/Separator/Separator.js +0 -1
  20. package/dist/components/Slider/Slider.js +1 -2
  21. package/dist/components/Switch/Switch.js +1 -2
  22. package/dist/components/Tabs/Tabs.js +2 -3
  23. package/dist/components/Toggle/Toggle.js +1 -2
  24. package/dist/components/ToggleGroup/ToggleGroup.js +2 -3
  25. package/dist/components/Toolbar/Toolbar.js +0 -1
  26. package/dist/components/Tooltip/Tooltip.js +2 -3
  27. package/dist/components/VisuallyHidden/VisuallyHidden.js +0 -1
  28. package/dist/index.js +0 -1
  29. package/package.json +46 -1
  30. package/dist/components/Accordion/Accordion.js.map +0 -1
  31. package/dist/components/AlertDialog/AlertDialog.js.map +0 -1
  32. package/dist/components/AspectRatio/AspectRatio.js.map +0 -1
  33. package/dist/components/Avatar/Avatar.js.map +0 -1
  34. package/dist/components/Checkbox/Checkbox.js.map +0 -1
  35. package/dist/components/Collapsible/Collapsible.js.map +0 -1
  36. package/dist/components/ContextMenu/ContextMenu.js.map +0 -1
  37. package/dist/components/Dialog/Dialog.js.map +0 -1
  38. package/dist/components/DropdownMenu/DropdownMenu.js.map +0 -1
  39. package/dist/components/HoverCard/HoverCard.js.map +0 -1
  40. package/dist/components/Label/Label.js.map +0 -1
  41. package/dist/components/Menubar/Menubar.js.map +0 -1
  42. package/dist/components/NavigationMenu/NavigationMenu.js.map +0 -1
  43. package/dist/components/Popover/Popover.js.map +0 -1
  44. package/dist/components/Progress/Progress.js.map +0 -1
  45. package/dist/components/RadioGroup/RadioGroup.js.map +0 -1
  46. package/dist/components/ScrollArea/ScrollArea.js.map +0 -1
  47. package/dist/components/Select/Select.js.map +0 -1
  48. package/dist/components/Separator/Separator.js.map +0 -1
  49. package/dist/components/Slider/Slider.js.map +0 -1
  50. package/dist/components/Switch/Switch.js.map +0 -1
  51. package/dist/components/Tabs/Tabs.js.map +0 -1
  52. package/dist/components/Toggle/Toggle.js.map +0 -1
  53. package/dist/components/ToggleGroup/ToggleGroup.js.map +0 -1
  54. package/dist/components/Toolbar/Toolbar.js.map +0 -1
  55. package/dist/components/Tooltip/Tooltip.js.map +0 -1
  56. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +0 -1
  57. package/dist/index.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { delegateEvents, createComponent, template, spread, mergeProps, insert, memo } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, useContext } from "solid-js";
1
+ import { createComponent, template, spread, mergeProps, insert, memo, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button>`);
4
4
  const AccordionContext = createContext();
5
5
  const AccordionItemContext = createContext();
@@ -190,4 +190,3 @@ export {
190
190
  useAccordionContext,
191
191
  useAccordionItemContext
192
192
  };
193
- //# sourceMappingURL=Accordion.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, createComponent, Portal, isServer, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, Show, createSignal, onMount, createEffect, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<button type=button>`), _tmpl$2 = /* @__PURE__ */ template(`<div>`), _tmpl$3 = /* @__PURE__ */ template(`<div role=alertdialog aria-modal=true>`), _tmpl$4 = /* @__PURE__ */ template(`<h2>`), _tmpl$5 = /* @__PURE__ */ template(`<p>`);
4
4
  const AlertDialogContext = createContext();
5
5
  const useAlertDialogContext = () => {
@@ -232,4 +232,3 @@ export {
232
232
  AlertDialogTrigger,
233
233
  useAlertDialogContext
234
234
  };
235
- //# sourceMappingURL=AlertDialog.js.map
@@ -22,4 +22,3 @@ const AspectRatio = (props) => {
22
22
  export {
23
23
  AspectRatio
24
24
  };
25
- //# sourceMappingURL=AspectRatio.js.map
@@ -1,5 +1,5 @@
1
1
  import { createComponent, template, spread, mergeProps, insert, memo } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, createEffect, Show, onCleanup, useContext } from "solid-js";
2
+ import { splitProps, createSignal, createContext, createEffect, Show, onCleanup, useContext } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<img>`);
4
4
  const AvatarContext = createContext();
5
5
  const useAvatarContext = () => {
@@ -141,4 +141,3 @@ export {
141
141
  AvatarFallback,
142
142
  AvatarImage
143
143
  };
144
- //# sourceMappingURL=Avatar.js.map
@@ -46,4 +46,3 @@ const Checkbox = (props) => {
46
46
  export {
47
47
  Checkbox
48
48
  };
49
- //# sourceMappingURL=Checkbox.js.map
@@ -1,5 +1,5 @@
1
- import { delegateEvents, createComponent, template, spread, mergeProps, insert } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, Show, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, createComponent, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, Show, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button aria-controls=collapsible-content>`), _tmpl$3 = /* @__PURE__ */ template(`<div id=collapsible-content>`);
4
4
  const CollapsibleContext = createContext();
5
5
  const useCollapsibleContext = () => {
@@ -107,4 +107,3 @@ export {
107
107
  CollapsibleTrigger,
108
108
  useCollapsibleContext
109
109
  };
110
- //# sourceMappingURL=Collapsible.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=menu>`), _tmpl$3 = /* @__PURE__ */ template(`<button type=button role=menuitem>`), _tmpl$4 = /* @__PURE__ */ template(`<div role=menuitem>`), _tmpl$5 = /* @__PURE__ */ template(`<hr role=separator>`);
4
4
  const ContextMenuContext = createContext();
5
5
  const useContextMenuContext = () => {
@@ -260,4 +260,3 @@ export {
260
260
  ContextMenuTrigger,
261
261
  useContextMenuContext
262
262
  };
263
- //# sourceMappingURL=ContextMenu.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, createComponent, Portal, isServer, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, Show, createSignal, onMount, createEffect, onCleanup } from "solid-js";
3
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
4
  const DialogContext = createContext();
5
5
  const useDialogContext = () => {
@@ -215,4 +215,3 @@ export {
215
215
  DialogTrigger,
216
216
  useDialogContext
217
217
  };
218
- //# sourceMappingURL=Dialog.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
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
4
  const DropdownMenuContext = createContext();
5
5
  const useDropdownMenuContext = () => {
@@ -241,4 +241,3 @@ export {
241
241
  DropdownMenuTrigger,
242
242
  useDropdownMenuContext
243
243
  };
244
- //# sourceMappingURL=DropdownMenu.js.map
@@ -1,5 +1,5 @@
1
- import { createComponent, template, spread, mergeProps, insert, isServer, Portal, use } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, onMount, onCleanup, createEffect, Show, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, onCleanup, createEffect, Show, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=tooltip style=top:0px;left:0px>`);
4
4
  const HoverCardContext = createContext();
5
5
  const useHoverCardContext = () => {
@@ -196,4 +196,3 @@ export {
196
196
  HoverCardTrigger,
197
197
  useHoverCardContext
198
198
  };
199
- //# sourceMappingURL=HoverCard.js.map
@@ -20,4 +20,3 @@ const Label = (props) => {
20
20
  export {
21
21
  Label
22
22
  };
23
- //# sourceMappingURL=Label.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, createComponent, Portal, isServer, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div role=menubar>`), _tmpl$2 = /* @__PURE__ */ template(`<div>`), _tmpl$3 = /* @__PURE__ */ template(`<button type=button role=menuitem>`), _tmpl$4 = /* @__PURE__ */ template(`<div role=menu style=top:0px;left:0px>`), _tmpl$5 = /* @__PURE__ */ template(`<hr role=separator>`);
4
4
  const MenubarContext = createContext();
5
5
  const useMenubarContext = () => {
@@ -296,4 +296,3 @@ export {
296
296
  MenubarTrigger,
297
297
  useMenubarContext
298
298
  };
299
- //# sourceMappingURL=Menubar.js.map
@@ -1,5 +1,5 @@
1
- import { delegateEvents, isServer, createComponent, template, spread, mergeProps, insert, setAttribute, Portal, use } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, createEffect, onCleanup, onMount, Show, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, setAttribute, createComponent, Portal, isServer, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<nav role=navigation>`), _tmpl$2 = /* @__PURE__ */ template(`<ul role=list>`), _tmpl$3 = /* @__PURE__ */ template(`<li>`), _tmpl$4 = /* @__PURE__ */ template(`<button type=button>`), _tmpl$5 = /* @__PURE__ */ template(`<div role=menu style=top:0px;left:0px>`), _tmpl$6 = /* @__PURE__ */ template(`<a>`), _tmpl$7 = /* @__PURE__ */ template(`<div>`);
4
4
  const NavigationMenuContext = createContext();
5
5
  const useNavigationMenuContext = () => {
@@ -317,4 +317,3 @@ export {
317
317
  NavigationMenuViewport,
318
318
  useNavigationMenuContext
319
319
  };
320
- //# sourceMappingURL=NavigationMenu.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<button type=button>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=dialog style=top:0px;left:0px>`);
4
4
  const PopoverContext = createContext();
5
5
  const usePopoverContext = () => {
@@ -173,4 +173,3 @@ export {
173
173
  PopoverTrigger,
174
174
  usePopoverContext
175
175
  };
176
- //# sourceMappingURL=Popover.js.map
@@ -41,4 +41,3 @@ const Progress = (props) => {
41
41
  export {
42
42
  Progress
43
43
  };
44
- //# sourceMappingURL=Progress.js.map
@@ -1,5 +1,5 @@
1
- import { createComponent, template, spread, mergeProps, insert } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, createComponent, insert } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div role=radiogroup>`), _tmpl$2 = /* @__PURE__ */ template(`<input type=radio>`);
4
4
  const RadioGroupContext = createContext();
5
5
  const useRadioGroupContext = () => {
@@ -97,4 +97,3 @@ export {
97
97
  RadioGroupItem,
98
98
  useRadioGroupContext
99
99
  };
100
- //# sourceMappingURL=RadioGroup.js.map
@@ -88,4 +88,3 @@ export {
88
88
  ScrollAreaThumb,
89
89
  ScrollAreaViewport
90
90
  };
91
- //# sourceMappingURL=ScrollArea.js.map
@@ -1,5 +1,5 @@
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";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, createEffect, Show, createSignal, onCleanup } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<button type=button role=combobox>`), _tmpl$2 = /* @__PURE__ */ template(`<span>`), _tmpl$3 = /* @__PURE__ */ template(`<div role=listbox style=top:0px;left:0px>`), _tmpl$4 = /* @__PURE__ */ template(`<div role=option>`);
4
4
  const SelectContext = createContext();
5
5
  const useSelectContext = () => {
@@ -237,4 +237,3 @@ export {
237
237
  SelectValue,
238
238
  useSelectContext
239
239
  };
240
- //# sourceMappingURL=Select.js.map
@@ -27,4 +27,3 @@ const Separator = (props) => {
27
27
  export {
28
28
  Separator
29
29
  };
30
- //# sourceMappingURL=Separator.js.map
@@ -1,4 +1,4 @@
1
- import { delegateEvents, template, spread, mergeProps, effect, className, setAttribute } from "solid-js/web";
1
+ import { template, spread, mergeProps, effect, className, setAttribute, delegateEvents } from "solid-js/web";
2
2
  import { splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div><input type=range class=w-full>`);
4
4
  const Slider = (props) => {
@@ -60,4 +60,3 @@ delegateEvents(["input"]);
60
60
  export {
61
61
  Slider
62
62
  };
63
- //# sourceMappingURL=Slider.js.map
@@ -1,4 +1,4 @@
1
- import { delegateEvents, template, spread, mergeProps } from "solid-js/web";
1
+ import { template, spread, mergeProps, delegateEvents } from "solid-js/web";
2
2
  import { splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<button type=button role=switch>`);
4
4
  const Switch = (props) => {
@@ -47,4 +47,3 @@ delegateEvents(["click"]);
47
47
  export {
48
48
  Switch
49
49
  };
50
- //# sourceMappingURL=Switch.js.map
@@ -1,5 +1,5 @@
1
- import { delegateEvents, createComponent, template, spread, mergeProps, insert, memo } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, memo, createComponent, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=tablist>`), _tmpl$3 = /* @__PURE__ */ template(`<button type=button role=tab>`), _tmpl$4 = /* @__PURE__ */ template(`<div role=tabpanel>`);
4
4
  const TabsContext = createContext();
5
5
  const useTabsContext = () => {
@@ -147,4 +147,3 @@ export {
147
147
  TabsTrigger,
148
148
  useTabsContext
149
149
  };
150
- //# sourceMappingURL=Tabs.js.map
@@ -1,4 +1,4 @@
1
- import { delegateEvents, template, spread, mergeProps, insert } from "solid-js/web";
1
+ import { template, spread, mergeProps, insert, delegateEvents } from "solid-js/web";
2
2
  import { splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<button type=button role=switch>`);
4
4
  const Toggle = (props) => {
@@ -48,4 +48,3 @@ delegateEvents(["click"]);
48
48
  export {
49
49
  Toggle
50
50
  };
51
- //# sourceMappingURL=Toggle.js.map
@@ -1,5 +1,5 @@
1
- import { delegateEvents, createComponent, template, spread, mergeProps, insert } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, createComponent, delegateEvents } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div role=group>`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button role=button>`);
4
4
  const ToggleGroupContext = createContext();
5
5
  const useToggleGroupContext = () => {
@@ -116,4 +116,3 @@ export {
116
116
  ToggleGroupItem,
117
117
  useToggleGroupContext
118
118
  };
119
- //# sourceMappingURL=ToggleGroup.js.map
@@ -107,4 +107,3 @@ export {
107
107
  ToolbarToggleGroup,
108
108
  ToolbarToggleItem
109
109
  };
110
- //# sourceMappingURL=Toolbar.js.map
@@ -1,5 +1,5 @@
1
- import { createComponent, template, spread, mergeProps, insert, isServer, Portal, use } from "solid-js/web";
2
- import { createContext, splitProps, createSignal, onMount, onCleanup, createEffect, Show, useContext } from "solid-js";
1
+ import { template, spread, mergeProps, insert, isServer, createComponent, Portal, use } from "solid-js/web";
2
+ import { useContext, createContext, splitProps, onMount, onCleanup, createEffect, Show, createSignal } from "solid-js";
3
3
  var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div role=tooltip style=top:0px;left:0px>`);
4
4
  const TooltipContext = createContext();
5
5
  const useTooltipContext = () => {
@@ -152,4 +152,3 @@ export {
152
152
  TooltipTrigger,
153
153
  useTooltipContext
154
154
  };
155
- //# sourceMappingURL=Tooltip.js.map
@@ -20,4 +20,3 @@ const VisuallyHidden = (props) => {
20
20
  export {
21
21
  VisuallyHidden
22
22
  };
23
- //# sourceMappingURL=VisuallyHidden.js.map
package/dist/index.js CHANGED
@@ -137,4 +137,3 @@ export {
137
137
  useToggleGroupContext,
138
138
  useTooltipContext
139
139
  };
140
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@ensolid/radix",
3
- "version": "0.0.0",
3
+ "version": "0.0.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
+ "sideEffects": false,
8
9
  "publishConfig": {
9
10
  "access": "public"
10
11
  },
@@ -76,6 +77,50 @@
76
77
  "./Toggle": {
77
78
  "import": "./dist/components/Toggle/Toggle.js",
78
79
  "types": "./dist/components/Toggle/index.d.ts"
80
+ },
81
+ "./Avatar": {
82
+ "import": "./dist/components/Avatar/Avatar.js",
83
+ "types": "./dist/components/Avatar/index.d.ts"
84
+ },
85
+ "./Collapsible": {
86
+ "import": "./dist/components/Collapsible/Collapsible.js",
87
+ "types": "./dist/components/Collapsible/index.d.ts"
88
+ },
89
+ "./ContextMenu": {
90
+ "import": "./dist/components/ContextMenu/ContextMenu.js",
91
+ "types": "./dist/components/ContextMenu/index.d.ts"
92
+ },
93
+ "./HoverCard": {
94
+ "import": "./dist/components/HoverCard/HoverCard.js",
95
+ "types": "./dist/components/HoverCard/index.d.ts"
96
+ },
97
+ "./ScrollArea": {
98
+ "import": "./dist/components/ScrollArea/ScrollArea.js",
99
+ "types": "./dist/components/ScrollArea/index.d.ts"
100
+ },
101
+ "./ToggleGroup": {
102
+ "import": "./dist/components/ToggleGroup/ToggleGroup.js",
103
+ "types": "./dist/components/ToggleGroup/index.d.ts"
104
+ },
105
+ "./AspectRatio": {
106
+ "import": "./dist/components/AspectRatio/AspectRatio.js",
107
+ "types": "./dist/components/AspectRatio/index.d.ts"
108
+ },
109
+ "./VisuallyHidden": {
110
+ "import": "./dist/components/VisuallyHidden/VisuallyHidden.js",
111
+ "types": "./dist/components/VisuallyHidden/index.d.ts"
112
+ },
113
+ "./Menubar": {
114
+ "import": "./dist/components/Menubar/Menubar.js",
115
+ "types": "./dist/components/Menubar/index.d.ts"
116
+ },
117
+ "./Toolbar": {
118
+ "import": "./dist/components/Toolbar/Toolbar.js",
119
+ "types": "./dist/components/Toolbar/index.d.ts"
120
+ },
121
+ "./NavigationMenu": {
122
+ "import": "./dist/components/NavigationMenu/NavigationMenu.js",
123
+ "types": "./dist/components/NavigationMenu/index.d.ts"
79
124
  }
80
125
  },
81
126
  "files": [
@@ -1 +0,0 @@
1
- {"version":3,"file":"Accordion.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\ninterface AccordionContextValue {\n value: () => string | string[] | undefined;\n setValue: (value: string) => void;\n type: 'single' | 'multiple';\n collapsible: boolean;\n isItemOpen: (itemValue: string) => boolean;\n}\n\nconst AccordionContext = createContext<AccordionContextValue>();\nconst AccordionItemContext = createContext<{ value: string; disabled?: boolean }>();\n\nexport const useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('Accordion components must be used within Accordion');\n }\n return context;\n};\n\nexport const useAccordionItemContext = () => {\n const context = useContext(AccordionItemContext);\n if (!context) {\n throw new Error('Accordion.Trigger and Accordion.Content must be used within Accordion.Item');\n }\n return context;\n};\n\nexport interface AccordionProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 当前打开的值(单个或数组)\n */\n value?: string | string[];\n /**\n * 默认打开的值\n */\n defaultValue?: string | string[];\n /**\n * 值变化回调\n */\n onValueChange?: (value: string | string[]) => void;\n /**\n * 类型:单个或多个\n * @default 'single'\n */\n type?: 'single' | 'multiple';\n /**\n * 是否可折叠(仅 single 类型)\n * @default false\n */\n collapsible?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst AccordionBase: Component<AccordionProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'type',\n 'collapsible',\n 'class',\n 'children',\n ]);\n\n const type = () => local.type ?? 'single';\n const collapsible = () => local.collapsible ?? false;\n\n const [internalValue, setInternalValue] = createSignal<string | string[] | undefined>(\n local.value ?? local.defaultValue\n );\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (itemValue: string) => {\n const currentValue = value();\n let newValue: string | string[];\n\n if (type() === 'single') {\n // 单个模式:如果点击的是已打开的项且可折叠,则关闭;否则打开该项\n if (collapsible() && currentValue === itemValue) {\n newValue = '';\n } else {\n newValue = itemValue;\n }\n } else {\n // 多个模式:切换该项的打开状态\n const currentArray = Array.isArray(currentValue) ? currentValue : currentValue ? [currentValue] : [];\n const index = currentArray.indexOf(itemValue);\n if (index > -1) {\n newValue = currentArray.filter((v) => v !== itemValue);\n } else {\n newValue = [...currentArray, itemValue];\n }\n }\n\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const isItemOpen = (itemValue: string) => {\n const currentValue = value();\n if (type() === 'single') {\n return currentValue === itemValue;\n } else {\n const currentArray = Array.isArray(currentValue) ? currentValue : [];\n return currentArray.includes(itemValue);\n }\n };\n\n const contextValue: AccordionContextValue = {\n value,\n setValue: handleValueChange,\n type: type(),\n collapsible: collapsible(),\n isItemOpen,\n };\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <div class={local.class} {...others}>\n {local.children}\n </div>\n </AccordionContext.Provider>\n );\n};\n\nexport interface AccordionComponent extends Component<AccordionProps> {\n Item: Component<AccordionItemProps>;\n Trigger: Component<AccordionTriggerProps>;\n Content: Component<AccordionContentProps>;\n}\n\nexport const Accordion = Object.assign(AccordionBase, {\n Item: null as unknown as Component<AccordionItemProps>,\n Trigger: null as unknown as Component<AccordionTriggerProps>,\n Content: null as unknown as Component<AccordionContentProps>,\n}) as AccordionComponent;\n\nexport interface AccordionItemProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 项的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AccordionItem: Component<AccordionItemProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'disabled', 'children', 'class']);\n const context = useAccordionContext();\n\n const isOpen = () => context.isItemOpen(local.value);\n\n const itemContext = {\n value: local.value,\n disabled: local.disabled,\n };\n\n return (\n <AccordionItemContext.Provider value={itemContext}>\n <div\n class={local.class}\n data-state={isOpen() ? 'open' : 'closed'}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </div>\n </AccordionItemContext.Provider>\n );\n};\n\nexport interface AccordionTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AccordionTrigger: Component<AccordionTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class', 'onClick']);\n const context = useAccordionContext();\n const itemContext = useAccordionItemContext();\n\n const isOpen = () => context.isItemOpen(itemContext.value);\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n if (!itemContext.disabled) {\n context.setValue(itemContext.value);\n }\n };\n\n return (\n <button\n type=\"button\"\n class={local.class}\n onClick={handleClick}\n disabled={itemContext.disabled}\n aria-expanded={isOpen()}\n aria-controls={`accordion-content-${itemContext.value}`}\n data-state={isOpen() ? 'open' : 'closed'}\n data-disabled={itemContext.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface AccordionContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AccordionContent: Component<AccordionContentProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class']);\n const context = useAccordionContext();\n const itemContext = useAccordionItemContext();\n\n const isOpen = () => context.isItemOpen(itemContext.value);\n\n return (\n <div\n id={`accordion-content-${itemContext.value}`}\n class={local.class}\n hidden={!isOpen()}\n data-state={isOpen() ? 'open' : 'closed'}\n {...others}\n >\n {isOpen() && local.children}\n </div>\n );\n};\n\nAccordion.Item = AccordionItem;\nAccordion.Trigger = AccordionTrigger;\nAccordion.Content = AccordionContent;\n\n"],"names":["AccordionContext","createContext","AccordionItemContext","useAccordionContext","context","useContext","Error","useAccordionItemContext","AccordionBase","props","local","others","splitProps","type","collapsible","internalValue","setInternalValue","createSignal","value","defaultValue","isControlled","undefined","handleValueChange","itemValue","currentValue","newValue","currentArray","Array","isArray","index","indexOf","filter","v","onValueChange","isItemOpen","includes","contextValue","setValue","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","Accordion","Object","assign","Item","Trigger","Content","AccordionItem","isOpen","itemContext","disabled","_el$2","AccordionTrigger","handleClick","e","onClick","_el$3","_tmpl$2","$$click","AccordionContent","_el$4","id","hidden","_c$","_$memo","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AlertDialog.js","sources":["../../../src/components/AlertDialog/AlertDialog.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 AlertDialogContextValue {\n open: () => boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst AlertDialogContext = createContext<AlertDialogContextValue>();\n\nexport const useAlertDialogContext = () => {\n const context = useContext(AlertDialogContext);\n if (!context) {\n throw new Error(\"AlertDialog components must be used within AlertDialog\");\n }\n return context;\n};\n\nexport interface AlertDialogProps 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 AlertDialogBase: Component<AlertDialogProps> = (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\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 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: AlertDialogContextValue = {\n open,\n setOpen: handleOpenChange,\n };\n\n return (\n <AlertDialogContext.Provider value={contextValue}>\n {local.children}\n </AlertDialogContext.Provider>\n );\n};\n\nexport interface AlertDialogComponent extends Component<AlertDialogProps> {\n Trigger: Component<AlertDialogTriggerProps>;\n Overlay: Component<AlertDialogOverlayProps>;\n Content: Component<AlertDialogContentProps>;\n Title: Component<AlertDialogTitleProps>;\n Description: Component<AlertDialogDescriptionProps>;\n Action: Component<AlertDialogActionProps>;\n Cancel: Component<AlertDialogCancelProps>;\n}\n\nexport const AlertDialog = Object.assign(AlertDialogBase, {\n Trigger: null as unknown as Component<AlertDialogTriggerProps>,\n Overlay: null as unknown as Component<AlertDialogOverlayProps>,\n Content: null as unknown as Component<AlertDialogContentProps>,\n Title: null as unknown as Component<AlertDialogTitleProps>,\n Description: null as unknown as Component<AlertDialogDescriptionProps>,\n Action: null as unknown as Component<AlertDialogActionProps>,\n Cancel: null as unknown as Component<AlertDialogCancelProps>,\n}) as AlertDialogComponent;\n\nexport interface AlertDialogTriggerProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const AlertDialogTrigger: Component<AlertDialogTriggerProps> = (\n props,\n) => {\n const [local, others] = splitProps(props, [\n \"children\",\n \"asChild\",\n \"class\",\n \"onClick\",\n ]);\n const context = useAlertDialogContext();\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 AlertDialogContentProps\n extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport interface AlertDialogOverlayProps\n extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AlertDialogOverlay: Component<AlertDialogOverlayProps> = (\n props,\n) => {\n const [local, others] = splitProps(props, [\"children\", \"class\", \"onClick\"]);\n const context = useAlertDialogContext();\n\n const handleClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (typeof local.onClick === \"function\") {\n local.onClick(e);\n }\n // AlertDialog 不允许点击遮罩层关闭\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 AlertDialogContent: Component<AlertDialogContentProps> = (\n props,\n) => {\n const [local, others] = splitProps(props, [\"class\", \"children\"] as const);\n const context = useAlertDialogContext();\n\n return (\n <Show when={context.open()}>\n <Portal mount={!isServer ? document.body : undefined}>\n <AlertDialogOverlay 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=\"alertdialog\"\n aria-modal=\"true\"\n data-state={context.open() ? \"open\" : \"closed\"}\n {...others}\n >\n {local.children}\n </div>\n </Portal>\n </Show>\n );\n};\n\nexport interface AlertDialogTitleProps\n extends JSX.HTMLAttributes<HTMLHeadingElement> {\n /**\n * 标题文本\n */\n children?: JSX.Element;\n}\n\nexport const AlertDialogTitle: Component<AlertDialogTitleProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"] as const);\n\n return (\n <h2 class={local.class} {...others}>\n {local.children}\n </h2>\n );\n};\n\nexport interface AlertDialogDescriptionProps\n extends JSX.HTMLAttributes<HTMLParagraphElement> {\n /**\n * 描述文本\n */\n children?: JSX.Element;\n}\n\nexport const AlertDialogDescription: Component<AlertDialogDescriptionProps> = (\n props,\n) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"] as const);\n\n return (\n <p class={local.class} {...others}>\n {local.children}\n </p>\n );\n};\n\nexport interface AlertDialogActionProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AlertDialogAction: Component<AlertDialogActionProps> = (props) => {\n const [local, others] = splitProps(\n props,\n [\"children\", \"class\", \"onClick\"] as const,\n );\n const context = useAlertDialogContext();\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\nexport interface AlertDialogCancelProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AlertDialogCancel: Component<AlertDialogCancelProps> = (props) => {\n const [local, others] = splitProps(\n props,\n [\"children\", \"class\", \"onClick\"] as const,\n );\n const context = useAlertDialogContext();\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\nAlertDialog.Trigger = AlertDialogTrigger;\nAlertDialog.Overlay = AlertDialogOverlay;\nAlertDialog.Content = AlertDialogContent;\nAlertDialog.Title = AlertDialogTitle;\nAlertDialog.Description = AlertDialogDescription;\nAlertDialog.Action = AlertDialogAction;\nAlertDialog.Cancel = AlertDialogCancel;\n"],"names":["AlertDialogContext","createContext","useAlertDialogContext","context","useContext","Error","AlertDialogBase","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","_$createComponent","Provider","value","children","AlertDialog","Object","assign","Trigger","Overlay","Content","Title","Description","Action","Cancel","AlertDialogTrigger","others","handleClick","onClick","_el$","_tmpl$","$$click","_$spread","_$mergeProps","class","_$insert","AlertDialogOverlay","_el$2","_tmpl$2","AlertDialogContent","Show","when","Portal","mount","_el$3","_tmpl$3","AlertDialogTitle","_el$4","_tmpl$4","AlertDialogDescription","_el$5","_tmpl$5","AlertDialogAction","_el$6","AlertDialogCancel","_el$7","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AspectRatio.js","sources":["../../../src/components/AspectRatio/AspectRatio.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\nexport interface AspectRatioProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 宽高比\n * @default 1\n */\n ratio?: number;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AspectRatio: Component<AspectRatioProps> = (props) => {\n const [local, others] = splitProps(props, ['ratio', 'class', 'children', 'style']);\n\n const ratio = () => local.ratio ?? 1;\n const paddingBottom = () => `${(1 / ratio()) * 100}%`;\n\n return (\n <div\n class={local.class}\n style={`position: relative; width: 100%; padding-bottom: ${paddingBottom()}; ${typeof local.style === 'string' ? local.style : ''}`}\n {...others}\n >\n <div\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"\n >\n {local.children}\n </div>\n </div>\n );\n};\n\n"],"names":["AspectRatio","props","local","others","splitProps","ratio","paddingBottom","_el$","_tmpl$","_el$2","firstChild","_$spread","_$mergeProps","class","style","_$insert","children"],"mappings":";;;AAeO,MAAMA,cAA4CC,CAAAA,UAAU;AACjE,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,SAAS,SAAS,YAAY,OAAO,CAAC;AAEjF,QAAMI,QAAQA,MAAMH,MAAMG,SAAS;AACnC,QAAMC,gBAAgBA,MAAM,GAAI,IAAID,MAAAA,IAAW,GAAG;AAElD,UAAA,MAAA;AAAA,QAAAE,OAAAC,OAAAA,GAAAC,QAAAF,KAAAG;AAAAC,WAAAJ,MAAAK,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWV,MAAMW;AAAAA,MAAK;AAAA,MAAA,IAClBC,QAAK;AAAA,eAAE,oDAAoDR,cAAAA,CAAe,KAAK,OAAOJ,MAAMY,UAAU,WAAWZ,MAAMY,QAAQ,EAAE;AAAA,MAAE;AAAA,IAAA,GAC/HX,MAAM,GAAA,OAAA,IAAA;AAAAY,WAAAN,OAAA,MAKPP,MAAMc,QAAQ;AAAA,WAAAT;AAAAA,EAAA,GAAA;AAIvB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { splitProps, Show, createSignal, createContext, useContext, createEffect, onCleanup } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\ninterface AvatarContextValue {\n imageLoadingStatus: () => 'loading' | 'loaded' | 'error';\n setImageLoadingStatus: (status: 'loading' | 'loaded' | 'error') => void;\n}\n\nconst AvatarContext = createContext<AvatarContextValue>();\n\nconst useAvatarContext = () => {\n const context = useContext(AvatarContext);\n if (!context) {\n throw new Error('Avatar components must be used within Avatar');\n }\n return context;\n};\n\nexport interface AvatarProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport interface AvatarComponent extends Component<AvatarProps> {\n Image: Component<AvatarImageProps>;\n Fallback: Component<AvatarFallbackProps>;\n}\n\nexport const AvatarBase: Component<AvatarProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n const [imageLoadingStatus, setImageLoadingStatus] = createSignal<'loading' | 'loaded' | 'error'>('loading');\n\n const contextValue: AvatarContextValue = {\n imageLoadingStatus,\n setImageLoadingStatus,\n };\n\n return (\n <AvatarContext.Provider value={contextValue}>\n <div\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n </AvatarContext.Provider>\n );\n};\n\nexport const Avatar = Object.assign(AvatarBase, {\n Image: null as unknown as Component<AvatarImageProps>,\n Fallback: null as unknown as Component<AvatarFallbackProps>,\n}) as AvatarComponent;\n\nexport interface AvatarImageProps extends JSX.ImgHTMLAttributes<HTMLImageElement> {\n /**\n * 图片源地址\n */\n src?: string;\n /**\n * 图片加载失败时的替代文本\n */\n alt?: string;\n /**\n * 加载状态变化回调\n */\n onLoadingStatusChange?: (status: 'loading' | 'loaded' | 'error') => void;\n}\n\nexport const AvatarImage: Component<AvatarImageProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'src',\n 'alt',\n 'class',\n 'onLoadingStatusChange',\n 'onLoad',\n 'onError',\n ]);\n const context = useAvatarContext();\n\n // 当 src 变化时,重置加载状态\n createEffect(() => {\n if (local.src) {\n context.setImageLoadingStatus('loading');\n }\n });\n\n const handleLoad: JSX.EventHandler<HTMLImageElement, Event> = (e) => {\n if (typeof local.onLoad === 'function') {\n local.onLoad(e);\n }\n context.setImageLoadingStatus('loaded');\n local.onLoadingStatusChange?.('loaded');\n };\n\n const handleError: JSX.EventHandler<HTMLImageElement, Event> = (e) => {\n if (typeof local.onError === 'function') {\n local.onError(e as any);\n }\n context.setImageLoadingStatus('error');\n local.onLoadingStatusChange?.('error');\n };\n\n return (\n <Show when={local.src && context.imageLoadingStatus() !== 'error'}>\n <img\n src={local.src}\n alt={local.alt}\n class={local.class}\n onLoad={handleLoad}\n onError={handleError}\n {...others}\n />\n </Show>\n );\n};\n\nexport interface AvatarFallbackProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 延迟显示时间(毫秒)\n * @default 0\n */\n delayMs?: number;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const AvatarFallback: Component<AvatarFallbackProps> = (props) => {\n const [local, others] = splitProps(props, ['delayMs', 'class', 'children']);\n const context = useAvatarContext();\n const [showFallback, setShowFallback] = createSignal(false);\n let timeoutId: number | undefined;\n\n // 根据加载状态和延迟时间决定是否显示 fallback\n createEffect(() => {\n const status = context.imageLoadingStatus();\n const delayMs = local.delayMs ?? 0;\n\n if (status === 'error') {\n // 如果加载失败,立即显示\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n setShowFallback(true);\n } else if (status === 'loading') {\n // 如果正在加载,根据延迟时间决定\n if (delayMs === 0) {\n setShowFallback(true);\n } else if (delayMs > 0) {\n setShowFallback(false);\n timeoutId = setTimeout(() => {\n // 延迟后如果仍在加载,显示 fallback\n if (context.imageLoadingStatus() === 'loading') {\n setShowFallback(true);\n }\n }, delayMs) as unknown as number;\n }\n } else if (status === 'loaded') {\n // 如果已加载,隐藏 fallback\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n setShowFallback(false);\n }\n });\n\n onCleanup(() => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n });\n\n return (\n <Show when={showFallback()}>\n <div\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n </Show>\n );\n};\n\nAvatar.Image = AvatarImage;\nAvatar.Fallback = AvatarFallback;\n\n"],"names":["AvatarContext","createContext","useAvatarContext","context","useContext","Error","AvatarBase","props","local","others","splitProps","imageLoadingStatus","setImageLoadingStatus","createSignal","contextValue","_$createComponent","Provider","value","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","Avatar","Object","assign","Image","Fallback","AvatarImage","createEffect","src","handleLoad","e","onLoad","onLoadingStatusChange","handleError","onError","Show","when","_$memo","_el$2","_tmpl$2","addEventListener","alt","AvatarFallback","showFallback","setShowFallback","timeoutId","status","delayMs","clearTimeout","undefined","setTimeout","onCleanup","_el$3"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import { createSignal, splitProps } from \"solid-js\";\nimport type { Component } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\n\nexport interface CheckboxProps\n extends\n Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"checked\" | \"onChange\"\n > {\n /**\n * 是否选中\n */\n checked?: boolean;\n /**\n * 默认选中状态\n */\n defaultChecked?: boolean;\n /**\n * 选中状态变化回调\n */\n onCheckedChange?: (checked: boolean) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 是否必填\n * @default false\n */\n required?: boolean;\n}\n\nexport const Checkbox: Component<CheckboxProps> = (props) => {\n const [local, others] = splitProps(props, [\n \"checked\",\n \"defaultChecked\",\n \"onCheckedChange\",\n \"disabled\",\n \"required\",\n \"class\",\n \"id\",\n ]);\n\n const [internalChecked, setInternalChecked] = createSignal(\n local.checked ?? local.defaultChecked ?? false,\n );\n\n const isControlled = () => local.checked !== undefined;\n const checked = () => (isControlled() ? local.checked! : internalChecked());\n\n const handleChange = (e: Event) => {\n const target = e.currentTarget as HTMLInputElement;\n const newChecked = target.checked;\n\n if (!isControlled()) {\n setInternalChecked(newChecked);\n }\n\n local.onCheckedChange?.(newChecked);\n };\n\n return (\n <input\n type=\"checkbox\"\n id={local.id}\n checked={checked()}\n disabled={local.disabled}\n required={local.required}\n class={local.class}\n onChange={handleChange}\n data-state={checked() ? \"checked\" : \"unchecked\"}\n aria-checked={checked()}\n {...others}\n />\n );\n};\n"],"names":["Checkbox","props","local","others","splitProps","internalChecked","setInternalChecked","createSignal","checked","defaultChecked","isControlled","undefined","handleChange","e","target","currentTarget","newChecked","onCheckedChange","_el$","_tmpl$","addEventListener","_$spread","_$mergeProps","id","disabled","required","class"],"mappings":";;;AAkCO,MAAMA,WAAsCC,CAAAA,UAAU;AACzD,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACtC,WACA,kBACA,mBACA,YACA,YACA,SACA,IAAI,CACP;AAED,QAAM,CAACI,iBAAiBC,kBAAkB,IAAIC,aAC1CL,MAAMM,WAAWN,MAAMO,kBAAkB,KAC7C;AAEA,QAAMC,eAAeA,MAAMR,MAAMM,YAAYG;AAC7C,QAAMH,UAAUA,MAAOE,aAAAA,IAAiBR,MAAMM,UAAWH,gBAAAA;AAEzD,QAAMO,eAAeA,CAACC,MAAa;AAC/B,UAAMC,SAASD,EAAEE;AACjB,UAAMC,aAAaF,OAAON;AAE1B,QAAI,CAACE,gBAAgB;AACjBJ,yBAAmBU,UAAU;AAAA,IACjC;AAEAd,UAAMe,kBAAkBD,UAAU;AAAA,EACtC;AAEA,UAAA,MAAA;AAAA,QAAAE,OAAAC,OAAAA;AAAAD,SAAAE,iBAAA,UAQkBR,YAAY;AAAAS,WAAAH,MAAAI,WAAA;AAAA,MAAA,IALtBC,KAAE;AAAA,eAAErB,MAAMqB;AAAAA,MAAE;AAAA,MAAA,IACZf,UAAO;AAAA,eAAEA,QAAAA;AAAAA,MAAS;AAAA,MAAA,IAClBgB,WAAQ;AAAA,eAAEtB,MAAMsB;AAAAA,MAAQ;AAAA,MAAA,IACxBC,WAAQ;AAAA,eAAEvB,MAAMuB;AAAAA,MAAQ;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACjBvB,MAAMwB;AAAAA,MAAK;AAAA,MAAA,KAAA,YAAA,IAAA;AAAA,eAENlB,QAAAA,IAAY,YAAY;AAAA,MAAW;AAAA,MAAA,KAAA,cAAA,IAAA;AAAA,eACjCA,QAAAA;AAAAA,MAAS;AAAA,IAAA,GACnBL,MAAM,GAAA,OAAA,KAAA;AAAA,WAAAe;AAAAA,EAAA,GAAA;AAGtB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Collapsible.js","sources":["../../../src/components/Collapsible/Collapsible.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext, Show } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\ninterface CollapsibleContextValue {\n open: () => boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst CollapsibleContext = createContext<CollapsibleContextValue>();\n\nexport const useCollapsibleContext = () => {\n const context = useContext(CollapsibleContext);\n if (!context) {\n throw new Error('Collapsible components must be used within Collapsible');\n }\n return context;\n};\n\nexport interface CollapsibleProps 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 false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst CollapsibleBase: Component<CollapsibleProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'disabled',\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 (local.disabled) return;\n if (!isControlled()) {\n setInternalOpen(newOpen);\n }\n local.onOpenChange?.(newOpen);\n };\n\n const contextValue: CollapsibleContextValue = {\n open,\n setOpen: handleOpenChange,\n };\n\n return (\n <CollapsibleContext.Provider value={contextValue}>\n <div\n class={local.class}\n data-state={open() ? 'open' : 'closed'}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </div>\n </CollapsibleContext.Provider>\n );\n};\n\nexport interface CollapsibleComponent extends Component<CollapsibleProps> {\n Trigger: Component<CollapsibleTriggerProps>;\n Content: Component<CollapsibleContentProps>;\n}\n\nexport const Collapsible = Object.assign(CollapsibleBase, {\n Trigger: null as unknown as Component<CollapsibleTriggerProps>,\n Content: null as unknown as Component<CollapsibleContentProps>,\n}) as CollapsibleComponent;\n\nexport interface CollapsibleTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const CollapsibleTrigger: Component<CollapsibleTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onClick']);\n const context = useCollapsibleContext();\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 return (\n <button\n type=\"button\"\n class={local.class}\n onClick={handleClick}\n aria-expanded={context.open()}\n aria-controls=\"collapsible-content\"\n data-state={context.open() ? 'open' : 'closed'}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface CollapsibleContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const CollapsibleContent: Component<CollapsibleContentProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class']);\n const context = useCollapsibleContext();\n\n return (\n <Show when={context.open()}>\n <div\n id=\"collapsible-content\"\n class={local.class}\n data-state={context.open() ? 'open' : 'closed'}\n {...others}\n >\n {local.children}\n </div>\n </Show>\n );\n};\n\nCollapsible.Trigger = CollapsibleTrigger;\nCollapsible.Content = CollapsibleContent;\n\n"],"names":["CollapsibleContext","createContext","useCollapsibleContext","context","useContext","Error","CollapsibleBase","props","local","others","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","isControlled","undefined","handleOpenChange","newOpen","disabled","onOpenChange","contextValue","setOpen","_$createComponent","Provider","value","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","Collapsible","Object","assign","Trigger","Content","CollapsibleTrigger","handleClick","e","onClick","_el$2","_tmpl$2","$$click","CollapsibleContent","Show","when","_el$3","_tmpl$3","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContextMenu.js","sources":["../../../src/components/ContextMenu/ContextMenu.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 ContextMenuContextValue {\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 position: () => { x: number; y: number } | undefined;\n setPosition: (pos: { x: number; y: number } | undefined) => void;\n}\n\nconst ContextMenuContext = createContext<ContextMenuContextValue>();\n\nexport const useContextMenuContext = () => {\n const context = useContext(ContextMenuContext);\n if (!context) {\n throw new Error('ContextMenu components must be used within ContextMenu');\n }\n return context;\n};\n\nexport interface ContextMenuProps 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 ContextMenuBase: Component<ContextMenuProps> = (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 const [position, setPosition] = createSignal<{ x: number; y: number } | 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 if (!newOpen) {\n setPosition(undefined);\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 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: ContextMenuContextValue = {\n open,\n setOpen: handleOpenChange,\n triggerRef,\n setTriggerRef,\n setContentElement,\n position,\n setPosition,\n };\n\n return (\n <ContextMenuContext.Provider value={contextValue}>\n {local.children}\n </ContextMenuContext.Provider>\n );\n};\n\nexport interface ContextMenuComponent extends Component<ContextMenuProps> {\n Trigger: Component<ContextMenuTriggerProps>;\n Content: Component<ContextMenuContentProps>;\n Item: Component<ContextMenuItemProps>;\n Label: Component<ContextMenuLabelProps>;\n Separator: Component<ContextMenuSeparatorProps>;\n}\n\nexport const ContextMenu = Object.assign(ContextMenuBase, {\n Trigger: null as unknown as Component<ContextMenuTriggerProps>,\n Content: null as unknown as Component<ContextMenuContentProps>,\n Item: null as unknown as Component<ContextMenuItemProps>,\n Label: null as unknown as Component<ContextMenuLabelProps>,\n Separator: null as unknown as Component<ContextMenuSeparatorProps>,\n}) as ContextMenuComponent;\n\nexport interface ContextMenuTriggerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const ContextMenuTrigger: Component<ContextMenuTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onContextMenu']);\n const context = useContextMenuContext();\n let triggerElement: HTMLDivElement | undefined;\n\n const handleContextMenu: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (typeof local.onContextMenu === 'function') {\n local.onContextMenu(e as any);\n }\n e.preventDefault();\n const pos = { x: e.clientX, y: e.clientY };\n context.setPosition(pos);\n context.setOpen(true);\n };\n\n onMount(() => {\n if (triggerElement) {\n context.setTriggerRef(triggerElement);\n }\n });\n\n return (\n <div\n ref={triggerElement}\n class={local.class}\n onContextMenu={handleContextMenu}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ContextMenuContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ContextMenuContent: Component<ContextMenuContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useContextMenuContext();\n let contentElement: HTMLDivElement | undefined;\n\n const updatePosition = () => {\n if (!isServer && contentElement && context.position()) {\n const pos = context.position()!;\n const contentRect = contentElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let finalTop = pos.y;\n let finalLeft = pos.x;\n\n // 如果右侧超出,则左对齐\n if (pos.x + contentRect.width > viewportWidth) {\n finalLeft = viewportWidth - contentRect.width - 16;\n }\n\n // 如果下方超出,则在上方显示\n if (pos.y + contentRect.height > viewportHeight) {\n finalTop = pos.y - contentRect.height;\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 && context.position()) {\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={{\n top: context.position() ? `${context.position()!.y}px` : '0px',\n left: context.position() ? `${context.position()!.x}px` : '0px',\n }}\n {...others}\n >\n {local.children}\n </div>\n </Portal>\n </Show>\n );\n};\n\nexport interface ContextMenuItemProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const ContextMenuItem: Component<ContextMenuItemProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'disabled', 'asChild', 'class', 'onClick']);\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (local.disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n };\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n class={local.class}\n disabled={local.disabled}\n onClick={handleClick}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface ContextMenuLabelProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ContextMenuLabel: Component<ContextMenuLabelProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class']);\n\n return (\n <div\n role=\"menuitem\"\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ContextMenuSeparatorProps extends JSX.HTMLAttributes<HTMLHRElement> {\n}\n\nexport const ContextMenuSeparator: Component<ContextMenuSeparatorProps> = (props) => {\n const [local, others] = splitProps(props, ['class']);\n\n return (\n <hr\n role=\"separator\"\n class={local.class}\n {...others}\n />\n );\n};\n\nContextMenu.Trigger = ContextMenuTrigger;\nContextMenu.Content = ContextMenuContent;\nContextMenu.Item = ContextMenuItem;\nContextMenu.Label = ContextMenuLabel;\nContextMenu.Separator = ContextMenuSeparator;\n\n"],"names":["ContextMenuContext","createContext","useContextMenuContext","context","useContext","Error","ContextMenuBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","triggerRef","setTriggerRef","position","setPosition","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","ContextMenu","Object","assign","Trigger","Content","Item","Label","Separator","ContextMenuTrigger","others","triggerElement","handleContextMenu","onContextMenu","preventDefault","pos","x","clientX","y","clientY","onMount","_el$","_tmpl$","$$contextmenu","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","ContextMenuContent","updatePosition","contentRect","getBoundingClientRect","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","width","height","style","top","left","requestAnimationFrame","Show","when","Portal","mount","body","_el$2","_tmpl$2","_ref$2","ContextMenuItem","handleClick","disabled","stopPropagation","onClick","_el$3","_tmpl$3","$$click","ContextMenuLabel","_el$4","_tmpl$4","ContextMenuSeparator","_el$5","_tmpl$5","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"HoverCard.js","sources":["../../../src/components/HoverCard/HoverCard.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 HoverCardContextValue {\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 delayDuration: number;\n}\n\nconst HoverCardContext = createContext<HoverCardContextValue>();\n\nexport const useHoverCardContext = () => {\n const context = useContext(HoverCardContext);\n if (!context) {\n throw new Error('HoverCard components must be used within HoverCard');\n }\n return context;\n};\n\nexport interface HoverCardProps 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 700\n */\n openDelay?: number;\n /**\n * 延迟隐藏时间(毫秒)\n * @default 300\n */\n closeDelay?: number;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst HoverCardBase: Component<HoverCardProps> = (props) => {\n const [local] = splitProps(props, [\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'openDelay',\n 'closeDelay',\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 const delayDuration = local.openDelay ?? 700;\n\n const handleOpenChange = (newOpen: boolean) => {\n if (!isControlled()) {\n setInternalOpen(newOpen);\n }\n local.onOpenChange?.(newOpen);\n };\n\n // 点击外部关闭\n const setContentElement = (_el: HTMLElement | undefined) => {\n // contentElement reference stored in context\n };\n\n const contextValue: HoverCardContextValue = {\n open,\n setOpen: handleOpenChange,\n triggerRef,\n setTriggerRef,\n setContentElement,\n delayDuration,\n };\n\n return (\n <HoverCardContext.Provider value={contextValue}>\n {local.children}\n </HoverCardContext.Provider>\n );\n};\n\nexport interface HoverCardComponent extends Component<HoverCardProps> {\n Trigger: Component<HoverCardTriggerProps>;\n Content: Component<HoverCardContentProps>;\n}\n\nexport const HoverCard = Object.assign(HoverCardBase, {\n Trigger: null as unknown as Component<HoverCardTriggerProps>,\n Content: null as unknown as Component<HoverCardContentProps>,\n}) as HoverCardComponent;\n\nexport interface HoverCardTriggerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const HoverCardTrigger: Component<HoverCardTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onMouseEnter', 'onMouseLeave']);\n const context = useHoverCardContext();\n let triggerElement: HTMLDivElement | undefined;\n let openTimeoutId: number | undefined;\n let closeTimeoutId: number | undefined;\n\n const handleMouseEnter: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n closeTimeoutId = undefined;\n }\n if (typeof local.onMouseEnter === 'function') {\n local.onMouseEnter(e);\n }\n openTimeoutId = setTimeout(() => {\n context.setOpen(true);\n }, context.delayDuration) as unknown as number;\n };\n\n const handleMouseLeave: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n openTimeoutId = undefined;\n }\n if (typeof local.onMouseLeave === 'function') {\n local.onMouseLeave(e);\n }\n closeTimeoutId = setTimeout(() => {\n context.setOpen(false);\n }, 300) as unknown as number;\n };\n\n onMount(() => {\n if (triggerElement) {\n context.setTriggerRef(triggerElement);\n }\n });\n\n onCleanup(() => {\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n }\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n }\n });\n\n return (\n <div\n ref={triggerElement}\n class={local.class}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface HoverCardContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const HoverCardContent: Component<HoverCardContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useHoverCardContext();\n let contentElement: HTMLDivElement | undefined;\n let closeTimeoutId: number | 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 + 8;\n const left = rect.left + (rect.width / 2) - (contentRect.width / 2);\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 < 0) {\n finalLeft = 16;\n }\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 - 8;\n }\n\n contentElement.style.top = `${finalTop}px`;\n contentElement.style.left = `${finalLeft}px`;\n }\n };\n\n const handleMouseEnter = () => {\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n closeTimeoutId = undefined;\n }\n };\n\n const handleMouseLeave = () => {\n closeTimeoutId = setTimeout(() => {\n context.setOpen(false);\n }, 300) as unknown as number;\n };\n\n onMount(() => {\n if (contentElement) {\n context.setContentElement(contentElement);\n }\n });\n\n onCleanup(() => {\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n }\n });\n\n createEffect(() => {\n if (context.open() && !isServer) {\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=\"tooltip\"\n class={`fixed z-50 ${local.class || ''}`}\n data-state={context.open() ? 'open' : 'closed'}\n style={{ top: '0px', left: '0px' }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...others}\n >\n {local.children}\n </div>\n </Portal>\n </Show>\n );\n};\n\nHoverCard.Trigger = HoverCardTrigger;\nHoverCard.Content = HoverCardContent;\n\n"],"names":["HoverCardContext","createContext","useHoverCardContext","context","useContext","Error","HoverCardBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","triggerRef","setTriggerRef","isControlled","undefined","delayDuration","openDelay","handleOpenChange","newOpen","onOpenChange","setContentElement","_el","contextValue","setOpen","_$createComponent","Provider","value","children","HoverCard","Object","assign","Trigger","Content","HoverCardTrigger","others","triggerElement","openTimeoutId","closeTimeoutId","handleMouseEnter","e","clearTimeout","onMouseEnter","setTimeout","handleMouseLeave","onMouseLeave","onMount","onCleanup","_el$","_tmpl$","addEventListener","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","HoverCardContent","contentElement","updatePosition","isServer","trigger","rect","getBoundingClientRect","contentRect","top","bottom","left","width","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","height","style","createEffect","requestAnimationFrame","Show","when","Portal","mount","document","body","_el$2","_tmpl$2","_ref$2"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Label.js","sources":["../../../src/components/Label/Label.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface LabelProps extends JSX.LabelHTMLAttributes<HTMLLabelElement> {\n /**\n * 标签文本\n */\n children?: JSX.Element;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n}\n\nexport const Label: Component<LabelProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'disabled', 'class']);\n \n return (\n <label\n class={local.class}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </label>\n );\n};\n\n"],"names":["Label","props","local","others","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","class","disabled","undefined","_$insert","children"],"mappings":";;;AAgBO,MAAMA,QAAgCC,CAAAA,UAAU;AACrD,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,YAAY,YAAY,OAAO,CAAC;AAE3E,UAAA,MAAA;AAAA,QAAAI,OAAAC,OAAAA;AAAAC,WAAAF,MAAAG,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eACHP,MAAMQ,WAAW,KAAKC;AAAAA,MAAS;AAAA,IAAA,GAC1CR,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAP,MAAA,MAETH,MAAMW,QAAQ;AAAA,WAAAR;AAAAA,EAAA,GAAA;AAGrB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Menubar.js","sources":["../../../src/components/Menubar/Menubar.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 MenubarContextValue {\n value: () => string | undefined;\n setValue: (value: string | undefined) => void;\n triggerRefs: () => Map<string, HTMLElement>;\n setTriggerRef: (value: string, ref: HTMLElement | undefined) => void;\n setContentElement: (value: string, el: HTMLElement | undefined) => void;\n}\n\nconst MenubarContext = createContext<MenubarContextValue>();\n\nexport const useMenubarContext = () => {\n const context = useContext(MenubarContext);\n if (!context) {\n throw new Error('Menubar components must be used within Menubar');\n }\n return context;\n};\n\nexport interface MenubarProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 当前打开的值\n */\n value?: string;\n /**\n * 默认打开的值\n */\n defaultValue?: string;\n /**\n * 值变化回调\n */\n onValueChange?: (value: string | undefined) => void;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst MenubarBase: Component<MenubarProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'class',\n 'children',\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string | undefined>(\n local.value ?? local.defaultValue\n );\n const [triggerRefs, setTriggerRefs] = createSignal<Map<string, HTMLElement>>(new Map());\n const contentElements = new Map<string, HTMLElement>();\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (newValue: string | undefined) => {\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const setTriggerRef = (menuValue: string, ref: HTMLElement | undefined) => {\n const refs = new Map(triggerRefs());\n if (ref) {\n refs.set(menuValue, ref);\n } else {\n refs.delete(menuValue);\n }\n setTriggerRefs(refs);\n };\n\n const setContentElement = (menuValue: string, el: HTMLElement | undefined) => {\n if (el) {\n contentElements.set(menuValue, el);\n } else {\n contentElements.delete(menuValue);\n }\n };\n\n // 点击外部关闭\n const handleClickOutside = (e: MouseEvent) => {\n const currentValue = value();\n if (currentValue && !isServer) {\n const target = e.target as HTMLElement;\n const trigger = triggerRefs().get(currentValue);\n const content = contentElements.get(currentValue);\n\n if (trigger && content) {\n if (!trigger.contains(target) && !content.contains(target)) {\n handleValueChange(undefined);\n }\n }\n }\n };\n\n // ESC 键关闭\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && value()) {\n handleValueChange(undefined);\n }\n };\n\n createEffect(() => {\n if (!isServer) {\n if (value()) {\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: MenubarContextValue = {\n value,\n setValue: handleValueChange,\n triggerRefs,\n setTriggerRef,\n setContentElement,\n };\n\n return (\n <MenubarContext.Provider value={contextValue}>\n <div\n class={local.class}\n role=\"menubar\"\n {...others}\n >\n {local.children}\n </div>\n </MenubarContext.Provider>\n );\n};\n\nexport interface MenubarComponent extends Component<MenubarProps> {\n Menu: Component<MenubarMenuProps>;\n Trigger: Component<MenubarTriggerProps>;\n Content: Component<MenubarContentProps>;\n Item: Component<MenubarItemProps>;\n Separator: Component<MenubarSeparatorProps>;\n}\n\nexport const Menubar = Object.assign(MenubarBase, {\n Menu: null as unknown as Component<MenubarMenuProps>,\n Trigger: null as unknown as Component<MenubarTriggerProps>,\n Content: null as unknown as Component<MenubarContentProps>,\n Item: null as unknown as Component<MenubarItemProps>,\n Separator: null as unknown as Component<MenubarSeparatorProps>,\n}) as MenubarComponent;\n\nexport interface MenubarMenuProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 菜单的值\n */\n value: string;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const MenubarMenu: Component<MenubarMenuProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'class', 'children']);\n\n return (\n <div\n class={local.class}\n data-value={local.value}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface MenubarTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const MenubarTrigger: Component<MenubarTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onClick']);\n const context = useMenubarContext();\n let triggerElement: HTMLButtonElement | undefined;\n let menuValue: string | undefined;\n\n // 从父元素获取 value\n onMount(() => {\n if (triggerElement) {\n const parent = triggerElement.closest('[data-value]');\n if (parent) {\n menuValue = parent.getAttribute('data-value') || undefined;\n if (menuValue) {\n context.setTriggerRef(menuValue, triggerElement);\n }\n }\n }\n });\n\n const isOpen = () => context.value() === menuValue;\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n if (menuValue) {\n context.setValue(isOpen() ? undefined : menuValue);\n }\n };\n\n return (\n <button\n type=\"button\"\n ref={triggerElement}\n role=\"menuitem\"\n class={local.class}\n onClick={handleClick}\n aria-expanded={isOpen()}\n data-state={isOpen() ? 'open' : 'closed'}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface MenubarContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const MenubarContent: Component<MenubarContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useMenubarContext();\n let contentElement: HTMLDivElement | undefined;\n let menuValue: string | undefined;\n\n onMount(() => {\n if (contentElement) {\n const parent = contentElement.closest('[data-value]');\n if (parent) {\n menuValue = parent.getAttribute('data-value') || undefined;\n if (menuValue) {\n context.setContentElement(menuValue, contentElement);\n }\n }\n }\n });\n\n const isOpen = () => menuValue ? context.value() === menuValue : false;\n\n const updatePosition = () => {\n if (!isServer && contentElement && menuValue) {\n const trigger = context.triggerRefs().get(menuValue);\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n const contentRect = contentElement.getBoundingClientRect();\n\n const top = rect.bottom + 8;\n const left = rect.left;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let finalTop = top;\n let finalLeft = left;\n\n if (left + contentRect.width > viewportWidth) {\n finalLeft = viewportWidth - contentRect.width - 16;\n }\n\n if (top + contentRect.height > viewportHeight) {\n finalTop = rect.top - contentRect.height - 8;\n }\n\n contentElement.style.top = `${finalTop}px`;\n contentElement.style.left = `${finalLeft}px`;\n }\n }\n };\n\n createEffect(() => {\n if (isOpen() && !isServer) {\n requestAnimationFrame(() => {\n updatePosition();\n });\n }\n });\n\n return (\n <Show when={isOpen()}>\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={isOpen() ? '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 MenubarItemProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const MenubarItem: Component<MenubarItemProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'disabled', 'asChild', 'class', 'onClick']);\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (local.disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n };\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n class={local.class}\n disabled={local.disabled}\n onClick={handleClick}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface MenubarSeparatorProps extends JSX.HTMLAttributes<HTMLHRElement> {\n}\n\nexport const MenubarSeparator: Component<MenubarSeparatorProps> = (props) => {\n const [local, others] = splitProps(props, ['class']);\n\n return (\n <hr\n role=\"separator\"\n class={local.class}\n {...others}\n />\n );\n};\n\nMenubar.Menu = MenubarMenu;\nMenubar.Trigger = MenubarTrigger;\nMenubar.Content = MenubarContent;\nMenubar.Item = MenubarItem;\nMenubar.Separator = MenubarSeparator;\n\n"],"names":["MenubarContext","createContext","useMenubarContext","context","useContext","Error","MenubarBase","props","local","others","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","triggerRefs","setTriggerRefs","Map","contentElements","isControlled","undefined","handleValueChange","newValue","onValueChange","setTriggerRef","menuValue","ref","refs","set","delete","setContentElement","el","handleClickOutside","e","currentValue","isServer","target","trigger","get","content","contains","handleKeyDown","key","createEffect","setTimeout","document","addEventListener","removeEventListener","onCleanup","contextValue","setValue","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","Menubar","Object","assign","Menu","Trigger","Content","Item","Separator","MenubarMenu","_el$2","_tmpl$2","MenubarTrigger","triggerElement","onMount","parent","closest","getAttribute","isOpen","handleClick","onClick","_el$3","_tmpl$3","$$click","_ref$","_$use","MenubarContent","contentElement","updatePosition","rect","getBoundingClientRect","contentRect","top","bottom","left","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","width","height","style","requestAnimationFrame","Show","when","Portal","mount","body","_el$4","_tmpl$4","_ref$2","MenubarItem","disabled","preventDefault","stopPropagation","_el$5","MenubarSeparator","_el$6","_tmpl$5","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NavigationMenu.js","sources":["../../../src/components/NavigationMenu/NavigationMenu.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 NavigationMenuContextValue {\n value: () => string | undefined;\n setValue: (value: string | undefined) => void;\n triggerRefs: () => Map<string, HTMLElement>;\n setTriggerRef: (value: string, ref: HTMLElement | undefined) => void;\n setContentElement: (value: string, el: HTMLElement | undefined) => void;\n}\n\nconst NavigationMenuContext = createContext<NavigationMenuContextValue>();\n\nexport const useNavigationMenuContext = () => {\n const context = useContext(NavigationMenuContext);\n if (!context) {\n throw new Error('NavigationMenu components must be used within NavigationMenu');\n }\n return context;\n};\n\nexport interface NavigationMenuProps extends JSX.HTMLAttributes<HTMLElement> {\n /**\n * 当前打开的值\n */\n value?: string;\n /**\n * 默认打开的值\n */\n defaultValue?: string;\n /**\n * 值变化回调\n */\n onValueChange?: (value: string | undefined) => void;\n /**\n * 方向\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst NavigationMenuBase: Component<NavigationMenuProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'orientation',\n 'class',\n 'children',\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string | undefined>(\n local.value ?? local.defaultValue\n );\n const [triggerRefs, setTriggerRefs] = createSignal<Map<string, HTMLElement>>(new Map());\n const contentElements = new Map<string, HTMLElement>();\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (newValue: string | undefined) => {\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const setTriggerRef = (itemValue: string, ref: HTMLElement | undefined) => {\n const refs = new Map(triggerRefs());\n if (ref) {\n refs.set(itemValue, ref);\n } else {\n refs.delete(itemValue);\n }\n setTriggerRefs(refs);\n };\n\n const setContentElement = (itemValue: string, el: HTMLElement | undefined) => {\n if (el) {\n contentElements.set(itemValue, el);\n } else {\n contentElements.delete(itemValue);\n }\n };\n\n // 点击外部关闭\n const handleClickOutside = (e: MouseEvent) => {\n const currentValue = value();\n if (currentValue && !isServer) {\n const target = e.target as HTMLElement;\n const trigger = triggerRefs().get(currentValue);\n const content = contentElements.get(currentValue);\n\n if (trigger && content) {\n if (!trigger.contains(target) && !content.contains(target)) {\n handleValueChange(undefined);\n }\n }\n }\n };\n\n // ESC 键关闭\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && value()) {\n handleValueChange(undefined);\n }\n };\n\n createEffect(() => {\n if (!isServer) {\n if (value()) {\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: NavigationMenuContextValue = {\n value,\n setValue: handleValueChange,\n triggerRefs,\n setTriggerRef,\n setContentElement,\n };\n\n return (\n <NavigationMenuContext.Provider value={contextValue}>\n <nav\n class={local.class}\n role=\"navigation\"\n aria-orientation={local.orientation ?? 'horizontal'}\n {...others}\n >\n {local.children}\n </nav>\n </NavigationMenuContext.Provider>\n );\n};\n\nexport interface NavigationMenuComponent extends Component<NavigationMenuProps> {\n List: Component<NavigationMenuListProps>;\n Item: Component<NavigationMenuItemProps>;\n Trigger: Component<NavigationMenuTriggerProps>;\n Content: Component<NavigationMenuContentProps>;\n Link: Component<NavigationMenuLinkProps>;\n Indicator: Component<NavigationMenuIndicatorProps>;\n Viewport: Component<NavigationMenuViewportProps>;\n}\n\nexport const NavigationMenu = Object.assign(NavigationMenuBase, {\n List: null as unknown as Component<NavigationMenuListProps>,\n Item: null as unknown as Component<NavigationMenuItemProps>,\n Trigger: null as unknown as Component<NavigationMenuTriggerProps>,\n Content: null as unknown as Component<NavigationMenuContentProps>,\n Link: null as unknown as Component<NavigationMenuLinkProps>,\n Indicator: null as unknown as Component<NavigationMenuIndicatorProps>,\n Viewport: null as unknown as Component<NavigationMenuViewportProps>,\n}) as NavigationMenuComponent;\n\nexport interface NavigationMenuListProps extends JSX.HTMLAttributes<HTMLUListElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const NavigationMenuList: Component<NavigationMenuListProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n\n return (\n <ul\n class={local.class}\n role=\"list\"\n {...others}\n >\n {local.children}\n </ul>\n );\n};\n\nexport interface NavigationMenuItemProps extends JSX.LiHTMLAttributes<HTMLLIElement> {\n /**\n * 项的值\n */\n value: string;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const NavigationMenuItem: Component<NavigationMenuItemProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'class', 'children']);\n\n return (\n <li\n class={local.class}\n data-value={local.value}\n {...others}\n >\n {local.children}\n </li>\n );\n};\n\nexport interface NavigationMenuTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const NavigationMenuTrigger: Component<NavigationMenuTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class', 'onClick']);\n const context = useNavigationMenuContext();\n let triggerElement: HTMLButtonElement | undefined;\n let itemValue: string | undefined;\n\n onMount(() => {\n if (triggerElement) {\n const parent = triggerElement.closest('[data-value]');\n if (parent) {\n itemValue = parent.getAttribute('data-value') || undefined;\n if (itemValue) {\n context.setTriggerRef(itemValue, triggerElement);\n }\n }\n }\n });\n\n const isOpen = () => context.value() === itemValue;\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n if (itemValue) {\n context.setValue(isOpen() ? undefined : itemValue);\n }\n };\n\n return (\n <button\n type=\"button\"\n ref={triggerElement}\n class={local.class}\n onClick={handleClick}\n aria-expanded={isOpen()}\n aria-controls={itemValue ? `navigation-menu-content-${itemValue}` : undefined}\n data-state={isOpen() ? 'open' : 'closed'}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface NavigationMenuContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const NavigationMenuContent: Component<NavigationMenuContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useNavigationMenuContext();\n let contentElement: HTMLDivElement | undefined;\n let itemValue: string | undefined;\n\n onMount(() => {\n if (contentElement) {\n const parent = contentElement.closest('[data-value]');\n if (parent) {\n itemValue = parent.getAttribute('data-value') || undefined;\n if (itemValue) {\n context.setContentElement(itemValue, contentElement);\n }\n }\n }\n });\n\n const isOpen = () => itemValue ? context.value() === itemValue : false;\n\n const updatePosition = () => {\n if (!isServer && contentElement && itemValue) {\n const trigger = context.triggerRefs().get(itemValue);\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n const contentRect = contentElement.getBoundingClientRect();\n\n const top = rect.bottom + 8;\n const left = rect.left;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let finalTop = top;\n let finalLeft = left;\n\n if (left + contentRect.width > viewportWidth) {\n finalLeft = viewportWidth - contentRect.width - 16;\n }\n\n if (top + contentRect.height > viewportHeight) {\n finalTop = rect.top - contentRect.height - 8;\n }\n\n contentElement.style.top = `${finalTop}px`;\n contentElement.style.left = `${finalLeft}px`;\n }\n }\n };\n\n createEffect(() => {\n if (isOpen() && !isServer) {\n requestAnimationFrame(() => {\n updatePosition();\n });\n }\n });\n\n return (\n <Show when={isOpen()}>\n <Portal mount={!isServer ? document.body : undefined}>\n <div\n ref={contentElement}\n id={itemValue ? `navigation-menu-content-${itemValue}` : undefined}\n role=\"menu\"\n class={`fixed z-50 ${local.class || ''}`}\n data-state={isOpen() ? '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 NavigationMenuLinkProps extends JSX.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const NavigationMenuLink: Component<NavigationMenuLinkProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class']);\n\n return (\n <a\n class={local.class}\n {...others}\n >\n {local.children}\n </a>\n );\n};\n\nexport interface NavigationMenuIndicatorProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const NavigationMenuIndicator: Component<NavigationMenuIndicatorProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n\n return (\n <div\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface NavigationMenuViewportProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const NavigationMenuViewport: Component<NavigationMenuViewportProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n\n return (\n <div\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nNavigationMenu.List = NavigationMenuList;\nNavigationMenu.Item = NavigationMenuItem;\nNavigationMenu.Trigger = NavigationMenuTrigger;\nNavigationMenu.Content = NavigationMenuContent;\nNavigationMenu.Link = NavigationMenuLink;\nNavigationMenu.Indicator = NavigationMenuIndicator;\nNavigationMenu.Viewport = NavigationMenuViewport;\n\n"],"names":["NavigationMenuContext","createContext","useNavigationMenuContext","context","useContext","Error","NavigationMenuBase","props","local","others","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","triggerRefs","setTriggerRefs","Map","contentElements","isControlled","undefined","handleValueChange","newValue","onValueChange","setTriggerRef","itemValue","ref","refs","set","delete","setContentElement","el","handleClickOutside","e","currentValue","isServer","target","trigger","get","content","contains","handleKeyDown","key","createEffect","setTimeout","document","addEventListener","removeEventListener","onCleanup","contextValue","setValue","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","orientation","_$insert","NavigationMenu","Object","assign","List","Item","Trigger","Content","Link","Indicator","Viewport","NavigationMenuList","_el$2","_tmpl$2","NavigationMenuItem","_el$3","_tmpl$3","NavigationMenuTrigger","triggerElement","onMount","parent","closest","getAttribute","isOpen","handleClick","onClick","_el$4","_tmpl$4","$$click","_ref$","_$use","_$setAttribute","NavigationMenuContent","contentElement","updatePosition","rect","getBoundingClientRect","contentRect","top","bottom","left","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","width","height","style","requestAnimationFrame","Show","when","Portal","mount","body","_el$5","_tmpl$5","_ref$2","NavigationMenuLink","_el$6","_tmpl$6","NavigationMenuIndicator","_el$7","_tmpl$7","NavigationMenuViewport","_el$8","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.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 PopoverContextValue {\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 PopoverContext = createContext<PopoverContextValue>();\n\nexport const usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (!context) {\n throw new Error(\"Popover components must be used within Popover\");\n }\n return context;\n};\n\nexport interface PopoverProps 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 PopoverBase: Component<PopoverProps> = (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 createEffect(() => {\n if (!isServer) {\n if (open()) {\n // 延迟添加事件监听器,确保 DOM 已更新\n setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n } else {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }\n });\n\n onCleanup(() => {\n if (!isServer) {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n });\n\n const contextValue: PopoverContextValue = {\n open,\n setOpen: handleOpenChange,\n triggerRef,\n setTriggerRef,\n setContentElement,\n };\n\n return (\n <PopoverContext.Provider value={contextValue}>\n {local.children}\n </PopoverContext.Provider>\n );\n};\n\nexport interface PopoverComponent extends Component<PopoverProps> {\n Trigger: Component<PopoverTriggerProps>;\n Content: Component<PopoverContentProps>;\n}\n\nexport const Popover = Object.assign(PopoverBase, {\n Trigger: null as unknown as Component<PopoverTriggerProps>,\n Content: null as unknown as Component<PopoverContentProps>,\n}) as PopoverComponent;\n\nexport interface PopoverTriggerProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const PopoverTrigger: Component<PopoverTriggerProps> = (props) => {\n const [local, others] = splitProps(props, [\n \"children\",\n \"asChild\",\n \"class\",\n \"onClick\",\n ]);\n const context = usePopoverContext();\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 PopoverContentProps\n extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const PopoverContent: Component<PopoverContentProps> = (props) => {\n const [local, others] = splitProps(props, [\"class\", \"children\"] as const);\n const context = usePopoverContext();\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 + 8;\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 - 8;\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=\"dialog\"\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\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n"],"names":["PopoverContext","createContext","usePopoverContext","context","useContext","Error","PopoverBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","triggerRef","setTriggerRef","isControlled","undefined","handleOpenChange","newOpen","onOpenChange","contentElement","setContentElement","el","handleClickOutside","e","isServer","target","trigger","contains","createEffect","setTimeout","document","addEventListener","removeEventListener","onCleanup","contextValue","setOpen","_$createComponent","Provider","value","children","Popover","Object","assign","Trigger","Content","PopoverTrigger","others","triggerElement","handleClick","onClick","onMount","_el$","_tmpl$","$$click","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","PopoverContent","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","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Progress.js","sources":["../../../src/components/Progress/Progress.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface ProgressProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 进度值(0-100)\n */\n value?: number;\n /**\n * 最大值\n * @default 100\n */\n max?: number;\n /**\n * 是否显示值\n * @default false\n */\n showValue?: boolean;\n}\n\nexport const Progress: Component<ProgressProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'max',\n 'showValue',\n 'class',\n 'children',\n ]);\n\n const value = () => local.value ?? 0;\n const max = () => local.max ?? 100;\n const percentage = () => Math.min(Math.max((value() / max()) * 100, 0), 100);\n\n return (\n <div\n class={local.class}\n role=\"progressbar\"\n aria-valuenow={value()}\n aria-valuemin={0}\n aria-valuemax={max()}\n data-value={value()}\n data-max={max()}\n {...others}\n >\n <div\n class=\"h-full transition-all\"\n style={`width: ${percentage()}%`}\n />\n {local.showValue && (\n <span class=\"absolute inset-0 flex items-center justify-center text-sm\">\n {Math.round(percentage())}%\n </span>\n )}\n {local.children}\n </div>\n );\n};\n\n"],"names":["Progress","props","local","others","splitProps","value","max","percentage","Math","min","_el$","_tmpl$","_el$2","firstChild","_$spread","_$mergeProps","class","_$insert","_c$","_$memo","showValue","_el$3","_tmpl$2","_el$4","round","children","_$effect","_$p","_$style"],"mappings":";;;AAqBO,MAAMA,WAAsCC,CAAAA,UAAU;AAC3D,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,SACA,OACA,aACA,SACA,UAAU,CACX;AAED,QAAMI,QAAQA,MAAMH,MAAMG,SAAS;AACnC,QAAMC,MAAMA,MAAMJ,MAAMI,OAAO;AAC/B,QAAMC,aAAaA,MAAMC,KAAKC,IAAID,KAAKF,IAAKD,MAAAA,IAAUC,IAAAA,IAAS,KAAK,CAAC,GAAG,GAAG;AAE3E,UAAA,MAAA;AAAA,QAAAI,OAAAC,OAAAA,GAAAC,QAAAF,KAAAG;AAAAC,WAAAJ,MAAAK,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWb,MAAMc;AAAAA,MAAK;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eAEHX,MAAAA;AAAAA,MAAO;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eAEPC,IAAAA;AAAAA,MAAK;AAAA,MAAA,KAAA,YAAA,IAAA;AAAA,eACRD,MAAAA;AAAAA,MAAO;AAAA,MAAA,KAAA,UAAA,IAAA;AAAA,eACTC,IAAAA;AAAAA,MAAK;AAAA,IAAA,GACXH,MAAM,GAAA,OAAA,IAAA;AAAAc,WAAAP,OAAA,MAAA;AAAA,UAAAQ,MAAAC,KAAA,MAAA,CAAA,CAMTjB,MAAMkB,SAAS;AAAA,aAAA,MAAfF,IAAAA,MAAA,MAAA;AAAA,YAAAG,QAAAC,QAAAA,GAAAC,QAAAF,MAAAR;AAAAI,eAAAI,OAAA,MAEIb,KAAKgB,MAAMjB,WAAAA,CAAY,GAACgB,KAAA;AAAA,eAAAF;AAAAA,MAAA,GAAA;AAAA,IAE5B,GAAA,GAAA,IAAA;AAAAJ,WAAAP,MAAA,MACAR,MAAMuB,UAAQ,IAAA;AAAAC,WAAAC,CAAAA,QAAAC,MAAAhB,OAPN,UAAUL,YAAY,KAAGoB,GAAA,CAAA;AAAA,WAAAjB;AAAAA,EAAA,GAAA;AAUxC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RadioGroup.js","sources":["../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX as JSXTypes } from 'solid-js';\n\ninterface RadioGroupContextValue {\n value: () => string | undefined;\n setValue: (value: string) => void;\n disabled?: boolean;\n name?: string;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>();\n\nexport const useRadioGroupContext = () => {\n const context = useContext(RadioGroupContext);\n if (!context) {\n throw new Error('RadioGroup.Item must be used within RadioGroup');\n }\n return context;\n};\n\nexport interface RadioGroupProps extends JSXTypes.HTMLAttributes<HTMLDivElement> {\n /**\n * 选中的值\n */\n value?: string;\n /**\n * 默认选中的值\n */\n defaultValue?: string;\n /**\n * 值变化回调\n */\n onValueChange?: (value: string) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 表单字段名称\n */\n name?: string;\n /**\n * 是否必填\n * @default false\n */\n required?: boolean;\n}\n\nconst RadioGroupBase: Component<RadioGroupProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'disabled',\n 'name',\n 'required',\n 'class',\n 'children',\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string | undefined>(\n local.value ?? local.defaultValue\n );\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (newValue: string) => {\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const contextValue: RadioGroupContextValue = {\n value,\n setValue: handleValueChange,\n disabled: local.disabled,\n name: local.name,\n };\n\n return (\n <RadioGroupContext.Provider value={contextValue}>\n <div\n role=\"radiogroup\"\n class={local.class}\n aria-required={local.required}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </div>\n </RadioGroupContext.Provider>\n );\n};\n\nexport interface RadioGroupComponent extends Component<RadioGroupProps> {\n Item: Component<RadioGroupItemProps>;\n}\n\nexport const RadioGroup = Object.assign(RadioGroupBase, {\n Item: null as unknown as Component<RadioGroupItemProps>,\n}) as RadioGroupComponent;\n\nexport interface RadioGroupItemProps extends JSXTypes.InputHTMLAttributes<HTMLInputElement> {\n /**\n * 选项的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n}\n\nexport const RadioGroupItem: Component<RadioGroupItemProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'disabled', 'class', 'id']);\n const context = useRadioGroupContext();\n\n const checked = () => context.value() === local.value;\n const disabled = () => local.disabled ?? context.disabled;\n\n const handleChange = () => {\n if (!disabled()) {\n context.setValue(local.value);\n }\n };\n\n return (\n <input\n type=\"radio\"\n id={local.id}\n name={context.name}\n value={local.value}\n checked={checked()}\n disabled={disabled()}\n class={local.class}\n onChange={handleChange}\n data-state={checked() ? 'checked' : 'unchecked'}\n aria-checked={checked()}\n {...others}\n />\n );\n};\n\nRadioGroup.Item = RadioGroupItem;\n\n"],"names":["RadioGroupContext","createContext","useRadioGroupContext","context","useContext","Error","RadioGroupBase","props","local","others","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","isControlled","undefined","handleValueChange","newValue","onValueChange","contextValue","setValue","disabled","name","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","required","_$insert","RadioGroup","Object","assign","Item","RadioGroupItem","checked","handleChange","_el$2","_tmpl$2","addEventListener","id"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScrollArea.js","sources":["../../../src/components/ScrollArea/ScrollArea.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\nexport interface ScrollAreaProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 滚动条方向\n * @default 'vertical'\n */\n orientation?: 'vertical' | 'horizontal' | 'both';\n /**\n * 类型\n * @default 'hover'\n */\n type?: 'auto' | 'always' | 'scroll' | 'hover';\n}\n\nexport interface ScrollAreaComponent extends Component<ScrollAreaProps> {\n Viewport: Component<ScrollAreaViewportProps>;\n Scrollbar: Component<ScrollAreaScrollbarProps>;\n Thumb: Component<ScrollAreaThumbProps>;\n Corner: Component<ScrollAreaCornerProps>;\n}\n\nconst ScrollAreaBase: Component<ScrollAreaProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'children',\n 'orientation',\n 'type',\n 'class',\n ]);\n\n return (\n <div\n class={local.class}\n data-orientation={local.orientation ?? 'vertical'}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport const ScrollArea = Object.assign(ScrollAreaBase, {\n Viewport: null as unknown as Component<ScrollAreaViewportProps>,\n Scrollbar: null as unknown as Component<ScrollAreaScrollbarProps>,\n Thumb: null as unknown as Component<ScrollAreaThumbProps>,\n Corner: null as unknown as Component<ScrollAreaCornerProps>,\n}) as ScrollAreaComponent;\n\nexport interface ScrollAreaViewportProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ScrollAreaViewport: Component<ScrollAreaViewportProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class']);\n\n return (\n <div\n class={local.class}\n style=\"overflow: scroll; width: 100%; height: 100%;\"\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ScrollAreaScrollbarProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 滚动条方向\n */\n orientation?: 'vertical' | 'horizontal';\n /**\n * 是否强制显示\n * @default false\n */\n forceMount?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ScrollAreaScrollbar: Component<ScrollAreaScrollbarProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'orientation',\n 'forceMount',\n 'class',\n 'children',\n ]);\n\n return (\n <div\n role=\"scrollbar\"\n class={local.class}\n data-orientation={local.orientation}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ScrollAreaThumbProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ScrollAreaThumb: Component<ScrollAreaThumbProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class']);\n\n return (\n <div\n class={local.class}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ScrollAreaCornerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const ScrollAreaCorner: Component<ScrollAreaCornerProps> = (props) => {\n const [local, others] = splitProps(props, ['class']);\n\n return (\n <div\n class={local.class}\n {...others}\n />\n );\n};\n\nScrollArea.Viewport = ScrollAreaViewport;\nScrollArea.Scrollbar = ScrollAreaScrollbar;\nScrollArea.Thumb = ScrollAreaThumb;\nScrollArea.Corner = ScrollAreaCorner;\n\n"],"names":["ScrollAreaBase","props","local","others","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","class","orientation","_$insert","children","ScrollArea","Object","assign","Viewport","Scrollbar","Thumb","Corner","ScrollAreaViewport","_el$2","_tmpl$2","ScrollAreaScrollbar","_el$3","_tmpl$3","ScrollAreaThumb","_el$4","ScrollAreaCorner","_el$5"],"mappings":";;;AA2BA,MAAMA,iBAA8CC,CAAAA,UAAU;AAC5D,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,YACA,eACA,QACA,OAAO,CACR;AAED,UAAA,MAAA;AAAA,QAAAI,OAAAC,OAAAA;AAAAC,WAAAF,MAAAG,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,MAAA,KAAA,kBAAA,IAAA;AAAA,eACAP,MAAMQ,eAAe;AAAA,MAAU;AAAA,IAAA,GAC7CP,MAAM,GAAA,OAAA,IAAA;AAAAQ,WAAAN,MAAA,MAETH,MAAMU,QAAQ;AAAA,WAAAP;AAAAA,EAAA,GAAA;AAGrB;AAEO,MAAMQ,aAAaC,OAAOC,OAAOf,gBAAgB;AAAA,EACtDgB,UAAU;AAAA,EACVC,WAAW;AAAA,EACXC,OAAO;AAAA,EACPC,QAAQ;AACV,CAAC;AASM,MAAMC,qBAA0DnB,CAAAA,UAAU;AAC/E,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,YAAY,OAAO,CAAC;AAE/D,UAAA,MAAA;AAAA,QAAAoB,QAAAC,QAAAA;AAAAf,WAAAc,OAAAb,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,IAAA,GAEdN,MAAM,GAAA,OAAA,IAAA;AAAAQ,WAAAU,OAAA,MAETnB,MAAMU,QAAQ;AAAA,WAAAS;AAAAA,EAAA,GAAA;AAGrB;AAkBO,MAAME,sBAA4DtB,CAAAA,UAAU;AACjF,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,eACA,cACA,SACA,UAAU,CACX;AAED,UAAA,MAAA;AAAA,QAAAuB,QAAAC,QAAAA;AAAAlB,WAAAiB,OAAAhB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAGWN,MAAMO;AAAAA,MAAK;AAAA,MAAA,KAAA,kBAAA,IAAA;AAAA,eACAP,MAAMQ;AAAAA,MAAW;AAAA,IAAA,GAC/BP,MAAM,GAAA,OAAA,IAAA;AAAAQ,WAAAa,OAAA,MAETtB,MAAMU,QAAQ;AAAA,WAAAY;AAAAA,EAAA,GAAA;AAGrB;AASO,MAAME,kBAAoDzB,CAAAA,UAAU;AACzE,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,YAAY,OAAO,CAAC;AAE/D,UAAA,MAAA;AAAA,QAAA0B,QAAArB,OAAAA;AAAAC,WAAAoB,OAAAnB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,IAAA,GACdN,MAAM,GAAA,OAAA,IAAA;AAAAQ,WAAAgB,OAAA,MAETzB,MAAMU,QAAQ;AAAA,WAAAe;AAAAA,EAAA,GAAA;AAGrB;AAKO,MAAMC,mBAAsD3B,CAAAA,UAAU;AAC3E,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,OAAO,CAAC;AAEnD,UAAA,MAAA;AAAA,QAAA4B,QAAAvB,OAAAA;AAAAC,WAAAsB,OAAArB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,IAAA,GACdN,MAAM,GAAA,OAAA,KAAA;AAAA,WAAA0B;AAAAA,EAAA,GAAA;AAGhB;AAEAhB,WAAWG,WAAWI;AACtBP,WAAWI,YAAYM;AACvBV,WAAWK,QAAQQ;AACnBb,WAAWM,SAASS;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext, Show, onMount, createEffect, onCleanup } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { isServer } from 'solid-js/web';\nimport type { Component, JSX } from 'solid-js';\n\ninterface SelectContextValue {\n value: () => string | undefined;\n setValue: (value: string) => void;\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 SelectContext = createContext<SelectContextValue>();\n\nexport const useSelectContext = () => {\n const context = useContext(SelectContext);\n if (!context) {\n throw new Error('Select components must be used within Select');\n }\n return context;\n};\n\nexport interface SelectProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 选中的值\n */\n value?: string;\n /**\n * 默认选中的值\n */\n defaultValue?: string;\n /**\n * 值变化回调\n */\n onValueChange?: (value: string) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst SelectBase: Component<SelectProps> = (props) => {\n const [local] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'disabled',\n 'children',\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string | undefined>(\n local.value ?? local.defaultValue\n );\n const [open, setOpen] = createSignal(false);\n const [triggerRef, setTriggerRef] = createSignal<HTMLElement | undefined>();\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (newValue: string) => {\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n setOpen(false);\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 setOpen(false);\n }\n }\n }\n };\n\n createEffect(() => {\n if (!isServer) {\n if (open()) {\n // 延迟添加事件监听器,确保 DOM 已更新\n setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }\n });\n\n onCleanup(() => {\n if (!isServer) {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n });\n\n const contextValue: SelectContextValue = {\n value,\n setValue: handleValueChange,\n open,\n setOpen,\n triggerRef,\n setTriggerRef,\n setContentElement,\n };\n\n return (\n <SelectContext.Provider value={contextValue}>\n {local.children}\n </SelectContext.Provider>\n );\n};\n\nexport interface SelectComponent extends Component<SelectProps> {\n Trigger: Component<SelectTriggerProps>;\n Value: Component<SelectValueProps>;\n Content: Component<SelectContentProps>;\n Item: Component<SelectItemProps>;\n}\n\nexport const Select = Object.assign(SelectBase, {\n Trigger: null as unknown as Component<SelectTriggerProps>,\n Value: null as unknown as Component<SelectValueProps>,\n Content: null as unknown as Component<SelectContentProps>,\n Item: null as unknown as Component<SelectItemProps>,\n}) as SelectComponent;\n\nexport interface SelectTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const SelectTrigger: Component<SelectTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'class', 'onClick']);\n const context = useSelectContext();\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 role=\"combobox\"\n ref={triggerElement}\n class={local.class}\n onClick={handleClick}\n aria-expanded={context.open()}\n data-state={context.open() ? 'open' : 'closed'}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface SelectValueProps extends JSX.HTMLAttributes<HTMLSpanElement> {\n /**\n * 占位符文本\n */\n placeholder?: string;\n}\n\nexport const SelectValue: Component<SelectValueProps> = (props) => {\n const [local, others] = splitProps(props, ['placeholder', 'class']);\n const context = useSelectContext();\n\n return (\n <span class={local.class} {...others}>\n {context.value() ?? local.placeholder ?? 'Select...'}\n </span>\n );\n};\n\nexport interface SelectContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const SelectContent: Component<SelectContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useSelectContext();\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 const width = rect.width;\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 + width > viewportWidth) {\n finalLeft = viewportWidth - 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 contentElement.style.width = `${width}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=\"listbox\"\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 SelectItemProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 选项的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const SelectItem: Component<SelectItemProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'disabled', 'children', 'class', 'onClick']);\n const context = useSelectContext();\n\n const isSelected = () => context.value() === local.value;\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 context.setValue(local.value);\n };\n\n return (\n <div\n role=\"option\"\n class={local.class}\n data-selected={isSelected() ? '' : undefined}\n data-disabled={local.disabled ? '' : undefined}\n onClick={handleClick}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nSelect.Trigger = SelectTrigger;\nSelect.Value = SelectValue;\nSelect.Content = SelectContent;\nSelect.Item = SelectItem;\n\n"],"names":["SelectContext","createContext","useSelectContext","context","useContext","Error","SelectBase","props","local","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","open","setOpen","triggerRef","setTriggerRef","isControlled","undefined","handleValueChange","newValue","onValueChange","contentElement","setContentElement","el","handleClickOutside","e","isServer","target","trigger","contains","createEffect","setTimeout","document","addEventListener","removeEventListener","onCleanup","contextValue","setValue","_$createComponent","Provider","children","Select","Object","assign","Trigger","Value","Content","Item","SelectTrigger","others","triggerElement","handleClick","onClick","onMount","_el$","_tmpl$","$$click","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","SelectValue","_el$2","_tmpl$2","placeholder","SelectContent","updatePosition","rect","getBoundingClientRect","contentRect","top","bottom","left","width","viewportWidth","window","innerWidth","viewportHeight","innerHeight","finalTop","finalLeft","height","style","requestAnimationFrame","Show","when","Portal","mount","body","_el$3","_tmpl$3","_ref$2","SelectItem","isSelected","disabled","preventDefault","_el$4","_tmpl$4","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Separator.js","sources":["../../../src/components/Separator/Separator.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\nexport interface SeparatorProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 分隔线的方向\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * 是否为装饰性分隔线(不用于语义分隔)\n * @default false\n */\n decorative?: boolean;\n}\n\nexport const Separator: Component<SeparatorProps> = (props) => {\n const [local, others] = splitProps(props, ['orientation', 'decorative', 'class']);\n \n const orientation = () => local.orientation ?? 'horizontal';\n const decorative = () => local.decorative ?? false;\n \n return (\n <div\n role={decorative() ? 'presentation' : 'separator'}\n aria-orientation={!decorative() ? orientation() : undefined}\n data-orientation={orientation()}\n class={local.class}\n {...others}\n />\n );\n};\n\n"],"names":["Separator","props","local","others","splitProps","orientation","decorative","_el$","_tmpl$","_$spread","_$mergeProps","role","_$memo","undefined","class"],"mappings":";;;AAgBO,MAAMA,YAAwCC,CAAAA,UAAU;AAC7D,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,eAAe,cAAc,OAAO,CAAC;AAEhF,QAAMI,cAAcA,MAAMH,MAAMG,eAAe;AAC/C,QAAMC,aAAaA,MAAMJ,MAAMI,cAAc;AAE7C,UAAA,MAAA;AAAA,QAAAC,OAAAC,OAAAA;AAAAC,WAAAF,MAAAG,WAAA;AAAA,MAAA,IAEIC,OAAI;AAAA,eAAEL,WAAAA,IAAe,iBAAiB;AAAA,MAAW;AAAA,MAAA,KAAA,kBAAA,IAAA;AAAA,eAC/BM,KAAA,MAAA,CAAA,CAAA,CAACN,YAAY,EAAA,IAAGD,YAAAA,IAAgBQ;AAAAA,MAAS;AAAA,MAAA,KAAA,kBAAA,IAAA;AAAA,eACzCR,YAAAA;AAAAA,MAAa;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACxBH,MAAMY;AAAAA,MAAK;AAAA,IAAA,GACdX,MAAM,GAAA,OAAA,KAAA;AAAA,WAAAI;AAAAA,EAAA,GAAA;AAGhB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Slider.js","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import { splitProps, createSignal } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface SliderProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\n /**\n * 当前值\n */\n value?: number[];\n /**\n * 默认值\n */\n defaultValue?: number[];\n /**\n * 值变化回调\n */\n onValueChange?: (value: number[]) => void;\n /**\n * 最小值\n * @default 0\n */\n min?: number;\n /**\n * 最大值\n * @default 100\n */\n max?: number;\n /**\n * 步长\n * @default 1\n */\n step?: number;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n}\n\nexport const Slider: Component<SliderProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'min',\n 'max',\n 'step',\n 'disabled',\n 'class',\n ]);\n\n const [internalValue, setInternalValue] = createSignal<number[]>(\n local.value ?? local.defaultValue ?? [50]\n );\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value! : internalValue());\n const min = () => local.min ?? 0;\n const max = () => local.max ?? 100;\n const step = () => local.step ?? 1;\n\n const handleInput = (e: Event) => {\n const target = e.currentTarget as HTMLInputElement;\n const newValue = [parseFloat(target.value)];\n\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const percentage = () => {\n const val = value()[0] ?? min();\n return ((val - min()) / (max() - min())) * 100;\n };\n\n return (\n <div class={local.class} data-disabled={local.disabled ? '' : undefined}>\n <input\n type=\"range\"\n min={min()}\n max={max()}\n step={step()}\n value={value()[0] ?? min()}\n disabled={local.disabled}\n onInput={handleInput}\n class=\"w-full\"\n style={`--value: ${percentage()}%`}\n {...others}\n />\n </div>\n );\n};\n\n"],"names":["Slider","props","local","others","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","isControlled","undefined","min","max","step","handleInput","e","target","currentTarget","newValue","parseFloat","onValueChange","percentage","val","_el$","_tmpl$","_el$2","firstChild","$$input","_$spread","_$mergeProps","disabled","style","_$effect","_p$","_v$","class","_v$2","_$className","t","_$setAttribute","_$delegateEvents"],"mappings":";;;AAuCO,MAAMA,SAAkCC,CAAAA,UAAU;AACvD,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,SACA,gBACA,iBACA,OACA,OACA,QACA,YACA,OAAO,CACR;AAED,QAAM,CAACI,eAAeC,gBAAgB,IAAIC,aACxCL,MAAMM,SAASN,MAAMO,gBAAgB,CAAC,EAAE,CAC1C;AAEA,QAAMC,eAAeA,MAAMR,MAAMM,UAAUG;AAC3C,QAAMH,QAAQA,MAAOE,aAAAA,IAAiBR,MAAMM,QAASH,cAAAA;AACrD,QAAMO,MAAMA,MAAMV,MAAMU,OAAO;AAC/B,QAAMC,MAAMA,MAAMX,MAAMW,OAAO;AAC/B,QAAMC,OAAOA,MAAMZ,MAAMY,QAAQ;AAEjC,QAAMC,cAAcA,CAACC,MAAa;AAChC,UAAMC,SAASD,EAAEE;AACjB,UAAMC,WAAW,CAACC,WAAWH,OAAOT,KAAK,CAAC;AAE1C,QAAI,CAACE,gBAAgB;AACnBJ,uBAAiBa,QAAQ;AAAA,IAC3B;AACAjB,UAAMmB,gBAAgBF,QAAQ;AAAA,EAChC;AAEA,QAAMG,aAAaA,MAAM;AACvB,UAAMC,MAAMf,MAAAA,EAAQ,CAAC,KAAKI,IAAAA;AAC1B,YAASW,MAAMX,IAAAA,MAAUC,IAAAA,IAAQD,SAAU;AAAA,EAC7C;AAEA,UAAA,MAAA;AAAA,QAAAY,OAAAC,OAAAA,GAAAC,QAAAF,KAAAG;AAAAD,UAAAE,UASeb;AAAWc,WAAAH,OAAAI,WAAA;AAAA,MAAA,IALpBlB,MAAG;AAAA,eAAEA,IAAAA;AAAAA,MAAK;AAAA,MAAA,IACVC,MAAG;AAAA,eAAEA,IAAAA;AAAAA,MAAK;AAAA,MAAA,IACVC,OAAI;AAAA,eAAEA,KAAAA;AAAAA,MAAM;AAAA,MAAA,IACZN,QAAK;AAAA,eAAEA,MAAAA,EAAQ,CAAC,KAAKI,IAAAA;AAAAA,MAAK;AAAA,MAAA,IAC1BmB,WAAQ;AAAA,eAAE7B,MAAM6B;AAAAA,MAAQ;AAAA,MAAA,IAGxBC,QAAK;AAAA,eAAE,YAAYV,YAAY;AAAA,MAAG;AAAA,IAAA,GAC9BnB,MAAM,GAAA,OAAA,KAAA;AAAA8B,WAAAC,CAAAA,QAAA;AAAA,UAAAC,MAXFjC,MAAMkC,OAAKC,OAAiBnC,MAAM6B,WAAW,KAAKpB;AAASwB,cAAAD,IAAAlB,KAAAsB,UAAAd,MAAAU,IAAAlB,IAAAmB,GAAA;AAAAE,eAAAH,IAAAK,KAAAC,aAAAhB,MAAA,iBAAAU,IAAAK,IAAAF,IAAA;AAAA,aAAAH;AAAAA,IAAA,GAAA;AAAA,MAAAlB,GAAAL;AAAAA,MAAA4B,GAAA5B;AAAAA,IAAAA,CAAA;AAAA,WAAAa;AAAAA,EAAA,GAAA;AAe3E;AAAEiB,eAAA,CAAA,OAAA,CAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Switch.js","sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { splitProps, createSignal } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface SwitchProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /**\n * 是否选中\n */\n checked?: boolean;\n /**\n * 默认选中状态\n */\n defaultChecked?: boolean;\n /**\n * 选中状态变化回调\n */\n onCheckedChange?: (checked: boolean) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 是否必填\n * @default false\n */\n required?: boolean;\n}\n\nexport const Switch: Component<SwitchProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'checked',\n 'defaultChecked',\n 'onCheckedChange',\n 'disabled',\n 'required',\n 'class',\n 'id',\n ]);\n\n const [internalChecked, setInternalChecked] = createSignal(\n local.checked ?? local.defaultChecked ?? false\n );\n\n const isControlled = () => local.checked !== undefined;\n const checked = () => (isControlled() ? local.checked! : internalChecked());\n\n const handleClick = () => {\n if (local.disabled) return;\n \n const newChecked = !checked();\n \n if (!isControlled()) {\n setInternalChecked(newChecked);\n }\n \n local.onCheckedChange?.(newChecked);\n };\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n id={local.id}\n aria-checked={checked()}\n aria-required={local.required}\n disabled={local.disabled}\n class={local.class}\n onClick={handleClick}\n data-state={checked() ? 'checked' : 'unchecked'}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n />\n );\n};\n\n"],"names":["Switch","props","local","others","splitProps","internalChecked","setInternalChecked","createSignal","checked","defaultChecked","isControlled","undefined","handleClick","disabled","newChecked","onCheckedChange","_el$","_tmpl$","$$click","_$spread","_$mergeProps","id","required","class","_$delegateEvents"],"mappings":";;;AA6BO,MAAMA,SAAkCC,CAAAA,UAAU;AACvD,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,WACA,kBACA,mBACA,YACA,YACA,SACA,IAAI,CACL;AAED,QAAM,CAACI,iBAAiBC,kBAAkB,IAAIC,aAC5CL,MAAMM,WAAWN,MAAMO,kBAAkB,KAC3C;AAEA,QAAMC,eAAeA,MAAMR,MAAMM,YAAYG;AAC7C,QAAMH,UAAUA,MAAOE,aAAAA,IAAiBR,MAAMM,UAAWH,gBAAAA;AAEzD,QAAMO,cAAcA,MAAM;AACxB,QAAIV,MAAMW,SAAU;AAEpB,UAAMC,aAAa,CAACN,QAAAA;AAEpB,QAAI,CAACE,gBAAgB;AACnBJ,yBAAmBQ,UAAU;AAAA,IAC/B;AAEAZ,UAAMa,kBAAkBD,UAAU;AAAA,EACpC;AAEA,UAAA,MAAA;AAAA,QAAAE,OAAAC,OAAAA;AAAAD,SAAAE,UASaN;AAAWO,WAAAH,MAAAI,WAAA;AAAA,MAAA,IALpBC,KAAE;AAAA,eAAEnB,MAAMmB;AAAAA,MAAE;AAAA,MAAA,KAAA,cAAA,IAAA;AAAA,eACEb,QAAAA;AAAAA,MAAS;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eACRN,MAAMoB;AAAAA,MAAQ;AAAA,MAAA,IAC7BT,WAAQ;AAAA,eAAEX,MAAMW;AAAAA,MAAQ;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACjBX,MAAMqB;AAAAA,MAAK;AAAA,MAAA,KAAA,YAAA,IAAA;AAAA,eAENf,QAAAA,IAAY,YAAY;AAAA,MAAW;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eAChCN,MAAMW,WAAW,KAAKF;AAAAA,MAAS;AAAA,IAAA,GAC1CR,MAAM,GAAA,OAAA,KAAA;AAAA,WAAAa;AAAAA,EAAA,GAAA;AAGhB;AAAEQ,eAAA,CAAA,OAAA,CAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { createContext, createSignal, splitProps, useContext } from \"solid-js\";\nimport type { Component, JSX } from \"solid-js\";\n\ninterface TabsContextValue {\n value: () => string | undefined;\n setValue: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nconst TabsContext = createContext<TabsContextValue>();\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs components must be used within Tabs\");\n }\n return context;\n};\n\nexport interface TabsProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 当前激活的标签页值\n */\n value?: string;\n /**\n * 默认激活的标签页值\n */\n defaultValue?: string;\n /**\n * 值变化回调\n */\n onValueChange?: (value: string) => void;\n /**\n * 标签页方向\n * @default 'horizontal'\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst TabsBase: Component<TabsProps> = (props) => {\n const [local, others] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"orientation\",\n \"class\",\n \"children\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal<string | undefined>(\n local.value ?? local.defaultValue,\n );\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (newValue: string) => {\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const contextValue: TabsContextValue = {\n value,\n setValue: handleValueChange,\n orientation: local.orientation ?? \"horizontal\",\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n class={local.class}\n data-orientation={contextValue.orientation}\n {...others}\n >\n {local.children}\n </div>\n </TabsContext.Provider>\n );\n};\n\nexport interface TabsComponent extends Component<TabsProps> {\n List: Component<TabsListProps>;\n Trigger: Component<TabsTriggerProps>;\n Content: Component<TabsContentProps>;\n}\n\nexport const Tabs = Object.assign(TabsBase, {\n List: null as unknown as Component<TabsListProps>,\n Trigger: null as unknown as Component<TabsTriggerProps>,\n Content: null as unknown as Component<TabsContentProps>,\n}) as TabsComponent;\n\nexport interface TabsListProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const TabsList: Component<TabsListProps> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"class\"]);\n const context = useTabsContext();\n\n return (\n <div\n role=\"tablist\"\n class={local.class}\n aria-orientation={context.orientation}\n data-orientation={context.orientation}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface TabsTriggerProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 标签页的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const TabsTrigger: Component<TabsTriggerProps> = (props) => {\n const [local, others] = splitProps(props, [\n \"value\",\n \"disabled\",\n \"children\",\n \"class\",\n \"onClick\",\n ]);\n const context = useTabsContext();\n\n const isActive = () => context.value() === local.value;\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === \"function\") {\n local.onClick(e);\n }\n if (!local.disabled) {\n context.setValue(local.value);\n }\n };\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n class={local.class}\n disabled={local.disabled}\n aria-selected={isActive()}\n aria-controls={`tabpanel-${local.value}`}\n data-state={isActive() ? \"active\" : \"inactive\"}\n data-disabled={local.disabled ? \"\" : undefined}\n onClick={handleClick}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface TabsContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 内容对应的标签页值\n */\n value: string;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const TabsContent: Component<TabsContentProps> = (props) => {\n const [local, others] = splitProps(props, [\"value\", \"children\", \"class\"]);\n const context = useTabsContext();\n\n const isActive = () => context.value() === local.value;\n\n return (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${local.value}`}\n class={local.class}\n aria-labelledby={`tab-${local.value}`}\n hidden={!isActive()}\n data-state={isActive() ? \"active\" : \"inactive\"}\n {...others}\n >\n {isActive() && local.children}\n </div>\n );\n};\n\nTabs.List = TabsList;\nTabs.Trigger = TabsTrigger;\nTabs.Content = TabsContent;\n"],"names":["TabsContext","createContext","useTabsContext","context","useContext","Error","TabsBase","props","local","others","splitProps","internalValue","setInternalValue","createSignal","value","defaultValue","isControlled","undefined","handleValueChange","newValue","onValueChange","contextValue","setValue","orientation","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","Tabs","Object","assign","List","Trigger","Content","TabsList","_el$2","_tmpl$2","TabsTrigger","isActive","handleClick","e","onClick","disabled","_el$3","_tmpl$3","$$click","TabsContent","_el$4","_tmpl$4","id","hidden","_c$","_$memo","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toggle.js","sources":["../../../src/components/Toggle/Toggle.tsx"],"sourcesContent":["import { splitProps, createSignal } from 'solid-js';\nimport type { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface ToggleProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /**\n * 是否按下\n */\n pressed?: boolean;\n /**\n * 默认按下状态\n */\n defaultPressed?: boolean;\n /**\n * 按下状态变化回调\n */\n onPressedChange?: (pressed: boolean) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n}\n\nexport const Toggle: Component<ToggleProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'pressed',\n 'defaultPressed',\n 'onPressedChange',\n 'disabled',\n 'class',\n 'children',\n 'onClick',\n ]);\n\n const [internalPressed, setInternalPressed] = createSignal(\n local.pressed ?? local.defaultPressed ?? false\n );\n\n const isControlled = () => local.pressed !== undefined;\n const pressed = () => (isControlled() ? local.pressed! : internalPressed());\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (local.disabled) {\n e.preventDefault();\n return;\n }\n\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n\n const newPressed = !pressed();\n \n if (!isControlled()) {\n setInternalPressed(newPressed);\n }\n \n local.onPressedChange?.(newPressed);\n };\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-pressed={pressed()}\n disabled={local.disabled}\n class={local.class}\n onClick={handleClick}\n data-state={pressed() ? 'on' : 'off'}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\n"],"names":["Toggle","props","local","others","splitProps","internalPressed","setInternalPressed","createSignal","pressed","defaultPressed","isControlled","undefined","handleClick","e","disabled","preventDefault","onClick","newPressed","onPressedChange","_el$","_tmpl$","$$click","_$spread","_$mergeProps","class","_$insert","children","_$delegateEvents"],"mappings":";;;AAwBO,MAAMA,SAAkCC,CAAAA,UAAU;AACvD,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CACxC,WACA,kBACA,mBACA,YACA,SACA,YACA,SAAS,CACV;AAED,QAAM,CAACI,iBAAiBC,kBAAkB,IAAIC,aAC5CL,MAAMM,WAAWN,MAAMO,kBAAkB,KAC3C;AAEA,QAAMC,eAAeA,MAAMR,MAAMM,YAAYG;AAC7C,QAAMH,UAAUA,MAAOE,aAAAA,IAAiBR,MAAMM,UAAWH,gBAAAA;AAEzD,QAAMO,cAAgEC,CAAAA,MAAM;AAC1E,QAAIX,MAAMY,UAAU;AAClBD,QAAEE,eAAAA;AACF;AAAA,IACF;AAEA,QAAI,OAAOb,MAAMc,YAAY,YAAY;AACvCd,YAAMc,QAAQH,CAAC;AAAA,IACjB;AAEA,UAAMI,aAAa,CAACT,QAAAA;AAEpB,QAAI,CAACE,gBAAgB;AACnBJ,yBAAmBW,UAAU;AAAA,IAC/B;AAEAf,UAAMgB,kBAAkBD,UAAU;AAAA,EACpC;AAEA,UAAA,MAAA;AAAA,QAAAE,OAAAC,OAAAA;AAAAD,SAAAE,UAOaT;AAAWU,WAAAH,MAAAI,WAAA;AAAA,MAAA,KAAA,cAAA,IAAA;AAAA,eAHNf,QAAAA;AAAAA,MAAS;AAAA,MAAA,IACvBM,WAAQ;AAAA,eAAEZ,MAAMY;AAAAA,MAAQ;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACjBZ,MAAMsB;AAAAA,MAAK;AAAA,MAAA,KAAA,YAAA,IAAA;AAAA,eAENhB,QAAAA,IAAY,OAAO;AAAA,MAAK;AAAA,MAAA,KAAA,eAAA,IAAA;AAAA,eACrBN,MAAMY,WAAW,KAAKH;AAAAA,MAAS;AAAA,IAAA,GAC1CR,MAAM,GAAA,OAAA,IAAA;AAAAsB,WAAAN,MAAA,MAETjB,MAAMwB,QAAQ;AAAA,WAAAP;AAAAA,EAAA,GAAA;AAGrB;AAAEQ,eAAA,CAAA,OAAA,CAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToggleGroup.js","sources":["../../../src/components/ToggleGroup/ToggleGroup.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\ninterface ToggleGroupContextValue {\n value: () => string | string[] | undefined;\n setValue: (value: string) => void;\n type: 'single' | 'multiple';\n disabled?: boolean;\n}\n\nconst ToggleGroupContext = createContext<ToggleGroupContextValue>();\n\nexport const useToggleGroupContext = () => {\n const context = useContext(ToggleGroupContext);\n if (!context) {\n throw new Error('ToggleGroup.Item must be used within ToggleGroup');\n }\n return context;\n};\n\nexport interface ToggleGroupProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 当前选中的值(单个或数组)\n */\n value?: string | string[];\n /**\n * 默认选中的值\n */\n defaultValue?: string | string[];\n /**\n * 值变化回调\n */\n onValueChange?: (value: string | string[]) => void;\n /**\n * 类型:单个或多个\n * @default 'single'\n */\n type?: 'single' | 'multiple';\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 是否不允许取消选中(仅 single 类型)\n * @default false\n */\n rovingFocus?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst ToggleGroupBase: Component<ToggleGroupProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'type',\n 'disabled',\n 'rovingFocus',\n 'class',\n 'children',\n ]);\n\n const type = () => local.type ?? 'single';\n\n const [internalValue, setInternalValue] = createSignal<string | string[] | undefined>(\n local.value ?? local.defaultValue\n );\n\n const isControlled = () => local.value !== undefined;\n const value = () => (isControlled() ? local.value : internalValue());\n\n const handleValueChange = (itemValue: string) => {\n if (local.disabled) return;\n\n const currentValue = value();\n let newValue: string | string[];\n\n if (type() === 'single') {\n // 单个模式:如果点击的是已选中的项,则取消选中;否则选中该项\n if (currentValue === itemValue && local.rovingFocus !== true) {\n newValue = '';\n } else {\n newValue = itemValue;\n }\n } else {\n // 多个模式:切换该项的选中状态\n const currentArray = Array.isArray(currentValue) ? currentValue : currentValue ? [currentValue] : [];\n const index = currentArray.indexOf(itemValue);\n if (index > -1) {\n newValue = currentArray.filter((v) => v !== itemValue);\n } else {\n newValue = [...currentArray, itemValue];\n }\n }\n\n if (!isControlled()) {\n setInternalValue(newValue);\n }\n local.onValueChange?.(newValue);\n };\n\n const contextValue: ToggleGroupContextValue = {\n value,\n setValue: handleValueChange,\n type: type(),\n disabled: local.disabled,\n };\n\n return (\n <ToggleGroupContext.Provider value={contextValue}>\n <div\n class={local.class}\n role=\"group\"\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </div>\n </ToggleGroupContext.Provider>\n );\n};\n\nexport interface ToggleGroupComponent extends Component<ToggleGroupProps> {\n Item: Component<ToggleGroupItemProps>;\n}\n\nexport const ToggleGroup = Object.assign(ToggleGroupBase, {\n Item: null as unknown as Component<ToggleGroupItemProps>,\n}) as ToggleGroupComponent;\n\nexport interface ToggleGroupItemProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 项的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const ToggleGroupItem: Component<ToggleGroupItemProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'value',\n 'disabled',\n 'asChild',\n 'children',\n 'class',\n 'onClick',\n ]);\n const context = useToggleGroupContext();\n\n const isSelected = () => {\n const currentValue = context.value();\n if (context.type === 'single') {\n return currentValue === local.value;\n } else {\n const currentArray = Array.isArray(currentValue) ? currentValue : [];\n return currentArray.includes(local.value);\n }\n };\n\n const handleClick: JSX.EventHandler<HTMLButtonElement, MouseEvent> = (e) => {\n if (typeof local.onClick === 'function') {\n local.onClick(e);\n }\n if (!local.disabled && !context.disabled) {\n context.setValue(local.value);\n }\n };\n\n return (\n <button\n type=\"button\"\n role=\"button\"\n class={local.class}\n disabled={local.disabled || context.disabled}\n onClick={handleClick}\n aria-pressed={isSelected()}\n data-state={isSelected() ? 'on' : 'off'}\n data-disabled={local.disabled || context.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nToggleGroup.Item = ToggleGroupItem;\n\n"],"names":["ToggleGroupContext","createContext","useToggleGroupContext","context","useContext","Error","ToggleGroupBase","props","local","others","splitProps","type","internalValue","setInternalValue","createSignal","value","defaultValue","isControlled","undefined","handleValueChange","itemValue","disabled","currentValue","newValue","rovingFocus","currentArray","Array","isArray","index","indexOf","filter","v","onValueChange","contextValue","setValue","_$createComponent","Provider","children","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","ToggleGroup","Object","assign","Item","ToggleGroupItem","isSelected","includes","handleClick","e","onClick","_el$2","_tmpl$2","$$click","_$delegateEvents"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toolbar.js","sources":["../../../src/components/Toolbar/Toolbar.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\nexport interface ToolbarProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport interface ToolbarComponent extends Component<ToolbarProps> {\n ToggleGroup: Component<ToolbarToggleGroupProps>;\n ToggleItem: Component<ToolbarToggleItemProps>;\n Separator: Component<ToolbarSeparatorProps>;\n Link: Component<ToolbarLinkProps>;\n Button: Component<ToolbarButtonProps>;\n}\n\nconst ToolbarBase: Component<ToolbarProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n\n return (\n <div\n role=\"toolbar\"\n class={local.class}\n aria-orientation=\"horizontal\"\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport const Toolbar = Object.assign(ToolbarBase, {\n ToggleGroup: null as unknown as Component<ToolbarToggleGroupProps>,\n ToggleItem: null as unknown as Component<ToolbarToggleItemProps>,\n Separator: null as unknown as Component<ToolbarSeparatorProps>,\n Link: null as unknown as Component<ToolbarLinkProps>,\n Button: null as unknown as Component<ToolbarButtonProps>,\n}) as ToolbarComponent;\n\nexport interface ToolbarToggleGroupProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 类型:单个或多个\n * @default 'single'\n */\n type?: 'single' | 'multiple';\n /**\n * 当前选中的值\n */\n value?: string | string[];\n /**\n * 默认选中的值\n */\n defaultValue?: string | string[];\n /**\n * 值变化回调\n */\n onValueChange?: (value: string | string[]) => void;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ToolbarToggleGroup: Component<ToolbarToggleGroupProps> = (props) => {\n const [local, others] = splitProps(props, [\n 'type',\n 'value',\n 'defaultValue',\n 'onValueChange',\n 'disabled',\n 'class',\n 'children',\n ]);\n\n return (\n <div\n class={local.class}\n role=\"group\"\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface ToolbarToggleItemProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 项的值\n */\n value: string;\n /**\n * 是否禁用\n * @default false\n */\n disabled?: boolean;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ToolbarToggleItem: Component<ToolbarToggleItemProps> = (props) => {\n const [local, others] = splitProps(props, ['value', 'disabled', 'class', 'children']);\n\n return (\n <button\n type=\"button\"\n role=\"button\"\n class={local.class}\n disabled={local.disabled}\n data-disabled={local.disabled ? '' : undefined}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nexport interface ToolbarSeparatorProps extends JSX.HTMLAttributes<HTMLHRElement> {\n}\n\nexport const ToolbarSeparator: Component<ToolbarSeparatorProps> = (props) => {\n const [local, others] = splitProps(props, ['class']);\n\n return (\n <hr\n role=\"separator\"\n class={local.class}\n {...others}\n />\n );\n};\n\nexport interface ToolbarLinkProps extends JSX.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const ToolbarLink: Component<ToolbarLinkProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children']);\n\n return (\n <a\n class={local.class}\n {...others}\n >\n {local.children}\n </a>\n );\n};\n\nexport interface ToolbarButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const ToolbarButton: Component<ToolbarButtonProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class']);\n\n return (\n <button\n type=\"button\"\n class={local.class}\n {...others}\n >\n {local.children}\n </button>\n );\n};\n\nToolbar.ToggleGroup = ToolbarToggleGroup;\nToolbar.ToggleItem = ToolbarToggleItem;\nToolbar.Separator = ToolbarSeparator;\nToolbar.Link = ToolbarLink;\nToolbar.Button = ToolbarButton;\n\n"],"names":["ToolbarBase","props","local","others","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","class","_$insert","children","Toolbar","Object","assign","ToggleGroup","ToggleItem","Separator","Link","Button","ToolbarToggleGroup","_el$2","_tmpl$2","disabled","undefined","ToolbarToggleItem","_el$3","_tmpl$3","ToolbarSeparator","_el$4","_tmpl$4","ToolbarLink","_el$5","_tmpl$5","ToolbarButton","_el$6","_tmpl$6"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import { splitProps, createSignal, createContext, useContext, Show, onMount, onCleanup, createEffect } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { isServer } from 'solid-js/web';\nimport type { Component, JSX } from 'solid-js';\n\ninterface TooltipContextValue {\n open: () => boolean;\n setOpen: (open: boolean) => void;\n triggerRef: () => HTMLElement | undefined;\n setTriggerRef: (ref: HTMLElement | undefined) => void;\n}\n\nconst TooltipContext = createContext<TooltipContextValue>();\n\nexport const useTooltipContext = () => {\n const context = useContext(TooltipContext);\n if (!context) {\n throw new Error('Tooltip components must be used within Tooltip');\n }\n return context;\n};\n\nexport interface TooltipProps 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 700\n */\n delayDuration?: number;\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nconst TooltipBase: Component<TooltipProps> = (props) => {\n const [local] = splitProps(props, [\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'delayDuration',\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 const contextValue: TooltipContextValue = {\n open,\n setOpen: handleOpenChange,\n triggerRef,\n setTriggerRef,\n };\n\n return (\n <TooltipContext.Provider value={contextValue}>\n {local.children}\n </TooltipContext.Provider>\n );\n};\n\nexport interface TooltipComponent extends Component<TooltipProps> {\n Trigger: Component<TooltipTriggerProps>;\n Content: Component<TooltipContentProps>;\n}\n\nexport const Tooltip = Object.assign(TooltipBase, {\n Trigger: null as unknown as Component<TooltipTriggerProps>,\n Content: null as unknown as Component<TooltipContentProps>,\n}) as TooltipComponent;\n\nexport interface TooltipTriggerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n /**\n * 是否作为子元素传递\n */\n asChild?: boolean;\n}\n\nexport const TooltipTrigger: Component<TooltipTriggerProps> = (props) => {\n const [local, others] = splitProps(props, ['children', 'asChild', 'class']);\n const context = useTooltipContext();\n let triggerElement: HTMLDivElement | undefined;\n let timeoutId: number | undefined;\n\n const handleMouseEnter = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n context.setOpen(true);\n }, 700) as unknown as number;\n };\n\n const handleMouseLeave = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n context.setOpen(false);\n };\n\n onMount(() => {\n if (triggerElement) {\n context.setTriggerRef(triggerElement);\n }\n });\n\n onCleanup(() => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n });\n\n return (\n <div\n ref={triggerElement}\n class={local.class}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...others}\n >\n {local.children}\n </div>\n );\n};\n\nexport interface TooltipContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const TooltipContent: Component<TooltipContentProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children'] as const);\n const context = useTooltipContext();\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.top - contentRect.height - 8;\n const left = rect.left + (rect.width / 2) - (contentRect.width / 2);\n\n // 检查是否会超出视口\n const viewportWidth = window.innerWidth;\n\n let finalTop = top;\n let finalLeft = left;\n\n // 如果上方超出,则在下方显示\n if (top < 0) {\n finalTop = rect.bottom + 8;\n }\n\n // 如果左侧超出,则左对齐\n if (left < 0) {\n finalLeft = 8;\n }\n\n // 如果右侧超出,则右对齐\n if (left + contentRect.width > viewportWidth) {\n finalLeft = viewportWidth - contentRect.width - 8;\n }\n\n contentElement.style.top = `${finalTop}px`;\n contentElement.style.left = `${finalLeft}px`;\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=\"tooltip\"\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\nTooltip.Trigger = TooltipTrigger;\nTooltip.Content = TooltipContent;\n\n"],"names":["TooltipContext","createContext","useTooltipContext","context","useContext","Error","TooltipBase","props","local","splitProps","internalOpen","setInternalOpen","createSignal","open","defaultOpen","triggerRef","setTriggerRef","isControlled","undefined","handleOpenChange","newOpen","onOpenChange","contextValue","setOpen","_$createComponent","Provider","value","children","Tooltip","Object","assign","Trigger","Content","TooltipTrigger","others","triggerElement","timeoutId","handleMouseEnter","clearTimeout","setTimeout","handleMouseLeave","onMount","onCleanup","_el$","_tmpl$","addEventListener","_ref$","_$use","_$spread","_$mergeProps","class","_$insert","TooltipContent","contentElement","updatePosition","isServer","trigger","rect","getBoundingClientRect","contentRect","top","height","left","width","viewportWidth","window","innerWidth","finalTop","finalLeft","bottom","style","createEffect","requestAnimationFrame","Show","when","Portal","mount","document","body","_el$2","_tmpl$2","_ref$2"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"VisuallyHidden.js","sources":["../../../src/components/VisuallyHidden/VisuallyHidden.tsx"],"sourcesContent":["import { splitProps } from 'solid-js';\nimport type { Component, JSX } from 'solid-js';\n\nexport interface VisuallyHiddenProps extends JSX.HTMLAttributes<HTMLSpanElement> {\n /**\n * 子元素\n */\n children?: JSX.Element;\n}\n\nexport const VisuallyHidden: Component<VisuallyHiddenProps> = (props) => {\n const [local, others] = splitProps(props, ['class', 'children', 'style']);\n\n return (\n <span\n class={local.class}\n style={`position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; ${typeof local.style === 'string' ? local.style : ''}`}\n {...others}\n >\n {local.children}\n </span>\n );\n};\n\n"],"names":["VisuallyHidden","props","local","others","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","class","style","_$insert","children"],"mappings":";;;AAUO,MAAMA,iBAAkDC,CAAAA,UAAU;AACvE,QAAM,CAACC,OAAOC,MAAM,IAAIC,WAAWH,OAAO,CAAC,SAAS,YAAY,OAAO,CAAC;AAExE,UAAA,MAAA;AAAA,QAAAI,OAAAC,OAAAA;AAAAC,WAAAF,MAAAG,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAEWN,MAAMO;AAAAA,MAAK;AAAA,MAAA,IAClBC,QAAK;AAAA,eAAE,0JAA0J,OAAOR,MAAMQ,UAAU,WAAWR,MAAMQ,QAAQ,EAAE;AAAA,MAAE;AAAA,IAAA,GACjNP,MAAM,GAAA,OAAA,IAAA;AAAAQ,WAAAN,MAAA,MAETH,MAAMU,QAAQ;AAAA,WAAAP;AAAAA,EAAA,GAAA;AAGrB;"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}