diff --git a/background.js b/background.js index f770200..3af8b82 100644 --- a/background.js +++ b/background.js @@ -13,7 +13,8 @@ const DEFAULT_SETTINGS = { systemPrompt: "You are a precise, honest assistant. Be concise, highlight uncertainties, and avoid inventing details.", resume: "", - tasks: DEFAULT_TASKS + tasks: DEFAULT_TASKS, + theme: "system" }; chrome.runtime.onInstalled.addListener(async () => { diff --git a/popup.css b/popup.css index ab185a6..8c35107 100644 --- a/popup.css +++ b/popup.css @@ -6,6 +6,34 @@ --panel: #fff7ec; --border: #e4d6c5; --glow: rgba(177, 77, 43, 0.18); + --output-bg: rgba(255, 255, 255, 0.7); + --code-bg: #f4e7d2; + --page-bg: radial-gradient(circle at top, #fdf2df, #f7ead6 60%, #f1dcc6 100%); + --input-bg: #fffdf9; + --input-fg: var(--ink); + --panel-shadow: 0 12px 30px rgba(122, 80, 47, 0.12); + color-scheme: light; +} + +:root[data-theme="dark"] { + --ink: #abb2bf; + --muted: #8b93a5; + --accent: #61afef; + --accent-deep: #56b6c2; + --panel: #2f343f; + --border: #3e4451; + --glow: rgba(97, 175, 239, 0.2); + --output-bg: rgba(47, 52, 63, 0.85); + --code-bg: #3a3f4b; + --page-bg: radial-gradient(circle at top, #2a2f3a, #21252b 60%, #1b1f25 100%); + --input-bg: #2b303b; + --input-fg: var(--ink); + --panel-shadow: 0 12px 30px rgba(0, 0, 0, 0.35); + color-scheme: dark; +} + +:root[data-theme="light"] { + color-scheme: light; } * { @@ -14,71 +42,94 @@ body { margin: 0; - padding: 16px; + padding: 12px; width: 360px; - font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Palatino, - "Times New Roman", serif; + font-family: system-ui, -apple-system, "Segoe UI", sans-serif; color: var(--ink); - background: radial-gradient(circle at top, #fdf2df, #f7ead6 60%, #f1dcc6 100%); + background: var(--page-bg); } .title-block { - margin-bottom: 12px; + margin-bottom: 6px; +} + +.title-line { + display: flex; + align-items: baseline; + gap: 8px; + flex-wrap: wrap; } .title { - font-size: 20px; + font-size: 18px; font-weight: 700; letter-spacing: 0.3px; } .subtitle { - font-size: 12px; + font-size: 11px; color: var(--muted); } .panel { - padding: 12px; + padding: 10px; border: 1px solid var(--border); border-radius: 14px; background: var(--panel); - box-shadow: 0 12px 30px rgba(122, 80, 47, 0.12); + box-shadow: var(--panel-shadow); +} + +.controls-block { + display: grid; + gap: 8px; +} + +.config-block { + display: grid; + gap: 8px; } .field { - margin-top: 10px; + margin-top: 8px; display: grid; - gap: 6px; + gap: 4px; } label { - font-size: 12px; + font-size: 10px; text-transform: uppercase; - letter-spacing: 1px; + letter-spacing: 0.8px; color: var(--muted); } select { width: 100%; - padding: 8px 10px; + padding: 6px 8px; border-radius: 10px; border: 1px solid var(--border); - background: #fffdf9; - font-size: 13px; + background: var(--input-bg); + color: var(--input-fg); + font-size: 12px; } -.actions { - display: grid; - grid-template-columns: 1fr 1fr; +.button-row { + display: flex; gap: 8px; - margin-top: 12px; +} + +.button-row button { + flex: 1; +} + +.button-row .ghost { + flex: 0 0 64px; } button { font-family: inherit; border: none; border-radius: 10px; - padding: 8px 12px; + padding: 6px 10px; cursor: pointer; transition: transform 0.15s ease, box-shadow 0.15s ease; } @@ -95,7 +146,7 @@ button:active { .primary { width: 100%; - background: #fffdf9; + background: var(--input-bg); border: 1px solid var(--border); box-shadow: 0 6px 16px rgba(120, 85, 55, 0.12); } @@ -114,42 +165,113 @@ button:active { .meta { display: flex; justify-content: space-between; - font-size: 12px; + gap: 6px; + flex-wrap: wrap; + font-size: 11px; color: var(--muted); - margin-top: 10px; + margin-top: 8px; } .status { - margin-top: 10px; - font-size: 12px; + font-size: 11px; color: var(--accent-deep); } .output { - margin-top: 12px; + margin-top: 8px; border: 1px dashed var(--border); border-radius: 12px; - padding: 10px; - background: rgba(255, 255, 255, 0.7); - min-height: 160px; - max-height: 240px; + padding: 8px; + background: var(--output-bg); + min-height: 210px; + max-height: 360px; overflow: hidden; } -pre { +.output-body { margin: 0; - white-space: pre-wrap; word-break: break-word; - max-height: 220px; + max-height: 340px; overflow-y: auto; - font-size: 12px; - line-height: 1.4; + font-size: 11px; + line-height: 1.45; +} + +.output-body h1, +.output-body h2, +.output-body h3, +.output-body h4 { + margin: 0 0 6px; + font-size: 13px; + letter-spacing: 0.3px; +} + +.output-body p { + margin: 0 0 8px; +} + +.output-body ul, +.output-body ol { + margin: 0 0 8px 18px; + padding: 0; +} + +.output-body li { + margin-bottom: 4px; +} + +.output-body blockquote { + margin: 0 0 8px; + padding-left: 10px; + border-left: 2px solid var(--border); + color: var(--muted); +} + +.output-body pre { + margin: 0 0 10px; + padding: 8px; + border-radius: 10px; + background: var(--code-bg); + overflow-x: auto; +} + +.output-body code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; + font-size: 11px; + background: var(--code-bg); + padding: 1px 4px; + border-radius: 6px; +} + +.output-body a { + color: var(--accent-deep); +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme]), + :root[data-theme="system"] { + --ink: #abb2bf; + --muted: #8b93a5; + --accent: #61afef; + --accent-deep: #56b6c2; + --panel: #2f343f; + --border: #3e4451; + --glow: rgba(97, 175, 239, 0.2); + --output-bg: rgba(47, 52, 63, 0.85); + --code-bg: #3a3f4b; + --page-bg: radial-gradient(circle at top, #2a2f3a, #21252b 60%, #1b1f25 100%); + --input-bg: #2b303b; + --input-fg: var(--ink); + --panel-shadow: 0 12px 30px rgba(0, 0, 0, 0.35); + color-scheme: dark; + } } .footer { display: flex; justify-content: flex-end; - margin-top: 10px; + align-items: center; + margin-top: 6px; } .link { @@ -157,5 +279,5 @@ pre { background: none; border-radius: 8px; color: var(--accent-deep); - font-size: 12px; + font-size: 11px; } diff --git a/popup.html b/popup.html index 02ed168..563e072 100644 --- a/popup.html +++ b/popup.html @@ -8,29 +8,35 @@