Appearance
04. Evidence и test baseline
Provenance
| Поле | Значение |
|---|---|
| Repository | /Users/uladzislau/Documents/pets/bike-maps |
| Commit | aabfa583cf3949ecfc5243e93071599244b4a85d |
| Commit subject | fix(web): enrich imported GPX surfaces |
| Дата/timezone | 2026-07-18, Asia/Tbilisi |
| Node | v24.17.0 |
| pnpm | 9.0.0 |
| Playwright package | 1.59.1 |
| Browser | system Google Chrome 150.0.7871.127 через channel chrome |
| App URL во время probes | local Vite dev server |
| Основной probe viewport | 390×844; дополнительные widths 320/360/375/412 |
Dirty tree до и после baseline audit
До создания этой папки уже существовали пользовательские изменения:
text
M apps/web/tests/manual-trip-editor.spec.ts
M package.json
M pnpm-lock.yaml
?? screenshot.ts
?? take_responsive_screenshots.cjs
?? take_responsive_screenshots.tsОни не редактировались в рамках документирования. Новый diff должен состоять только из канонической папки docs/audits/main-map-2026-07/**, публикуемой копии raw JSON в docs/public/audits/main-map-2026-07/** и одной навигационной ссылки в docs/WIKI.md поверх указанного pre-existing dirty state.
Исходные отчёты
| Источник | SHA-256 | Состояние хранения |
|---|---|---|
/Users/uladzislau/.codex/attachments/e71bb2b7-a213-4748-b963-35d8f39165ed/pasted-text.txt | 311f226ee7a7c507d0d25bb13f0fd695bea299cfc2eba4a4e81fd65fee43f9cb | Codex attachment, вне repository |
/Users/uladzislau/.codex/attachments/83d9b3d1-4c2e-46b0-99d5-3c7528f5738f/pasted-text.txt | 15c0729c6a58bcdc25c8e617096f91bfd6017741a60898826fbcb4a534e17aa1 | Codex attachment, вне repository |
| Expert UX & UI Heuristic Audit из user message | не применимо | сохранён по смыслу в reconciliation; отдельного файла attachment не было |
Хэши позволяют проверить, что при будущей сверке читаются те же два вложения.
Выполненные test suites
Layout/toolbar baseline
bash
PLAYWRIGHT_BROWSER_CHANNEL=chrome \
pnpm --dir apps/web test:e2e -- \
tests/map-layout.spec.ts \
tests/responsive-map-controls.spec.ts \
tests/toolbar-fsm.spec.tsРезультат: 3 passed, 3.4s.
Интерпретация: существующие assertions зелёные, но не проверяют cross-surface overlap между toolbar и MapLibre и между Changelog и drawer actions. Поэтому PASS этого запуска совместим с подтверждёнными дефектами.
Screenshot capture/context-menu baseline
bash
PLAYWRIGHT_BROWSER_CHANNEL=chrome \
pnpm --dir apps/web test:e2e -- \
tests/visual-regression-audit.spec.ts \
tests/visual-context-menu-overlap.spec.tsРезультат: 3 passed, 16.4s.
Интерпретация: specs успешно создали screenshots и выполнили interaction assertions. visual-regression-audit.spec.ts использует page.screenshot(), но не toHaveScreenshot()/image diff. Это capture PASS, а не доказательство отсутствия visual regressions. В console наблюдалось предупреждение об autocomplete у input; оно не было assertion failure и отдельно не расследовалось.
Что в этом baseline не запускалось
- весь Playwright suite;
waypoint-interactions.spec.tsи заявленный strict-mode failure;- Firefox и WebKit;
- axe-core/Lighthouse automated run с сохранённым raw report;
- physical iOS/Android device;
- полный Tier A–D audit matrix;
- production backend/network/tile behavior;
- screen reader VoiceOver/NVDA manual session.
Ни один из этих пунктов нельзя помечать PASS по умолчанию.
Runtime geometry — верхняя зона
Высота viewport во всех portrait измерениях — 844px.
| Width | Top row right | Полностью внутри | Color внутри | Пересечение с Zoom In | Кто сверху в центре Zoom |
|---|---|---|---|---|---|
320 | 388.7 | no | no | 1108.4 px² | toolbar Gradient child |
360 | 388.7 | no | no | 1108.4 px² | toolbar SVG child |
375 | 388.7 | no | no | 1108.4 px² | toolbar Color child |
390 | 388.7 | yes, почти без запаса | yes | 1108.4 px² | toolbar Color child |
412 | 388.7 | yes | yes | 707.4 px² | custom color button |
Постоянные measured boxes:
- top row:
x=12,y=12,376.7×32.6; - Color:
x=321.4,y=15,64.3×26.6; - Zoom In:
34×34,y=11, привязан справа (x = viewportWidth - 45).
Вывод: на 390px toolbar формально помещается, но занимает место MapLibre control. На 320–375px добавляется собственный containment failure top row. Из-за overflow: hidden документа page scrollWidth не раскрывает эту проблему; проверять нужно bounding boxes и hit-test.
Runtime geometry — нижние mobile collisions
Loop drawer
| Element | Box |
|---|---|
| Changelog | x=16, y=796, 32×32 |
| Generate | x=13, y=794, 364×37 |
| Intersection | 1024 px² |
Changelog полностью лежит внутри vertical/horizontal bounds Generate в своей области. Hit-test в центре Changelog возвращает его SVG descendant, то есть верхний control перехватывает interaction.
Search drawer
| Element | Box |
|---|---|
| Changelog | x=16, y=796, 32×32 |
| Reverse | x=13, y=768, 93.1×32 |
| Intersection | 128 px² |
Это частичное пересечение верхней полосы Changelog с нижней полосой Reverse.
SaveModal semantics и focus
Accessibility tree содержит:
text
dialog "Save Track"
heading "Save Track" level=2
button "Close"
textbox "Track name"
textbox "Description"
...
button "Cancel"
button "Save"Runtime facts:
| Проверка | Результат |
|---|---|
| Dialog role/name | PASS — dialog "Save Track" |
aria-modal | PASS — присутствует |
| Initial focus | PASS — INPUT#track-name внутри dialog |
| Forward focus containment | FAIL — выход после 14 Tab transitions |
| Background inert | FAIL по keyboard behavior |
| Escape topmost only | FAIL — закрыты dialog и Route Builder |
| Focus restoration | не подтверждено; должно войти в regression test |
Accessibility tree и focus order
Route color group
text
group "Route color mode"
text "Route color mode"
button "Surface" pressed
button "Color route by slope percentage": Gradient
button "Select custom route line color": ColorСледствия:
- group name существует; claim о missing legend/label опровергнут;
- accessible name Gradient не содержит visible label
Gradient; claim label-in-name подтверждён; - одновременно присутствуют
aria-labelи hidden legend, что может быть избыточно, но не является missing semantics.
Changelog
Accessibility snapshot:
text
button "What's New (Changelog)"Имя получается из title; кнопка не безымянна. Явный aria-label допустим как robustness improvement, но не должен маскировать реально подтверждённые a11y issues.
Первые focus stops
MapZoom inZoom outDrag to rotate map, click to reset northToggle attributionMapLibreRouting profileSurfaceColor route by slope percentageSelect custom route line colorClose color selectionSunset Gold
Это подтверждает порядок, но не keyboard trap. Классификация — heuristic/efficiency issue до утверждения desired focus architecture.
Target sizes
Fine pointer baseline
| Control group | Measured hit box |
|---|---|
| Search/Loop/Save tools | 32×32 |
| MapLibre navigation | 34×34 |
| Library/Garage/Changelog | 32×32 |
| Logout mobile icon | 24×24 |
| Profile/Surface/Gradient/Color | около 26px по высоте |
| Color swatches | 16×16, gap около 4px |
Coarse pointer baseline
| Control | Measured box |
|---|---|
| Search | 44×44 |
| Loop | 44×44 |
| Save | 44×44 |
| Zoom In | 34×34 |
| Routing profile | 104×26 |
| Surface | 77×26.6 |
| Gradient | 81.4×26.6 |
| Color | 64.3×26.6 |
| Library/Garage | 32×32 |
| Logout | 24×24 |
| Changelog | 32×32 |
| Color swatch | 16×16 |
Примечание: tools row горизонтально scrollable; координата конкретного элемента за правой границей при одном scroll position не означает, что control навсегда недоступен. Таблица здесь используется для размера hit area, а не для containment verdict.
Contrast sample
Logout sample:
text
foreground: #939ab7
background: #585b70
contrast ratio: 2.40:1
required for normal text: 4.5:1Это подтверждает конкретный failure, но не является полным contrast audit всей карты.
Static code evidence
Ключевые места на baseline commit:
apps/web/src/pages/map/MapPage.tsx— общий Escape handler; MapCanvas расположен в DOM до primary toolbar; raw color classes top-right/Changelog;apps/web/src/pages/map/MapPage.module.css—100vh, mobile offsets, bottom-left control;apps/web/src/widgets/floating-toolbar/FloatingToolbar.tsx— корректно именованный fieldset и некорректное Gradient accessible name;apps/web/src/widgets/floating-toolbar/FloatingToolbar.module.css— top row без wrap, scrollable tools row, target sizing, raw dropdown layer, infinite pulse;apps/web/src/widgets/save-modal/SaveModal.tsx— dialog semantics и initial focus есть, containment/restore contract отсутствует;apps/web/src/widgets/user-menu/UserMenu.module.css— Logout colors и mobile24×24;apps/web/src/widgets/floating-toolbar/ExportModal.module.css— overlay на--z-toast;apps/web/src/widgets/project-stage-hud/ProjectStageHUD.module.css— rawz-index: 1000;apps/web/src/widgets/map-canvas/ui/MapPopups.module.css— raw950/1100, small controls и raw overlay;apps/web/src/styles/tokens.css— текущая z scale и theme colors.
Raw literal scanner
Запуск audit_color_literals.py для apps/web/src относительно tokens.css дал:
30colors в token source;455known-token-value literals вне token source;226unknown literals.
Эти числа — search candidates, а не 681 автоматически валидный defect. Требуются категории исключений: map/data ramps, third-party/brand, SVG/generated assets, comments/tests и semantic one-offs.
Screenshot inventory
Current Playwright output в repository worktree
Capture folders:
apps/web/test-results/visual-regression-audit-Au-23d64-capture-desktop-screenshots-chromium/— 8 desktop PNG;apps/web/test-results/visual-regression-audit-Au-84f68--capture-mobile-screenshots-chromium/— 5 mobile PNG;apps/web/test-results/visual-context-menu-overla-3bdc2-u-and-map-popup-exclusivity-chromium/— before/after PNG.
test-results обычно временный и может быть очищен следующим run; эти файлы не являются долговременным versioned evidence.
Внешний evidence отчёта B
Папка существует:
text
/Users/uladzislau/.gemini/antigravity/brain/ed0b3a96-41da-4a50-b389-b18da64f9463/В ней 24 PNG: desktop/tablet/mobile × dark/light × idle/draw/loop/search. Это наиболее полная историческая screenshot matrix, но она находится вне repo.
Внешний evidence отчёта C
Существуют три PNG:
text
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/desktop-layout.png
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/search-panel.png
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/poi-action.pngОни также вне repository. Перед очисткой .gemini важные before/after screenshots следует скопировать в согласованное versioned или artifact storage; в этой документальной фазе копирование не выполнялось.
Ограничения и уровень уверенности
| Область | Уверенность | Ограничение |
|---|---|---|
| Mobile top collision | высокая | Chromium emulation; не physical device |
| Drawer/Changelog collision | высокая | Точная geometry и hit-test на 390×844 |
| SaveModal focus/Escape | высокая | Direct keyboard probe и accessibility tree |
| Gradient semantics | высокая | Current accessibility snapshot |
| Logout contrast | высокая для одного state | Не весь component state/theme matrix |
| Safe-area/dynamic chrome | средняя | Static evidence; нужен real Safari/Android |
| Reduced motion | средняя-высокая | Static styles; полный runtime inventory не выполнен |
| Z-index conflicts | средняя | Scale violation есть; pairwise runtime collisions не все проверены |
| Full release readiness | неполная | Полный Tier A–D, browsers и real device не прогнаны |
Машиночитаемая версия ключевых runtime измерений: geometry-baseline.json. Source-файл находится в docs/public/audits/main-map-2026-07/evidence/, чтобы VitePress публиковал JSON без преобразования.