styles.css 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. @import url("https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap");
  2. @import "tailwindcss";
  3. /* ─── Design Tokens ─────────────────────────────────────────────────────── */
  4. @theme {
  5. /* Fonts */
  6. --font-sans: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
  7. --font-mono: ui-monospace, "Cascadia Code", "Source Code Pro", "Fira Code", monospace;
  8. /* Olive primitive palette */
  9. --color-olive-50: hsl(75 60% 96%);
  10. --color-olive-100: hsl(75 60% 90%);
  11. --color-olive-200: hsl(75 58% 78%);
  12. --color-olive-300: hsl(75 56% 66%);
  13. --color-olive-400: hsl(75 58% 54%);
  14. --color-olive-500: hsl(75 60% 44%);
  15. --color-olive-600: hsl(75 55% 38%);
  16. --color-olive-700: hsl(75 50% 32%);
  17. --color-olive-800: hsl(75 45% 24%);
  18. --color-olive-900: hsl(75 40% 16%);
  19. /* Border radius */
  20. --radius: 0.75rem; /* 12px — cards, panels, inputs */
  21. --radius-button: 0.4375rem; /* 7px — buttons specifically */
  22. --radius-sm: calc(var(--radius) * 0.5);
  23. --radius-lg: calc(var(--radius) * 1.5);
  24. --radius-full: 9999px;
  25. /* Motion */
  26. --duration-micro: 100ms;
  27. --duration-fast: 150ms;
  28. --duration-base: 200ms;
  29. --duration-slow: 250ms;
  30. --duration-page: 350ms;
  31. --ease-enter: cubic-bezier(0.16, 1, 0.3, 1);
  32. --ease-exit: cubic-bezier(0.4, 0, 1, 1);
  33. --ease-move: cubic-bezier(0.25, 0.46, 0.45, 0.94);
  34. }
  35. /* ─── Semantic color variables ──────────────────────────────────────────── */
  36. :root {
  37. --background: hsl(60 8% 95%);
  38. --foreground: hsl(70 8% 15%);
  39. --card: hsl(60 6% 97%);
  40. --card-foreground: hsl(70 8% 15%);
  41. --muted: hsl(65 8% 91%);
  42. --muted-foreground: hsl(70 4% 45%);
  43. --border: hsl(65 6% 86%);
  44. --primary: hsl(75 60% 44%);
  45. --primary-foreground: hsl(70 8% 15%);
  46. --destructive: hsl(0 55% 52%);
  47. --destructive-foreground: hsl(0 0% 98%);
  48. --ring: hsl(75 60% 44%);
  49. --shadow-sm: 0 1px 2px hsl(70 8% 15% / 0.06);
  50. --shadow-md: 0 4px 12px hsl(70 8% 15% / 0.08);
  51. --shadow-lg: 0 8px 24px hsl(70 8% 15% / 0.10);
  52. }
  53. .dark {
  54. --background: hsl(70 4% 9%);
  55. --foreground: hsl(60 8% 85%);
  56. --card: hsl(70 4% 11%);
  57. --card-foreground: hsl(60 8% 85%);
  58. --muted: hsl(70 4% 15%);
  59. --muted-foreground: hsl(65 4% 50%);
  60. --border: hsl(70 4% 18%);
  61. --primary: hsl(75 55% 52%);
  62. --primary-foreground: hsl(70 4% 9%);
  63. --destructive: hsl(0 45% 42%);
  64. --destructive-foreground: hsl(0 0% 98%);
  65. --ring: hsl(75 55% 52%);
  66. --shadow-sm: 0 1px 2px hsl(70 4% 4% / 0.4);
  67. --shadow-md: 0 4px 12px hsl(70 4% 4% / 0.5);
  68. --shadow-lg: 0 8px 24px hsl(70 4% 4% / 0.6);
  69. }
  70. /* ─── Tailwind v4 CSS variable bridge ───────────────────────────────────── */
  71. /*
  72. Tailwind v4 uses @theme for its utility generation, but our semantic tokens
  73. live in :root/:dark. We bridge them here so Tailwind utilities like
  74. bg-background, text-foreground etc. work correctly.
  75. */
  76. @theme inline {
  77. --color-background: var(--background);
  78. --color-foreground: var(--foreground);
  79. --color-card: var(--card);
  80. --color-card-foreground: var(--card-foreground);
  81. --color-muted: var(--muted);
  82. --color-muted-foreground: var(--muted-foreground);
  83. --color-border: var(--border);
  84. --color-primary: var(--primary);
  85. --color-primary-foreground: var(--primary-foreground);
  86. --color-destructive: var(--destructive);
  87. --color-destructive-foreground: var(--destructive-foreground);
  88. --color-ring: var(--ring);
  89. }
  90. /* ─── Base styles ───────────────────────────────────────────────────────── */
  91. *, *::before, *::after {
  92. box-sizing: border-box;
  93. }
  94. html {
  95. -webkit-font-smoothing: antialiased;
  96. -moz-osx-font-smoothing: grayscale;
  97. text-rendering: optimizeLegibility;
  98. }
  99. body {
  100. background-color: var(--background);
  101. color: var(--foreground);
  102. font-family: var(--font-sans);
  103. font-size: 0.875rem;
  104. line-height: 1.5;
  105. min-height: 100dvh;
  106. }
  107. /* Respect reduced motion */
  108. @media (prefers-reduced-motion: reduce) {
  109. *, *::before, *::after {
  110. animation-duration: 0.01ms !important;
  111. animation-iteration-count: 1 !important;
  112. transition-duration: 0.01ms !important;
  113. }
  114. }
  115. /* ─── Badge semantic classes ─────────────────────────────────────────────── */
  116. /*
  117. Light mode: solid-ish tinted backgrounds — enough opacity to be distinct
  118. against the warm off-white canvas. Borders are full-opacity, slightly deeper
  119. than the bg.
  120. Dark mode: keeps the semi-transparent glow approach that works so well.
  121. */
  122. .badge-active {
  123. background-color: hsl(160 55% 88%);
  124. color: hsl(160 70% 24%);
  125. border-color: hsl(160 50% 76%);
  126. }
  127. .dark .badge-active {
  128. background-color: hsl(160 84% 39% / 0.15);
  129. color: hsl(160 70% 58%);
  130. border-color: hsl(160 84% 39% / 0.32);
  131. }
  132. .badge-paused {
  133. background-color: hsl(38 80% 88%);
  134. color: hsl(38 80% 26%);
  135. border-color: hsl(38 70% 74%);
  136. }
  137. .dark .badge-paused {
  138. background-color: hsl(38 92% 50% / 0.15);
  139. color: hsl(38 92% 68%);
  140. border-color: hsl(38 92% 50% / 0.32);
  141. }
  142. .badge-error {
  143. background-color: hsl(0 70% 92%);
  144. color: hsl(0 65% 34%);
  145. border-color: hsl(0 60% 80%);
  146. }
  147. .dark .badge-error {
  148. background-color: hsl(0 72% 51% / 0.15);
  149. color: hsl(0 72% 70%);
  150. border-color: hsl(0 72% 51% / 0.32);
  151. }
  152. .badge-warning {
  153. background-color: hsl(38 80% 88%);
  154. color: hsl(38 80% 22%);
  155. border-color: hsl(38 70% 74%);
  156. }
  157. .dark .badge-warning {
  158. background-color: hsl(38 92% 50% / 0.15);
  159. color: hsl(38 92% 68%);
  160. border-color: hsl(38 92% 50% / 0.32);
  161. }
  162. .badge-info {
  163. background-color: hsl(199 70% 90%);
  164. color: hsl(199 80% 26%);
  165. border-color: hsl(199 60% 78%);
  166. }
  167. .dark .badge-info {
  168. background-color: hsl(199 89% 48% / 0.15);
  169. color: hsl(199 89% 68%);
  170. border-color: hsl(199 89% 48% / 0.32);
  171. }
  172. .badge-debug {
  173. background-color: hsl(271 60% 92%);
  174. color: hsl(271 65% 34%);
  175. border-color: hsl(271 50% 80%);
  176. }
  177. .dark .badge-debug {
  178. background-color: hsl(271 81% 56% / 0.15);
  179. color: hsl(271 81% 72%);
  180. border-color: hsl(271 81% 56% / 0.32);
  181. }
  182. .badge-trace {
  183. background-color: var(--muted);
  184. color: var(--muted-foreground);
  185. border-color: var(--border);
  186. }
  187. .badge-write {
  188. background-color: hsl(199 70% 90%);
  189. color: hsl(199 80% 26%);
  190. border-color: hsl(199 60% 78%);
  191. }
  192. .dark .badge-write {
  193. background-color: hsl(199 89% 48% / 0.15);
  194. color: hsl(199 89% 68%);
  195. border-color: hsl(199 89% 48% / 0.32);
  196. }
  197. .badge-delete {
  198. background-color: hsl(0 70% 92%);
  199. color: hsl(0 65% 34%);
  200. border-color: hsl(0 60% 80%);
  201. }
  202. .dark .badge-delete {
  203. background-color: hsl(0 72% 51% / 0.15);
  204. color: hsl(0 72% 70%);
  205. border-color: hsl(0 72% 51% / 0.32);
  206. }
  207. /* ─── Alert semantic classes ─────────────────────────────────────────────── */
  208. /*
  209. Same approach as badges:
  210. Light: solid tinted backgrounds, rich text for legibility on the warm off-white canvas.
  211. Dark: semi-transparent glows — the color shines through the dark background.
  212. */
  213. .alert-info {
  214. background-color: hsl(199 70% 90%);
  215. border-color: hsl(199 60% 78%);
  216. color: hsl(199 80% 22%);
  217. }
  218. .dark .alert-info {
  219. background-color: hsl(199 89% 48% / 0.12);
  220. border-color: hsl(199 89% 48% / 0.28);
  221. color: hsl(199 80% 72%);
  222. }
  223. .alert-success {
  224. background-color: hsl(160 55% 88%);
  225. border-color: hsl(160 50% 74%);
  226. color: hsl(160 70% 20%);
  227. }
  228. .dark .alert-success {
  229. background-color: hsl(160 84% 39% / 0.12);
  230. border-color: hsl(160 84% 39% / 0.28);
  231. color: hsl(160 60% 62%);
  232. }
  233. .alert-warning {
  234. background-color: hsl(45 90% 88%);
  235. border-color: hsl(38 80% 72%);
  236. color: hsl(38 80% 22%);
  237. }
  238. .dark .alert-warning {
  239. background-color: hsl(38 92% 50% / 0.12);
  240. border-color: hsl(38 92% 50% / 0.28);
  241. color: hsl(38 90% 68%);
  242. }
  243. .alert-error {
  244. background-color: hsl(0 70% 92%);
  245. border-color: hsl(0 60% 78%);
  246. color: hsl(0 65% 28%);
  247. }
  248. .dark .alert-error {
  249. background-color: hsl(0 72% 51% / 0.12);
  250. border-color: hsl(0 72% 51% / 0.28);
  251. color: hsl(0 72% 72%);
  252. }
  253. /* ─── Focus ring utility ─────────────────────────────────────────────────── */
  254. .focus-ring {
  255. outline: none;
  256. }
  257. .focus-ring:focus-visible {
  258. outline: 2px solid var(--ring);
  259. outline-offset: 2px;
  260. }
  261. /* ─── Scrollbar ──────────────────────────────────────────────────────────── */
  262. ::-webkit-scrollbar {
  263. width: 6px;
  264. height: 6px;
  265. }
  266. ::-webkit-scrollbar-track {
  267. background: transparent;
  268. }
  269. ::-webkit-scrollbar-thumb {
  270. background: var(--border);
  271. border-radius: var(--radius-full);
  272. }
  273. ::-webkit-scrollbar-thumb:hover {
  274. background: var(--muted-foreground);
  275. }