@fangxinyan/lumina 0.6.3 → 0.6.4

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 (249) hide show
  1. package/dist/{Alert-QBKIDY5H.css → Alert-HVPI6L4V.css} +2 -2
  2. package/dist/Alert.cjs +3 -3
  3. package/dist/Alert.js +2 -2
  4. package/dist/{AppShell-RCALXUCZ.css → AppShell-FZCD4C56.css} +4 -4
  5. package/dist/AppShell.cjs +5 -5
  6. package/dist/AppShell.js +1 -1
  7. package/dist/{AutoComplete-P5KZMZO5.css → AutoComplete-4YZBMW4E.css} +2 -2
  8. package/dist/AutoComplete.cjs +5 -5
  9. package/dist/AutoComplete.js +4 -4
  10. package/dist/{Avatar-R5A4AFKZ.css → Avatar-TNPOHVY5.css} +1 -1
  11. package/dist/Avatar.cjs +2 -2
  12. package/dist/Avatar.js +1 -1
  13. package/dist/Badge.cjs +2 -2
  14. package/dist/Badge.js +1 -1
  15. package/dist/{Button-4Z3Q6KII.css → Button-TUMZUQLI.css} +11 -11
  16. package/dist/Button.cjs +3 -3
  17. package/dist/Button.js +2 -2
  18. package/dist/{Calendar-LHZELUDL.css → Calendar-RUTPKREW.css} +4 -4
  19. package/dist/Calendar.cjs +3 -3
  20. package/dist/Calendar.js +2 -2
  21. package/dist/{Card-6RMVIHWX.css → Card-MA6SV7D5.css} +6 -6
  22. package/dist/Card.cjs +2 -2
  23. package/dist/Card.js +1 -1
  24. package/dist/{Cascader-3BLLA7EN.css → Cascader-ANEQUPMI.css} +8 -8
  25. package/dist/Cascader.cjs +5 -5
  26. package/dist/Cascader.js +4 -4
  27. package/dist/{Checkbox-U5EUDSYS.css → Checkbox-EDNPZRIP.css} +3 -3
  28. package/dist/Checkbox.cjs +3 -3
  29. package/dist/Checkbox.js +2 -2
  30. package/dist/{Collapse-66U5YJFY.css → Collapse-UNBHEPYP.css} +2 -2
  31. package/dist/Collapse.cjs +3 -3
  32. package/dist/Collapse.js +2 -2
  33. package/dist/{ColorPicker-SDDQGHCM.css → ColorPicker-LPG6QPYF.css} +7 -7
  34. package/dist/ColorPicker.cjs +2 -2
  35. package/dist/ColorPicker.js +1 -1
  36. package/dist/{CommandPalette-T45DBMPY.css → CommandPalette-RTKWNH2D.css} +3 -3
  37. package/dist/CommandPalette.cjs +5 -5
  38. package/dist/CommandPalette.js +4 -4
  39. package/dist/{ContextMenu-FKW6CQW4.css → ContextMenu-WRR2SSWL.css} +3 -3
  40. package/dist/ContextMenu.cjs +2 -2
  41. package/dist/ContextMenu.js +1 -1
  42. package/dist/{Divider-OEE4Q2KS.css → Divider-RPQCVH3J.css} +2 -2
  43. package/dist/Divider.cjs +2 -2
  44. package/dist/Divider.js +1 -1
  45. package/dist/{Drawer-IPGB4CXH.css → Drawer-7N3URAJ6.css} +8 -5
  46. package/dist/Drawer.cjs +3 -3
  47. package/dist/Drawer.js +2 -2
  48. package/dist/{Empty-DC2LPORC.css → Empty-CZTRZMZQ.css} +1 -1
  49. package/dist/Empty.cjs +2 -2
  50. package/dist/Empty.js +1 -1
  51. package/dist/{Form-5GRVZNDO.css → Form-NGCQWTMZ.css} +1 -1
  52. package/dist/Form.cjs +4 -4
  53. package/dist/Form.js +1 -1
  54. package/dist/Icon.cjs +49 -49
  55. package/dist/Icon.js +1 -1
  56. package/dist/{Image-MRYQCRQ5.css → Image-SGSRTHQX.css} +5 -5
  57. package/dist/Image.cjs +6 -6
  58. package/dist/Image.js +2 -2
  59. package/dist/{Input-HUBJ55OH.css → Input-7GDPGP3E.css} +12 -12
  60. package/dist/Input.cjs +5 -5
  61. package/dist/Input.js +3 -3
  62. package/dist/InputNumber.cjs +5 -5
  63. package/dist/InputNumber.js +4 -4
  64. package/dist/{List-W5BW4D2P.css → List-LSMU5QAC.css} +3 -3
  65. package/dist/List.cjs +2 -2
  66. package/dist/List.js +1 -1
  67. package/dist/{Message-2MZ3LFPU.css → Message-H222YGR6.css} +1 -1
  68. package/dist/Message.cjs +6 -6
  69. package/dist/Message.js +2 -2
  70. package/dist/{Modal-2QNDW4SO.css → Modal-MCFDYVUQ.css} +3 -3
  71. package/dist/Modal.cjs +4 -4
  72. package/dist/Modal.js +3 -3
  73. package/dist/{Pagination-YIRYJUXP.css → Pagination-YSZSNFHG.css} +5 -5
  74. package/dist/Pagination.cjs +7 -7
  75. package/dist/Pagination.js +6 -6
  76. package/dist/{Popover-DVGQGWX6.css → Popover-Y3LDCJPW.css} +1 -1
  77. package/dist/Popover.cjs +2 -2
  78. package/dist/Popover.js +1 -1
  79. package/dist/{Progress-CHV7DN6Y.css → Progress-CZNXCYGW.css} +1 -1
  80. package/dist/Progress.cjs +2 -2
  81. package/dist/Progress.js +1 -1
  82. package/dist/{Radio-GVFDPAZM.css → Radio-IQKASYDF.css} +4 -4
  83. package/dist/Radio.cjs +3 -3
  84. package/dist/Radio.js +1 -1
  85. package/dist/{Select-Z5VYPEEY.css → Select-YZ2NUJSX.css} +18 -18
  86. package/dist/Select.cjs +6 -6
  87. package/dist/Select.js +5 -5
  88. package/dist/Skeleton.cjs +2 -2
  89. package/dist/Skeleton.js +1 -1
  90. package/dist/{Slider-3JKA5EW6.css → Slider-UM2IZZBH.css} +7 -7
  91. package/dist/Slider.cjs +2 -2
  92. package/dist/Slider.js +1 -1
  93. package/dist/{Spin-3GJNMSIH.css → Spin-GONGPV4Q.css} +1 -1
  94. package/dist/Spin.cjs +2 -2
  95. package/dist/Spin.js +1 -1
  96. package/dist/Splitter.cjs +2 -2
  97. package/dist/Splitter.js +1 -1
  98. package/dist/{StatusBar-CDS2GPSI.css → StatusBar-FJKEEPXU.css} +3 -7
  99. package/dist/StatusBar.cjs +3 -3
  100. package/dist/StatusBar.js +1 -1
  101. package/dist/Surface-UDDN3DGL.css +42 -0
  102. package/dist/Surface.cjs +16 -0
  103. package/dist/Surface.d.cts +60 -0
  104. package/dist/Surface.d.ts +60 -0
  105. package/dist/Surface.js +3 -0
  106. package/dist/{Switch-36KJNDXM.css → Switch-COAQIOMH.css} +8 -5
  107. package/dist/Switch.cjs +2 -2
  108. package/dist/Switch.js +1 -1
  109. package/dist/{Table-ATJJQLKU.css → Table-IYJTPY6J.css} +16 -16
  110. package/dist/Table.cjs +9 -9
  111. package/dist/Table.js +8 -8
  112. package/dist/{TablePro-3XVHYLSL.css → TablePro-JRSBPXB5.css} +1 -1
  113. package/dist/TablePro.cjs +10 -10
  114. package/dist/TablePro.js +9 -9
  115. package/dist/{Tabs-BLSNI2T5.css → Tabs-X5U5PCPV.css} +2 -2
  116. package/dist/Tabs.cjs +2 -2
  117. package/dist/Tabs.js +1 -1
  118. package/dist/{Tag-HDYCDPFS.css → Tag-G2XWAL7A.css} +1 -1
  119. package/dist/Tag.cjs +3 -3
  120. package/dist/Tag.js +2 -2
  121. package/dist/{Textarea-YNET7IBH.css → Textarea-YHWKHIFE.css} +3 -3
  122. package/dist/Textarea.cjs +4 -4
  123. package/dist/Textarea.js +2 -2
  124. package/dist/Theme.cjs +11 -11
  125. package/dist/Theme.d.cts +5 -1
  126. package/dist/Theme.d.ts +5 -1
  127. package/dist/Theme.js +1 -1
  128. package/dist/ThemePanel-76LB3YA5.css +509 -0
  129. package/dist/ThemePanel.cjs +29 -0
  130. package/dist/ThemePanel.d.cts +80 -0
  131. package/dist/ThemePanel.d.ts +80 -0
  132. package/dist/ThemePanel.js +12 -0
  133. package/dist/{Timeline-3ZHOHPXT.css → Timeline-ZIM7QFQC.css} +1 -1
  134. package/dist/Timeline.cjs +3 -3
  135. package/dist/Timeline.js +2 -2
  136. package/dist/{Tooltip-DMKUPC24.css → Tooltip-WI23DSRQ.css} +1 -1
  137. package/dist/Tooltip.cjs +2 -2
  138. package/dist/Tooltip.js +1 -1
  139. package/dist/{Typography-NKPWTJCV.css → Typography-GQNIJ4XD.css} +5 -5
  140. package/dist/Typography.cjs +7 -7
  141. package/dist/Typography.js +2 -2
  142. package/dist/{chunk-DWAN57G4.js → chunk-2NT5QKEX.js} +3 -3
  143. package/dist/{chunk-6BWELOCT.js → chunk-2SCXQ7QS.js} +2 -2
  144. package/dist/{chunk-TP567B3L.cjs → chunk-2ZADGBUN.cjs} +5 -5
  145. package/dist/{chunk-CETNCRZ4.js → chunk-2ZFJTMEF.js} +4 -4
  146. package/dist/{chunk-I5WTQ5Y3.js → chunk-3YP7CBJT.js} +3 -3
  147. package/dist/{chunk-UUHFKIWP.cjs → chunk-4UKM4KAC.cjs} +2 -2
  148. package/dist/{chunk-HLFH5HWR.js → chunk-56PHETWO.js} +3 -3
  149. package/dist/{chunk-R2TEDH2F.cjs → chunk-5JPAUQ5H.cjs} +7 -7
  150. package/dist/{chunk-MPVCYU2K.cjs → chunk-5NFSDFBB.cjs} +4 -4
  151. package/dist/{chunk-P6P4DGLF.cjs → chunk-66GXZQKL.cjs} +4 -4
  152. package/dist/{chunk-QP3VCSRY.cjs → chunk-66T76GII.cjs} +6 -6
  153. package/dist/chunk-6EOSMK34.cjs +194 -0
  154. package/dist/{chunk-WNM5RVXR.cjs → chunk-6GQPF3EI.cjs} +2 -2
  155. package/dist/{chunk-V272XR3F.cjs → chunk-6LARTGLP.cjs} +1 -1
  156. package/dist/chunk-6SPMHY54.js +191 -0
  157. package/dist/{chunk-YLIQ37KY.cjs → chunk-6XVLERA3.cjs} +2 -2
  158. package/dist/{chunk-FBYUZOZP.js → chunk-7D76MI37.js} +5 -5
  159. package/dist/{chunk-J5ZGYQZK.js → chunk-7NZ2A4MA.js} +155 -29
  160. package/dist/{chunk-KLEKKZ73.js → chunk-7ZNGHWVS.js} +1 -1
  161. package/dist/{chunk-7AG524YZ.cjs → chunk-ACQSRMLF.cjs} +5 -5
  162. package/dist/{chunk-JVUVOR6S.js → chunk-AJH2O4WC.js} +3 -3
  163. package/dist/{chunk-ET6DYQVZ.js → chunk-BCFCSVGJ.js} +3 -3
  164. package/dist/{chunk-NTS5L4NQ.cjs → chunk-BJ6WUVEG.cjs} +4 -4
  165. package/dist/{chunk-S3VXH5L4.cjs → chunk-C24W6PTJ.cjs} +2 -2
  166. package/dist/{chunk-GMN74OEY.cjs → chunk-CBKJXKVI.cjs} +2 -2
  167. package/dist/{chunk-FWPBORRB.js → chunk-CEZ2DR4R.js} +3 -3
  168. package/dist/{chunk-SQGPSMSK.js → chunk-CNGKJYGZ.js} +3 -3
  169. package/dist/{chunk-PULGVK2I.cjs → chunk-D5PCIVID.cjs} +4 -4
  170. package/dist/{chunk-DG5VQ6BO.cjs → chunk-D64IPDUE.cjs} +4 -4
  171. package/dist/{chunk-VFFIE2VO.cjs → chunk-DYHNOYRC.cjs} +7 -7
  172. package/dist/{chunk-P6EZG2R7.cjs → chunk-DYSGXQUK.cjs} +7 -7
  173. package/dist/{chunk-3YJU3D5S.cjs → chunk-F3LHLYX6.cjs} +2 -2
  174. package/dist/{chunk-H4LGWZMH.cjs → chunk-GBKUGKIY.cjs} +11 -11
  175. package/dist/{chunk-J2HZTJO6.js → chunk-GUZ2DNDC.js} +3 -3
  176. package/dist/{chunk-K6F25JXT.js → chunk-GZCU6HXD.js} +2 -2
  177. package/dist/{chunk-USQ43DJ5.js → chunk-HFUHQUPQ.js} +2 -2
  178. package/dist/{chunk-7JN6FJ55.js → chunk-HU7T64Y3.js} +2 -2
  179. package/dist/{chunk-X5GCOMC3.cjs → chunk-IDJCFYPP.cjs} +15 -15
  180. package/dist/{chunk-KD4YYIIO.cjs → chunk-IHK2FRTS.cjs} +2 -2
  181. package/dist/{chunk-Q5SZIU7Z.cjs → chunk-JFQ53MO4.cjs} +1 -1
  182. package/dist/{chunk-7PQJCLIR.js → chunk-KMG7OMOS.js} +2 -2
  183. package/dist/{chunk-2HQCUBA7.cjs → chunk-L27C5O4W.cjs} +4 -4
  184. package/dist/chunk-LFTCK2VM.cjs +1194 -0
  185. package/dist/{chunk-BVQ77VRY.js → chunk-LI4XJTEA.js} +3 -3
  186. package/dist/{chunk-45VJGBGN.js → chunk-LQLOOUS3.js} +2 -2
  187. package/dist/{chunk-PL6DRFUO.cjs → chunk-MOMLQP7B.cjs} +2 -2
  188. package/dist/{chunk-OF7JIYBY.cjs → chunk-MYHBC3HA.cjs} +2 -2
  189. package/dist/{chunk-LKK2AA7W.js → chunk-MYRLCN6V.js} +2 -2
  190. package/dist/{chunk-ZKE73UQF.cjs → chunk-N2BTMKF2.cjs} +5 -5
  191. package/dist/{chunk-6ZXQJRAT.cjs → chunk-N2COYOXE.cjs} +155 -29
  192. package/dist/{chunk-2TL37AP5.cjs → chunk-N3OLFKV5.cjs} +1 -1
  193. package/dist/{chunk-5JSDQ6QQ.cjs → chunk-NDO22RER.cjs} +2 -2
  194. package/dist/{chunk-ME5BZ2WA.js → chunk-NE7IUGMK.js} +3 -3
  195. package/dist/{chunk-F6RYCBQG.js → chunk-NFXHIO3G.js} +1 -1
  196. package/dist/chunk-NJCHFXGC.js +1170 -0
  197. package/dist/chunk-NT6CJYI3.cjs +129 -0
  198. package/dist/chunk-O43DOE7V.js +106 -0
  199. package/dist/{chunk-GNEZD7KE.cjs → chunk-O4BOBOYV.cjs} +2 -2
  200. package/dist/{chunk-XSN4TLN5.cjs → chunk-OGPDCBPD.cjs} +12 -12
  201. package/dist/{chunk-6YQTMI55.js → chunk-OHFZ7L4T.js} +2 -2
  202. package/dist/{chunk-7IYKKLV3.js → chunk-OHIFKN4E.js} +4 -4
  203. package/dist/{chunk-46VXFTEC.js → chunk-OQU3TJCF.js} +3 -3
  204. package/dist/{chunk-5TKC6IEN.js → chunk-PEJLXJQD.js} +1 -1
  205. package/dist/{chunk-HWFM4MAT.js → chunk-PKHITACT.js} +2 -2
  206. package/dist/{chunk-JCEHZ336.js → chunk-PNZJFLMY.js} +3 -3
  207. package/dist/{chunk-XRR3CYQL.js → chunk-QP7RXZES.js} +2 -2
  208. package/dist/{chunk-5MN3PMF4.cjs → chunk-QY76WTO5.cjs} +9 -9
  209. package/dist/{chunk-FGW5GJ22.cjs → chunk-R74TZKJS.cjs} +4 -4
  210. package/dist/{chunk-TGL5BGMR.js → chunk-REMJWNAT.js} +4 -4
  211. package/dist/{chunk-SWBWZIL4.cjs → chunk-S6OKX4H7.cjs} +2 -2
  212. package/dist/{chunk-EC4WGEAJ.js → chunk-SABWUELE.js} +2 -2
  213. package/dist/{chunk-QKQHZIF3.cjs → chunk-SG42F5VB.cjs} +2 -2
  214. package/dist/{chunk-5C2AI2SD.js → chunk-SQIWPU6V.js} +2 -2
  215. package/dist/{chunk-5DKRY67M.cjs → chunk-SYWTT5TY.cjs} +5 -5
  216. package/dist/{chunk-OBEKX4VR.js → chunk-TVUBGXWA.js} +2 -2
  217. package/dist/{chunk-7PNJI5UE.cjs → chunk-U2H4DRMV.cjs} +2 -2
  218. package/dist/{chunk-HKF2V5MM.cjs → chunk-VAXWWJJP.cjs} +9 -9
  219. package/dist/{chunk-5H5YP2TB.js → chunk-VNNQYJLT.js} +3 -3
  220. package/dist/{chunk-KGSADAOD.cjs → chunk-VSUMJX6Z.cjs} +2 -2
  221. package/dist/{chunk-K5IGFBDR.js → chunk-W5CJC7S7.js} +3 -3
  222. package/dist/{chunk-AXZ7ELMA.js → chunk-WEJKY3DF.js} +2 -2
  223. package/dist/{chunk-GIZU3H6H.js → chunk-WXWFMWWF.js} +3 -3
  224. package/dist/{chunk-TEEFR2FD.js → chunk-XHQGMMH7.js} +2 -2
  225. package/dist/{chunk-UKS23N3L.js → chunk-XVP7IKLZ.js} +4 -4
  226. package/dist/{chunk-ELNT3CFO.js → chunk-Y5F7ZTBH.js} +2 -2
  227. package/dist/{chunk-QCILPZWP.js → chunk-YJEXAO2I.js} +2 -2
  228. package/dist/{chunk-7ABFUIOB.cjs → chunk-YNCDTKAE.cjs} +2 -2
  229. package/dist/{chunk-K7FV7W6U.cjs → chunk-YSCIMHOI.cjs} +5 -5
  230. package/dist/{chunk-BPOOVO5T.js → chunk-YSXD344H.js} +5 -5
  231. package/dist/{chunk-47VG2P34.js → chunk-YT5NLCRC.js} +1 -1
  232. package/dist/{chunk-HZSIUOCN.cjs → chunk-YUKXNWVE.cjs} +1 -1
  233. package/dist/{chunk-65FIH5A3.js → chunk-YVTLHTG6.js} +2 -2
  234. package/dist/{chunk-GENABQYA.cjs → chunk-Z4PZ2ZHI.cjs} +2 -2
  235. package/dist/{chunk-6HMTV6P4.cjs → chunk-ZPKHGKVL.cjs} +4 -4
  236. package/dist/{chunk-AAGF7K3L.js → chunk-ZPP7LTHP.js} +3 -3
  237. package/dist/{chunk-IZOHYJUQ.cjs → chunk-ZWCDB5PP.cjs} +2 -2
  238. package/dist/index.cjs +214 -191
  239. package/dist/index.d.cts +3 -1
  240. package/dist/index.d.ts +3 -1
  241. package/dist/index.js +49 -46
  242. package/dist/styles.css +677 -168
  243. package/dist/{tokens-BIIUTPKN.css → tokens-EF34LSWI.css} +42 -17
  244. package/dist/tokens.css +42 -17
  245. package/docs/llms/surface.md +90 -0
  246. package/docs/llms/theme.md +24 -2
  247. package/docs/llms/themepanel.md +128 -0
  248. package/docs/llms.md +3 -1
  249. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -20,42 +20,52 @@
20
20
 
21
21
  /* Distance multiplier — driven by ThemeProvider `intensity` (1..10 → 0.4..1.6). */
22
22
  --d: 1;
23
+ --shadow-scale: 1;
24
+ --shadow-float-scale: 1;
23
25
 
24
- --shadow-blur: calc(16px * var(--d));
25
- --shadow-offset: calc(6px * var(--d));
26
- --shadow-inset-blur: calc(10px * var(--d));
27
- --shadow-inset-offset: calc(4px * var(--d));
26
+ --shadow-blur: calc(16px * var(--d) * var(--shadow-scale));
27
+ --shadow-offset: calc(6px * var(--d) * var(--shadow-scale));
28
+ --shadow-inset-blur: calc(10px * var(--d) * var(--shadow-scale));
29
+ --shadow-inset-offset: calc(4px * var(--d) * var(--shadow-scale));
28
30
 
29
- --neu-out:
31
+ --neu-shadow-panel:
30
32
  var(--shadow-offset) var(--shadow-offset) var(--shadow-blur) var(--shadow-dark),
31
33
  calc(var(--shadow-offset) * -1) calc(var(--shadow-offset) * -1) var(--shadow-blur) var(--shadow-light);
32
34
 
33
- --neu-out-sm:
35
+ --neu-shadow-control:
34
36
  calc(var(--shadow-offset) * 0.5) calc(var(--shadow-offset) * 0.5) calc(var(--shadow-blur) * 0.6) var(--shadow-dark),
35
37
  calc(var(--shadow-offset) * -0.5) calc(var(--shadow-offset) * -0.5) calc(var(--shadow-blur) * 0.6) var(--shadow-light);
36
38
 
37
- --neu-out-lg:
39
+ --neu-shadow-lift:
38
40
  calc(var(--shadow-offset) * 1.6) calc(var(--shadow-offset) * 1.6) calc(var(--shadow-blur) * 1.4) var(--shadow-dark),
39
41
  calc(var(--shadow-offset) * -1.6) calc(var(--shadow-offset) * -1.6) calc(var(--shadow-blur) * 1.4) var(--shadow-light);
40
42
 
41
- --neu-in:
43
+ --neu-shadow-inset-strong:
42
44
  inset var(--shadow-inset-offset) var(--shadow-inset-offset) var(--shadow-inset-blur) var(--shadow-dark),
43
45
  inset calc(var(--shadow-inset-offset) * -1) calc(var(--shadow-inset-offset) * -1) var(--shadow-inset-blur) var(--shadow-light);
44
46
 
45
- --neu-in-sm:
47
+ --neu-shadow-inset:
46
48
  inset calc(var(--shadow-inset-offset) * 0.6) calc(var(--shadow-inset-offset) * 0.6) calc(var(--shadow-inset-blur) * 0.6) var(--shadow-dark),
47
49
  inset calc(var(--shadow-inset-offset) * -0.6) calc(var(--shadow-inset-offset) * -0.6) calc(var(--shadow-inset-blur) * 0.6) var(--shadow-light);
48
50
 
49
- --neu-flat:
51
+ --neu-shadow-subtle:
50
52
  1px 1px 2px var(--shadow-dark),
51
53
  -1px -1px 2px var(--shadow-light);
52
54
 
53
55
  /* Floating-overlay elevation.
54
56
  No top-left highlight — there's no continuous surface beneath an overlay
55
57
  panel, so the neumorphic light-reflection metaphor would read as a halo. */
56
- --neu-float:
57
- 0 calc(var(--shadow-offset) * 1.8) calc(var(--shadow-blur) * 2.2) var(--shadow-dark),
58
- 0 calc(var(--shadow-offset) * 0.4) calc(var(--shadow-blur) * 0.7) var(--shadow-dark);
58
+ --neu-shadow-float:
59
+ 0 calc(var(--shadow-offset) * 1.8 * var(--shadow-float-scale)) calc(var(--shadow-blur) * 2.2 * var(--shadow-float-scale)) var(--shadow-dark),
60
+ 0 calc(var(--shadow-offset) * 0.4 * var(--shadow-float-scale)) calc(var(--shadow-blur) * 0.7 * var(--shadow-float-scale)) var(--shadow-dark);
61
+
62
+ --neu-out: var(--neu-shadow-panel);
63
+ --neu-out-sm: var(--neu-shadow-control);
64
+ --neu-out-lg: var(--neu-shadow-lift);
65
+ --neu-in: var(--neu-shadow-inset-strong);
66
+ --neu-in-sm: var(--neu-shadow-inset);
67
+ --neu-flat: var(--neu-shadow-subtle);
68
+ --neu-float: var(--neu-shadow-float);
59
69
 
60
70
  /* ---- Accent (default sky) ---- */
61
71
  --accent: oklch(68% 0.14 235);
@@ -89,7 +99,13 @@
89
99
 
90
100
  /* ---- Control sizes (density) ---- */
91
101
  --ctrl-h: 40px;
102
+ --ctrl-h-sm: 30px;
103
+ --ctrl-h-lg: 52px;
104
+ --field-h-sm: 32px;
105
+ --field-h-lg: 48px;
92
106
  --ctrl-pad-x: 18px;
107
+ --ctrl-pad-x-sm: 12px;
108
+ --ctrl-pad-x-lg: 24px;
93
109
 
94
110
  /* ---- Type ---- */
95
111
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
@@ -97,6 +113,11 @@
97
113
  "Noto Sans CJK SC", sans-serif;
98
114
  --font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Consolas, monospace;
99
115
  --font-display: "SF Pro Display", var(--font-sans);
116
+ --fs-xs: 11px;
117
+ --fs-sm: 12px;
118
+ --fs-md: 13px;
119
+ --fs-lg: 14px;
120
+ --fs-xl: 15px;
100
121
 
101
122
  /* ---- Motion ---- */
102
123
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
@@ -122,13 +143,17 @@
122
143
  --shadow-dark: rgba(0, 0, 0, 0.55);
123
144
  --shadow-light: rgba(130, 145, 180, 0.06);
124
145
  /* 同时收紧阴影尺寸,深色模式下拟态更内敛 */
125
- --shadow-offset: calc(4px * var(--d));
126
- --shadow-blur: calc(10px * var(--d));
127
- --shadow-inset-offset: calc(3px * var(--d));
128
- --shadow-inset-blur: calc(7px * var(--d));
146
+ --shadow-offset: calc(4px * var(--d) * var(--shadow-scale));
147
+ --shadow-blur: calc(10px * var(--d) * var(--shadow-scale));
148
+ --shadow-inset-offset: calc(3px * var(--d) * var(--shadow-scale));
149
+ --shadow-inset-blur: calc(7px * var(--d) * var(--shadow-scale));
129
150
  --accent-soft: oklch(35% 0.06 235);
130
151
  --accent-ink: oklch(82% 0.09 235);
131
152
  --accent-glow: oklch(68% 0.14 235 / 0.18);
153
+ --info: oklch(78% 0.12 235);
154
+ --success: oklch(78% 0.14 150);
155
+ --warning: oklch(82% 0.14 75);
156
+ --danger: oklch(76% 0.16 25);
132
157
  }
133
158
  /* 深色模式的 accent-glow 统一降低强度,避免按钮外圈过亮 */
134
159
  [data-theme="dark"][data-accent="sky"] { --accent-soft: oklch(35% 0.08 235); --accent-ink: oklch(82% 0.10 235); --accent-glow: oklch(68% 0.14 235 / 0.18); }
@@ -221,12 +246,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
221
246
  padding: 0 var(--ctrl-pad-x);
222
247
  border: 1px solid transparent;
223
248
  border-radius: var(--r-md);
224
- font-size: 13px;
249
+ font-size: var(--fs-md);
225
250
  font-weight: 500;
226
251
  font-family: inherit;
227
252
  color: var(--fg);
228
253
  background: var(--bg);
229
- box-shadow: var(--neu-out-sm);
254
+ box-shadow: var(--neu-shadow-control);
230
255
  cursor: pointer;
231
256
  user-select: none;
232
257
  white-space: nowrap;
@@ -268,12 +293,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
268
293
  }
269
294
  .btn.danger { color: var(--danger); }
270
295
  .btn:hover {
271
- box-shadow: var(--neu-out);
296
+ box-shadow: var(--neu-shadow-panel);
272
297
  }
273
298
  .btn.ghost:hover {
274
299
  background: var(--bg);
275
300
  border-color: transparent;
276
- box-shadow: var(--neu-flat);
301
+ box-shadow: var(--neu-shadow-subtle);
277
302
  color: var(--fg);
278
303
  }
279
304
  .btn.danger:hover {
@@ -281,7 +306,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
281
306
  }
282
307
  .btn:active,
283
308
  .btn.pressed {
284
- box-shadow: var(--neu-in);
309
+ box-shadow: var(--neu-shadow-inset-strong);
285
310
  }
286
311
  .btn.ghost:active,
287
312
  .btn.ghost.pressed {
@@ -293,23 +318,23 @@ input, textarea, select { font-family: inherit; color: inherit; }
293
318
  color: var(--danger);
294
319
  }
295
320
  .btn.icon { width: var(--ctrl-h); padding: 0; }
296
- .btn.sm { height: 30px; padding: 0 12px; font-size: 12px; border-radius: var(--r-sm); }
297
- .btn.sm.icon { width: 30px; padding: 0; }
298
- .btn.lg { height: 52px; padding: 0 24px; font-size: 15px; border-radius: var(--r-lg); }
299
- .btn.lg.icon { width: 52px; padding: 0; }
321
+ .btn.sm { height: var(--ctrl-h-sm); padding: 0 var(--ctrl-pad-x-sm); font-size: var(--fs-sm); border-radius: var(--r-sm); }
322
+ .btn.sm.icon { width: var(--ctrl-h-sm); padding: 0; }
323
+ .btn.lg { height: var(--ctrl-h-lg); padding: 0 var(--ctrl-pad-x-lg); font-size: var(--fs-xl); border-radius: var(--r-lg); }
324
+ .btn.lg.icon { width: var(--ctrl-h-lg); padding: 0; }
300
325
  .btn.block { width: 100%; flex-shrink: 1; }
301
326
  .btn[disabled], .btn.disabled, .btn:disabled {
302
327
  color: var(--fg-subtle);
303
328
  cursor: not-allowed;
304
329
  border-color: transparent;
305
- box-shadow: var(--neu-flat);
330
+ box-shadow: var(--neu-shadow-subtle);
306
331
  transform: none;
307
332
  }
308
333
  .btn[disabled]:hover, .btn:disabled:hover, .btn.disabled:hover {
309
334
  color: var(--fg-subtle);
310
335
  background: var(--bg);
311
336
  border-color: transparent;
312
- box-shadow: var(--neu-flat);
337
+ box-shadow: var(--neu-shadow-subtle);
313
338
  transform: none;
314
339
  }
315
340
  .btn.loading { cursor: wait; }
@@ -329,7 +354,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
329
354
  width: 100%;
330
355
  }
331
356
  .input-count {
332
- font-size: 11px;
357
+ font-size: var(--fs-xs);
333
358
  color: var(--fg-subtle);
334
359
  font-variant-numeric: tabular-nums;
335
360
  text-align: right;
@@ -343,14 +368,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
343
368
  padding: 0 var(--ctrl-pad-x);
344
369
  border-radius: var(--r-md);
345
370
  background: var(--bg);
346
- box-shadow: var(--neu-in-sm);
371
+ box-shadow: var(--neu-shadow-inset);
347
372
  transition: box-shadow var(--dur) var(--ease);
348
373
  gap: 8px;
349
374
  }
350
- .input-wrap.sm { height: 32px; padding: 0 12px; border-radius: var(--r-sm); gap: 6px; }
351
- .input-wrap.lg { height: 48px; padding: 0 18px; border-radius: var(--r-lg); gap: 10px; }
352
- .input-wrap:focus-within { box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-glow); }
353
- .input-wrap.invalid { box-shadow: var(--neu-in-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent); }
375
+ .input-wrap.sm { height: var(--field-h-sm); padding: 0 var(--ctrl-pad-x-sm); border-radius: var(--r-sm); gap: 6px; }
376
+ .input-wrap.lg { height: var(--field-h-lg); padding: 0 var(--ctrl-pad-x); border-radius: var(--r-lg); gap: 10px; }
377
+ .input-wrap:focus-within { box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow); }
378
+ .input-wrap.invalid { box-shadow: var(--neu-shadow-inset), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent); }
354
379
  .input-wrap.disabled { opacity: 0.6; cursor: not-allowed; }
355
380
  .input-wrap .lead,
356
381
  .input-wrap .trail {
@@ -377,13 +402,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
377
402
  display: inline-flex;
378
403
  align-items: center;
379
404
  color: var(--fg-muted);
380
- font-size: 13px;
405
+ font-size: var(--fs-md);
381
406
  white-space: nowrap;
382
407
  user-select: none;
383
408
  flex-shrink: 0;
384
409
  }
385
- .input-wrap.sm .input-affix { font-size: 12px; }
386
- .input-wrap.lg .input-affix { font-size: 14px; }
410
+ .input-wrap.sm .input-affix { font-size: var(--fs-sm); }
411
+ .input-wrap.lg .input-affix { font-size: var(--fs-lg); }
387
412
  .input-wrap .input-clear {
388
413
  display: inline-flex;
389
414
  align-items: center;
@@ -424,12 +449,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
424
449
  background: transparent;
425
450
  box-shadow: none;
426
451
  color: var(--fg);
427
- font-size: 13px;
452
+ font-size: var(--fs-md);
428
453
  font-family: inherit;
429
454
  outline: none;
430
455
  }
431
- .input-wrap.sm > .input { font-size: 12px; }
432
- .input-wrap.lg > .input { font-size: 14px; }
456
+ .input-wrap.sm > .input { font-size: var(--fs-sm); }
457
+ .input-wrap.lg > .input { font-size: var(--fs-lg); }
433
458
  .input-wrap > .input::placeholder { color: var(--fg-subtle); }
434
459
  .input-wrap.disabled > .input { cursor: not-allowed; }
435
460
  /* ============ Textarea ============ */
@@ -472,7 +497,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
472
497
  border: none;
473
498
  border-radius: var(--r-md);
474
499
  background: var(--bg);
475
- box-shadow: var(--neu-in-sm);
500
+ box-shadow: var(--neu-shadow-inset);
476
501
  color: var(--fg);
477
502
  font-size: 13px;
478
503
  font-family: inherit;
@@ -481,8 +506,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
481
506
  outline: none;
482
507
  transition: box-shadow var(--dur) var(--ease);
483
508
  }
484
- .textarea:focus { box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-glow); }
485
- .textarea.invalid { box-shadow: var(--neu-in-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent); }
509
+ .textarea:focus { box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow); }
510
+ .textarea.invalid { box-shadow: var(--neu-shadow-inset), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent); }
486
511
  .textarea::placeholder { color: var(--fg-subtle); }
487
512
  /* ============ Switch ============ */
488
513
  .switch {
@@ -505,7 +530,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
505
530
  padding: 0;
506
531
  border-radius: 999px;
507
532
  background: var(--bg);
508
- box-shadow: var(--neu-in-sm);
533
+ box-shadow: var(--neu-shadow-inset);
509
534
  cursor: inherit;
510
535
  flex-shrink: 0;
511
536
  transition: all var(--dur) var(--ease);
@@ -513,9 +538,9 @@ input, textarea, select { font-family: inherit; color: inherit; }
513
538
  .switch.sm { --w: 36px; --h: 20px; }
514
539
  .switch.lg { --w: 58px; --h: 32px; }
515
540
  /* When checkedChildren / unCheckedChildren are present, widen the track to fit. */
516
- .switch.with-children { --w: 60px; }
517
- .switch.with-children.sm { --w: 46px; }
518
- .switch.with-children.lg { --w: 74px; }
541
+ .switch.with-children { --w: 72px; }
542
+ .switch.with-children.sm { --w: 60px; }
543
+ .switch.with-children.lg { --w: 86px; }
519
544
  .switch-thumb {
520
545
  position: absolute;
521
546
  top: 3px;
@@ -524,7 +549,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
524
549
  height: calc(var(--h) - 6px);
525
550
  border-radius: 999px;
526
551
  background: var(--bg-raised);
527
- box-shadow: var(--neu-out-sm);
552
+ box-shadow: var(--neu-shadow-control);
528
553
  transition: all var(--dur) var(--ease);
529
554
  z-index: 1;
530
555
  }
@@ -552,6 +577,9 @@ input, textarea, select { font-family: inherit; color: inherit; }
552
577
  display: inline-flex;
553
578
  align-items: center;
554
579
  justify-content: center;
580
+ min-width: 0;
581
+ overflow: hidden;
582
+ white-space: nowrap;
555
583
  transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
556
584
  }
557
585
  /* Checked label sits on the left side of the track (thumb pushes right). */
@@ -591,7 +619,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
591
619
  padding: 0;
592
620
  border-radius: 7px;
593
621
  background: var(--bg);
594
- box-shadow: var(--neu-in-sm);
622
+ box-shadow: var(--neu-shadow-inset);
595
623
  display: grid;
596
624
  place-items: center;
597
625
  flex-shrink: 0;
@@ -602,12 +630,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
602
630
  .checkbox-box svg { opacity: 0; transform: scale(0.6); transition: all var(--dur) var(--ease); }
603
631
  .checkbox.checked .checkbox-box {
604
632
  background: var(--accent);
605
- box-shadow: var(--neu-out-sm), 0 2px 8px var(--accent-glow);
633
+ box-shadow: var(--neu-shadow-control), 0 2px 8px var(--accent-glow);
606
634
  }
607
635
  .checkbox.checked .checkbox-box svg { opacity: 1; transform: scale(1); }
608
636
  .checkbox.indeterminate .checkbox-box {
609
637
  background: var(--accent);
610
- box-shadow: var(--neu-out-sm), 0 2px 8px var(--accent-glow);
638
+ box-shadow: var(--neu-shadow-control), 0 2px 8px var(--accent-glow);
611
639
  }
612
640
  .checkbox.indeterminate .checkbox-box::after {
613
641
  content: "";
@@ -633,7 +661,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
633
661
  padding: 0;
634
662
  border-radius: 999px;
635
663
  background: var(--bg);
636
- box-shadow: var(--neu-in-sm);
664
+ box-shadow: var(--neu-shadow-inset);
637
665
  cursor: inherit;
638
666
  position: relative;
639
667
  flex-shrink: 0;
@@ -641,7 +669,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
641
669
  }
642
670
  .radio.checked .radio-dot {
643
671
  background: var(--accent);
644
- box-shadow: var(--neu-out-sm), 0 2px 8px var(--accent-glow);
672
+ box-shadow: var(--neu-shadow-control), 0 2px 8px var(--accent-glow);
645
673
  }
646
674
  .radio.checked .radio-dot::after {
647
675
  content: "";
@@ -661,7 +689,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
661
689
  padding: 4px;
662
690
  border-radius: var(--r-md);
663
691
  background: var(--bg);
664
- box-shadow: var(--neu-in-sm);
692
+ box-shadow: var(--neu-shadow-inset);
665
693
  gap: 2px;
666
694
  flex-wrap: nowrap;
667
695
  }
@@ -693,7 +721,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
693
721
  left: 0;
694
722
  border-radius: calc(var(--r-md) - 4px);
695
723
  background: var(--bg);
696
- box-shadow: var(--neu-out-sm);
724
+ box-shadow: var(--neu-shadow-control);
697
725
  pointer-events: none;
698
726
  transition:
699
727
  transform var(--dur-slow) var(--ease),
@@ -732,7 +760,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
732
760
  height: 10px;
733
761
  border-radius: 999px;
734
762
  background: var(--bg);
735
- box-shadow: var(--neu-in-sm);
763
+ box-shadow: var(--neu-shadow-inset);
736
764
  touch-action: none;
737
765
  z-index: 1;
738
766
  }
@@ -751,7 +779,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
751
779
  width: 22px; height: 22px;
752
780
  border-radius: 999px;
753
781
  background: var(--bg-raised);
754
- box-shadow: var(--neu-out-sm);
782
+ box-shadow: var(--neu-shadow-control);
755
783
  transform: translate(-50%, -50%);
756
784
  transition: all var(--dur-fast) var(--ease);
757
785
  display: grid; place-items: center;
@@ -766,7 +794,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
766
794
  background: var(--slider-thumb-color, var(--accent));
767
795
  }
768
796
  .slider-thumb:focus-visible {
769
- box-shadow: var(--neu-out-sm), 0 0 0 3px var(--accent-glow);
797
+ box-shadow: var(--neu-shadow-control), 0 0 0 3px var(--accent-glow);
770
798
  }
771
799
  .slider:hover .slider-thumb { transform: translate(-50%, -50%) scale(1.08); }
772
800
  .slider-value {
@@ -779,13 +807,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
779
807
  /* Tone variants */
780
808
  .slider.success .slider-thumb { --slider-thumb-color: var(--success); }
781
809
  .slider.success .slider-fill { background: linear-gradient(90deg, color-mix(in oklch, var(--success) 70%, white), var(--success)); box-shadow: 0 0 10px color-mix(in oklch, var(--success) 35%, transparent); }
782
- .slider.success .slider-thumb:focus-visible { box-shadow: var(--neu-out-sm), 0 0 0 3px color-mix(in oklch, var(--success) 35%, transparent); }
810
+ .slider.success .slider-thumb:focus-visible { box-shadow: var(--neu-shadow-control), 0 0 0 3px color-mix(in oklch, var(--success) 35%, transparent); }
783
811
  .slider.warning .slider-thumb { --slider-thumb-color: var(--warning); }
784
812
  .slider.warning .slider-fill { background: linear-gradient(90deg, color-mix(in oklch, var(--warning) 70%, white), var(--warning)); box-shadow: 0 0 10px color-mix(in oklch, var(--warning) 35%, transparent); }
785
- .slider.warning .slider-thumb:focus-visible { box-shadow: var(--neu-out-sm), 0 0 0 3px color-mix(in oklch, var(--warning) 35%, transparent); }
813
+ .slider.warning .slider-thumb:focus-visible { box-shadow: var(--neu-shadow-control), 0 0 0 3px color-mix(in oklch, var(--warning) 35%, transparent); }
786
814
  .slider.danger .slider-thumb { --slider-thumb-color: var(--danger); }
787
815
  .slider.danger .slider-fill { background: linear-gradient(90deg, color-mix(in oklch, var(--danger) 70%, white), var(--danger)); box-shadow: 0 0 10px color-mix(in oklch, var(--danger) 35%, transparent); }
788
- .slider.danger .slider-thumb:focus-visible { box-shadow: var(--neu-out-sm), 0 0 0 3px color-mix(in oklch, var(--danger) 35%, transparent); }
816
+ .slider.danger .slider-thumb:focus-visible { box-shadow: var(--neu-shadow-control), 0 0 0 3px color-mix(in oklch, var(--danger) 35%, transparent); }
789
817
  /* Marks */
790
818
  .slider-marks {
791
819
  position: absolute;
@@ -811,7 +839,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
811
839
  width: 6px; height: 6px;
812
840
  border-radius: 999px;
813
841
  background: var(--bg);
814
- box-shadow: var(--neu-in-sm);
842
+ box-shadow: var(--neu-shadow-inset);
815
843
  position: absolute;
816
844
  top: -12px;
817
845
  left: 50%;
@@ -868,7 +896,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
868
896
  color-mix(in oklch, var(--bg) 88%, var(--shadow-light)),
869
897
  color-mix(in oklch, var(--bg) 92%, var(--shadow-dark))
870
898
  );
871
- box-shadow: var(--neu-in-sm);
899
+ box-shadow: var(--neu-shadow-inset);
872
900
  overflow: hidden;
873
901
  position: relative;
874
902
  }
@@ -917,7 +945,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
917
945
  font-size: 11px;
918
946
  font-weight: 500;
919
947
  background: var(--bg);
920
- box-shadow: var(--neu-flat);
948
+ box-shadow: var(--neu-shadow-subtle);
921
949
  color: var(--fg-muted);
922
950
  }
923
951
  .tag.accent { color: var(--accent-ink); }
@@ -976,7 +1004,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
976
1004
  width: var(--size); height: var(--size);
977
1005
  border-radius: 999px;
978
1006
  background: var(--bg);
979
- box-shadow: var(--neu-out-sm);
1007
+ box-shadow: var(--neu-shadow-control);
980
1008
  display: grid; place-items: center;
981
1009
  overflow: hidden;
982
1010
  color: var(--accent-ink);
@@ -1026,7 +1054,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1026
1054
  .divider.sunken {
1027
1055
  background: transparent;
1028
1056
  height: 2px;
1029
- box-shadow: var(--neu-in-sm);
1057
+ box-shadow: var(--neu-shadow-inset);
1030
1058
  }
1031
1059
  .divider.sunken.vertical {
1032
1060
  width: 2px;
@@ -1034,7 +1062,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1034
1062
  }
1035
1063
  .divider.sunken:has(.divider-label) { background: transparent; box-shadow: none; }
1036
1064
  .divider.sunken:has(.divider-label)::before,
1037
- .divider.sunken:has(.divider-label)::after { height: 2px; background: transparent; box-shadow: var(--neu-in-sm); }
1065
+ .divider.sunken:has(.divider-label)::after { height: 2px; background: transparent; box-shadow: var(--neu-shadow-inset); }
1038
1066
  /* ---- Dashed variant ---- */
1039
1067
  .divider.dashed {
1040
1068
  background: transparent;
@@ -1090,11 +1118,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
1090
1118
  .card {
1091
1119
  background: var(--bg);
1092
1120
  border-radius: var(--r-lg);
1093
- box-shadow: var(--neu-out);
1121
+ box-shadow: var(--neu-shadow-panel);
1094
1122
  padding: var(--gap-5);
1095
1123
  }
1096
- .card.flat { box-shadow: var(--neu-flat); }
1097
- .card.sunken { box-shadow: var(--neu-in); }
1124
+ .card.flat { box-shadow: var(--neu-shadow-subtle); }
1125
+ .card.sunken { box-shadow: var(--neu-shadow-inset-strong); }
1098
1126
  .card.pad-none { padding: 0; }
1099
1127
  .card.pad-sm { padding: var(--gap-3); }
1100
1128
  .card.pad-lg { padding: var(--gap-6); }
@@ -1104,10 +1132,10 @@ input, textarea, select { font-family: inherit; color: inherit; }
1104
1132
  }
1105
1133
  .card.hoverable:hover {
1106
1134
  transform: translateY(-3px);
1107
- box-shadow: var(--neu-out-lg);
1135
+ box-shadow: var(--neu-shadow-lift);
1108
1136
  }
1109
- .card.hoverable.flat:hover { box-shadow: var(--neu-out-sm); }
1110
- .card.hoverable.sunken:hover { box-shadow: var(--neu-out); }
1137
+ .card.hoverable.flat:hover { box-shadow: var(--neu-shadow-control); }
1138
+ .card.hoverable.sunken:hover { box-shadow: var(--neu-shadow-panel); }
1111
1139
  .card-head {
1112
1140
  display: flex; align-items: flex-start; justify-content: space-between;
1113
1141
  gap: var(--gap-3); margin-bottom: var(--gap-4);
@@ -1117,6 +1145,42 @@ input, textarea, select { font-family: inherit; color: inherit; }
1117
1145
  .card-desc { font-size: 12px; color: var(--fg-muted); }
1118
1146
  .card-actions { display: flex; gap: 6px; }
1119
1147
  .card-body { font-size: 13px; }
1148
+ /* ============ Surface ============ */
1149
+ .surface {
1150
+ position: relative;
1151
+ box-sizing: border-box;
1152
+ min-width: 0;
1153
+ color: var(--fg);
1154
+ background: var(--bg);
1155
+ border-radius: var(--r-lg);
1156
+ }
1157
+ .surface.tone-raised { background: var(--bg-raised); }
1158
+ .surface.tone-sunken { background: var(--bg-sunken); }
1159
+ .surface.tone-accent {
1160
+ color: var(--accent-ink);
1161
+ background: var(--accent-soft);
1162
+ }
1163
+ .surface.plain { box-shadow: none; }
1164
+ .surface.raised { box-shadow: var(--neu-shadow-panel); }
1165
+ .surface.sunken { box-shadow: var(--neu-shadow-inset-strong); }
1166
+ .surface.floating { box-shadow: var(--neu-shadow-float); }
1167
+ .surface.bordered { border: 1px solid var(--border); }
1168
+ .surface.pad-none { padding: 0; }
1169
+ .surface.pad-sm { padding: var(--gap-3); }
1170
+ .surface.pad-md { padding: var(--gap-5); }
1171
+ .surface.pad-lg { padding: var(--gap-8); }
1172
+ .surface.pad-xl { padding: var(--gap-10); }
1173
+ .surface.radius-none { border-radius: 0; }
1174
+ .surface.radius-sm { border-radius: var(--r-sm); }
1175
+ .surface.radius-md { border-radius: var(--r-md); }
1176
+ .surface.radius-lg { border-radius: var(--r-lg); }
1177
+ .surface.radius-xl { border-radius: var(--r-xl); }
1178
+ .surface.height-content { min-height: 0; }
1179
+ .surface.height-fill { min-height: 100%; }
1180
+ .surface.height-screen { min-height: 100vh; }
1181
+ .surface.scrollable { overflow: auto; }
1182
+ .surface > *:first-child { margin-top: 0; }
1183
+ .surface > *:last-child { margin-bottom: 0; }
1120
1184
  /* ============ Tabs ============ */
1121
1185
  .tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
1122
1186
  .tabs-nav {
@@ -1124,7 +1188,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1124
1188
  padding: 5px;
1125
1189
  border-radius: var(--r-md);
1126
1190
  background: var(--bg);
1127
- box-shadow: var(--neu-in-sm);
1191
+ box-shadow: var(--neu-shadow-inset);
1128
1192
  gap: 2px;
1129
1193
  align-self: flex-start;
1130
1194
  }
@@ -1147,7 +1211,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1147
1211
  .tabs-nav .tab.active {
1148
1212
  color: var(--accent-ink);
1149
1213
  background: var(--bg);
1150
- box-shadow: var(--neu-out-sm);
1214
+ box-shadow: var(--neu-shadow-control);
1151
1215
  font-weight: 600;
1152
1216
  }
1153
1217
  .tabs-nav .tab[disabled] { opacity: 0.4; cursor: not-allowed; }
@@ -1187,7 +1251,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1187
1251
  .collapse-item {
1188
1252
  background: var(--bg);
1189
1253
  border-radius: var(--r-md);
1190
- box-shadow: var(--neu-out-sm);
1254
+ box-shadow: var(--neu-shadow-control);
1191
1255
  overflow: hidden;
1192
1256
  }
1193
1257
  .collapse.ghost .collapse-item {
@@ -1233,7 +1297,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1233
1297
  padding: 2px;
1234
1298
  }
1235
1299
  .collapse-chev.clickable { cursor: pointer; }
1236
- .collapse-chev.clickable:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1300
+ .collapse-chev.clickable:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
1237
1301
  .collapse-item.open .collapse-chev { transform: rotate(180deg); color: var(--accent); }
1238
1302
  /* ============ Select ============ */
1239
1303
  .select {
@@ -1251,11 +1315,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
1251
1315
  border: none;
1252
1316
  border-radius: var(--r-md);
1253
1317
  background: var(--bg);
1254
- box-shadow: var(--neu-out-sm);
1318
+ box-shadow: var(--neu-shadow-control);
1255
1319
  display: inline-flex;
1256
1320
  align-items: center;
1257
1321
  gap: 8px;
1258
- font-size: 13px;
1322
+ font-size: var(--fs-md);
1259
1323
  font-family: inherit;
1260
1324
  color: var(--fg);
1261
1325
  cursor: pointer;
@@ -1301,15 +1365,15 @@ input, textarea, select { font-family: inherit; color: inherit; }
1301
1365
  height: 18px;
1302
1366
  }
1303
1367
  .select.invalid .select-trigger {
1304
- box-shadow: var(--neu-out-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
1368
+ box-shadow: var(--neu-shadow-control), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
1305
1369
  }
1306
1370
  .select.invalid.open .select-trigger {
1307
- box-shadow: var(--neu-in-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
1371
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
1308
1372
  }
1309
- .select.sm .select-trigger { height: 30px; padding: 0 32px 0 12px; font-size: 12px; border-radius: var(--r-sm); }
1310
- .select.lg .select-trigger { height: 48px; padding: 0 36px 0 18px; font-size: 14px; border-radius: var(--r-lg); }
1373
+ .select.sm .select-trigger { height: var(--ctrl-h-sm); padding: 0 32px 0 var(--ctrl-pad-x-sm); font-size: var(--fs-sm); border-radius: var(--r-sm); }
1374
+ .select.lg .select-trigger { height: var(--field-h-lg); padding: 0 36px 0 var(--ctrl-pad-x); font-size: var(--fs-lg); border-radius: var(--r-lg); }
1311
1375
  .select-trigger:hover { color: var(--accent-ink); }
1312
- .select.open .select-trigger { box-shadow: var(--neu-in-sm); color: var(--accent-ink); }
1376
+ .select.open .select-trigger { box-shadow: var(--neu-shadow-inset); color: var(--accent-ink); }
1313
1377
  .select-trigger .placeholder { color: var(--fg-subtle); }
1314
1378
  .select-caret {
1315
1379
  position: absolute;
@@ -1357,7 +1421,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1357
1421
  height: 20px;
1358
1422
  border-radius: 999px;
1359
1423
  background: var(--bg);
1360
- box-shadow: var(--neu-out-sm);
1424
+ box-shadow: var(--neu-shadow-control);
1361
1425
  display: inline-grid;
1362
1426
  place-items: center;
1363
1427
  cursor: pointer;
@@ -1367,14 +1431,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
1367
1431
  z-index: 1;
1368
1432
  }
1369
1433
  .select:hover .select-clear { opacity: 1; }
1370
- .select-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
1434
+ .select-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-shadow-inset); }
1371
1435
  /* Multi-select menu: leading checkbox per item */
1372
1436
  .menu-check {
1373
1437
  width: 16px;
1374
1438
  height: 16px;
1375
1439
  border-radius: 5px;
1376
1440
  background: var(--bg);
1377
- box-shadow: var(--neu-in-sm);
1441
+ box-shadow: var(--neu-shadow-inset);
1378
1442
  display: inline-grid;
1379
1443
  place-items: center;
1380
1444
  flex-shrink: 0;
@@ -1383,7 +1447,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1383
1447
  }
1384
1448
  .menu-check.on {
1385
1449
  background: var(--accent);
1386
- box-shadow: var(--neu-out-sm), 0 1px 4px var(--accent-glow);
1450
+ box-shadow: var(--neu-shadow-control), 0 1px 4px var(--accent-glow);
1387
1451
  }
1388
1452
  /* Menu search — flush with menu, single subtle separator (no nested frame) */
1389
1453
  .menu-search {
@@ -1401,7 +1465,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1401
1465
  justify-content: center;
1402
1466
  gap: 10px;
1403
1467
  padding: 26px 12px;
1404
- font-size: 12px;
1468
+ font-size: var(--fs-sm);
1405
1469
  color: var(--fg-muted);
1406
1470
  }
1407
1471
  .menu-state .menu-state-ico {
@@ -1409,7 +1473,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1409
1473
  height: 40px;
1410
1474
  border-radius: var(--r-md);
1411
1475
  background: var(--bg);
1412
- box-shadow: var(--neu-in-sm);
1476
+ box-shadow: var(--neu-shadow-inset);
1413
1477
  display: grid;
1414
1478
  place-items: center;
1415
1479
  color: var(--fg-subtle);
@@ -1439,7 +1503,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1439
1503
  text-overflow: ellipsis;
1440
1504
  }
1441
1505
  .menu-item-desc {
1442
- font-size: 11px;
1506
+ font-size: var(--fs-xs);
1443
1507
  color: var(--fg-subtle);
1444
1508
  white-space: nowrap;
1445
1509
  overflow: hidden;
@@ -1449,7 +1513,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1449
1513
  /* Keyboard / hover highlight — soft raised pill */
1450
1514
  .menu-item.highlight:not([disabled]) {
1451
1515
  background: var(--bg);
1452
- box-shadow: var(--neu-out-sm);
1516
+ box-shadow: var(--neu-shadow-control);
1453
1517
  color: var(--accent-ink);
1454
1518
  }
1455
1519
  .menu-item[disabled] {
@@ -1459,7 +1523,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1459
1523
  .menu {
1460
1524
  background: var(--bg);
1461
1525
  border-radius: var(--r-md);
1462
- box-shadow: var(--neu-float);
1526
+ box-shadow: var(--neu-shadow-float);
1463
1527
  padding: 6px;
1464
1528
  min-width: 180px;
1465
1529
  z-index: 1000;
@@ -1470,7 +1534,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1470
1534
  .menu-item {
1471
1535
  padding: 9px 12px;
1472
1536
  border-radius: var(--r-sm);
1473
- font-size: 13px;
1537
+ font-size: var(--fs-md);
1474
1538
  cursor: pointer;
1475
1539
  color: var(--fg);
1476
1540
  display: flex;
@@ -1483,7 +1547,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1483
1547
  width: 100%;
1484
1548
  text-align: left;
1485
1549
  }
1486
- .menu-item:hover { background: var(--bg); box-shadow: var(--neu-flat); color: var(--accent-ink); }
1550
+ .menu-item:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); color: var(--accent-ink); }
1487
1551
  .menu-item.active { color: var(--accent-ink); font-weight: 500; }
1488
1552
  .menu-item .tick { margin-left: auto; color: var(--accent); opacity: 0; }
1489
1553
  .menu-item.active .tick { opacity: 1; }
@@ -1514,7 +1578,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1514
1578
  .modal {
1515
1579
  background: var(--bg);
1516
1580
  border-radius: var(--r-xl);
1517
- box-shadow: var(--neu-float);
1581
+ box-shadow: var(--neu-shadow-float);
1518
1582
  padding: var(--gap-6);
1519
1583
  width: min(480px, 92vw);
1520
1584
  animation: modalIn var(--dur-slow) var(--ease);
@@ -1567,7 +1631,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1567
1631
  .modal-close:hover {
1568
1632
  color: var(--fg);
1569
1633
  background: var(--bg);
1570
- box-shadow: var(--neu-flat);
1634
+ box-shadow: var(--neu-shadow-subtle);
1571
1635
  }
1572
1636
  .modal-static-body {
1573
1637
  display: flex;
@@ -1582,7 +1646,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1582
1646
  place-items: center;
1583
1647
  flex-shrink: 0;
1584
1648
  background: var(--bg);
1585
- box-shadow: var(--neu-in-sm);
1649
+ box-shadow: var(--neu-shadow-inset);
1586
1650
  color: var(--accent);
1587
1651
  }
1588
1652
  .modal-static-icon.success { color: var(--success); }
@@ -1612,6 +1676,9 @@ input, textarea, select { font-family: inherit; color: inherit; }
1612
1676
  overflow-y: auto;
1613
1677
  display: flex;
1614
1678
  flex-direction: column;
1679
+ --drawer-shadow-offset: calc(var(--shadow-offset) * 4 * var(--shadow-float-scale));
1680
+ --drawer-shadow-blur: calc(var(--shadow-blur) * 3.75 * var(--shadow-float-scale));
1681
+ --drawer-shadow-spread: calc(var(--shadow-offset) * -3.3 * var(--shadow-float-scale));
1615
1682
  }
1616
1683
  .drawer.hidden {
1617
1684
  display: none;
@@ -1620,25 +1687,25 @@ input, textarea, select { font-family: inherit; color: inherit; }
1620
1687
  top: 0; right: 0; bottom: 0;
1621
1688
  width: min(420px, 92vw);
1622
1689
  animation: drawerInRight var(--dur-slow) var(--ease);
1623
- box-shadow: -24px 0 60px -20px rgba(40, 55, 80, 0.25);
1690
+ box-shadow: calc(var(--drawer-shadow-offset) * -1) 0 var(--drawer-shadow-blur) var(--drawer-shadow-spread) var(--shadow-dark);
1624
1691
  }
1625
1692
  .drawer.left {
1626
1693
  top: 0; left: 0; bottom: 0;
1627
1694
  width: min(420px, 92vw);
1628
1695
  animation: drawerInLeft var(--dur-slow) var(--ease);
1629
- box-shadow: 24px 0 60px -20px rgba(40, 55, 80, 0.25);
1696
+ box-shadow: var(--drawer-shadow-offset) 0 var(--drawer-shadow-blur) var(--drawer-shadow-spread) var(--shadow-dark);
1630
1697
  }
1631
1698
  .drawer.top {
1632
1699
  top: 0; left: 0; right: 0;
1633
1700
  height: min(320px, 80vh);
1634
1701
  animation: drawerInTop var(--dur-slow) var(--ease);
1635
- box-shadow: 0 24px 60px -20px rgba(40, 55, 80, 0.25);
1702
+ box-shadow: 0 var(--drawer-shadow-offset) var(--drawer-shadow-blur) var(--drawer-shadow-spread) var(--shadow-dark);
1636
1703
  }
1637
1704
  .drawer.bottom {
1638
1705
  bottom: 0; left: 0; right: 0;
1639
1706
  height: min(320px, 80vh);
1640
1707
  animation: drawerInBottom var(--dur-slow) var(--ease);
1641
- box-shadow: 0 -24px 60px -20px rgba(40, 55, 80, 0.25);
1708
+ box-shadow: 0 calc(var(--drawer-shadow-offset) * -1) var(--drawer-shadow-blur) var(--drawer-shadow-spread) var(--shadow-dark);
1642
1709
  }
1643
1710
  @keyframes drawerInRight { from { transform: translateX( 20px); opacity: 0; } }
1644
1711
  @keyframes drawerInLeft { from { transform: translateX(-20px); opacity: 0; } }
@@ -1676,7 +1743,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1676
1743
  .drawer-close:hover {
1677
1744
  color: var(--fg);
1678
1745
  background: var(--bg);
1679
- box-shadow: var(--neu-flat);
1746
+ box-shadow: var(--neu-shadow-subtle);
1680
1747
  }
1681
1748
  .drawer-body {
1682
1749
  flex: 1;
@@ -1703,7 +1770,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1703
1770
  font-size: 11px;
1704
1771
  font-weight: 500;
1705
1772
  white-space: nowrap;
1706
- box-shadow: var(--neu-out-sm);
1773
+ box-shadow: var(--neu-shadow-control);
1707
1774
  pointer-events: none;
1708
1775
  animation: fadeIn var(--dur) var(--ease);
1709
1776
  z-index: 1000;
@@ -1725,7 +1792,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1725
1792
  .message {
1726
1793
  background: var(--bg);
1727
1794
  border-radius: var(--r-md);
1728
- box-shadow: var(--neu-float);
1795
+ box-shadow: var(--neu-shadow-float);
1729
1796
  padding: 12px 16px;
1730
1797
  min-width: 240px;
1731
1798
  display: flex; align-items: center; gap: 10px;
@@ -1759,7 +1826,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1759
1826
  background: var(--bg);
1760
1827
  border-radius: var(--r-md);
1761
1828
  min-width: 220px;
1762
- box-shadow: var(--neu-float);
1829
+ box-shadow: var(--neu-shadow-float);
1763
1830
  position: relative;
1764
1831
  }
1765
1832
  /*
@@ -1852,7 +1919,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1852
1919
  padding: 14px 16px;
1853
1920
  border-radius: var(--r-md);
1854
1921
  background: var(--bg);
1855
- box-shadow: var(--neu-in-sm);
1922
+ box-shadow: var(--neu-shadow-inset);
1856
1923
  position: relative;
1857
1924
  }
1858
1925
  .alert-ico {
@@ -1894,12 +1961,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1894
1961
  cursor: pointer;
1895
1962
  border: none; background: transparent;
1896
1963
  }
1897
- .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1964
+ .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
1898
1965
  /* ============ Table ============ */
1899
1966
  .table-wrap {
1900
1967
  border-radius: var(--r-lg);
1901
1968
  background: var(--bg);
1902
- box-shadow: var(--neu-in-sm);
1969
+ box-shadow: var(--neu-shadow-inset);
1903
1970
  overflow: auto;
1904
1971
  }
1905
1972
  /* When scroll=y is on, the wrap itself becomes the scroll region. */
@@ -1936,13 +2003,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
1936
2003
  width: 16px; height: 16px;
1937
2004
  border-radius: 6px;
1938
2005
  background: var(--bg);
1939
- box-shadow: var(--neu-flat);
2006
+ box-shadow: var(--neu-shadow-subtle);
1940
2007
  align-items: center; justify-content: center;
1941
2008
  margin-left: 6px;
1942
2009
  color: var(--fg-subtle);
1943
2010
  vertical-align: middle;
1944
2011
  }
1945
- .table th.sorted .sort-ind { color: var(--accent); box-shadow: var(--neu-in-sm); }
2012
+ .table th.sorted .sort-ind { color: var(--accent); box-shadow: var(--neu-shadow-inset); }
1946
2013
  .table td {
1947
2014
  padding: 12px 18px;
1948
2015
  border-bottom: 1px solid var(--divider);
@@ -2001,14 +2068,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
2001
2068
  border: none;
2002
2069
  border-radius: var(--r-sm);
2003
2070
  background: var(--bg);
2004
- box-shadow: var(--neu-flat);
2071
+ box-shadow: var(--neu-shadow-subtle);
2005
2072
  color: var(--fg-subtle);
2006
2073
  display: inline-flex; align-items: center; justify-content: center;
2007
2074
  cursor: pointer;
2008
2075
  transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
2009
2076
  }
2010
- .expand-btn:hover { color: var(--accent-ink); box-shadow: var(--neu-out-sm); }
2011
- .expand-btn.open { transform: rotate(90deg); color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
2077
+ .expand-btn:hover { color: var(--accent-ink); box-shadow: var(--neu-shadow-control); }
2078
+ .expand-btn.open { transform: rotate(90deg); color: var(--accent-ink); box-shadow: var(--neu-shadow-inset); }
2012
2079
  /* Expanded row panel */
2013
2080
  .table tbody tr.expanded-row td {
2014
2081
  padding: 14px 18px;
@@ -2019,7 +2086,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2019
2086
  padding: 14px 16px;
2020
2087
  border-radius: var(--r-md);
2021
2088
  background: var(--bg);
2022
- box-shadow: var(--neu-in-sm);
2089
+ box-shadow: var(--neu-shadow-inset);
2023
2090
  color: var(--fg);
2024
2091
  font-size: 13px;
2025
2092
  }
@@ -2030,14 +2097,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
2030
2097
  border: none;
2031
2098
  padding: 0;
2032
2099
  background: var(--bg);
2033
- box-shadow: var(--neu-in-sm);
2100
+ box-shadow: var(--neu-shadow-inset);
2034
2101
  display: inline-flex; align-items: center; justify-content: center;
2035
2102
  cursor: pointer;
2036
2103
  transition: box-shadow var(--dur-fast) var(--ease);
2037
2104
  }
2038
2105
  .table .row-check .radio-dot:disabled { opacity: 0.5; cursor: not-allowed; }
2039
2106
  .table .row-check .radio-dot.checked {
2040
- box-shadow: var(--neu-out-sm);
2107
+ box-shadow: var(--neu-shadow-control);
2041
2108
  }
2042
2109
  .table .row-check .radio-dot.checked::after {
2043
2110
  content: "";
@@ -2051,7 +2118,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2051
2118
  width: 18px; height: 18px;
2052
2119
  border-radius: 5px;
2053
2120
  background: var(--bg);
2054
- box-shadow: var(--neu-flat);
2121
+ box-shadow: var(--neu-shadow-subtle);
2055
2122
  color: var(--fg-subtle);
2056
2123
  align-items: center; justify-content: center;
2057
2124
  margin-left: 6px;
@@ -2064,7 +2131,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2064
2131
  .table th.filterable .filter-ind:hover { color: var(--fg); }
2065
2132
  .table th.filterable .filter-ind.active {
2066
2133
  color: var(--accent-ink);
2067
- box-shadow: var(--neu-in-sm);
2134
+ box-shadow: var(--neu-shadow-inset);
2068
2135
  }
2069
2136
  /* Filter popover panel (portaled to body) */
2070
2137
  .table-filter-panel {
@@ -2073,7 +2140,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2073
2140
  max-width: 260px;
2074
2141
  background: var(--bg);
2075
2142
  border-radius: var(--r-md);
2076
- box-shadow: var(--neu-float);
2143
+ box-shadow: var(--neu-shadow-float);
2077
2144
  padding: 10px;
2078
2145
  animation: menuIn var(--dur) var(--ease);
2079
2146
  }
@@ -2112,17 +2179,17 @@ input, textarea, select { font-family: inherit; color: inherit; }
2112
2179
  padding: 6px 12px;
2113
2180
  border-radius: var(--r-sm);
2114
2181
  background: var(--bg);
2115
- box-shadow: var(--neu-out-sm);
2182
+ box-shadow: var(--neu-shadow-control);
2116
2183
  font-size: 12px;
2117
2184
  font-family: inherit;
2118
2185
  color: var(--fg);
2119
2186
  cursor: pointer;
2120
2187
  transition: box-shadow var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
2121
2188
  }
2122
- .table-filter-actions .tf-btn:hover { box-shadow: var(--neu-in-sm); }
2189
+ .table-filter-actions .tf-btn:hover { box-shadow: var(--neu-shadow-inset); }
2123
2190
  .table-filter-actions .tf-btn.primary { color: var(--accent-ink); font-weight: 600; }
2124
- .table-filter-actions .tf-btn.ghost { color: var(--fg-muted); box-shadow: var(--neu-flat); }
2125
- .table-filter-actions .tf-btn.ghost:hover { box-shadow: var(--neu-in-sm); }
2191
+ .table-filter-actions .tf-btn.ghost { color: var(--fg-muted); box-shadow: var(--neu-shadow-subtle); }
2192
+ .table-filter-actions .tf-btn.ghost:hover { box-shadow: var(--neu-shadow-inset); }
2126
2193
  /* Built-in pagination bar */
2127
2194
  .table-pagination {
2128
2195
  margin-top: 12px;
@@ -2131,7 +2198,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2131
2198
  .table-card {
2132
2199
  border-radius: var(--r-lg);
2133
2200
  background: var(--bg);
2134
- box-shadow: var(--neu-out-sm);
2201
+ box-shadow: var(--neu-shadow-control);
2135
2202
  overflow: hidden;
2136
2203
  }
2137
2204
  .table-card .table-wrap { background: transparent; box-shadow: none; border-radius: 0; }
@@ -2190,7 +2257,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2190
2257
  border: none;
2191
2258
  border-radius: var(--r-sm);
2192
2259
  background: var(--bg);
2193
- box-shadow: var(--neu-out-sm);
2260
+ box-shadow: var(--neu-shadow-control);
2194
2261
  display: inline-flex; align-items: center; justify-content: center;
2195
2262
  cursor: pointer;
2196
2263
  font-size: 12px;
@@ -2201,11 +2268,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
2201
2268
  }
2202
2269
  .pagination .pg:hover { color: var(--accent-ink); }
2203
2270
  .pagination .pg.active {
2204
- box-shadow: var(--neu-in-sm);
2271
+ box-shadow: var(--neu-shadow-inset);
2205
2272
  color: var(--accent-ink);
2206
2273
  font-weight: 700;
2207
2274
  }
2208
- .pagination .pg.disabled { color: var(--fg-subtle); cursor: not-allowed; box-shadow: var(--neu-flat); }
2275
+ .pagination .pg.disabled { color: var(--fg-subtle); cursor: not-allowed; box-shadow: var(--neu-shadow-subtle); }
2209
2276
  .pagination .ellipsis { padding: 0 4px; color: var(--fg-subtle); }
2210
2277
  /* size changer — compact Select inline with the page buttons */
2211
2278
  .pagination .pg-size-changer { margin-left: 8px; min-width: 108px; }
@@ -2226,7 +2293,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2226
2293
  border: none;
2227
2294
  border-radius: var(--r-sm);
2228
2295
  background: var(--bg);
2229
- box-shadow: var(--neu-in-sm);
2296
+ box-shadow: var(--neu-shadow-inset);
2230
2297
  color: var(--fg);
2231
2298
  font-family: inherit;
2232
2299
  font-size: 12px;
@@ -2236,7 +2303,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2236
2303
  transition: box-shadow var(--dur-fast) var(--ease);
2237
2304
  }
2238
2305
  .pagination .pg-jumper-input:focus-visible {
2239
- box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-glow);
2306
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow);
2240
2307
  }
2241
2308
  /* ============ List ============ */
2242
2309
  .list {
@@ -2244,7 +2311,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2244
2311
  flex-direction: column;
2245
2312
  background: var(--bg);
2246
2313
  border-radius: var(--r-lg);
2247
- box-shadow: var(--neu-in-sm);
2314
+ box-shadow: var(--neu-shadow-inset);
2248
2315
  padding: 8px;
2249
2316
  }
2250
2317
  .list-item {
@@ -2256,8 +2323,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
2256
2323
  transition: all var(--dur-fast) var(--ease);
2257
2324
  }
2258
2325
  .list-item.clickable { cursor: pointer; }
2259
- .list-item.clickable:hover { background: var(--bg); box-shadow: var(--neu-flat); }
2260
- .list-item.selected { box-shadow: var(--neu-out-sm); background: var(--bg); }
2326
+ .list-item.clickable:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2327
+ .list-item.selected { box-shadow: var(--neu-shadow-control); background: var(--bg); }
2261
2328
  .list.with-dividers .list-item + .list-item { border-top: 1px solid var(--divider); border-radius: 0; }
2262
2329
  .list-item-meta { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2263
2330
  .list-item-title { font-size: 13px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@@ -2284,7 +2351,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2284
2351
  border: none;
2285
2352
  border-radius: 50%;
2286
2353
  background: var(--bg);
2287
- box-shadow: var(--neu-in-sm);
2354
+ box-shadow: var(--neu-shadow-inset);
2288
2355
  animation: none;
2289
2356
  }
2290
2357
  .spin.ring::before {
@@ -2369,7 +2436,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2369
2436
  width: 56px; height: 56px;
2370
2437
  border-radius: var(--r-lg);
2371
2438
  background: var(--bg);
2372
- box-shadow: var(--neu-in-sm);
2439
+ box-shadow: var(--neu-shadow-inset);
2373
2440
  display: grid; place-items: center;
2374
2441
  color: var(--fg-subtle);
2375
2442
  }
@@ -2420,7 +2487,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2420
2487
  background: var(--bg);
2421
2488
  border-radius: var(--r-lg);
2422
2489
  padding: var(--gap-4);
2423
- box-shadow: var(--neu-out);
2490
+ box-shadow: var(--neu-shadow-panel);
2424
2491
  width: 320px;
2425
2492
  }
2426
2493
  .calendar-head {
@@ -2435,7 +2502,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2435
2502
  font-family: inherit;
2436
2503
  transition: all var(--dur-fast) var(--ease);
2437
2504
  }
2438
- .calendar-title:hover { background: var(--bg); box-shadow: var(--neu-flat); }
2505
+ .calendar-title:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2439
2506
  .calendar-grid {
2440
2507
  display: grid;
2441
2508
  grid-template-columns: repeat(7, 1fr);
@@ -2464,7 +2531,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2464
2531
  transition: all var(--dur-fast) var(--ease);
2465
2532
  }
2466
2533
  .calendar-cell.out { color: var(--fg-subtle); opacity: 0.5; }
2467
- .calendar-cell:hover { background: var(--bg); box-shadow: var(--neu-flat); }
2534
+ .calendar-cell:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2468
2535
  .calendar-cell.today { font-weight: 700; color: var(--accent-ink); }
2469
2536
  .calendar-cell.today::after {
2470
2537
  content: ""; position: absolute; bottom: 4px; left: 50%;
@@ -2474,7 +2541,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2474
2541
  }
2475
2542
  .calendar-cell.selected {
2476
2543
  background: var(--bg);
2477
- box-shadow: var(--neu-in-sm);
2544
+ box-shadow: var(--neu-shadow-inset);
2478
2545
  color: var(--accent-ink);
2479
2546
  font-weight: 600;
2480
2547
  }
@@ -2487,7 +2554,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2487
2554
  border-radius: var(--r-md);
2488
2555
  background: var(--bg);
2489
2556
  padding: 6px;
2490
- box-shadow: var(--neu-out-sm);
2557
+ box-shadow: var(--neu-shadow-control);
2491
2558
  overflow: hidden;
2492
2559
  line-height: 0;
2493
2560
  }
@@ -2507,7 +2574,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2507
2574
  position: relative;
2508
2575
  overflow: hidden;
2509
2576
  border-radius: calc(var(--r-md) - 4px);
2510
- box-shadow: var(--neu-in-sm);
2577
+ box-shadow: var(--neu-shadow-inset);
2511
2578
  background: var(--bg-sunken);
2512
2579
  }
2513
2580
  .n-image.raw .n-image-frame {
@@ -2606,7 +2673,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2606
2673
  max-width: 80vw;
2607
2674
  max-height: 80vh;
2608
2675
  border-radius: var(--r-lg);
2609
- box-shadow: var(--neu-float);
2676
+ box-shadow: var(--neu-shadow-float);
2610
2677
  }
2611
2678
  /* ============ SpriteImage / LayeredImage ============ */
2612
2679
  .n-sprite-image,
@@ -2616,7 +2683,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2616
2683
  border-radius: var(--r-sm);
2617
2684
  background: var(--bg);
2618
2685
  padding: 6px;
2619
- box-shadow: var(--neu-out-sm);
2686
+ box-shadow: var(--neu-shadow-control);
2620
2687
  overflow: hidden;
2621
2688
  line-height: 0;
2622
2689
  }
@@ -2638,7 +2705,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2638
2705
  overflow: hidden;
2639
2706
  border-radius: var(--r-sm);
2640
2707
  background: var(--bg-sunken);
2641
- box-shadow: var(--neu-in-sm);
2708
+ box-shadow: var(--neu-shadow-inset);
2642
2709
  }
2643
2710
  .n-sprite-image.raw .n-sprite-image-frame,
2644
2711
  .n-layered-image.raw .n-layered-image-frame {
@@ -2676,7 +2743,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2676
2743
  padding: 0 36px 0 var(--ctrl-pad-x);
2677
2744
  border-radius: var(--r-md);
2678
2745
  background: var(--bg);
2679
- box-shadow: var(--neu-out-sm);
2746
+ box-shadow: var(--neu-shadow-control);
2680
2747
  display: inline-flex;
2681
2748
  align-items: center;
2682
2749
  font-size: 13px;
@@ -2688,7 +2755,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2688
2755
  text-align: left;
2689
2756
  }
2690
2757
  .cascader-trigger.placeholder { color: var(--fg-subtle); }
2691
- .cascader.open .cascader-trigger { box-shadow: var(--neu-in-sm); color: var(--accent-ink); }
2758
+ .cascader.open .cascader-trigger { box-shadow: var(--neu-shadow-inset); color: var(--accent-ink); }
2692
2759
  .cascader-clear {
2693
2760
  position: absolute;
2694
2761
  right: 30px;
@@ -2698,7 +2765,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2698
2765
  height: 20px;
2699
2766
  border-radius: 999px;
2700
2767
  background: var(--bg);
2701
- box-shadow: var(--neu-out-sm);
2768
+ box-shadow: var(--neu-shadow-control);
2702
2769
  display: inline-grid;
2703
2770
  place-items: center;
2704
2771
  color: var(--fg-subtle);
@@ -2706,13 +2773,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
2706
2773
  transition: all var(--dur-fast) var(--ease);
2707
2774
  }
2708
2775
  .cascader:hover .cascader-clear { opacity: 1; }
2709
- .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
2776
+ .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-shadow-inset); }
2710
2777
  .cascader-panel {
2711
2778
  z-index: 1000;
2712
2779
  display: flex;
2713
2780
  background: var(--bg);
2714
2781
  border-radius: var(--r-md);
2715
- box-shadow: var(--neu-float);
2782
+ box-shadow: var(--neu-shadow-float);
2716
2783
  padding: 6px;
2717
2784
  animation: menuIn var(--dur) var(--ease);
2718
2785
  gap: 4px;
@@ -2753,7 +2820,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2753
2820
  }
2754
2821
  .cascader-search-item:hover {
2755
2822
  background: var(--bg);
2756
- box-shadow: var(--neu-flat);
2823
+ box-shadow: var(--neu-shadow-subtle);
2757
2824
  color: var(--accent-ink);
2758
2825
  }
2759
2826
  .cascader-path-sep { color: var(--fg-subtle); }
@@ -2804,10 +2871,10 @@ input, textarea, select { font-family: inherit; color: inherit; }
2804
2871
  height: 15px;
2805
2872
  object-fit: contain;
2806
2873
  }
2807
- .cascader-item:hover { background: var(--bg); box-shadow: var(--neu-flat); color: var(--accent-ink); }
2874
+ .cascader-item:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); color: var(--accent-ink); }
2808
2875
  .cascader-item.active {
2809
2876
  background: var(--bg);
2810
- box-shadow: var(--neu-in-sm);
2877
+ box-shadow: var(--neu-shadow-inset);
2811
2878
  color: var(--accent-ink);
2812
2879
  font-weight: 500;
2813
2880
  }
@@ -2857,7 +2924,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2857
2924
  padding: 1px 6px;
2858
2925
  border-radius: 5px;
2859
2926
  background: var(--bg-sunken);
2860
- box-shadow: var(--neu-in-sm);
2927
+ box-shadow: var(--neu-shadow-inset);
2861
2928
  color: var(--accent-ink);
2862
2929
  margin: 0 2px;
2863
2930
  }
@@ -2867,7 +2934,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2867
2934
  padding: 1px 7px;
2868
2935
  border-radius: 5px;
2869
2936
  background: var(--bg-raised);
2870
- box-shadow: var(--neu-flat);
2937
+ box-shadow: var(--neu-shadow-subtle);
2871
2938
  border: 1px solid var(--border);
2872
2939
  color: var(--fg);
2873
2940
  margin: 0 2px;
@@ -2948,7 +3015,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2948
3015
  .typo-action:hover {
2949
3016
  color: var(--accent-ink);
2950
3017
  background: var(--bg);
2951
- box-shadow: var(--neu-flat);
3018
+ box-shadow: var(--neu-shadow-subtle);
2952
3019
  }
2953
3020
  .typo-action:focus-visible {
2954
3021
  outline: 2px solid var(--accent-glow);
@@ -2970,7 +3037,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2970
3037
  font: inherit;
2971
3038
  color: inherit;
2972
3039
  background: var(--bg-sunken);
2973
- box-shadow: var(--neu-in);
3040
+ box-shadow: var(--neu-shadow-inset-strong);
2974
3041
  border: none;
2975
3042
  outline: none;
2976
3043
  width: 100%;
@@ -2985,7 +3052,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2985
3052
  font-family: inherit;
2986
3053
  }
2987
3054
  .typo-editor:focus {
2988
- box-shadow: var(--neu-in), 0 0 0 3px var(--accent-glow);
3055
+ box-shadow: var(--neu-shadow-inset-strong), 0 0 0 3px var(--accent-glow);
2989
3056
  }
2990
3057
  /* ---- Ellipsis ---- */
2991
3058
  .typo.ellipsis {
@@ -3044,7 +3111,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3044
3111
  padding: 4px;
3045
3112
  border: none;
3046
3113
  background: var(--bg);
3047
- box-shadow: var(--neu-flat);
3114
+ box-shadow: var(--neu-shadow-subtle);
3048
3115
  border-radius: 10px;
3049
3116
  cursor: pointer;
3050
3117
  transition: box-shadow var(--dur) var(--ease);
@@ -3052,7 +3119,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3052
3119
  font: inherit;
3053
3120
  }
3054
3121
  .cp-trigger:hover:not(:disabled) {
3055
- box-shadow: var(--neu-out);
3122
+ box-shadow: var(--neu-shadow-panel);
3056
3123
  }
3057
3124
  .cp-trigger:disabled {
3058
3125
  opacity: 0.5;
@@ -3074,7 +3141,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3074
3141
  width: 22px;
3075
3142
  height: 22px;
3076
3143
  border-radius: 6px;
3077
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), var(--neu-in-sm);
3144
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), var(--neu-shadow-inset);
3078
3145
  background-clip: padding-box;
3079
3146
  }
3080
3147
  .cp-trigger.sm .cp-swatch { width: 18px; height: 18px; border-radius: 5px; }
@@ -3100,7 +3167,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3100
3167
  padding: 12px;
3101
3168
  background: var(--bg);
3102
3169
  border-radius: var(--r-md);
3103
- box-shadow: var(--neu-float);
3170
+ box-shadow: var(--neu-shadow-float);
3104
3171
  display: flex;
3105
3172
  flex-direction: column;
3106
3173
  gap: 10px;
@@ -3196,7 +3263,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3196
3263
  border: none;
3197
3264
  outline: none;
3198
3265
  background: var(--bg-sunken);
3199
- box-shadow: var(--neu-in-sm);
3266
+ box-shadow: var(--neu-shadow-inset);
3200
3267
  border-radius: 7px;
3201
3268
  font-family: var(--font-mono);
3202
3269
  font-size: 12px;
@@ -3204,7 +3271,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3204
3271
  text-transform: lowercase;
3205
3272
  }
3206
3273
  .cp-input:focus {
3207
- box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-soft);
3274
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-soft);
3208
3275
  }
3209
3276
  .cp-presets {
3210
3277
  display: grid;
@@ -3229,7 +3296,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3229
3296
  }
3230
3297
  /* Dark mode tweaks */
3231
3298
  [data-theme="dark"] .cp-swatch {
3232
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), var(--neu-in-sm);
3299
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), var(--neu-shadow-inset);
3233
3300
  }
3234
3301
  [data-theme="dark"] .cp-preset {
3235
3302
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
@@ -3287,7 +3354,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3287
3354
  border: none; padding: 0;
3288
3355
  border-radius: 999px;
3289
3356
  background: var(--bg);
3290
- box-shadow: var(--neu-flat);
3357
+ box-shadow: var(--neu-shadow-subtle);
3291
3358
  position: relative;
3292
3359
  cursor: pointer;
3293
3360
  transition: transform var(--dur-fast) var(--ease);
@@ -3327,7 +3394,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3327
3394
  overflow: visible;
3328
3395
  }
3329
3396
  .win-controls.windows .win-btn svg { display: block; flex-shrink: 0; }
3330
- .win-controls.windows .win-btn:hover { background: var(--bg); box-shadow: var(--neu-in-sm); color: var(--fg); }
3397
+ .win-controls.windows .win-btn:hover { background: var(--bg); box-shadow: var(--neu-shadow-inset); color: var(--fg); }
3331
3398
  .win-controls.windows .win-btn.close:hover {
3332
3399
  background: var(--danger);
3333
3400
  color: white;
@@ -3363,11 +3430,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
3363
3430
  width: 100%;
3364
3431
  transition: all var(--dur-fast) var(--ease);
3365
3432
  }
3366
- .sidebar-item:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
3433
+ .sidebar-item:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
3367
3434
  .sidebar-item.active {
3368
3435
  color: var(--accent-ink);
3369
3436
  background: var(--bg);
3370
- box-shadow: var(--neu-in-sm);
3437
+ box-shadow: var(--neu-shadow-inset);
3371
3438
  font-weight: 500;
3372
3439
  }
3373
3440
  .sidebar-icon { display: inline-flex; flex-shrink: 0; }
@@ -3401,3 +3468,445 @@ input, textarea, select { font-family: inherit; color: inherit; }
3401
3468
  min-width: 0;
3402
3469
  overflow: auto;
3403
3470
  }
3471
+ /* ============ ThemePanel ============ */
3472
+ .theme-panel {
3473
+ width: min(100%, 340px);
3474
+ display: flex;
3475
+ flex-direction: column;
3476
+ gap: var(--gap-3);
3477
+ box-sizing: border-box;
3478
+ padding: var(--gap-4);
3479
+ border-radius: var(--r-xl);
3480
+ color: var(--fg);
3481
+ background: var(--bg);
3482
+ box-shadow: var(--neu-shadow-lift);
3483
+ }
3484
+ .theme-panel.compact {
3485
+ width: min(100%, 300px);
3486
+ gap: var(--gap-2);
3487
+ padding: var(--gap-3);
3488
+ }
3489
+ .theme-panel-head {
3490
+ display: flex;
3491
+ flex-direction: column;
3492
+ gap: 4px;
3493
+ }
3494
+ .theme-panel-title {
3495
+ display: inline-flex;
3496
+ align-items: center;
3497
+ gap: 8px;
3498
+ min-width: 0;
3499
+ color: var(--fg);
3500
+ font-size: 14px;
3501
+ font-weight: 700;
3502
+ }
3503
+ .theme-panel-title svg {
3504
+ flex: 0 0 auto;
3505
+ color: var(--accent);
3506
+ }
3507
+ .theme-panel-title span {
3508
+ min-width: 0;
3509
+ overflow: hidden;
3510
+ text-overflow: ellipsis;
3511
+ white-space: nowrap;
3512
+ }
3513
+ .theme-panel-desc {
3514
+ font-size: 12px;
3515
+ color: var(--fg-muted);
3516
+ }
3517
+ .theme-panel-row {
3518
+ display: flex;
3519
+ flex-direction: column;
3520
+ gap: 8px;
3521
+ padding-top: var(--gap-3);
3522
+ border-top: 1px solid var(--divider);
3523
+ }
3524
+ .theme-panel-head + .theme-panel-row,
3525
+ .theme-panel-row:first-child {
3526
+ border-top: none;
3527
+ padding-top: 0;
3528
+ }
3529
+ .theme-panel-label {
3530
+ display: flex;
3531
+ align-items: center;
3532
+ justify-content: space-between;
3533
+ gap: 10px;
3534
+ font-size: 12px;
3535
+ font-weight: 600;
3536
+ color: var(--fg);
3537
+ }
3538
+ .theme-panel-label > span:last-child:not(:first-child) {
3539
+ min-width: 0;
3540
+ max-width: 54%;
3541
+ overflow: hidden;
3542
+ text-overflow: ellipsis;
3543
+ white-space: nowrap;
3544
+ padding: 2px 8px;
3545
+ border-radius: var(--r-pill);
3546
+ color: var(--accent-ink);
3547
+ background: var(--bg);
3548
+ box-shadow: var(--neu-shadow-inset);
3549
+ font-family: var(--font-mono);
3550
+ font-size: 11px;
3551
+ font-weight: 500;
3552
+ }
3553
+ .theme-panel-presets {
3554
+ display: grid;
3555
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3556
+ gap: var(--gap-2);
3557
+ }
3558
+ .theme-panel-preset-shell {
3559
+ position: relative;
3560
+ min-width: 0;
3561
+ }
3562
+ .theme-panel .theme-panel-preset.btn {
3563
+ min-width: 0;
3564
+ width: 100%;
3565
+ height: auto;
3566
+ min-height: 74px;
3567
+ justify-content: stretch;
3568
+ align-items: stretch;
3569
+ flex-direction: column;
3570
+ gap: 8px;
3571
+ padding: 9px;
3572
+ color: var(--fg-muted);
3573
+ background: var(--bg);
3574
+ box-shadow: var(--neu-shadow-control);
3575
+ text-align: left;
3576
+ white-space: normal;
3577
+ transition:
3578
+ color var(--dur-fast) var(--ease),
3579
+ box-shadow var(--dur-fast) var(--ease),
3580
+ transform var(--dur-fast) var(--ease);
3581
+ }
3582
+ .theme-panel .theme-panel-preset.btn:hover {
3583
+ color: var(--fg);
3584
+ box-shadow: var(--neu-shadow-panel);
3585
+ transform: translateY(-1px);
3586
+ }
3587
+ .theme-panel .theme-panel-preset.btn.active {
3588
+ color: var(--accent-ink);
3589
+ box-shadow: var(--neu-shadow-inset), 0 0 0 1px var(--accent-glow);
3590
+ transform: none;
3591
+ }
3592
+ .theme-panel .theme-panel-preset.btn.active:hover {
3593
+ color: var(--accent-ink);
3594
+ box-shadow: var(--neu-shadow-inset), 0 0 0 1px var(--accent-glow);
3595
+ }
3596
+ .theme-panel .theme-panel-preset-shell.deletable .theme-panel-preset.btn {
3597
+ padding-right: 28px;
3598
+ }
3599
+ .theme-panel .theme-panel-preset-delete.btn {
3600
+ position: absolute;
3601
+ top: 6px;
3602
+ right: 6px;
3603
+ width: 22px;
3604
+ height: 22px;
3605
+ min-width: 22px;
3606
+ padding: 0;
3607
+ color: var(--fg-subtle);
3608
+ background: var(--bg);
3609
+ box-shadow: var(--neu-shadow-control);
3610
+ opacity: 0;
3611
+ transform: scale(0.92);
3612
+ }
3613
+ .theme-panel-preset-shell:hover .theme-panel-preset-delete.btn,
3614
+ .theme-panel-preset-shell:focus-within .theme-panel-preset-delete.btn {
3615
+ opacity: 1;
3616
+ transform: scale(1);
3617
+ }
3618
+ .theme-panel .theme-panel-preset-delete.btn:hover {
3619
+ box-shadow: var(--neu-shadow-inset);
3620
+ }
3621
+ .theme-panel-preset-ink {
3622
+ display: grid;
3623
+ grid-template-columns: 1fr 1fr 0.7fr;
3624
+ gap: 4px;
3625
+ width: 100%;
3626
+ }
3627
+ .theme-panel-preset-ink span {
3628
+ height: 18px;
3629
+ min-width: 0;
3630
+ border-radius: var(--r-pill);
3631
+ box-shadow: inset 0 0 0 1px var(--divider);
3632
+ }
3633
+ .theme-panel-preset-copy {
3634
+ display: flex;
3635
+ flex-direction: column;
3636
+ gap: 2px;
3637
+ min-width: 0;
3638
+ width: 100%;
3639
+ }
3640
+ .theme-panel-preset-copy > span {
3641
+ min-width: 0;
3642
+ overflow: hidden;
3643
+ text-overflow: ellipsis;
3644
+ white-space: nowrap;
3645
+ color: inherit;
3646
+ font-size: 12px;
3647
+ font-weight: 700;
3648
+ }
3649
+ .theme-panel-preset-copy small {
3650
+ min-width: 0;
3651
+ overflow: hidden;
3652
+ text-overflow: ellipsis;
3653
+ white-space: nowrap;
3654
+ color: var(--fg-subtle);
3655
+ font-size: 10px;
3656
+ font-weight: 500;
3657
+ }
3658
+ .theme-panel-swatches {
3659
+ display: flex;
3660
+ align-items: center;
3661
+ flex-wrap: wrap;
3662
+ gap: 8px;
3663
+ }
3664
+ .theme-panel .theme-panel-swatch.btn {
3665
+ width: 28px;
3666
+ height: 28px;
3667
+ min-width: 28px;
3668
+ padding: 0;
3669
+ border-radius: var(--r-pill);
3670
+ box-shadow: var(--neu-shadow-subtle);
3671
+ }
3672
+ .theme-panel-swatch.active {
3673
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow);
3674
+ }
3675
+ .theme-panel .radio-group.segmented {
3676
+ width: 100%;
3677
+ }
3678
+ .theme-panel .btn.block {
3679
+ margin-top: var(--gap-1);
3680
+ }
3681
+ .theme-panel-create {
3682
+ display: flex;
3683
+ flex-direction: column;
3684
+ gap: 10px;
3685
+ padding: 10px;
3686
+ border-radius: var(--r-md);
3687
+ background: var(--bg);
3688
+ box-shadow: var(--neu-shadow-inset);
3689
+ }
3690
+ .theme-panel-create-head {
3691
+ display: flex;
3692
+ align-items: center;
3693
+ justify-content: space-between;
3694
+ gap: 10px;
3695
+ }
3696
+ .theme-panel-create-head > div {
3697
+ min-width: 0;
3698
+ display: flex;
3699
+ flex-direction: column;
3700
+ gap: 2px;
3701
+ }
3702
+ .theme-panel-create-head span {
3703
+ color: var(--fg);
3704
+ font-size: 12px;
3705
+ font-weight: 700;
3706
+ }
3707
+ .theme-panel-create-head small {
3708
+ min-width: 0;
3709
+ color: var(--fg-subtle);
3710
+ font-family: var(--font-mono);
3711
+ font-size: 10px;
3712
+ overflow: hidden;
3713
+ text-overflow: ellipsis;
3714
+ white-space: nowrap;
3715
+ }
3716
+ .theme-panel-create-field {
3717
+ min-width: 0;
3718
+ display: flex;
3719
+ flex-direction: column;
3720
+ gap: 6px;
3721
+ color: var(--fg-subtle);
3722
+ font-family: var(--font-mono);
3723
+ font-size: 10px;
3724
+ }
3725
+ .theme-panel-create-field .radio-group.segmented {
3726
+ width: 100%;
3727
+ }
3728
+ .theme-panel-create-mode.radio-group.segmented {
3729
+ width: 100%;
3730
+ }
3731
+ .theme-panel-create-grid {
3732
+ display: grid;
3733
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3734
+ gap: 8px;
3735
+ }
3736
+ .theme-panel-create-grid .cp-trigger,
3737
+ .theme-panel-create-grid .cp-custom-trigger {
3738
+ width: 100%;
3739
+ }
3740
+ .theme-panel-create-sliders {
3741
+ display: flex;
3742
+ flex-direction: column;
3743
+ gap: 8px;
3744
+ padding: 2px 0;
3745
+ }
3746
+ .theme-panel-shadow {
3747
+ gap: 7px;
3748
+ }
3749
+ .theme-panel-create-preview {
3750
+ min-height: 36px;
3751
+ display: flex;
3752
+ align-items: center;
3753
+ justify-content: space-between;
3754
+ gap: 10px;
3755
+ padding: 7px 9px;
3756
+ border-radius: var(--preview-radius, var(--r-md));
3757
+ color: var(--preview-fg, var(--fg));
3758
+ background: var(--preview-bg, var(--bg));
3759
+ box-shadow:
3760
+ calc(var(--shadow-offset) * 0.45 * var(--preview-shadow-scale, 1)) calc(var(--shadow-offset) * 0.45 * var(--preview-shadow-scale, 1)) calc(var(--shadow-blur) * 0.55 * var(--preview-shadow-scale, 1)) var(--preview-shadow-dark, var(--shadow-dark)),
3761
+ calc(var(--shadow-offset) * -0.45 * var(--preview-shadow-scale, 1)) calc(var(--shadow-offset) * -0.45 * var(--preview-shadow-scale, 1)) calc(var(--shadow-blur) * 0.55 * var(--preview-shadow-scale, 1)) var(--preview-shadow-light, var(--shadow-light));
3762
+ font-family: var(--preview-font, var(--font-sans));
3763
+ font-size: 12px;
3764
+ font-weight: 700;
3765
+ }
3766
+ .theme-panel-create-preview-label {
3767
+ min-width: 0;
3768
+ display: inline-flex;
3769
+ align-items: center;
3770
+ gap: 7px;
3771
+ color: inherit;
3772
+ }
3773
+ .theme-panel-create-preview-label > span {
3774
+ min-width: 0;
3775
+ overflow: hidden;
3776
+ text-overflow: ellipsis;
3777
+ white-space: nowrap;
3778
+ }
3779
+ .theme-panel-create-preview i {
3780
+ flex: 0 0 auto;
3781
+ width: 20px;
3782
+ height: 20px;
3783
+ border-radius: var(--r-pill);
3784
+ background: var(--preview-accent, var(--accent));
3785
+ box-shadow:
3786
+ inset 1px 1px 2px color-mix(in oklch, var(--preview-accent, var(--accent)) 50%, white),
3787
+ 0 0 0 4px var(--preview-accent-glow, var(--accent-glow));
3788
+ }
3789
+ .theme-panel-create-actions {
3790
+ display: grid;
3791
+ grid-template-columns: 0.85fr 1fr;
3792
+ gap: 8px;
3793
+ }
3794
+ .theme-panel-advanced {
3795
+ display: flex;
3796
+ flex-direction: column;
3797
+ gap: 12px;
3798
+ padding-top: 2px;
3799
+ }
3800
+ .theme-panel-advanced-section {
3801
+ display: flex;
3802
+ flex-direction: column;
3803
+ gap: 8px;
3804
+ padding-top: 10px;
3805
+ border-top: 1px solid var(--divider);
3806
+ }
3807
+ .theme-panel-advanced-section.compact {
3808
+ padding-top: 0;
3809
+ border-top: none;
3810
+ }
3811
+ .theme-panel-advanced-title {
3812
+ display: flex;
3813
+ align-items: baseline;
3814
+ justify-content: space-between;
3815
+ gap: 8px;
3816
+ }
3817
+ .theme-panel-advanced-title span {
3818
+ min-width: 0;
3819
+ color: var(--fg);
3820
+ font-size: 11px;
3821
+ font-weight: 700;
3822
+ }
3823
+ .theme-panel-advanced-title small {
3824
+ min-width: 0;
3825
+ color: var(--fg-subtle);
3826
+ font-family: var(--font-mono);
3827
+ font-size: 9px;
3828
+ overflow: hidden;
3829
+ text-overflow: ellipsis;
3830
+ white-space: nowrap;
3831
+ }
3832
+ .theme-panel-token-grid {
3833
+ display: flex;
3834
+ flex-direction: column;
3835
+ gap: 7px;
3836
+ }
3837
+ .theme-panel-token-field {
3838
+ min-width: 0;
3839
+ display: grid;
3840
+ grid-template-columns: 88px minmax(0, 1fr);
3841
+ gap: 8px;
3842
+ align-items: center;
3843
+ }
3844
+ .theme-panel-token-label {
3845
+ min-width: 0;
3846
+ display: flex;
3847
+ flex-direction: column;
3848
+ gap: 2px;
3849
+ }
3850
+ .theme-panel-token-label span {
3851
+ color: var(--fg-muted);
3852
+ font-size: 10px;
3853
+ font-weight: 650;
3854
+ white-space: nowrap;
3855
+ }
3856
+ .theme-panel-token-label code {
3857
+ color: var(--fg-subtle);
3858
+ font-family: var(--font-mono);
3859
+ font-size: 9px;
3860
+ overflow: hidden;
3861
+ text-overflow: ellipsis;
3862
+ white-space: nowrap;
3863
+ }
3864
+ .theme-panel-token-input {
3865
+ min-width: 0;
3866
+ display: grid;
3867
+ grid-template-columns: 24px minmax(0, 1fr);
3868
+ gap: 7px;
3869
+ align-items: center;
3870
+ }
3871
+ .theme-panel-token-field.scale {
3872
+ align-items: start;
3873
+ }
3874
+ .theme-panel-token-scale {
3875
+ min-width: 0;
3876
+ display: grid;
3877
+ grid-template-columns: 64px minmax(0, 1fr);
3878
+ gap: 7px;
3879
+ align-items: center;
3880
+ }
3881
+ .theme-panel-token-picker {
3882
+ width: 24px;
3883
+ height: 24px;
3884
+ }
3885
+ .theme-panel-token-picker .cp-custom-trigger {
3886
+ width: 24px;
3887
+ height: 24px;
3888
+ display: block;
3889
+ border-radius: 7px;
3890
+ }
3891
+ .theme-panel-token-swatch {
3892
+ display: block;
3893
+ width: 24px;
3894
+ height: 24px;
3895
+ border-radius: 7px;
3896
+ box-shadow: var(--neu-shadow-inset), inset 0 0 0 1px var(--border);
3897
+ transition:
3898
+ box-shadow var(--dur-fast) var(--ease),
3899
+ transform var(--dur-fast) var(--ease);
3900
+ }
3901
+ .theme-panel-token-picker .cp-custom-trigger:hover .theme-panel-token-swatch {
3902
+ box-shadow: var(--neu-shadow-control), inset 0 0 0 1px var(--border);
3903
+ transform: translateY(-1px);
3904
+ }
3905
+ .theme-panel-token-input .input-wrap,
3906
+ .theme-panel-create-field .input-wrap {
3907
+ min-width: 0;
3908
+ }
3909
+ .theme-panel-token-input .input {
3910
+ font-family: var(--font-mono);
3911
+ font-size: 11px;
3912
+ }