@fangxinyan/lumina 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Accordion-3TQPKNN3.css → Accordion-REMDCQUD.css} +0 -1
- package/dist/Accordion.cjs +2 -2
- package/dist/Accordion.js +1 -1
- package/dist/Alert.cjs +2 -2
- package/dist/Alert.js +1 -1
- package/dist/AppShell.cjs +5 -5
- package/dist/AppShell.js +1 -1
- package/dist/Avatar.cjs +2 -2
- package/dist/Avatar.js +1 -1
- package/dist/Button.cjs +3 -3
- package/dist/Button.js +1 -1
- package/dist/Calendar.cjs +2 -2
- package/dist/Calendar.js +1 -1
- package/dist/Card.cjs +3 -3
- package/dist/Card.js +1 -1
- package/dist/{Cascader-DTRTTXC2.css → Cascader-VSYEKQCG.css} +1 -1
- package/dist/Cascader.cjs +2 -2
- package/dist/Cascader.js +1 -1
- package/dist/Checkbox.cjs +3 -3
- package/dist/Checkbox.js +1 -1
- package/dist/{ColorPicker-GP7AQYUU.css → ColorPicker-SDDQGHCM.css} +1 -1
- package/dist/ColorPicker.cjs +2 -2
- package/dist/ColorPicker.js +1 -1
- package/dist/CommandPalette-T45DBMPY.css +139 -0
- package/dist/CommandPalette.cjs +14 -0
- package/dist/CommandPalette.cjs.map +1 -0
- package/dist/CommandPalette.d.cts +65 -0
- package/dist/CommandPalette.d.ts +65 -0
- package/dist/CommandPalette.js +5 -0
- package/dist/CommandPalette.js.map +1 -0
- package/dist/ContextMenu-FKW6CQW4.css +76 -0
- package/dist/ContextMenu.cjs +12 -0
- package/dist/ContextMenu.cjs.map +1 -0
- package/dist/ContextMenu.d.cts +50 -0
- package/dist/ContextMenu.d.ts +50 -0
- package/dist/ContextMenu.js +3 -0
- package/dist/ContextMenu.js.map +1 -0
- package/dist/Divider.cjs +2 -2
- package/dist/Divider.js +1 -1
- package/dist/Drawer.cjs +2 -2
- package/dist/Drawer.js +1 -1
- package/dist/Empty.cjs +4 -4
- package/dist/Empty.js +1 -1
- package/dist/{Image-WYWORJT4.css → Image-4MN34O6P.css} +1 -1
- package/dist/Image.cjs +3 -3
- package/dist/Image.js +1 -1
- package/dist/Input.cjs +3 -3
- package/dist/Input.js +1 -1
- package/dist/List.cjs +2 -2
- package/dist/List.js +1 -1
- package/dist/{Modal-N4YVLEWW.css → Modal-XSDMU4XJ.css} +1 -1
- package/dist/Modal.cjs +3 -3
- package/dist/Modal.js +2 -2
- package/dist/Pagination.cjs +4 -4
- package/dist/Pagination.js +3 -3
- package/dist/{Popover-MGCMOXYP.css → Popover-NYEKT5CQ.css} +1 -1
- package/dist/Popover.cjs +2 -2
- package/dist/Popover.js +1 -1
- package/dist/Progress.cjs +3 -3
- package/dist/Progress.js +1 -1
- package/dist/{Select-EDG37C37.css → Select-J3CCVFJ7.css} +1 -1
- package/dist/Select.cjs +3 -3
- package/dist/Select.js +2 -2
- package/dist/Slider.cjs +2 -2
- package/dist/Slider.js +1 -1
- package/dist/Splitter-DHNOY4NC.css +66 -0
- package/dist/Splitter.cjs +12 -0
- package/dist/Splitter.cjs.map +1 -0
- package/dist/Splitter.d.cts +44 -0
- package/dist/Splitter.d.ts +44 -0
- package/dist/Splitter.js +3 -0
- package/dist/Splitter.js.map +1 -0
- package/dist/StatusBar-CDS2GPSI.css +58 -0
- package/dist/StatusBar.cjs +16 -0
- package/dist/StatusBar.cjs.map +1 -0
- package/dist/StatusBar.d.cts +39 -0
- package/dist/StatusBar.d.ts +39 -0
- package/dist/StatusBar.js +3 -0
- package/dist/StatusBar.js.map +1 -0
- package/dist/Switch.cjs +2 -2
- package/dist/Switch.js +1 -1
- package/dist/{Table-YKVM42SW.css → Table-2LPTOUIR.css} +1 -1
- package/dist/Table.cjs +7 -7
- package/dist/Table.js +5 -5
- package/dist/Tabs.cjs +3 -3
- package/dist/Tabs.js +1 -1
- package/dist/Tag.cjs +3 -3
- package/dist/Tag.js +1 -1
- package/dist/Theme.cjs +10 -10
- package/dist/Theme.js +1 -1
- package/dist/{Toast-ERHDN3WG.css → Toast-6PVSAXQ5.css} +1 -1
- package/dist/Toast.cjs +3 -3
- package/dist/Toast.js +1 -1
- package/dist/Tooltip.cjs +2 -2
- package/dist/Tooltip.js +1 -1
- package/dist/Typography.cjs +6 -6
- package/dist/Typography.js +1 -1
- package/dist/{chunk-5WF6M47X.cjs → chunk-24FAK7QU.cjs} +3 -3
- package/dist/{chunk-5WF6M47X.cjs.map → chunk-24FAK7QU.cjs.map} +1 -1
- package/dist/{chunk-AJZKESHB.js → chunk-276NALYW.js} +3 -3
- package/dist/{chunk-AJZKESHB.js.map → chunk-276NALYW.js.map} +1 -1
- package/dist/{chunk-FI7QO3I5.cjs → chunk-33TIL25B.cjs} +3 -3
- package/dist/{chunk-FI7QO3I5.cjs.map → chunk-33TIL25B.cjs.map} +1 -1
- package/dist/{chunk-RDLPX7RK.cjs → chunk-3HNRKO3M.cjs} +31 -5
- package/dist/chunk-3HNRKO3M.cjs.map +1 -0
- package/dist/{chunk-GZGZR4FT.js → chunk-3LI6QH2Q.js} +3 -3
- package/dist/{chunk-GZGZR4FT.js.map → chunk-3LI6QH2Q.js.map} +1 -1
- package/dist/{chunk-NE4YEBFH.js → chunk-3UU2PUK4.js} +4 -4
- package/dist/{chunk-NE4YEBFH.js.map → chunk-3UU2PUK4.js.map} +1 -1
- package/dist/chunk-47Z4NIU4.js +118 -0
- package/dist/chunk-47Z4NIU4.js.map +1 -0
- package/dist/{chunk-4U4OY5RA.js → chunk-4SCDDSXY.js} +3 -3
- package/dist/{chunk-4U4OY5RA.js.map → chunk-4SCDDSXY.js.map} +1 -1
- package/dist/{chunk-NXOAYNG2.cjs → chunk-5BFETKVP.cjs} +3 -3
- package/dist/{chunk-NXOAYNG2.cjs.map → chunk-5BFETKVP.cjs.map} +1 -1
- package/dist/{chunk-VICGQC6G.cjs → chunk-5EAVXFFD.cjs} +3 -3
- package/dist/{chunk-VICGQC6G.cjs.map → chunk-5EAVXFFD.cjs.map} +1 -1
- package/dist/{chunk-OYGFMXAA.js → chunk-5N7347MI.js} +3 -3
- package/dist/{chunk-OYGFMXAA.js.map → chunk-5N7347MI.js.map} +1 -1
- package/dist/{chunk-VJN637MT.js → chunk-5PREWYTB.js} +3 -3
- package/dist/{chunk-VJN637MT.js.map → chunk-5PREWYTB.js.map} +1 -1
- package/dist/{chunk-77BVQNAQ.js → chunk-5UOBYRYJ.js} +3 -3
- package/dist/{chunk-77BVQNAQ.js.map → chunk-5UOBYRYJ.js.map} +1 -1
- package/dist/{chunk-BBPNQ44M.js → chunk-6GNFRP2H.js} +3 -3
- package/dist/{chunk-BBPNQ44M.js.map → chunk-6GNFRP2H.js.map} +1 -1
- package/dist/{chunk-TZSWDH5T.cjs → chunk-7JYI5THC.cjs} +3 -3
- package/dist/{chunk-TZSWDH5T.cjs.map → chunk-7JYI5THC.cjs.map} +1 -1
- package/dist/chunk-7T2SLRNL.cjs +140 -0
- package/dist/chunk-7T2SLRNL.cjs.map +1 -0
- package/dist/chunk-7YQWG7HR.cjs +45 -0
- package/dist/chunk-7YQWG7HR.cjs.map +1 -0
- package/dist/chunk-AGN3JSUH.cjs +209 -0
- package/dist/chunk-AGN3JSUH.cjs.map +1 -0
- package/dist/{chunk-CCBHZYE6.cjs → chunk-AR4M7QGF.cjs} +7 -7
- package/dist/{chunk-CCBHZYE6.cjs.map → chunk-AR4M7QGF.cjs.map} +1 -1
- package/dist/{chunk-K7PVJLW4.cjs → chunk-AWLBLRQX.cjs} +5 -5
- package/dist/{chunk-K7PVJLW4.cjs.map → chunk-AWLBLRQX.cjs.map} +1 -1
- package/dist/{chunk-PBBHUUXU.cjs → chunk-B5JH7NRZ.cjs} +3 -3
- package/dist/{chunk-PBBHUUXU.cjs.map → chunk-B5JH7NRZ.cjs.map} +1 -1
- package/dist/{chunk-Z5X5AMLA.cjs → chunk-CALRTZZ7.cjs} +3 -3
- package/dist/{chunk-Z5X5AMLA.cjs.map → chunk-CALRTZZ7.cjs.map} +1 -1
- package/dist/{chunk-H6FCIJOP.js → chunk-DBJIK4JE.js} +3 -3
- package/dist/{chunk-H6FCIJOP.js.map → chunk-DBJIK4JE.js.map} +1 -1
- package/dist/{chunk-QESLHLTG.cjs → chunk-EHO2JH2L.cjs} +4 -4
- package/dist/{chunk-QESLHLTG.cjs.map → chunk-EHO2JH2L.cjs.map} +1 -1
- package/dist/{chunk-WNGG25QX.js → chunk-FFZLSY2N.js} +3 -3
- package/dist/{chunk-WNGG25QX.js.map → chunk-FFZLSY2N.js.map} +1 -1
- package/dist/{chunk-AEJJGUEN.cjs → chunk-GOIQR4OH.cjs} +3 -3
- package/dist/{chunk-AEJJGUEN.cjs.map → chunk-GOIQR4OH.cjs.map} +1 -1
- package/dist/{chunk-Z7P6QGMT.js → chunk-GR5STMOA.js} +3 -3
- package/dist/{chunk-Z7P6QGMT.js.map → chunk-GR5STMOA.js.map} +1 -1
- package/dist/{chunk-URF6RBW6.cjs → chunk-HNVRMOL3.cjs} +3 -3
- package/dist/{chunk-URF6RBW6.cjs.map → chunk-HNVRMOL3.cjs.map} +1 -1
- package/dist/{chunk-RPD2OIIP.js → chunk-I2HHC6QW.js} +4 -4
- package/dist/{chunk-RPD2OIIP.js.map → chunk-I2HHC6QW.js.map} +1 -1
- package/dist/{chunk-AXMEZGEG.cjs → chunk-IZDJCEMF.cjs} +3 -3
- package/dist/{chunk-AXMEZGEG.cjs.map → chunk-IZDJCEMF.cjs.map} +1 -1
- package/dist/{chunk-V34OPWKZ.js → chunk-JSDQVVQB.js} +3 -3
- package/dist/{chunk-V34OPWKZ.js.map → chunk-JSDQVVQB.js.map} +1 -1
- package/dist/{chunk-QTGDYQOT.cjs → chunk-LLNEDEST.cjs} +4 -4
- package/dist/{chunk-QTGDYQOT.cjs.map → chunk-LLNEDEST.cjs.map} +1 -1
- package/dist/{chunk-C5TGQ7CV.cjs → chunk-MFWOBALK.cjs} +3 -3
- package/dist/{chunk-C5TGQ7CV.cjs.map → chunk-MFWOBALK.cjs.map} +1 -1
- package/dist/{chunk-LDENBYRC.cjs → chunk-MKR4X57L.cjs} +3 -3
- package/dist/{chunk-LDENBYRC.cjs.map → chunk-MKR4X57L.cjs.map} +1 -1
- package/dist/{chunk-LSLYY5FN.js → chunk-MTCLJHXU.js} +5 -5
- package/dist/{chunk-LSLYY5FN.js.map → chunk-MTCLJHXU.js.map} +1 -1
- package/dist/{chunk-JKLQOB2F.cjs → chunk-MUFMJPRT.cjs} +3 -3
- package/dist/{chunk-JKLQOB2F.cjs.map → chunk-MUFMJPRT.cjs.map} +1 -1
- package/dist/{chunk-OEHCA5IV.js → chunk-NGQDVJH3.js} +4 -4
- package/dist/{chunk-OEHCA5IV.js.map → chunk-NGQDVJH3.js.map} +1 -1
- package/dist/{chunk-7H453VPW.cjs → chunk-NQQWCIE6.cjs} +3 -3
- package/dist/{chunk-7H453VPW.cjs.map → chunk-NQQWCIE6.cjs.map} +1 -1
- package/dist/{chunk-ZWP4LSS3.js → chunk-NS3C2ZSE.js} +3 -3
- package/dist/{chunk-ZWP4LSS3.js.map → chunk-NS3C2ZSE.js.map} +1 -1
- package/dist/{chunk-HKAQILD2.cjs → chunk-O2HMH5BI.cjs} +4 -4
- package/dist/{chunk-HKAQILD2.cjs.map → chunk-O2HMH5BI.cjs.map} +1 -1
- package/dist/chunk-OWNVDXRQ.js +42 -0
- package/dist/chunk-OWNVDXRQ.js.map +1 -0
- package/dist/{chunk-3UFU63X7.cjs → chunk-OZVPJWXO.cjs} +3 -3
- package/dist/{chunk-3UFU63X7.cjs.map → chunk-OZVPJWXO.cjs.map} +1 -1
- package/dist/{chunk-M6CGYGEO.js → chunk-Q2EXOT4B.js} +3 -3
- package/dist/{chunk-M6CGYGEO.js.map → chunk-Q2EXOT4B.js.map} +1 -1
- package/dist/{chunk-7U6I44RV.cjs → chunk-Q7CDWNM6.cjs} +3 -3
- package/dist/{chunk-7U6I44RV.cjs.map → chunk-Q7CDWNM6.cjs.map} +1 -1
- package/dist/{chunk-437LB2V4.js → chunk-QJGKI2BD.js} +3 -3
- package/dist/{chunk-437LB2V4.js.map → chunk-QJGKI2BD.js.map} +1 -1
- package/dist/chunk-RFU5HN4E.js +149 -0
- package/dist/chunk-RFU5HN4E.js.map +1 -0
- package/dist/{chunk-IKI5CS4L.cjs → chunk-RIDCBNCM.cjs} +4 -4
- package/dist/{chunk-IKI5CS4L.cjs.map → chunk-RIDCBNCM.cjs.map} +1 -1
- package/dist/{chunk-OPTTHURA.cjs → chunk-RSZNFKCQ.cjs} +3 -3
- package/dist/{chunk-OPTTHURA.cjs.map → chunk-RSZNFKCQ.cjs.map} +1 -1
- package/dist/{chunk-EPFYIR63.cjs → chunk-RVSWH4RH.cjs} +7 -7
- package/dist/{chunk-EPFYIR63.cjs.map → chunk-RVSWH4RH.cjs.map} +1 -1
- package/dist/{chunk-TWBJCFEJ.cjs → chunk-SVVB6POY.cjs} +4 -4
- package/dist/{chunk-TWBJCFEJ.cjs.map → chunk-SVVB6POY.cjs.map} +1 -1
- package/dist/{chunk-QPZZNSRB.js → chunk-TMZVX6NO.js} +4 -4
- package/dist/{chunk-QPZZNSRB.js.map → chunk-TMZVX6NO.js.map} +1 -1
- package/dist/{chunk-YEOARJKR.cjs → chunk-TQLCIXCK.cjs} +3 -3
- package/dist/{chunk-YEOARJKR.cjs.map → chunk-TQLCIXCK.cjs.map} +1 -1
- package/dist/{chunk-GIVMKGZN.js → chunk-TY5EAKEI.js} +3 -3
- package/dist/{chunk-GIVMKGZN.js.map → chunk-TY5EAKEI.js.map} +1 -1
- package/dist/{chunk-4MR4GVTD.js → chunk-U4K7HOMW.js} +31 -5
- package/dist/chunk-U4K7HOMW.js.map +1 -0
- package/dist/{chunk-IWVKITPN.js → chunk-U5BZ7E3F.js} +3 -3
- package/dist/{chunk-IWVKITPN.js.map → chunk-U5BZ7E3F.js.map} +1 -1
- package/dist/{chunk-3WAFIUDQ.js → chunk-UQB5OHMO.js} +3 -3
- package/dist/{chunk-3WAFIUDQ.js.map → chunk-UQB5OHMO.js.map} +1 -1
- package/dist/{chunk-ZVCMXDTP.js → chunk-URLSZPS5.js} +5 -5
- package/dist/{chunk-ZVCMXDTP.js.map → chunk-URLSZPS5.js.map} +1 -1
- package/dist/{chunk-I7SSCSFH.js → chunk-W6I67HQQ.js} +3 -3
- package/dist/{chunk-I7SSCSFH.js.map → chunk-W6I67HQQ.js.map} +1 -1
- package/dist/{chunk-NSUD5B22.js → chunk-WBMF7WM3.js} +3 -3
- package/dist/{chunk-NSUD5B22.js.map → chunk-WBMF7WM3.js.map} +1 -1
- package/dist/{chunk-4GT5TOHP.js → chunk-WDBJVKSR.js} +3 -3
- package/dist/{chunk-4GT5TOHP.js.map → chunk-WDBJVKSR.js.map} +1 -1
- package/dist/{chunk-TYQ5CN2C.js → chunk-WQFC5EMC.js} +4 -4
- package/dist/{chunk-TYQ5CN2C.js.map → chunk-WQFC5EMC.js.map} +1 -1
- package/dist/{chunk-SBMOIE5C.cjs → chunk-WREHBIJ5.cjs} +10 -10
- package/dist/{chunk-SBMOIE5C.cjs.map → chunk-WREHBIJ5.cjs.map} +1 -1
- package/dist/chunk-WZ73TWB2.cjs +174 -0
- package/dist/chunk-WZ73TWB2.cjs.map +1 -0
- package/dist/chunk-XDFZRV3V.js +184 -0
- package/dist/chunk-XDFZRV3V.js.map +1 -0
- package/dist/{chunk-F7HW2PYR.cjs → chunk-XUT2Z2L6.cjs} +3 -3
- package/dist/{chunk-F7HW2PYR.cjs.map → chunk-XUT2Z2L6.cjs.map} +1 -1
- package/dist/{chunk-E6R63QOL.js → chunk-XZ22B3NW.js} +6 -6
- package/dist/{chunk-E6R63QOL.js.map → chunk-XZ22B3NW.js.map} +1 -1
- package/dist/{chunk-K5MHL732.js → chunk-YXKJOPYT.js} +4 -4
- package/dist/{chunk-K5MHL732.js.map → chunk-YXKJOPYT.js.map} +1 -1
- package/dist/{chunk-IDM6JJLP.cjs → chunk-YZ2I7CDF.cjs} +3 -3
- package/dist/{chunk-IDM6JJLP.cjs.map → chunk-YZ2I7CDF.cjs.map} +1 -1
- package/dist/index.cjs +142 -118
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +35 -31
- package/dist/index.js.map +1 -1
- package/dist/styles.css +25 -18
- package/dist/{tokens-HWQ7KWPG.css → tokens-BIIUTPKN.css} +17 -9
- package/dist/tokens.css +17 -9
- package/docs/llms/commandpalette.md +58 -0
- package/docs/llms/contextmenu.md +55 -0
- package/docs/llms/splitter.md +63 -0
- package/docs/llms/statusbar.md +53 -0
- package/docs/llms.md +5 -1
- package/package.json +1 -1
- package/dist/chunk-4MR4GVTD.js.map +0 -1
- package/dist/chunk-RDLPX7RK.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Drawer/Drawer.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Drawer/Drawer.tsx"],"names":[],"mappings":"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","file":"chunk-U5BZ7E3F.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Drawer.css\";\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Icon } from \"../Icon\";\n\nexport interface DrawerProps {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Close callback (triggered by mask click / close button / Esc). */\n onClose?: () => void;\n /** Which edge the drawer slides from. */\n placement?: \"left\" | \"right\" | \"top\" | \"bottom\";\n /** Width (for left/right) or height (for top/bottom). Number → px. */\n size?: number | string;\n /** Header title. */\n title?: React.ReactNode;\n /** Extra content rendered to the right of the title (e.g. action buttons). */\n extra?: React.ReactNode;\n /** Footer content. */\n footer?: React.ReactNode;\n /** Drawer body. */\n children?: React.ReactNode;\n /** Render the mask overlay. Default true. Set `false` for a non-blocking drawer. */\n mask?: boolean;\n /** Close when clicking the mask. Default true. Ignored when `mask` is false. */\n maskClosable?: boolean;\n /** Close on Escape key. Default true. */\n keyboard?: boolean;\n /** Show the close (×) button in the header. Default true. */\n closable?: boolean;\n /** Override the close icon node. */\n closeIcon?: React.ReactNode;\n /**\n * When true the drawer's children are unmounted every time it closes.\n * Default `false` — children stay mounted across open/close cycles so\n * internal state (form fields, scroll position) is preserved.\n */\n destroyOnClose?: boolean;\n /** Fires after the open/close animation finishes. */\n afterOpenChange?: (open: boolean) => void;\n /** Stack index for nested drawers. */\n zIndex?: number;\n className?: string;\n}\n\nconst ANIM_MS = 280;\n\n/** `Drawer` — slide-in panel from an edge. */\nexport const Drawer: React.FC<DrawerProps> = ({\n open,\n onClose,\n placement = \"right\",\n size = 380,\n title,\n extra,\n footer,\n children,\n mask = true,\n maskClosable = true,\n keyboard = true,\n closable = true,\n closeIcon,\n destroyOnClose = false,\n afterOpenChange,\n zIndex,\n className = \"\",\n}) => {\n const [hasOpenedOnce, setHasOpenedOnce] = React.useState(open);\n React.useEffect(() => {\n if (open) setHasOpenedOnce(true);\n }, [open]);\n\n React.useEffect(() => {\n if (!open || !keyboard) return;\n const h = (e: KeyboardEvent) => e.key === \"Escape\" && onClose?.();\n window.addEventListener(\"keydown\", h);\n return () => window.removeEventListener(\"keydown\", h);\n }, [open, keyboard, onClose]);\n\n const prevOpen = React.useRef(open);\n React.useEffect(() => {\n if (prevOpen.current !== open) {\n prevOpen.current = open;\n if (afterOpenChange) {\n const id = window.setTimeout(() => afterOpenChange(open), ANIM_MS);\n return () => window.clearTimeout(id);\n }\n }\n }, [open, afterOpenChange]);\n\n if (typeof document === \"undefined\") return null;\n if (!hasOpenedOnce) return null;\n if (!open && destroyOnClose) return null;\n\n const isV = placement === \"left\" || placement === \"right\";\n const style: React.CSSProperties = isV ? { width: size } : { height: size };\n if (zIndex != null) style.zIndex = zIndex;\n\n return ReactDOM.createPortal(\n <>\n {mask && (\n <div\n className={`drawer-overlay ${open ? \"\" : \"hidden\"}`}\n style={zIndex != null ? { zIndex: zIndex - 1 } : undefined}\n onClick={() => maskClosable && onClose?.()}\n />\n )}\n <div\n className={`drawer ${placement} ${open ? \"\" : \"hidden\"} ${className}`}\n style={style}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-hidden={!open}\n >\n {(title || extra || closable) && (\n <div className=\"drawer-head\">\n <div className=\"drawer-title\">{title}</div>\n <div className=\"drawer-head-right\">\n {extra}\n {closable && (\n <button\n type=\"button\"\n className=\"drawer-close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n {closeIcon ?? <Icon name=\"x\" size={16} />}\n </button>\n )}\n </div>\n </div>\n )}\n <div className=\"drawer-body\">{children}</div>\n {footer && <div className=\"drawer-foot\">{footer}</div>}\n </div>\n </>,\n document.body\n );\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './tokens-
|
|
1
|
+
import './tokens-BIIUTPKN.css';
|
|
2
2
|
import './shared-NJHRNLRH.css';
|
|
3
3
|
import './AppShell-RCALXUCZ.css';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -81,5 +81,5 @@ var AppShell = ({ sidebar, titleBar, children, className = "" }) => /* @__PURE__
|
|
|
81
81
|
] });
|
|
82
82
|
|
|
83
83
|
export { AppShell, Sidebar, TitleBar, WindowControls };
|
|
84
|
-
//# sourceMappingURL=chunk-
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
84
|
+
//# sourceMappingURL=chunk-UQB5OHMO.js.map
|
|
85
|
+
//# sourceMappingURL=chunk-UQB5OHMO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AppShell/AppShell.tsx"],"names":[],"mappings":"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","file":"chunk-3WAFIUDQ.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./AppShell.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface WindowControlsProps {\n /** macOS traffic lights or Windows-style buttons. */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * `WindowControls` — standalone window control buttons.\n * Mac: traffic lights (close/min/max). Windows: rectangular controls.\n */\nexport const WindowControls: React.FC<WindowControlsProps> = ({\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n className = \"\",\n}) => {\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n if (platform === \"windows\") {\n return (\n <div className={`win-controls windows ${className}`} style={noDragStyle}>\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 5h8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 1l8 8M9 1l-8 8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n </div>\n );\n }\n return (\n <div className={`win-controls mac ${className}`} style={noDragStyle}>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\" />\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\" />\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\" />\n </div>\n );\n};\n\nexport interface TitleBarProps {\n title?: React.ReactNode;\n /** Platform appearance — affects button placement. Default \"mac\". */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n /** Extra content in the center. */\n center?: React.ReactNode;\n /** Extra content on the trailing side. */\n actions?: React.ReactNode;\n /** Make the whole bar draggable (Electron `-webkit-app-region: drag`). */\n draggable?: boolean;\n className?: string;\n}\n\n/**\n * `TitleBar` — Electron-style window chrome. Attach at the top of your app.\n * Buttons are non-draggable regions so clicks register correctly.\n */\nexport const TitleBar: React.FC<TitleBarProps> = ({\n title,\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n center,\n actions,\n draggable = true,\n className = \"\",\n}) => {\n const dragStyle = draggable ? ({ WebkitAppRegion: \"drag\" } as React.CSSProperties) : undefined;\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n\n return (\n <div className={`titlebar ${platform} ${className}`} style={dragStyle}>\n {platform === \"mac\" && (\n <WindowControls platform=\"mac\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n <div className=\"titlebar-title\">{title}</div>\n {center && (\n <div className=\"titlebar-center\" style={noDragStyle}>\n {center}\n </div>\n )}\n {actions && (\n <div className=\"titlebar-actions\" style={noDragStyle}>\n {actions}\n </div>\n )}\n {platform === \"windows\" && (\n <WindowControls platform=\"windows\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n </div>\n );\n};\n\nexport interface SidebarItem {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n children?: SidebarItem[];\n}\n\nexport interface SidebarProps {\n items: SidebarItem[];\n activeKey?: string;\n onSelect?: (key: string) => void;\n /** Collapsed: icons only. */\n collapsed?: boolean;\n /** Header slot (e.g. workspace switcher). */\n header?: React.ReactNode;\n /** Footer slot (e.g. user card). */\n footer?: React.ReactNode;\n className?: string;\n}\n\n/** `Sidebar` — navigation rail. Pair with `AppShell`. */\nexport const Sidebar: React.FC<SidebarProps> = ({\n items,\n activeKey,\n onSelect,\n collapsed,\n header,\n footer,\n className = \"\",\n}) => (\n <aside className={`sidebar ${collapsed ? \"collapsed\" : \"\"} ${className}`}>\n {header && <div className=\"sidebar-header\">{header}</div>}\n <nav className=\"sidebar-nav\">\n {items.map((it) => (\n <button\n type=\"button\"\n key={it.key}\n className={`sidebar-item ${activeKey === it.key ? \"active\" : \"\"}`}\n onClick={() => onSelect?.(it.key)}\n >\n {it.icon && <span className=\"sidebar-icon\">{it.icon}</span>}\n {!collapsed && <span className=\"sidebar-label\">{it.label}</span>}\n {!collapsed && it.badge && <span className=\"sidebar-badge\">{it.badge}</span>}\n </button>\n ))}\n </nav>\n {footer && <div className=\"sidebar-footer\">{footer}</div>}\n </aside>\n);\n\nexport interface AppShellProps {\n sidebar?: React.ReactNode;\n titleBar?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `AppShell` — 3-zone Electron layout: title bar across top, sidebar on left, content fills rest.\n */\nexport const AppShell: React.FC<AppShellProps> = ({ sidebar, titleBar, children, className = \"\" }) => (\n <div className={`app-shell ${className}`}>\n {titleBar}\n <div className=\"app-shell-body\">\n {sidebar}\n <main className=\"app-shell-main\">{children}</main>\n </div>\n </div>\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/AppShell/AppShell.tsx"],"names":[],"mappings":"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","file":"chunk-UQB5OHMO.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./AppShell.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface WindowControlsProps {\n /** macOS traffic lights or Windows-style buttons. */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * `WindowControls` — standalone window control buttons.\n * Mac: traffic lights (close/min/max). Windows: rectangular controls.\n */\nexport const WindowControls: React.FC<WindowControlsProps> = ({\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n className = \"\",\n}) => {\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n if (platform === \"windows\") {\n return (\n <div className={`win-controls windows ${className}`} style={noDragStyle}>\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 5h8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 1l8 8M9 1l-8 8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n </div>\n );\n }\n return (\n <div className={`win-controls mac ${className}`} style={noDragStyle}>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\" />\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\" />\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\" />\n </div>\n );\n};\n\nexport interface TitleBarProps {\n title?: React.ReactNode;\n /** Platform appearance — affects button placement. Default \"mac\". */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n /** Extra content in the center. */\n center?: React.ReactNode;\n /** Extra content on the trailing side. */\n actions?: React.ReactNode;\n /** Make the whole bar draggable (Electron `-webkit-app-region: drag`). */\n draggable?: boolean;\n className?: string;\n}\n\n/**\n * `TitleBar` — Electron-style window chrome. Attach at the top of your app.\n * Buttons are non-draggable regions so clicks register correctly.\n */\nexport const TitleBar: React.FC<TitleBarProps> = ({\n title,\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n center,\n actions,\n draggable = true,\n className = \"\",\n}) => {\n const dragStyle = draggable ? ({ WebkitAppRegion: \"drag\" } as React.CSSProperties) : undefined;\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n\n return (\n <div className={`titlebar ${platform} ${className}`} style={dragStyle}>\n {platform === \"mac\" && (\n <WindowControls platform=\"mac\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n <div className=\"titlebar-title\">{title}</div>\n {center && (\n <div className=\"titlebar-center\" style={noDragStyle}>\n {center}\n </div>\n )}\n {actions && (\n <div className=\"titlebar-actions\" style={noDragStyle}>\n {actions}\n </div>\n )}\n {platform === \"windows\" && (\n <WindowControls platform=\"windows\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n </div>\n );\n};\n\nexport interface SidebarItem {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n children?: SidebarItem[];\n}\n\nexport interface SidebarProps {\n items: SidebarItem[];\n activeKey?: string;\n onSelect?: (key: string) => void;\n /** Collapsed: icons only. */\n collapsed?: boolean;\n /** Header slot (e.g. workspace switcher). */\n header?: React.ReactNode;\n /** Footer slot (e.g. user card). */\n footer?: React.ReactNode;\n className?: string;\n}\n\n/** `Sidebar` — navigation rail. Pair with `AppShell`. */\nexport const Sidebar: React.FC<SidebarProps> = ({\n items,\n activeKey,\n onSelect,\n collapsed,\n header,\n footer,\n className = \"\",\n}) => (\n <aside className={`sidebar ${collapsed ? \"collapsed\" : \"\"} ${className}`}>\n {header && <div className=\"sidebar-header\">{header}</div>}\n <nav className=\"sidebar-nav\">\n {items.map((it) => (\n <button\n type=\"button\"\n key={it.key}\n className={`sidebar-item ${activeKey === it.key ? \"active\" : \"\"}`}\n onClick={() => onSelect?.(it.key)}\n >\n {it.icon && <span className=\"sidebar-icon\">{it.icon}</span>}\n {!collapsed && <span className=\"sidebar-label\">{it.label}</span>}\n {!collapsed && it.badge && <span className=\"sidebar-badge\">{it.badge}</span>}\n </button>\n ))}\n </nav>\n {footer && <div className=\"sidebar-footer\">{footer}</div>}\n </aside>\n);\n\nexport interface AppShellProps {\n sidebar?: React.ReactNode;\n titleBar?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `AppShell` — 3-zone Electron layout: title bar across top, sidebar on left, content fills rest.\n */\nexport const AppShell: React.FC<AppShellProps> = ({ sidebar, titleBar, children, className = \"\" }) => (\n <div className={`app-shell ${className}`}>\n {titleBar}\n <div className=\"app-shell-body\">\n {sidebar}\n <main className=\"app-shell-main\">{children}</main>\n </div>\n </div>\n);\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Tag } from './chunk-
|
|
1
|
+
import { Tag } from './chunk-276NALYW.js';
|
|
2
2
|
import { useFloating } from './chunk-V2DIQ3RH.js';
|
|
3
3
|
import { Icon } from './chunk-GEYMWUW6.js';
|
|
4
|
-
import './tokens-
|
|
4
|
+
import './tokens-BIIUTPKN.css';
|
|
5
5
|
import './shared-NJHRNLRH.css';
|
|
6
|
-
import './Select-
|
|
6
|
+
import './Select-J3CCVFJ7.css';
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import { createPortal } from 'react-dom';
|
|
9
9
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -299,5 +299,5 @@ function Select(props) {
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
export { Select };
|
|
302
|
-
//# sourceMappingURL=chunk-
|
|
303
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-URLSZPS5.js.map
|
|
303
|
+
//# sourceMappingURL=chunk-URLSZPS5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Select/Select.tsx"],"names":[],"mappings":";;;;;;;;;;AA+BA,IAAM,UAAU,CACd,EAAA,KAC+B,KAAA,CAAM,OAAA,CAAS,GAA4B,OAAO,CAAA;AAmDnF,IAAM,OAAA,GAAU,CAA4B,KAAA,KAC1C,KAAA,CAAM,QAAQ,CAAC,EAAA,KAAQ,OAAA,CAAQ,EAAE,CAAA,GAAI,EAAA,CAAG,OAAA,GAAU,CAAC,EAAE,CAAE,CAAA;AAEzD,IAAM,aAAA,GAAgB,CAA4B,KAAA,EAAe,GAAA,KAAkC;AACjG,EAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,EAAA,MAAM,GAAA,GACJ,GAAA,CAAI,IAAA,KAAS,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,CAAA;AAC3E,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA;AACrC,CAAA;AAKO,SAAS,OAA2C,KAAA,EAA2C;AACpG,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,0BAAA;AAAA,IACd,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AACJ,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,KAAa,IAAA;AAEnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IAC1C,CAAC,OAAA,GAAW,KAAA,CAA+B,YAAA,GAAe;AAAA,GAC5D;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IACxC,OAAA,GAAW,KAAA,CAA8B,YAAA,IAAgB,KAAK;AAAC,GACjE;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,KAAA,CAAA,QAAA,CAAS,eAAe,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,eAAS,EAAE,CAAA;AAEnD,EAAA,MAAM,SAAA,GAAkB,aAAyB,IAAI,CAAA;AACrD,EAAA,MAAM,OAAA,GAAgB,aAAuB,IAAI,CAAA;AAEjD,EAAA,MAAM,iBAAiB,QAAA,KAAa,MAAA;AACpC,EAAA,MAAM,IAAA,GAAO,iBAAiB,QAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAe;AAC9B,IAAA,IAAI,CAAC,cAAA,EAAgB,YAAA,CAAa,CAAC,CAAA;AACnC,IAAA,YAAA,GAAe,CAAC,CAAA;AAChB,IAAA,IAAI,CAAC,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAK,aAAA,KAAkB,WAAA,CAA4B;AAAA,IACrE,IAAA;AAAA,IACA,SAAA,EAAW,QAAA;AAAA,IACX,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,IAAY,KAAA,CAA+B,KAAA,KAAU,MAAA;AAC/E,EAAA,MAAM,eAAA,GAAkB,OAAA,IAAY,KAAA,CAA8B,KAAA,KAAU,MAAA;AAE5E,EAAA,MAAM,WAAA,GAAc,gBAAA,GAAoB,KAAA,CAA+B,KAAA,GAAQ,WAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,eAAA,GAAmB,KAAA,CAA8B,KAAA,GAAS,UAAA;AAE7E,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAkB;AAC3B,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AAC9B,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,CAAC,CAAA;AACxC,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,CAAC,CAAA;AAAA,EAE1D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,qBAAA,CAAsB,MAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,IAAA,EAAM,YAAA,CAAa,EAAE,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAGrB,EAAA,MAAM,OAAA,GAAgB,cAAQ,MAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,OAAA;AAC1B,IAAA,MAAM,IAAI,YAAA,IAAgB,aAAA;AAC1B,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,YAAY,CAAC,CAAA;AAGjC,EAAA,MAAM,aAAA,GAAsB,cAAyB,MAAM;AACzD,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,OAAA;AAC1B,IAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO;AACX,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAE,CAAA,EAAG;AAChB,QAAA,OAAO,YAAA,CAAa,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA,GAAK,IAAA;AAAA,MAC1C;AACA,MAAA,MAAM,IAAA,GAAO,GAAG,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,YAAA,CAAa,QAAA,CAAS,CAAC,CAAC,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,OAAA,EAAS,MAAK,GAAI,IAAA;AAAA,IAC5D,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,IAAI,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,KAAK,CAAC,CAAA;AAEjC,EAAM,gBAAU,MAAM;AACpB,IAAA,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,EAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,YAAA,CAAa,MAAM,CAAC,CAAA;AAExB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAyB;AAC3C,IAAA,IAAI,IAAI,QAAA,EAAU;AAClB,IAAA,IAAI,CAAC,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAC,KAAA,CAA+B,QAAA,GAAW,GAAA,CAAI,KAAK,CAAA;AACpD,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAyB;AAC5C,IAAA,IAAI,IAAI,QAAA,EAAU;AAClB,IAAA,MAAM,GAAA,GAAM,cAAc,EAAC;AAC3B,IAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,IAAI,KAAK,CAAA,GAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,KAAK,CAAA,GAAI,CAAC,GAAG,GAAA,EAAK,IAAI,KAAK,CAAA;AAC9F,IAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,IAAI,CAAA;AACxC,IAAC,KAAA,CAA8B,WAAW,IAAI,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAwB;AACxC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,EAAE,CAAA;AACtC,MAAC,KAAA,CAA8B,QAAA,GAAW,EAAE,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,gBAAA,EAAkB,cAAA,CAAe,MAAS,CAAA;AAC/C,MAAC,MAA+B,OAAA,IAAU;AAAA,IAC5C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAClB,OAAA,GAAA,CAAW,UAAA,IAAc,EAAC,EAAG,QAAA,CAAS,GAAG,CAAA,GAAI,WAAA,KAAgB,GAAA;AAE/D,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,CAAa,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,aAAa,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,CAAa,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAClC,MAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,EAAU;AACxB,QAAA,IAAI,OAAA,cAAqB,GAAG,CAAA;AAAA,wBACZ,GAAG,CAAA;AAAA,MACrB;AACA,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAA,CAAY,cAAc,EAAC,EAC9B,IAAI,CAAC,CAAA,KAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAC,CAAA,CAC7C,OAAO,CAAC,CAAA,KAA4B,CAAC,CAAC,CAAC,CAAA;AAC1C,MAAA,MAAM,MAAO,KAAA,CAA8B,WAAA;AAC3C,MAAA,MAAM,QAAQ,GAAA,IAAO,IAAA,GAAO,SAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,QAAA;AACrD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,MAAA;AACzC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MACpD;AACA,MAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACV,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,WAAW,CAAC,QAAA;AAAA,YACZ,UAAU,MAAM;AACd,cAAA,MAAM,GAAA,GAAM,cAAc,EAAC;AAC3B,cAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,KAAK,CAAA;AAC5C,cAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,IAAI,CAAA;AACxC,cAAC,KAAA,CAA8B,WAAW,IAAI,CAAA;AAAA,YAChD,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAEjC,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UAXE,MAAA,CAAO,EAAE,KAAK;AAAA,SAatB,CAAA;AAAA,QACA,QAAA,GAAW,CAAA,oBAAK,IAAA,CAAC,GAAA,EAAA,EAAI,MAAK,SAAA,EAAU,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAE;AAAA,SAAA,EAAS;AAAA,OAAA,EAClD,CAAA;AAAA,IAEJ;AACA,IAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,eAAe,QAAA,EAAA,WAAA,EAAY,CAAA;AAChE,IAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,wBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,OAAA,CAAQ,IAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,sBACrD,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,KAAA,EACvB,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,eAAe,OAAA,GAAA,CAAW,UAAA,EAAY,MAAA,IAAU,CAAA,IAAK,IAAI,WAAA,KAAgB,MAAA;AAC/E,EAAA,MAAM,SAAA,GAAY,SAAA,IAAa,YAAA,IAAgB,CAAC,QAAA;AAGhD,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,SAAA;AACZ,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAA,CAAE,KAAK,CAAA;AAC9B,IAAA,MAAM,SAAS,GAAA,KAAQ,SAAA;AACvB,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,GAAA;AAAA,QACf,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,SAAA,EAAW,aAAa,GAAA,GAAM,QAAA,GAAW,EAAE,CAAA,CAAA,EAAI,MAAA,GAAS,cAAc,EAAE,CAAA,CAAA;AAAA,QACxE,YAAA,EAAc,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,QACpC,SAAS,MAAO,OAAA,GAAU,YAAY,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AAAA,QAEtD,QAAA,EAAA;AAAA,UAAA,OAAA,wBACE,MAAA,EAAA,EAAK,SAAA,EAAW,cAAc,GAAA,GAAM,IAAA,GAAO,EAAE,CAAA,CAAA,EAAI,aAAA,EAAW,MAC1D,QAAA,EAAA,GAAA,oBAAO,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,MAAA,EAAQ,GAAG,CAAA,EAClD,CAAA;AAAA,UAED,CAAA,CAAE,wBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,CAAA,CAAE,IAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,0BACzC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,YAC1C,EAAE,WAAA,oBAAe,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAkB,YAAE,WAAA,EAAY;AAAA,WAAA,EACpE,CAAA;AAAA,UACC,CAAC,OAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,MAAA,EACd,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,GAAG,CAAA,EAC1C;AAAA;AAAA,OAAA;AAAA,MAtBG,MAAA,CAAO,EAAE,KAAK;AAAA,KAwBrB;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,UAAU,IAAI,CAAA,CAAA,EAAI,UAAU,OAAA,GAAU,EAAE,IAAI,IAAA,GAAO,MAAA,GAAS,EAAE,CAAA,CAAA,EAAI,QAAA,GAAW,aAAa,EAAE,CAAA,CAAA,EAAI,UAAU,SAAA,GAAY,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,MAChJ,SAAA;AAAA,MACA,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,gBAAA;AAAA,YACV,QAAA;AAAA,YACA,SAAS,MAAM,CAAC,QAAA,IAAY,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,YAExC,QAAA,EAAA;AAAA,cAAA,aAAA,EAAc;AAAA,cACd,6BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,MAAK,QAAA,EAAS,YAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,UACvE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAK,GAAA,EAAI,IAAA,EAAM,IAAI,CAAA,EAC3B,CAAA;AAAA,kCAED,IAAA,EAAA,EAAK,IAAA,EAAK,YAAW,IAAA,EAAM,EAAA,EAAI,WAAU,cAAA,EAAe;AAAA;AAAA;AAAA,SAC3D;AAAA,QACC,IAAA,IAAQ,OAAO,QAAA,KAAa,WAAA,IAC3B,YAAA;AAAA,0BACE,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAW,QAAQ,aAAa,CAAA,CAAA;AAAA,cAChC,IAAA,EAAK,SAAA;AAAA,cACL,wBAAsB,OAAA,IAAW,MAAA;AAAA,cACjC,KAAA,EAAO,aAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,kCAC9B,GAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,SAAA;AAAA,sBACL,IAAA,EAAK,MAAA;AAAA,sBACL,KAAA,EAAO,KAAA;AAAA,sBACP,WAAA,EAAY,iBAAA;AAAA,sBACZ,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sBACxC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,wBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC3F,0BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,0BAAA,SAAA,CAAU,CAAC,CAAA;AAAA,wBACb;AAAA,sBACF;AAAA;AAAA;AACF,iBAAA,EACF,CAAA;AAAA,gBAED,OAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EACd,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,CAAA,EAC5B,CAAA;AAAA,kCACA,GAAA,CAAC,UAAK,QAAA,EAAA,uBAAA,EAAM;AAAA,iBAAA,EACd,IACE,aAAA,CAAc,MAAA,KAAW,oBAC3B,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,EAChC,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,IAAgB,gCAAA,EAAQ;AAAA,iBAAA,EACjC,IAEA,aAAA,CAAc,GAAA;AAAA,kBAAI,CAAC,IAAI,EAAA,KACrB,OAAA,CAAQ,EAAE,CAAA,mBACR,IAAA,CAAO,gBAAN,EACC,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,EAAA,CAAG,KAAA,EAAM,CAAA;AAAA,oBAC3C,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,YAAY;AAAA,mBAAA,EAAA,EAFT,CAAA,EAAA,EAAK,EAAE,CAAA,CAG5B,CAAA,GAEA,aAAa,EAAE;AAAA;AAEnB;AAAA;AAAA,WAEF;AAAA,UACA,QAAA,CAAS;AAAA;AACX;AAAA;AAAA,GACJ;AAEJ","file":"chunk-ZVCMXDTP.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Select.css\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Icon, type IconName } from \"../Icon\";\nimport { Tag } from \"../Tag\";\nimport { useFloating } from \"../../utils/useFloating\";\n\nexport interface SelectOption<T extends string | number = string> {\n value: T;\n label: React.ReactNode;\n /** Searchable text — used by default filter when `label` isn't a string. */\n text?: string;\n /** Secondary line shown beneath the label. */\n description?: React.ReactNode;\n /** Leading icon. */\n icon?: IconName;\n disabled?: boolean;\n}\n\nexport interface SelectOptionGroup<T extends string | number = string> {\n /** Group heading. */\n label: React.ReactNode;\n options: SelectOption<T>[];\n}\n\nexport type SelectItem<T extends string | number = string> =\n | SelectOption<T>\n | SelectOptionGroup<T>;\n\nconst isGroup = <T extends string | number>(\n it: SelectItem<T>\n): it is SelectOptionGroup<T> => Array.isArray((it as SelectOptionGroup<T>).options);\n\ninterface BaseSelectProps<T extends string | number = string> {\n /** Flat or mixed (groups + options) item list. */\n options: SelectItem<T>[];\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show invalid (red) ring. */\n invalid?: boolean;\n /** Show a small × to clear the selection (single mode) or all selections (multi). */\n clearable?: boolean;\n /** Add a search input at the top of the menu. */\n searchable?: boolean;\n /** Custom filter — defaults to label/text/value substring match. */\n filterOption?: (input: string, option: SelectOption<T>) => boolean;\n /** Show spinner instead of options. */\n loading?: boolean;\n /** Custom empty content when no options match. */\n emptyContent?: React.ReactNode;\n /** Controlled open state. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n /** Class for the popped-out menu. */\n menuClassName?: string;\n}\n\nexport interface SingleSelectProps<T extends string | number = string> extends BaseSelectProps<T> {\n multiple?: false;\n value?: T;\n defaultValue?: T;\n onChange?: (value: T) => void;\n /** Fired when user clears the selection via the × button. */\n onClear?: () => void;\n}\n\nexport interface MultiSelectProps<T extends string | number = string> extends BaseSelectProps<T> {\n multiple: true;\n value?: T[];\n defaultValue?: T[];\n onChange?: (value: T[]) => void;\n /** Max selected items shown as tags before collapsing to \"+N\". */\n maxTagCount?: number;\n}\n\nexport type SelectProps<T extends string | number = string> =\n | SingleSelectProps<T>\n | MultiSelectProps<T>;\n\nconst flatten = <T extends string | number>(items: SelectItem<T>[]): SelectOption<T>[] =>\n items.flatMap((it) => (isGroup(it) ? it.options : [it]));\n\nconst defaultFilter = <T extends string | number>(input: string, opt: SelectOption<T>): boolean => {\n const q = input.toLowerCase();\n const txt =\n opt.text ?? (typeof opt.label === \"string\" ? opt.label : String(opt.value));\n return txt.toLowerCase().includes(q);\n};\n\n/** `Select` — neumorphic dropdown. Set `multiple` for tag-style multi-select. */\nexport function Select<T extends string | number = string>(props: SingleSelectProps<T>): React.ReactElement;\nexport function Select<T extends string | number = string>(props: MultiSelectProps<T>): React.ReactElement;\nexport function Select<T extends string | number = string>(props: SelectProps<T>): React.ReactElement {\n const {\n options,\n placeholder = \"请选择…\",\n disabled,\n size = \"md\",\n invalid,\n clearable,\n searchable,\n filterOption,\n loading,\n emptyContent,\n open: openProp,\n defaultOpen,\n onOpenChange,\n className = \"\",\n menuClassName = \"\",\n } = props;\n const isMulti = props.multiple === true;\n\n const [innerSingle, setInnerSingle] = React.useState<T | undefined>(\n !isMulti ? (props as SingleSelectProps<T>).defaultValue : undefined\n );\n const [innerMulti, setInnerMulti] = React.useState<T[]>(\n isMulti ? (props as MultiSelectProps<T>).defaultValue ?? [] : []\n );\n const [innerOpen, setInnerOpen] = React.useState(defaultOpen ?? false);\n const [query, setQuery] = React.useState(\"\");\n const [activeIdx, setActiveIdx] = React.useState(-1);\n\n const searchRef = React.useRef<HTMLInputElement>(null);\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp! : innerOpen;\n const setOpen = (v: boolean) => {\n if (!openControlled) setInnerOpen(v);\n onOpenChange?.(v);\n if (!v) setQuery(\"\");\n };\n\n const { triggerRef: ref, floatingStyle } = useFloating<HTMLDivElement>({\n open,\n placement: \"bottom\",\n matchTriggerWidth: true,\n panelHeight: 320,\n });\n\n const singleControlled = !isMulti && (props as SingleSelectProps<T>).value !== undefined;\n const multiControlled = isMulti && (props as MultiSelectProps<T>).value !== undefined;\n\n const singleValue = singleControlled ? (props as SingleSelectProps<T>).value : innerSingle;\n const multiValue = multiControlled ? (props as MultiSelectProps<T>).value! : innerMulti;\n\n React.useEffect(() => {\n if (!open) return;\n const h = (e: MouseEvent) => {\n const t = e.target as Node;\n if (ref.current?.contains(t)) return;\n if (menuRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", h);\n return () => document.removeEventListener(\"mousedown\", h);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Auto-focus search input when opened\n React.useEffect(() => {\n if (open && searchable) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n if (!open) setActiveIdx(-1);\n }, [open, searchable]);\n\n // Filter options\n const allFlat = React.useMemo(() => flatten(options), [options]);\n const filteredFlat = React.useMemo(() => {\n if (!query.trim()) return allFlat;\n const f = filterOption ?? defaultFilter;\n return allFlat.filter((o) => f(query, o));\n }, [allFlat, query, filterOption]);\n\n // Re-bucket into groups respecting filter (for menu rendering)\n const filteredItems = React.useMemo<SelectItem<T>[]>(() => {\n if (!query.trim()) return options;\n return options\n .map((it) => {\n if (!isGroup(it)) {\n return filteredFlat.includes(it) ? it : null;\n }\n const kept = it.options.filter((o) => filteredFlat.includes(o));\n return kept.length ? { label: it.label, options: kept } : null;\n })\n .filter((x): x is SelectItem<T> => x !== null);\n }, [options, filteredFlat, query]);\n\n React.useEffect(() => {\n setActiveIdx(filteredFlat.length ? 0 : -1);\n }, [filteredFlat.length]);\n\n const pickSingle = (opt: SelectOption<T>) => {\n if (opt.disabled) return;\n if (!singleControlled) setInnerSingle(opt.value);\n (props as SingleSelectProps<T>).onChange?.(opt.value);\n setOpen(false);\n };\n\n const toggleMulti = (opt: SelectOption<T>) => {\n if (opt.disabled) return;\n const cur = multiValue ?? [];\n const next = cur.includes(opt.value) ? cur.filter((v) => v !== opt.value) : [...cur, opt.value];\n if (!multiControlled) setInnerMulti(next);\n (props as MultiSelectProps<T>).onChange?.(next);\n };\n\n const clearAll = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isMulti) {\n if (!multiControlled) setInnerMulti([]);\n (props as MultiSelectProps<T>).onChange?.([]);\n } else {\n if (!singleControlled) setInnerSingle(undefined);\n (props as SingleSelectProps<T>).onClear?.();\n }\n };\n\n const isSelected = (val: T) =>\n isMulti ? (multiValue ?? []).includes(val) : singleValue === val;\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(filteredFlat.length - 1, i + 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = filteredFlat[activeIdx];\n if (opt && !opt.disabled) {\n if (isMulti) toggleMulti(opt);\n else pickSingle(opt);\n }\n return;\n }\n };\n\n const renderTrigger = () => {\n if (isMulti) {\n const selected = (multiValue ?? [])\n .map((v) => allFlat.find((o) => o.value === v))\n .filter((o): o is SelectOption<T> => !!o);\n const max = (props as MultiSelectProps<T>).maxTagCount;\n const shown = max != null ? selected.slice(0, max) : selected;\n const overflow = selected.length - shown.length;\n if (selected.length === 0) {\n return <span className=\"placeholder\">{placeholder}</span>;\n }\n return (\n <span className=\"select-tags\">\n {shown.map((o) => (\n <Tag\n key={String(o.value)}\n tone=\"accent\"\n removable={!disabled}\n onRemove={() => {\n const cur = multiValue ?? [];\n const next = cur.filter((v) => v !== o.value);\n if (!multiControlled) setInnerMulti(next);\n (props as MultiSelectProps<T>).onChange?.(next);\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {o.label}\n </Tag>\n ))}\n {overflow > 0 && <Tag tone=\"neutral\">+{overflow}</Tag>}\n </span>\n );\n }\n const current = allFlat.find((o) => o.value === singleValue);\n if (!current) return <span className=\"placeholder\">{placeholder}</span>;\n return (\n <span className=\"select-value\">\n {current.icon && <Icon name={current.icon} size={14} />}\n <span>{current.label}</span>\n </span>\n );\n };\n\n const hasSelection = isMulti ? (multiValue?.length ?? 0) > 0 : singleValue !== undefined;\n const showClear = clearable && hasSelection && !disabled;\n\n // Render an option button\n let renderIdx = -1;\n const renderOption = (o: SelectOption<T>) => {\n renderIdx += 1;\n const idx = renderIdx;\n const sel = isSelected(o.value);\n const active = idx === activeIdx;\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"option\"\n aria-selected={sel}\n disabled={o.disabled}\n className={`menu-item ${sel ? \"active\" : \"\"} ${active ? \"highlight\" : \"\"}`}\n onMouseEnter={() => setActiveIdx(idx)}\n onClick={() => (isMulti ? toggleMulti(o) : pickSingle(o))}\n >\n {isMulti && (\n <span className={`menu-check ${sel ? \"on\" : \"\"}`} aria-hidden>\n {sel && <Icon name=\"check\" size={11} stroke={3} />}\n </span>\n )}\n {o.icon && <Icon name={o.icon} size={14} />}\n <span className=\"menu-item-body\">\n <span className=\"menu-item-label\">{o.label}</span>\n {o.description && <span className=\"menu-item-desc\">{o.description}</span>}\n </span>\n {!isMulti && (\n <span className=\"tick\">\n <Icon name=\"check\" size={12} stroke={3} />\n </span>\n )}\n </button>\n );\n };\n\n return (\n <div\n ref={ref}\n className={`select ${size} ${isMulti ? \"multi\" : \"\"} ${open ? \"open\" : \"\"} ${disabled ? \"disabled\" : \"\"} ${invalid ? \"invalid\" : \"\"} ${className}`}\n onKeyDown={onKeyDown}\n tabIndex={disabled ? -1 : 0}\n >\n <button\n type=\"button\"\n className=\"select-trigger\"\n disabled={disabled}\n onClick={() => !disabled && setOpen(!open)}\n >\n {renderTrigger()}\n {showClear && (\n <span className=\"select-clear\" role=\"button\" aria-label=\"Clear\" onClick={clearAll}>\n <Icon name=\"x\" size={12} />\n </span>\n )}\n <Icon name=\"chevDown\" size={14} className=\"select-caret\" />\n </button>\n {open && typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={menuRef}\n className={`menu ${menuClassName}`}\n role=\"listbox\"\n aria-multiselectable={isMulti || undefined}\n style={floatingStyle}\n >\n {searchable && (\n <div className=\"menu-search\">\n <Icon name=\"search\" size={13} />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n placeholder=\"搜索...\"\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" || e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\") {\n e.preventDefault();\n onKeyDown(e);\n }\n }}\n />\n </div>\n )}\n {loading ? (\n <div className=\"menu-state\">\n <span className=\"menu-state-ico\">\n <span className=\"spinner\" />\n </span>\n <span>加载中...</span>\n </div>\n ) : filteredItems.length === 0 ? (\n <div className=\"menu-state\">\n <span className=\"menu-state-ico\">\n <Icon name=\"search\" size={16} />\n </span>\n <span>{emptyContent ?? \"暂无匹配项\"}</span>\n </div>\n ) : (\n filteredItems.map((it, gi) =>\n isGroup(it) ? (\n <React.Fragment key={`g-${gi}`}>\n <div className=\"menu-group-label\">{it.label}</div>\n {it.options.map(renderOption)}\n </React.Fragment>\n ) : (\n renderOption(it)\n )\n )\n )}\n </div>,\n document.body\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Select/Select.tsx"],"names":[],"mappings":";;;;;;;;;;AA+BA,IAAM,UAAU,CACd,EAAA,KAC+B,KAAA,CAAM,OAAA,CAAS,GAA4B,OAAO,CAAA;AAmDnF,IAAM,OAAA,GAAU,CAA4B,KAAA,KAC1C,KAAA,CAAM,QAAQ,CAAC,EAAA,KAAQ,OAAA,CAAQ,EAAE,CAAA,GAAI,EAAA,CAAG,OAAA,GAAU,CAAC,EAAE,CAAE,CAAA;AAEzD,IAAM,aAAA,GAAgB,CAA4B,KAAA,EAAe,GAAA,KAAkC;AACjG,EAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,EAAA,MAAM,GAAA,GACJ,GAAA,CAAI,IAAA,KAAS,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,CAAA;AAC3E,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA;AACrC,CAAA;AAKO,SAAS,OAA2C,KAAA,EAA2C;AACpG,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,0BAAA;AAAA,IACd,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AACJ,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,KAAa,IAAA;AAEnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IAC1C,CAAC,OAAA,GAAW,KAAA,CAA+B,YAAA,GAAe;AAAA,GAC5D;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IACxC,OAAA,GAAW,KAAA,CAA8B,YAAA,IAAgB,KAAK;AAAC,GACjE;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,KAAA,CAAA,QAAA,CAAS,eAAe,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,eAAS,EAAE,CAAA;AAEnD,EAAA,MAAM,SAAA,GAAkB,aAAyB,IAAI,CAAA;AACrD,EAAA,MAAM,OAAA,GAAgB,aAAuB,IAAI,CAAA;AAEjD,EAAA,MAAM,iBAAiB,QAAA,KAAa,MAAA;AACpC,EAAA,MAAM,IAAA,GAAO,iBAAiB,QAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAe;AAC9B,IAAA,IAAI,CAAC,cAAA,EAAgB,YAAA,CAAa,CAAC,CAAA;AACnC,IAAA,YAAA,GAAe,CAAC,CAAA;AAChB,IAAA,IAAI,CAAC,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAK,aAAA,KAAkB,WAAA,CAA4B;AAAA,IACrE,IAAA;AAAA,IACA,SAAA,EAAW,QAAA;AAAA,IACX,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,IAAY,KAAA,CAA+B,KAAA,KAAU,MAAA;AAC/E,EAAA,MAAM,eAAA,GAAkB,OAAA,IAAY,KAAA,CAA8B,KAAA,KAAU,MAAA;AAE5E,EAAA,MAAM,WAAA,GAAc,gBAAA,GAAoB,KAAA,CAA+B,KAAA,GAAQ,WAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,eAAA,GAAmB,KAAA,CAA8B,KAAA,GAAS,UAAA;AAE7E,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAkB;AAC3B,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AAC9B,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,CAAC,CAAA;AACxC,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,CAAC,CAAA;AAAA,EAE1D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,qBAAA,CAAsB,MAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,IAAA,EAAM,YAAA,CAAa,EAAE,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAGrB,EAAA,MAAM,OAAA,GAAgB,cAAQ,MAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,OAAA;AAC1B,IAAA,MAAM,IAAI,YAAA,IAAgB,aAAA;AAC1B,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,YAAY,CAAC,CAAA;AAGjC,EAAA,MAAM,aAAA,GAAsB,cAAyB,MAAM;AACzD,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,OAAA;AAC1B,IAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO;AACX,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAE,CAAA,EAAG;AAChB,QAAA,OAAO,YAAA,CAAa,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA,GAAK,IAAA;AAAA,MAC1C;AACA,MAAA,MAAM,IAAA,GAAO,GAAG,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,YAAA,CAAa,QAAA,CAAS,CAAC,CAAC,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,OAAA,EAAS,MAAK,GAAI,IAAA;AAAA,IAC5D,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,IAAI,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,KAAK,CAAC,CAAA;AAEjC,EAAM,gBAAU,MAAM;AACpB,IAAA,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,EAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,YAAA,CAAa,MAAM,CAAC,CAAA;AAExB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAyB;AAC3C,IAAA,IAAI,IAAI,QAAA,EAAU;AAClB,IAAA,IAAI,CAAC,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAC,KAAA,CAA+B,QAAA,GAAW,GAAA,CAAI,KAAK,CAAA;AACpD,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAyB;AAC5C,IAAA,IAAI,IAAI,QAAA,EAAU;AAClB,IAAA,MAAM,GAAA,GAAM,cAAc,EAAC;AAC3B,IAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,IAAI,KAAK,CAAA,GAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,KAAK,CAAA,GAAI,CAAC,GAAG,GAAA,EAAK,IAAI,KAAK,CAAA;AAC9F,IAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,IAAI,CAAA;AACxC,IAAC,KAAA,CAA8B,WAAW,IAAI,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAwB;AACxC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,EAAE,CAAA;AACtC,MAAC,KAAA,CAA8B,QAAA,GAAW,EAAE,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,gBAAA,EAAkB,cAAA,CAAe,MAAS,CAAA;AAC/C,MAAC,MAA+B,OAAA,IAAU;AAAA,IAC5C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAClB,OAAA,GAAA,CAAW,UAAA,IAAc,EAAC,EAAG,QAAA,CAAS,GAAG,CAAA,GAAI,WAAA,KAAgB,GAAA;AAE/D,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,CAAa,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,aAAa,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,CAAa,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAClC,MAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,EAAU;AACxB,QAAA,IAAI,OAAA,cAAqB,GAAG,CAAA;AAAA,wBACZ,GAAG,CAAA;AAAA,MACrB;AACA,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAA,CAAY,cAAc,EAAC,EAC9B,IAAI,CAAC,CAAA,KAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAC,CAAA,CAC7C,OAAO,CAAC,CAAA,KAA4B,CAAC,CAAC,CAAC,CAAA;AAC1C,MAAA,MAAM,MAAO,KAAA,CAA8B,WAAA;AAC3C,MAAA,MAAM,QAAQ,GAAA,IAAO,IAAA,GAAO,SAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,QAAA;AACrD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,MAAA;AACzC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MACpD;AACA,MAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACV,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,WAAW,CAAC,QAAA;AAAA,YACZ,UAAU,MAAM;AACd,cAAA,MAAM,GAAA,GAAM,cAAc,EAAC;AAC3B,cAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,KAAK,CAAA;AAC5C,cAAA,IAAI,CAAC,eAAA,EAAiB,aAAA,CAAc,IAAI,CAAA;AACxC,cAAC,KAAA,CAA8B,WAAW,IAAI,CAAA;AAAA,YAChD,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAEjC,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UAXE,MAAA,CAAO,EAAE,KAAK;AAAA,SAatB,CAAA;AAAA,QACA,QAAA,GAAW,CAAA,oBAAK,IAAA,CAAC,GAAA,EAAA,EAAI,MAAK,SAAA,EAAU,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAE;AAAA,SAAA,EAAS;AAAA,OAAA,EAClD,CAAA;AAAA,IAEJ;AACA,IAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,eAAe,QAAA,EAAA,WAAA,EAAY,CAAA;AAChE,IAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,wBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,OAAA,CAAQ,IAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,sBACrD,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,KAAA,EACvB,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,eAAe,OAAA,GAAA,CAAW,UAAA,EAAY,MAAA,IAAU,CAAA,IAAK,IAAI,WAAA,KAAgB,MAAA;AAC/E,EAAA,MAAM,SAAA,GAAY,SAAA,IAAa,YAAA,IAAgB,CAAC,QAAA;AAGhD,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,SAAA;AACZ,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAA,CAAE,KAAK,CAAA;AAC9B,IAAA,MAAM,SAAS,GAAA,KAAQ,SAAA;AACvB,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,GAAA;AAAA,QACf,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,SAAA,EAAW,aAAa,GAAA,GAAM,QAAA,GAAW,EAAE,CAAA,CAAA,EAAI,MAAA,GAAS,cAAc,EAAE,CAAA,CAAA;AAAA,QACxE,YAAA,EAAc,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,QACpC,SAAS,MAAO,OAAA,GAAU,YAAY,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AAAA,QAEtD,QAAA,EAAA;AAAA,UAAA,OAAA,wBACE,MAAA,EAAA,EAAK,SAAA,EAAW,cAAc,GAAA,GAAM,IAAA,GAAO,EAAE,CAAA,CAAA,EAAI,aAAA,EAAW,MAC1D,QAAA,EAAA,GAAA,oBAAO,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,MAAA,EAAQ,GAAG,CAAA,EAClD,CAAA;AAAA,UAED,CAAA,CAAE,wBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,CAAA,CAAE,IAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,0BACzC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,YAC1C,EAAE,WAAA,oBAAe,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAkB,YAAE,WAAA,EAAY;AAAA,WAAA,EACpE,CAAA;AAAA,UACC,CAAC,OAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,MAAA,EACd,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,GAAG,CAAA,EAC1C;AAAA;AAAA,OAAA;AAAA,MAtBG,MAAA,CAAO,EAAE,KAAK;AAAA,KAwBrB;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,UAAU,IAAI,CAAA,CAAA,EAAI,UAAU,OAAA,GAAU,EAAE,IAAI,IAAA,GAAO,MAAA,GAAS,EAAE,CAAA,CAAA,EAAI,QAAA,GAAW,aAAa,EAAE,CAAA,CAAA,EAAI,UAAU,SAAA,GAAY,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,MAChJ,SAAA;AAAA,MACA,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,gBAAA;AAAA,YACV,QAAA;AAAA,YACA,SAAS,MAAM,CAAC,QAAA,IAAY,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,YAExC,QAAA,EAAA;AAAA,cAAA,aAAA,EAAc;AAAA,cACd,6BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,MAAK,QAAA,EAAS,YAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,UACvE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAK,GAAA,EAAI,IAAA,EAAM,IAAI,CAAA,EAC3B,CAAA;AAAA,kCAED,IAAA,EAAA,EAAK,IAAA,EAAK,YAAW,IAAA,EAAM,EAAA,EAAI,WAAU,cAAA,EAAe;AAAA;AAAA;AAAA,SAC3D;AAAA,QACC,IAAA,IAAQ,OAAO,QAAA,KAAa,WAAA,IAC3B,YAAA;AAAA,0BACE,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAW,QAAQ,aAAa,CAAA,CAAA;AAAA,cAChC,IAAA,EAAK,SAAA;AAAA,cACL,wBAAsB,OAAA,IAAW,MAAA;AAAA,cACjC,KAAA,EAAO,aAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,kCAC9B,GAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,SAAA;AAAA,sBACL,IAAA,EAAK,MAAA;AAAA,sBACL,KAAA,EAAO,KAAA;AAAA,sBACP,WAAA,EAAY,iBAAA;AAAA,sBACZ,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sBACxC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,wBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC3F,0BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,0BAAA,SAAA,CAAU,CAAC,CAAA;AAAA,wBACb;AAAA,sBACF;AAAA;AAAA;AACF,iBAAA,EACF,CAAA;AAAA,gBAED,OAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EACd,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,CAAA,EAC5B,CAAA;AAAA,kCACA,GAAA,CAAC,UAAK,QAAA,EAAA,uBAAA,EAAM;AAAA,iBAAA,EACd,IACE,aAAA,CAAc,MAAA,KAAW,oBAC3B,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,EAChC,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,IAAgB,gCAAA,EAAQ;AAAA,iBAAA,EACjC,IAEA,aAAA,CAAc,GAAA;AAAA,kBAAI,CAAC,IAAI,EAAA,KACrB,OAAA,CAAQ,EAAE,CAAA,mBACR,IAAA,CAAO,gBAAN,EACC,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,EAAA,CAAG,KAAA,EAAM,CAAA;AAAA,oBAC3C,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,YAAY;AAAA,mBAAA,EAAA,EAFT,CAAA,EAAA,EAAK,EAAE,CAAA,CAG5B,CAAA,GAEA,aAAa,EAAE;AAAA;AAEnB;AAAA;AAAA,WAEF;AAAA,UACA,QAAA,CAAS;AAAA;AACX;AAAA;AAAA,GACJ;AAEJ","file":"chunk-URLSZPS5.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Select.css\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Icon, type IconName } from \"../Icon\";\nimport { Tag } from \"../Tag\";\nimport { useFloating } from \"../../utils/useFloating\";\n\nexport interface SelectOption<T extends string | number = string> {\n value: T;\n label: React.ReactNode;\n /** Searchable text — used by default filter when `label` isn't a string. */\n text?: string;\n /** Secondary line shown beneath the label. */\n description?: React.ReactNode;\n /** Leading icon. */\n icon?: IconName;\n disabled?: boolean;\n}\n\nexport interface SelectOptionGroup<T extends string | number = string> {\n /** Group heading. */\n label: React.ReactNode;\n options: SelectOption<T>[];\n}\n\nexport type SelectItem<T extends string | number = string> =\n | SelectOption<T>\n | SelectOptionGroup<T>;\n\nconst isGroup = <T extends string | number>(\n it: SelectItem<T>\n): it is SelectOptionGroup<T> => Array.isArray((it as SelectOptionGroup<T>).options);\n\ninterface BaseSelectProps<T extends string | number = string> {\n /** Flat or mixed (groups + options) item list. */\n options: SelectItem<T>[];\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show invalid (red) ring. */\n invalid?: boolean;\n /** Show a small × to clear the selection (single mode) or all selections (multi). */\n clearable?: boolean;\n /** Add a search input at the top of the menu. */\n searchable?: boolean;\n /** Custom filter — defaults to label/text/value substring match. */\n filterOption?: (input: string, option: SelectOption<T>) => boolean;\n /** Show spinner instead of options. */\n loading?: boolean;\n /** Custom empty content when no options match. */\n emptyContent?: React.ReactNode;\n /** Controlled open state. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n /** Class for the popped-out menu. */\n menuClassName?: string;\n}\n\nexport interface SingleSelectProps<T extends string | number = string> extends BaseSelectProps<T> {\n multiple?: false;\n value?: T;\n defaultValue?: T;\n onChange?: (value: T) => void;\n /** Fired when user clears the selection via the × button. */\n onClear?: () => void;\n}\n\nexport interface MultiSelectProps<T extends string | number = string> extends BaseSelectProps<T> {\n multiple: true;\n value?: T[];\n defaultValue?: T[];\n onChange?: (value: T[]) => void;\n /** Max selected items shown as tags before collapsing to \"+N\". */\n maxTagCount?: number;\n}\n\nexport type SelectProps<T extends string | number = string> =\n | SingleSelectProps<T>\n | MultiSelectProps<T>;\n\nconst flatten = <T extends string | number>(items: SelectItem<T>[]): SelectOption<T>[] =>\n items.flatMap((it) => (isGroup(it) ? it.options : [it]));\n\nconst defaultFilter = <T extends string | number>(input: string, opt: SelectOption<T>): boolean => {\n const q = input.toLowerCase();\n const txt =\n opt.text ?? (typeof opt.label === \"string\" ? opt.label : String(opt.value));\n return txt.toLowerCase().includes(q);\n};\n\n/** `Select` — neumorphic dropdown. Set `multiple` for tag-style multi-select. */\nexport function Select<T extends string | number = string>(props: SingleSelectProps<T>): React.ReactElement;\nexport function Select<T extends string | number = string>(props: MultiSelectProps<T>): React.ReactElement;\nexport function Select<T extends string | number = string>(props: SelectProps<T>): React.ReactElement {\n const {\n options,\n placeholder = \"请选择…\",\n disabled,\n size = \"md\",\n invalid,\n clearable,\n searchable,\n filterOption,\n loading,\n emptyContent,\n open: openProp,\n defaultOpen,\n onOpenChange,\n className = \"\",\n menuClassName = \"\",\n } = props;\n const isMulti = props.multiple === true;\n\n const [innerSingle, setInnerSingle] = React.useState<T | undefined>(\n !isMulti ? (props as SingleSelectProps<T>).defaultValue : undefined\n );\n const [innerMulti, setInnerMulti] = React.useState<T[]>(\n isMulti ? (props as MultiSelectProps<T>).defaultValue ?? [] : []\n );\n const [innerOpen, setInnerOpen] = React.useState(defaultOpen ?? false);\n const [query, setQuery] = React.useState(\"\");\n const [activeIdx, setActiveIdx] = React.useState(-1);\n\n const searchRef = React.useRef<HTMLInputElement>(null);\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp! : innerOpen;\n const setOpen = (v: boolean) => {\n if (!openControlled) setInnerOpen(v);\n onOpenChange?.(v);\n if (!v) setQuery(\"\");\n };\n\n const { triggerRef: ref, floatingStyle } = useFloating<HTMLDivElement>({\n open,\n placement: \"bottom\",\n matchTriggerWidth: true,\n panelHeight: 320,\n });\n\n const singleControlled = !isMulti && (props as SingleSelectProps<T>).value !== undefined;\n const multiControlled = isMulti && (props as MultiSelectProps<T>).value !== undefined;\n\n const singleValue = singleControlled ? (props as SingleSelectProps<T>).value : innerSingle;\n const multiValue = multiControlled ? (props as MultiSelectProps<T>).value! : innerMulti;\n\n React.useEffect(() => {\n if (!open) return;\n const h = (e: MouseEvent) => {\n const t = e.target as Node;\n if (ref.current?.contains(t)) return;\n if (menuRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", h);\n return () => document.removeEventListener(\"mousedown\", h);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Auto-focus search input when opened\n React.useEffect(() => {\n if (open && searchable) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n if (!open) setActiveIdx(-1);\n }, [open, searchable]);\n\n // Filter options\n const allFlat = React.useMemo(() => flatten(options), [options]);\n const filteredFlat = React.useMemo(() => {\n if (!query.trim()) return allFlat;\n const f = filterOption ?? defaultFilter;\n return allFlat.filter((o) => f(query, o));\n }, [allFlat, query, filterOption]);\n\n // Re-bucket into groups respecting filter (for menu rendering)\n const filteredItems = React.useMemo<SelectItem<T>[]>(() => {\n if (!query.trim()) return options;\n return options\n .map((it) => {\n if (!isGroup(it)) {\n return filteredFlat.includes(it) ? it : null;\n }\n const kept = it.options.filter((o) => filteredFlat.includes(o));\n return kept.length ? { label: it.label, options: kept } : null;\n })\n .filter((x): x is SelectItem<T> => x !== null);\n }, [options, filteredFlat, query]);\n\n React.useEffect(() => {\n setActiveIdx(filteredFlat.length ? 0 : -1);\n }, [filteredFlat.length]);\n\n const pickSingle = (opt: SelectOption<T>) => {\n if (opt.disabled) return;\n if (!singleControlled) setInnerSingle(opt.value);\n (props as SingleSelectProps<T>).onChange?.(opt.value);\n setOpen(false);\n };\n\n const toggleMulti = (opt: SelectOption<T>) => {\n if (opt.disabled) return;\n const cur = multiValue ?? [];\n const next = cur.includes(opt.value) ? cur.filter((v) => v !== opt.value) : [...cur, opt.value];\n if (!multiControlled) setInnerMulti(next);\n (props as MultiSelectProps<T>).onChange?.(next);\n };\n\n const clearAll = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isMulti) {\n if (!multiControlled) setInnerMulti([]);\n (props as MultiSelectProps<T>).onChange?.([]);\n } else {\n if (!singleControlled) setInnerSingle(undefined);\n (props as SingleSelectProps<T>).onClear?.();\n }\n };\n\n const isSelected = (val: T) =>\n isMulti ? (multiValue ?? []).includes(val) : singleValue === val;\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(filteredFlat.length - 1, i + 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = filteredFlat[activeIdx];\n if (opt && !opt.disabled) {\n if (isMulti) toggleMulti(opt);\n else pickSingle(opt);\n }\n return;\n }\n };\n\n const renderTrigger = () => {\n if (isMulti) {\n const selected = (multiValue ?? [])\n .map((v) => allFlat.find((o) => o.value === v))\n .filter((o): o is SelectOption<T> => !!o);\n const max = (props as MultiSelectProps<T>).maxTagCount;\n const shown = max != null ? selected.slice(0, max) : selected;\n const overflow = selected.length - shown.length;\n if (selected.length === 0) {\n return <span className=\"placeholder\">{placeholder}</span>;\n }\n return (\n <span className=\"select-tags\">\n {shown.map((o) => (\n <Tag\n key={String(o.value)}\n tone=\"accent\"\n removable={!disabled}\n onRemove={() => {\n const cur = multiValue ?? [];\n const next = cur.filter((v) => v !== o.value);\n if (!multiControlled) setInnerMulti(next);\n (props as MultiSelectProps<T>).onChange?.(next);\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {o.label}\n </Tag>\n ))}\n {overflow > 0 && <Tag tone=\"neutral\">+{overflow}</Tag>}\n </span>\n );\n }\n const current = allFlat.find((o) => o.value === singleValue);\n if (!current) return <span className=\"placeholder\">{placeholder}</span>;\n return (\n <span className=\"select-value\">\n {current.icon && <Icon name={current.icon} size={14} />}\n <span>{current.label}</span>\n </span>\n );\n };\n\n const hasSelection = isMulti ? (multiValue?.length ?? 0) > 0 : singleValue !== undefined;\n const showClear = clearable && hasSelection && !disabled;\n\n // Render an option button\n let renderIdx = -1;\n const renderOption = (o: SelectOption<T>) => {\n renderIdx += 1;\n const idx = renderIdx;\n const sel = isSelected(o.value);\n const active = idx === activeIdx;\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"option\"\n aria-selected={sel}\n disabled={o.disabled}\n className={`menu-item ${sel ? \"active\" : \"\"} ${active ? \"highlight\" : \"\"}`}\n onMouseEnter={() => setActiveIdx(idx)}\n onClick={() => (isMulti ? toggleMulti(o) : pickSingle(o))}\n >\n {isMulti && (\n <span className={`menu-check ${sel ? \"on\" : \"\"}`} aria-hidden>\n {sel && <Icon name=\"check\" size={11} stroke={3} />}\n </span>\n )}\n {o.icon && <Icon name={o.icon} size={14} />}\n <span className=\"menu-item-body\">\n <span className=\"menu-item-label\">{o.label}</span>\n {o.description && <span className=\"menu-item-desc\">{o.description}</span>}\n </span>\n {!isMulti && (\n <span className=\"tick\">\n <Icon name=\"check\" size={12} stroke={3} />\n </span>\n )}\n </button>\n );\n };\n\n return (\n <div\n ref={ref}\n className={`select ${size} ${isMulti ? \"multi\" : \"\"} ${open ? \"open\" : \"\"} ${disabled ? \"disabled\" : \"\"} ${invalid ? \"invalid\" : \"\"} ${className}`}\n onKeyDown={onKeyDown}\n tabIndex={disabled ? -1 : 0}\n >\n <button\n type=\"button\"\n className=\"select-trigger\"\n disabled={disabled}\n onClick={() => !disabled && setOpen(!open)}\n >\n {renderTrigger()}\n {showClear && (\n <span className=\"select-clear\" role=\"button\" aria-label=\"Clear\" onClick={clearAll}>\n <Icon name=\"x\" size={12} />\n </span>\n )}\n <Icon name=\"chevDown\" size={14} className=\"select-caret\" />\n </button>\n {open && typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={menuRef}\n className={`menu ${menuClassName}`}\n role=\"listbox\"\n aria-multiselectable={isMulti || undefined}\n style={floatingStyle}\n >\n {searchable && (\n <div className=\"menu-search\">\n <Icon name=\"search\" size={13} />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n placeholder=\"搜索...\"\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" || e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\") {\n e.preventDefault();\n onKeyDown(e);\n }\n }}\n />\n </div>\n )}\n {loading ? (\n <div className=\"menu-state\">\n <span className=\"menu-state-ico\">\n <span className=\"spinner\" />\n </span>\n <span>加载中...</span>\n </div>\n ) : filteredItems.length === 0 ? (\n <div className=\"menu-state\">\n <span className=\"menu-state-ico\">\n <Icon name=\"search\" size={16} />\n </span>\n <span>{emptyContent ?? \"暂无匹配项\"}</span>\n </div>\n ) : (\n filteredItems.map((it, gi) =>\n isGroup(it) ? (\n <React.Fragment key={`g-${gi}`}>\n <div className=\"menu-group-label\">{it.label}</div>\n {it.options.map(renderOption)}\n </React.Fragment>\n ) : (\n renderOption(it)\n )\n )\n )}\n </div>,\n document.body\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './tokens-
|
|
1
|
+
import './tokens-BIIUTPKN.css';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -249,5 +249,5 @@ var ThemeProvider = (props) => {
|
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, FONT_STACKS, ThemeProvider, applyTheme, normalizeAccentInput, resolveThemeMode, useTheme, useThemeOptional };
|
|
252
|
-
//# sourceMappingURL=chunk-
|
|
253
|
-
//# sourceMappingURL=chunk-
|
|
252
|
+
//# sourceMappingURL=chunk-W6I67HQQ.js.map
|
|
253
|
+
//# sourceMappingURL=chunk-W6I67HQQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Theme/Theme.tsx"],"names":[],"mappings":"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","file":"chunk-I7SSCSFH.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport * as React from \"react\";\n\n/* ============================================================================\n * Theme — full custom theming system for lumina\n *\n * - <ThemeProvider> manages theme state and applies CSS variables / data-attrs\n * to either <html> (global) or a local scope.\n * - useTheme() exposes read/write access for descendants.\n * - Presets: accent palettes, font stacks, densities.\n * - Custom accent: pass a full palette or only a base color — missing slots\n * are auto-derived via `color-mix`.\n * - Persistence: optional localStorage via `storageKey` prop.\n * - \"system\" mode respects `prefers-color-scheme` via matchMedia.\n * - Arbitrary token overrides through the `tokens` prop.\n * ========================================================================== */\n\n/* ------------------------------- Types ---------------------------------- */\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\nexport type ResolvedThemeMode = \"light\" | \"dark\";\nexport type AccentKey = \"sky\" | \"coral\" | \"mint\" | \"violet\" | \"amber\" | \"rose\";\nexport type DensityMode = \"compact\" | \"comfortable\" | \"spacious\";\nexport type FontKey = \"system\" | \"sf\" | \"serif\" | \"mono\";\n\n/** Full accent color slots. All four CSS variables the library reads. */\nexport interface AccentPalette {\n /** Primary accent — `--accent`. */\n accent: string;\n /** Darker text-on-soft variant — `--accent-ink`. */\n ink: string;\n /** Pale tint for backgrounds — `--accent-soft`. */\n soft: string;\n /** Halo / glow color (typically with alpha) — `--accent-glow`. */\n glow: string;\n}\n\n/** Input type for custom accent: either full palette, or just a base color\n * (missing slots derived via color-mix in CSS). */\nexport type CustomAccentInput = string | Partial<AccentPalette> & { accent: string };\n\n/** Font config — either a preset key, a single sans string, or a granular object. */\nexport type FontConfig =\n | FontKey\n | string\n | { sans?: string; display?: string; mono?: string };\n\n/** Arbitrary CSS variable overrides. Keys may be either a short name\n * (e.g. `\"bg\"` → `--bg`) or a full var name (e.g. `\"--bg\"`). */\nexport type ThemeTokens = Record<string, string>;\n\nexport interface ThemeConfig {\n mode?: ThemeMode;\n accent?: AccentKey | CustomAccentInput;\n density?: DensityMode;\n /** Shadow strength, 1..10. Maps to `--d` (0.4..1.6). */\n intensity?: number;\n /** Base radius in px — generates the full `--r-*` scale. */\n radius?: number;\n font?: FontConfig;\n tokens?: ThemeTokens;\n}\n\nexport interface ThemeValue {\n /** Requested mode (\"system\" is preserved here). */\n mode: ThemeMode;\n /** Resolved concrete mode (\"system\" → \"light\" | \"dark\" based on OS). */\n resolvedMode: ResolvedThemeMode;\n /** Accent key or \"custom\" if a palette was supplied. */\n accent: AccentKey | \"custom\";\n /** Resolved palette currently in effect. */\n accentPalette: AccentPalette;\n density: DensityMode;\n intensity: number;\n radius: number;\n font: FontConfig;\n tokens: ThemeTokens;\n\n setMode: (m: ThemeMode) => void;\n toggleMode: () => void;\n setAccent: (a: AccentKey | CustomAccentInput) => void;\n setDensity: (d: DensityMode) => void;\n setIntensity: (n: number) => void;\n setRadius: (n: number) => void;\n setFont: (f: FontConfig) => void;\n setTokens: (t: ThemeTokens) => void;\n /** Shallow-merge a partial config. */\n update: (cfg: Partial<ThemeConfig>) => void;\n /** Reset to the initial props. */\n reset: () => void;\n}\n\n/* --------------------------- Built-in presets --------------------------- */\n\n/** Built-in accent palettes (light-mode values). */\nexport const ACCENT_PRESETS: Record<AccentKey, AccentPalette> = {\n sky: { accent: \"oklch(68% 0.14 235)\", ink: \"oklch(42% 0.12 235)\", soft: \"oklch(92% 0.04 235)\", glow: \"oklch(68% 0.14 235 / 0.35)\" },\n coral: { accent: \"oklch(72% 0.16 35)\", ink: \"oklch(48% 0.14 35)\", soft: \"oklch(94% 0.04 35)\", glow: \"oklch(72% 0.16 35 / 0.35)\" },\n mint: { accent: \"oklch(72% 0.13 165)\", ink: \"oklch(46% 0.11 165)\", soft: \"oklch(93% 0.04 165)\", glow: \"oklch(72% 0.13 165 / 0.35)\" },\n violet: { accent: \"oklch(66% 0.16 290)\", ink: \"oklch(44% 0.14 290)\", soft: \"oklch(93% 0.04 290)\", glow: \"oklch(66% 0.16 290 / 0.35)\" },\n amber: { accent: \"oklch(76% 0.14 75)\", ink: \"oklch(50% 0.12 75)\", soft: \"oklch(94% 0.05 75)\", glow: \"oklch(76% 0.14 75 / 0.35)\" },\n rose: { accent: \"oklch(68% 0.17 10)\", ink: \"oklch(46% 0.15 10)\", soft: \"oklch(93% 0.04 10)\", glow: \"oklch(68% 0.17 10 / 0.35)\" },\n};\n\n/** Dark-mode overrides — ink/soft shift, and glow alpha is halved so the outer\n * button bloom doesn't read as a bright ring on dark surfaces. */\nexport const ACCENT_PRESETS_DARK: Record<AccentKey, Pick<AccentPalette, \"ink\" | \"soft\" | \"glow\">> = {\n sky: { soft: \"oklch(35% 0.08 235)\", ink: \"oklch(82% 0.10 235)\", glow: \"oklch(68% 0.14 235 / 0.18)\" },\n coral: { soft: \"oklch(38% 0.09 35)\", ink: \"oklch(84% 0.10 35)\", glow: \"oklch(72% 0.16 35 / 0.18)\" },\n mint: { soft: \"oklch(36% 0.08 165)\", ink: \"oklch(83% 0.10 165)\", glow: \"oklch(72% 0.13 165 / 0.18)\" },\n violet: { soft: \"oklch(36% 0.09 290)\", ink: \"oklch(82% 0.11 290)\", glow: \"oklch(66% 0.16 290 / 0.18)\" },\n amber: { soft: \"oklch(38% 0.08 75)\", ink: \"oklch(85% 0.10 75)\", glow: \"oklch(76% 0.14 75 / 0.18)\" },\n rose: { soft: \"oklch(38% 0.09 10)\", ink: \"oklch(84% 0.11 10)\", glow: \"oklch(68% 0.17 10 / 0.18)\" },\n};\n\n/** Built-in font family stacks. */\nexport const FONT_STACKS: Record<FontKey, string> = {\n system: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n sf: '\"SF Pro Display\", -apple-system, BlinkMacSystemFont, \"PingFang SC\", sans-serif',\n serif: 'Cambria, Georgia, \"Songti SC\", \"STSong\", serif',\n mono: 'ui-monospace, \"SF Mono\", \"JetBrains Mono\", Consolas, monospace',\n};\n\nconst DEFAULT_CONFIG: Required<Omit<ThemeConfig, \"tokens\">> & { tokens: ThemeTokens } = {\n mode: \"light\",\n accent: \"sky\",\n density: \"comfortable\",\n intensity: 5,\n radius: 20,\n font: \"sf\",\n tokens: {},\n};\n\n/* ------------------------------ Helpers --------------------------------- */\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n/** Resolve \"system\" mode against `prefers-color-scheme`. */\nexport function resolveThemeMode(mode: ThemeMode): ResolvedThemeMode {\n if (mode !== \"system\") return mode;\n if (!isBrowser) return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/** Fill missing slots of a custom accent via color-mix. */\nexport function normalizeAccentInput(\n input: AccentKey | CustomAccentInput,\n resolvedMode: ResolvedThemeMode\n): { key: AccentKey | \"custom\"; palette: AccentPalette } {\n // Preset key?\n if (typeof input === \"string\" && input in ACCENT_PRESETS) {\n const key = input as AccentKey;\n const base = ACCENT_PRESETS[key];\n if (resolvedMode === \"dark\") {\n return { key, palette: { ...base, ...ACCENT_PRESETS_DARK[key] } };\n }\n return { key, palette: base };\n }\n // Custom — either a raw color string or a partial palette object.\n const raw = typeof input === \"string\" ? { accent: input } : input;\n const { accent } = raw;\n const ink = raw.ink ?? `color-mix(in oklch, ${accent} 65%, black)`;\n const soft =\n raw.soft ??\n (resolvedMode === \"dark\"\n ? `color-mix(in oklch, ${accent} 30%, black)`\n : `color-mix(in oklch, ${accent} 15%, white)`);\n // Dark-mode glow is halved so it doesn't wash into a white halo on dark surfaces.\n const glow =\n raw.glow ??\n (resolvedMode === \"dark\"\n ? `color-mix(in oklch, ${accent} 18%, transparent)`\n : `color-mix(in oklch, ${accent} 35%, transparent)`);\n return { key: \"custom\", palette: { accent, ink, soft, glow } };\n}\n\n/** Normalize a token key to a CSS custom property name. */\nfunction toVar(key: string): string {\n return key.startsWith(\"--\") ? key : `--${key}`;\n}\n\n/** Imperative theme application — writes CSS vars / data-attrs on a target. */\nexport function applyTheme(target: HTMLElement, config: ThemeConfig): void {\n const cfg: ThemeConfig = { ...DEFAULT_CONFIG, ...config };\n const resolvedMode = resolveThemeMode(cfg.mode!);\n const { key, palette } = normalizeAccentInput(cfg.accent!, resolvedMode);\n\n // data-* attributes\n target.dataset.theme = resolvedMode;\n target.dataset.density = cfg.density!;\n if (key === \"custom\") {\n delete target.dataset.accent;\n } else {\n target.dataset.accent = key;\n }\n\n // Accent palette — always set inline so custom overrides win and preset\n // stays deterministic across mode switches.\n target.style.setProperty(\"--accent\", palette.accent);\n target.style.setProperty(\"--accent-ink\", palette.ink);\n target.style.setProperty(\"--accent-soft\", palette.soft);\n target.style.setProperty(\"--accent-glow\", palette.glow);\n\n // Shadow intensity (1..10 → 0.4..1.6)\n const intensity = cfg.intensity ?? DEFAULT_CONFIG.intensity;\n target.style.setProperty(\"--d\", String(0.4 + intensity * 0.12));\n\n // Radius scale\n const r = cfg.radius ?? DEFAULT_CONFIG.radius;\n target.style.setProperty(\"--r-xs\", `${Math.max(4, r - 16)}px`);\n target.style.setProperty(\"--r-sm\", `${Math.max(6, r - 12)}px`);\n target.style.setProperty(\"--r-md\", `${Math.max(8, r - 6)}px`);\n target.style.setProperty(\"--r-lg\", `${r}px`);\n target.style.setProperty(\"--r-xl\", `${r + 10}px`);\n\n // Fonts\n const font = cfg.font ?? DEFAULT_CONFIG.font;\n if (typeof font === \"string\") {\n const stack = (FONT_STACKS as Record<string, string>)[font] ?? font;\n target.style.setProperty(\"--font-sans\", stack);\n if (font === \"mono\") target.style.setProperty(\"--font-display\", FONT_STACKS.mono);\n } else {\n if (font.sans) target.style.setProperty(\"--font-sans\", font.sans);\n if (font.display) target.style.setProperty(\"--font-display\", font.display);\n if (font.mono) target.style.setProperty(\"--font-mono\", font.mono);\n }\n\n // Arbitrary token overrides\n if (cfg.tokens) {\n for (const [k, v] of Object.entries(cfg.tokens)) {\n target.style.setProperty(toVar(k), v);\n }\n }\n}\n\n/* ----------------------------- Context ---------------------------------- */\n\nconst ThemeCtx = React.createContext<ThemeValue | null>(null);\n\n/** Read/write access to the nearest `<ThemeProvider>`. */\nexport function useTheme(): ThemeValue {\n const ctx = React.useContext(ThemeCtx);\n if (!ctx) {\n throw new Error(\n \"useTheme() must be used inside <ThemeProvider>. Wrap your app (or a subtree) with <ThemeProvider>.\"\n );\n }\n return ctx;\n}\n\n/** Read theme value without throwing — returns `null` outside of a provider. */\nexport function useThemeOptional(): ThemeValue | null {\n return React.useContext(ThemeCtx);\n}\n\n/* ---------------------------- Persistence ------------------------------- */\n\nfunction loadPersisted(key: string | undefined): Partial<ThemeConfig> | null {\n if (!key || !isBrowser) return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as Partial<ThemeConfig>;\n } catch {\n return null;\n }\n}\n\nfunction persist(key: string | undefined, cfg: ThemeConfig): void {\n if (!key || !isBrowser) return;\n try {\n localStorage.setItem(key, JSON.stringify(cfg));\n } catch {\n /* quota exceeded / disabled storage — ignore */\n }\n}\n\n/* --------------------------- ThemeProvider ------------------------------ */\n\nexport interface ThemeProviderProps extends ThemeConfig {\n children?: React.ReactNode;\n /**\n * Where to apply the theme.\n * - `\"root\"` (default): on `<html>` — affects the whole document.\n * - `\"scope\"`: on a local wrapper element — scoped to descendants.\n */\n target?: \"root\" | \"scope\";\n /** Tag for scope mode. Default `\"div\"`. */\n as?: keyof JSX.IntrinsicElements;\n className?: string;\n style?: React.CSSProperties;\n /** If set, theme state is persisted to localStorage under this key. */\n storageKey?: string;\n /** Called whenever the resolved theme value changes. */\n onChange?: (value: ThemeValue) => void;\n}\n\n/**\n * `<ThemeProvider>` — manage theme state and apply CSS variables.\n *\n * @example\n * ```tsx\n * <ThemeProvider mode=\"system\" accent=\"violet\" storageKey=\"app:theme\">\n * <App />\n * </ThemeProvider>\n * ```\n *\n * @example Custom accent\n * ```tsx\n * <ThemeProvider accent={{ accent: \"oklch(70% 0.2 180)\" }} />\n * // or just\n * <ThemeProvider accent=\"oklch(70% 0.2 180)\" />\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = (props) => {\n const {\n children,\n target = \"root\",\n as: Tag = \"div\",\n className,\n style,\n storageKey,\n onChange,\n ...configProps\n } = props;\n\n // Build the initial config: defaults ← props ← persisted (if any)\n const initialConfig = React.useMemo<ThemeConfig>(() => {\n const fromProps: ThemeConfig = {\n mode: configProps.mode ?? DEFAULT_CONFIG.mode,\n accent: configProps.accent ?? DEFAULT_CONFIG.accent,\n density: configProps.density ?? DEFAULT_CONFIG.density,\n intensity: configProps.intensity ?? DEFAULT_CONFIG.intensity,\n radius: configProps.radius ?? DEFAULT_CONFIG.radius,\n font: configProps.font ?? DEFAULT_CONFIG.font,\n tokens: configProps.tokens ?? {},\n };\n const persisted = loadPersisted(storageKey);\n return persisted ? { ...fromProps, ...persisted } : fromProps;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [config, setConfig] = React.useState<ThemeConfig>(initialConfig);\n\n // Sync external prop changes into state — so callers can drive the provider\n // \"controlled-style\" (e.g. <ThemeProvider accent={reactState} />).\n // `setMode`/`setAccent`/etc. still work; they just get overridden if the\n // parent later changes the prop.\n React.useEffect(() => {\n setConfig((c) => {\n const next: ThemeConfig = {\n mode: configProps.mode ?? c.mode,\n accent: configProps.accent ?? c.accent,\n density: configProps.density ?? c.density,\n intensity: configProps.intensity ?? c.intensity,\n radius: configProps.radius ?? c.radius,\n font: configProps.font ?? c.font,\n tokens: configProps.tokens ?? c.tokens,\n };\n if (\n next.mode === c.mode &&\n next.accent === c.accent &&\n next.density === c.density &&\n next.intensity === c.intensity &&\n next.radius === c.radius &&\n next.font === c.font &&\n next.tokens === c.tokens\n ) {\n return c;\n }\n return next;\n });\n }, [\n configProps.mode,\n configProps.accent,\n configProps.density,\n configProps.intensity,\n configProps.radius,\n configProps.font,\n configProps.tokens,\n ]);\n\n // Listen for system preference changes when mode === \"system\".\n const [systemDark, setSystemDark] = React.useState<boolean>(() =>\n isBrowser && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n );\n React.useEffect(() => {\n if (!isBrowser) return;\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener?.(\"change\", handler);\n return () => mql.removeEventListener?.(\"change\", handler);\n }, []);\n\n const resolvedMode: ResolvedThemeMode =\n config.mode === \"system\" ? (systemDark ? \"dark\" : \"light\") : (config.mode as ResolvedThemeMode);\n\n const { key: accentKey, palette: accentPalette } = React.useMemo(\n () => normalizeAccentInput(config.accent!, resolvedMode),\n [config.accent, resolvedMode]\n );\n\n const scopeRef = React.useRef<HTMLElement | null>(null);\n\n // Apply theme whenever config/resolvedMode changes.\n React.useEffect(() => {\n if (!isBrowser) return;\n const el = target === \"root\" ? document.documentElement : scopeRef.current;\n if (!el) return;\n applyTheme(el as HTMLElement, { ...config, mode: resolvedMode });\n persist(storageKey, config);\n }, [config, resolvedMode, target, storageKey]);\n\n const value: ThemeValue = React.useMemo(() => {\n const patch = (p: Partial<ThemeConfig>) => setConfig((c) => ({ ...c, ...p }));\n return {\n mode: config.mode!,\n resolvedMode,\n accent: accentKey,\n accentPalette,\n density: config.density!,\n intensity: config.intensity!,\n radius: config.radius!,\n font: config.font!,\n tokens: config.tokens ?? {},\n setMode: (m) => patch({ mode: m }),\n toggleMode: () =>\n setConfig((c) => ({\n ...c,\n mode: (c.mode === \"dark\" ? \"light\" : \"dark\") as ThemeMode,\n })),\n setAccent: (a) => patch({ accent: a }),\n setDensity: (d) => patch({ density: d }),\n setIntensity: (n) => patch({ intensity: n }),\n setRadius: (n) => patch({ radius: n }),\n setFont: (f) => patch({ font: f }),\n setTokens: (t) => patch({ tokens: t }),\n update: patch,\n reset: () => setConfig(initialConfig),\n };\n }, [config, resolvedMode, accentKey, accentPalette, initialConfig]);\n\n // onChange callback.\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n React.useEffect(() => {\n onChangeRef.current?.(value);\n }, [value]);\n\n if (target === \"scope\") {\n const Component = Tag as React.ElementType;\n return (\n <ThemeCtx.Provider value={value}>\n <Component\n ref={scopeRef as React.Ref<never>}\n className={className}\n style={style}\n >\n {children}\n </Component>\n </ThemeCtx.Provider>\n );\n }\n\n return <ThemeCtx.Provider value={value}>{children}</ThemeCtx.Provider>;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Theme/Theme.tsx"],"names":[],"mappings":"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","file":"chunk-W6I67HQQ.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport * as React from \"react\";\n\n/* ============================================================================\n * Theme — full custom theming system for lumina\n *\n * - <ThemeProvider> manages theme state and applies CSS variables / data-attrs\n * to either <html> (global) or a local scope.\n * - useTheme() exposes read/write access for descendants.\n * - Presets: accent palettes, font stacks, densities.\n * - Custom accent: pass a full palette or only a base color — missing slots\n * are auto-derived via `color-mix`.\n * - Persistence: optional localStorage via `storageKey` prop.\n * - \"system\" mode respects `prefers-color-scheme` via matchMedia.\n * - Arbitrary token overrides through the `tokens` prop.\n * ========================================================================== */\n\n/* ------------------------------- Types ---------------------------------- */\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\nexport type ResolvedThemeMode = \"light\" | \"dark\";\nexport type AccentKey = \"sky\" | \"coral\" | \"mint\" | \"violet\" | \"amber\" | \"rose\";\nexport type DensityMode = \"compact\" | \"comfortable\" | \"spacious\";\nexport type FontKey = \"system\" | \"sf\" | \"serif\" | \"mono\";\n\n/** Full accent color slots. All four CSS variables the library reads. */\nexport interface AccentPalette {\n /** Primary accent — `--accent`. */\n accent: string;\n /** Darker text-on-soft variant — `--accent-ink`. */\n ink: string;\n /** Pale tint for backgrounds — `--accent-soft`. */\n soft: string;\n /** Halo / glow color (typically with alpha) — `--accent-glow`. */\n glow: string;\n}\n\n/** Input type for custom accent: either full palette, or just a base color\n * (missing slots derived via color-mix in CSS). */\nexport type CustomAccentInput = string | Partial<AccentPalette> & { accent: string };\n\n/** Font config — either a preset key, a single sans string, or a granular object. */\nexport type FontConfig =\n | FontKey\n | string\n | { sans?: string; display?: string; mono?: string };\n\n/** Arbitrary CSS variable overrides. Keys may be either a short name\n * (e.g. `\"bg\"` → `--bg`) or a full var name (e.g. `\"--bg\"`). */\nexport type ThemeTokens = Record<string, string>;\n\nexport interface ThemeConfig {\n mode?: ThemeMode;\n accent?: AccentKey | CustomAccentInput;\n density?: DensityMode;\n /** Shadow strength, 1..10. Maps to `--d` (0.4..1.6). */\n intensity?: number;\n /** Base radius in px — generates the full `--r-*` scale. */\n radius?: number;\n font?: FontConfig;\n tokens?: ThemeTokens;\n}\n\nexport interface ThemeValue {\n /** Requested mode (\"system\" is preserved here). */\n mode: ThemeMode;\n /** Resolved concrete mode (\"system\" → \"light\" | \"dark\" based on OS). */\n resolvedMode: ResolvedThemeMode;\n /** Accent key or \"custom\" if a palette was supplied. */\n accent: AccentKey | \"custom\";\n /** Resolved palette currently in effect. */\n accentPalette: AccentPalette;\n density: DensityMode;\n intensity: number;\n radius: number;\n font: FontConfig;\n tokens: ThemeTokens;\n\n setMode: (m: ThemeMode) => void;\n toggleMode: () => void;\n setAccent: (a: AccentKey | CustomAccentInput) => void;\n setDensity: (d: DensityMode) => void;\n setIntensity: (n: number) => void;\n setRadius: (n: number) => void;\n setFont: (f: FontConfig) => void;\n setTokens: (t: ThemeTokens) => void;\n /** Shallow-merge a partial config. */\n update: (cfg: Partial<ThemeConfig>) => void;\n /** Reset to the initial props. */\n reset: () => void;\n}\n\n/* --------------------------- Built-in presets --------------------------- */\n\n/** Built-in accent palettes (light-mode values). */\nexport const ACCENT_PRESETS: Record<AccentKey, AccentPalette> = {\n sky: { accent: \"oklch(68% 0.14 235)\", ink: \"oklch(42% 0.12 235)\", soft: \"oklch(92% 0.04 235)\", glow: \"oklch(68% 0.14 235 / 0.35)\" },\n coral: { accent: \"oklch(72% 0.16 35)\", ink: \"oklch(48% 0.14 35)\", soft: \"oklch(94% 0.04 35)\", glow: \"oklch(72% 0.16 35 / 0.35)\" },\n mint: { accent: \"oklch(72% 0.13 165)\", ink: \"oklch(46% 0.11 165)\", soft: \"oklch(93% 0.04 165)\", glow: \"oklch(72% 0.13 165 / 0.35)\" },\n violet: { accent: \"oklch(66% 0.16 290)\", ink: \"oklch(44% 0.14 290)\", soft: \"oklch(93% 0.04 290)\", glow: \"oklch(66% 0.16 290 / 0.35)\" },\n amber: { accent: \"oklch(76% 0.14 75)\", ink: \"oklch(50% 0.12 75)\", soft: \"oklch(94% 0.05 75)\", glow: \"oklch(76% 0.14 75 / 0.35)\" },\n rose: { accent: \"oklch(68% 0.17 10)\", ink: \"oklch(46% 0.15 10)\", soft: \"oklch(93% 0.04 10)\", glow: \"oklch(68% 0.17 10 / 0.35)\" },\n};\n\n/** Dark-mode overrides — ink/soft shift, and glow alpha is halved so the outer\n * button bloom doesn't read as a bright ring on dark surfaces. */\nexport const ACCENT_PRESETS_DARK: Record<AccentKey, Pick<AccentPalette, \"ink\" | \"soft\" | \"glow\">> = {\n sky: { soft: \"oklch(35% 0.08 235)\", ink: \"oklch(82% 0.10 235)\", glow: \"oklch(68% 0.14 235 / 0.18)\" },\n coral: { soft: \"oklch(38% 0.09 35)\", ink: \"oklch(84% 0.10 35)\", glow: \"oklch(72% 0.16 35 / 0.18)\" },\n mint: { soft: \"oklch(36% 0.08 165)\", ink: \"oklch(83% 0.10 165)\", glow: \"oklch(72% 0.13 165 / 0.18)\" },\n violet: { soft: \"oklch(36% 0.09 290)\", ink: \"oklch(82% 0.11 290)\", glow: \"oklch(66% 0.16 290 / 0.18)\" },\n amber: { soft: \"oklch(38% 0.08 75)\", ink: \"oklch(85% 0.10 75)\", glow: \"oklch(76% 0.14 75 / 0.18)\" },\n rose: { soft: \"oklch(38% 0.09 10)\", ink: \"oklch(84% 0.11 10)\", glow: \"oklch(68% 0.17 10 / 0.18)\" },\n};\n\n/** Built-in font family stacks. */\nexport const FONT_STACKS: Record<FontKey, string> = {\n system: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n sf: '\"SF Pro Display\", -apple-system, BlinkMacSystemFont, \"PingFang SC\", sans-serif',\n serif: 'Cambria, Georgia, \"Songti SC\", \"STSong\", serif',\n mono: 'ui-monospace, \"SF Mono\", \"JetBrains Mono\", Consolas, monospace',\n};\n\nconst DEFAULT_CONFIG: Required<Omit<ThemeConfig, \"tokens\">> & { tokens: ThemeTokens } = {\n mode: \"light\",\n accent: \"sky\",\n density: \"comfortable\",\n intensity: 5,\n radius: 20,\n font: \"sf\",\n tokens: {},\n};\n\n/* ------------------------------ Helpers --------------------------------- */\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n/** Resolve \"system\" mode against `prefers-color-scheme`. */\nexport function resolveThemeMode(mode: ThemeMode): ResolvedThemeMode {\n if (mode !== \"system\") return mode;\n if (!isBrowser) return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/** Fill missing slots of a custom accent via color-mix. */\nexport function normalizeAccentInput(\n input: AccentKey | CustomAccentInput,\n resolvedMode: ResolvedThemeMode\n): { key: AccentKey | \"custom\"; palette: AccentPalette } {\n // Preset key?\n if (typeof input === \"string\" && input in ACCENT_PRESETS) {\n const key = input as AccentKey;\n const base = ACCENT_PRESETS[key];\n if (resolvedMode === \"dark\") {\n return { key, palette: { ...base, ...ACCENT_PRESETS_DARK[key] } };\n }\n return { key, palette: base };\n }\n // Custom — either a raw color string or a partial palette object.\n const raw = typeof input === \"string\" ? { accent: input } : input;\n const { accent } = raw;\n const ink = raw.ink ?? `color-mix(in oklch, ${accent} 65%, black)`;\n const soft =\n raw.soft ??\n (resolvedMode === \"dark\"\n ? `color-mix(in oklch, ${accent} 30%, black)`\n : `color-mix(in oklch, ${accent} 15%, white)`);\n // Dark-mode glow is halved so it doesn't wash into a white halo on dark surfaces.\n const glow =\n raw.glow ??\n (resolvedMode === \"dark\"\n ? `color-mix(in oklch, ${accent} 18%, transparent)`\n : `color-mix(in oklch, ${accent} 35%, transparent)`);\n return { key: \"custom\", palette: { accent, ink, soft, glow } };\n}\n\n/** Normalize a token key to a CSS custom property name. */\nfunction toVar(key: string): string {\n return key.startsWith(\"--\") ? key : `--${key}`;\n}\n\n/** Imperative theme application — writes CSS vars / data-attrs on a target. */\nexport function applyTheme(target: HTMLElement, config: ThemeConfig): void {\n const cfg: ThemeConfig = { ...DEFAULT_CONFIG, ...config };\n const resolvedMode = resolveThemeMode(cfg.mode!);\n const { key, palette } = normalizeAccentInput(cfg.accent!, resolvedMode);\n\n // data-* attributes\n target.dataset.theme = resolvedMode;\n target.dataset.density = cfg.density!;\n if (key === \"custom\") {\n delete target.dataset.accent;\n } else {\n target.dataset.accent = key;\n }\n\n // Accent palette — always set inline so custom overrides win and preset\n // stays deterministic across mode switches.\n target.style.setProperty(\"--accent\", palette.accent);\n target.style.setProperty(\"--accent-ink\", palette.ink);\n target.style.setProperty(\"--accent-soft\", palette.soft);\n target.style.setProperty(\"--accent-glow\", palette.glow);\n\n // Shadow intensity (1..10 → 0.4..1.6)\n const intensity = cfg.intensity ?? DEFAULT_CONFIG.intensity;\n target.style.setProperty(\"--d\", String(0.4 + intensity * 0.12));\n\n // Radius scale\n const r = cfg.radius ?? DEFAULT_CONFIG.radius;\n target.style.setProperty(\"--r-xs\", `${Math.max(4, r - 16)}px`);\n target.style.setProperty(\"--r-sm\", `${Math.max(6, r - 12)}px`);\n target.style.setProperty(\"--r-md\", `${Math.max(8, r - 6)}px`);\n target.style.setProperty(\"--r-lg\", `${r}px`);\n target.style.setProperty(\"--r-xl\", `${r + 10}px`);\n\n // Fonts\n const font = cfg.font ?? DEFAULT_CONFIG.font;\n if (typeof font === \"string\") {\n const stack = (FONT_STACKS as Record<string, string>)[font] ?? font;\n target.style.setProperty(\"--font-sans\", stack);\n if (font === \"mono\") target.style.setProperty(\"--font-display\", FONT_STACKS.mono);\n } else {\n if (font.sans) target.style.setProperty(\"--font-sans\", font.sans);\n if (font.display) target.style.setProperty(\"--font-display\", font.display);\n if (font.mono) target.style.setProperty(\"--font-mono\", font.mono);\n }\n\n // Arbitrary token overrides\n if (cfg.tokens) {\n for (const [k, v] of Object.entries(cfg.tokens)) {\n target.style.setProperty(toVar(k), v);\n }\n }\n}\n\n/* ----------------------------- Context ---------------------------------- */\n\nconst ThemeCtx = React.createContext<ThemeValue | null>(null);\n\n/** Read/write access to the nearest `<ThemeProvider>`. */\nexport function useTheme(): ThemeValue {\n const ctx = React.useContext(ThemeCtx);\n if (!ctx) {\n throw new Error(\n \"useTheme() must be used inside <ThemeProvider>. Wrap your app (or a subtree) with <ThemeProvider>.\"\n );\n }\n return ctx;\n}\n\n/** Read theme value without throwing — returns `null` outside of a provider. */\nexport function useThemeOptional(): ThemeValue | null {\n return React.useContext(ThemeCtx);\n}\n\n/* ---------------------------- Persistence ------------------------------- */\n\nfunction loadPersisted(key: string | undefined): Partial<ThemeConfig> | null {\n if (!key || !isBrowser) return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as Partial<ThemeConfig>;\n } catch {\n return null;\n }\n}\n\nfunction persist(key: string | undefined, cfg: ThemeConfig): void {\n if (!key || !isBrowser) return;\n try {\n localStorage.setItem(key, JSON.stringify(cfg));\n } catch {\n /* quota exceeded / disabled storage — ignore */\n }\n}\n\n/* --------------------------- ThemeProvider ------------------------------ */\n\nexport interface ThemeProviderProps extends ThemeConfig {\n children?: React.ReactNode;\n /**\n * Where to apply the theme.\n * - `\"root\"` (default): on `<html>` — affects the whole document.\n * - `\"scope\"`: on a local wrapper element — scoped to descendants.\n */\n target?: \"root\" | \"scope\";\n /** Tag for scope mode. Default `\"div\"`. */\n as?: keyof JSX.IntrinsicElements;\n className?: string;\n style?: React.CSSProperties;\n /** If set, theme state is persisted to localStorage under this key. */\n storageKey?: string;\n /** Called whenever the resolved theme value changes. */\n onChange?: (value: ThemeValue) => void;\n}\n\n/**\n * `<ThemeProvider>` — manage theme state and apply CSS variables.\n *\n * @example\n * ```tsx\n * <ThemeProvider mode=\"system\" accent=\"violet\" storageKey=\"app:theme\">\n * <App />\n * </ThemeProvider>\n * ```\n *\n * @example Custom accent\n * ```tsx\n * <ThemeProvider accent={{ accent: \"oklch(70% 0.2 180)\" }} />\n * // or just\n * <ThemeProvider accent=\"oklch(70% 0.2 180)\" />\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = (props) => {\n const {\n children,\n target = \"root\",\n as: Tag = \"div\",\n className,\n style,\n storageKey,\n onChange,\n ...configProps\n } = props;\n\n // Build the initial config: defaults ← props ← persisted (if any)\n const initialConfig = React.useMemo<ThemeConfig>(() => {\n const fromProps: ThemeConfig = {\n mode: configProps.mode ?? DEFAULT_CONFIG.mode,\n accent: configProps.accent ?? DEFAULT_CONFIG.accent,\n density: configProps.density ?? DEFAULT_CONFIG.density,\n intensity: configProps.intensity ?? DEFAULT_CONFIG.intensity,\n radius: configProps.radius ?? DEFAULT_CONFIG.radius,\n font: configProps.font ?? DEFAULT_CONFIG.font,\n tokens: configProps.tokens ?? {},\n };\n const persisted = loadPersisted(storageKey);\n return persisted ? { ...fromProps, ...persisted } : fromProps;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [config, setConfig] = React.useState<ThemeConfig>(initialConfig);\n\n // Sync external prop changes into state — so callers can drive the provider\n // \"controlled-style\" (e.g. <ThemeProvider accent={reactState} />).\n // `setMode`/`setAccent`/etc. still work; they just get overridden if the\n // parent later changes the prop.\n React.useEffect(() => {\n setConfig((c) => {\n const next: ThemeConfig = {\n mode: configProps.mode ?? c.mode,\n accent: configProps.accent ?? c.accent,\n density: configProps.density ?? c.density,\n intensity: configProps.intensity ?? c.intensity,\n radius: configProps.radius ?? c.radius,\n font: configProps.font ?? c.font,\n tokens: configProps.tokens ?? c.tokens,\n };\n if (\n next.mode === c.mode &&\n next.accent === c.accent &&\n next.density === c.density &&\n next.intensity === c.intensity &&\n next.radius === c.radius &&\n next.font === c.font &&\n next.tokens === c.tokens\n ) {\n return c;\n }\n return next;\n });\n }, [\n configProps.mode,\n configProps.accent,\n configProps.density,\n configProps.intensity,\n configProps.radius,\n configProps.font,\n configProps.tokens,\n ]);\n\n // Listen for system preference changes when mode === \"system\".\n const [systemDark, setSystemDark] = React.useState<boolean>(() =>\n isBrowser && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n );\n React.useEffect(() => {\n if (!isBrowser) return;\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener?.(\"change\", handler);\n return () => mql.removeEventListener?.(\"change\", handler);\n }, []);\n\n const resolvedMode: ResolvedThemeMode =\n config.mode === \"system\" ? (systemDark ? \"dark\" : \"light\") : (config.mode as ResolvedThemeMode);\n\n const { key: accentKey, palette: accentPalette } = React.useMemo(\n () => normalizeAccentInput(config.accent!, resolvedMode),\n [config.accent, resolvedMode]\n );\n\n const scopeRef = React.useRef<HTMLElement | null>(null);\n\n // Apply theme whenever config/resolvedMode changes.\n React.useEffect(() => {\n if (!isBrowser) return;\n const el = target === \"root\" ? document.documentElement : scopeRef.current;\n if (!el) return;\n applyTheme(el as HTMLElement, { ...config, mode: resolvedMode });\n persist(storageKey, config);\n }, [config, resolvedMode, target, storageKey]);\n\n const value: ThemeValue = React.useMemo(() => {\n const patch = (p: Partial<ThemeConfig>) => setConfig((c) => ({ ...c, ...p }));\n return {\n mode: config.mode!,\n resolvedMode,\n accent: accentKey,\n accentPalette,\n density: config.density!,\n intensity: config.intensity!,\n radius: config.radius!,\n font: config.font!,\n tokens: config.tokens ?? {},\n setMode: (m) => patch({ mode: m }),\n toggleMode: () =>\n setConfig((c) => ({\n ...c,\n mode: (c.mode === \"dark\" ? \"light\" : \"dark\") as ThemeMode,\n })),\n setAccent: (a) => patch({ accent: a }),\n setDensity: (d) => patch({ density: d }),\n setIntensity: (n) => patch({ intensity: n }),\n setRadius: (n) => patch({ radius: n }),\n setFont: (f) => patch({ font: f }),\n setTokens: (t) => patch({ tokens: t }),\n update: patch,\n reset: () => setConfig(initialConfig),\n };\n }, [config, resolvedMode, accentKey, accentPalette, initialConfig]);\n\n // onChange callback.\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n React.useEffect(() => {\n onChangeRef.current?.(value);\n }, [value]);\n\n if (target === \"scope\") {\n const Component = Tag as React.ElementType;\n return (\n <ThemeCtx.Provider value={value}>\n <Component\n ref={scopeRef as React.Ref<never>}\n className={className}\n style={style}\n >\n {children}\n </Component>\n </ThemeCtx.Provider>\n );\n }\n\n return <ThemeCtx.Provider value={value}>{children}</ThemeCtx.Provider>;\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Icon } from './chunk-GEYMWUW6.js';
|
|
2
|
-
import './tokens-
|
|
2
|
+
import './tokens-BIIUTPKN.css';
|
|
3
3
|
import './shared-NJHRNLRH.css';
|
|
4
4
|
import './Input-33CAH4O6.css';
|
|
5
5
|
import * as React from 'react';
|
|
@@ -183,5 +183,5 @@ var Textarea = React.forwardRef(
|
|
|
183
183
|
Textarea.displayName = "Textarea";
|
|
184
184
|
|
|
185
185
|
export { Input, Textarea };
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
186
|
+
//# sourceMappingURL=chunk-WBMF7WM3.js.map
|
|
187
|
+
//# sourceMappingURL=chunk-WBMF7WM3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Input/Input.tsx"],"names":[],"mappings":"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","file":"chunk-NSUD5B22.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Input.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"onChange\" | \"prefix\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n leadingIcon?: IconName;\n trailingIcon?: IconName;\n /** Click handler for the leading icon (stops propagation so the input isn't focused). */\n onLeadingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n /** Click handler for the trailing icon — e.g. password visibility toggle. */\n onTrailingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n invalid?: boolean;\n disabled?: boolean;\n /** Show a × button inside the input to clear the value when non-empty. */\n allowClear?: boolean;\n /** Max length — forwarded to the native input. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the input (or just \"N\" if no maxLength). */\n showCount?: boolean;\n /** Inline content rendered inside the input on the left (after leadingIcon if both present). */\n prefix?: React.ReactNode;\n /** Inline content rendered inside the input on the right (before trailingIcon if both present). */\n suffix?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `Input` — single-line text field with optional leading/trailing icons.\n */\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n placeholder,\n leadingIcon,\n trailingIcon,\n onLeadingIconClick,\n onTrailingIconClick,\n size = \"md\",\n invalid,\n disabled,\n allowClear,\n maxLength,\n showCount,\n prefix,\n suffix,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n\n const wrapCls = [\n \"input-wrap\",\n size !== \"md\" && size,\n invalid && \"invalid\",\n disabled && \"disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleIconClick = (\n handler: ((e: React.MouseEvent<SVGSVGElement>) => void) | undefined\n ) =>\n handler\n ? (e: React.MouseEvent<SVGSVGElement>) => {\n e.stopPropagation();\n if (!disabled) handler(e);\n }\n : undefined;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLInputElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLInputElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange?.(\"\", synthetic);\n };\n\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const inputElement = (\n <div className={wrapCls}>\n {leadingIcon && (\n <Icon\n name={leadingIcon}\n size={14}\n className={`lead${onLeadingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onLeadingIconClick)}\n />\n )}\n {prefix && <span className=\"input-affix prefix\">{prefix}</span>}\n <input\n ref={ref}\n className=\"input\"\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n placeholder={placeholder}\n disabled={disabled}\n maxLength={maxLength}\n {...rest}\n />\n {suffix && <span className=\"input-affix suffix\">{suffix}</span>}\n {showClear && (\n <span\n className=\"input-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n {trailingIcon && (\n <Icon\n name={trailingIcon}\n size={14}\n className={`trail${onTrailingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onTrailingIconClick)}\n />\n )}\n </div>\n );\n\n if (!showCount) return inputElement;\n\n return (\n <div className=\"input-shell\">\n {inputElement}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n invalid?: boolean;\n /** Show a × button in the top-right corner to clear the value. */\n allowClear?: boolean;\n /** Max length — forwarded to the native textarea. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the textarea. */\n showCount?: boolean;\n className?: string;\n}\n\n/**\n * `Textarea` — multi-line text input with the same neumorphic groove as `Input`.\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n invalid,\n allowClear,\n maxLength,\n showCount,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n const disabled = rest.disabled;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLTextAreaElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLTextAreaElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(\"\", synthetic);\n };\n\n const cls = [\"textarea\", invalid && \"invalid\", className].filter(Boolean).join(\" \");\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const field = (\n <div className=\"textarea-wrap\">\n <textarea\n ref={ref}\n className={cls}\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n maxLength={maxLength}\n {...rest}\n />\n {showClear && (\n <span\n className=\"textarea-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n </div>\n );\n\n if (!showCount) return field;\n\n return (\n <div className=\"input-shell\">\n {field}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nTextarea.displayName = \"Textarea\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Input/Input.tsx"],"names":[],"mappings":"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","file":"chunk-WBMF7WM3.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Input.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"onChange\" | \"prefix\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n leadingIcon?: IconName;\n trailingIcon?: IconName;\n /** Click handler for the leading icon (stops propagation so the input isn't focused). */\n onLeadingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n /** Click handler for the trailing icon — e.g. password visibility toggle. */\n onTrailingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n invalid?: boolean;\n disabled?: boolean;\n /** Show a × button inside the input to clear the value when non-empty. */\n allowClear?: boolean;\n /** Max length — forwarded to the native input. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the input (or just \"N\" if no maxLength). */\n showCount?: boolean;\n /** Inline content rendered inside the input on the left (after leadingIcon if both present). */\n prefix?: React.ReactNode;\n /** Inline content rendered inside the input on the right (before trailingIcon if both present). */\n suffix?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `Input` — single-line text field with optional leading/trailing icons.\n */\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n placeholder,\n leadingIcon,\n trailingIcon,\n onLeadingIconClick,\n onTrailingIconClick,\n size = \"md\",\n invalid,\n disabled,\n allowClear,\n maxLength,\n showCount,\n prefix,\n suffix,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n\n const wrapCls = [\n \"input-wrap\",\n size !== \"md\" && size,\n invalid && \"invalid\",\n disabled && \"disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleIconClick = (\n handler: ((e: React.MouseEvent<SVGSVGElement>) => void) | undefined\n ) =>\n handler\n ? (e: React.MouseEvent<SVGSVGElement>) => {\n e.stopPropagation();\n if (!disabled) handler(e);\n }\n : undefined;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLInputElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLInputElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange?.(\"\", synthetic);\n };\n\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const inputElement = (\n <div className={wrapCls}>\n {leadingIcon && (\n <Icon\n name={leadingIcon}\n size={14}\n className={`lead${onLeadingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onLeadingIconClick)}\n />\n )}\n {prefix && <span className=\"input-affix prefix\">{prefix}</span>}\n <input\n ref={ref}\n className=\"input\"\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n placeholder={placeholder}\n disabled={disabled}\n maxLength={maxLength}\n {...rest}\n />\n {suffix && <span className=\"input-affix suffix\">{suffix}</span>}\n {showClear && (\n <span\n className=\"input-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n {trailingIcon && (\n <Icon\n name={trailingIcon}\n size={14}\n className={`trail${onTrailingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onTrailingIconClick)}\n />\n )}\n </div>\n );\n\n if (!showCount) return inputElement;\n\n return (\n <div className=\"input-shell\">\n {inputElement}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n invalid?: boolean;\n /** Show a × button in the top-right corner to clear the value. */\n allowClear?: boolean;\n /** Max length — forwarded to the native textarea. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the textarea. */\n showCount?: boolean;\n className?: string;\n}\n\n/**\n * `Textarea` — multi-line text input with the same neumorphic groove as `Input`.\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n invalid,\n allowClear,\n maxLength,\n showCount,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n const disabled = rest.disabled;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLTextAreaElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLTextAreaElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(\"\", synthetic);\n };\n\n const cls = [\"textarea\", invalid && \"invalid\", className].filter(Boolean).join(\" \");\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const field = (\n <div className=\"textarea-wrap\">\n <textarea\n ref={ref}\n className={cls}\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n maxLength={maxLength}\n {...rest}\n />\n {showClear && (\n <span\n className=\"textarea-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n </div>\n );\n\n if (!showCount) return field;\n\n return (\n <div className=\"input-shell\">\n {field}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nTextarea.displayName = \"Textarea\";\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './tokens-
|
|
1
|
+
import './tokens-BIIUTPKN.css';
|
|
2
2
|
import './shared-NJHRNLRH.css';
|
|
3
3
|
import './List-W5BW4D2P.css';
|
|
4
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -14,5 +14,5 @@ var List = ({ items, dividers = true, className = "" }) => /* @__PURE__ */ jsx("
|
|
|
14
14
|
] }, it.key)) });
|
|
15
15
|
|
|
16
16
|
export { List };
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-WDBJVKSR.js.map
|
|
18
|
+
//# sourceMappingURL=chunk-WDBJVKSR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/List/List.tsx"],"names":[],"mappings":";;;;;;AAsBO,IAAM,OAA4B,CAAC,EAAE,OAAO,QAAA,GAAW,IAAA,EAAM,YAAY,EAAA,EAAG,qBACjF,GAAA,CAAC,IAAA,EAAA,EAAG,WAAW,CAAA,KAAA,EAAQ,QAAA,GAAW,kBAAkB,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,QAAQ,MAAA,EAAQ,CAAA,IACxG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,qBACV,IAAA,CAAC,QAAgB,SAAA,EAAW,CAAA,UAAA,EAAa,GAAG,OAAA,GAAU,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,GAAG,OAAA,EACnF,QAAA,EAAA;AAAA,EAAA,EAAA,CAAG,0BAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,aAAG,MAAA,EAAO,CAAA;AAAA,kBAC3D,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,EAAA,CAAG,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,aAAG,KAAA,EAAM,CAAA;AAAA,IACvD,GAAG,WAAA,oBAAe,GAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EAAkB,aAAG,WAAA,EAAY;AAAA,GAAA,EACrE,CAAA;AAAA,EACC,GAAG,OAAA,oBAAW,GAAA,CAAC,SAAI,SAAA,EAAU,mBAAA,EAAqB,aAAG,OAAA,EAAQ;AAAA,CAAA,EAAA,EANvD,EAAA,CAAG,GAOZ,CACD,CAAA,EACH","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/List/List.tsx"],"names":[],"mappings":";;;;;;AAsBO,IAAM,OAA4B,CAAC,EAAE,OAAO,QAAA,GAAW,IAAA,EAAM,YAAY,EAAA,EAAG,qBACjF,GAAA,CAAC,IAAA,EAAA,EAAG,WAAW,CAAA,KAAA,EAAQ,QAAA,GAAW,kBAAkB,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,QAAQ,MAAA,EAAQ,CAAA,IACxG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,qBACV,IAAA,CAAC,QAAgB,SAAA,EAAW,CAAA,UAAA,EAAa,GAAG,OAAA,GAAU,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,GAAG,OAAA,EACnF,QAAA,EAAA;AAAA,EAAA,EAAA,CAAG,0BAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,aAAG,MAAA,EAAO,CAAA;AAAA,kBAC3D,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,EAAA,CAAG,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,aAAG,KAAA,EAAM,CAAA;AAAA,IACvD,GAAG,WAAA,oBAAe,GAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EAAkB,aAAG,WAAA,EAAY;AAAA,GAAA,EACrE,CAAA;AAAA,EACC,GAAG,OAAA,oBAAW,GAAA,CAAC,SAAI,SAAA,EAAU,mBAAA,EAAqB,aAAG,OAAA,EAAQ;AAAA,CAAA,EAAA,EANvD,EAAA,CAAG,GAOZ,CACD,CAAA,EACH","file":"chunk-WDBJVKSR.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./List.css\";\nimport * as React from \"react\";\n\nexport interface ListItem {\n key: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n avatar?: React.ReactNode;\n actions?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface ListProps {\n items: ListItem[];\n /** Show dividers between items. */\n dividers?: boolean;\n className?: string;\n}\n\n/** `List` — vertical list of rows. */\nexport const List: React.FC<ListProps> = ({ items, dividers = true, className = \"\" }) => (\n <ul className={`list ${dividers ? \"with-dividers\" : \"\"} ${className}`} style={{ listStyle: \"none\", margin: 0 }}>\n {items.map((it) => (\n <li key={it.key} className={`list-item ${it.onClick ? \"clickable\" : \"\"}`} onClick={it.onClick}>\n {it.avatar && <div className=\"list-item-avatar\">{it.avatar}</div>}\n <div className=\"list-item-meta\">\n {it.title && <div className=\"list-item-title\">{it.title}</div>}\n {it.description && <div className=\"list-item-desc\">{it.description}</div>}\n </div>\n {it.actions && <div className=\"list-item-actions\">{it.actions}</div>}\n </li>\n ))}\n </ul>\n);\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Select } from './chunk-
|
|
1
|
+
import { Select } from './chunk-URLSZPS5.js';
|
|
2
2
|
import { Icon } from './chunk-GEYMWUW6.js';
|
|
3
|
-
import './tokens-
|
|
3
|
+
import './tokens-BIIUTPKN.css';
|
|
4
4
|
import './shared-NJHRNLRH.css';
|
|
5
5
|
import './Pagination-YIRYJUXP.css';
|
|
6
6
|
import * as React from 'react';
|
|
@@ -130,5 +130,5 @@ var Pagination = ({
|
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
export { Pagination };
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-WQFC5EMC.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-WQFC5EMC.js.map
|