From 8451bb352d135038e7d6850301e3aea3c28a9bf0 Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Tue, 28 Jul 2026 22:09:59 +0300 Subject: [PATCH] Docs: sync Front#40 Mood AppShell + week scroll. Fixes EventHub/EventHubSpec#17 Refs EventHub/EventHubFront#40 (7c092d1 / db11c41). --- EventHubFrontSpec.md | 26 +++++++++++++++----------- UX-BACKLOG.md | 10 +++++++++- WORKFLOW.md | 1 + design/front/UI-PARITY.md | 26 +++++++++++++++++--------- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/EventHubFrontSpec.md b/EventHubFrontSpec.md index 7491d00..f304895 100644 --- a/EventHubFrontSpec.md +++ b/EventHubFrontSpec.md @@ -57,12 +57,16 @@ Deep-link на календарь, владельцем которого явл Время на list-карточках — вторичное к title (`.eh-book-list-time`). - В **Ещё**: язык (`LanguageSwitcher`); пункт входящих specialist invites скрыт при `pending=0`; при `pending > 0` — badge со счётчиком (deep-link `/invites` работает). - **Mood в Ещё нет** — только chip в chrome workspace календаря (Front#39). -- **Mood + Lens (workspace, Front#39):** в chrome календаря — mood chip (FLOW/MOMENTUM/ - CONTROL → sheet picker); отдельно lens «Обзор / Сегодня / Записи» (desktop segment / - mobile sheet); над сеткой — collapsible lens strip (Front-only derive из уже - загруженных events/bookings). Без flip календаря; без 4-го CREATOR. Strip по - умолчанию раскрыт на desktop, свёрнут на mobile. Нет на HTML-архиве месяца. + **Mood в Ещё нет** — chip в AppShell рядом с BrandWordmark (Front#40; ранее Front#39 + в chrome workspace). +- **Mood + Lens (Front#39/#40):** mood chip (FLOW/MOMENTUM/CONTROL → sheet picker) — + в **AppShell** рядом с логотипом (**не** в toolbar Month/Week/Day). Отдельно lens + «Обзор / Сегодня / Записи» (desktop segment / mobile sheet); над сеткой — + collapsible lens strip (Front-only derive из уже загруженных events/bookings). + Без flip календаря; без 4-го CREATOR. Strip по умолчанию раскрыт на desktop, + свёрнут на mobile. Нет на HTML-архиве месяца. +- **Week view (Front#40):** одна строка day-headers (без дубля заголовков + `WeekDayColumn`); горизонтальный скролл через `.eh-cal-week-scroll` (mobile ~390). - Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). Чужой `personal` — только просмотр; чужой `commercial` с `booking_open=true` — запись; при `booking_open=false` (restricted / нет подписки владельца) — просмотр + сообщение «Запись временно недоступна». @@ -88,8 +92,8 @@ Deep-link на календарь, владельцем которого явл discovery tops без ухода из Popular; в строке результата — id snippet и `calendar_title` для event. - CRUD своих календарей — `/calendars` (из «Ещё»). Legacy `/discover`, `/calendars/:id` → redirects. - На мобиле — bottom tab bar (+ safe-area); на desktop — **одна строка** chrome: - logo | nav tabs | nickname + logout (не два ряда header+nav). Сырой email в chrome - не показывать — primary identity = `nickname` (fallback без `@`). + logo + mood chip | nav tabs | nickname + logout (не два ряда header+nav). Сырой email + в chrome не показывать — primary identity = `nickname` (fallback без `@`). Nav `aria-current` синхронизирован с `useLocation` (без remount `Outlet` по pathname). - Mood themes — см. §3.2. @@ -107,8 +111,8 @@ Deep-link на календарь, владельцем которого явл **Где mood:** - Auth (`/login`, `/register`, `/verify`, forgot/reset) — compact `MoodSwitcher` (+ language). -- Calendar workspace — primary control: **mood chip** → dialog/sheet (не в `/more`). -- App shell header — wordmark + nickname + logout (**без** mood/lang). Desktop: logo \| nav \| logout. +- AppShell — primary control: **mood chip** рядом с BrandWordmark → dialog/sheet + (**не** в `/more`, **не** в calendar toolbar Month/Week/Day). Desktop: logo + mood \| nav \| nickname + logout. **Lens** (отдельно от mood и от view month/week/day): `overview` / `today` / `bookings` (UI: Обзор / Сегодня / Записи). Persist только `localStorage` (`eh.calendar.lens` + @@ -149,7 +153,7 @@ Redirects: `/discover` → `/search`; `/calendars/:id` → `/c/:id`; `/calendars Регистрация, верификация, вход, восстановление сессии. ### 5.2. Профиль -`GET /v1/user/me` + форма на `/profile`. Редактируемые через `PATCH /v1/user/me`: `nickname`, `phone`, `timezone`, `avatar_url`, `language`; смена пароля — `current_password` + `password`. Read-only в UI: `id`, `email`, `role`, `status`. Mood — chip в calendar workspace (+ compact на auth); persist `preferences.mood` через `PATCH /v1/user/me` (**не** в `/more`). Язык при первом визите — из браузера; при первом логине без `language` — пишется в профиль. Mood по умолчанию `calm`, при логине не сидится. Lens — только localStorage (не профиль). +`GET /v1/user/me` + форма на `/profile`. Редактируемые через `PATCH /v1/user/me`: `nickname`, `phone`, `timezone`, `avatar_url`, `language`; смена пароля — `current_password` + `password`. Read-only в UI: `id`, `email`, `role`, `status`. Mood — chip в AppShell рядом с BrandWordmark (+ compact на auth); persist `preferences.mood` через `PATCH /v1/user/me` (**не** в `/more`, **не** в calendar toolbar). Язык при первом визите — из браузера; при первом логине без `language` — пишется в профиль. Mood по умолчанию `calm`, при логине не сидится. Lens — только localStorage (не профиль). ### 5.3. Поиск (участник) `GET /v1/search` — фильтры (`type`, `q`, `tags`, даты, `lat`/`lon`/`radius`, sort, order, пагинация). Без `q`/дат/tags/geo/sort — топы календарей и событий; иначе — поиск. В списке бейдж типа — `calendar`|`event` (не `personal`/`commercial`). Даты, теги, geo и сортировка свёрнуты по умолчанию. Переход к `/c/:id` или `/c/:id/e/:eventId`. diff --git a/UX-BACKLOG.md b/UX-BACKLOG.md index 5f7027e..01c67fb 100644 --- a/UX-BACKLOG.md +++ b/UX-BACKLOG.md @@ -83,13 +83,21 @@ Canvas: `eventhub-front-ux-review` → `eventhub-front-ux-rewalk` → **`eventhu ## Mood + Lens workspace (Front#39, Jul 2026) — shipped -- [x] Mood chip в chrome календаря (sheet); убран из Ещё; 3 moods, без flip/CREATOR +- [x] Mood chip убран из Ещё; 3 moods, без flip/CREATOR (placement → AppShell в Front#40) - [x] Lens Обзор / Сегодня / Записи отдельно от mood и view modes - [x] Strip над сеткой (Front-derive); mobile collapsed; desktop expanded - [x] Persist: mood → `preferences.mood`; language → `user.language`; lens → localStorage Трекер: [EventHubFront#39](https://git.sabilin.com/EventHub/EventHubFront/issues/39) (`c2cb754` / `d38a927`). +## Mood AppShell + week view (Front#40, Jul 2026) — shipped + +- [x] Mood chip в AppShell рядом с BrandWordmark (**не** в toolbar Month/Week/Day) +- [x] 3 moods; `PATCH preferences.mood`; без дубля в Ещё +- [x] Week view: одна строка day-headers; scroll `.eh-cal-week-scroll` (mobile ~390) + +Трекер: [EventHubFront#40](https://git.sabilin.com/EventHub/EventHubFront/issues/40) (mood `7c092d1`, week `db11c41`). + ## Future (не блокер 10) - [x] Swipe month/week + long-press create в календаре ([EventHubFront#24](https://git.sabilin.com/EventHub/EventHubFront/issues/24)) diff --git a/WORKFLOW.md b/WORKFLOW.md index 0256187..1acb12e 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -393,6 +393,7 @@ error rate > 1% **или** mean request > 500 ms (hold ≥2 мин в фазе) | Дата | Изменение | |------|-----------| +| 2026-07-28 | Spec sync Front#40: Mood chip в AppShell у BrandWordmark; week single day-header + `.eh-cal-week-scroll` | | 2026-07-28 | Spec sync Front#39: Mood chip в workspace (не Ещё); Lens Обзор/Сегодня/Записи + strip; mood→DB, lens→localStorage | | 2026-07-28 | Spec sync Front#35: D9 B guest specialist schedule; confirmed overlay на personal; SpecialistsPanel density; F6 EventActionCard | | 2026-07-27 | Spec sync Back#61: `specialist_id` на POST event; commercial без active sub → 402; trial только `start_trial` | diff --git a/design/front/UI-PARITY.md b/design/front/UI-PARITY.md index 0fa4d2d..8cf0e9c 100644 --- a/design/front/UI-PARITY.md +++ b/design/front/UI-PARITY.md @@ -18,11 +18,12 @@ SoT: [`boards/calentiq-ui-board-final.png`](boards/calentiq-ui-board-final.png). | Discover cards | soft cards + media thumb + CTA | mood media plane (wash/initials + `image_url` when present) + soft-card rhythm + CTA; без full photo-hero grid | | CONTROL booking §E | отдельные mock-карточки «слот/специалист» | `EventActionCard` / specialists / bookings: steel rail (усилен), avatar, available label, Confirm/Decline; не pixel-perfect board mocks | | Bookings list §D | список заявок с Confirm/Decline на `/bookings` | `/bookings` = **grouped inbox**: (A) К подтверждению — pending owner/specialist + Confirm/Decline; (B) Мои записи — participant upcoming/past + Cancel; empty groups hidden. Event card Confirm/Decline **остаётся** обязательным | -| Login §D phone chrome | три phone frames + (на борде) Google CTA | brand-first hero + mood `--auth-*`; email/password only; compact mood на auth; taglines — в mood sheet workspace (не в `/more`); **без** Google OAuth | -| Mood placement | board §C switcher cards | **Front#39:** mood chip в chrome calendar workspace (+ compact auth); **не** в `/more`; 3 moods, без flip / CREATOR | +| Login §D phone chrome | три phone frames + (на борде) Google CTA | brand-first hero + mood `--auth-*`; email/password only; compact mood на auth; taglines — в mood sheet AppShell (не в `/more`); **без** Google OAuth | +| Mood placement | board §C switcher cards | **Front#40:** mood chip в AppShell рядом с BrandWordmark (+ compact auth); **не** в `/more`, **не** в toolbar Month/Week/Day; 3 moods, без flip / CREATOR | | Lens + strip | board Today/Upcoming rail only | **Front#39:** отдельный lens Обзор/Сегодня/Записи + strip над сеткой (Front-derive); localStorage only; soft-default по mood | +| Week view headers | — | **Front#40:** одна строка day-headers (без дубля `WeekDayColumn`); scroll `.eh-cal-week-scroll` (mobile ~390) | | Favicon set | 3 отдельных favicon файла на борде | mood appicon через `applyMood` | -| Desktop nav | phone bottom tabs на борде | desktop: **одна строка** chrome — logo \| nav (Календарь / Найти / Записи / Ещё) \| nickname + logout; bottom nav — mobile | +| Desktop nav | phone bottom tabs на борде | desktop: **одна строка** chrome — logo + mood \| nav (Календарь / Найти / Записи / Ещё) \| nickname + logout; bottom nav — mobile | | Header identity | — | nickname primary (не raw email); email только в `title` tooltip | | Bookings past/expired | — | `expired` бейдж + Cancel скрыт; empty-state с CTA Discover / календари; soft list time | | Agenda empty copy | — | personal «Нет событий»; commercial «Нет слотов» | @@ -45,7 +46,9 @@ IA без sidebar / без Creator mood — совпадает с non-goals (п **Front#35 (2026-07-28, SHA `57cfcf3`):** D9 модель B (guest roster → schedule filter); confirmed foreign overlay на personal; SpecialistsPanel mobile density; F6 EventActionCard past+pending → expired / no Cancel, Book скрыт на past. -**Front#39 (2026-07-28, SHA `c2cb754` / `d38a927`):** Mood chip только в calendar workspace (убран из Ещё); Lens Обзор/Сегодня/Записи + strip над сеткой во всех 3 moods; mobile sheets + strip collapsed; mood→DB, lens→localStorage; без flip / CREATOR. +**Front#39 (2026-07-28, SHA `c2cb754` / `d38a927`):** Mood chip убран из Ещё; Lens Обзор/Сегодня/Записи + strip над сеткой во всех 3 moods; mobile sheets + strip collapsed; mood→DB, lens→localStorage; без flip / CREATOR. (Placement chip уточнён в Front#40.) + +**Front#40 (2026-07-28, SHA mood `7c092d1` / week `db11c41`):** Mood chip в AppShell рядом с BrandWordmark (**не** в calendar toolbar Month/Week/Day); 3 moods; `PATCH preferences.mood`; без дубля в Ещё. Week view: одна строка day-headers + `.eh-cal-week-scroll` для mobile ~390. **Remaining intentional:** no pixel-perfect phone chrome; Discover без photo-hero grid (cover via `image_url` when API returns it; broken URL → wash+initials); §E specialist schedule card vs panel — не pixel-perfect board mocks (follow-up). Product flow D9 B — documented; board pixel mock — Future. @@ -83,11 +86,12 @@ API: `GET /v1/user/booking-requests` (Back) + существующий `PUT /v1/ изменений. 3. **SpecialistsPanel density (mobile):** имя/теги сверху, actions снизу full-width. -### Mood + Lens (locked Front#39) +### Mood + Lens (locked Front#39 / placement Front#40) 1. **Mood** = визуальная атмосфера (`html[data-mood]`, FLOW/MOMENTUM/CONTROL). Primary UX — - chip → sheet в chrome **calendar workspace**; compact на auth. **Нет** в `/more`. - Persist: `preferences.mood` через `PATCH /v1/user/me`. Без flip; без CREATOR. + chip → sheet в **AppShell** рядом с BrandWordmark (Front#40); compact на auth. + **Нет** в `/more`; **не** в toolbar Month/Week/Day. Persist: `preferences.mood` + через `PATCH /v1/user/me`. Без flip; без CREATOR. 2. **Lens** = отдельный контентный режим (`overview` / `today` / `bookings`), не mood и не view month/week/day. Desktop — segment; mobile — chip → sheet. Soft-default при смене mood, если lens не pinned: FLOW→overview, MOMENTUM→today, CONTROL→bookings. @@ -96,6 +100,8 @@ API: `GET /v1/user/booking-requests` (Back) + существующий `PUT /v1/ (tap раскрывает). Сетка всегда видна. 4. **Persistence:** mood → DB; language → `user.language`; lens → `localStorage` (`eh.calendar.lens` + pinned). Без нового Back API. +5. **Week view (Front#40):** одна строка day-headers (без дубля `WeekDayColumn`); + горизонтальный скролл `.eh-cal-week-scroll` (mobile ~390). ### Follow-ups (вне этого fix-pass или частично) @@ -104,9 +110,10 @@ API: `GET /v1/user/booking-requests` (Back) + существующий `PUT /v1/ | Discover `image_url` в search serialization | Back отдаёт поле; upload API **нет** — только URL field / seed; Front#31: photo vs fallback media classes + onError fallback | | Stage Popular clutter (e2e calendars) | filter notes: см. `EventHubSpec/STAGE-POPULAR-CLEANUP.md`; не трогать реальные smoke данные без фильтра по e2e-паттернам | | §E specialist schedule card vs panel | deviation: EventActionCard + SpecialistsPanel; pixel mock — Future; **product D9 B** — done Front#35 | -| Desktop one-row chrome | **done** Front#31 — logo \| nav \| nickname+logout | +| Desktop one-row chrome | **done** Front#31; mood chip у logo — Front#40 (`7c092d1`) | | D9 B + confirmed personal overlay | **done** Front#35 (`57cfcf3`) | -| Mood chip + Lens strip | **done** Front#39 (`c2cb754` / `d38a927`) | +| Mood chip + Lens strip | **done** Front#39 (`c2cb754` / `d38a927`); chip → AppShell Front#40 | +| Week view single header + scroll | **done** Front#40 (`db11c41`) | ## Mood concept = product surface @@ -235,6 +242,7 @@ CSS-токены и chrome на mood beyond primary hex: surfaces, gradients, ev | — | Past-pending → `expired` | [Back#60](https://git.sabilin.com/EventHub/EventHubBack/issues/60) | | — | P2: D9 B + confirmed personal + density/F6 | [Front#35](https://git.sabilin.com/EventHub/EventHubFront/issues/35) | | — | Mood chip + Lens strip (workspace) | [Front#39](https://git.sabilin.com/EventHub/EventHubFront/issues/39) | +| — | Mood chip → AppShell + week scroll | [Front#40](https://git.sabilin.com/EventHub/EventHubFront/issues/40) | Эпик: [Spec#10](https://git.sabilin.com/EventHub/EventHubSpec/issues/10).