Skip to content
928 linesCodeBlameRaw
1/*
2 * g1t's docs: Starlight in g1t's own design. A very dark gray base (or a
3 * near-white one, in light: styles/light.css), lavender as the accent for
4 * links and the current page, and quiet typography. Starlight's colours
5 * are mapped onto the g1t tokens once, here, for both themes.
6 */
7:root {
8 --sl-font: var(--g1t-font-sans);
9 --sl-font-mono: var(--g1t-font-mono);
10
11 /* Lavender is the docs' accent: links, the current page, highlights. */
12 --sl-color-accent-low: color-mix(in srgb, var(--g1t-accent) 14%, var(--g1t-bg));
13 --sl-color-accent: var(--g1t-accent);
14 --sl-color-accent-high: var(--g1t-docs-accent-high);
15
16 --sl-color-white: var(--g1t-fg);
17 --sl-color-gray-1: var(--g1t-fg-soft);
18 --sl-color-gray-2: var(--g1t-fg-soft);
19 --sl-color-gray-3: var(--g1t-muted);
20 --sl-color-gray-4: var(--g1t-faint);
21 --sl-color-gray-5: var(--g1t-line);
22 --sl-color-gray-6: var(--g1t-surface);
23 --sl-color-gray-7: var(--g1t-surface);
24 --sl-color-black: var(--g1t-bg);
25
26 --sl-color-bg: var(--g1t-bg);
27 --sl-color-bg-nav: color-mix(in srgb, var(--g1t-bg) 88%, transparent);
28 --sl-color-bg-sidebar: var(--g1t-bg);
29 --sl-color-hairline: var(--g1t-line);
30 --sl-color-hairline-light: var(--g1t-line);
31 --sl-color-hairline-shade: var(--g1t-line);
32 --sl-color-text: var(--g1t-fg-soft);
33 --sl-color-text-accent: var(--g1t-docs-link);
34 --sl-color-text-invert: var(--g1t-bg);
35 --sl-color-bg-inline-code: var(--g1t-raised);
36
37 --sl-text-body: 0.9375rem;
38 --sl-line-height: 1.75;
39 --sl-content-width: 46rem;
40 /* The header's row, as tall as the app's top bar (3.5rem), and the tabs
41 beneath it. */
42 --sl-nav-height: 6.25rem;
43 --sl-sidebar-width: 17rem;
44 /* Big enough to tap. */
45 --sl-menu-button-size: 2.5rem;
46}
47
48/* Starlight's theme select (Auto, Light, Dark), at the foot of the phone
49 menu; the header has its own button (components/ThemeToggle.astro). */
50starlight-theme-select label {
51 color: var(--g1t-muted);
52 font-size: 0.85rem;
53}
54starlight-theme-select label:hover {
55 color: var(--g1t-fg);
56}
57starlight-theme-select select {
58 border-radius: 0.4rem;
59}
60starlight-theme-select option {
61 background: var(--g1t-surface);
62 color: var(--g1t-fg);
63}
64
65/* --- Header --------------------------------------------------------------- */
66
67header.header {
68 padding: 0 !important;
69 backdrop-filter: blur(10px);
70 border-bottom: 1px solid var(--g1t-line);
71}
72/* The search box fills the header's middle column; Header.astro centres
73 that column in the header, the same on every page. */
74site-search {
75 display: flex;
76 justify-content: center;
77 width: 100%;
78}
79site-search button[data-open-modal] {
80 border-radius: 0.5rem;
81 background: var(--g1t-surface);
82 border-color: var(--g1t-line);
83 color: var(--g1t-faint);
84}
85site-search button[data-open-modal]:hover {
86 border-color: var(--g1t-line-strong);
87 color: var(--g1t-muted);
88}
89@media (min-width: 50rem) {
90 site-search button[data-open-modal] {
91 max-width: none;
92 }
93}
94/* Tablets: the full search box, as on desktop, since there is room. */
95@media (min-width: 45rem) and (max-width: 49.99rem) {
96 site-search button[data-open-modal] {
97 width: 100%;
98 border: 1px solid var(--g1t-line);
99 padding-inline: 0.75rem 0.5rem;
100 font-size: var(--sl-text-sm);
101 }
102 site-search button[data-open-modal] > span.sl-hidden {
103 display: block;
104 }
105 site-search button[data-open-modal] > kbd.sl-hidden {
106 display: flex;
107 margin-inline-start: auto;
108 }
109}
110/* Phones: a search icon, as big as a fingertip. */
111@media (max-width: 44.99rem) {
112 site-search button[data-open-modal] {
113 justify-content: center;
114 width: 2.5rem;
115 height: 2.5rem;
116 padding: 0;
117 border: 0;
118 background: transparent;
119 color: var(--g1t-muted);
120 font-size: 1.125rem;
121 }
122}
123/* The menu button sits in the header's top row, at the end, drawn like
124 the header's other icon buttons rather than as a floating disc. */
125.sl-menu-button {
126 top: calc((3.5rem - var(--sl-menu-button-size)) / 2) !important;
127 align-items: center;
128 justify-content: center;
129 border-radius: 0.5rem;
130 padding: 0;
131 background: transparent;
132 box-shadow: none;
133 color: var(--g1t-fg-soft);
134 font-size: 1.25rem;
135}
136.sl-menu-button:hover,
137.sl-menu-button:has(~ :popover-open) {
138 background: var(--g1t-raised);
139 color: var(--g1t-fg);
140}
141
142/* Search, in light: the dialog is a white panel, so its results sit on a
143 step darker rather than on a white just off the panel's. */
144:root[data-theme='light'] #starlight__search {
145 --pagefind-ui-background: var(--g1t-surface);
146}
147:root[data-theme='light']
148 #starlight__search
149 :is(.pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)), .pagefind-ui__result-nested):not(:hover) {
150 background-color: var(--g1t-raised);
151}
152
153/* --- Sidebar -------------------------------------------------------------- */
154
155.sidebar-content {
156 padding-top: 1.5rem;
157}
158/* Groups always show their pages: no caret, no folding. */
159.sidebar-content details > summary {
160 pointer-events: none;
161 padding-top: 0.25rem;
162}
163.sidebar-content details > summary .caret {
164 display: none;
165}
166.sidebar-content .top-level > li + li {
167 margin-top: 1.75rem;
168}
169/* Group labels: headings over their pages, in the page's own ink. */
170.sidebar-content details > summary .group-label .large,
171.sidebar-content .top-level > li > details > summary {
172 font-size: 0.875rem;
173 font-weight: 600;
174 color: var(--g1t-fg);
175}
176.sidebar-content .top-level > li > details > summary {
177 padding-inline: 0.75rem;
178 margin-bottom: 0.35rem;
179}
180.sidebar-content ul ul,
181.sidebar-content ul ul li {
182 border-inline-start: 0;
183 margin-inline-start: 0;
184 padding-inline-start: 0;
185}
186.sidebar-content a {
187 border-radius: 0.5rem;
188 padding: 0.4rem 0.75rem;
189 font-size: 0.875rem;
190 color: var(--g1t-muted);
191 transition: background 0.15s, color 0.15s;
192}
193.sidebar-content a:hover {
194 background: var(--g1t-surface);
195 color: var(--g1t-fg);
196}
197/* The current page: a lavender pill. */
198.sidebar-content a[aria-current='page'],
199.sidebar-content a[aria-current='page']:hover {
200 background: var(--g1t-accent-low);
201 color: var(--g1t-docs-accent-high);
202 font-weight: 600;
203}
204
205/* --- Content -------------------------------------------------------------- */
206
207.content-panel {
208 padding-top: 2.75rem;
209}
210/* The title and the page read as one, without a rule between them. */
211.content-panel + .content-panel {
212 border-top: 0;
213 padding-top: 0.5rem;
214}
215/* Headlines in Bricolage Grotesque, its optical size following the size. */
216.sl-markdown-content :is(h1, h2) {
217 font-family: var(--g1t-font-display);
218 font-optical-sizing: auto;
219}
220.sl-markdown-content h1 {
221 font-size: 2.25rem;
222 font-weight: 650;
223 letter-spacing: -0.02em;
224 line-height: 1.15;
225 color: var(--g1t-fg);
226}
227/* Sections open with space, not rules. */
228.sl-markdown-content .sl-heading-wrapper.level-h2 {
229 margin-top: 3.5rem;
230}
231.sl-markdown-content h2 {
232 font-size: 1.75rem;
233 font-weight: 600;
234 letter-spacing: -0.02em;
235 line-height: 1.2;
236 color: var(--g1t-fg);
237}
238.sl-markdown-content h3 {
239 margin-top: 2rem;
240 font-size: 1.1rem;
241 font-weight: 600;
242 letter-spacing: -0.005em;
243 color: var(--g1t-fg);
244}
245.sl-markdown-content p,
246.sl-markdown-content li {
247 color: var(--g1t-fg-soft);
248}
249/* Links: the text's own ink, a little heavier, on a lavender underline. */
250.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card) {
251 color: var(--g1t-fg);
252 font-weight: 500;
253 text-decoration-color: color-mix(in srgb, var(--g1t-accent) 55%, transparent);
254 text-decoration-thickness: 1.5px;
255 text-underline-offset: 0.25em;
256 transition: text-decoration-color 0.15s, color 0.15s;
257}
258.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card):hover {
259 color: var(--g1t-docs-link);
260 text-decoration-color: var(--g1t-accent);
261}
262.sl-markdown-content :not(pre) > code {
263 border-radius: 0.3rem;
264 padding: 0.1rem 0.3rem;
265 font-size: 0.85em;
266 color: var(--g1t-fg);
267 background: var(--g1t-raised);
268}
269
270/* Tables: ruled, not boxed. */
271.sl-markdown-content table {
272 display: table;
273 width: 100%;
274 border-collapse: collapse;
275 font-size: 0.875rem;
276}
277/* On a phone a wide table scrolls inside itself, not the page. */
278@media (max-width: 50rem) {
279 .sl-markdown-content table {
280 display: block;
281 overflow-x: auto;
282 }
283}
284/*
285 * There, a name, route or value in a table is never broken, not even at a
286 * hyphen or a slash: a long one widens the table, which then scrolls.
287 */
288@media (max-width: 50rem) {
289 .sl-markdown-content td code,
290 .sl-markdown-content th code {
291 white-space: nowrap;
292 overflow-wrap: normal;
293 word-break: normal;
294 }
295 /* The last column usually holds the sentences. Kept readable, it
296 scrolls the table sideways instead of folding to a word a line. */
297 .sl-markdown-content :is(td, th):last-child:not(:first-child) {
298 min-width: 12rem;
299 }
300}
301.sl-markdown-content th {
302 border-bottom: 1px solid var(--g1t-line-strong);
303 background: transparent;
304 font-weight: 600;
305 color: var(--g1t-muted);
306 text-align: start;
307}
308.sl-markdown-content td,
309.sl-markdown-content th {
310 padding: 0.6rem 0.75rem;
311 border-inline: 0;
312 border-top: 0;
313}
314.sl-markdown-content td {
315 border-bottom: 1px solid var(--g1t-line);
316 vertical-align: top;
317}
318.sl-markdown-content tr:nth-child(2n) {
319 background: transparent;
320}
321
322/* Callouts: a tinted panel with a coloured edge. */
323.starlight-aside {
324 border: 0;
325 border-inline-start: 2px solid;
326 border-radius: 0 0.6rem 0.6rem 0;
327 padding: 0.85rem 1.1rem;
328}
329.starlight-aside--note {
330 border-color: var(--g1t-info);
331 background: color-mix(in srgb, var(--g1t-info) 7%, var(--g1t-bg));
332}
333.starlight-aside--tip {
334 border-color: var(--g1t-success);
335 background: color-mix(in srgb, var(--g1t-success) 6%, var(--g1t-bg));
336}
337.starlight-aside--caution {
338 border-color: var(--g1t-warn);
339 background: color-mix(in srgb, var(--g1t-warn) 7%, var(--g1t-bg));
340}
341.starlight-aside--danger {
342 border-color: var(--g1t-danger);
343 background: color-mix(in srgb, var(--g1t-danger) 7%, var(--g1t-bg));
344}
345
346/* --- On this page --------------------------------------------------------- */
347
348.right-sidebar-panel {
349 padding-top: 2.75rem;
350}
351.right-sidebar-panel h2 {
352 font-size: 0.875rem;
353 font-weight: 600;
354 color: var(--g1t-fg);
355}
356/* The headings on a rail; the one being read is marked on it. */
357.right-sidebar-panel starlight-toc > nav > ul {
358 border-inline-start: 1px solid var(--g1t-line);
359}
360.right-sidebar-panel a {
361 margin-inline-start: -1px;
362 border-inline-start: 1px solid transparent;
363 border-radius: 0;
364 padding-inline-start: calc(0.75rem + var(--depth) * 0.75rem);
365 font-size: 0.8125rem;
366 color: var(--g1t-muted);
367 transition: color 0.15s, border-color 0.15s;
368}
369.right-sidebar-panel a:hover {
370 color: var(--g1t-fg);
371}
372.right-sidebar-panel a[aria-current='true'] {
373 border-color: var(--g1t-accent);
374 color: var(--g1t-docs-link);
375 font-weight: 500;
376}
377
378/* --- Cards and buttons ---------------------------------------------------- */
379
380.card,
381.sl-link-card {
382 border-radius: 1rem;
383 background: var(--g1t-surface);
384 border: 1px solid var(--g1t-line);
385 transition: border-color 0.15s, background 0.15s, transform 0.15s;
386}
387/* A link card lifts toward the accent under the pointer. */
388.sl-link-card:hover {
389 border-color: color-mix(in srgb, var(--g1t-accent) 45%, var(--g1t-line));
390 background: color-mix(in srgb, var(--g1t-accent) 4%, var(--g1t-surface));
391}
392.sl-link-card:hover .icon {
393 color: var(--g1t-accent);
394}
395.sl-link-button {
396 border-radius: 0.5rem;
397 font-size: 0.9rem;
398 font-weight: 500;
399}
400.sl-link-button.primary {
401 background: var(--g1t-fg);
402 border-color: var(--g1t-fg);
403 color: var(--g1t-bg);
404}
405.sl-link-button.primary:hover {
406 background: var(--g1t-docs-fg-hover);
407}
408.sl-link-button.minimal {
409 color: var(--g1t-fg-soft);
410}
411
412/* --- Pagination and footer ----------------------------------------------- */
413
414.pagination-links a {
415 border-radius: 0.75rem;
416 border-color: var(--g1t-line);
417 box-shadow: none;
418}
419.pagination-links a:hover {
420 border-color: var(--g1t-line-strong);
421}
422.pagination-links a .link-title {
423 color: var(--g1t-fg);
424}
425.meta,
426.meta a {
427 font-size: 0.8125rem;
428 color: var(--g1t-faint);
429}
430
431/* --- Cards ---------------------------------------------------------------- */
432
433.sl-markdown-content .card-grid {
434 gap: 0.75rem;
435}
436.sl-markdown-content .card {
437 padding: 1.1rem 1.2rem;
438}
439.sl-markdown-content .card .title {
440 font-size: 1rem;
441 font-weight: 600;
442 color: var(--g1t-fg);
443}
444.sl-markdown-content .card .icon {
445 color: var(--g1t-accent);
446 background: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
447 border: 0;
448 border-radius: 0.5rem;
449 padding: 0.3rem;
450}
451.sl-link-card {
452 padding: 1rem 1.2rem;
453}
454.sl-link-card .title {
455 font-size: 0.95rem;
456 font-weight: 600;
457 color: var(--g1t-fg);
458}
459.sl-link-card .description {
460 font-size: 0.85rem;
461 color: var(--g1t-muted);
462}
463
464/* Steps: numbered, on a quiet rail. */
465.sl-steps > li::before {
466 background: var(--g1t-raised) !important;
467 color: var(--g1t-fg) !important;
468 box-shadow: inset 0 0 0 1px var(--g1t-line-strong);
469 font-family: var(--g1t-font-mono);
470 font-size: 0.8rem;
471}
472.sl-steps > li::after {
473 background: var(--g1t-line) !important;
474}
475
476/* --- API reference -------------------------------------------------------- */
477
478/* An operation's method and path, at the top of its page. */
479.sl-markdown-content .g1t-endpoint {
480 display: flex;
481 align-items: center;
482 gap: 0.75rem;
483 overflow-x: auto;
484 border: 1px solid var(--g1t-line);
485 border-radius: 0.75rem;
486 padding: 0.7rem 0.9rem;
487 background: var(--g1t-surface);
488}
489.sl-markdown-content .g1t-endpoint code {
490 padding: 0;
491 background: transparent;
492 font-size: 0.875rem;
493 white-space: nowrap;
494 color: var(--g1t-fg);
495}
496/* On a phone a long path wraps onto a second line rather than hiding its end. */
497@media (max-width: 40rem) {
498 .sl-markdown-content .g1t-endpoint {
499 align-items: flex-start;
500 }
501 .sl-markdown-content .g1t-endpoint code {
502 white-space: normal;
503 overflow-wrap: anywhere;
504 }
505}
506/* Methods: the same small mono tag in the sidebar and on the page. */
507.g1t-method {
508 --method: var(--g1t-muted);
509 flex-shrink: 0;
510 border: 0 !important;
511 border-radius: 0.3rem;
512 padding: 0.05rem 0.4rem;
513 background: color-mix(in srgb, var(--method) var(--g1t-docs-tag-tint), transparent) !important;
514 color: var(--method) !important;
515 font-family: var(--g1t-font-mono);
516 font-size: 0.7rem;
517 font-weight: 600;
518 letter-spacing: 0.02em;
519}
520.g1t-method-get,
521.g1t-method[data-method='get'] {
522 --method: var(--g1t-success);
523}
524.g1t-method-post,
525.g1t-method[data-method='post'] {
526 --method: var(--g1t-info);
527}
528.g1t-method-put,
529.g1t-method-patch,
530.g1t-method[data-method='put'],
531.g1t-method[data-method='patch'] {
532 --method: var(--g1t-warn);
533}
534.g1t-method-delete,
535.g1t-method[data-method='delete'] {
536 --method: var(--g1t-danger);
537}
538/* In the sidebar the method sits at the end of the row, in a fixed column. */
539.sidebar-content a:has(.g1t-method) {
540 display: flex;
541 justify-content: space-between;
542 align-items: center;
543 gap: 0.5rem;
544}
545.sidebar-content .g1t-method {
546 min-width: 3.1rem;
547 text-align: center;
548 font-size: 0.625rem;
549 line-height: 1.6;
550}
551
552/* "Soon" beside a sidebar entry for a feature not built yet: quiet, like
553 the site's Coming soon tag, not a call to action. */
554.sidebar-content .sl-badge {
555 background: var(--g1t-raised);
556 border: 1px solid var(--g1t-line-strong);
557 color: var(--g1t-muted);
558 font-family: var(--g1t-font-mono);
559 font-size: 0.625rem;
560 text-transform: uppercase;
561 letter-spacing: 0.04em;
562}
563
564/* Feature tables with a Live, Preview or Coming badge (components/Status.astro):
565 on a phone each row stacks, the name and its badge on one line and what it
566 does under them, rather than three narrow columns. */
567@media (max-width: 50rem) {
568 .sl-markdown-content table:has(.status),
569 .sl-markdown-content table:has(.status) tbody {
570 display: block;
571 width: 100%;
572 }
573 .sl-markdown-content table:has(.status) thead {
574 display: none;
575 }
576 .sl-markdown-content table:has(.status) tr {
577 display: grid;
578 grid-template-columns: minmax(0, 1fr) max-content;
579 width: 100%;
580 column-gap: 0.75rem;
581 padding-block: 0.5rem;
582 border-bottom: 1px solid var(--sl-color-hairline);
583 }
584 .sl-markdown-content table:has(.status) td {
585 border: 0;
586 padding: 0.15rem 0;
587 width: auto;
588 }
589 .sl-markdown-content table:has(.status) td:first-child {
590 font-weight: 600;
591 }
592 .sl-markdown-content table:has(.status) td:nth-child(2) {
593 grid-column: 1 / -1;
594 grid-row: 2;
595 color: var(--sl-color-gray-2);
596 }
597 .sl-markdown-content table:has(.status) td:nth-child(3) {
598 grid-column: 2;
599 grid-row: 1;
600 justify-self: end;
601 align-self: center;
602 width: max-content;
603 min-width: 0;
604 }
605 .sl-markdown-content table:has(.status) td + td {
606 margin-top: 0;
607 }
608}
609
610/* Tabs in a page, such as one per OS: quiet labels on a hairline, the
611 chosen one in ink over a lavender line. */
612starlight-tabs .tablist-wrapper {
613 margin-bottom: 0.75rem;
614}
615starlight-tabs [role='tablist'] {
616 gap: 0.25rem;
617 border-bottom: 1px solid var(--g1t-line);
618}
619starlight-tabs [role='tab'] {
620 margin-bottom: -1px;
621 border-bottom: 2px solid transparent;
622 padding: 0.4rem 0.75rem;
623 font-size: 0.875rem;
624 font-weight: 500;
625 color: var(--g1t-muted);
626 transition: color 0.15s, border-color 0.15s;
627}
628starlight-tabs [role='tab']:hover {
629 color: var(--g1t-fg);
630}
631starlight-tabs [role='tab'][aria-selected='true'] {
632 border-color: var(--g1t-accent);
633 color: var(--g1t-fg);
634 font-weight: 600;
635}
636
637/* --- Diagrams --------------------------------------------------------------
638 <Diagram name="..."> (components/Diagram.astro) draws a spec from
639 src/diagrams as an inline SVG. Every colour is a token, so a diagram
640 follows the theme like the rest of the page. On a narrow screen it keeps
641 its size and scrolls sideways, rather than shrinking its text away. */
642
643.g1t-diagram {
644 /* A grid or flex item grows to fit its content unless told not to: without
645 this, the SVG's minimum width widens the whole page on a phone. */
646 min-width: 0;
647 max-width: 100%;
648 margin: 1.75rem 0;
649 border: 1px solid var(--g1t-line);
650 border-radius: 0.875rem;
651 background:
652 radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--g1t-line-strong) 45%, transparent) 1px, transparent 0) 0 0 / 20px 20px,
653 var(--g1t-surface);
654}
655.g1t-diagram__scroll {
656 overflow-x: auto;
657 padding: 1.25rem;
658}
659.g1t-diagram__scroll:focus-visible {
660 outline: 2px solid var(--g1t-accent);
661 outline-offset: -2px;
662 border-radius: 0.875rem;
663}
664.g1t-diagram svg.d-svg {
665 display: block;
666 margin: 0 auto;
667 max-width: 100%;
668 height: auto;
669 /* Below this the labels get too small to read: scroll instead. */
670 min-width: 600px;
671 font-family: var(--g1t-font-sans);
672 overflow: visible;
673}
674.g1t-diagram figcaption {
675 display: flex;
676 flex-wrap: wrap;
677 align-items: center;
678 justify-content: space-between;
679 gap: 0.5rem 1rem;
680 border-top: 1px solid var(--g1t-line);
681 padding: 0.625rem 1rem;
682 color: var(--g1t-muted);
683 font-size: 0.8125rem;
684 line-height: 1.5;
685}
686.g1t-diagram__tools {
687 display: inline-flex;
688 align-items: center;
689 gap: 1rem;
690}
691.g1t-diagram__expand {
692 display: inline-flex;
693 align-items: center;
694 gap: 0.375rem;
695 border: 1px solid var(--g1t-line);
696 border-radius: 0.5rem;
697 background: var(--g1t-raised);
698 padding: 0.25rem 0.625rem;
699 color: var(--g1t-fg-soft);
700 font: inherit;
701 font-size: 0.75rem;
702 font-weight: 500;
703 cursor: pointer;
704}
705.g1t-diagram__expand:hover {
706 border-color: var(--g1t-line-strong);
707 color: var(--g1t-fg);
708}
709.g1t-diagram__expand:focus-visible {
710 outline: 2px solid var(--g1t-accent);
711 outline-offset: 2px;
712}
713
714/* The diagram at full size. On a wide screen it is drawn larger than in
715 the page, so its smallest labels read easily. */
716.g1t-diagram__dialog {
717 /* Starlight's reset takes a dialog's margins away; put the centring back. */
718 margin: auto;
719 width: min(96vw, 1400px);
720 max-width: none;
721 max-height: 92vh;
722 border: 1px solid var(--g1t-line-strong);
723 border-radius: 1rem;
724 background: var(--g1t-surface);
725 padding: 0;
726 color: var(--g1t-fg);
727 box-shadow: var(--g1t-docs-menu-shadow);
728 /* Scrolling past either end of the diagram stops here. */
729 overscroll-behavior: contain;
730}
731/* The page behind an open diagram stays where it is. */
732html:has(.g1t-diagram__dialog[open]) {
733 overflow: hidden;
734}
735.g1t-diagram__dialog::backdrop {
736 background: rgb(0 0 0 / 0.6);
737 backdrop-filter: blur(2px);
738}
739.g1t-diagram__dialog-bar {
740 position: sticky;
741 top: 0;
742 z-index: 1;
743 display: flex;
744 align-items: center;
745 justify-content: space-between;
746 gap: 1rem;
747 border-bottom: 1px solid var(--g1t-line);
748 background: var(--g1t-surface);
749 padding: 0.75rem 1rem;
750 color: var(--g1t-muted);
751 font-size: 0.875rem;
752}
753.g1t-diagram.g1t-diagram__dialog-body {
754 margin: 0;
755 border: 0;
756 border-radius: 0;
757}
758.g1t-diagram__dialog-body svg.d-svg {
759 width: 100%;
760 max-width: none;
761 min-width: 900px;
762}
763.g1t-diagram__key {
764 display: inline-flex;
765 gap: 1rem;
766 color: var(--g1t-faint);
767 font-size: 0.75rem;
768}
769.g1t-diagram__key > span {
770 display: inline-flex;
771 align-items: center;
772 gap: 0.375rem;
773}
774.g1t-diagram .d-key {
775 stroke: var(--g1t-faint);
776 stroke-width: 1.5;
777}
778
779/* Boxes. */
780.g1t-diagram .d-node {
781 fill: var(--g1t-raised);
782 stroke: var(--g1t-line-strong);
783 stroke-width: 1;
784}
785.g1t-diagram .d-node.d-tone-accent {
786 fill: var(--g1t-accent-low);
787 stroke: color-mix(in srgb, var(--g1t-accent) 65%, transparent);
788}
789.g1t-diagram .d-node.d-tone-success {
790 fill: var(--g1t-success-low);
791 stroke: color-mix(in srgb, var(--g1t-success-dim) 80%, transparent);
792}
793.g1t-diagram .d-node.d-tone-warn {
794 fill: color-mix(in srgb, var(--g1t-warn) 12%, var(--g1t-surface));
795 stroke: color-mix(in srgb, var(--g1t-warn) 60%, transparent);
796}
797.g1t-diagram .d-node.d-tone-store {
798 fill: var(--g1t-surface);
799 stroke: var(--g1t-line-strong);
800}
801.g1t-diagram .d-node.d-tone-external {
802 fill: var(--g1t-bg);
803 stroke: var(--g1t-line-strong);
804 stroke-dasharray: 4 3;
805}
806.g1t-diagram .d-rim {
807 fill: none;
808 stroke: var(--g1t-line-strong);
809}
810.g1t-diagram .d-title {
811 fill: var(--g1t-fg);
812 font-size: 12.5px;
813 font-weight: 600;
814}
815.g1t-diagram .d-sub {
816 fill: var(--g1t-muted);
817 font-family: var(--g1t-font-mono);
818 font-size: 10px;
819}
820.g1t-diagram .d-mono {
821 font-family: var(--g1t-font-mono);
822 font-size: 0.92em;
823}
824
825/* Frames around a group of boxes. */
826.g1t-diagram .d-group {
827 fill: color-mix(in srgb, var(--g1t-bg) 55%, transparent);
828 stroke: var(--g1t-line-strong);
829 stroke-dasharray: 2 4;
830 stroke-linecap: round;
831}
832.g1t-diagram .d-group.d-tone-accent {
833 fill: color-mix(in srgb, var(--g1t-accent-low) 45%, transparent);
834 stroke: color-mix(in srgb, var(--g1t-accent) 45%, transparent);
835}
836.g1t-diagram .d-group.d-tone-success {
837 fill: color-mix(in srgb, var(--g1t-success-low) 45%, transparent);
838 stroke: color-mix(in srgb, var(--g1t-success-dim) 55%, transparent);
839}
840.g1t-diagram .d-group-label {
841 fill: var(--g1t-faint);
842 font-size: 11px;
843 font-weight: 600;
844 letter-spacing: 0.01em;
845}
846.g1t-diagram .d-group-label.d-tone-accent {
847 fill: var(--g1t-accent);
848}
849.g1t-diagram .d-group-label.d-tone-success {
850 fill: var(--g1t-success-dim);
851}
852
853/* Arrows. */
854.g1t-diagram .d-edge,
855.g1t-diagram .d-msg {
856 fill: none;
857 stroke: var(--g1t-faint);
858 stroke-width: 1.4;
859 stroke-linejoin: round;
860}
861.g1t-diagram .d-edge.d-tone-accent,
862.g1t-diagram .d-msg:not(.d-reply) {
863 stroke: var(--g1t-accent);
864}
865.g1t-diagram .d-edge.d-tone-success {
866 stroke: var(--g1t-success-dim);
867}
868.g1t-diagram .d-edge.d-tone-warn {
869 stroke: var(--g1t-warn);
870}
871.g1t-diagram .d-async {
872 stroke-dasharray: 5 4;
873}
874.g1t-diagram .d-head {
875 fill: var(--g1t-faint);
876}
877.g1t-diagram .d-head.d-tone-accent {
878 fill: var(--g1t-accent);
879}
880.g1t-diagram .d-head.d-tone-success {
881 fill: var(--g1t-success-dim);
882}
883.g1t-diagram .d-head.d-tone-warn {
884 fill: var(--g1t-warn);
885}
886.g1t-diagram .d-label,
887.g1t-diagram .d-phase-label {
888 fill: var(--g1t-fg-soft);
889 font-weight: 500;
890}
891.g1t-diagram .d-label-bg,
892.g1t-diagram .d-phase-label-bg {
893 fill: var(--g1t-surface);
894 stroke: var(--g1t-line);
895}
896
897/* Sequences. */
898.g1t-diagram .d-lifeline {
899 stroke: var(--g1t-line-strong);
900 stroke-width: 1.25;
901}
902.g1t-diagram .d-msg-label {
903 fill: var(--g1t-fg-soft);
904 font-size: 11.5px;
905}
906.g1t-diagram .d-badge {
907 fill: var(--g1t-accent);
908}
909.g1t-diagram .d-badge-text {
910 fill: var(--g1t-bg);
911 font-size: 9.5px;
912 font-weight: 700;
913}
914.g1t-diagram .d-note {
915 fill: color-mix(in srgb, var(--g1t-warn) 9%, var(--g1t-surface));
916 stroke: color-mix(in srgb, var(--g1t-warn) 35%, transparent);
917}
918.g1t-diagram .d-note-text {
919 fill: var(--g1t-fg-soft);
920 font-size: 11px;
921}
922.g1t-diagram .d-phase {
923 stroke: var(--g1t-line-strong);
924}
925.g1t-diagram .d-phase-label {
926 fill: var(--g1t-muted);
927 font-weight: 600;
928}