@fangxinyan/lumina 0.6.3 → 0.6.5

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 (255) 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-5FSPJWLX.css} +4 -2
  137. package/dist/Tooltip.cjs +2 -2
  138. package/dist/Tooltip.d.cts +2 -0
  139. package/dist/Tooltip.d.ts +2 -0
  140. package/dist/Tooltip.js +1 -1
  141. package/dist/{Typography-NKPWTJCV.css → Typography-32QQLD4F.css} +41 -11
  142. package/dist/Typography.cjs +8 -7
  143. package/dist/Typography.d.cts +1 -1
  144. package/dist/Typography.d.ts +1 -1
  145. package/dist/Typography.js +3 -2
  146. package/dist/{chunk-DWAN57G4.js → chunk-2NT5QKEX.js} +3 -3
  147. package/dist/{chunk-6BWELOCT.js → chunk-2SCXQ7QS.js} +2 -2
  148. package/dist/{chunk-TP567B3L.cjs → chunk-2ZADGBUN.cjs} +5 -5
  149. package/dist/{chunk-CETNCRZ4.js → chunk-2ZFJTMEF.js} +4 -4
  150. package/dist/{chunk-I5WTQ5Y3.js → chunk-3YP7CBJT.js} +3 -3
  151. package/dist/{chunk-UUHFKIWP.cjs → chunk-4UKM4KAC.cjs} +2 -2
  152. package/dist/{chunk-HLFH5HWR.js → chunk-56PHETWO.js} +3 -3
  153. package/dist/{chunk-ET6DYQVZ.js → chunk-5JNDDWFZ.js} +132 -14
  154. package/dist/{chunk-MPVCYU2K.cjs → chunk-5NFSDFBB.cjs} +4 -4
  155. package/dist/{chunk-P6P4DGLF.cjs → chunk-66GXZQKL.cjs} +4 -4
  156. package/dist/{chunk-QP3VCSRY.cjs → chunk-66T76GII.cjs} +6 -6
  157. package/dist/chunk-6EOSMK34.cjs +194 -0
  158. package/dist/{chunk-WNM5RVXR.cjs → chunk-6GQPF3EI.cjs} +2 -2
  159. package/dist/{chunk-V272XR3F.cjs → chunk-6LARTGLP.cjs} +1 -1
  160. package/dist/chunk-6SPMHY54.js +191 -0
  161. package/dist/{chunk-YLIQ37KY.cjs → chunk-6XVLERA3.cjs} +2 -2
  162. package/dist/{chunk-FBYUZOZP.js → chunk-7D76MI37.js} +5 -5
  163. package/dist/{chunk-J5ZGYQZK.js → chunk-7NZ2A4MA.js} +155 -29
  164. package/dist/{chunk-KLEKKZ73.js → chunk-7ZNGHWVS.js} +1 -1
  165. package/dist/{chunk-7AG524YZ.cjs → chunk-ACQSRMLF.cjs} +5 -5
  166. package/dist/{chunk-JVUVOR6S.js → chunk-AJH2O4WC.js} +3 -3
  167. package/dist/{chunk-NTS5L4NQ.cjs → chunk-BJ6WUVEG.cjs} +4 -4
  168. package/dist/{chunk-S3VXH5L4.cjs → chunk-C24W6PTJ.cjs} +2 -2
  169. package/dist/{chunk-GMN74OEY.cjs → chunk-CBKJXKVI.cjs} +2 -2
  170. package/dist/{chunk-FWPBORRB.js → chunk-CEZ2DR4R.js} +3 -3
  171. package/dist/{chunk-SQGPSMSK.js → chunk-CNGKJYGZ.js} +3 -3
  172. package/dist/{chunk-PULGVK2I.cjs → chunk-D5PCIVID.cjs} +4 -4
  173. package/dist/{chunk-DG5VQ6BO.cjs → chunk-D64IPDUE.cjs} +4 -4
  174. package/dist/{chunk-VFFIE2VO.cjs → chunk-DYHNOYRC.cjs} +7 -7
  175. package/dist/{chunk-P6EZG2R7.cjs → chunk-DYSGXQUK.cjs} +7 -7
  176. package/dist/{chunk-H4LGWZMH.cjs → chunk-GBKUGKIY.cjs} +11 -11
  177. package/dist/{chunk-J2HZTJO6.js → chunk-GUZ2DNDC.js} +3 -3
  178. package/dist/{chunk-K6F25JXT.js → chunk-GZCU6HXD.js} +2 -2
  179. package/dist/{chunk-USQ43DJ5.js → chunk-HFUHQUPQ.js} +2 -2
  180. package/dist/{chunk-7JN6FJ55.js → chunk-HU7T64Y3.js} +2 -2
  181. package/dist/{chunk-X5GCOMC3.cjs → chunk-IDJCFYPP.cjs} +15 -15
  182. package/dist/{chunk-KD4YYIIO.cjs → chunk-IHK2FRTS.cjs} +2 -2
  183. package/dist/{chunk-Q5SZIU7Z.cjs → chunk-JFQ53MO4.cjs} +1 -1
  184. package/dist/{chunk-7PQJCLIR.js → chunk-KMG7OMOS.js} +2 -2
  185. package/dist/{chunk-2HQCUBA7.cjs → chunk-L27C5O4W.cjs} +4 -4
  186. package/dist/chunk-LFTCK2VM.cjs +1194 -0
  187. package/dist/{chunk-BVQ77VRY.js → chunk-LI4XJTEA.js} +3 -3
  188. package/dist/{chunk-45VJGBGN.js → chunk-LQLOOUS3.js} +2 -2
  189. package/dist/{chunk-PL6DRFUO.cjs → chunk-MOMLQP7B.cjs} +2 -2
  190. package/dist/{chunk-OF7JIYBY.cjs → chunk-MYHBC3HA.cjs} +2 -2
  191. package/dist/{chunk-LKK2AA7W.js → chunk-MYRLCN6V.js} +2 -2
  192. package/dist/{chunk-ZKE73UQF.cjs → chunk-N2BTMKF2.cjs} +5 -5
  193. package/dist/{chunk-6ZXQJRAT.cjs → chunk-N2COYOXE.cjs} +155 -29
  194. package/dist/{chunk-2TL37AP5.cjs → chunk-N3OLFKV5.cjs} +1 -1
  195. package/dist/{chunk-5JSDQ6QQ.cjs → chunk-NDO22RER.cjs} +2 -2
  196. package/dist/{chunk-ME5BZ2WA.js → chunk-NE7IUGMK.js} +3 -3
  197. package/dist/{chunk-F6RYCBQG.js → chunk-NFXHIO3G.js} +1 -1
  198. package/dist/chunk-NJCHFXGC.js +1170 -0
  199. package/dist/chunk-NT6CJYI3.cjs +129 -0
  200. package/dist/chunk-O43DOE7V.js +106 -0
  201. package/dist/{chunk-GNEZD7KE.cjs → chunk-O4BOBOYV.cjs} +2 -2
  202. package/dist/{chunk-XSN4TLN5.cjs → chunk-OGPDCBPD.cjs} +12 -12
  203. package/dist/{chunk-6YQTMI55.js → chunk-OHFZ7L4T.js} +2 -2
  204. package/dist/{chunk-7IYKKLV3.js → chunk-OHIFKN4E.js} +4 -4
  205. package/dist/{chunk-46VXFTEC.js → chunk-OQU3TJCF.js} +3 -3
  206. package/dist/{chunk-5TKC6IEN.js → chunk-PEJLXJQD.js} +1 -1
  207. package/dist/{chunk-HWFM4MAT.js → chunk-PKHITACT.js} +2 -2
  208. package/dist/{chunk-JCEHZ336.js → chunk-PNZJFLMY.js} +3 -3
  209. package/dist/{chunk-XRR3CYQL.js → chunk-QP7RXZES.js} +2 -2
  210. package/dist/{chunk-5MN3PMF4.cjs → chunk-QY76WTO5.cjs} +9 -9
  211. package/dist/{chunk-FGW5GJ22.cjs → chunk-R74TZKJS.cjs} +4 -4
  212. package/dist/{chunk-TGL5BGMR.js → chunk-REMJWNAT.js} +4 -4
  213. package/dist/{chunk-3YJU3D5S.cjs → chunk-RIUDYPRB.cjs} +62 -13
  214. package/dist/{chunk-SWBWZIL4.cjs → chunk-S6OKX4H7.cjs} +2 -2
  215. package/dist/{chunk-EC4WGEAJ.js → chunk-SABWUELE.js} +2 -2
  216. package/dist/{chunk-TEEFR2FD.js → chunk-SFAGHPBT.js} +62 -13
  217. package/dist/{chunk-QKQHZIF3.cjs → chunk-SG42F5VB.cjs} +2 -2
  218. package/dist/{chunk-5C2AI2SD.js → chunk-SQIWPU6V.js} +2 -2
  219. package/dist/{chunk-5DKRY67M.cjs → chunk-SYWTT5TY.cjs} +5 -5
  220. package/dist/{chunk-OBEKX4VR.js → chunk-TVUBGXWA.js} +2 -2
  221. package/dist/{chunk-7PNJI5UE.cjs → chunk-U2H4DRMV.cjs} +2 -2
  222. package/dist/{chunk-HKF2V5MM.cjs → chunk-VAXWWJJP.cjs} +9 -9
  223. package/dist/{chunk-5H5YP2TB.js → chunk-VNNQYJLT.js} +3 -3
  224. package/dist/{chunk-KGSADAOD.cjs → chunk-VSUMJX6Z.cjs} +2 -2
  225. package/dist/{chunk-K5IGFBDR.js → chunk-W5CJC7S7.js} +3 -3
  226. package/dist/{chunk-AXZ7ELMA.js → chunk-WEJKY3DF.js} +2 -2
  227. package/dist/{chunk-GIZU3H6H.js → chunk-WXWFMWWF.js} +3 -3
  228. package/dist/{chunk-UKS23N3L.js → chunk-XVP7IKLZ.js} +4 -4
  229. package/dist/{chunk-ELNT3CFO.js → chunk-Y5F7ZTBH.js} +2 -2
  230. package/dist/{chunk-QCILPZWP.js → chunk-YJEXAO2I.js} +2 -2
  231. package/dist/{chunk-7ABFUIOB.cjs → chunk-YNCDTKAE.cjs} +2 -2
  232. package/dist/{chunk-K7FV7W6U.cjs → chunk-YSCIMHOI.cjs} +5 -5
  233. package/dist/{chunk-BPOOVO5T.js → chunk-YSXD344H.js} +5 -5
  234. package/dist/{chunk-47VG2P34.js → chunk-YT5NLCRC.js} +1 -1
  235. package/dist/{chunk-R2TEDH2F.cjs → chunk-YU5JK247.cjs} +135 -17
  236. package/dist/{chunk-HZSIUOCN.cjs → chunk-YUKXNWVE.cjs} +1 -1
  237. package/dist/{chunk-65FIH5A3.js → chunk-YVTLHTG6.js} +2 -2
  238. package/dist/{chunk-GENABQYA.cjs → chunk-Z4PZ2ZHI.cjs} +2 -2
  239. package/dist/{chunk-6HMTV6P4.cjs → chunk-ZPKHGKVL.cjs} +4 -4
  240. package/dist/{chunk-AAGF7K3L.js → chunk-ZPP7LTHP.js} +3 -3
  241. package/dist/{chunk-IZOHYJUQ.cjs → chunk-ZWCDB5PP.cjs} +2 -2
  242. package/dist/index.cjs +214 -191
  243. package/dist/index.d.cts +3 -1
  244. package/dist/index.d.ts +3 -1
  245. package/dist/index.js +49 -46
  246. package/dist/styles.css +715 -175
  247. package/dist/{tokens-BIIUTPKN.css → tokens-EF34LSWI.css} +42 -17
  248. package/dist/tokens.css +42 -17
  249. package/docs/llms/surface.md +90 -0
  250. package/docs/llms/theme.md +24 -2
  251. package/docs/llms/themepanel.md +128 -0
  252. package/docs/llms/tooltip.md +1 -0
  253. package/docs/llms/typography.md +12 -2
  254. package/docs/llms.md +3 -1
  255. 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;
@@ -1696,6 +1763,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
1696
1763
  align-self: flex-start;
1697
1764
  }
1698
1765
  .tip {
1766
+ display: block;
1767
+ box-sizing: border-box;
1699
1768
  background: var(--bg-sunken);
1700
1769
  color: var(--fg);
1701
1770
  padding: 6px 10px;
@@ -1703,8 +1772,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
1703
1772
  font-size: 11px;
1704
1773
  font-weight: 500;
1705
1774
  white-space: nowrap;
1706
- box-shadow: var(--neu-out-sm);
1707
- pointer-events: none;
1775
+ box-shadow: var(--neu-shadow-control);
1776
+ pointer-events: auto;
1708
1777
  animation: fadeIn var(--dur) var(--ease);
1709
1778
  z-index: 1000;
1710
1779
  }
@@ -1725,7 +1794,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1725
1794
  .message {
1726
1795
  background: var(--bg);
1727
1796
  border-radius: var(--r-md);
1728
- box-shadow: var(--neu-float);
1797
+ box-shadow: var(--neu-shadow-float);
1729
1798
  padding: 12px 16px;
1730
1799
  min-width: 240px;
1731
1800
  display: flex; align-items: center; gap: 10px;
@@ -1759,7 +1828,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1759
1828
  background: var(--bg);
1760
1829
  border-radius: var(--r-md);
1761
1830
  min-width: 220px;
1762
- box-shadow: var(--neu-float);
1831
+ box-shadow: var(--neu-shadow-float);
1763
1832
  position: relative;
1764
1833
  }
1765
1834
  /*
@@ -1852,7 +1921,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
1852
1921
  padding: 14px 16px;
1853
1922
  border-radius: var(--r-md);
1854
1923
  background: var(--bg);
1855
- box-shadow: var(--neu-in-sm);
1924
+ box-shadow: var(--neu-shadow-inset);
1856
1925
  position: relative;
1857
1926
  }
1858
1927
  .alert-ico {
@@ -1894,12 +1963,12 @@ input, textarea, select { font-family: inherit; color: inherit; }
1894
1963
  cursor: pointer;
1895
1964
  border: none; background: transparent;
1896
1965
  }
1897
- .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
1966
+ .alert-close:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
1898
1967
  /* ============ Table ============ */
1899
1968
  .table-wrap {
1900
1969
  border-radius: var(--r-lg);
1901
1970
  background: var(--bg);
1902
- box-shadow: var(--neu-in-sm);
1971
+ box-shadow: var(--neu-shadow-inset);
1903
1972
  overflow: auto;
1904
1973
  }
1905
1974
  /* When scroll=y is on, the wrap itself becomes the scroll region. */
@@ -1936,13 +2005,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
1936
2005
  width: 16px; height: 16px;
1937
2006
  border-radius: 6px;
1938
2007
  background: var(--bg);
1939
- box-shadow: var(--neu-flat);
2008
+ box-shadow: var(--neu-shadow-subtle);
1940
2009
  align-items: center; justify-content: center;
1941
2010
  margin-left: 6px;
1942
2011
  color: var(--fg-subtle);
1943
2012
  vertical-align: middle;
1944
2013
  }
1945
- .table th.sorted .sort-ind { color: var(--accent); box-shadow: var(--neu-in-sm); }
2014
+ .table th.sorted .sort-ind { color: var(--accent); box-shadow: var(--neu-shadow-inset); }
1946
2015
  .table td {
1947
2016
  padding: 12px 18px;
1948
2017
  border-bottom: 1px solid var(--divider);
@@ -2001,14 +2070,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
2001
2070
  border: none;
2002
2071
  border-radius: var(--r-sm);
2003
2072
  background: var(--bg);
2004
- box-shadow: var(--neu-flat);
2073
+ box-shadow: var(--neu-shadow-subtle);
2005
2074
  color: var(--fg-subtle);
2006
2075
  display: inline-flex; align-items: center; justify-content: center;
2007
2076
  cursor: pointer;
2008
2077
  transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
2009
2078
  }
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); }
2079
+ .expand-btn:hover { color: var(--accent-ink); box-shadow: var(--neu-shadow-control); }
2080
+ .expand-btn.open { transform: rotate(90deg); color: var(--accent-ink); box-shadow: var(--neu-shadow-inset); }
2012
2081
  /* Expanded row panel */
2013
2082
  .table tbody tr.expanded-row td {
2014
2083
  padding: 14px 18px;
@@ -2019,7 +2088,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2019
2088
  padding: 14px 16px;
2020
2089
  border-radius: var(--r-md);
2021
2090
  background: var(--bg);
2022
- box-shadow: var(--neu-in-sm);
2091
+ box-shadow: var(--neu-shadow-inset);
2023
2092
  color: var(--fg);
2024
2093
  font-size: 13px;
2025
2094
  }
@@ -2030,14 +2099,14 @@ input, textarea, select { font-family: inherit; color: inherit; }
2030
2099
  border: none;
2031
2100
  padding: 0;
2032
2101
  background: var(--bg);
2033
- box-shadow: var(--neu-in-sm);
2102
+ box-shadow: var(--neu-shadow-inset);
2034
2103
  display: inline-flex; align-items: center; justify-content: center;
2035
2104
  cursor: pointer;
2036
2105
  transition: box-shadow var(--dur-fast) var(--ease);
2037
2106
  }
2038
2107
  .table .row-check .radio-dot:disabled { opacity: 0.5; cursor: not-allowed; }
2039
2108
  .table .row-check .radio-dot.checked {
2040
- box-shadow: var(--neu-out-sm);
2109
+ box-shadow: var(--neu-shadow-control);
2041
2110
  }
2042
2111
  .table .row-check .radio-dot.checked::after {
2043
2112
  content: "";
@@ -2051,7 +2120,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2051
2120
  width: 18px; height: 18px;
2052
2121
  border-radius: 5px;
2053
2122
  background: var(--bg);
2054
- box-shadow: var(--neu-flat);
2123
+ box-shadow: var(--neu-shadow-subtle);
2055
2124
  color: var(--fg-subtle);
2056
2125
  align-items: center; justify-content: center;
2057
2126
  margin-left: 6px;
@@ -2064,7 +2133,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2064
2133
  .table th.filterable .filter-ind:hover { color: var(--fg); }
2065
2134
  .table th.filterable .filter-ind.active {
2066
2135
  color: var(--accent-ink);
2067
- box-shadow: var(--neu-in-sm);
2136
+ box-shadow: var(--neu-shadow-inset);
2068
2137
  }
2069
2138
  /* Filter popover panel (portaled to body) */
2070
2139
  .table-filter-panel {
@@ -2073,7 +2142,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2073
2142
  max-width: 260px;
2074
2143
  background: var(--bg);
2075
2144
  border-radius: var(--r-md);
2076
- box-shadow: var(--neu-float);
2145
+ box-shadow: var(--neu-shadow-float);
2077
2146
  padding: 10px;
2078
2147
  animation: menuIn var(--dur) var(--ease);
2079
2148
  }
@@ -2112,17 +2181,17 @@ input, textarea, select { font-family: inherit; color: inherit; }
2112
2181
  padding: 6px 12px;
2113
2182
  border-radius: var(--r-sm);
2114
2183
  background: var(--bg);
2115
- box-shadow: var(--neu-out-sm);
2184
+ box-shadow: var(--neu-shadow-control);
2116
2185
  font-size: 12px;
2117
2186
  font-family: inherit;
2118
2187
  color: var(--fg);
2119
2188
  cursor: pointer;
2120
2189
  transition: box-shadow var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
2121
2190
  }
2122
- .table-filter-actions .tf-btn:hover { box-shadow: var(--neu-in-sm); }
2191
+ .table-filter-actions .tf-btn:hover { box-shadow: var(--neu-shadow-inset); }
2123
2192
  .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); }
2193
+ .table-filter-actions .tf-btn.ghost { color: var(--fg-muted); box-shadow: var(--neu-shadow-subtle); }
2194
+ .table-filter-actions .tf-btn.ghost:hover { box-shadow: var(--neu-shadow-inset); }
2126
2195
  /* Built-in pagination bar */
2127
2196
  .table-pagination {
2128
2197
  margin-top: 12px;
@@ -2131,7 +2200,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2131
2200
  .table-card {
2132
2201
  border-radius: var(--r-lg);
2133
2202
  background: var(--bg);
2134
- box-shadow: var(--neu-out-sm);
2203
+ box-shadow: var(--neu-shadow-control);
2135
2204
  overflow: hidden;
2136
2205
  }
2137
2206
  .table-card .table-wrap { background: transparent; box-shadow: none; border-radius: 0; }
@@ -2190,7 +2259,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2190
2259
  border: none;
2191
2260
  border-radius: var(--r-sm);
2192
2261
  background: var(--bg);
2193
- box-shadow: var(--neu-out-sm);
2262
+ box-shadow: var(--neu-shadow-control);
2194
2263
  display: inline-flex; align-items: center; justify-content: center;
2195
2264
  cursor: pointer;
2196
2265
  font-size: 12px;
@@ -2201,11 +2270,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
2201
2270
  }
2202
2271
  .pagination .pg:hover { color: var(--accent-ink); }
2203
2272
  .pagination .pg.active {
2204
- box-shadow: var(--neu-in-sm);
2273
+ box-shadow: var(--neu-shadow-inset);
2205
2274
  color: var(--accent-ink);
2206
2275
  font-weight: 700;
2207
2276
  }
2208
- .pagination .pg.disabled { color: var(--fg-subtle); cursor: not-allowed; box-shadow: var(--neu-flat); }
2277
+ .pagination .pg.disabled { color: var(--fg-subtle); cursor: not-allowed; box-shadow: var(--neu-shadow-subtle); }
2209
2278
  .pagination .ellipsis { padding: 0 4px; color: var(--fg-subtle); }
2210
2279
  /* size changer — compact Select inline with the page buttons */
2211
2280
  .pagination .pg-size-changer { margin-left: 8px; min-width: 108px; }
@@ -2226,7 +2295,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2226
2295
  border: none;
2227
2296
  border-radius: var(--r-sm);
2228
2297
  background: var(--bg);
2229
- box-shadow: var(--neu-in-sm);
2298
+ box-shadow: var(--neu-shadow-inset);
2230
2299
  color: var(--fg);
2231
2300
  font-family: inherit;
2232
2301
  font-size: 12px;
@@ -2236,7 +2305,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2236
2305
  transition: box-shadow var(--dur-fast) var(--ease);
2237
2306
  }
2238
2307
  .pagination .pg-jumper-input:focus-visible {
2239
- box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-glow);
2308
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow);
2240
2309
  }
2241
2310
  /* ============ List ============ */
2242
2311
  .list {
@@ -2244,7 +2313,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2244
2313
  flex-direction: column;
2245
2314
  background: var(--bg);
2246
2315
  border-radius: var(--r-lg);
2247
- box-shadow: var(--neu-in-sm);
2316
+ box-shadow: var(--neu-shadow-inset);
2248
2317
  padding: 8px;
2249
2318
  }
2250
2319
  .list-item {
@@ -2256,8 +2325,8 @@ input, textarea, select { font-family: inherit; color: inherit; }
2256
2325
  transition: all var(--dur-fast) var(--ease);
2257
2326
  }
2258
2327
  .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); }
2328
+ .list-item.clickable:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2329
+ .list-item.selected { box-shadow: var(--neu-shadow-control); background: var(--bg); }
2261
2330
  .list.with-dividers .list-item + .list-item { border-top: 1px solid var(--divider); border-radius: 0; }
2262
2331
  .list-item-meta { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2263
2332
  .list-item-title { font-size: 13px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@@ -2284,7 +2353,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2284
2353
  border: none;
2285
2354
  border-radius: 50%;
2286
2355
  background: var(--bg);
2287
- box-shadow: var(--neu-in-sm);
2356
+ box-shadow: var(--neu-shadow-inset);
2288
2357
  animation: none;
2289
2358
  }
2290
2359
  .spin.ring::before {
@@ -2369,7 +2438,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2369
2438
  width: 56px; height: 56px;
2370
2439
  border-radius: var(--r-lg);
2371
2440
  background: var(--bg);
2372
- box-shadow: var(--neu-in-sm);
2441
+ box-shadow: var(--neu-shadow-inset);
2373
2442
  display: grid; place-items: center;
2374
2443
  color: var(--fg-subtle);
2375
2444
  }
@@ -2420,7 +2489,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2420
2489
  background: var(--bg);
2421
2490
  border-radius: var(--r-lg);
2422
2491
  padding: var(--gap-4);
2423
- box-shadow: var(--neu-out);
2492
+ box-shadow: var(--neu-shadow-panel);
2424
2493
  width: 320px;
2425
2494
  }
2426
2495
  .calendar-head {
@@ -2435,7 +2504,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2435
2504
  font-family: inherit;
2436
2505
  transition: all var(--dur-fast) var(--ease);
2437
2506
  }
2438
- .calendar-title:hover { background: var(--bg); box-shadow: var(--neu-flat); }
2507
+ .calendar-title:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2439
2508
  .calendar-grid {
2440
2509
  display: grid;
2441
2510
  grid-template-columns: repeat(7, 1fr);
@@ -2464,7 +2533,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2464
2533
  transition: all var(--dur-fast) var(--ease);
2465
2534
  }
2466
2535
  .calendar-cell.out { color: var(--fg-subtle); opacity: 0.5; }
2467
- .calendar-cell:hover { background: var(--bg); box-shadow: var(--neu-flat); }
2536
+ .calendar-cell:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2468
2537
  .calendar-cell.today { font-weight: 700; color: var(--accent-ink); }
2469
2538
  .calendar-cell.today::after {
2470
2539
  content: ""; position: absolute; bottom: 4px; left: 50%;
@@ -2474,7 +2543,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2474
2543
  }
2475
2544
  .calendar-cell.selected {
2476
2545
  background: var(--bg);
2477
- box-shadow: var(--neu-in-sm);
2546
+ box-shadow: var(--neu-shadow-inset);
2478
2547
  color: var(--accent-ink);
2479
2548
  font-weight: 600;
2480
2549
  }
@@ -2487,7 +2556,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2487
2556
  border-radius: var(--r-md);
2488
2557
  background: var(--bg);
2489
2558
  padding: 6px;
2490
- box-shadow: var(--neu-out-sm);
2559
+ box-shadow: var(--neu-shadow-control);
2491
2560
  overflow: hidden;
2492
2561
  line-height: 0;
2493
2562
  }
@@ -2507,7 +2576,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2507
2576
  position: relative;
2508
2577
  overflow: hidden;
2509
2578
  border-radius: calc(var(--r-md) - 4px);
2510
- box-shadow: var(--neu-in-sm);
2579
+ box-shadow: var(--neu-shadow-inset);
2511
2580
  background: var(--bg-sunken);
2512
2581
  }
2513
2582
  .n-image.raw .n-image-frame {
@@ -2606,7 +2675,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2606
2675
  max-width: 80vw;
2607
2676
  max-height: 80vh;
2608
2677
  border-radius: var(--r-lg);
2609
- box-shadow: var(--neu-float);
2678
+ box-shadow: var(--neu-shadow-float);
2610
2679
  }
2611
2680
  /* ============ SpriteImage / LayeredImage ============ */
2612
2681
  .n-sprite-image,
@@ -2616,7 +2685,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2616
2685
  border-radius: var(--r-sm);
2617
2686
  background: var(--bg);
2618
2687
  padding: 6px;
2619
- box-shadow: var(--neu-out-sm);
2688
+ box-shadow: var(--neu-shadow-control);
2620
2689
  overflow: hidden;
2621
2690
  line-height: 0;
2622
2691
  }
@@ -2638,7 +2707,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2638
2707
  overflow: hidden;
2639
2708
  border-radius: var(--r-sm);
2640
2709
  background: var(--bg-sunken);
2641
- box-shadow: var(--neu-in-sm);
2710
+ box-shadow: var(--neu-shadow-inset);
2642
2711
  }
2643
2712
  .n-sprite-image.raw .n-sprite-image-frame,
2644
2713
  .n-layered-image.raw .n-layered-image-frame {
@@ -2676,7 +2745,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2676
2745
  padding: 0 36px 0 var(--ctrl-pad-x);
2677
2746
  border-radius: var(--r-md);
2678
2747
  background: var(--bg);
2679
- box-shadow: var(--neu-out-sm);
2748
+ box-shadow: var(--neu-shadow-control);
2680
2749
  display: inline-flex;
2681
2750
  align-items: center;
2682
2751
  font-size: 13px;
@@ -2688,7 +2757,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2688
2757
  text-align: left;
2689
2758
  }
2690
2759
  .cascader-trigger.placeholder { color: var(--fg-subtle); }
2691
- .cascader.open .cascader-trigger { box-shadow: var(--neu-in-sm); color: var(--accent-ink); }
2760
+ .cascader.open .cascader-trigger { box-shadow: var(--neu-shadow-inset); color: var(--accent-ink); }
2692
2761
  .cascader-clear {
2693
2762
  position: absolute;
2694
2763
  right: 30px;
@@ -2698,7 +2767,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2698
2767
  height: 20px;
2699
2768
  border-radius: 999px;
2700
2769
  background: var(--bg);
2701
- box-shadow: var(--neu-out-sm);
2770
+ box-shadow: var(--neu-shadow-control);
2702
2771
  display: inline-grid;
2703
2772
  place-items: center;
2704
2773
  color: var(--fg-subtle);
@@ -2706,13 +2775,13 @@ input, textarea, select { font-family: inherit; color: inherit; }
2706
2775
  transition: all var(--dur-fast) var(--ease);
2707
2776
  }
2708
2777
  .cascader:hover .cascader-clear { opacity: 1; }
2709
- .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-in-sm); }
2778
+ .cascader-clear:hover { color: var(--accent-ink); box-shadow: var(--neu-shadow-inset); }
2710
2779
  .cascader-panel {
2711
2780
  z-index: 1000;
2712
2781
  display: flex;
2713
2782
  background: var(--bg);
2714
2783
  border-radius: var(--r-md);
2715
- box-shadow: var(--neu-float);
2784
+ box-shadow: var(--neu-shadow-float);
2716
2785
  padding: 6px;
2717
2786
  animation: menuIn var(--dur) var(--ease);
2718
2787
  gap: 4px;
@@ -2753,7 +2822,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2753
2822
  }
2754
2823
  .cascader-search-item:hover {
2755
2824
  background: var(--bg);
2756
- box-shadow: var(--neu-flat);
2825
+ box-shadow: var(--neu-shadow-subtle);
2757
2826
  color: var(--accent-ink);
2758
2827
  }
2759
2828
  .cascader-path-sep { color: var(--fg-subtle); }
@@ -2804,10 +2873,10 @@ input, textarea, select { font-family: inherit; color: inherit; }
2804
2873
  height: 15px;
2805
2874
  object-fit: contain;
2806
2875
  }
2807
- .cascader-item:hover { background: var(--bg); box-shadow: var(--neu-flat); color: var(--accent-ink); }
2876
+ .cascader-item:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); color: var(--accent-ink); }
2808
2877
  .cascader-item.active {
2809
2878
  background: var(--bg);
2810
- box-shadow: var(--neu-in-sm);
2879
+ box-shadow: var(--neu-shadow-inset);
2811
2880
  color: var(--accent-ink);
2812
2881
  font-weight: 500;
2813
2882
  }
@@ -2857,7 +2926,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2857
2926
  padding: 1px 6px;
2858
2927
  border-radius: 5px;
2859
2928
  background: var(--bg-sunken);
2860
- box-shadow: var(--neu-in-sm);
2929
+ box-shadow: var(--neu-shadow-inset);
2861
2930
  color: var(--accent-ink);
2862
2931
  margin: 0 2px;
2863
2932
  }
@@ -2867,7 +2936,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2867
2936
  padding: 1px 7px;
2868
2937
  border-radius: 5px;
2869
2938
  background: var(--bg-raised);
2870
- box-shadow: var(--neu-flat);
2939
+ box-shadow: var(--neu-shadow-subtle);
2871
2940
  border: 1px solid var(--border);
2872
2941
  color: var(--fg);
2873
2942
  margin: 0 2px;
@@ -2919,7 +2988,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2919
2988
  .typo-link.disabled {
2920
2989
  color: var(--fg-subtle);
2921
2990
  cursor: not-allowed;
2922
- pointer-events: none;
2991
+ pointer-events: auto;
2923
2992
  text-decoration: none;
2924
2993
  }
2925
2994
  .typo-link-ext {
@@ -2935,20 +3004,25 @@ input, textarea, select { font-family: inherit; color: inherit; }
2935
3004
  display: inline-flex;
2936
3005
  align-items: center;
2937
3006
  justify-content: center;
2938
- width: 22px;
2939
- height: 22px;
2940
- margin-left: 6px;
2941
- border-radius: 7px;
3007
+ width: 20px;
3008
+ height: 20px;
3009
+ margin-left: 5px;
3010
+ border-radius: 6px;
2942
3011
  cursor: pointer;
2943
3012
  color: var(--fg-subtle);
3013
+ line-height: 1;
2944
3014
  transition: color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
2945
- vertical-align: middle;
3015
+ vertical-align: -0.18em;
2946
3016
  user-select: none;
2947
3017
  }
3018
+ .typo-action > svg {
3019
+ display: block;
3020
+ flex-shrink: 0;
3021
+ }
2948
3022
  .typo-action:hover {
2949
3023
  color: var(--accent-ink);
2950
3024
  background: var(--bg);
2951
- box-shadow: var(--neu-flat);
3025
+ box-shadow: var(--neu-shadow-subtle);
2952
3026
  }
2953
3027
  .typo-action:focus-visible {
2954
3028
  outline: 2px solid var(--accent-glow);
@@ -2970,7 +3044,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2970
3044
  font: inherit;
2971
3045
  color: inherit;
2972
3046
  background: var(--bg-sunken);
2973
- box-shadow: var(--neu-in);
3047
+ box-shadow: var(--neu-shadow-inset-strong);
2974
3048
  border: none;
2975
3049
  outline: none;
2976
3050
  width: 100%;
@@ -2985,7 +3059,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
2985
3059
  font-family: inherit;
2986
3060
  }
2987
3061
  .typo-editor:focus {
2988
- box-shadow: var(--neu-in), 0 0 0 3px var(--accent-glow);
3062
+ box-shadow: var(--neu-shadow-inset-strong), 0 0 0 3px var(--accent-glow);
2989
3063
  }
2990
3064
  /* ---- Ellipsis ---- */
2991
3065
  .typo.ellipsis {
@@ -3025,6 +3099,30 @@ input, textarea, select { font-family: inherit; color: inherit; }
3025
3099
  user-select: none;
3026
3100
  }
3027
3101
  .typo-expand:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
3102
+ .typo-ellipsis-tooltip {
3103
+ display: block;
3104
+ box-sizing: border-box;
3105
+ max-width: min(520px, calc(100vw - 32px));
3106
+ padding: 7px 10px;
3107
+ border-radius: var(--r-sm);
3108
+ background: var(--bg-sunken);
3109
+ color: var(--fg);
3110
+ box-shadow: var(--neu-shadow-control);
3111
+ font-size: 12px;
3112
+ font-weight: 500;
3113
+ line-height: 1.55;
3114
+ white-space: normal;
3115
+ line-break: auto;
3116
+ text-wrap: wrap;
3117
+ text-align: justify;
3118
+ text-align-last: left;
3119
+ text-justify: inter-character;
3120
+ word-break: normal;
3121
+ overflow-wrap: anywhere;
3122
+ pointer-events: auto;
3123
+ animation: fadeIn var(--dur) var(--ease);
3124
+ z-index: 1000;
3125
+ }
3028
3126
  /* In dark mode, mark needs slightly higher contrast */
3029
3127
  [data-theme="dark"] .typo mark {
3030
3128
  background: color-mix(in oklch, var(--warning) 30%, transparent);
@@ -3044,7 +3142,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3044
3142
  padding: 4px;
3045
3143
  border: none;
3046
3144
  background: var(--bg);
3047
- box-shadow: var(--neu-flat);
3145
+ box-shadow: var(--neu-shadow-subtle);
3048
3146
  border-radius: 10px;
3049
3147
  cursor: pointer;
3050
3148
  transition: box-shadow var(--dur) var(--ease);
@@ -3052,7 +3150,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3052
3150
  font: inherit;
3053
3151
  }
3054
3152
  .cp-trigger:hover:not(:disabled) {
3055
- box-shadow: var(--neu-out);
3153
+ box-shadow: var(--neu-shadow-panel);
3056
3154
  }
3057
3155
  .cp-trigger:disabled {
3058
3156
  opacity: 0.5;
@@ -3074,7 +3172,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3074
3172
  width: 22px;
3075
3173
  height: 22px;
3076
3174
  border-radius: 6px;
3077
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), var(--neu-in-sm);
3175
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08), var(--neu-shadow-inset);
3078
3176
  background-clip: padding-box;
3079
3177
  }
3080
3178
  .cp-trigger.sm .cp-swatch { width: 18px; height: 18px; border-radius: 5px; }
@@ -3100,7 +3198,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3100
3198
  padding: 12px;
3101
3199
  background: var(--bg);
3102
3200
  border-radius: var(--r-md);
3103
- box-shadow: var(--neu-float);
3201
+ box-shadow: var(--neu-shadow-float);
3104
3202
  display: flex;
3105
3203
  flex-direction: column;
3106
3204
  gap: 10px;
@@ -3196,7 +3294,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3196
3294
  border: none;
3197
3295
  outline: none;
3198
3296
  background: var(--bg-sunken);
3199
- box-shadow: var(--neu-in-sm);
3297
+ box-shadow: var(--neu-shadow-inset);
3200
3298
  border-radius: 7px;
3201
3299
  font-family: var(--font-mono);
3202
3300
  font-size: 12px;
@@ -3204,7 +3302,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3204
3302
  text-transform: lowercase;
3205
3303
  }
3206
3304
  .cp-input:focus {
3207
- box-shadow: var(--neu-in-sm), 0 0 0 2px var(--accent-soft);
3305
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-soft);
3208
3306
  }
3209
3307
  .cp-presets {
3210
3308
  display: grid;
@@ -3229,7 +3327,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3229
3327
  }
3230
3328
  /* Dark mode tweaks */
3231
3329
  [data-theme="dark"] .cp-swatch {
3232
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), var(--neu-in-sm);
3330
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), var(--neu-shadow-inset);
3233
3331
  }
3234
3332
  [data-theme="dark"] .cp-preset {
3235
3333
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
@@ -3287,7 +3385,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3287
3385
  border: none; padding: 0;
3288
3386
  border-radius: 999px;
3289
3387
  background: var(--bg);
3290
- box-shadow: var(--neu-flat);
3388
+ box-shadow: var(--neu-shadow-subtle);
3291
3389
  position: relative;
3292
3390
  cursor: pointer;
3293
3391
  transition: transform var(--dur-fast) var(--ease);
@@ -3327,7 +3425,7 @@ input, textarea, select { font-family: inherit; color: inherit; }
3327
3425
  overflow: visible;
3328
3426
  }
3329
3427
  .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); }
3428
+ .win-controls.windows .win-btn:hover { background: var(--bg); box-shadow: var(--neu-shadow-inset); color: var(--fg); }
3331
3429
  .win-controls.windows .win-btn.close:hover {
3332
3430
  background: var(--danger);
3333
3431
  color: white;
@@ -3363,11 +3461,11 @@ input, textarea, select { font-family: inherit; color: inherit; }
3363
3461
  width: 100%;
3364
3462
  transition: all var(--dur-fast) var(--ease);
3365
3463
  }
3366
- .sidebar-item:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-flat); }
3464
+ .sidebar-item:hover { color: var(--fg); background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
3367
3465
  .sidebar-item.active {
3368
3466
  color: var(--accent-ink);
3369
3467
  background: var(--bg);
3370
- box-shadow: var(--neu-in-sm);
3468
+ box-shadow: var(--neu-shadow-inset);
3371
3469
  font-weight: 500;
3372
3470
  }
3373
3471
  .sidebar-icon { display: inline-flex; flex-shrink: 0; }
@@ -3401,3 +3499,445 @@ input, textarea, select { font-family: inherit; color: inherit; }
3401
3499
  min-width: 0;
3402
3500
  overflow: auto;
3403
3501
  }
3502
+ /* ============ ThemePanel ============ */
3503
+ .theme-panel {
3504
+ width: min(100%, 340px);
3505
+ display: flex;
3506
+ flex-direction: column;
3507
+ gap: var(--gap-3);
3508
+ box-sizing: border-box;
3509
+ padding: var(--gap-4);
3510
+ border-radius: var(--r-xl);
3511
+ color: var(--fg);
3512
+ background: var(--bg);
3513
+ box-shadow: var(--neu-shadow-lift);
3514
+ }
3515
+ .theme-panel.compact {
3516
+ width: min(100%, 300px);
3517
+ gap: var(--gap-2);
3518
+ padding: var(--gap-3);
3519
+ }
3520
+ .theme-panel-head {
3521
+ display: flex;
3522
+ flex-direction: column;
3523
+ gap: 4px;
3524
+ }
3525
+ .theme-panel-title {
3526
+ display: inline-flex;
3527
+ align-items: center;
3528
+ gap: 8px;
3529
+ min-width: 0;
3530
+ color: var(--fg);
3531
+ font-size: 14px;
3532
+ font-weight: 700;
3533
+ }
3534
+ .theme-panel-title svg {
3535
+ flex: 0 0 auto;
3536
+ color: var(--accent);
3537
+ }
3538
+ .theme-panel-title span {
3539
+ min-width: 0;
3540
+ overflow: hidden;
3541
+ text-overflow: ellipsis;
3542
+ white-space: nowrap;
3543
+ }
3544
+ .theme-panel-desc {
3545
+ font-size: 12px;
3546
+ color: var(--fg-muted);
3547
+ }
3548
+ .theme-panel-row {
3549
+ display: flex;
3550
+ flex-direction: column;
3551
+ gap: 8px;
3552
+ padding-top: var(--gap-3);
3553
+ border-top: 1px solid var(--divider);
3554
+ }
3555
+ .theme-panel-head + .theme-panel-row,
3556
+ .theme-panel-row:first-child {
3557
+ border-top: none;
3558
+ padding-top: 0;
3559
+ }
3560
+ .theme-panel-label {
3561
+ display: flex;
3562
+ align-items: center;
3563
+ justify-content: space-between;
3564
+ gap: 10px;
3565
+ font-size: 12px;
3566
+ font-weight: 600;
3567
+ color: var(--fg);
3568
+ }
3569
+ .theme-panel-label > span:last-child:not(:first-child) {
3570
+ min-width: 0;
3571
+ max-width: 54%;
3572
+ overflow: hidden;
3573
+ text-overflow: ellipsis;
3574
+ white-space: nowrap;
3575
+ padding: 2px 8px;
3576
+ border-radius: var(--r-pill);
3577
+ color: var(--accent-ink);
3578
+ background: var(--bg);
3579
+ box-shadow: var(--neu-shadow-inset);
3580
+ font-family: var(--font-mono);
3581
+ font-size: 11px;
3582
+ font-weight: 500;
3583
+ }
3584
+ .theme-panel-presets {
3585
+ display: grid;
3586
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3587
+ gap: var(--gap-2);
3588
+ }
3589
+ .theme-panel-preset-shell {
3590
+ position: relative;
3591
+ min-width: 0;
3592
+ }
3593
+ .theme-panel .theme-panel-preset.btn {
3594
+ min-width: 0;
3595
+ width: 100%;
3596
+ height: auto;
3597
+ min-height: 74px;
3598
+ justify-content: stretch;
3599
+ align-items: stretch;
3600
+ flex-direction: column;
3601
+ gap: 8px;
3602
+ padding: 9px;
3603
+ color: var(--fg-muted);
3604
+ background: var(--bg);
3605
+ box-shadow: var(--neu-shadow-control);
3606
+ text-align: left;
3607
+ white-space: normal;
3608
+ transition:
3609
+ color var(--dur-fast) var(--ease),
3610
+ box-shadow var(--dur-fast) var(--ease),
3611
+ transform var(--dur-fast) var(--ease);
3612
+ }
3613
+ .theme-panel .theme-panel-preset.btn:hover {
3614
+ color: var(--fg);
3615
+ box-shadow: var(--neu-shadow-panel);
3616
+ transform: translateY(-1px);
3617
+ }
3618
+ .theme-panel .theme-panel-preset.btn.active {
3619
+ color: var(--accent-ink);
3620
+ box-shadow: var(--neu-shadow-inset), 0 0 0 1px var(--accent-glow);
3621
+ transform: none;
3622
+ }
3623
+ .theme-panel .theme-panel-preset.btn.active:hover {
3624
+ color: var(--accent-ink);
3625
+ box-shadow: var(--neu-shadow-inset), 0 0 0 1px var(--accent-glow);
3626
+ }
3627
+ .theme-panel .theme-panel-preset-shell.deletable .theme-panel-preset.btn {
3628
+ padding-right: 28px;
3629
+ }
3630
+ .theme-panel .theme-panel-preset-delete.btn {
3631
+ position: absolute;
3632
+ top: 6px;
3633
+ right: 6px;
3634
+ width: 22px;
3635
+ height: 22px;
3636
+ min-width: 22px;
3637
+ padding: 0;
3638
+ color: var(--fg-subtle);
3639
+ background: var(--bg);
3640
+ box-shadow: var(--neu-shadow-control);
3641
+ opacity: 0;
3642
+ transform: scale(0.92);
3643
+ }
3644
+ .theme-panel-preset-shell:hover .theme-panel-preset-delete.btn,
3645
+ .theme-panel-preset-shell:focus-within .theme-panel-preset-delete.btn {
3646
+ opacity: 1;
3647
+ transform: scale(1);
3648
+ }
3649
+ .theme-panel .theme-panel-preset-delete.btn:hover {
3650
+ box-shadow: var(--neu-shadow-inset);
3651
+ }
3652
+ .theme-panel-preset-ink {
3653
+ display: grid;
3654
+ grid-template-columns: 1fr 1fr 0.7fr;
3655
+ gap: 4px;
3656
+ width: 100%;
3657
+ }
3658
+ .theme-panel-preset-ink span {
3659
+ height: 18px;
3660
+ min-width: 0;
3661
+ border-radius: var(--r-pill);
3662
+ box-shadow: inset 0 0 0 1px var(--divider);
3663
+ }
3664
+ .theme-panel-preset-copy {
3665
+ display: flex;
3666
+ flex-direction: column;
3667
+ gap: 2px;
3668
+ min-width: 0;
3669
+ width: 100%;
3670
+ }
3671
+ .theme-panel-preset-copy > span {
3672
+ min-width: 0;
3673
+ overflow: hidden;
3674
+ text-overflow: ellipsis;
3675
+ white-space: nowrap;
3676
+ color: inherit;
3677
+ font-size: 12px;
3678
+ font-weight: 700;
3679
+ }
3680
+ .theme-panel-preset-copy small {
3681
+ min-width: 0;
3682
+ overflow: hidden;
3683
+ text-overflow: ellipsis;
3684
+ white-space: nowrap;
3685
+ color: var(--fg-subtle);
3686
+ font-size: 10px;
3687
+ font-weight: 500;
3688
+ }
3689
+ .theme-panel-swatches {
3690
+ display: flex;
3691
+ align-items: center;
3692
+ flex-wrap: wrap;
3693
+ gap: 8px;
3694
+ }
3695
+ .theme-panel .theme-panel-swatch.btn {
3696
+ width: 28px;
3697
+ height: 28px;
3698
+ min-width: 28px;
3699
+ padding: 0;
3700
+ border-radius: var(--r-pill);
3701
+ box-shadow: var(--neu-shadow-subtle);
3702
+ }
3703
+ .theme-panel-swatch.active {
3704
+ box-shadow: var(--neu-shadow-inset), 0 0 0 2px var(--accent-glow);
3705
+ }
3706
+ .theme-panel .radio-group.segmented {
3707
+ width: 100%;
3708
+ }
3709
+ .theme-panel .btn.block {
3710
+ margin-top: var(--gap-1);
3711
+ }
3712
+ .theme-panel-create {
3713
+ display: flex;
3714
+ flex-direction: column;
3715
+ gap: 10px;
3716
+ padding: 10px;
3717
+ border-radius: var(--r-md);
3718
+ background: var(--bg);
3719
+ box-shadow: var(--neu-shadow-inset);
3720
+ }
3721
+ .theme-panel-create-head {
3722
+ display: flex;
3723
+ align-items: center;
3724
+ justify-content: space-between;
3725
+ gap: 10px;
3726
+ }
3727
+ .theme-panel-create-head > div {
3728
+ min-width: 0;
3729
+ display: flex;
3730
+ flex-direction: column;
3731
+ gap: 2px;
3732
+ }
3733
+ .theme-panel-create-head span {
3734
+ color: var(--fg);
3735
+ font-size: 12px;
3736
+ font-weight: 700;
3737
+ }
3738
+ .theme-panel-create-head small {
3739
+ min-width: 0;
3740
+ color: var(--fg-subtle);
3741
+ font-family: var(--font-mono);
3742
+ font-size: 10px;
3743
+ overflow: hidden;
3744
+ text-overflow: ellipsis;
3745
+ white-space: nowrap;
3746
+ }
3747
+ .theme-panel-create-field {
3748
+ min-width: 0;
3749
+ display: flex;
3750
+ flex-direction: column;
3751
+ gap: 6px;
3752
+ color: var(--fg-subtle);
3753
+ font-family: var(--font-mono);
3754
+ font-size: 10px;
3755
+ }
3756
+ .theme-panel-create-field .radio-group.segmented {
3757
+ width: 100%;
3758
+ }
3759
+ .theme-panel-create-mode.radio-group.segmented {
3760
+ width: 100%;
3761
+ }
3762
+ .theme-panel-create-grid {
3763
+ display: grid;
3764
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3765
+ gap: 8px;
3766
+ }
3767
+ .theme-panel-create-grid .cp-trigger,
3768
+ .theme-panel-create-grid .cp-custom-trigger {
3769
+ width: 100%;
3770
+ }
3771
+ .theme-panel-create-sliders {
3772
+ display: flex;
3773
+ flex-direction: column;
3774
+ gap: 8px;
3775
+ padding: 2px 0;
3776
+ }
3777
+ .theme-panel-shadow {
3778
+ gap: 7px;
3779
+ }
3780
+ .theme-panel-create-preview {
3781
+ min-height: 36px;
3782
+ display: flex;
3783
+ align-items: center;
3784
+ justify-content: space-between;
3785
+ gap: 10px;
3786
+ padding: 7px 9px;
3787
+ border-radius: var(--preview-radius, var(--r-md));
3788
+ color: var(--preview-fg, var(--fg));
3789
+ background: var(--preview-bg, var(--bg));
3790
+ box-shadow:
3791
+ 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)),
3792
+ 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));
3793
+ font-family: var(--preview-font, var(--font-sans));
3794
+ font-size: 12px;
3795
+ font-weight: 700;
3796
+ }
3797
+ .theme-panel-create-preview-label {
3798
+ min-width: 0;
3799
+ display: inline-flex;
3800
+ align-items: center;
3801
+ gap: 7px;
3802
+ color: inherit;
3803
+ }
3804
+ .theme-panel-create-preview-label > span {
3805
+ min-width: 0;
3806
+ overflow: hidden;
3807
+ text-overflow: ellipsis;
3808
+ white-space: nowrap;
3809
+ }
3810
+ .theme-panel-create-preview i {
3811
+ flex: 0 0 auto;
3812
+ width: 20px;
3813
+ height: 20px;
3814
+ border-radius: var(--r-pill);
3815
+ background: var(--preview-accent, var(--accent));
3816
+ box-shadow:
3817
+ inset 1px 1px 2px color-mix(in oklch, var(--preview-accent, var(--accent)) 50%, white),
3818
+ 0 0 0 4px var(--preview-accent-glow, var(--accent-glow));
3819
+ }
3820
+ .theme-panel-create-actions {
3821
+ display: grid;
3822
+ grid-template-columns: 0.85fr 1fr;
3823
+ gap: 8px;
3824
+ }
3825
+ .theme-panel-advanced {
3826
+ display: flex;
3827
+ flex-direction: column;
3828
+ gap: 12px;
3829
+ padding-top: 2px;
3830
+ }
3831
+ .theme-panel-advanced-section {
3832
+ display: flex;
3833
+ flex-direction: column;
3834
+ gap: 8px;
3835
+ padding-top: 10px;
3836
+ border-top: 1px solid var(--divider);
3837
+ }
3838
+ .theme-panel-advanced-section.compact {
3839
+ padding-top: 0;
3840
+ border-top: none;
3841
+ }
3842
+ .theme-panel-advanced-title {
3843
+ display: flex;
3844
+ align-items: baseline;
3845
+ justify-content: space-between;
3846
+ gap: 8px;
3847
+ }
3848
+ .theme-panel-advanced-title span {
3849
+ min-width: 0;
3850
+ color: var(--fg);
3851
+ font-size: 11px;
3852
+ font-weight: 700;
3853
+ }
3854
+ .theme-panel-advanced-title small {
3855
+ min-width: 0;
3856
+ color: var(--fg-subtle);
3857
+ font-family: var(--font-mono);
3858
+ font-size: 9px;
3859
+ overflow: hidden;
3860
+ text-overflow: ellipsis;
3861
+ white-space: nowrap;
3862
+ }
3863
+ .theme-panel-token-grid {
3864
+ display: flex;
3865
+ flex-direction: column;
3866
+ gap: 7px;
3867
+ }
3868
+ .theme-panel-token-field {
3869
+ min-width: 0;
3870
+ display: grid;
3871
+ grid-template-columns: 88px minmax(0, 1fr);
3872
+ gap: 8px;
3873
+ align-items: center;
3874
+ }
3875
+ .theme-panel-token-label {
3876
+ min-width: 0;
3877
+ display: flex;
3878
+ flex-direction: column;
3879
+ gap: 2px;
3880
+ }
3881
+ .theme-panel-token-label span {
3882
+ color: var(--fg-muted);
3883
+ font-size: 10px;
3884
+ font-weight: 650;
3885
+ white-space: nowrap;
3886
+ }
3887
+ .theme-panel-token-label code {
3888
+ color: var(--fg-subtle);
3889
+ font-family: var(--font-mono);
3890
+ font-size: 9px;
3891
+ overflow: hidden;
3892
+ text-overflow: ellipsis;
3893
+ white-space: nowrap;
3894
+ }
3895
+ .theme-panel-token-input {
3896
+ min-width: 0;
3897
+ display: grid;
3898
+ grid-template-columns: 24px minmax(0, 1fr);
3899
+ gap: 7px;
3900
+ align-items: center;
3901
+ }
3902
+ .theme-panel-token-field.scale {
3903
+ align-items: start;
3904
+ }
3905
+ .theme-panel-token-scale {
3906
+ min-width: 0;
3907
+ display: grid;
3908
+ grid-template-columns: 64px minmax(0, 1fr);
3909
+ gap: 7px;
3910
+ align-items: center;
3911
+ }
3912
+ .theme-panel-token-picker {
3913
+ width: 24px;
3914
+ height: 24px;
3915
+ }
3916
+ .theme-panel-token-picker .cp-custom-trigger {
3917
+ width: 24px;
3918
+ height: 24px;
3919
+ display: block;
3920
+ border-radius: 7px;
3921
+ }
3922
+ .theme-panel-token-swatch {
3923
+ display: block;
3924
+ width: 24px;
3925
+ height: 24px;
3926
+ border-radius: 7px;
3927
+ box-shadow: var(--neu-shadow-inset), inset 0 0 0 1px var(--border);
3928
+ transition:
3929
+ box-shadow var(--dur-fast) var(--ease),
3930
+ transform var(--dur-fast) var(--ease);
3931
+ }
3932
+ .theme-panel-token-picker .cp-custom-trigger:hover .theme-panel-token-swatch {
3933
+ box-shadow: var(--neu-shadow-control), inset 0 0 0 1px var(--border);
3934
+ transform: translateY(-1px);
3935
+ }
3936
+ .theme-panel-token-input .input-wrap,
3937
+ .theme-panel-create-field .input-wrap {
3938
+ min-width: 0;
3939
+ }
3940
+ .theme-panel-token-input .input {
3941
+ font-family: var(--font-mono);
3942
+ font-size: 11px;
3943
+ }