Analisi dei 3 mockup (top-nav mega-menu, tema navy/oro, Inter, Lucide) → spec per migrare l'UI dal V2 (Bootstrap Italia/sidebar) al V3: design system (token/chrome/ componenti), architettura migrazione (riusa api.js/auth/help/i18n/FAB, sostituisce solo chrome+css), work-breakdown a fasi (F0 foundation+dashboard pilota; F1 flotta 1 agente/gruppo IA in worktree; F2 verifica), mappa IA, guardrail, acceptance per pagina, decisioni utente aperte (§7). Mockup = fonte visiva, dati reali non mock. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13 KiB
UI V3 Revamp — Spec operativa per FLOTTA di agenti
Obiettivo: migrare l'interfaccia di NIS2 Agile dal V2 attuale (Bootstrap Italia, sidebar a sinistra) al V3 proposto nei mockup (
docs/mockup Ui/): top-nav a mega-menu, tema navy + oro, font Inter, icone Lucide, card/stat moderne. Vincolo madre: è un redesign SOLO di presentazione. Tutto il backend, l'auth, il wiring dati (api.js), l'help, l'i18n, ARIA e il bug-reporter devono continuare a funzionare. NON si tocca PHP/DB/controller. Fonte di verità visiva: i 3 mockup indocs/mockup Ui/(index.html= chrome + dashboard;assessment.html= pagina-modulo/GAP;calendario.html= app full-page). I mockup sono mock: NON copiarne i dati finti né la logica fittizia — ricablare sui dati reali viaapi.js.
0. TL;DR per chi orchestra
- FASE 0 (1 agente, sequenziale, foundation) — estrarre il design system in
public/css/v3.css+ costruire la chrome condivisapublic/js/topnav-v3.js(appbar + mega-menu, data-driven) + self-hostare Inter e Lucide in/vendor+ migraredashboard.htmlcome pagina pilota cablata sui dati reali. Blocca: le altre pagine dipendono da questa. - FASE 1 (flotta in parallelo, N agenti, worktree isolati) — ogni agente migra un gruppo IA di pagine reali al V3 riusando
v3.css+topnav-v3.js, cablando i dati reali. - FASE 2 (1–2 agenti, verifica) — smoke per pagina (200, console pulita, dati reali, auth, responsive, a11y), cache-buster, commit.
⚠️ Decisione utente da confermare PRIMA della Fase 1 (vedi §7).
1. Design system V3 (estratto dai mockup — usare ESATTAMENTE)
Token CSS (:root in public/css/v3.css):
:root{
--navy-top:#0A2E54; --navy-nav:#103A61; --navy-hover:#1B4A75; --gold:#F0B429;
--bg:#EFF4FA; --card:#FFFFFF; --ink:#15263C; --muted:#64748B; --line:#E3E9F0;
--c-green:#1E8A5A; --c-blue:#1F5FA8; --c-amber:#D98324; --c-red:#C62828;
--radius:12px; --shadow:0 1px 2px rgba(16,40,80,.06),0 8px 24px rgba(16,40,80,.06);
}
- Font: Inter (400–800). ⚠️ Self-host in
/vendor/inter/(NO Google Fonts CDN: AGID/privacy/PWA-offline). Fallbacksystem-ui. - Icone: Lucide. ⚠️ Self-host lo UMD in
/vendor/lucide/lucide.min.js(NOunpkgCDN: CSP/offline). Uso<i data-lucide="...">+lucide.createIcons(). - Focus:
:focus-visible{outline:2px solid var(--gold)}(a11y).
Chrome condivisa (sostituisce la sidebar V2): .appbar = .bar-top (flag IT, logo-mark, brand, .search, .btn-incident "Registra incidente", .user) + .bar-nav con .nav-item > .nav-link e dropdown .mega / .mega.no-promo (vedi index.html righe 196–217). Attivo: .nav-link.active (bordo oro sotto).
Componenti (classi dai mockup, da portare in v3.css): .card/.card-pad, .stat (+.green/.amber/.blue, .ibox, .val, .bar), .badge-t (+ varianti colore), .btn-primary/.btn-ghost/.btn-incident, .sec-head, .page-head/.crumb, .sca/.act (liste scadenze/attività), .anag* (anagrafica), .doc (documenti), .fab-stack/.fab (trittico), calendario (.daystrip/.weekstrip/.daycell/.mini/.cal-pop per dashboard; .cal-app/.cal-main/.cal-side/.mv-grid/.view-switch/.legend per la pagina Calendario).
Responsive (dai mockup): breakpoint ≤900px (collassa griglie/mega, nasconde search) e ≤560px.
FAB trittico: nel mockup sono 3 (Notifiche / Assistenza / AI). ⚠️ NON reinventarli: NIS2 ha già il trittico cablato in common.js (campana notifiche + bug-reporter widget + ARIA chat con voce/puntatore/dati). Il V3 deve riusare quei FAB reali (eventualmente ri-stilarli), non i bottoni statici del mockup.
2. Architettura tecnica della migrazione (CRITICA)
Oggi (V2) ogni pagina carica: common.js (helper: auth checkAuth, showModal, showNotification, escHtml, FAB ARIA+bug-reporter, org-switcher) → api.js (client REST) → bundle Bootstrap Italia → common-bi.js (loadSidebar() = sidebar V2) → i18n.js → help.js → <pagina>.js.
Il V3 sostituisce solo la CHROME (sidebar → top-nav) e il CSS, riusando tutti gli helper. Strategia:
public/css/v3.css— design system completo (token + chrome + componenti). Sostituisce/affiancastyle.csssulle pagine V3.public/js/topnav-v3.js— renderizza l'appbar + mega-menu (comecommon-bi.jsfa per la sidebar), data-driven da un arraynavGroups(la mappa IA §6), conaria-currentsul gruppo attivo, ed espone gli stessi hook usati a init (window.loadSidebarpuò essere ridefinito aloadTopnav, così le pagine non cambiano l'init). Riusa org-switcher/utente/logout/versione dacommon.js.- Per pagina: nuovo
<head>(Inter+Lucide self-host +v3.css), nuovo markup (struttura dal mockup), ma stessi scriptcommon.js/api.js/i18n.js/help.js/<pagina>.js+topnav-v3.jsal posto dicommon-bi.js. Il<pagina>.jsresta quello reale (dati veri); si adatta solo il markup/i selettori se necessario. - Help/ARIA: aggiornare
help.js(_pageMapinvariato) eAIService::navigationMapBlocksolo se cambiano i nomi delle voci di menu (la nuova IA li raggruppa: vedi §6 — riconciliare con la mappa ARIA, che oggi riflette le sezioni sidebar). Vedi memoriaproject_aria_chat_wiring.
Conseguenza: non si butta
<pagina>.js(è il wiring reale). Si rifà il guscio HTML + la chrome. Questo è ciò che rende parallelizzabile per pagina.
3. FASE 0 — Foundation (1 agente, sequenziale, NO parallelo)
Deliverable (in un solo commit, pagina pilota verificata):
public/css/v3.csscon token + chrome + tutti i componenti dei mockup.public/js/topnav-v3.js(appbar + mega-menu data-driven, riusa helper common.js,aria-current, responsive/mobile toggle).- Self-host Inter (
/vendor/inter/) e Lucide (/vendor/lucide/lucide.min.js) + relativi@font-face/<script>locali (no CDN). dashboard.htmlmigrata end-to-end al V3, cablata sui dati reali (api.js: overview/score/deadlines/recent-activity ecc., stati loading/empty/error), con il trittico FAB reale (ARIA/bug-reporter/notifiche) e l'help "?".- La mappa IA §6 finalizzata in
topnav-v3.js. Acceptance F0: dashboard 200, console pulita, dati reali, nav attivo, responsive ≤900/≤560, a11y focus/contrasto,node --checksutopnav-v3.js. Commit[FEAT] UI V3 — foundation + dashboard pilota.
4. FASE 1 — Migrazione pagine (flotta in parallelo)
- 1 agente per GRUPPO IA (§6), in worktree isolato (
isolation: worktree) per evitare conflitti su file condivisi. - Ogni agente, per ogni pagina del suo gruppo: rifà
<head>+ markup V3 (dal pattern della dashboard pilota + dai mockupassessment.html/calendario.htmlper i pattern modulo/app), agganciatopnav-v3.js+v3.css, mantiene il<pagina>.jsreale (adatta i selettori se il markup cambia), verifica i dati reali. - NON inventare endpoint: usare quelli già in
api.js. Se manca un dato che il mockup mostra, renderlo "—"/placeholder, non fingerlo. Acceptance F1 per pagina: vedi §8.
5. FASE 2 — Verifica & rilascio (1–2 agenti)
- Smoke ogni pagina su prod: 200, console JS pulita, dati reali caricano,
checkAuth, i18n IT/EN, help "?", trittico FAB, responsive, a11y (focus/contrasto/aria), nessun CDN esterno (CSP/PWA). - Cache-buster
?v=aggiornato su tutte le pagine che referenzianov3.css/topnav-v3.js/common.jsmodificati (la propagazione JS/CSS statica è via bind-mount; nessun USR2 perché non si toccano.php). - Aggiornare
sw.js(cache shell V3) + bump nome cache;manifesttheme-color resta#0066CCo si valuta il navy (decisione utente).
6. Mappa IA (gruppi mega-menu → pagine reali)
Dal mockup index.html. Riconciliare con TUTTE le ~30 pagine reali; le pagine non presenti nel mockup sono marcate ➕ e vanno collocate dalla flotta (proposta tra parentesi).
- Dashboard →
dashboard.html - Calendario →
calendario.html - Stakeholders (mega):
stakeholders.html·supply-chain.html·stakeholder-activities.html - Struttura interna (mega):
organigramma.html·competenze.html· GAP Analysisassessment.html·training.html - Rischi (mega): Mappa rischi
risks.html· Inventarioassets.html·policies.html· ➕ Connettori Discoveryconnettori-discovery.html(Inventario/Operativo) - Monitoraggio (mega): Segnalazioni
whistleblowing.html·internal-audits.html· Audit ACNreports.html· ➕controlli-periodici.html· ➕ Riesame di Direzionemanagement-review.html - Lex e ISO (mega):
normative.html· Modello SGSIisms.html·misure-requisiti.html - AI (mega):
cross-analysis.html·kb.html - Guida (mega):
guida.html·integrazioniext.html· Impostazionisettings.html·architecture.html· ➕simulate.html
➕ da decidere:
companies.html(consulente), pagine admin (admin/*). Pagine pubbliche (index.htmllanding,login/register/onboarding,segnala-anonimo.html) NON ricevono la chrome top-nav (restano pubbliche).
7. ⚠️ Decisioni da confermare con l'utente PRIMA della Fase 1
- Big-bang vs graduale: il V3 sostituisce il V2 su tutte le pagine in un'unica ondata, oppure convive dietro flag (es.
?ui=v3/ preferenza utente) durante la transizione? (Consigliato: pagina pilota + rollout graduale per gruppo, non big-bang.) - Sidebar → top-nav su tutto: confermare l'abbandono della sidebar V2 (è cambio di IA e di abitudini per gli utenti già formati).
- Brand/temi: il navy/oro sostituisce il blu Italia
#0066CC? Impattatheme-color/manifest/AGID (Bootstrap Italia è un requisito AGID per la PA — verificare che il target NIS2 lo consenta; vedi memoriaproject_bootstrap_italia_rollout). - i18n: i mockup sono solo IT — il V3 deve mantenere il toggle IT/EN (
i18n.js).
8. Acceptance criteria PER PAGINA (Fase 1)
- Chrome V3 (appbar + mega-menu) presente; gruppo/voce attiva corretta (
aria-current). - Dati REALI via
api.js(zero mock); stati loading / empty / error gestiti. checkAuth(auth + redirect login) funzionante; i18n IT/EN; help "?"; trittico FAB reale (ARIA + bug-reporter + notifiche).- Responsive ≤900 e ≤560; a11y WCAG 2.1 AA (focus-visible, contrasto, touch ≥44px, aria-label, zoom non bloccato).
- Nessun CDN esterno (Inter/Lucide self-host); CSP/PWA ok.
node --checksui JS toccati; pagina 200; console pulita.- Cache-buster
?v=aggiornato.
9. Guardrail VINCOLANTI (per ogni agente)
- Solo UI: NON toccare PHP/controller/DB/migrazioni/api.js (a meno di aggiungere metodi mancanti, da concordare). Il wiring dati è quello esistente.
- Riusare gli helper di
common.js(auth, modal, notify, FAB ARIA/bug-reporter, org-switcher) — non duplicarli. - Self-host font/icone (no CDN: CSP, offline-PWA, privacy, AGID).
- Lock
/tmp/agent-working.lockmentre si lavora (il supervisore cron lo rispetta e salta). Rimuoverlo a fine lavoro. - Worktree isolation per gli agenti paralleli (Fase 1).
- Commit chirurgico per batch:
[FEAT] UI V3: <gruppo/pagina>+ footerCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>.git push origin main(helper vault dal devenv) — sequenziale tra worktree per evitare race sul push. - Deploy: HTML/JS/CSS statici → live via bind-mount + cache-buster, nessun USR2 (solo se si toccasse un
.php, qui no). Reload host non necessario per sola UI. - A11y/AGID: mantenere o migliorare il livello attuale (Bootstrap Italia era conforme AGID; il V3 deve restare WCAG 2.1 AA).
- Verità, non finzione: se un dato del mockup non esiste nel backend, mostrarlo come placeholder/empty, non inventarlo.
10. Orchestrazione consigliata
- FASE 0: 1 agente (sequenziale). Output = foundation + dashboard pilota. Gate manuale: l'utente valida la pilota prima di aprire la flotta.
- FASE 1:
Workflow/Agentconisolation: worktree, 1 agente per gruppo IA (§6) → ~8 agenti paralleli. Ogni agente legge: questo spec + i 3 mockup + la dashboard pilota (pattern) + il<pagina>.jsreale. - FASE 2: 1–2 agenti di verifica + sweep cache-buster +
sw.js. - Riferimenti memoria:
project_bootstrap_italia_rollout(il V2 attuale è BI),project_aria_chat_wiring(nav-map ARIA da riconciliare),reference_jsonpaginated_contract(contratto liste),project_prod_topology_host_fpm(deploy).
Nota: questo è il piano. Lanciare la flotta solo dopo le decisioni §7. Per partire in sicurezza: eseguire solo la FASE 0 (foundation + pilota), revisionare, poi aprire la Fase 1.