Files
roa2web-service-auto/tasks/prd-unified-mobile-material-design.md
Claude Agent dfbaca2477 feat(unified-mobile-material-design): Complete US-101a - Creare MobileTopBar.vue component
Implemented by Ralph autonomous loop.
Iteration: 1

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 09:46:30 +00:00

458 lines
18 KiB
Markdown

# PRD: Unified Mobile Material Design Interface
## 1. Introducere
Aplicația ROA2WEB are deja implementată o interfață Material Design nativă Android pentru modulul de bonuri (ReceiptsListView). Acest PRD definește extinderea aceleiași interfețe unitare la toate paginile aplicației în modul mobil: Dashboard, Facturi, Balanță de Verificare, Trezorerie, Statistici, Loguri etc.
Scopul este o experiență consistentă cross-module pe dispozitive mobile, cu header/footer unitar și pattern-uri de interacțiune identice.
## 2. Obiective
### Obiectiv Principal
- **Consistență UI/UX**: Toate paginile mobile să aibă aceeași structură vizuală și pattern-uri de interacțiune ca lista de bonuri
### Obiective Secundare
- Eliminare cod duplicat (buton delete în header când există în footer)
- Adăugare navigare back (← Înapoi) în editare bonuri
- Dashboard cu carousel swipeable pentru KPI cards
- MD3 color tokens pentru theming consistent
### Metrici de Succes
- 100% consistență vizuală între pagini pe mobil
- Reducere CSS duplicat cu minim 30%
- Zero regresii vizuale în modul desktop
- Funcționare pe Android Chrome, iOS Safari, Samsung Internet
## 3. User Stories
### US-101: Creare sistem de componente Material Design reutilizabile
**Ca** developer
**Vreau** componente Vue reutilizabile pentru elementele MD comune
**Pentru că** să evit duplicarea codului și să asigur consistența
**Acceptance Criteria:**
- [ ] Componentă `MobileTopBar.vue` extrasă din ReceiptsListView
- [ ] Componentă `MobileBottomNav.vue` extrasă din ReceiptsListView
- [ ] Componentă `MobileSelectionFooter.vue` pentru batch actions
- [ ] Componentă `MobileFilterChips.vue` pentru filtre orizontale scrollable
- [ ] Componentă `BottomSheet.vue` pentru filtre avansate
- [ ] Props pentru customizare (title, actions, items)
- [ ] npm run build passes
### US-102: Definire MD3 color tokens în CSS
**Ca** developer
**Vreau** variabile CSS pentru Material Design 3 color system
**Pentru că** să am culori consistente și dark mode automatic
**Acceptance Criteria:**
- [ ] Fișier `src/assets/css/core/md3-tokens.css` creat
- [ ] Tokens pentru: primary, secondary, surface, on-surface, outline
- [ ] Dark mode variants cu `[data-theme="dark"]`
- [ ] Mapping la tokens existenți unde posibil
- [ ] Import în main.css
- [ ] npm run build passes
### US-103: Refactor ReceiptsListView să folosească componente comune
**Ca** developer
**Vreau** ReceiptsListView să folosească noile componente
**Pentru că** să validez API-ul componentelor și să reduc duplicarea
**Acceptance Criteria:**
- [ ] Import MobileTopBar, MobileBottomNav, MobileSelectionFooter
- [ ] Ștergere CSS duplicat din ReceiptsListView
- [ ] Funcționalitate identică cu implementarea actuală
- [ ] Verify in browser că lista bonuri funcționează identic pe mobil
- [ ] npm run build passes
### US-104: Eliminare buton delete duplicat din header tabel bonuri
**Ca** utilizator
**Vreau** să văd butonul de ștergere doar în footer când am selecție activă
**Pentru că** afișarea în ambele locuri e confuză și ocupă spațiu inutil
**Acceptance Criteria:**
- [ ] Desktop: bulk-actions-bar NU mai afișează buton Șterge când e pe mobil
- [ ] Desktop: bulk-actions-bar afișează doar când `!isMobile`
- [ ] Mobile: delete apare DOAR în `mobile-selection-bottom-bar`
- [ ] Verify in browser: pe mobil, delete e doar în footer
- [ ] Verify in browser: pe desktop, delete e în header table
- [ ] npm run build passes
### US-105: Adăugare buton Înapoi în editare bon (mobile)
**Ca** utilizator
**Vreau** să pot reveni la lista de bonuri din pagina de editare
**Pentru că** navigarea back prin browser nu e intuitivă pe mobil
**Acceptance Criteria:**
- [ ] MobileTopBar în ReceiptCreateView/ReceiptCreateUnifiedView
- [ ] Iconiță ← în stânga header-ului
- [ ] Click pe ← navighează la `/data-entry`
- [ ] Title: "Editare Bon" sau "Bon nou" în funcție de context
- [ ] Verify in browser: butonul funcționează corect
- [ ] npm run build passes
### US-106: Dashboard Mobile cu Swipeable KPI Cards
**Ca** utilizator
**Vreau** să văd KPI-urile ca un carousel swipeable pe mobil
**Pentru că** cardurile stacked ocupă prea mult spațiu vertical
**Acceptance Criteria:**
- [ ] Componentă `SwipeableCards.vue` creată
- [ ] Dots indicator pentru poziție
- [ ] Touch swipe left/right funcțional
- [ ] DashboardView.vue folosește componenta pe mobil
- [ ] Fallback la layout normal pe desktop
- [ ] Verify in browser: swipe funcționează pe touch devices
- [ ] npm run build passes
### US-107: InvoicesView Mobile Material Design Header
**Ca** utilizator
**Vreau** pagina de facturi să aibă același header Material ca lista bonuri
**Pentru că** interfața trebuie să fie unitară
**Acceptance Criteria:**
- [ ] MobileTopBar cu title "Facturi"
- [ ] App Bar Actions: refresh, export în header (iconițe dreapta)
- [ ] MobileBottomNav identic cu cel din bonuri
- [ ] Filtre în Bottom Sheet (nu inline pe mobil)
- [ ] Verify in browser: header arată ca la bonuri
- [ ] npm run build passes
### US-108: TrialBalanceView Mobile Material Design Header
**Ca** utilizator
**Vreau** pagina de balanță să aibă același header Material
**Pentru că** interfața trebuie să fie unitară
**Acceptance Criteria:**
- [ ] MobileTopBar cu title "Balanță de Verificare"
- [ ] App Bar Actions: export în header
- [ ] MobileBottomNav identic
- [ ] Bottom Sheet pentru filtre complexe (perioadă, conturi)
- [ ] Verify in browser că arată consistent
- [ ] npm run build passes
### US-109: BankCashRegisterView (Trezorerie) Mobile Material Design
**Ca** utilizator
**Vreau** pagina de trezorerie să aibă același header Material
**Pentru că** interfața trebuie să fie unitară
**Acceptance Criteria:**
- [ ] MobileTopBar cu title "Trezorerie"
- [ ] App Bar Actions: refresh, export
- [ ] MobileBottomNav identic
- [ ] Bottom Sheet pentru filtre
- [ ] Verify in browser
- [ ] npm run build passes
### US-110: ServerLogsView Mobile Material Design
**Ca** admin
**Vreau** pagina de loguri să aibă interfață Material
**Pentru că** și paginile admin trebuie să fie unitare
**Acceptance Criteria:**
- [ ] MobileTopBar cu title "Loguri Server"
- [ ] App Bar Actions: refresh, export
- [ ] MobileBottomNav (fără link-ul de setări OCR pentru non-admin)
- [ ] Verify in browser
- [ ] npm run build passes
### US-111: CacheStatsView Mobile Material Design
**Ca** admin
**Vreau** pagina de statistici cache să aibă interfață Material
**Pentru că** și paginile admin trebuie să fie unitare
**Acceptance Criteria:**
- [ ] MobileTopBar cu title "Statistici Cache"
- [ ] App Bar Actions: refresh
- [ ] MobileBottomNav
- [ ] Verify in browser
- [ ] npm run build passes
### US-112: Bottom Sheet Component pentru Filtre
**Ca** utilizator
**Vreau** să pot accesa filtrele într-un bottom sheet pe mobil
**Pentru că** ocupă mai puțin spațiu și e pattern MD familiar
**Acceptance Criteria:**
- [ ] Componentă `BottomSheet.vue` cu animație slide-up
- [ ] Drag handle în partea de sus
- [ ] Close pe tap outside sau swipe down
- [ ] Slot pentru conținut
- [ ] Suport pentru visible v-model
- [ ] Verify in browser: animația e smooth
- [ ] npm run build passes
### US-113: Batch Actions per Module (contextuale)
**Ca** utilizator
**Vreau** acțiuni batch diferite în funcție de modulul curent
**Pentru că** bonurile au ștergere, facturile au export+print, balanța doar export
**Acceptance Criteria:**
- [ ] MobileSelectionFooter acceptă prop `actions` array
- [ ] Bonuri: Delete button (existent) + Export
- [ ] Facturi: Export + Print
- [ ] Balanță: Export only
- [ ] Verify in browser pentru fiecare modul
- [ ] npm run build passes
### US-114: Integrare și testare completă
**Ca** QA
**Vreau** toate paginile testate pe multiple device-uri
**Pentru că** trebuie să fim siguri că nu sunt regresii
**Acceptance Criteria:**
- [ ] Test pe Chrome Android (real device sau emulator)
- [ ] Test pe Safari iOS (simulator sau real)
- [ ] Test desktop Chrome/Firefox/Safari
- [ ] Verify dark mode funcționează peste tot
- [ ] Verify landscape orientation
- [ ] npm run build passes
- [ ] Zero erori în console
---
## User Stories: Documentație și Reguli (Faza 7)
### US-115: Actualizare CSS_PATTERNS.md cu Mobile Material Design
**Ca** developer viitor
**Vreau** documentație completă pentru pattern-urile Mobile Material Design
**Pentru că** să pot implementa pagini noi consistent fără a citi codul existent
**Acceptance Criteria:**
- [ ] Secțiune nouă "Mobile Material Design Components" în CSS_PATTERNS.md
- [ ] Documentat MobileTopBar: structură HTML, clase CSS, props
- [ ] Documentat MobileBottomNav: linkuri, iconițe, structură
- [ ] Documentat MobileSelectionFooter: când se afișează, acțiuni
- [ ] Documentat BottomSheet: usage, v-model, slots
- [ ] Documentat SwipeableCards: props, dots indicator
- [ ] Exemple de cod copy-paste ready pentru fiecare componentă
- [ ] Screenshots/ASCII diagrams pentru layout-uri
### US-116: Actualizare DESIGN_TOKENS.md cu MD3 Tokens
**Ca** developer viitor
**Vreau** documentație pentru noile MD3 color tokens
**Pentru că** să știu ce variabile CSS să folosesc pentru Material Design
**Acceptance Criteria:**
- [ ] Secțiune nouă "Material Design 3 Tokens" în DESIGN_TOKENS.md
- [ ] Tabel cu toate variabilele MD3: `--md-sys-color-*`
- [ ] Mapping la tokens existenți (ex: `--md-sys-color-primary``--primary-color`)
- [ ] Exemple dark mode: cum se schimbă valorile
- [ ] Reguli când să folosești MD3 tokens vs tokens existenți
- [ ] Color swatches vizuale (ASCII sau referință la Figma)
### US-117: Actualizare CLAUDE.md cu Reguli Mobile Development
**Ca** Claude Code (AI)
**Vreau** reguli clare în CLAUDE.md pentru dezvoltare mobilă
**Pentru că** să respect pattern-urile stabilite la generarea automată de cod
**Acceptance Criteria:**
- [ ] Secțiune nouă "### Mobile Development Rules" în CLAUDE.md
- [ ] Regulă: "Toate paginile mobile TREBUIE să folosească MobileTopBar"
- [ ] Regulă: "Filtrele pe mobil se pun în BottomSheet, NU inline"
- [ ] Regulă: "Selecția multiplă afișează acțiuni în footer, NU în header"
- [ ] Regulă: "Touch targets minim 44x44px"
- [ ] Regulă: "Folosește isMobile composable pentru condiționare"
- [ ] Checklist rapid pentru code review mobile
### US-118: Creare MOBILE_PATTERNS.md dedicat
**Ca** developer
**Vreau** un fișier dedicat pentru documentația mobilă
**Pentru că** e prea mult pentru CSS_PATTERNS.md și merită propriul fișier
**Acceptance Criteria:**
- [ ] Fișier `docs/MOBILE_PATTERNS.md` creat
- [ ] Table of Contents cu linkuri rapide
- [ ] Secțiuni pentru fiecare componentă
- [ ] Secțiune "Quick Start" pentru devs noi
- [ ] Secțiune "Do's and Don'ts" cu exemple concrete
- [ ] Diagrame ASCII pentru layout mobile
- [ ] Linkuri către fișierele sursă componente
- [ ] Referință adăugată în CSS_PATTERNS.md și CLAUDE.md
### US-119: Actualizare claude-learn-frontend.md cu Pattern-uri Noi
**Ca** Claude Code (AI)
**Vreau** pattern-urile noi salvate în memoria Claude
**Pentru că** să le pot aplica automat în sesiuni viitoare
**Acceptance Criteria:**
- [ ] Pattern nou: "Mobile Material Design Component Architecture"
- [ ] Pattern nou: "Bottom Sheet Filter Pattern"
- [ ] Pattern nou: "Mobile Selection Mode Flow"
- [ ] Gotcha: "Nu duplica delete button în header și footer"
- [ ] Gotcha: "Filtrele mobile trebuie în BottomSheet"
- [ ] Format corect cu @date și tags
### US-120: Validare Documentație cu Fresh Developer Test
**Ca** lead developer
**Vreau** să validez că documentația e suficientă
**Pentru că** să mă asigur că un dev nou poate implementa o pagină mobilă fără ajutor
**Acceptance Criteria:**
- [ ] Un developer (sau AI) poate crea o pagină mobilă nouă doar din docs
- [ ] Toate componentele sunt documentate cu exemple
- [ ] Nu sunt referințe circulare sau documente lipsă
- [ ] Documentația e consistentă între fișiere
- [ ] npm run build passes după ce dev-ul urmează docs
## 4. Cerințe Funcționale
1. [REQ-001] Toate paginile mobile trebuie să aibă MobileTopBar cu structură identică
2. [REQ-002] MobileBottomNav trebuie să fie consistent între pagini (aceleași linkuri)
3. [REQ-003] Selecția multiplă trebuie să folosească footer fix, nu header tabel
4. [REQ-004] Filtrele pe mobil trebuie să fie în Bottom Sheet, nu inline
5. [REQ-005] App Bar Actions (iconițe) trebuie să respecte ordinea: refresh, export, print, more
6. [REQ-006] Dashboard KPI cards trebuie să fie swipeable cu dots indicator
7. [REQ-007] Navigarea înapoi trebuie să fie vizibilă în app bar pentru pagini secundare
8. [REQ-008] MD3 tokens trebuie să suporte toate cele 3 theme modes (auto/light/dark)
9. [REQ-009] Documentația trebuie actualizată ÎNAINTE de merge în main
10. [REQ-010] CLAUDE.md trebuie să conțină reguli explicite pentru mobile development
11. [REQ-011] Orice developer nou trebuie să poată implementa o pagină mobilă doar din documentație
## 5. Non-Goals (Ce NU facem)
- ❌ Nu modificăm layout-ul desktop (doar mobile)
- ❌ Nu schimbăm structura tabelelor existente (sunt deja optimizate)
- ❌ Nu implementăm gesture navigation nativă (back swipe) - folosim buton explicit
- ❌ Nu adăugăm animații complexe (transform, spring physics)
- ❌ Nu diferențiem comportamentul iOS vs Android (identic cross-platform)
- ❌ Nu modificăm logica backend sau API calls
- ❌ Nu implementăm pull-to-refresh (complexitate excesivă)
## 6. Considerații Tehnice
### Stack/Tehnologii
- Vue 3 Composition API
- PrimeVue components (Button, Dialog, Menu, Sidebar)
- CSS custom cu design tokens
- Touch events native (touchstart, touchmove, touchend)
### Patterns de Urmat
- Pattern existent din `ReceiptsListView.vue` (US-038, US-039, US-040)
- CSS tokens din `src/assets/css/core/tokens.css`
- Mobile breakpoint: `max-width: 768px`
- Touch target minimum: 44px
### Dependențe
- `useMediaQuery` composable pentru `isMobile`
- Router pentru navigare
- Design tokens existenți
### Riscuri Tehnice
- **Risc mediu**: Bottom Sheet poate avea probleme cu keyboard pe iOS
- Mitigare: Testare extensivă, fallback la modal simplu
- **Risc scăzut**: Swipe carousel poate conflicta cu scroll lateral pe tabele
- Mitigare: Disable swipe când e în tabel
## 7. Considerații UI/UX
### Layout Structure (Mobile)
```
┌─────────────────────────────────────┐
│ [☰/←] Title [🔍][⚙][⋮]│ ← MobileTopBar
├─────────────────────────────────────┤
│ [Filter Chips scrollable...] │ ← Optional, per page
├─────────────────────────────────────┤
│ │
│ Page Content │
│ (scrollable) │
│ │
├─────────────────────────────────────┤
│ [🏠] [📤] [📊] [⚙] │ ← MobileBottomNav
└─────────────────────────────────────┘
OR (when selection active):
├─────────────────────────────────────┤
│ [🗑️ Șterge selectate] │ ← MobileSelectionFooter
└─────────────────────────────────────┘
```
### Stări (States)
- **Normal**: Header cu hamburger, content, bottom nav
- **Selection Mode**: Header cu X și count, content cu checkmarks, footer cu delete
- **Filters Open**: Bottom sheet overlay cu filtre
- **Loading**: Skeleton sau spinner în content area
- **Empty**: Empty state centrat în content area
- **Error**: Toast notification
### Accesibilitate
- Touch targets minim 44x44px
- Focus visible pentru keyboard navigation
- ARIA labels pe butoanele icon-only
- Color contrast minim 4.5:1
## 8. Success Metrics
- **Consistență vizuală**: 100% pagini cu header identic
- **Code reuse**: Min 70% CSS din componente comune
- **Performance**: First Contentful Paint < 1.5s pe 3G
- **Bundle size**: Creștere max 10KB gzipped
## 9. Open Questions
- [ ] TelegramView are nevoie de interfață Material? (e admin-only)
- [ ] Cum gestionăm paginile cu mai mult de 4 acțiuni în app bar?
- [ ] OCRMetricsView necesită bottom nav sau e pagină secundară?
---
## Implementare Sugerată (Ordinea User Stories)
### Faza 1: Fundație (US-101, US-102)
1. Extract componente comune
2. Definire MD3 tokens
### Faza 2: Refactor Bonuri (US-103, US-104, US-105)
3. Validare API componente pe bonuri
4. Fix buton delete duplicat
5. Adaugă navigare înapoi
### Faza 3: Dashboard (US-106)
6. Implement swipeable cards
### Faza 4: Reports Module (US-107, US-108, US-109, US-110, US-111)
7. Apply pattern la fiecare pagină Reports
### Faza 5: Shared Components (US-112, US-113)
8. Bottom Sheet pentru filtre
9. Batch actions contextuale
### Faza 6: Testing (US-114)
10. Cross-device testing
### Faza 7: Documentație (US-115, US-116, US-117, US-118, US-119, US-120)
11. Creare MOBILE_PATTERNS.md dedicat
12. Actualizare CSS_PATTERNS.md cu referințe
13. Actualizare DESIGN_TOKENS.md cu MD3
14. Actualizare CLAUDE.md cu reguli mobile
15. Actualizare claude-learn-frontend.md cu patterns
16. Validare documentație cu fresh developer test
---
## Anexa A: Fișiere de Documentație Afectate
| Fișier | Tip Modificare | User Story |
|--------|---------------|------------|
| `docs/MOBILE_PATTERNS.md` | NOU | US-118 |
| `docs/CSS_PATTERNS.md` | Update | US-115 |
| `docs/DESIGN_TOKENS.md` | Update | US-116 |
| `CLAUDE.md` | Update | US-117 |
| `.claude/rules/claude-learn-frontend.md` | Update | US-119 |
## Anexa B: Structura Documentație Finală
```
docs/
├── MOBILE_PATTERNS.md # NOU - ghid complet mobile MD
├── CSS_PATTERNS.md # + link la MOBILE_PATTERNS.md
├── DESIGN_TOKENS.md # + secțiune MD3 tokens
├── ONBOARDING_CSS.md # + menționare mobile patterns
└── ...
CLAUDE.md # + secțiune Mobile Development Rules
.claude/rules/
└── claude-learn-frontend.md # + patterns & gotchas noi
```