@ensolid/radix 0.0.0 → 0.0.2

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 (58) hide show
  1. package/README.md +84 -0
  2. package/dist/components/Accordion/Accordion.js +2 -3
  3. package/dist/components/AlertDialog/AlertDialog.js +2 -3
  4. package/dist/components/AspectRatio/AspectRatio.js +0 -1
  5. package/dist/components/Avatar/Avatar.js +1 -2
  6. package/dist/components/Checkbox/Checkbox.js +0 -1
  7. package/dist/components/Collapsible/Collapsible.js +2 -3
  8. package/dist/components/ContextMenu/ContextMenu.js +2 -3
  9. package/dist/components/Dialog/Dialog.js +2 -3
  10. package/dist/components/DropdownMenu/DropdownMenu.js +2 -3
  11. package/dist/components/HoverCard/HoverCard.js +2 -3
  12. package/dist/components/Label/Label.js +0 -1
  13. package/dist/components/Menubar/Menubar.js +2 -3
  14. package/dist/components/NavigationMenu/NavigationMenu.js +2 -3
  15. package/dist/components/Popover/Popover.js +2 -3
  16. package/dist/components/Progress/Progress.js +0 -1
  17. package/dist/components/RadioGroup/RadioGroup.js +2 -3
  18. package/dist/components/ScrollArea/ScrollArea.js +0 -1
  19. package/dist/components/Select/Select.js +2 -3
  20. package/dist/components/Separator/Separator.js +0 -1
  21. package/dist/components/Slider/Slider.js +1 -2
  22. package/dist/components/Switch/Switch.js +1 -2
  23. package/dist/components/Tabs/Tabs.js +2 -3
  24. package/dist/components/Toggle/Toggle.js +1 -2
  25. package/dist/components/ToggleGroup/ToggleGroup.js +2 -3
  26. package/dist/components/Toolbar/Toolbar.js +0 -1
  27. package/dist/components/Tooltip/Tooltip.js +2 -3
  28. package/dist/components/VisuallyHidden/VisuallyHidden.js +0 -1
  29. package/dist/index.js +0 -1
  30. package/package.json +46 -1
  31. package/dist/components/Accordion/Accordion.js.map +0 -1
  32. package/dist/components/AlertDialog/AlertDialog.js.map +0 -1
  33. package/dist/components/AspectRatio/AspectRatio.js.map +0 -1
  34. package/dist/components/Avatar/Avatar.js.map +0 -1
  35. package/dist/components/Checkbox/Checkbox.js.map +0 -1
  36. package/dist/components/Collapsible/Collapsible.js.map +0 -1
  37. package/dist/components/ContextMenu/ContextMenu.js.map +0 -1
  38. package/dist/components/Dialog/Dialog.js.map +0 -1
  39. package/dist/components/DropdownMenu/DropdownMenu.js.map +0 -1
  40. package/dist/components/HoverCard/HoverCard.js.map +0 -1
  41. package/dist/components/Label/Label.js.map +0 -1
  42. package/dist/components/Menubar/Menubar.js.map +0 -1
  43. package/dist/components/NavigationMenu/NavigationMenu.js.map +0 -1
  44. package/dist/components/Popover/Popover.js.map +0 -1
  45. package/dist/components/Progress/Progress.js.map +0 -1
  46. package/dist/components/RadioGroup/RadioGroup.js.map +0 -1
  47. package/dist/components/ScrollArea/ScrollArea.js.map +0 -1
  48. package/dist/components/Select/Select.js.map +0 -1
  49. package/dist/components/Separator/Separator.js.map +0 -1
  50. package/dist/components/Slider/Slider.js.map +0 -1
  51. package/dist/components/Switch/Switch.js.map +0 -1
  52. package/dist/components/Tabs/Tabs.js.map +0 -1
  53. package/dist/components/Toggle/Toggle.js.map +0 -1
  54. package/dist/components/ToggleGroup/ToggleGroup.js.map +0 -1
  55. package/dist/components/Toolbar/Toolbar.js.map +0 -1
  56. package/dist/components/Tooltip/Tooltip.js.map +0 -1
  57. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +0 -1
  58. package/dist/index.js.map +0 -1
@@ -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":";;;AAoBA,MAAMA,gBAAgBC,cAAAA;AAEf,MAAMC,mBAAmBA,MAAM;AACpC,QAAMC,UAAUC,WAAWJ,aAAa;AACxC,MAAI,CAACG,SAAS;AACZ,UAAM,IAAIE,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAOF;AACT;AA0BA,MAAMG,aAAsCC,CAAAA,UAAU;AACpD,QAAM,CAACC,KAAK,IAAIC,WAAWF,OAAO,CAChC,QACA,eACA,gBACA,SACA,SACA,UAAU,CACX;AAED,QAAM,CAACG,cAAcC,eAAe,IAAIC,aACtCJ,MAAMK,QAAQL,MAAMM,eAAe,KACrC;AAEA,QAAMC,eAAeA,MAAMP,MAAMK,SAASG;AAC1C,QAAMH,OAAOA,MAAOE,aAAAA,IAAiBP,MAAMK,OAAQH,aAAAA;AAEnD,QAAMO,mBAAmBA,CAACC,YAAqB;AAC7C,QAAI,CAACH,gBAAgB;AACnBJ,sBAAgBO,OAAO;AAAA,IACzB;AACAV,UAAMW,eAAeD,OAAO;AAAA,EAC9B;AAGA,QAAME,gBAAgBA,CAACC,MAAqB;AAC1C,QAAIA,EAAEC,QAAQ,YAAYT,KAAAA,GAAQ;AAChCI,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEAM,UAAQ,MAAM;AACZ,QAAI,CAACC,YAAYX,QAAQ;AACvBY,eAASC,iBAAiB,WAAWN,aAAa;AAElDK,eAASE,KAAKC,MAAMC,WAAW;AAAA,IACjC;AAAA,EACF,CAAC;AAEDC,eAAa,MAAM;AACjB,QAAI,CAACN,UAAU;AACb,UAAIX,QAAQ;AACVY,iBAASC,iBAAiB,WAAWN,aAAa;AAClDK,iBAASE,KAAKC,MAAMC,WAAW;AAAA,MACjC,OAAO;AACLJ,iBAASM,oBAAoB,WAAWX,aAAa;AACrDK,iBAASE,KAAKC,MAAMC,WAAW;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AAEDG,YAAU,MAAM;AACd,QAAI,CAACR,UAAU;AACbC,eAASM,oBAAoB,WAAWX,aAAa;AACrDK,eAASE,KAAKC,MAAMC,WAAW;AAAA,IACjC;AAAA,EACF,CAAC;AAED,QAAMI,eAAmC;AAAA,IACvCpB;AAAAA,IACAqB,SAASjB;AAAAA,IACTkB,OAAO3B,MAAM2B,SAAS;AAAA,EAAA;AAGxB,SAAAC,gBACGpC,cAAcqC,UAAQ;AAAA,IAACC,OAAOL;AAAAA,IAAY,IAAAM,WAAA;AAAA,aACxC/B,MAAM+B;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;AAWO,MAAMC,SAASC,OAAOC,OAAOpC,YAAY;AAAA,EAC9CqC,SAAS;AAAA,EACTC,SAAS;AAAA,EACTC,SAAS;AAAA,EACTC,OAAO;AAAA,EACPC,aAAa;AAAA,EACbC,OAAO;AACT,CAAC;AAcM,MAAMC,gBAAgD1C,CAAAA,UAAU;AACrE,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CACxC,YACA,WACA,SACA,SAAS,CACV;AACD,QAAMJ,UAAUD,iBAAAA;AAEhB,QAAMiD,cAAgE9B,CAAAA,MAAM;AAC1E,QAAI,OAAOb,MAAM4C,YAAY,YAAY;AACvC5C,YAAM4C,QAAQ/B,CAAC;AAAA,IACjB;AACAlB,YAAQ+B,QAAQ,IAAI;AAAA,EACtB;AAEA,UAAA,MAAA;AAAA,QAAAmB,OAAAC,OAAAA;AAAAD,SAAAE,UACqDJ;AAAWK,WAAAH,MAAAI,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAAjCjD,MAAMkD;AAAAA,MAAK;AAAA,IAAA,GAA4BR,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAN,MAAA,MACvE7C,MAAM+B,QAAQ;AAAA,WAAAc;AAAAA,EAAA,GAAA;AAGrB;AAgBO,MAAMO,gBAAgDrD,CAAAA,UAAU;AACrE,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CAAC,YAAY,SAAS,SAAS,CAAC;AAC1E,QAAMJ,UAAUD,iBAAAA;AAEhB,QAAMiD,cAA6D9B,CAAAA,MAAM;AACvE,QAAI,OAAOb,MAAM4C,YAAY,YAAY;AACvC5C,YAAM4C,QAAQ/B,CAAC;AAAA,IACjB;AAEA,QAAIA,EAAEwC,WAAWxC,EAAEyC,iBAAiB3D,QAAQgC,OAAO;AACjDhC,cAAQ+B,QAAQ,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,UAAA,MAAA;AAAA,QAAA6B,QAAAC,QAAAA;AAAAD,UAAAR,UAIaJ;AAAWK,WAAAO,OAAAN,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAFbjD,MAAMkD;AAAAA,MAAK;AAAA,MAAA,KAAA,YAAA,IAAA;AAAA,eACNvD,QAAQU,SAAS,SAAS;AAAA,MAAQ;AAAA,IAAA,GAE1CqC,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAI,OAAA,MAETvD,MAAM+B,QAAQ;AAAA,WAAAwB;AAAAA,EAAA,GAAA;AAGrB;AAEO,MAAME,gBAAgD1D,CAAAA,UAAU;AACrE,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CAAC,YAAY,OAAO,CAAC;AAC/D,QAAMJ,UAAUD,iBAAAA;AAEhB,SAAAkC,gBACG8B,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAEhE,QAAQU,KAAAA;AAAAA,IAAM;AAAA,IAAA,IAAA0B,WAAA;AAAA,aAAAH,gBACvBgC,QAAM;AAAA,QAAA,IAACC,QAAK;AAAA,iBAAE,CAAC7C,WAAWC,SAASE,OAAOX;AAAAA,QAAS;AAAA,QAAA,IAAAuB,WAAA;AAAA,iBAAA,CAAAH,gBACjDwB,eAAa;AAAA,YAAA,SAAA;AAAA,UAAA,CAAA,IAAA,MAAA;AAAA,gBAAAU,QAAAC,QAAAA;AAAAf,mBAAAc,OAAAb,WAAA;AAAA,cAAA,KAAA,OAAA,IAAA;AAAA,uBAELjD,MAAMkD;AAAAA,cAAK;AAAA,cAAA,KAAA,YAAA,IAAA;AAAA,uBAENvD,QAAQgC;AAAAA,cAAK;AAAA,cAAA,KAAA,YAAA,IAAA;AAAA,uBACbhC,QAAQU,SAAS,SAAS;AAAA,cAAQ;AAAA,YAAA,GAC1CqC,MAAM,GAAA,OAAA,IAAA;AAAAS,mBAAAW,OAAA,MAET9D,MAAM+B,QAAQ;AAAA,mBAAA+B;AAAAA,UAAA,IAAA;AAAA,QAAA;AAAA,MAAA,CAAA;AAAA,IAAA;AAAA,EAAA,CAAA;AAKzB;AAUO,MAAME,cAA4CjE,CAAAA,UAAU;AACjE,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CAAC,YAAY,OAAO,CAAC;AAE/D,UAAA,MAAA;AAAA,QAAAkE,QAAAC,QAAAA;AAAAlB,WAAAiB,OAAAhB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACajD,MAAMkD;AAAAA,MAAK;AAAA,IAAA,GAAMR,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAc,OAAA,MAC/BjE,MAAM+B,QAAQ;AAAA,WAAAkC;AAAAA,EAAA,GAAA;AAGrB;AAUO,MAAME,oBAAwDpE,CAAAA,UAAU;AAC7E,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CAAC,YAAY,OAAO,CAAC;AAE/D,UAAA,MAAA;AAAA,QAAAqE,QAAAC,QAAAA;AAAArB,WAAAoB,OAAAnB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACYjD,MAAMkD;AAAAA,MAAK;AAAA,IAAA,GAAMR,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAiB,OAAA,MAC9BpE,MAAM+B,QAAQ;AAAA,WAAAqC;AAAAA,EAAA,GAAA;AAGrB;AAUO,MAAME,cAA4CvE,CAAAA,UAAU;AACjE,QAAM,CAACC,OAAO0C,MAAM,IAAIzC,WAAWF,OAAO,CAAC,YAAY,SAAS,SAAS,CAAC;AAC1E,QAAMJ,UAAUD,iBAAAA;AAEhB,QAAMiD,cAAgE9B,CAAAA,MAAM;AAC1E,QAAI,OAAOb,MAAM4C,YAAY,YAAY;AACvC5C,YAAM4C,QAAQ/B,CAAC;AAAA,IACjB;AACAlB,YAAQ+B,QAAQ,KAAK;AAAA,EACvB;AAEA,UAAA,MAAA;AAAA,QAAA6C,QAAAzB,OAAAA;AAAAyB,UAAAxB,UACqDJ;AAAWK,WAAAuB,OAAAtB,WAAA;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eAAjCjD,MAAMkD;AAAAA,MAAK;AAAA,IAAA,GAA4BR,MAAM,GAAA,OAAA,IAAA;AAAAS,WAAAoB,OAAA,MACvEvE,MAAM+B,QAAQ;AAAA,WAAAwC;AAAAA,EAAA,GAAA;AAGrB;AAEAvC,OAAOG,UAAUM;AACjBT,OAAOI,UAAUgB;AACjBpB,OAAOK,UAAUoB;AACjBzB,OAAOM,QAAQ0B;AACfhC,OAAOO,cAAc4B;AACrBnC,OAAOQ,QAAQ8B;AAAYE,eAAA,CAAA,OAAA,CAAA;"}
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}