@tollerud/ui 1.1.4 → 3.0.0

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 (361) hide show
  1. package/AGENTS.md +34 -11
  2. package/CHANGELOG.md +376 -0
  3. package/COMPONENTS.md +951 -0
  4. package/GETTING_STARTED.md +159 -0
  5. package/README.md +51 -43
  6. package/SKILL.md +55 -19
  7. package/components.json +18 -0
  8. package/dist/accordion.d.ts +20 -0
  9. package/dist/accordion.js +5 -0
  10. package/dist/accordion.js.map +1 -0
  11. package/dist/action-diff.d.ts +26 -0
  12. package/dist/action-diff.js +5 -0
  13. package/dist/action-diff.js.map +1 -0
  14. package/dist/action-row.d.ts +36 -0
  15. package/dist/action-row.js +6 -0
  16. package/dist/action-row.js.map +1 -0
  17. package/dist/alert-inbox.d.ts +23 -0
  18. package/dist/alert-inbox.js +6 -0
  19. package/dist/alert-inbox.js.map +1 -0
  20. package/dist/alert.d.ts +33 -0
  21. package/dist/alert.js +5 -0
  22. package/dist/alert.js.map +1 -0
  23. package/dist/approval-card.d.ts +27 -0
  24. package/dist/approval-card.js +5 -0
  25. package/dist/approval-card.js.map +1 -0
  26. package/dist/area-chart.d.ts +10 -0
  27. package/dist/area-chart.js +5 -0
  28. package/dist/area-chart.js.map +1 -0
  29. package/dist/avatar.d.ts +27 -0
  30. package/dist/avatar.js +5 -0
  31. package/dist/avatar.js.map +1 -0
  32. package/dist/backup-status-panel.d.ts +25 -0
  33. package/dist/backup-status-panel.js +6 -0
  34. package/dist/backup-status-panel.js.map +1 -0
  35. package/dist/badge.d.ts +17 -0
  36. package/dist/badge.js +5 -0
  37. package/dist/badge.js.map +1 -0
  38. package/dist/bar-chart.d.ts +15 -0
  39. package/dist/bar-chart.js +5 -0
  40. package/dist/bar-chart.js.map +1 -0
  41. package/dist/bento-dashboard.d.ts +30 -0
  42. package/dist/bento-dashboard.js +5 -0
  43. package/dist/bento-dashboard.js.map +1 -0
  44. package/dist/breadcrumb.d.ts +16 -0
  45. package/dist/breadcrumb.js +5 -0
  46. package/dist/breadcrumb.js.map +1 -0
  47. package/dist/button.d.ts +29 -0
  48. package/dist/button.js +5 -0
  49. package/dist/button.js.map +1 -0
  50. package/dist/card.d.ts +10 -0
  51. package/dist/card.js +5 -0
  52. package/dist/card.js.map +1 -0
  53. package/dist/checkbox.d.ts +9 -0
  54. package/dist/checkbox.js +5 -0
  55. package/dist/checkbox.js.map +1 -0
  56. package/dist/chunk-2QWKOCWF.js +79 -0
  57. package/dist/chunk-2QWKOCWF.js.map +1 -0
  58. package/dist/chunk-3TGMGBKM.js +393 -0
  59. package/dist/chunk-3TGMGBKM.js.map +1 -0
  60. package/dist/chunk-3XTZPDNV.js +94 -0
  61. package/dist/chunk-3XTZPDNV.js.map +1 -0
  62. package/dist/chunk-435JHF7G.js +65 -0
  63. package/dist/chunk-435JHF7G.js.map +1 -0
  64. package/dist/chunk-4PA2ACNF.js +52 -0
  65. package/dist/chunk-4PA2ACNF.js.map +1 -0
  66. package/dist/chunk-5GWHUJ5D.js +29 -0
  67. package/dist/chunk-5GWHUJ5D.js.map +1 -0
  68. package/dist/chunk-6FUKJD3W.js +123 -0
  69. package/dist/chunk-6FUKJD3W.js.map +1 -0
  70. package/dist/chunk-6IS2AYYG.js +106 -0
  71. package/dist/chunk-6IS2AYYG.js.map +1 -0
  72. package/dist/chunk-6PZKU6ZL.js +78 -0
  73. package/dist/chunk-6PZKU6ZL.js.map +1 -0
  74. package/dist/chunk-6SKTH45H.js +75 -0
  75. package/dist/chunk-6SKTH45H.js.map +1 -0
  76. package/dist/chunk-6UXW5YUC.js +77 -0
  77. package/dist/chunk-6UXW5YUC.js.map +1 -0
  78. package/dist/chunk-7EP2T3OW.js +52 -0
  79. package/dist/chunk-7EP2T3OW.js.map +1 -0
  80. package/dist/chunk-7J5QXUQN.js +38 -0
  81. package/dist/chunk-7J5QXUQN.js.map +1 -0
  82. package/dist/chunk-7TOT5ME3.js +53 -0
  83. package/dist/chunk-7TOT5ME3.js.map +1 -0
  84. package/dist/chunk-A6L5C3IJ.js +47 -0
  85. package/dist/chunk-A6L5C3IJ.js.map +1 -0
  86. package/dist/chunk-ANW6J6PV.js +42 -0
  87. package/dist/chunk-ANW6J6PV.js.map +1 -0
  88. package/dist/chunk-APFFKNPS.js +80 -0
  89. package/dist/chunk-APFFKNPS.js.map +1 -0
  90. package/dist/chunk-AZADSX4Z.js +85 -0
  91. package/dist/chunk-AZADSX4Z.js.map +1 -0
  92. package/dist/chunk-BPCH5LJ3.js +36 -0
  93. package/dist/chunk-BPCH5LJ3.js.map +1 -0
  94. package/dist/chunk-CBQ63EBL.js +85 -0
  95. package/dist/chunk-CBQ63EBL.js.map +1 -0
  96. package/dist/chunk-CDI7353B.js +40 -0
  97. package/dist/chunk-CDI7353B.js.map +1 -0
  98. package/dist/chunk-CKNWXYMA.js +53 -0
  99. package/dist/chunk-CKNWXYMA.js.map +1 -0
  100. package/dist/chunk-DFM7UUKB.js +79 -0
  101. package/dist/chunk-DFM7UUKB.js.map +1 -0
  102. package/dist/chunk-DGCRHVWW.js +84 -0
  103. package/dist/chunk-DGCRHVWW.js.map +1 -0
  104. package/dist/chunk-DNJI65VQ.js +22 -0
  105. package/dist/chunk-DNJI65VQ.js.map +1 -0
  106. package/dist/chunk-DOUDJU4P.js +63 -0
  107. package/dist/chunk-DOUDJU4P.js.map +1 -0
  108. package/dist/chunk-DRCMGIQ6.js +64 -0
  109. package/dist/chunk-DRCMGIQ6.js.map +1 -0
  110. package/dist/chunk-DZOBXK2S.js +28 -0
  111. package/dist/chunk-DZOBXK2S.js.map +1 -0
  112. package/dist/chunk-EN4OJCEF.js +54 -0
  113. package/dist/chunk-EN4OJCEF.js.map +1 -0
  114. package/dist/chunk-EVHZFYWX.js +33 -0
  115. package/dist/chunk-EVHZFYWX.js.map +1 -0
  116. package/dist/chunk-FGXOV2QH.js +23 -0
  117. package/dist/chunk-FGXOV2QH.js.map +1 -0
  118. package/dist/chunk-G2VKWNZA.js +53 -0
  119. package/dist/chunk-G2VKWNZA.js.map +1 -0
  120. package/dist/chunk-GTM2DE4C.js +156 -0
  121. package/dist/chunk-GTM2DE4C.js.map +1 -0
  122. package/dist/chunk-H3ZVGTJM.js +165 -0
  123. package/dist/chunk-H3ZVGTJM.js.map +1 -0
  124. package/dist/chunk-HWAWUEHC.js +28 -0
  125. package/dist/chunk-HWAWUEHC.js.map +1 -0
  126. package/dist/chunk-HWJVRTWO.js +36 -0
  127. package/dist/chunk-HWJVRTWO.js.map +1 -0
  128. package/dist/chunk-HYQGOC2E.js +79 -0
  129. package/dist/chunk-HYQGOC2E.js.map +1 -0
  130. package/dist/chunk-ILADNTUB.js +77 -0
  131. package/dist/chunk-ILADNTUB.js.map +1 -0
  132. package/dist/chunk-ISHZ6ZPJ.js +31 -0
  133. package/dist/chunk-ISHZ6ZPJ.js.map +1 -0
  134. package/dist/chunk-JRFSUVSO.js +66 -0
  135. package/dist/chunk-JRFSUVSO.js.map +1 -0
  136. package/dist/chunk-KI6OTVID.js +91 -0
  137. package/dist/chunk-KI6OTVID.js.map +1 -0
  138. package/dist/chunk-LUM2YJBH.js +73 -0
  139. package/dist/chunk-LUM2YJBH.js.map +1 -0
  140. package/dist/chunk-NHPISZWS.js +71 -0
  141. package/dist/chunk-NHPISZWS.js.map +1 -0
  142. package/dist/chunk-NOLWJJHT.js +52 -0
  143. package/dist/chunk-NOLWJJHT.js.map +1 -0
  144. package/dist/chunk-NPVINX3Q.js +20 -0
  145. package/dist/chunk-NPVINX3Q.js.map +1 -0
  146. package/dist/chunk-NSMU66ZX.js +47 -0
  147. package/dist/chunk-NSMU66ZX.js.map +1 -0
  148. package/dist/chunk-O57QMLNI.js +68 -0
  149. package/dist/chunk-O57QMLNI.js.map +1 -0
  150. package/dist/chunk-O5SWPHUQ.js +79 -0
  151. package/dist/chunk-O5SWPHUQ.js.map +1 -0
  152. package/dist/chunk-OGVSZ7NV.js +53 -0
  153. package/dist/chunk-OGVSZ7NV.js.map +1 -0
  154. package/dist/chunk-OONIUDST.js +48 -0
  155. package/dist/chunk-OONIUDST.js.map +1 -0
  156. package/dist/chunk-PLF3BBQI.js +139 -0
  157. package/dist/chunk-PLF3BBQI.js.map +1 -0
  158. package/dist/chunk-Q74VRQEX.js +26 -0
  159. package/dist/chunk-Q74VRQEX.js.map +1 -0
  160. package/dist/chunk-QEHTPQHL.js +35 -0
  161. package/dist/chunk-QEHTPQHL.js.map +1 -0
  162. package/dist/chunk-RJTDQOT2.js +73 -0
  163. package/dist/chunk-RJTDQOT2.js.map +1 -0
  164. package/dist/chunk-RQ3RXKAZ.js +203 -0
  165. package/dist/chunk-RQ3RXKAZ.js.map +1 -0
  166. package/dist/chunk-RWJELAS6.js +46 -0
  167. package/dist/chunk-RWJELAS6.js.map +1 -0
  168. package/dist/chunk-RZK2S2OO.js +126 -0
  169. package/dist/chunk-RZK2S2OO.js.map +1 -0
  170. package/dist/chunk-SAP7JSSO.js +106 -0
  171. package/dist/chunk-SAP7JSSO.js.map +1 -0
  172. package/dist/chunk-T3TQPOVM.js +79 -0
  173. package/dist/chunk-T3TQPOVM.js.map +1 -0
  174. package/dist/chunk-T56TTOI6.js +53 -0
  175. package/dist/chunk-T56TTOI6.js.map +1 -0
  176. package/dist/chunk-T7EFDE2L.js +36 -0
  177. package/dist/chunk-T7EFDE2L.js.map +1 -0
  178. package/dist/chunk-V3P5QLLX.js +154 -0
  179. package/dist/chunk-V3P5QLLX.js.map +1 -0
  180. package/dist/chunk-VTRUUT5K.js +31 -0
  181. package/dist/chunk-VTRUUT5K.js.map +1 -0
  182. package/dist/chunk-WDANALHD.js +95 -0
  183. package/dist/chunk-WDANALHD.js.map +1 -0
  184. package/dist/chunk-WSQNPRGN.js +12 -0
  185. package/dist/chunk-WSQNPRGN.js.map +1 -0
  186. package/dist/chunk-XR5QBVEV.js +56 -0
  187. package/dist/chunk-XR5QBVEV.js.map +1 -0
  188. package/dist/chunk-YYWODLER.js +111 -0
  189. package/dist/chunk-YYWODLER.js.map +1 -0
  190. package/dist/chunk-ZOXO3G3I.js +50 -0
  191. package/dist/chunk-ZOXO3G3I.js.map +1 -0
  192. package/dist/code-block.d.ts +14 -0
  193. package/dist/code-block.js +5 -0
  194. package/dist/code-block.js.map +1 -0
  195. package/dist/combobox.d.ts +26 -0
  196. package/dist/combobox.js +5 -0
  197. package/dist/combobox.js.map +1 -0
  198. package/dist/command-menu.d.ts +52 -0
  199. package/dist/command-menu.js +7 -0
  200. package/dist/command-menu.js.map +1 -0
  201. package/dist/container.d.ts +9 -0
  202. package/dist/container.js +5 -0
  203. package/dist/container.js.map +1 -0
  204. package/dist/cta-band.d.ts +12 -0
  205. package/dist/cta-band.js +5 -0
  206. package/dist/cta-band.js.map +1 -0
  207. package/dist/data-table.d.ts +58 -0
  208. package/dist/data-table.js +12 -0
  209. package/dist/data-table.js.map +1 -0
  210. package/dist/date-picker.d.ts +20 -0
  211. package/dist/date-picker.js +5 -0
  212. package/dist/date-picker.js.map +1 -0
  213. package/dist/dialog.d.ts +21 -0
  214. package/dist/dialog.js +5 -0
  215. package/dist/dialog.js.map +1 -0
  216. package/dist/divider.d.ts +12 -0
  217. package/dist/divider.js +5 -0
  218. package/dist/divider.js.map +1 -0
  219. package/dist/docker-stack-card.d.ts +21 -0
  220. package/dist/docker-stack-card.js +6 -0
  221. package/dist/docker-stack-card.js.map +1 -0
  222. package/dist/donut.d.ts +15 -0
  223. package/dist/donut.js +5 -0
  224. package/dist/donut.js.map +1 -0
  225. package/dist/dropdown-menu.d.ts +15 -0
  226. package/dist/dropdown-menu.js +5 -0
  227. package/dist/dropdown-menu.js.map +1 -0
  228. package/dist/empty.d.ts +12 -0
  229. package/dist/empty.js +5 -0
  230. package/dist/empty.js.map +1 -0
  231. package/dist/feature-card.d.ts +11 -0
  232. package/dist/feature-card.js +6 -0
  233. package/dist/feature-card.js.map +1 -0
  234. package/dist/file-upload.d.ts +20 -0
  235. package/dist/file-upload.js +5 -0
  236. package/dist/file-upload.js.map +1 -0
  237. package/dist/footer.d.ts +35 -0
  238. package/dist/footer.js +5 -0
  239. package/dist/footer.js.map +1 -0
  240. package/dist/form-row.d.ts +15 -0
  241. package/dist/form-row.js +5 -0
  242. package/dist/form-row.js.map +1 -0
  243. package/dist/glow-card.d.ts +14 -0
  244. package/dist/glow-card.js +5 -0
  245. package/dist/glow-card.js.map +1 -0
  246. package/dist/hero-block.d.ts +16 -0
  247. package/dist/hero-block.js +7 -0
  248. package/dist/hero-block.js.map +1 -0
  249. package/dist/host-card.d.ts +27 -0
  250. package/dist/host-card.js +6 -0
  251. package/dist/host-card.js.map +1 -0
  252. package/dist/incident-card.d.ts +23 -0
  253. package/dist/incident-card.js +5 -0
  254. package/dist/incident-card.js.map +1 -0
  255. package/dist/index.d.ts +76 -960
  256. package/dist/index.js +68 -3812
  257. package/dist/index.js.map +1 -1
  258. package/dist/input.d.ts +10 -0
  259. package/dist/input.js +5 -0
  260. package/dist/input.js.map +1 -0
  261. package/dist/kbd.d.ts +24 -0
  262. package/dist/kbd.js +5 -0
  263. package/dist/kbd.js.map +1 -0
  264. package/dist/log-viewer.d.ts +35 -0
  265. package/dist/log-viewer.js +5 -0
  266. package/dist/log-viewer.js.map +1 -0
  267. package/dist/meter.d.ts +23 -0
  268. package/dist/meter.js +5 -0
  269. package/dist/meter.js.map +1 -0
  270. package/dist/noir-glow-background.d.ts +50 -0
  271. package/dist/noir-glow-background.js +4 -0
  272. package/dist/noir-glow-background.js.map +1 -0
  273. package/dist/pagination.d.ts +16 -0
  274. package/dist/pagination.js +5 -0
  275. package/dist/pagination.js.map +1 -0
  276. package/dist/panel.d.ts +12 -0
  277. package/dist/panel.js +5 -0
  278. package/dist/panel.js.map +1 -0
  279. package/dist/password-input.d.ts +10 -0
  280. package/dist/password-input.js +5 -0
  281. package/dist/password-input.js.map +1 -0
  282. package/dist/pill.d.ts +14 -0
  283. package/dist/pill.js +5 -0
  284. package/dist/pill.js.map +1 -0
  285. package/dist/pricing-card.d.ts +20 -0
  286. package/dist/pricing-card.js +6 -0
  287. package/dist/pricing-card.js.map +1 -0
  288. package/dist/progress.d.ts +6 -0
  289. package/dist/progress.js +5 -0
  290. package/dist/progress.js.map +1 -0
  291. package/dist/radio-group.d.ts +18 -0
  292. package/dist/radio-group.js +5 -0
  293. package/dist/radio-group.js.map +1 -0
  294. package/dist/rollback-plan.d.ts +23 -0
  295. package/dist/rollback-plan.js +5 -0
  296. package/dist/rollback-plan.js.map +1 -0
  297. package/dist/segmented.d.ts +17 -0
  298. package/dist/segmented.js +5 -0
  299. package/dist/segmented.js.map +1 -0
  300. package/dist/select.d.ts +18 -0
  301. package/dist/select.js +5 -0
  302. package/dist/select.js.map +1 -0
  303. package/dist/service-health-card.d.ts +21 -0
  304. package/dist/service-health-card.js +6 -0
  305. package/dist/service-health-card.js.map +1 -0
  306. package/dist/sheet.d.ts +25 -0
  307. package/dist/sheet.js +5 -0
  308. package/dist/sheet.js.map +1 -0
  309. package/dist/skeleton.d.ts +5 -0
  310. package/dist/skeleton.js +5 -0
  311. package/dist/skeleton.js.map +1 -0
  312. package/dist/slider.d.ts +12 -0
  313. package/dist/slider.js +5 -0
  314. package/dist/slider.js.map +1 -0
  315. package/dist/sparkline.d.ts +16 -0
  316. package/dist/sparkline.js +5 -0
  317. package/dist/sparkline.js.map +1 -0
  318. package/dist/stat-card.d.ts +15 -0
  319. package/dist/stat-card.js +5 -0
  320. package/dist/stat-card.js.map +1 -0
  321. package/dist/status-dot.d.ts +13 -0
  322. package/dist/status-dot.js +5 -0
  323. package/dist/status-dot.js.map +1 -0
  324. package/dist/stepper.d.ts +16 -0
  325. package/dist/stepper.js +5 -0
  326. package/dist/stepper.js.map +1 -0
  327. package/dist/switch.d.ts +9 -0
  328. package/dist/switch.js +5 -0
  329. package/dist/switch.js.map +1 -0
  330. package/dist/tabs.d.ts +9 -0
  331. package/dist/tabs.js +5 -0
  332. package/dist/tabs.js.map +1 -0
  333. package/dist/tag-input.d.ts +20 -0
  334. package/dist/tag-input.js +5 -0
  335. package/dist/tag-input.js.map +1 -0
  336. package/dist/textarea.d.ts +10 -0
  337. package/dist/textarea.js +5 -0
  338. package/dist/textarea.js.map +1 -0
  339. package/dist/timeline.d.ts +30 -0
  340. package/dist/timeline.js +5 -0
  341. package/dist/timeline.js.map +1 -0
  342. package/dist/toaster.d.ts +10 -0
  343. package/dist/toaster.js +4 -0
  344. package/dist/toaster.js.map +1 -0
  345. package/dist/tooltip.d.ts +12 -0
  346. package/dist/tooltip.js +5 -0
  347. package/dist/tooltip.js.map +1 -0
  348. package/dist/utils.d.ts +5 -0
  349. package/dist/utils.js +4 -0
  350. package/dist/utils.js.map +1 -0
  351. package/globals-layers.css +935 -0
  352. package/globals-v3.css +17 -0
  353. package/globals-v4.css +2 -0
  354. package/globals.css +12 -939
  355. package/package.json +82 -17
  356. package/registry.json +920 -0
  357. package/tailwind.css +9 -0
  358. package/tollerud-preset.js +55 -50
  359. package/dist/index.cjs +0 -3938
  360. package/dist/index.cjs.map +0 -1
  361. package/dist/index.d.cts +0 -960
@@ -0,0 +1,935 @@
1
+ @layer base {
2
+ :root,
3
+ .dark {
4
+ /* ═══ Brand Tokens ═══ */
5
+ --tollerud-yellow: #FFFF00;
6
+ --tollerud-yellow-warm: #E8D500;
7
+ --tollerud-acid: #FFFF00; /* Tollerud high-voltage yellow */
8
+ --tollerud-yellow-dim: #B8A800;
9
+ --tollerud-amber: #FFB800;
10
+ --tollerud-amber-glow: #FF8C00;
11
+
12
+ /* ═══ Noir Scale ═══ */
13
+ --tollerud-black: #0A0A0A;
14
+ --tollerud-noir-900: #121212;
15
+ --tollerud-noir-800: #1A1A1A;
16
+ --tollerud-noir-700: #252525;
17
+ --tollerud-noir-600: #333333;
18
+ --tollerud-noir-500: #4A4A4A;
19
+ --tollerud-noir-400: #666666;
20
+ --tollerud-noir-300: #888888;
21
+ --tollerud-noir-200: #AAAAAA;
22
+ --tollerud-noir-100: #CCCCCC;
23
+ --tollerud-noir-50: #E5E5E5;
24
+ --tollerud-white: #F5F5F5;
25
+
26
+ /* ═══ Semantic Tokens (shadcn/ui compatible) ═══ */
27
+ --background: #0A0A0A;
28
+ --foreground: #F5F5F5;
29
+
30
+ --card: #121212;
31
+ --card-foreground: #F5F5F5;
32
+
33
+ --popover: #1A1A1A;
34
+ --popover-foreground: #F5F5F5;
35
+
36
+ --primary: #FFFF00;
37
+ --primary-foreground: #0A0A0A;
38
+
39
+ --secondary: #252525;
40
+ --secondary-foreground: #AAAAAA;
41
+
42
+ --muted: #252525;
43
+ --muted-foreground: #888888;
44
+
45
+ --accent: #FFB800;
46
+ --accent-foreground: #0A0A0A;
47
+
48
+ --destructive: #EF4444;
49
+ --destructive-foreground: #F5F5F5;
50
+
51
+ --success: #22C55E;
52
+ --success-foreground: #0A0A0A;
53
+
54
+ --warning: #E8D500;
55
+ --warning-foreground: #0A0A0A;
56
+
57
+ --info: #3B82F6;
58
+ --info-foreground: #FFFFFF;
59
+
60
+ --border: #333333;
61
+ --input: #333333;
62
+ --ring: #FFFF00;
63
+ --radius: 0.25rem;
64
+
65
+ /* ═══ Chart Tokens ═══ */
66
+ --chart-1: #FFFF00;
67
+ --chart-2: #FFB800;
68
+ --chart-3: #22C55E;
69
+ --chart-4: #3B82F6;
70
+ --chart-5: #EF4444;
71
+ --chart-grid: rgba(245,245,245,0.08);
72
+ --chart-axis: rgba(245,245,245,0.35);
73
+
74
+ /* ═══ Motion Tokens ═══ */
75
+ --motion-duration-fast: 150ms;
76
+ --motion-duration-normal: 250ms;
77
+ --motion-duration-slow: 350ms;
78
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
79
+ --motion-ease-in: cubic-bezier(0.7, 0, 0.84, 0);
80
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
81
+
82
+ /* ═══ Elevation / z-index ═══ */
83
+ --z-base: 0;
84
+ --z-dropdown: 10;
85
+ --z-sticky: 20;
86
+ --z-fixed: 30;
87
+ --z-overlay: 40;
88
+ --z-modal: 50;
89
+ --z-toast: 60;
90
+ --z-tooltip: 70;
91
+
92
+ /* ═══ Shadow scale (noir: deep + low-spread, never milky) ═══ */
93
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.40);
94
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.45);
95
+ --shadow-lg: 0 12px 32px rgba(0,0,0,0.55);
96
+ --shadow-xl: 0 24px 60px rgba(0,0,0,0.65);
97
+ --shadow-glow: 0 0 15px rgba(255,255,0,0.30);
98
+
99
+ /* ═══ Surface Tokens ═══ */
100
+ --surface: #0A0A0A;
101
+ --surface-raised: #121212;
102
+ --surface-overlay: #1A1A1A;
103
+ --surface-hover: #252525;
104
+
105
+ /* ═══ Text ═══ */
106
+ --text-primary: #F5F5F5;
107
+ --text-secondary: #AAAAAA;
108
+ --text-muted: #666666;
109
+ --text-inverse: #0A0A0A;
110
+
111
+ /* ═══ Typography ═══ */
112
+ --font-sans: 'Inter', 'SF Pro', system-ui, sans-serif;
113
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
114
+ --font-display: 'Inter', 'SF Pro Display', system-ui, sans-serif;
115
+
116
+ /* ═══ Glass ═══ */
117
+ --glass-bg: rgba(10, 10, 10, 0.88);
118
+ --glass-border: rgba(232, 213, 0, 0.08);
119
+ --glass-blur: blur(20px);
120
+
121
+ /* ═══ Grid Background ═══ */
122
+ --grid-color: rgba(232, 213, 0, 0.03);
123
+ --grid-size: 40px;
124
+
125
+ /* ═══ Gradient Accents ═══ */
126
+ --gradient-yellow: linear-gradient(
127
+ 90deg,
128
+ transparent,
129
+ #E8D500 35%,
130
+ #FFB800 50%,
131
+ #E8D500 65%,
132
+ transparent
133
+ );
134
+ --gradient-btn: linear-gradient(
135
+ 135deg,
136
+ #E8D500,
137
+ #B8A800
138
+ );
139
+ --gradient-soft: linear-gradient(
140
+ 135deg,
141
+ rgba(232, 213, 0, 0.8),
142
+ rgba(255, 184, 0, 0.4)
143
+ );
144
+
145
+ /* ═══ Transition ═══ */
146
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
147
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
148
+ --transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
149
+ }
150
+
151
+ /* ═══ Base Reset ═══ */
152
+ * {
153
+ border-color: var(--border);
154
+ }
155
+
156
+ body {
157
+ font-family: var(--font-sans);
158
+ font-size: 1rem;
159
+ color: var(--foreground);
160
+ background-color: var(--background);
161
+ line-height: 1.5;
162
+ -webkit-font-smoothing: antialiased;
163
+ -moz-osx-font-smoothing: grayscale;
164
+ }
165
+
166
+ ::selection {
167
+ background-color: rgba(232, 213, 0, 0.55);
168
+ color: #0A0A0A;
169
+ }
170
+
171
+ ::-webkit-scrollbar {
172
+ width: 8px;
173
+ height: 8px;
174
+ }
175
+ ::-webkit-scrollbar-track {
176
+ background: var(--background);
177
+ }
178
+ ::-webkit-scrollbar-thumb {
179
+ background: var(--tollerud-noir-600);
180
+ border-radius: 4px;
181
+ }
182
+ ::-webkit-scrollbar-thumb:hover {
183
+ background: var(--tollerud-noir-500);
184
+ }
185
+
186
+ /* ═══ Respect reduced motion ═══ */
187
+ @media (prefers-reduced-motion: reduce) {
188
+ *,
189
+ *::before,
190
+ *::after {
191
+ animation-duration: 0.01ms !important;
192
+ animation-iteration-count: 1 !important;
193
+ transition-duration: 0.01ms !important;
194
+ scroll-behavior: auto !important;
195
+ }
196
+ }
197
+ }
198
+
199
+ @layer components {
200
+ /* ═══ Card ═══ */
201
+ .tollerud-card {
202
+ background: var(--card);
203
+ border: 1px solid var(--border);
204
+ border-radius: var(--radius);
205
+ padding: 1.5rem;
206
+ transition: border-color var(--transition-fast);
207
+ }
208
+ .tollerud-card:hover {
209
+ border-color: var(--tollerud-noir-500);
210
+ }
211
+
212
+ /* ═══ Button Base ═══ */
213
+ .tollerud-btn {
214
+ display: inline-flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ gap: 0.5rem;
218
+ font-family: var(--font-sans);
219
+ font-weight: 600;
220
+ border-radius: var(--radius);
221
+ transition: all var(--transition-fast);
222
+ cursor: pointer;
223
+ border: 1px solid transparent;
224
+ }
225
+ .tollerud-btn:focus-visible {
226
+ outline: 2px solid var(--ring);
227
+ outline-offset: 2px;
228
+ }
229
+ .tollerud-btn--primary {
230
+ background: var(--primary);
231
+ color: var(--primary-foreground);
232
+ border-color: var(--primary);
233
+ }
234
+ .tollerud-btn--primary:hover {
235
+ background: var(--tollerud-yellow);
236
+ box-shadow: var(--shadow-glow, 0 0 15px rgba(255,255,0,0.3));
237
+ }
238
+ .tollerud-btn--secondary {
239
+ background: transparent;
240
+ color: var(--foreground);
241
+ border-color: var(--border);
242
+ }
243
+ .tollerud-btn--secondary:hover {
244
+ border-color: var(--tollerud-noir-200);
245
+ background: var(--surface-hover);
246
+ }
247
+ .tollerud-btn--ghost {
248
+ background: transparent;
249
+ color: var(--text-secondary);
250
+ }
251
+ .tollerud-btn--ghost:hover {
252
+ color: var(--foreground);
253
+ background: var(--surface-hover);
254
+ }
255
+ .tollerud-btn--destructive {
256
+ background: var(--destructive);
257
+ color: var(--destructive-foreground);
258
+ border-color: var(--destructive);
259
+ }
260
+ .tollerud-btn--destructive:hover {
261
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.3);
262
+ }
263
+ .tollerud-btn--sm { padding: 0.25rem 0.75rem; font-size: 0.875rem; }
264
+ .tollerud-btn--md { padding: 0.5rem 1rem; font-size: 1rem; }
265
+ .tollerud-btn--lg { padding: 0.75rem 1.5rem; font-size: 1.125rem; }
266
+ .tollerud-btn:disabled { opacity: 0.45; cursor: not-allowed; pointer-events: none; }
267
+
268
+ /* ═══ Terminal CTA ═══ */
269
+ .tollerud-btn--terminal {
270
+ background: transparent;
271
+ color: var(--tollerud-yellow);
272
+ border: 1px solid rgba(232, 213, 0, 0.25);
273
+ font-weight: 500;
274
+ letter-spacing: normal;
275
+ font-family: var(--font-mono);
276
+ }
277
+ .tollerud-btn--terminal::before {
278
+ content: '❯ ';
279
+ opacity: 0.7;
280
+ }
281
+ .tollerud-btn--terminal:hover {
282
+ border-color: var(--tollerud-yellow);
283
+ box-shadow: 0 0 15px rgba(255,255,0,0.3), 0 0 30px rgba(255,255,0,0.1);
284
+ background: rgba(232, 213, 0, 0.05);
285
+ }
286
+
287
+ /* ═══ Input ═══ */
288
+ .tollerud-input {
289
+ font-family: var(--font-sans);
290
+ font-size: 1rem;
291
+ padding: 0.5rem 0.75rem;
292
+ background: var(--card);
293
+ border: 1px solid var(--input);
294
+ border-radius: var(--radius);
295
+ color: var(--foreground);
296
+ transition: border-color var(--transition-fast);
297
+ width: 100%;
298
+ }
299
+ .tollerud-input::placeholder {
300
+ color: var(--text-muted);
301
+ }
302
+ .tollerud-input:focus {
303
+ outline: none;
304
+ border-color: var(--ring);
305
+ box-shadow: 0 0 0 1px var(--ring);
306
+ }
307
+
308
+ /* ═══ Badge ═══ */
309
+ .tollerud-badge {
310
+ display: inline-flex;
311
+ align-items: center;
312
+ padding: 0.125rem 0.5rem;
313
+ font-size: 0.75rem;
314
+ font-weight: 500;
315
+ border-radius: var(--radius);
316
+ letter-spacing: 0.02em;
317
+ }
318
+ .tollerud-badge--default {
319
+ background: var(--muted);
320
+ color: var(--text-secondary);
321
+ }
322
+ .tollerud-badge--accent {
323
+ background: rgba(232, 213, 0, 0.15);
324
+ color: var(--tollerud-yellow);
325
+ }
326
+ .tollerud-badge--success {
327
+ background: rgba(34, 197, 94, 0.15);
328
+ color: var(--success);
329
+ }
330
+ .tollerud-badge--error {
331
+ background: rgba(239, 68, 68, 0.15);
332
+ color: var(--destructive);
333
+ }
334
+ .tollerud-badge--info {
335
+ background: rgba(59, 130, 246, 0.15);
336
+ color: var(--info);
337
+ }
338
+ .tollerud-badge--warning {
339
+ background: rgba(232, 213, 0, 0.15);
340
+ color: var(--warning);
341
+ }
342
+
343
+ /* ═══ Pill Tags ═══ */
344
+ .tollerud-pill {
345
+ display: inline-flex;
346
+ align-items: center;
347
+ padding: 0.375rem 1rem;
348
+ font-size: 0.6875rem;
349
+ font-weight: 500;
350
+ border-radius: 3px;
351
+ border: 1px solid;
352
+ letter-spacing: 0.01em;
353
+ }
354
+ .tollerud-pill--outline {
355
+ background: rgba(232, 213, 0, 0.06);
356
+ color: var(--tollerud-yellow);
357
+ border-color: rgba(232, 213, 0, 0.35);
358
+ }
359
+ .tollerud-pill--muted {
360
+ background: rgba(232, 213, 0, 0.03);
361
+ color: rgba(232, 213, 0, 0.55);
362
+ border-color: rgba(232, 213, 0, 0.15);
363
+ }
364
+ .tollerud-pill--success {
365
+ background: rgba(34, 197, 94, 0.06);
366
+ color: var(--success);
367
+ border-color: rgba(34, 197, 94, 0.35);
368
+ }
369
+ .tollerud-pill--error {
370
+ background: rgba(239, 68, 68, 0.06);
371
+ color: var(--destructive);
372
+ border-color: rgba(239, 68, 68, 0.35);
373
+ }
374
+
375
+ /* ═══ Divider ═══ */
376
+ .tollerud-divider {
377
+ border: none;
378
+ border-top: 1px solid var(--border);
379
+ margin: 1.5rem 0;
380
+ }
381
+ .tollerud-divider--accent {
382
+ border-color: var(--tollerud-yellow);
383
+ width: 4rem;
384
+ }
385
+
386
+ /* ═══ Accent Bar (Graphify style) ═══ */
387
+ .tollerud-accent-bar {
388
+ height: 1px;
389
+ border: none;
390
+ background: var(--gradient-yellow);
391
+ margin: 3rem 0;
392
+ }
393
+
394
+ /* ═══ Gradient Text ═══ */
395
+ .tollerud-gradient-text {
396
+ background: var(--gradient-soft);
397
+ -webkit-background-clip: text;
398
+ -webkit-text-fill-color: transparent;
399
+ background-clip: text;
400
+ }
401
+
402
+ /* ═══ Noir Glow Background (Tollerud.no signature) ═══ */
403
+ .tollerud-noir-glow-root {
404
+ background: #000;
405
+ isolation: isolate;
406
+ }
407
+
408
+ .tollerud-noir-glow-bg {
409
+ position: absolute;
410
+ inset: 0;
411
+ background:
412
+ radial-gradient(70% 75% at 100% 0%, hsl(56, 100%, 80%) 0%, transparent 70%),
413
+ radial-gradient(80% 85% at 0% 100%, hsl(56, 100%, 50%) 0%, transparent 72%),
414
+ radial-gradient(60% 65% at 0% 0%, hsl(54, 85%, 66%) 0%, transparent 68%),
415
+ #000;
416
+ opacity: 0.45;
417
+ filter: saturate(1.05) contrast(1.02);
418
+ transform: translateZ(0);
419
+ animation: tollerud-noir-glow-drift 32s var(--motion-ease-in-out) infinite alternate;
420
+ }
421
+
422
+ .tollerud-noir-glow-vignette {
423
+ position: absolute;
424
+ inset: 0;
425
+ background:
426
+ radial-gradient(ellipse at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.08) 26%, rgba(0,0,0,0.2) 58%, rgba(0,0,0,0.64) 100%),
427
+ linear-gradient(180deg, rgba(0,0,0,0.12), rgba(0,0,0,0.5));
428
+ }
429
+
430
+ .tollerud-noir-noise {
431
+ position: absolute;
432
+ inset: -20%;
433
+ opacity: 0.16;
434
+ mix-blend-mode: screen;
435
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.72' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.85'/%3E%3C/svg%3E");
436
+ animation: tollerud-noir-noise-shift 1.6s steps(2, end) infinite;
437
+ }
438
+
439
+ @keyframes tollerud-noir-glow-drift {
440
+ 0% {
441
+ transform: scale(1.02) translate3d(-1.5%, -1%, 0) rotate(0deg);
442
+ filter: saturate(1.05) contrast(1.04);
443
+ }
444
+ 50% {
445
+ transform: scale(1.07) translate3d(1.2%, 0.8%, 0) rotate(0.8deg);
446
+ filter: saturate(1.2) contrast(1.12);
447
+ }
448
+ 100% {
449
+ transform: scale(1.04) translate3d(1.8%, -1.4%, 0) rotate(-0.6deg);
450
+ filter: saturate(1.1) contrast(1.08);
451
+ }
452
+ }
453
+
454
+ @keyframes tollerud-noir-noise-shift {
455
+ 0% { transform: translate3d(0, 0, 0); }
456
+ 25% { transform: translate3d(-2%, 1%, 0); }
457
+ 50% { transform: translate3d(1%, -2%, 0); }
458
+ 75% { transform: translate3d(2%, 2%, 0); }
459
+ 100% { transform: translate3d(-1%, 0, 0); }
460
+ }
461
+
462
+ @media (prefers-reduced-motion: reduce) {
463
+ .tollerud-noir-glow-bg,
464
+ .tollerud-noir-noise {
465
+ animation: none !important;
466
+ }
467
+ }
468
+
469
+ /* ═══ Grid Background ═══ */
470
+ .tollerud-grid-bg {
471
+ pointer-events: none;
472
+ background-image:
473
+ linear-gradient(var(--grid-color) 1px, transparent 1px),
474
+ linear-gradient(90deg, var(--grid-color) 1px, transparent 1px);
475
+ background-size: var(--grid-size) var(--grid-size);
476
+ }
477
+
478
+ /* ═══ Glass / Frosted ═══ */
479
+ .tollerud-glass {
480
+ background: var(--glass-bg);
481
+ backdrop-filter: var(--glass-blur);
482
+ -webkit-backdrop-filter: var(--glass-blur);
483
+ border-bottom: 1px solid var(--glass-border);
484
+ }
485
+
486
+ /* ═══ Focus Ring ═══ */
487
+ .tollerud-focus-ring:focus-visible {
488
+ outline: 2px solid var(--ring);
489
+ outline-offset: 2px;
490
+ }
491
+
492
+ /* ═══ Glow ═══ */
493
+ .tollerud-glow {
494
+ box-shadow: 0 0 15px rgba(255,255,0,0.3), 0 0 30px rgba(255,255,0,0.1);
495
+ }
496
+
497
+ /* ═══ Skeleton ═══ */
498
+ .tollerud-skeleton {
499
+ background: linear-gradient(
500
+ 90deg,
501
+ var(--muted) 25%,
502
+ var(--tollerud-noir-600) 50%,
503
+ var(--muted) 75%
504
+ );
505
+ background-size: 200% 100%;
506
+ animation: tollerud-skeleton-shimmer 1.5s ease-in-out infinite;
507
+ border-radius: var(--radius);
508
+ }
509
+ @keyframes tollerud-skeleton-shimmer {
510
+ 0% { background-position: 200% 0; }
511
+ 100% { background-position: -200% 0; }
512
+ }
513
+
514
+ /* ═══ Display Heading ═══ */
515
+ .tollerud-display {
516
+ font-weight: 600;
517
+ letter-spacing: -0.045em;
518
+ line-height: 0.95;
519
+ color: var(--foreground);
520
+ }
521
+ .tollerud-display--secondary {
522
+ letter-spacing: -0.035em;
523
+ line-height: 1;
524
+ }
525
+ .tollerud-display--tertiary {
526
+ letter-spacing: -0.025em;
527
+ line-height: 1.1;
528
+ }
529
+
530
+ /* ═══ Status Indicator ═══ */
531
+ .tollerud-status {
532
+ display: inline-flex;
533
+ align-items: center;
534
+ gap: 0.375rem;
535
+ font-size: 0.75rem;
536
+ font-weight: 500;
537
+ }
538
+ .tollerud-status::before {
539
+ content: '';
540
+ width: 8px;
541
+ height: 8px;
542
+ border-radius: 50%;
543
+ display: inline-block;
544
+ }
545
+ .tollerud-status--online::before { background: var(--success); box-shadow: 0 0 6px rgba(34,197,94,0.5); }
546
+ .tollerud-status--offline::before { background: var(--destructive); }
547
+ .tollerud-status--warning::before { background: var(--warning); box-shadow: 0 0 6px rgba(255,255,0,0.5); }
548
+ .tollerud-status--idle::before { background: var(--tollerud-noir-400); }
549
+
550
+ /* ═══ Code Block ═══ */
551
+ .tollerud-code-block {
552
+ background: var(--tollerud-noir-900);
553
+ border: 1px solid var(--border);
554
+ border-radius: var(--radius);
555
+ padding: 1rem;
556
+ font-family: var(--font-mono);
557
+ font-size: 0.875rem;
558
+ line-height: 1.7;
559
+ overflow-x: auto;
560
+ color: var(--tollerud-noir-200);
561
+ }
562
+ .tollerud-code-block .prompt { color: var(--tollerud-yellow); }
563
+ .tollerud-code-block .comment { color: var(--tollerud-noir-400); font-style: italic; }
564
+
565
+ /* ═══ Stat Card (for dashboards) ═══ */
566
+ .tollerud-stat {
567
+ background: var(--card);
568
+ border: 1px solid var(--border);
569
+ border-radius: var(--radius);
570
+ padding: 1rem 1.25rem;
571
+ }
572
+ .tollerud-stat__label {
573
+ font-size: 0.75rem;
574
+ font-weight: 500;
575
+ text-transform: uppercase;
576
+ letter-spacing: 0.06em;
577
+ color: var(--text-muted);
578
+ }
579
+ .tollerud-stat__value {
580
+ font-size: 1.5rem;
581
+ font-weight: 600;
582
+ color: var(--foreground);
583
+ margin-top: 0.125rem;
584
+ }
585
+ .tollerud-stat__change {
586
+ font-size: 0.75rem;
587
+ font-weight: 500;
588
+ margin-top: 0.125rem;
589
+ }
590
+ .tollerud-stat__change--up { color: var(--success); }
591
+ .tollerud-stat__change--down { color: var(--destructive); }
592
+
593
+ /* ═══ Timeline ═══ */
594
+ .tollerud-timeline {
595
+ display: flex;
596
+ flex-direction: column;
597
+ }
598
+ .tollerud-timeline__item {
599
+ display: flex;
600
+ gap: 0.75rem;
601
+ }
602
+ .tollerud-timeline__marker {
603
+ display: flex;
604
+ flex-direction: column;
605
+ align-items: center;
606
+ width: 20px;
607
+ flex-shrink: 0;
608
+ }
609
+ .tollerud-timeline__dot-group {
610
+ display: flex;
611
+ flex-direction: column;
612
+ align-items: center;
613
+ height: 100%;
614
+ }
615
+ .tollerud-timeline__dot {
616
+ width: 10px;
617
+ height: 10px;
618
+ border-radius: 50%;
619
+ background: var(--tollerud-noir-500);
620
+ flex-shrink: 0;
621
+ z-index: 1;
622
+ }
623
+ .tollerud-timeline__dot--active {
624
+ animation: tollerud-timeline-pulse 2s infinite;
625
+ }
626
+ @keyframes tollerud-timeline-pulse {
627
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,0,0.4); }
628
+ 50% { box-shadow: 0 0 0 6px rgba(255,255,0,0); }
629
+ }
630
+ .tollerud-timeline__line {
631
+ width: 1px;
632
+ flex: 1;
633
+ min-height: 12px;
634
+ background: linear-gradient(
635
+ 180deg,
636
+ var(--tollerud-noir-600) 0%,
637
+ var(--tollerud-noir-600) 80%,
638
+ transparent 100%
639
+ );
640
+ }
641
+ .tollerud-timeline:not(.tollerud-timeline--active) .tollerud-timeline__dot--active {
642
+ animation: none;
643
+ box-shadow: 0 0 6px rgba(255,255,0,0.4);
644
+ }
645
+ .tollerud-timeline__icon {
646
+ width: 20px;
647
+ height: 20px;
648
+ display: flex;
649
+ align-items: center;
650
+ justify-content: center;
651
+ color: var(--tollerud-yellow);
652
+ }
653
+ .tollerud-timeline__content {
654
+ flex: 1;
655
+ min-width: 0;
656
+ padding-bottom: 1.25rem;
657
+ }
658
+ .tollerud-timeline__title {
659
+ font-size: 0.875rem;
660
+ font-weight: 600;
661
+ color: var(--foreground);
662
+ }
663
+ .tollerud-timeline__time {
664
+ font-size: 0.75rem;
665
+ color: var(--text-muted);
666
+ white-space: nowrap;
667
+ flex-shrink: 0;
668
+ }
669
+ .tollerud-timeline__description {
670
+ font-size: 0.8125rem;
671
+ color: var(--text-secondary);
672
+ margin-top: 0.125rem;
673
+ line-height: 1.4;
674
+ }
675
+ .tollerud-timeline__meta {
676
+ font-size: 0.6875rem;
677
+ color: var(--text-muted);
678
+ background: var(--tollerud-noir-800);
679
+ padding: 0.125rem 0.375rem;
680
+ border-radius: 3px;
681
+ border: 1px solid var(--tollerud-noir-600);
682
+ }
683
+
684
+ /* ═══ Kbd (Keyboard Shortcut Chip) ═══ */
685
+ .tollerud-kbd {
686
+ display: inline-flex;
687
+ align-items: center;
688
+ gap: 2px;
689
+ }
690
+ .tollerud-kbd__key {
691
+ display: inline-flex;
692
+ align-items: center;
693
+ justify-content: center;
694
+ min-width: 22px;
695
+ height: 22px;
696
+ padding: 0 5px;
697
+ font-family: var(--font-mono);
698
+ font-size: 11px;
699
+ font-weight: 500;
700
+ line-height: 1;
701
+ color: var(--tollerud-noir-200);
702
+ background: var(--tollerud-noir-800);
703
+ border: 1px solid var(--tollerud-noir-600);
704
+ border-radius: 4px;
705
+ box-shadow: 0 1px 0 var(--tollerud-noir-600);
706
+ }
707
+ .tollerud-kbd--sm .tollerud-kbd__key {
708
+ min-width: 18px;
709
+ height: 18px;
710
+ padding: 0 4px;
711
+ font-size: 10px;
712
+ }
713
+
714
+ /* ═══ Action Row ═══ */
715
+ .tollerud-action-row {
716
+ display: flex;
717
+ align-items: center;
718
+ gap: 0.75rem;
719
+ width: 100%;
720
+ padding: 0.5rem 0.75rem;
721
+ background: transparent;
722
+ border: none;
723
+ border-radius: 6px;
724
+ cursor: pointer;
725
+ text-align: left;
726
+ font-family: var(--font-sans);
727
+ transition: background var(--motion-duration-fast) var(--motion-ease-in-out);
728
+ }
729
+ .tollerud-action-row:hover,
730
+ .tollerud-action-row--highlighted {
731
+ background: var(--tollerud-noir-700);
732
+ }
733
+ .tollerud-action-row--disabled {
734
+ opacity: 0.4;
735
+ cursor: not-allowed;
736
+ }
737
+ .tollerud-action-row__icon {
738
+ flex-shrink: 0;
739
+ width: 20px;
740
+ height: 20px;
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ color: var(--tollerud-yellow);
745
+ }
746
+ .tollerud-action-row__icon svg {
747
+ width: 18px;
748
+ height: 18px;
749
+ }
750
+ .tollerud-action-row__content {
751
+ flex: 1;
752
+ min-width: 0;
753
+ display: flex;
754
+ flex-direction: column;
755
+ gap: 1px;
756
+ }
757
+ .tollerud-action-row__label {
758
+ font-size: 14px;
759
+ font-weight: 500;
760
+ color: var(--foreground);
761
+ white-space: nowrap;
762
+ overflow: hidden;
763
+ text-overflow: ellipsis;
764
+ }
765
+ .tollerud-action-row__description {
766
+ font-size: 12px;
767
+ color: var(--text-muted);
768
+ white-space: nowrap;
769
+ overflow: hidden;
770
+ text-overflow: ellipsis;
771
+ }
772
+ .tollerud-action-row__shortcut {
773
+ flex-shrink: 0;
774
+ margin-left: auto;
775
+ }
776
+
777
+ /* ═══ Command Menu ═══ */
778
+ .tollerud-cmd-overlay {
779
+ position: fixed;
780
+ inset: 0;
781
+ z-index: var(--z-overlay);
782
+ background: rgba(0, 0, 0, 0.6);
783
+ backdrop-filter: blur(4px);
784
+ -webkit-backdrop-filter: blur(4px);
785
+ animation: tollerud-cmd-overlay-in 150ms var(--motion-ease-out);
786
+ }
787
+ @keyframes tollerud-cmd-overlay-in {
788
+ from { opacity: 0; }
789
+ to { opacity: 1; }
790
+ }
791
+
792
+ .tollerud-cmd {
793
+ position: fixed;
794
+ top: 15vh;
795
+ left: 50%;
796
+ transform: translateX(-50%);
797
+ z-index: var(--z-modal);
798
+ width: min(90vw, 640px);
799
+ max-height: 70vh;
800
+ display: flex;
801
+ flex-direction: column;
802
+ background: var(--surface-raised);
803
+ border: 1px solid var(--tollerud-noir-600);
804
+ border-radius: 12px;
805
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
806
+ animation: tollerud-cmd-in 200ms var(--motion-ease-out);
807
+ overflow: hidden;
808
+ }
809
+ @keyframes tollerud-cmd-in {
810
+ from {
811
+ opacity: 0;
812
+ transform: translateX(-50%) scale(0.96) translateY(-8px);
813
+ }
814
+ to {
815
+ opacity: 1;
816
+ transform: translateX(-50%) scale(1) translateY(0);
817
+ }
818
+ }
819
+
820
+ .tollerud-cmd__header {
821
+ display: flex;
822
+ align-items: center;
823
+ gap: 0.75rem;
824
+ padding: 0.75rem 1rem;
825
+ border-bottom: 1px solid var(--border);
826
+ flex-shrink: 0;
827
+ }
828
+ .tollerud-cmd__search-icon {
829
+ flex-shrink: 0;
830
+ color: var(--text-muted);
831
+ display: flex;
832
+ align-items: center;
833
+ }
834
+ .tollerud-cmd__input {
835
+ flex: 1;
836
+ background: transparent;
837
+ border: none;
838
+ outline: none;
839
+ color: var(--foreground);
840
+ font-family: var(--font-sans);
841
+ font-size: 16px;
842
+ line-height: 1.5;
843
+ }
844
+ .tollerud-cmd__input::placeholder {
845
+ color: var(--text-muted);
846
+ }
847
+
848
+ .tollerud-cmd__list {
849
+ flex: 1;
850
+ overflow-y: auto;
851
+ padding: 0.5rem;
852
+ display: flex;
853
+ flex-direction: column;
854
+ gap: 0.25rem;
855
+ }
856
+ .tollerud-cmd__empty {
857
+ padding: 2rem 1rem;
858
+ text-align: center;
859
+ font-size: 14px;
860
+ color: var(--text-muted);
861
+ }
862
+ .tollerud-cmd__group {
863
+ display: flex;
864
+ flex-direction: column;
865
+ gap: 1px;
866
+ }
867
+ .tollerud-cmd__group-label {
868
+ padding: 0.5rem 0.75rem 0.25rem;
869
+ font-size: 11px;
870
+ font-weight: 600;
871
+ text-transform: uppercase;
872
+ letter-spacing: 0.06em;
873
+ color: var(--text-muted);
874
+ }
875
+
876
+ .tollerud-cmd__footer {
877
+ display: flex;
878
+ align-items: center;
879
+ gap: 0.75rem;
880
+ padding: 0.5rem 1rem;
881
+ border-top: 1px solid var(--border);
882
+ flex-shrink: 0;
883
+ }
884
+ .tollerud-cmd__hint {
885
+ display: inline-flex;
886
+ align-items: center;
887
+ gap: 4px;
888
+ }
889
+ .tollerud-cmd__hint-text {
890
+ font-size: 11px;
891
+ color: var(--text-muted);
892
+ }
893
+ }
894
+
895
+ @layer utilities {
896
+ /* ═══ Text utilities ═══ */
897
+ .text-balance { text-wrap: balance; }
898
+
899
+ /* ═══ Section container ═══ */
900
+ .tollerud-section {
901
+ max-width: 1100px;
902
+ margin-left: auto;
903
+ margin-right: auto;
904
+ padding-left: 1.5rem;
905
+ padding-right: 1.5rem;
906
+ }
907
+ }
908
+
909
+ /* ═══════════════════════════════════════════════
910
+ Tailwind v4 safelist — Alert tone classes
911
+ ═══════════════════════════════════════════════
912
+ These classes are used dynamically in Alert.tsx and would be missed
913
+ by @source scanning a pre-compiled dist file. Declaring them here
914
+ ensures Tailwind always generates them regardless of @source config.
915
+ ═══════════════════════════════════════════════ */
916
+
917
+ /*
918
+ @source inline("
919
+ bg-red-500/5 border-red-500/30 text-red-400
920
+ bg-blue-500/5 border-blue-500/30 text-blue-400
921
+ bg-green-500/5 border-green-500/30 text-green-400
922
+ ");
923
+ */
924
+
925
+ @layer utilities {
926
+ .bg-red-500\/5 { background-color: rgb(239 68 68 / 0.05); }
927
+ .bg-blue-500\/5 { background-color: rgb(59 130 246 / 0.05); }
928
+ .bg-green-500\/5 { background-color: rgb(34 197 94 / 0.05); }
929
+ .border-red-500\/30 { border-color: rgb(239 68 68 / 0.3); }
930
+ .border-blue-500\/30 { border-color: rgb(59 130 246 / 0.3); }
931
+ .border-green-500\/30 { border-color: rgb(34 197 94 / 0.3); }
932
+ .text-red-400 { color: rgb(248 113 113); }
933
+ .text-blue-400 { color: rgb(96 165 250); }
934
+ .text-green-400 { color: rgb(74 222 128); }
935
+ }