# Venue R2 · Owner amendment Локальный интерактивный дизайн для #507 / #526 / узких findings #549. **Не реализация продукта, не DEV release и не Owner UAT.** Source/runtime не менялись. Публикация не выполнялась. Визуальная проверка Root — **PENDING**. Открыть `index.html` через localhost из этой папки: `python3 -m http.server 8765 --bind 127.0.0.1`. Прямое file:// может ограничивать взаимодействие с iframe. Внешние запросы и отправка форм запрещены CSP; контакты показываются локальным диалогом. Все операции — локальные примеры в памяти. Перезагрузка их сбрасывает. ## Что смотреть - `index.html?surface=players&width=390` и `?surface=games&width=390`: идентичный CTA. Один finder zone; Swipe над Map CTA у Players. В приложении сохраняются существующие Radar auth/activation/privacy guards и visualViewport/nav positioning. Пример не запрашивает геолокацию и не показывает Radar-пины. Гостевой вход Players в карту показывает auth-пример. - `?surface=map&width=390`: компактный лист без rating/discussion/review action strips; фото, имя, адрес, краткая сводка и ближайшая игра; раскрытие стрелкой/handle и вертикальным жестом. - `?surface=map-expanded&width=390&state=own`: название → фото/описание → контакты/сайт → доступ к расписанию → inline звёзды → раскрытое обсуждение → отдельные публичные отзывы. - `?surface=map-expanded&width=1280&state=populated`: тот же communityR2 в inspector 450 px, весь composer занимает доступную ширину. - `?surface=map-expanded&width=430&state=long`: длинное обсуждение. Внешняя кнопка «К последнему содержимому» показывает последний блок и footer одновременно. - `?surface=map-expanded&width=390&state=long&text=200`: увеличенный текст, переносы, прокрутка, footer. Это text-size stress fixture, не утверждение об OS zoom. - `?surface=map-expanded&width=390&height=520`: уменьшенная видимая область как геометрический пример клавиатуры. Настоящая мобильная клавиатура требует проверки Root на устройстве. Внешние варианты раскрываются через details. Они явно перезапускают фикстуру; внутри продукта draft/UNKNOWN защищают закрытие, создание и переход на страницу. Выбор звезды не отправляет голос. Отправка фикстуры не означает server write. Жалоба открывает прежний R2 диалог, Escape возвращает фокус. Свои comment edit/delete/report и права гостя остаются из R2. UNKNOWN нельзя переотправить из этого amendment: показана остановка до существующего reconciliation. Смена actor скрывает приватное состояние, отменяет локальный callback через epoch; идентификатор незавершённой операции остаётся в `amendmentState().quarantinedOperation`, без переноса payload новому actor. Это демонстрация, не замена production protocol. На полной странице используются те же `rating()/discussion()/reviews()`. Возврат восстанавливает выбранную площадку, раскрытие и scroll. Публичные postgame reviews только читаются. Написание отзыва остаётся в существующем входе результатов **точной eligible game**; R2 fixture results/composer сохранены, новый venue-wide composer не добавлен. B compatibility не объявляется установленной. ## Минимальный handoff | Задача | Существующий компонент | Изменение presentation | |---|---|---| | Общий Map CTA | `GamesViewAction` / `FoldedMapGlyph` | Убрать только geometry overrides Players; оставить shared styling, JSX, labels, handlers и наблюдение nav/visualViewport | | Компактный лист | `VenuePreviewCard`, `VenuePopup` | Удалить три community-ссылки; сохранить cover, summary, schedule hint, morph/handle и expand | | Раскрытая площадка | `VenueSheet`, `DesktopMapInspector` | Одна scroll body после контактов содержит `VenueCommunityContent embedded`; без jump-nav, без дублирования community owner | | Сообщество | `VenueCommunityRating`, `CommentsSection`, `VenuePage` | Общие шкала 1–5, allowedActions, own/report rights, model/version/reconciliation; адаптировать только плотность контейнера | | Create / schedule | `VenueSheet`, existing create/game views | Create всегда в footer информации; расписание отдельно в body, детали игры доступны; существующий create flow и permission checks неизменны | **MapCTA contract:** `radar-geographic.css:86`: min-height 48 px, min-width 190 px, padding 6px 16px 6px 6px; tile 36 px, purple `FoldedMapGlyph` 24 px. При border-box фактическая высота с 36px tile + 12px padding + 2px border может быть 50px: не ужимать icon ради числа 48. Одинаковая фактическая геометрия в обоих местах важнее ошибочного фиксированного height. В `player-browse.css:1513` оставить in-flow wrapper/one finder zone; в `:1524` убрать min-height:44/min-width:0. Не заменять shared component logic. SVG в HTML — локальное представление folded-map; production обязан сохранить настоящий `FoldedMapGlyph`, а не импортировать этот рисунок. **Footer:** flex column host; единственный `flex:1; min-height:0; overflow-y:auto` body; footer `flex:none` вне scroll body. Он физически резервирует свою высоту, включая wrap и safe-area — последний контент не под ним. Mobile inset `max(24px demo, env(safe-area-inset-bottom))`; actual app использует свой safe-area token без постоянной demo-прибавки. На map существующий fullscreen shell скрывает main nav (source-proven); на list finder остаётся над nav. Desktop footer тот же в 450px inspector. В keyboard viewport уменьшать доступную высоту host существующим viewport mechanism; не накладывать второй fixed CTA. Footer create только в информационном представлении, в create/game subviews сохранить штатные footer/back/focus contracts. **Mount / state:** свернутое представление может скрывать/inert expanded subtree, но не размонтировать pending community owner. Сохранить `VenueCommunityContent` keyed selected venue ID, `onUnresolvedChange` aggregation, actor/CSRF boundaries, async response fencing, auth return path и report target. Prototype хранит модель в памяти при re-render; production не копирует способ рендера этого HTML. Пересечение 1024px breakpoint не создаёт второго owner. Не копировать demo header/logo/nav вместо ConsumerShell; они только контекст предыдущего R2. ## #549 reconciliation | Finding | Решение | |---|---| | D1 MEDIUM | Полноширинный composer внутри narrow inspector; label и textarea на всю строку, actions следующей строкой, ≥44px. В source scope `.gb-venue-community--embedded .gb-comments__composer` использовать single-column или container query; не viewport-only desktop 3-column. Не менять широкую standalone layout без нужды. | | D2 LOW | Старый action-strip affordance superseded новым прямым Owner решением там, где strip удалён, включая expanded inspector. Не удалять сами rating/comments/reviews. | | D3 LOW | Applicable: `.gb-venue-community__report-trigger.gb-c23-btn`, не `.gb-button`; ghost label flush с текстовой границей, min-height/min-width 44px. | | D4 LOW | Compact after-game action removed; перенос старой кнопки superseded. Preview info + expansion остаются. | | D5 LOW | Вне дизайна: только будущая ordinary release metadata, историю установленной версии не переписывать. | ## Provenance / STYLE_GUIDE_PARITY Source pin **972ecc6229537db7603475919b70aa1cc4f39811**, release71 candidate; installed status Root-controlled, здесь не проверялся. `source-citations.json` содержит точные 17 blob pins и SHA256 входных сведений. Read-only bounded-source-findings и #549 captured triage — source evidence, не новый live repro. Ранние PASS из prior-r2-browser-handoff к этому amendment не переносятся. Guide: frozen spec **487a8379ff31c88a95d0f0f130dad7c78f7af6f2**, локальная read-only копия `/opt/gobadminton-clean-qa/style-guide`; StyleGuide / ConstructionKit в `src/App.tsx`, токены из предыдущего R2: Onest, ink #13221a, paper #f5f6f2, lime #a7f447, purple #7945de, line #dfe4dc. Source policy: https://nougat-wise-76949869.figma.site/#guide и #construction-kit. Need → family → component: primary pill → Button primary → footer; ghost → Button ghost → report; form → shared field → CommentsSection; surface/overlay → existing sheet → VenueSheet. **OWNER_VISUAL_OVERRIDE:** удаление community action strips и постоянный create footer, прямое задание этого amendment. Новый framework не нужен. Адаптированы предоставленные prior-r2 app/styles/prototype. Предыдущие артефакты и Radar R2 не изменены. Официальное фото: **«Фото: Golden Shuttle — зал Unischool»**, https://goldenshuttle.ru/, venue ID `84603a7c-5160-595e-b52e-f242e826585c`, сохранённый source `/v1/media/venue-covers/24282321f10023d4a457e3994d76dea03ae4b75149d45764660ae1ce23b3f16b.png`; catalog `badminton4u.ru`, `B4U-V-B8BB6677`, club https://badminton4u.ru/clubs/283. Public artifact не содержит private Owner screenshots, их avatars/имена/текст/координаты. Официальные название/адрес/контакт относятся только к разрешённому Unischool source. Остальной populated content синтетический и подписан снаружи frame. ## Реальная проверка `node --check` app.js и preview.js выполнен. Браузерные executable и Playwright/Puppeteer в доступной среде не найдены. PNG не создавались; browser PASS, keyboard PASS и visual approval не заявлены. `validation-receipt.json` фиксирует только фактические проверки. Root захватывает перечисленные размеры, проверяет scroll-last/footer, CTA parity, report focus/Escape и guards, затем публикует reviewed whitelist. **Independent QA / CI / DEV / UAT = NOT_TESTED**. Дополнительный Owner approval gate не добавлен.