File size: 10,925 Bytes
c7bece7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
@import "tailwindcss";

/* ---------------------------------------------------------------------------
   LedgerLens — "Instrument of record"

   Second identity. The first ("Obsidian & Acid") was a near-black ground with a
   single acid-lime accent, chosen to avoid colliding with a sibling project — a
   good reason that happened to land on the most-generated look there is. Neon on
   black is the house style of every AI-built dashboard, so adding more glow to it
   would have made this page *more* templated, not more futuristic.

   The futurism here is borrowed from the subject instead. This product's promise
   is a record that cannot be forged or rewritten, and that world already has a
   visual language: security printing, assay marks, engraved instruments,
   oxidised metal. Verdigris and copper are the colours of metal that has proven
   it is old; bone is the colour of the paper such things are printed on.

   Three axes, each derived from the product rather than from a mood:
     hue       metallurgical — verdigris, copper, bone on slate-teal black
     geometry  engraved rules and machined chamfers; no blur, no rounding
     argument  verification is quiet, exception is loud (see --color-pass)

   The inversion is the point. Most dashboards shout green for success, which
   trains the eye to skip the only state that needs a person. Here DONE is nearly
   silent and NEEDS REVIEW carries the sodium flare.
--------------------------------------------------------------------------- */
@theme {
  --color-base: #050b0a;
  --color-base-raised: #0a1614;
  --color-base-sunken: #020605;
  --color-panel: #0a1513;
  --color-panel-top: #0f1f1c;

  /* Verdigris: oxidised copper, the colour of security ink and proven age.
     Desaturated and blue-shifted on purpose — it must never read as neon. */
  --color-accent: #4fd1a5;
  --color-accent-dim: #2a6b56;
  --color-accent-glow: rgb(79 209 165 / 0.34);

  /* Copper does the structural work: engraved rules, seals, chamfer ticks. */
  --color-copper: #b87333;
  --color-copper-dim: rgb(184 115 51 / 0.32);

  --color-ink: #e6e2d3;
  --color-ink-muted: #9aa39c;
  --color-ink-faint: #5d6a64;

  /* State only — never decoration. `pass` is deliberately the quietest colour on
     the page: a verified document is the uninteresting outcome and must not
     compete with the one asking for a human. */
  --color-pass: #6f9c88;
  --color-flag: #e2564d;
  --color-warn: #e8a33d;

  --color-hairline: rgb(154 163 156 / 0.16);
  --color-hairline-strong: rgb(184 115 51 / 0.34);

  --font-engraved: var(--font-instrument-serif), ui-serif, Georgia, serif;
  --font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
  --font-mono: var(--font-geist-mono), ui-monospace, "SF Mono", monospace;
}

:root {
  color-scheme: dark;
  /* The machined corner cut, shared by every panel so the silhouette is
     consistent: top-right and bottom-left are chamfered, the other two are
     square. Asymmetry reads as engineered rather than merely rounded-off. */
  --bevel: polygon(
    0 0,
    calc(100% - 15px) 0,
    100% 15px,
    100% 100%,
    15px 100%,
    0 calc(100% - 15px)
  );
  --bevel-sm: polygon(
    0 0,
    calc(100% - 8px) 0,
    100% 8px,
    100% 100%,
    8px 100%,
    0 calc(100% - 8px)
  );
}

html,
body {
  background-color: var(--color-base);
  color: var(--color-ink);
}

body {
  font-family: var(--font-sans);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  min-height: 100dvh;
}

/* --------------------------------------------------------------------------
   Backdrop: a technical grid, one violet wash, and a fine scanline field.
   No blur anywhere in this design.
-------------------------------------------------------------------------- */
.backdrop-grid {
  position: fixed;
  inset: 0;
  z-index: -2;
  pointer-events: none;
  background-color: var(--color-base);
  background-image:
    radial-gradient(1100px 560px at 50% -12%, rgb(79 209 165 / 0.055), transparent 62%),
    radial-gradient(760px 460px at 88% 4%, rgb(184 115 51 / 0.11), transparent 60%),
    linear-gradient(to right, rgb(79 209 165 / 0.035) 1px, transparent 1px),
    linear-gradient(to bottom, rgb(79 209 165 / 0.035) 1px, transparent 1px);
  background-size:
    100% 100%,
    100% 100%,
    64px 64px,
    64px 64px;
  mask-image: radial-gradient(ellipse 110% 74% at 50% 0%, #000 52%, transparent 100%);
}

/* Engine-turning. The interference of two fine arcs is what guilloché is — the
   pattern on a banknote or a share certificate, difficult to reproduce and
   therefore used to prove a document is the original. Kept at a very low
   amplitude: it should read as the texture of the surface, not as an effect. */
.scanlines {
  position: fixed;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background-image:
    repeating-radial-gradient(
      circle at 18% -10%,
      rgb(184 115 51 / 0.028) 0 1px,
      transparent 1px 9px
    ),
    repeating-radial-gradient(
      circle at 84% 118%,
      rgb(79 209 165 / 0.022) 0 1px,
      transparent 1px 11px
    );
}

/* An engraved rule: a bright hairline sitting on its own shadow, the way an
   intaglio line sits proud of the paper. */
.engraved {
  border-top: 1px solid rgb(184 115 51 / 0.22);
  box-shadow: 0 -1px 0 rgb(0 0 0 / 0.55);
}

/* --------------------------------------------------------------------------
   Panels: hard-edged, chamfered, solid. `clip-path` removes the border on the
   cut edges, so contrast does the work a border would — the panel fill is
   deliberately lighter than the base rather than translucent.
-------------------------------------------------------------------------- */
.panel {
  position: relative;
  background: linear-gradient(180deg, var(--color-panel-top) 0%, var(--color-panel) 100%);
  clip-path: var(--bevel);
}

.panel-hover {
  transition:
    background 200ms ease,
    transform 200ms ease;
}
.panel-hover:hover {
  background: linear-gradient(180deg, #142b26 0%, #0d1c19 100%);
}

/* An acid hairline along the top edge, and a machined tick in the chamfer. */
.edge-light::before {
  content: "";
  position: absolute;
  inset-inline: 0;
  top: 0;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent,
    var(--color-accent-glow) 30%,
    var(--color-accent-glow) 70%,
    transparent
  );
}
.edge-light::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 15px;
  height: 15px;
  background: linear-gradient(45deg, transparent 49%, var(--color-copper) 49% 52%, transparent 52%);
  opacity: 0.65;
}

/* Corner brackets — the HUD tell. */
.ticks::before,
.ticks::after {
  content: "";
  position: absolute;
  width: 9px;
  height: 9px;
  border-color: var(--color-copper);
  opacity: 0.55;
}
.ticks::before {
  left: 7px;
  top: 7px;
  border-left: 1px solid;
  border-top: 1px solid;
}
.ticks::after {
  right: 7px;
  bottom: 7px;
  border-right: 1px solid;
  border-bottom: 1px solid;
}

.bevel {
  clip-path: var(--bevel);
}
.bevel-sm {
  clip-path: var(--bevel-sm);
}

/* --------------------------------------------------------------------------
   Glows — flat rings, no soft blur halo.
-------------------------------------------------------------------------- */
.glow-accent {
  box-shadow:
    inset 0 0 0 1px rgb(79 209 165 / 0.45),
    0 0 22px -8px rgb(79 209 165 / 0.7);
}
.glow-pass {
  box-shadow:
    inset 0 0 0 1px rgb(111 156 136 / 0.4),
    0 0 20px -10px rgb(111 156 136 / 0.6);
}
.glow-flag {
  box-shadow:
    inset 0 0 0 1px rgb(226 86 77 / 0.45),
    0 0 24px -8px rgb(226 86 77 / 0.65);
}
.glow-warn {
  box-shadow:
    inset 0 0 0 1px rgb(232 163 61 / 0.4),
    0 0 20px -10px rgb(232 163 61 / 0.6);
}

/* --------------------------------------------------------------------------
   Typography
-------------------------------------------------------------------------- */
.tabular {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
}

/* The engraved face, declared here rather than left to the generated utility.
   Everything in this file is unlayered, and unlayered declarations beat anything
   in `@layer utilities` — so a rule here is the one that actually lands. Used on
   the hero and panel titles only: the page is mono-dominant, and the serif is
   the human voice among the machine output. */
.font-engraved {
  font-family: var(--font-instrument-serif), ui-serif, Georgia, serif;
  font-weight: 400;
}

/* Mono-forward: this is a ledger, so labels read as machine output. */
.eyebrow {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-ink-faint);
  font-weight: 500;
}

.stat {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
}

/* --------------------------------------------------------------------------
   Segmented meter — the ▓▓▓░░ bar. A discrete readout suits a ledger better
   than a continuous progress bar.
-------------------------------------------------------------------------- */
.meter {
  display: flex;
  gap: 2px;
  height: 4px;
}
.meter-cell {
  flex: 1;
  background: rgb(154 163 156 / 0.16);
}
.meter-cell[data-on="true"] {
  background: var(--color-accent);
}
.meter-cell[data-tone="pass"][data-on="true"] {
  background: var(--color-pass);
}
.meter-cell[data-tone="flag"][data-on="true"] {
  background: var(--color-flag);
}
.meter-cell[data-tone="warn"][data-on="true"] {
  background: var(--color-warn);
}

/* --------------------------------------------------------------------------
   Pipeline motion
-------------------------------------------------------------------------- */
@keyframes chevron-run {
  from {
    background-position: 0 0;
  }
  to {
    background-position: 16px 0;
  }
}

/* Marching chevrons instead of a sweeping gradient. */
.connector-active {
  background-image: repeating-linear-gradient(
    90deg,
    var(--color-accent) 0px,
    var(--color-accent) 5px,
    transparent 5px,
    transparent 16px
  );
  animation: chevron-run 0.55s linear infinite;
}

@keyframes breathe {
  0%,
  100% {
    opacity: 0.5;
  }
  50% {
    opacity: 1;
  }
}
.breathe {
  animation: breathe 1.4s steps(8, end) infinite;
}

::selection {
  background: rgb(79 209 165 / 0.3);
  color: #050b0a;
}

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: transparent;
}
::-webkit-scrollbar-thumb {
  background: rgb(154 163 156 / 0.22);
  border: 3px solid transparent;
  background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
  background: rgb(79 209 165 / 0.4);
  background-clip: content-box;
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}