@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
@@ -6,6 +6,11 @@ import * as React from 'react';
6
6
  import { createPortal } from 'react-dom';
7
7
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
8
 
9
+ var normalizePlacement = (placement) => {
10
+ const base = placement.startsWith("top") ? "top" : placement.startsWith("bottom") ? "bottom" : placement.startsWith("left") ? "left" : placement.startsWith("right") ? "right" : placement;
11
+ const alignCross = placement.endsWith("Left") || placement.endsWith("Top") ? "start" : placement.endsWith("Right") || placement.endsWith("Bottom") ? "end" : "center";
12
+ return { placement: base, alignCross };
13
+ };
9
14
  var Popover = React.forwardRef(({
10
15
  content,
11
16
  title,
@@ -16,18 +21,24 @@ var Popover = React.forwardRef(({
16
21
  width,
17
22
  defaultOpen = false,
18
23
  open,
24
+ visible,
19
25
  onOpenChange,
26
+ onVisibleChange,
20
27
  children,
21
28
  className = "",
29
+ overlayClassName = "",
30
+ popupClassName = "",
22
31
  onClick,
23
32
  onMouseEnter,
24
33
  onMouseLeave,
25
34
  ...rest
26
35
  }, ref) => {
27
36
  const [inner, setInner] = React.useState(defaultOpen);
28
- const isControlled = open !== void 0;
29
- const show = isControlled ? open : inner;
37
+ const controlledOpen = open ?? visible;
38
+ const isControlled = controlledOpen !== void 0;
39
+ const show = isControlled ? controlledOpen : inner;
30
40
  const panelWidth = width === "auto" ? 160 : width ?? 240;
41
+ const normalized = normalizePlacement(placement);
31
42
  const {
32
43
  triggerRef,
33
44
  floatingRef,
@@ -35,15 +46,16 @@ var Popover = React.forwardRef(({
35
46
  placement: resolved
36
47
  } = useFloating({
37
48
  open: show,
38
- placement,
49
+ placement: normalized.placement,
39
50
  panelWidth,
40
51
  panelHeight: 160,
41
- alignCross: "center"
52
+ alignCross: normalized.alignCross
42
53
  });
43
54
  const set = React.useCallback((v) => {
44
55
  if (!isControlled) setInner(v);
45
56
  onOpenChange?.(v);
46
- }, [isControlled, onOpenChange]);
57
+ onVisibleChange?.(v);
58
+ }, [isControlled, onOpenChange, onVisibleChange]);
47
59
  const setTriggerRef = React.useCallback(
48
60
  (node) => {
49
61
  triggerRef.current = node;
@@ -108,7 +120,7 @@ var Popover = React.forwardRef(({
108
120
  "div",
109
121
  {
110
122
  ref: floatingRef,
111
- className: `popover popover-${resolved}`,
123
+ className: `popover popover-${resolved} ${overlayClassName} ${popupClassName}`,
112
124
  style: { ...floatingStyle, ...widthStyle },
113
125
  ...panelHover,
114
126
  children: [
@@ -2,7 +2,7 @@
2
2
 
3
3
  require('./tokens-BIIUTPKN.css');
4
4
  require('./shared-NJHRNLRH.css');
5
- require('./Empty-NQ72W3D7.css');
5
+ require('./Skeleton-CVWH2VWN.css');
6
6
  var React = require('react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
8
 
@@ -26,58 +26,7 @@ function _interopNamespace(e) {
26
26
 
27
27
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
28
 
29
- // src/components/Empty/Empty.tsx
30
- var Empty = React__namespace.forwardRef(({
31
- title = "\u6682\u65E0\u5185\u5BB9",
32
- description,
33
- icon,
34
- action,
35
- size = "md",
36
- variant = "default",
37
- className = "",
38
- ...rest
39
- }, ref) => /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: `empty ${size} ${variant} ${className}`, ...rest, children: [
40
- icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-ico", children: icon }),
41
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-title", children: title }),
42
- description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-desc", children: description }),
43
- action && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-action", children: action })
44
- ] }));
45
- Empty.displayName = "Empty";
46
- var Spinner = React__namespace.forwardRef(({
47
- size = 20,
48
- tone = "accent",
49
- label,
50
- variant = "ring",
51
- className = "",
52
- style,
53
- ...rest
54
- }, ref) => {
55
- const cls = `spinner ${variant} ${tone} ${className}`.trim();
56
- const spinnerStyle = variant === "dots" ? { fontSize: size, ...style } : { width: size, height: size, ...style };
57
- const spinner = variant === "dots" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cls, style: spinnerStyle, "aria-label": "Loading", children: [
58
- /* @__PURE__ */ jsxRuntime.jsx("i", {}),
59
- /* @__PURE__ */ jsxRuntime.jsx("i", {}),
60
- /* @__PURE__ */ jsxRuntime.jsx("i", {})
61
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(
62
- "span",
63
- {
64
- className: cls,
65
- style: spinnerStyle,
66
- "aria-label": "Loading"
67
- }
68
- );
69
- if (!label) {
70
- return React__namespace.cloneElement(spinner, {
71
- ref,
72
- ...rest
73
- });
74
- }
75
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { ref, className: "spinner-wrap", style, ...rest, children: [
76
- spinner,
77
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "spinner-label", children: label })
78
- ] });
79
- });
80
- Spinner.displayName = "Spinner";
29
+ // src/components/Skeleton/Skeleton.tsx
81
30
  var AVATAR_SIZE_PX = { sm: 32, md: 40, lg: 56 };
82
31
  var Skeleton = React__namespace.forwardRef(({
83
32
  width = "100%",
@@ -158,6 +107,4 @@ var Skeleton = React__namespace.forwardRef(({
158
107
  });
159
108
  Skeleton.displayName = "Skeleton";
160
109
 
161
- exports.Empty = Empty;
162
110
  exports.Skeleton = Skeleton;
163
- exports.Spinner = Spinner;
@@ -1,7 +1,7 @@
1
- import { Icon } from './chunk-NJ6B22YJ.js';
1
+ import { renderIconSlot, Icon } from './chunk-47VG2P34.js';
2
2
  import './tokens-BIIUTPKN.css';
3
3
  import './shared-NJHRNLRH.css';
4
- import './Alert-JJ7GB3UU.css';
4
+ import './Alert-QBKIDY5H.css';
5
5
  import * as React from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -17,7 +17,7 @@ var Alert = React.forwardRef(({
17
17
  className = "",
18
18
  ...rest
19
19
  }, ref) => {
20
- const iconName = icon ?? (tone === "success" ? "check2" : tone === "warning" || tone === "danger" ? "alert" : "info");
20
+ const iconNode = icon ?? (tone === "success" ? "check2" : tone === "warning" || tone === "danger" ? "alert" : "info");
21
21
  return /* @__PURE__ */ jsxs(
22
22
  "div",
23
23
  {
@@ -26,7 +26,7 @@ var Alert = React.forwardRef(({
26
26
  role: "alert",
27
27
  ...rest,
28
28
  children: [
29
- showIcon && /* @__PURE__ */ jsx("span", { className: "alert-ico", children: /* @__PURE__ */ jsx(Icon, { name: iconName, size: 14 }) }),
29
+ showIcon && /* @__PURE__ */ jsx("span", { className: "alert-ico", children: renderIconSlot(iconNode, { size: 14 }) }),
30
30
  /* @__PURE__ */ jsxs("div", { className: "alert-body", children: [
31
31
  title && /* @__PURE__ */ jsx("div", { className: "alert-title", children: title }),
32
32
  children && /* @__PURE__ */ jsx("div", { className: "alert-desc", children })
@@ -0,0 +1,26 @@
1
+ import { Table } from './chunk-BPOOVO5T.js';
2
+ import './tokens-BIIUTPKN.css';
3
+ import './shared-NJHRNLRH.css';
4
+ import './TablePro-3XVHYLSL.css';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function TablePro({
8
+ toolbar,
9
+ actions,
10
+ footer,
11
+ title,
12
+ className = "",
13
+ ...tableProps
14
+ }) {
15
+ return /* @__PURE__ */ jsxs("div", { className: `table-card ${className}`, children: [
16
+ (title || toolbar || actions) && /* @__PURE__ */ jsxs("div", { className: "table-toolbar", children: [
17
+ title && /* @__PURE__ */ jsx("div", { className: "table-title", children: title }),
18
+ /* @__PURE__ */ jsx("div", { className: "table-toolbar-main", children: toolbar }),
19
+ actions && /* @__PURE__ */ jsx("div", { className: "table-toolbar-actions", children: actions })
20
+ ] }),
21
+ /* @__PURE__ */ jsx(Table, { ...tableProps, className: "joined" }),
22
+ footer && /* @__PURE__ */ jsx("div", { className: "table-footer", children: footer })
23
+ ] });
24
+ }
25
+
26
+ export { TablePro };
@@ -27,24 +27,95 @@ var FONT_STACKS = {
27
27
  };
28
28
  var DEFAULT_CONFIG = {
29
29
  mode: "light",
30
+ colorScheme: "light",
30
31
  accent: "sky",
31
32
  density: "comfortable",
32
33
  intensity: 5,
33
34
  radius: 20,
34
35
  font: "sf",
35
- tokens: {}
36
+ tokens: {},
37
+ themes: {}
36
38
  };
37
39
  var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
40
+ function isThemeBaseMode(mode) {
41
+ return mode === "light" || mode === "dark";
42
+ }
43
+ function isBuiltInThemeMode(mode) {
44
+ return mode === "light" || mode === "dark" || mode === "system";
45
+ }
46
+ function getThemePreset(themes, mode) {
47
+ if (!mode || isBuiltInThemeMode(mode)) return void 0;
48
+ return themes?.[mode];
49
+ }
50
+ function applyThemePreset(config, mode) {
51
+ const preset = getThemePreset(config.themes, mode);
52
+ if (!preset) {
53
+ return {
54
+ ...config,
55
+ mode,
56
+ colorScheme: isThemeBaseMode(mode) ? mode : config.colorScheme
57
+ };
58
+ }
59
+ return {
60
+ ...config,
61
+ mode,
62
+ colorScheme: preset.base ?? config.colorScheme ?? DEFAULT_CONFIG.colorScheme,
63
+ accent: preset.accent ?? config.accent,
64
+ density: preset.density ?? config.density,
65
+ intensity: preset.intensity ?? config.intensity,
66
+ radius: preset.radius ?? config.radius,
67
+ font: preset.font ?? config.font,
68
+ tokens: preset.tokens ? { ...preset.tokens } : config.tokens
69
+ };
70
+ }
71
+ function resolveThemeConfig(config) {
72
+ const mode = config.mode ?? DEFAULT_CONFIG.mode;
73
+ const themes = config.themes ?? DEFAULT_CONFIG.themes;
74
+ const preset = getThemePreset(themes, mode);
75
+ const presetConfig = preset ? {
76
+ ...preset.base ? { colorScheme: preset.base } : null,
77
+ ...preset.accent ? { accent: preset.accent } : null,
78
+ ...preset.density ? { density: preset.density } : null,
79
+ ...preset.intensity != null ? { intensity: preset.intensity } : null,
80
+ ...preset.radius != null ? { radius: preset.radius } : null,
81
+ ...preset.font ? { font: preset.font } : null
82
+ } : {};
83
+ const merged = {
84
+ ...DEFAULT_CONFIG,
85
+ ...presetConfig,
86
+ ...config,
87
+ mode,
88
+ themes,
89
+ tokens: {
90
+ ...preset?.tokens ?? {},
91
+ ...config.tokens ?? {}
92
+ }
93
+ };
94
+ return {
95
+ ...merged,
96
+ colorScheme: merged.colorScheme ?? preset?.base ?? DEFAULT_CONFIG.colorScheme,
97
+ accent: merged.accent ?? preset?.accent ?? DEFAULT_CONFIG.accent,
98
+ density: merged.density ?? preset?.density ?? DEFAULT_CONFIG.density,
99
+ intensity: merged.intensity ?? preset?.intensity ?? DEFAULT_CONFIG.intensity,
100
+ radius: merged.radius ?? preset?.radius ?? DEFAULT_CONFIG.radius,
101
+ font: merged.font ?? preset?.font ?? DEFAULT_CONFIG.font
102
+ };
103
+ }
38
104
  function resolveThemeMode(mode) {
39
105
  if (mode !== "system") return mode;
40
106
  if (!isBrowser) return "light";
41
107
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
42
108
  }
43
- function normalizeAccentInput(input, resolvedMode) {
109
+ function resolveThemeColorScheme(mode, themes, fallback) {
110
+ if (mode === "system") return fallback ?? resolveThemeMode(mode);
111
+ if (isThemeBaseMode(mode)) return mode;
112
+ return getThemePreset(themes, mode)?.base ?? fallback ?? DEFAULT_CONFIG.colorScheme;
113
+ }
114
+ function normalizeAccentInput(input, colorScheme) {
44
115
  if (typeof input === "string" && input in ACCENT_PRESETS) {
45
116
  const key = input;
46
117
  const base = ACCENT_PRESETS[key];
47
- if (resolvedMode === "dark") {
118
+ if (colorScheme === "dark") {
48
119
  return { key, palette: { ...base, ...ACCENT_PRESETS_DARK[key] } };
49
120
  }
50
121
  return { key, palette: base };
@@ -52,18 +123,20 @@ function normalizeAccentInput(input, resolvedMode) {
52
123
  const raw = typeof input === "string" ? { accent: input } : input;
53
124
  const { accent } = raw;
54
125
  const ink = raw.ink ?? `color-mix(in oklch, ${accent} 65%, black)`;
55
- const soft = raw.soft ?? (resolvedMode === "dark" ? `color-mix(in oklch, ${accent} 30%, black)` : `color-mix(in oklch, ${accent} 15%, white)`);
56
- const glow = raw.glow ?? (resolvedMode === "dark" ? `color-mix(in oklch, ${accent} 18%, transparent)` : `color-mix(in oklch, ${accent} 35%, transparent)`);
126
+ const soft = raw.soft ?? (colorScheme === "dark" ? `color-mix(in oklch, ${accent} 30%, black)` : `color-mix(in oklch, ${accent} 15%, white)`);
127
+ const glow = raw.glow ?? (colorScheme === "dark" ? `color-mix(in oklch, ${accent} 18%, transparent)` : `color-mix(in oklch, ${accent} 35%, transparent)`);
57
128
  return { key: "custom", palette: { accent, ink, soft, glow } };
58
129
  }
59
130
  function toVar(key) {
60
131
  return key.startsWith("--") ? key : `--${key}`;
61
132
  }
62
133
  function applyTheme(target, config) {
63
- const cfg = { ...DEFAULT_CONFIG, ...config };
64
- const resolvedMode = resolveThemeMode(cfg.mode);
65
- const { key, palette } = normalizeAccentInput(cfg.accent, resolvedMode);
66
- target.dataset.theme = resolvedMode;
134
+ const cfg = resolveThemeConfig(config);
135
+ resolveThemeMode(cfg.mode);
136
+ const colorScheme = resolveThemeColorScheme(cfg.mode, cfg.themes, cfg.colorScheme);
137
+ const { key, palette } = normalizeAccentInput(cfg.accent, colorScheme);
138
+ target.dataset.theme = colorScheme;
139
+ target.dataset.themeMode = cfg.mode;
67
140
  target.dataset.density = cfg.density;
68
141
  if (key === "custom") {
69
142
  delete target.dataset.accent;
@@ -124,7 +197,8 @@ function loadPersisted(key) {
124
197
  function persist(key, cfg) {
125
198
  if (!key || !isBrowser) return;
126
199
  try {
127
- localStorage.setItem(key, JSON.stringify(cfg));
200
+ const { themes: _themes, ...persisted } = cfg;
201
+ localStorage.setItem(key, JSON.stringify(persisted));
128
202
  } catch {
129
203
  }
130
204
  }
@@ -142,41 +216,69 @@ var ThemeProvider = (props) => {
142
216
  const initialConfig = React.useMemo(() => {
143
217
  const fromProps = {
144
218
  mode: configProps.mode ?? DEFAULT_CONFIG.mode,
219
+ colorScheme: configProps.colorScheme,
145
220
  accent: configProps.accent ?? DEFAULT_CONFIG.accent,
146
221
  density: configProps.density ?? DEFAULT_CONFIG.density,
147
222
  intensity: configProps.intensity ?? DEFAULT_CONFIG.intensity,
148
223
  radius: configProps.radius ?? DEFAULT_CONFIG.radius,
149
224
  font: configProps.font ?? DEFAULT_CONFIG.font,
150
- tokens: configProps.tokens ?? {}
225
+ tokens: configProps.tokens ?? {},
226
+ themes: configProps.themes ?? DEFAULT_CONFIG.themes
151
227
  };
152
228
  const persisted = loadPersisted(storageKey);
153
- return persisted ? { ...fromProps, ...persisted } : fromProps;
229
+ const seeded = applyThemePreset(fromProps, fromProps.mode ?? DEFAULT_CONFIG.mode);
230
+ const withExplicitProps = {
231
+ ...seeded,
232
+ ...configProps.colorScheme ? { colorScheme: configProps.colorScheme } : null,
233
+ ...configProps.accent ? { accent: configProps.accent } : null,
234
+ ...configProps.density ? { density: configProps.density } : null,
235
+ ...configProps.intensity != null ? { intensity: configProps.intensity } : null,
236
+ ...configProps.radius != null ? { radius: configProps.radius } : null,
237
+ ...configProps.font ? { font: configProps.font } : null,
238
+ ...configProps.tokens ? { tokens: configProps.tokens } : null
239
+ };
240
+ if (!persisted) return withExplicitProps;
241
+ const persistedMode = persisted.mode ?? withExplicitProps.mode ?? DEFAULT_CONFIG.mode;
242
+ return {
243
+ ...applyThemePreset({ ...withExplicitProps, mode: persistedMode }, persistedMode),
244
+ ...persisted
245
+ };
154
246
  }, []);
155
247
  const [config, setConfig] = React.useState(initialConfig);
156
248
  React.useEffect(() => {
157
249
  setConfig((c) => {
250
+ const base = {
251
+ ...c,
252
+ themes: configProps.themes ?? c.themes
253
+ };
254
+ const mode = configProps.mode ?? c.mode ?? DEFAULT_CONFIG.mode;
255
+ const nextFromMode = configProps.mode ? applyThemePreset(base, mode) : base;
158
256
  const next = {
159
- mode: configProps.mode ?? c.mode,
160
- accent: configProps.accent ?? c.accent,
161
- density: configProps.density ?? c.density,
162
- intensity: configProps.intensity ?? c.intensity,
163
- radius: configProps.radius ?? c.radius,
164
- font: configProps.font ?? c.font,
165
- tokens: configProps.tokens ?? c.tokens
257
+ ...nextFromMode,
258
+ mode,
259
+ colorScheme: configProps.colorScheme ?? nextFromMode.colorScheme,
260
+ accent: configProps.accent ?? nextFromMode.accent,
261
+ density: configProps.density ?? nextFromMode.density,
262
+ intensity: configProps.intensity ?? nextFromMode.intensity,
263
+ radius: configProps.radius ?? nextFromMode.radius,
264
+ font: configProps.font ?? nextFromMode.font,
265
+ tokens: configProps.tokens ?? nextFromMode.tokens
166
266
  };
167
- 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) {
267
+ 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) {
168
268
  return c;
169
269
  }
170
270
  return next;
171
271
  });
172
272
  }, [
173
273
  configProps.mode,
274
+ configProps.colorScheme,
174
275
  configProps.accent,
175
276
  configProps.density,
176
277
  configProps.intensity,
177
278
  configProps.radius,
178
279
  configProps.font,
179
- configProps.tokens
280
+ configProps.tokens,
281
+ configProps.themes
180
282
  ]);
181
283
  const [systemDark, setSystemDark] = React.useState(
182
284
  () => isBrowser && window.matchMedia("(prefers-color-scheme: dark)").matches
@@ -188,32 +290,47 @@ var ThemeProvider = (props) => {
188
290
  mql.addEventListener?.("change", handler);
189
291
  return () => mql.removeEventListener?.("change", handler);
190
292
  }, []);
191
- const resolvedMode = config.mode === "system" ? systemDark ? "dark" : "light" : config.mode;
293
+ const effectiveConfig = React.useMemo(() => resolveThemeConfig(config), [config]);
294
+ const activeTheme = React.useMemo(
295
+ () => getThemePreset(effectiveConfig.themes, effectiveConfig.mode) ?? null,
296
+ [effectiveConfig.mode, effectiveConfig.themes]
297
+ );
298
+ const colorScheme = effectiveConfig.mode === "system" ? systemDark ? "dark" : "light" : isThemeBaseMode(effectiveConfig.mode) ? effectiveConfig.mode : effectiveConfig.colorScheme ?? activeTheme?.base ?? DEFAULT_CONFIG.colorScheme;
299
+ const resolvedMode = effectiveConfig.mode === "system" ? colorScheme : effectiveConfig.mode;
192
300
  const { key: accentKey, palette: accentPalette } = React.useMemo(
193
- () => normalizeAccentInput(config.accent, resolvedMode),
194
- [config.accent, resolvedMode]
301
+ () => normalizeAccentInput(effectiveConfig.accent, colorScheme),
302
+ [effectiveConfig.accent, colorScheme]
195
303
  );
196
304
  const scopeRef = React.useRef(null);
305
+ const appliedTokenKeysRef = React.useRef(/* @__PURE__ */ new Set());
197
306
  React.useEffect(() => {
198
307
  if (!isBrowser) return;
199
308
  const el = target === "root" ? document.documentElement : scopeRef.current;
200
309
  if (!el) return;
201
- applyTheme(el, { ...config, mode: resolvedMode });
310
+ const nextTokenKeys = new Set(Object.keys(effectiveConfig.tokens));
311
+ for (const key of appliedTokenKeysRef.current) {
312
+ if (!nextTokenKeys.has(key)) el.style.removeProperty(toVar(key));
313
+ }
314
+ applyTheme(el, { ...effectiveConfig, colorScheme });
315
+ appliedTokenKeysRef.current = nextTokenKeys;
202
316
  persist(storageKey, config);
203
- }, [config, resolvedMode, target, storageKey]);
317
+ }, [config, effectiveConfig, colorScheme, target, storageKey]);
204
318
  const value = React.useMemo(() => {
205
319
  const patch = (p) => setConfig((c) => ({ ...c, ...p }));
206
320
  return {
207
- mode: config.mode,
321
+ mode: effectiveConfig.mode,
208
322
  resolvedMode,
323
+ colorScheme,
209
324
  accent: accentKey,
210
325
  accentPalette,
211
- density: config.density,
212
- intensity: config.intensity,
213
- radius: config.radius,
214
- font: config.font,
215
- tokens: config.tokens ?? {},
216
- setMode: (m) => patch({ mode: m }),
326
+ density: effectiveConfig.density,
327
+ intensity: effectiveConfig.intensity,
328
+ radius: effectiveConfig.radius,
329
+ font: effectiveConfig.font,
330
+ tokens: effectiveConfig.tokens,
331
+ themes: effectiveConfig.themes,
332
+ activeTheme,
333
+ setMode: (m) => setConfig((c) => applyThemePreset(c, m)),
217
334
  toggleMode: () => setConfig((c) => ({
218
335
  ...c,
219
336
  mode: c.mode === "dark" ? "light" : "dark"
@@ -224,10 +341,11 @@ var ThemeProvider = (props) => {
224
341
  setRadius: (n) => patch({ radius: n }),
225
342
  setFont: (f) => patch({ font: f }),
226
343
  setTokens: (t) => patch({ tokens: t }),
344
+ setThemes: (t) => patch({ themes: t }),
227
345
  update: patch,
228
346
  reset: () => setConfig(initialConfig)
229
347
  };
230
- }, [config, resolvedMode, accentKey, accentPalette, initialConfig]);
348
+ }, [effectiveConfig, resolvedMode, colorScheme, accentKey, accentPalette, activeTheme, initialConfig]);
231
349
  const onChangeRef = React.useRef(onChange);
232
350
  onChangeRef.current = onChange;
233
351
  React.useEffect(() => {
@@ -248,4 +366,4 @@ var ThemeProvider = (props) => {
248
366
  return /* @__PURE__ */ jsx(ThemeCtx.Provider, { value, children });
249
367
  };
250
368
 
251
- export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, FONT_STACKS, ThemeProvider, applyTheme, normalizeAccentInput, resolveThemeMode, useTheme, useThemeOptional };
369
+ export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, FONT_STACKS, ThemeProvider, applyTheme, normalizeAccentInput, resolveThemeColorScheme, resolveThemeMode, useTheme, useThemeOptional };
@@ -1,4 +1,4 @@
1
- import { Icon } from './chunk-NJ6B22YJ.js';
1
+ import { Icon } from './chunk-47VG2P34.js';
2
2
  import './tokens-BIIUTPKN.css';
3
3
  import './shared-NJHRNLRH.css';
4
4
  import './Drawer-IPGB4CXH.css';
@@ -0,0 +1,110 @@
1
+ import { Icon } from './chunk-47VG2P34.js';
2
+ import './tokens-BIIUTPKN.css';
3
+ import './shared-NJHRNLRH.css';
4
+ import './Collapse-66U5YJFY.css';
5
+ import * as React from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var CollapsePanel = ({ open, children }) => {
9
+ const innerRef = React.useRef(null);
10
+ const [h, setH] = React.useState(0);
11
+ const [animated, setAnimated] = React.useState(false);
12
+ React.useLayoutEffect(() => {
13
+ const el = innerRef.current;
14
+ if (!el) return;
15
+ setH(el.scrollHeight);
16
+ const ro = new ResizeObserver(() => setH(el.scrollHeight));
17
+ ro.observe(el);
18
+ return () => ro.disconnect();
19
+ }, []);
20
+ React.useEffect(() => {
21
+ const id = requestAnimationFrame(() => setAnimated(true));
22
+ return () => cancelAnimationFrame(id);
23
+ }, []);
24
+ return /* @__PURE__ */ jsx(
25
+ "div",
26
+ {
27
+ className: "collapse-body",
28
+ style: { maxHeight: open ? h : 0, transition: animated ? void 0 : "none" },
29
+ "aria-hidden": !open,
30
+ children: /* @__PURE__ */ jsx("div", { ref: innerRef, className: "collapse-body-inner", children })
31
+ }
32
+ );
33
+ };
34
+ var normalizeKeys = (value) => value == null ? [] : Array.isArray(value) ? value : [value];
35
+ var Collapse = React.forwardRef(({
36
+ items,
37
+ accordion = false,
38
+ multiple = true,
39
+ collapsible = "header",
40
+ activeKey,
41
+ defaultActiveKey,
42
+ onChange,
43
+ ghost = false,
44
+ size = "middle",
45
+ className = "",
46
+ ...rest
47
+ }, ref) => {
48
+ const [inner, setInner] = React.useState(() => normalizeKeys(defaultActiveKey));
49
+ const isControlled = activeKey !== void 0;
50
+ const keys = isControlled ? normalizeKeys(activeKey) : inner;
51
+ const singleOpen = accordion || !multiple;
52
+ const toggle = (k, itemDisabled) => {
53
+ if (collapsible === "disabled" || itemDisabled) return;
54
+ const next = keys.includes(k) ? keys.filter((x) => x !== k) : singleOpen ? [k] : [...keys, k];
55
+ if (!isControlled) setInner(next);
56
+ onChange?.(next);
57
+ };
58
+ return /* @__PURE__ */ jsx(
59
+ "div",
60
+ {
61
+ ref,
62
+ className: `collapse ${ghost ? "ghost" : ""} ${size} ${className}`,
63
+ ...rest,
64
+ children: items.map((it) => {
65
+ const open = keys.includes(it.key);
66
+ const isDisabled = it.disabled || collapsible === "disabled";
67
+ const headerClickable = collapsible === "header" && !isDisabled;
68
+ return /* @__PURE__ */ jsxs(
69
+ "div",
70
+ {
71
+ className: `collapse-item ${open ? "open" : ""} ${isDisabled ? "disabled" : ""} ${collapsible === "icon" ? "icon-only" : ""}`,
72
+ children: [
73
+ /* @__PURE__ */ jsxs(
74
+ "button",
75
+ {
76
+ type: "button",
77
+ className: "collapse-head",
78
+ disabled: isDisabled,
79
+ onClick: () => headerClickable && toggle(it.key, it.disabled),
80
+ "aria-expanded": open,
81
+ children: [
82
+ /* @__PURE__ */ jsx("span", { children: it.label }),
83
+ /* @__PURE__ */ jsx(
84
+ "span",
85
+ {
86
+ className: `collapse-chev${collapsible === "icon" ? " clickable" : ""}`,
87
+ onClick: (e) => {
88
+ if (collapsible === "icon" && !isDisabled) {
89
+ e.stopPropagation();
90
+ toggle(it.key, it.disabled);
91
+ }
92
+ },
93
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevDown", size: 16 })
94
+ }
95
+ )
96
+ ]
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(CollapsePanel, { open, children: it.children })
100
+ ]
101
+ },
102
+ it.key
103
+ );
104
+ })
105
+ }
106
+ );
107
+ });
108
+ Collapse.displayName = "Collapse";
109
+
110
+ export { Collapse };