@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
package/dist/styles.css
CHANGED
|
@@ -17,14 +17,15 @@
|
|
|
17
17
|
/* ---- Shadows ---- */
|
|
18
18
|
--shadow-dark: rgba(163, 177, 198, 0.55);
|
|
19
19
|
--shadow-light: rgba(255, 255, 255, 0.95);
|
|
20
|
-
--shadow-blur: 16px;
|
|
21
|
-
--shadow-offset: 6px;
|
|
22
|
-
--shadow-inset-blur: 10px;
|
|
23
|
-
--shadow-inset-offset: 4px;
|
|
24
20
|
|
|
25
|
-
/* Distance multiplier (
|
|
21
|
+
/* Distance multiplier — driven by ThemeProvider `intensity` (1..10 → 0.4..1.6). */
|
|
26
22
|
--d: 1;
|
|
27
23
|
|
|
24
|
+
--shadow-blur: calc(16px * var(--d));
|
|
25
|
+
--shadow-offset: calc(6px * var(--d));
|
|
26
|
+
--shadow-inset-blur: calc(10px * var(--d));
|
|
27
|
+
--shadow-inset-offset: calc(4px * var(--d));
|
|
28
|
+
|
|
28
29
|
--neu-out:
|
|
29
30
|
var(--shadow-offset) var(--shadow-offset) var(--shadow-blur) var(--shadow-dark),
|
|
30
31
|
calc(var(--shadow-offset) * -1) calc(var(--shadow-offset) * -1) var(--shadow-blur) var(--shadow-light);
|
|
@@ -49,6 +50,13 @@
|
|
|
49
50
|
1px 1px 2px var(--shadow-dark),
|
|
50
51
|
-1px -1px 2px var(--shadow-light);
|
|
51
52
|
|
|
53
|
+
/* Floating-overlay elevation.
|
|
54
|
+
No top-left highlight — there's no continuous surface beneath an overlay
|
|
55
|
+
panel, so the neumorphic light-reflection metaphor would read as a halo. */
|
|
56
|
+
--neu-float:
|
|
57
|
+
0 calc(var(--shadow-offset) * 1.8) calc(var(--shadow-blur) * 2.2) var(--shadow-dark),
|
|
58
|
+
0 calc(var(--shadow-offset) * 0.4) calc(var(--shadow-blur) * 0.7) var(--shadow-dark);
|
|
59
|
+
|
|
52
60
|
/* ---- Accent (default sky) ---- */
|
|
53
61
|
--accent: oklch(68% 0.14 235);
|
|
54
62
|
--accent-ink: oklch(42% 0.12 235);
|
|
@@ -114,10 +122,10 @@
|
|
|
114
122
|
--shadow-dark: rgba(0, 0, 0, 0.55);
|
|
115
123
|
--shadow-light: rgba(130, 145, 180, 0.06);
|
|
116
124
|
/* 同时收紧阴影尺寸,深色模式下拟态更内敛 */
|
|
117
|
-
--shadow-offset: 4px;
|
|
118
|
-
--shadow-blur: 10px;
|
|
119
|
-
--shadow-inset-offset: 3px;
|
|
120
|
-
--shadow-inset-blur: 7px;
|
|
125
|
+
--shadow-offset: calc(4px * var(--d));
|
|
126
|
+
--shadow-blur: calc(10px * var(--d));
|
|
127
|
+
--shadow-inset-offset: calc(3px * var(--d));
|
|
128
|
+
--shadow-inset-blur: calc(7px * var(--d));
|
|
121
129
|
--accent-soft: oklch(35% 0.06 235);
|
|
122
130
|
--accent-ink: oklch(82% 0.09 235);
|
|
123
131
|
--accent-glow: oklch(68% 0.14 235 / 0.18);
|
|
@@ -1084,7 +1092,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1084
1092
|
color: var(--fg-muted);
|
|
1085
1093
|
font-size: 13px;
|
|
1086
1094
|
}
|
|
1087
|
-
.accordion-item.open .accordion-body { max-height: 320px; }
|
|
1088
1095
|
.accordion-body-inner { padding: 0 18px 16px; }
|
|
1089
1096
|
.accordion-chev {
|
|
1090
1097
|
transition: transform var(--dur) var(--ease), color var(--dur) var(--ease);
|
|
@@ -1311,7 +1318,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1311
1318
|
.menu {
|
|
1312
1319
|
background: var(--bg);
|
|
1313
1320
|
border-radius: var(--r-md);
|
|
1314
|
-
box-shadow: var(--neu-
|
|
1321
|
+
box-shadow: var(--neu-float);
|
|
1315
1322
|
padding: 6px;
|
|
1316
1323
|
min-width: 180px;
|
|
1317
1324
|
z-index: 1000;
|
|
@@ -1366,7 +1373,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1366
1373
|
.modal {
|
|
1367
1374
|
background: var(--bg);
|
|
1368
1375
|
border-radius: var(--r-xl);
|
|
1369
|
-
box-shadow: var(--neu-
|
|
1376
|
+
box-shadow: var(--neu-float);
|
|
1370
1377
|
padding: var(--gap-6);
|
|
1371
1378
|
width: min(480px, 92vw);
|
|
1372
1379
|
animation: modalIn var(--dur-slow) var(--ease);
|
|
@@ -1553,7 +1560,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1553
1560
|
.toast {
|
|
1554
1561
|
background: var(--bg);
|
|
1555
1562
|
border-radius: var(--r-md);
|
|
1556
|
-
box-shadow: var(--neu-
|
|
1563
|
+
box-shadow: var(--neu-float);
|
|
1557
1564
|
padding: 12px 16px;
|
|
1558
1565
|
min-width: 240px;
|
|
1559
1566
|
display: flex; align-items: flex-start; gap: 10px;
|
|
@@ -1588,7 +1595,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1588
1595
|
border-radius: var(--r-md);
|
|
1589
1596
|
padding: var(--gap-3);
|
|
1590
1597
|
min-width: 220px;
|
|
1591
|
-
box-shadow: var(--neu-
|
|
1598
|
+
box-shadow: var(--neu-float);
|
|
1592
1599
|
animation: menuIn var(--dur) var(--ease);
|
|
1593
1600
|
}
|
|
1594
1601
|
/* ============ Alert ============ */
|
|
@@ -1819,7 +1826,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
1819
1826
|
max-width: 260px;
|
|
1820
1827
|
background: var(--bg);
|
|
1821
1828
|
border-radius: var(--r-md);
|
|
1822
|
-
box-shadow: var(--neu-
|
|
1829
|
+
box-shadow: var(--neu-float);
|
|
1823
1830
|
padding: 10px;
|
|
1824
1831
|
animation: menuIn var(--dur) var(--ease);
|
|
1825
1832
|
}
|
|
@@ -2333,7 +2340,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
2333
2340
|
max-width: 80vw;
|
|
2334
2341
|
max-height: 80vh;
|
|
2335
2342
|
border-radius: var(--r-lg);
|
|
2336
|
-
box-shadow: var(--neu-
|
|
2343
|
+
box-shadow: var(--neu-float);
|
|
2337
2344
|
}
|
|
2338
2345
|
/* ============ Cascader ============ */
|
|
2339
2346
|
.cascader {
|
|
@@ -2366,7 +2373,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
2366
2373
|
display: flex;
|
|
2367
2374
|
background: var(--bg);
|
|
2368
2375
|
border-radius: var(--r-md);
|
|
2369
|
-
box-shadow: var(--neu-
|
|
2376
|
+
box-shadow: var(--neu-float);
|
|
2370
2377
|
padding: 6px;
|
|
2371
2378
|
animation: menuIn var(--dur) var(--ease);
|
|
2372
2379
|
gap: 4px;
|
|
@@ -2695,7 +2702,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
|
|
|
2695
2702
|
padding: 12px;
|
|
2696
2703
|
background: var(--bg);
|
|
2697
2704
|
border-radius: var(--r-md);
|
|
2698
|
-
box-shadow: var(--neu-
|
|
2705
|
+
box-shadow: var(--neu-float);
|
|
2699
2706
|
display: flex;
|
|
2700
2707
|
flex-direction: column;
|
|
2701
2708
|
gap: 10px;
|
|
@@ -17,14 +17,15 @@
|
|
|
17
17
|
/* ---- Shadows ---- */
|
|
18
18
|
--shadow-dark: rgba(163, 177, 198, 0.55);
|
|
19
19
|
--shadow-light: rgba(255, 255, 255, 0.95);
|
|
20
|
-
--shadow-blur: 16px;
|
|
21
|
-
--shadow-offset: 6px;
|
|
22
|
-
--shadow-inset-blur: 10px;
|
|
23
|
-
--shadow-inset-offset: 4px;
|
|
24
20
|
|
|
25
|
-
/* Distance multiplier (
|
|
21
|
+
/* Distance multiplier — driven by ThemeProvider `intensity` (1..10 → 0.4..1.6). */
|
|
26
22
|
--d: 1;
|
|
27
23
|
|
|
24
|
+
--shadow-blur: calc(16px * var(--d));
|
|
25
|
+
--shadow-offset: calc(6px * var(--d));
|
|
26
|
+
--shadow-inset-blur: calc(10px * var(--d));
|
|
27
|
+
--shadow-inset-offset: calc(4px * var(--d));
|
|
28
|
+
|
|
28
29
|
--neu-out:
|
|
29
30
|
var(--shadow-offset) var(--shadow-offset) var(--shadow-blur) var(--shadow-dark),
|
|
30
31
|
calc(var(--shadow-offset) * -1) calc(var(--shadow-offset) * -1) var(--shadow-blur) var(--shadow-light);
|
|
@@ -49,6 +50,13 @@
|
|
|
49
50
|
1px 1px 2px var(--shadow-dark),
|
|
50
51
|
-1px -1px 2px var(--shadow-light);
|
|
51
52
|
|
|
53
|
+
/* Floating-overlay elevation.
|
|
54
|
+
No top-left highlight — there's no continuous surface beneath an overlay
|
|
55
|
+
panel, so the neumorphic light-reflection metaphor would read as a halo. */
|
|
56
|
+
--neu-float:
|
|
57
|
+
0 calc(var(--shadow-offset) * 1.8) calc(var(--shadow-blur) * 2.2) var(--shadow-dark),
|
|
58
|
+
0 calc(var(--shadow-offset) * 0.4) calc(var(--shadow-blur) * 0.7) var(--shadow-dark);
|
|
59
|
+
|
|
52
60
|
/* ---- Accent (default sky) ---- */
|
|
53
61
|
--accent: oklch(68% 0.14 235);
|
|
54
62
|
--accent-ink: oklch(42% 0.12 235);
|
|
@@ -115,10 +123,10 @@
|
|
|
115
123
|
--shadow-dark: rgba(0, 0, 0, 0.55);
|
|
116
124
|
--shadow-light: rgba(130, 145, 180, 0.06);
|
|
117
125
|
/* 同时收紧阴影尺寸,深色模式下拟态更内敛 */
|
|
118
|
-
--shadow-offset: 4px;
|
|
119
|
-
--shadow-blur: 10px;
|
|
120
|
-
--shadow-inset-offset: 3px;
|
|
121
|
-
--shadow-inset-blur: 7px;
|
|
126
|
+
--shadow-offset: calc(4px * var(--d));
|
|
127
|
+
--shadow-blur: calc(10px * var(--d));
|
|
128
|
+
--shadow-inset-offset: calc(3px * var(--d));
|
|
129
|
+
--shadow-inset-blur: calc(7px * var(--d));
|
|
122
130
|
--accent-soft: oklch(35% 0.06 235);
|
|
123
131
|
--accent-ink: oklch(82% 0.09 235);
|
|
124
132
|
--accent-glow: oklch(68% 0.14 235 / 0.18);
|
package/dist/tokens.css
CHANGED
|
@@ -17,14 +17,15 @@
|
|
|
17
17
|
/* ---- Shadows ---- */
|
|
18
18
|
--shadow-dark: rgba(163, 177, 198, 0.55);
|
|
19
19
|
--shadow-light: rgba(255, 255, 255, 0.95);
|
|
20
|
-
--shadow-blur: 16px;
|
|
21
|
-
--shadow-offset: 6px;
|
|
22
|
-
--shadow-inset-blur: 10px;
|
|
23
|
-
--shadow-inset-offset: 4px;
|
|
24
20
|
|
|
25
|
-
/* Distance multiplier (
|
|
21
|
+
/* Distance multiplier — driven by ThemeProvider `intensity` (1..10 → 0.4..1.6). */
|
|
26
22
|
--d: 1;
|
|
27
23
|
|
|
24
|
+
--shadow-blur: calc(16px * var(--d));
|
|
25
|
+
--shadow-offset: calc(6px * var(--d));
|
|
26
|
+
--shadow-inset-blur: calc(10px * var(--d));
|
|
27
|
+
--shadow-inset-offset: calc(4px * var(--d));
|
|
28
|
+
|
|
28
29
|
--neu-out:
|
|
29
30
|
var(--shadow-offset) var(--shadow-offset) var(--shadow-blur) var(--shadow-dark),
|
|
30
31
|
calc(var(--shadow-offset) * -1) calc(var(--shadow-offset) * -1) var(--shadow-blur) var(--shadow-light);
|
|
@@ -49,6 +50,13 @@
|
|
|
49
50
|
1px 1px 2px var(--shadow-dark),
|
|
50
51
|
-1px -1px 2px var(--shadow-light);
|
|
51
52
|
|
|
53
|
+
/* Floating-overlay elevation.
|
|
54
|
+
No top-left highlight — there's no continuous surface beneath an overlay
|
|
55
|
+
panel, so the neumorphic light-reflection metaphor would read as a halo. */
|
|
56
|
+
--neu-float:
|
|
57
|
+
0 calc(var(--shadow-offset) * 1.8) calc(var(--shadow-blur) * 2.2) var(--shadow-dark),
|
|
58
|
+
0 calc(var(--shadow-offset) * 0.4) calc(var(--shadow-blur) * 0.7) var(--shadow-dark);
|
|
59
|
+
|
|
52
60
|
/* ---- Accent (default sky) ---- */
|
|
53
61
|
--accent: oklch(68% 0.14 235);
|
|
54
62
|
--accent-ink: oklch(42% 0.12 235);
|
|
@@ -115,10 +123,10 @@
|
|
|
115
123
|
--shadow-dark: rgba(0, 0, 0, 0.55);
|
|
116
124
|
--shadow-light: rgba(130, 145, 180, 0.06);
|
|
117
125
|
/* 同时收紧阴影尺寸,深色模式下拟态更内敛 */
|
|
118
|
-
--shadow-offset: 4px;
|
|
119
|
-
--shadow-blur: 10px;
|
|
120
|
-
--shadow-inset-offset: 3px;
|
|
121
|
-
--shadow-inset-blur: 7px;
|
|
126
|
+
--shadow-offset: calc(4px * var(--d));
|
|
127
|
+
--shadow-blur: calc(10px * var(--d));
|
|
128
|
+
--shadow-inset-offset: calc(3px * var(--d));
|
|
129
|
+
--shadow-inset-blur: calc(7px * var(--d));
|
|
122
130
|
--accent-soft: oklch(35% 0.06 235);
|
|
123
131
|
--accent-ink: oklch(82% 0.09 235);
|
|
124
132
|
--accent-glow: oklch(68% 0.14 235 / 0.18);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# CommandPalette ⌘K 命令面板
|
|
2
|
+
|
|
3
|
+
> 全局命令搜索与执行入口。
|
|
4
|
+
|
|
5
|
+
## 示例
|
|
6
|
+
|
|
7
|
+
### 基础 + 快捷键
|
|
8
|
+
|
|
9
|
+
在当前页面按 ⌘K / Ctrl+K 打开。分组、快捷键提示、键盘导航都已内置。
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
const [open, setOpen] = useState(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const h = (e: KeyboardEvent) => {
|
|
15
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "k") {
|
|
16
|
+
e.preventDefault();
|
|
17
|
+
setOpen(o => !o);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
window.addEventListener("keydown", h);
|
|
21
|
+
return () => window.removeEventListener("keydown", h);
|
|
22
|
+
}, []);
|
|
23
|
+
|
|
24
|
+
<CommandPalette open={open} onOpenChange={setOpen} items={[...]} />
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## API
|
|
28
|
+
|
|
29
|
+
**CommandPalette**
|
|
30
|
+
|
|
31
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
32
|
+
| --- | --- | --- | --- |
|
|
33
|
+
| open / onOpenChange \* | `boolean / (open: boolean) => void` | — | 受控开关 |
|
|
34
|
+
| items \* | `CommandItem[]` | — | 所有命令项 |
|
|
35
|
+
| placeholder | `string` | `"搜索命令…"` | 搜索框占位文本 |
|
|
36
|
+
| filter | `(item, query) => boolean` | `子序列匹配` | 自定义过滤函数 |
|
|
37
|
+
| emptyText | `ReactNode` | — | 无结果占位 |
|
|
38
|
+
| resetOnOpen | `boolean` | `true` | 打开时清空输入 |
|
|
39
|
+
| footer | `ReactNode` | — | 底部区;null 隐藏 |
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
**CommandItem**
|
|
43
|
+
|
|
44
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| key \* | `string` | — | 唯一键 |
|
|
47
|
+
| label \* | `string` | — | 主文案(也参与搜索) |
|
|
48
|
+
| description | `ReactNode` | — | 副标题 |
|
|
49
|
+
| icon | `ReactNode` | — | 前置图标 |
|
|
50
|
+
| shortcut | `ReactNode` | — | 右侧快捷键 |
|
|
51
|
+
| keywords | `string[]` | — | 额外搜索关键词 |
|
|
52
|
+
| group | `string` | — | 分组标题 |
|
|
53
|
+
| disabled | `boolean` | — | 禁用 |
|
|
54
|
+
| onSelect | `() => void` | — | 选中回调(会自动关闭面板) |
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
[← 回到索引](../llms.md)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# ContextMenu 右键菜单
|
|
2
|
+
|
|
3
|
+
> 桌面应用风格的右键上下文菜单。
|
|
4
|
+
|
|
5
|
+
## 示例
|
|
6
|
+
|
|
7
|
+
### 基础
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
<ContextMenu items={[
|
|
11
|
+
{ key: "copy", label: "复制", shortcut: "⌘C", onSelect: () => {} },
|
|
12
|
+
{ key: "cut", label: "剪切", shortcut: "⌘X", onSelect: () => {} },
|
|
13
|
+
{ key: "d", type: "divider" },
|
|
14
|
+
{ key: "del", label: "删除", danger: true, onSelect: () => {} },
|
|
15
|
+
]}>
|
|
16
|
+
<div>右键点击我</div>
|
|
17
|
+
</ContextMenu>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 文件管理器示例
|
|
21
|
+
|
|
22
|
+
典型的文件右键菜单,带图标、快捷键、分组分隔、危险操作高亮。
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
<ContextMenu items={[...]}>...
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
**ContextMenu**
|
|
31
|
+
|
|
32
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
33
|
+
| --- | --- | --- | --- |
|
|
34
|
+
| items \* | `ContextMenuItem[]` | — | 菜单项 |
|
|
35
|
+
| children \* | `ReactElement` | — | 触发元素(恰好一个) |
|
|
36
|
+
| disabled | `boolean` | — | 禁用,恢复浏览器原生菜单 |
|
|
37
|
+
| minWidth | `number` | `180` | 面板最小宽度 |
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
**ContextMenuItem**
|
|
41
|
+
|
|
42
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| key \* | `string` | — | 唯一键 |
|
|
45
|
+
| label | `ReactNode` | — | 文案 |
|
|
46
|
+
| icon | `ReactNode` | — | 前置图标 |
|
|
47
|
+
| shortcut | `ReactNode` | — | 右侧快捷键提示 |
|
|
48
|
+
| disabled | `boolean` | — | 禁用 |
|
|
49
|
+
| danger | `boolean` | — | 危险态(红色) |
|
|
50
|
+
| type | `"divider"` | — | 置为 "divider" 渲染分隔线 |
|
|
51
|
+
| onSelect | `() => void` | — | 选中回调 |
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
[← 回到索引](../llms.md)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Splitter 可拖拽分栏
|
|
2
|
+
|
|
3
|
+
> 两栏之间可拖拽的分隔条,支持横向、纵向与嵌套。
|
|
4
|
+
|
|
5
|
+
## 示例
|
|
6
|
+
|
|
7
|
+
### 水平分栏
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
<Splitter defaultSize={200} min={120} max={360}>
|
|
11
|
+
<SidePanel />
|
|
12
|
+
<MainPanel />
|
|
13
|
+
</Splitter>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 垂直分栏
|
|
17
|
+
|
|
18
|
+
direction="vertical" 让面板上下排列,分隔条变成横条。
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
<Splitter direction="vertical" defaultSize={120} min={60}>...</Splitter>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 嵌套分栏
|
|
25
|
+
|
|
26
|
+
组合使用两个 Splitter 可以搭出 IDE 风格的三区布局。
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<Splitter defaultSize={180}>
|
|
30
|
+
<SideNav />
|
|
31
|
+
<Splitter direction="vertical" defaultSize={180}>
|
|
32
|
+
<Editor />
|
|
33
|
+
<Terminal />
|
|
34
|
+
</Splitter>
|
|
35
|
+
</Splitter>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 受控模式
|
|
39
|
+
|
|
40
|
+
通过 size / onResize 可以持久化宽度或与其他状态联动。
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
const [w, setW] = useState(220);
|
|
44
|
+
<Splitter size={w} onResize={setW}>...</Splitter>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
**Splitter**
|
|
50
|
+
|
|
51
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| direction | `"horizontal" | "vertical"` | `"horizontal"` | 布局方向 |
|
|
54
|
+
| defaultSize | `number` | `240` | 非受控初始宽/高 (px) |
|
|
55
|
+
| size / onResize | `number / (n: number) => void` | — | 受控宽/高 |
|
|
56
|
+
| onResizeEnd | `(n: number) => void` | — | 拖动结束回调 |
|
|
57
|
+
| min / max | `number` | `80 / Infinity` | 尺寸限制 (px) |
|
|
58
|
+
| step | `number` | `16` | 方向键步长 (px) |
|
|
59
|
+
| children \* | `[ReactNode, ReactNode]` | — | 必须恰好两个子节点 |
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
[← 回到索引](../llms.md)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# StatusBar 状态栏
|
|
2
|
+
|
|
3
|
+
> 窗口底部状态栏,展示分支、编码、行列等应用元信息。
|
|
4
|
+
|
|
5
|
+
## 示例
|
|
6
|
+
|
|
7
|
+
### 基础
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
<StatusBar
|
|
11
|
+
left={<StatusBar.Item icon={<Icon name="check" size={12} />} tone="success">Ready</StatusBar.Item>}
|
|
12
|
+
right={<StatusBar.Item tone="muted">UTF-8</StatusBar.Item>}
|
|
13
|
+
/>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 可点击项
|
|
17
|
+
|
|
18
|
+
为 Item 提供 onClick 会渲染成按钮,支持悬停高亮。
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
<StatusBar.Item onClick={...}>TypeScript</StatusBar.Item>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 语义色
|
|
25
|
+
|
|
26
|
+
tone 控制文字颜色:default / muted / accent / success / warning / danger。
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<StatusBar.Item tone="danger">3 errors</StatusBar.Item>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
**StatusBar**
|
|
35
|
+
|
|
36
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
| left | `ReactNode` | — | 左侧槽位 |
|
|
39
|
+
| center | `ReactNode` | — | 中部槽位(绝对居中) |
|
|
40
|
+
| right | `ReactNode` | — | 右侧槽位 |
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
**StatusBar.Item**
|
|
44
|
+
|
|
45
|
+
| Prop | 类型 | 默认 | 说明 |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| icon | `ReactNode` | — | 前置图标 |
|
|
48
|
+
| tone | `"default" | "muted" | "accent" | "success" | "warning" | "danger"` | `"default"` | 语义色 |
|
|
49
|
+
| onClick | `(e) => void` | — | 点击回调(提供时渲染为 button) |
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
[← 回到索引](../llms.md)
|
package/docs/llms.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> 拟态风格的 React 18 组件库,目标是 Electron 桌面应用。**写给 AI 编程助手**的按需文档 —— 每个组件单独一个 `.md`,避免一次性读取全部。示例源自 playground 的 demo,可直接复制运行。
|
|
4
4
|
|
|
5
5
|
- **包名**: `@fangxinyan/lumina`
|
|
6
|
-
- **版本**: `0.
|
|
6
|
+
- **版本**: `0.3.0`
|
|
7
7
|
- **React 最低版本**: 18
|
|
8
8
|
- **环境**: 带打包器的 React 工程(Vite / Next.js / Webpack / Remix / Electron + Vite 等)
|
|
9
9
|
- **零运行时依赖**: 只依赖 `react` / `react-dom` (peer deps)
|
|
@@ -94,4 +94,8 @@
|
|
|
94
94
|
- [TitleBar 标题栏](./llms/titlebar.md) — Electron 应用窗口顶部的跨平台标题栏。
|
|
95
95
|
- [WindowControls 窗口控件](./llms/windowcontrols.md) — 独立的窗口控件按钮组。
|
|
96
96
|
- [Sidebar 侧边栏](./llms/sidebar.md) — 应用主导航,沿屏幕左侧垂直排列。
|
|
97
|
+
- [StatusBar 状态栏](./llms/statusbar.md) — 窗口底部状态栏,展示分支、编码、行列等应用元信息。
|
|
98
|
+
- [Splitter 可拖拽分栏](./llms/splitter.md) — 两栏之间可拖拽的分隔条,支持横向、纵向与嵌套。
|
|
99
|
+
- [ContextMenu 右键菜单](./llms/contextmenu.md) — 桌面应用风格的右键上下文菜单。
|
|
100
|
+
- [CommandPalette ⌘K 命令面板](./llms/commandpalette.md) — 全局命令搜索与执行入口。
|
|
97
101
|
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":[],"mappings":"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","file":"chunk-4MR4GVTD.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Accordion.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface AccordionItem {\n key: string;\n title: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** If true, multiple sections can be open at once. */\n multiple?: boolean;\n /**\n * Accordion mode — at most one item open at a time. Takes precedence over `multiple`\n * when both are set.\n */\n accordion?: boolean;\n /**\n * What triggers expansion.\n * - `\"header\"` (default): clicking anywhere on the header toggles.\n * - `\"icon\"`: only the chevron icon is clickable.\n * - `\"disabled\"`: the panel cannot be toggled.\n */\n collapsible?: \"header\" | \"icon\" | \"disabled\";\n activeKeys?: string[];\n defaultActiveKeys?: string[];\n onChange?: (keys: string[]) => void;\n className?: string;\n}\n\n/** `Accordion` — collapsible sections. */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n multiple = false,\n accordion = false,\n collapsible = \"header\",\n activeKeys,\n defaultActiveKeys = [],\n onChange,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultActiveKeys);\n const isControlled = activeKeys !== undefined;\n const keys = isControlled ? activeKeys! : inner;\n\n // accordion takes precedence over multiple\n const singleOpen = accordion || !multiple;\n\n const toggle = (k: string, itemDisabled?: boolean) => {\n if (collapsible === \"disabled\" || itemDisabled) return;\n const next = keys.includes(k)\n ? keys.filter((x) => x !== k)\n : singleOpen\n ? [k]\n : [...keys, k];\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n return (\n <div className={`accordion ${className}`}>\n {items.map((it) => {\n const open = keys.includes(it.key);\n const isDisabled = it.disabled || collapsible === \"disabled\";\n const headerClickable = collapsible === \"header\" && !isDisabled;\n return (\n <div\n key={it.key}\n className={`accordion-item ${open ? \"open\" : \"\"} ${isDisabled ? \"disabled\" : \"\"} ${collapsible === \"icon\" ? \"icon-only\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"accordion-head\"\n disabled={isDisabled}\n onClick={() => headerClickable && toggle(it.key, it.disabled)}\n aria-expanded={open}\n >\n <span>{it.title}</span>\n <span\n className={`accordion-chev${collapsible === \"icon\" ? \" clickable\" : \"\"}`}\n onClick={(e) => {\n if (collapsible === \"icon\" && !isDisabled) {\n e.stopPropagation();\n toggle(it.key, it.disabled);\n }\n }}\n >\n <Icon name=\"chevDown\" size={16} />\n </span>\n </button>\n <div className=\"accordion-body\">\n <div className=\"accordion-body-inner\">{it.content}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["React","jsx","jsxs","Icon"],"mappings":"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","file":"chunk-RDLPX7RK.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Accordion.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface AccordionItem {\n key: string;\n title: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** If true, multiple sections can be open at once. */\n multiple?: boolean;\n /**\n * Accordion mode — at most one item open at a time. Takes precedence over `multiple`\n * when both are set.\n */\n accordion?: boolean;\n /**\n * What triggers expansion.\n * - `\"header\"` (default): clicking anywhere on the header toggles.\n * - `\"icon\"`: only the chevron icon is clickable.\n * - `\"disabled\"`: the panel cannot be toggled.\n */\n collapsible?: \"header\" | \"icon\" | \"disabled\";\n activeKeys?: string[];\n defaultActiveKeys?: string[];\n onChange?: (keys: string[]) => void;\n className?: string;\n}\n\n/** `Accordion` — collapsible sections. */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n multiple = false,\n accordion = false,\n collapsible = \"header\",\n activeKeys,\n defaultActiveKeys = [],\n onChange,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultActiveKeys);\n const isControlled = activeKeys !== undefined;\n const keys = isControlled ? activeKeys! : inner;\n\n // accordion takes precedence over multiple\n const singleOpen = accordion || !multiple;\n\n const toggle = (k: string, itemDisabled?: boolean) => {\n if (collapsible === \"disabled\" || itemDisabled) return;\n const next = keys.includes(k)\n ? keys.filter((x) => x !== k)\n : singleOpen\n ? [k]\n : [...keys, k];\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n return (\n <div className={`accordion ${className}`}>\n {items.map((it) => {\n const open = keys.includes(it.key);\n const isDisabled = it.disabled || collapsible === \"disabled\";\n const headerClickable = collapsible === \"header\" && !isDisabled;\n return (\n <div\n key={it.key}\n className={`accordion-item ${open ? \"open\" : \"\"} ${isDisabled ? \"disabled\" : \"\"} ${collapsible === \"icon\" ? \"icon-only\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"accordion-head\"\n disabled={isDisabled}\n onClick={() => headerClickable && toggle(it.key, it.disabled)}\n aria-expanded={open}\n >\n <span>{it.title}</span>\n <span\n className={`accordion-chev${collapsible === \"icon\" ? \" clickable\" : \"\"}`}\n onClick={(e) => {\n if (collapsible === \"icon\" && !isDisabled) {\n e.stopPropagation();\n toggle(it.key, it.disabled);\n }\n }}\n >\n <Icon name=\"chevDown\" size={16} />\n </span>\n </button>\n <div className=\"accordion-body\">\n <div className=\"accordion-body-inner\">{it.content}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n"]}
|