: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; } .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; } .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-cat-v1.png is RGB with an opaque black matte. Clip its 1254px pixel-art silhouette, including the gap beside the tail, instead of relying on blend modes or animation-layer promotion to hide the matte in Safari. Keep the full image box so paw positioning and the blink overlay still align. */ .empty-mascot img { display: block; width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; user-select: none; clip-path: polygon(16.906% 6.220%, 26.077% 6.220%, 26.077% 9.729%, 30.861% 9.729%, 30.861% 14.274%, 35.407% 14.274%, 35.407% 20.175%, 56.539% 20.175%, 56.539% 14.274%, 61.404% 14.274%, 61.404% 9.729%, 65.710% 9.729%, 65.710% 6.220%, 75.040% 6.220%, 75.040% 44.498%, 68.820% 44.498%, 68.820% 48.166%, 75.040% 48.166%, 75.040% 52.073%, 68.820% 52.073%, 68.820% 57.576%, 65.152% 57.576%, 65.152% 61.324%, 68.979% 61.324%, 68.979% 67.225%, 73.285% 67.225%, 73.285% 77.033%, 77.671% 77.033%, 77.671% 55.742%, 81.818% 55.742%, 81.818% 51.595%, 91.228% 51.595%, 91.228% 63.397%, 86.124% 63.397%, 86.124% 85.566%, 81.579% 85.566%, 81.579% 92.265%, 25.040% 92.265%, 25.040% 85.566%, 28.070% 85.566%, 28.070% 57.576%, 19.856% 57.576%, 19.856% 52.073%, 12.520% 52.073%, 12.520% 48.166%, 19.856% 48.166%, 19.856% 44.498%, 12.520% 44.498%, 12.520% 41.467%, 16.906% 41.467%); } .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; } .workspace-heading { flex-wrap: wrap; } .folder-controls { display: flex; flex-wrap: wrap; gap: 4px; padding: 0 10px 7px; } .folder-controls:has(> button:not([hidden])) { min-height: 30px; } .folder-controls:not(:has(> button:not([hidden]))) { display: none; } #open-folder { color: var(--accent, #8abeb7); background: #8abeb710; } #open-folder:not([hidden]) { display: inline-flex; align-items: center; gap: 6px; } #open-folder svg { flex: none; } #local-folder-bar { margin: 0 8px 8px; padding: 10px; border-radius: 10px; background: #8abeb710; font-size: 11px; } #local-folder-name { display: block; color: var(--accent, #8abeb7); overflow-wrap: anywhere; } #local-folder-hint { display: block; margin: 4px 0 8px; color: var(--muted); line-height: 1.5; } .folder-actions { display: flex; gap: 5px; flex-wrap: wrap; } .folder-actions button { font-size: 11px; padding: 6px 9px; } #local-review { box-sizing: border-box; width: min(820px, calc(100vw - 24px)); max-height: calc(100dvh - 32px); padding: 20px; border: 1px solid #8abeb740; border-radius: 18px; background: var(--bg, #18181e); color: var(--text); } #local-review::backdrop { background: #0009; backdrop-filter: blur(4px); } .review-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .review-heading h2 { margin: 0; font-size: 20px; } #review-close { font-size: 24px; padding: 2px 10px; } #review-description { color: var(--muted); font-size: 13px; line-height: 1.5; } #review-files { max-height: 55dvh; overflow: auto; } #review-files details { border: 1px solid #ffffff18; border-radius: 8px; margin: 8px 0; overflow: hidden; } #review-files summary { padding: 10px; cursor: pointer; font: 12px ui-monospace, monospace; overflow-wrap: anywhere; } #review-files pre { overflow: auto; margin: 0; padding: 10px; background: #0003; font: 12px/1.55 ui-monospace, monospace; tab-size: 2; } .diff-add { color: #98dfb4; } .diff-remove { color: #f2a6a6; } #review-error { color: #f2a6a6; font-size: 13px; line-height: 1.5; } .review-actions { display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap; margin-top: 16px; } .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; } }