@danieldeusing/design 0.3.4 → 0.5.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.
- package/dist/danieldeusing-design.css +103 -4
- package/dist/danieldeusing-design.min.css +2 -2
- package/package.json +1 -1
- package/src/base.css +2 -2
- package/src/chrome.css +15 -0
- package/src/tailwind.css +13 -0
- package/src/tokens.css +85 -1
- package/tokens/tokens.json +20 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! danieldeusing-design v0.
|
|
1
|
+
/*! danieldeusing-design v0.5.0 | MIT | https://github.com/danieldeusing/danieldeusing-design */
|
|
2
2
|
/* ===== reset.css ===== */
|
|
3
3
|
/*
|
|
4
4
|
* danieldeusing-design — minimal reset.
|
|
@@ -100,13 +100,30 @@ table {
|
|
|
100
100
|
* A gap of 0.0692 with nothing in it. So NO single hex can serve four themes:
|
|
101
101
|
* the two near-black themes need a light tint, the two light themes a dark one,
|
|
102
102
|
* and every compromise fails both. That is arithmetic, not taste — which is why
|
|
103
|
-
* --destructive, --success and --
|
|
103
|
+
* --destructive, --success, --warning, --info and --pending are each declared
|
|
104
|
+
* four times.
|
|
104
105
|
*
|
|
105
106
|
* Cockpit carried twelve hardcoded accents that predate these tokens; every one
|
|
106
107
|
* missed AA on at least one theme and four sat inside the gap, clearing neither
|
|
107
108
|
* side. Adding a status colour? Add a TOKEN here with its measured worst-case
|
|
108
109
|
* ratio in a trailing comment. Do not tune a literal at the call site — that
|
|
109
110
|
* forks the palette and fixes exactly one theme.
|
|
111
|
+
*
|
|
112
|
+
* ── FIVE STATUS ACCENTS, BECAUSE A STATE MACHINE HAS MORE THAN THREE STATES ──
|
|
113
|
+
* good / attention / bad covers a verdict. It does not cover the two states a
|
|
114
|
+
* dashboard spends most of its time showing, and cockpit forked a literal for
|
|
115
|
+
* each of them rather than go without:
|
|
116
|
+
*
|
|
117
|
+
* --info a state, not a verdict. In flight, informational, recorded and
|
|
118
|
+
* fine but not a win: dispatching, gated, started-by-hand, "silent
|
|
119
|
+
* for a reason". Blue, so it never reads as an alarm.
|
|
120
|
+
* --pending NO verdict yet. Still running, timed out, could not determine,
|
|
121
|
+
* not recorded: the answer is absent, which is different from the
|
|
122
|
+
* answer being bad. Violet, so it never reads as --destructive.
|
|
123
|
+
*
|
|
124
|
+
* Both are peers of --success/--warning/--destructive and obey the same rule:
|
|
125
|
+
* one value for the two light themes, one for the two near-black ones, each
|
|
126
|
+
* measured against --background, --card AND --muted.
|
|
110
127
|
*/
|
|
111
128
|
|
|
112
129
|
:root {
|
|
@@ -127,6 +144,8 @@ table {
|
|
|
127
144
|
--destructive: #a02c2c;
|
|
128
145
|
--success: #1a6b2e; /* 5.16:1 worst surface */
|
|
129
146
|
--warning: #845600; /* 4.97:1 worst surface */
|
|
147
|
+
--info: #1c5f9e; /* 5.17:1 worst surface */
|
|
148
|
+
--pending: #5f3dc4; /* 5.58:1 worst surface */
|
|
130
149
|
--border: #d9cdb6;
|
|
131
150
|
--input: #d9cdb6;
|
|
132
151
|
--ring: #8a4516;
|
|
@@ -159,6 +178,8 @@ html[data-theme="green"] {
|
|
|
159
178
|
--destructive: #ff5c5c;
|
|
160
179
|
--success: #4ade80; /* 10.76:1 worst surface */
|
|
161
180
|
--warning: #f5b32b; /* 10.15:1 worst surface */
|
|
181
|
+
--info: #4dabf7; /* 7.57:1 worst surface */
|
|
182
|
+
--pending: #b197fc; /* 7.77:1 worst surface */
|
|
162
183
|
--border: #1c4a2c;
|
|
163
184
|
--input: #1c4a2c;
|
|
164
185
|
--ring: #33ff66;
|
|
@@ -186,6 +207,8 @@ html[data-theme="mono"] {
|
|
|
186
207
|
--destructive: #ff5c5c;
|
|
187
208
|
--success: #4ade80; /* 10.84:1 worst surface */
|
|
188
209
|
--warning: #f5b32b; /* 10.22:1 worst surface */
|
|
210
|
+
--info: #4dabf7; /* 7.63:1 worst surface */
|
|
211
|
+
--pending: #b197fc; /* 7.82:1 worst surface */
|
|
189
212
|
--border: #333333;
|
|
190
213
|
--input: #333333;
|
|
191
214
|
--ring: #ffffff;
|
|
@@ -213,6 +236,8 @@ html[data-theme="paper"] {
|
|
|
213
236
|
--destructive: #b3261e;
|
|
214
237
|
--success: #1a7031; /* 5.36:1 worst surface */
|
|
215
238
|
--warning: #8f5d00; /* 4.89:1 worst surface */
|
|
239
|
+
--info: #1c5f9e; /* 5.74:1 worst surface */
|
|
240
|
+
--pending: #5f3dc4; /* 6.19:1 worst surface */
|
|
216
241
|
--border: #d4d4d4;
|
|
217
242
|
--input: #d4d4d4;
|
|
218
243
|
--ring: #000000;
|
|
@@ -221,6 +246,65 @@ html[data-theme="paper"] {
|
|
|
221
246
|
--scanline-opacity: 0.12;
|
|
222
247
|
}
|
|
223
248
|
|
|
249
|
+
/*
|
|
250
|
+
* ── LAYOUT + TYPE SCALE — not per-theme, and that is the point ─────────────
|
|
251
|
+
*
|
|
252
|
+
* Colours are declared four times because the arithmetic forces it (above).
|
|
253
|
+
* Measurements are the opposite case: there is exactly one right answer and it
|
|
254
|
+
* must not vary by theme, by page, or by surface. They live in one :root block
|
|
255
|
+
* so that is structurally obvious.
|
|
256
|
+
*
|
|
257
|
+
* WHY THESE EXIST AT ALL. Audited 2026-08-05, the five surfaces had FOUR
|
|
258
|
+
* different content widths — cockpit 78rem, netmon 1180px, danieldeusing.de
|
|
259
|
+
* 72rem (Tailwind max-w-6xl), the containers dashboard none — and netmon set a
|
|
260
|
+
* flat `font: 13px` where everything else sat at 0.75rem. Nobody chose that;
|
|
261
|
+
* each surface just picked a number in isolation because the design system
|
|
262
|
+
* offered none. A token nobody has to think about is the only fix that stays
|
|
263
|
+
* fixed: the next page inherits the answer instead of inventing a fifth one.
|
|
264
|
+
*
|
|
265
|
+
* "SAME FONT SIZE DEPENDING ON WINDOW SIZE" is two mechanisms, not one, and
|
|
266
|
+
* they are easy to confuse:
|
|
267
|
+
* - This scale sets the RATIOS. It is fixed in rem and does not track the
|
|
268
|
+
* viewport, so a caption is the same amount smaller than body text on every
|
|
269
|
+
* surface, always.
|
|
270
|
+
* - runtime/zoom.js `initResolutionZoom()` makes the whole page track the
|
|
271
|
+
* WINDOW, by laying out at a 1920px reference and zooming above it. Every
|
|
272
|
+
* surface must call it, pre-paint from <head>, or it will look right on one
|
|
273
|
+
* monitor and wrong on the next. Scale without zoom = fixed on a 4K screen;
|
|
274
|
+
* zoom without scale = uniform sizes drifting apart between pages.
|
|
275
|
+
*
|
|
276
|
+
* WHY THE STEPS ARE 1px APART AT THE BOTTOM. This is a terminal UI: body is
|
|
277
|
+
* 12px and the useful range is 10-15px, so a geometric ratio scale (1.25×,
|
|
278
|
+
* 1.333×) would give three usable steps and then jump straight past everything
|
|
279
|
+
* that matters. The small end is hand-tuned to the pixel; only the display
|
|
280
|
+
* sizes, where a pixel stops being visible, open up. Sizes are rem so a reader
|
|
281
|
+
* who raises their browser's base font gets the whole scale with them.
|
|
282
|
+
*/
|
|
283
|
+
:root {
|
|
284
|
+
/* Content column. 78rem is cockpit's — the widest of the four found, the one
|
|
285
|
+
already tuned against the `ls -l` rail, and the surface with the most page
|
|
286
|
+
types. Standardising on the narrowest would have reflowed every table.
|
|
287
|
+
A page whose content genuinely is not a column (a full-bleed dashboard
|
|
288
|
+
table) sets `max-width: none` deliberately; it does not pick another number. */
|
|
289
|
+
--content-w: 78rem;
|
|
290
|
+
/* Horizontal breathing room, i.e. Daniel's "same margins left and right".
|
|
291
|
+
Vertical padding stays a page's own business — a doc and a dashboard do
|
|
292
|
+
not want the same headroom, and pretending otherwise is what produced the
|
|
293
|
+
four widths in the first place. */
|
|
294
|
+
--content-pad: 1.5rem;
|
|
295
|
+
|
|
296
|
+
--fs-xs: 0.625rem; /* 10px — table micro-labels, badge text, meta lines */
|
|
297
|
+
--fs-sm: 0.6875rem; /* 11px — secondary and muted copy */
|
|
298
|
+
--fs-base: 0.75rem; /* 12px — body. THE reference; base.css sets it on <body> */
|
|
299
|
+
--fs-md: 0.8125rem; /* 13px — emphasised body, card headings, table headers */
|
|
300
|
+
--fs-lg: 0.9375rem; /* 15px — h3 / section heads */
|
|
301
|
+
--fs-xl: 1.125rem; /* 18px — h2 / page title */
|
|
302
|
+
--fs-2xl: 1.5rem; /* 24px — h1 / hero, display only */
|
|
303
|
+
|
|
304
|
+
--lh-tight: 1.3; /* headings and single-line chrome */
|
|
305
|
+
--lh-base: 1.5; /* body copy; matches base.css */
|
|
306
|
+
}
|
|
307
|
+
|
|
224
308
|
/* ===== base.css ===== */
|
|
225
309
|
/*
|
|
226
310
|
* danieldeusing-design — base layer.
|
|
@@ -253,8 +337,8 @@ body {
|
|
|
253
337
|
background: var(--background);
|
|
254
338
|
color: var(--foreground);
|
|
255
339
|
font-family: var(--font-mono);
|
|
256
|
-
font-size:
|
|
257
|
-
line-height:
|
|
340
|
+
font-size: var(--fs-base);
|
|
341
|
+
line-height: var(--lh-base);
|
|
258
342
|
overflow-x: hidden;
|
|
259
343
|
-webkit-font-smoothing: antialiased;
|
|
260
344
|
-moz-osx-font-smoothing: grayscale;
|
|
@@ -868,6 +952,21 @@ html.dgm-locked, html.dgm-locked body { overflow: hidden; }
|
|
|
868
952
|
* Breakpoint: 48rem.
|
|
869
953
|
*/
|
|
870
954
|
|
|
955
|
+
/* ── the content column ──
|
|
956
|
+
ONE definition of "how wide is the page, and how far from the edge", because
|
|
957
|
+
four surfaces each had their own until 2026-08-05 (78rem / 1180px / 72rem /
|
|
958
|
+
none). Only the INLINE axis is set here: vertical rhythm differs legitimately
|
|
959
|
+
between a doc and a dashboard, and forcing that too is how a shared rule earns
|
|
960
|
+
a local override — which is how the drift started in the first place.
|
|
961
|
+
|
|
962
|
+
Consumers therefore set `padding-block`, never the `padding` shorthand: the
|
|
963
|
+
shorthand resets padding-inline to 0 and quietly takes the margins back. */
|
|
964
|
+
.wrap {
|
|
965
|
+
max-width: var(--content-w);
|
|
966
|
+
margin-inline: auto;
|
|
967
|
+
padding-inline: var(--content-pad);
|
|
968
|
+
}
|
|
969
|
+
|
|
871
970
|
/* ── a11y helpers ── */
|
|
872
971
|
.skip-link {
|
|
873
972
|
position: absolute; left: -999px; top: 0; z-index: 100;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! danieldeusing-design v0.
|
|
2
|
-
*,*::before,*::after{box-sizing: border-box}*{margin: 0}html{-webkit-text-size-adjust: 100%;text-size-adjust: 100%;tab-size: 4}body{min-height: 100vh;min-height: 100dvh;line-height: 1.5}img,picture,video,canvas,svg{display: block;max-width: 100%}input,button,textarea,select{font: inherit;color: inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap: break-word}ul,ol{list-style: none;padding: 0}a{color: inherit;text-decoration: none}table{border-collapse: collapse}:root{--background: #f5efe2;--foreground: #43352a;--card: #efe7d4;--card-foreground: #43352a;--popover: #efe7d4;--popover-foreground: #43352a;--primary: #8a4516;--primary-foreground: #f8f3e8;--secondary: #ece3cf;--secondary-foreground: #43352a;--muted: #ece3cf;--muted-foreground: #71614e;--accent: #8a4516;--accent-foreground: #f8f3e8;--destructive: #a02c2c;--success: #1a6b2e;--warning: #845600;--border: #d9cdb6;--input: #d9cdb6;--ring: #8a4516;--glow: rgba(160,82,45,0.1);--glow-soft: rgba(160,82,45,0.05);--scanline-opacity: 0.15;--radius: 0rem;--font-mono: "JetBrains Mono Variable","JetBrains Mono","Menlo",monospace}html[data-theme="green"]{--background: #020604;--foreground: #4fdd7d;--card: #04110a;--card-foreground: #4fdd7d;--popover: #04110a;--popover-foreground: #4fdd7d;--primary: #33ff66;--primary-foreground: #02160a;--secondary: #071509;--secondary-foreground: #4fdd7d;--muted: #071509;--muted-foreground: #3da45e;--accent: #33ff66;--accent-foreground: #02160a;--destructive: #ff5c5c;--success: #4ade80;--warning: #f5b32b;--border: #1c4a2c;--input: #1c4a2c;--ring: #33ff66;--glow: rgba(51,255,102,0.35);--glow-soft: rgba(51,255,102,0.12);--scanline-opacity: 0.5}html[data-theme="mono"]{--background: #050505;--foreground: #d4d4d4;--card: #0d0d0d;--card-foreground: #d4d4d4;--popover: #0d0d0d;--popover-foreground: #d4d4d4;--primary: #ffffff;--primary-foreground: #050505;--secondary: #111111;--secondary-foreground: #d4d4d4;--muted: #111111;--muted-foreground: #8a8a8a;--accent: #ffffff;--accent-foreground: #050505;--destructive: #ff5c5c;--success: #4ade80;--warning: #f5b32b;--border: #333333;--input: #333333;--ring: #ffffff;--glow: rgba(255,255,255,0.25);--glow-soft: rgba(255,255,255,0.08);--scanline-opacity: 0.45}html[data-theme="paper"]{--background: #fafafa;--foreground: #1f1f1f;--card: #f1f1f1;--card-foreground: #1f1f1f;--popover: #f1f1f1;--popover-foreground: #1f1f1f;--primary: #000000;--primary-foreground: #fafafa;--secondary: #efefef;--secondary-foreground: #1f1f1f;--muted: #efefef;--muted-foreground: #595959;--accent: #000000;--accent-foreground: #fafafa;--destructive: #b3261e;--success: #1a7031;--warning: #8f5d00;--border: #d4d4d4;--input: #d4d4d4;--ring: #000000;--glow: rgba(0,0,0,0.06);--glow-soft: rgba(0,0,0,0.04);--scanline-opacity: 0.12}html{scroll-behavior: smooth}*,*::before,*::after{border-color: var(--border)}:focus-visible{outline: 2px solid var(--ring);outline-offset: 2px}body{background: var(--background);color: var(--foreground);font-family: var(--font-mono);font-size: 0.75rem;line-height: 1.5;overflow-x: hidden;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale}button:not(:disabled),summary,[role="button"]{cursor: pointer}body::after{content: "";position: fixed;inset: 0;z-index: 40;pointer-events: none;background: repeating-linear-gradient( 0deg,rgba(0,0,0,0.25) 0px,rgba(0,0,0,0.25) 1px,transparent 1px,transparent 3px );opacity: var(--scanline-opacity)}::selection{background: var(--primary);color: var(--primary-foreground)}.glow{color: var(--primary);text-shadow: 0 0 8px var(--glow)}.glow-lg{color: var(--primary);text-shadow: 0 0 12px var(--glow)}.prompt{font-size: 0.75rem;font-weight: 700;color: var(--muted-foreground)}.prompt::before{content: "$ ";color: var(--primary)}.comment::before{content: "# ";color: var(--border)}.cursor-block{display: inline-block;width: 0.55em;height: 1em;margin-left: 8px;background: var(--primary);vertical-align: baseline;transform: translateY(0.12em);animation: ddd-blink 1.1s step-end infinite}@keyframes ddd-blink{50%{opacity: 0}}.btn-terminal{display: inline-block;background: var(--primary);color: var(--primary-foreground);font-weight: 700;padding: 12px 24px;box-shadow: 0 0 16px var(--glow);transition: box-shadow 0.15s ease,transform 0.15s ease}.btn-terminal::before{content: "> "}.btn-terminal:hover{box-shadow: 0 0 28px var(--glow);transform: translateY(-2px)}.link-quiet{color: var(--muted-foreground);text-decoration: underline;text-underline-offset: 4px;transition: color 0.15s ease}.link-quiet:hover{color: var(--primary)}.anim-toggle{display: inline-flex;align-items: center;gap: 6px;font: inherit;color: var(--muted-foreground);background: none;border: 0;cursor: pointer;transition: color 0.15s ease}.anim-toggle:hover{color: var(--primary)}.anim-toggle[aria-pressed="true"] [data-anim-box]{color: var(--primary)}.dd-dot{display: inline-block;width: 11px;height: 11px;flex: none;border-radius: 50%;background: currentColor}.dd-flag{display: inline-block;width: 15px;height: 10px;flex: none;border: 1px solid var(--border);background-size: cover;background-repeat: no-repeat}.dd-flag-de{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='4' fill='%23262626'/><rect y='4' width='18' height='4' fill='%23c83232'/><rect y='8' width='18' height='4' fill='%23e8be32'/></svg>")}.dd-flag-en{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='12' fill='%23b22234'/><rect y='4' width='18' height='4' fill='%23ececec'/><rect width='8' height='6' fill='%233c3b6e'/></svg>")}.dd-flag-pt{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='12' fill='%231c9148'/><polygon points='9,1.5 15.5,6 9,10.5 2.5,6' fill='%23e8c832'/><rect x='8' y='5' width='2' height='2' fill='%232c3f87'/></svg>")}.dd-flag-es{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='6' height='12' fill='%2315734c'/><rect x='6' width='6' height='12' fill='%23ececec'/><rect x='12' width='6' height='12' fill='%23bf2233'/><rect x='8' y='5' width='2' height='2' fill='%237a5c3a'/></svg>")}.ascii-rule{margin: 1rem 0;border: 0;color: var(--border);line-height: 1;white-space: nowrap;overflow: hidden;user-select: none}.ascii-rule::before{content: "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"}.card-terminal{background: var(--card);border: 1px solid var(--border);transition: border-color 0.15s ease,box-shadow 0.15s ease}.card-terminal:hover{border-color: var(--primary);box-shadow: 0 0 20px var(--glow-soft)}.dropdown{position: relative}.dropdown>summary{display: inline-flex;align-items: center;gap: 6px;cursor: pointer;user-select: none;list-style: none;color: var(--muted-foreground);transition: color 0.15s ease}.dropdown>summary::-webkit-details-marker{display: none}.dropdown>summary:hover,.dropdown[open]>summary{color: var(--primary)}.dropdown-panel{position: absolute;right: 0;bottom: calc(100% + 12px);z-index: 50;min-width: 128px;margin: 0;padding: 4px 0;list-style: none;background: var(--card);border: 1px solid var(--border);border-radius: 0;box-shadow: 0 0 20px var(--glow-soft)}.dropdown-panel--down{top: calc(100% + 8px);bottom: auto;left: 0;right: auto}.dropdown-item{display: flex;align-items: center;gap: 8px;width: 100%;padding: 5px 14px;text-align: left;font: inherit;line-height: 1.5;background: none;border: 0;color: var(--muted-foreground);cursor: pointer;white-space: nowrap;transition: color 0.15s ease}.dropdown-item:hover{color: var(--primary);background: var(--muted)}.dropdown-item[aria-current="true"],html:not([data-theme]) .dropdown-item[data-theme-value="warm"],html[data-theme="green"] .dropdown-item[data-theme-value="green"],html[data-theme="mono"] .dropdown-item[data-theme-value="mono"],html[data-theme="paper"] .dropdown-item[data-theme-value="paper"],html[data-theme="warm"] .dropdown-item[data-theme-value="warm"]{color: var(--primary);text-shadow: 0 0 8px var(--glow)}.eli5{margin: 1.25em 0;padding: 0.7em 1em;color: var(--foreground);background: color-mix(in srgb,var(--primary) 7%,var(--card));border: 1px solid var(--border);border-left: 3px solid var(--primary);border-radius: var(--radius);font-size: 0.92em;line-height: 1.6}.eli5::before{content: "ELI5";display: inline-flex;align-items: center;justify-content: center;margin-right: 0.6em;vertical-align: 0.08em;font-family: var(--font-mono);font-size: 0.72em;font-weight: 700;line-height: 1;letter-spacing: 0.04em;padding: 0.34em 0.6em;border-radius: 5px;background: #b42318;color: #fff}.eli5-term{font-weight: 700;color: var(--primary)}html.anim-off *,html.anim-off *::before,html.anim-off *::after{animation: none !important}html.anim-off .cursor-block{display: none}@media (prefers-reduced-motion: no-preference){html.term-anim [data-term] .prompt:not(.term-live),html.term-anim [data-term] .prompt:not(.term-live)::before{color: transparent}html.term-anim [data-term] [data-term-out]:not(.term-show){visibility: hidden}html.term-anim [data-term] [data-term-out].term-show{animation: ddd-term-output 0.2s steps(3,end) both}@keyframes ddd-term-output{from{opacity: 0}}html.term-anim [data-term] [data-term-out].term-show>*{animation: ddd-term-output 0.25s steps(3,end) both}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(2){animation-delay: 0.09s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(3){animation-delay: 0.18s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(4){animation-delay: 0.27s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(5){animation-delay: 0.36s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(6){animation-delay: 0.45s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(7){animation-delay: 0.54s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(8){animation-delay: 0.63s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(9){animation-delay: 0.72s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(10){animation-delay: 0.81s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(n + 11){animation-delay: 0.9s}.term-caret{display: inline-block;width: 0.55em;height: 1em;margin-left: 2px;background: var(--primary);vertical-align: baseline;transform: translateY(0.12em)}}.tabs{display: flex;flex-wrap: wrap;gap: 0.15rem;margin: 1.35rem 0 0;border-bottom: 2px solid color-mix(in srgb,var(--border) 80%,transparent)}.tab{background: transparent;border: 0;margin-bottom: -2px;font: inherit;font-size: 0.86em;cursor: pointer;padding: 0.5rem 0.95rem;color: var(--muted-foreground);transition: background 0.12s ease,color 0.12s ease}.tab:hover{color: var(--primary);background: color-mix(in srgb,var(--primary) 10%,transparent)}.tab[aria-selected="true"]{background: var(--primary);color: var(--background);font-weight: 700}.tab:focus-visible{outline: 2px solid color-mix(in srgb,var(--primary) 55%,transparent);outline-offset: -2px}@media (pointer: coarse),(max-width: 40rem){.tab{padding: 0.7rem 0.8rem;min-height: 44px}}section.doc.tab-panel{margin-top: 1.35rem}details.fold{border-top: 1px solid color-mix(in srgb,currentColor 15%,transparent)}details.fold>summary{display: flex;align-items: center;gap: 0.5rem;cursor: pointer;list-style: none;padding: 0.55rem 0;font-size: 0.85rem;color: var(--muted-foreground)}details.fold>summary::-webkit-details-marker{display: none}details.fold>summary::before{content: "\25B8";flex: none;opacity: 0.6}details.fold[open]>summary::before{content: "\25BE"}details.fold>summary:hover{color: var(--primary)}details.fold>summary:focus-visible{outline: 2px solid color-mix(in srgb,currentColor 45%,transparent);outline-offset: 2px}.fold-body{font-size: 0.9rem;padding: 0 0 0.7rem 1.1rem}.fold-body>* + *{margin-top: 0.6rem}.legend{list-style: none;padding: 0;margin: 0.7rem 0 0;display: grid;gap: 0.4rem 1.4rem;font-size: 0.86rem}@media (min-width: 52rem){.legend{grid-template-columns: repeat(2,minmax(0,1fr))}}.legend>li{line-height: 1.6}.legend>li>:first-child{margin-right: 0.45rem}.tickstrip:not(:empty){border: 1px solid var(--border);background: var(--card);margin: 1.6rem 0 1.5rem}.ticktable{width: 100%;border-collapse: collapse;font-size: 0.82rem}.ticktable td{padding: 0.5rem 0.75rem;vertical-align: baseline;border: 0;white-space: nowrap}.ticktable td.tick-stats{width: 100%;white-space: normal}.tick{border-bottom: 1px solid color-mix(in srgb,var(--border) 55%,transparent)}.tick:last-child{border-bottom: 0}.tick-dot{font-size: 0.7em;width: 1.5rem;padding-right: 0 !important;border-left: 3px solid transparent;padding-left: 0.6rem !important}.tick--ok .tick-dot{color: var(--success);border-left-color: color-mix(in srgb,var(--success) 45%,transparent)}.tick--stale .tick-dot{color: var(--destructive);border-left-color: var(--destructive)}.tick--never .tick-dot{color: var(--muted-foreground);border-left-color: color-mix(in srgb,var(--muted-foreground) 35%,transparent)}.tick-name{font-weight: 700;color: var(--foreground);letter-spacing: 0.01em}.tick-last,.tick-next{font-variant-numeric: tabular-nums;color: var(--muted-foreground)}.tick-next{opacity: 0.72}.tick--stale .tick-last{color: var(--destructive);font-weight: 700}.tick--never .tick-last{font-style: italic}.tick-stats{color: var(--muted-foreground)}.tick-stats b{font-weight: 700;color: var(--primary);font-variant-numeric: tabular-nums}.tick-sep{font-style: normal;opacity: 0.35;margin: 0 0.5rem}.tick--stale{background: color-mix(in srgb,var(--destructive) 8%,transparent)}@media (max-width: 40rem){.ticktable,.ticktable tbody,.tick,.ticktable td{display: block}.tick{padding: 0.4rem 0.5rem}.ticktable td{display: inline-block;padding: 0.1rem 0.5rem 0.1rem 0}.ticktable td.tick-stats{display: block;width: auto}}.dgm-zoomable{position: relative;cursor: zoom-in}.dgm-zoomable::after{content: "⤢";position: absolute;top: 0.4rem;right: 0.5rem;font-size: 0.85rem;line-height: 1;opacity: 0.45;pointer-events: none;color: var(--muted-foreground)}.dgm-zoomable:hover::after,.dgm-zoomable:focus-visible::after{opacity: 1;color: var(--primary)}.dgm-zoomable:focus-visible{outline: 2px solid var(--primary);outline-offset: 3px}html.dgm-locked,html.dgm-locked body{overflow: hidden}.dgm-overlay{display: none;position: fixed;inset: 0;z-index: 90;background: color-mix(in srgb,var(--background) 96%,transparent);flex-direction: column}.dgm-overlay.open{display: flex}.dgm-bar{flex: none;display: flex;align-items: center;justify-content: flex-end;gap: 0.4rem;padding: 0.5rem 0.75rem;border-bottom: 1px solid var(--border);background: var(--card)}.dgm-btn{font: inherit;font-size: 0.82rem;cursor: pointer;padding: 0.3rem 0.7rem;min-height: 32px;background: transparent;border: 1px solid var(--border);color: var(--foreground)}.dgm-btn:hover{border-color: var(--primary);color: var(--primary)}.dgm-btn:focus-visible{outline: 2px solid var(--primary);outline-offset: 1px}.dgm-close{border-color: color-mix(in srgb,var(--destructive) 55%,transparent);color: var(--destructive)}.dgm-close:hover{border-color: var(--destructive);color: var(--destructive)}.dgm-stage{flex: 1;overflow: hidden;display: grid;place-items: center;cursor: grab;touch-action: none}.dgm-stage.is-grabbing{cursor: grabbing}.dgm-art{transform-origin: center center;will-change: transform}.dgm-art>svg,.dgm-art>img{display: block;max-width: none;max-height: none}@media print{.dgm-overlay,.dgm-zoomable::after{display: none !important}}.skip-link{position: absolute;left: -999px;top: 0;z-index: 100;background: var(--card);border: 1px solid var(--primary);padding: 0.5rem 1rem;color: var(--primary)}.skip-link:focus{left: 0.5rem;top: 0.5rem}.visually-hidden{position: absolute;width: 1px;height: 1px;overflow: hidden;clip: rect(0 0 0 0);white-space: nowrap}header.bar{position: sticky;top: 0;z-index: 30;display: flex;align-items: center;justify-content: space-between;gap: 1rem;padding: 0.6rem 1.25rem;border-bottom: 1px solid var(--border);background: var(--card)}header.bar .brand{display: inline-flex;align-items: center;font-weight: 700;font-size: 1rem}header.bar .brand,header.bar .brand a{color: inherit;text-decoration: none}header.bar .dropdown summary{padding: 0.6rem 0.4rem}.bar-right{display: flex;align-items: center;gap: 1rem;flex-shrink: 0}footer.status{position: fixed;inset-inline: 0;bottom: 0;z-index: 50;min-height: 2rem;display: flex;align-items: center;justify-content: space-between;gap: 1rem;padding: 0.35rem 1.25rem;border-top: 1px solid var(--border);background: var(--card);font-size: 0.7rem}footer.status .dropdown summary,footer.status .anim-toggle{padding: 0.55rem 0.4rem}.status-left{color: var(--muted-foreground);min-width: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.status-right{display: flex;align-items: center;gap: 1rem;flex-shrink: 0}.sep{width: 1px;height: 0.9rem;background: var(--border)}.doc-link{color: var(--muted-foreground);text-decoration: none;transition: color 0.15s ease}.doc-link:hover{color: var(--primary)}.ls-row{display: flex;align-items: baseline;gap: 0.9rem}.ls-perm{color: var(--muted-foreground);font-size: 0.72rem;letter-spacing: 0}.ls-row--sub .ls-name{margin-left: 0.55rem;padding-left: 0.75rem;border-left: 1px solid color-mix(in srgb,var(--muted-foreground) 40%,transparent)}.ls-row--sub2 .ls-name{margin-left: 1.7rem}.ls-panel .ls-name{color: var(--muted-foreground)}.ls-panel .ls-row--dir .ls-name{color: var(--primary);font-weight: 700}.dropdown-panel.ls-panel{min-width: 17rem;left: auto !important;right: 0}:root{--ls-nav-w: 17rem;--ls-nav-top: 3rem;--ls-nav-bottom: 2.2rem}@media (min-width: 48.0625rem){html{--ls-nav-inset: 0rem}html:has(.ls-nav):not([data-ls-nav="off"]){--ls-nav-inset: var(--ls-nav-w)}body{padding-right: var(--ls-nav-inset)}header.bar{margin-right: calc(-1 * var(--ls-nav-inset))}.ls-nav{position: fixed;top: var(--ls-nav-top);right: 0;bottom: var(--ls-nav-bottom);width: var(--ls-nav-w);z-index: 25;display: flex;flex-direction: column;overflow: hidden;background: var(--card);border-left: 1px solid var(--border)}html:not(.anim-off) .ls-nav{transition: transform 0.18s ease}html[data-ls-nav="off"] .ls-nav{transform: translateX(100%)}.ls-nav-head{display: inline-flex;align-items: center;gap: 0.5rem;margin-left: 0.75rem}.ls-nav-title{font-weight: 700;font-size: 0.9rem}.ls-nav .ls-panel{flex: 1;min-height: 0;overflow-y: auto;list-style: none;margin: 0;padding: 0.5rem 0 1rem}.ls-nav-toggle{background: none;border: 0;font: inherit;cursor: pointer;line-height: 1;color: var(--muted-foreground);padding: 0.4rem 0.55rem}.ls-nav-toggle::after{content: "\00BB"}html[data-ls-nav="off"] .ls-nav-toggle::after{content: "\00AB"}.ls-nav-toggle:hover{color: var(--primary)}.ls-nav-toggle:focus-visible{outline: 2px solid color-mix(in srgb,var(--primary) 55%,transparent);outline-offset: -2px}}.nav-burger{display: none;background: none;border: 0;color: var(--muted-foreground);cursor: pointer;padding: 0.55rem;margin: -0.3rem -0.3rem -0.3rem 0}.nav-burger:hover{color: var(--primary)}.mobile-nav{display: none;list-style: none;margin: 0;padding: 0}.mobile-footer{display: none}@media (max-width: 48rem){.nav-burger{display: inline-flex;align-items: center}.site-nav{display: none;position: absolute;top: 100%;left: 0;right: 0;z-index: 40;background: var(--card);border-bottom: 1px solid var(--border);padding: 0.4rem 1.25rem 0.9rem;max-height: calc(100vh - 6rem);overflow-y: auto}.site-nav.open{display: block}.site-nav>.ls-nav,.mobile-nav{display: flex;flex-direction: column}.mobile-nav .mobile-item{display: flex;align-items: baseline;gap: 0.9rem;padding: 0.65rem 0;text-decoration: none;color: var(--foreground);font-size: 0.9rem;border-bottom: 1px solid var(--border)}.mobile-nav li:last-child .mobile-item{border-bottom: 0}.mobile-nav .mobile-item:active .ls-name,.mobile-nav .mobile-item:hover .ls-name{color: var(--primary)}footer.status{display: none}.mobile-footer{display: flex;flex-direction: column;gap: 0.55rem;margin-top: 0.8rem;border-top: 1px solid var(--border);padding-top: 0.8rem;font-size: 0.85rem}.mobile-footer .doc-link{padding: 0.2rem 0}.mobile-footer .mobile-theme summary{list-style: none;display: flex;align-items: center;gap: 0.5rem;color: var(--muted-foreground);cursor: pointer;padding: 0.2rem 0}.mobile-footer .mobile-theme summary::-webkit-details-marker{display: none}.mobile-footer .mf-chev{margin-left: auto;opacity: 0.7}.mobile-footer .mf-panel{display: flex;flex-direction: column;margin-top: 0.3rem}.mobile-footer .mf-panel .dropdown-item{text-align: left;padding: 0.4rem 0.6rem}.mobile-footer .anim-toggle{display: inline-flex;gap: 0.5rem;align-items: center;background: none;border: 0;padding: 0.2rem 0;color: var(--muted-foreground);font: inherit;cursor: pointer}}[data-tip]{cursor: help}span[data-tip],th[data-tip]{border-bottom: 1px dotted var(--muted-foreground)}#ddtip{position: fixed;z-index: 9999;display: none;max-width: 340px;background: var(--background);color: var(--foreground);border: 1px solid var(--muted-foreground);border-radius: 4px;padding: 7px 10px;font-size: 0.72rem;line-height: 1.45;font-weight: 400;text-align: left;white-space: normal;pointer-events: none;box-shadow: 0 4px 14px rgba(0,0,0,0.25)}@media print{@page{margin: 14mm 12mm}:root,html,html[data-theme]{--background: #ffffff;--foreground: #111111;--card: #ffffff;--card-foreground: #111111;--popover: #ffffff;--popover-foreground: #111111;--primary: #000000;--primary-foreground: #ffffff;--secondary: #ffffff;--secondary-foreground: #111111;--muted: #ffffff;--muted-foreground: #444444;--accent: #000000;--accent-foreground: #ffffff;--destructive: #7a1c1c;--border: #9a9a9a;--input: #9a9a9a;--ring: #000000;--glow: transparent;--glow-soft: transparent;--scanline-opacity: 0}html{zoom: 1 !important;font-size: 16px;scroll-behavior: auto}body{background: #ffffff;color: var(--foreground);font-size: 12px;line-height: 1.45;overflow: visible}body::after{display: none !important}*,*::before,*::after{animation: none !important;transition: none !important;text-shadow: none !important;box-shadow: none !important}html.term-anim [data-term] [data-term-out],html.term-anim [data-term] [data-term-out]:not(.term-show),html.term-anim [data-term] [data-term-out]>*{visibility: visible !important;opacity: 1 !important}html.term-anim [data-term] .prompt:not(.term-live){color: var(--muted-foreground) !important}html.term-anim [data-term] .prompt:not(.term-live)::before{color: var(--primary) !important}header.bar,footer.status,.site-nav,.nav-burger,.mobile-nav,.mobile-footer,.skip-link,.dropdown,.dropdown-panel,.anim-toggle,.cursor-block,.term-caret,.ascii-rule,.toc,#ddtip{display: none !important}body{padding-right: 0 !important}[data-tip]{cursor: auto}span[data-tip],th[data-tip]{border-bottom: 0}.wrap{max-width: none !important;margin: 0 !important;padding: 0 !important}.layout{display: block !important}.content{min-width: 0}h1,.title{font-size: 1.5rem !important}h2{font-size: 1.15rem !important}h3,.sub{font-size: 1rem !important}h4{font-size: 0.9rem !important}.prompt{font-size: 0.7rem}h1,h2,h3,h4,.prompt,.toc-label{break-after: avoid-page;break-inside: avoid}p,li,blockquote{orphans: 3;widows: 3}pre,figure,blockquote,tr,img,.eli5,.card-terminal{break-inside: avoid}svg{break-inside: auto}thead{display: table-header-group}.table-scroll,pre,.diagram{overflow: visible !important;max-width: 100% !important}pre{white-space: pre-wrap !important;overflow-wrap: anywhere;font-size: 0.75rem !important;background: transparent !important}pre.mermaid[data-processed]{white-space: normal !important}code{background: transparent !important;overflow-wrap: anywhere}table{width: 100% !important;table-layout: auto;border-collapse: collapse;font-size: 0.75rem !important}th,td{overflow-wrap: break-word;white-space: normal !important}td code,th code,td a,th a{overflow-wrap: anywhere}a{color: inherit;text-decoration: underline;text-underline-offset: 2px}a.card-terminal,a[class*="card"]{text-decoration: none}.glow,.glow-lg{color: inherit}.btn-terminal{border: 1px solid var(--border);background: transparent;color: var(--foreground)}.mermaid svg{display: block;margin-inline: auto;width: auto !important;height: auto !important;max-width: 100% !important;max-height: 235mm !important}.mermaid svg .node rect,.mermaid svg .node polygon,.mermaid svg .node circle,.mermaid svg .node path,.mermaid svg .label-container,.mermaid svg .cluster rect,.mermaid svg .actor,.mermaid svg .note{fill: #ffffff !important;stroke: #333333 !important}.mermaid svg .edgePath path,.mermaid svg .flowchart-link,.mermaid svg line,.mermaid svg .messageLine0,.mermaid svg .messageLine1{stroke: #333333 !important}.mermaid svg .arrowheadPath,.mermaid svg marker path,.mermaid svg marker polygon{fill: #333333 !important;stroke: #333333 !important}.mermaid svg text,.mermaid svg .nodeLabel,.mermaid svg .edgeLabel,.mermaid svg .cluster-label,.mermaid svg .messageText,.mermaid svg foreignObject div,.mermaid svg foreignObject span,.mermaid svg p{fill: #111111 !important;color: #111111 !important;background: transparent !important}.mermaid svg .edgeLabel rect,.mermaid svg .edgeLabel foreignObject>div{fill: #ffffff !important;background: #ffffff !important}}
|
|
1
|
+
/*! danieldeusing-design v0.5.0 | MIT | https://github.com/danieldeusing/danieldeusing-design */
|
|
2
|
+
*,*::before,*::after{box-sizing: border-box}*{margin: 0}html{-webkit-text-size-adjust: 100%;text-size-adjust: 100%;tab-size: 4}body{min-height: 100vh;min-height: 100dvh;line-height: 1.5}img,picture,video,canvas,svg{display: block;max-width: 100%}input,button,textarea,select{font: inherit;color: inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap: break-word}ul,ol{list-style: none;padding: 0}a{color: inherit;text-decoration: none}table{border-collapse: collapse}:root{--background: #f5efe2;--foreground: #43352a;--card: #efe7d4;--card-foreground: #43352a;--popover: #efe7d4;--popover-foreground: #43352a;--primary: #8a4516;--primary-foreground: #f8f3e8;--secondary: #ece3cf;--secondary-foreground: #43352a;--muted: #ece3cf;--muted-foreground: #71614e;--accent: #8a4516;--accent-foreground: #f8f3e8;--destructive: #a02c2c;--success: #1a6b2e;--warning: #845600;--info: #1c5f9e;--pending: #5f3dc4;--border: #d9cdb6;--input: #d9cdb6;--ring: #8a4516;--glow: rgba(160,82,45,0.1);--glow-soft: rgba(160,82,45,0.05);--scanline-opacity: 0.15;--radius: 0rem;--font-mono: "JetBrains Mono Variable","JetBrains Mono","Menlo",monospace}html[data-theme="green"]{--background: #020604;--foreground: #4fdd7d;--card: #04110a;--card-foreground: #4fdd7d;--popover: #04110a;--popover-foreground: #4fdd7d;--primary: #33ff66;--primary-foreground: #02160a;--secondary: #071509;--secondary-foreground: #4fdd7d;--muted: #071509;--muted-foreground: #3da45e;--accent: #33ff66;--accent-foreground: #02160a;--destructive: #ff5c5c;--success: #4ade80;--warning: #f5b32b;--info: #4dabf7;--pending: #b197fc;--border: #1c4a2c;--input: #1c4a2c;--ring: #33ff66;--glow: rgba(51,255,102,0.35);--glow-soft: rgba(51,255,102,0.12);--scanline-opacity: 0.5}html[data-theme="mono"]{--background: #050505;--foreground: #d4d4d4;--card: #0d0d0d;--card-foreground: #d4d4d4;--popover: #0d0d0d;--popover-foreground: #d4d4d4;--primary: #ffffff;--primary-foreground: #050505;--secondary: #111111;--secondary-foreground: #d4d4d4;--muted: #111111;--muted-foreground: #8a8a8a;--accent: #ffffff;--accent-foreground: #050505;--destructive: #ff5c5c;--success: #4ade80;--warning: #f5b32b;--info: #4dabf7;--pending: #b197fc;--border: #333333;--input: #333333;--ring: #ffffff;--glow: rgba(255,255,255,0.25);--glow-soft: rgba(255,255,255,0.08);--scanline-opacity: 0.45}html[data-theme="paper"]{--background: #fafafa;--foreground: #1f1f1f;--card: #f1f1f1;--card-foreground: #1f1f1f;--popover: #f1f1f1;--popover-foreground: #1f1f1f;--primary: #000000;--primary-foreground: #fafafa;--secondary: #efefef;--secondary-foreground: #1f1f1f;--muted: #efefef;--muted-foreground: #595959;--accent: #000000;--accent-foreground: #fafafa;--destructive: #b3261e;--success: #1a7031;--warning: #8f5d00;--info: #1c5f9e;--pending: #5f3dc4;--border: #d4d4d4;--input: #d4d4d4;--ring: #000000;--glow: rgba(0,0,0,0.06);--glow-soft: rgba(0,0,0,0.04);--scanline-opacity: 0.12}:root{--content-w: 78rem;--content-pad: 1.5rem;--fs-xs: 0.625rem;--fs-sm: 0.6875rem;--fs-base: 0.75rem;--fs-md: 0.8125rem;--fs-lg: 0.9375rem;--fs-xl: 1.125rem;--fs-2xl: 1.5rem;--lh-tight: 1.3;--lh-base: 1.5}html{scroll-behavior: smooth}*,*::before,*::after{border-color: var(--border)}:focus-visible{outline: 2px solid var(--ring);outline-offset: 2px}body{background: var(--background);color: var(--foreground);font-family: var(--font-mono);font-size: var(--fs-base);line-height: var(--lh-base);overflow-x: hidden;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale}button:not(:disabled),summary,[role="button"]{cursor: pointer}body::after{content: "";position: fixed;inset: 0;z-index: 40;pointer-events: none;background: repeating-linear-gradient( 0deg,rgba(0,0,0,0.25) 0px,rgba(0,0,0,0.25) 1px,transparent 1px,transparent 3px );opacity: var(--scanline-opacity)}::selection{background: var(--primary);color: var(--primary-foreground)}.glow{color: var(--primary);text-shadow: 0 0 8px var(--glow)}.glow-lg{color: var(--primary);text-shadow: 0 0 12px var(--glow)}.prompt{font-size: 0.75rem;font-weight: 700;color: var(--muted-foreground)}.prompt::before{content: "$ ";color: var(--primary)}.comment::before{content: "# ";color: var(--border)}.cursor-block{display: inline-block;width: 0.55em;height: 1em;margin-left: 8px;background: var(--primary);vertical-align: baseline;transform: translateY(0.12em);animation: ddd-blink 1.1s step-end infinite}@keyframes ddd-blink{50%{opacity: 0}}.btn-terminal{display: inline-block;background: var(--primary);color: var(--primary-foreground);font-weight: 700;padding: 12px 24px;box-shadow: 0 0 16px var(--glow);transition: box-shadow 0.15s ease,transform 0.15s ease}.btn-terminal::before{content: "> "}.btn-terminal:hover{box-shadow: 0 0 28px var(--glow);transform: translateY(-2px)}.link-quiet{color: var(--muted-foreground);text-decoration: underline;text-underline-offset: 4px;transition: color 0.15s ease}.link-quiet:hover{color: var(--primary)}.anim-toggle{display: inline-flex;align-items: center;gap: 6px;font: inherit;color: var(--muted-foreground);background: none;border: 0;cursor: pointer;transition: color 0.15s ease}.anim-toggle:hover{color: var(--primary)}.anim-toggle[aria-pressed="true"] [data-anim-box]{color: var(--primary)}.dd-dot{display: inline-block;width: 11px;height: 11px;flex: none;border-radius: 50%;background: currentColor}.dd-flag{display: inline-block;width: 15px;height: 10px;flex: none;border: 1px solid var(--border);background-size: cover;background-repeat: no-repeat}.dd-flag-de{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='4' fill='%23262626'/><rect y='4' width='18' height='4' fill='%23c83232'/><rect y='8' width='18' height='4' fill='%23e8be32'/></svg>")}.dd-flag-en{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='12' fill='%23b22234'/><rect y='4' width='18' height='4' fill='%23ececec'/><rect width='8' height='6' fill='%233c3b6e'/></svg>")}.dd-flag-pt{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='18' height='12' fill='%231c9148'/><polygon points='9,1.5 15.5,6 9,10.5 2.5,6' fill='%23e8c832'/><rect x='8' y='5' width='2' height='2' fill='%232c3f87'/></svg>")}.dd-flag-es{background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 12'><rect width='6' height='12' fill='%2315734c'/><rect x='6' width='6' height='12' fill='%23ececec'/><rect x='12' width='6' height='12' fill='%23bf2233'/><rect x='8' y='5' width='2' height='2' fill='%237a5c3a'/></svg>")}.ascii-rule{margin: 1rem 0;border: 0;color: var(--border);line-height: 1;white-space: nowrap;overflow: hidden;user-select: none}.ascii-rule::before{content: "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"}.card-terminal{background: var(--card);border: 1px solid var(--border);transition: border-color 0.15s ease,box-shadow 0.15s ease}.card-terminal:hover{border-color: var(--primary);box-shadow: 0 0 20px var(--glow-soft)}.dropdown{position: relative}.dropdown>summary{display: inline-flex;align-items: center;gap: 6px;cursor: pointer;user-select: none;list-style: none;color: var(--muted-foreground);transition: color 0.15s ease}.dropdown>summary::-webkit-details-marker{display: none}.dropdown>summary:hover,.dropdown[open]>summary{color: var(--primary)}.dropdown-panel{position: absolute;right: 0;bottom: calc(100% + 12px);z-index: 50;min-width: 128px;margin: 0;padding: 4px 0;list-style: none;background: var(--card);border: 1px solid var(--border);border-radius: 0;box-shadow: 0 0 20px var(--glow-soft)}.dropdown-panel--down{top: calc(100% + 8px);bottom: auto;left: 0;right: auto}.dropdown-item{display: flex;align-items: center;gap: 8px;width: 100%;padding: 5px 14px;text-align: left;font: inherit;line-height: 1.5;background: none;border: 0;color: var(--muted-foreground);cursor: pointer;white-space: nowrap;transition: color 0.15s ease}.dropdown-item:hover{color: var(--primary);background: var(--muted)}.dropdown-item[aria-current="true"],html:not([data-theme]) .dropdown-item[data-theme-value="warm"],html[data-theme="green"] .dropdown-item[data-theme-value="green"],html[data-theme="mono"] .dropdown-item[data-theme-value="mono"],html[data-theme="paper"] .dropdown-item[data-theme-value="paper"],html[data-theme="warm"] .dropdown-item[data-theme-value="warm"]{color: var(--primary);text-shadow: 0 0 8px var(--glow)}.eli5{margin: 1.25em 0;padding: 0.7em 1em;color: var(--foreground);background: color-mix(in srgb,var(--primary) 7%,var(--card));border: 1px solid var(--border);border-left: 3px solid var(--primary);border-radius: var(--radius);font-size: 0.92em;line-height: 1.6}.eli5::before{content: "ELI5";display: inline-flex;align-items: center;justify-content: center;margin-right: 0.6em;vertical-align: 0.08em;font-family: var(--font-mono);font-size: 0.72em;font-weight: 700;line-height: 1;letter-spacing: 0.04em;padding: 0.34em 0.6em;border-radius: 5px;background: #b42318;color: #fff}.eli5-term{font-weight: 700;color: var(--primary)}html.anim-off *,html.anim-off *::before,html.anim-off *::after{animation: none !important}html.anim-off .cursor-block{display: none}@media (prefers-reduced-motion: no-preference){html.term-anim [data-term] .prompt:not(.term-live),html.term-anim [data-term] .prompt:not(.term-live)::before{color: transparent}html.term-anim [data-term] [data-term-out]:not(.term-show){visibility: hidden}html.term-anim [data-term] [data-term-out].term-show{animation: ddd-term-output 0.2s steps(3,end) both}@keyframes ddd-term-output{from{opacity: 0}}html.term-anim [data-term] [data-term-out].term-show>*{animation: ddd-term-output 0.25s steps(3,end) both}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(2){animation-delay: 0.09s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(3){animation-delay: 0.18s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(4){animation-delay: 0.27s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(5){animation-delay: 0.36s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(6){animation-delay: 0.45s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(7){animation-delay: 0.54s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(8){animation-delay: 0.63s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(9){animation-delay: 0.72s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(10){animation-delay: 0.81s}html.term-anim [data-term] [data-term-out].term-show>*:nth-child(n + 11){animation-delay: 0.9s}.term-caret{display: inline-block;width: 0.55em;height: 1em;margin-left: 2px;background: var(--primary);vertical-align: baseline;transform: translateY(0.12em)}}.tabs{display: flex;flex-wrap: wrap;gap: 0.15rem;margin: 1.35rem 0 0;border-bottom: 2px solid color-mix(in srgb,var(--border) 80%,transparent)}.tab{background: transparent;border: 0;margin-bottom: -2px;font: inherit;font-size: 0.86em;cursor: pointer;padding: 0.5rem 0.95rem;color: var(--muted-foreground);transition: background 0.12s ease,color 0.12s ease}.tab:hover{color: var(--primary);background: color-mix(in srgb,var(--primary) 10%,transparent)}.tab[aria-selected="true"]{background: var(--primary);color: var(--background);font-weight: 700}.tab:focus-visible{outline: 2px solid color-mix(in srgb,var(--primary) 55%,transparent);outline-offset: -2px}@media (pointer: coarse),(max-width: 40rem){.tab{padding: 0.7rem 0.8rem;min-height: 44px}}section.doc.tab-panel{margin-top: 1.35rem}details.fold{border-top: 1px solid color-mix(in srgb,currentColor 15%,transparent)}details.fold>summary{display: flex;align-items: center;gap: 0.5rem;cursor: pointer;list-style: none;padding: 0.55rem 0;font-size: 0.85rem;color: var(--muted-foreground)}details.fold>summary::-webkit-details-marker{display: none}details.fold>summary::before{content: "\25B8";flex: none;opacity: 0.6}details.fold[open]>summary::before{content: "\25BE"}details.fold>summary:hover{color: var(--primary)}details.fold>summary:focus-visible{outline: 2px solid color-mix(in srgb,currentColor 45%,transparent);outline-offset: 2px}.fold-body{font-size: 0.9rem;padding: 0 0 0.7rem 1.1rem}.fold-body>* + *{margin-top: 0.6rem}.legend{list-style: none;padding: 0;margin: 0.7rem 0 0;display: grid;gap: 0.4rem 1.4rem;font-size: 0.86rem}@media (min-width: 52rem){.legend{grid-template-columns: repeat(2,minmax(0,1fr))}}.legend>li{line-height: 1.6}.legend>li>:first-child{margin-right: 0.45rem}.tickstrip:not(:empty){border: 1px solid var(--border);background: var(--card);margin: 1.6rem 0 1.5rem}.ticktable{width: 100%;border-collapse: collapse;font-size: 0.82rem}.ticktable td{padding: 0.5rem 0.75rem;vertical-align: baseline;border: 0;white-space: nowrap}.ticktable td.tick-stats{width: 100%;white-space: normal}.tick{border-bottom: 1px solid color-mix(in srgb,var(--border) 55%,transparent)}.tick:last-child{border-bottom: 0}.tick-dot{font-size: 0.7em;width: 1.5rem;padding-right: 0 !important;border-left: 3px solid transparent;padding-left: 0.6rem !important}.tick--ok .tick-dot{color: var(--success);border-left-color: color-mix(in srgb,var(--success) 45%,transparent)}.tick--stale .tick-dot{color: var(--destructive);border-left-color: var(--destructive)}.tick--never .tick-dot{color: var(--muted-foreground);border-left-color: color-mix(in srgb,var(--muted-foreground) 35%,transparent)}.tick-name{font-weight: 700;color: var(--foreground);letter-spacing: 0.01em}.tick-last,.tick-next{font-variant-numeric: tabular-nums;color: var(--muted-foreground)}.tick-next{opacity: 0.72}.tick--stale .tick-last{color: var(--destructive);font-weight: 700}.tick--never .tick-last{font-style: italic}.tick-stats{color: var(--muted-foreground)}.tick-stats b{font-weight: 700;color: var(--primary);font-variant-numeric: tabular-nums}.tick-sep{font-style: normal;opacity: 0.35;margin: 0 0.5rem}.tick--stale{background: color-mix(in srgb,var(--destructive) 8%,transparent)}@media (max-width: 40rem){.ticktable,.ticktable tbody,.tick,.ticktable td{display: block}.tick{padding: 0.4rem 0.5rem}.ticktable td{display: inline-block;padding: 0.1rem 0.5rem 0.1rem 0}.ticktable td.tick-stats{display: block;width: auto}}.dgm-zoomable{position: relative;cursor: zoom-in}.dgm-zoomable::after{content: "⤢";position: absolute;top: 0.4rem;right: 0.5rem;font-size: 0.85rem;line-height: 1;opacity: 0.45;pointer-events: none;color: var(--muted-foreground)}.dgm-zoomable:hover::after,.dgm-zoomable:focus-visible::after{opacity: 1;color: var(--primary)}.dgm-zoomable:focus-visible{outline: 2px solid var(--primary);outline-offset: 3px}html.dgm-locked,html.dgm-locked body{overflow: hidden}.dgm-overlay{display: none;position: fixed;inset: 0;z-index: 90;background: color-mix(in srgb,var(--background) 96%,transparent);flex-direction: column}.dgm-overlay.open{display: flex}.dgm-bar{flex: none;display: flex;align-items: center;justify-content: flex-end;gap: 0.4rem;padding: 0.5rem 0.75rem;border-bottom: 1px solid var(--border);background: var(--card)}.dgm-btn{font: inherit;font-size: 0.82rem;cursor: pointer;padding: 0.3rem 0.7rem;min-height: 32px;background: transparent;border: 1px solid var(--border);color: var(--foreground)}.dgm-btn:hover{border-color: var(--primary);color: var(--primary)}.dgm-btn:focus-visible{outline: 2px solid var(--primary);outline-offset: 1px}.dgm-close{border-color: color-mix(in srgb,var(--destructive) 55%,transparent);color: var(--destructive)}.dgm-close:hover{border-color: var(--destructive);color: var(--destructive)}.dgm-stage{flex: 1;overflow: hidden;display: grid;place-items: center;cursor: grab;touch-action: none}.dgm-stage.is-grabbing{cursor: grabbing}.dgm-art{transform-origin: center center;will-change: transform}.dgm-art>svg,.dgm-art>img{display: block;max-width: none;max-height: none}@media print{.dgm-overlay,.dgm-zoomable::after{display: none !important}}.wrap{max-width: var(--content-w);margin-inline: auto;padding-inline: var(--content-pad)}.skip-link{position: absolute;left: -999px;top: 0;z-index: 100;background: var(--card);border: 1px solid var(--primary);padding: 0.5rem 1rem;color: var(--primary)}.skip-link:focus{left: 0.5rem;top: 0.5rem}.visually-hidden{position: absolute;width: 1px;height: 1px;overflow: hidden;clip: rect(0 0 0 0);white-space: nowrap}header.bar{position: sticky;top: 0;z-index: 30;display: flex;align-items: center;justify-content: space-between;gap: 1rem;padding: 0.6rem 1.25rem;border-bottom: 1px solid var(--border);background: var(--card)}header.bar .brand{display: inline-flex;align-items: center;font-weight: 700;font-size: 1rem}header.bar .brand,header.bar .brand a{color: inherit;text-decoration: none}header.bar .dropdown summary{padding: 0.6rem 0.4rem}.bar-right{display: flex;align-items: center;gap: 1rem;flex-shrink: 0}footer.status{position: fixed;inset-inline: 0;bottom: 0;z-index: 50;min-height: 2rem;display: flex;align-items: center;justify-content: space-between;gap: 1rem;padding: 0.35rem 1.25rem;border-top: 1px solid var(--border);background: var(--card);font-size: 0.7rem}footer.status .dropdown summary,footer.status .anim-toggle{padding: 0.55rem 0.4rem}.status-left{color: var(--muted-foreground);min-width: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.status-right{display: flex;align-items: center;gap: 1rem;flex-shrink: 0}.sep{width: 1px;height: 0.9rem;background: var(--border)}.doc-link{color: var(--muted-foreground);text-decoration: none;transition: color 0.15s ease}.doc-link:hover{color: var(--primary)}.ls-row{display: flex;align-items: baseline;gap: 0.9rem}.ls-perm{color: var(--muted-foreground);font-size: 0.72rem;letter-spacing: 0}.ls-row--sub .ls-name{margin-left: 0.55rem;padding-left: 0.75rem;border-left: 1px solid color-mix(in srgb,var(--muted-foreground) 40%,transparent)}.ls-row--sub2 .ls-name{margin-left: 1.7rem}.ls-panel .ls-name{color: var(--muted-foreground)}.ls-panel .ls-row--dir .ls-name{color: var(--primary);font-weight: 700}.dropdown-panel.ls-panel{min-width: 17rem;left: auto !important;right: 0}:root{--ls-nav-w: 17rem;--ls-nav-top: 3rem;--ls-nav-bottom: 2.2rem}@media (min-width: 48.0625rem){html{--ls-nav-inset: 0rem}html:has(.ls-nav):not([data-ls-nav="off"]){--ls-nav-inset: var(--ls-nav-w)}body{padding-right: var(--ls-nav-inset)}header.bar{margin-right: calc(-1 * var(--ls-nav-inset))}.ls-nav{position: fixed;top: var(--ls-nav-top);right: 0;bottom: var(--ls-nav-bottom);width: var(--ls-nav-w);z-index: 25;display: flex;flex-direction: column;overflow: hidden;background: var(--card);border-left: 1px solid var(--border)}html:not(.anim-off) .ls-nav{transition: transform 0.18s ease}html[data-ls-nav="off"] .ls-nav{transform: translateX(100%)}.ls-nav-head{display: inline-flex;align-items: center;gap: 0.5rem;margin-left: 0.75rem}.ls-nav-title{font-weight: 700;font-size: 0.9rem}.ls-nav .ls-panel{flex: 1;min-height: 0;overflow-y: auto;list-style: none;margin: 0;padding: 0.5rem 0 1rem}.ls-nav-toggle{background: none;border: 0;font: inherit;cursor: pointer;line-height: 1;color: var(--muted-foreground);padding: 0.4rem 0.55rem}.ls-nav-toggle::after{content: "\00BB"}html[data-ls-nav="off"] .ls-nav-toggle::after{content: "\00AB"}.ls-nav-toggle:hover{color: var(--primary)}.ls-nav-toggle:focus-visible{outline: 2px solid color-mix(in srgb,var(--primary) 55%,transparent);outline-offset: -2px}}.nav-burger{display: none;background: none;border: 0;color: var(--muted-foreground);cursor: pointer;padding: 0.55rem;margin: -0.3rem -0.3rem -0.3rem 0}.nav-burger:hover{color: var(--primary)}.mobile-nav{display: none;list-style: none;margin: 0;padding: 0}.mobile-footer{display: none}@media (max-width: 48rem){.nav-burger{display: inline-flex;align-items: center}.site-nav{display: none;position: absolute;top: 100%;left: 0;right: 0;z-index: 40;background: var(--card);border-bottom: 1px solid var(--border);padding: 0.4rem 1.25rem 0.9rem;max-height: calc(100vh - 6rem);overflow-y: auto}.site-nav.open{display: block}.site-nav>.ls-nav,.mobile-nav{display: flex;flex-direction: column}.mobile-nav .mobile-item{display: flex;align-items: baseline;gap: 0.9rem;padding: 0.65rem 0;text-decoration: none;color: var(--foreground);font-size: 0.9rem;border-bottom: 1px solid var(--border)}.mobile-nav li:last-child .mobile-item{border-bottom: 0}.mobile-nav .mobile-item:active .ls-name,.mobile-nav .mobile-item:hover .ls-name{color: var(--primary)}footer.status{display: none}.mobile-footer{display: flex;flex-direction: column;gap: 0.55rem;margin-top: 0.8rem;border-top: 1px solid var(--border);padding-top: 0.8rem;font-size: 0.85rem}.mobile-footer .doc-link{padding: 0.2rem 0}.mobile-footer .mobile-theme summary{list-style: none;display: flex;align-items: center;gap: 0.5rem;color: var(--muted-foreground);cursor: pointer;padding: 0.2rem 0}.mobile-footer .mobile-theme summary::-webkit-details-marker{display: none}.mobile-footer .mf-chev{margin-left: auto;opacity: 0.7}.mobile-footer .mf-panel{display: flex;flex-direction: column;margin-top: 0.3rem}.mobile-footer .mf-panel .dropdown-item{text-align: left;padding: 0.4rem 0.6rem}.mobile-footer .anim-toggle{display: inline-flex;gap: 0.5rem;align-items: center;background: none;border: 0;padding: 0.2rem 0;color: var(--muted-foreground);font: inherit;cursor: pointer}}[data-tip]{cursor: help}span[data-tip],th[data-tip]{border-bottom: 1px dotted var(--muted-foreground)}#ddtip{position: fixed;z-index: 9999;display: none;max-width: 340px;background: var(--background);color: var(--foreground);border: 1px solid var(--muted-foreground);border-radius: 4px;padding: 7px 10px;font-size: 0.72rem;line-height: 1.45;font-weight: 400;text-align: left;white-space: normal;pointer-events: none;box-shadow: 0 4px 14px rgba(0,0,0,0.25)}@media print{@page{margin: 14mm 12mm}:root,html,html[data-theme]{--background: #ffffff;--foreground: #111111;--card: #ffffff;--card-foreground: #111111;--popover: #ffffff;--popover-foreground: #111111;--primary: #000000;--primary-foreground: #ffffff;--secondary: #ffffff;--secondary-foreground: #111111;--muted: #ffffff;--muted-foreground: #444444;--accent: #000000;--accent-foreground: #ffffff;--destructive: #7a1c1c;--border: #9a9a9a;--input: #9a9a9a;--ring: #000000;--glow: transparent;--glow-soft: transparent;--scanline-opacity: 0}html{zoom: 1 !important;font-size: 16px;scroll-behavior: auto}body{background: #ffffff;color: var(--foreground);font-size: 12px;line-height: 1.45;overflow: visible}body::after{display: none !important}*,*::before,*::after{animation: none !important;transition: none !important;text-shadow: none !important;box-shadow: none !important}html.term-anim [data-term] [data-term-out],html.term-anim [data-term] [data-term-out]:not(.term-show),html.term-anim [data-term] [data-term-out]>*{visibility: visible !important;opacity: 1 !important}html.term-anim [data-term] .prompt:not(.term-live){color: var(--muted-foreground) !important}html.term-anim [data-term] .prompt:not(.term-live)::before{color: var(--primary) !important}header.bar,footer.status,.site-nav,.nav-burger,.mobile-nav,.mobile-footer,.skip-link,.dropdown,.dropdown-panel,.anim-toggle,.cursor-block,.term-caret,.ascii-rule,.toc,#ddtip{display: none !important}body{padding-right: 0 !important}[data-tip]{cursor: auto}span[data-tip],th[data-tip]{border-bottom: 0}.wrap{max-width: none !important;margin: 0 !important;padding: 0 !important}.layout{display: block !important}.content{min-width: 0}h1,.title{font-size: 1.5rem !important}h2{font-size: 1.15rem !important}h3,.sub{font-size: 1rem !important}h4{font-size: 0.9rem !important}.prompt{font-size: 0.7rem}h1,h2,h3,h4,.prompt,.toc-label{break-after: avoid-page;break-inside: avoid}p,li,blockquote{orphans: 3;widows: 3}pre,figure,blockquote,tr,img,.eli5,.card-terminal{break-inside: avoid}svg{break-inside: auto}thead{display: table-header-group}.table-scroll,pre,.diagram{overflow: visible !important;max-width: 100% !important}pre{white-space: pre-wrap !important;overflow-wrap: anywhere;font-size: 0.75rem !important;background: transparent !important}pre.mermaid[data-processed]{white-space: normal !important}code{background: transparent !important;overflow-wrap: anywhere}table{width: 100% !important;table-layout: auto;border-collapse: collapse;font-size: 0.75rem !important}th,td{overflow-wrap: break-word;white-space: normal !important}td code,th code,td a,th a{overflow-wrap: anywhere}a{color: inherit;text-decoration: underline;text-underline-offset: 2px}a.card-terminal,a[class*="card"]{text-decoration: none}.glow,.glow-lg{color: inherit}.btn-terminal{border: 1px solid var(--border);background: transparent;color: var(--foreground)}.mermaid svg{display: block;margin-inline: auto;width: auto !important;height: auto !important;max-width: 100% !important;max-height: 235mm !important}.mermaid svg .node rect,.mermaid svg .node polygon,.mermaid svg .node circle,.mermaid svg .node path,.mermaid svg .label-container,.mermaid svg .cluster rect,.mermaid svg .actor,.mermaid svg .note{fill: #ffffff !important;stroke: #333333 !important}.mermaid svg .edgePath path,.mermaid svg .flowchart-link,.mermaid svg line,.mermaid svg .messageLine0,.mermaid svg .messageLine1{stroke: #333333 !important}.mermaid svg .arrowheadPath,.mermaid svg marker path,.mermaid svg marker polygon{fill: #333333 !important;stroke: #333333 !important}.mermaid svg text,.mermaid svg .nodeLabel,.mermaid svg .edgeLabel,.mermaid svg .cluster-label,.mermaid svg .messageText,.mermaid svg foreignObject div,.mermaid svg foreignObject span,.mermaid svg p{fill: #111111 !important;color: #111111 !important;background: transparent !important}.mermaid svg .edgeLabel rect,.mermaid svg .edgeLabel foreignObject>div{fill: #ffffff !important;background: #ffffff !important}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@danieldeusing/design",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "The danieldeusing terminal design system — framework-agnostic CSS tokens, components, and a vanilla-JS runtime for the CRT/JetBrains-Mono look used across danieldeusing.de, seedr, and briefs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/src/base.css
CHANGED
|
@@ -29,8 +29,8 @@ body {
|
|
|
29
29
|
background: var(--background);
|
|
30
30
|
color: var(--foreground);
|
|
31
31
|
font-family: var(--font-mono);
|
|
32
|
-
font-size:
|
|
33
|
-
line-height:
|
|
32
|
+
font-size: var(--fs-base);
|
|
33
|
+
line-height: var(--lh-base);
|
|
34
34
|
overflow-x: hidden;
|
|
35
35
|
-webkit-font-smoothing: antialiased;
|
|
36
36
|
-moz-osx-font-smoothing: grayscale;
|
package/src/chrome.css
CHANGED
|
@@ -37,6 +37,21 @@
|
|
|
37
37
|
* Breakpoint: 48rem.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
|
+
/* ── the content column ──
|
|
41
|
+
ONE definition of "how wide is the page, and how far from the edge", because
|
|
42
|
+
four surfaces each had their own until 2026-08-05 (78rem / 1180px / 72rem /
|
|
43
|
+
none). Only the INLINE axis is set here: vertical rhythm differs legitimately
|
|
44
|
+
between a doc and a dashboard, and forcing that too is how a shared rule earns
|
|
45
|
+
a local override — which is how the drift started in the first place.
|
|
46
|
+
|
|
47
|
+
Consumers therefore set `padding-block`, never the `padding` shorthand: the
|
|
48
|
+
shorthand resets padding-inline to 0 and quietly takes the margins back. */
|
|
49
|
+
.wrap {
|
|
50
|
+
max-width: var(--content-w);
|
|
51
|
+
margin-inline: auto;
|
|
52
|
+
padding-inline: var(--content-pad);
|
|
53
|
+
}
|
|
54
|
+
|
|
40
55
|
/* ── a11y helpers ── */
|
|
41
56
|
.skip-link {
|
|
42
57
|
position: absolute; left: -999px; top: 0; z-index: 100;
|
package/src/tailwind.css
CHANGED
|
@@ -48,4 +48,17 @@
|
|
|
48
48
|
--radius-md: var(--radius);
|
|
49
49
|
--radius-lg: var(--radius);
|
|
50
50
|
--radius-xl: var(--radius);
|
|
51
|
+
/* Layout + type, so a Tailwind app reaches the same measurements as a plain
|
|
52
|
+
one: `max-w-content` is the shared column, `text-fs-*` the shared scale.
|
|
53
|
+
Tailwind's OWN text-xs/sm/base are deliberately left alone — this scale
|
|
54
|
+
bottoms out at 10px for terminal chrome, and silently remapping the default
|
|
55
|
+
names would reskin every existing utility in a consuming app. Opt in. */
|
|
56
|
+
--container-content: var(--content-w);
|
|
57
|
+
--text-fs-xs: var(--fs-xs);
|
|
58
|
+
--text-fs-sm: var(--fs-sm);
|
|
59
|
+
--text-fs-base: var(--fs-base);
|
|
60
|
+
--text-fs-md: var(--fs-md);
|
|
61
|
+
--text-fs-lg: var(--fs-lg);
|
|
62
|
+
--text-fs-xl: var(--fs-xl);
|
|
63
|
+
--text-fs-2xl: var(--fs-2xl);
|
|
51
64
|
}
|
package/src/tokens.css
CHANGED
|
@@ -22,13 +22,30 @@
|
|
|
22
22
|
* A gap of 0.0692 with nothing in it. So NO single hex can serve four themes:
|
|
23
23
|
* the two near-black themes need a light tint, the two light themes a dark one,
|
|
24
24
|
* and every compromise fails both. That is arithmetic, not taste — which is why
|
|
25
|
-
* --destructive, --success and --
|
|
25
|
+
* --destructive, --success, --warning, --info and --pending are each declared
|
|
26
|
+
* four times.
|
|
26
27
|
*
|
|
27
28
|
* Cockpit carried twelve hardcoded accents that predate these tokens; every one
|
|
28
29
|
* missed AA on at least one theme and four sat inside the gap, clearing neither
|
|
29
30
|
* side. Adding a status colour? Add a TOKEN here with its measured worst-case
|
|
30
31
|
* ratio in a trailing comment. Do not tune a literal at the call site — that
|
|
31
32
|
* forks the palette and fixes exactly one theme.
|
|
33
|
+
*
|
|
34
|
+
* ── FIVE STATUS ACCENTS, BECAUSE A STATE MACHINE HAS MORE THAN THREE STATES ──
|
|
35
|
+
* good / attention / bad covers a verdict. It does not cover the two states a
|
|
36
|
+
* dashboard spends most of its time showing, and cockpit forked a literal for
|
|
37
|
+
* each of them rather than go without:
|
|
38
|
+
*
|
|
39
|
+
* --info a state, not a verdict. In flight, informational, recorded and
|
|
40
|
+
* fine but not a win: dispatching, gated, started-by-hand, "silent
|
|
41
|
+
* for a reason". Blue, so it never reads as an alarm.
|
|
42
|
+
* --pending NO verdict yet. Still running, timed out, could not determine,
|
|
43
|
+
* not recorded: the answer is absent, which is different from the
|
|
44
|
+
* answer being bad. Violet, so it never reads as --destructive.
|
|
45
|
+
*
|
|
46
|
+
* Both are peers of --success/--warning/--destructive and obey the same rule:
|
|
47
|
+
* one value for the two light themes, one for the two near-black ones, each
|
|
48
|
+
* measured against --background, --card AND --muted.
|
|
32
49
|
*/
|
|
33
50
|
|
|
34
51
|
:root {
|
|
@@ -49,6 +66,8 @@
|
|
|
49
66
|
--destructive: #a02c2c;
|
|
50
67
|
--success: #1a6b2e; /* 5.16:1 worst surface */
|
|
51
68
|
--warning: #845600; /* 4.97:1 worst surface */
|
|
69
|
+
--info: #1c5f9e; /* 5.17:1 worst surface */
|
|
70
|
+
--pending: #5f3dc4; /* 5.58:1 worst surface */
|
|
52
71
|
--border: #d9cdb6;
|
|
53
72
|
--input: #d9cdb6;
|
|
54
73
|
--ring: #8a4516;
|
|
@@ -81,6 +100,8 @@ html[data-theme="green"] {
|
|
|
81
100
|
--destructive: #ff5c5c;
|
|
82
101
|
--success: #4ade80; /* 10.76:1 worst surface */
|
|
83
102
|
--warning: #f5b32b; /* 10.15:1 worst surface */
|
|
103
|
+
--info: #4dabf7; /* 7.57:1 worst surface */
|
|
104
|
+
--pending: #b197fc; /* 7.77:1 worst surface */
|
|
84
105
|
--border: #1c4a2c;
|
|
85
106
|
--input: #1c4a2c;
|
|
86
107
|
--ring: #33ff66;
|
|
@@ -108,6 +129,8 @@ html[data-theme="mono"] {
|
|
|
108
129
|
--destructive: #ff5c5c;
|
|
109
130
|
--success: #4ade80; /* 10.84:1 worst surface */
|
|
110
131
|
--warning: #f5b32b; /* 10.22:1 worst surface */
|
|
132
|
+
--info: #4dabf7; /* 7.63:1 worst surface */
|
|
133
|
+
--pending: #b197fc; /* 7.82:1 worst surface */
|
|
111
134
|
--border: #333333;
|
|
112
135
|
--input: #333333;
|
|
113
136
|
--ring: #ffffff;
|
|
@@ -135,6 +158,8 @@ html[data-theme="paper"] {
|
|
|
135
158
|
--destructive: #b3261e;
|
|
136
159
|
--success: #1a7031; /* 5.36:1 worst surface */
|
|
137
160
|
--warning: #8f5d00; /* 4.89:1 worst surface */
|
|
161
|
+
--info: #1c5f9e; /* 5.74:1 worst surface */
|
|
162
|
+
--pending: #5f3dc4; /* 6.19:1 worst surface */
|
|
138
163
|
--border: #d4d4d4;
|
|
139
164
|
--input: #d4d4d4;
|
|
140
165
|
--ring: #000000;
|
|
@@ -142,3 +167,62 @@ html[data-theme="paper"] {
|
|
|
142
167
|
--glow-soft: rgba(0, 0, 0, 0.04);
|
|
143
168
|
--scanline-opacity: 0.12;
|
|
144
169
|
}
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* ── LAYOUT + TYPE SCALE — not per-theme, and that is the point ─────────────
|
|
173
|
+
*
|
|
174
|
+
* Colours are declared four times because the arithmetic forces it (above).
|
|
175
|
+
* Measurements are the opposite case: there is exactly one right answer and it
|
|
176
|
+
* must not vary by theme, by page, or by surface. They live in one :root block
|
|
177
|
+
* so that is structurally obvious.
|
|
178
|
+
*
|
|
179
|
+
* WHY THESE EXIST AT ALL. Audited 2026-08-05, the five surfaces had FOUR
|
|
180
|
+
* different content widths — cockpit 78rem, netmon 1180px, danieldeusing.de
|
|
181
|
+
* 72rem (Tailwind max-w-6xl), the containers dashboard none — and netmon set a
|
|
182
|
+
* flat `font: 13px` where everything else sat at 0.75rem. Nobody chose that;
|
|
183
|
+
* each surface just picked a number in isolation because the design system
|
|
184
|
+
* offered none. A token nobody has to think about is the only fix that stays
|
|
185
|
+
* fixed: the next page inherits the answer instead of inventing a fifth one.
|
|
186
|
+
*
|
|
187
|
+
* "SAME FONT SIZE DEPENDING ON WINDOW SIZE" is two mechanisms, not one, and
|
|
188
|
+
* they are easy to confuse:
|
|
189
|
+
* - This scale sets the RATIOS. It is fixed in rem and does not track the
|
|
190
|
+
* viewport, so a caption is the same amount smaller than body text on every
|
|
191
|
+
* surface, always.
|
|
192
|
+
* - runtime/zoom.js `initResolutionZoom()` makes the whole page track the
|
|
193
|
+
* WINDOW, by laying out at a 1920px reference and zooming above it. Every
|
|
194
|
+
* surface must call it, pre-paint from <head>, or it will look right on one
|
|
195
|
+
* monitor and wrong on the next. Scale without zoom = fixed on a 4K screen;
|
|
196
|
+
* zoom without scale = uniform sizes drifting apart between pages.
|
|
197
|
+
*
|
|
198
|
+
* WHY THE STEPS ARE 1px APART AT THE BOTTOM. This is a terminal UI: body is
|
|
199
|
+
* 12px and the useful range is 10-15px, so a geometric ratio scale (1.25×,
|
|
200
|
+
* 1.333×) would give three usable steps and then jump straight past everything
|
|
201
|
+
* that matters. The small end is hand-tuned to the pixel; only the display
|
|
202
|
+
* sizes, where a pixel stops being visible, open up. Sizes are rem so a reader
|
|
203
|
+
* who raises their browser's base font gets the whole scale with them.
|
|
204
|
+
*/
|
|
205
|
+
:root {
|
|
206
|
+
/* Content column. 78rem is cockpit's — the widest of the four found, the one
|
|
207
|
+
already tuned against the `ls -l` rail, and the surface with the most page
|
|
208
|
+
types. Standardising on the narrowest would have reflowed every table.
|
|
209
|
+
A page whose content genuinely is not a column (a full-bleed dashboard
|
|
210
|
+
table) sets `max-width: none` deliberately; it does not pick another number. */
|
|
211
|
+
--content-w: 78rem;
|
|
212
|
+
/* Horizontal breathing room, i.e. Daniel's "same margins left and right".
|
|
213
|
+
Vertical padding stays a page's own business — a doc and a dashboard do
|
|
214
|
+
not want the same headroom, and pretending otherwise is what produced the
|
|
215
|
+
four widths in the first place. */
|
|
216
|
+
--content-pad: 1.5rem;
|
|
217
|
+
|
|
218
|
+
--fs-xs: 0.625rem; /* 10px — table micro-labels, badge text, meta lines */
|
|
219
|
+
--fs-sm: 0.6875rem; /* 11px — secondary and muted copy */
|
|
220
|
+
--fs-base: 0.75rem; /* 12px — body. THE reference; base.css sets it on <body> */
|
|
221
|
+
--fs-md: 0.8125rem; /* 13px — emphasised body, card headings, table headers */
|
|
222
|
+
--fs-lg: 0.9375rem; /* 15px — h3 / section heads */
|
|
223
|
+
--fs-xl: 1.125rem; /* 18px — h2 / page title */
|
|
224
|
+
--fs-2xl: 1.5rem; /* 24px — h1 / hero, display only */
|
|
225
|
+
|
|
226
|
+
--lh-tight: 1.3; /* headings and single-line chrome */
|
|
227
|
+
--lh-base: 1.5; /* body copy; matches base.css */
|
|
228
|
+
}
|
package/tokens/tokens.json
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
"destructive": "#a02c2c",
|
|
21
21
|
"success": "#1a6b2e",
|
|
22
22
|
"warning": "#845600",
|
|
23
|
+
"info": "#1c5f9e",
|
|
24
|
+
"pending": "#5f3dc4",
|
|
23
25
|
"border": "#d9cdb6",
|
|
24
26
|
"input": "#d9cdb6",
|
|
25
27
|
"ring": "#8a4516",
|
|
@@ -27,7 +29,18 @@
|
|
|
27
29
|
"glow-soft": "rgba(160, 82, 45, 0.05)",
|
|
28
30
|
"scanline-opacity": "0.15",
|
|
29
31
|
"radius": "0rem",
|
|
30
|
-
"font-mono": "\"JetBrains Mono Variable\", \"JetBrains Mono\", \"Menlo\", monospace"
|
|
32
|
+
"font-mono": "\"JetBrains Mono Variable\", \"JetBrains Mono\", \"Menlo\", monospace",
|
|
33
|
+
"content-w": "78rem",
|
|
34
|
+
"content-pad": "1.5rem",
|
|
35
|
+
"fs-xs": "0.625rem",
|
|
36
|
+
"fs-sm": "0.6875rem",
|
|
37
|
+
"fs-base": "0.75rem",
|
|
38
|
+
"fs-md": "0.8125rem",
|
|
39
|
+
"fs-lg": "0.9375rem",
|
|
40
|
+
"fs-xl": "1.125rem",
|
|
41
|
+
"fs-2xl": "1.5rem",
|
|
42
|
+
"lh-tight": "1.3",
|
|
43
|
+
"lh-base": "1.5"
|
|
31
44
|
},
|
|
32
45
|
"green": {
|
|
33
46
|
"background": "#020604",
|
|
@@ -47,6 +60,8 @@
|
|
|
47
60
|
"destructive": "#ff5c5c",
|
|
48
61
|
"success": "#4ade80",
|
|
49
62
|
"warning": "#f5b32b",
|
|
63
|
+
"info": "#4dabf7",
|
|
64
|
+
"pending": "#b197fc",
|
|
50
65
|
"border": "#1c4a2c",
|
|
51
66
|
"input": "#1c4a2c",
|
|
52
67
|
"ring": "#33ff66",
|
|
@@ -72,6 +87,8 @@
|
|
|
72
87
|
"destructive": "#ff5c5c",
|
|
73
88
|
"success": "#4ade80",
|
|
74
89
|
"warning": "#f5b32b",
|
|
90
|
+
"info": "#4dabf7",
|
|
91
|
+
"pending": "#b197fc",
|
|
75
92
|
"border": "#333333",
|
|
76
93
|
"input": "#333333",
|
|
77
94
|
"ring": "#ffffff",
|
|
@@ -97,6 +114,8 @@
|
|
|
97
114
|
"destructive": "#b3261e",
|
|
98
115
|
"success": "#1a7031",
|
|
99
116
|
"warning": "#8f5d00",
|
|
117
|
+
"info": "#1c5f9e",
|
|
118
|
+
"pending": "#5f3dc4",
|
|
100
119
|
"border": "#d4d4d4",
|
|
101
120
|
"input": "#d4d4d4",
|
|
102
121
|
"ring": "#000000",
|