Mike0021's picture
Rename local folder action to Link a folder with a link icon
0d68e9e verified
Raw
History Blame Contribute Delete
35.4 kB
: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; }
}