Spaces:
Running on Zero
Running on Zero
| /* Space-only overrides: one model, and a layout that survives a phone. | |
| * | |
| * Written against the shipped classes rather than the source, because this file | |
| * ships next to a built bundle. Every selector below hangs off something stable: | |
| * a title attribute, a data-testid, or the literal Tailwind class in the markup. | |
| */ | |
| /* ββ one model βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| * This Space serves exactly one model on its own GPU, so the picker offers a | |
| * choice that does not exist, and the "bring an OpenRouter key" prompt offers | |
| * one that costs money. Both are hidden rather than deleted: the app keeps | |
| * working, it just stops advertising alternatives. | |
| */ | |
| button[title="Choose model & params"], | |
| div:has(> input[data-testid="welcome-key"]) { | |
| display: none ; | |
| } | |
| /* ββ phone layout ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| * The desktop layout is two panes side by side, and the right one is | |
| * `w-[46%] min-w-[380px]` β on a 390px screen that alone is wider than the | |
| * viewport, so the chat gets squeezed to nothing. Below 860px the two panes | |
| * stack instead, each scrolling on its own. | |
| */ | |
| @media (max-width: 860px) { | |
| /* the row that holds chat + workspace */ | |
| div.flex-1.min-h-0.flex { | |
| flex-direction: column; | |
| } | |
| /* chat pane */ | |
| section.flex-1.min-w-0 { | |
| flex: 1 1 58%; | |
| min-height: 0; | |
| } | |
| /* workspace pane: full width, and the divider moves from left edge to top */ | |
| section[class*="min-w-[380px]"] { | |
| width: 100% ; | |
| min-width: 0 ; | |
| flex: 1 1 42%; | |
| min-height: 0; | |
| border-left: 0 ; | |
| border-top: 2px solid var(--color-ink); | |
| } | |
| /* margins tuned for a 1400px window waste a third of a 390px one */ | |
| section.flex-1.min-w-0 > div.overflow-y-auto { | |
| padding-left: 0.9rem; | |
| padding-right: 0.9rem; | |
| padding-top: 1.1rem; | |
| } | |
| /* chrome rows: let them scroll sideways instead of clipping their buttons */ | |
| header.h-11, | |
| section[class*="min-w-[380px]"] > div:first-child { | |
| gap: 1rem; | |
| overflow-x: auto; | |
| scrollbar-width: none; | |
| } | |
| header.h-11::-webkit-scrollbar, | |
| section[class*="min-w-[380px]"] > div:first-child::-webkit-scrollbar { | |
| display: none; | |
| } | |
| /* the agent's own hero/landing block is sized for a wide column */ | |
| .max-w-2xl { | |
| max-width: 100%; | |
| } | |
| /* the top bar is a single row of short labels; letting "pi agent" and the | |
| project name wrap turns an 44px-high bar into a 60px one and still clips */ | |
| header.h-11 { | |
| white-space: nowrap; | |
| } | |
| header.h-11 > * { | |
| flex-shrink: 0; | |
| } | |
| /* the workspace's 160px file column plus a preview does not fit on a phone. | |
| The preview is the point of that pane, so the file list steps aside; the | |
| Code tab still shows what the agent wrote. */ | |
| section[class*="min-w-[380px]"] div.w-40 { | |
| display: none; | |
| } | |
| /* with the pane only ~40vh tall, the framed preview needs its padding back */ | |
| section[class*="min-w-[380px]"] div.p-4 { | |
| padding: 0.5rem 0.5rem 0.25rem; | |
| } | |
| /* the theme switch sits where the status line ends up on a narrow screen */ | |
| #pi-theme-toggle { | |
| bottom: 34px; | |
| opacity: 0.75; | |
| } | |
| } | |
| /* Coarse pointers: the bracket buttons are 11β12px text with no padding, which | |
| * is a fine mouse target and a poor thumb one. */ | |
| @media (pointer: coarse) { | |
| .btn-bracket { | |
| padding: 4px 2px; | |
| } | |
| } | |