@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
package/dist/styles.css CHANGED
@@ -219,7 +219,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
219
219
  gap: 8px;
220
220
  height: var(--ctrl-h);
221
221
  padding: 0 var(--ctrl-pad-x);
222
- border: none;
222
+ border: 1px solid transparent;
223
223
  border-radius: var(--r-md);
224
224
  font-size: 13px;
225
225
  font-weight: 500;
@@ -231,55 +231,67 @@ input, textarea, select { font-family: inherit; color: inherit; }
231
231
  user-select: none;
232
232
  white-space: nowrap;
233
233
  flex-shrink: 0;
234
- transition: all var(--dur-fast) var(--ease);
234
+ transition:
235
+ background var(--dur-fast) var(--ease),
236
+ box-shadow var(--dur-fast) var(--ease),
237
+ color var(--dur-fast) var(--ease);
238
+ }
239
+ .btn > svg,
240
+ .btn-icon-slot {
241
+ flex-shrink: 0;
242
+ }
243
+ .btn-icon-slot {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ line-height: 0;
248
+ }
249
+ .btn-icon-slot img {
250
+ display: block;
251
+ max-width: 1.25em;
252
+ max-height: 1.25em;
253
+ object-fit: contain;
235
254
  }
236
- .btn > svg { flex-shrink: 0; }
237
255
  .btn.icon {
238
256
  flex-shrink: 0;
239
257
  overflow: visible;
240
258
  }
241
- .btn:hover { color: var(--accent-ink); }
242
- .btn:active, .btn.pressed {
243
- box-shadow: var(--neu-in-sm);
244
- color: var(--accent-ink);
245
- }
246
259
  .btn.primary {
247
260
  color: var(--accent-ink);
248
- background:
249
- linear-gradient(145deg,
250
- color-mix(in oklch, var(--accent-soft) 80%, var(--shadow-light)),
251
- color-mix(in oklch, var(--accent-soft) 92%, var(--bg)));
252
- box-shadow:
253
- var(--neu-out-sm),
254
- inset 1px 1px 0 color-mix(in oklch, var(--shadow-light) 60%, transparent),
255
- inset -1px -1px 0 color-mix(in oklch, var(--accent) 15%, transparent);
261
+ background: color-mix(in oklch, var(--accent-soft) 62%, var(--bg));
256
262
  font-weight: 600;
257
263
  }
258
- .btn.primary:hover {
259
- background:
260
- linear-gradient(145deg,
261
- color-mix(in oklch, var(--accent-soft) 70%, var(--shadow-light)),
262
- color-mix(in oklch, var(--accent) 18%, var(--accent-soft)));
263
- box-shadow:
264
- var(--neu-out-sm),
265
- inset 1px 1px 0 color-mix(in oklch, var(--shadow-light) 70%, transparent),
266
- inset -1px -1px 0 color-mix(in oklch, var(--accent) 20%, transparent),
267
- 0 0 16px -6px var(--accent-glow);
268
- }
269
- .btn.primary:active, .btn.primary.pressed {
270
- box-shadow:
271
- inset 2px 2px 4px color-mix(in oklch, var(--accent) 25%, var(--shadow-dark)),
272
- inset -1px -1px 2px var(--shadow-light);
273
- transform: none;
274
- }
275
264
  .btn.ghost {
276
265
  background: transparent;
277
266
  box-shadow: none;
278
267
  color: var(--fg-muted);
279
268
  }
280
- .btn.ghost:hover { background: var(--bg); box-shadow: var(--neu-flat); color: var(--fg); }
281
269
  .btn.danger { color: var(--danger); }
282
- .btn.danger:hover { color: var(--danger); }
270
+ .btn:hover {
271
+ box-shadow: var(--neu-out);
272
+ }
273
+ .btn.ghost:hover {
274
+ background: var(--bg);
275
+ border-color: transparent;
276
+ box-shadow: var(--neu-flat);
277
+ color: var(--fg);
278
+ }
279
+ .btn.danger:hover {
280
+ color: var(--danger);
281
+ }
282
+ .btn:active,
283
+ .btn.pressed {
284
+ box-shadow: var(--neu-in);
285
+ }
286
+ .btn.ghost:active,
287
+ .btn.ghost.pressed {
288
+ background: var(--bg);
289
+ color: var(--fg);
290
+ }
291
+ .btn.danger:active,
292
+ .btn.danger.pressed {
293
+ color: var(--danger);
294
+ }
283
295
  .btn.icon { width: var(--ctrl-h); padding: 0; }
284
296
  .btn.sm { height: 30px; padding: 0 12px; font-size: 12px; border-radius: var(--r-sm); }
285
297
  .btn.sm.icon { width: 30px; padding: 0; }
@@ -289,10 +301,17 @@ input, textarea, select { font-family: inherit; color: inherit; }
289
301
  .btn[disabled], .btn.disabled, .btn:disabled {
290
302
  color: var(--fg-subtle);
291
303
  cursor: not-allowed;
304
+ border-color: transparent;
305
+ box-shadow: var(--neu-flat);
306
+ transform: none;
307
+ }
308
+ .btn[disabled]:hover, .btn:disabled:hover, .btn.disabled:hover {
309
+ color: var(--fg-subtle);
310
+ background: var(--bg);
311
+ border-color: transparent;
292
312
  box-shadow: var(--neu-flat);
293
313
  transform: none;
294
314
  }
295
- .btn[disabled]:hover, .btn:disabled:hover, .btn.disabled:hover { transform: none; color: var(--fg-subtle); background: var(--bg); }
296
315
  .btn.loading { cursor: wait; }
297
316
  .btn .spinner {
298
317
  width: 14px; height: 14px;
@@ -302,7 +321,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
302
321
  animation: spin 0.8s linear infinite;
303
322
  display: inline-block;
304
323
  }
305
- /* ============ Input / Textarea ============ */
324
+ /* ============ Input ============ */
306
325
  .input-shell {
307
326
  display: inline-flex;
308
327
  flex-direction: column;
@@ -338,6 +357,16 @@ input, textarea, select { font-family: inherit; color: inherit; }
338
357
  color: var(--fg-subtle);
339
358
  flex-shrink: 0;
340
359
  display: inline-flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ line-height: 0;
363
+ }
364
+ .input-wrap .lead img,
365
+ .input-wrap .trail img {
366
+ display: block;
367
+ width: 16px;
368
+ height: 16px;
369
+ object-fit: contain;
341
370
  }
342
371
  .input-wrap .lead.interactive,
343
372
  .input-wrap .trail.interactive { cursor: pointer; pointer-events: auto; }
@@ -372,6 +401,19 @@ input, textarea, select { font-family: inherit; color: inherit; }
372
401
  color: var(--fg);
373
402
  background: var(--bg-sunken);
374
403
  }
404
+ .input-password-toggle {
405
+ border: none;
406
+ background: transparent;
407
+ color: var(--fg-subtle);
408
+ padding: 0;
409
+ display: inline-flex;
410
+ align-items: center;
411
+ justify-content: center;
412
+ cursor: pointer;
413
+ font-family: inherit;
414
+ flex-shrink: 0;
415
+ }
416
+ .input-password-toggle:hover { color: var(--fg); }
375
417
  .input-wrap > .input {
376
418
  flex: 1;
377
419
  min-width: 0;
@@ -390,6 +432,19 @@ input, textarea, select { font-family: inherit; color: inherit; }
390
432
  .input-wrap.lg > .input { font-size: 14px; }
391
433
  .input-wrap > .input::placeholder { color: var(--fg-subtle); }
392
434
  .input-wrap.disabled > .input { cursor: not-allowed; }
435
+ /* ============ Textarea ============ */
436
+ .textarea-shell {
437
+ display: inline-flex;
438
+ flex-direction: column;
439
+ gap: 4px;
440
+ width: 100%;
441
+ }
442
+ .textarea-count {
443
+ font-size: 11px;
444
+ color: var(--fg-subtle);
445
+ font-variant-numeric: tabular-nums;
446
+ text-align: right;
447
+ }
393
448
  .textarea-wrap { position: relative; width: 100%; }
394
449
  .textarea-wrap .textarea-clear {
395
450
  position: absolute;
@@ -519,8 +574,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
519
574
  .switch.sm .switch-inner-off { right: 5px; left: calc(var(--h) - 2px); }
520
575
  .switch.on .switch-inner-on { opacity: 1; transform: translateX(0); }
521
576
  .switch.on .switch-inner-off { opacity: 0; transform: translateX(4px); }
522
- /* ============ Checkbox & Radio ============ */
523
- .checkbox, .radio {
577
+ /* ============ Checkbox ============ */
578
+ .checkbox {
524
579
  display: inline-flex;
525
580
  align-items: center;
526
581
  gap: 10px;
@@ -529,7 +584,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
529
584
  font-size: 13px;
530
585
  color: var(--fg);
531
586
  }
532
- .checkbox.disabled, .radio.disabled { opacity: 0.5; cursor: not-allowed; }
587
+ .checkbox.disabled { opacity: 0.5; cursor: not-allowed; }
533
588
  .checkbox-box {
534
589
  width: 20px; height: 20px;
535
590
  border: none;
@@ -541,7 +596,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
541
596
  place-items: center;
542
597
  flex-shrink: 0;
543
598
  cursor: inherit;
544
- color: white;
599
+ color: var(--bg);
545
600
  transition: all var(--dur) var(--ease);
546
601
  }
547
602
  .checkbox-box svg { opacity: 0; transform: scale(0.6); transition: all var(--dur) var(--ease); }
@@ -557,10 +612,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
557
612
  .checkbox.indeterminate .checkbox-box::after {
558
613
  content: "";
559
614
  width: 10px; height: 2px;
560
- background: white;
615
+ background: var(--bg);
561
616
  border-radius: 2px;
562
617
  }
563
618
  .checkbox.indeterminate .checkbox-box svg { display: none; }
619
+ /* ============ Radio ============ */
620
+ .radio {
621
+ display: inline-flex;
622
+ align-items: center;
623
+ gap: 10px;
624
+ cursor: pointer;
625
+ user-select: none;
626
+ font-size: 13px;
627
+ color: var(--fg);
628
+ }
629
+ .radio.disabled { opacity: 0.5; cursor: not-allowed; }
564
630
  .radio-dot {
565
631
  width: 20px; height: 20px;
566
632
  border: none;
@@ -584,11 +650,62 @@ input, textarea, select { font-family: inherit; color: inherit; }
584
650
  transform: translate(-50%, -50%);
585
651
  width: 8px; height: 8px;
586
652
  border-radius: 999px;
587
- background: white;
653
+ background: var(--bg);
588
654
  }
589
655
  .radio-group { display: flex; gap: 14px; }
590
656
  .radio-group.vertical { flex-direction: column; gap: 10px; }
591
657
  .radio-group.horizontal { flex-direction: row; flex-wrap: wrap; }
658
+ .radio-group.segmented {
659
+ position: relative;
660
+ display: inline-flex;
661
+ padding: 4px;
662
+ border-radius: var(--r-md);
663
+ background: var(--bg);
664
+ box-shadow: var(--neu-in-sm);
665
+ gap: 2px;
666
+ flex-wrap: nowrap;
667
+ }
668
+ .radio-group.segmented .radio {
669
+ position: relative;
670
+ z-index: 1;
671
+ height: 32px;
672
+ padding: 6px 14px;
673
+ border-radius: calc(var(--r-md) - 4px);
674
+ color: var(--fg-muted);
675
+ font-size: 12px;
676
+ gap: 6px;
677
+ transition: all var(--dur-fast) var(--ease);
678
+ }
679
+ .radio-group.segmented .radio:hover { color: var(--fg); }
680
+ .radio-group.segmented .radio.checked {
681
+ color: var(--accent-ink);
682
+ font-weight: 600;
683
+ }
684
+ .radio-group.segmented .radio-dot { display: none; }
685
+ .radio-group.segmented .radio-label { line-height: 1; }
686
+ .radio-group.segmented .radio.disabled { opacity: 0.4; }
687
+ .radio-group.segmented.sm .radio { height: 26px; padding: 4px 10px; font-size: 11px; }
688
+ .radio-group.segmented.lg .radio { height: 38px; padding: 8px 18px; font-size: 13px; }
689
+ .radio-segment-thumb {
690
+ position: absolute;
691
+ top: 4px;
692
+ bottom: 4px;
693
+ left: 0;
694
+ border-radius: calc(var(--r-md) - 4px);
695
+ background: var(--bg);
696
+ box-shadow: var(--neu-out-sm);
697
+ pointer-events: none;
698
+ transition:
699
+ transform var(--dur-slow) var(--ease),
700
+ width var(--dur-slow) var(--ease),
701
+ opacity var(--dur-fast) var(--ease);
702
+ will-change: transform, width;
703
+ }
704
+ @media (prefers-reduced-motion: reduce) {
705
+ .radio-segment-thumb {
706
+ transition: none;
707
+ }
708
+ }
592
709
  /* ============ Slider ============ */
593
710
  .slider {
594
711
  position: relative;
@@ -789,7 +906,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
789
906
  );
790
907
  pointer-events: none;
791
908
  }
792
- /* ============ Tag & Badge ============ */
909
+ /* ============ Tag ============ */
793
910
  .tag {
794
911
  display: inline-flex;
795
912
  align-items: center;
@@ -808,16 +925,30 @@ input, textarea, select { font-family: inherit; color: inherit; }
808
925
  .tag.success { color: var(--success); }
809
926
  .tag.warning { color: var(--warning); }
810
927
  .tag.danger { color: var(--danger); }
811
- .tag.solid { background: var(--accent); color: white; box-shadow: 0 2px 6px var(--accent-glow); }
812
- .tag.solid.info { background: var(--info); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--info) 35%, transparent); }
813
- .tag.solid.success { background: var(--success); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--success) 35%, transparent); }
814
- .tag.solid.warning { background: var(--warning); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--warning) 35%, transparent); }
815
- .tag.solid.danger { background: var(--danger); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--danger) 35%, transparent); }
928
+ .tag.solid { background: var(--accent); color: var(--bg); box-shadow: 0 2px 6px var(--accent-glow); }
929
+ .tag.solid.info { background: var(--info); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--info) 35%, transparent); }
930
+ .tag.solid.success { background: var(--success); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--success) 35%, transparent); }
931
+ .tag.solid.warning { background: var(--warning); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--warning) 35%, transparent); }
932
+ .tag.solid.danger { background: var(--danger); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--danger) 35%, transparent); }
816
933
  .tag.borderless { background: transparent; box-shadow: none; }
817
934
  .tag .dot { width: 6px; height: 6px; border-radius: 999px; background: currentColor; }
818
- .tag .tag-ico { color: currentColor; display: inline-flex; }
935
+ .tag .tag-ico {
936
+ color: currentColor;
937
+ display: inline-flex;
938
+ align-items: center;
939
+ justify-content: center;
940
+ line-height: 0;
941
+ flex-shrink: 0;
942
+ }
943
+ .tag .tag-ico img {
944
+ display: block;
945
+ width: 1em;
946
+ height: 1em;
947
+ object-fit: contain;
948
+ }
819
949
  .tag .x { cursor: pointer; color: var(--fg-subtle); margin-left: 2px; display: inline-flex; }
820
950
  .tag .x:hover { color: var(--fg); }
951
+ /* ============ Badge ============ */
821
952
  .badge {
822
953
  display: inline-flex;
823
954
  align-items: center; justify-content: center;
@@ -827,8 +958,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
827
958
  font-size: 10px;
828
959
  font-weight: 700;
829
960
  background: var(--danger);
830
- color: white;
831
- box-shadow: 0 1px 4px rgba(0,0,0,0.15);
961
+ color: var(--bg);
962
+ box-shadow: 0 1px 4px color-mix(in oklch, var(--shadow-dark) 35%, transparent);
832
963
  font-variant-numeric: tabular-nums;
833
964
  }
834
965
  .badge.dot { min-width: 10px; height: 10px; padding: 0; }
@@ -836,7 +967,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
836
967
  .badge.info { background: var(--info); box-shadow: 0 1px 4px color-mix(in oklch, var(--info) 35%, transparent); }
837
968
  .badge.success { background: var(--success); box-shadow: 0 1px 4px color-mix(in oklch, var(--success) 35%, transparent); }
838
969
  .badge.warning { background: var(--warning); box-shadow: 0 1px 4px color-mix(in oklch, var(--warning) 35%, transparent); }
839
- .badge.neutral { background: var(--fg-muted); box-shadow: 0 1px 4px rgba(0,0,0,0.15); }
970
+ .badge.neutral { background: var(--fg-muted); box-shadow: 0 1px 4px color-mix(in oklch, var(--shadow-dark) 35%, transparent); }
840
971
  .badge-wrap { position: relative; display: inline-block; }
841
972
  .badge-wrap > .badge { position: absolute; top: -4px; right: -4px; }
842
973
  /* ============ Avatar ============ */
@@ -955,7 +1086,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
955
1086
  .divider.orient-right::before { flex: 1; }
956
1087
  .divider.orient-right::after { flex: 0 0 var(--gap-4); }
957
1088
  /* center is default (both flex: 1) */
958
- /* ============ Card & Panel ============ */
1089
+ /* ============ Card ============ */
959
1090
  .card {
960
1091
  background: var(--bg);
961
1092
  border-radius: var(--r-lg);
@@ -977,21 +1108,15 @@ input, textarea, select { font-family: inherit; color: inherit; }
977
1108
  }
978
1109
  .card.hoverable.flat:hover { box-shadow: var(--neu-out-sm); }
979
1110
  .card.hoverable.sunken:hover { box-shadow: var(--neu-out); }
980
- .panel {
981
- background: var(--bg);
982
- border-radius: var(--r-lg);
983
- box-shadow: var(--neu-out);
984
- padding: var(--gap-5);
985
- }
986
- .panel-head {
1111
+ .card-head {
987
1112
  display: flex; align-items: flex-start; justify-content: space-between;
988
1113
  gap: var(--gap-3); margin-bottom: var(--gap-4);
989
1114
  }
990
- .panel-titles { display: flex; flex-direction: column; gap: 2px; }
991
- .panel-title { font-size: 15px; font-weight: 600; }
992
- .panel-desc { font-size: 12px; color: var(--fg-muted); }
993
- .panel-actions { display: flex; gap: 6px; }
994
- .panel-body { font-size: 13px; }
1115
+ .card-titles { display: flex; flex-direction: column; gap: 2px; }
1116
+ .card-title { font-size: 15px; font-weight: 600; }
1117
+ .card-desc { font-size: 12px; color: var(--fg-muted); }
1118
+ .card-actions { display: flex; gap: 6px; }
1119
+ .card-body { font-size: 13px; }
995
1120
  /* ============ Tabs ============ */
996
1121
  .tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
997
1122
  .tabs-nav {
@@ -1057,49 +1182,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
1057
1182
  .tabs.centered.line .tabs-nav .tab,
1058
1183
  .tabs.centered.underline .tabs-nav .tab { margin-right: 11px; margin-left: 11px; }
1059
1184
  .tabs-content { padding: var(--gap-2) 0; }
1060
- /* Segmented (owned by Tabs.tsx — Segmented is co-exported) */
1061
- .segmented {
1062
- display: inline-flex;
1063
- padding: 4px;
1064
- border-radius: var(--r-md);
1065
- background: var(--bg);
1066
- box-shadow: var(--neu-in-sm);
1067
- gap: 2px;
1068
- }
1069
- .segmented .seg {
1070
- padding: 6px 14px;
1071
- height: 32px;
1072
- display: inline-flex;
1073
- align-items: center;
1074
- gap: 6px;
1075
- border: none;
1076
- background: transparent;
1077
- border-radius: calc(var(--r-md) - 4px);
1078
- font-size: 12px;
1079
- font-family: inherit;
1080
- color: var(--fg-muted);
1081
- cursor: pointer;
1082
- transition: all var(--dur-fast) var(--ease);
1083
- }
1084
- .segmented .seg:hover { color: var(--fg); }
1085
- .segmented .seg.active {
1086
- color: var(--accent-ink);
1087
- background: var(--bg);
1088
- box-shadow: var(--neu-out-sm);
1089
- font-weight: 600;
1090
- }
1091
- .segmented.sm .seg { height: 26px; padding: 4px 10px; font-size: 11px; }
1092
- .segmented.lg .seg { height: 38px; padding: 8px 18px; font-size: 13px; }
1093
- /* ============ Accordion ============ */
1094
- .accordion { display: flex; flex-direction: column; gap: 10px; }
1095
- .accordion-item {
1185
+ /* ============ Collapse ============ */
1186
+ .collapse { display: flex; flex-direction: column; gap: 10px; }
1187
+ .collapse-item {
1096
1188
  background: var(--bg);
1097
1189
  border-radius: var(--r-md);
1098
1190
  box-shadow: var(--neu-out-sm);
1099
1191
  overflow: hidden;
1100
1192
  }
1101
- .accordion-item.disabled { opacity: 0.5; }
1102
- .accordion-head {
1193
+ .collapse.ghost .collapse-item {
1194
+ background: transparent;
1195
+ box-shadow: none;
1196
+ border-radius: var(--r-sm);
1197
+ }
1198
+ .collapse-item.disabled { opacity: 0.5; }
1199
+ .collapse-head {
1103
1200
  width: 100%;
1104
1201
  border: none;
1105
1202
  background: transparent;
@@ -1114,26 +1211,30 @@ input, textarea, select { font-family: inherit; color: inherit; }
1114
1211
  color: var(--fg);
1115
1212
  text-align: left;
1116
1213
  }
1117
- .accordion-item.disabled .accordion-head { cursor: not-allowed; }
1118
- .accordion-item.icon-only .accordion-head:not(:disabled) { cursor: default; }
1119
- .accordion-body {
1214
+ .collapse.small .collapse-head { padding: 10px 14px; font-size: 12px; }
1215
+ .collapse.large .collapse-head { padding: 18px 22px; font-size: 14px; }
1216
+ .collapse-item.disabled .collapse-head { cursor: not-allowed; }
1217
+ .collapse-item.icon-only .collapse-head:not(:disabled) { cursor: default; }
1218
+ .collapse-body {
1120
1219
  max-height: 0;
1121
1220
  overflow: hidden;
1122
1221
  transition: max-height var(--dur) var(--ease);
1123
1222
  color: var(--fg-muted);
1124
1223
  font-size: 13px;
1125
1224
  }
1126
- .accordion-body-inner { padding: 0 18px 16px; }
1127
- .accordion-chev {
1225
+ .collapse-body-inner { padding: 0 18px 16px; }
1226
+ .collapse.small .collapse-body-inner { padding: 0 14px 12px; }
1227
+ .collapse.large .collapse-body-inner { padding: 0 22px 20px; }
1228
+ .collapse-chev {
1128
1229
  transition: transform var(--dur) var(--ease), color var(--dur) var(--ease);
1129
1230
  color: var(--fg-subtle);
1130
1231
  display: inline-flex;
1131
- border-radius: 6px;
1232
+ border-radius: var(--r-xs);
1132
1233
  padding: 2px;
1133
1234
  }
1134
- .accordion-chev.clickable { cursor: pointer; }
1135
- .accordion-chev.clickable:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1136
- .accordion-item.open .accordion-chev { transform: rotate(180deg); color: var(--accent); }
1235
+ .collapse-chev.clickable { cursor: pointer; }
1236
+ .collapse-chev.clickable:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1237
+ .collapse-item.open .collapse-chev { transform: rotate(180deg); color: var(--accent); }
1137
1238
  /* ============ Select ============ */
1138
1239
  .select {
1139
1240
  position: relative;
@@ -1169,11 +1270,36 @@ input, textarea, select { font-family: inherit; color: inherit; }
1169
1270
  flex: 1;
1170
1271
  min-width: 0;
1171
1272
  }
1172
- .select-value > span {
1273
+ .select-value-label {
1173
1274
  white-space: nowrap;
1174
1275
  overflow: hidden;
1175
1276
  text-overflow: ellipsis;
1176
1277
  }
1278
+ .select-icon,
1279
+ .menu-item-icon {
1280
+ display: inline-flex;
1281
+ align-items: center;
1282
+ justify-content: center;
1283
+ line-height: 0;
1284
+ flex-shrink: 0;
1285
+ }
1286
+ .select-icon img,
1287
+ .menu-item-icon img {
1288
+ display: block;
1289
+ width: 16px;
1290
+ height: 16px;
1291
+ object-fit: contain;
1292
+ }
1293
+ .select.sm .select-icon img,
1294
+ .select.sm .menu-item-icon img {
1295
+ width: 14px;
1296
+ height: 14px;
1297
+ }
1298
+ .select.lg .select-icon img,
1299
+ .select.lg .menu-item-icon img {
1300
+ width: 18px;
1301
+ height: 18px;
1302
+ }
1177
1303
  .select.invalid .select-trigger {
1178
1304
  box-shadow: var(--neu-out-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
1179
1305
  }
@@ -1261,32 +1387,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1261
1387
  }
1262
1388
  /* Menu search — flush with menu, single subtle separator (no nested frame) */
1263
1389
  .menu-search {
1264
- display: flex;
1265
- align-items: center;
1266
- gap: 8px;
1267
- height: 32px;
1268
- padding: 0 6px;
1390
+ display: block;
1391
+ padding: 4px 2px 8px;
1269
1392
  margin: -2px -2px 4px;
1270
1393
  border-bottom: 1px solid var(--divider);
1271
- color: var(--fg-subtle);
1272
- transition: color var(--dur) var(--ease);
1273
- }
1274
- .menu-search:focus-within { color: var(--accent); }
1275
- .menu-search input {
1276
- flex: 1;
1277
- min-width: 0;
1278
- border: none;
1279
- outline: none;
1280
- background: transparent;
1281
- color: var(--fg);
1282
- font-size: 13px;
1283
- font-family: inherit;
1284
- height: 100%;
1285
- padding: 0;
1286
1394
  }
1287
- .menu-search input::placeholder { color: var(--fg-subtle); }
1288
- .menu-search input:focus,
1289
- .menu-search input:focus-visible { box-shadow: none; }
1395
+ .menu-search .input-wrap { width: 100%; }
1290
1396
  /* Menu state (loading / empty) */
1291
1397
  .menu-state {
1292
1398
  display: flex;
@@ -1311,8 +1417,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1311
1417
  .menu-state .menu-state-ico .spinner {
1312
1418
  width: 16px;
1313
1419
  height: 16px;
1420
+ display: inline-block;
1421
+ border-radius: 999px;
1422
+ border: 2px solid var(--accent);
1314
1423
  border-color: var(--accent);
1315
1424
  border-right-color: transparent;
1425
+ animation: spin 0.8s linear infinite;
1316
1426
  }
1317
1427
  /* Option body — supports description line under label */
1318
1428
  .menu-item-body {
@@ -1459,6 +1569,29 @@ input, textarea, select { font-family: inherit; color: inherit; }
1459
1569
  background: var(--bg);
1460
1570
  box-shadow: var(--neu-flat);
1461
1571
  }
1572
+ .modal-static-body {
1573
+ display: flex;
1574
+ gap: var(--gap-3);
1575
+ align-items: flex-start;
1576
+ }
1577
+ .modal-static-icon {
1578
+ width: 34px;
1579
+ height: 34px;
1580
+ border-radius: var(--r-md);
1581
+ display: inline-grid;
1582
+ place-items: center;
1583
+ flex-shrink: 0;
1584
+ background: var(--bg);
1585
+ box-shadow: var(--neu-in-sm);
1586
+ color: var(--accent);
1587
+ }
1588
+ .modal-static-icon.success { color: var(--success); }
1589
+ .modal-static-icon.warning { color: var(--warning); }
1590
+ .modal-static-icon.error { color: var(--danger); }
1591
+ .modal-static-content {
1592
+ min-width: 0;
1593
+ color: var(--fg-muted);
1594
+ }
1462
1595
  /* ============ Drawer ============ */
1463
1596
  .drawer-overlay {
1464
1597
  position: fixed;
@@ -1575,8 +1708,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
1575
1708
  animation: fadeIn var(--dur) var(--ease);
1576
1709
  z-index: 1000;
1577
1710
  }
1578
- /* ============ Toast ============ */
1579
- .toast-container {
1711
+ /* ============ Message ============ */
1712
+ .message-container {
1580
1713
  position: fixed;
1581
1714
  display: flex;
1582
1715
  flex-direction: column;
@@ -1584,12 +1717,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1584
1717
  z-index: 300;
1585
1718
  pointer-events: none;
1586
1719
  }
1587
- .toast-container.top-right { top: 56px; right: 20px; }
1588
- .toast-container.top-left { top: 56px; left: 20px; }
1589
- .toast-container.bottom-right { bottom: 20px; right: 20px; }
1590
- .toast-container.bottom-left { bottom: 20px; left: 20px; }
1591
- .toast-container.top-center { top: 56px; left: 50%; transform: translateX(-50%); align-items: center; }
1592
- .toast {
1720
+ .message-container.top-right { top: 56px; right: 20px; }
1721
+ .message-container.top-left { top: 56px; left: 20px; }
1722
+ .message-container.bottom-right { bottom: 20px; right: 20px; }
1723
+ .message-container.bottom-left { bottom: 20px; left: 20px; }
1724
+ .message-container.top-center { top: 56px; left: 50%; transform: translateX(-50%); align-items: center; }
1725
+ .message {
1593
1726
  background: var(--bg);
1594
1727
  border-radius: var(--r-md);
1595
1728
  box-shadow: var(--neu-float);
@@ -1598,28 +1731,28 @@ input, textarea, select { font-family: inherit; color: inherit; }
1598
1731
  display: flex; align-items: center; gap: 10px;
1599
1732
  font-size: 13px;
1600
1733
  pointer-events: auto;
1601
- animation: toastIn var(--dur-slow) var(--ease);
1734
+ animation: messageIn var(--dur-slow) var(--ease);
1602
1735
  border-left: 3px solid var(--accent);
1603
1736
  }
1604
- .toast.success { border-color: var(--success); }
1605
- .toast.warning { border-color: var(--warning); }
1606
- .toast.danger { border-color: var(--danger); }
1607
- .toast .toast-icon { color: var(--accent); flex-shrink: 0; }
1608
- .toast.success .toast-icon { color: var(--success); }
1609
- .toast.warning .toast-icon { color: var(--warning); }
1610
- .toast.danger .toast-icon { color: var(--danger); }
1611
- .toast-body { flex: 1; min-width: 0; }
1612
- .toast-title { font-weight: 600; margin-bottom: 2px; }
1613
- .toast-msg { color: var(--fg-muted); font-size: 12px; }
1614
- .toast-close {
1737
+ .message.success { border-color: var(--success); }
1738
+ .message.warning { border-color: var(--warning); }
1739
+ .message.error { border-color: var(--danger); }
1740
+ .message .message-icon { color: var(--accent); flex-shrink: 0; }
1741
+ .message.success .message-icon { color: var(--success); }
1742
+ .message.warning .message-icon { color: var(--warning); }
1743
+ .message.error .message-icon { color: var(--danger); }
1744
+ .message-body { flex: 1; min-width: 0; }
1745
+ .message-title { font-weight: 600; margin-bottom: 2px; }
1746
+ .message-content { color: var(--fg-muted); font-size: 12px; }
1747
+ .message-close {
1615
1748
  background: transparent; border: none;
1616
1749
  color: var(--fg-subtle); cursor: pointer;
1617
1750
  padding: 0 2px; font-family: inherit;
1618
1751
  }
1619
- .toast-close:hover { color: var(--fg); }
1620
- .toast.leaving { animation: toastOut var(--dur) var(--ease) forwards; }
1621
- @keyframes toastIn { from { opacity: 0; transform: translateX(20px); } }
1622
- @keyframes toastOut { to { opacity: 0; transform: translateX(20px); } }
1752
+ .message-close:hover { color: var(--fg); }
1753
+ .message.leaving { animation: messageOut var(--dur) var(--ease) forwards; }
1754
+ @keyframes messageIn { from { opacity: 0; transform: translateX(20px); } }
1755
+ @keyframes messageOut { to { opacity: 0; transform: translateX(20px); } }
1623
1756
  /* ============ Popover ============ */
1624
1757
  .popover {
1625
1758
  z-index: 1000;
@@ -1727,6 +1860,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
1727
1860
  display: grid; place-items: center;
1728
1861
  flex-shrink: 0;
1729
1862
  margin-top: 1px;
1863
+ line-height: 0;
1864
+ }
1865
+ .alert-ico img {
1866
+ display: block;
1867
+ width: 16px;
1868
+ height: 16px;
1869
+ object-fit: contain;
1730
1870
  }
1731
1871
  .alert.info .alert-ico { color: var(--info); }
1732
1872
  .alert.success .alert-ico { color: var(--success); }
@@ -1756,12 +1896,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
1756
1896
  }
1757
1897
  .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1758
1898
  /* ============ Table ============ */
1759
- .table-card {
1760
- border-radius: var(--r-lg);
1761
- background: var(--bg);
1762
- box-shadow: var(--neu-out-sm);
1763
- overflow: hidden;
1764
- }
1765
1899
  .table-wrap {
1766
1900
  border-radius: var(--r-lg);
1767
1901
  background: var(--bg);
@@ -1993,7 +2127,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1993
2127
  .table-pagination {
1994
2128
  margin-top: 12px;
1995
2129
  }
1996
- /* Pro: card-wrap with toolbar + table + footer */
2130
+ /* ============ TablePro ============ */
1997
2131
  .table-card {
1998
2132
  border-radius: var(--r-lg);
1999
2133
  background: var(--bg);
@@ -2002,7 +2136,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
2002
2136
  }
2003
2137
  .table-card .table-wrap { background: transparent; box-shadow: none; border-radius: 0; }
2004
2138
  .table-card .table-wrap.joined { border-radius: 0; }
2005
- /* When TablePro hosts the built-in pagination, seat it inside the card. */
2006
2139
  .table-card .table-pagination {
2007
2140
  margin-top: 0;
2008
2141
  padding: 6px 16px;
@@ -2131,52 +2264,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
2131
2264
  .list-item-desc { font-size: 12px; color: var(--fg-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2132
2265
  .list-item-actions { display: flex; gap: 6px; align-items: center; flex-shrink: 0; }
2133
2266
  .list-item-avatar { display: inline-flex; align-items: center; justify-content: center; color: var(--fg-muted); flex-shrink: 0; }
2134
- /* ============ Empty / Spinner / Skeleton ============ */
2135
- /* .spinner base — legacy border-ring used internally by Select/Button.
2136
- The public <Spinner> component always sets a variant class (`ring`|`dots`)
2137
- which overrides this via the more specific rules below. */
2138
- .spinner {
2139
- width: 14px; height: 14px;
2267
+ /* ============ Spin ============ */
2268
+ .spin {
2269
+ width: 14px;
2270
+ height: 14px;
2140
2271
  border-radius: 999px;
2141
2272
  border: 2px solid currentColor;
2142
2273
  border-right-color: transparent;
2143
2274
  animation: spin 0.8s linear infinite;
2144
2275
  display: inline-block;
2145
2276
  }
2146
- .empty {
2147
- padding: 60px 20px;
2148
- display: grid; place-items: center;
2149
- gap: 12px;
2150
- color: var(--fg-muted);
2151
- text-align: center;
2152
- }
2153
- .empty.sm { padding: 28px 16px; gap: 8px; }
2154
- .empty.sm .empty-ico { width: 40px; height: 40px; }
2155
- .empty.sm .empty-title { font-size: 13px; }
2156
- .empty.sm .empty-desc { font-size: 11px; }
2157
- .empty.lg { padding: 96px 24px; gap: 16px; }
2158
- .empty.lg .empty-ico { width: 72px; height: 72px; }
2159
- .empty.lg .empty-title { font-size: 16px; }
2160
- .empty.lg .empty-desc { font-size: 13px; }
2161
- .empty.subtle .empty-ico { background: transparent; box-shadow: none; }
2162
- .empty-ico {
2163
- width: 56px; height: 56px;
2164
- border-radius: var(--r-lg);
2165
- background: var(--bg);
2166
- box-shadow: var(--neu-in-sm);
2167
- display: grid; place-items: center;
2168
- color: var(--fg-subtle);
2169
- }
2170
- .empty-title { font-size: 14px; font-weight: 600; color: var(--fg); }
2171
- .empty-desc { font-size: 12px; }
2172
- .empty-action { margin-top: 8px; }
2173
- /* Spinner tones */
2174
- .spinner.accent { color: var(--accent); }
2175
- .spinner.success { color: var(--success); }
2176
- .spinner.warning { color: var(--warning); }
2177
- .spinner.danger { color: var(--danger); }
2178
- /* --- Ring variant: neumorphic pressed track + rotating arc --- */
2179
- .spinner.ring {
2277
+ .spin.accent { color: var(--accent); }
2278
+ .spin.success { color: var(--success); }
2279
+ .spin.warning { color: var(--warning); }
2280
+ .spin.danger { color: var(--danger); }
2281
+ .spin.ring {
2180
2282
  position: relative;
2181
2283
  display: inline-block;
2182
2284
  border: none;
@@ -2185,7 +2287,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2185
2287
  box-shadow: var(--neu-in-sm);
2186
2288
  animation: none;
2187
2289
  }
2188
- .spinner.ring::before {
2290
+ .spin.ring::before {
2189
2291
  content: "";
2190
2292
  position: absolute;
2191
2293
  inset: 0;
@@ -2197,54 +2299,84 @@ input, textarea, select { font-family: inherit; color: inherit; }
2197
2299
  currentColor 220deg,
2198
2300
  currentColor 340deg,
2199
2301
  transparent 360deg);
2200
- -webkit-mask: radial-gradient(circle, transparent 60%, #000 61%);
2201
- mask: radial-gradient(circle, transparent 60%, #000 61%);
2302
+ -webkit-mask: radial-gradient(circle, transparent 60%, currentColor 61%);
2303
+ mask: radial-gradient(circle, transparent 60%, currentColor 61%);
2202
2304
  animation: spin 0.9s linear infinite;
2203
2305
  }
2204
- .spinner.ring.accent::before,
2205
- .spinner.ring.success::before,
2206
- .spinner.ring.warning::before,
2207
- .spinner.ring.danger::before {
2306
+ .spin.ring.accent::before,
2307
+ .spin.ring.success::before,
2308
+ .spin.ring.warning::before,
2309
+ .spin.ring.danger::before {
2208
2310
  filter: drop-shadow(0 0 4px color-mix(in oklch, currentColor 50%, transparent));
2209
2311
  }
2210
- /* --- Dots variant: raised neumorphic spheres (container is transparent) --- */
2211
- .spinner.dots {
2312
+ .spin.dots {
2212
2313
  display: inline-flex;
2213
2314
  align-items: center;
2214
2315
  gap: 0.34em;
2215
2316
  border: none;
2216
2317
  background: none;
2217
2318
  box-shadow: none;
2218
- width: auto; height: auto;
2319
+ width: auto;
2320
+ height: auto;
2219
2321
  animation: none;
2220
2322
  line-height: 1;
2221
2323
  }
2222
- .spinner.dots i {
2223
- width: 0.4em; height: 0.4em;
2324
+ .spin.dots i {
2325
+ width: 0.4em;
2326
+ height: 0.4em;
2224
2327
  border-radius: 999px;
2225
2328
  background: radial-gradient(circle at 32% 28%,
2226
- color-mix(in oklch, currentColor 40%, white),
2329
+ color-mix(in oklch, currentColor 40%, var(--bg)),
2227
2330
  currentColor 62%,
2228
- color-mix(in oklch, currentColor 82%, black) 100%);
2331
+ color-mix(in oklch, currentColor 82%, var(--fg)) 100%);
2229
2332
  box-shadow:
2230
2333
  0 0.06em 0.14em color-mix(in oklch, currentColor 45%, transparent),
2231
2334
  0 0 0.35em color-mix(in oklch, currentColor 50%, transparent);
2232
2335
  display: inline-block;
2233
- animation: dot-bounce 1.2s ease-in-out infinite;
2336
+ animation: spin-dot-bounce 1.2s ease-in-out infinite;
2234
2337
  }
2235
- .spinner.dots i:nth-child(2) { animation-delay: 0.15s; }
2236
- .spinner.dots i:nth-child(3) { animation-delay: 0.3s; }
2237
- @keyframes dot-bounce {
2338
+ .spin.dots i:nth-child(2) { animation-delay: 0.15s; }
2339
+ .spin.dots i:nth-child(3) { animation-delay: 0.3s; }
2340
+ @keyframes spin-dot-bounce {
2238
2341
  0%, 80%, 100% { transform: translateY(0); opacity: 0.5; }
2239
2342
  40% { transform: translateY(-30%); opacity: 1; }
2240
2343
  }
2241
- .spinner-wrap {
2344
+ .spin-wrap {
2242
2345
  display: inline-flex;
2243
2346
  align-items: center;
2244
2347
  gap: 8px;
2245
2348
  color: var(--fg-muted);
2246
2349
  }
2247
- .spinner-label { font-size: 12px; }
2350
+ .spin-label { font-size: 12px; }
2351
+ /* ============ Empty ============ */
2352
+ .empty {
2353
+ padding: 60px 20px;
2354
+ display: grid; place-items: center;
2355
+ gap: 12px;
2356
+ color: var(--fg-muted);
2357
+ text-align: center;
2358
+ }
2359
+ .empty.sm { padding: 28px 16px; gap: 8px; }
2360
+ .empty.sm .empty-ico { width: 40px; height: 40px; }
2361
+ .empty.sm .empty-title { font-size: 13px; }
2362
+ .empty.sm .empty-desc { font-size: 11px; }
2363
+ .empty.lg { padding: 96px 24px; gap: 16px; }
2364
+ .empty.lg .empty-ico { width: 72px; height: 72px; }
2365
+ .empty.lg .empty-title { font-size: 16px; }
2366
+ .empty.lg .empty-desc { font-size: 13px; }
2367
+ .empty.subtle .empty-ico { background: transparent; box-shadow: none; }
2368
+ .empty-ico {
2369
+ width: 56px; height: 56px;
2370
+ border-radius: var(--r-lg);
2371
+ background: var(--bg);
2372
+ box-shadow: var(--neu-in-sm);
2373
+ display: grid; place-items: center;
2374
+ color: var(--fg-subtle);
2375
+ }
2376
+ .empty-title { font-size: 14px; font-weight: 600; color: var(--fg); }
2377
+ .empty-desc { font-size: 12px; }
2378
+ .empty-action { margin-top: 8px; }
2379
+ /* ============ Skeleton ============ */
2248
2380
  .skeleton {
2249
2381
  display: block;
2250
2382
  background: color-mix(in oklch, var(--accent-soft) 55%, var(--bg-sunken));
@@ -2263,7 +2395,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
2263
2395
  .skeleton.circle { border-radius: 999px; }
2264
2396
  @keyframes skel-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
2265
2397
  @keyframes skel-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
2266
- /* Composite skeleton — avatar + title + paragraph layout */
2267
2398
  .skeleton-box {
2268
2399
  display: flex;
2269
2400
  align-items: flex-start;
@@ -2360,6 +2491,18 @@ input, textarea, select { font-family: inherit; color: inherit; }
2360
2491
  overflow: hidden;
2361
2492
  line-height: 0;
2362
2493
  }
2494
+ .n-image.raw {
2495
+ border-radius: 0;
2496
+ background: transparent;
2497
+ box-shadow: none;
2498
+ }
2499
+ .n-image.icon {
2500
+ border-radius: var(--r-sm);
2501
+ }
2502
+ .n-image.unframed {
2503
+ background: transparent;
2504
+ box-shadow: none;
2505
+ }
2363
2506
  .n-image-frame {
2364
2507
  position: relative;
2365
2508
  overflow: hidden;
@@ -2367,6 +2510,16 @@ input, textarea, select { font-family: inherit; color: inherit; }
2367
2510
  box-shadow: var(--neu-in-sm);
2368
2511
  background: var(--bg-sunken);
2369
2512
  }
2513
+ .n-image.raw .n-image-frame {
2514
+ border-radius: 0;
2515
+ }
2516
+ .n-image.icon .n-image-frame {
2517
+ border-radius: var(--r-sm);
2518
+ }
2519
+ .n-image.unframed .n-image-frame {
2520
+ background: transparent;
2521
+ box-shadow: none;
2522
+ }
2370
2523
  .n-image img {
2371
2524
  display: block;
2372
2525
  width: 100%;
@@ -2455,6 +2608,61 @@ input, textarea, select { font-family: inherit; color: inherit; }
2455
2608
  border-radius: var(--r-lg);
2456
2609
  box-shadow: var(--neu-float);
2457
2610
  }
2611
+ /* ============ SpriteImage / LayeredImage ============ */
2612
+ .n-sprite-image,
2613
+ .n-layered-image {
2614
+ display: inline-block;
2615
+ position: relative;
2616
+ border-radius: var(--r-sm);
2617
+ background: var(--bg);
2618
+ padding: 6px;
2619
+ box-shadow: var(--neu-out-sm);
2620
+ overflow: hidden;
2621
+ line-height: 0;
2622
+ }
2623
+ .n-sprite-image.raw,
2624
+ .n-layered-image.raw {
2625
+ border-radius: 0;
2626
+ background: transparent;
2627
+ box-shadow: none;
2628
+ }
2629
+ .n-sprite-image.unframed,
2630
+ .n-layered-image.unframed {
2631
+ background: transparent;
2632
+ box-shadow: none;
2633
+ }
2634
+ .n-sprite-image-frame,
2635
+ .n-layered-image-frame {
2636
+ position: relative;
2637
+ width: 100%;
2638
+ overflow: hidden;
2639
+ border-radius: var(--r-sm);
2640
+ background: var(--bg-sunken);
2641
+ box-shadow: var(--neu-in-sm);
2642
+ }
2643
+ .n-sprite-image.raw .n-sprite-image-frame,
2644
+ .n-layered-image.raw .n-layered-image-frame {
2645
+ border-radius: 0;
2646
+ }
2647
+ .n-sprite-image.unframed .n-sprite-image-frame,
2648
+ .n-layered-image.unframed .n-layered-image-frame {
2649
+ background: transparent;
2650
+ box-shadow: none;
2651
+ }
2652
+ .n-sprite-image-sprite {
2653
+ display: block;
2654
+ background-repeat: no-repeat;
2655
+ transform-origin: top left;
2656
+ }
2657
+ .n-layered-image-layer {
2658
+ position: absolute;
2659
+ display: block;
2660
+ }
2661
+ .n-layered-image img {
2662
+ display: block;
2663
+ width: 100%;
2664
+ height: 100%;
2665
+ }
2458
2666
  /* ============ Cascader ============ */
2459
2667
  .cascader {
2460
2668
  position: relative;
@@ -2481,6 +2689,24 @@ input, textarea, select { font-family: inherit; color: inherit; }
2481
2689
  }
2482
2690
  .cascader-trigger.placeholder { color: var(--fg-subtle); }
2483
2691
  .cascader.open .cascader-trigger { box-shadow: var(--neu-in-sm); color: var(--accent-ink); }
2692
+ .cascader-clear {
2693
+ position: absolute;
2694
+ right: 30px;
2695
+ top: 50%;
2696
+ transform: translateY(-50%);
2697
+ width: 20px;
2698
+ height: 20px;
2699
+ border-radius: 999px;
2700
+ background: var(--bg);
2701
+ box-shadow: var(--neu-out-sm);
2702
+ display: inline-grid;
2703
+ place-items: center;
2704
+ color: var(--fg-subtle);
2705
+ opacity: 0;
2706
+ transition: all var(--dur-fast) var(--ease);
2707
+ }
2708
+ .cascader:hover .cascader-clear { opacity: 1; }
2709
+ .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
2484
2710
  .cascader-panel {
2485
2711
  z-index: 1000;
2486
2712
  display: flex;
@@ -2491,6 +2717,52 @@ input, textarea, select { font-family: inherit; color: inherit; }
2491
2717
  animation: menuIn var(--dur) var(--ease);
2492
2718
  gap: 4px;
2493
2719
  }
2720
+ .cascader-panel.with-search {
2721
+ flex-direction: column;
2722
+ min-width: 320px;
2723
+ }
2724
+ .cascader-columns {
2725
+ display: flex;
2726
+ gap: 4px;
2727
+ }
2728
+ .cascader-search {
2729
+ padding: 4px 2px 8px;
2730
+ border-bottom: 1px solid var(--divider);
2731
+ }
2732
+ .cascader-search-list {
2733
+ display: flex;
2734
+ flex-direction: column;
2735
+ gap: 4px;
2736
+ max-height: 260px;
2737
+ overflow-y: auto;
2738
+ padding: 4px;
2739
+ }
2740
+ .cascader-search-item {
2741
+ border: none;
2742
+ background: transparent;
2743
+ color: var(--fg);
2744
+ border-radius: var(--r-sm);
2745
+ padding: 8px 10px;
2746
+ display: flex;
2747
+ align-items: center;
2748
+ gap: 6px;
2749
+ font-size: 13px;
2750
+ font-family: inherit;
2751
+ text-align: left;
2752
+ cursor: pointer;
2753
+ }
2754
+ .cascader-search-item:hover {
2755
+ background: var(--bg);
2756
+ box-shadow: var(--neu-flat);
2757
+ color: var(--accent-ink);
2758
+ }
2759
+ .cascader-path-sep { color: var(--fg-subtle); }
2760
+ .cascader-empty {
2761
+ padding: 24px 12px;
2762
+ text-align: center;
2763
+ color: var(--fg-muted);
2764
+ font-size: 12px;
2765
+ }
2494
2766
  .cascader-col {
2495
2767
  min-width: 160px;
2496
2768
  max-height: 280px;
@@ -2519,6 +2791,19 @@ input, textarea, select { font-family: inherit; color: inherit; }
2519
2791
  width: 100%;
2520
2792
  text-align: left;
2521
2793
  }
2794
+ .cascader-icon {
2795
+ display: inline-flex;
2796
+ align-items: center;
2797
+ justify-content: center;
2798
+ line-height: 0;
2799
+ flex-shrink: 0;
2800
+ }
2801
+ .cascader-icon img {
2802
+ display: block;
2803
+ width: 15px;
2804
+ height: 15px;
2805
+ object-fit: contain;
2806
+ }
2522
2807
  .cascader-item:hover { background: var(--bg); box-shadow: var(--neu-flat); color: var(--accent-ink); }
2523
2808
  .cascader-item.active {
2524
2809
  background: var(--bg);