@fangxinyan/lumina 0.6.7 → 0.6.8

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 (219) hide show
  1. package/dist/Alert.cjs +3 -3
  2. package/dist/Alert.js +2 -2
  3. package/dist/AppShell.cjs +5 -5
  4. package/dist/AppShell.js +1 -1
  5. package/dist/AutoComplete.cjs +5 -5
  6. package/dist/AutoComplete.js +4 -4
  7. package/dist/Avatar.cjs +2 -2
  8. package/dist/Avatar.js +1 -1
  9. package/dist/Badge.cjs +2 -2
  10. package/dist/Badge.js +1 -1
  11. package/dist/Button.cjs +7 -3
  12. package/dist/Button.d.cts +13 -1
  13. package/dist/Button.d.ts +13 -1
  14. package/dist/Button.js +2 -2
  15. package/dist/Calendar.cjs +3 -3
  16. package/dist/Calendar.js +2 -2
  17. package/dist/Card.cjs +3 -3
  18. package/dist/Card.js +2 -2
  19. package/dist/Cascader.cjs +5 -5
  20. package/dist/Cascader.js +4 -4
  21. package/dist/Checkbox.cjs +3 -3
  22. package/dist/Checkbox.js +2 -2
  23. package/dist/Collapse.cjs +3 -3
  24. package/dist/Collapse.js +2 -2
  25. package/dist/ColorPicker.cjs +2 -2
  26. package/dist/ColorPicker.js +1 -1
  27. package/dist/CommandPalette.cjs +5 -5
  28. package/dist/CommandPalette.js +4 -4
  29. package/dist/ContextMenu.cjs +2 -2
  30. package/dist/ContextMenu.js +1 -1
  31. package/dist/Divider.cjs +2 -2
  32. package/dist/Divider.js +1 -1
  33. package/dist/Drawer.cjs +3 -3
  34. package/dist/Drawer.js +2 -2
  35. package/dist/Empty.cjs +2 -2
  36. package/dist/Empty.js +1 -1
  37. package/dist/Form.cjs +4 -4
  38. package/dist/Form.js +1 -1
  39. package/dist/Icon.cjs +49 -49
  40. package/dist/Icon.js +1 -1
  41. package/dist/Image.cjs +6 -6
  42. package/dist/Image.js +2 -2
  43. package/dist/Input.cjs +5 -5
  44. package/dist/Input.js +3 -3
  45. package/dist/InputNumber.cjs +5 -5
  46. package/dist/InputNumber.js +4 -4
  47. package/dist/List.cjs +2 -2
  48. package/dist/List.js +1 -1
  49. package/dist/Message.cjs +6 -6
  50. package/dist/Message.js +2 -2
  51. package/dist/Modal.cjs +4 -4
  52. package/dist/Modal.js +3 -3
  53. package/dist/Pagination.cjs +7 -7
  54. package/dist/Pagination.js +6 -6
  55. package/dist/Popover.cjs +2 -2
  56. package/dist/Popover.js +1 -1
  57. package/dist/Progress.cjs +2 -2
  58. package/dist/Progress.js +1 -1
  59. package/dist/Radio.cjs +3 -3
  60. package/dist/Radio.js +1 -1
  61. package/dist/Select.cjs +6 -6
  62. package/dist/Select.js +5 -5
  63. package/dist/Skeleton.cjs +2 -2
  64. package/dist/Skeleton.js +1 -1
  65. package/dist/Slider.cjs +2 -2
  66. package/dist/Slider.js +1 -1
  67. package/dist/Spin.cjs +2 -2
  68. package/dist/Spin.js +1 -1
  69. package/dist/Splitter.cjs +2 -2
  70. package/dist/Splitter.js +1 -1
  71. package/dist/StatusBar.cjs +3 -3
  72. package/dist/StatusBar.js +1 -1
  73. package/dist/Surface.cjs +4 -4
  74. package/dist/Surface.js +2 -2
  75. package/dist/Switch.cjs +2 -2
  76. package/dist/Switch.js +1 -1
  77. package/dist/Table.cjs +9 -9
  78. package/dist/Table.js +8 -8
  79. package/dist/TablePro.cjs +10 -10
  80. package/dist/TablePro.d.cts +11 -7
  81. package/dist/TablePro.d.ts +11 -7
  82. package/dist/TablePro.js +9 -9
  83. package/dist/Tabs.cjs +2 -2
  84. package/dist/Tabs.js +1 -1
  85. package/dist/Tag.cjs +3 -3
  86. package/dist/Tag.js +2 -2
  87. package/dist/Textarea.cjs +4 -4
  88. package/dist/Textarea.js +2 -2
  89. package/dist/Theme.cjs +11 -11
  90. package/dist/Theme.js +1 -1
  91. package/dist/{ThemePanel-76LB3YA5.css → ThemePanel-TEHB2JCQ.css} +68 -0
  92. package/dist/ThemePanel.cjs +13 -13
  93. package/dist/ThemePanel.d.cts +12 -2
  94. package/dist/ThemePanel.d.ts +12 -2
  95. package/dist/ThemePanel.js +10 -10
  96. package/dist/Timeline.cjs +3 -3
  97. package/dist/Timeline.js +2 -2
  98. package/dist/Tooltip.cjs +2 -2
  99. package/dist/Tooltip.js +1 -1
  100. package/dist/Typography.cjs +7 -7
  101. package/dist/Typography.js +2 -2
  102. package/dist/{chunk-MOMLQP7B.cjs → chunk-2EY34PPA.cjs} +1 -1
  103. package/dist/{chunk-IHK2FRTS.cjs → chunk-2LM5UYNU.cjs} +1 -1
  104. package/dist/{chunk-Y5F7ZTBH.js → chunk-3GJZRYTD.js} +1 -1
  105. package/dist/{chunk-D5PCIVID.cjs → chunk-3HPHQV2L.cjs} +3 -3
  106. package/dist/{chunk-DYHNOYRC.cjs → chunk-3NSBPQBT.cjs} +6 -6
  107. package/dist/{chunk-LI4XJTEA.js → chunk-3VXBSLPT.js} +3 -3
  108. package/dist/{chunk-YVTLHTG6.js → chunk-44WHEN76.js} +1 -1
  109. package/dist/{chunk-NT6CJYI3.cjs → chunk-4LOOWTRX.cjs} +4 -4
  110. package/dist/{chunk-U2H4DRMV.cjs → chunk-4N64ZL5M.cjs} +1 -1
  111. package/dist/{chunk-6XVLERA3.cjs → chunk-5C3ZSOKF.cjs} +1 -1
  112. package/dist/{chunk-2ZFJTMEF.js → chunk-5CWTC3I2.js} +3 -3
  113. package/dist/{chunk-ZPKHGKVL.cjs → chunk-5KGGB3EH.cjs} +3 -3
  114. package/dist/{chunk-W5CJC7S7.js → chunk-62RPBEAW.js} +2 -2
  115. package/dist/{chunk-NE7IUGMK.js → chunk-64ZQHLHL.js} +2 -2
  116. package/dist/{chunk-YJEXAO2I.js → chunk-6VSNO7IH.js} +1 -1
  117. package/dist/{chunk-3YP7CBJT.js → chunk-762NV3E4.js} +2 -2
  118. package/dist/{chunk-SYWTT5TY.cjs → chunk-76OH42CM.cjs} +4 -4
  119. package/dist/{chunk-56PHETWO.js → chunk-7DNK5JB2.js} +2 -2
  120. package/dist/{chunk-I4M2RL2X.js → chunk-7IWYBQAE.js} +2 -2
  121. package/dist/{chunk-VAXWWJJP.cjs → chunk-7OYMY22O.cjs} +8 -8
  122. package/dist/{chunk-L27C5O4W.cjs → chunk-7UCXY4T5.cjs} +3 -3
  123. package/dist/{chunk-7NZ2A4MA.js → chunk-7ZCTEIOW.js} +1 -1
  124. package/dist/{chunk-QY76WTO5.cjs → chunk-AA2FRQUQ.cjs} +8 -8
  125. package/dist/{chunk-SABWUELE.js → chunk-ACZA7HHP.js} +1 -1
  126. package/dist/{chunk-GZCU6HXD.js → chunk-AHS2AFTD.js} +1 -1
  127. package/dist/{chunk-YSCIMHOI.cjs → chunk-AYZ4BWHG.cjs} +4 -4
  128. package/dist/{chunk-J7EQJXSJ.js → chunk-BKI7JY4Z.js} +2 -2
  129. package/dist/{chunk-NFXHIO3G.js → chunk-BY2YW5XN.js} +1 -1
  130. package/dist/{chunk-OGPDCBPD.cjs → chunk-CPBFUKSX.cjs} +11 -11
  131. package/dist/{chunk-R74TZKJS.cjs → chunk-D56CNYUP.cjs} +3 -3
  132. package/dist/{chunk-4UKM4KAC.cjs → chunk-DDCAHAAE.cjs} +1 -1
  133. package/dist/{chunk-N2COYOXE.cjs → chunk-DGB6KVU3.cjs} +1 -1
  134. package/dist/{chunk-PNZJFLMY.js → chunk-EXN64ADJ.js} +2 -2
  135. package/dist/{chunk-LFTCK2VM.cjs → chunk-F3DN2JGE.cjs} +489 -238
  136. package/dist/{chunk-IDJCFYPP.cjs → chunk-F65KYGPX.cjs} +14 -14
  137. package/dist/{chunk-RIUDYPRB.cjs → chunk-FJHFUES7.cjs} +1 -1
  138. package/dist/{chunk-66GXZQKL.cjs → chunk-FL25IGIG.cjs} +3 -3
  139. package/dist/{chunk-REMJWNAT.js → chunk-FPII6I52.js} +3 -3
  140. package/dist/{chunk-YSXD344H.js → chunk-FZITSOKH.js} +4 -4
  141. package/dist/{chunk-2NT5QKEX.js → chunk-GEANNF4T.js} +2 -2
  142. package/dist/{chunk-6LARTGLP.cjs → chunk-GJAEGIPM.cjs} +1 -1
  143. package/dist/{chunk-PVOQWCP2.cjs → chunk-GT34KAMX.cjs} +3 -3
  144. package/dist/{chunk-TVUBGXWA.js → chunk-GVPGJXZT.js} +1 -1
  145. package/dist/{chunk-6GQPF3EI.cjs → chunk-HFM4YKM5.cjs} +1 -1
  146. package/dist/{chunk-2SCXQ7QS.js → chunk-HR5QBBIS.js} +1 -1
  147. package/dist/{chunk-ACQSRMLF.cjs → chunk-HTW62OMX.cjs} +4 -4
  148. package/dist/{chunk-VNNQYJLT.js → chunk-I5XCHN67.js} +2 -2
  149. package/dist/{chunk-N3OLFKV5.cjs → chunk-IMAGOTLP.cjs} +1 -1
  150. package/dist/{chunk-Z4PZ2ZHI.cjs → chunk-J2R3BEEH.cjs} +1 -1
  151. package/dist/{chunk-PEJLXJQD.js → chunk-JPAYPF6H.js} +1 -1
  152. package/dist/{chunk-YNCDTKAE.cjs → chunk-JWZ6HJIF.cjs} +1 -1
  153. package/dist/{chunk-S6OKX4H7.cjs → chunk-KOY7GNP3.cjs} +1 -1
  154. package/dist/{chunk-NDO22RER.cjs → chunk-LF3ATJFY.cjs} +1 -1
  155. package/dist/{chunk-5NFSDFBB.cjs → chunk-LW6Z2WDZ.cjs} +3 -3
  156. package/dist/{chunk-YUKXNWVE.cjs → chunk-MLOT2AGK.cjs} +1 -1
  157. package/dist/{chunk-7D76MI37.js → chunk-MOLKLUSQ.js} +4 -4
  158. package/dist/{chunk-SG42F5VB.cjs → chunk-MZCKPLHQ.cjs} +1 -1
  159. package/dist/chunk-N24KHD5B.js +84 -0
  160. package/dist/{chunk-C24W6PTJ.cjs → chunk-N4JH6HHA.cjs} +1 -1
  161. package/dist/{chunk-5JNDDWFZ.js → chunk-NUF3EA7T.js} +2 -2
  162. package/dist/chunk-NUNPFMCM.cjs +106 -0
  163. package/dist/{chunk-AJH2O4WC.js → chunk-OVTB7FQQ.js} +2 -2
  164. package/dist/{chunk-HFUHQUPQ.js → chunk-P434GBHP.js} +1 -1
  165. package/dist/{chunk-66T76GII.cjs → chunk-PEFIXNAV.cjs} +6 -6
  166. package/dist/{chunk-WXWFMWWF.js → chunk-PHONNUK2.js} +2 -2
  167. package/dist/{chunk-MYRLCN6V.js → chunk-PWPL3DRN.js} +1 -1
  168. package/dist/{chunk-HU7T64Y3.js → chunk-Q5KHJ32P.js} +1 -1
  169. package/dist/{chunk-OHFZ7L4T.js → chunk-Q77BWQNG.js} +1 -1
  170. package/dist/{chunk-XVP7IKLZ.js → chunk-QDXBI3PV.js} +3 -3
  171. package/dist/{chunk-PKHITACT.js → chunk-QKWRN2JL.js} +1 -1
  172. package/dist/{chunk-7ZNGHWVS.js → chunk-R53WIZY5.js} +1 -1
  173. package/dist/{chunk-LQLOOUS3.js → chunk-RYRBNMCC.js} +1 -1
  174. package/dist/{chunk-2ZADGBUN.cjs → chunk-S4CZ3VO6.cjs} +9 -4
  175. package/dist/{chunk-N4USDBY2.js → chunk-SGNDIRZC.js} +3 -3
  176. package/dist/{chunk-YT5NLCRC.js → chunk-SNX4FZYB.js} +1 -1
  177. package/dist/{chunk-WHXSUPJB.cjs → chunk-TDYJ5ECR.cjs} +3 -3
  178. package/dist/{chunk-KMG7OMOS.js → chunk-TJB7U72Z.js} +1 -1
  179. package/dist/{chunk-SFAGHPBT.js → chunk-TWJAYAK2.js} +1 -1
  180. package/dist/{chunk-JFQ53MO4.cjs → chunk-VM6CJYP6.cjs} +1 -1
  181. package/dist/{chunk-CNGKJYGZ.js → chunk-VRA4CQCJ.js} +7 -3
  182. package/dist/{chunk-YU5JK247.cjs → chunk-VUTCNATX.cjs} +6 -6
  183. package/dist/{chunk-CEZ2DR4R.js → chunk-W72IIGOV.js} +2 -2
  184. package/dist/{chunk-QP7RXZES.js → chunk-WIBAYFBB.js} +1 -1
  185. package/dist/{chunk-O43DOE7V.js → chunk-WIZVOZNO.js} +2 -2
  186. package/dist/{chunk-SQIWPU6V.js → chunk-XN52S7PT.js} +1 -1
  187. package/dist/{chunk-O4BOBOYV.cjs → chunk-XOYMBL5R.cjs} +1 -1
  188. package/dist/{chunk-MYHBC3HA.cjs → chunk-XPV672EI.cjs} +1 -1
  189. package/dist/{chunk-DYSGXQUK.cjs → chunk-XVDD6JEU.cjs} +6 -6
  190. package/dist/{chunk-ZWCDB5PP.cjs → chunk-XWRQ7ZLT.cjs} +1 -1
  191. package/dist/{chunk-N2BTMKF2.cjs → chunk-Z35Q432P.cjs} +4 -4
  192. package/dist/{chunk-VSUMJX6Z.cjs → chunk-ZC5VDX4W.cjs} +1 -1
  193. package/dist/{chunk-ZPP7LTHP.js → chunk-ZCMFLRZS.js} +2 -2
  194. package/dist/{chunk-5PR7UWIZ.cjs → chunk-ZGDAYWWC.cjs} +10 -10
  195. package/dist/{chunk-NJCHFXGC.js → chunk-ZTIECMCF.js} +455 -204
  196. package/dist/index.cjs +177 -173
  197. package/dist/index.d.cts +3 -3
  198. package/dist/index.d.ts +3 -3
  199. package/dist/index.js +48 -48
  200. package/dist/styles.css +78 -0
  201. package/dist/{tokens-EF34LSWI.css → tokens-RGFJKRC7.css} +21 -0
  202. package/dist/tokens.css +21 -0
  203. package/docs/llms/autocomplete.md +6 -0
  204. package/docs/llms/button.md +16 -4
  205. package/docs/llms/commandpalette.md +6 -0
  206. package/docs/llms/contextmenu.md +6 -0
  207. package/docs/llms/form.md +6 -0
  208. package/docs/llms/inputnumber.md +6 -0
  209. package/docs/llms/splitter.md +6 -0
  210. package/docs/llms/statusbar.md +6 -0
  211. package/docs/llms/tablepro.md +2 -0
  212. package/docs/llms/textarea.md +83 -0
  213. package/docs/llms/themepanel.md +26 -5
  214. package/docs/llms/timeline.md +6 -0
  215. package/docs/llms/typography.md +1 -1
  216. package/docs/llms.md +2 -1
  217. package/package.json +51 -1
  218. package/dist/chunk-D64IPDUE.cjs +0 -28
  219. package/dist/chunk-GUZ2DNDC.js +0 -26
@@ -1,15 +1,15 @@
1
- import { Slider } from './chunk-HU7T64Y3.js';
1
+ import { Slider } from './chunk-Q5KHJ32P.js';
2
2
  import { pickLuminaThemePresets } from './chunk-6SPMHY54.js';
3
- import { useTheme, ACCENT_PRESETS, FONT_STACKS } from './chunk-7NZ2A4MA.js';
4
- import { Switch } from './chunk-YJEXAO2I.js';
5
- import { RadioGroup } from './chunk-HFUHQUPQ.js';
6
- import { ColorPicker } from './chunk-GZCU6HXD.js';
7
- import { Input } from './chunk-XVP7IKLZ.js';
8
- import { Button } from './chunk-CNGKJYGZ.js';
9
- import { Icon } from './chunk-YT5NLCRC.js';
10
- import './tokens-EF34LSWI.css';
3
+ import { useTheme, ACCENT_PRESETS, FONT_STACKS } from './chunk-7ZCTEIOW.js';
4
+ import { Switch } from './chunk-6VSNO7IH.js';
5
+ import { RadioGroup } from './chunk-P434GBHP.js';
6
+ import { ColorPicker } from './chunk-AHS2AFTD.js';
7
+ import { Input } from './chunk-QDXBI3PV.js';
8
+ import { Button } from './chunk-VRA4CQCJ.js';
9
+ import { Icon } from './chunk-SNX4FZYB.js';
10
+ import './tokens-RGFJKRC7.css';
11
11
  import './shared-NJHRNLRH.css';
12
- import './ThemePanel-76LB3YA5.css';
12
+ import './ThemePanel-TEHB2JCQ.css';
13
13
  import * as React from 'react';
14
14
  import { jsxs, jsx } from 'react/jsx-runtime';
15
15
 
@@ -50,7 +50,8 @@ var DEFAULT_SECTIONS = [
50
50
  "shadow",
51
51
  "radius",
52
52
  "font",
53
- "density"
53
+ "density",
54
+ "advanced"
54
55
  ];
55
56
  var DEFAULT_MODE_OPTIONS = [
56
57
  { key: "light", label: "\u6D45\u8272" },
@@ -125,6 +126,10 @@ function createThemeKey(label, themes, prefix) {
125
126
  }
126
127
  return key;
127
128
  }
129
+ function createSaveAsLabel(label, fallback) {
130
+ const base = label.trim() || fallback.trim() || "\u81EA\u5B9A\u4E49\u4E3B\u9898";
131
+ return `${base} \u526F\u672C`;
132
+ }
128
133
  var clampColor = (value) => Math.min(1, Math.max(0, value));
129
134
  function normalizeHexColor(input) {
130
135
  const value = input.trim().replace(/^#/, "");
@@ -231,6 +236,12 @@ function defaultBaseTokens(base) {
231
236
  const tokens = THEME_PANEL_DEFAULT_THEME_PRESETS[base].tokens;
232
237
  return { ...tokens };
233
238
  }
239
+ function mergeBaseTokens(base, tokens) {
240
+ return {
241
+ ...defaultBaseTokens(base),
242
+ ...tokens ?? {}
243
+ };
244
+ }
234
245
  function createDraftSurfaceTokens(surface, base, sourceSurface, sourceTokens) {
235
246
  if (sameHexColor(surface, sourceSurface)) return { ...sourceTokens };
236
247
  const current = hexToRgbColor(surface);
@@ -306,6 +317,8 @@ var ThemePanel = React.forwardRef(
306
317
  onCreateTheme,
307
318
  allowDeleteTheme = true,
308
319
  onDeleteTheme,
320
+ allowUpdateTheme = true,
321
+ onUpdateTheme,
309
322
  showReset = true,
310
323
  compact,
311
324
  className = "",
@@ -318,6 +331,9 @@ var ThemePanel = React.forwardRef(
318
331
  updateThemeRef.current = theme.update;
319
332
  const [customAccent, setCustomAccent] = React.useState(defaultCustomAccent);
320
333
  const [createdThemeMeta, setCreatedThemeMeta] = React.useState({});
334
+ const [advancedOpen, setAdvancedOpen] = React.useState(false);
335
+ const [saveAsName, setSaveAsName] = React.useState("");
336
+ const [saveAsDescription, setSaveAsDescription] = React.useState("");
321
337
  const [isCreatingTheme, setIsCreatingTheme] = React.useState(false);
322
338
  const [previewDraft, setPreviewDraft] = React.useState(true);
323
339
  const [draftName, setDraftName] = React.useState(defaultCreateThemeName);
@@ -344,6 +360,7 @@ var ThemePanel = React.forwardRef(
344
360
  const [draftFont, setDraftFont] = React.useState("sf");
345
361
  const [createMode, setCreateMode] = React.useState("simple");
346
362
  const [advancedFontMode, setAdvancedFontMode] = React.useState("preset");
363
+ const [liveAdvancedFontMode, setLiveAdvancedFontMode] = React.useState("preset");
347
364
  const [draftBasePresets, setDraftBasePresets] = React.useState(() => ({
348
365
  light: THEME_PANEL_DEFAULT_THEME_PRESETS.light,
349
366
  dark: THEME_PANEL_DEFAULT_THEME_PRESETS.dark
@@ -353,6 +370,9 @@ var ThemePanel = React.forwardRef(
353
370
  () => /* @__PURE__ */ new Set(["system", ...THEME_PANEL_DEFAULT_PRESET_OPTIONS.map((option) => String(option.key))]),
354
371
  []
355
372
  );
373
+ React.useEffect(() => {
374
+ setLiveAdvancedFontMode(toFontKey(theme.font) === theme.font ? "preset" : "custom");
375
+ }, [theme.font]);
356
376
  const setRootRef = React.useCallback(
357
377
  (node) => {
358
378
  rootRef.current = node;
@@ -391,6 +411,17 @@ var ThemePanel = React.forwardRef(
391
411
  }));
392
412
  return [...builtIns, ...customOptions];
393
413
  }, [createdThemeMeta, presetOptions, theme.themes]);
414
+ const activePresetOption = React.useMemo(
415
+ () => resolvedPresetOptions.find((option) => String(option.key) === modeValue),
416
+ [modeValue, resolvedPresetOptions]
417
+ );
418
+ const liveAdvancedTokens = React.useMemo(
419
+ () => mergeBaseTokens(theme.colorScheme, theme.tokens),
420
+ [theme.colorScheme, theme.tokens]
421
+ );
422
+ const isCurrentSavedTheme = !protectedPresetKeys.has(modeValue) && Object.prototype.hasOwnProperty.call(theme.themes, modeValue);
423
+ const canUpdateCurrentTheme = allowUpdateTheme && isCurrentSavedTheme;
424
+ const canSaveCurrentThemeAsNew = allowCreateTheme;
394
425
  React.useEffect(() => {
395
426
  if (!isCreatingTheme || !previewDraft) return;
396
427
  updateThemeRef.current({
@@ -490,6 +521,123 @@ var ThemePanel = React.forwardRef(
490
521
  preset
491
522
  });
492
523
  };
524
+ const getActiveThemeMeta = () => {
525
+ const preset = theme.themes[modeValue] ?? theme.activeTheme ?? activePresetOption?.preset;
526
+ const fallbackLabel = preset?.label ?? fallbackPresetLabel(modeValue);
527
+ const fallbackDescription = preset?.description ?? (theme.colorScheme === "dark" ? "\u6DF1\u8272" : "\u6D45\u8272");
528
+ return {
529
+ key: modeValue,
530
+ label: nodeToText(activePresetOption?.label, fallbackLabel),
531
+ description: nodeToText(activePresetOption?.description, fallbackDescription)
532
+ };
533
+ };
534
+ const getAdvancedThemeName = () => {
535
+ const label = getActiveThemeMeta().label;
536
+ return isCurrentSavedTheme ? label || defaultCreateThemeName : createSaveAsLabel(label, defaultCreateThemeName);
537
+ };
538
+ const getAdvancedThemeDescription = () => {
539
+ const description2 = getActiveThemeMeta().description;
540
+ if (isCurrentSavedTheme) return description2;
541
+ return theme.colorScheme === "dark" ? "\u53E6\u5B58\u6697" : "\u53E6\u5B58\u4EAE";
542
+ };
543
+ const suggestedSaveAsName = getAdvancedThemeName();
544
+ const suggestedSaveAsDescription = getAdvancedThemeDescription();
545
+ React.useEffect(() => {
546
+ if (!advancedOpen) return;
547
+ setSaveAsName(getAdvancedThemeName());
548
+ setSaveAsDescription(getAdvancedThemeDescription());
549
+ }, [
550
+ activePresetOption,
551
+ advancedOpen,
552
+ defaultCreateThemeName,
553
+ isCurrentSavedTheme,
554
+ modeValue,
555
+ theme.activeTheme,
556
+ theme.colorScheme,
557
+ theme.themes
558
+ ]);
559
+ const createPresetFromCurrentTheme = (meta, basePreset, tokens = theme.tokens) => ({
560
+ ...basePreset,
561
+ label: meta.label,
562
+ description: meta.description,
563
+ base: theme.colorScheme,
564
+ accent: theme.accent === "custom" ? { ...theme.accentPalette } : theme.accent,
565
+ density: theme.density,
566
+ intensity: theme.intensity,
567
+ radius: theme.radius,
568
+ font: theme.font,
569
+ tokens: { ...tokens }
570
+ });
571
+ const updateLiveBase = (base) => {
572
+ clearCreateState();
573
+ if (theme.mode === "light" || theme.mode === "dark") {
574
+ applyMode(base);
575
+ return;
576
+ }
577
+ theme.update({ colorScheme: base });
578
+ };
579
+ const updateLiveToken = (key, value) => {
580
+ clearCreateState();
581
+ theme.setTokens({ ...theme.tokens, [key]: value });
582
+ };
583
+ const updateLiveAccentSlot = (key, value) => {
584
+ clearCreateState();
585
+ const nextPalette = { ...theme.accentPalette, [key]: value };
586
+ theme.setAccent(nextPalette);
587
+ if (key === "accent") setCustomAccent(cssColorToHex(value, customAccent));
588
+ };
589
+ const saveCurrentThemeUpdate = () => {
590
+ if (!canUpdateCurrentTheme) return;
591
+ const key = modeValue;
592
+ const previousPreset = theme.themes[key];
593
+ const currentMeta = getActiveThemeMeta();
594
+ const meta = {
595
+ ...currentMeta,
596
+ label: saveAsName.trim() || currentMeta.label || defaultCreateThemeName || fallbackPresetLabel(key),
597
+ description: saveAsDescription.trim()
598
+ };
599
+ const preset = createPresetFromCurrentTheme(meta, previousPreset);
600
+ const presetOption = { key, label: meta.label, description: meta.description, preset };
601
+ const nextThemes = { ...theme.themes, [key]: preset };
602
+ theme.update({
603
+ themes: nextThemes,
604
+ mode: key,
605
+ colorScheme: preset.base,
606
+ accent: preset.accent,
607
+ density: preset.density,
608
+ intensity: preset.intensity,
609
+ radius: preset.radius,
610
+ font: preset.font,
611
+ tokens: preset.tokens
612
+ });
613
+ setCreatedThemeMeta((current) => ({ ...current, [key]: meta }));
614
+ onUpdateTheme?.({ ...meta, preset, previousPreset, presetOption });
615
+ };
616
+ const saveCurrentThemeAsNew = () => {
617
+ if (!canSaveCurrentThemeAsNew) return;
618
+ clearCreateState();
619
+ const sourceMeta = getActiveThemeMeta();
620
+ const label = saveAsName.trim() || (isCurrentSavedTheme ? sourceMeta.label || defaultCreateThemeName : createSaveAsLabel(sourceMeta.label, defaultCreateThemeName));
621
+ const description2 = saveAsDescription.trim();
622
+ const key = createThemeKey(label, theme.themes, createThemeKeyPrefix);
623
+ const meta = { key, label, description: description2 };
624
+ const preset = createPresetFromCurrentTheme(meta, void 0, liveAdvancedTokens);
625
+ const presetOption = { key, label, description: description2, preset };
626
+ const nextThemes = { ...theme.themes, [String(key)]: preset };
627
+ setCreatedThemeMeta((current) => ({ ...current, [String(key)]: meta }));
628
+ theme.update({
629
+ themes: nextThemes,
630
+ mode: key,
631
+ colorScheme: preset.base,
632
+ accent: preset.accent,
633
+ density: preset.density,
634
+ intensity: preset.intensity,
635
+ radius: preset.radius,
636
+ font: preset.font,
637
+ tokens: preset.tokens
638
+ });
639
+ onCreateTheme?.({ ...meta, preset, presetOption });
640
+ };
493
641
  const beginCreateTheme = () => {
494
642
  const root = rootRef.current;
495
643
  const base = theme.colorScheme;
@@ -543,6 +691,7 @@ var ThemePanel = React.forwardRef(
543
691
  setCreateMode("simple");
544
692
  setCustomAccent(accent);
545
693
  setPreviewDraft(true);
694
+ setAdvancedOpen(false);
546
695
  setIsCreatingTheme(true);
547
696
  };
548
697
  const cancelCreateTheme = () => {
@@ -628,6 +777,192 @@ var ThemePanel = React.forwardRef(
628
777
  const updateThemeToken = (key, value) => {
629
778
  theme.setTokens({ ...theme.tokens, [key]: value });
630
779
  };
780
+ const renderAdvancedEditor = ({
781
+ font,
782
+ fontMode,
783
+ tokens,
784
+ accentPalette,
785
+ surfaceFallback,
786
+ accentFallback,
787
+ onFontModeChange,
788
+ onFontChange,
789
+ onTokenChange,
790
+ onAccentSlotChange
791
+ }) => /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced", children: [
792
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section compact", children: [
793
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
794
+ /* @__PURE__ */ jsx("span", { children: "\u5B57\u4F53" }),
795
+ /* @__PURE__ */ jsx("small", { children: fontMode === "preset" ? "\u9009\u62E9\u5185\u7F6E\u5B57\u4F53" : "\u586B\u5199 CSS font-family" })
796
+ ] }),
797
+ /* @__PURE__ */ jsx(
798
+ RadioGroup,
799
+ {
800
+ className: "theme-panel-create-mode",
801
+ variant: "segmented",
802
+ size: "sm",
803
+ value: fontMode,
804
+ options: ADVANCED_FONT_MODE_OPTIONS.map((option) => ({
805
+ value: option.value,
806
+ label: option.label
807
+ })),
808
+ onChange: (value) => {
809
+ onFontModeChange(value);
810
+ if (value === "preset") onFontChange(toFontKey(font));
811
+ }
812
+ }
813
+ ),
814
+ fontMode === "custom" && /* @__PURE__ */ jsxs("div", { className: "theme-panel-create-field", children: [
815
+ /* @__PURE__ */ jsx("span", { children: "\u5B57\u4F53\u6808" }),
816
+ /* @__PURE__ */ jsx(
817
+ Input,
818
+ {
819
+ size: "sm",
820
+ value: fontConfigToText(font),
821
+ onValueChange: (value) => onFontChange(value || "system"),
822
+ placeholder: "CSS font-family"
823
+ }
824
+ )
825
+ ] })
826
+ ] }),
827
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
828
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
829
+ /* @__PURE__ */ jsx("span", { children: "\u8868\u9762 tokens" }),
830
+ /* @__PURE__ */ jsx("small", { children: "\u5B8C\u6574\u8986\u5199 --bg / --fg" })
831
+ ] }),
832
+ /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: SURFACE_TOKEN_FIELDS.map((field) => /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
833
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
834
+ /* @__PURE__ */ jsx("span", { children: field.label }),
835
+ /* @__PURE__ */ jsxs("code", { children: [
836
+ "--",
837
+ field.key
838
+ ] })
839
+ ] }),
840
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
841
+ /* @__PURE__ */ jsx(
842
+ ColorPicker,
843
+ {
844
+ className: "theme-panel-token-picker",
845
+ value: tokenPickerValue(tokens[field.key], surfaceFallback),
846
+ onChange: (value) => onTokenChange(field.key, value),
847
+ placement: "left",
848
+ "aria-label": `\u9009\u62E9 ${field.label}`,
849
+ children: /* @__PURE__ */ jsx("span", { className: "theme-panel-token-swatch", style: { background: tokens[field.key] } })
850
+ }
851
+ ),
852
+ /* @__PURE__ */ jsx(
853
+ Input,
854
+ {
855
+ size: "sm",
856
+ value: tokens[field.key] ?? "",
857
+ onValueChange: (value) => onTokenChange(field.key, value)
858
+ }
859
+ )
860
+ ] })
861
+ ] }, field.key)) })
862
+ ] }),
863
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
864
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
865
+ /* @__PURE__ */ jsx("span", { children: "\u9634\u5F71\u7CFB\u7EDF" }),
866
+ /* @__PURE__ */ jsx("small", { children: "\u6697/\u4EAE\u9634\u5F71\u4E0E\u5C42\u7EA7\u7F29\u653E" })
867
+ ] }),
868
+ /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: SHADOW_TOKEN_FIELDS.map(
869
+ (field) => field.kind === "color" ? /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
870
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
871
+ /* @__PURE__ */ jsx("span", { children: field.label }),
872
+ /* @__PURE__ */ jsxs("code", { children: [
873
+ "--",
874
+ field.key
875
+ ] })
876
+ ] }),
877
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
878
+ /* @__PURE__ */ jsx(
879
+ ColorPicker,
880
+ {
881
+ className: "theme-panel-token-picker",
882
+ value: tokenPickerValue(tokens[field.key], surfaceFallback),
883
+ onChange: (value) => onTokenChange(field.key, value),
884
+ placement: "left",
885
+ "aria-label": `\u9009\u62E9 ${field.label}`,
886
+ children: /* @__PURE__ */ jsx("span", { className: "theme-panel-token-swatch", style: { background: tokens[field.key] } })
887
+ }
888
+ ),
889
+ /* @__PURE__ */ jsx(
890
+ Input,
891
+ {
892
+ size: "sm",
893
+ value: tokens[field.key] ?? "",
894
+ onValueChange: (value) => onTokenChange(field.key, value)
895
+ }
896
+ )
897
+ ] })
898
+ ] }, field.key) : /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field scale", children: [
899
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
900
+ /* @__PURE__ */ jsx("span", { children: field.label }),
901
+ /* @__PURE__ */ jsxs("code", { children: [
902
+ "--",
903
+ field.key
904
+ ] })
905
+ ] }),
906
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-scale", children: [
907
+ /* @__PURE__ */ jsx(
908
+ Input,
909
+ {
910
+ size: "sm",
911
+ value: tokens[field.key] ?? "1",
912
+ onValueChange: (value) => onTokenChange(field.key, value || "1")
913
+ }
914
+ ),
915
+ /* @__PURE__ */ jsx(
916
+ Slider,
917
+ {
918
+ value: parseScaleToken(tokens[field.key]),
919
+ onChange: (value) => onTokenChange(field.key, formatScaleToken(value)),
920
+ min: 0.6,
921
+ max: field.key === "shadow-float-scale" ? 1.8 : 1.6,
922
+ step: 0.05
923
+ }
924
+ )
925
+ ] })
926
+ ] }, field.key)
927
+ ) })
928
+ ] }),
929
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
930
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
931
+ /* @__PURE__ */ jsx("span", { children: "\u5F3A\u8C03 palette" }),
932
+ /* @__PURE__ */ jsx("small", { children: "\u5B8C\u6574\u8986\u5199 accent / ink / soft / glow" })
933
+ ] }),
934
+ /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: ACCENT_PALETTE_FIELDS.map((field) => /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
935
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
936
+ /* @__PURE__ */ jsx("span", { children: field.label }),
937
+ /* @__PURE__ */ jsxs("code", { children: [
938
+ "accent.",
939
+ field.key
940
+ ] })
941
+ ] }),
942
+ /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
943
+ /* @__PURE__ */ jsx(
944
+ ColorPicker,
945
+ {
946
+ className: "theme-panel-token-picker",
947
+ value: tokenPickerValue(accentPalette[field.key], accentFallback),
948
+ onChange: (value) => onAccentSlotChange(field.key, value),
949
+ placement: "left",
950
+ "aria-label": `\u9009\u62E9 ${field.label}`,
951
+ children: /* @__PURE__ */ jsx("span", { className: "theme-panel-token-swatch", style: { background: accentPalette[field.key] } })
952
+ }
953
+ ),
954
+ /* @__PURE__ */ jsx(
955
+ Input,
956
+ {
957
+ size: "sm",
958
+ value: accentPalette[field.key],
959
+ onValueChange: (value) => onAccentSlotChange(field.key, value)
960
+ }
961
+ )
962
+ ] })
963
+ ] }, field.key)) })
964
+ ] })
965
+ ] });
631
966
  return /* @__PURE__ */ jsxs("div", { ref: setRootRef, className: rootClass, ...rest, children: [
632
967
  (title || description) && /* @__PURE__ */ jsxs("div", { className: "theme-panel-head", children: [
633
968
  /* @__PURE__ */ jsxs("div", { className: "theme-panel-title", children: [
@@ -812,199 +1147,18 @@ var ThemePanel = React.forwardRef(
812
1147
  }
813
1148
  )
814
1149
  ] }),
815
- createMode === "advanced" && /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced", children: [
816
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section compact", children: [
817
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
818
- /* @__PURE__ */ jsx("span", { children: "\u5B57\u4F53" }),
819
- /* @__PURE__ */ jsx("small", { children: advancedFontMode === "preset" ? "\u9009\u62E9\u5185\u7F6E\u5B57\u4F53" : "\u586B\u5199 CSS font-family" })
820
- ] }),
821
- /* @__PURE__ */ jsx(
822
- RadioGroup,
823
- {
824
- className: "theme-panel-create-mode",
825
- variant: "segmented",
826
- size: "sm",
827
- value: advancedFontMode,
828
- options: ADVANCED_FONT_MODE_OPTIONS.map((option) => ({
829
- value: option.value,
830
- label: option.label
831
- })),
832
- onChange: (value) => {
833
- setAdvancedFontMode(value);
834
- if (value === "preset") setDraftFont(toFontKey(draftFont));
835
- }
836
- }
837
- ),
838
- advancedFontMode === "custom" && /* @__PURE__ */ jsxs("div", { className: "theme-panel-create-field", children: [
839
- /* @__PURE__ */ jsx("span", { children: "\u5B57\u4F53\u6808" }),
840
- /* @__PURE__ */ jsx(
841
- Input,
842
- {
843
- size: "sm",
844
- value: fontConfigToText(draftFont),
845
- onValueChange: (value) => setDraftFont(value || "system"),
846
- placeholder: "CSS font-family"
847
- }
848
- )
849
- ] })
850
- ] }),
851
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
852
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
853
- /* @__PURE__ */ jsx("span", { children: "\u8868\u9762 tokens" }),
854
- /* @__PURE__ */ jsx("small", { children: "\u5B8C\u6574\u8986\u5199 --bg / --fg" })
855
- ] }),
856
- /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: SURFACE_TOKEN_FIELDS.map((field) => /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
857
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
858
- /* @__PURE__ */ jsx("span", { children: field.label }),
859
- /* @__PURE__ */ jsxs("code", { children: [
860
- "--",
861
- field.key
862
- ] })
863
- ] }),
864
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
865
- /* @__PURE__ */ jsx(
866
- ColorPicker,
867
- {
868
- className: "theme-panel-token-picker",
869
- value: tokenPickerValue(draftTokens[field.key], draftSurface),
870
- onChange: (value) => updateDraftToken(field.key, value),
871
- placement: "left",
872
- "aria-label": `\u9009\u62E9 ${field.label}`,
873
- children: /* @__PURE__ */ jsx(
874
- "span",
875
- {
876
- className: "theme-panel-token-swatch",
877
- style: { background: draftTokens[field.key] }
878
- }
879
- )
880
- }
881
- ),
882
- /* @__PURE__ */ jsx(
883
- Input,
884
- {
885
- size: "sm",
886
- value: draftTokens[field.key] ?? "",
887
- onValueChange: (value) => updateDraftToken(field.key, value)
888
- }
889
- )
890
- ] })
891
- ] }, field.key)) })
892
- ] }),
893
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
894
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
895
- /* @__PURE__ */ jsx("span", { children: "\u9634\u5F71\u7CFB\u7EDF" }),
896
- /* @__PURE__ */ jsx("small", { children: "\u6697/\u4EAE\u9634\u5F71\u4E0E\u5C42\u7EA7\u7F29\u653E" })
897
- ] }),
898
- /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: SHADOW_TOKEN_FIELDS.map(
899
- (field) => field.kind === "color" ? /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
900
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
901
- /* @__PURE__ */ jsx("span", { children: field.label }),
902
- /* @__PURE__ */ jsxs("code", { children: [
903
- "--",
904
- field.key
905
- ] })
906
- ] }),
907
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
908
- /* @__PURE__ */ jsx(
909
- ColorPicker,
910
- {
911
- className: "theme-panel-token-picker",
912
- value: tokenPickerValue(draftTokens[field.key], draftSurface),
913
- onChange: (value) => updateDraftToken(field.key, value),
914
- placement: "left",
915
- "aria-label": `\u9009\u62E9 ${field.label}`,
916
- children: /* @__PURE__ */ jsx(
917
- "span",
918
- {
919
- className: "theme-panel-token-swatch",
920
- style: { background: draftTokens[field.key] }
921
- }
922
- )
923
- }
924
- ),
925
- /* @__PURE__ */ jsx(
926
- Input,
927
- {
928
- size: "sm",
929
- value: draftTokens[field.key] ?? "",
930
- onValueChange: (value) => updateDraftToken(field.key, value)
931
- }
932
- )
933
- ] })
934
- ] }, field.key) : /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field scale", children: [
935
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
936
- /* @__PURE__ */ jsx("span", { children: field.label }),
937
- /* @__PURE__ */ jsxs("code", { children: [
938
- "--",
939
- field.key
940
- ] })
941
- ] }),
942
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-scale", children: [
943
- /* @__PURE__ */ jsx(
944
- Input,
945
- {
946
- size: "sm",
947
- value: draftTokens[field.key] ?? "1",
948
- onValueChange: (value) => updateDraftToken(field.key, value || "1")
949
- }
950
- ),
951
- /* @__PURE__ */ jsx(
952
- Slider,
953
- {
954
- value: parseScaleToken(draftTokens[field.key]),
955
- onChange: (value) => updateDraftToken(field.key, formatScaleToken(value)),
956
- min: 0.6,
957
- max: field.key === "shadow-float-scale" ? 1.8 : 1.6,
958
- step: 0.05
959
- }
960
- )
961
- ] })
962
- ] }, field.key)
963
- ) })
964
- ] }),
965
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-section", children: [
966
- /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-title", children: [
967
- /* @__PURE__ */ jsx("span", { children: "\u5F3A\u8C03 palette" }),
968
- /* @__PURE__ */ jsx("small", { children: "\u5B8C\u6574\u8986\u5199 accent / ink / soft / glow" })
969
- ] }),
970
- /* @__PURE__ */ jsx("div", { className: "theme-panel-token-grid", children: ACCENT_PALETTE_FIELDS.map((field) => /* @__PURE__ */ jsxs("div", { className: "theme-panel-token-field", children: [
971
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-label", children: [
972
- /* @__PURE__ */ jsx("span", { children: field.label }),
973
- /* @__PURE__ */ jsxs("code", { children: [
974
- "accent.",
975
- field.key
976
- ] })
977
- ] }),
978
- /* @__PURE__ */ jsxs("span", { className: "theme-panel-token-input", children: [
979
- /* @__PURE__ */ jsx(
980
- ColorPicker,
981
- {
982
- className: "theme-panel-token-picker",
983
- value: tokenPickerValue(draftAccentPalette[field.key], draftAccent),
984
- onChange: (value) => updateDraftAccentSlot(field.key, value),
985
- placement: "left",
986
- "aria-label": `\u9009\u62E9 ${field.label}`,
987
- children: /* @__PURE__ */ jsx(
988
- "span",
989
- {
990
- className: "theme-panel-token-swatch",
991
- style: { background: draftAccentPalette[field.key] }
992
- }
993
- )
994
- }
995
- ),
996
- /* @__PURE__ */ jsx(
997
- Input,
998
- {
999
- size: "sm",
1000
- value: draftAccentPalette[field.key],
1001
- onValueChange: (value) => updateDraftAccentSlot(field.key, value)
1002
- }
1003
- )
1004
- ] })
1005
- ] }, field.key)) })
1006
- ] })
1007
- ] }),
1150
+ createMode === "advanced" && renderAdvancedEditor({
1151
+ font: draftFont,
1152
+ fontMode: advancedFontMode,
1153
+ tokens: draftTokens,
1154
+ accentPalette: draftAccentPalette,
1155
+ surfaceFallback: draftSurface,
1156
+ accentFallback: draftAccent,
1157
+ onFontModeChange: setAdvancedFontMode,
1158
+ onFontChange: setDraftFont,
1159
+ onTokenChange: updateDraftToken,
1160
+ onAccentSlotChange: updateDraftAccentSlot
1161
+ }),
1008
1162
  /* @__PURE__ */ jsxs(
1009
1163
  "div",
1010
1164
  {
@@ -1161,6 +1315,103 @@ var ThemePanel = React.forwardRef(
1161
1315
  }
1162
1316
  )
1163
1317
  ] }),
1318
+ sections.includes("advanced") && !isCreatingTheme && /* @__PURE__ */ jsxs("div", { className: "theme-panel-row theme-panel-advanced-row", children: [
1319
+ /* @__PURE__ */ jsx(
1320
+ Button,
1321
+ {
1322
+ type: "button",
1323
+ variant: "ghost",
1324
+ size: "sm",
1325
+ icon: "sliders",
1326
+ trailingIcon: advancedOpen ? "chevUp" : "chevDown",
1327
+ block: true,
1328
+ className: "theme-panel-advanced-toggle",
1329
+ onClick: () => setAdvancedOpen((open) => !open),
1330
+ "aria-expanded": advancedOpen,
1331
+ children: "\u9AD8\u7EA7\u8C03\u6574"
1332
+ }
1333
+ ),
1334
+ advancedOpen && /* @__PURE__ */ jsxs("div", { className: "theme-panel-live-advanced", children: [
1335
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-create-field", children: [
1336
+ /* @__PURE__ */ jsx("span", { children: "\u57FA\u5E95" }),
1337
+ /* @__PURE__ */ jsx(
1338
+ RadioGroup,
1339
+ {
1340
+ variant: "segmented",
1341
+ size: "sm",
1342
+ value: theme.colorScheme,
1343
+ options: [
1344
+ { value: "light", label: "\u6D45" },
1345
+ { value: "dark", label: "\u6DF1" }
1346
+ ],
1347
+ onChange: updateLiveBase
1348
+ }
1349
+ )
1350
+ ] }),
1351
+ renderAdvancedEditor({
1352
+ font: theme.font,
1353
+ fontMode: liveAdvancedFontMode,
1354
+ tokens: liveAdvancedTokens,
1355
+ accentPalette: theme.accentPalette,
1356
+ surfaceFallback: cssColorToHex(
1357
+ liveAdvancedTokens.bg ?? DEFAULT_SURFACE_BY_BASE[theme.colorScheme],
1358
+ DEFAULT_SURFACE_BY_BASE[theme.colorScheme]
1359
+ ),
1360
+ accentFallback: cssColorToHex(theme.accentPalette.accent, customAccent),
1361
+ onFontModeChange: setLiveAdvancedFontMode,
1362
+ onFontChange: (font) => theme.setFont(font),
1363
+ onTokenChange: updateLiveToken,
1364
+ onAccentSlotChange: updateLiveAccentSlot
1365
+ }),
1366
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-actions", children: [
1367
+ canSaveCurrentThemeAsNew && /* @__PURE__ */ jsxs("div", { className: "theme-panel-save-as-field", children: [
1368
+ /* @__PURE__ */ jsx("span", { children: isCurrentSavedTheme ? "\u4E3B\u9898\u540D" : "\u65B0\u4E3B\u9898\u540D" }),
1369
+ /* @__PURE__ */ jsx(
1370
+ Input,
1371
+ {
1372
+ size: "sm",
1373
+ value: saveAsName,
1374
+ onValueChange: setSaveAsName,
1375
+ placeholder: suggestedSaveAsName,
1376
+ leadingIcon: "palette",
1377
+ allowClear: true
1378
+ }
1379
+ )
1380
+ ] }),
1381
+ canSaveCurrentThemeAsNew && /* @__PURE__ */ jsxs("div", { className: "theme-panel-save-as-field", children: [
1382
+ /* @__PURE__ */ jsx("span", { children: "\u526F\u6807\u9898" }),
1383
+ /* @__PURE__ */ jsx(
1384
+ Input,
1385
+ {
1386
+ size: "sm",
1387
+ value: saveAsDescription,
1388
+ onValueChange: setSaveAsDescription,
1389
+ placeholder: suggestedSaveAsDescription,
1390
+ leadingIcon: "edit",
1391
+ allowClear: true
1392
+ }
1393
+ )
1394
+ ] }),
1395
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-footer", children: [
1396
+ /* @__PURE__ */ jsx("span", { children: isCurrentSavedTheme ? `\u5F53\u524D\u9884\u8BBE: ${getActiveThemeMeta().label}` : canSaveCurrentThemeAsNew ? "\u9ED8\u8BA4\u9884\u8BBE\u4F1A\u4FDD\u5B58\u4E3A\u65B0\u4E3B\u9898" : "\u5F53\u524D\u8C03\u6574\u4EC5\u8FD0\u884C\u65F6\u751F\u6548" }),
1397
+ /* @__PURE__ */ jsxs("div", { className: "theme-panel-advanced-buttons", children: [
1398
+ canUpdateCurrentTheme && /* @__PURE__ */ jsx(Button, { type: "button", variant: "primary", size: "sm", icon: "check", onClick: saveCurrentThemeUpdate, children: "\u4FDD\u5B58\u4FEE\u6539" }),
1399
+ canSaveCurrentThemeAsNew && /* @__PURE__ */ jsx(
1400
+ Button,
1401
+ {
1402
+ type: "button",
1403
+ variant: canUpdateCurrentTheme ? "ghost" : "primary",
1404
+ size: "sm",
1405
+ icon: "copy",
1406
+ onClick: saveCurrentThemeAsNew,
1407
+ children: isCurrentSavedTheme ? "\u53E6\u5B58\u4E3A" : "\u4FDD\u5B58\u4E3A\u65B0\u4E3B\u9898"
1408
+ }
1409
+ )
1410
+ ] })
1411
+ ] })
1412
+ ] })
1413
+ ] })
1414
+ ] }),
1164
1415
  showReset && /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", icon: "reload", block: true, onClick: resetTheme, children: "\u91CD\u7F6E\u4E3B\u9898" })
1165
1416
  ] });
1166
1417
  }