Skip to content
883 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.

Automations: rules in .g1t/automations that act when something happens1@import "tailwindcss" source(".");
2@import "@g1t/theme/tokens.css";
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look3@import "@g1t/theme/fonts.css";
Automations: rules in .g1t/automations that act when something happens4
5/* Tailwind's names for the shared g1t tokens. */
6@theme {
7 --font-sans: var(--g1t-font-sans);
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look8 --font-display: var(--g1t-font-display);
Automations: rules in .g1t/automations that act when something happens9 --font-mono: var(--g1t-font-mono);
10
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look11 /* Hanken and Bricolage want less tightening than a text face set close. */
12 --tracking-tight: -0.012em;
13
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.14 /*
15 * Every colour is a pair: light-dark() picks the light palette or the
16 * dark one by the element's color-scheme, which follows the Appearance
17 * setting (lib/theme.ts, set on <html> below). Something drawn dark on
18 * purpose in either theme, such as a product screenshot, sets
19 * `scheme-dark` and its tokens stay dark.
20 */
21 --color-bg: light-dark(var(--g1t-light-bg), var(--g1t-bg));
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.22 /* Behind the page panel, where the sidebar sits flat (components/shell.tsx). */
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.23 --color-shell: light-dark(#ececea, #0b0b0d);
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.24 /* The dock's own surface: a floating bar a step above the shell. */
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.25 --color-dock: light-dark(#ffffff, #15151a);
26 --color-surface: light-dark(var(--g1t-light-surface), var(--g1t-surface));
27 --color-raised: light-dark(var(--g1t-light-raised), var(--g1t-raised));
28 --color-line: light-dark(var(--g1t-light-line), var(--g1t-line));
29 --color-line-strong: light-dark(var(--g1t-light-line-strong), var(--g1t-line-strong));
Automations: rules in .g1t/automations that act when something happens30
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.31 --color-fg: light-dark(var(--g1t-light-fg), var(--g1t-fg));
32 --color-fg-soft: light-dark(var(--g1t-light-fg-soft), var(--g1t-fg-soft));
33 /* A primary button's hover: brighter than fg on dark, softer on light. */
34 --color-fg-hover: light-dark(#3a3a41, #ffffff);
35 --color-muted: light-dark(var(--g1t-light-muted), var(--g1t-muted));
36 --color-faint: light-dark(var(--g1t-light-faint), var(--g1t-faint));
Automations: rules in .g1t/automations that act when something happens37
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.38 --color-accent: light-dark(var(--g1t-light-accent), var(--g1t-accent));
39 --color-accent-hover: light-dark(var(--g1t-light-accent-hover), var(--g1t-accent-hover));
40 --color-accent-dim: light-dark(var(--g1t-light-accent-dim), var(--g1t-accent-dim));
41 --color-accent-low: light-dark(var(--g1t-light-accent-low), var(--g1t-accent-low));
42 /* The accent at its palest on dark, a middle lavender on light: the headline's gradient. */
43 --color-accent-high: light-dark(#8b76e0, #d9d1ff);
Automations: rules in .g1t/automations that act when something happens44
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.45 --color-success: light-dark(var(--g1t-light-success), var(--g1t-success));
46 --color-success-dim: light-dark(var(--g1t-light-success-dim), var(--g1t-success-dim));
47 --color-success-low: light-dark(var(--g1t-light-success-low), var(--g1t-success-low));
Merge branch 'worktree-agent-ad7c6d88d93adc817'48
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.49 --color-info: light-dark(var(--g1t-light-info), var(--g1t-info));
50 --color-merged: light-dark(var(--g1t-light-merged), var(--g1t-merged));
51 --color-warn: light-dark(var(--g1t-light-warn), var(--g1t-warn));
52 --color-danger: light-dark(var(--g1t-light-danger), var(--g1t-danger));
Automations: rules in .g1t/automations that act when something happens53
54 --animate-fade-up: fade-up 0.6s ease-out both;
55 --animate-dash: dash 1.2s linear infinite;
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)56 /* An agent's face, on hover: a small, quick wiggle (components/agent-avatar.tsx). */
57 --animate-wiggle: wiggle 0.45s ease-in-out;
Workspace names and icons, and a component kit for every control58
59 /* Menus, popovers and dialogs (components/ui): in quickly, out quicker. */
60 --animate-pop-in: pop-in 0.16s cubic-bezier(0.16, 1, 0.3, 1);
61 --animate-pop-out: pop-out 0.1s ease-in forwards;
62 --animate-fade-in: fade-in 0.16s ease-out;
63 --animate-fade-out: fade-out 0.12s ease-in forwards;
64 --animate-dialog-in: dialog-in 0.2s cubic-bezier(0.16, 1, 0.3, 1);
65 --animate-dialog-out: dialog-out 0.12s ease-in forwards;
Inbox: a bell in the top bar opens it beside the page, and /inbox holds it all66 /* Sheets (components/ui/sheet.tsx) slide in from their edge. */
67 --animate-sheet-in-right: sheet-in-right 0.24s cubic-bezier(0.16, 1, 0.3, 1);
68 --animate-sheet-out-right: sheet-out-right 0.16s ease-in forwards;
69 --animate-sheet-in-left: sheet-in-left 0.24s cubic-bezier(0.16, 1, 0.3, 1);
70 --animate-sheet-out-left: sheet-out-left 0.16s ease-in forwards;
71}
72
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)73@keyframes sheet-in-bottom {
74 from {
75 transform: translateY(100%);
76 }
77}
78
Inbox: a bell in the top bar opens it beside the page, and /inbox holds it all79@keyframes sheet-in-right {
80 from {
81 transform: translateX(100%);
82 }
83}
84
85@keyframes sheet-out-right {
86 to {
87 transform: translateX(100%);
88 }
89}
90
91@keyframes sheet-in-left {
92 from {
93 transform: translateX(-100%);
94 }
95}
96
97@keyframes sheet-out-left {
98 to {
99 transform: translateX(-100%);
100 }
Workspace names and icons, and a component kit for every control101}
102
103@keyframes pop-in {
104 from {
105 opacity: 0;
106 transform: scale(0.96) translateY(-2px);
107 }
108}
109
110@keyframes pop-out {
111 to {
112 opacity: 0;
113 transform: scale(0.96);
114 }
115}
116
117@keyframes fade-in {
118 from {
119 opacity: 0;
120 }
121}
122
123@keyframes fade-out {
124 to {
125 opacity: 0;
126 }
127}
128
129@keyframes dialog-in {
130 from {
131 opacity: 0;
132 transform: translateY(6px) scale(0.97);
133 }
134}
135
136@keyframes dialog-out {
137 to {
138 opacity: 0;
139 transform: translateY(6px) scale(0.97);
140 }
Automations: rules in .g1t/automations that act when something happens141}
142
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look143/* Never from nothing: the first paint already shows the words. */
Automations: rules in .g1t/automations that act when something happens144@keyframes fade-up {
145 from {
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look146 opacity: 0.4;
Automations: rules in .g1t/automations that act when something happens147 transform: translateY(8px);
148 }
149}
150
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)151@keyframes wiggle {
152 25% {
153 transform: rotate(-8deg);
154 }
155 60% {
156 transform: rotate(6deg);
157 }
158}
159
Automations: rules in .g1t/automations that act when something happens160@keyframes dash {
161 to {
162 stroke-dashoffset: -16;
163 }
164}
165
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.166/*
167 * Appearance (lib/theme.ts): with no choice, or Auto, the page follows
168 * the system; a choice of Light or Dark is data-theme on <html>.
169 */
Automations: rules in .g1t/automations that act when something happens170html {
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.171 color-scheme: light dark;
Automations: rules in .g1t/automations that act when something happens172 scroll-behavior: smooth;
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)173 /* A tap shows the control's own active state, not the browser's grey flash. */
174 -webkit-tap-highlight-color: transparent;
175 /* Phones: no text inflation on rotation. */
176 -webkit-text-size-adjust: 100%;
177 text-size-adjust: 100%;
Automations: rules in .g1t/automations that act when something happens178}
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.179html[data-theme="light"] {
180 color-scheme: light;
181}
182html[data-theme="dark"] {
183 color-scheme: dark;
184}
Automations: rules in .g1t/automations that act when something happens185
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)186/*
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.187 * The app's frame (components/shell.tsx), set on <body data-frame="app">:
188 * the page is a rounded panel inset from the window, with the dock beside
189 * it and, on a phone, the bottom bar under it. What sticks to the top or
190 * the bottom of a page reads these:
191 * --frame-top the gap above the panel
192 * --topbar-h the panel's top edge plus its header: where sticky things sit
193 * --tabbar-h what the bottom takes: the gap under the panel, and the phone's bar
194 * --page-h the height left for a page that fills the panel (Chat)
195 * The public frame keeps a plain header 3.5rem tall and nothing at the bottom.
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)196 */
197:root {
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.198 --frame-top: 0px;
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)199 --tabbar-h: 0px;
Phones reach every page: each mode's menu from the top bar or by tapping the tab you're on, Docs first in the avatar sheet, a project's pages as a swipeable strip; dialogs as bottom sheets above the keyboard, safe areas, menus kept on screen, 40px targets, touch-visible controls, save bars above the tab bar200 --topbar-h: 3.5rem;
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.201 --page-h: calc(100dvh - var(--topbar-h) - var(--tabbar-h));
202}
203body[data-frame="app"] {
204 --frame-top: 0.5rem;
205 --topbar-h: calc(var(--frame-top) + 3.5rem);
206 --tabbar-h: 0.5rem;
207 --page-h: calc(100dvh - var(--topbar-h) - var(--tabbar-h));
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)208}
209@media (max-width: 767px) {
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.210 body[data-frame="app"] {
211 --frame-top: max(0.375rem, env(safe-area-inset-top));
212 /* The bottom bar: 64px tall, 8px off the edge, 6px under the panel. */
213 --tabbar-h: calc(4.875rem + env(safe-area-inset-bottom));
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)214 }
215}
216
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.217/*
218 * Phones: a field under 16px makes iOS zoom the page when it is focused, so
219 * every field is at least that; and nothing scrolls the page sideways.
220 */
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)221@media (max-width: 767px) {
222 input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
223 textarea,
224 select {
225 font-size: max(16px, 1em) !important;
226 }
227 body {
228 overflow-x: clip;
229 }
230}
231
Automations: rules in .g1t/automations that act when something happens232body {
233 @apply bg-bg font-sans text-fg antialiased;
234}
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.235body[data-frame="app"] {
236 @apply bg-shell;
237}
Automations: rules in .g1t/automations that act when something happens238
239::selection {
240 background: color-mix(in srgb, var(--color-accent) 35%, transparent);
241}
242
243/* In the base layer, so a component can opt out with a utility. */
244@layer base {
245 :focus-visible {
246 outline: 2px solid var(--color-accent);
247 outline-offset: 2px;
248 }
249
250 /*
251 * A grid's items may shrink below their content. Without this, one long
252 * line that does not wrap (a command, a commit hash, an address) widens
253 * the whole column, and on a phone the page scrolls sideways.
254 */
255 .grid > * {
256 min-width: 0;
257 }
258
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look259 /*
260 * Headlines are set in Bricolage Grotesque, its optical size following
261 * the font size; small section labels that happen to be headings stay in
262 * the text face. A utility on the element still wins.
263 */
264 :where(h1, h2),
265 :where(h3):is(.text-xl, .text-2xl, .text-3xl, .text-4xl) {
266 font-family: var(--font-display);
267 font-optical-sizing: auto;
268 }
269 :where(h2):is(.text-xs, .text-sm, .text-base) {
270 font-family: var(--font-sans);
271 }
272
Automations: rules in .g1t/automations that act when something happens273 /* Checkboxes, radios and ranges in g1t's own colour, not the browser's. */
274 :root {
275 accent-color: var(--color-accent);
276 }
277}
278
279@media (prefers-reduced-motion: reduce) {
280 *,
281 *::before,
282 *::after {
283 animation: none !important;
284 scroll-behavior: auto !important;
285 }
286}
287
288/* Rendered markdown: READMEs, briefs and docs. */
289.prose > :first-child {
290 margin-top: 0;
291 padding-top: 0;
292}
293.prose {
294 @apply leading-7 text-fg;
295}
296.prose > * + * {
297 @apply mt-4;
298}
299.prose h1 {
300 @apply mt-0 text-3xl font-semibold tracking-tight;
301}
302.prose h2 {
303 @apply mt-10 border-b border-line pb-2 text-xl font-semibold tracking-tight;
304}
305.prose h3 {
306 @apply mt-8 text-base font-semibold;
307}
308.prose p,
309.prose li {
310 @apply text-[0.9375rem] text-fg/90;
311}
312.prose a {
313 @apply text-accent underline decoration-accent/40 underline-offset-4 hover:decoration-accent;
314}
315.prose ul {
316 @apply list-disc space-y-1.5 pl-6;
317}
318.prose ol {
319 @apply list-decimal space-y-1.5 pl-6;
320}
321.prose code {
322 @apply rounded bg-raised px-1.5 py-0.5 font-mono text-[0.85em];
323}
324.prose pre {
325 @apply overflow-x-auto rounded-lg border border-line bg-surface p-4 font-mono text-sm leading-6;
326}
327.prose pre code {
328 @apply bg-transparent p-0;
329}
330.prose blockquote {
331 @apply border-l-2 border-line-strong pl-4 text-muted;
332}
333.prose table {
334 @apply w-full border-collapse text-sm;
335}
336.prose th {
337 @apply border-b border-line-strong px-3 py-2 text-left font-medium text-muted;
338}
339.prose td {
340 @apply border-b border-line px-3 py-2 align-top;
341}
342.prose hr {
343 @apply border-line;
344}
345.prose h4 {
346 @apply mt-6 text-sm font-semibold;
347}
348.prose li.task-list-item {
349 @apply list-none;
350}
351.prose ul.contains-task-list {
352 @apply pl-1;
353}
354.prose kbd {
355 @apply rounded border border-line-strong bg-raised px-1.5 py-px font-mono text-[0.8em] shadow-[inset_0_-1px_0_var(--color-line-strong)];
356}
357.prose del {
358 @apply text-muted;
359}
360.prose details {
361 @apply rounded-lg border border-line px-4 py-2;
362}
363.prose summary {
364 @apply cursor-pointer font-medium;
365}
366.prose img {
367 @apply inline max-w-full;
368}
369.prose section[data-footnotes] {
370 @apply mt-10 border-t border-line pt-4 text-sm text-muted;
371}
372.prose a[data-footnote-ref] {
373 @apply no-underline;
374}
375
376/* Syntax-highlighted code from Shiki. */
377.shiki {
378 @apply bg-transparent! font-mono text-sm leading-6;
379}
380.shiki code {
381 counter-reset: line;
382 display: block;
383}
384.shiki .line::before {
385 counter-increment: line;
386 content: counter(line);
387 @apply mr-5 inline-block w-10 text-right text-faint select-none;
388}
389
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look390/*
391 * Artwork (components/art.tsx). Every piece loops on its drawing's
392 * `--dur` and starts at its own `--delay`, so the parts of one drawing
393 * stay in step. Only transforms, opacity and stroke offsets move. The
394 * resting style of each class is the finished picture: that is what
395 * prefers-reduced-motion shows, since the rule above stops every
396 * animation.
397 */
Automations: rules in .g1t/automations that act when something happens398.art-flow {
399 animation: dash 1.6s linear infinite;
400}
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look401
402/* Something travelling along a track (pathLength 100). Unseen at rest. */
403.art-packet {
404 opacity: 0;
405 stroke-dasharray: 4 200;
406 stroke-dashoffset: 4;
407 animation: art-travel var(--dur, 3s) cubic-bezier(0.45, 0, 0.35, 1) infinite;
408 animation-delay: var(--delay, 0s);
409}
410@keyframes art-travel {
411 0% {
412 stroke-dashoffset: 4;
413 opacity: 0;
414 }
415 3% {
416 opacity: 1;
417 }
418 32% {
419 opacity: 1;
420 }
421 36%,
422 100% {
423 stroke-dashoffset: -100;
424 opacity: 0;
425 }
426}
427
428/* A face that lights up for most of the loop. Lit at rest. */
429.art-lit {
430 opacity: 0.85;
431 animation: art-lit var(--dur, 8s) ease-in-out infinite both;
432 animation-delay: var(--delay, 0s);
433}
434@keyframes art-lit {
435 0%,
436 4% {
437 opacity: 0;
438 }
439 12%,
440 70% {
441 opacity: 0.9;
442 }
443 88%,
444 100% {
445 opacity: 0;
446 }
447}
448
449/* A short flash, as a check runs over a layer. Unseen at rest. */
450.art-scan {
451 opacity: 0;
452 animation: art-scan var(--dur, 8s) ease-out infinite both;
453 animation-delay: var(--delay, 0s);
454}
455@keyframes art-scan {
456 0% {
457 opacity: 0;
458 }
459 4% {
460 opacity: 1;
461 }
462 16%,
463 100% {
464 opacity: 0;
465 }
466}
467
468/* A line that draws itself, then fades. Drawn at rest. */
469.art-draw {
470 stroke-dasharray: 100;
471 stroke-dashoffset: 0;
472 animation: art-draw var(--dur, 8s) ease-in-out infinite both;
473 animation-delay: var(--delay, 0s);
474}
475@keyframes art-draw {
476 0% {
477 stroke-dashoffset: 100;
478 opacity: 1;
479 }
480 14%,
481 70% {
482 stroke-dashoffset: 0;
483 opacity: 1;
484 }
485 88%,
486 100% {
487 stroke-dashoffset: 0;
488 opacity: 0;
489 }
490}
491
492/* Something that appears, stays, and goes. Shown at rest. */
493.art-pop {
494 animation: art-pop var(--dur, 8s) ease-out infinite both;
495 animation-delay: var(--delay, 0s);
496}
497@keyframes art-pop {
498 0% {
499 opacity: 0;
500 transform: translateY(4px);
501 }
502 6%,
503 72% {
504 opacity: 1;
505 transform: none;
506 }
507 86%,
508 100% {
509 opacity: 0;
510 transform: none;
511 }
512}
513
514/* A layer dropping onto a stack. In place at rest. */
515.art-drop {
516 animation: art-drop var(--dur, 7s) cubic-bezier(0.2, 0.9, 0.3, 1.2) infinite both;
517 animation-delay: var(--delay, 0s);
518}
519@keyframes art-drop {
520 0% {
521 opacity: 0;
522 transform: translateY(-26px);
523 }
524 8%,
525 74% {
526 opacity: 1;
527 transform: none;
528 }
529 88%,
530 100% {
531 opacity: 0;
532 transform: none;
533 }
534}
535
536/* The layer that fails: drops, shakes, and is sent back. */
537.art-eject {
538 animation: art-eject var(--dur, 7s) ease-in-out infinite both;
539 animation-delay: var(--delay, 0s);
540}
541@keyframes art-eject {
542 0% {
543 opacity: 0;
544 transform: translateY(-26px);
545 }
546 8%,
547 30% {
548 opacity: 1;
549 transform: none;
550 }
551 33% {
552 transform: translateX(-3px);
553 }
554 36% {
555 transform: translateX(3px);
556 }
557 39% {
558 transform: translateX(-2px);
559 }
560 42% {
561 opacity: 1;
562 transform: none;
563 }
564 56%,
565 100% {
566 opacity: 0;
567 transform: translate(-40px, -22px);
568 }
569}
570
571/* A layer rising out of the one below it. In place at rest. */
572.art-rise {
573 animation: art-rise var(--dur, 7s) cubic-bezier(0.2, 0.8, 0.3, 1) infinite both;
574 animation-delay: var(--delay, 0s);
575}
576@keyframes art-rise {
577 0% {
578 opacity: 0;
579 transform: translateY(14px);
580 }
581 10%,
582 70% {
583 opacity: 1;
584 transform: none;
585 }
586 86%,
587 100% {
588 opacity: 0;
589 transform: none;
590 }
591}
592
593/* A soft glow breathing around a point. */
594.art-pulse {
595 transform-box: fill-box;
596 transform-origin: center;
597 animation: art-pulse var(--dur, 4s) ease-in-out infinite;
598 animation-delay: var(--delay, 0s);
599}
600@keyframes art-pulse {
601 0%,
602 100% {
603 transform: scale(0.8);
604 opacity: 1;
605 }
606 50% {
607 transform: scale(1.5);
608 opacity: 0.35;
609 }
610}
611
612/* Drawings off-screen hold still (components/art.tsx, Live). */
613[data-paused] * {
614 animation-play-state: paused !important;
615}
616/*
617 * Each drawing on its own layer, so a frame of its motion repaints only the
618 * drawing, not the page around it or the blurred header passing over it.
619 */
620[data-live] {
621 will-change: transform;
622}
623
624/* The landing page's steps, lit in turn along their line. */
625/* The ring is drawn once and only fades and grows, so the compositor runs it. */
626.flow-step::after {
627 content: "";
628 position: absolute;
629 inset: 0;
630 border-radius: inherit;
Merge branch 'worktree-agent-ad7c6d88d93adc817'631 box-shadow: 0 0 0 6px color-mix(in srgb, var(--color-accent) 18%, transparent);
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look632 opacity: 0;
633 pointer-events: none;
634 animation: flow-step 10s ease-in-out infinite both;
635 animation-delay: var(--delay, 0s);
636}
637@keyframes flow-step {
638 0%,
639 100% {
640 opacity: 0;
641 transform: scale(0.82);
642 }
643 6% {
644 opacity: 1;
645 transform: none;
646 }
647 16% {
648 opacity: 0;
649 transform: none;
650 }
651}
652.flow-runner {
653 animation: flow-runner 10s cubic-bezier(0.45, 0, 0.35, 1) infinite both;
654}
655@keyframes flow-runner {
656 0% {
657 transform: translateX(0);
658 opacity: 0;
659 }
660 4%,
661 76% {
662 opacity: 1;
663 }
664 80%,
665 100% {
666 transform: translateX(100%);
667 opacity: 0;
668 }
669}
Automations: rules in .g1t/automations that act when something happens670@media (prefers-reduced-motion: reduce) {
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look671 .flow-runner {
672 display: none;
Automations: rules in .g1t/automations that act when something happens673 }
674}
675
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look676/* The sidebar trading one far-side menu for another, in place. */
677@keyframes g1t-swap {
678 from {
679 opacity: 0;
680 transform: translateX(10px);
681 }
682 to {
683 opacity: 1;
684 transform: none;
685 }
686}
687
Automations: rules in .g1t/automations that act when something happens688/*
689 * Behind the landing page's opening: the same dark gray, with a faint
690 * lavender and peach glow low on the horizon and a few stars.
691 */
692.dusk {
693 background:
694 radial-gradient(1px 1px at 12% 18%, rgb(255 255 255 / 0.35), transparent),
695 radial-gradient(1px 1px at 27% 8%, rgb(255 255 255 / 0.25), transparent),
696 radial-gradient(1px 1px at 63% 12%, rgb(255 255 255 / 0.3), transparent),
697 radial-gradient(1.5px 1.5px at 90% 9%, rgb(255 255 255 / 0.35), transparent),
698 radial-gradient(60% 35% at 50% 100%, rgb(255 189 140 / 0.08), transparent 70%),
699 radial-gradient(80% 45% at 50% 100%, rgb(182 168 255 / 0.1), transparent 75%),
700 var(--color-bg);
701}
702/* A planet rising behind the horizon, its lit edge catching the glow. */
703.dusk-planet {
704 background: radial-gradient(circle at 70% 30%, rgb(182 168 255 / 0.12), rgb(255 189 140 / 0.04) 45%, transparent 70%);
705 box-shadow: inset 14px -8px 50px rgb(255 214 186 / 0.07);
Sidebar: no settings flash on the way into a repository, and a better slide706}
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)707
708/*
709 * On a phone, every field's text is at least 16px: iOS zooms the page into
710 * a field set smaller as soon as it is focused. Unlayered, so it wins over
711 * a field's text-sm utility.
712 */
713@media (max-width: 639px) {
714 input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]),
715 textarea,
716 select {
717 font-size: max(16px, 1em);
718 }
719}
Cards you act on in chat; agents comment and review as themselves; names shown cleanly; commits on the calendar720
721/* A card's Markdown preview in chat (components/chat/card.tsx): the same Markdown, smaller and tighter. */
722.card-md .prose {
723 @apply text-[0.8125rem] leading-relaxed;
724}
725.card-md .prose > * + * {
726 @apply mt-2;
727}
728.card-md .prose p,
729.card-md .prose li {
730 @apply text-[0.8125rem] text-fg/85;
731}
732.card-md .prose h1,
733.card-md .prose h2,
734.card-md .prose h3,
735.card-md .prose h4 {
736 @apply mt-3 border-0 pb-0 text-sm font-semibold;
737}
738.card-md .prose ul,
739.card-md .prose ol {
740 @apply space-y-0.5 pl-5;
741}
742.card-md .prose pre {
743 @apply p-2.5 text-xs leading-5;
744}
Docs: a workspace knowledge base people and agents write together745
746/*
747 * The Docs page editor (components/docs/editor.tsx) is BlockNote with its
748 * shadcn components. Their classes are generated from the package, and
749 * shadcn's token names map onto g1t's. `accent` and `muted` mean
750 * something else in shadcn (a hover fill, a quiet fill), so inside the
751 * editor they are redefined; g1t's own blocks there use the g1t tokens
752 * directly.
753 */
754@source "../../../node_modules/@blocknote/shadcn/dist";
755
756@theme {
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.757 --color-background: var(--color-bg);
758 --color-foreground: var(--color-fg);
759 --color-popover: var(--color-surface);
760 --color-popover-foreground: var(--color-fg);
761 --color-card: var(--color-surface);
762 --color-card-foreground: var(--color-fg);
763 --color-primary: var(--color-accent);
764 --color-primary-foreground: var(--color-bg);
765 --color-secondary: var(--color-raised);
766 --color-secondary-foreground: var(--color-fg);
767 --color-muted-foreground: var(--color-muted);
768 --color-accent-foreground: var(--color-fg);
769 --color-destructive: var(--color-danger);
770 --color-destructive-foreground: var(--color-bg);
771 --color-border: var(--color-line);
772 --color-input: var(--color-line);
773 --color-ring: var(--color-accent);
Docs: a workspace knowledge base people and agents write together774}
775
776.bn-shadcn {
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.777 --color-accent: var(--color-raised);
778 --color-muted: var(--color-raised);
Docs: a workspace knowledge base people and agents write together779 --bn-colors-editor-background: transparent;
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.780 --bn-colors-editor-text: var(--color-fg);
781 --bn-colors-menu-background: var(--color-surface);
782 --bn-colors-menu-text: var(--color-fg);
783 --bn-colors-hovered-background: var(--color-raised);
784 --bn-colors-side-menu: var(--color-faint);
785 --bn-colors-border: var(--color-line);
Docs: a workspace knowledge base people and agents write together786 --bn-border-radius: 8px;
787}
788
789.g1t-editor .bn-editor {
790 font-family: var(--g1t-font-sans);
791 font-size: 1rem;
792 line-height: 1.65;
793 background: transparent;
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.794 color: var(--color-fg);
Docs: a workspace knowledge base people and agents write together795}
796
797/* The drag handle and + sit in the margin, so the text lines up with the title. */
798@media (min-width: 768px) {
799 .g1t-editor .bn-container {
800 margin-inline: -54px;
801 }
802}
803
804.g1t-editor .bn-block-content[data-content-type="heading"] h1,
805.g1t-editor .bn-block-content[data-content-type="heading"] h2,
806.g1t-editor .bn-block-content[data-content-type="heading"] h3 {
807 font-family: var(--g1t-font-display);
808 letter-spacing: -0.012em;
809}
810
811.g1t-editor .bn-inline-content code {
812 font-family: var(--g1t-font-mono);
813 font-size: 0.875em;
814 padding: 0.1em 0.35em;
815 border-radius: 4px;
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.816 background: var(--color-raised);
Docs: a workspace knowledge base people and agents write together817}
818
819.g1t-editor .bn-block-content[data-content-type="codeBlock"] {
820 border-radius: 10px;
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.821 background: var(--color-surface);
822 border: 1px solid var(--color-line);
Docs: a workspace knowledge base people and agents write together823}
824
825.g1t-editor .bn-thread-mark {
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.826 background: color-mix(in srgb, var(--color-warn) 22%, transparent);
827 border-bottom: 2px solid color-mix(in srgb, var(--color-warn) 60%, transparent);
Docs: a workspace knowledge base people and agents write together828}
829
830.g1t-editor a {
You choose how g1t looks: Auto follows your system, Light and Dark stay put, set from the account menu, the phone's You and help sheet, Settings → Account or the command palette; the page is drawn in your choice from the first byte, every colour has a light value that reads at 4.5:1 or better, code and diffs are highlighted for both, diagrams and the document editor follow along, the product tour and the g1t mark's avatar stay dark, and Dark is what you see until you choose; the workspaces guide says how.831 color: var(--color-accent);
Docs: a workspace knowledge base people and agents write together832}
833
834/* A page read before the editor loads: the same measure as the editor. */
835.docs-read .prose {
836 font-size: 1rem;
837 line-height: 1.65;
838}
839
Merge main into Artifacts Phase 2840/* The chat composer (components/chat/editor.tsx): formatting as messages show it. */
841.chat-editor {
842 white-space: pre-wrap;
843 word-break: break-word;
844 min-height: 1.5rem;
845}
846.chat-editor p.is-editor-empty:first-child::before {
847 content: attr(data-placeholder);
848 float: left;
849 height: 0;
850 pointer-events: none;
851 color: var(--color-faint);
852}
853.chat-editor strong {
854 @apply font-semibold text-fg;
855}
856.chat-editor s {
857 @apply text-muted;
858}
859.chat-editor a {
860 @apply text-accent underline underline-offset-2;
861}
862.chat-editor code {
863 @apply rounded-[4px] border border-line bg-raised px-1 py-px font-mono text-[0.84em] text-fg-soft;
864}
865.chat-editor pre {
866 @apply my-1 rounded-md border border-line bg-bg px-3 py-2 font-mono text-[0.8125rem] leading-relaxed text-fg-soft;
867}
868.chat-editor pre code {
869 @apply border-0 bg-transparent p-0 text-[1em];
870}
871.chat-editor ul {
872 @apply list-disc pl-5 marker:text-faint;
873}
874.chat-editor ol {
875 @apply list-decimal pl-5 marker:text-faint;
876}
877.chat-editor li > p {
878 @apply pl-0.5;
879}
880.chat-editor blockquote {
881 @apply my-0.5 border-l-2 border-line-strong pl-3 text-muted;
882}
883

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