/* ─── CSS Variables (overrideable via Style Settings plugin) ────────────────── */ :root { --gpt-color-openai: #10a37f; --gpt-color-claude: #7c3aed; --gpt-color-ollama: #475569; --gpt-color-web: #2563eb; --gpt-color-learn: #f59e0b; --gpt-color-error: #e74c3c; --gpt-color-ok-text: #065f46; --gpt-color-err-text: #991b1b; } /* ─── Root containers ────────────────────────────────────────────────────────── */ .gpt-chat-root, .gpt-history-root, .gpt-projects-root { display: flex; flex-direction: column; height: 100%; background: var(--background-primary); overflow: hidden; } /* ─── Headers ────────────────────────────────────────────────────────────────── */ .gpt-header, .gpt-history-header, .gpt-projects-header { display: flex; align-items: center; gap: 6px; padding: 10px 14px; border-bottom: 1px solid var(--background-modifier-border); background: var(--background-secondary); flex-shrink: 0; } .gpt-header-icon { font-size: 15px; color: var(--gpt-color-openai); } .gpt-header-title { font-size: 13px; font-weight: 700; flex: 1; letter-spacing: .03em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ─── Provider selector ─────────────────────────────────────────────────────── */ .gpt-provider-selector { display: flex; align-items: center; gap: 5px; padding: 3px 8px; border-radius: 8px; border: 1px solid var(--background-modifier-border); background: var(--background-primary); color: var(--text-normal); cursor: pointer; font-size: 12px; font-weight: 700; flex: 0 0 auto; min-width: 86px; max-width: 112px; transition: background .15s, border-color .15s, color .15s; white-space: nowrap; overflow: hidden; } .gpt-provider-selector:hover { background: var(--background-modifier-hover); } .gpt-provider-selector--openai { border-color: color-mix(in srgb, var(--gpt-color-openai) 45%, var(--background-modifier-border)); } .gpt-provider-selector--claude { border-color: color-mix(in srgb, var(--gpt-color-claude) 45%, var(--background-modifier-border)); } .gpt-provider-selector--ollama { border-color: color-mix(in srgb, var(--gpt-color-ollama) 45%, var(--background-modifier-border)); } .gpt-provider-icon { font-size: 13px; flex-shrink: 0; } .gpt-provider-label { overflow: hidden; text-overflow: ellipsis; flex: 1; text-align: left; } .gpt-provider-arrow { flex-shrink: 0; opacity: .55; transition: opacity .15s; } .gpt-provider-selector:hover .gpt-provider-arrow { opacity: 1; } /* ─── Model selector ─────────────────────────────────────────────────────────── */ .gpt-model-selector { display: flex; align-items: center; gap: 5px; padding: 3px 9px 3px 7px; border-radius: 8px; border: 1px solid var(--background-modifier-border); background: var(--background-secondary); color: var(--text-normal); cursor: pointer; font-size: 12px; font-weight: 600; flex: 1 1 120px; min-width: 96px; max-width: 220px; transition: background .15s, border-color .15s; white-space: nowrap; overflow: hidden; } .gpt-model-selector:hover { background: var(--background-modifier-hover); border-color: var(--interactive-accent); } .gpt-ms-icon { font-size: 13px; flex-shrink: 0; } .gpt-ms-label { overflow: hidden; text-overflow: ellipsis; flex: 1; text-align: left; } .gpt-ms-arrow { flex-shrink: 0; opacity: .5; transition: opacity .15s; } .gpt-model-selector:hover .gpt-ms-arrow { opacity: 1; } /* ─── Model picker dropdown ──────────────────────────────────────────────────── */ .gpt-model-picker { position: fixed; z-index: 9999; background: var(--background-primary); border: 1px solid var(--background-modifier-border); border-radius: 10px; box-shadow: 0 8px 32px rgba(0,0,0,.25); padding: 6px; min-width: 220px; max-height: 420px; overflow-y: auto; } .gpt-provider-picker { min-width: 190px; } .gpt-mp-header { font-size: 11px; font-weight: 700; color: var(--text-muted); padding: 4px 8px 6px; letter-spacing: .04em; } .gpt-mp-row { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 6px 8px; border-radius: 6px; border: none; background: transparent; cursor: pointer; text-align: left; gap: 4px; transition: background .12s; } .gpt-mp-row:hover { background: var(--background-modifier-hover); } .gpt-mp-row--active { background: color-mix(in srgb, var(--interactive-accent) 12%, transparent); } .gpt-mp-row--active:hover { background: color-mix(in srgb, var(--interactive-accent) 18%, transparent); } .gpt-mp-row-left { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; } .gpt-mp-row-name { font-size: 12px; font-weight: 600; color: var(--text-normal); } .gpt-mp-row-desc { font-size: 10px; color: var(--text-muted); } .gpt-mp-row-check { font-size: 12px; color: var(--interactive-accent); font-weight: 700; flex-shrink: 0; } .gpt-mp-divider { height: 1px; background: var(--background-modifier-border); margin: 4px 0; } .gpt-provider-row { justify-content: flex-start; gap: 8px; } .gpt-provider-row-icon { font-size: 14px; width: 18px; text-align: center; flex-shrink: 0; } /* ─── Badges & buttons ───────────────────────────────────────────────────────── */ .gpt-rag-badge { font-size: 9px; font-weight: 700; padding: 2px 6px; border-radius: 10px; background: var(--gpt-color-openai); color: #fff; letter-spacing: .05em; flex-shrink: 0; } .gpt-icon-btn { background: none; border: none; cursor: pointer; color: var(--text-muted); padding: 4px; border-radius: 5px; display: flex; align-items: center; transition: all .15s; } .gpt-icon-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); } .gpt-clear-btn, .gpt-pill-btn { font-size: 11px; padding: 3px 10px; border-radius: 20px; border: 1px solid var(--background-modifier-border); background: transparent; color: var(--text-muted); cursor: pointer; transition: all .2s; flex-shrink: 0; } .gpt-clear-btn:hover, .gpt-pill-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); } /* ─── Mode bar ───────────────────────────────────────────────────────────────── */ .gpt-mode-bar { display: flex; gap: 5px; padding: 7px 12px; border-bottom: 1px solid var(--background-modifier-border); background: var(--background-secondary); flex-shrink: 0; } .gpt-mode-btn { flex: 1; padding: 5px 3px; font-size: 11px; border-radius: 7px; border: 1px solid var(--background-modifier-border); background: transparent; color: var(--text-muted); cursor: pointer; transition: all .2s; white-space: nowrap; } .gpt-mode-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); } .gpt-mode-btn.gpt-mode-btn--active { background: var(--interactive-accent); color: #fff; border-color: var(--interactive-accent); font-weight: 600; } /* ─── Context bars ───────────────────────────────────────────────────────────── */ .gpt-rag-status { padding: 6px 14px; font-size: 11px; flex-shrink: 0; border-bottom: 1px solid var(--background-modifier-border); } .gpt-rag-indexing { background: color-mix(in srgb, var(--gpt-color-learn) 12%, var(--background-secondary)); color: #92400e; } .gpt-rag-ready { background: color-mix(in srgb, var(--gpt-color-openai) 12%, var(--background-secondary)); color: var(--gpt-color-ok-text); } .gpt-manual-bar { display: flex; align-items: center; gap: 6px; padding: 5px 12px; background: color-mix(in srgb, #6366f1 10%, var(--background-secondary)); border-bottom: 1px solid color-mix(in srgb, #6366f1 20%, transparent); font-size: 11px; flex-shrink: 0; } .gpt-project-bar { display: flex; align-items: center; gap: 6px; padding: 5px 12px; border-bottom: 1px solid transparent; font-size: 11px; flex-shrink: 0; } .gpt-project-bar-label { color: var(--text-muted); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; font-weight: 600; } .gpt-chat-root .gpt-ctx-hidden, .gpt-history-root .gpt-ctx-hidden, .gpt-projects-root .gpt-ctx-hidden { display: none; } .gpt-ctx-list { color: var(--text-muted); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; } .gpt-ctx-clear { background: none; border: none; cursor: pointer; color: var(--text-muted); padding: 0 2px; font-size: 13px; line-height: 1; } /* ─── Chat messages ──────────────────────────────────────────────────────────── */ .gpt-messages { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 10px; scrollbar-width: thin; } .gpt-welcome { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--text-muted); text-align: center; gap: 6px; } .gpt-welcome-icon { font-size: 28px; color: var(--gpt-color-openai); opacity: .5; } .gpt-welcome-hint { font-size: 11px; opacity: .6; } .gpt-msg { display: flex; flex-direction: column; gap: 2px; } .gpt-msg-user { align-items: flex-end; } .gpt-msg-assistant { align-items: flex-start; } .gpt-bubble { max-width: 88%; padding: 10px 14px; border-radius: 14px; font-size: 13px; line-height: 1.6; word-break: break-word; } .gpt-msg-user .gpt-bubble { background: var(--gpt-color-openai); color: #fff; border-bottom-right-radius: 4px; } .gpt-msg-assistant .gpt-bubble { background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-bottom-left-radius: 4px; color: var(--text-normal); } /* ─── Message footer ─────────────────────────────────────────────────────────── */ .gpt-msg-footer { display: flex; align-items: center; justify-content: space-between; padding: 0 4px; margin-top: 2px; } .gpt-msg-user .gpt-msg-footer { flex-direction: row-reverse; } .gpt-msg-label { font-size: 10px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .05em; } .gpt-copy-btn { display: flex; align-items: center; background: none; border: none; cursor: pointer; color: var(--text-faint); padding: 3px 5px; border-radius: 5px; transition: all .15s; opacity: 0; } .gpt-msg:hover .gpt-copy-btn { opacity: 1; } .gpt-copy-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); } .gpt-msg-content { user-select: text; -webkit-user-select: text; cursor: text; } .gpt-msg-interrupted { font-size: 10px; color: var(--text-faint); margin-top: 6px; font-style: italic; } .gpt-msg-error-line { color: var(--gpt-color-error); font-weight: 600; } .gpt-msg-error-detail { font-size: 10px; color: var(--text-faint); margin-top: 6px; } .gpt-bubble .gpt-error { color: var(--gpt-color-error); } /* ─── Loading dots ───────────────────────────────────────────────────────────── */ .gpt-loading .gpt-msg-content { display: none; } .gpt-dots { display: flex; gap: 4px; padding: 4px 2px; align-items: center; } .gpt-dots span { width: 6px; height: 6px; background: var(--text-muted); border-radius: 50%; animation: gpt-bounce 1.2s infinite ease-in-out; } .gpt-dots span:nth-child(2) { animation-delay: .2s; } .gpt-dots span:nth-child(3) { animation-delay: .4s; } @keyframes gpt-bounce { 0%, 80%, 100% { transform: scale(.7); opacity: .4; } 40% { transform: scale(1); opacity: 1; } } /* ─── Web search indicator ───────────────────────────────────────────────────── */ .gpt-websearch-indicator { display: flex; align-items: center; gap: 5px; font-size: 11px; color: var(--gpt-color-web); padding: 4px 2px; animation: gpt-pulse-web 1.5s ease-in-out infinite; } @keyframes gpt-pulse-web { 0%, 100% { opacity: .5; } 50% { opacity: 1; } } /* ─── Code blocks ────────────────────────────────────────────────────────────── */ .gpt-code-block { border: 1px solid var(--background-modifier-border); border-radius: 8px; overflow: hidden; margin: 8px 0; } .gpt-code-header { display: flex; align-items: center; justify-content: space-between; padding: 5px 10px; background: color-mix(in srgb, var(--background-modifier-border) 50%, var(--background-secondary)); border-bottom: 1px solid var(--background-modifier-border); min-height: 28px; } .gpt-code-lang { font-size: 10px; font-weight: 700; color: var(--text-faint); text-transform: uppercase; letter-spacing: .08em; font-family: var(--font-monospace); } .gpt-code-copy { display: flex; align-items: center; gap: 4px; padding: 3px 9px; font-size: 11px; border-radius: 5px; border: 1px solid var(--background-modifier-border); background: var(--background-secondary); color: var(--text-muted); cursor: pointer; transition: all .15s; font-family: var(--font-interface); margin-left: auto; line-height: 1; } .gpt-code-copy:hover { background: var(--background-modifier-hover); color: var(--text-normal); } .gpt-code-copy.gpt-code-copy--ok { color: var(--gpt-color-openai); border-color: var(--gpt-color-openai); background: color-mix(in srgb, var(--gpt-color-openai) 10%, var(--background-secondary)); } .gpt-bubble pre { background: var(--background-primary); border-radius: 0; padding: 10px 12px; overflow-x: auto; margin: 0; font-size: 12px; } .gpt-bubble code { font-family: var(--font-monospace); font-size: 12px; } .gpt-bubble h1, .gpt-bubble h2, .gpt-bubble h3 { margin: 8px 0 4px; line-height: 1.3; } .gpt-bubble ul { padding-left: 18px; margin: 4px 0; } .gpt-bubble li { margin: 2px 0; } .gpt-bubble ol { padding-left: 18px; margin: 4px 0; } .gpt-bubble ol li { margin: 2px 0; } .gpt-bubble s { opacity: .65; } /* ─── RAG sources ────────────────────────────────────────────────────────────── */ .gpt-rag-sources { font-size: 11px; padding: 2px 6px 6px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px; max-width: 88%; } .gpt-rag-src-icon { font-size: 12px; } .gpt-rag-src-label { color: var(--text-muted); font-weight: 600; font-size: 10px; } .gpt-rag-src-chip { background: color-mix(in srgb, var(--gpt-color-openai) 12%, var(--background-secondary)); color: var(--gpt-color-openai); padding: 1px 7px; border-radius: 10px; font-size: 10px; font-weight: 500; border: 1px solid color-mix(in srgb, var(--gpt-color-openai) 25%, transparent); } /* ─── Input area ─────────────────────────────────────────────────────────────── */ .gpt-input-area { padding: 10px 12px 12px; border-top: 1px solid var(--background-modifier-border); background: var(--background-secondary); flex-shrink: 0; } .gpt-tool-row { display: flex; gap: 5px; margin-bottom: 7px; flex-wrap: wrap; } .gpt-tool-btn { display: flex; align-items: center; gap: 4px; padding: 4px 9px; font-size: 11px; border-radius: 6px; border: 1px solid var(--background-modifier-border); background: transparent; color: var(--text-muted); cursor: pointer; transition: all .2s; white-space: nowrap; } .gpt-tool-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); } /* Active states for tool buttons */ .gpt-tool-btn.gpt-rag-btn--active { background: color-mix(in srgb, var(--gpt-color-openai) 15%, var(--background-secondary)); color: var(--gpt-color-openai); border-color: var(--gpt-color-openai); font-weight: 600; } .gpt-tool-btn.gpt-websearch-btn--active { background: color-mix(in srgb, var(--gpt-color-web) 15%, var(--background-secondary)); color: var(--gpt-color-web); border-color: var(--gpt-color-web); font-weight: 600; } .gpt-tool-btn.gpt-learn-btn--active { background: color-mix(in srgb, var(--gpt-color-learn) 15%, var(--background-secondary)); color: #b45309; border-color: var(--gpt-color-learn); font-weight: 600; } .gpt-tool-btn.gpt-code-btn--active { background: color-mix(in srgb, var(--gpt-color-claude) 15%, var(--background-secondary)); color: var(--gpt-color-claude); border-color: var(--gpt-color-claude); font-weight: 600; } /* Textarea & send buttons */ .gpt-input { width: 100%; padding: 9px 12px; border-radius: 10px; border: 1px solid var(--background-modifier-border); background: var(--background-primary); color: var(--text-normal); font-size: 13px; resize: none; outline: none; transition: border-color .2s; box-sizing: border-box; font-family: var(--font-interface); } .gpt-input:focus { border-color: var(--gpt-color-openai); } .gpt-btn-row { display: flex; align-items: center; gap: 6px; margin-top: 7px; } .gpt-mode-label { font-size: 10px; color: var(--text-faint); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: help; } .gpt-send-btn { padding: 6px 18px; border-radius: 20px; border: none; background: var(--gpt-color-openai); color: #fff; font-size: 12px; font-weight: 700; cursor: pointer; transition: opacity .2s, transform .1s; } .gpt-send-btn:hover { opacity: .85; } .gpt-send-btn:active { transform: scale(.97); } .gpt-send-btn:disabled { opacity: .45; cursor: not-allowed; } .gpt-stop-btn { padding: 6px 18px; border-radius: 20px; border: none; background: var(--gpt-color-error); color: #fff; font-size: 12px; font-weight: 700; cursor: pointer; transition: opacity .2s; animation: gpt-pulse-stop 1.2s ease-in-out infinite; } .gpt-stop-btn:hover { opacity: .85; } @keyframes gpt-pulse-stop { 0%, 100% { opacity: .85; } 50% { opacity: 1; } } .gpt-action-btn { display: flex; align-items: center; background: none; border: 1px solid var(--background-modifier-border); cursor: pointer; color: var(--text-faint); padding: 4px 7px; border-radius: 8px; transition: all .15s; } .gpt-action-btn:hover { background: var(--background-modifier-hover); color: var(--text-normal); border-color: var(--text-faint); } .gpt-link { color: var(--interactive-accent); text-decoration: underline; text-underline-offset: 2px; } .gpt-link:hover { opacity: .8; } .gpt-cursor { display: inline-block; width: 2px; height: 14px; background: var(--text-normal); margin-left: 1px; vertical-align: middle; animation: gpt-blink .7s step-end infinite; } @keyframes gpt-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } /* ─── Modal overlay ──────────────────────────────────────────────────────────── */ .gpt-modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.55); display: flex; align-items: center; justify-content: center; z-index: 9999; } .gpt-modal-box { background: var(--background-primary); border-radius: 12px; padding: 20px; width: 400px; max-width: 92vw; display: flex; flex-direction: column; gap: 10px; border: 1px solid var(--background-modifier-border); box-shadow: 0 8px 32px rgba(0,0,0,.3); } .gpt-modal-title { margin: 0; font-size: 13px; font-weight: 600; } .gpt-modal-input { width: 100%; padding: 8px 12px; border-radius: 8px; box-sizing: border-box; border: 1px solid var(--background-modifier-border); background: var(--background-secondary); color: var(--text-normal); font-size: 13px; outline: none; } .gpt-modal-input:focus { border-color: var(--gpt-color-openai); } .gpt-modal-input.gpt-modal-input-error { border-color: var(--color-red, var(--gpt-color-error)); } .gpt-modal-list { max-height: 260px; overflow-y: auto; display: flex; flex-direction: column; gap: 3px; border: 1px solid var(--background-modifier-border); border-radius: 8px; padding: 6px; } .gpt-modal-row { display: flex; align-items: center; gap: 8px; padding: 5px 6px; border-radius: 6px; cursor: pointer; font-size: 12px; color: var(--text-normal); } .gpt-modal-row:hover { background: var(--background-modifier-hover); } .gpt-modal-row-label { font-size: 12px; } .gpt-modal-more { font-size: 11px; color: var(--text-faint); padding: 4px 6px; } .gpt-modal-btns { display: flex; gap: 8px; justify-content: flex-end; margin-top: 2px; } .gpt-modal-cancel { padding: 7px 16px; border-radius: 8px; cursor: pointer; background: transparent; border: 1px solid var(--background-modifier-border); color: var(--text-normal); font-size: 12px; } .gpt-modal-ok { padding: 7px 16px; border-radius: 8px; cursor: pointer; background: var(--gpt-color-openai); color: #fff; border: none; font-weight: 700; font-size: 12px; } .gpt-modal-cancel:hover { background: var(--background-modifier-hover); } .gpt-modal-ok:hover { opacity: .87; } .gpt-modal-prompt-label { font-size: 11px; font-weight: 600; color: var(--text-muted); margin-top: 8px; display: flex; align-items: center; gap: 4px; } .gpt-modal-prompt-hint { font-size: 10px; color: var(--text-faint); margin-top: 2px; } .gpt-modal-prompt-area { margin-top: 4px; min-height: 80px; resize: vertical; font-size: 12px; line-height: 1.5; } /* ─── Quiz ───────────────────────────────────────────────────────────────────── */ .gpt-quiz-title { font-size: 14px; font-weight: 700; margin-bottom: 12px; color: var(--text-normal); padding: 2px 0; } .gpt-quiz-card { background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 12px; padding: 14px 16px; margin-bottom: 12px; } .gpt-quiz-qnum { font-size: 10px; font-weight: 600; color: var(--text-faint); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 6px; } .gpt-quiz-qtext { font-size: 13px; font-weight: 600; color: var(--text-normal); margin-bottom: 12px; line-height: 1.5; } .gpt-quiz-opts { display: flex; flex-direction: column; gap: 7px; } .gpt-quiz-opt { padding: 9px 14px; border-radius: 8px; border: 1.5px solid var(--background-modifier-border); background: var(--background-primary); color: var(--text-normal); font-size: 12px; text-align: left; cursor: pointer; transition: all .15s; font-family: var(--font-interface); } .gpt-quiz-opt:hover:not(:disabled) { border-color: var(--interactive-accent); background: color-mix(in srgb, var(--interactive-accent) 8%, var(--background-primary)); } .gpt-quiz-opt.gpt-quiz-opt--correct { border-color: var(--gpt-color-openai); background: color-mix(in srgb, var(--gpt-color-openai) 12%, var(--background-primary)); color: var(--gpt-color-ok-text); font-weight: 600; } .gpt-quiz-opt.gpt-quiz-opt--wrong { border-color: var(--gpt-color-error); background: color-mix(in srgb, var(--gpt-color-error) 10%, var(--background-primary)); color: var(--gpt-color-err-text); } .gpt-quiz-opt:disabled { cursor: default; } .gpt-quiz-fb { margin-top: 10px; padding: 9px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; } .gpt-quiz-fb--ok { background: color-mix(in srgb, var(--gpt-color-openai) 12%, var(--background-primary)); color: var(--gpt-color-ok-text); border: 1px solid color-mix(in srgb, var(--gpt-color-openai) 25%, transparent); } .gpt-quiz-fb--err { background: color-mix(in srgb, var(--gpt-color-error) 10%, var(--background-primary)); color: var(--gpt-color-err-text); border: 1px solid color-mix(in srgb, var(--gpt-color-error) 20%, transparent); } .gpt-quiz-input { width: 100%; padding: 8px 12px; border-radius: 8px; border: 1.5px solid var(--background-modifier-border); background: var(--background-primary); color: var(--text-normal); font-size: 12px; resize: none; outline: none; box-sizing: border-box; font-family: var(--font-interface); transition: border-color .15s; margin-bottom: 8px; } .gpt-quiz-input:focus { border-color: var(--interactive-accent); } .gpt-quiz-check { padding: 6px 16px; border-radius: 8px; border: none; background: var(--interactive-accent); color: #fff; font-size: 12px; font-weight: 600; cursor: pointer; transition: opacity .15s; } .gpt-quiz-check:hover { opacity: .85; } .gpt-quiz-check:disabled { opacity: .45; cursor: not-allowed; } /* ─── History view ───────────────────────────────────────────────────────────── */ .gpt-history-list { flex: 1; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 4px; scrollbar-width: thin; } .gpt-history-item { padding: 9px 11px; border-radius: 8px; cursor: pointer; border: 1px solid transparent; background: var(--background-secondary); transition: all .15s; } .gpt-history-item--active { border-color: var(--interactive-accent); background: color-mix(in srgb, var(--interactive-accent) 10%, var(--background-secondary)); } .gpt-history-item:hover:not(.gpt-history-item--active) { background: var(--background-modifier-hover); } .gpt-history-item:hover .gpt-history-item-del, .gpt-projects-card:hover .gpt-projects-icon-btn { opacity: 1; } .gpt-history-item-top { display: flex; align-items: center; justify-content: space-between; gap: 6px; } .gpt-history-item-title { font-size: 12px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; color: var(--text-normal); } .gpt-history-item-del, .gpt-projects-icon-btn { background: none; border: none; cursor: pointer; color: var(--text-faint); padding: 2px; border-radius: 3px; opacity: 0; transition: opacity .15s; flex-shrink: 0; } .gpt-history-item-date { font-size: 10px; color: var(--text-faint); margin-top: 2px; } .gpt-history-item-preview { font-size: 11px; color: var(--text-muted); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gpt-history-empty { color: var(--text-muted); font-size: 12px; text-align: center; margin-top: 24px; line-height: 1.6; } .gpt-history-empty-hint { color: var(--text-faint); font-size: 11px; text-align: center; margin-top: 6px; white-space: pre-line; } .gpt-projects-shortcut { display: flex; align-items: center; gap: 8px; padding: 9px 14px; border-bottom: 1px solid var(--background-modifier-border); cursor: pointer; transition: background .15s; flex-shrink: 0; } .gpt-projects-shortcut:hover { background: var(--background-modifier-hover); } .gpt-projects-shortcut-label { font-size: 12px; font-weight: 600; flex: 1; color: var(--text-normal); } .gpt-projects-shortcut-badge { font-size: 10px; padding: 1px 7px; border-radius: 10px; background: color-mix(in srgb, var(--gpt-color-claude) 15%, var(--background-secondary)); color: var(--gpt-color-claude); font-weight: 700; } .gpt-projects-shortcut-arrow { font-size: 16px; color: var(--text-faint); font-weight: 300; } /* ─── Projects view ──────────────────────────────────────────────────────────── */ .gpt-projects-list { flex: 1; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 6px; scrollbar-width: thin; } .gpt-projects-active-bar { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-bottom: 1px solid color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 25%, transparent); background: color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 12%, var(--background-secondary)); flex-shrink: 0; font-size: 11px; } .gpt-projects-active-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; background: var(--gpt-project-color, var(--interactive-accent)); } .gpt-projects-active-name { font-size: 11px; font-weight: 600; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gpt-projects-empty { color: var(--text-muted); font-size: 12px; text-align: center; margin-top: 24px; padding: 0 12px; line-height: 1.6; } .gpt-projects-empty-hint { font-size: 11px; opacity: .7; margin-top: 4px; } .gpt-projects-card { padding: 11px 13px; border-radius: 10px; cursor: pointer; border: 2px solid transparent; background: var(--background-secondary); transition: all .15s; } .gpt-projects-card:hover { background: var(--background-modifier-hover); } .gpt-projects-card--active { border-color: var(--gpt-project-color, var(--interactive-accent)); background: color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 8%, var(--background-secondary)); } .gpt-projects-card-top { display: flex; align-items: center; gap: 8px; } .gpt-projects-card-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; background: var(--gpt-project-color, var(--interactive-accent)); } .gpt-projects-card-name { font-size: 12px; font-weight: 700; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-normal); } .gpt-projects-card-badge { font-size: 10px; padding: 1px 7px; border-radius: 10px; font-weight: 600; flex-shrink: 0; background: color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 15%, var(--background-primary)); color: var(--gpt-project-color, var(--interactive-accent)); } .gpt-projects-card-desc { font-size: 11px; color: var(--text-muted); margin-top: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gpt-projects-card-prompt-tag { display: inline-flex; align-items: center; gap: 4px; margin-top: 4px; padding: 2px 8px; border-radius: 10px; font-size: 10px; font-weight: 600; border: 1px solid color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 20%, transparent); background: color-mix(in srgb, var(--gpt-project-color, var(--interactive-accent)) 10%, var(--background-primary)); color: var(--gpt-project-color, var(--interactive-accent)); } .gpt-projects-card-chats { margin-top: 8px; display: flex; flex-direction: column; gap: 3px; } .gpt-projects-card-chat { display: flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 6px; font-size: 11px; color: var(--text-muted); cursor: pointer; transition: background .1s; } .gpt-projects-card-chat:hover { background: var(--background-modifier-hover); } .gpt-projects-card-chat-icon { flex-shrink: 0; opacity: .6; } .gpt-projects-card-chat-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gpt-projects-card-chat-date { font-size: 9px; color: var(--text-faint); flex-shrink: 0; } .gpt-projects-card-chat-del { display: none; flex-shrink: 0; padding: 2px 4px; border: none; background: transparent; color: var(--text-faint); cursor: pointer; border-radius: 4px; line-height: 1; transition: color .12s, background .12s; } .gpt-projects-card-chat-del:hover { color: var(--gpt-color-error); background: color-mix(in srgb, var(--gpt-color-error) 12%, transparent); } .gpt-projects-card-chat:hover .gpt-projects-card-chat-del { display: flex; align-items: center; } .gpt-projects-card-more { font-size: 10px; color: var(--text-faint); padding: 2px 8px; } /* ─── Fallback modal ─────────────────────────────────────────────────────────── */ .gpt-fallback-modal h2 { margin: 0 0 12px; font-size: 18px; } .gpt-fallback-desc { font-size: 13px; line-height: 1.55; color: var(--text-normal); } .gpt-fallback-desc p { margin: 8px 0; } .gpt-fallback-hint { padding: 10px 12px; margin: 10px 0; background: color-mix(in srgb, var(--gpt-color-learn) 10%, var(--background-secondary)); border: 1px solid color-mix(in srgb, var(--gpt-color-learn) 30%, transparent); border-radius: 6px; font-size: 12px; line-height: 1.55; } .gpt-fallback-err { padding: 8px 10px; margin: 10px 0; background: var(--background-secondary); border-radius: 6px; font-size: 11px; color: var(--text-muted); font-family: var(--font-monospace); word-break: break-word; } .gpt-fallback-err code { background: transparent; padding: 0; color: var(--color-red, var(--gpt-color-error)); } .gpt-fallback-check { display: flex; align-items: center; gap: 6px; margin: 14px 0 8px; font-size: 12px; color: var(--text-muted); } .gpt-fallback-check input[type=checkbox] { margin: 0; } .gpt-fallback-check label { cursor: pointer; } .gpt-fallback-buttons { display: flex; gap: 8px; justify-content: flex-end; margin-top: 14px; } .gpt-fallback-buttons button { padding: 6px 14px; font-size: 13px; border-radius: 6px; cursor: pointer; border: 1px solid var(--background-modifier-border); background: var(--background-secondary); color: var(--text-normal); transition: background .15s; } .gpt-fallback-buttons button:hover { background: var(--background-modifier-hover); } .gpt-fallback-buttons button.mod-cta { background: var(--interactive-accent); color: var(--text-on-accent); border-color: var(--interactive-accent); } .gpt-fallback-buttons button.mod-cta:hover { background: var(--interactive-accent-hover, var(--interactive-accent)); } /* ─── Settings tab ───────────────────────────────────────────────────────────── */ .gpt-settings-warning { padding: 8px 12px; margin-bottom: 14px; border-radius: 6px; background: color-mix(in srgb, var(--gpt-color-learn) 10%, var(--background-secondary)); border: 1px solid color-mix(in srgb, var(--gpt-color-learn) 30%, transparent); font-size: 12px; color: var(--text-muted); } .gpt-settings-note { font-size: 11px; color: var(--text-muted); margin: -8px 0 12px; padding: 0 12px; } .gpt-settings-rag-status { padding: 8px 12px; margin: 8px 0; border-radius: 6px; background: var(--background-secondary); font-size: 12px; color: var(--text-muted); } .gpt-settings-storage-info { padding: 10px 14px; margin-bottom: 14px; border-radius: 6px; font-size: 12px; line-height: 1.6; border: 1px solid var(--background-modifier-border); } .gpt-settings-input-compact { width: 90px; max-width: 100%; } .gpt-settings-input-full { width: 100%; } .gpt-settings-storage-path { font-size: 11px; word-break: break-all; }