File size: 32,280 Bytes
779e6b0 98010fc 3e43fab 56b95fb 3e43fab 5b8c924 3e43fab 98010fc 779e6b0 98010fc 779e6b0 56b95fb 98010fc 779e6b0 98010fc 779e6b0 56b95fb 98010fc 34784df 779e6b0 98010fc 779e6b0 5b8c924 56b95fb 5b8c924 56b95fb 3e43fab 779e6b0 3e43fab 98010fc 5b8c924 779e6b0 c0cf009 3e43fab 503cc93 3e43fab 503cc93 3e43fab 503cc93 779e6b0 10b437c 5b8c924 56b95fb 779e6b0 3e43fab 779e6b0 5cbe6f2 56b95fb 3e43fab 086addd 779e6b0 31081ca b3c0862 31081ca 779e6b0 3e43fab 9bf03e9 2fd97ff aba5de3 98010fc aba5de3 10b437c 2fd97ff 480d3f3 10b437c cc7905a 10b437c d501176 2fd97ff d501176 2fd97ff 8e10cc0 d728756 5b8c924 372b496 56b95fb 779e6b0 3e43fab 779e6b0 36c6d30 779e6b0 56b95fb 372b496 6032e73 372b496 98010fc 3e43fab 18d42b7 779e6b0 8d35e43 18d42b7 8d35e43 779e6b0 3e43fab 7725fd6 779e6b0 56b95fb 7725fd6 56b95fb 7725fd6 56b95fb 7725fd6 56b95fb 7725fd6 3e43fab 56b95fb 3e43fab 7725fd6 56b95fb 7725fd6 779e6b0 98010fc 068f05c 98010fc c6c2458 10b437c c6c2458 10b437c c6c2458 10b437c b53cb3b 2a060b3 b53cb3b 2a060b3 b53cb3b 2a060b3 b53cb3b 95ab8d5 98010fc 95ab8d5 98010fc 0dfbad8 bc5f822 0dfbad8 56b95fb 98010fc 10b437c 98010fc 56b95fb 98010fc e66d515 34784df b81afc8 95ab8d5 5120155 7725fd6 98010fc 068f05c da9a607 bc5f822 ba12bee e66d515 98010fc 3e43fab 068f05c 779e6b0 3e43fab 5b8c924 3e43fab 56b95fb 779e6b0 10b437c 5b8c924 779e6b0 3e43fab 779e6b0 aba5de3 56b95fb aba5de3 779e6b0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 | :root {
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 13px;
font-synthesis: none;
color-scheme: dark;
color: var(--text);
background: var(--background);
--background: #18181e;
--surface: #1e1e24;
--panel: #22222b;
--control: #282832;
--hover: #343541;
--selected: #3a3a4a;
--line: #393942;
--line-strong: #50505c;
--text: #d4d4d4;
--muted: #b0b0bd;
--accent: #8abeb7;
--surface-inset: 8px;
--radius-small: 8px;
--radius: calc(var(--radius-small) + var(--surface-inset));
--radius-large: calc(var(--radius) + var(--surface-inset));
--content-width: 1800px;
--content-gutter: 14px;
--header-inset: 12px;
--header-control-height: 32px;
--header-height: calc(var(--header-control-height) + 2 * var(--surface-inset));
scrollbar-color: var(--line-strong) var(--background);
}
* { box-sizing: border-box; }
body { margin: 0; }
button, input, textarea { font: inherit; color: inherit; }
::selection { background: var(--selected); color: var(--text); }
input::placeholder, textarea::placeholder { color: var(--muted); opacity: 1; }
button, .button {
cursor: pointer;
min-height: 28px;
padding: 5px 9px;
border: 1px solid transparent;
border-radius: var(--radius-small);
background: var(--control);
color: inherit;
font-size: 12px;
line-height: 1.4;
white-space: nowrap;
}
button:hover, .button:hover { background: var(--hover); }
button:disabled { opacity: .45; cursor: default; }
.primary { background: var(--hover); color: var(--text); }
.primary:hover { background: var(--selected); }
#send.has-input:not(:disabled) { background: #fff; color: #18181e; }
#send.has-input:not(:disabled):hover { background: #e8e8ed; }
.quiet { border-color: transparent; background: transparent; font-size: 11px; }
textarea, input { outline: none; }
textarea:focus, input:focus { box-shadow: inset 0 0 0 1px var(--accent); }
button:focus-visible, .button:focus-visible, summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
[hidden] { display: none !important; }
header {
width: calc(100% - 2 * var(--content-gutter));
max-width: calc(var(--content-width) - 2 * var(--content-gutter));
height: var(--header-height);
margin: var(--header-inset) auto 0;
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
justify-content: space-between;
padding: var(--surface-inset);
gap: var(--surface-inset) 16px;
background: var(--surface);
border-radius: var(--radius);
overflow: hidden;
}
.brand { display: flex; gap: 8px; align-items: center; text-decoration: none; color: inherit; font-size: 15px; font-weight: 600; }
.pi-logo { display: block; width: 18px; height: 18px; flex: none; }
.brand { justify-self: start; padding: 0 4px; }
.runtime-meter { --runtime-padding: 10px; display: flex; align-items: center; justify-self: center; width: max-content; max-width: 100%; height: var(--header-control-height); padding: 5px var(--runtime-padding); border-radius: var(--radius-small); background: var(--control); font-size: 11px; white-space: nowrap; overflow: clip; transition: width 220ms cubic-bezier(.2, .8, .2, 1); }
.runtime-content { display: flex; align-items: center; gap: 8px; width: max-content; height: 100%; flex: none; }
.runtime-location { display: flex; align-items: center; gap: 6px; flex: none; }
.runtime-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--muted); }
.runtime-meter[data-state="generating"] .runtime-dot, .runtime-meter[data-state="tool"] .runtime-dot { background: var(--accent); }
.runtime-meter[data-state="error"] .runtime-dot { background: #d98c8c; }
.runtime-divider { align-self: stretch; flex: 0 0 1px; background: var(--line); margin: 2px 0; }
.runtime-sparkline { flex: none; color: var(--accent); }
.runtime-value { flex: none; color: var(--muted); font-variant-numeric: tabular-nums; }
.runtime-meter[data-state="generating"] .runtime-value { color: var(--accent); }
@media (prefers-reduced-motion: reduce) { .runtime-meter { transition: none; } }
main { --conversation-min: 420px; --workspace-min: 370px; display: grid; grid-template-columns: minmax(var(--conversation-min), var(--conversation-width, 1.20482fr)) 0 minmax(var(--workspace-min), 1fr); height: calc(100dvh - var(--header-height) - var(--header-inset)); max-width: var(--content-width); margin: auto; }
.column-resizer { position: relative; left: calc(-1 * var(--content-gutter)); z-index: 2; display: flex; align-items: center; justify-content: center; width: var(--content-gutter); margin: 12px 0 8px; cursor: col-resize; touch-action: none; user-select: none; -webkit-tap-highlight-color: transparent; outline: none; }
.column-resizer::after { content: ''; width: 3px; height: 44px; flex: none; border-radius: 999px; background: var(--line-strong); transition: background-color 120ms; }
.column-resizer:hover::after { background: var(--text); }
.column-resizer:focus-visible::after { background: var(--accent); outline: 2px solid var(--accent); outline-offset: 4px; }
.is-resizing-columns, .is-resizing-columns * { cursor: col-resize !important; user-select: none !important; }
.is-resizing-columns .column-resizer::after { background: var(--accent); }
@media (prefers-reduced-motion: reduce) { .column-resizer::after { transition: none; } }
@media (forced-colors: active) { .column-resizer::after { background: ButtonText; } }
.conversation { display: flex; flex-direction: column; min-height: 0; min-width: 0; padding: 12px var(--content-gutter) 8px; }
.model-panel { margin-left: auto; background: var(--surface); }
.model-heading { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.model-heading > div { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.model-heading strong { font-size: 12px; font-weight: 600; }
.header-model-source { display: inline-flex; align-items: center; gap: 6px; flex: none; color: inherit; text-decoration: none; white-space: nowrap; border-radius: 3px; }
.header-model-source img { display: block; width: 16px; height: 16px; flex: none; border-radius: 50%; }
.header-model-source:hover { color: var(--accent); }
.header-model-source:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.badge { padding: 3px 7px; border-radius: var(--radius-small); background: var(--control); color: var(--muted); font-size: 10px; }
#load { min-width: 90px; height: var(--header-control-height); flex-shrink: 0; }
#load.is-loaded { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 0; min-height: 28px; height: 28px; padding: 4px 8px; border-radius: 6px; opacity: 1; color: var(--accent); background: #25312f; }
#load.is-loaded::before { content: ''; width: 5px; height: 5px; flex: none; border-radius: 50%; background: currentColor; }
progress { width: 100%; height: 5px; margin-top: 8px; accent-color: var(--accent); }
header #progress { position: absolute; bottom: 3px; left: var(--radius); width: calc(100% - 2 * var(--radius)); margin: 0; height: 2px; border: 0; border-radius: 999px; overflow: hidden; appearance: none; background: var(--line); }
header #progress { --progress-fade: clamp(24px, 5vw, 72px); --progress-mask: linear-gradient(90deg, transparent 2px, #000 var(--progress-fade), #000 calc(100% - var(--progress-fade)), transparent calc(100% - 2px)); mask-image: var(--progress-mask); -webkit-mask-image: var(--progress-mask); }
header #progress::-webkit-progress-bar { border-radius: 999px; background: var(--line); }
header #progress::-webkit-progress-value { border-radius: 999px; background: var(--accent); }
header #progress::-moz-progress-bar { border-radius: 999px; background: var(--accent); }
header #progress:indeterminate { background: linear-gradient(90deg, transparent, var(--accent), transparent) 0 0 / 35% 100% no-repeat var(--line); animation: header-progress 1.4s ease-in-out infinite alternate; }
header #progress:indeterminate::-webkit-progress-bar { background: transparent; }
header #progress:indeterminate::-webkit-progress-value { background: transparent; }
header #progress:indeterminate::-moz-progress-bar { background: transparent; }
@keyframes header-progress { from { background-position: 0 0; } to { background-position: 100% 0; } }
@media (prefers-reduced-motion: reduce) { header #progress:indeterminate { animation: none; background-position: 50% 0; } }
.muted { margin-top: 4px; color: var(--muted); font-size: 11px; }
.muted:empty { display: none; }
.terminal-panel { display: flex; flex-direction: column; flex: 1; min-height: 0; padding: 8px; border: 1px solid transparent; background: var(--background); border-radius: var(--radius-large); }
@media (min-width: 851px) { .terminal-panel { padding-right: 0; } }
#pi-terminal { position: relative; isolation: isolate; flex: 1; min-height: 120px; min-width: 0; overflow: hidden; background: var(--background); }
#pi-terminal .pi-terminal-mount, #pi-terminal .xterm { height: 100%; }
#pi-terminal .xterm-viewport { background-color: var(--background) !important; }
#pi-terminal textarea:focus { box-shadow: none; }
.terminal-paws { position: absolute; overflow: hidden; pointer-events: none; user-select: none; }
.terminal-paws i { position: absolute; width: 24px; height: 24px; background: var(--muted); mask: url('../public/paw-print.svg') center / contain no-repeat; opacity: 0; transform: rotate(28deg); }
.terminal-paws:not([hidden]) i { animation: terminal-paw 3.2s ease-in-out both; animation-delay: var(--delay); }
.terminal-paws i:nth-child(1) { left: calc(18% + var(--trail-shift)); top: 85%; --delay: 0s; }
.terminal-paws i:nth-child(2) { left: calc(26% + var(--trail-shift)); top: 78%; --delay: .65s; }
.terminal-paws i:nth-child(3) { left: calc(27% + var(--trail-shift)); top: 68%; --delay: 1.3s; }
.terminal-paws i:nth-child(4) { left: calc(35% + var(--trail-shift)); top: 61%; --delay: 1.95s; }
.terminal-paws i:nth-child(5) { left: calc(36% + var(--trail-shift)); top: 51%; --delay: 2.6s; }
.terminal-paws i:nth-child(6) { left: calc(44% + var(--trail-shift)); top: 44%; --delay: 3.25s; }
@keyframes terminal-paw { 0%, 100% { opacity: 0; } 15%, 40% { opacity: .14; } }
@media (max-width: 600px) { .terminal-paws i { width: 18px; height: 18px; } }
@media (prefers-reduced-motion: reduce) { .terminal-paws { display: none; } }
.empty-mascot { position: absolute; right: 12px; display: flex; flex-direction: column; align-items: flex-end; gap: 10px; width: 196px; max-width: calc(100% - 24px); pointer-events: none; }
/* Keep blending on a composited layer between hops, including in WebKit. */
.mascot-cat { position: relative; display: block; flex: none; min-height: 0; padding: 0; border: 0; border-radius: 0; background: transparent; line-height: 0; pointer-events: auto; cursor: pointer; mix-blend-mode: lighten; transform: translate3d(0, 0, 0); }
.mascot-cat:hover { background: transparent; }
.mascot-cat, .setup-cat { outline: none; -webkit-tap-highlight-color: transparent; -webkit-touch-callout: none; }
.mascot-cat, .mascot-cat *, .setup-cat, .setup-cat * { -webkit-user-select: none; user-select: none; -webkit-user-drag: none; }
.mascot-cat > *, .setup-cat > * { pointer-events: none; }
.empty-mascot img { display: block; width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; user-select: none; }
.mascot-eyelids { position: absolute; inset: 0; opacity: 0; }
/* Pixel eyelids align with the eyes in empty-cat-v1.png; the image stays intact. */
.mascot-eyelids::before, .mascot-eyelids::after { content: ''; position: absolute; top: 39.3%; width: 7%; height: 7.4%; background: linear-gradient(to bottom, #f6f0e1 70%, var(--background) 70%, var(--background) 86%, #f6f0e1 86%); }
.mascot-eyelids::before { left: 28.5%; }
.mascot-eyelids::after { left: 54%; }
.mascot-suggestion { position: relative; pointer-events: auto; padding: 10px 12px; border: 0; border-radius: 8px; background: #f5efdf; color: #24242c; font: 12px/1.45 ui-monospace, SFMono-Regular, Consolas, monospace; text-align: left; white-space: normal; box-shadow: 0 3px 0 #0c0c10; }
.mascot-suggestion::after { content: ''; position: absolute; right: 52px; bottom: -8px; width: 12px; height: 8px; background: inherit; clip-path: polygon(0 0, 100% 0, 100% 50%, 50% 50%, 50% 100%, 0 100%); }
.mascot-suggestion:hover { background: #fffaf0; }
.terminal-controls { display: flex; justify-content: flex-end; align-items: center; gap: 8px; padding-top: 4px; }
.terminal-controls, .terminal-panel > footer { cursor: text; }
#new-chat { margin-right: auto; }
#newline:not(:hover) { background: transparent; }
#notice { margin: 6px 0; padding: 8px 10px; border-radius: var(--radius-small); background: var(--control); font-size: 12px; }
footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-top: 8px; color: var(--muted); font-size: 10px; }
.workspace { display: flex; flex-direction: column; min-width: 0; min-height: 0; margin: 12px var(--content-gutter) 8px 0; border-radius: 20px; overflow: hidden; background: var(--panel); }
.workspace-heading { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding: 5px 10px; }
.workspace-heading h2 { margin: 0; font-size: 12px; font-weight: 600; }
.workspace-heading > div { display: flex; gap: 0; }
.button { display: inline-block; }
.file-area { display: grid; grid-template-columns: 140px minmax(0, 1fr); flex: 1; min-height: 180px; }
#files { overflow: auto; padding: 5px 4px; }
#files button { display: flex; align-items: center; gap: 6px; width: 100%; padding: 5px 7px; border: none; border-radius: var(--radius-small); background: transparent; text-align: left; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, monospace; font-size: 11px; line-height: 1.45; }
.file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.file-icon { display: inline-block; flex: 0 0 16px; width: 16px; height: 16px; background-color: var(--file-color); mask: var(--file-icon) center / 90% 90% no-repeat; -webkit-mask: var(--file-icon) center / 90% 90% no-repeat; }
.editor-file { display: flex; align-items: center; gap: 6px; min-width: 0; }
#filetype { display: flex; flex: none; }
#filetype:empty { display: none; }
@media (forced-colors: active) { .file-icon { background-color: CanvasText; } }
#files button:hover { background: var(--hover); }
#files button.selected { background: var(--selected); color: var(--text); }
.editor-area { display: flex; flex-direction: column; min-width: 0; min-height: 0; margin: 0 8px 8px 0; border-radius: var(--radius); overflow: hidden; background: var(--surface); }
.editor-heading { display: flex; align-items: center; justify-content: space-between; height: 32px; padding: 0 6px 0 10px; gap: 6px; background: #282832; transition: background-color 140ms, box-shadow 140ms; }
.editor-area:focus-within .editor-heading { background: #30323a; box-shadow: inset 0 -1px 0 #8abeb74d; }
@media (prefers-reduced-motion: reduce) { .editor-heading { transition: none; } }
@media (forced-colors: active) { .editor-area:focus-within .editor-heading { outline: 1px solid Highlight; outline-offset: -1px; } }
#filename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: ui-monospace, monospace; font-size: 11px; }
.editor-heading { flex-shrink: 0; }
.editor-input { flex: 1; position: relative; min-height: 140px; min-width: 0; overflow: hidden; }
#editor, #editor-highlight { position: absolute; top: 0; left: 0; width: 100%; height: 100%; margin: 0; padding: 10px 12px; border: 0; border-radius: 0; color: var(--text); font: 12px/1.6 ui-monospace, SFMono-Regular, Consolas, monospace; font-variant-ligatures: none; letter-spacing: normal; tab-size: 2; white-space: pre; overflow-wrap: normal; }
#editor { resize: none; background: transparent; overflow: auto; caret-color: var(--text); }
#editor-highlight { visibility: hidden; overflow: hidden; pointer-events: none; }
.is-highlighted #editor-highlight { visibility: visible; }
.is-highlighted #editor, .is-highlighted #editor::selection { color: transparent; }
#editor::selection { background: #8abeb740; }
#editor:focus { box-shadow: none; }
#editor-highlight .token { font-style: normal; font-weight: normal; }
#editor-highlight .token.comment, #editor-highlight .token.prolog, #editor-highlight .token.doctype { color: #9292a3; }
#editor-highlight .token.punctuation { color: #b0b0bd; }
#editor-highlight .token.tag, #editor-highlight .token.deleted { color: #e29a9a; }
#editor-highlight .token.keyword, #editor-highlight .token.selector, #editor-highlight .token.important { color: #c4a7d5; }
#editor-highlight .token.string, #editor-highlight .token.attr-value, #editor-highlight .token.inserted { color: #b5bd68; }
#editor-highlight .token.function, #editor-highlight .token.builtin, #editor-highlight .token.class-name { color: #8abeb7; }
#editor-highlight .token.attr-name, #editor-highlight .token.property, #editor-highlight .token.variable { color: #9db9d4; }
#editor-highlight .token.number, #editor-highlight .token.boolean, #editor-highlight .token.constant, #editor-highlight .token.operator, #editor-highlight .token.entity, #editor-highlight .token.url { color: #f0c674; }
@media (forced-colors: active) { .is-highlighted #editor-highlight { visibility: hidden; } .is-highlighted #editor, .is-highlighted #editor::selection { color: CanvasText; } }
.workspace > .terminal { flex-shrink: 0; margin: 0 8px; padding: 0 8px 8px; border-radius: var(--radius); background: var(--background); }
.terminal summary { padding: 6px 0; cursor: pointer; font-size: 11px; font-weight: 500; }
.terminal summary span { float: right; color: var(--muted); font-size: 10px; font-weight: 400; }
.shell-toolbar { display: flex; align-items: center; justify-content: space-between; color: var(--accent); font: 11px/1.5 ui-monospace, monospace; }
.shell-toolbar button { color: var(--muted); }
#terminal-output { height: 132px; min-height: 84px; max-height: min(480px, 45dvh); margin: 0 0 6px; padding: 2px 0; resize: vertical; overflow: auto; scrollbar-width: thin; font: 12px/1.5 ui-monospace, SFMono-Regular, Consolas, monospace; overflow-wrap: anywhere; }
#terminal-output:focus-visible { outline: 1px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-small); }
.shell-empty { display: flex; flex-direction: column; gap: 4px; padding: 8px 2px; color: var(--muted); }
.shell-empty strong { font-weight: 500; color: var(--text); }
.shell-empty code { color: var(--accent); }
.shell-entry { padding: 8px; margin-bottom: 6px; border-radius: var(--radius-small); background: var(--surface); }
.shell-entry:last-child { margin-bottom: 0; }
.shell-entry-heading { display: flex; gap: 8px; align-items: baseline; }
.shell-entry pre { margin: 0; font: inherit; white-space: pre-wrap; overflow-wrap: anywhere; }
.shell-code { flex: 1; min-width: 0; }
.shell-status { flex-shrink: 0; font-size: 10px; color: var(--muted); }
.shell-status.success { color: #b5bd68; }
.shell-status.error, .shell-stderr { color: #e29a9a; }
.shell-entry .shell-stdout, .shell-entry .shell-stderr { margin: 6px 0 0 16px; }
#shell-form { display: flex; align-items: flex-start; gap: 8px; padding: 4px; border-radius: var(--radius-small); background: var(--control); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
#shell-form:focus-within { box-shadow: 0 0 0 1px var(--accent); }
.shell-prompt { flex-shrink: 0; color: var(--accent); }
#shell-form > .shell-prompt { padding-top: 6px; line-height: 20px; }
.shell-input { flex: 1; position: relative; min-width: 0; }
#command, #command-highlight { width: 100%; margin: 0; padding: 6px 0; border: 0; border-radius: 0; font: 12px/20px ui-monospace, SFMono-Regular, Consolas, monospace; font-variant-ligatures: none; letter-spacing: normal; tab-size: 2; white-space: pre-wrap; overflow-wrap: anywhere; }
#command-highlight { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
#command { position: relative; display: block; min-height: 32px; max-height: 104px; resize: none; background: transparent; color: transparent; caret-color: var(--text); scrollbar-width: thin; }
#command:focus { box-shadow: none; }
#command::selection { color: transparent; background: #8abeb740; }
#command::placeholder { color: var(--muted); }
#shell-run { min-height: 32px; border-radius: 4px; }
#shell-hint { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 2px 12px; padding-top: 5px; color: var(--muted); font-size: 10px; line-height: 1.5; }
.shell-code .token, #command-highlight .token { font-style: normal; font-weight: normal; }
.shell-code .token.comment, #command-highlight .token.comment { color: #aaaab7; }
.shell-code .token.string, #command-highlight .token.string { color: #b5bd68; }
.shell-code .token.function, .shell-code .token.builtin, #command-highlight .token.function, #command-highlight .token.builtin { color: #8abeb7; }
.shell-code .token.variable, .shell-code .token.assign-left, #command-highlight .token.variable, #command-highlight .token.assign-left { color: #c4a7d5; }
.shell-code .token.keyword, .shell-code .token.operator, .shell-code .token.number, #command-highlight .token.keyword, #command-highlight .token.operator, #command-highlight .token.number { color: #f0c674; }
.shell-code .token.parameter, #command-highlight .token.parameter { color: #9db9d4; }
@media (forced-colors: active) { #command-highlight { display: none; } #command, #command::selection { color: CanvasText; } }
.workspace-note { margin: 6px 10px; color: var(--muted); font-size: 10px; line-height: 1.45; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
#open-tab { margin-top: 8px; font-size: 12px; color: var(--accent); text-decoration: none; white-space: normal; }
#model-dialog { --dialog-inset: 24px; --cat-size: 152px; --cat-rise: calc(var(--cat-size) * .58); width: min(460px, calc(100% - 32px)); max-height: calc(100dvh - 32px - var(--cat-rise)); overflow: visible; padding: var(--dialog-inset); border: 0; border-radius: calc(var(--radius-small) + var(--dialog-inset)); background: var(--surface); color: var(--text); box-shadow: 0 24px 80px #0008; transform: translateY(calc(var(--cat-rise) / 2)); }
#model-dialog[open] { display: flex; flex-direction: column; }
.setup-paws { --modal-half: min(230px, calc(50vw - 16px)); position: absolute; left: 50%; top: calc(50% - var(--cat-rise) / 2); width: 100vw; height: 100dvh; transform: translate(-50%, -50%); overflow: hidden; pointer-events: none; user-select: none; z-index: -1; }
.setup-paws i { position: absolute; width: 28px; height: 28px; background: var(--muted); mask: url('../public/paw-print.svg') center / contain no-repeat; opacity: 0; transform: rotate(var(--angle)); }
#model-dialog[open] .setup-paws i { animation: setup-paw 10s ease-in-out infinite; animation-delay: var(--delay); animation-play-state: var(--cat-play-state, running); }
.setup-paws i:nth-child(1) { left: calc(50% - var(--modal-half) - clamp(48px, 9vw, 136px)); top: 68%; --angle: -34deg; --delay: -1s; }
.setup-paws i:nth-child(2) { left: calc(50% - var(--modal-half) - clamp(30px, 6vw, 88px)); top: 60%; --angle: -24deg; --delay: -.3s; }
.setup-paws i:nth-child(3) { left: calc(50% - var(--modal-half) - clamp(45px, 8vw, 120px)); top: 52%; --angle: -12deg; --delay: .4s; }
.setup-paws i:nth-child(4) { left: calc(50% + var(--modal-half) + clamp(25px, 4vw, 64px)); top: 46%; --angle: 28deg; --delay: 4s; }
.setup-paws i:nth-child(5) { left: calc(50% + var(--modal-half) + clamp(50px, 8vw, 120px)); top: 38%; --angle: 35deg; --delay: 4.7s; }
.setup-paws i:nth-child(6) { left: calc(50% + var(--modal-half) + clamp(35px, 7vw, 100px)); top: 30%; --angle: 25deg; --delay: 5.4s; }
@keyframes setup-paw { 0%, 5%, 38%, 100% { opacity: 0; } 14%, 24% { opacity: .16; } }
@media (max-width: 600px) {
.setup-paws i { width: 18px; height: 18px; }
.setup-paws i:nth-child(1) { left: 8%; top: 22px; --angle: 65deg; }
.setup-paws i:nth-child(2) { left: 19%; top: 14px; --angle: 75deg; }
.setup-paws i:nth-child(3) { left: 30%; top: 22px; --angle: 65deg; }
.setup-paws i:nth-child(n+4) { display: none; }
}
@media (prefers-reduced-motion: reduce) {
#model-dialog[open] .setup-paws i { animation: none; }
.setup-paws i:nth-child(1), .setup-paws i:nth-child(2) { opacity: .1; }
}
.setup-cat { position: absolute; top: calc(-1 * var(--cat-rise)); right: var(--dialog-inset); width: var(--cat-size); height: calc(var(--cat-size) * .66); overflow: hidden; pointer-events: auto; cursor: pointer; touch-action: manipulation; user-select: none; }
.setup-cat img, .setup-cat-tail, .setup-cat-eyelids { display: block; position: absolute; top: calc(var(--cat-size) * -.23); left: 0; width: 100%; height: auto; image-rendering: pixelated; opacity: 0; }
/* Split the existing sprite at the tail, keeping its root behind the right paw. */
.setup-cat img { clip-path: inset(0 22% 0 0); }
.setup-cat-tail { aspect-ratio: 1; background: var(--cat-sprite) 0 0 / 100% 100% no-repeat; clip-path: polygon(78% 40%, 100% 40%, 100% 82%, 77% 82%, 77% 77%, 78% 77%); transform-origin: 78% 80%; }
.setup-cat.is-ready img, .setup-cat.is-ready .setup-cat-tail { opacity: 1; }
.setup-cat-eyelids { aspect-ratio: 1; }
/* Leave a small margin around the eyes for pixelated image scaling. */
.setup-cat-eyelids::before, .setup-cat-eyelids::after { content: ''; position: absolute; top: 55.6%; width: 8.4%; height: 8.7%; background: linear-gradient(#080709, #080709) center 80% / 78% 14% no-repeat, #f6efdf; }
.setup-cat-eyelids::before { left: 28%; }
.setup-cat-eyelids::after { left: 54.3%; }
#model-dialog[open] .setup-cat.is-ready .setup-cat-tail { animation: setup-tail-swish 9s ease-in-out infinite; animation-play-state: var(--cat-play-state, running); }
#model-dialog[open] .setup-cat.is-ready .setup-cat-eyelids { animation: setup-cat-blink 7.4s step-end infinite; animation-play-state: var(--cat-play-state, running); }
@keyframes setup-cat-blink {
0%, 45%, 100% { opacity: 0; }
43% { opacity: 1; }
}
@keyframes setup-tail-swish {
0%, 24%, 50%, 100% { transform: rotate(0deg); }
33% { transform: rotate(-4deg); }
41% { transform: rotate(2.5deg); }
46% { transform: rotate(-.6deg); }
}
@media (prefers-reduced-motion: reduce) { #model-dialog[open] .setup-cat.is-ready .setup-cat-tail, #model-dialog[open] .setup-cat.is-ready .setup-cat-eyelids { animation: none; } }
.setup-heading { display: flex; flex-shrink: 0; align-items: flex-start; gap: 8px; }
#model-cancel { display: grid; place-items: center; flex: none; width: 32px; height: 32px; min-height: 32px; padding: 0; background: transparent; color: var(--muted); }
#model-cancel:hover:not(:disabled) { background: var(--control); color: var(--text); }
.setup-body { min-height: 0; overflow: auto; }
#model-dialog::backdrop { background: #08080dbd; backdrop-filter: blur(4px); }
#model-title { flex: 1; min-width: 0; margin: 0 0 8px; font-size: 27px; line-height: 1.2; letter-spacing: -.5px; font-weight: 650; }
#model-description { margin: 0; line-height: 1.6; color: var(--muted); }
.setup-runtime { display: grid; grid-template-columns: minmax(max-content, 1fr) 1fr 1.2fr; gap: 8px; margin: 18px 0; }
.setup-runtime > div { padding: 10px; border-radius: var(--radius-small); background: var(--control); }
.setup-runtime dt { color: var(--accent); font-size: 12px; font-weight: 600; }
.setup-runtime dd { margin: 5px 0 0; font-size: 11px; line-height: 1.5; }
.setup-model { display: flex; align-items: center; gap: 6px; }
.model-org { display: inline-flex; flex: none; border-radius: 50%; }
.model-org img { display: block; width: 18px; height: 18px; border-radius: inherit; }
.model-source { color: inherit; text-decoration-color: var(--muted); text-underline-offset: 3px; white-space: nowrap; }
.model-source:hover { color: var(--accent); }
.setup-model a:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 3px; }
.setup-facts { display: flex; flex-direction: column; gap: 5px; margin: 18px 0; padding: 12px; border-radius: var(--radius-small); background: var(--panel); line-height: 1.45; }
.setup-facts strong { font-size: 12px; font-weight: 600; }
.setup-facts span, .setup-label { font-size: 11px; color: var(--muted); line-height: 1.5; }
.setup-label { margin: 16px 0 6px; }
#model-preview { max-height: 84px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; padding: 10px 12px; border-radius: var(--radius-small); background: var(--control); font-size: 12px; line-height: 1.5; }
#model-error { padding: 10px 12px; background: #3c2828; border-radius: var(--radius-small); line-height: 1.5; overflow-wrap: anywhere; }
#model-open-tab { color: var(--accent); white-space: normal; text-decoration: none; }
.setup-credits { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin: 18px 0; color: var(--muted); font-size: 11px; line-height: 1.6; }
.setup-credits a { display: inline-flex; align-items: center; gap: 4px; color: inherit; white-space: nowrap; text-decoration: none; }
.setup-credits a:hover { color: var(--text); text-decoration: underline; text-underline-offset: 3px; }
.setup-credits a:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 3px; }
.setup-credits img, .setup-credits svg { flex: none; width: 14px; height: 14px; object-fit: contain; }
.setup-credits .credit-pi { padding: 2px; }
.setup-actions { display: flex; flex-shrink: 0; padding-top: 4px; }
.setup-actions button { width: 100%; min-height: 44px; padding: 10px 16px; }
#model-confirm { background: #fff; color: #18181e; font-size: 14px; font-weight: 600; }
#model-confirm:hover { background: #e8e8ed; }
@media (max-width: 420px) {
#model-dialog { --dialog-inset: 16px; --cat-size: 116px; }
#model-title { font-size: 24px; }
.setup-runtime { grid-template-columns: 1fr; gap: 5px; margin: 14px 0; }
.setup-runtime > div { display: flex; align-items: baseline; gap: 12px; padding: 8px 10px; }
.setup-runtime dt { flex: 0 0 64px; }
.setup-runtime dd { margin: 0; }
.setup-facts { margin: 14px 0; }
.setup-credits { margin: 12px 0; }
}
@media (min-width: 851px) and (max-width: 1000px) {
header { grid-template-columns: auto minmax(0, 1fr) auto; }
}
@media (max-height: 620px) {
#model-dialog { --cat-size: 72px; }
.setup-runtime, .setup-facts { margin: 12px 0; }
}
@media (max-width: 420px) and (max-height: 620px) {
.setup-runtime { grid-template-columns: minmax(0, 1fr) max-content; }
.setup-runtime > div:first-child { grid-column: 1 / -1; }
.setup-runtime > div:not(:first-child) { display: block; padding: 6px 10px; }
.setup-runtime > div:not(:first-child) dd { margin-top: 2px; }
}
@media (max-width: 850px) {
:root { --header-height: calc(2 * var(--header-control-height) + 3 * var(--surface-inset)); --header-inset: 10px; --content-gutter: 10px; }
header { grid-template-columns: auto minmax(0, 1fr); grid-template-rows: repeat(2, var(--header-control-height)); grid-template-areas: 'brand runtime' 'model model'; gap: var(--surface-inset); }
.brand { grid-area: brand; justify-self: start; }
.runtime-meter { grid-area: runtime; justify-self: end; }
.model-panel { grid-area: model; margin: 0; }
main { display: flex; flex-direction: column; height: auto; }
.column-resizer { display: none; }
.conversation { height: calc(100dvh - var(--header-height) - var(--header-inset)); min-height: 320px; padding: 10px var(--content-gutter); }
.workspace { min-height: 520px; margin: 0 var(--content-gutter) 10px; }
.file-area { min-height: 280px; grid-template-columns: 115px minmax(0, 1fr); }
h1 { font-size: 20px; }
.badge { font-size: 9px; }
footer { font-size: 9px; }
}
@media (pointer: coarse) {
:root { --header-control-height: 38px; }
button, .button, #files button { min-height: 38px; }
.editor-heading { min-height: 40px; }
.terminal summary { padding-top: 11px; padding-bottom: 11px; }
#command, #command-highlight { font-size: 16px; }
#pi-terminal .xterm-helper-textarea { font-size: 16px; }
}
|