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.

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