Skip to content
594 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): in the header's links, and
49 at the foot of the phone menu. Drawn like the links beside it. */
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/* A narrow desktop: in the header, only the select's icon and caret; the
65 choice is still its accessible name and in the list it opens. */
66@media (min-width: 50rem) and (max-width: 63.99rem) {
67 .g1t-header-theme starlight-theme-select select {
68 width: 3.625rem;
69 color: transparent;
70 }
71}
72
73/* --- Header --------------------------------------------------------------- */
74
75header.header {
76 padding: 0 !important;
77 backdrop-filter: blur(10px);
78 border-bottom: 1px solid var(--g1t-line);
79}
80/* The search box fills the header's middle column; Header.astro centres
81 that column in the header, the same on every page. */
82site-search {
83 display: flex;
84 justify-content: center;
85 width: 100%;
86}
87site-search button[data-open-modal] {
88 border-radius: 0.5rem;
89 background: var(--g1t-surface);
90 border-color: var(--g1t-line);
91 color: var(--g1t-faint);
92}
93site-search button[data-open-modal]:hover {
94 border-color: var(--g1t-line-strong);
95 color: var(--g1t-muted);
96}
97@media (min-width: 50rem) {
98 site-search button[data-open-modal] {
99 max-width: none;
100 }
101}
102/* Tablets: the full search box, as on desktop, since there is room. */
103@media (min-width: 45rem) and (max-width: 49.99rem) {
104 site-search button[data-open-modal] {
105 width: 100%;
106 border: 1px solid var(--g1t-line);
107 padding-inline: 0.75rem 0.5rem;
108 font-size: var(--sl-text-sm);
109 }
110 site-search button[data-open-modal] > span.sl-hidden {
111 display: block;
112 }
113 site-search button[data-open-modal] > kbd.sl-hidden {
114 display: flex;
115 margin-inline-start: auto;
116 }
117}
118/* Phones: a search icon, as big as a fingertip. */
119@media (max-width: 44.99rem) {
120 site-search button[data-open-modal] {
121 justify-content: center;
122 width: 2.5rem;
123 height: 2.5rem;
124 padding: 0;
125 border: 0;
126 background: transparent;
127 color: var(--g1t-muted);
128 font-size: 1.125rem;
129 }
130}
131/* The menu button sits in the header's top row, at the end, drawn like
132 the header's other icon buttons rather than as a floating disc. */
133.sl-menu-button {
134 top: calc((3.5rem - var(--sl-menu-button-size)) / 2) !important;
135 align-items: center;
136 justify-content: center;
137 border-radius: 0.5rem;
138 padding: 0;
139 background: transparent;
140 box-shadow: none;
141 color: var(--g1t-fg-soft);
142 font-size: 1.25rem;
143}
144.sl-menu-button:hover,
145.sl-menu-button:has(~ :popover-open) {
146 background: var(--g1t-raised);
147 color: var(--g1t-fg);
148}
149
150/* Search, in light: the dialog is a white panel, so its results sit on a
151 step darker rather than on a white just off the panel's. */
152:root[data-theme='light'] #starlight__search {
153 --pagefind-ui-background: var(--g1t-surface);
154}
155:root[data-theme='light']
156 #starlight__search
157 :is(.pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)), .pagefind-ui__result-nested):not(:hover) {
158 background-color: var(--g1t-raised);
159}
160
161/* --- Sidebar -------------------------------------------------------------- */
162
163.sidebar-content {
164 padding-top: 1.25rem;
165}
166/* Groups always show their pages: no caret, no folding. */
167.sidebar-content details > summary {
168 pointer-events: none;
169 padding-top: 0.25rem;
170}
171.sidebar-content details > summary .caret {
172 display: none;
173}
174.sidebar-content .top-level > li + li {
175 margin-top: 1rem;
176}
177/* Group labels: small and quiet, like section names, not links. */
178.sidebar-content details > summary .group-label .large,
179.sidebar-content .top-level > li > details > summary {
180 font-size: 0.75rem;
181 font-weight: 600;
182 letter-spacing: 0.06em;
183 text-transform: uppercase;
184 color: var(--g1t-faint);
185}
186.sidebar-content ul ul,
187.sidebar-content ul ul li {
188 border-inline-start: 0;
189 margin-inline-start: 0;
190 padding-inline-start: 0;
191}
192.sidebar-content a {
193 border-radius: 0.375rem;
194 padding: 0.32rem 0.6rem;
195 font-size: 0.875rem;
196 color: var(--g1t-muted);
197}
198.sidebar-content a:hover {
199 background: var(--g1t-surface);
200 color: var(--g1t-fg);
201}
202/* The current page: brighter text and a lavender mark, not a filled bar.
203 Square on the mark's side, so the mark is a straight line. */
204.sidebar-content a[aria-current='page'],
205.sidebar-content a[aria-current='page']:hover {
206 border-radius: 0 0.375rem 0.375rem 0;
207 background: var(--g1t-surface);
208 color: var(--g1t-fg);
209 font-weight: 500;
210 box-shadow: inset 2px 0 0 var(--g1t-accent);
211}
212
213/* --- Content -------------------------------------------------------------- */
214
215.content-panel {
216 padding-top: 2rem;
217}
218/* The title and the page read as one, without a rule between them. */
219.content-panel + .content-panel {
220 border-top: 0;
221 padding-top: 0.5rem;
222}
223/* Headlines in Bricolage Grotesque, its optical size following the size. */
224.sl-markdown-content :is(h1, h2) {
225 font-family: var(--g1t-font-display);
226 font-optical-sizing: auto;
227}
228.sl-markdown-content h1 {
229 font-size: 2.25rem;
230 font-weight: 650;
231 letter-spacing: -0.02em;
232 line-height: 1.15;
233 color: var(--g1t-fg);
234}
235/* Sections open with space, not rules. */
236.sl-markdown-content .sl-heading-wrapper.level-h2 {
237 margin-top: 3rem;
238}
239.sl-markdown-content h2 {
240 font-size: 1.5rem;
241 font-weight: 600;
242 letter-spacing: -0.01em;
243 color: var(--g1t-fg);
244}
245.sl-markdown-content h3 {
246 margin-top: 2rem;
247 font-size: 1.1rem;
248 font-weight: 600;
249 letter-spacing: -0.005em;
250 color: var(--g1t-fg);
251}
252.sl-markdown-content p,
253.sl-markdown-content li {
254 color: var(--g1t-fg-soft);
255}
256.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card) {
257 color: var(--g1t-docs-link);
258 text-decoration-color: color-mix(in srgb, var(--g1t-accent) 45%, transparent);
259 text-underline-offset: 0.2em;
260}
261.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card):hover {
262 text-decoration-color: var(--g1t-accent);
263}
264.sl-markdown-content :not(pre) > code {
265 border-radius: 0.3rem;
266 padding: 0.1rem 0.3rem;
267 font-size: 0.85em;
268 color: var(--g1t-fg);
269 background: var(--g1t-raised);
270}
271
272/* Tables: ruled, not boxed. */
273.sl-markdown-content table {
274 display: table;
275 width: 100%;
276 border-collapse: collapse;
277 font-size: 0.875rem;
278}
279/* On a phone a wide table scrolls inside itself, not the page. */
280@media (max-width: 50rem) {
281 .sl-markdown-content table {
282 display: block;
283 overflow-x: auto;
284 }
285}
286/*
287 * There, a name, route or value in a table is never broken, not even at a
288 * hyphen or a slash: a long one widens the table, which then scrolls.
289 */
290@media (max-width: 50rem) {
291 .sl-markdown-content td code,
292 .sl-markdown-content th code {
293 white-space: nowrap;
294 overflow-wrap: normal;
295 word-break: normal;
296 }
297 /* The last column usually holds the sentences. Kept readable, it
298 scrolls the table sideways instead of folding to a word a line. */
299 .sl-markdown-content :is(td, th):last-child:not(:first-child) {
300 min-width: 12rem;
301 }
302}
303.sl-markdown-content th {
304 border-bottom: 1px solid var(--g1t-line-strong);
305 background: transparent;
306 font-weight: 600;
307 color: var(--g1t-muted);
308 text-align: start;
309}
310.sl-markdown-content td,
311.sl-markdown-content th {
312 padding: 0.6rem 0.75rem;
313 border-inline: 0;
314 border-top: 0;
315}
316.sl-markdown-content td {
317 border-bottom: 1px solid var(--g1t-line);
318 vertical-align: top;
319}
320.sl-markdown-content tr:nth-child(2n) {
321 background: transparent;
322}
323
324/* Callouts: a tinted panel with a coloured edge. */
325.starlight-aside {
326 border: 0;
327 border-inline-start: 2px solid;
328 border-radius: 0 0.6rem 0.6rem 0;
329 padding: 0.85rem 1.1rem;
330}
331.starlight-aside--note {
332 border-color: var(--g1t-info);
333 background: color-mix(in srgb, var(--g1t-info) 7%, var(--g1t-bg));
334}
335.starlight-aside--tip {
336 border-color: var(--g1t-success);
337 background: color-mix(in srgb, var(--g1t-success) 6%, var(--g1t-bg));
338}
339.starlight-aside--caution {
340 border-color: var(--g1t-warn);
341 background: color-mix(in srgb, var(--g1t-warn) 7%, var(--g1t-bg));
342}
343.starlight-aside--danger {
344 border-color: var(--g1t-danger);
345 background: color-mix(in srgb, var(--g1t-danger) 7%, var(--g1t-bg));
346}
347
348/* --- On this page --------------------------------------------------------- */
349
350.right-sidebar-panel h2 {
351 font-size: 0.75rem;
352 font-weight: 600;
353 letter-spacing: 0.06em;
354 text-transform: uppercase;
355 color: var(--g1t-faint);
356}
357.right-sidebar-panel a {
358 font-size: 0.8125rem;
359 color: var(--g1t-muted);
360}
361.right-sidebar-panel a:hover {
362 color: var(--g1t-fg);
363}
364.right-sidebar-panel a[aria-current='true'] {
365 color: var(--g1t-docs-link);
366}
367
368/* --- Cards and buttons ---------------------------------------------------- */
369
370.card,
371.sl-link-card {
372 border-radius: 1rem;
373 background: var(--g1t-surface);
374 border: 1px solid var(--g1t-line);
375 transition: border-color 0.15s;
376}
377.sl-link-card:hover {
378 border-color: var(--g1t-line-strong);
379 background: var(--g1t-surface);
380}
381.sl-link-button {
382 border-radius: 0.5rem;
383 font-size: 0.9rem;
384 font-weight: 500;
385}
386.sl-link-button.primary {
387 background: var(--g1t-fg);
388 border-color: var(--g1t-fg);
389 color: var(--g1t-bg);
390}
391.sl-link-button.primary:hover {
392 background: var(--g1t-docs-fg-hover);
393}
394.sl-link-button.minimal {
395 color: var(--g1t-fg-soft);
396}
397
398/* --- Pagination and footer ----------------------------------------------- */
399
400.pagination-links a {
401 border-radius: 0.75rem;
402 border-color: var(--g1t-line);
403 box-shadow: none;
404}
405.pagination-links a:hover {
406 border-color: var(--g1t-line-strong);
407}
408.pagination-links a .link-title {
409 color: var(--g1t-fg);
410}
411.meta,
412.meta a {
413 font-size: 0.8125rem;
414 color: var(--g1t-faint);
415}
416
417/* --- Cards ---------------------------------------------------------------- */
418
419.sl-markdown-content .card-grid {
420 gap: 0.75rem;
421}
422.sl-markdown-content .card {
423 padding: 1.1rem 1.2rem;
424}
425.sl-markdown-content .card .title {
426 font-size: 1rem;
427 font-weight: 600;
428 color: var(--g1t-fg);
429}
430.sl-markdown-content .card .icon {
431 color: var(--g1t-accent);
432 background: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
433 border: 0;
434 border-radius: 0.5rem;
435 padding: 0.3rem;
436}
437.sl-link-card {
438 padding: 1rem 1.2rem;
439}
440.sl-link-card .title {
441 font-size: 0.95rem;
442 font-weight: 600;
443 color: var(--g1t-fg);
444}
445.sl-link-card .description {
446 font-size: 0.85rem;
447 color: var(--g1t-muted);
448}
449
450/* Steps: numbered, on a quiet rail. */
451.sl-steps > li::before {
452 background: var(--g1t-raised) !important;
453 color: var(--g1t-fg) !important;
454 box-shadow: inset 0 0 0 1px var(--g1t-line-strong);
455 font-family: var(--g1t-font-mono);
456 font-size: 0.8rem;
457}
458.sl-steps > li::after {
459 background: var(--g1t-line) !important;
460}
461
462/* --- API reference -------------------------------------------------------- */
463
464/* An operation's method and path, at the top of its page. */
465.sl-markdown-content .g1t-endpoint {
466 display: flex;
467 align-items: center;
468 gap: 0.75rem;
469 overflow-x: auto;
470 border: 1px solid var(--g1t-line);
471 border-radius: 0.75rem;
472 padding: 0.7rem 0.9rem;
473 background: var(--g1t-surface);
474}
475.sl-markdown-content .g1t-endpoint code {
476 padding: 0;
477 background: transparent;
478 font-size: 0.875rem;
479 white-space: nowrap;
480 color: var(--g1t-fg);
481}
482/* On a phone a long path wraps onto a second line rather than hiding its end. */
483@media (max-width: 40rem) {
484 .sl-markdown-content .g1t-endpoint {
485 align-items: flex-start;
486 }
487 .sl-markdown-content .g1t-endpoint code {
488 white-space: normal;
489 overflow-wrap: anywhere;
490 }
491}
492/* Methods: the same small mono tag in the sidebar and on the page. */
493.g1t-method {
494 --method: var(--g1t-muted);
495 flex-shrink: 0;
496 border: 0 !important;
497 border-radius: 0.3rem;
498 padding: 0.05rem 0.4rem;
499 background: color-mix(in srgb, var(--method) var(--g1t-docs-tag-tint), transparent) !important;
500 color: var(--method) !important;
501 font-family: var(--g1t-font-mono);
502 font-size: 0.7rem;
503 font-weight: 600;
504 letter-spacing: 0.02em;
505}
506.g1t-method-get,
507.g1t-method[data-method='get'] {
508 --method: var(--g1t-success);
509}
510.g1t-method-post,
511.g1t-method[data-method='post'] {
512 --method: var(--g1t-info);
513}
514.g1t-method-put,
515.g1t-method-patch,
516.g1t-method[data-method='put'],
517.g1t-method[data-method='patch'] {
518 --method: var(--g1t-warn);
519}
520.g1t-method-delete,
521.g1t-method[data-method='delete'] {
522 --method: var(--g1t-danger);
523}
524/* In the sidebar the method sits at the end of the row, in a fixed column. */
525.sidebar-content a:has(.g1t-method) {
526 display: flex;
527 justify-content: space-between;
528 align-items: center;
529 gap: 0.5rem;
530}
531.sidebar-content .g1t-method {
532 min-width: 3.1rem;
533 text-align: center;
534 font-size: 0.625rem;
535 line-height: 1.6;
536}
537
538/* "Soon" beside a sidebar entry for a feature not built yet: quiet, like
539 the site's Coming soon tag, not a call to action. */
540.sidebar-content .sl-badge {
541 background: var(--g1t-raised);
542 border: 1px solid var(--g1t-line-strong);
543 color: var(--g1t-muted);
544 font-family: var(--g1t-font-mono);
545 font-size: 0.625rem;
546 text-transform: uppercase;
547 letter-spacing: 0.04em;
548}
549
550/* Feature tables with a Live, Preview or Coming badge (components/Status.astro):
551 on a phone each row stacks, the name and its badge on one line and what it
552 does under them, rather than three narrow columns. */
553@media (max-width: 50rem) {
554 .sl-markdown-content table:has(.status),
555 .sl-markdown-content table:has(.status) tbody {
556 display: block;
557 width: 100%;
558 }
559 .sl-markdown-content table:has(.status) thead {
560 display: none;
561 }
562 .sl-markdown-content table:has(.status) tr {
563 display: grid;
564 grid-template-columns: minmax(0, 1fr) max-content;
565 width: 100%;
566 column-gap: 0.75rem;
567 padding-block: 0.5rem;
568 border-bottom: 1px solid var(--sl-color-hairline);
569 }
570 .sl-markdown-content table:has(.status) td {
571 border: 0;
572 padding: 0.15rem 0;
573 width: auto;
574 }
575 .sl-markdown-content table:has(.status) td:first-child {
576 font-weight: 600;
577 }
578 .sl-markdown-content table:has(.status) td:nth-child(2) {
579 grid-column: 1 / -1;
580 grid-row: 2;
581 color: var(--sl-color-gray-2);
582 }
583 .sl-markdown-content table:has(.status) td:nth-child(3) {
584 grid-column: 2;
585 grid-row: 1;
586 justify-self: end;
587 align-self: center;
588 width: max-content;
589 min-width: 0;
590 }
591 .sl-markdown-content table:has(.status) td + td {
592 margin-top: 0;
593 }
594}