Skip to content
922 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

The webhooks empty state is a sentence, without an icon squeezed to a dot on phones1/*
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.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.
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones6 */
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.7:root {
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones8 --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. */
Merge branch 'worktree-agent-ad7c6d88d93adc817'12 --sl-color-accent-low: color-mix(in srgb, var(--g1t-accent) 14%, var(--g1t-bg));
13 --sl-color-accent: var(--g1t-accent);
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.14 --sl-color-accent-high: var(--g1t-docs-accent-high);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones15
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);
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.33 --sl-color-text-accent: var(--g1t-docs-link);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones34 --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;
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today44 /* Big enough to tap. */
45 --sl-menu-button-size: 2.5rem;
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.46}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones47
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.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). */
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.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;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones59}
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.60starlight-theme-select option {
61 background: var(--g1t-surface);
62 color: var(--g1t-fg);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones63}
64
65/* --- Header --------------------------------------------------------------- */
66
67header.header {
68 padding: 0 !important;
69 backdrop-filter: blur(10px);
70 border-bottom: 1px solid var(--g1t-line);
71}
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today72/* The search box fills the header's middle column; Header.astro centres
73 that column in the header, the same on every page. */
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones74site-search {
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today75 display: flex;
76 justify-content: center;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones77 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}
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today89@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}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones141
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.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
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones153/* --- Sidebar -------------------------------------------------------------- */
154
155.sidebar-content {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.156 padding-top: 1.5rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones157}
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 {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.167 margin-top: 1.75rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones168}
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.169/* Group labels: headings over their pages, in the page's own ink. */
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones170.sidebar-content details > summary .group-label .large,
171.sidebar-content .top-level > li > details > summary {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.172 font-size: 0.875rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones173 font-weight: 600;
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.174 color: var(--g1t-fg);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones175}
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.176.sidebar-content .top-level > li > details > summary {
177 padding-inline: 0.75rem;
178 margin-bottom: 0.35rem;
179}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones180.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 {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.187 border-radius: 0.5rem;
188 padding: 0.4rem 0.75rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones189 font-size: 0.875rem;
190 color: var(--g1t-muted);
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.191 transition: background 0.15s, color 0.15s;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones192}
193.sidebar-content a:hover {
194 background: var(--g1t-surface);
195 color: var(--g1t-fg);
196}
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.197/* The current page: a lavender pill. */
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones198.sidebar-content a[aria-current='page'],
199.sidebar-content a[aria-current='page']:hover {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.200 background: var(--g1t-accent-low);
201 color: var(--g1t-docs-accent-high);
202 font-weight: 600;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones203}
204
205/* --- Content -------------------------------------------------------------- */
206
207.content-panel {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.208 padding-top: 2.75rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones209}
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 {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.229 margin-top: 3.5rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones230}
231.sl-markdown-content h2 {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.232 font-size: 1.75rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones233 font-weight: 600;
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.234 letter-spacing: -0.02em;
235 line-height: 1.2;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones236 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}
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.249/* Links: the text's own ink, a little heavier, on a lavender underline. */
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones250.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card) {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.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;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones257}
258.sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card):hover {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.259 color: var(--g1t-docs-link);
Merge branch 'worktree-agent-ad7c6d88d93adc817'260 text-decoration-color: var(--g1t-accent);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones261}
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}
Usage, Billing settings and prepaid AI credit; fixes from the UX audit284/*
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 }
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today295 /* 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 }
Usage, Billing settings and prepaid AI credit; fixes from the UX audit300}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones301.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 {
Merge branch 'worktree-agent-ad7c6d88d93adc817'334 border-color: var(--g1t-success);
335 background: color-mix(in srgb, var(--g1t-success) 6%, var(--g1t-bg));
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones336}
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
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.348.right-sidebar-panel {
349 padding-top: 2.75rem;
350}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones351.right-sidebar-panel h2 {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.352 font-size: 0.875rem;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones353 font-weight: 600;
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.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);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones359}
360.right-sidebar-panel a {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.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);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones365 font-size: 0.8125rem;
366 color: var(--g1t-muted);
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.367 transition: color 0.15s, border-color 0.15s;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones368}
369.right-sidebar-panel a:hover {
370 color: var(--g1t-fg);
371}
372.right-sidebar-panel a[aria-current='true'] {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.373 border-color: var(--g1t-accent);
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.374 color: var(--g1t-docs-link);
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.375 font-weight: 500;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones376}
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);
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.385 transition: border-color 0.15s, background 0.15s, transform 0.15s;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones386}
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.387/* A link card lifts toward the accent under the pointer. */
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones388.sl-link-card:hover {
Merge the docs' new look: tabs for each section with their own short sidebar, a larger title under its section, a lavender pill for the current page, links in the text's colour on a lavender underline, On this page on a rail, and a header whose right side is g1t.sh, Source, Sign up and one theme button.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);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones394}
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 {
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.406 background: var(--g1t-docs-fg-hover);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones407}
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 {
Merge branch 'worktree-agent-ad7c6d88d93adc817'445 color: var(--g1t-accent);
446 background: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones447 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}
Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today496/* 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}
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones506/* 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;
docs.g1t.sh and status.g1t.sh follow your system's light or dark setting, and each has an Auto, Light and Dark switch that this browser remembers: the docs' in the header (at the foot of the menu on a phone), with code, search, the API reference and its explorer in both themes; the status page's in its header, chosen before anything is drawn; the workspaces guide says where.513 background: color-mix(in srgb, var(--method) var(--g1t-docs-tag-tint), transparent) !important;
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones514 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'] {
Merge branch 'worktree-agent-ad7c6d88d93adc817'522 --method: var(--g1t-success);
The webhooks empty state is a sentence, without an icon squeezed to a dot on phones523}
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}
Chat and workspace agents: channels, DMs and named agents you talk to551
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}
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.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}
Merge tabs per system in the docs: Quickstart's token and the runner's install and service, synced across pages, and a home page that opens without repeating itself, with icons on its cards.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}
architecture and such636
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}
729.g1t-diagram__dialog::backdrop {
730 background: rgb(0 0 0 / 0.6);
731 backdrop-filter: blur(2px);
732}
733.g1t-diagram__dialog-bar {
734 position: sticky;
735 top: 0;
736 z-index: 1;
737 display: flex;
738 align-items: center;
739 justify-content: space-between;
740 gap: 1rem;
741 border-bottom: 1px solid var(--g1t-line);
742 background: var(--g1t-surface);
743 padding: 0.75rem 1rem;
744 color: var(--g1t-muted);
745 font-size: 0.875rem;
746}
747.g1t-diagram.g1t-diagram__dialog-body {
748 margin: 0;
749 border: 0;
750 border-radius: 0;
751}
752.g1t-diagram__dialog-body svg.d-svg {
753 width: 100%;
754 max-width: none;
755 min-width: 900px;
756}
757.g1t-diagram__key {
758 display: inline-flex;
759 gap: 1rem;
760 color: var(--g1t-faint);
761 font-size: 0.75rem;
762}
763.g1t-diagram__key > span {
764 display: inline-flex;
765 align-items: center;
766 gap: 0.375rem;
767}
768.g1t-diagram .d-key {
769 stroke: var(--g1t-faint);
770 stroke-width: 1.5;
771}
772
773/* Boxes. */
774.g1t-diagram .d-node {
775 fill: var(--g1t-raised);
776 stroke: var(--g1t-line-strong);
777 stroke-width: 1;
778}
779.g1t-diagram .d-node.d-tone-accent {
780 fill: var(--g1t-accent-low);
781 stroke: color-mix(in srgb, var(--g1t-accent) 65%, transparent);
782}
783.g1t-diagram .d-node.d-tone-success {
784 fill: var(--g1t-success-low);
785 stroke: color-mix(in srgb, var(--g1t-success-dim) 80%, transparent);
786}
787.g1t-diagram .d-node.d-tone-warn {
788 fill: color-mix(in srgb, var(--g1t-warn) 12%, var(--g1t-surface));
789 stroke: color-mix(in srgb, var(--g1t-warn) 60%, transparent);
790}
791.g1t-diagram .d-node.d-tone-store {
792 fill: var(--g1t-surface);
793 stroke: var(--g1t-line-strong);
794}
795.g1t-diagram .d-node.d-tone-external {
796 fill: var(--g1t-bg);
797 stroke: var(--g1t-line-strong);
798 stroke-dasharray: 4 3;
799}
800.g1t-diagram .d-rim {
801 fill: none;
802 stroke: var(--g1t-line-strong);
803}
804.g1t-diagram .d-title {
805 fill: var(--g1t-fg);
806 font-size: 12.5px;
807 font-weight: 600;
808}
809.g1t-diagram .d-sub {
810 fill: var(--g1t-muted);
811 font-family: var(--g1t-font-mono);
812 font-size: 10px;
813}
814.g1t-diagram .d-mono {
815 font-family: var(--g1t-font-mono);
816 font-size: 0.92em;
817}
818
819/* Frames around a group of boxes. */
820.g1t-diagram .d-group {
821 fill: color-mix(in srgb, var(--g1t-bg) 55%, transparent);
822 stroke: var(--g1t-line-strong);
823 stroke-dasharray: 2 4;
824 stroke-linecap: round;
825}
826.g1t-diagram .d-group.d-tone-accent {
827 fill: color-mix(in srgb, var(--g1t-accent-low) 45%, transparent);
828 stroke: color-mix(in srgb, var(--g1t-accent) 45%, transparent);
829}
830.g1t-diagram .d-group.d-tone-success {
831 fill: color-mix(in srgb, var(--g1t-success-low) 45%, transparent);
832 stroke: color-mix(in srgb, var(--g1t-success-dim) 55%, transparent);
833}
834.g1t-diagram .d-group-label {
835 fill: var(--g1t-faint);
836 font-size: 11px;
837 font-weight: 600;
838 letter-spacing: 0.01em;
839}
840.g1t-diagram .d-group-label.d-tone-accent {
841 fill: var(--g1t-accent);
842}
843.g1t-diagram .d-group-label.d-tone-success {
844 fill: var(--g1t-success-dim);
845}
846
847/* Arrows. */
848.g1t-diagram .d-edge,
849.g1t-diagram .d-msg {
850 fill: none;
851 stroke: var(--g1t-faint);
852 stroke-width: 1.4;
853 stroke-linejoin: round;
854}
855.g1t-diagram .d-edge.d-tone-accent,
856.g1t-diagram .d-msg:not(.d-reply) {
857 stroke: var(--g1t-accent);
858}
859.g1t-diagram .d-edge.d-tone-success {
860 stroke: var(--g1t-success-dim);
861}
862.g1t-diagram .d-edge.d-tone-warn {
863 stroke: var(--g1t-warn);
864}
865.g1t-diagram .d-async {
866 stroke-dasharray: 5 4;
867}
868.g1t-diagram .d-head {
869 fill: var(--g1t-faint);
870}
871.g1t-diagram .d-head.d-tone-accent {
872 fill: var(--g1t-accent);
873}
874.g1t-diagram .d-head.d-tone-success {
875 fill: var(--g1t-success-dim);
876}
877.g1t-diagram .d-head.d-tone-warn {
878 fill: var(--g1t-warn);
879}
880.g1t-diagram .d-label,
881.g1t-diagram .d-phase-label {
882 fill: var(--g1t-fg-soft);
883 font-weight: 500;
884}
885.g1t-diagram .d-label-bg,
886.g1t-diagram .d-phase-label-bg {
887 fill: var(--g1t-surface);
888 stroke: var(--g1t-line);
889}
890
891/* Sequences. */
892.g1t-diagram .d-lifeline {
893 stroke: var(--g1t-line-strong);
894 stroke-width: 1.25;
895}
896.g1t-diagram .d-msg-label {
897 fill: var(--g1t-fg-soft);
898 font-size: 11.5px;
899}
900.g1t-diagram .d-badge {
901 fill: var(--g1t-accent);
902}
903.g1t-diagram .d-badge-text {
904 fill: var(--g1t-bg);
905 font-size: 9.5px;
906 font-weight: 700;
907}
908.g1t-diagram .d-note {
909 fill: color-mix(in srgb, var(--g1t-warn) 9%, var(--g1t-surface));
910 stroke: color-mix(in srgb, var(--g1t-warn) 35%, transparent);
911}
912.g1t-diagram .d-note-text {
913 fill: var(--g1t-fg-soft);
914 font-size: 11px;
915}
916.g1t-diagram .d-phase {
917 stroke: var(--g1t-line-strong);
918}
919.g1t-diagram .d-phase-label {
920 fill: var(--g1t-muted);
921 font-weight: 600;
922}

This file's history is long; its oldest lines are credited to the oldest commit read.