@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.
Files changed (250) hide show
  1. package/dist/{Accordion-3TQPKNN3.css → Accordion-REMDCQUD.css} +0 -1
  2. package/dist/Accordion.cjs +2 -2
  3. package/dist/Accordion.js +1 -1
  4. package/dist/Alert.cjs +2 -2
  5. package/dist/Alert.js +1 -1
  6. package/dist/AppShell.cjs +5 -5
  7. package/dist/AppShell.js +1 -1
  8. package/dist/Avatar.cjs +2 -2
  9. package/dist/Avatar.js +1 -1
  10. package/dist/Button.cjs +3 -3
  11. package/dist/Button.js +1 -1
  12. package/dist/Calendar.cjs +2 -2
  13. package/dist/Calendar.js +1 -1
  14. package/dist/Card.cjs +3 -3
  15. package/dist/Card.js +1 -1
  16. package/dist/{Cascader-DTRTTXC2.css → Cascader-VSYEKQCG.css} +1 -1
  17. package/dist/Cascader.cjs +2 -2
  18. package/dist/Cascader.js +1 -1
  19. package/dist/Checkbox.cjs +3 -3
  20. package/dist/Checkbox.js +1 -1
  21. package/dist/{ColorPicker-GP7AQYUU.css → ColorPicker-SDDQGHCM.css} +1 -1
  22. package/dist/ColorPicker.cjs +2 -2
  23. package/dist/ColorPicker.js +1 -1
  24. package/dist/CommandPalette-T45DBMPY.css +139 -0
  25. package/dist/CommandPalette.cjs +14 -0
  26. package/dist/CommandPalette.cjs.map +1 -0
  27. package/dist/CommandPalette.d.cts +65 -0
  28. package/dist/CommandPalette.d.ts +65 -0
  29. package/dist/CommandPalette.js +5 -0
  30. package/dist/CommandPalette.js.map +1 -0
  31. package/dist/ContextMenu-FKW6CQW4.css +76 -0
  32. package/dist/ContextMenu.cjs +12 -0
  33. package/dist/ContextMenu.cjs.map +1 -0
  34. package/dist/ContextMenu.d.cts +50 -0
  35. package/dist/ContextMenu.d.ts +50 -0
  36. package/dist/ContextMenu.js +3 -0
  37. package/dist/ContextMenu.js.map +1 -0
  38. package/dist/Divider.cjs +2 -2
  39. package/dist/Divider.js +1 -1
  40. package/dist/Drawer.cjs +2 -2
  41. package/dist/Drawer.js +1 -1
  42. package/dist/Empty.cjs +4 -4
  43. package/dist/Empty.js +1 -1
  44. package/dist/{Image-WYWORJT4.css → Image-4MN34O6P.css} +1 -1
  45. package/dist/Image.cjs +3 -3
  46. package/dist/Image.js +1 -1
  47. package/dist/Input.cjs +3 -3
  48. package/dist/Input.js +1 -1
  49. package/dist/List.cjs +2 -2
  50. package/dist/List.js +1 -1
  51. package/dist/{Modal-N4YVLEWW.css → Modal-XSDMU4XJ.css} +1 -1
  52. package/dist/Modal.cjs +3 -3
  53. package/dist/Modal.js +2 -2
  54. package/dist/Pagination.cjs +4 -4
  55. package/dist/Pagination.js +3 -3
  56. package/dist/{Popover-MGCMOXYP.css → Popover-NYEKT5CQ.css} +1 -1
  57. package/dist/Popover.cjs +2 -2
  58. package/dist/Popover.js +1 -1
  59. package/dist/Progress.cjs +3 -3
  60. package/dist/Progress.js +1 -1
  61. package/dist/{Select-EDG37C37.css → Select-J3CCVFJ7.css} +1 -1
  62. package/dist/Select.cjs +3 -3
  63. package/dist/Select.js +2 -2
  64. package/dist/Slider.cjs +2 -2
  65. package/dist/Slider.js +1 -1
  66. package/dist/Splitter-DHNOY4NC.css +66 -0
  67. package/dist/Splitter.cjs +12 -0
  68. package/dist/Splitter.cjs.map +1 -0
  69. package/dist/Splitter.d.cts +44 -0
  70. package/dist/Splitter.d.ts +44 -0
  71. package/dist/Splitter.js +3 -0
  72. package/dist/Splitter.js.map +1 -0
  73. package/dist/StatusBar-CDS2GPSI.css +58 -0
  74. package/dist/StatusBar.cjs +16 -0
  75. package/dist/StatusBar.cjs.map +1 -0
  76. package/dist/StatusBar.d.cts +39 -0
  77. package/dist/StatusBar.d.ts +39 -0
  78. package/dist/StatusBar.js +3 -0
  79. package/dist/StatusBar.js.map +1 -0
  80. package/dist/Switch.cjs +2 -2
  81. package/dist/Switch.js +1 -1
  82. package/dist/{Table-YKVM42SW.css → Table-2LPTOUIR.css} +1 -1
  83. package/dist/Table.cjs +7 -7
  84. package/dist/Table.js +5 -5
  85. package/dist/Tabs.cjs +3 -3
  86. package/dist/Tabs.js +1 -1
  87. package/dist/Tag.cjs +3 -3
  88. package/dist/Tag.js +1 -1
  89. package/dist/Theme.cjs +10 -10
  90. package/dist/Theme.js +1 -1
  91. package/dist/{Toast-ERHDN3WG.css → Toast-6PVSAXQ5.css} +1 -1
  92. package/dist/Toast.cjs +3 -3
  93. package/dist/Toast.js +1 -1
  94. package/dist/Tooltip.cjs +2 -2
  95. package/dist/Tooltip.js +1 -1
  96. package/dist/Typography.cjs +6 -6
  97. package/dist/Typography.js +1 -1
  98. package/dist/{chunk-5WF6M47X.cjs → chunk-24FAK7QU.cjs} +3 -3
  99. package/dist/{chunk-5WF6M47X.cjs.map → chunk-24FAK7QU.cjs.map} +1 -1
  100. package/dist/{chunk-AJZKESHB.js → chunk-276NALYW.js} +3 -3
  101. package/dist/{chunk-AJZKESHB.js.map → chunk-276NALYW.js.map} +1 -1
  102. package/dist/{chunk-FI7QO3I5.cjs → chunk-33TIL25B.cjs} +3 -3
  103. package/dist/{chunk-FI7QO3I5.cjs.map → chunk-33TIL25B.cjs.map} +1 -1
  104. package/dist/{chunk-RDLPX7RK.cjs → chunk-3HNRKO3M.cjs} +31 -5
  105. package/dist/chunk-3HNRKO3M.cjs.map +1 -0
  106. package/dist/{chunk-GZGZR4FT.js → chunk-3LI6QH2Q.js} +3 -3
  107. package/dist/{chunk-GZGZR4FT.js.map → chunk-3LI6QH2Q.js.map} +1 -1
  108. package/dist/{chunk-NE4YEBFH.js → chunk-3UU2PUK4.js} +4 -4
  109. package/dist/{chunk-NE4YEBFH.js.map → chunk-3UU2PUK4.js.map} +1 -1
  110. package/dist/chunk-47Z4NIU4.js +118 -0
  111. package/dist/chunk-47Z4NIU4.js.map +1 -0
  112. package/dist/{chunk-4U4OY5RA.js → chunk-4SCDDSXY.js} +3 -3
  113. package/dist/{chunk-4U4OY5RA.js.map → chunk-4SCDDSXY.js.map} +1 -1
  114. package/dist/{chunk-NXOAYNG2.cjs → chunk-5BFETKVP.cjs} +3 -3
  115. package/dist/{chunk-NXOAYNG2.cjs.map → chunk-5BFETKVP.cjs.map} +1 -1
  116. package/dist/{chunk-VICGQC6G.cjs → chunk-5EAVXFFD.cjs} +3 -3
  117. package/dist/{chunk-VICGQC6G.cjs.map → chunk-5EAVXFFD.cjs.map} +1 -1
  118. package/dist/{chunk-OYGFMXAA.js → chunk-5N7347MI.js} +3 -3
  119. package/dist/{chunk-OYGFMXAA.js.map → chunk-5N7347MI.js.map} +1 -1
  120. package/dist/{chunk-VJN637MT.js → chunk-5PREWYTB.js} +3 -3
  121. package/dist/{chunk-VJN637MT.js.map → chunk-5PREWYTB.js.map} +1 -1
  122. package/dist/{chunk-77BVQNAQ.js → chunk-5UOBYRYJ.js} +3 -3
  123. package/dist/{chunk-77BVQNAQ.js.map → chunk-5UOBYRYJ.js.map} +1 -1
  124. package/dist/{chunk-BBPNQ44M.js → chunk-6GNFRP2H.js} +3 -3
  125. package/dist/{chunk-BBPNQ44M.js.map → chunk-6GNFRP2H.js.map} +1 -1
  126. package/dist/{chunk-TZSWDH5T.cjs → chunk-7JYI5THC.cjs} +3 -3
  127. package/dist/{chunk-TZSWDH5T.cjs.map → chunk-7JYI5THC.cjs.map} +1 -1
  128. package/dist/chunk-7T2SLRNL.cjs +140 -0
  129. package/dist/chunk-7T2SLRNL.cjs.map +1 -0
  130. package/dist/chunk-7YQWG7HR.cjs +45 -0
  131. package/dist/chunk-7YQWG7HR.cjs.map +1 -0
  132. package/dist/chunk-AGN3JSUH.cjs +209 -0
  133. package/dist/chunk-AGN3JSUH.cjs.map +1 -0
  134. package/dist/{chunk-CCBHZYE6.cjs → chunk-AR4M7QGF.cjs} +7 -7
  135. package/dist/{chunk-CCBHZYE6.cjs.map → chunk-AR4M7QGF.cjs.map} +1 -1
  136. package/dist/{chunk-K7PVJLW4.cjs → chunk-AWLBLRQX.cjs} +5 -5
  137. package/dist/{chunk-K7PVJLW4.cjs.map → chunk-AWLBLRQX.cjs.map} +1 -1
  138. package/dist/{chunk-PBBHUUXU.cjs → chunk-B5JH7NRZ.cjs} +3 -3
  139. package/dist/{chunk-PBBHUUXU.cjs.map → chunk-B5JH7NRZ.cjs.map} +1 -1
  140. package/dist/{chunk-Z5X5AMLA.cjs → chunk-CALRTZZ7.cjs} +3 -3
  141. package/dist/{chunk-Z5X5AMLA.cjs.map → chunk-CALRTZZ7.cjs.map} +1 -1
  142. package/dist/{chunk-H6FCIJOP.js → chunk-DBJIK4JE.js} +3 -3
  143. package/dist/{chunk-H6FCIJOP.js.map → chunk-DBJIK4JE.js.map} +1 -1
  144. package/dist/{chunk-QESLHLTG.cjs → chunk-EHO2JH2L.cjs} +4 -4
  145. package/dist/{chunk-QESLHLTG.cjs.map → chunk-EHO2JH2L.cjs.map} +1 -1
  146. package/dist/{chunk-WNGG25QX.js → chunk-FFZLSY2N.js} +3 -3
  147. package/dist/{chunk-WNGG25QX.js.map → chunk-FFZLSY2N.js.map} +1 -1
  148. package/dist/{chunk-AEJJGUEN.cjs → chunk-GOIQR4OH.cjs} +3 -3
  149. package/dist/{chunk-AEJJGUEN.cjs.map → chunk-GOIQR4OH.cjs.map} +1 -1
  150. package/dist/{chunk-Z7P6QGMT.js → chunk-GR5STMOA.js} +3 -3
  151. package/dist/{chunk-Z7P6QGMT.js.map → chunk-GR5STMOA.js.map} +1 -1
  152. package/dist/{chunk-URF6RBW6.cjs → chunk-HNVRMOL3.cjs} +3 -3
  153. package/dist/{chunk-URF6RBW6.cjs.map → chunk-HNVRMOL3.cjs.map} +1 -1
  154. package/dist/{chunk-RPD2OIIP.js → chunk-I2HHC6QW.js} +4 -4
  155. package/dist/{chunk-RPD2OIIP.js.map → chunk-I2HHC6QW.js.map} +1 -1
  156. package/dist/{chunk-AXMEZGEG.cjs → chunk-IZDJCEMF.cjs} +3 -3
  157. package/dist/{chunk-AXMEZGEG.cjs.map → chunk-IZDJCEMF.cjs.map} +1 -1
  158. package/dist/{chunk-V34OPWKZ.js → chunk-JSDQVVQB.js} +3 -3
  159. package/dist/{chunk-V34OPWKZ.js.map → chunk-JSDQVVQB.js.map} +1 -1
  160. package/dist/{chunk-QTGDYQOT.cjs → chunk-LLNEDEST.cjs} +4 -4
  161. package/dist/{chunk-QTGDYQOT.cjs.map → chunk-LLNEDEST.cjs.map} +1 -1
  162. package/dist/{chunk-C5TGQ7CV.cjs → chunk-MFWOBALK.cjs} +3 -3
  163. package/dist/{chunk-C5TGQ7CV.cjs.map → chunk-MFWOBALK.cjs.map} +1 -1
  164. package/dist/{chunk-LDENBYRC.cjs → chunk-MKR4X57L.cjs} +3 -3
  165. package/dist/{chunk-LDENBYRC.cjs.map → chunk-MKR4X57L.cjs.map} +1 -1
  166. package/dist/{chunk-LSLYY5FN.js → chunk-MTCLJHXU.js} +5 -5
  167. package/dist/{chunk-LSLYY5FN.js.map → chunk-MTCLJHXU.js.map} +1 -1
  168. package/dist/{chunk-JKLQOB2F.cjs → chunk-MUFMJPRT.cjs} +3 -3
  169. package/dist/{chunk-JKLQOB2F.cjs.map → chunk-MUFMJPRT.cjs.map} +1 -1
  170. package/dist/{chunk-OEHCA5IV.js → chunk-NGQDVJH3.js} +4 -4
  171. package/dist/{chunk-OEHCA5IV.js.map → chunk-NGQDVJH3.js.map} +1 -1
  172. package/dist/{chunk-7H453VPW.cjs → chunk-NQQWCIE6.cjs} +3 -3
  173. package/dist/{chunk-7H453VPW.cjs.map → chunk-NQQWCIE6.cjs.map} +1 -1
  174. package/dist/{chunk-ZWP4LSS3.js → chunk-NS3C2ZSE.js} +3 -3
  175. package/dist/{chunk-ZWP4LSS3.js.map → chunk-NS3C2ZSE.js.map} +1 -1
  176. package/dist/{chunk-HKAQILD2.cjs → chunk-O2HMH5BI.cjs} +4 -4
  177. package/dist/{chunk-HKAQILD2.cjs.map → chunk-O2HMH5BI.cjs.map} +1 -1
  178. package/dist/chunk-OWNVDXRQ.js +42 -0
  179. package/dist/chunk-OWNVDXRQ.js.map +1 -0
  180. package/dist/{chunk-3UFU63X7.cjs → chunk-OZVPJWXO.cjs} +3 -3
  181. package/dist/{chunk-3UFU63X7.cjs.map → chunk-OZVPJWXO.cjs.map} +1 -1
  182. package/dist/{chunk-M6CGYGEO.js → chunk-Q2EXOT4B.js} +3 -3
  183. package/dist/{chunk-M6CGYGEO.js.map → chunk-Q2EXOT4B.js.map} +1 -1
  184. package/dist/{chunk-7U6I44RV.cjs → chunk-Q7CDWNM6.cjs} +3 -3
  185. package/dist/{chunk-7U6I44RV.cjs.map → chunk-Q7CDWNM6.cjs.map} +1 -1
  186. package/dist/{chunk-437LB2V4.js → chunk-QJGKI2BD.js} +3 -3
  187. package/dist/{chunk-437LB2V4.js.map → chunk-QJGKI2BD.js.map} +1 -1
  188. package/dist/chunk-RFU5HN4E.js +149 -0
  189. package/dist/chunk-RFU5HN4E.js.map +1 -0
  190. package/dist/{chunk-IKI5CS4L.cjs → chunk-RIDCBNCM.cjs} +4 -4
  191. package/dist/{chunk-IKI5CS4L.cjs.map → chunk-RIDCBNCM.cjs.map} +1 -1
  192. package/dist/{chunk-OPTTHURA.cjs → chunk-RSZNFKCQ.cjs} +3 -3
  193. package/dist/{chunk-OPTTHURA.cjs.map → chunk-RSZNFKCQ.cjs.map} +1 -1
  194. package/dist/{chunk-EPFYIR63.cjs → chunk-RVSWH4RH.cjs} +7 -7
  195. package/dist/{chunk-EPFYIR63.cjs.map → chunk-RVSWH4RH.cjs.map} +1 -1
  196. package/dist/{chunk-TWBJCFEJ.cjs → chunk-SVVB6POY.cjs} +4 -4
  197. package/dist/{chunk-TWBJCFEJ.cjs.map → chunk-SVVB6POY.cjs.map} +1 -1
  198. package/dist/{chunk-QPZZNSRB.js → chunk-TMZVX6NO.js} +4 -4
  199. package/dist/{chunk-QPZZNSRB.js.map → chunk-TMZVX6NO.js.map} +1 -1
  200. package/dist/{chunk-YEOARJKR.cjs → chunk-TQLCIXCK.cjs} +3 -3
  201. package/dist/{chunk-YEOARJKR.cjs.map → chunk-TQLCIXCK.cjs.map} +1 -1
  202. package/dist/{chunk-GIVMKGZN.js → chunk-TY5EAKEI.js} +3 -3
  203. package/dist/{chunk-GIVMKGZN.js.map → chunk-TY5EAKEI.js.map} +1 -1
  204. package/dist/{chunk-4MR4GVTD.js → chunk-U4K7HOMW.js} +31 -5
  205. package/dist/chunk-U4K7HOMW.js.map +1 -0
  206. package/dist/{chunk-IWVKITPN.js → chunk-U5BZ7E3F.js} +3 -3
  207. package/dist/{chunk-IWVKITPN.js.map → chunk-U5BZ7E3F.js.map} +1 -1
  208. package/dist/{chunk-3WAFIUDQ.js → chunk-UQB5OHMO.js} +3 -3
  209. package/dist/{chunk-3WAFIUDQ.js.map → chunk-UQB5OHMO.js.map} +1 -1
  210. package/dist/{chunk-ZVCMXDTP.js → chunk-URLSZPS5.js} +5 -5
  211. package/dist/{chunk-ZVCMXDTP.js.map → chunk-URLSZPS5.js.map} +1 -1
  212. package/dist/{chunk-I7SSCSFH.js → chunk-W6I67HQQ.js} +3 -3
  213. package/dist/{chunk-I7SSCSFH.js.map → chunk-W6I67HQQ.js.map} +1 -1
  214. package/dist/{chunk-NSUD5B22.js → chunk-WBMF7WM3.js} +3 -3
  215. package/dist/{chunk-NSUD5B22.js.map → chunk-WBMF7WM3.js.map} +1 -1
  216. package/dist/{chunk-4GT5TOHP.js → chunk-WDBJVKSR.js} +3 -3
  217. package/dist/{chunk-4GT5TOHP.js.map → chunk-WDBJVKSR.js.map} +1 -1
  218. package/dist/{chunk-TYQ5CN2C.js → chunk-WQFC5EMC.js} +4 -4
  219. package/dist/{chunk-TYQ5CN2C.js.map → chunk-WQFC5EMC.js.map} +1 -1
  220. package/dist/{chunk-SBMOIE5C.cjs → chunk-WREHBIJ5.cjs} +10 -10
  221. package/dist/{chunk-SBMOIE5C.cjs.map → chunk-WREHBIJ5.cjs.map} +1 -1
  222. package/dist/chunk-WZ73TWB2.cjs +174 -0
  223. package/dist/chunk-WZ73TWB2.cjs.map +1 -0
  224. package/dist/chunk-XDFZRV3V.js +184 -0
  225. package/dist/chunk-XDFZRV3V.js.map +1 -0
  226. package/dist/{chunk-F7HW2PYR.cjs → chunk-XUT2Z2L6.cjs} +3 -3
  227. package/dist/{chunk-F7HW2PYR.cjs.map → chunk-XUT2Z2L6.cjs.map} +1 -1
  228. package/dist/{chunk-E6R63QOL.js → chunk-XZ22B3NW.js} +6 -6
  229. package/dist/{chunk-E6R63QOL.js.map → chunk-XZ22B3NW.js.map} +1 -1
  230. package/dist/{chunk-K5MHL732.js → chunk-YXKJOPYT.js} +4 -4
  231. package/dist/{chunk-K5MHL732.js.map → chunk-YXKJOPYT.js.map} +1 -1
  232. package/dist/{chunk-IDM6JJLP.cjs → chunk-YZ2I7CDF.cjs} +3 -3
  233. package/dist/{chunk-IDM6JJLP.cjs.map → chunk-YZ2I7CDF.cjs.map} +1 -1
  234. package/dist/index.cjs +142 -118
  235. package/dist/index.cjs.map +1 -1
  236. package/dist/index.d.cts +5 -1
  237. package/dist/index.d.ts +5 -1
  238. package/dist/index.js +35 -31
  239. package/dist/index.js.map +1 -1
  240. package/dist/styles.css +25 -18
  241. package/dist/{tokens-HWQ7KWPG.css → tokens-BIIUTPKN.css} +17 -9
  242. package/dist/tokens.css +17 -9
  243. package/docs/llms/commandpalette.md +58 -0
  244. package/docs/llms/contextmenu.md +55 -0
  245. package/docs/llms/splitter.md +63 -0
  246. package/docs/llms/statusbar.md +53 -0
  247. package/docs/llms.md +5 -1
  248. package/package.json +1 -1
  249. package/dist/chunk-4MR4GVTD.js.map +0 -1
  250. 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 (tweakable at runtime) */
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-out-lg);
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-out-lg), 0 24px 60px -20px rgba(40, 55, 80, 0.3);
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-out-lg);
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-out-lg);
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-out-lg);
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-out-lg), 0 40px 80px -20px rgba(0,0,0,0.25);
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-out-lg);
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-out);
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 (tweakable at runtime) */
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 (tweakable at runtime) */
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.2.1`
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fangxinyan/lumina",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Lumina — Neumorphic component library for Electron & React apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -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"]}