@fangxinyan/lumina 0.6.3 → 0.6.5

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 (255) hide show
  1. package/dist/{Alert-QBKIDY5H.css → Alert-HVPI6L4V.css} +2 -2
  2. package/dist/Alert.cjs +3 -3
  3. package/dist/Alert.js +2 -2
  4. package/dist/{AppShell-RCALXUCZ.css → AppShell-FZCD4C56.css} +4 -4
  5. package/dist/AppShell.cjs +5 -5
  6. package/dist/AppShell.js +1 -1
  7. package/dist/{AutoComplete-P5KZMZO5.css → AutoComplete-4YZBMW4E.css} +2 -2
  8. package/dist/AutoComplete.cjs +5 -5
  9. package/dist/AutoComplete.js +4 -4
  10. package/dist/{Avatar-R5A4AFKZ.css → Avatar-TNPOHVY5.css} +1 -1
  11. package/dist/Avatar.cjs +2 -2
  12. package/dist/Avatar.js +1 -1
  13. package/dist/Badge.cjs +2 -2
  14. package/dist/Badge.js +1 -1
  15. package/dist/{Button-4Z3Q6KII.css → Button-TUMZUQLI.css} +11 -11
  16. package/dist/Button.cjs +3 -3
  17. package/dist/Button.js +2 -2
  18. package/dist/{Calendar-LHZELUDL.css → Calendar-RUTPKREW.css} +4 -4
  19. package/dist/Calendar.cjs +3 -3
  20. package/dist/Calendar.js +2 -2
  21. package/dist/{Card-6RMVIHWX.css → Card-MA6SV7D5.css} +6 -6
  22. package/dist/Card.cjs +2 -2
  23. package/dist/Card.js +1 -1
  24. package/dist/{Cascader-3BLLA7EN.css → Cascader-ANEQUPMI.css} +8 -8
  25. package/dist/Cascader.cjs +5 -5
  26. package/dist/Cascader.js +4 -4
  27. package/dist/{Checkbox-U5EUDSYS.css → Checkbox-EDNPZRIP.css} +3 -3
  28. package/dist/Checkbox.cjs +3 -3
  29. package/dist/Checkbox.js +2 -2
  30. package/dist/{Collapse-66U5YJFY.css → Collapse-UNBHEPYP.css} +2 -2
  31. package/dist/Collapse.cjs +3 -3
  32. package/dist/Collapse.js +2 -2
  33. package/dist/{ColorPicker-SDDQGHCM.css → ColorPicker-LPG6QPYF.css} +7 -7
  34. package/dist/ColorPicker.cjs +2 -2
  35. package/dist/ColorPicker.js +1 -1
  36. package/dist/{CommandPalette-T45DBMPY.css → CommandPalette-RTKWNH2D.css} +3 -3
  37. package/dist/CommandPalette.cjs +5 -5
  38. package/dist/CommandPalette.js +4 -4
  39. package/dist/{ContextMenu-FKW6CQW4.css → ContextMenu-WRR2SSWL.css} +3 -3
  40. package/dist/ContextMenu.cjs +2 -2
  41. package/dist/ContextMenu.js +1 -1
  42. package/dist/{Divider-OEE4Q2KS.css → Divider-RPQCVH3J.css} +2 -2
  43. package/dist/Divider.cjs +2 -2
  44. package/dist/Divider.js +1 -1
  45. package/dist/{Drawer-IPGB4CXH.css → Drawer-7N3URAJ6.css} +8 -5
  46. package/dist/Drawer.cjs +3 -3
  47. package/dist/Drawer.js +2 -2
  48. package/dist/{Empty-DC2LPORC.css → Empty-CZTRZMZQ.css} +1 -1
  49. package/dist/Empty.cjs +2 -2
  50. package/dist/Empty.js +1 -1
  51. package/dist/{Form-5GRVZNDO.css → Form-NGCQWTMZ.css} +1 -1
  52. package/dist/Form.cjs +4 -4
  53. package/dist/Form.js +1 -1
  54. package/dist/Icon.cjs +49 -49
  55. package/dist/Icon.js +1 -1
  56. package/dist/{Image-MRYQCRQ5.css → Image-SGSRTHQX.css} +5 -5
  57. package/dist/Image.cjs +6 -6
  58. package/dist/Image.js +2 -2
  59. package/dist/{Input-HUBJ55OH.css → Input-7GDPGP3E.css} +12 -12
  60. package/dist/Input.cjs +5 -5
  61. package/dist/Input.js +3 -3
  62. package/dist/InputNumber.cjs +5 -5
  63. package/dist/InputNumber.js +4 -4
  64. package/dist/{List-W5BW4D2P.css → List-LSMU5QAC.css} +3 -3
  65. package/dist/List.cjs +2 -2
  66. package/dist/List.js +1 -1
  67. package/dist/{Message-2MZ3LFPU.css → Message-H222YGR6.css} +1 -1
  68. package/dist/Message.cjs +6 -6
  69. package/dist/Message.js +2 -2
  70. package/dist/{Modal-2QNDW4SO.css → Modal-MCFDYVUQ.css} +3 -3
  71. package/dist/Modal.cjs +4 -4
  72. package/dist/Modal.js +3 -3
  73. package/dist/{Pagination-YIRYJUXP.css → Pagination-YSZSNFHG.css} +5 -5
  74. package/dist/Pagination.cjs +7 -7
  75. package/dist/Pagination.js +6 -6
  76. package/dist/{Popover-DVGQGWX6.css → Popover-Y3LDCJPW.css} +1 -1
  77. package/dist/Popover.cjs +2 -2
  78. package/dist/Popover.js +1 -1
  79. package/dist/{Progress-CHV7DN6Y.css → Progress-CZNXCYGW.css} +1 -1
  80. package/dist/Progress.cjs +2 -2
  81. package/dist/Progress.js +1 -1
  82. package/dist/{Radio-GVFDPAZM.css → Radio-IQKASYDF.css} +4 -4
  83. package/dist/Radio.cjs +3 -3
  84. package/dist/Radio.js +1 -1
  85. package/dist/{Select-Z5VYPEEY.css → Select-YZ2NUJSX.css} +18 -18
  86. package/dist/Select.cjs +6 -6
  87. package/dist/Select.js +5 -5
  88. package/dist/Skeleton.cjs +2 -2
  89. package/dist/Skeleton.js +1 -1
  90. package/dist/{Slider-3JKA5EW6.css → Slider-UM2IZZBH.css} +7 -7
  91. package/dist/Slider.cjs +2 -2
  92. package/dist/Slider.js +1 -1
  93. package/dist/{Spin-3GJNMSIH.css → Spin-GONGPV4Q.css} +1 -1
  94. package/dist/Spin.cjs +2 -2
  95. package/dist/Spin.js +1 -1
  96. package/dist/Splitter.cjs +2 -2
  97. package/dist/Splitter.js +1 -1
  98. package/dist/{StatusBar-CDS2GPSI.css → StatusBar-FJKEEPXU.css} +3 -7
  99. package/dist/StatusBar.cjs +3 -3
  100. package/dist/StatusBar.js +1 -1
  101. package/dist/Surface-UDDN3DGL.css +42 -0
  102. package/dist/Surface.cjs +16 -0
  103. package/dist/Surface.d.cts +60 -0
  104. package/dist/Surface.d.ts +60 -0
  105. package/dist/Surface.js +3 -0
  106. package/dist/{Switch-36KJNDXM.css → Switch-COAQIOMH.css} +8 -5
  107. package/dist/Switch.cjs +2 -2
  108. package/dist/Switch.js +1 -1
  109. package/dist/{Table-ATJJQLKU.css → Table-IYJTPY6J.css} +16 -16
  110. package/dist/Table.cjs +9 -9
  111. package/dist/Table.js +8 -8
  112. package/dist/{TablePro-3XVHYLSL.css → TablePro-JRSBPXB5.css} +1 -1
  113. package/dist/TablePro.cjs +10 -10
  114. package/dist/TablePro.js +9 -9
  115. package/dist/{Tabs-BLSNI2T5.css → Tabs-X5U5PCPV.css} +2 -2
  116. package/dist/Tabs.cjs +2 -2
  117. package/dist/Tabs.js +1 -1
  118. package/dist/{Tag-HDYCDPFS.css → Tag-G2XWAL7A.css} +1 -1
  119. package/dist/Tag.cjs +3 -3
  120. package/dist/Tag.js +2 -2
  121. package/dist/{Textarea-YNET7IBH.css → Textarea-YHWKHIFE.css} +3 -3
  122. package/dist/Textarea.cjs +4 -4
  123. package/dist/Textarea.js +2 -2
  124. package/dist/Theme.cjs +11 -11
  125. package/dist/Theme.d.cts +5 -1
  126. package/dist/Theme.d.ts +5 -1
  127. package/dist/Theme.js +1 -1
  128. package/dist/ThemePanel-76LB3YA5.css +509 -0
  129. package/dist/ThemePanel.cjs +29 -0
  130. package/dist/ThemePanel.d.cts +80 -0
  131. package/dist/ThemePanel.d.ts +80 -0
  132. package/dist/ThemePanel.js +12 -0
  133. package/dist/{Timeline-3ZHOHPXT.css → Timeline-ZIM7QFQC.css} +1 -1
  134. package/dist/Timeline.cjs +3 -3
  135. package/dist/Timeline.js +2 -2
  136. package/dist/{Tooltip-DMKUPC24.css → Tooltip-5FSPJWLX.css} +4 -2
  137. package/dist/Tooltip.cjs +2 -2
  138. package/dist/Tooltip.d.cts +2 -0
  139. package/dist/Tooltip.d.ts +2 -0
  140. package/dist/Tooltip.js +1 -1
  141. package/dist/{Typography-NKPWTJCV.css → Typography-32QQLD4F.css} +41 -11
  142. package/dist/Typography.cjs +8 -7
  143. package/dist/Typography.d.cts +1 -1
  144. package/dist/Typography.d.ts +1 -1
  145. package/dist/Typography.js +3 -2
  146. package/dist/{chunk-DWAN57G4.js → chunk-2NT5QKEX.js} +3 -3
  147. package/dist/{chunk-6BWELOCT.js → chunk-2SCXQ7QS.js} +2 -2
  148. package/dist/{chunk-TP567B3L.cjs → chunk-2ZADGBUN.cjs} +5 -5
  149. package/dist/{chunk-CETNCRZ4.js → chunk-2ZFJTMEF.js} +4 -4
  150. package/dist/{chunk-I5WTQ5Y3.js → chunk-3YP7CBJT.js} +3 -3
  151. package/dist/{chunk-UUHFKIWP.cjs → chunk-4UKM4KAC.cjs} +2 -2
  152. package/dist/{chunk-HLFH5HWR.js → chunk-56PHETWO.js} +3 -3
  153. package/dist/{chunk-ET6DYQVZ.js → chunk-5JNDDWFZ.js} +132 -14
  154. package/dist/{chunk-MPVCYU2K.cjs → chunk-5NFSDFBB.cjs} +4 -4
  155. package/dist/{chunk-P6P4DGLF.cjs → chunk-66GXZQKL.cjs} +4 -4
  156. package/dist/{chunk-QP3VCSRY.cjs → chunk-66T76GII.cjs} +6 -6
  157. package/dist/chunk-6EOSMK34.cjs +194 -0
  158. package/dist/{chunk-WNM5RVXR.cjs → chunk-6GQPF3EI.cjs} +2 -2
  159. package/dist/{chunk-V272XR3F.cjs → chunk-6LARTGLP.cjs} +1 -1
  160. package/dist/chunk-6SPMHY54.js +191 -0
  161. package/dist/{chunk-YLIQ37KY.cjs → chunk-6XVLERA3.cjs} +2 -2
  162. package/dist/{chunk-FBYUZOZP.js → chunk-7D76MI37.js} +5 -5
  163. package/dist/{chunk-J5ZGYQZK.js → chunk-7NZ2A4MA.js} +155 -29
  164. package/dist/{chunk-KLEKKZ73.js → chunk-7ZNGHWVS.js} +1 -1
  165. package/dist/{chunk-7AG524YZ.cjs → chunk-ACQSRMLF.cjs} +5 -5
  166. package/dist/{chunk-JVUVOR6S.js → chunk-AJH2O4WC.js} +3 -3
  167. package/dist/{chunk-NTS5L4NQ.cjs → chunk-BJ6WUVEG.cjs} +4 -4
  168. package/dist/{chunk-S3VXH5L4.cjs → chunk-C24W6PTJ.cjs} +2 -2
  169. package/dist/{chunk-GMN74OEY.cjs → chunk-CBKJXKVI.cjs} +2 -2
  170. package/dist/{chunk-FWPBORRB.js → chunk-CEZ2DR4R.js} +3 -3
  171. package/dist/{chunk-SQGPSMSK.js → chunk-CNGKJYGZ.js} +3 -3
  172. package/dist/{chunk-PULGVK2I.cjs → chunk-D5PCIVID.cjs} +4 -4
  173. package/dist/{chunk-DG5VQ6BO.cjs → chunk-D64IPDUE.cjs} +4 -4
  174. package/dist/{chunk-VFFIE2VO.cjs → chunk-DYHNOYRC.cjs} +7 -7
  175. package/dist/{chunk-P6EZG2R7.cjs → chunk-DYSGXQUK.cjs} +7 -7
  176. package/dist/{chunk-H4LGWZMH.cjs → chunk-GBKUGKIY.cjs} +11 -11
  177. package/dist/{chunk-J2HZTJO6.js → chunk-GUZ2DNDC.js} +3 -3
  178. package/dist/{chunk-K6F25JXT.js → chunk-GZCU6HXD.js} +2 -2
  179. package/dist/{chunk-USQ43DJ5.js → chunk-HFUHQUPQ.js} +2 -2
  180. package/dist/{chunk-7JN6FJ55.js → chunk-HU7T64Y3.js} +2 -2
  181. package/dist/{chunk-X5GCOMC3.cjs → chunk-IDJCFYPP.cjs} +15 -15
  182. package/dist/{chunk-KD4YYIIO.cjs → chunk-IHK2FRTS.cjs} +2 -2
  183. package/dist/{chunk-Q5SZIU7Z.cjs → chunk-JFQ53MO4.cjs} +1 -1
  184. package/dist/{chunk-7PQJCLIR.js → chunk-KMG7OMOS.js} +2 -2
  185. package/dist/{chunk-2HQCUBA7.cjs → chunk-L27C5O4W.cjs} +4 -4
  186. package/dist/chunk-LFTCK2VM.cjs +1194 -0
  187. package/dist/{chunk-BVQ77VRY.js → chunk-LI4XJTEA.js} +3 -3
  188. package/dist/{chunk-45VJGBGN.js → chunk-LQLOOUS3.js} +2 -2
  189. package/dist/{chunk-PL6DRFUO.cjs → chunk-MOMLQP7B.cjs} +2 -2
  190. package/dist/{chunk-OF7JIYBY.cjs → chunk-MYHBC3HA.cjs} +2 -2
  191. package/dist/{chunk-LKK2AA7W.js → chunk-MYRLCN6V.js} +2 -2
  192. package/dist/{chunk-ZKE73UQF.cjs → chunk-N2BTMKF2.cjs} +5 -5
  193. package/dist/{chunk-6ZXQJRAT.cjs → chunk-N2COYOXE.cjs} +155 -29
  194. package/dist/{chunk-2TL37AP5.cjs → chunk-N3OLFKV5.cjs} +1 -1
  195. package/dist/{chunk-5JSDQ6QQ.cjs → chunk-NDO22RER.cjs} +2 -2
  196. package/dist/{chunk-ME5BZ2WA.js → chunk-NE7IUGMK.js} +3 -3
  197. package/dist/{chunk-F6RYCBQG.js → chunk-NFXHIO3G.js} +1 -1
  198. package/dist/chunk-NJCHFXGC.js +1170 -0
  199. package/dist/chunk-NT6CJYI3.cjs +129 -0
  200. package/dist/chunk-O43DOE7V.js +106 -0
  201. package/dist/{chunk-GNEZD7KE.cjs → chunk-O4BOBOYV.cjs} +2 -2
  202. package/dist/{chunk-XSN4TLN5.cjs → chunk-OGPDCBPD.cjs} +12 -12
  203. package/dist/{chunk-6YQTMI55.js → chunk-OHFZ7L4T.js} +2 -2
  204. package/dist/{chunk-7IYKKLV3.js → chunk-OHIFKN4E.js} +4 -4
  205. package/dist/{chunk-46VXFTEC.js → chunk-OQU3TJCF.js} +3 -3
  206. package/dist/{chunk-5TKC6IEN.js → chunk-PEJLXJQD.js} +1 -1
  207. package/dist/{chunk-HWFM4MAT.js → chunk-PKHITACT.js} +2 -2
  208. package/dist/{chunk-JCEHZ336.js → chunk-PNZJFLMY.js} +3 -3
  209. package/dist/{chunk-XRR3CYQL.js → chunk-QP7RXZES.js} +2 -2
  210. package/dist/{chunk-5MN3PMF4.cjs → chunk-QY76WTO5.cjs} +9 -9
  211. package/dist/{chunk-FGW5GJ22.cjs → chunk-R74TZKJS.cjs} +4 -4
  212. package/dist/{chunk-TGL5BGMR.js → chunk-REMJWNAT.js} +4 -4
  213. package/dist/{chunk-3YJU3D5S.cjs → chunk-RIUDYPRB.cjs} +62 -13
  214. package/dist/{chunk-SWBWZIL4.cjs → chunk-S6OKX4H7.cjs} +2 -2
  215. package/dist/{chunk-EC4WGEAJ.js → chunk-SABWUELE.js} +2 -2
  216. package/dist/{chunk-TEEFR2FD.js → chunk-SFAGHPBT.js} +62 -13
  217. package/dist/{chunk-QKQHZIF3.cjs → chunk-SG42F5VB.cjs} +2 -2
  218. package/dist/{chunk-5C2AI2SD.js → chunk-SQIWPU6V.js} +2 -2
  219. package/dist/{chunk-5DKRY67M.cjs → chunk-SYWTT5TY.cjs} +5 -5
  220. package/dist/{chunk-OBEKX4VR.js → chunk-TVUBGXWA.js} +2 -2
  221. package/dist/{chunk-7PNJI5UE.cjs → chunk-U2H4DRMV.cjs} +2 -2
  222. package/dist/{chunk-HKF2V5MM.cjs → chunk-VAXWWJJP.cjs} +9 -9
  223. package/dist/{chunk-5H5YP2TB.js → chunk-VNNQYJLT.js} +3 -3
  224. package/dist/{chunk-KGSADAOD.cjs → chunk-VSUMJX6Z.cjs} +2 -2
  225. package/dist/{chunk-K5IGFBDR.js → chunk-W5CJC7S7.js} +3 -3
  226. package/dist/{chunk-AXZ7ELMA.js → chunk-WEJKY3DF.js} +2 -2
  227. package/dist/{chunk-GIZU3H6H.js → chunk-WXWFMWWF.js} +3 -3
  228. package/dist/{chunk-UKS23N3L.js → chunk-XVP7IKLZ.js} +4 -4
  229. package/dist/{chunk-ELNT3CFO.js → chunk-Y5F7ZTBH.js} +2 -2
  230. package/dist/{chunk-QCILPZWP.js → chunk-YJEXAO2I.js} +2 -2
  231. package/dist/{chunk-7ABFUIOB.cjs → chunk-YNCDTKAE.cjs} +2 -2
  232. package/dist/{chunk-K7FV7W6U.cjs → chunk-YSCIMHOI.cjs} +5 -5
  233. package/dist/{chunk-BPOOVO5T.js → chunk-YSXD344H.js} +5 -5
  234. package/dist/{chunk-47VG2P34.js → chunk-YT5NLCRC.js} +1 -1
  235. package/dist/{chunk-R2TEDH2F.cjs → chunk-YU5JK247.cjs} +135 -17
  236. package/dist/{chunk-HZSIUOCN.cjs → chunk-YUKXNWVE.cjs} +1 -1
  237. package/dist/{chunk-65FIH5A3.js → chunk-YVTLHTG6.js} +2 -2
  238. package/dist/{chunk-GENABQYA.cjs → chunk-Z4PZ2ZHI.cjs} +2 -2
  239. package/dist/{chunk-6HMTV6P4.cjs → chunk-ZPKHGKVL.cjs} +4 -4
  240. package/dist/{chunk-AAGF7K3L.js → chunk-ZPP7LTHP.js} +3 -3
  241. package/dist/{chunk-IZOHYJUQ.cjs → chunk-ZWCDB5PP.cjs} +2 -2
  242. package/dist/index.cjs +214 -191
  243. package/dist/index.d.cts +3 -1
  244. package/dist/index.d.ts +3 -1
  245. package/dist/index.js +49 -46
  246. package/dist/styles.css +715 -175
  247. package/dist/{tokens-BIIUTPKN.css → tokens-EF34LSWI.css} +42 -17
  248. package/dist/tokens.css +42 -17
  249. package/docs/llms/surface.md +90 -0
  250. package/docs/llms/theme.md +24 -2
  251. package/docs/llms/themepanel.md +128 -0
  252. package/docs/llms/tooltip.md +1 -0
  253. package/docs/llms/typography.md +12 -2
  254. package/docs/llms.md +3 -1
  255. package/package.json +1 -1
@@ -0,0 +1,1194 @@
1
+ 'use strict';
2
+
3
+ var chunkZWCDB5PP_cjs = require('./chunk-ZWCDB5PP.cjs');
4
+ var chunk6EOSMK34_cjs = require('./chunk-6EOSMK34.cjs');
5
+ var chunkN2COYOXE_cjs = require('./chunk-N2COYOXE.cjs');
6
+ var chunk6GQPF3EI_cjs = require('./chunk-6GQPF3EI.cjs');
7
+ var chunkVSUMJX6Z_cjs = require('./chunk-VSUMJX6Z.cjs');
8
+ var chunkMYHBC3HA_cjs = require('./chunk-MYHBC3HA.cjs');
9
+ var chunkVAXWWJJP_cjs = require('./chunk-VAXWWJJP.cjs');
10
+ var chunk2ZADGBUN_cjs = require('./chunk-2ZADGBUN.cjs');
11
+ var chunk6LARTGLP_cjs = require('./chunk-6LARTGLP.cjs');
12
+ require('./tokens-EF34LSWI.css');
13
+ require('./shared-NJHRNLRH.css');
14
+ require('./ThemePanel-76LB3YA5.css');
15
+ var React = require('react');
16
+ var jsxRuntime = require('react/jsx-runtime');
17
+
18
+ function _interopNamespace(e) {
19
+ if (e && e.__esModule) return e;
20
+ var n = Object.create(null);
21
+ if (e) {
22
+ Object.keys(e).forEach(function (k) {
23
+ if (k !== 'default') {
24
+ var d = Object.getOwnPropertyDescriptor(e, k);
25
+ Object.defineProperty(n, k, d.get ? d : {
26
+ enumerable: true,
27
+ get: function () { return e[k]; }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n.default = e;
33
+ return Object.freeze(n);
34
+ }
35
+
36
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
37
+
38
+ var THEME_PANEL_DEFAULT_THEME_PRESETS = chunk6EOSMK34_cjs.pickLuminaThemePresets(["light", "dark", "porcelain", "assistant", "assistantDark"]);
39
+ var THEME_PANEL_DEFAULT_PRESET_OPTIONS = [
40
+ { key: "light", label: "\u6D45\u8272", description: "\u9ED8\u8BA4", preset: THEME_PANEL_DEFAULT_THEME_PRESETS.light },
41
+ { key: "dark", label: "\u6DF1\u8272", description: "\u9ED8\u8BA4", preset: THEME_PANEL_DEFAULT_THEME_PRESETS.dark },
42
+ { key: "porcelain", label: "\u74F7\u767D", description: "\u6E05\u4EAE", preset: THEME_PANEL_DEFAULT_THEME_PRESETS.porcelain },
43
+ { key: "assistant", label: "\u52A9\u624B", description: "Soft", preset: THEME_PANEL_DEFAULT_THEME_PRESETS.assistant },
44
+ { key: "assistantDark", label: "\u52A9\u624B\u6697", description: "Soft", preset: THEME_PANEL_DEFAULT_THEME_PRESETS.assistantDark }
45
+ ];
46
+ var DRAFT_THEME_MODE = "__theme_panel_draft__";
47
+ var DEFAULT_SURFACE_BY_BASE = {
48
+ light: THEME_PANEL_DEFAULT_THEME_PRESETS.light.tokens.bg,
49
+ dark: THEME_PANEL_DEFAULT_THEME_PRESETS.dark.tokens.bg
50
+ };
51
+ var SURFACE_TOKEN_KEYS = [
52
+ "bg",
53
+ "bg-raised",
54
+ "bg-sunken",
55
+ "fg",
56
+ "fg-muted",
57
+ "fg-subtle",
58
+ "border",
59
+ "divider"
60
+ ];
61
+ var SHADOW_TOKEN_KEYS = [
62
+ "shadow-dark",
63
+ "shadow-light",
64
+ "shadow-scale",
65
+ "shadow-float-scale"
66
+ ];
67
+ var THEME_TOKEN_KEYS = [...SURFACE_TOKEN_KEYS, ...SHADOW_TOKEN_KEYS];
68
+ var DEFAULT_SECTIONS = [
69
+ "mode",
70
+ "presets",
71
+ "accent",
72
+ "shadow",
73
+ "radius",
74
+ "font",
75
+ "density"
76
+ ];
77
+ var DEFAULT_MODE_OPTIONS = [
78
+ { key: "light", label: "\u6D45\u8272" },
79
+ { key: "dark", label: "\u6DF1\u8272" },
80
+ { key: "system", label: "\u7CFB\u7EDF" }
81
+ ];
82
+ var DENSITY_OPTIONS = [
83
+ { value: "compact", label: "\u7D27\u51D1" },
84
+ { value: "comfortable", label: "\u8212\u9002" },
85
+ { value: "spacious", label: "\u5BBD\u677E" }
86
+ ];
87
+ var FONT_OPTIONS = [
88
+ { value: "system", label: "\u7CFB\u7EDF" },
89
+ { value: "sf", label: "SF Pro" },
90
+ { value: "serif", label: "\u886C\u7EBF" },
91
+ { value: "mono", label: "\u7B49\u5BBD" }
92
+ ];
93
+ var THEME_CREATE_MODE_OPTIONS = [
94
+ { value: "simple", label: "\u7B80\u6D01" },
95
+ { value: "advanced", label: "\u6DF1\u5EA6" }
96
+ ];
97
+ var ADVANCED_FONT_MODE_OPTIONS = [
98
+ { value: "preset", label: "\u9884\u8BBE\u5B57\u4F53" },
99
+ { value: "custom", label: "\u81EA\u5B9A\u4E49\u6808" }
100
+ ];
101
+ var SURFACE_TOKEN_FIELDS = [
102
+ { key: "bg", label: "\u80CC\u666F" },
103
+ { key: "bg-raised", label: "\u51F8\u8D77\u9762" },
104
+ { key: "bg-sunken", label: "\u51F9\u9677\u9762" },
105
+ { key: "fg", label: "\u6B63\u6587" },
106
+ { key: "fg-muted", label: "\u6B21\u7EA7\u6587\u5B57" },
107
+ { key: "fg-subtle", label: "\u5F31\u6587\u5B57" },
108
+ { key: "border", label: "\u63CF\u8FB9" },
109
+ { key: "divider", label: "\u5206\u5272\u7EBF" }
110
+ ];
111
+ var SHADOW_TOKEN_FIELDS = [
112
+ { key: "shadow-dark", label: "\u6697\u9634\u5F71", kind: "color" },
113
+ { key: "shadow-light", label: "\u4EAE\u9634\u5F71", kind: "color" },
114
+ { key: "shadow-scale", label: "\u9634\u5F71\u6269\u6563", kind: "scale" },
115
+ { key: "shadow-float-scale", label: "\u6D6E\u5C42\u6DF1\u5EA6", kind: "scale" }
116
+ ];
117
+ var ACCENT_PALETTE_FIELDS = [
118
+ { key: "accent", label: "\u4E3B\u8272" },
119
+ { key: "ink", label: "\u6587\u5B57\u8272" },
120
+ { key: "soft", label: "\u67D4\u548C\u5E95" },
121
+ { key: "glow", label: "\u5149\u6655" }
122
+ ];
123
+ function accentFromPreset(preset) {
124
+ const accent = preset?.accent ?? "sky";
125
+ if (typeof accent === "string") {
126
+ return chunkN2COYOXE_cjs.ACCENT_PRESETS[accent]?.accent ?? accent;
127
+ }
128
+ return accent.accent;
129
+ }
130
+ function fallbackPresetLabel(key) {
131
+ return key.replace(/^user-/, "").replace(/[-_]+/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
132
+ }
133
+ function nodeToText(node, fallback) {
134
+ if (typeof node === "string") return node;
135
+ if (typeof node === "number") return String(node);
136
+ return fallback;
137
+ }
138
+ function createThemeKey(label, themes, prefix) {
139
+ const normalizedPrefix = prefix.trim().replace(/[^a-z0-9-]+/gi, "-").replace(/^-+|-+$/g, "") || "user";
140
+ const slug = label.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
141
+ const base = `${normalizedPrefix}-${slug || "custom-theme"}`;
142
+ let key = base;
143
+ let i = 2;
144
+ while (key in themes || key in THEME_PANEL_DEFAULT_THEME_PRESETS || key === DRAFT_THEME_MODE) {
145
+ key = `${base}-${i}`;
146
+ i += 1;
147
+ }
148
+ return key;
149
+ }
150
+ var clampColor = (value) => Math.min(1, Math.max(0, value));
151
+ function normalizeHexColor(input) {
152
+ const value = input.trim().replace(/^#/, "");
153
+ if (!/^([\da-f]{3}|[\da-f]{6})$/i.test(value)) return null;
154
+ const hex = value.length === 3 ? value.split("").map((part) => part + part).join("") : value;
155
+ return `#${hex.toLowerCase()}`;
156
+ }
157
+ function hexToRgbColor(hex) {
158
+ const normalized = normalizeHexColor(hex);
159
+ if (!normalized) return null;
160
+ const value = Number.parseInt(normalized.slice(1), 16);
161
+ return [value >> 16 & 255, value >> 8 & 255, value & 255];
162
+ }
163
+ function rgbToHexColor(red, green, blue) {
164
+ const toHex = (value) => Math.round(Math.min(255, Math.max(0, value))).toString(16).padStart(2, "0");
165
+ return `#${toHex(red)}${toHex(green)}${toHex(blue)}`;
166
+ }
167
+ function parseRgbColor(value) {
168
+ const match = value.trim().match(/^rgba?\((.+)\)$/i);
169
+ if (!match) return null;
170
+ const parts = match[1].replace(/\s*\/\s*[\d.]+%?$/, "").split(/[\s,]+/).filter(Boolean).slice(0, 3);
171
+ if (parts.length < 3) return null;
172
+ const channels = parts.map((part) => {
173
+ const numeric = Number.parseFloat(part);
174
+ return part.endsWith("%") ? numeric / 100 * 255 : numeric;
175
+ });
176
+ return channels.every(Number.isFinite) ? rgbToHexColor(channels[0], channels[1], channels[2]) : null;
177
+ }
178
+ function parseOklchColor(value) {
179
+ const match = value.trim().match(/^oklch\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)\s+([+-]?\d*\.?\d+)(deg|rad|turn)?(?:\s*\/\s*[^)]+)?\s*\)$/i);
180
+ if (!match) return null;
181
+ const lightness = Number.parseFloat(match[1]);
182
+ const chroma = Number.parseFloat(match[3]);
183
+ const hueValue = Number.parseFloat(match[4]);
184
+ if (![lightness, chroma, hueValue].every(Number.isFinite)) return null;
185
+ const hue = match[5] === "rad" ? hueValue * 180 / Math.PI : match[5] === "turn" ? hueValue * 360 : hueValue;
186
+ const l = match[2] ? lightness / 100 : lightness;
187
+ const a = chroma * Math.cos(hue * Math.PI / 180);
188
+ const b = chroma * Math.sin(hue * Math.PI / 180);
189
+ const lmsL = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;
190
+ const lmsM = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;
191
+ const lmsS = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;
192
+ const linearR = 4.0767416621 * lmsL - 3.3077115913 * lmsM + 0.2309699292 * lmsS;
193
+ const linearG = -1.2684380046 * lmsL + 2.6097574011 * lmsM - 0.3413193965 * lmsS;
194
+ const linearB = -0.0041960863 * lmsL - 0.7034186147 * lmsM + 1.707614701 * lmsS;
195
+ const encode = (channel) => {
196
+ const c = clampColor(channel);
197
+ return c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055;
198
+ };
199
+ return rgbToHexColor(encode(linearR) * 255, encode(linearG) * 255, encode(linearB) * 255);
200
+ }
201
+ function cssColorToHex(value, fallback) {
202
+ return normalizeHexColor(value) ?? parseRgbColor(value) ?? parseOklchColor(value) ?? fallback;
203
+ }
204
+ function sameHexColor(a, b) {
205
+ const left = normalizeHexColor(a);
206
+ const right = normalizeHexColor(b);
207
+ return !!left && left === right;
208
+ }
209
+ function shiftHexColor(value, delta) {
210
+ if (!value) return void 0;
211
+ const rgb = hexToRgbColor(value);
212
+ if (!rgb) return value;
213
+ return rgbToHexColor(rgb[0] + delta[0], rgb[1] + delta[1], rgb[2] + delta[2]);
214
+ }
215
+ function createAccentPalette(accent, base) {
216
+ return {
217
+ accent,
218
+ ink: base === "dark" ? `color-mix(in oklch, ${accent} 68%, white)` : `color-mix(in oklch, ${accent} 65%, black)`,
219
+ soft: base === "dark" ? `color-mix(in oklch, ${accent} 28%, black)` : `color-mix(in oklch, ${accent} 15%, white)`,
220
+ glow: base === "dark" ? `color-mix(in oklch, ${accent} 18%, transparent)` : `color-mix(in oklch, ${accent} 35%, transparent)`
221
+ };
222
+ }
223
+ function createSurfaceTokens(surface, base) {
224
+ return base === "dark" ? {
225
+ bg: surface,
226
+ "bg-raised": `color-mix(in oklch, ${surface} 88%, white)`,
227
+ "bg-sunken": `color-mix(in oklch, ${surface} 84%, black)`,
228
+ fg: `color-mix(in oklch, ${surface} 18%, white)`,
229
+ "fg-muted": `color-mix(in oklch, ${surface} 48%, white)`,
230
+ "fg-subtle": `color-mix(in oklch, ${surface} 66%, white)`,
231
+ border: "rgba(255, 255, 255, 0.08)",
232
+ divider: "rgba(255, 255, 255, 0.08)",
233
+ "shadow-dark": "rgba(0, 0, 0, 0.56)",
234
+ "shadow-light": "rgba(130, 145, 180, 0.06)",
235
+ "shadow-scale": "1",
236
+ "shadow-float-scale": "1"
237
+ } : {
238
+ bg: surface,
239
+ "bg-raised": `color-mix(in oklch, ${surface} 82%, white)`,
240
+ "bg-sunken": `color-mix(in oklch, ${surface} 88%, black)`,
241
+ fg: `color-mix(in oklch, ${surface} 24%, black)`,
242
+ "fg-muted": `color-mix(in oklch, ${surface} 48%, black)`,
243
+ "fg-subtle": `color-mix(in oklch, ${surface} 66%, black)`,
244
+ border: "rgba(110, 130, 150, 0.14)",
245
+ divider: "rgba(110, 130, 150, 0.18)",
246
+ "shadow-dark": `color-mix(in oklch, ${surface} 68%, black)`,
247
+ "shadow-light": "rgba(255, 255, 255, 0.96)",
248
+ "shadow-scale": "1",
249
+ "shadow-float-scale": "1"
250
+ };
251
+ }
252
+ function defaultBaseTokens(base) {
253
+ const tokens = THEME_PANEL_DEFAULT_THEME_PRESETS[base].tokens;
254
+ return { ...tokens };
255
+ }
256
+ function createDraftSurfaceTokens(surface, base, sourceSurface, sourceTokens) {
257
+ if (sameHexColor(surface, sourceSurface)) return { ...sourceTokens };
258
+ const current = hexToRgbColor(surface);
259
+ const source = hexToRgbColor(sourceSurface);
260
+ if (!current || !source) return createSurfaceTokens(surface, base);
261
+ const delta = [
262
+ current[0] - source[0],
263
+ current[1] - source[1],
264
+ current[2] - source[2]
265
+ ];
266
+ return {
267
+ ...sourceTokens,
268
+ bg: normalizeHexColor(surface) ?? surface,
269
+ "bg-raised": shiftHexColor(sourceTokens["bg-raised"], delta) ?? sourceTokens["bg-raised"],
270
+ "bg-sunken": shiftHexColor(sourceTokens["bg-sunken"], delta) ?? sourceTokens["bg-sunken"]
271
+ };
272
+ }
273
+ function createDraftAccentPalette(accent, base, sourceAccent, sourcePalette) {
274
+ return sameHexColor(accent, sourceAccent) ? { ...sourcePalette } : createAccentPalette(accent, base);
275
+ }
276
+ function readCssVar(element, name, fallback) {
277
+ if (!element || typeof window === "undefined") return fallback;
278
+ return getComputedStyle(element).getPropertyValue(name).trim() || fallback;
279
+ }
280
+ function readCurrentThemeTokens(element, base) {
281
+ const fallbackTokens = defaultBaseTokens(base);
282
+ return Object.fromEntries(
283
+ THEME_TOKEN_KEYS.map((key) => [
284
+ key,
285
+ readCssVar(element, `--${key}`, fallbackTokens[key] ?? DEFAULT_SURFACE_BY_BASE[base])
286
+ ])
287
+ );
288
+ }
289
+ function readCurrentAccentPalette(element, fallback) {
290
+ return {
291
+ accent: readCssVar(element, "--accent", fallback.accent),
292
+ ink: readCssVar(element, "--accent-ink", fallback.ink),
293
+ soft: readCssVar(element, "--accent-soft", fallback.soft),
294
+ glow: readCssVar(element, "--accent-glow", fallback.glow)
295
+ };
296
+ }
297
+ function toFontKey(font) {
298
+ return typeof font === "string" && FONT_OPTIONS.some((option) => option.value === font) ? font : "system";
299
+ }
300
+ function fontConfigToText(font) {
301
+ return typeof font === "string" ? font : JSON.stringify(font);
302
+ }
303
+ function fontToStack(font) {
304
+ if (typeof font === "string") return chunkN2COYOXE_cjs.FONT_STACKS[font] ?? font;
305
+ return font.sans ?? font.display ?? chunkN2COYOXE_cjs.FONT_STACKS.system;
306
+ }
307
+ function tokenPickerValue(value, fallback) {
308
+ return cssColorToHex(value ?? fallback, fallback);
309
+ }
310
+ function parseScaleToken(value, fallback = 1) {
311
+ const parsed = Number.parseFloat(value ?? "");
312
+ return Number.isFinite(parsed) ? Math.min(2, Math.max(0.2, parsed)) : fallback;
313
+ }
314
+ function formatScaleToken(value) {
315
+ return value.toFixed(2).replace(/\.?0+$/, "");
316
+ }
317
+ var ThemePanel = React__namespace.forwardRef(
318
+ ({
319
+ title = "\u4E3B\u9898",
320
+ description = "\u5FEB\u901F\u8C03\u6574\u5F53\u524D Lumina \u4E3B\u9898",
321
+ sections = DEFAULT_SECTIONS,
322
+ modeOptions = DEFAULT_MODE_OPTIONS,
323
+ presetOptions,
324
+ defaultCustomAccent = "#845ef7",
325
+ allowCreateTheme = true,
326
+ defaultCreateThemeName = "\u6211\u7684\u4E3B\u9898",
327
+ createThemeKeyPrefix = "user",
328
+ onCreateTheme,
329
+ allowDeleteTheme = true,
330
+ onDeleteTheme,
331
+ showReset = true,
332
+ compact,
333
+ className = "",
334
+ ...rest
335
+ }, ref) => {
336
+ const theme = chunkN2COYOXE_cjs.useTheme();
337
+ const rootRef = React__namespace.useRef(null);
338
+ const previewSnapshotRef = React__namespace.useRef(null);
339
+ const updateThemeRef = React__namespace.useRef(theme.update);
340
+ updateThemeRef.current = theme.update;
341
+ const [customAccent, setCustomAccent] = React__namespace.useState(defaultCustomAccent);
342
+ const [createdThemeMeta, setCreatedThemeMeta] = React__namespace.useState({});
343
+ const [isCreatingTheme, setIsCreatingTheme] = React__namespace.useState(false);
344
+ const [previewDraft, setPreviewDraft] = React__namespace.useState(true);
345
+ const [draftName, setDraftName] = React__namespace.useState(defaultCreateThemeName);
346
+ const [draftBase, setDraftBase] = React__namespace.useState("light");
347
+ const [draftSurface, setDraftSurface] = React__namespace.useState(DEFAULT_SURFACE_BY_BASE.light);
348
+ const [draftAccent, setDraftAccent] = React__namespace.useState(defaultCustomAccent);
349
+ const [draftTokens, setDraftTokens] = React__namespace.useState(
350
+ () => defaultBaseTokens("light")
351
+ );
352
+ const [draftSourceSurface, setDraftSourceSurface] = React__namespace.useState(DEFAULT_SURFACE_BY_BASE.light);
353
+ const [draftSourceTokens, setDraftSourceTokens] = React__namespace.useState(
354
+ () => defaultBaseTokens("light")
355
+ );
356
+ const [draftAccentPalette, setDraftAccentPalette] = React__namespace.useState(
357
+ () => createAccentPalette(defaultCustomAccent, "light")
358
+ );
359
+ const [draftSourceAccent, setDraftSourceAccent] = React__namespace.useState(defaultCustomAccent);
360
+ const [draftSourceAccentPalette, setDraftSourceAccentPalette] = React__namespace.useState(
361
+ () => createAccentPalette(defaultCustomAccent, "light")
362
+ );
363
+ const [draftDensity, setDraftDensity] = React__namespace.useState("comfortable");
364
+ const [draftIntensity, setDraftIntensity] = React__namespace.useState(5);
365
+ const [draftRadius, setDraftRadius] = React__namespace.useState(20);
366
+ const [draftFont, setDraftFont] = React__namespace.useState("sf");
367
+ const [createMode, setCreateMode] = React__namespace.useState("simple");
368
+ const [advancedFontMode, setAdvancedFontMode] = React__namespace.useState("preset");
369
+ const [draftBasePresets, setDraftBasePresets] = React__namespace.useState(() => ({
370
+ light: THEME_PANEL_DEFAULT_THEME_PRESETS.light,
371
+ dark: THEME_PANEL_DEFAULT_THEME_PRESETS.dark
372
+ }));
373
+ const modeValue = String(theme.mode);
374
+ const protectedPresetKeys = React__namespace.useMemo(
375
+ () => /* @__PURE__ */ new Set(["system", ...THEME_PANEL_DEFAULT_PRESET_OPTIONS.map((option) => String(option.key))]),
376
+ []
377
+ );
378
+ const setRootRef = React__namespace.useCallback(
379
+ (node) => {
380
+ rootRef.current = node;
381
+ if (typeof ref === "function") ref(node);
382
+ else if (ref) ref.current = node;
383
+ },
384
+ [ref]
385
+ );
386
+ const draftPreset = React__namespace.useMemo(
387
+ () => ({
388
+ base: draftBase,
389
+ accent: draftAccentPalette,
390
+ density: draftDensity,
391
+ intensity: draftIntensity,
392
+ radius: draftRadius,
393
+ font: draftFont,
394
+ tokens: draftTokens
395
+ }),
396
+ [draftAccentPalette, draftBase, draftDensity, draftFont, draftIntensity, draftRadius, draftTokens]
397
+ );
398
+ const resolvedPresetOptions = React__namespace.useMemo(() => {
399
+ if (presetOptions) return presetOptions;
400
+ const defaultKeys = new Set(THEME_PANEL_DEFAULT_PRESET_OPTIONS.map((option) => String(option.key)));
401
+ const builtIns = THEME_PANEL_DEFAULT_PRESET_OPTIONS.map((option) => {
402
+ const key = String(option.key);
403
+ return {
404
+ ...option,
405
+ preset: theme.themes[key] ?? option.preset
406
+ };
407
+ });
408
+ const customOptions = Object.entries(theme.themes).filter(([key]) => !defaultKeys.has(key)).map(([key, preset]) => ({
409
+ key,
410
+ label: createdThemeMeta[key]?.label ?? preset.label ?? fallbackPresetLabel(key),
411
+ description: createdThemeMeta[key]?.description ?? preset.description ?? (preset.base === "dark" ? "\u6DF1\u8272" : "\u6D45\u8272"),
412
+ preset
413
+ }));
414
+ return [...builtIns, ...customOptions];
415
+ }, [createdThemeMeta, presetOptions, theme.themes]);
416
+ React__namespace.useEffect(() => {
417
+ if (!isCreatingTheme || !previewDraft) return;
418
+ updateThemeRef.current({
419
+ mode: DRAFT_THEME_MODE,
420
+ colorScheme: draftPreset.base,
421
+ accent: draftPreset.accent,
422
+ density: draftPreset.density,
423
+ intensity: draftPreset.intensity,
424
+ radius: draftPreset.radius,
425
+ font: draftPreset.font,
426
+ tokens: draftPreset.tokens
427
+ });
428
+ }, [draftPreset, isCreatingTheme, previewDraft]);
429
+ const clearCreateState = () => {
430
+ previewSnapshotRef.current = null;
431
+ setIsCreatingTheme(false);
432
+ setPreviewDraft(true);
433
+ };
434
+ const restorePreviewSnapshot = () => {
435
+ const snapshot = previewSnapshotRef.current;
436
+ if (!snapshot) return;
437
+ updateThemeRef.current({
438
+ ...snapshot,
439
+ mode: snapshot.mode === DRAFT_THEME_MODE ? snapshot.colorScheme ?? "light" : snapshot.mode
440
+ });
441
+ };
442
+ React__namespace.useEffect(() => {
443
+ return () => {
444
+ restorePreviewSnapshot();
445
+ };
446
+ }, []);
447
+ const applyMode = (mode) => {
448
+ clearCreateState();
449
+ if (mode === "light" || mode === "dark" || mode === "system") {
450
+ theme.update({ mode, colorScheme: mode === "system" ? theme.colorScheme : mode, tokens: {} });
451
+ return;
452
+ }
453
+ theme.setMode(mode);
454
+ };
455
+ const applyPreset = (option) => {
456
+ clearCreateState();
457
+ const key = String(option.key);
458
+ const preset = option.preset ?? theme.themes[key];
459
+ if (!preset) {
460
+ theme.setMode(option.key);
461
+ return;
462
+ }
463
+ const isBuiltInMode = key === "light" || key === "dark" || key === "system";
464
+ const fallbackAccent = theme.accent === "custom" ? theme.accentPalette : theme.accent;
465
+ theme.update({
466
+ ...!isBuiltInMode ? { themes: { ...theme.themes, [key]: preset } } : null,
467
+ mode: option.key,
468
+ colorScheme: preset.base ?? theme.colorScheme,
469
+ accent: preset.accent ?? fallbackAccent,
470
+ density: preset.density ?? theme.density,
471
+ intensity: preset.intensity ?? theme.intensity,
472
+ radius: preset.radius ?? theme.radius,
473
+ font: preset.font ?? theme.font,
474
+ tokens: preset.tokens ?? {}
475
+ });
476
+ };
477
+ const deletePreset = (option) => {
478
+ clearCreateState();
479
+ const key = String(option.key);
480
+ if (protectedPresetKeys.has(key) || !(key in theme.themes)) return;
481
+ const preset = option.preset ?? theme.themes[key];
482
+ const { [key]: _removed, ...nextThemes } = theme.themes;
483
+ const active = modeValue === key;
484
+ const nextBase = theme.colorScheme === "dark" ? "dark" : "light";
485
+ const fallbackPreset = THEME_PANEL_DEFAULT_THEME_PRESETS[nextBase];
486
+ const nextConfig = active ? {
487
+ mode: nextBase,
488
+ colorScheme: fallbackPreset.base,
489
+ accent: fallbackPreset.accent,
490
+ density: fallbackPreset.density,
491
+ intensity: fallbackPreset.intensity,
492
+ radius: fallbackPreset.radius,
493
+ font: fallbackPreset.font,
494
+ tokens: fallbackPreset.tokens
495
+ } : {};
496
+ theme.update({
497
+ ...nextConfig,
498
+ themes: nextThemes
499
+ });
500
+ setCreatedThemeMeta((current) => {
501
+ if (!(key in current)) return current;
502
+ const { [key]: _meta, ...next } = current;
503
+ return next;
504
+ });
505
+ onDeleteTheme?.({
506
+ key,
507
+ label: nodeToText(option.label, preset?.label ?? fallbackPresetLabel(key)),
508
+ description: nodeToText(
509
+ option.description,
510
+ preset?.description ?? (preset?.base === "dark" ? "\u6DF1\u8272" : "\u6D45\u8272")
511
+ ),
512
+ preset
513
+ });
514
+ };
515
+ const beginCreateTheme = () => {
516
+ const root = rootRef.current;
517
+ const base = theme.colorScheme;
518
+ const surface = cssColorToHex(
519
+ readCssVar(root, "--bg", DEFAULT_SURFACE_BY_BASE[base]),
520
+ DEFAULT_SURFACE_BY_BASE[base]
521
+ );
522
+ const accentPalette = readCurrentAccentPalette(root, theme.accentPalette);
523
+ const accent = cssColorToHex(accentPalette.accent, defaultCustomAccent);
524
+ const currentTokens = readCurrentThemeTokens(root, base);
525
+ const currentPreset = {
526
+ base,
527
+ accent: accentPalette,
528
+ density: theme.density,
529
+ intensity: theme.intensity,
530
+ radius: theme.radius,
531
+ font: theme.font,
532
+ tokens: currentTokens
533
+ };
534
+ const basePresets = {
535
+ light: base === "light" ? currentPreset : THEME_PANEL_DEFAULT_THEME_PRESETS.light,
536
+ dark: base === "dark" ? currentPreset : THEME_PANEL_DEFAULT_THEME_PRESETS.dark
537
+ };
538
+ previewSnapshotRef.current = {
539
+ mode: theme.mode,
540
+ colorScheme: theme.colorScheme,
541
+ accent: theme.accent === "custom" ? theme.accentPalette : theme.accent,
542
+ density: theme.density,
543
+ intensity: theme.intensity,
544
+ radius: theme.radius,
545
+ font: theme.font,
546
+ tokens: theme.tokens,
547
+ themes: theme.themes
548
+ };
549
+ setDraftBasePresets(basePresets);
550
+ setDraftName(defaultCreateThemeName);
551
+ setDraftBase(base);
552
+ setDraftSurface(cssColorToHex(currentTokens.bg ?? surface, surface));
553
+ setDraftTokens(currentTokens);
554
+ setDraftSourceSurface(cssColorToHex(currentTokens.bg ?? surface, surface));
555
+ setDraftSourceTokens(currentTokens);
556
+ setDraftAccent(accent);
557
+ setDraftAccentPalette(accentPalette);
558
+ setDraftSourceAccent(accent);
559
+ setDraftSourceAccentPalette(accentPalette);
560
+ setDraftDensity(theme.density);
561
+ setDraftIntensity(theme.intensity);
562
+ setDraftRadius(theme.radius);
563
+ setDraftFont(theme.font ?? "sf");
564
+ setAdvancedFontMode(toFontKey(theme.font) === theme.font ? "preset" : "custom");
565
+ setCreateMode("simple");
566
+ setCustomAccent(accent);
567
+ setPreviewDraft(true);
568
+ setIsCreatingTheme(true);
569
+ };
570
+ const cancelCreateTheme = () => {
571
+ restorePreviewSnapshot();
572
+ clearCreateState();
573
+ };
574
+ const toggleDraftPreview = (checked) => {
575
+ setPreviewDraft(checked);
576
+ if (!checked) restorePreviewSnapshot();
577
+ };
578
+ const updateDraftBase = (base) => {
579
+ const preset = draftBasePresets[base] ?? THEME_PANEL_DEFAULT_THEME_PRESETS[base];
580
+ const tokens = { ...preset.tokens ?? defaultBaseTokens(base) };
581
+ const surface = cssColorToHex(tokens.bg ?? DEFAULT_SURFACE_BY_BASE[base], DEFAULT_SURFACE_BY_BASE[base]);
582
+ setDraftBase(base);
583
+ setDraftSurface(surface);
584
+ setDraftTokens(tokens);
585
+ setDraftSourceSurface(surface);
586
+ setDraftSourceTokens(tokens);
587
+ const nextAccent = cssColorToHex(draftAccent, defaultCustomAccent);
588
+ const accentPalette = createAccentPalette(nextAccent, base);
589
+ setDraftAccent(nextAccent);
590
+ setDraftAccentPalette(accentPalette);
591
+ setDraftSourceAccent(nextAccent);
592
+ setDraftSourceAccentPalette(accentPalette);
593
+ };
594
+ const updateDraftSurface = (surface) => {
595
+ setDraftSurface(surface);
596
+ setDraftTokens(createDraftSurfaceTokens(surface, draftBase, draftSourceSurface, draftSourceTokens));
597
+ };
598
+ const updateDraftToken = (key, value) => {
599
+ setDraftTokens((current) => ({ ...current, [key]: value }));
600
+ if (key === "bg") setDraftSurface(cssColorToHex(value, draftSurface));
601
+ };
602
+ const updateDraftAccent = (accent) => {
603
+ setDraftAccent(accent);
604
+ setDraftAccentPalette(createDraftAccentPalette(accent, draftBase, draftSourceAccent, draftSourceAccentPalette));
605
+ if (previewDraft) setCustomAccent(accent);
606
+ };
607
+ const updateDraftAccentSlot = (key, value) => {
608
+ setDraftAccentPalette((current) => ({ ...current, [key]: value }));
609
+ if (key === "accent") {
610
+ const accent = cssColorToHex(value, draftAccent);
611
+ setDraftAccent(accent);
612
+ if (previewDraft) setCustomAccent(accent);
613
+ }
614
+ };
615
+ const saveCustomTheme = () => {
616
+ const label = draftName.trim() || defaultCreateThemeName || "\u81EA\u5B9A\u4E49\u4E3B\u9898";
617
+ const key = createThemeKey(label, theme.themes, createThemeKeyPrefix);
618
+ const description2 = draftBase === "dark" ? "\u81EA\u5EFA\u6697" : "\u81EA\u5EFA\u4EAE";
619
+ const preset = { ...draftPreset, label, description: description2 };
620
+ const presetOption = { key, label, description: description2, preset };
621
+ const nextThemes = { ...theme.themes, [String(key)]: preset };
622
+ const meta = { key, label, description: description2 };
623
+ setCreatedThemeMeta((current) => ({ ...current, [String(key)]: meta }));
624
+ theme.update({
625
+ themes: nextThemes,
626
+ mode: key,
627
+ colorScheme: preset.base,
628
+ accent: preset.accent,
629
+ density: preset.density,
630
+ intensity: preset.intensity,
631
+ radius: preset.radius,
632
+ font: preset.font,
633
+ tokens: preset.tokens
634
+ });
635
+ setCustomAccent(draftAccent);
636
+ onCreateTheme?.({ ...meta, preset, presetOption });
637
+ clearCreateState();
638
+ };
639
+ const resetTheme = () => {
640
+ clearCreateState();
641
+ theme.reset();
642
+ };
643
+ const rootClass = ["theme-panel", compact && "compact", className].filter(Boolean).join(" ");
644
+ const shadowScale = parseScaleToken(
645
+ theme.tokens["shadow-scale"] ?? readCssVar(rootRef.current, "--shadow-scale", "1")
646
+ );
647
+ const shadowFloatScale = parseScaleToken(
648
+ theme.tokens["shadow-float-scale"] ?? readCssVar(rootRef.current, "--shadow-float-scale", "1")
649
+ );
650
+ const updateThemeToken = (key, value) => {
651
+ theme.setTokens({ ...theme.tokens, [key]: value });
652
+ };
653
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: setRootRef, className: rootClass, ...rest, children: [
654
+ (title || description) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-head", children: [
655
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-title", children: [
656
+ /* @__PURE__ */ jsxRuntime.jsx(chunk6LARTGLP_cjs.Icon, { name: "sliders", size: 14 }),
657
+ title && /* @__PURE__ */ jsxRuntime.jsx("span", { children: title })
658
+ ] }),
659
+ description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-desc", children: description })
660
+ ] }),
661
+ sections.includes("mode") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
662
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
663
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u6A21\u5F0F" }),
664
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: theme.colorScheme })
665
+ ] }),
666
+ /* @__PURE__ */ jsxRuntime.jsx(
667
+ chunkVSUMJX6Z_cjs.RadioGroup,
668
+ {
669
+ variant: "segmented",
670
+ size: "sm",
671
+ value: modeValue,
672
+ options: modeOptions.map((option) => ({
673
+ value: String(option.key),
674
+ label: option.label
675
+ })),
676
+ onChange: applyMode
677
+ }
678
+ )
679
+ ] }),
680
+ sections.includes("presets") && (resolvedPresetOptions.length > 0 || allowCreateTheme) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
681
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
682
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u4E3B\u9898\u9884\u8BBE" }),
683
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: modeValue })
684
+ ] }),
685
+ resolvedPresetOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-presets", children: resolvedPresetOptions.map((option) => {
686
+ const key = String(option.key);
687
+ const preset = option.preset ?? theme.themes[key];
688
+ const active = modeValue === key;
689
+ const deletable = allowDeleteTheme && !protectedPresetKeys.has(key) && key in theme.themes;
690
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `theme-panel-preset-shell ${deletable ? "deletable" : ""}`, children: [
691
+ /* @__PURE__ */ jsxRuntime.jsxs(
692
+ chunk2ZADGBUN_cjs.Button,
693
+ {
694
+ type: "button",
695
+ variant: "ghost",
696
+ size: "sm",
697
+ className: `theme-panel-preset ${active ? "active" : ""}`,
698
+ onClick: () => applyPreset(option),
699
+ children: [
700
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-preset-ink", "aria-hidden": true, children: [
701
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { background: preset?.tokens?.bg ?? "var(--bg)" } }),
702
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { background: preset?.tokens?.["bg-raised"] ?? "var(--bg-raised)" } }),
703
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { background: accentFromPreset(preset) } })
704
+ ] }),
705
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-preset-copy", children: [
706
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label }),
707
+ option.description && /* @__PURE__ */ jsxRuntime.jsx("small", { children: option.description })
708
+ ] })
709
+ ]
710
+ }
711
+ ),
712
+ deletable && /* @__PURE__ */ jsxRuntime.jsx(
713
+ chunk2ZADGBUN_cjs.Button,
714
+ {
715
+ type: "button",
716
+ variant: "danger",
717
+ size: "sm",
718
+ icon: "trash",
719
+ iconOnly: true,
720
+ tip: `\u5220\u9664 ${nodeToText(option.label, fallbackPresetLabel(key))}`,
721
+ className: "theme-panel-preset-delete",
722
+ onClick: () => deletePreset(option)
723
+ }
724
+ )
725
+ ] }, key);
726
+ }) }),
727
+ allowCreateTheme && !isCreatingTheme && /* @__PURE__ */ jsxRuntime.jsx(chunk2ZADGBUN_cjs.Button, { type: "button", variant: "primary", size: "sm", icon: "plus", block: true, onClick: beginCreateTheme, children: "\u65B0\u5EFA\u4E3B\u9898" }),
728
+ allowCreateTheme && isCreatingTheme && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create", children: [
729
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-head", children: [
730
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
731
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u65B0\u5EFA\u4E3B\u9898" }),
732
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: previewDraft ? "\u5B9E\u65F6\u9884\u89C8\u4E2D" : "\u9884\u89C8\u5DF2\u6682\u505C" })
733
+ ] }),
734
+ /* @__PURE__ */ jsxRuntime.jsx(
735
+ chunk6GQPF3EI_cjs.Switch,
736
+ {
737
+ size: "sm",
738
+ checked: previewDraft,
739
+ onChange: toggleDraftPreview,
740
+ checkedChildren: "\u9884\u89C8",
741
+ unCheckedChildren: "\u505C"
742
+ }
743
+ )
744
+ ] }),
745
+ /* @__PURE__ */ jsxRuntime.jsx(
746
+ chunkVAXWWJJP_cjs.Input,
747
+ {
748
+ size: "sm",
749
+ value: draftName,
750
+ onValueChange: setDraftName,
751
+ placeholder: "\u8F93\u5165\u4E3B\u9898\u540D\u79F0",
752
+ leadingIcon: "palette",
753
+ allowClear: true
754
+ }
755
+ ),
756
+ /* @__PURE__ */ jsxRuntime.jsx(
757
+ chunkVSUMJX6Z_cjs.RadioGroup,
758
+ {
759
+ className: "theme-panel-create-mode",
760
+ variant: "segmented",
761
+ size: "sm",
762
+ value: createMode,
763
+ options: THEME_CREATE_MODE_OPTIONS.map((option) => ({
764
+ value: option.value,
765
+ label: option.label
766
+ })),
767
+ onChange: setCreateMode
768
+ }
769
+ ),
770
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
771
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u57FA\u5E95" }),
772
+ /* @__PURE__ */ jsxRuntime.jsx(
773
+ chunkVSUMJX6Z_cjs.RadioGroup,
774
+ {
775
+ variant: "segmented",
776
+ size: "sm",
777
+ value: draftBase,
778
+ options: [
779
+ { value: "light", label: "\u6D45" },
780
+ { value: "dark", label: "\u6DF1" }
781
+ ],
782
+ onChange: updateDraftBase
783
+ }
784
+ )
785
+ ] }),
786
+ createMode === "simple" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-grid", children: [
787
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
788
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8868\u9762" }),
789
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMYHBC3HA_cjs.ColorPicker, { size: "sm", value: draftSurface, onChange: updateDraftSurface })
790
+ ] }),
791
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
792
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5F3A\u8C03" }),
793
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMYHBC3HA_cjs.ColorPicker, { size: "sm", value: draftAccent, onChange: updateDraftAccent })
794
+ ] })
795
+ ] }),
796
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-sliders", children: [
797
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
798
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u9634\u5F71\u5F3A\u5EA6" }),
799
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: draftIntensity })
800
+ ] }),
801
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZWCDB5PP_cjs.Slider, { value: draftIntensity, onChange: setDraftIntensity, min: 1, max: 10, step: 1 }),
802
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
803
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5706\u89D2" }),
804
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
805
+ draftRadius,
806
+ "px"
807
+ ] })
808
+ ] }),
809
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZWCDB5PP_cjs.Slider, { value: draftRadius, onChange: setDraftRadius, min: 8, max: 36, step: 2 })
810
+ ] }),
811
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
812
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5BC6\u5EA6" }),
813
+ /* @__PURE__ */ jsxRuntime.jsx(
814
+ chunkVSUMJX6Z_cjs.RadioGroup,
815
+ {
816
+ variant: "segmented",
817
+ size: "sm",
818
+ value: draftDensity,
819
+ options: DENSITY_OPTIONS.map((option) => ({ value: option.value, label: option.label })),
820
+ onChange: setDraftDensity
821
+ }
822
+ )
823
+ ] }),
824
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
825
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5B57\u4F53" }),
826
+ /* @__PURE__ */ jsxRuntime.jsx(
827
+ chunkVSUMJX6Z_cjs.RadioGroup,
828
+ {
829
+ variant: "segmented",
830
+ size: "sm",
831
+ value: toFontKey(draftFont),
832
+ options: FONT_OPTIONS.map((option) => ({ value: option.value, label: option.label })),
833
+ onChange: (value) => setDraftFont(value)
834
+ }
835
+ )
836
+ ] }),
837
+ createMode === "advanced" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced", children: [
838
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-section compact", children: [
839
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-title", children: [
840
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5B57\u4F53" }),
841
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: advancedFontMode === "preset" ? "\u9009\u62E9\u5185\u7F6E\u5B57\u4F53" : "\u586B\u5199 CSS font-family" })
842
+ ] }),
843
+ /* @__PURE__ */ jsxRuntime.jsx(
844
+ chunkVSUMJX6Z_cjs.RadioGroup,
845
+ {
846
+ className: "theme-panel-create-mode",
847
+ variant: "segmented",
848
+ size: "sm",
849
+ value: advancedFontMode,
850
+ options: ADVANCED_FONT_MODE_OPTIONS.map((option) => ({
851
+ value: option.value,
852
+ label: option.label
853
+ })),
854
+ onChange: (value) => {
855
+ setAdvancedFontMode(value);
856
+ if (value === "preset") setDraftFont(toFontKey(draftFont));
857
+ }
858
+ }
859
+ ),
860
+ advancedFontMode === "custom" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-field", children: [
861
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5B57\u4F53\u6808" }),
862
+ /* @__PURE__ */ jsxRuntime.jsx(
863
+ chunkVAXWWJJP_cjs.Input,
864
+ {
865
+ size: "sm",
866
+ value: fontConfigToText(draftFont),
867
+ onValueChange: (value) => setDraftFont(value || "system"),
868
+ placeholder: "CSS font-family"
869
+ }
870
+ )
871
+ ] })
872
+ ] }),
873
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-section", children: [
874
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-title", children: [
875
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8868\u9762 tokens" }),
876
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: "\u5B8C\u6574\u8986\u5199 --bg / --fg" })
877
+ ] }),
878
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-token-grid", children: SURFACE_TOKEN_FIELDS.map((field) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-token-field", children: [
879
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-label", children: [
880
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: field.label }),
881
+ /* @__PURE__ */ jsxRuntime.jsxs("code", { children: [
882
+ "--",
883
+ field.key
884
+ ] })
885
+ ] }),
886
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-input", children: [
887
+ /* @__PURE__ */ jsxRuntime.jsx(
888
+ chunkMYHBC3HA_cjs.ColorPicker,
889
+ {
890
+ className: "theme-panel-token-picker",
891
+ value: tokenPickerValue(draftTokens[field.key], draftSurface),
892
+ onChange: (value) => updateDraftToken(field.key, value),
893
+ placement: "left",
894
+ "aria-label": `\u9009\u62E9 ${field.label}`,
895
+ children: /* @__PURE__ */ jsxRuntime.jsx(
896
+ "span",
897
+ {
898
+ className: "theme-panel-token-swatch",
899
+ style: { background: draftTokens[field.key] }
900
+ }
901
+ )
902
+ }
903
+ ),
904
+ /* @__PURE__ */ jsxRuntime.jsx(
905
+ chunkVAXWWJJP_cjs.Input,
906
+ {
907
+ size: "sm",
908
+ value: draftTokens[field.key] ?? "",
909
+ onValueChange: (value) => updateDraftToken(field.key, value)
910
+ }
911
+ )
912
+ ] })
913
+ ] }, field.key)) })
914
+ ] }),
915
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-section", children: [
916
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-title", children: [
917
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u9634\u5F71\u7CFB\u7EDF" }),
918
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: "\u6697/\u4EAE\u9634\u5F71\u4E0E\u5C42\u7EA7\u7F29\u653E" })
919
+ ] }),
920
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-token-grid", children: SHADOW_TOKEN_FIELDS.map(
921
+ (field) => field.kind === "color" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-token-field", children: [
922
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-label", children: [
923
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: field.label }),
924
+ /* @__PURE__ */ jsxRuntime.jsxs("code", { children: [
925
+ "--",
926
+ field.key
927
+ ] })
928
+ ] }),
929
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-input", children: [
930
+ /* @__PURE__ */ jsxRuntime.jsx(
931
+ chunkMYHBC3HA_cjs.ColorPicker,
932
+ {
933
+ className: "theme-panel-token-picker",
934
+ value: tokenPickerValue(draftTokens[field.key], draftSurface),
935
+ onChange: (value) => updateDraftToken(field.key, value),
936
+ placement: "left",
937
+ "aria-label": `\u9009\u62E9 ${field.label}`,
938
+ children: /* @__PURE__ */ jsxRuntime.jsx(
939
+ "span",
940
+ {
941
+ className: "theme-panel-token-swatch",
942
+ style: { background: draftTokens[field.key] }
943
+ }
944
+ )
945
+ }
946
+ ),
947
+ /* @__PURE__ */ jsxRuntime.jsx(
948
+ chunkVAXWWJJP_cjs.Input,
949
+ {
950
+ size: "sm",
951
+ value: draftTokens[field.key] ?? "",
952
+ onValueChange: (value) => updateDraftToken(field.key, value)
953
+ }
954
+ )
955
+ ] })
956
+ ] }, field.key) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-token-field scale", children: [
957
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-label", children: [
958
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: field.label }),
959
+ /* @__PURE__ */ jsxRuntime.jsxs("code", { children: [
960
+ "--",
961
+ field.key
962
+ ] })
963
+ ] }),
964
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-scale", children: [
965
+ /* @__PURE__ */ jsxRuntime.jsx(
966
+ chunkVAXWWJJP_cjs.Input,
967
+ {
968
+ size: "sm",
969
+ value: draftTokens[field.key] ?? "1",
970
+ onValueChange: (value) => updateDraftToken(field.key, value || "1")
971
+ }
972
+ ),
973
+ /* @__PURE__ */ jsxRuntime.jsx(
974
+ chunkZWCDB5PP_cjs.Slider,
975
+ {
976
+ value: parseScaleToken(draftTokens[field.key]),
977
+ onChange: (value) => updateDraftToken(field.key, formatScaleToken(value)),
978
+ min: 0.6,
979
+ max: field.key === "shadow-float-scale" ? 1.8 : 1.6,
980
+ step: 0.05
981
+ }
982
+ )
983
+ ] })
984
+ ] }, field.key)
985
+ ) })
986
+ ] }),
987
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-section", children: [
988
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-advanced-title", children: [
989
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5F3A\u8C03 palette" }),
990
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: "\u5B8C\u6574\u8986\u5199 accent / ink / soft / glow" })
991
+ ] }),
992
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-token-grid", children: ACCENT_PALETTE_FIELDS.map((field) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-token-field", children: [
993
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-label", children: [
994
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: field.label }),
995
+ /* @__PURE__ */ jsxRuntime.jsxs("code", { children: [
996
+ "accent.",
997
+ field.key
998
+ ] })
999
+ ] }),
1000
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-token-input", children: [
1001
+ /* @__PURE__ */ jsxRuntime.jsx(
1002
+ chunkMYHBC3HA_cjs.ColorPicker,
1003
+ {
1004
+ className: "theme-panel-token-picker",
1005
+ value: tokenPickerValue(draftAccentPalette[field.key], draftAccent),
1006
+ onChange: (value) => updateDraftAccentSlot(field.key, value),
1007
+ placement: "left",
1008
+ "aria-label": `\u9009\u62E9 ${field.label}`,
1009
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1010
+ "span",
1011
+ {
1012
+ className: "theme-panel-token-swatch",
1013
+ style: { background: draftAccentPalette[field.key] }
1014
+ }
1015
+ )
1016
+ }
1017
+ ),
1018
+ /* @__PURE__ */ jsxRuntime.jsx(
1019
+ chunkVAXWWJJP_cjs.Input,
1020
+ {
1021
+ size: "sm",
1022
+ value: draftAccentPalette[field.key],
1023
+ onValueChange: (value) => updateDraftAccentSlot(field.key, value)
1024
+ }
1025
+ )
1026
+ ] })
1027
+ ] }, field.key)) })
1028
+ ] })
1029
+ ] }),
1030
+ /* @__PURE__ */ jsxRuntime.jsxs(
1031
+ "div",
1032
+ {
1033
+ className: "theme-panel-create-preview",
1034
+ style: {
1035
+ "--preview-bg": draftTokens.bg,
1036
+ "--preview-fg": draftTokens.fg,
1037
+ "--preview-accent": draftAccentPalette.accent,
1038
+ "--preview-radius": `${draftRadius}px`,
1039
+ "--preview-shadow-dark": draftTokens["shadow-dark"],
1040
+ "--preview-shadow-light": draftTokens["shadow-light"],
1041
+ "--preview-shadow-scale": draftTokens["shadow-scale"] ?? "1",
1042
+ "--preview-accent-glow": draftAccentPalette.glow,
1043
+ "--preview-font": fontToStack(draftFont)
1044
+ },
1045
+ children: [
1046
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "theme-panel-create-preview-label", children: [
1047
+ /* @__PURE__ */ jsxRuntime.jsx(chunk6LARTGLP_cjs.Icon, { name: "palette", size: 13 }),
1048
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: draftName.trim() || "\u81EA\u5B9A\u4E49\u4E3B\u9898" })
1049
+ ] }),
1050
+ /* @__PURE__ */ jsxRuntime.jsx("i", { "aria-hidden": true })
1051
+ ]
1052
+ }
1053
+ ),
1054
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-create-actions", children: [
1055
+ /* @__PURE__ */ jsxRuntime.jsx(chunk2ZADGBUN_cjs.Button, { type: "button", variant: "ghost", size: "sm", icon: "x", onClick: cancelCreateTheme, children: "\u53D6\u6D88" }),
1056
+ /* @__PURE__ */ jsxRuntime.jsx(
1057
+ chunk2ZADGBUN_cjs.Button,
1058
+ {
1059
+ type: "button",
1060
+ variant: "primary",
1061
+ size: "sm",
1062
+ icon: "check",
1063
+ onClick: saveCustomTheme,
1064
+ disabled: !draftName.trim(),
1065
+ children: "\u4FDD\u5B58\u4E3B\u9898"
1066
+ }
1067
+ )
1068
+ ] })
1069
+ ] })
1070
+ ] }),
1071
+ sections.includes("accent") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
1072
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1073
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5F3A\u8C03\u8272" }),
1074
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: theme.accent === "custom" ? customAccent : theme.accent })
1075
+ ] }),
1076
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-swatches", children: [
1077
+ Object.keys(chunkN2COYOXE_cjs.ACCENT_PRESETS).map((key) => /* @__PURE__ */ jsxRuntime.jsx(
1078
+ chunk2ZADGBUN_cjs.Button,
1079
+ {
1080
+ type: "button",
1081
+ size: "sm",
1082
+ "aria-label": key,
1083
+ className: `theme-panel-swatch ${theme.accent === key ? "active" : ""}`,
1084
+ style: { background: chunkN2COYOXE_cjs.ACCENT_PRESETS[key].accent },
1085
+ onClick: () => theme.setAccent(key)
1086
+ },
1087
+ key
1088
+ )),
1089
+ /* @__PURE__ */ jsxRuntime.jsx(
1090
+ chunkMYHBC3HA_cjs.ColorPicker,
1091
+ {
1092
+ size: "sm",
1093
+ value: customAccent,
1094
+ onChange: (value) => {
1095
+ setCustomAccent(value);
1096
+ theme.setAccent(value);
1097
+ }
1098
+ }
1099
+ )
1100
+ ] })
1101
+ ] }),
1102
+ sections.includes("shadow") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row theme-panel-shadow", children: [
1103
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1104
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u9634\u5F71\u5F3A\u5EA6" }),
1105
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: theme.intensity })
1106
+ ] }),
1107
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZWCDB5PP_cjs.Slider, { value: theme.intensity, onChange: theme.setIntensity, min: 1, max: 10, step: 1 }),
1108
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1109
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u9634\u5F71\u6269\u6563" }),
1110
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1111
+ formatScaleToken(shadowScale),
1112
+ "x"
1113
+ ] })
1114
+ ] }),
1115
+ /* @__PURE__ */ jsxRuntime.jsx(
1116
+ chunkZWCDB5PP_cjs.Slider,
1117
+ {
1118
+ value: shadowScale,
1119
+ onChange: (value) => updateThemeToken("shadow-scale", formatScaleToken(value)),
1120
+ min: 0.6,
1121
+ max: 1.6,
1122
+ step: 0.05
1123
+ }
1124
+ ),
1125
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1126
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u6D6E\u5C42\u6DF1\u5EA6" }),
1127
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1128
+ formatScaleToken(shadowFloatScale),
1129
+ "x"
1130
+ ] })
1131
+ ] }),
1132
+ /* @__PURE__ */ jsxRuntime.jsx(
1133
+ chunkZWCDB5PP_cjs.Slider,
1134
+ {
1135
+ value: shadowFloatScale,
1136
+ onChange: (value) => updateThemeToken("shadow-float-scale", formatScaleToken(value)),
1137
+ min: 0.6,
1138
+ max: 1.8,
1139
+ step: 0.05
1140
+ }
1141
+ )
1142
+ ] }),
1143
+ sections.includes("intensity") && !sections.includes("shadow") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
1144
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1145
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u9634\u5F71" }),
1146
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: theme.intensity })
1147
+ ] }),
1148
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZWCDB5PP_cjs.Slider, { value: theme.intensity, onChange: theme.setIntensity, min: 1, max: 10, step: 1 })
1149
+ ] }),
1150
+ sections.includes("radius") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
1151
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-label", children: [
1152
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5706\u89D2" }),
1153
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1154
+ theme.radius,
1155
+ "px"
1156
+ ] })
1157
+ ] }),
1158
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZWCDB5PP_cjs.Slider, { value: theme.radius, onChange: theme.setRadius, min: 8, max: 36, step: 2 })
1159
+ ] }),
1160
+ sections.includes("font") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
1161
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-label", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5B57\u4F53" }) }),
1162
+ /* @__PURE__ */ jsxRuntime.jsx(
1163
+ chunkVSUMJX6Z_cjs.RadioGroup,
1164
+ {
1165
+ variant: "segmented",
1166
+ size: "sm",
1167
+ value: typeof theme.font === "string" ? theme.font : "system",
1168
+ options: FONT_OPTIONS.map((option) => ({ value: option.value, label: option.label })),
1169
+ onChange: (value) => theme.setFont(value)
1170
+ }
1171
+ )
1172
+ ] }),
1173
+ sections.includes("density") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "theme-panel-row", children: [
1174
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "theme-panel-label", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u5BC6\u5EA6" }) }),
1175
+ /* @__PURE__ */ jsxRuntime.jsx(
1176
+ chunkVSUMJX6Z_cjs.RadioGroup,
1177
+ {
1178
+ variant: "segmented",
1179
+ size: "sm",
1180
+ value: theme.density,
1181
+ options: DENSITY_OPTIONS.map((option) => ({ value: option.value, label: option.label })),
1182
+ onChange: theme.setDensity
1183
+ }
1184
+ )
1185
+ ] }),
1186
+ showReset && /* @__PURE__ */ jsxRuntime.jsx(chunk2ZADGBUN_cjs.Button, { type: "button", variant: "ghost", size: "sm", icon: "reload", block: true, onClick: resetTheme, children: "\u91CD\u7F6E\u4E3B\u9898" })
1187
+ ] });
1188
+ }
1189
+ );
1190
+ ThemePanel.displayName = "ThemePanel";
1191
+
1192
+ exports.THEME_PANEL_DEFAULT_PRESET_OPTIONS = THEME_PANEL_DEFAULT_PRESET_OPTIONS;
1193
+ exports.THEME_PANEL_DEFAULT_THEME_PRESETS = THEME_PANEL_DEFAULT_THEME_PRESETS;
1194
+ exports.ThemePanel = ThemePanel;