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