mirror of
https://github.com/jamjan05/AI-Vault-for-Obsidian.git
synced 2026-07-22 06:56:43 +00:00
640 lines
34 KiB
CSS
640 lines
34 KiB
CSS
/* ─── CSS Variables (overrideable via Style Settings plugin) ────────────────── */
|
|
:root {
|
|
--gpt-color-openai: #10a37f;
|
|
--gpt-color-claude: #7c3aed;
|
|
--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 switch ────────────────────────────────────────────────────────── */
|
|
.gpt-provider-switch {
|
|
display: flex;
|
|
border-radius: 8px;
|
|
border: 1px solid var(--background-modifier-border);
|
|
overflow: hidden;
|
|
flex-shrink: 0;
|
|
}
|
|
.gpt-provider-btn {
|
|
padding: 3px 10px; font-size: 11px; font-weight: 600;
|
|
border: none; background: transparent;
|
|
color: var(--text-muted); cursor: pointer; transition: all .15s;
|
|
}
|
|
.gpt-provider-btn--active:first-child { background: var(--gpt-color-openai); color: #fff; }
|
|
.gpt-provider-btn--active:last-child { background: var(--gpt-color-claude); color: #fff; }
|
|
.gpt-provider-btn:hover:not(.gpt-provider-btn--active) {
|
|
background: var(--background-modifier-hover);
|
|
color: var(--text-normal);
|
|
}
|
|
|
|
/* ─── 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; min-width: 0; max-width: 160px;
|
|
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-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; }
|
|
|
|
/* ─── 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--active {
|
|
background: var(--interactive-accent) !important;
|
|
color: #fff !important;
|
|
border-color: var(--interactive-accent) !important;
|
|
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-ctx-hidden { display: none !important; }
|
|
.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-error { color: var(--gpt-color-error) !important; }
|
|
|
|
/* ─── 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--ok {
|
|
color: var(--gpt-color-openai) !important;
|
|
border-color: var(--gpt-color-openai) !important;
|
|
background: color-mix(in srgb, var(--gpt-color-openai) 10%, var(--background-secondary)) !important;
|
|
}
|
|
.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-rag-btn--active {
|
|
background: color-mix(in srgb, var(--gpt-color-openai) 15%, var(--background-secondary)) !important;
|
|
color: var(--gpt-color-openai) !important;
|
|
border-color: var(--gpt-color-openai) !important;
|
|
font-weight: 600;
|
|
}
|
|
.gpt-websearch-btn--active {
|
|
background: color-mix(in srgb, var(--gpt-color-web) 15%, var(--background-secondary)) !important;
|
|
color: var(--gpt-color-web) !important;
|
|
border-color: var(--gpt-color-web) !important;
|
|
font-weight: 600;
|
|
}
|
|
.gpt-learn-btn--active {
|
|
background: color-mix(in srgb, var(--gpt-color-learn) 15%, var(--background-secondary)) !important;
|
|
color: #b45309 !important;
|
|
border-color: var(--gpt-color-learn) !important;
|
|
font-weight: 600;
|
|
}
|
|
.gpt-code-btn--active {
|
|
background: color-mix(in srgb, var(--gpt-color-claude) 15%, var(--background-secondary)) !important;
|
|
color: var(--gpt-color-claude) !important;
|
|
border-color: var(--gpt-color-claude) !important;
|
|
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--correct {
|
|
border-color: var(--gpt-color-openai) !important;
|
|
background: color-mix(in srgb, var(--gpt-color-openai) 12%, var(--background-primary)) !important;
|
|
color: var(--gpt-color-ok-text) !important; font-weight: 600;
|
|
}
|
|
.gpt-quiz-opt--wrong {
|
|
border-color: var(--gpt-color-error) !important;
|
|
background: color-mix(in srgb, var(--gpt-color-error) 10%, var(--background-primary)) !important;
|
|
color: var(--gpt-color-err-text) !important;
|
|
}
|
|
.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;
|
|
}
|