sdetProfile/css/base.css
Builder b596b2d608 Editor strip, Network/Console/Trace tabs, real Playwright tests, HC theme
UI:
- Editor tab strip above the report with per-spec scoping (sidebar tree,
  results, source, status counts, hero copy); cookie-persisted active spec
- Status pill + workers / headed overflow menu moved from topbar into the
  editor bar to slim the global chrome
- Summary stripe and pending-preview body so the report never lands empty
- Tag bar with first-6 + "+N more" + clear; auto-run first idle test on load
- Mobile drawer for the test explorer; keyboard shortcuts overlay (?)
- Skipped + failed sample tests with proper icons / step rendering

Tabs:
- Network tab: public git.levkin.ca repos rendered as Playwright-style
  GET ... 200 rows with expandable JSON bodies and repo links
- Trace tab: career timeline as a Gantt-style waterfall
- Console tab: live run events; Source tab regenerates per active spec

Theming:
- Wire up high-contrast (WCAG AAA) theme: cycle dark → light → hc → dark,
  widen theme cookie regex to accept "hc", add HC overrides for syntax
  tokens and a few hardcoded "text-on-accent" sites in app.css

Testing:
- Add @playwright/test dev dependency + playwright.config.ts on port 3173
- tests/portfolio.spec.ts: 37 specs across 12 describe blocks
- scripts/fetch-gitea-repos.mjs to refresh giteaRepos from the Gitea API

Docs / housekeeping:
- README rewritten to reflect editor strip, network tab, HC theme, test
  runner, and updated project structure
- IDEAS.md trimmed to remaining roadmap; shipped items removed
- .gitignore ignores stray PDFs at repo root (canonical resume in assets/)
- Add assets/ilia-dobkin-resume.pdf as the canonical resume binary

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 22:55:48 -04:00

159 lines
4.5 KiB
CSS

/* base.css — design tokens (Playwright trace viewer + VS Code dark+) */
:root {
/* Type */
--font-sans: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
--font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
--text-xs: 12px;
--text-sm: 13px;
--text-base: 14px;
--text-md: 15px;
--text-lg: 18px;
--text-xl: 22px;
--text-2xl: 30px;
--text-3xl: 44px;
--radius-sm: 4px;
--radius: 6px;
--radius-lg: 10px;
/* Easing */
--ease: cubic-bezier(.2,.7,.2,1);
/* Status semantic */
--pass: #4ec9b0; /* playwright/teal-green */
--pass-2:#2ea889;
--fail: #f48771;
--skip: #d7ba7d;
--info: #569cd6;
--run: #4ec9b0;
}
/* Dark (default) — Playwright trace viewer / VS Code dark+ */
:root[data-theme='dark'] {
--bg: #1e1e1e;
--bg-2: #181818;
--bg-3: #252526;
--panel: #1f1f1f;
--panel-2: #232323;
--line: #2d2d30;
--line-2: #3c3c3c;
--text: #e6e6e6;
--text-2: #c8c8c8;
--text-3: #9da0a4;
--text-4: #6e7177;
--accent: #4ec9b0;
--selection: #264f78;
--shadow: 0 2px 8px rgba(0,0,0,.4);
--hover: rgba(255,255,255,.04);
--active: rgba(255,255,255,.07);
--kbd-bg: #2d2d30;
--tag-bg: #2a2d2e;
--tag-fg: #9cdcfe;
--green-arrow: #4ec9b0;
--topbar-bg: #2d2d30;
--statusbar-bg: #007acc;
--statusbar-fg: #ffffff;
}
/* Light */
:root[data-theme='light'] {
--bg: #ffffff;
--bg-2: #f3f3f3;
--bg-3: #ececec;
--panel: #ffffff;
--panel-2: #f8f8f8;
--line: #e6e6e6;
--line-2: #d4d4d4;
--text: #1f1f1f;
--text-2: #393939;
--text-3: #616161;
--text-4: #8a8a8a;
--accent: #0c8a6f;
--pass: #098e6a;
--pass-2: #0c8a6f;
--fail: #c72e22;
--skip: #b07c1f;
--info: #2169b8;
--selection:#add6ff;
--shadow: 0 2px 8px rgba(0,0,0,.08);
--hover: rgba(0,0,0,.04);
--active: rgba(0,0,0,.06);
--kbd-bg: #ececec;
--tag-bg: #e8f0fe;
--tag-fg: #1a73e8;
--green-arrow: #098e6a;
--topbar-bg: #f3f3f3;
--statusbar-bg: #007acc;
--statusbar-fg: #ffffff;
}
/* High Contrast — WCAG AAA (every text token ≥ 7:1 against --bg).
* Colors picked from the Windows / VS Code HC palette: pure black canvas,
* pure-white prose, yellow as the universal accent, lime/red/cyan for
* pass/fail/info so the three are still distinguishable for protanopia. */
:root[data-theme='hc'] {
--bg: #000000;
--bg-2: #000000;
--bg-3: #0a0a0a;
--panel: #000000;
--panel-2: #0a0a0a;
--line: #ffffff;
--line-2: #ffffff;
--text: #ffffff; /* 21:1 */
--text-2: #ffffff; /* 21:1 — no muting; AAA prose */
--text-3: #e6e6e6; /* 18:1 */
--text-4: #c0c0c0; /* 12.6:1 */
--accent: #ffff00; /* 19.6:1 — the one yellow */
--pass: #00ff00; /* 15.3:1 */
--pass-2: #00ff00;
--fail: #ff8585; /* 9.5:1 */
--skip: #ffd700; /* 16.4:1 */
--info: #7fd5ff; /* 11.7:1 */
--run: #00ff00;
--selection:#ffff00; /* paired with black text via override below */
--shadow: 0 0 0 1px #ffffff;
--hover: rgba(255,255,255,.18);
--active: rgba(255,255,255,.30);
--kbd-bg: #000000;
--tag-bg: #000000;
--tag-fg: #ffff00;
--green-arrow: #00ff00;
--topbar-bg: #000000;
--statusbar-bg: #ffff00;
--statusbar-fg: #000000;
}
:root[data-theme='hc'] ::selection { background: #ffff00; color: #000000; }
/* AAA also requires every interactive control to expose a visible focus
* indicator; force a 3px yellow outline on every focused element in HC,
* overriding the `outline: 0` declarations sprinkled through app.css. */
:root[data-theme='hc'] :focus-visible {
outline: 3px solid #ffff00 !important;
outline-offset: 2px;
}
* { box-sizing: border-box; }
html, body { height: 100%; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--font-sans);
font-size: var(--text-base);
line-height: 1.55;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
::selection { background: var(--selection); color: var(--text); }
button { font: inherit; color: inherit; }
input { font: inherit; color: inherit; }
a { color: inherit; text-decoration: none; }
code, pre, .mono { font-family: var(--font-mono); }
/* Scrollbar */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 6px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-4); }