Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

963 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:
192 background 0.15s,
193 color 0.15s;
194}
195.sidebar-content a:hover {
196 background: var(--g1t-surface);
197 color: var(--g1t-fg);
198}
199/* The current page: a lavender pill. */
200.sidebar-content a[aria-current="page"],
201.sidebar-content a[aria-current="page"]:hover {
202 background: var(--g1t-accent-low);
203 color: var(--g1t-docs-accent-high);
204 font-weight: 600;
205}
206
207/* --- Content -------------------------------------------------------------- */
208
209.content-panel {
210 padding-top: 2.75rem;
211}
212/* The title and the page read as one, without a rule between them. */
213.content-panel + .content-panel {
214 border-top: 0;
215 padding-top: 0.5rem;
216}
217/* Headlines in Bricolage Grotesque, its optical size following the size. */
218.sl-markdown-content :is(h1, h2) {
219 font-family: var(--g1t-font-display);
220 font-optical-sizing: auto;
221}
222.sl-markdown-content h1 {
223 font-size: 2.25rem;
224 font-weight: 650;
225 letter-spacing: -0.02em;
226 line-height: 1.15;
227 color: var(--g1t-fg);
228}
229/* Sections open with space, not rules. */
230.sl-markdown-content .sl-heading-wrapper.level-h2 {
231 margin-top: 3.5rem;
232}
233.sl-markdown-content h2 {
234 font-size: 1.75rem;
235 font-weight: 600;
236 letter-spacing: -0.02em;
237 line-height: 1.2;
238 color: var(--g1t-fg);
239}
240.sl-markdown-content h3 {
241 margin-top: 2rem;
242 font-size: 1.1rem;
243 font-weight: 600;
244 letter-spacing: -0.005em;
245 color: var(--g1t-fg);
246}
247.sl-markdown-content p,
248.sl-markdown-content li {
249 color: var(--g1t-fg-soft);
250}
251/* Links: the text's own ink, a little heavier, on a lavender underline. */
252.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card) {
253 color: var(--g1t-fg);
254 font-weight: 500;
255 text-decoration-color: color-mix(in srgb, var(--g1t-accent) 55%, transparent);
256 text-decoration-thickness: 1.5px;
257 text-underline-offset: 0.25em;
258 transition:
259 text-decoration-color 0.15s,
260 color 0.15s;
261}
262.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card):hover {
263 color: var(--g1t-docs-link);
264 text-decoration-color: var(--g1t-accent);
265}
266.sl-markdown-content :not(pre) > code {
267 border-radius: 0.3rem;
268 padding: 0.1rem 0.3rem;
269 font-size: 0.85em;
270 color: var(--g1t-fg);
271 background: var(--g1t-raised);
272}
273
274/* Tables: ruled, not boxed. */
275.sl-markdown-content table {
276 display: table;
277 width: 100%;
278 border-collapse: collapse;
279 font-size: 0.875rem;
280}
281/* On a phone a wide table scrolls inside itself, not the page. */
282@media (max-width: 50rem) {
283 .sl-markdown-content table {
284 display: block;
285 overflow-x: auto;
286 }
287 /* A shadow at an edge with more columns past it, so a cut-off column
288 reads as "scroll for more". The covers scroll with the table and hide
289 the shadows at its ends. */
290 .sl-markdown-content table:not(:has(.status)) {
291 --cover: var(--g1t-bg);
292 /* On the dark page a shadow is a faint light, as a dark one would not show. */
293 --shade: rgb(255 255 255 / 0.12);
294 background:
295 linear-gradient(to right, var(--cover) 30%, transparent) left / 2.5rem 100% no-repeat local,
296 linear-gradient(to left, var(--cover) 30%, transparent) right / 2.5rem 100% no-repeat local,
297 radial-gradient(farthest-side at 0 50%, var(--shade), transparent) left / 0.875rem 100% no-repeat scroll,
298 radial-gradient(farthest-side at 100% 50%, var(--shade), transparent) right / 0.875rem 100% no-repeat scroll;
299 }
300 :root[data-theme="light"] .sl-markdown-content table:not(:has(.status)) {
301 --shade: rgb(24 24 27 / 0.16);
302 }
303}
304/*
305 * There, a name, route or value in a table is never broken, not even at a
306 * hyphen or a slash: a long one widens the table, which then scrolls.
307 */
308@media (max-width: 50rem) {
309 .sl-markdown-content td code,
310 .sl-markdown-content th code {
311 white-space: nowrap;
312 overflow-wrap: normal;
313 word-break: normal;
314 }
315 /* The last column usually holds the sentences. Kept readable, it
316 scrolls the table sideways instead of folding to a word a line. */
317 .sl-markdown-content :is(td, th):last-child:not(:first-child) {
318 min-width: 12rem;
319 }
320}
321.sl-markdown-content th {
322 border-bottom: 1px solid var(--g1t-line-strong);
323 background: transparent;
324 font-weight: 600;
325 color: var(--g1t-muted);
326 text-align: start;
327}
328.sl-markdown-content td,
329.sl-markdown-content th {
330 padding: 0.6rem 0.75rem;
331 border-inline: 0;
332 border-top: 0;
333}
334.sl-markdown-content td {
335 border-bottom: 1px solid var(--g1t-line);
336 vertical-align: top;
337}
338.sl-markdown-content tr:nth-child(2n) {
339 background: transparent;
340}
341
342/* Callouts: a tinted panel with a coloured edge. */
343.starlight-aside {
344 border: 0;
345 border-inline-start: 2px solid;
346 border-radius: 0 0.6rem 0.6rem 0;
347 padding: 0.85rem 1.1rem;
348}
349.starlight-aside--note {
350 border-color: var(--g1t-info);
351 background: color-mix(in srgb, var(--g1t-info) 7%, var(--g1t-bg));
352}
353.starlight-aside--tip {
354 border-color: var(--g1t-success);
355 background: color-mix(in srgb, var(--g1t-success) 6%, var(--g1t-bg));
356}
357.starlight-aside--caution {
358 border-color: var(--g1t-warn);
359 background: color-mix(in srgb, var(--g1t-warn) 7%, var(--g1t-bg));
360}
361.starlight-aside--danger {
362 border-color: var(--g1t-danger);
363 background: color-mix(in srgb, var(--g1t-danger) 7%, var(--g1t-bg));
364}
365
366/* --- On this page --------------------------------------------------------- */
367
368/* On a phone the list drops over the page: give it an edge and a shadow, so
369 where it stops is clear rather than its last row running into the text. */
370mobile-starlight-toc .dropdown {
371 border-color: var(--g1t-line);
372 border-bottom-color: var(--g1t-line-strong);
373 box-shadow: var(--g1t-docs-menu-shadow);
374}
375
376.right-sidebar-panel {
377 padding-top: 2.75rem;
378}
379.right-sidebar-panel h2 {
380 font-size: 0.875rem;
381 font-weight: 600;
382 color: var(--g1t-fg);
383}
384/* The headings on a rail; the one being read is marked on it. */
385.right-sidebar-panel starlight-toc > nav > ul {
386 border-inline-start: 1px solid var(--g1t-line);
387}
388.right-sidebar-panel a {
389 margin-inline-start: -1px;
390 border-inline-start: 1px solid transparent;
391 border-radius: 0;
392 padding-inline-start: calc(0.75rem + var(--depth) * 0.75rem);
393 font-size: 0.8125rem;
394 color: var(--g1t-muted);
395 transition:
396 color 0.15s,
397 border-color 0.15s;
398}
399.right-sidebar-panel a:hover {
400 color: var(--g1t-fg);
401}
402.right-sidebar-panel a[aria-current="true"] {
403 border-color: var(--g1t-accent);
404 color: var(--g1t-docs-link);
405 font-weight: 500;
406}
407
408/* --- Cards and buttons ---------------------------------------------------- */
409
410.card,
411.sl-link-card {
412 border-radius: 1rem;
413 background: var(--g1t-surface);
414 border: 1px solid var(--g1t-line);
415 transition:
416 border-color 0.15s,
417 background 0.15s,
418 transform 0.15s;
419}
420/* A link card lifts toward the accent under the pointer. */
421.sl-link-card:hover {
422 border-color: color-mix(in srgb, var(--g1t-accent) 45%, var(--g1t-line));
423 background: color-mix(in srgb, var(--g1t-accent) 4%, var(--g1t-surface));
424}
425.sl-link-card:hover .icon {
426 color: var(--g1t-accent);
427}
428.sl-link-button {
429 border-radius: 0.5rem;
430 font-size: 0.9rem;
431 font-weight: 500;
432}
433.sl-link-button.primary {
434 background: var(--g1t-fg);
435 border-color: var(--g1t-fg);
436 color: var(--g1t-bg);
437}
438.sl-link-button.primary:hover {
439 background: var(--g1t-docs-fg-hover);
440}
441.sl-link-button.minimal {
442 color: var(--g1t-fg-soft);
443}
444
445/* --- Pagination and footer ----------------------------------------------- */
446
447.pagination-links a {
448 border-radius: 0.75rem;
449 border-color: var(--g1t-line);
450 box-shadow: none;
451}
452.pagination-links a:hover {
453 border-color: var(--g1t-line-strong);
454}
455.pagination-links a .link-title {
456 color: var(--g1t-fg);
457}
458.meta,
459.meta a {
460 font-size: 0.8125rem;
461 color: var(--g1t-faint);
462}
463
464/* --- Cards ---------------------------------------------------------------- */
465
466.sl-markdown-content .card-grid {
467 gap: 0.75rem;
468}
469.sl-markdown-content .card {
470 padding: 1.1rem 1.2rem;
471}
472.sl-markdown-content .card .title {
473 font-size: 1rem;
474 font-weight: 600;
475 color: var(--g1t-fg);
476}
477.sl-markdown-content .card .icon {
478 color: var(--g1t-accent);
479 background: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
480 border: 0;
481 border-radius: 0.5rem;
482 padding: 0.3rem;
483}
484.sl-link-card {
485 padding: 1rem 1.2rem;
486}
487.sl-link-card .title {
488 font-size: 0.95rem;
489 font-weight: 600;
490 color: var(--g1t-fg);
491}
492.sl-link-card .description {
493 font-size: 0.85rem;
494 color: var(--g1t-muted);
495}
496
497/* Steps: numbered, on a quiet rail. */
498.sl-steps > li::before {
499 background: var(--g1t-raised) !important;
500 color: var(--g1t-fg) !important;
501 box-shadow: inset 0 0 0 1px var(--g1t-line-strong);
502 font-family: var(--g1t-font-mono);
503 font-size: 0.8rem;
504}
505.sl-steps > li::after {
506 background: var(--g1t-line) !important;
507}
508
509/* --- API reference -------------------------------------------------------- */
510
511/* An operation's method and path, at the top of its page. */
512.sl-markdown-content .g1t-endpoint {
513 display: flex;
514 align-items: center;
515 gap: 0.75rem;
516 overflow-x: auto;
517 border: 1px solid var(--g1t-line);
518 border-radius: 0.75rem;
519 padding: 0.7rem 0.9rem;
520 background: var(--g1t-surface);
521}
522.sl-markdown-content .g1t-endpoint code {
523 padding: 0;
524 background: transparent;
525 font-size: 0.875rem;
526 white-space: nowrap;
527 color: var(--g1t-fg);
528}
529/* On a phone a long path wraps onto a second line rather than hiding its end. */
530@media (max-width: 40rem) {
531 .sl-markdown-content .g1t-endpoint {
532 align-items: flex-start;
533 }
534 .sl-markdown-content .g1t-endpoint code {
535 white-space: normal;
536 overflow-wrap: anywhere;
537 }
538}
539/* Methods: the same small mono tag in the sidebar and on the page. */
540.g1t-method {
541 --method: var(--g1t-muted);
542 flex-shrink: 0;
543 border: 0 !important;
544 border-radius: 0.3rem;
545 padding: 0.05rem 0.4rem;
546 background: color-mix(in srgb, var(--method) var(--g1t-docs-tag-tint), transparent) !important;
547 color: var(--method) !important;
548 font-family: var(--g1t-font-mono);
549 font-size: 0.7rem;
550 font-weight: 600;
551 letter-spacing: 0.02em;
552}
553.g1t-method-get,
554.g1t-method[data-method="get"] {
555 --method: var(--g1t-success);
556}
557.g1t-method-post,
558.g1t-method[data-method="post"] {
559 --method: var(--g1t-info);
560}
561.g1t-method-put,
562.g1t-method-patch,
563.g1t-method[data-method="put"],
564.g1t-method[data-method="patch"] {
565 --method: var(--g1t-warn);
566}
567.g1t-method-delete,
568.g1t-method[data-method="delete"] {
569 --method: var(--g1t-danger);
570}
571/* In the sidebar the method sits at the end of the row, in a fixed column. */
572.sidebar-content a:has(.g1t-method) {
573 display: flex;
574 justify-content: space-between;
575 align-items: center;
576 gap: 0.5rem;
577}
578.sidebar-content .g1t-method {
579 min-width: 3.1rem;
580 text-align: center;
581 font-size: 0.625rem;
582 line-height: 1.6;
583}
584
585/* "Soon" beside a sidebar entry for a feature not built yet: quiet, like
586 the site's Coming soon tag, not a call to action. */
587.sidebar-content .sl-badge {
588 background: var(--g1t-raised);
589 border: 1px solid var(--g1t-line-strong);
590 color: var(--g1t-muted);
591 font-family: var(--g1t-font-mono);
592 font-size: 0.625rem;
593 text-transform: uppercase;
594 letter-spacing: 0.04em;
595}
596
597/* Feature tables with a Live, Preview or Coming badge (components/Status.astro):
598 on a phone each row stacks, the name and its badge on one line and what it
599 does under them, rather than three narrow columns. */
600@media (max-width: 50rem) {
601 .sl-markdown-content table:has(.status),
602 .sl-markdown-content table:has(.status) tbody {
603 display: block;
604 width: 100%;
605 }
606 .sl-markdown-content table:has(.status) thead {
607 display: none;
608 }
609 .sl-markdown-content table:has(.status) tr {
610 display: grid;
611 grid-template-columns: minmax(0, 1fr) max-content;
612 width: 100%;
613 column-gap: 0.75rem;
614 padding-block: 0.5rem;
615 border-bottom: 1px solid var(--sl-color-hairline);
616 }
617 .sl-markdown-content table:has(.status) td {
618 border: 0;
619 padding: 0.15rem 0;
620 width: auto;
621 }
622 .sl-markdown-content table:has(.status) td:first-child {
623 font-weight: 600;
624 }
625 .sl-markdown-content table:has(.status) td:nth-child(2) {
626 grid-column: 1 / -1;
627 grid-row: 2;
628 color: var(--sl-color-gray-2);
629 }
630 .sl-markdown-content table:has(.status) td:nth-child(3) {
631 grid-column: 2;
632 grid-row: 1;
633 justify-self: end;
634 align-self: center;
635 width: max-content;
636 min-width: 0;
637 }
638 .sl-markdown-content table:has(.status) td + td {
639 margin-top: 0;
640 }
641}
642
643/* Tabs in a page, such as one per OS: quiet labels on a hairline, the
644 chosen one in ink over a lavender line. */
645starlight-tabs .tablist-wrapper {
646 margin-bottom: 0.75rem;
647}
648starlight-tabs [role="tablist"] {
649 gap: 0.25rem;
650 border-bottom: 1px solid var(--g1t-line);
651}
652starlight-tabs [role="tab"] {
653 margin-bottom: -1px;
654 border-bottom: 2px solid transparent;
655 padding: 0.4rem 0.75rem;
656 font-size: 0.875rem;
657 font-weight: 500;
658 color: var(--g1t-muted);
659 transition:
660 color 0.15s,
661 border-color 0.15s;
662}
663starlight-tabs [role="tab"]:hover {
664 color: var(--g1t-fg);
665}
666starlight-tabs [role="tab"][aria-selected="true"] {
667 border-color: var(--g1t-accent);
668 color: var(--g1t-fg);
669 font-weight: 600;
670}
671
672/* --- Diagrams --------------------------------------------------------------
673 <Diagram name="..."> (components/Diagram.astro) draws a spec from
674 src/diagrams as an inline SVG. Every colour is a token, so a diagram
675 follows the theme like the rest of the page. On a narrow screen it keeps
676 its size and scrolls sideways, rather than shrinking its text away. */
677
678.g1t-diagram {
679 /* A grid or flex item grows to fit its content unless told not to: without
680 this, the SVG's minimum width widens the whole page on a phone. */
681 min-width: 0;
682 max-width: 100%;
683 margin: 1.75rem 0;
684 border: 1px solid var(--g1t-line);
685 border-radius: 0.875rem;
686 background:
687 radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--g1t-line-strong) 45%, transparent) 1px, transparent 0) 0 0 / 20px 20px,
688 var(--g1t-surface);
689}
690.g1t-diagram__scroll {
691 overflow-x: auto;
692 padding: 1.25rem;
693}
694.g1t-diagram__scroll:focus-visible {
695 outline: 2px solid var(--g1t-accent);
696 outline-offset: -2px;
697 border-radius: 0.875rem;
698}
699.g1t-diagram svg.d-svg {
700 display: block;
701 margin: 0 auto;
702 max-width: 100%;
703 height: auto;
704 /* Below this the labels get too small to read: scroll instead. */
705 min-width: 600px;
706 font-family: var(--g1t-font-sans);
707 overflow: visible;
708}
709.g1t-diagram figcaption {
710 display: flex;
711 flex-wrap: wrap;
712 align-items: center;
713 justify-content: space-between;
714 gap: 0.5rem 1rem;
715 border-top: 1px solid var(--g1t-line);
716 padding: 0.625rem 1rem;
717 color: var(--g1t-muted);
718 font-size: 0.8125rem;
719 line-height: 1.5;
720}
721.g1t-diagram__tools {
722 display: inline-flex;
723 align-items: center;
724 gap: 1rem;
725}
726.g1t-diagram__expand {
727 display: inline-flex;
728 align-items: center;
729 gap: 0.375rem;
730 border: 1px solid var(--g1t-line);
731 border-radius: 0.5rem;
732 background: var(--g1t-raised);
733 padding: 0.25rem 0.625rem;
734 color: var(--g1t-fg-soft);
735 font: inherit;
736 font-size: 0.75rem;
737 font-weight: 500;
738 cursor: pointer;
739}
740.g1t-diagram__expand:hover {
741 border-color: var(--g1t-line-strong);
742 color: var(--g1t-fg);
743}
744.g1t-diagram__expand:focus-visible {
745 outline: 2px solid var(--g1t-accent);
746 outline-offset: 2px;
747}
748
749/* The diagram at full size. On a wide screen it is drawn larger than in
750 the page, so its smallest labels read easily. */
751.g1t-diagram__dialog {
752 /* Starlight's reset takes a dialog's margins away; put the centring back. */
753 margin: auto;
754 width: min(96vw, 1400px);
755 max-width: none;
756 max-height: 92vh;
757 border: 1px solid var(--g1t-line-strong);
758 border-radius: 1rem;
759 background: var(--g1t-surface);
760 padding: 0;
761 color: var(--g1t-fg);
762 box-shadow: var(--g1t-docs-menu-shadow);
763 /* Scrolling past either end of the diagram stops here. */
764 overscroll-behavior: contain;
765}
766/* The page behind an open diagram stays where it is. */
767html:has(.g1t-diagram__dialog[open]) {
768 overflow: hidden;
769}
770.g1t-diagram__dialog::backdrop {
771 background: rgb(0 0 0 / 0.6);
772 backdrop-filter: blur(2px);
773}
774.g1t-diagram__dialog-bar {
775 position: sticky;
776 top: 0;
777 z-index: 1;
778 display: flex;
779 align-items: center;
780 justify-content: space-between;
781 gap: 1rem;
782 border-bottom: 1px solid var(--g1t-line);
783 background: var(--g1t-surface);
784 padding: 0.75rem 1rem;
785 color: var(--g1t-muted);
786 font-size: 0.875rem;
787}
788.g1t-diagram.g1t-diagram__dialog-body {
789 margin: 0;
790 border: 0;
791 border-radius: 0;
792}
793.g1t-diagram__dialog-body svg.d-svg {
794 width: 100%;
795 max-width: none;
796 min-width: 900px;
797}
798.g1t-diagram__key {
799 display: inline-flex;
800 gap: 1rem;
801 color: var(--g1t-faint);
802 font-size: 0.75rem;
803}
804.g1t-diagram__key > span {
805 display: inline-flex;
806 align-items: center;
807 gap: 0.375rem;
808}
809.g1t-diagram .d-key {
810 stroke: var(--g1t-faint);
811 stroke-width: 1.5;
812}
813
814/* Boxes. */
815.g1t-diagram .d-node {
816 fill: var(--g1t-raised);
817 stroke: var(--g1t-line-strong);
818 stroke-width: 1;
819}
820.g1t-diagram .d-node.d-tone-accent {
821 fill: var(--g1t-accent-low);
822 stroke: color-mix(in srgb, var(--g1t-accent) 65%, transparent);
823}
824.g1t-diagram .d-node.d-tone-success {
825 fill: var(--g1t-success-low);
826 stroke: color-mix(in srgb, var(--g1t-success-dim) 80%, transparent);
827}
828.g1t-diagram .d-node.d-tone-warn {
829 fill: color-mix(in srgb, var(--g1t-warn) 12%, var(--g1t-surface));
830 stroke: color-mix(in srgb, var(--g1t-warn) 60%, transparent);
831}
832.g1t-diagram .d-node.d-tone-store {
833 fill: var(--g1t-surface);
834 stroke: var(--g1t-line-strong);
835}
836.g1t-diagram .d-node.d-tone-external {
837 fill: var(--g1t-bg);
838 stroke: var(--g1t-line-strong);
839 stroke-dasharray: 4 3;
840}
841.g1t-diagram .d-rim {
842 fill: none;
843 stroke: var(--g1t-line-strong);
844}
845.g1t-diagram .d-title {
846 fill: var(--g1t-fg);
847 font-size: 12.5px;
848 font-weight: 600;
849}
850.g1t-diagram .d-sub {
851 fill: var(--g1t-muted);
852 font-family: var(--g1t-font-mono);
853 font-size: 10px;
854}
855.g1t-diagram .d-mono {
856 font-family: var(--g1t-font-mono);
857 font-size: 0.92em;
858}
859
860/* Frames around a group of boxes. */
861.g1t-diagram .d-group {
862 fill: color-mix(in srgb, var(--g1t-bg) 55%, transparent);
863 stroke: var(--g1t-line-strong);
864 stroke-dasharray: 2 4;
865 stroke-linecap: round;
866}
867.g1t-diagram .d-group.d-tone-accent {
868 fill: color-mix(in srgb, var(--g1t-accent-low) 45%, transparent);
869 stroke: color-mix(in srgb, var(--g1t-accent) 45%, transparent);
870}
871.g1t-diagram .d-group.d-tone-success {
872 fill: color-mix(in srgb, var(--g1t-success-low) 45%, transparent);
873 stroke: color-mix(in srgb, var(--g1t-success-dim) 55%, transparent);
874}
875.g1t-diagram .d-group-label {
876 fill: var(--g1t-faint);
877 font-size: 11px;
878 font-weight: 600;
879 letter-spacing: 0.01em;
880}
881.g1t-diagram .d-group-label.d-tone-accent {
882 fill: var(--g1t-accent);
883}
884.g1t-diagram .d-group-label.d-tone-success {
885 fill: var(--g1t-success-dim);
886}
887
888/* Arrows. */
889.g1t-diagram .d-edge,
890.g1t-diagram .d-msg {
891 fill: none;
892 stroke: var(--g1t-faint);
893 stroke-width: 1.4;
894 stroke-linejoin: round;
895}
896.g1t-diagram .d-edge.d-tone-accent,
897.g1t-diagram .d-msg:not(.d-reply) {
898 stroke: var(--g1t-accent);
899}
900.g1t-diagram .d-edge.d-tone-success {
901 stroke: var(--g1t-success-dim);
902}
903.g1t-diagram .d-edge.d-tone-warn {
904 stroke: var(--g1t-warn);
905}
906.g1t-diagram .d-async {
907 stroke-dasharray: 5 4;
908}
909.g1t-diagram .d-head {
910 fill: var(--g1t-faint);
911}
912.g1t-diagram .d-head.d-tone-accent {
913 fill: var(--g1t-accent);
914}
915.g1t-diagram .d-head.d-tone-success {
916 fill: var(--g1t-success-dim);
917}
918.g1t-diagram .d-head.d-tone-warn {
919 fill: var(--g1t-warn);
920}
921.g1t-diagram .d-label,
922.g1t-diagram .d-phase-label {
923 fill: var(--g1t-fg-soft);
924 font-weight: 500;
925}
926.g1t-diagram .d-label-bg,
927.g1t-diagram .d-phase-label-bg {
928 fill: var(--g1t-surface);
929 stroke: var(--g1t-line);
930}
931
932/* Sequences. */
933.g1t-diagram .d-lifeline {
934 stroke: var(--g1t-line-strong);
935 stroke-width: 1.25;
936}
937.g1t-diagram .d-msg-label {
938 fill: var(--g1t-fg-soft);
939 font-size: 11.5px;
940}
941.g1t-diagram .d-badge {
942 fill: var(--g1t-accent);
943}
944.g1t-diagram .d-badge-text {
945 fill: var(--g1t-bg);
946 font-size: 9.5px;
947 font-weight: 700;
948}
949.g1t-diagram .d-note {
950 fill: color-mix(in srgb, var(--g1t-warn) 9%, var(--g1t-surface));
951 stroke: color-mix(in srgb, var(--g1t-warn) 35%, transparent);
952}
953.g1t-diagram .d-note-text {
954 fill: var(--g1t-fg-soft);
955 font-size: 11px;
956}
957.g1t-diagram .d-phase {
958 stroke: var(--g1t-line-strong);
959}
960.g1t-diagram .d-phase-label {
961 fill: var(--g1t-muted);
962 font-weight: 600;
963}