Skip to content

feat(web): редизайн UI под маску эпика #123 + режим «Сравнение»#234

Merged
ArtVsMark merged 3 commits into
mainfrom
feat/web-redesign-mask-123
Jul 9, 2026
Merged

feat(web): редизайн UI под маску эпика #123 + режим «Сравнение»#234
ArtVsMark merged 3 commits into
mainfrom
feat/web-redesign-mask-123

Conversation

@ArtVsMark

Copy link
Copy Markdown
Owner

Summary

Редизайн визуального слоя (src/stepik_grader/web/static/) под эталонный макет web-mvp-mask.html, приложенный владельцем к issue #123 ("Сайт должен быть аналогичен этому! Перепроверь!!!"), плюс новый режим «Сравнение» (Compare).

  • Дизайн-токены: палитра "Hydra" (light/dark), Inter + JetBrains Mono — перенесены дословно из макета.
  • Layout: grid-based .app-shell (topbar 48px + sidebar 220px + main) вместо flex + resizable-дивайдеров. Sidebar — навигация разделов (Проверка решений / Загрузчик задач-заглушка под feat(web): добавить Downloader workflow для загрузки тестов Stepik #186 / Глоссарий / Настройки-заглушка); История/Недавние пути переехали в левую панель "Конфигурация".
  • Mode row: 4 кнопки — Сравнение / Тесты / Bench / Microbench-заглушка под feat(web): добавить microbench / режим 4 в WEB UI #187.
  • Split-pane: 2 колонки вместо 3 панелей — ErrorCard detail panel (action cards) переехала во вкладку "Детали" правой панели "Результаты", рядом с новыми вкладками "Лог"/"Эталон".
  • Режим «Сравнение» (Compare) — реализован полностью: grade_benchmark(reference=...) ранжирует относительно указанного локального файла (новые вердикты REFERENCE/FASTER поверх существующих SIMILAR/SLOWER/MUCH_SLOWER), не резолвится → тихий fallback на обычное ранжирование. core/microbench_runner.apply_relative_ranking (общий с CLI) не тронут — новая логика в web-only _apply_reference_ranking().
  • Импорт эталонного решения со Stepik (issue ✨ [Feature] feat(stepik): полуавтоматический импорт закреплённого решения из saved JSON через target page #55, переоткрыт) — отдельный, не связанный механизм, не входит в этот PR.
  • Вся функциональность feat(web): реализовать рабочую область проверки решения #125 (command palette, ErrorCard, action cards, сценарные кнопки, раздел «Глоссарий» с backlog) сохранена без изменений в логике — только новая разметка/классы.
  • Побочный фикс: display=swap у Google Fonts вызывал layout shift после первой отрисовки (кнопки меняли ширину при подмене шрифта, из-за чего клик по "Запустить" иногда попадал на соседнюю кнопку режима) — заменено на display=optional.

Test plan

  • pytest tests/ -x -q --tb=short — 875 passed (37 pre-existing subprocess-related failures на этой машине, идентичные на main)
  • ruff check . / ruff format --check . — чисто
  • mypy src/stepik_grader --ignore-missing-imports — чисто
  • Ручная проверка через запущенный сервер (browser preview): light/dark темы, sidebar 220px без resize, split-pane 1fr 1fr, шрифты (сеть подтверждена), режим Сравнение end-to-end (REFERENCE/FASTER/MUCH_SLOWER вердикты, вкладка "Эталон" с исходником), мобильный коллапс
  • CHANGELOG.md — запись под [Unreleased]

🤖 Generated with Claude Code

ArtVsMark and others added 3 commits July 9, 2026 17:11
Приводит визуальный слой (static/{index.html,app.css,app.js}) в соответствие
эталонному макету web-mvp-mask.html, приложенному владельцем к issue #123
("Сайт должен быть аналогичен этому! Перепроверь!!!"). Backend-контракт не
меняется — это чисто фронтенд-редизайн поверх уже реализованного #125.

- Design-токены: палитра "Hydra" (light/dark), Inter + JetBrains Mono,
  radius/shadow/space/text-scale — перенесены дословно из макета.
- Layout: grid-based .app-shell (topbar 48px + sidebar 220px + main) вместо
  flex + resizable-дивайдеров. Resize убран сознательно — макет фиксирует
  ширины без единого drag-handle, точное соответствие важнее гибкости.
- Sidebar: навигация разделов (Проверка решений/Загрузчик задач-заготовка
  под #186/Глоссарий/Настройки-заглушка) вместо переключателя в topbar;
  История/Недавние пути переехали в левую панель "Конфигурация".
- Mode row: 4 кнопки (Сравнение/Тесты/Bench/Microbench-заготовка под #187)
  вместо 2-кнопочного сегмента.
- Split-pane: 2 колонки вместо 3 панелей — ErrorCard detail panel и action
  cards переехали во вкладку "Детали" правой панели "Результаты" (рядом с
  новыми вкладками "Лог"/"Эталон", пока как заглушки/зависящие от Compare).
- Новые UI-примитивы (renderVerdict/kpiGrid/codeBlock/skeletonBlock)
  переиспользуются в renderTests/renderBench/renderDetailPanel.
- Fix: display=swap у Google Fonts вызывал layout shift после первой
  отрисовки (кнопки meняли ширину при подмене шрифта), из-за чего клик по
  "Запустить" мог попасть на соседнюю кнопку режима — заменено на
  display=optional.

Вся функциональность #125 (палитра, ErrorCard, action cards, сценарные
кнопки, раздел «Глоссарий» с backlog) сохранена без изменений в логике —
только новая разметка/классы. Полная регрессия tests/test_web.py +
tests/test_web_glossary.py (54 теста, включая 4 source-grep на буквальные
JS-паттерны) проходит без правок. Визуально сверено с макетом через
browser preview (light/dark, sidebar 220px, split-pane 1fr 1fr, шрифты,
мобильный коллапс).

Режим "Сравнение" (Compare) — фронтенд готов (ref-input, mode-row, вкладка
"Эталон"), backend reference-ranking — следующий коммит.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
grade_benchmark() принимает необязательный reference (путь или имя файла
среди уже найденных решений). Резолвится — ранжирование считается
относительно него, а не самого быстрого решения: вердикты REFERENCE (сам
эталон) / FASTER / SIMILAR / SLOWER / MUCH_SLOWER, реализовано новой
_apply_reference_ranking() в web/viewmodels.py, core/microbench_runner.py
не тронут (общий код с CLI, jёстко берёт min() как базу — параметризовать
ради одного web-сценария не стоило). Ответ дополняется reference_source/
reference_file для вкладки "Эталон".

Не резолвится (опечатка/чужой файл) — тихий fallback на обычное
ранжирование, как если бы reference не передавали, а не ошибка.

/api/grade пробрасывает query-параметр reference в grade_benchmark();
mode остаётся "bench" — новый mode= для Compare не вводится, режим
разруливается на фронтенде (issue #123-redesign).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…HANGELOG

- docs/web-mvp.md: заметка о выполненном редизайне (design-токены, grid
  layout из web-mvp-mask.html) и новом режиме «Сравнение» (reference-
  ranking), с явным разграничением от issue #55 (импорт эталона со Stepik
  — отдельный, не связанный механизм).
- CHANGELOG.md [Unreleased]: запись под Added описывает редизайн и Compare.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@ArtVsMark ArtVsMark merged commit cc29baf into main Jul 9, 2026
9 checks passed
@ArtVsMark ArtVsMark deleted the feat/web-redesign-mask-123 branch July 9, 2026 14:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant