Tech Spec — Mobilní vývoj
| |
|---|
| Verze | 1.0 |
| Datum | 2026-02-23 |
| Stav | Draft |
| Vlastník | Symbio — Analýza & Design |
1. Přehled
Tento dokument specifikuje mobilní architekturu Colosseum MA z pohledu UX a designu. Definuje navigační model, offline strategii, platformové požadavky a API očekávání. Detailní implementační rozhodnutí (state management, konkrétní knihovny) jsou na vývojovém týmu.
Platforma: Cross-platform (Flutter nebo React Native — finální rozhodnutí TBD). Podrobná analýza obou frameworků: context/analysis/tech-stack-rn-vs-flutter.md.
Kontext: Symbio jako UX/design agentura neimplementuje aplikaci, ale specifikuje architektonická očekávání z perspektivy uživatelského zážitku — navigace, offline chování, performance, bezpečnost a API kontrakt.
2. Navigační architektura
2.1 Hlavní navigace
Tab-based navigation se 4 taby v bottom bar:
| Tab | Ikona | Label | Root screen | Popis |
|---|
| Program | 🎭 | Program | P1 (Home/Feed) | Personalizovaný feed akcí, sekce, promo |
| Hledat | 🔍 | Hledat | P8 (Vyhledávání) | Fulltext search, filtry, výsledky |
| Vstupenky | 🎫 | Vstupenky | P7 (Wallet) | Moje vstupenky, QR kódy, offline |
| Profil | 👤 | Profil | P9 (Účet hub) | Správa účtu, nastavení, podpora |
2.2 Navigation stack
Každý tab má vlastní navigation stack. Při přepnutí tabu se zachovává stav stacku (uživatel se vrací na poslední pozici v daném tabu). Back gesture/button naviguje v rámci stacku aktuálního tabu.
Chování tab přepnutí:
- Tap na aktivní tab → scroll to top + reset na root screen
- Tap na neaktivní tab → přepnutí se zachováním stavu stacku
- Long press na tab → žádná akce (reserved pro budoucí rozšíření)
2.3 Navigační typy
| Typ | Popis | Gesta | Příklady |
|---|
| Push | Standardní screen-to-screen navigace v rámci tab stacku | Back swipe (iOS), back button (Android) | P1 → P3, P3 → P4, P9 → S14 |
| Modal (fullscreen) | Fullscreen modal nad aktuálním tabem, vlastní navigation stack | Close button (top-left/right), swipe-down na iOS | S4 (login), S5 (registrace), P6 (checkout) |
| Bottom sheet | Partial overlay zdola s drag handle | Swipe-to-dismiss, tap on scrim | S3 (filtr), S1 (neadresné), seat detail, X5 (timer warning) |
| Overlay/Dialog | Centered dialog s scrim background | Tap outside, close button | X14 (smazání účtu), X15 (GDPR souhlas) |
| Toast | Non-blocking feedback, auto-dismiss | Swipe-to-dismiss (optional) | X16, X17, success/error feedback |
| System | App-level, outside tab navigation | N/A | X10 (splash), X19 (force update), X20 (welcome) |
2.4 Deep linking
Viz dedikovaná stránka: Deep Linking
2.5 Tab badge indicators
| Tab | Badge typ | Podmínka | Fáze |
|---|
| Vstupenky | Číselný badge | > 0 nadcházejících vstupenek (v příštích 7 dnech) | MVP |
| Profil | Červená tečka | Nepřečtené notifikace | F1 |
3. Screen types a navigation patterns
3.1 Primární obrazovky (root nebo klíčové flow)
| Screen ID | Název | Nav typ | Gesta | Tab | Fáze |
|---|
| P1 | Home/Feed | Root | Pull-to-refresh | Program | MVP |
| P2 | Seznam akcí | Push | Back swipe, pull-to-refresh | Program | MVP |
| P3 | Detail akce | Push | Back swipe, share | Program | MVP |
| P4 | Seat Map | Push | Pinch-to-zoom, pan, back | Program | MVP |
| P5 | Košík | Push | Back swipe | Program | MVP |
| P6 | Checkout | Modal (fullscreen) | Close button | — | MVP |
| P7 | Wallet | Root | Pull-to-refresh | Vstupenky | MVP |
| P8 | Vyhledávání | Root | Keyboard auto-focus | Hledat | MVP |
| P9 | Účet hub | Root | — | Profil | MVP |
| P10 | Věrnostní hub | Push | Back swipe | Profil | F1 |
| P11 | Věrnostní e-shop | Push | Back swipe | Profil | F1 |
| P12 | White-label správa | Push | Back swipe | Profil | F2+ |
| P13 | Ticket Swap | Push | Back swipe | Vstupenky | TBD |
3.2 Sekundární obrazovky
| Screen ID | Název | Nav typ | Gesta | Tab | Fáze |
|---|
| S1 | Neadresné vstupenky | Bottom sheet | Swipe-to-dismiss | — | MVP |
| S2 | Checkout údaje | Push (modal flow) | Back | — | MVP |
| S3 | Filtrování | Bottom sheet | Swipe-to-dismiss | — | MVP |
| S4 | Přihlášení | Modal (fullscreen) | Close button | — | MVP |
| S5 | Registrace | Modal (fullscreen) | Close button | — | MVP |
| S6 | Onboarding | Modal (fullscreen) | Skip button | — | F1 |
| S7 | Historie objednávek | Push | Back swipe | Vstupenky | MVP |
| S8 | Detail vstupenky | Push | Back swipe | Vstupenky | MVP |
| S9 | Nastavení notifikací | Push | Back swipe | Profil | F1 |
| S10 | Správa watchdogů | Push | Back swipe | Profil | F1 |
| S11 | Předplatné | Push | Back swipe | Program | MVP |
| S12 | Detail místa | Push | Back swipe | Program | MVP |
| S13 | Profil pořadatele | Push | Back swipe | Program | MVP |
| S14 | Editace profilu | Push | Back swipe | Profil | MVP |
| S15 | Podpora/Kontakt | Push | Back swipe | Profil | MVP |
| S16 | Detail odměny | Push | Back swipe | Profil | F1 |
| S17 | FAQ | Push | Back swipe | Profil | F1 |
| S18 | Chat/podpora | Push | Back swipe | Profil | F1 |
| S19 | Notifikační centrum | Push | Back swipe | Profil | F1 |
| S20 | Blog feed | Push | Back swipe | Profil | F2+ |
| S21 | Detail článku | Push | Back swipe | Profil | F2+ |
| S22 | Geolokace/mapa | Push | Back swipe | Hledat | F2+ |
| S23 | Doplňkový prodej | Bottom sheet / Push | Swipe-to-dismiss | Program | F2+ |
| S24 | Brand konfigurace | Push | Back swipe | Profil | F2+ |
| S25 | Ticket Swap detail | Push | Back swipe | Vstupenky | TBD |
3.3 Podpůrné obrazovky (overlays, stavové, toasty)
Podpůrné X-screeny (X1–X26) nejsou v navigaci jako self-standing screeny, ale jako overlays, inline states nebo dialogy. Kompletní seznam viz context/analysis/screen-inventory.md.
| Kategorie | Screen IDs | Typ zobrazení |
|---|
| Thank you / success | X1, X2 | Fullscreen result |
| Error states | X3, X4 | Fullscreen result / dialog |
| Warnings | X5 | Inline banner |
| Empty states | X6, X7, X8 | Inline placeholder |
| Permission dialogy | X12 | Custom dialog → system dialog |
| GDPR / confirm dialogy | X14, X15 | Centered dialog |
| Toasty / feedback | X16, X17 | Toast (auto-dismiss 3s) |
| System screens | X10, X11, X19, X20 | Fullscreen overlay |
4. Offline strategie
4.1 Offline-first oblasti
| Oblast | Offline dostupnost | Cache strategie | Priorita |
|---|
| Wallet QR kódy | Plná — musí fungovat 100 % bez internetu | QR data + metadata stažena po nákupu a synchronizována při každém otevření wallet. Encrypted local storage. | P0 |
| Profil uživatele | Plná — data z posledního sync | Cache-first, refresh on connect | P0 |
| Event feed (P1) | Partial — cached verze | Stale-while-revalidate, max age 1 h | P1 |
| Event detail (P3) | Partial — nedávno prohlédnuté | LRU cache posledních 20 detailů | P1 |
| Obrázky | Cached | Disk cache s LRU eviction (max 200 MB) | P1 |
| Search výsledky | Žádná — vyžaduje internet | — | P2 |
| Seat map (P4) | Žádná — real-time data | — | P2 |
| Checkout (P6) | Žádná — vyžaduje internet | — | P0 (fail gracefully) |
4.2 Offline indikátor (X11)
- Persistent banner pod app bar: „Jste offline — některé funkce jsou omezené"
- Disabled stavy na non-cached prvcích (šedý overlay, disabled taps)
- Auto-dismiss při obnovení připojení (s krátkou „Zpět online" toast)
- Retry button u failed requestů
- Wallet tab zůstává plně funkční i offline
4.3 Sync strategie
| Aspekt | Strategie |
|---|
| Reconnect sync | Background sync při obnovení připojení — tickets first, pak profil, pak feed |
| Manual sync | Pull-to-refresh jako manuální trigger |
| Conflict resolution | Server-wins (server je source of truth) |
| Offline action queue | Queue pro akce provedené offline (watchdog, sdílení) — odeslání po reconnect, FIFO pořadí |
| Cache invalidation | ETag/Last-Modified headers pro conditional requests |
| Data freshness | Wallet: sync při každém otevření app. Feed: max 1 h. Detail: max 24 h. |
5.1 iOS
| Feature | Framework/API | Minimum iOS | Fáze |
|---|
| Biometrika | LocalAuthentication (Face ID, Touch ID) | iOS 16+ | MVP |
| Apple Pay | PassKit / Apple Pay JS | iOS 16+ | MVP |
| Apple Wallet | PKPass (boarding pass style) | iOS 16+ | MVP |
| Push notifikace | APNs + UserNotifications | iOS 16+ | MVP (základ) → F1 (plný) |
| Deep linking | Universal Links (apple-app-site-association) | iOS 16+ | MVP |
| Kalendář | EventKit | iOS 16+ | MVP |
| Share | UIActivityViewController | iOS 16+ | MVP |
| Camera/QR | AVFoundation (pokud potřeba sken) | iOS 16+ | TBD |
| App Clips | App Clip (event detail landing) | iOS 16+ | TBD |
| Haptic feedback | UIFeedbackGenerator | iOS 16+ | MVP |
Minimum podporovaná verze: iOS 16+
Odůvodnění: iOS 16 pokrývá ~95 % aktivních zařízení (únor 2026). Umožňuje využití moderních API (SwiftUI improvements, Live Activities pro ticket countdown).
5.2 Android
| Feature | Framework/API | Minimum API | Fáze |
|---|
| Biometrika | BiometricPrompt (fingerprint, face) | API 28+ | MVP |
| Google Pay | Google Pay API | API 28+ | MVP |
| Google Wallet | Google Wallet API (JWT pass) | API 28+ | MVP |
| Push notifikace | FCM (Firebase Cloud Messaging) | API 28+ | MVP (základ) → F1 (plný) |
| Deep linking | App Links (assetlinks.json) | API 28+ | MVP |
| Kalendář | CalendarContract | API 28+ | MVP |
| Share | Intent.ACTION_SEND | API 28+ | MVP |
| Instant Apps | Google Play Instant | API 28+ | TBD |
| Haptic feedback | HapticFeedbackConstants | API 28+ | MVP |
Minimum podporovaná verze: Android 9 (API 28)
Odůvodnění: API 28 pokrývá ~95 % aktivních zařízení. Umožňuje BiometricPrompt (unified API) a moderní notification channels.
| Oblast | iOS | Android |
|---|
| Back navigation | Swipe from left edge | System back button/gesture |
| Bottom sheet dismiss | Swipe down + tap scrim | Swipe down + tap scrim + back button |
| Share | UIActivityViewController (system sheet) | Intent chooser |
| Haptics | Taptic Engine (bohatší palette) | Vibration API (jednodušší) |
| Status bar | Light/dark per screen | Immersive mode pro seat map |
| Safe areas | Dynamic Island, home indicator | Navigation bar, notch handling |
| Permissions | One-time ask, settings redirect | Runtime permissions, rationale dialog |
6. Expected API požadavky
Podrobný rozpis viz API Požadavky.
Definujeme co očekáváme od backend API — ne přesnou specifikaci (tu dodá backend tým). Formát je REST-like, ale implementace může být GraphQL nebo jiná.
Přehled API skupin
| Skupina | Klíčové endpointy | Fáze |
|---|
| Events API | Seznam, detail, termíny, seat map, hledání | MVP |
| Auth API | Registrace, login, OAuth, refresh, reset | MVP |
| Cart & Payment API | Košík, platba, voucher, timer | MVP |
| Tickets API | Vstupenky, QR data, sdílení, wallet pass | MVP |
| Orders API | Historie, detail | MVP |
| User Profile API | Profil, preference | MVP / F1 |
| Notifications API | Seznam, čtení, nastavení, device token | MVP / F1 |
| Watchdog API | Vytvoření, seznam, zrušení | F1 |
| Loyalty API | Body, transakce, odměny, výměna | F1 |
| Content API | Venues, organizers, předplatné, FAQ, blog | MVP / F1 / F2+ |
| Metrika | Target | Priorita | Měření |
|---|
| App launch → interactive | < 2 s (cold start) | P0 | Time to first meaningful paint |
| Screen transition | < 300 ms | P0 | Animation start to end |
| Scroll FPS | ≥ 60 FPS | P0 | Profiler, žádné janky |
| Search response | < 500 ms (API + render) | P0 | Keystroke to results |
| Image loading (thumbnail) | < 1 s (progressive) | P1 | Placeholder → full image |
| Seat map render | < 1 s (initial), 60 FPS zoom/pan | P0 | First paint + interaction FPS |
| Offline ticket access | < 100 ms | P0 | Tap to QR display |
| Push notification delivery | < 5 s (FCM/APNs) | P1 | Server send to device display |
| Cart checkout flow | < 30 s (celý flow) | P1 | Seat selection to payment confirmation |
| App binary size | < 50 MB (download) | P2 | App Store / Play Store size |
| Memory usage | < 300 MB (peak) | P1 | Seat map + image gallery |
| Background battery | < 2 % / h | P2 | Background sync + location |
Image loading strategie
- Progressive loading s blur-up placeholderem (low-res → full-res)
- WebP formát (s JPEG fallback pro starší zařízení)
- CDN s responsivními variantami (1x, 2x, 3x — dle device pixel ratio)
- Lazy loading mimo viewport (intersection-based)
- Disk cache s LRU eviction (max 200 MB)
- Placeholder shimmer efekt při načítání
- SVG/Canvas rendering (ne WebView)
- Chunked loading pro velké sály (> 1000 sedadel)
- Debounced seat status refresh (ne per-seat polling)
- GPU-accelerated zoom/pan transformace
- Pre-rendered thumbnails pro overview zoom level
8. Security
8.1 Token storage
| Platforma | Úložiště | Mechanismus |
|---|
| iOS | Keychain Services | kSecClassGenericPassword, accessible afterFirstUnlock |
| Android | EncryptedSharedPreferences | Android Keystore backend (hardware-backed na podporovaných zařízeních) |
| Token | Životnost | Rotace |
|---|
| Access token | 15 min | Automatická přes refresh token |
| Refresh token | 30 dnů | Rotated on use (single-use) |
| Push token | Platforma-managed | Re-registrace při změně |
8.2 Biometrika
- Volitelná, aktivovaná po prvním úspěšném login (prompt uživateli)
- Fallback na PIN/heslo při selhání (3 pokusy → PIN)
- Biometric key vázán na device, ne na account
- Při změně biometrických dat (nový otisk, nová tvář) → invalidace → vyžadovat heslo
- Použití: app unlock, potvrzení platby, zobrazení citlivých dat
8.3 QR kód security
- QR payload podepsaný serverovým klíčem (asymetrické podepisování)
- Offline validace: sken zařízení ověří podpis bez API volání
- Expiry timestamp v payloadu (prevence replay útoků)
- Unikátní scan ID per vstup (prevence duplikátního použití)
- QR kód obnovován periodicky (rolling code — TBD s backend týmem)
8.4 Síťová bezpečnost
| Opatření | Stav | Poznámka |
|---|
| HTTPS only | Povinné | TLS 1.3, žádný HTTP fallback |
| Certificate pinning | TBD | Závisí na infrastruktuře a CDN. Doporučeno pro API endpointy. |
| Request signing (HMAC) | TBD | Pro citlivé endpointy (platby, account deletion) |
| Jailbreak/root detection | Doporučeno | Warning dialog, ne blokace — wallet musí fungovat |
| Screenshot prevention | Doporučeno | Pouze na S8 (QR kód detail) — prevence neoprávněného sdílení |
8.5 GDPR compliance
| Požadavek | Implementace |
|---|
| Data encryption at rest | SQLCipher nebo platform-native encrypted storage |
| Exportovatelnost dat | API endpoint pro stažení osobních dat (JSON/PDF) |
| Právo na smazání | Account deletion flow (X14) → soft delete → hard delete po 30 dnech |
| Consent management | Granulární souhlasy (marketing, analytics, personalizace) s audit trail |
| Data minimization | Sbírat jen nezbytná data per účel |
| Privacy by design | Anonymizace analytics dat, pseudonymizace kde možné |
8.6 Sensitive data handling
| Data | Klasifikace | Storage | Transmission |
|---|
| Auth tokeny | Tajné | Keychain/Keystore | HTTPS only |
| QR payloady | Citlivé | Encrypted local DB | HTTPS only |
| Osobní údaje | Osobní (GDPR) | Encrypted local DB | HTTPS only |
| Platební data | PCI-DSS | Nikdy lokálně (tokenizace) | Přes platební SDK |
| Analytics | Anonymní | Standard storage | HTTPS |
9. Flutter vs. React Native
Aktuální stav rozhodování
Finální rozhodnutí nebylo učiněno. Podrobná srovnávací analýza: context/analysis/tech-stack-rn-vs-flutter.md.
Z pohledu UX/designu nemá volba frameworku zásadní dopad na design deliverables — oba podporují nativní komponenty i custom UI. Specifikace v tomto dokumentu jsou framework-agnostické.
Souhrnná matice z perspektivy UX
| Kritérium | Flutter | React Native | Vítěz |
|---|
| Custom UI (seat map, animace) | Vlastní rendering engine (Impeller), pixel-perfect kontrola | Závisí na native bridge, react-native-skia pro custom rendering | Flutter |
| Nativní feel (platform conventions) | Material/Cupertino widgety, ne 100 % nativní | Nativní UI komponenty | React Native |
| Performance (seat map zoom/pan) | Impeller engine, konzistentní 60 FPS | Dobrý s New Architecture, možný jitter u komplexních animací | Flutter |
| Apple/Google Wallet integrace | Plugin ecosystem (ověřené knihovny) | Plugin ecosystem (ověřené knihovny) | Remíza |
| Offline storage | Hive/Isar/Drift | WatermelonDB/MMKV | Remíza |
| White-label (multi-brand) | Flutter Flavors — first-class citizen | Build-time konfigurace, více manuální práce | Flutter |
| Startup time | 20–40 % rychlejší cold start (AOT kompilace) | Pomalejší (JS bundle parsing) | Flutter |
| Talent pool | Menší (Dart specialisté) | 3–4× větší (JS/TS vývojáři) | React Native |
Doporučení z perspektivy UX
Z pohledu UX doporučujeme framework, který nejlépe zvládne:
- Custom seat map interakci — pinch-to-zoom, SVG rendering, real-time updates sedadel
- Smooth animace — shared element transitions, bottom sheet gesta, parallax
- White-label theming — runtime přepínání brandů z jednoho codebase
Oba frameworky to zvládají. Flutter má mírnou výhodu v rendering performance a white-label podpoře. React Native má výhodu v talent poolu a nativním look & feel.
Finální rozhodnutí by mělo zohlednit:
- Kompetence vývojového týmu (rozhodující faktor)
- Existující codebase klienta (Colosseum Scanner je Xamarin — ani jedna platforma nemá přímou návaznost)
- Long-term maintenance strategie a náklady
- White-label škálování (1–2 brandy vs. 10+)
10. Accessibility (a11y)
Základní požadavky
| Oblast | Požadavek | Priorita |
|---|
| Screen reader | VoiceOver (iOS) + TalkBack (Android) podpora na všech screenech | P1 |
| Kontrast | WCAG 2.1 AA minimum (4.5:1 text, 3:1 UI elements) | P1 |
| Touch targets | Minimálně 44×44 pt (iOS) / 48×48 dp (Android) | P0 |
| Font scaling | Podpora Dynamic Type (iOS) / Font Scale (Android) až do 200 % | P1 |
| Seat map a11y | Alternativní list view pro výběr sedadel (ne jen vizuální mapa) | P1 |
| Motion | Respektovat Reduce Motion nastavení (žádné parallax, zjednodušené přechody) | P2 |
| Color | Informace nikdy jen barvou — vždy doplnit ikonou/textem (seat dostupnost, status) | P1 |
Seat map accessibility
Seat map (P4) je vizuálně nejnáročnější screen. Pro uživatele se zrakovým postižením musí existovat alternativní cesta:
- Textový list view se sekcemi, řadami a sedadly
- Filtrování dle cenové kategorie
- VoiceOver/TalkBack popis: „Řada 5, sedadlo 12, kategorie Premium, dostupné"
11. Analytics a monitoring
Klíčové události pro tracking
| Událost | Parametry | Screen | Fáze |
|---|
app_open | cold/warm start, launch_time_ms | — | MVP |
screen_view | screen_id, screen_name | Všechny | MVP |
event_view | event_id, source (feed/search/deeplink) | P3 | MVP |
seat_selected | event_id, seat_id, category, price | P4 | MVP |
cart_created | event_id, item_count, total_price | P5 | MVP |
checkout_started | payment_method, cart_value | P6 | MVP |
purchase_completed | order_id, payment_method, total, item_count | X1/X2 | MVP |
purchase_failed | error_code, payment_method | X3 | MVP |
ticket_shared | ticket_id, share_method | S8 | MVP |
search_performed | query, result_count, filters_applied | P8 | MVP |
filter_applied | filter_type, filter_value | S3 | MVP |
push_received | notification_type, source | — | F1 |
push_opened | notification_type, deeplink | — | F1 |
loyalty_redeemed | reward_id, points_spent | S16 | F1 |
Crash reporting
- Automatický crash reporting s stack traces
- Breadcrumbs (posledních 20 akcí před crashem)
- User consent pro automatické reporty
- Konkrétní tooling (Firebase Crashlytics, Sentry, Bugsnag) — rozhodnutí na dev týmu
12. Otevřené otázky
Kompletní seznam otevřených otázek viz Open Questions.
| # | Otázka | Oblast | Dopad | Urgence |
|---|
| OQ-T-01 | Seat map data formát — V jakém formátu Colosseum API dodává sálové plány? | P4, Performance | Klíčové pro seat map implementaci | Vysoká |
| OQ-T-02 | Real-time seat updates — WebSocket nebo polling? | P4 | Architektura, performance, UX | Vysoká |
| OQ-T-03 | Certificate pinning — Podpora v infrastruktuře? | Security | Security model | Střední |
| OQ-T-04 | Push notification provider — Vlastní infra nebo APNs/FCM? | Notifikace | F1 architektura | Střední |
| OQ-T-05 | Platební brána — GoPay, ČSOB, Stripe, Comgate? | P6 | Checkout UX | Vysoká |
| OQ-T-06 | CDN pro obrázky — Responsivní varianty z API? | Performance | Image loading strategie | Střední |
| OQ-T-07 | Framework rozhodnutí — Flutter nebo React Native? | Celý projekt | Technické plánování | Vysoká |
| OQ-T-08 | Tablet podpora — Adaptive layout? | Celý projekt | Design scope, odhady | Střední |
| OQ-T-09 | App Clips / Instant Apps | Deep linking | Architektura, scope | Nízká |
| OQ-T-10 | Analytics tooling | Celý projekt | SDK integrace | Střední |
| OQ-T-11 | QR rolling code — Statický nebo obnovovaný? | S8, Security | Offline architektura | Střední |
| OQ-T-12 | Existující API — Rozšíření nebo nové? | Celý backend | Architektura, timeline | Vysoká |
Přílohy
A. Referenční dokumenty
| Dokument | Cesta | Obsah |
|---|
| Přehled projektu | prd/00-prehled-projektu.md | Scope, fáze, architektura |
| Feature matrix | context/analysis/feature-matrix.md | Funkce → fáze (source of truth) |
| Screen inventory | context/analysis/screen-inventory.md | Obrazovky → fáze (source of truth) |
| Flutter vs. RN analýza | context/analysis/tech-stack-rn-vs-flutter.md | Detailní srovnání frameworků |
| Analýza webu | context/analysis/current-web-colosseum.md | Content model, aktuální stav |
B. Konvence
- Fázování dle
.cursor/rules/phasing-convention.mdc
- Screen ID formát: P = primární, S = sekundární, X = podpůrná
- API endpointy jsou očekávání, ne specifikace — finální kontrakt definuje backend tým