@fangxinyan/lumina 0.6.1 → 0.6.2

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 (246) hide show
  1. package/dist/Alert.cjs +3 -3
  2. package/dist/Alert.js +2 -2
  3. package/dist/AutoComplete.cjs +5 -4
  4. package/dist/AutoComplete.d.cts +1 -1
  5. package/dist/AutoComplete.d.ts +1 -1
  6. package/dist/AutoComplete.js +4 -3
  7. package/dist/Badge-DPGLV3D3.css +22 -0
  8. package/dist/Badge.cjs +10 -0
  9. package/dist/Badge.d.cts +18 -0
  10. package/dist/Badge.d.ts +18 -0
  11. package/dist/Badge.js +1 -0
  12. package/dist/Button.cjs +3 -7
  13. package/dist/Button.d.cts +5 -10
  14. package/dist/Button.d.ts +5 -10
  15. package/dist/Button.js +2 -2
  16. package/dist/Calendar.cjs +3 -3
  17. package/dist/Calendar.js +2 -2
  18. package/dist/{Card-RG7ECXL2.css → Card-6RMVIHWX.css} +7 -13
  19. package/dist/Card.cjs +2 -6
  20. package/dist/Card.d.cts +7 -11
  21. package/dist/Card.d.ts +7 -11
  22. package/dist/Card.js +1 -1
  23. package/dist/{Cascader-VSYEKQCG.css → Cascader-C2DFSMKJ.css} +64 -0
  24. package/dist/Cascader.cjs +5 -3
  25. package/dist/Cascader.d.cts +18 -2
  26. package/dist/Cascader.d.ts +18 -2
  27. package/dist/Cascader.js +4 -2
  28. package/dist/{Checkbox-SKJATVSN.css → Checkbox-U5EUDSYS.css} +5 -35
  29. package/dist/Checkbox.cjs +3 -7
  30. package/dist/Checkbox.d.cts +1 -18
  31. package/dist/Checkbox.d.ts +1 -18
  32. package/dist/Checkbox.js +2 -2
  33. package/dist/Collapse-66U5YJFY.css +53 -0
  34. package/dist/Collapse.cjs +11 -0
  35. package/dist/Collapse.d.cts +32 -0
  36. package/dist/Collapse.d.ts +32 -0
  37. package/dist/Collapse.js +2 -0
  38. package/dist/CommandPalette.cjs +5 -4
  39. package/dist/CommandPalette.js +4 -3
  40. package/dist/Drawer.cjs +3 -3
  41. package/dist/Drawer.js +2 -2
  42. package/dist/Empty-DC2LPORC.css +28 -0
  43. package/dist/Empty.cjs +2 -10
  44. package/dist/Empty.d.cts +1 -62
  45. package/dist/Empty.d.ts +1 -62
  46. package/dist/Empty.js +1 -1
  47. package/dist/Form.d.cts +1 -1
  48. package/dist/Form.d.ts +1 -1
  49. package/dist/Icon.cjs +179 -3
  50. package/dist/Icon.d.cts +96 -3
  51. package/dist/Icon.d.ts +96 -3
  52. package/dist/Icon.js +1 -1
  53. package/dist/Image.cjs +4 -4
  54. package/dist/Image.js +2 -2
  55. package/dist/{Input-33CAH4O6.css → Input-3G4ONWNU.css} +15 -42
  56. package/dist/Input.cjs +6 -5
  57. package/dist/Input.d.cts +19 -23
  58. package/dist/Input.d.ts +19 -23
  59. package/dist/Input.js +3 -2
  60. package/dist/InputNumber.cjs +5 -4
  61. package/dist/InputNumber.d.cts +1 -1
  62. package/dist/InputNumber.d.ts +1 -1
  63. package/dist/InputNumber.js +4 -3
  64. package/dist/Message-2MZ3LFPU.css +45 -0
  65. package/dist/Message.cjs +23 -0
  66. package/dist/Message.d.cts +54 -0
  67. package/dist/Message.d.ts +54 -0
  68. package/dist/Message.js +2 -0
  69. package/dist/{Modal-XSDMU4XJ.css → Modal-2QNDW4SO.css} +27 -0
  70. package/dist/Modal.cjs +4 -4
  71. package/dist/Modal.d.cts +28 -4
  72. package/dist/Modal.d.ts +28 -4
  73. package/dist/Modal.js +3 -3
  74. package/dist/Pagination.cjs +7 -5
  75. package/dist/Pagination.js +6 -4
  76. package/dist/Popover.cjs +2 -2
  77. package/dist/Popover.d.cts +11 -3
  78. package/dist/Popover.d.ts +11 -3
  79. package/dist/Popover.js +1 -1
  80. package/dist/Radio-GVFDPAZM.css +97 -0
  81. package/dist/Radio.cjs +14 -0
  82. package/dist/Radio.d.cts +36 -0
  83. package/dist/Radio.d.ts +36 -0
  84. package/dist/Radio.js +1 -0
  85. package/dist/{Select-J3CCVFJ7.css → Select-JVBQAZBG.css} +7 -23
  86. package/dist/Select.cjs +6 -4
  87. package/dist/Select.d.cts +25 -4
  88. package/dist/Select.d.ts +25 -4
  89. package/dist/Select.js +5 -3
  90. package/dist/Skeleton-CVWH2VWN.css +40 -0
  91. package/dist/Skeleton.cjs +10 -0
  92. package/dist/Skeleton.d.cts +30 -0
  93. package/dist/Skeleton.d.ts +30 -0
  94. package/dist/Skeleton.js +1 -0
  95. package/dist/Spin-3GJNMSIH.css +94 -0
  96. package/dist/Spin.cjs +10 -0
  97. package/dist/Spin.d.cts +20 -0
  98. package/dist/Spin.d.ts +20 -0
  99. package/dist/Spin.js +1 -0
  100. package/dist/{Table-2LPTOUIR.css → Table-ATJJQLKU.css} +0 -53
  101. package/dist/Table.cjs +9 -11
  102. package/dist/Table.d.cts +2 -21
  103. package/dist/Table.d.ts +2 -21
  104. package/dist/Table.js +8 -6
  105. package/dist/TablePro-3XVHYLSL.css +45 -0
  106. package/dist/TablePro.cjs +19 -0
  107. package/dist/TablePro.d.cts +21 -0
  108. package/dist/TablePro.d.ts +21 -0
  109. package/dist/TablePro.js +10 -0
  110. package/dist/{Tabs-RHK6XAFF.css → Tabs-BLSNI2T5.css} +0 -34
  111. package/dist/Tabs.cjs +2 -6
  112. package/dist/Tabs.d.cts +1 -16
  113. package/dist/Tabs.d.ts +1 -16
  114. package/dist/Tabs.js +1 -1
  115. package/dist/Tag-LB3OOJAO.css +29 -0
  116. package/dist/Tag.cjs +3 -7
  117. package/dist/Tag.d.cts +1 -11
  118. package/dist/Tag.d.ts +1 -11
  119. package/dist/Tag.js +2 -2
  120. package/dist/Textarea-YNET7IBH.css +54 -0
  121. package/dist/Textarea.cjs +15 -0
  122. package/dist/Textarea.d.cts +25 -0
  123. package/dist/Textarea.d.ts +25 -0
  124. package/dist/Textarea.js +2 -0
  125. package/dist/{Timeline-RHZAZKZ7.css → Timeline-3ZHOHPXT.css} +2 -2
  126. package/dist/Timeline.cjs +3 -3
  127. package/dist/Timeline.d.cts +1 -1
  128. package/dist/Timeline.d.ts +1 -1
  129. package/dist/Timeline.js +2 -2
  130. package/dist/Tooltip.cjs +2 -2
  131. package/dist/Tooltip.d.cts +17 -4
  132. package/dist/Tooltip.d.ts +17 -4
  133. package/dist/Tooltip.js +1 -1
  134. package/dist/Typography.cjs +7 -7
  135. package/dist/Typography.js +2 -2
  136. package/dist/{chunk-6Y5WRCPW.js → chunk-33NCTOEB.js} +1 -1
  137. package/dist/{chunk-Q2KG6SQK.cjs → chunk-35ZGBAA3.cjs} +3 -3
  138. package/dist/{chunk-Y3ZSG3SJ.cjs → chunk-3AS5B7MQ.cjs} +11 -30
  139. package/dist/{chunk-X2U7EKCS.cjs → chunk-3YJU3D5S.cjs} +28 -5
  140. package/dist/chunk-45VJGBGN.js +25 -0
  141. package/dist/{chunk-3D77MQHO.js → chunk-46VXFTEC.js} +3 -3
  142. package/dist/{chunk-OFGDUCT7.cjs → chunk-4WTU5P3O.cjs} +3 -3
  143. package/dist/{chunk-5A3RT4KD.js → chunk-5TKC6IEN.js} +4 -55
  144. package/dist/{chunk-62GU4OHH.cjs → chunk-5WAXZJG5.cjs} +12 -19
  145. package/dist/chunk-6ACKL3WH.cjs +138 -0
  146. package/dist/{chunk-32HBMXXV.cjs → chunk-6LZ54NPO.cjs} +70 -74
  147. package/dist/{chunk-UXH5PH3S.js → chunk-7NGMQIST.js} +2 -2
  148. package/dist/{chunk-R6BIF3FF.js → chunk-AWXCSX6J.js} +5 -23
  149. package/dist/chunk-AXZ7ELMA.js +41 -0
  150. package/dist/{chunk-G2XK57I7.cjs → chunk-B2KEZQ6S.cjs} +5 -5
  151. package/dist/chunk-CEJ7VBR6.js +283 -0
  152. package/dist/{chunk-WRDKOSSM.js → chunk-CHMCL7AV.js} +1 -1
  153. package/dist/{chunk-EBNRZRWY.cjs → chunk-CUXV6QNN.cjs} +5 -5
  154. package/dist/{chunk-ULOJ5UEY.js → chunk-CXWEOAVU.js} +1 -1
  155. package/dist/{chunk-TWGQZX2R.js → chunk-DQTSTJ6O.js} +3 -18
  156. package/dist/chunk-EIY7KEJ3.cjs +132 -0
  157. package/dist/{chunk-OI3CWXT3.js → chunk-EJBHR2P5.js} +3 -3
  158. package/dist/chunk-ELNT3CFO.js +64 -0
  159. package/dist/{chunk-TGHBKKSS.js → chunk-EQEJTN3V.js} +3 -43
  160. package/dist/chunk-F6RYCBQG.js +25 -0
  161. package/dist/{chunk-N57NXCNC.cjs → chunk-FBVVRTX2.cjs} +3 -44
  162. package/dist/chunk-FFZ6OMZI.js +110 -0
  163. package/dist/{chunk-73RQBWWW.js → chunk-FJNWUELL.js} +2 -2
  164. package/dist/chunk-GENABQYA.cjs +47 -0
  165. package/dist/chunk-GMN74OEY.cjs +63 -0
  166. package/dist/chunk-GNEZQMKH.js +218 -0
  167. package/dist/{chunk-Y47YTYQ3.cjs → chunk-HPFQXYKG.cjs} +159 -8
  168. package/dist/{chunk-4WRE4HQP.js → chunk-HWFM4MAT.js} +18 -6
  169. package/dist/{chunk-GY3BSHHS.cjs → chunk-HZSIUOCN.cjs} +2 -55
  170. package/dist/{chunk-YRZGXXWA.js → chunk-JD7A6VM3.js} +11 -17
  171. package/dist/chunk-K2KYM7LW.cjs +28 -0
  172. package/dist/{chunk-PWW64ZWO.cjs → chunk-KD4YYIIO.cjs} +1 -32
  173. package/dist/chunk-KGSADAOD.cjs +170 -0
  174. package/dist/{chunk-6ODY6MGL.cjs → chunk-MQV2XN4B.cjs} +5 -5
  175. package/dist/{chunk-OVZTG5CP.cjs → chunk-MT7UWY6T.cjs} +2 -2
  176. package/dist/chunk-MUXP7ASL.js +26 -0
  177. package/dist/{chunk-EEMWQX3C.cjs → chunk-NTS5L4NQ.cjs} +3 -3
  178. package/dist/{chunk-WBK6XIDJ.js → chunk-OBEKX4VR.js} +2 -32
  179. package/dist/chunk-OF3SGLZY.js +385 -0
  180. package/dist/chunk-ON4DEDMI.js +113 -0
  181. package/dist/chunk-OQBDU5I2.cjs +104 -0
  182. package/dist/{chunk-FIO65XYG.cjs → chunk-OYMJVU66.cjs} +48 -37
  183. package/dist/{chunk-5M26OVVY.js → chunk-PH3YECMF.js} +1 -1
  184. package/dist/chunk-Q5SZIU7Z.cjs +47 -0
  185. package/dist/chunk-QGHYQCF3.cjs +240 -0
  186. package/dist/chunk-QKQHZIF3.cjs +86 -0
  187. package/dist/{chunk-KYEY2LIB.cjs → chunk-SKMP2A5O.cjs} +3 -3
  188. package/dist/{chunk-IW5LW6XS.js → chunk-TEEFR2FD.js} +28 -5
  189. package/dist/{chunk-GOBWKQCX.cjs → chunk-TEG7NJHS.cjs} +3 -3
  190. package/dist/{chunk-2MNAZRWE.cjs → chunk-TJII7BQ2.cjs} +261 -2
  191. package/dist/{chunk-3TWNBJFI.cjs → chunk-TZJH5HBT.cjs} +6 -6
  192. package/dist/{chunk-D46EM4EN.js → chunk-UMDGS4BP.js} +1 -1
  193. package/dist/chunk-USQ43DJ5.js +147 -0
  194. package/dist/{chunk-G2K6ETP4.cjs → chunk-UUHFKIWP.cjs} +18 -6
  195. package/dist/chunk-WGZ2KJTZ.js +81 -0
  196. package/dist/{chunk-RPFMQZA5.js → chunk-WKKSAGYH.js} +39 -28
  197. package/dist/{chunk-54YLXXS2.js → chunk-XD3JGL5O.js} +2 -2
  198. package/dist/{chunk-DPNDHNKK.js → chunk-XTIN5545.js} +68 -72
  199. package/dist/{chunk-LZU33BX6.cjs → chunk-ZIP7F4UF.cjs} +4 -20
  200. package/dist/index.cjs +312 -122
  201. package/dist/index.d.cts +23 -17
  202. package/dist/index.d.ts +23 -17
  203. package/dist/index.js +34 -28
  204. package/dist/styles.css +313 -192
  205. package/docs/llms/badge.md +3 -3
  206. package/docs/llms/button.md +7 -38
  207. package/docs/llms/card.md +6 -12
  208. package/docs/llms/cascader.md +19 -0
  209. package/docs/llms/{accordion.md → collapse.md} +13 -11
  210. package/docs/llms/drawer.md +1 -1
  211. package/docs/llms/form.md +1 -1
  212. package/docs/llms/input.md +25 -16
  213. package/docs/llms/message.md +63 -0
  214. package/docs/llms/modal.md +30 -0
  215. package/docs/llms/popover.md +18 -1
  216. package/docs/llms/radio.md +37 -1
  217. package/docs/llms/select.md +20 -0
  218. package/docs/llms/spin.md +59 -0
  219. package/docs/llms/table.md +3 -3
  220. package/docs/llms/tooltip.md +16 -3
  221. package/docs/llms.md +5 -5
  222. package/package.json +17 -52
  223. package/dist/Accordion-REMDCQUD.css +0 -44
  224. package/dist/Accordion.cjs +0 -11
  225. package/dist/Accordion.d.cts +0 -33
  226. package/dist/Accordion.d.ts +0 -33
  227. package/dist/Accordion.js +0 -2
  228. package/dist/Empty-NQ72W3D7.css +0 -160
  229. package/dist/Tag-FGDY3W7E.css +0 -51
  230. package/dist/Toast-YSACW3EM.css +0 -45
  231. package/dist/Toast.cjs +0 -15
  232. package/dist/Toast.d.cts +0 -26
  233. package/dist/Toast.d.ts +0 -26
  234. package/dist/Toast.js +0 -2
  235. package/dist/chunk-3XTHKAEY.js +0 -39
  236. package/dist/chunk-DOMYUGJY.js +0 -132
  237. package/dist/chunk-HBWO3QKW.js +0 -74
  238. package/dist/chunk-JVS5ZALZ.js +0 -123
  239. package/dist/chunk-LIGHV4RC.cjs +0 -121
  240. package/dist/chunk-MCTIA6RZ.js +0 -99
  241. package/dist/chunk-NC4YUEXM.cjs +0 -145
  242. package/dist/chunk-NJ6B22YJ.js +0 -170
  243. package/dist/chunk-W64ARHLJ.cjs +0 -62
  244. package/dist/chunk-ZFW6OYAO.cjs +0 -100
  245. package/docs/llms/spinner.md +0 -58
  246. package/docs/llms/toast.md +0 -51
package/dist/styles.css CHANGED
@@ -302,7 +302,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
302
302
  animation: spin 0.8s linear infinite;
303
303
  display: inline-block;
304
304
  }
305
- /* ============ Input / Textarea ============ */
305
+ /* ============ Input ============ */
306
306
  .input-shell {
307
307
  display: inline-flex;
308
308
  flex-direction: column;
@@ -372,6 +372,19 @@ input, textarea, select { font-family: inherit; color: inherit; }
372
372
  color: var(--fg);
373
373
  background: var(--bg-sunken);
374
374
  }
375
+ .input-password-toggle {
376
+ border: none;
377
+ background: transparent;
378
+ color: var(--fg-subtle);
379
+ padding: 0;
380
+ display: inline-flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ cursor: pointer;
384
+ font-family: inherit;
385
+ flex-shrink: 0;
386
+ }
387
+ .input-password-toggle:hover { color: var(--fg); }
375
388
  .input-wrap > .input {
376
389
  flex: 1;
377
390
  min-width: 0;
@@ -390,6 +403,19 @@ input, textarea, select { font-family: inherit; color: inherit; }
390
403
  .input-wrap.lg > .input { font-size: 14px; }
391
404
  .input-wrap > .input::placeholder { color: var(--fg-subtle); }
392
405
  .input-wrap.disabled > .input { cursor: not-allowed; }
406
+ /* ============ Textarea ============ */
407
+ .textarea-shell {
408
+ display: inline-flex;
409
+ flex-direction: column;
410
+ gap: 4px;
411
+ width: 100%;
412
+ }
413
+ .textarea-count {
414
+ font-size: 11px;
415
+ color: var(--fg-subtle);
416
+ font-variant-numeric: tabular-nums;
417
+ text-align: right;
418
+ }
393
419
  .textarea-wrap { position: relative; width: 100%; }
394
420
  .textarea-wrap .textarea-clear {
395
421
  position: absolute;
@@ -519,8 +545,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
519
545
  .switch.sm .switch-inner-off { right: 5px; left: calc(var(--h) - 2px); }
520
546
  .switch.on .switch-inner-on { opacity: 1; transform: translateX(0); }
521
547
  .switch.on .switch-inner-off { opacity: 0; transform: translateX(4px); }
522
- /* ============ Checkbox & Radio ============ */
523
- .checkbox, .radio {
548
+ /* ============ Checkbox ============ */
549
+ .checkbox {
524
550
  display: inline-flex;
525
551
  align-items: center;
526
552
  gap: 10px;
@@ -529,7 +555,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
529
555
  font-size: 13px;
530
556
  color: var(--fg);
531
557
  }
532
- .checkbox.disabled, .radio.disabled { opacity: 0.5; cursor: not-allowed; }
558
+ .checkbox.disabled { opacity: 0.5; cursor: not-allowed; }
533
559
  .checkbox-box {
534
560
  width: 20px; height: 20px;
535
561
  border: none;
@@ -541,7 +567,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
541
567
  place-items: center;
542
568
  flex-shrink: 0;
543
569
  cursor: inherit;
544
- color: white;
570
+ color: var(--bg);
545
571
  transition: all var(--dur) var(--ease);
546
572
  }
547
573
  .checkbox-box svg { opacity: 0; transform: scale(0.6); transition: all var(--dur) var(--ease); }
@@ -557,10 +583,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
557
583
  .checkbox.indeterminate .checkbox-box::after {
558
584
  content: "";
559
585
  width: 10px; height: 2px;
560
- background: white;
586
+ background: var(--bg);
561
587
  border-radius: 2px;
562
588
  }
563
589
  .checkbox.indeterminate .checkbox-box svg { display: none; }
590
+ /* ============ Radio ============ */
591
+ .radio {
592
+ display: inline-flex;
593
+ align-items: center;
594
+ gap: 10px;
595
+ cursor: pointer;
596
+ user-select: none;
597
+ font-size: 13px;
598
+ color: var(--fg);
599
+ }
600
+ .radio.disabled { opacity: 0.5; cursor: not-allowed; }
564
601
  .radio-dot {
565
602
  width: 20px; height: 20px;
566
603
  border: none;
@@ -584,11 +621,62 @@ input, textarea, select { font-family: inherit; color: inherit; }
584
621
  transform: translate(-50%, -50%);
585
622
  width: 8px; height: 8px;
586
623
  border-radius: 999px;
587
- background: white;
624
+ background: var(--bg);
588
625
  }
589
626
  .radio-group { display: flex; gap: 14px; }
590
627
  .radio-group.vertical { flex-direction: column; gap: 10px; }
591
628
  .radio-group.horizontal { flex-direction: row; flex-wrap: wrap; }
629
+ .radio-group.segmented {
630
+ position: relative;
631
+ display: inline-flex;
632
+ padding: 4px;
633
+ border-radius: var(--r-md);
634
+ background: var(--bg);
635
+ box-shadow: var(--neu-in-sm);
636
+ gap: 2px;
637
+ flex-wrap: nowrap;
638
+ }
639
+ .radio-group.segmented .radio {
640
+ position: relative;
641
+ z-index: 1;
642
+ height: 32px;
643
+ padding: 6px 14px;
644
+ border-radius: calc(var(--r-md) - 4px);
645
+ color: var(--fg-muted);
646
+ font-size: 12px;
647
+ gap: 6px;
648
+ transition: all var(--dur-fast) var(--ease);
649
+ }
650
+ .radio-group.segmented .radio:hover { color: var(--fg); }
651
+ .radio-group.segmented .radio.checked {
652
+ color: var(--accent-ink);
653
+ font-weight: 600;
654
+ }
655
+ .radio-group.segmented .radio-dot { display: none; }
656
+ .radio-group.segmented .radio-label { line-height: 1; }
657
+ .radio-group.segmented .radio.disabled { opacity: 0.4; }
658
+ .radio-group.segmented.sm .radio { height: 26px; padding: 4px 10px; font-size: 11px; }
659
+ .radio-group.segmented.lg .radio { height: 38px; padding: 8px 18px; font-size: 13px; }
660
+ .radio-segment-thumb {
661
+ position: absolute;
662
+ top: 4px;
663
+ bottom: 4px;
664
+ left: 0;
665
+ border-radius: calc(var(--r-md) - 4px);
666
+ background: var(--bg);
667
+ box-shadow: var(--neu-out-sm);
668
+ pointer-events: none;
669
+ transition:
670
+ transform var(--dur-slow) var(--ease),
671
+ width var(--dur-slow) var(--ease),
672
+ opacity var(--dur-fast) var(--ease);
673
+ will-change: transform, width;
674
+ }
675
+ @media (prefers-reduced-motion: reduce) {
676
+ .radio-segment-thumb {
677
+ transition: none;
678
+ }
679
+ }
592
680
  /* ============ Slider ============ */
593
681
  .slider {
594
682
  position: relative;
@@ -789,7 +877,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
789
877
  );
790
878
  pointer-events: none;
791
879
  }
792
- /* ============ Tag & Badge ============ */
880
+ /* ============ Tag ============ */
793
881
  .tag {
794
882
  display: inline-flex;
795
883
  align-items: center;
@@ -808,16 +896,17 @@ input, textarea, select { font-family: inherit; color: inherit; }
808
896
  .tag.success { color: var(--success); }
809
897
  .tag.warning { color: var(--warning); }
810
898
  .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); }
899
+ .tag.solid { background: var(--accent); color: var(--bg); box-shadow: 0 2px 6px var(--accent-glow); }
900
+ .tag.solid.info { background: var(--info); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--info) 35%, transparent); }
901
+ .tag.solid.success { background: var(--success); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--success) 35%, transparent); }
902
+ .tag.solid.warning { background: var(--warning); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--warning) 35%, transparent); }
903
+ .tag.solid.danger { background: var(--danger); color: var(--bg); box-shadow: 0 2px 6px color-mix(in oklch, var(--danger) 35%, transparent); }
816
904
  .tag.borderless { background: transparent; box-shadow: none; }
817
905
  .tag .dot { width: 6px; height: 6px; border-radius: 999px; background: currentColor; }
818
906
  .tag .tag-ico { color: currentColor; display: inline-flex; }
819
907
  .tag .x { cursor: pointer; color: var(--fg-subtle); margin-left: 2px; display: inline-flex; }
820
908
  .tag .x:hover { color: var(--fg); }
909
+ /* ============ Badge ============ */
821
910
  .badge {
822
911
  display: inline-flex;
823
912
  align-items: center; justify-content: center;
@@ -827,8 +916,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
827
916
  font-size: 10px;
828
917
  font-weight: 700;
829
918
  background: var(--danger);
830
- color: white;
831
- box-shadow: 0 1px 4px rgba(0,0,0,0.15);
919
+ color: var(--bg);
920
+ box-shadow: 0 1px 4px color-mix(in oklch, var(--shadow-dark) 35%, transparent);
832
921
  font-variant-numeric: tabular-nums;
833
922
  }
834
923
  .badge.dot { min-width: 10px; height: 10px; padding: 0; }
@@ -836,7 +925,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
836
925
  .badge.info { background: var(--info); box-shadow: 0 1px 4px color-mix(in oklch, var(--info) 35%, transparent); }
837
926
  .badge.success { background: var(--success); box-shadow: 0 1px 4px color-mix(in oklch, var(--success) 35%, transparent); }
838
927
  .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); }
928
+ .badge.neutral { background: var(--fg-muted); box-shadow: 0 1px 4px color-mix(in oklch, var(--shadow-dark) 35%, transparent); }
840
929
  .badge-wrap { position: relative; display: inline-block; }
841
930
  .badge-wrap > .badge { position: absolute; top: -4px; right: -4px; }
842
931
  /* ============ Avatar ============ */
@@ -955,7 +1044,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
955
1044
  .divider.orient-right::before { flex: 1; }
956
1045
  .divider.orient-right::after { flex: 0 0 var(--gap-4); }
957
1046
  /* center is default (both flex: 1) */
958
- /* ============ Card & Panel ============ */
1047
+ /* ============ Card ============ */
959
1048
  .card {
960
1049
  background: var(--bg);
961
1050
  border-radius: var(--r-lg);
@@ -977,21 +1066,15 @@ input, textarea, select { font-family: inherit; color: inherit; }
977
1066
  }
978
1067
  .card.hoverable.flat:hover { box-shadow: var(--neu-out-sm); }
979
1068
  .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 {
1069
+ .card-head {
987
1070
  display: flex; align-items: flex-start; justify-content: space-between;
988
1071
  gap: var(--gap-3); margin-bottom: var(--gap-4);
989
1072
  }
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; }
1073
+ .card-titles { display: flex; flex-direction: column; gap: 2px; }
1074
+ .card-title { font-size: 15px; font-weight: 600; }
1075
+ .card-desc { font-size: 12px; color: var(--fg-muted); }
1076
+ .card-actions { display: flex; gap: 6px; }
1077
+ .card-body { font-size: 13px; }
995
1078
  /* ============ Tabs ============ */
996
1079
  .tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
997
1080
  .tabs-nav {
@@ -1057,49 +1140,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
1057
1140
  .tabs.centered.line .tabs-nav .tab,
1058
1141
  .tabs.centered.underline .tabs-nav .tab { margin-right: 11px; margin-left: 11px; }
1059
1142
  .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 {
1143
+ /* ============ Collapse ============ */
1144
+ .collapse { display: flex; flex-direction: column; gap: 10px; }
1145
+ .collapse-item {
1096
1146
  background: var(--bg);
1097
1147
  border-radius: var(--r-md);
1098
1148
  box-shadow: var(--neu-out-sm);
1099
1149
  overflow: hidden;
1100
1150
  }
1101
- .accordion-item.disabled { opacity: 0.5; }
1102
- .accordion-head {
1151
+ .collapse.ghost .collapse-item {
1152
+ background: transparent;
1153
+ box-shadow: none;
1154
+ border-radius: var(--r-sm);
1155
+ }
1156
+ .collapse-item.disabled { opacity: 0.5; }
1157
+ .collapse-head {
1103
1158
  width: 100%;
1104
1159
  border: none;
1105
1160
  background: transparent;
@@ -1114,26 +1169,30 @@ input, textarea, select { font-family: inherit; color: inherit; }
1114
1169
  color: var(--fg);
1115
1170
  text-align: left;
1116
1171
  }
1117
- .accordion-item.disabled .accordion-head { cursor: not-allowed; }
1118
- .accordion-item.icon-only .accordion-head:not(:disabled) { cursor: default; }
1119
- .accordion-body {
1172
+ .collapse.small .collapse-head { padding: 10px 14px; font-size: 12px; }
1173
+ .collapse.large .collapse-head { padding: 18px 22px; font-size: 14px; }
1174
+ .collapse-item.disabled .collapse-head { cursor: not-allowed; }
1175
+ .collapse-item.icon-only .collapse-head:not(:disabled) { cursor: default; }
1176
+ .collapse-body {
1120
1177
  max-height: 0;
1121
1178
  overflow: hidden;
1122
1179
  transition: max-height var(--dur) var(--ease);
1123
1180
  color: var(--fg-muted);
1124
1181
  font-size: 13px;
1125
1182
  }
1126
- .accordion-body-inner { padding: 0 18px 16px; }
1127
- .accordion-chev {
1183
+ .collapse-body-inner { padding: 0 18px 16px; }
1184
+ .collapse.small .collapse-body-inner { padding: 0 14px 12px; }
1185
+ .collapse.large .collapse-body-inner { padding: 0 22px 20px; }
1186
+ .collapse-chev {
1128
1187
  transition: transform var(--dur) var(--ease), color var(--dur) var(--ease);
1129
1188
  color: var(--fg-subtle);
1130
1189
  display: inline-flex;
1131
- border-radius: 6px;
1190
+ border-radius: var(--r-xs);
1132
1191
  padding: 2px;
1133
1192
  }
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); }
1193
+ .collapse-chev.clickable { cursor: pointer; }
1194
+ .collapse-chev.clickable:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1195
+ .collapse-item.open .collapse-chev { transform: rotate(180deg); color: var(--accent); }
1137
1196
  /* ============ Select ============ */
1138
1197
  .select {
1139
1198
  position: relative;
@@ -1261,32 +1320,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1261
1320
  }
1262
1321
  /* Menu search — flush with menu, single subtle separator (no nested frame) */
1263
1322
  .menu-search {
1264
- display: flex;
1265
- align-items: center;
1266
- gap: 8px;
1267
- height: 32px;
1268
- padding: 0 6px;
1323
+ display: block;
1324
+ padding: 4px 2px 8px;
1269
1325
  margin: -2px -2px 4px;
1270
1326
  border-bottom: 1px solid var(--divider);
1271
- color: var(--fg-subtle);
1272
- transition: color var(--dur) var(--ease);
1273
1327
  }
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
- }
1287
- .menu-search input::placeholder { color: var(--fg-subtle); }
1288
- .menu-search input:focus,
1289
- .menu-search input:focus-visible { box-shadow: none; }
1328
+ .menu-search .input-wrap { width: 100%; }
1290
1329
  /* Menu state (loading / empty) */
1291
1330
  .menu-state {
1292
1331
  display: flex;
@@ -1311,8 +1350,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1311
1350
  .menu-state .menu-state-ico .spinner {
1312
1351
  width: 16px;
1313
1352
  height: 16px;
1353
+ display: inline-block;
1354
+ border-radius: 999px;
1355
+ border: 2px solid var(--accent);
1314
1356
  border-color: var(--accent);
1315
1357
  border-right-color: transparent;
1358
+ animation: spin 0.8s linear infinite;
1316
1359
  }
1317
1360
  /* Option body — supports description line under label */
1318
1361
  .menu-item-body {
@@ -1459,6 +1502,29 @@ input, textarea, select { font-family: inherit; color: inherit; }
1459
1502
  background: var(--bg);
1460
1503
  box-shadow: var(--neu-flat);
1461
1504
  }
1505
+ .modal-static-body {
1506
+ display: flex;
1507
+ gap: var(--gap-3);
1508
+ align-items: flex-start;
1509
+ }
1510
+ .modal-static-icon {
1511
+ width: 34px;
1512
+ height: 34px;
1513
+ border-radius: var(--r-md);
1514
+ display: inline-grid;
1515
+ place-items: center;
1516
+ flex-shrink: 0;
1517
+ background: var(--bg);
1518
+ box-shadow: var(--neu-in-sm);
1519
+ color: var(--accent);
1520
+ }
1521
+ .modal-static-icon.success { color: var(--success); }
1522
+ .modal-static-icon.warning { color: var(--warning); }
1523
+ .modal-static-icon.error { color: var(--danger); }
1524
+ .modal-static-content {
1525
+ min-width: 0;
1526
+ color: var(--fg-muted);
1527
+ }
1462
1528
  /* ============ Drawer ============ */
1463
1529
  .drawer-overlay {
1464
1530
  position: fixed;
@@ -1575,8 +1641,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
1575
1641
  animation: fadeIn var(--dur) var(--ease);
1576
1642
  z-index: 1000;
1577
1643
  }
1578
- /* ============ Toast ============ */
1579
- .toast-container {
1644
+ /* ============ Message ============ */
1645
+ .message-container {
1580
1646
  position: fixed;
1581
1647
  display: flex;
1582
1648
  flex-direction: column;
@@ -1584,12 +1650,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1584
1650
  z-index: 300;
1585
1651
  pointer-events: none;
1586
1652
  }
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 {
1653
+ .message-container.top-right { top: 56px; right: 20px; }
1654
+ .message-container.top-left { top: 56px; left: 20px; }
1655
+ .message-container.bottom-right { bottom: 20px; right: 20px; }
1656
+ .message-container.bottom-left { bottom: 20px; left: 20px; }
1657
+ .message-container.top-center { top: 56px; left: 50%; transform: translateX(-50%); align-items: center; }
1658
+ .message {
1593
1659
  background: var(--bg);
1594
1660
  border-radius: var(--r-md);
1595
1661
  box-shadow: var(--neu-float);
@@ -1598,28 +1664,28 @@ input, textarea, select { font-family: inherit; color: inherit; }
1598
1664
  display: flex; align-items: center; gap: 10px;
1599
1665
  font-size: 13px;
1600
1666
  pointer-events: auto;
1601
- animation: toastIn var(--dur-slow) var(--ease);
1667
+ animation: messageIn var(--dur-slow) var(--ease);
1602
1668
  border-left: 3px solid var(--accent);
1603
1669
  }
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 {
1670
+ .message.success { border-color: var(--success); }
1671
+ .message.warning { border-color: var(--warning); }
1672
+ .message.error { border-color: var(--danger); }
1673
+ .message .message-icon { color: var(--accent); flex-shrink: 0; }
1674
+ .message.success .message-icon { color: var(--success); }
1675
+ .message.warning .message-icon { color: var(--warning); }
1676
+ .message.error .message-icon { color: var(--danger); }
1677
+ .message-body { flex: 1; min-width: 0; }
1678
+ .message-title { font-weight: 600; margin-bottom: 2px; }
1679
+ .message-content { color: var(--fg-muted); font-size: 12px; }
1680
+ .message-close {
1615
1681
  background: transparent; border: none;
1616
1682
  color: var(--fg-subtle); cursor: pointer;
1617
1683
  padding: 0 2px; font-family: inherit;
1618
1684
  }
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); } }
1685
+ .message-close:hover { color: var(--fg); }
1686
+ .message.leaving { animation: messageOut var(--dur) var(--ease) forwards; }
1687
+ @keyframes messageIn { from { opacity: 0; transform: translateX(20px); } }
1688
+ @keyframes messageOut { to { opacity: 0; transform: translateX(20px); } }
1623
1689
  /* ============ Popover ============ */
1624
1690
  .popover {
1625
1691
  z-index: 1000;
@@ -1756,12 +1822,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
1756
1822
  }
1757
1823
  .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1758
1824
  /* ============ 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
1825
  .table-wrap {
1766
1826
  border-radius: var(--r-lg);
1767
1827
  background: var(--bg);
@@ -1993,7 +2053,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1993
2053
  .table-pagination {
1994
2054
  margin-top: 12px;
1995
2055
  }
1996
- /* Pro: card-wrap with toolbar + table + footer */
2056
+ /* ============ TablePro ============ */
1997
2057
  .table-card {
1998
2058
  border-radius: var(--r-lg);
1999
2059
  background: var(--bg);
@@ -2002,7 +2062,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
2002
2062
  }
2003
2063
  .table-card .table-wrap { background: transparent; box-shadow: none; border-radius: 0; }
2004
2064
  .table-card .table-wrap.joined { border-radius: 0; }
2005
- /* When TablePro hosts the built-in pagination, seat it inside the card. */
2006
2065
  .table-card .table-pagination {
2007
2066
  margin-top: 0;
2008
2067
  padding: 6px 16px;
@@ -2131,52 +2190,21 @@ input, textarea, select { font-family: inherit; color: inherit; }
2131
2190
  .list-item-desc { font-size: 12px; color: var(--fg-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2132
2191
  .list-item-actions { display: flex; gap: 6px; align-items: center; flex-shrink: 0; }
2133
2192
  .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;
2193
+ /* ============ Spin ============ */
2194
+ .spin {
2195
+ width: 14px;
2196
+ height: 14px;
2140
2197
  border-radius: 999px;
2141
2198
  border: 2px solid currentColor;
2142
2199
  border-right-color: transparent;
2143
2200
  animation: spin 0.8s linear infinite;
2144
2201
  display: inline-block;
2145
2202
  }
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 {
2203
+ .spin.accent { color: var(--accent); }
2204
+ .spin.success { color: var(--success); }
2205
+ .spin.warning { color: var(--warning); }
2206
+ .spin.danger { color: var(--danger); }
2207
+ .spin.ring {
2180
2208
  position: relative;
2181
2209
  display: inline-block;
2182
2210
  border: none;
@@ -2185,7 +2213,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2185
2213
  box-shadow: var(--neu-in-sm);
2186
2214
  animation: none;
2187
2215
  }
2188
- .spinner.ring::before {
2216
+ .spin.ring::before {
2189
2217
  content: "";
2190
2218
  position: absolute;
2191
2219
  inset: 0;
@@ -2197,54 +2225,84 @@ input, textarea, select { font-family: inherit; color: inherit; }
2197
2225
  currentColor 220deg,
2198
2226
  currentColor 340deg,
2199
2227
  transparent 360deg);
2200
- -webkit-mask: radial-gradient(circle, transparent 60%, #000 61%);
2201
- mask: radial-gradient(circle, transparent 60%, #000 61%);
2228
+ -webkit-mask: radial-gradient(circle, transparent 60%, currentColor 61%);
2229
+ mask: radial-gradient(circle, transparent 60%, currentColor 61%);
2202
2230
  animation: spin 0.9s linear infinite;
2203
2231
  }
2204
- .spinner.ring.accent::before,
2205
- .spinner.ring.success::before,
2206
- .spinner.ring.warning::before,
2207
- .spinner.ring.danger::before {
2232
+ .spin.ring.accent::before,
2233
+ .spin.ring.success::before,
2234
+ .spin.ring.warning::before,
2235
+ .spin.ring.danger::before {
2208
2236
  filter: drop-shadow(0 0 4px color-mix(in oklch, currentColor 50%, transparent));
2209
2237
  }
2210
- /* --- Dots variant: raised neumorphic spheres (container is transparent) --- */
2211
- .spinner.dots {
2238
+ .spin.dots {
2212
2239
  display: inline-flex;
2213
2240
  align-items: center;
2214
2241
  gap: 0.34em;
2215
2242
  border: none;
2216
2243
  background: none;
2217
2244
  box-shadow: none;
2218
- width: auto; height: auto;
2245
+ width: auto;
2246
+ height: auto;
2219
2247
  animation: none;
2220
2248
  line-height: 1;
2221
2249
  }
2222
- .spinner.dots i {
2223
- width: 0.4em; height: 0.4em;
2250
+ .spin.dots i {
2251
+ width: 0.4em;
2252
+ height: 0.4em;
2224
2253
  border-radius: 999px;
2225
2254
  background: radial-gradient(circle at 32% 28%,
2226
- color-mix(in oklch, currentColor 40%, white),
2255
+ color-mix(in oklch, currentColor 40%, var(--bg)),
2227
2256
  currentColor 62%,
2228
- color-mix(in oklch, currentColor 82%, black) 100%);
2257
+ color-mix(in oklch, currentColor 82%, var(--fg)) 100%);
2229
2258
  box-shadow:
2230
2259
  0 0.06em 0.14em color-mix(in oklch, currentColor 45%, transparent),
2231
2260
  0 0 0.35em color-mix(in oklch, currentColor 50%, transparent);
2232
2261
  display: inline-block;
2233
- animation: dot-bounce 1.2s ease-in-out infinite;
2262
+ animation: spin-dot-bounce 1.2s ease-in-out infinite;
2234
2263
  }
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 {
2264
+ .spin.dots i:nth-child(2) { animation-delay: 0.15s; }
2265
+ .spin.dots i:nth-child(3) { animation-delay: 0.3s; }
2266
+ @keyframes spin-dot-bounce {
2238
2267
  0%, 80%, 100% { transform: translateY(0); opacity: 0.5; }
2239
2268
  40% { transform: translateY(-30%); opacity: 1; }
2240
2269
  }
2241
- .spinner-wrap {
2270
+ .spin-wrap {
2242
2271
  display: inline-flex;
2243
2272
  align-items: center;
2244
2273
  gap: 8px;
2245
2274
  color: var(--fg-muted);
2246
2275
  }
2247
- .spinner-label { font-size: 12px; }
2276
+ .spin-label { font-size: 12px; }
2277
+ /* ============ Empty ============ */
2278
+ .empty {
2279
+ padding: 60px 20px;
2280
+ display: grid; place-items: center;
2281
+ gap: 12px;
2282
+ color: var(--fg-muted);
2283
+ text-align: center;
2284
+ }
2285
+ .empty.sm { padding: 28px 16px; gap: 8px; }
2286
+ .empty.sm .empty-ico { width: 40px; height: 40px; }
2287
+ .empty.sm .empty-title { font-size: 13px; }
2288
+ .empty.sm .empty-desc { font-size: 11px; }
2289
+ .empty.lg { padding: 96px 24px; gap: 16px; }
2290
+ .empty.lg .empty-ico { width: 72px; height: 72px; }
2291
+ .empty.lg .empty-title { font-size: 16px; }
2292
+ .empty.lg .empty-desc { font-size: 13px; }
2293
+ .empty.subtle .empty-ico { background: transparent; box-shadow: none; }
2294
+ .empty-ico {
2295
+ width: 56px; height: 56px;
2296
+ border-radius: var(--r-lg);
2297
+ background: var(--bg);
2298
+ box-shadow: var(--neu-in-sm);
2299
+ display: grid; place-items: center;
2300
+ color: var(--fg-subtle);
2301
+ }
2302
+ .empty-title { font-size: 14px; font-weight: 600; color: var(--fg); }
2303
+ .empty-desc { font-size: 12px; }
2304
+ .empty-action { margin-top: 8px; }
2305
+ /* ============ Skeleton ============ */
2248
2306
  .skeleton {
2249
2307
  display: block;
2250
2308
  background: color-mix(in oklch, var(--accent-soft) 55%, var(--bg-sunken));
@@ -2263,7 +2321,6 @@ input, textarea, select { font-family: inherit; color: inherit; }
2263
2321
  .skeleton.circle { border-radius: 999px; }
2264
2322
  @keyframes skel-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
2265
2323
  @keyframes skel-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
2266
- /* Composite skeleton — avatar + title + paragraph layout */
2267
2324
  .skeleton-box {
2268
2325
  display: flex;
2269
2326
  align-items: flex-start;
@@ -2481,6 +2538,24 @@ input, textarea, select { font-family: inherit; color: inherit; }
2481
2538
  }
2482
2539
  .cascader-trigger.placeholder { color: var(--fg-subtle); }
2483
2540
  .cascader.open .cascader-trigger { box-shadow: var(--neu-in-sm); color: var(--accent-ink); }
2541
+ .cascader-clear {
2542
+ position: absolute;
2543
+ right: 30px;
2544
+ top: 50%;
2545
+ transform: translateY(-50%);
2546
+ width: 20px;
2547
+ height: 20px;
2548
+ border-radius: 999px;
2549
+ background: var(--bg);
2550
+ box-shadow: var(--neu-out-sm);
2551
+ display: inline-grid;
2552
+ place-items: center;
2553
+ color: var(--fg-subtle);
2554
+ opacity: 0;
2555
+ transition: all var(--dur-fast) var(--ease);
2556
+ }
2557
+ .cascader:hover .cascader-clear { opacity: 1; }
2558
+ .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
2484
2559
  .cascader-panel {
2485
2560
  z-index: 1000;
2486
2561
  display: flex;
@@ -2491,6 +2566,52 @@ input, textarea, select { font-family: inherit; color: inherit; }
2491
2566
  animation: menuIn var(--dur) var(--ease);
2492
2567
  gap: 4px;
2493
2568
  }
2569
+ .cascader-panel.with-search {
2570
+ flex-direction: column;
2571
+ min-width: 320px;
2572
+ }
2573
+ .cascader-columns {
2574
+ display: flex;
2575
+ gap: 4px;
2576
+ }
2577
+ .cascader-search {
2578
+ padding: 4px 2px 8px;
2579
+ border-bottom: 1px solid var(--divider);
2580
+ }
2581
+ .cascader-search-list {
2582
+ display: flex;
2583
+ flex-direction: column;
2584
+ gap: 4px;
2585
+ max-height: 260px;
2586
+ overflow-y: auto;
2587
+ padding: 4px;
2588
+ }
2589
+ .cascader-search-item {
2590
+ border: none;
2591
+ background: transparent;
2592
+ color: var(--fg);
2593
+ border-radius: var(--r-sm);
2594
+ padding: 8px 10px;
2595
+ display: flex;
2596
+ align-items: center;
2597
+ gap: 6px;
2598
+ font-size: 13px;
2599
+ font-family: inherit;
2600
+ text-align: left;
2601
+ cursor: pointer;
2602
+ }
2603
+ .cascader-search-item:hover {
2604
+ background: var(--bg);
2605
+ box-shadow: var(--neu-flat);
2606
+ color: var(--accent-ink);
2607
+ }
2608
+ .cascader-path-sep { color: var(--fg-subtle); }
2609
+ .cascader-empty {
2610
+ padding: 24px 12px;
2611
+ text-align: center;
2612
+ color: var(--fg-muted);
2613
+ font-size: 12px;
2614
+ }
2494
2615
  .cascader-col {
2495
2616
  min-width: 160px;
2496
2617
  max-height: 280px;