@fangxinyan/lumina 0.6.1 → 0.6.3

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 (270) hide show
  1. package/README.md +2 -1
  2. package/dist/{Alert-JJ7GB3UU.css → Alert-QBKIDY5H.css} +7 -0
  3. package/dist/Alert.cjs +3 -3
  4. package/dist/Alert.d.cts +3 -2
  5. package/dist/Alert.d.ts +3 -2
  6. package/dist/Alert.js +2 -2
  7. package/dist/AutoComplete.cjs +5 -4
  8. package/dist/AutoComplete.d.cts +1 -1
  9. package/dist/AutoComplete.d.ts +1 -1
  10. package/dist/AutoComplete.js +4 -3
  11. package/dist/Badge-DPGLV3D3.css +22 -0
  12. package/dist/Badge.cjs +10 -0
  13. package/dist/Badge.d.cts +19 -0
  14. package/dist/Badge.d.ts +19 -0
  15. package/dist/Badge.js +1 -0
  16. package/dist/{Button-SDQD25AG.css → Button-4Z3Q6KII.css} +56 -36
  17. package/dist/Button.cjs +3 -7
  18. package/dist/Button.d.cts +11 -15
  19. package/dist/Button.d.ts +11 -15
  20. package/dist/Button.js +2 -2
  21. package/dist/Calendar.cjs +3 -3
  22. package/dist/Calendar.js +2 -2
  23. package/dist/{Card-RG7ECXL2.css → Card-6RMVIHWX.css} +7 -13
  24. package/dist/Card.cjs +2 -6
  25. package/dist/Card.d.cts +7 -11
  26. package/dist/Card.d.ts +7 -11
  27. package/dist/Card.js +1 -1
  28. package/dist/{Cascader-VSYEKQCG.css → Cascader-3BLLA7EN.css} +77 -0
  29. package/dist/Cascader.cjs +5 -3
  30. package/dist/Cascader.d.cts +22 -4
  31. package/dist/Cascader.d.ts +22 -4
  32. package/dist/Cascader.js +4 -2
  33. package/dist/{Checkbox-SKJATVSN.css → Checkbox-U5EUDSYS.css} +5 -35
  34. package/dist/Checkbox.cjs +3 -7
  35. package/dist/Checkbox.d.cts +1 -18
  36. package/dist/Checkbox.d.ts +1 -18
  37. package/dist/Checkbox.js +2 -2
  38. package/dist/Collapse-66U5YJFY.css +53 -0
  39. package/dist/Collapse.cjs +11 -0
  40. package/dist/Collapse.d.cts +32 -0
  41. package/dist/Collapse.d.ts +32 -0
  42. package/dist/Collapse.js +2 -0
  43. package/dist/CommandPalette.cjs +5 -4
  44. package/dist/CommandPalette.js +4 -3
  45. package/dist/Drawer.cjs +3 -3
  46. package/dist/Drawer.js +2 -2
  47. package/dist/Empty-DC2LPORC.css +28 -0
  48. package/dist/Empty.cjs +2 -10
  49. package/dist/Empty.d.cts +1 -62
  50. package/dist/Empty.d.ts +1 -62
  51. package/dist/Empty.js +1 -1
  52. package/dist/Form.d.cts +1 -1
  53. package/dist/Form.d.ts +1 -1
  54. package/dist/Icon.cjs +187 -3
  55. package/dist/Icon.d.cts +104 -3
  56. package/dist/Icon.d.ts +104 -3
  57. package/dist/Icon.js +1 -1
  58. package/dist/{Image-4MN34O6P.css → Image-MRYQCRQ5.css} +78 -0
  59. package/dist/Image.cjs +12 -4
  60. package/dist/Image.d.cts +79 -6
  61. package/dist/Image.d.ts +79 -6
  62. package/dist/Image.js +2 -2
  63. package/dist/{Input-33CAH4O6.css → Input-HUBJ55OH.css} +25 -42
  64. package/dist/Input.cjs +6 -5
  65. package/dist/Input.d.cts +23 -26
  66. package/dist/Input.d.ts +23 -26
  67. package/dist/Input.js +3 -2
  68. package/dist/InputNumber.cjs +5 -4
  69. package/dist/InputNumber.d.cts +1 -1
  70. package/dist/InputNumber.d.ts +1 -1
  71. package/dist/InputNumber.js +4 -3
  72. package/dist/Message-2MZ3LFPU.css +45 -0
  73. package/dist/Message.cjs +23 -0
  74. package/dist/Message.d.cts +54 -0
  75. package/dist/Message.d.ts +54 -0
  76. package/dist/Message.js +2 -0
  77. package/dist/{Modal-XSDMU4XJ.css → Modal-2QNDW4SO.css} +27 -0
  78. package/dist/Modal.cjs +4 -4
  79. package/dist/Modal.d.cts +29 -4
  80. package/dist/Modal.d.ts +29 -4
  81. package/dist/Modal.js +3 -3
  82. package/dist/Pagination.cjs +7 -5
  83. package/dist/Pagination.js +6 -4
  84. package/dist/Popover.cjs +2 -2
  85. package/dist/Popover.d.cts +11 -3
  86. package/dist/Popover.d.ts +11 -3
  87. package/dist/Popover.js +1 -1
  88. package/dist/Radio-GVFDPAZM.css +97 -0
  89. package/dist/Radio.cjs +14 -0
  90. package/dist/Radio.d.cts +36 -0
  91. package/dist/Radio.d.ts +36 -0
  92. package/dist/Radio.js +1 -0
  93. package/dist/{Select-J3CCVFJ7.css → Select-Z5VYPEEY.css} +33 -24
  94. package/dist/Select.cjs +6 -4
  95. package/dist/Select.d.cts +29 -7
  96. package/dist/Select.d.ts +29 -7
  97. package/dist/Select.js +5 -3
  98. package/dist/Skeleton-CVWH2VWN.css +40 -0
  99. package/dist/Skeleton.cjs +10 -0
  100. package/dist/Skeleton.d.cts +30 -0
  101. package/dist/Skeleton.d.ts +30 -0
  102. package/dist/Skeleton.js +1 -0
  103. package/dist/Spin-3GJNMSIH.css +94 -0
  104. package/dist/Spin.cjs +10 -0
  105. package/dist/Spin.d.cts +20 -0
  106. package/dist/Spin.d.ts +20 -0
  107. package/dist/Spin.js +1 -0
  108. package/dist/{Table-2LPTOUIR.css → Table-ATJJQLKU.css} +0 -53
  109. package/dist/Table.cjs +9 -11
  110. package/dist/Table.d.cts +2 -21
  111. package/dist/Table.d.ts +2 -21
  112. package/dist/Table.js +8 -6
  113. package/dist/TablePro-3XVHYLSL.css +45 -0
  114. package/dist/TablePro.cjs +19 -0
  115. package/dist/TablePro.d.cts +21 -0
  116. package/dist/TablePro.d.ts +21 -0
  117. package/dist/TablePro.js +10 -0
  118. package/dist/{Tabs-RHK6XAFF.css → Tabs-BLSNI2T5.css} +0 -34
  119. package/dist/Tabs.cjs +2 -6
  120. package/dist/Tabs.d.cts +1 -16
  121. package/dist/Tabs.d.ts +1 -16
  122. package/dist/Tabs.js +1 -1
  123. package/dist/Tag-HDYCDPFS.css +42 -0
  124. package/dist/Tag.cjs +3 -7
  125. package/dist/Tag.d.cts +5 -14
  126. package/dist/Tag.d.ts +5 -14
  127. package/dist/Tag.js +2 -2
  128. package/dist/Textarea-YNET7IBH.css +54 -0
  129. package/dist/Textarea.cjs +15 -0
  130. package/dist/Textarea.d.cts +25 -0
  131. package/dist/Textarea.d.ts +25 -0
  132. package/dist/Textarea.js +2 -0
  133. package/dist/Theme.cjs +14 -10
  134. package/dist/Theme.d.cts +29 -6
  135. package/dist/Theme.d.ts +29 -6
  136. package/dist/Theme.js +1 -1
  137. package/dist/{Timeline-RHZAZKZ7.css → Timeline-3ZHOHPXT.css} +2 -2
  138. package/dist/Timeline.cjs +3 -3
  139. package/dist/Timeline.d.cts +1 -1
  140. package/dist/Timeline.d.ts +1 -1
  141. package/dist/Timeline.js +2 -2
  142. package/dist/Tooltip.cjs +2 -2
  143. package/dist/Tooltip.d.cts +17 -4
  144. package/dist/Tooltip.d.ts +17 -4
  145. package/dist/Tooltip.js +1 -1
  146. package/dist/Typography.cjs +7 -7
  147. package/dist/Typography.d.cts +1 -0
  148. package/dist/Typography.d.ts +1 -0
  149. package/dist/Typography.js +2 -2
  150. package/dist/{chunk-OVZTG5CP.cjs → chunk-2HQCUBA7.cjs} +2 -2
  151. package/dist/{chunk-X2U7EKCS.cjs → chunk-3YJU3D5S.cjs} +28 -5
  152. package/dist/chunk-45VJGBGN.js +25 -0
  153. package/dist/{chunk-3D77MQHO.js → chunk-46VXFTEC.js} +3 -3
  154. package/dist/chunk-47VG2P34.js +393 -0
  155. package/dist/{chunk-LZU33BX6.cjs → chunk-5DKRY67M.cjs} +4 -20
  156. package/dist/{chunk-TWGQZX2R.js → chunk-5H5YP2TB.js} +4 -19
  157. package/dist/chunk-5MN3PMF4.cjs +240 -0
  158. package/dist/{chunk-5A3RT4KD.js → chunk-5TKC6IEN.js} +4 -55
  159. package/dist/{chunk-N57NXCNC.cjs → chunk-6HMTV6P4.cjs} +3 -44
  160. package/dist/{chunk-RF2EY5JS.cjs → chunk-6ZXQJRAT.cjs} +153 -34
  161. package/dist/{chunk-OFGDUCT7.cjs → chunk-7AG524YZ.cjs} +3 -3
  162. package/dist/chunk-7IYKKLV3.js +283 -0
  163. package/dist/{chunk-73RQBWWW.js → chunk-AAGF7K3L.js} +2 -2
  164. package/dist/chunk-AXZ7ELMA.js +41 -0
  165. package/dist/{chunk-R6BIF3FF.js → chunk-BPOOVO5T.js} +5 -23
  166. package/dist/{chunk-OI3CWXT3.js → chunk-BVQ77VRY.js} +3 -3
  167. package/dist/{chunk-UXH5PH3S.js → chunk-CETNCRZ4.js} +2 -2
  168. package/dist/chunk-DG5VQ6BO.cjs +28 -0
  169. package/dist/chunk-DWAN57G4.js +243 -0
  170. package/dist/chunk-ELNT3CFO.js +64 -0
  171. package/dist/{chunk-ULOJ5UEY.js → chunk-ET6DYQVZ.js} +1 -1
  172. package/dist/chunk-F6RYCBQG.js +25 -0
  173. package/dist/{chunk-RPFMQZA5.js → chunk-FBYUZOZP.js} +42 -31
  174. package/dist/chunk-FGW5GJ22.cjs +132 -0
  175. package/dist/{chunk-6Y5WRCPW.js → chunk-FWPBORRB.js} +1 -1
  176. package/dist/chunk-GENABQYA.cjs +47 -0
  177. package/dist/{chunk-TGHBKKSS.js → chunk-GIZU3H6H.js} +3 -43
  178. package/dist/chunk-GMN74OEY.cjs +63 -0
  179. package/dist/{chunk-Y47YTYQ3.cjs → chunk-H4LGWZMH.cjs} +159 -8
  180. package/dist/chunk-HKF2V5MM.cjs +214 -0
  181. package/dist/chunk-HLFH5HWR.js +81 -0
  182. package/dist/{chunk-4WRE4HQP.js → chunk-HWFM4MAT.js} +18 -6
  183. package/dist/{chunk-GY3BSHHS.cjs → chunk-HZSIUOCN.cjs} +2 -55
  184. package/dist/{chunk-D46EM4EN.js → chunk-I5WTQ5Y3.js} +4 -4
  185. package/dist/chunk-J2HZTJO6.js +26 -0
  186. package/dist/{chunk-NN25YMOL.js → chunk-J5ZGYQZK.js} +153 -35
  187. package/dist/{chunk-WRDKOSSM.js → chunk-JCEHZ336.js} +1 -1
  188. package/dist/chunk-JVUVOR6S.js +110 -0
  189. package/dist/chunk-K5IGFBDR.js +113 -0
  190. package/dist/{chunk-Q2KG6SQK.cjs → chunk-K7FV7W6U.cjs} +5 -5
  191. package/dist/{chunk-PWW64ZWO.cjs → chunk-KD4YYIIO.cjs} +1 -32
  192. package/dist/chunk-KGSADAOD.cjs +170 -0
  193. package/dist/{chunk-54YLXXS2.js → chunk-ME5BZ2WA.js} +2 -2
  194. package/dist/chunk-MPVCYU2K.cjs +104 -0
  195. package/dist/{chunk-EEMWQX3C.cjs → chunk-NTS5L4NQ.cjs} +3 -3
  196. package/dist/{chunk-WBK6XIDJ.js → chunk-OBEKX4VR.js} +2 -32
  197. package/dist/{chunk-EBNRZRWY.cjs → chunk-P6EZG2R7.cjs} +5 -5
  198. package/dist/{chunk-KYEY2LIB.cjs → chunk-P6P4DGLF.cjs} +3 -3
  199. package/dist/{chunk-GOBWKQCX.cjs → chunk-PULGVK2I.cjs} +3 -3
  200. package/dist/chunk-Q5SZIU7Z.cjs +47 -0
  201. package/dist/chunk-QKQHZIF3.cjs +86 -0
  202. package/dist/{chunk-3TWNBJFI.cjs → chunk-QP3VCSRY.cjs} +6 -6
  203. package/dist/{chunk-6ODY6MGL.cjs → chunk-R2TEDH2F.cjs} +5 -5
  204. package/dist/{chunk-YRZGXXWA.js → chunk-SQGPSMSK.js} +14 -20
  205. package/dist/{chunk-IW5LW6XS.js → chunk-TEEFR2FD.js} +28 -5
  206. package/dist/chunk-TGL5BGMR.js +218 -0
  207. package/dist/{chunk-62GU4OHH.cjs → chunk-TP567B3L.cjs} +13 -20
  208. package/dist/chunk-UKS23N3L.js +191 -0
  209. package/dist/chunk-USQ43DJ5.js +147 -0
  210. package/dist/{chunk-G2K6ETP4.cjs → chunk-UUHFKIWP.cjs} +18 -6
  211. package/dist/{chunk-2MNAZRWE.cjs → chunk-V272XR3F.cjs} +271 -2
  212. package/dist/chunk-VFFIE2VO.cjs +271 -0
  213. package/dist/{chunk-FIO65XYG.cjs → chunk-X5GCOMC3.cjs} +49 -38
  214. package/dist/{chunk-Y3ZSG3SJ.cjs → chunk-XSN4TLN5.cjs} +11 -30
  215. package/dist/chunk-ZKE73UQF.cjs +138 -0
  216. package/dist/index.cjs +342 -132
  217. package/dist/index.d.cts +26 -20
  218. package/dist/index.d.ts +26 -20
  219. package/dist/index.js +35 -29
  220. package/dist/styles.css +515 -230
  221. package/docs/llms/alert.md +4 -3
  222. package/docs/llms/badge.md +3 -3
  223. package/docs/llms/button.md +11 -41
  224. package/docs/llms/card.md +6 -12
  225. package/docs/llms/cascader.md +22 -0
  226. package/docs/llms/{accordion.md → collapse.md} +13 -11
  227. package/docs/llms/drawer.md +1 -1
  228. package/docs/llms/form.md +1 -1
  229. package/docs/llms/image.md +72 -1
  230. package/docs/llms/input.md +28 -18
  231. package/docs/llms/message.md +63 -0
  232. package/docs/llms/modal.md +30 -0
  233. package/docs/llms/popover.md +18 -1
  234. package/docs/llms/radio.md +37 -1
  235. package/docs/llms/select.md +22 -2
  236. package/docs/llms/spin.md +59 -0
  237. package/docs/llms/table.md +3 -3
  238. package/docs/llms/tag.md +3 -2
  239. package/docs/llms/theme.md +41 -4
  240. package/docs/llms/tooltip.md +16 -3
  241. package/docs/llms.md +8 -8
  242. package/package.json +32 -52
  243. package/dist/Accordion-REMDCQUD.css +0 -44
  244. package/dist/Accordion.cjs +0 -11
  245. package/dist/Accordion.d.cts +0 -33
  246. package/dist/Accordion.d.ts +0 -33
  247. package/dist/Accordion.js +0 -2
  248. package/dist/Empty-NQ72W3D7.css +0 -160
  249. package/dist/Tag-FGDY3W7E.css +0 -51
  250. package/dist/Toast-YSACW3EM.css +0 -45
  251. package/dist/Toast.cjs +0 -15
  252. package/dist/Toast.d.cts +0 -26
  253. package/dist/Toast.d.ts +0 -26
  254. package/dist/Toast.js +0 -2
  255. package/dist/chunk-32HBMXXV.cjs +0 -208
  256. package/dist/chunk-3XTHKAEY.js +0 -39
  257. package/dist/chunk-5M26OVVY.js +0 -90
  258. package/dist/chunk-DOMYUGJY.js +0 -132
  259. package/dist/chunk-DPNDHNKK.js +0 -185
  260. package/dist/chunk-G2XK57I7.cjs +0 -116
  261. package/dist/chunk-HBWO3QKW.js +0 -74
  262. package/dist/chunk-JVS5ZALZ.js +0 -123
  263. package/dist/chunk-LIGHV4RC.cjs +0 -121
  264. package/dist/chunk-MCTIA6RZ.js +0 -99
  265. package/dist/chunk-NC4YUEXM.cjs +0 -145
  266. package/dist/chunk-NJ6B22YJ.js +0 -170
  267. package/dist/chunk-W64ARHLJ.cjs +0 -62
  268. package/dist/chunk-ZFW6OYAO.cjs +0 -100
  269. package/docs/llms/spinner.md +0 -58
  270. package/docs/llms/toast.md +0 -51
@@ -0,0 +1,240 @@
1
+ 'use strict';
2
+
3
+ var chunkYB3IWIOJ_cjs = require('./chunk-YB3IWIOJ.cjs');
4
+ var chunkHKF2V5MM_cjs = require('./chunk-HKF2V5MM.cjs');
5
+ var chunkV272XR3F_cjs = require('./chunk-V272XR3F.cjs');
6
+ require('./tokens-BIIUTPKN.css');
7
+ require('./shared-NJHRNLRH.css');
8
+ require('./Cascader-3BLLA7EN.css');
9
+ var React = require('react');
10
+ var reactDom = require('react-dom');
11
+ var jsxRuntime = require('react/jsx-runtime');
12
+
13
+ function _interopNamespace(e) {
14
+ if (e && e.__esModule) return e;
15
+ var n = Object.create(null);
16
+ if (e) {
17
+ Object.keys(e).forEach(function (k) {
18
+ if (k !== 'default') {
19
+ var d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: function () { return e[k]; }
23
+ });
24
+ }
25
+ });
26
+ }
27
+ n.default = e;
28
+ return Object.freeze(n);
29
+ }
30
+
31
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
+
33
+ var collectPaths = (options, prefix = []) => options.flatMap((option) => {
34
+ const next = [...prefix, option];
35
+ if (option.children?.length) return collectPaths(option.children, next);
36
+ return [next];
37
+ });
38
+ var defaultSearchFilter = (inputValue, path) => {
39
+ const q = inputValue.trim().toLowerCase();
40
+ if (!q) return true;
41
+ return path.map((option) => String(option.label ?? option.value)).join(" / ").toLowerCase().includes(q);
42
+ };
43
+ var Cascader = React__namespace.forwardRef(({
44
+ options,
45
+ value,
46
+ defaultValue = [],
47
+ onChange,
48
+ placeholder = "\u8BF7\u9009\u62E9",
49
+ disabled,
50
+ allowClear,
51
+ onClear,
52
+ changeOnSelect,
53
+ showSearch,
54
+ popupClassName = "",
55
+ dropdownClassName = "",
56
+ className = "",
57
+ ...rest
58
+ }, ref) => {
59
+ const [inner, setInner] = React__namespace.useState(defaultValue);
60
+ const isControlled = value !== void 0;
61
+ const cur = isControlled ? value : inner;
62
+ const [open, setOpen] = React__namespace.useState(false);
63
+ const [path, setPath] = React__namespace.useState(cur);
64
+ const [query, setQuery] = React__namespace.useState("");
65
+ const panelRef = React__namespace.useRef(null);
66
+ const searchRef = React__namespace.useRef(null);
67
+ const searchConfig = typeof showSearch === "object" ? showSearch : {};
68
+ const searchable = !!showSearch;
69
+ const { triggerRef, floatingStyle } = chunkYB3IWIOJ_cjs.useFloating({
70
+ open,
71
+ placement: "bottom",
72
+ panelWidth: 520,
73
+ panelHeight: 260
74
+ });
75
+ const setTriggerRef = React__namespace.useCallback(
76
+ (node) => {
77
+ triggerRef.current = node;
78
+ if (typeof ref === "function") ref(node);
79
+ else if (ref) ref.current = node;
80
+ },
81
+ [ref, triggerRef]
82
+ );
83
+ React__namespace.useEffect(() => {
84
+ const h = (e) => {
85
+ const t = e.target;
86
+ if (triggerRef.current?.contains(t)) return;
87
+ if (panelRef.current?.contains(t)) return;
88
+ setOpen(false);
89
+ };
90
+ document.addEventListener("mousedown", h);
91
+ return () => document.removeEventListener("mousedown", h);
92
+ }, []);
93
+ React__namespace.useEffect(() => {
94
+ if (open) setPath(cur);
95
+ if (!open) setQuery("");
96
+ }, [open, cur]);
97
+ React__namespace.useEffect(() => {
98
+ if (!open || !searchable) return;
99
+ requestAnimationFrame(() => searchRef.current?.focus());
100
+ }, [open, searchable]);
101
+ const columns = [options];
102
+ let cursor = options;
103
+ for (const v of path) {
104
+ const match = cursor.find((o) => o.value === v);
105
+ if (match && match.children) {
106
+ cursor = match.children;
107
+ columns.push(cursor);
108
+ } else break;
109
+ }
110
+ const selectedOptionsForPath = (nextPath) => {
111
+ const selected = [];
112
+ let list2 = options;
113
+ for (const item of nextPath) {
114
+ const match = list2.find((option) => option.value === item);
115
+ if (!match) break;
116
+ selected.push(match);
117
+ list2 = match.children ?? [];
118
+ }
119
+ return selected;
120
+ };
121
+ const commit = (nextPath, closeAfterSelect) => {
122
+ if (!isControlled) setInner(nextPath);
123
+ onChange?.(nextPath, selectedOptionsForPath(nextPath));
124
+ if (closeAfterSelect) setOpen(false);
125
+ };
126
+ const pick = (depth, val, hasChildren) => {
127
+ const np = [...path.slice(0, depth), val];
128
+ setPath(np);
129
+ if (!hasChildren || changeOnSelect) commit(np, !hasChildren);
130
+ };
131
+ const clear = (e) => {
132
+ e.stopPropagation();
133
+ if (disabled) return;
134
+ setPath([]);
135
+ if (!isControlled) setInner([]);
136
+ onChange?.([], []);
137
+ onClear?.();
138
+ };
139
+ const labels = [];
140
+ let list = options;
141
+ for (const v of cur) {
142
+ const m = list.find((o) => o.value === v);
143
+ if (!m) break;
144
+ labels.push(m.label);
145
+ if (!m.children) break;
146
+ list = m.children;
147
+ }
148
+ const allPaths = React__namespace.useMemo(() => collectPaths(options), [options]);
149
+ const matchedPaths = React__namespace.useMemo(() => {
150
+ if (!query.trim()) return [];
151
+ const filter = searchConfig.filter ?? defaultSearchFilter;
152
+ const result = allPaths.filter((itemPath) => filter(query, itemPath));
153
+ const limit = searchConfig.limit === false ? result.length : searchConfig.limit ?? 50;
154
+ return result.slice(0, limit);
155
+ }, [allPaths, query, searchConfig.filter, searchConfig.limit]);
156
+ const panelClassName = [
157
+ "cascader-panel",
158
+ searchable && "with-search",
159
+ popupClassName,
160
+ dropdownClassName
161
+ ].filter(Boolean).join(" ");
162
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: setTriggerRef, className: `cascader ${open ? "open" : ""} ${className}`, ...rest, children: [
163
+ /* @__PURE__ */ jsxRuntime.jsxs(
164
+ "button",
165
+ {
166
+ type: "button",
167
+ className: `cascader-trigger ${labels.length === 0 ? "placeholder" : ""}`,
168
+ disabled,
169
+ onClick: () => !disabled && setOpen((o) => !o),
170
+ children: [
171
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { flex: 1 }, children: labels.length ? labels.map((l, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
172
+ i > 0 && " / ",
173
+ l
174
+ ] }, i)) : placeholder }),
175
+ !!allowClear && labels.length > 0 && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
176
+ "span",
177
+ {
178
+ className: "cascader-clear",
179
+ role: "button",
180
+ "aria-label": "Clear",
181
+ onClick: clear,
182
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkV272XR3F_cjs.Icon, { name: "x", size: 12 })
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "absolute", right: 12, color: "var(--fg-subtle)" }, children: /* @__PURE__ */ jsxRuntime.jsx(chunkV272XR3F_cjs.Icon, { name: "chevDown", size: 14 }) })
186
+ ]
187
+ }
188
+ ),
189
+ open && typeof document !== "undefined" && reactDom.createPortal(
190
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: panelRef, className: panelClassName, style: floatingStyle, children: [
191
+ searchable && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cascader-search", children: /* @__PURE__ */ jsxRuntime.jsx(
192
+ chunkHKF2V5MM_cjs.Input,
193
+ {
194
+ ref: searchRef,
195
+ size: "sm",
196
+ leadingIcon: "search",
197
+ value: query,
198
+ onValueChange: setQuery,
199
+ placeholder: "\u641C\u7D22..."
200
+ }
201
+ ) }),
202
+ searchable && query.trim() ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cascader-search-list", children: matchedPaths.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cascader-empty", children: "\u6682\u65E0\u5339\u914D\u9879" }) : matchedPaths.map((itemPath) => /* @__PURE__ */ jsxRuntime.jsx(
203
+ "button",
204
+ {
205
+ type: "button",
206
+ className: "cascader-search-item",
207
+ onClick: () => commit(itemPath.map((item) => item.value), true),
208
+ children: searchConfig.render ? searchConfig.render(query, itemPath) : itemPath.map((item) => item.label).map((label, index) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
209
+ index > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cascader-path-sep", children: "/" }),
210
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
211
+ ] }, index))
212
+ },
213
+ itemPath.map((item) => item.value).join("__")
214
+ )) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cascader-columns", children: columns.map((col, depth) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cascader-col", children: col.map((o) => {
215
+ const isActive = path[depth] === o.value;
216
+ const hasChildren = !!(o.children && o.children.length);
217
+ return /* @__PURE__ */ jsxRuntime.jsxs(
218
+ "button",
219
+ {
220
+ type: "button",
221
+ className: `cascader-item ${isActive ? "active" : ""}`,
222
+ disabled: o.disabled,
223
+ onClick: () => pick(depth, o.value, hasChildren),
224
+ children: [
225
+ chunkV272XR3F_cjs.renderIconSlot(o.icon, { size: 13, className: "cascader-icon" }),
226
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: o.label }),
227
+ hasChildren && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chev", children: /* @__PURE__ */ jsxRuntime.jsx(chunkV272XR3F_cjs.Icon, { name: "chevRight", size: 12 }) })
228
+ ]
229
+ },
230
+ o.value
231
+ );
232
+ }) }, depth)) })
233
+ ] }),
234
+ document.body
235
+ )
236
+ ] });
237
+ });
238
+ Cascader.displayName = "Cascader";
239
+
240
+ exports.Cascader = Cascader;
@@ -1,61 +1,10 @@
1
1
  import './tokens-BIIUTPKN.css';
2
2
  import './shared-NJHRNLRH.css';
3
- import './Empty-NQ72W3D7.css';
3
+ import './Skeleton-CVWH2VWN.css';
4
4
  import * as React from 'react';
5
- import { jsxs, jsx } from 'react/jsx-runtime';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
7
- // src/components/Empty/Empty.tsx
8
- var Empty = React.forwardRef(({
9
- title = "\u6682\u65E0\u5185\u5BB9",
10
- description,
11
- icon,
12
- action,
13
- size = "md",
14
- variant = "default",
15
- className = "",
16
- ...rest
17
- }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: `empty ${size} ${variant} ${className}`, ...rest, children: [
18
- icon && /* @__PURE__ */ jsx("div", { className: "empty-ico", children: icon }),
19
- /* @__PURE__ */ jsx("div", { className: "empty-title", children: title }),
20
- description && /* @__PURE__ */ jsx("div", { className: "empty-desc", children: description }),
21
- action && /* @__PURE__ */ jsx("div", { className: "empty-action", children: action })
22
- ] }));
23
- Empty.displayName = "Empty";
24
- var Spinner = React.forwardRef(({
25
- size = 20,
26
- tone = "accent",
27
- label,
28
- variant = "ring",
29
- className = "",
30
- style,
31
- ...rest
32
- }, ref) => {
33
- const cls = `spinner ${variant} ${tone} ${className}`.trim();
34
- const spinnerStyle = variant === "dots" ? { fontSize: size, ...style } : { width: size, height: size, ...style };
35
- const spinner = variant === "dots" ? /* @__PURE__ */ jsxs("span", { className: cls, style: spinnerStyle, "aria-label": "Loading", children: [
36
- /* @__PURE__ */ jsx("i", {}),
37
- /* @__PURE__ */ jsx("i", {}),
38
- /* @__PURE__ */ jsx("i", {})
39
- ] }) : /* @__PURE__ */ jsx(
40
- "span",
41
- {
42
- className: cls,
43
- style: spinnerStyle,
44
- "aria-label": "Loading"
45
- }
46
- );
47
- if (!label) {
48
- return React.cloneElement(spinner, {
49
- ref,
50
- ...rest
51
- });
52
- }
53
- return /* @__PURE__ */ jsxs("span", { ref, className: "spinner-wrap", style, ...rest, children: [
54
- spinner,
55
- /* @__PURE__ */ jsx("span", { className: "spinner-label", children: label })
56
- ] });
57
- });
58
- Spinner.displayName = "Spinner";
7
+ // src/components/Skeleton/Skeleton.tsx
59
8
  var AVATAR_SIZE_PX = { sm: 32, md: 40, lg: 56 };
60
9
  var Skeleton = React.forwardRef(({
61
10
  width = "100%",
@@ -136,4 +85,4 @@ var Skeleton = React.forwardRef(({
136
85
  });
137
86
  Skeleton.displayName = "Skeleton";
138
87
 
139
- export { Empty, Skeleton, Spinner };
88
+ export { Skeleton };
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunk2MNAZRWE_cjs = require('./chunk-2MNAZRWE.cjs');
3
+ var chunkV272XR3F_cjs = require('./chunk-V272XR3F.cjs');
4
4
  require('./tokens-BIIUTPKN.css');
5
5
  require('./shared-NJHRNLRH.css');
6
- require('./Checkbox-SKJATVSN.css');
6
+ require('./Checkbox-U5EUDSYS.css');
7
7
  var React = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
@@ -65,53 +65,12 @@ var Checkbox = React__namespace.forwardRef(({
65
65
  onClick: toggle,
66
66
  id,
67
67
  className: "checkbox-box",
68
- children: indeterminate ? /* @__PURE__ */ jsxRuntime.jsx(chunk2MNAZRWE_cjs.Icon, { name: "minus", size: 11 }) : value ? /* @__PURE__ */ jsxRuntime.jsx(chunk2MNAZRWE_cjs.Icon, { name: "check", size: 11 }) : null
68
+ children: indeterminate ? /* @__PURE__ */ jsxRuntime.jsx(chunkV272XR3F_cjs.Icon, { name: "minus", size: 11 }) : value ? /* @__PURE__ */ jsxRuntime.jsx(chunkV272XR3F_cjs.Icon, { name: "check", size: 11 }) : null
69
69
  }
70
70
  ),
71
71
  label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "checkbox-label", children: label })
72
72
  ] });
73
73
  });
74
74
  Checkbox.displayName = "Checkbox";
75
- var RadioGroupInner = ({
76
- options,
77
- value,
78
- defaultValue,
79
- onChange,
80
- direction = "vertical",
81
- className = "",
82
- ...rest
83
- }, ref) => {
84
- const [inner, setInner] = React__namespace.useState(defaultValue);
85
- const isControlled = value !== void 0;
86
- const current = isControlled ? value : inner;
87
- const pick = (v) => {
88
- if (!isControlled) setInner(v);
89
- onChange?.(v);
90
- };
91
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: `radio-group ${direction} ${className}`, ...rest, children: options.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs(
92
- "label",
93
- {
94
- className: `radio ${current === opt.value ? "checked" : ""} ${opt.disabled ? "disabled" : ""}`,
95
- children: [
96
- /* @__PURE__ */ jsxRuntime.jsx(
97
- "button",
98
- {
99
- type: "button",
100
- role: "radio",
101
- "aria-checked": current === opt.value,
102
- disabled: opt.disabled,
103
- onClick: () => pick(opt.value),
104
- className: "radio-dot"
105
- }
106
- ),
107
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "radio-label", children: opt.label })
108
- ]
109
- },
110
- String(opt.value)
111
- )) });
112
- };
113
- var RadioGroup = React__namespace.forwardRef(RadioGroupInner);
114
- RadioGroup.displayName = "RadioGroup";
115
75
 
116
76
  exports.Checkbox = Checkbox;
117
- exports.RadioGroup = RadioGroup;
@@ -49,24 +49,95 @@ var FONT_STACKS = {
49
49
  };
50
50
  var DEFAULT_CONFIG = {
51
51
  mode: "light",
52
+ colorScheme: "light",
52
53
  accent: "sky",
53
54
  density: "comfortable",
54
55
  intensity: 5,
55
56
  radius: 20,
56
57
  font: "sf",
57
- tokens: {}
58
+ tokens: {},
59
+ themes: {}
58
60
  };
59
61
  var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
62
+ function isThemeBaseMode(mode) {
63
+ return mode === "light" || mode === "dark";
64
+ }
65
+ function isBuiltInThemeMode(mode) {
66
+ return mode === "light" || mode === "dark" || mode === "system";
67
+ }
68
+ function getThemePreset(themes, mode) {
69
+ if (!mode || isBuiltInThemeMode(mode)) return void 0;
70
+ return themes?.[mode];
71
+ }
72
+ function applyThemePreset(config, mode) {
73
+ const preset = getThemePreset(config.themes, mode);
74
+ if (!preset) {
75
+ return {
76
+ ...config,
77
+ mode,
78
+ colorScheme: isThemeBaseMode(mode) ? mode : config.colorScheme
79
+ };
80
+ }
81
+ return {
82
+ ...config,
83
+ mode,
84
+ colorScheme: preset.base ?? config.colorScheme ?? DEFAULT_CONFIG.colorScheme,
85
+ accent: preset.accent ?? config.accent,
86
+ density: preset.density ?? config.density,
87
+ intensity: preset.intensity ?? config.intensity,
88
+ radius: preset.radius ?? config.radius,
89
+ font: preset.font ?? config.font,
90
+ tokens: preset.tokens ? { ...preset.tokens } : config.tokens
91
+ };
92
+ }
93
+ function resolveThemeConfig(config) {
94
+ const mode = config.mode ?? DEFAULT_CONFIG.mode;
95
+ const themes = config.themes ?? DEFAULT_CONFIG.themes;
96
+ const preset = getThemePreset(themes, mode);
97
+ const presetConfig = preset ? {
98
+ ...preset.base ? { colorScheme: preset.base } : null,
99
+ ...preset.accent ? { accent: preset.accent } : null,
100
+ ...preset.density ? { density: preset.density } : null,
101
+ ...preset.intensity != null ? { intensity: preset.intensity } : null,
102
+ ...preset.radius != null ? { radius: preset.radius } : null,
103
+ ...preset.font ? { font: preset.font } : null
104
+ } : {};
105
+ const merged = {
106
+ ...DEFAULT_CONFIG,
107
+ ...presetConfig,
108
+ ...config,
109
+ mode,
110
+ themes,
111
+ tokens: {
112
+ ...preset?.tokens ?? {},
113
+ ...config.tokens ?? {}
114
+ }
115
+ };
116
+ return {
117
+ ...merged,
118
+ colorScheme: merged.colorScheme ?? preset?.base ?? DEFAULT_CONFIG.colorScheme,
119
+ accent: merged.accent ?? preset?.accent ?? DEFAULT_CONFIG.accent,
120
+ density: merged.density ?? preset?.density ?? DEFAULT_CONFIG.density,
121
+ intensity: merged.intensity ?? preset?.intensity ?? DEFAULT_CONFIG.intensity,
122
+ radius: merged.radius ?? preset?.radius ?? DEFAULT_CONFIG.radius,
123
+ font: merged.font ?? preset?.font ?? DEFAULT_CONFIG.font
124
+ };
125
+ }
60
126
  function resolveThemeMode(mode) {
61
127
  if (mode !== "system") return mode;
62
128
  if (!isBrowser) return "light";
63
129
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
64
130
  }
65
- function normalizeAccentInput(input, resolvedMode) {
131
+ function resolveThemeColorScheme(mode, themes, fallback) {
132
+ if (mode === "system") return fallback ?? resolveThemeMode(mode);
133
+ if (isThemeBaseMode(mode)) return mode;
134
+ return getThemePreset(themes, mode)?.base ?? fallback ?? DEFAULT_CONFIG.colorScheme;
135
+ }
136
+ function normalizeAccentInput(input, colorScheme) {
66
137
  if (typeof input === "string" && input in ACCENT_PRESETS) {
67
138
  const key = input;
68
139
  const base = ACCENT_PRESETS[key];
69
- if (resolvedMode === "dark") {
140
+ if (colorScheme === "dark") {
70
141
  return { key, palette: { ...base, ...ACCENT_PRESETS_DARK[key] } };
71
142
  }
72
143
  return { key, palette: base };
@@ -74,18 +145,20 @@ function normalizeAccentInput(input, resolvedMode) {
74
145
  const raw = typeof input === "string" ? { accent: input } : input;
75
146
  const { accent } = raw;
76
147
  const ink = raw.ink ?? `color-mix(in oklch, ${accent} 65%, black)`;
77
- const soft = raw.soft ?? (resolvedMode === "dark" ? `color-mix(in oklch, ${accent} 30%, black)` : `color-mix(in oklch, ${accent} 15%, white)`);
78
- const glow = raw.glow ?? (resolvedMode === "dark" ? `color-mix(in oklch, ${accent} 18%, transparent)` : `color-mix(in oklch, ${accent} 35%, transparent)`);
148
+ const soft = raw.soft ?? (colorScheme === "dark" ? `color-mix(in oklch, ${accent} 30%, black)` : `color-mix(in oklch, ${accent} 15%, white)`);
149
+ const glow = raw.glow ?? (colorScheme === "dark" ? `color-mix(in oklch, ${accent} 18%, transparent)` : `color-mix(in oklch, ${accent} 35%, transparent)`);
79
150
  return { key: "custom", palette: { accent, ink, soft, glow } };
80
151
  }
81
152
  function toVar(key) {
82
153
  return key.startsWith("--") ? key : `--${key}`;
83
154
  }
84
155
  function applyTheme(target, config) {
85
- const cfg = { ...DEFAULT_CONFIG, ...config };
86
- const resolvedMode = resolveThemeMode(cfg.mode);
87
- const { key, palette } = normalizeAccentInput(cfg.accent, resolvedMode);
88
- target.dataset.theme = resolvedMode;
156
+ const cfg = resolveThemeConfig(config);
157
+ resolveThemeMode(cfg.mode);
158
+ const colorScheme = resolveThemeColorScheme(cfg.mode, cfg.themes, cfg.colorScheme);
159
+ const { key, palette } = normalizeAccentInput(cfg.accent, colorScheme);
160
+ target.dataset.theme = colorScheme;
161
+ target.dataset.themeMode = cfg.mode;
89
162
  target.dataset.density = cfg.density;
90
163
  if (key === "custom") {
91
164
  delete target.dataset.accent;
@@ -146,7 +219,8 @@ function loadPersisted(key) {
146
219
  function persist(key, cfg) {
147
220
  if (!key || !isBrowser) return;
148
221
  try {
149
- localStorage.setItem(key, JSON.stringify(cfg));
222
+ const { themes: _themes, ...persisted } = cfg;
223
+ localStorage.setItem(key, JSON.stringify(persisted));
150
224
  } catch {
151
225
  }
152
226
  }
@@ -164,41 +238,69 @@ var ThemeProvider = (props) => {
164
238
  const initialConfig = React__namespace.useMemo(() => {
165
239
  const fromProps = {
166
240
  mode: configProps.mode ?? DEFAULT_CONFIG.mode,
241
+ colorScheme: configProps.colorScheme,
167
242
  accent: configProps.accent ?? DEFAULT_CONFIG.accent,
168
243
  density: configProps.density ?? DEFAULT_CONFIG.density,
169
244
  intensity: configProps.intensity ?? DEFAULT_CONFIG.intensity,
170
245
  radius: configProps.radius ?? DEFAULT_CONFIG.radius,
171
246
  font: configProps.font ?? DEFAULT_CONFIG.font,
172
- tokens: configProps.tokens ?? {}
247
+ tokens: configProps.tokens ?? {},
248
+ themes: configProps.themes ?? DEFAULT_CONFIG.themes
173
249
  };
174
250
  const persisted = loadPersisted(storageKey);
175
- return persisted ? { ...fromProps, ...persisted } : fromProps;
251
+ const seeded = applyThemePreset(fromProps, fromProps.mode ?? DEFAULT_CONFIG.mode);
252
+ const withExplicitProps = {
253
+ ...seeded,
254
+ ...configProps.colorScheme ? { colorScheme: configProps.colorScheme } : null,
255
+ ...configProps.accent ? { accent: configProps.accent } : null,
256
+ ...configProps.density ? { density: configProps.density } : null,
257
+ ...configProps.intensity != null ? { intensity: configProps.intensity } : null,
258
+ ...configProps.radius != null ? { radius: configProps.radius } : null,
259
+ ...configProps.font ? { font: configProps.font } : null,
260
+ ...configProps.tokens ? { tokens: configProps.tokens } : null
261
+ };
262
+ if (!persisted) return withExplicitProps;
263
+ const persistedMode = persisted.mode ?? withExplicitProps.mode ?? DEFAULT_CONFIG.mode;
264
+ return {
265
+ ...applyThemePreset({ ...withExplicitProps, mode: persistedMode }, persistedMode),
266
+ ...persisted
267
+ };
176
268
  }, []);
177
269
  const [config, setConfig] = React__namespace.useState(initialConfig);
178
270
  React__namespace.useEffect(() => {
179
271
  setConfig((c) => {
272
+ const base = {
273
+ ...c,
274
+ themes: configProps.themes ?? c.themes
275
+ };
276
+ const mode = configProps.mode ?? c.mode ?? DEFAULT_CONFIG.mode;
277
+ const nextFromMode = configProps.mode ? applyThemePreset(base, mode) : base;
180
278
  const next = {
181
- mode: configProps.mode ?? c.mode,
182
- accent: configProps.accent ?? c.accent,
183
- density: configProps.density ?? c.density,
184
- intensity: configProps.intensity ?? c.intensity,
185
- radius: configProps.radius ?? c.radius,
186
- font: configProps.font ?? c.font,
187
- tokens: configProps.tokens ?? c.tokens
279
+ ...nextFromMode,
280
+ mode,
281
+ colorScheme: configProps.colorScheme ?? nextFromMode.colorScheme,
282
+ accent: configProps.accent ?? nextFromMode.accent,
283
+ density: configProps.density ?? nextFromMode.density,
284
+ intensity: configProps.intensity ?? nextFromMode.intensity,
285
+ radius: configProps.radius ?? nextFromMode.radius,
286
+ font: configProps.font ?? nextFromMode.font,
287
+ tokens: configProps.tokens ?? nextFromMode.tokens
188
288
  };
189
- if (next.mode === c.mode && next.accent === c.accent && next.density === c.density && next.intensity === c.intensity && next.radius === c.radius && next.font === c.font && next.tokens === c.tokens) {
289
+ if (next.mode === c.mode && next.colorScheme === c.colorScheme && next.accent === c.accent && next.density === c.density && next.intensity === c.intensity && next.radius === c.radius && next.font === c.font && next.tokens === c.tokens && next.themes === c.themes) {
190
290
  return c;
191
291
  }
192
292
  return next;
193
293
  });
194
294
  }, [
195
295
  configProps.mode,
296
+ configProps.colorScheme,
196
297
  configProps.accent,
197
298
  configProps.density,
198
299
  configProps.intensity,
199
300
  configProps.radius,
200
301
  configProps.font,
201
- configProps.tokens
302
+ configProps.tokens,
303
+ configProps.themes
202
304
  ]);
203
305
  const [systemDark, setSystemDark] = React__namespace.useState(
204
306
  () => isBrowser && window.matchMedia("(prefers-color-scheme: dark)").matches
@@ -210,32 +312,47 @@ var ThemeProvider = (props) => {
210
312
  mql.addEventListener?.("change", handler);
211
313
  return () => mql.removeEventListener?.("change", handler);
212
314
  }, []);
213
- const resolvedMode = config.mode === "system" ? systemDark ? "dark" : "light" : config.mode;
315
+ const effectiveConfig = React__namespace.useMemo(() => resolveThemeConfig(config), [config]);
316
+ const activeTheme = React__namespace.useMemo(
317
+ () => getThemePreset(effectiveConfig.themes, effectiveConfig.mode) ?? null,
318
+ [effectiveConfig.mode, effectiveConfig.themes]
319
+ );
320
+ const colorScheme = effectiveConfig.mode === "system" ? systemDark ? "dark" : "light" : isThemeBaseMode(effectiveConfig.mode) ? effectiveConfig.mode : effectiveConfig.colorScheme ?? activeTheme?.base ?? DEFAULT_CONFIG.colorScheme;
321
+ const resolvedMode = effectiveConfig.mode === "system" ? colorScheme : effectiveConfig.mode;
214
322
  const { key: accentKey, palette: accentPalette } = React__namespace.useMemo(
215
- () => normalizeAccentInput(config.accent, resolvedMode),
216
- [config.accent, resolvedMode]
323
+ () => normalizeAccentInput(effectiveConfig.accent, colorScheme),
324
+ [effectiveConfig.accent, colorScheme]
217
325
  );
218
326
  const scopeRef = React__namespace.useRef(null);
327
+ const appliedTokenKeysRef = React__namespace.useRef(/* @__PURE__ */ new Set());
219
328
  React__namespace.useEffect(() => {
220
329
  if (!isBrowser) return;
221
330
  const el = target === "root" ? document.documentElement : scopeRef.current;
222
331
  if (!el) return;
223
- applyTheme(el, { ...config, mode: resolvedMode });
332
+ const nextTokenKeys = new Set(Object.keys(effectiveConfig.tokens));
333
+ for (const key of appliedTokenKeysRef.current) {
334
+ if (!nextTokenKeys.has(key)) el.style.removeProperty(toVar(key));
335
+ }
336
+ applyTheme(el, { ...effectiveConfig, colorScheme });
337
+ appliedTokenKeysRef.current = nextTokenKeys;
224
338
  persist(storageKey, config);
225
- }, [config, resolvedMode, target, storageKey]);
339
+ }, [config, effectiveConfig, colorScheme, target, storageKey]);
226
340
  const value = React__namespace.useMemo(() => {
227
341
  const patch = (p) => setConfig((c) => ({ ...c, ...p }));
228
342
  return {
229
- mode: config.mode,
343
+ mode: effectiveConfig.mode,
230
344
  resolvedMode,
345
+ colorScheme,
231
346
  accent: accentKey,
232
347
  accentPalette,
233
- density: config.density,
234
- intensity: config.intensity,
235
- radius: config.radius,
236
- font: config.font,
237
- tokens: config.tokens ?? {},
238
- setMode: (m) => patch({ mode: m }),
348
+ density: effectiveConfig.density,
349
+ intensity: effectiveConfig.intensity,
350
+ radius: effectiveConfig.radius,
351
+ font: effectiveConfig.font,
352
+ tokens: effectiveConfig.tokens,
353
+ themes: effectiveConfig.themes,
354
+ activeTheme,
355
+ setMode: (m) => setConfig((c) => applyThemePreset(c, m)),
239
356
  toggleMode: () => setConfig((c) => ({
240
357
  ...c,
241
358
  mode: c.mode === "dark" ? "light" : "dark"
@@ -246,10 +363,11 @@ var ThemeProvider = (props) => {
246
363
  setRadius: (n) => patch({ radius: n }),
247
364
  setFont: (f) => patch({ font: f }),
248
365
  setTokens: (t) => patch({ tokens: t }),
366
+ setThemes: (t) => patch({ themes: t }),
249
367
  update: patch,
250
368
  reset: () => setConfig(initialConfig)
251
369
  };
252
- }, [config, resolvedMode, accentKey, accentPalette, initialConfig]);
370
+ }, [effectiveConfig, resolvedMode, colorScheme, accentKey, accentPalette, activeTheme, initialConfig]);
253
371
  const onChangeRef = React__namespace.useRef(onChange);
254
372
  onChangeRef.current = onChange;
255
373
  React__namespace.useEffect(() => {
@@ -276,6 +394,7 @@ exports.FONT_STACKS = FONT_STACKS;
276
394
  exports.ThemeProvider = ThemeProvider;
277
395
  exports.applyTheme = applyTheme;
278
396
  exports.normalizeAccentInput = normalizeAccentInput;
397
+ exports.resolveThemeColorScheme = resolveThemeColorScheme;
279
398
  exports.resolveThemeMode = resolveThemeMode;
280
399
  exports.useTheme = useTheme;
281
400
  exports.useThemeOptional = useThemeOptional;