@tollerud/ui 1.1.5 → 3.1.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 (368) hide show
  1. package/AGENTS.md +36 -13
  2. package/CHANGELOG.md +411 -0
  3. package/COMPONENTS.md +951 -0
  4. package/GETTING_STARTED.md +159 -0
  5. package/README.md +51 -43
  6. package/SKILL.md +59 -24
  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 +28 -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 +10 -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-3LTW224O.js +53 -0
  59. package/dist/chunk-3LTW224O.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-A6L5C3IJ.js +47 -0
  83. package/dist/chunk-A6L5C3IJ.js.map +1 -0
  84. package/dist/chunk-ADE22JSR.js +54 -0
  85. package/dist/chunk-ADE22JSR.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-AQT3FZRQ.js +23 -0
  91. package/dist/chunk-AQT3FZRQ.js.map +1 -0
  92. package/dist/chunk-AZADSX4Z.js +85 -0
  93. package/dist/chunk-AZADSX4Z.js.map +1 -0
  94. package/dist/chunk-BPCH5LJ3.js +36 -0
  95. package/dist/chunk-BPCH5LJ3.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-DNJI65VQ.js +22 -0
  101. package/dist/chunk-DNJI65VQ.js.map +1 -0
  102. package/dist/chunk-DOUDJU4P.js +63 -0
  103. package/dist/chunk-DOUDJU4P.js.map +1 -0
  104. package/dist/chunk-DRCMGIQ6.js +64 -0
  105. package/dist/chunk-DRCMGIQ6.js.map +1 -0
  106. package/dist/chunk-DZOBXK2S.js +28 -0
  107. package/dist/chunk-DZOBXK2S.js.map +1 -0
  108. package/dist/chunk-EN4OJCEF.js +54 -0
  109. package/dist/chunk-EN4OJCEF.js.map +1 -0
  110. package/dist/chunk-EVHZFYWX.js +33 -0
  111. package/dist/chunk-EVHZFYWX.js.map +1 -0
  112. package/dist/chunk-G2VKWNZA.js +53 -0
  113. package/dist/chunk-G2VKWNZA.js.map +1 -0
  114. package/dist/chunk-GTM2DE4C.js +156 -0
  115. package/dist/chunk-GTM2DE4C.js.map +1 -0
  116. package/dist/chunk-H3ZVGTJM.js +165 -0
  117. package/dist/chunk-H3ZVGTJM.js.map +1 -0
  118. package/dist/chunk-HWAWUEHC.js +28 -0
  119. package/dist/chunk-HWAWUEHC.js.map +1 -0
  120. package/dist/chunk-HWJVRTWO.js +36 -0
  121. package/dist/chunk-HWJVRTWO.js.map +1 -0
  122. package/dist/chunk-ILADNTUB.js +77 -0
  123. package/dist/chunk-ILADNTUB.js.map +1 -0
  124. package/dist/chunk-IUPVQWO5.js +31 -0
  125. package/dist/chunk-IUPVQWO5.js.map +1 -0
  126. package/dist/chunk-JFOW2DI5.js +43 -0
  127. package/dist/chunk-JFOW2DI5.js.map +1 -0
  128. package/dist/chunk-JRFSUVSO.js +66 -0
  129. package/dist/chunk-JRFSUVSO.js.map +1 -0
  130. package/dist/chunk-KI6OTVID.js +91 -0
  131. package/dist/chunk-KI6OTVID.js.map +1 -0
  132. package/dist/chunk-LUM2YJBH.js +73 -0
  133. package/dist/chunk-LUM2YJBH.js.map +1 -0
  134. package/dist/chunk-NHPISZWS.js +71 -0
  135. package/dist/chunk-NHPISZWS.js.map +1 -0
  136. package/dist/chunk-NOLWJJHT.js +52 -0
  137. package/dist/chunk-NOLWJJHT.js.map +1 -0
  138. package/dist/chunk-NPVINX3Q.js +20 -0
  139. package/dist/chunk-NPVINX3Q.js.map +1 -0
  140. package/dist/chunk-NSMU66ZX.js +47 -0
  141. package/dist/chunk-NSMU66ZX.js.map +1 -0
  142. package/dist/chunk-O5SWPHUQ.js +79 -0
  143. package/dist/chunk-O5SWPHUQ.js.map +1 -0
  144. package/dist/chunk-OGVSZ7NV.js +53 -0
  145. package/dist/chunk-OGVSZ7NV.js.map +1 -0
  146. package/dist/chunk-OLHMMFQ7.js +43 -0
  147. package/dist/chunk-OLHMMFQ7.js.map +1 -0
  148. package/dist/chunk-ONMTHBZ4.js +54 -0
  149. package/dist/chunk-ONMTHBZ4.js.map +1 -0
  150. package/dist/chunk-OVSIOZHJ.js +56 -0
  151. package/dist/chunk-OVSIOZHJ.js.map +1 -0
  152. package/dist/chunk-Q54CVE3W.js +154 -0
  153. package/dist/chunk-Q54CVE3W.js.map +1 -0
  154. package/dist/chunk-QEHTPQHL.js +35 -0
  155. package/dist/chunk-QEHTPQHL.js.map +1 -0
  156. package/dist/chunk-QEIEWGHA.js +62 -0
  157. package/dist/chunk-QEIEWGHA.js.map +1 -0
  158. package/dist/chunk-QQHBEACI.js +88 -0
  159. package/dist/chunk-QQHBEACI.js.map +1 -0
  160. package/dist/chunk-RJTDQOT2.js +73 -0
  161. package/dist/chunk-RJTDQOT2.js.map +1 -0
  162. package/dist/chunk-RQ3RXKAZ.js +203 -0
  163. package/dist/chunk-RQ3RXKAZ.js.map +1 -0
  164. package/dist/chunk-RZK2S2OO.js +126 -0
  165. package/dist/chunk-RZK2S2OO.js.map +1 -0
  166. package/dist/chunk-SAP7JSSO.js +106 -0
  167. package/dist/chunk-SAP7JSSO.js.map +1 -0
  168. package/dist/chunk-T3TQPOVM.js +79 -0
  169. package/dist/chunk-T3TQPOVM.js.map +1 -0
  170. package/dist/chunk-T3UQ7G4T.js +58 -0
  171. package/dist/chunk-T3UQ7G4T.js.map +1 -0
  172. package/dist/chunk-T56TTOI6.js +53 -0
  173. package/dist/chunk-T56TTOI6.js.map +1 -0
  174. package/dist/chunk-T7EFDE2L.js +36 -0
  175. package/dist/chunk-T7EFDE2L.js.map +1 -0
  176. package/dist/chunk-VFS3V3VY.js +91 -0
  177. package/dist/chunk-VFS3V3VY.js.map +1 -0
  178. package/dist/chunk-VOARBYVQ.js +44 -0
  179. package/dist/chunk-VOARBYVQ.js.map +1 -0
  180. package/dist/chunk-WDANALHD.js +95 -0
  181. package/dist/chunk-WDANALHD.js.map +1 -0
  182. package/dist/chunk-WSQNPRGN.js +12 -0
  183. package/dist/chunk-WSQNPRGN.js.map +1 -0
  184. package/dist/chunk-YPP7QHYT.js +393 -0
  185. package/dist/chunk-YPP7QHYT.js.map +1 -0
  186. package/dist/chunk-YTU7BRDW.js +72 -0
  187. package/dist/chunk-YTU7BRDW.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/chunk-ZTFOR3AN.js +79 -0
  193. package/dist/chunk-ZTFOR3AN.js.map +1 -0
  194. package/dist/code-block.d.ts +14 -0
  195. package/dist/code-block.js +5 -0
  196. package/dist/code-block.js.map +1 -0
  197. package/dist/combobox.d.ts +26 -0
  198. package/dist/combobox.js +5 -0
  199. package/dist/combobox.js.map +1 -0
  200. package/dist/command-menu.d.ts +52 -0
  201. package/dist/command-menu.js +7 -0
  202. package/dist/command-menu.js.map +1 -0
  203. package/dist/container.d.ts +9 -0
  204. package/dist/container.js +5 -0
  205. package/dist/container.js.map +1 -0
  206. package/dist/cta-band.d.ts +12 -0
  207. package/dist/cta-band.js +5 -0
  208. package/dist/cta-band.js.map +1 -0
  209. package/dist/data-table.d.ts +58 -0
  210. package/dist/data-table.js +12 -0
  211. package/dist/data-table.js.map +1 -0
  212. package/dist/date-picker.d.ts +20 -0
  213. package/dist/date-picker.js +5 -0
  214. package/dist/date-picker.js.map +1 -0
  215. package/dist/dialog.d.ts +21 -0
  216. package/dist/dialog.js +5 -0
  217. package/dist/dialog.js.map +1 -0
  218. package/dist/divider.d.ts +12 -0
  219. package/dist/divider.js +5 -0
  220. package/dist/divider.js.map +1 -0
  221. package/dist/docker-stack-card.d.ts +21 -0
  222. package/dist/docker-stack-card.js +6 -0
  223. package/dist/docker-stack-card.js.map +1 -0
  224. package/dist/donut.d.ts +15 -0
  225. package/dist/donut.js +5 -0
  226. package/dist/donut.js.map +1 -0
  227. package/dist/dropdown-menu.d.ts +15 -0
  228. package/dist/dropdown-menu.js +5 -0
  229. package/dist/dropdown-menu.js.map +1 -0
  230. package/dist/empty.d.ts +12 -0
  231. package/dist/empty.js +5 -0
  232. package/dist/empty.js.map +1 -0
  233. package/dist/feature-card.d.ts +11 -0
  234. package/dist/feature-card.js +6 -0
  235. package/dist/feature-card.js.map +1 -0
  236. package/dist/file-upload.d.ts +20 -0
  237. package/dist/file-upload.js +5 -0
  238. package/dist/file-upload.js.map +1 -0
  239. package/dist/footer.d.ts +35 -0
  240. package/dist/footer.js +6 -0
  241. package/dist/footer.js.map +1 -0
  242. package/dist/form-row.d.ts +19 -0
  243. package/dist/form-row.js +5 -0
  244. package/dist/form-row.js.map +1 -0
  245. package/dist/glow-card.d.ts +14 -0
  246. package/dist/glow-card.js +5 -0
  247. package/dist/glow-card.js.map +1 -0
  248. package/dist/hero-block.d.ts +16 -0
  249. package/dist/hero-block.js +7 -0
  250. package/dist/hero-block.js.map +1 -0
  251. package/dist/host-card.d.ts +27 -0
  252. package/dist/host-card.js +6 -0
  253. package/dist/host-card.js.map +1 -0
  254. package/dist/incident-card.d.ts +23 -0
  255. package/dist/incident-card.js +5 -0
  256. package/dist/incident-card.js.map +1 -0
  257. package/dist/index.d.ts +77 -960
  258. package/dist/index.js +69 -3812
  259. package/dist/index.js.map +1 -1
  260. package/dist/input.d.ts +10 -0
  261. package/dist/input.js +5 -0
  262. package/dist/input.js.map +1 -0
  263. package/dist/kbd.d.ts +24 -0
  264. package/dist/kbd.js +5 -0
  265. package/dist/kbd.js.map +1 -0
  266. package/dist/log-viewer.d.ts +35 -0
  267. package/dist/log-viewer.js +5 -0
  268. package/dist/log-viewer.js.map +1 -0
  269. package/dist/meter.d.ts +23 -0
  270. package/dist/meter.js +5 -0
  271. package/dist/meter.js.map +1 -0
  272. package/dist/monogram.d.ts +20 -0
  273. package/dist/monogram.js +5 -0
  274. package/dist/monogram.js.map +1 -0
  275. package/dist/noir-glow-background.d.ts +56 -0
  276. package/dist/noir-glow-background.js +4 -0
  277. package/dist/noir-glow-background.js.map +1 -0
  278. package/dist/pagination.d.ts +16 -0
  279. package/dist/pagination.js +5 -0
  280. package/dist/pagination.js.map +1 -0
  281. package/dist/panel.d.ts +12 -0
  282. package/dist/panel.js +5 -0
  283. package/dist/panel.js.map +1 -0
  284. package/dist/password-input.d.ts +10 -0
  285. package/dist/password-input.js +5 -0
  286. package/dist/password-input.js.map +1 -0
  287. package/dist/pill.d.ts +17 -0
  288. package/dist/pill.js +5 -0
  289. package/dist/pill.js.map +1 -0
  290. package/dist/pricing-card.d.ts +20 -0
  291. package/dist/pricing-card.js +6 -0
  292. package/dist/pricing-card.js.map +1 -0
  293. package/dist/progress.d.ts +6 -0
  294. package/dist/progress.js +5 -0
  295. package/dist/progress.js.map +1 -0
  296. package/dist/radio-group.d.ts +18 -0
  297. package/dist/radio-group.js +5 -0
  298. package/dist/radio-group.js.map +1 -0
  299. package/dist/rollback-plan.d.ts +23 -0
  300. package/dist/rollback-plan.js +5 -0
  301. package/dist/rollback-plan.js.map +1 -0
  302. package/dist/segmented.d.ts +17 -0
  303. package/dist/segmented.js +5 -0
  304. package/dist/segmented.js.map +1 -0
  305. package/dist/select.d.ts +18 -0
  306. package/dist/select.js +5 -0
  307. package/dist/select.js.map +1 -0
  308. package/dist/service-health-card.d.ts +21 -0
  309. package/dist/service-health-card.js +6 -0
  310. package/dist/service-health-card.js.map +1 -0
  311. package/dist/sheet.d.ts +25 -0
  312. package/dist/sheet.js +5 -0
  313. package/dist/sheet.js.map +1 -0
  314. package/dist/skeleton.d.ts +13 -0
  315. package/dist/skeleton.js +5 -0
  316. package/dist/skeleton.js.map +1 -0
  317. package/dist/slider.d.ts +12 -0
  318. package/dist/slider.js +5 -0
  319. package/dist/slider.js.map +1 -0
  320. package/dist/sparkline.d.ts +16 -0
  321. package/dist/sparkline.js +5 -0
  322. package/dist/sparkline.js.map +1 -0
  323. package/dist/stat-card.d.ts +15 -0
  324. package/dist/stat-card.js +5 -0
  325. package/dist/stat-card.js.map +1 -0
  326. package/dist/status-dot.d.ts +13 -0
  327. package/dist/status-dot.js +5 -0
  328. package/dist/status-dot.js.map +1 -0
  329. package/dist/stepper.d.ts +16 -0
  330. package/dist/stepper.js +5 -0
  331. package/dist/stepper.js.map +1 -0
  332. package/dist/switch.d.ts +9 -0
  333. package/dist/switch.js +5 -0
  334. package/dist/switch.js.map +1 -0
  335. package/dist/tabs.d.ts +9 -0
  336. package/dist/tabs.js +5 -0
  337. package/dist/tabs.js.map +1 -0
  338. package/dist/tag-input.d.ts +20 -0
  339. package/dist/tag-input.js +5 -0
  340. package/dist/tag-input.js.map +1 -0
  341. package/dist/textarea.d.ts +10 -0
  342. package/dist/textarea.js +5 -0
  343. package/dist/textarea.js.map +1 -0
  344. package/dist/timeline.d.ts +30 -0
  345. package/dist/timeline.js +5 -0
  346. package/dist/timeline.js.map +1 -0
  347. package/dist/toaster.d.ts +10 -0
  348. package/dist/toaster.js +4 -0
  349. package/dist/toaster.js.map +1 -0
  350. package/dist/tooltip.d.ts +12 -0
  351. package/dist/tooltip.js +5 -0
  352. package/dist/tooltip.js.map +1 -0
  353. package/dist/utils.d.ts +5 -0
  354. package/dist/utils.js +4 -0
  355. package/dist/utils.js.map +1 -0
  356. package/globals-layers.css +1019 -0
  357. package/globals-v3.css +17 -0
  358. package/globals-v4.css +2 -0
  359. package/globals.css +12 -939
  360. package/package.json +85 -17
  361. package/registry.json +936 -0
  362. package/tailwind.css +9 -0
  363. package/tokens.css +20 -0
  364. package/tollerud-avatar-full.png +0 -0
  365. package/dist/index.cjs +0 -3938
  366. package/dist/index.cjs.map +0 -1
  367. package/dist/index.d.cts +0 -960
  368. /package/{tia-full-figure.svg → tollerud-avatar-full.svg} +0 -0
@@ -0,0 +1,1019 @@
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
+ .tollerud-accent-bar--inline {
394
+ margin: 0;
395
+ }
396
+
397
+ /* ═══ Range slider ═══ */
398
+ .tollerud-slider {
399
+ -webkit-appearance: none;
400
+ appearance: none;
401
+ width: 100%;
402
+ height: 6px;
403
+ border-radius: 999px;
404
+ background: var(--muted);
405
+ outline: none;
406
+ }
407
+ .tollerud-slider::-webkit-slider-thumb {
408
+ -webkit-appearance: none;
409
+ appearance: none;
410
+ width: 16px;
411
+ height: 16px;
412
+ border-radius: 50%;
413
+ background: var(--tollerud-yellow);
414
+ border: 2px solid var(--card);
415
+ cursor: pointer;
416
+ box-shadow: 0 0 0 1px var(--border);
417
+ }
418
+ .tollerud-slider::-moz-range-thumb {
419
+ width: 16px;
420
+ height: 16px;
421
+ border-radius: 50%;
422
+ background: var(--tollerud-yellow);
423
+ border: 2px solid var(--card);
424
+ cursor: pointer;
425
+ }
426
+
427
+ /* ═══ Form row (settings layout) ═══ */
428
+ .tollerud-formrow {
429
+ display: grid;
430
+ grid-template-columns: 1fr auto;
431
+ gap: 16px;
432
+ align-items: center;
433
+ padding: 16px 0;
434
+ border-bottom: 1px solid var(--border);
435
+ }
436
+ .tollerud-formrow:last-child {
437
+ border-bottom: none;
438
+ }
439
+ .tollerud-formrow__title {
440
+ font-size: 14px;
441
+ font-weight: 500;
442
+ color: var(--foreground);
443
+ }
444
+ .tollerud-formrow__hint {
445
+ font-size: 12.5px;
446
+ color: var(--text-muted);
447
+ margin-top: 3px;
448
+ line-height: 1.45;
449
+ max-width: 46ch;
450
+ }
451
+ .tollerud-formrow__control {
452
+ justify-self: end;
453
+ }
454
+ @media (max-width: 560px) {
455
+ .tollerud-formrow {
456
+ grid-template-columns: 1fr;
457
+ gap: 10px;
458
+ }
459
+ .tollerud-formrow__control {
460
+ justify-self: start;
461
+ }
462
+ }
463
+
464
+ /* ═══ Gradient Text ═══ */
465
+ .tollerud-gradient-text {
466
+ background: var(--gradient-soft);
467
+ -webkit-background-clip: text;
468
+ -webkit-text-fill-color: transparent;
469
+ background-clip: text;
470
+ }
471
+
472
+ /* ═══ Noir Glow Background (Tollerud.no signature) ═══ */
473
+ .tollerud-noir-glow-root {
474
+ background: #000;
475
+ isolation: isolate;
476
+ }
477
+
478
+ .tollerud-noir-glow-bg {
479
+ position: absolute;
480
+ inset: 0;
481
+ background:
482
+ radial-gradient(70% 75% at 100% 0%, hsl(56, 100%, 80%) 0%, transparent 70%),
483
+ radial-gradient(80% 85% at 0% 100%, hsl(56, 100%, 50%) 0%, transparent 72%),
484
+ radial-gradient(60% 65% at 0% 0%, hsl(54, 85%, 66%) 0%, transparent 68%),
485
+ #000;
486
+ opacity: 0.45;
487
+ filter: saturate(1.05) contrast(1.02);
488
+ transform: translateZ(0);
489
+ animation: tollerud-noir-glow-drift 32s var(--motion-ease-in-out) infinite alternate;
490
+ }
491
+
492
+ .tollerud-noir-glow-vignette {
493
+ position: absolute;
494
+ inset: 0;
495
+ background:
496
+ 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%),
497
+ linear-gradient(180deg, rgba(0,0,0,0.12), rgba(0,0,0,0.5));
498
+ }
499
+
500
+ .tollerud-noir-noise {
501
+ position: absolute;
502
+ inset: -20%;
503
+ opacity: 0.16;
504
+ mix-blend-mode: screen;
505
+ 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");
506
+ animation: tollerud-noir-noise-shift 1.6s steps(2, end) infinite;
507
+ }
508
+
509
+ @keyframes tollerud-noir-glow-drift {
510
+ 0% {
511
+ transform: scale(1.02) translate3d(-1.5%, -1%, 0) rotate(0deg);
512
+ filter: saturate(1.05) contrast(1.04);
513
+ }
514
+ 50% {
515
+ transform: scale(1.07) translate3d(1.2%, 0.8%, 0) rotate(0.8deg);
516
+ filter: saturate(1.2) contrast(1.12);
517
+ }
518
+ 100% {
519
+ transform: scale(1.04) translate3d(1.8%, -1.4%, 0) rotate(-0.6deg);
520
+ filter: saturate(1.1) contrast(1.08);
521
+ }
522
+ }
523
+
524
+ @keyframes tollerud-noir-noise-shift {
525
+ 0% { transform: translate3d(0, 0, 0); }
526
+ 25% { transform: translate3d(-2%, 1%, 0); }
527
+ 50% { transform: translate3d(1%, -2%, 0); }
528
+ 75% { transform: translate3d(2%, 2%, 0); }
529
+ 100% { transform: translate3d(-1%, 0, 0); }
530
+ }
531
+
532
+ @media (prefers-reduced-motion: reduce) {
533
+ .tollerud-noir-glow-bg,
534
+ .tollerud-noir-noise {
535
+ animation: none !important;
536
+ }
537
+ }
538
+
539
+ /* ═══ Grid Background ═══ */
540
+ .tollerud-grid-bg {
541
+ pointer-events: none;
542
+ background-image:
543
+ linear-gradient(var(--grid-color) 1px, transparent 1px),
544
+ linear-gradient(90deg, var(--grid-color) 1px, transparent 1px);
545
+ background-size: var(--grid-size) var(--grid-size);
546
+ }
547
+
548
+ /* ═══ Glass / Frosted ═══ */
549
+ .tollerud-glass {
550
+ background: var(--glass-bg);
551
+ backdrop-filter: var(--glass-blur);
552
+ -webkit-backdrop-filter: var(--glass-blur);
553
+ border-bottom: 1px solid var(--glass-border);
554
+ }
555
+
556
+ /* ═══ Focus Ring ═══ */
557
+ .tollerud-focus-ring:focus-visible {
558
+ outline: 2px solid var(--ring);
559
+ outline-offset: 2px;
560
+ }
561
+
562
+ /* ═══ Glow ═══ */
563
+ .tollerud-glow {
564
+ box-shadow: 0 0 15px rgba(255,255,0,0.3), 0 0 30px rgba(255,255,0,0.1);
565
+ }
566
+
567
+ /* ═══ Skeleton ═══ */
568
+ .tollerud-skeleton {
569
+ background: linear-gradient(
570
+ 90deg,
571
+ var(--muted) 25%,
572
+ var(--tollerud-noir-600) 50%,
573
+ var(--muted) 75%
574
+ );
575
+ background-size: 200% 100%;
576
+ animation: tollerud-skeleton-shimmer 1.5s ease-in-out infinite;
577
+ border-radius: var(--radius);
578
+ }
579
+ @keyframes tollerud-skeleton-shimmer {
580
+ 0% { background-position: 200% 0; }
581
+ 100% { background-position: -200% 0; }
582
+ }
583
+
584
+ /* ═══ Display Heading ═══ */
585
+ .tollerud-display {
586
+ font-weight: 600;
587
+ letter-spacing: -0.045em;
588
+ line-height: 0.95;
589
+ color: var(--foreground);
590
+ }
591
+ .tollerud-display--secondary {
592
+ letter-spacing: -0.035em;
593
+ line-height: 1;
594
+ }
595
+ .tollerud-display--tertiary {
596
+ letter-spacing: -0.025em;
597
+ line-height: 1.1;
598
+ }
599
+
600
+ /* ═══ Status Indicator ═══ */
601
+ .tollerud-status {
602
+ display: inline-flex;
603
+ align-items: center;
604
+ gap: 0.375rem;
605
+ font-size: 0.75rem;
606
+ font-weight: 500;
607
+ }
608
+ .tollerud-status::before {
609
+ content: '';
610
+ width: 8px;
611
+ height: 8px;
612
+ border-radius: 50%;
613
+ display: inline-block;
614
+ }
615
+ .tollerud-status--online::before { background: var(--success); box-shadow: 0 0 6px rgba(34,197,94,0.5); }
616
+ .tollerud-status--offline::before { background: var(--destructive); }
617
+ .tollerud-status--warning::before { background: var(--warning); box-shadow: 0 0 6px rgba(255,255,0,0.5); }
618
+ .tollerud-status--idle::before { background: var(--tollerud-noir-400); }
619
+
620
+ /* ═══ Code Block ═══ */
621
+ .tollerud-code-block {
622
+ background: var(--tollerud-noir-900);
623
+ border: 1px solid var(--border);
624
+ border-radius: var(--radius);
625
+ padding: 1rem;
626
+ font-family: var(--font-mono);
627
+ font-size: 0.875rem;
628
+ line-height: 1.7;
629
+ overflow-x: auto;
630
+ color: var(--tollerud-noir-200);
631
+ }
632
+ .tollerud-code-block .prompt { color: var(--tollerud-yellow); }
633
+ .tollerud-code-block .comment { color: var(--tollerud-noir-400); font-style: italic; }
634
+
635
+ /* ═══ Stat Card (for dashboards) ═══ */
636
+ .tollerud-stat {
637
+ background: var(--card);
638
+ border: 1px solid var(--border);
639
+ border-radius: var(--radius);
640
+ padding: 1rem 1.25rem;
641
+ }
642
+ .tollerud-stat__label {
643
+ font-size: 0.75rem;
644
+ font-weight: 500;
645
+ text-transform: uppercase;
646
+ letter-spacing: 0.06em;
647
+ color: var(--text-muted);
648
+ }
649
+ .tollerud-stat__value {
650
+ font-size: 1.5rem;
651
+ font-weight: 600;
652
+ color: var(--foreground);
653
+ margin-top: 0.125rem;
654
+ }
655
+ .tollerud-stat__change {
656
+ font-size: 0.75rem;
657
+ font-weight: 500;
658
+ margin-top: 0.125rem;
659
+ }
660
+ .tollerud-stat__change--up { color: var(--success); }
661
+ .tollerud-stat__change--down { color: var(--destructive); }
662
+
663
+ /* ═══ Timeline ═══ */
664
+ .tollerud-timeline {
665
+ display: flex;
666
+ flex-direction: column;
667
+ }
668
+ .tollerud-timeline__item {
669
+ display: flex;
670
+ gap: 0.75rem;
671
+ }
672
+ .tollerud-timeline__marker {
673
+ display: flex;
674
+ flex-direction: column;
675
+ align-items: center;
676
+ width: 20px;
677
+ flex-shrink: 0;
678
+ }
679
+ .tollerud-timeline__dot-group {
680
+ display: flex;
681
+ flex-direction: column;
682
+ align-items: center;
683
+ height: 100%;
684
+ }
685
+ .tollerud-timeline__dot {
686
+ width: 10px;
687
+ height: 10px;
688
+ border-radius: 50%;
689
+ background: var(--tollerud-noir-500);
690
+ flex-shrink: 0;
691
+ z-index: 1;
692
+ }
693
+ .tollerud-timeline__dot--active {
694
+ animation: tollerud-timeline-pulse 2s infinite;
695
+ }
696
+ .tollerud-timeline__dot--online {
697
+ background: var(--success);
698
+ box-shadow: 0 0 6px rgba(34, 197, 94, 0.5);
699
+ }
700
+ .tollerud-timeline__dot--warning {
701
+ background: var(--tollerud-yellow);
702
+ box-shadow: 0 0 6px rgba(232, 213, 0, 0.5);
703
+ }
704
+ .tollerud-timeline__dot--offline {
705
+ background: var(--destructive);
706
+ }
707
+ .tollerud-timeline__dot--idle {
708
+ background: var(--tollerud-noir-400);
709
+ }
710
+ @keyframes tollerud-timeline-pulse {
711
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,0,0.4); }
712
+ 50% { box-shadow: 0 0 0 6px rgba(255,255,0,0); }
713
+ }
714
+ .tollerud-timeline__line {
715
+ width: 1px;
716
+ flex: 1;
717
+ min-height: 12px;
718
+ background: linear-gradient(
719
+ 180deg,
720
+ var(--tollerud-noir-600) 0%,
721
+ var(--tollerud-noir-600) 80%,
722
+ transparent 100%
723
+ );
724
+ }
725
+ .tollerud-timeline:not(.tollerud-timeline--active) .tollerud-timeline__dot--active {
726
+ animation: none;
727
+ box-shadow: 0 0 6px rgba(255,255,0,0.4);
728
+ }
729
+ .tollerud-timeline__icon {
730
+ width: 20px;
731
+ height: 20px;
732
+ display: flex;
733
+ align-items: center;
734
+ justify-content: center;
735
+ color: var(--tollerud-yellow);
736
+ }
737
+ .tollerud-timeline__content {
738
+ flex: 1;
739
+ min-width: 0;
740
+ padding-bottom: 1.25rem;
741
+ }
742
+ .tollerud-timeline__title {
743
+ font-size: 0.875rem;
744
+ font-weight: 600;
745
+ color: var(--foreground);
746
+ }
747
+ .tollerud-timeline__time {
748
+ font-size: 0.75rem;
749
+ color: var(--text-muted);
750
+ white-space: nowrap;
751
+ flex-shrink: 0;
752
+ }
753
+ .tollerud-timeline__description {
754
+ font-size: 0.8125rem;
755
+ color: var(--text-secondary);
756
+ margin-top: 0.125rem;
757
+ line-height: 1.4;
758
+ }
759
+ .tollerud-timeline__meta {
760
+ font-size: 0.6875rem;
761
+ color: var(--text-muted);
762
+ background: var(--tollerud-noir-800);
763
+ padding: 0.125rem 0.375rem;
764
+ border-radius: 3px;
765
+ border: 1px solid var(--tollerud-noir-600);
766
+ }
767
+
768
+ /* ═══ Kbd (Keyboard Shortcut Chip) ═══ */
769
+ .tollerud-kbd {
770
+ display: inline-flex;
771
+ align-items: center;
772
+ gap: 2px;
773
+ }
774
+ .tollerud-kbd__key {
775
+ display: inline-flex;
776
+ align-items: center;
777
+ justify-content: center;
778
+ min-width: 22px;
779
+ height: 22px;
780
+ padding: 0 5px;
781
+ font-family: var(--font-mono);
782
+ font-size: 11px;
783
+ font-weight: 500;
784
+ line-height: 1;
785
+ color: var(--tollerud-noir-200);
786
+ background: var(--tollerud-noir-800);
787
+ border: 1px solid var(--tollerud-noir-600);
788
+ border-radius: 4px;
789
+ box-shadow: 0 1px 0 var(--tollerud-noir-600);
790
+ }
791
+ .tollerud-kbd--sm .tollerud-kbd__key {
792
+ min-width: 18px;
793
+ height: 18px;
794
+ padding: 0 4px;
795
+ font-size: 10px;
796
+ }
797
+
798
+ /* ═══ Action Row ═══ */
799
+ .tollerud-action-row {
800
+ display: flex;
801
+ align-items: center;
802
+ gap: 0.75rem;
803
+ width: 100%;
804
+ padding: 0.5rem 0.75rem;
805
+ background: transparent;
806
+ border: none;
807
+ border-radius: 6px;
808
+ cursor: pointer;
809
+ text-align: left;
810
+ font-family: var(--font-sans);
811
+ transition: background var(--motion-duration-fast) var(--motion-ease-in-out);
812
+ }
813
+ .tollerud-action-row:hover,
814
+ .tollerud-action-row--highlighted {
815
+ background: var(--tollerud-noir-700);
816
+ }
817
+ .tollerud-action-row--disabled {
818
+ opacity: 0.4;
819
+ cursor: not-allowed;
820
+ }
821
+ .tollerud-action-row__icon {
822
+ flex-shrink: 0;
823
+ width: 20px;
824
+ height: 20px;
825
+ display: flex;
826
+ align-items: center;
827
+ justify-content: center;
828
+ color: var(--tollerud-yellow);
829
+ }
830
+ .tollerud-action-row__icon svg {
831
+ width: 18px;
832
+ height: 18px;
833
+ }
834
+ .tollerud-action-row__content {
835
+ flex: 1;
836
+ min-width: 0;
837
+ display: flex;
838
+ flex-direction: column;
839
+ gap: 1px;
840
+ }
841
+ .tollerud-action-row__label {
842
+ font-size: 14px;
843
+ font-weight: 500;
844
+ color: var(--foreground);
845
+ white-space: nowrap;
846
+ overflow: hidden;
847
+ text-overflow: ellipsis;
848
+ }
849
+ .tollerud-action-row__description {
850
+ font-size: 12px;
851
+ color: var(--text-muted);
852
+ white-space: nowrap;
853
+ overflow: hidden;
854
+ text-overflow: ellipsis;
855
+ }
856
+ .tollerud-action-row__shortcut {
857
+ flex-shrink: 0;
858
+ margin-left: auto;
859
+ }
860
+
861
+ /* ═══ Command Menu ═══ */
862
+ .tollerud-cmd-overlay {
863
+ position: fixed;
864
+ inset: 0;
865
+ z-index: var(--z-overlay);
866
+ background: rgba(0, 0, 0, 0.6);
867
+ backdrop-filter: blur(4px);
868
+ -webkit-backdrop-filter: blur(4px);
869
+ animation: tollerud-cmd-overlay-in 150ms var(--motion-ease-out);
870
+ }
871
+ @keyframes tollerud-cmd-overlay-in {
872
+ from { opacity: 0; }
873
+ to { opacity: 1; }
874
+ }
875
+
876
+ .tollerud-cmd {
877
+ position: fixed;
878
+ top: 15vh;
879
+ left: 50%;
880
+ transform: translateX(-50%);
881
+ z-index: var(--z-modal);
882
+ width: min(90vw, 640px);
883
+ max-height: 70vh;
884
+ display: flex;
885
+ flex-direction: column;
886
+ background: var(--surface-raised);
887
+ border: 1px solid var(--tollerud-noir-600);
888
+ border-radius: 12px;
889
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
890
+ animation: tollerud-cmd-in 200ms var(--motion-ease-out);
891
+ overflow: hidden;
892
+ }
893
+ @keyframes tollerud-cmd-in {
894
+ from {
895
+ opacity: 0;
896
+ transform: translateX(-50%) scale(0.96) translateY(-8px);
897
+ }
898
+ to {
899
+ opacity: 1;
900
+ transform: translateX(-50%) scale(1) translateY(0);
901
+ }
902
+ }
903
+
904
+ .tollerud-cmd__header {
905
+ display: flex;
906
+ align-items: center;
907
+ gap: 0.75rem;
908
+ padding: 0.75rem 1rem;
909
+ border-bottom: 1px solid var(--border);
910
+ flex-shrink: 0;
911
+ }
912
+ .tollerud-cmd__search-icon {
913
+ flex-shrink: 0;
914
+ color: var(--text-muted);
915
+ display: flex;
916
+ align-items: center;
917
+ }
918
+ .tollerud-cmd__input {
919
+ flex: 1;
920
+ background: transparent;
921
+ border: none;
922
+ outline: none;
923
+ color: var(--foreground);
924
+ font-family: var(--font-sans);
925
+ font-size: 16px;
926
+ line-height: 1.5;
927
+ }
928
+ .tollerud-cmd__input::placeholder {
929
+ color: var(--text-muted);
930
+ }
931
+
932
+ .tollerud-cmd__list {
933
+ flex: 1;
934
+ overflow-y: auto;
935
+ padding: 0.5rem;
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 0.25rem;
939
+ }
940
+ .tollerud-cmd__empty {
941
+ padding: 2rem 1rem;
942
+ text-align: center;
943
+ font-size: 14px;
944
+ color: var(--text-muted);
945
+ }
946
+ .tollerud-cmd__group {
947
+ display: flex;
948
+ flex-direction: column;
949
+ gap: 1px;
950
+ }
951
+ .tollerud-cmd__group-label {
952
+ padding: 0.5rem 0.75rem 0.25rem;
953
+ font-size: 11px;
954
+ font-weight: 600;
955
+ text-transform: uppercase;
956
+ letter-spacing: 0.06em;
957
+ color: var(--text-muted);
958
+ }
959
+
960
+ .tollerud-cmd__footer {
961
+ display: flex;
962
+ align-items: center;
963
+ gap: 0.75rem;
964
+ padding: 0.5rem 1rem;
965
+ border-top: 1px solid var(--border);
966
+ flex-shrink: 0;
967
+ }
968
+ .tollerud-cmd__hint {
969
+ display: inline-flex;
970
+ align-items: center;
971
+ gap: 4px;
972
+ }
973
+ .tollerud-cmd__hint-text {
974
+ font-size: 11px;
975
+ color: var(--text-muted);
976
+ }
977
+ }
978
+
979
+ @layer utilities {
980
+ /* ═══ Text utilities ═══ */
981
+ .text-balance { text-wrap: balance; }
982
+
983
+ /* ═══ Section container ═══ */
984
+ .tollerud-section {
985
+ max-width: 1100px;
986
+ margin-left: auto;
987
+ margin-right: auto;
988
+ padding-left: 1.5rem;
989
+ padding-right: 1.5rem;
990
+ }
991
+ }
992
+
993
+ /* ═══════════════════════════════════════════════
994
+ Tailwind v4 safelist — Alert tone classes
995
+ ═══════════════════════════════════════════════
996
+ These classes are used dynamically in Alert.tsx and would be missed
997
+ by @source scanning a pre-compiled dist file. Declaring them here
998
+ ensures Tailwind always generates them regardless of @source config.
999
+ ═══════════════════════════════════════════════ */
1000
+
1001
+ /*
1002
+ @source inline("
1003
+ bg-red-500/5 border-red-500/30 text-red-400
1004
+ bg-blue-500/5 border-blue-500/30 text-blue-400
1005
+ bg-green-500/5 border-green-500/30 text-green-400
1006
+ ");
1007
+ */
1008
+
1009
+ @layer utilities {
1010
+ .bg-red-500\/5 { background-color: rgb(239 68 68 / 0.05); }
1011
+ .bg-blue-500\/5 { background-color: rgb(59 130 246 / 0.05); }
1012
+ .bg-green-500\/5 { background-color: rgb(34 197 94 / 0.05); }
1013
+ .border-red-500\/30 { border-color: rgb(239 68 68 / 0.3); }
1014
+ .border-blue-500\/30 { border-color: rgb(59 130 246 / 0.3); }
1015
+ .border-green-500\/30 { border-color: rgb(34 197 94 / 0.3); }
1016
+ .text-red-400 { color: rgb(248 113 113); }
1017
+ .text-blue-400 { color: rgb(96 165 250); }
1018
+ .text-green-400 { color: rgb(74 222 128); }
1019
+ }