diff --git a/extension/src/popup/components/__tests__/settings-nav.test.ts b/extension/src/popup/components/__tests__/settings-nav.test.ts new file mode 100644 index 0000000..544665c --- /dev/null +++ b/extension/src/popup/components/__tests__/settings-nav.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect, vi } from 'vitest'; + +vi.stubGlobal('chrome', { + storage: { + local: { + get: vi.fn((_keys: unknown, cb: (r: Record) => void) => cb({})), + set: vi.fn((_data: unknown, cb?: () => void) => cb?.()), + }, + }, +}); + +import * as settingsMod from '../settings'; + +describe('settings module contract', () => { + it('exports renderSettings as a function', () => { + expect(typeof settingsMod.renderSettings).toBe('function'); + }); + + it('exports teardownSettings as a function', () => { + expect(typeof settingsMod.teardownSettings).toBe('function'); + }); +}); diff --git a/extension/src/popup/styles.css b/extension/src/popup/styles.css index ee28b08..21226d1 100644 --- a/extension/src/popup/styles.css +++ b/extension/src/popup/styles.css @@ -1699,3 +1699,92 @@ textarea { .relicario-toast--error { background: #4a1f1f; color: #f0afaf; border: 1px solid #ab2b20; } .relicario-toast--info { background: #1f2d4a; color: #afc8f0; border: 1px solid #1f6feb; } .type-card__desc { font-size: 10px; color: var(--text-muted, #8b949e); margin-top: 2px; } + +/* === Settings layout === */ +.settings-layout { + display: flex; + height: 100%; + overflow: hidden; +} + +.settings-nav { + width: 148px; + min-width: 148px; + border-right: 1px solid var(--border, #30363d); + padding: 12px 0; + overflow-y: auto; + flex-shrink: 0; +} + +.settings-nav__group-label { + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-muted, #8b949e); + padding: 8px 12px 4px; +} + +.settings-nav__item { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + padding: 7px 12px; + background: transparent; + border: none; + cursor: pointer; + font-size: 13px; + color: inherit; + text-align: left; +} + +.settings-nav__item:hover { background: var(--bg-hover, #161b22); } +.settings-nav__item--active { background: var(--bg-selected, #1c2d41); } + +.settings-nav__icon { font-size: 14px; flex-shrink: 0; } + +.settings-content { + flex: 1; + overflow-y: auto; + padding: 20px 24px; + min-width: 0; +} + +.setting-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + padding: 12px 0; + border-bottom: 1px solid var(--border-subtle, #21262d); +} + +.setting-row:last-child { border-bottom: none; } + +.setting-row__info { flex: 1; } +.setting-row__title { font-size: 13px; font-weight: 500; } +.setting-row__desc { font-size: 11px; color: var(--text-muted, #8b949e); margin-top: 2px; } +.setting-row__control { flex-shrink: 0; } + +.settings-section-title { + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-muted, #8b949e); + margin: 0 0 12px; + padding-bottom: 6px; + border-bottom: 1px solid var(--border, #30363d); +} + +.setting-card { + padding: 12px 16px; + border-radius: 6px; + border: 1px solid var(--border, #30363d); + margin-bottom: 12px; +} + +.setting-card--ok { border-color: var(--success, #238636); background: rgba(35, 134, 54, 0.06); } +.setting-card--warn { border-color: var(--gold, #b8860b); background: rgba(184, 134, 11, 0.06); } + +.setting-card__status { font-size: 13px; margin-bottom: 8px; } +.setting-card__actions { display: flex; gap: 8px; }