app.css
Language CSS22.0 KB1243 lines
/* ---- surfaces ------------------------------------------------------------ */.glass {background: var(--glass);border: 1px solid var(--glass-border);box-shadow: var(--shadow);}.glass-strong {background: var(--glass-strong);border: 1px solid var(--glass-border);box-shadow: var(--shadow-pop);-webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));backdrop-filter: blur(var(--blur)) saturate(var(--saturate));}.glass-tint {background: var(--glass-tint);border: 1px solid var(--glass-border);}/* Where there is no native frost, the page frosts its own panels. */:root[data-vibrancy='none'] .glass {-webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));backdrop-filter: blur(var(--blur)) saturate(var(--saturate));}/* ---- controls ------------------------------------------------------------ */button {border: 0;background: none;border-radius: var(--radius-sm);padding: 6px 12px;line-height: 20px;transition:background 120ms var(--ease),opacity 120ms;}button:disabled {opacity: 0.45;}button.primary {background: var(--accent);color: var(--accent-text);font-weight: 600;}button.primary:hover:not(:disabled) {filter: brightness(1.06);}button.ghost:hover:not(:disabled),button.pill:hover {background: var(--accent-soft);}button.small {padding: 2px 8px;font-size: 12px;}button.icon {padding: 6px;display: inline-grid;place-items: center;}button.link {padding: 0;color: var(--accent);text-decoration: underline;text-underline-offset: 2px;}button.danger,.danger {color: var(--danger);}button.pill {border: 1px solid var(--hairline);border-radius: 999px;padding: 3px 11px;font-size: 12px;color: var(--text-2);}button.pill.on {background: var(--accent);border-color: var(--accent);color: var(--accent-text);}input,textarea,select {background: var(--glass-tint);border: 1px solid var(--hairline);border-radius: var(--radius-sm);padding: 7px 10px;min-width: 0;user-select: text;-webkit-user-select: text;}input:focus,textarea:focus,select:focus {outline: none;border-color: var(--accent);box-shadow: var(--focus);}kbd {font-family: var(--font);font-size: 11px;color: var(--text-3);border: 1px solid var(--hairline);border-radius: 5px;padding: 0 5px;}.row {display: flex;gap: 8px;align-items: center;}.row.end {justify-content: flex-end;}.row.wrap {flex-wrap: wrap;}.grow {flex: 1;}.spacer {flex: 1;}.muted {color: var(--text-2);}.small {font-size: 12px;}.mono {font-family: var(--mono);font-size: 12px;}.pad {padding: 8px 12px;}/* ---- layout -------------------------------------------------------------- */.app {display: grid;grid-template-columns: var(--sidebar) 1fr;height: 100%;gap: 10px;padding: 10px;}.app.loading {display: block;}.fatal {padding: 40px;color: var(--danger);}/* ---- sidebar ------------------------------------------------------------- */.sidebar {display: flex;flex-direction: column;min-height: 0;border-radius: var(--radius-lg);overflow: hidden;}.sidebar-top {padding: 14px 12px 8px;display: grid;gap: 8px;}.sidebar-top.traffic {padding-top: 40px; /* room for the macOS window buttons */}.new-chat {width: 100%;padding: 8px;}.search-trigger {display: flex;align-items: center;gap: 8px;width: 100%;color: var(--text-2);border: 1px solid var(--hairline);background: var(--glass-tint);text-align: left;}.search-trigger span {flex: 1;}.conv-list {flex: 1;overflow-y: auto;padding: 4px 8px 12px;}.conv-list h2 {font-size: 11px;font-weight: 600;text-transform: uppercase;letter-spacing: 0.06em;color: var(--text-3);margin: 14px 8px 4px;}.conv-list ul {list-style: none;margin: 0;padding: 0;}.conv {width: 100%;display: flex;gap: 8px;align-items: baseline;text-align: left;padding: 7px 8px;}.conv:hover {background: var(--accent-soft);}.conv.active {background: var(--glass-strong);box-shadow: inset 0 0 0 1px var(--glass-border);}.conv-title {flex: 1;min-width: 0;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.conv-cost {font-size: 11px;color: var(--text-3);font-variant-numeric: tabular-nums;}.sidebar-foot {border-top: 1px solid var(--hairline);padding: 10px 12px 12px;display: grid;gap: 6px;}.sidebar-foot .row {justify-content: space-between;}.spend {display: grid;gap: 5px;text-align: left;width: 100%;padding: 8px;}.spend:hover {background: var(--accent-soft);}.spend-row {display: flex;justify-content: space-between;font-size: 12px;color: var(--text-2);}.spend-row strong {color: var(--text-1);font-variant-numeric: tabular-nums;}.spend-sub {font-size: 11px;color: var(--text-3);}.bar {height: 5px;border-radius: 5px;background: var(--hairline);overflow: hidden;}.bar span {display: block;height: 100%;background: linear-gradient(90deg, var(--teal), var(--accent));border-radius: 5px;}.spend.level-1 .bar span {background: var(--warn);}.spend.level-2 .bar span {background: var(--danger);}/* ---- main column --------------------------------------------------------- */.main {display: flex;flex-direction: column;min-width: 0;min-height: 0;position: relative;}.chat-header {display: flex;align-items: center;gap: 12px;padding: 8px 6px 8px 14px;min-height: 48px;}.title-wrap {flex: 1;min-width: 0;display: flex;align-items: baseline;gap: 10px;}.chat-title {font-size: 15px;font-weight: 600;margin: 0;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.title-input {font-size: 15px;font-weight: 600;width: min(420px, 100%);}.chat-total {font-size: 12px;color: var(--text-3);font-variant-numeric: tabular-nums;white-space: nowrap;}.header-actions {display: flex;gap: 4px;align-items: center;}.anchor {position: relative;}.model-button {display: flex;align-items: baseline;gap: 8px;border-radius: 999px;padding: 5px 12px;max-width: 340px;}.model-button-name {font-weight: 600;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.model-button-price {font-size: 11px;color: var(--text-3);white-space: nowrap;}/* ---- popovers and menus -------------------------------------------------- */.popover {position: absolute;top: calc(100% + 6px);right: 0;z-index: 30;border-radius: var(--radius);padding: 6px;animation: pop 140ms var(--ease);}@keyframes pop {from {opacity: 0;transform: translateY(-4px) scale(0.98);}}.menu {min-width: 190px;display: grid;}.menu button {text-align: left;padding: 6px 10px;}.menu button:hover {background: var(--accent-soft);}.menu button.checked::before {content: '\2713';margin-right: 6px;}.menu hr {border: 0;border-top: 1px solid var(--hairline);margin: 4px 0;}.model-picker {width: min(560px, calc(100vw - 40px));display: grid;gap: 8px;padding: 10px;}.search-input {width: 100%;font-size: 14px;}.search-input.big {font-size: 17px;padding: 12px 14px;border: 0;border-bottom: 1px solid var(--hairline);border-radius: 0;background: transparent;box-shadow: none;}.filters {display: flex;gap: 6px;flex-wrap: wrap;}.model-head,.model-row {display: grid;grid-template-columns: 1fr 128px 56px;gap: 10px;align-items: center;}.model-head {font-size: 11px;color: var(--text-3);padding: 0 8px;text-transform: uppercase;letter-spacing: 0.05em;}.model-list {list-style: none;margin: 0;padding: 0;max-height: 360px;overflow-y: auto;}.model-row {padding: 6px 8px;border-radius: var(--radius-sm);}.model-row.cursor {background: var(--accent-soft);}.model-row.selected .model-id {color: var(--accent);font-weight: 600;}.model-name {display: flex;align-items: center;gap: 6px;min-width: 0;}.model-id {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.model-price,.model-ctx {font-size: 12px;color: var(--text-2);font-variant-numeric: tabular-nums;text-align: right;}.star {padding: 0 2px;color: var(--hairline);font-size: 13px;}.star.on {color: #e0a526;}.tag {font-size: 10px;padding: 0 6px;border-radius: 999px;background: var(--accent-soft);color: var(--text-2);white-space: nowrap;}.tag.local {background: rgba(15, 125, 114, 0.15);}.picker-foot {display: flex;justify-content: space-between;align-items: center;gap: 8px;}.empty-row {padding: 12px;color: var(--text-3);list-style: none;}/* ---- the thread ---------------------------------------------------------- */.chat-scroll {flex: 1;overflow-y: auto;min-height: 0;}.thread {max-width: 780px;margin: 0 auto;padding: 12px 24px 24px;display: grid;gap: 18px;}.system-prompt {font-size: 12px;color: var(--text-2);border-left: 2px solid var(--accent-soft);padding: 4px 10px;}.system-prompt summary {cursor: default;color: var(--text-3);}.msg.user {justify-self: end;max-width: 82%;display: grid;justify-items: end;gap: 4px;}.msg.user .bubble {background: var(--user-bubble);border: 1px solid var(--glass-border);border-radius: var(--radius-lg) var(--radius-lg) 4px var(--radius-lg);padding: 9px 14px;display: grid;gap: 8px;}.user-text {white-space: pre-wrap;overflow-wrap: anywhere;}.msg-actions {opacity: 0;transition: opacity 120ms;display: flex;gap: 2px;}.msg:hover .msg-actions,.msg:focus-within .msg-actions {opacity: 1;}.msg.assistant {display: grid;gap: 6px;}.msg-meta {display: flex;align-items: center;flex-wrap: wrap;gap: 4px 10px;font-size: 12px;color: var(--text-3);}.msg-meta button {opacity: 0;}.msg:hover .msg-meta button,.msg:focus-within .msg-meta button {opacity: 1;}.model-tag {font-weight: 600;color: var(--text-2);}.cost-line {font-variant-numeric: tabular-nums;}.cost-line strong {color: var(--text-2);font-weight: 600;}.est {margin-left: 4px;text-decoration: none;font-size: 11px;padding: 0 5px;border-radius: 999px;background: var(--warn-bg);color: var(--warn);}.msg-error {color: var(--danger);background: var(--danger-bg);border-radius: var(--radius-sm);padding: 8px 12px;font-size: 13px;}.msg-note {color: var(--text-3);font-size: 12px;font-style: italic;}.reasoning {font-size: 13px;color: var(--text-2);}.reasoning summary {color: var(--text-3);font-size: 12px;}.reasoning-text {white-space: pre-wrap;border-left: 2px solid var(--hairline);padding: 4px 10px;margin-top: 4px;}.edit {display: grid;gap: 8px;min-width: min(520px, 70vw);}.typing {display: flex;gap: 4px;padding: 6px 0;}.typing span {width: 6px;height: 6px;border-radius: 50%;background: var(--text-3);animation: blink 1.1s infinite;}.typing span:nth-child(2) {animation-delay: 0.18s;}.typing span:nth-child(3) {animation-delay: 0.36s;}@keyframes blink {50% {opacity: 0.25;}}.caret {display: inline-block;width: 7px;height: 15px;background: var(--accent);border-radius: 2px;animation: blink 1s infinite;margin-top: -4px;}.msg-image {margin: 0;width: min(360px, 100%);border-radius: var(--radius);overflow: hidden;background: var(--hairline);}.msg-image img {width: 100%;height: 100%;object-fit: cover;display: block;}/* ---- markdown ------------------------------------------------------------ */.md {line-height: 1.62;overflow-wrap: anywhere;}.md > :first-child {margin-top: 0;}.md > :last-child {margin-bottom: 0;}.md p,.md ul,.md ol,.md table {margin: 0 0 10px;}.md h1,.md h2,.md h3 {font-size: 15px;margin: 16px 0 6px;}.md a {color: var(--accent);}.md code {font-family: var(--mono);font-size: 12.5px;background: var(--code-bg);padding: 1px 5px;border-radius: 5px;}.md pre code {background: none;padding: 0;}.md table {border-collapse: collapse;font-size: 13px;display: block;overflow-x: auto;}.md th,.md td {border-bottom: 1px solid var(--hairline);padding: 5px 12px 5px 0;text-align: left;}.md th {color: var(--text-2);font-weight: 600;}.md blockquote {margin: 0 0 10px;padding-left: 12px;border-left: 3px solid var(--accent-soft);color: var(--text-2);}.codeblock {border-radius: var(--radius);background: var(--code-bg);border: 1px solid var(--hairline);margin: 0 0 12px;overflow: hidden;}.codeblock-bar {display: flex;justify-content: space-between;align-items: center;padding: 3px 6px 3px 12px;font-size: 11px;color: var(--text-3);border-bottom: 1px solid var(--hairline);}.codeblock pre {margin: 0;padding: 10px 12px;overflow-x: auto;font-family: var(--mono);font-size: 12.5px;line-height: 1.55;}.md-img {color: var(--text-3);font-style: italic;}/* ---- composer ------------------------------------------------------------ */.composer-wrap {padding: 0 24px 12px;}.composer {max-width: 780px;margin: 0 auto;border-radius: var(--radius-lg);padding: 10px 10px 8px 14px;display: grid;gap: 6px;-webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));backdrop-filter: blur(var(--blur)) saturate(var(--saturate));}.composer.dragging {box-shadow: var(--focus), var(--shadow);}.composer textarea {resize: none;border: 0;background: transparent;padding: 4px 0;font-size: 14.5px;line-height: 1.5;max-height: 240px;box-shadow: none;}.composer-bar {display: flex;align-items: center;gap: 8px;}.estimate {flex: 1;font-size: 12px;color: var(--text-3);font-variant-numeric: tabular-nums;}.estimate.over {color: var(--danger);}.send {padding: 6px 16px;}.stop {padding: 6px 16px;background: var(--danger-bg);color: var(--danger);font-weight: 600;}.chips {display: flex;flex-wrap: wrap;gap: 6px;}.chip {display: flex;align-items: center;gap: 6px;max-width: 220px;border: 1px solid var(--hairline);background: var(--glass-tint);border-radius: var(--radius-sm);padding: 3px 4px 3px 3px;font-size: 12px;}.chip img,.chip-thumb {width: 26px;height: 26px;border-radius: 5px;object-fit: cover;background: var(--hairline);}.chip-icon {font-size: 9px;font-weight: 700;padding: 5px 4px;border-radius: 5px;background: var(--accent-soft);color: var(--accent);}.chip-name {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.chip-x {padding: 0 5px;font-size: 15px;line-height: 18px;color: var(--text-3);}/* ---- empty state --------------------------------------------------------- */.empty {max-width: 560px;margin: 12vh auto 0;padding: 0 24px;text-align: center;display: grid;gap: 10px;justify-items: center;}.empty h1 {font-size: 24px;font-weight: 650;margin: 8px 0 0;letter-spacing: -0.01em;}.empty-mark {width: 54px;height: 54px;border-radius: 16px;background:radial-gradient(circle at 70% 30%, var(--teal) 0 14%, transparent 15%),conic-gradient(from 210deg, var(--accent), var(--teal), var(--accent));-webkit-mask: radial-gradient(circle, transparent 11px, #000 12px);mask: radial-gradient(circle, transparent 11px, #000 12px);opacity: 0.9;}.suggestions {display: grid;gap: 8px;width: 100%;margin-top: 18px;}.suggestion {text-align: left;padding: 10px 14px;border-radius: var(--radius);color: var(--text-2);}.suggestion:hover {color: var(--text-1);background: var(--glass-strong);}/* ---- banners, toasts ----------------------------------------------------- */.budget-banner {margin: 0 24px 8px;padding: 7px 12px;border-radius: var(--radius-sm);font-size: 13px;}.budget-banner.near {background: var(--warn-bg);color: var(--warn);}.budget-banner.over {background: var(--danger-bg);color: var(--danger);}.toasts {position: fixed;bottom: 18px;left: 50%;transform: translateX(-50%);display: grid;gap: 8px;z-index: 60;pointer-events: none;}.toast {border-radius: var(--radius);padding: 9px 14px;font-size: 13px;max-width: min(520px, 90vw);animation: pop 160ms var(--ease);}.toast.error {color: var(--danger);}/* ---- overlays: search, settings, usage ----------------------------------- */.overlay {position: fixed;inset: 0;z-index: 40;background: rgba(10, 8, 20, 0.22);display: grid;justify-items: center;align-items: start;padding: 9vh 16px 16px;animation: fade 140ms var(--ease);}@keyframes fade {from {opacity: 0;}}.palette {width: min(640px, 100%);border-radius: var(--radius-lg);overflow: hidden;}.hits {list-style: none;margin: 0;padding: 6px;max-height: 56vh;overflow-y: auto;}.hits li {padding: 9px 10px;border-radius: var(--radius-sm);display: grid;gap: 2px;}.hits li.cursor {background: var(--accent-soft);}.hit-head {display: flex;justify-content: space-between;gap: 10px;}.hit-snippet {font-size: 13px;color: var(--text-2);}mark {background: rgba(255, 196, 92, 0.45);color: inherit;border-radius: 3px;padding: 0 2px;}.sheet {width: min(720px, 100%);max-height: 84vh;border-radius: var(--radius-lg);display: flex;flex-direction: column;overflow: hidden;}.sheet-head {display: flex;align-items: center;gap: 12px;padding: 14px 16px;border-bottom: 1px solid var(--hairline);}.sheet-head h2 {margin: 0;font-size: 16px;flex: 1;}.sheet-body {overflow-y: auto;padding: 8px 18px 22px;}.sheet-body h3 {font-size: 12px;text-transform: uppercase;letter-spacing: 0.06em;color: var(--text-3);margin: 20px 0 8px;}.settings section {display: grid;gap: 10px;}.field {display: grid;gap: 6px;font-size: 13px;color: var(--text-2);}.field input,.field select,.field textarea {color: var(--text-1);}.hint {margin: 0;font-size: 12px;color: var(--text-3);}.check {display: flex;gap: 8px;align-items: center;font-size: 13px;}.check input {accent-color: var(--accent);}label.inline {display: flex;align-items: center;gap: 6px;font-size: 13px;}label.inline input {width: 70px;}.provider-row,.preset-list li {display: flex;justify-content: space-between;gap: 10px;align-items: center;padding: 10px 12px;border-radius: var(--radius);}.preset-list {list-style: none;margin: 0;padding: 0;display: grid;gap: 6px;}.clamp {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;}.shortcut {border: 1px solid var(--hairline);background: var(--glass-tint);min-width: 160px;font-size: 15px;letter-spacing: 0.04em;}.shortcut.recording {border-color: var(--accent);box-shadow: var(--focus);font-size: 13px;}.path {color: var(--text-2);overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.stat-row {display: grid;grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));gap: 8px;margin-top: 12px;}.stat {border-radius: var(--radius);padding: 10px 12px;display: grid;gap: 2px;}.stat strong {font-size: 18px;font-variant-numeric: tabular-nums;}.bars {list-style: none;margin: 0;padding: 0;display: grid;gap: 6px;}.bars li {display: grid;grid-template-columns: minmax(0, 200px) 1fr 80px;gap: 10px;align-items: center;font-size: 13px;}.bar-label {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.bar-track {height: 8px;background: var(--hairline);border-radius: 8px;overflow: hidden;}.bar-fill {display: block;height: 100%;background: linear-gradient(90deg, var(--teal), var(--accent));border-radius: 8px;}.bar-value {text-align: right;font-variant-numeric: tabular-nums;color: var(--text-2);}.days {display: flex;align-items: flex-end;gap: 4px;height: 120px;padding-top: 8px;overflow-x: auto;}.day {flex: 1 0 22px;display: grid;grid-template-rows: 1fr auto;height: 100%;gap: 4px;}.day-fill {align-self: end;background: linear-gradient(180deg, var(--accent), var(--teal));border-radius: 4px 4px 1px 1px;min-height: 3px;}.day-label {font-size: 10px;color: var(--text-3);text-align: center;}/* ---- the quick window ---------------------------------------------------- */.quick-window body {background: transparent;}:root.quick-window[data-vibrancy='none'] body {background: var(--backdrop);}.quick {height: 100%;border-radius: 14px;display: flex;flex-direction: column;overflow: hidden;}:root[data-vibrancy='native'] .quick {border: 0;box-shadow: none;background: transparent;}.quick-row {display: flex;align-items: center;gap: 12px;padding: 0 18px;height: 76px;flex: none;}.quick-mark {width: 22px;height: 22px;border-radius: 50%;border: 4px solid var(--accent);border-right-color: transparent;transform: rotate(45deg);flex: none;}.quick-input {flex: 1;font-size: 20px;border: 0;background: transparent;padding: 0;box-shadow: none !important;}.quick-model {font-size: 12px;color: var(--text-3);white-space: nowrap;}.quick-body {border-top: 1px solid var(--hairline);padding: 12px 18px 12px;overflow-y: auto;display: grid;gap: 8px;}.quick-foot {display: flex;align-items: center;gap: 8px;font-size: 12px;color: var(--text-3);}/* ---- narrow windows ------------------------------------------------------ */@media (max-width: 860px) {.app {grid-template-columns: 220px 1fr;}.model-button-price {display: none;}.thread {padding: 8px 14px 20px;}.composer-wrap {padding: 0 12px 10px;}}