Docs: sync Front#40 Mood AppShell + week scroll. Fixes EventHub/EventHubSpec#17
Refs EventHub/EventHubFront#40 (7c092d1 / db11c41).
This commit is contained in:
+15
-11
@@ -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`.
|
||||
|
||||
+9
-1
@@ -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))
|
||||
|
||||
@@ -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` |
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user