initial commit
This commit is contained in:
69
docs/development/devlog/2025-12-15-111000_initial_plan.md
Normal file
69
docs/development/devlog/2025-12-15-111000_initial_plan.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# Piano di Sviluppo - Zentral (OBIS Safety)
|
||||
Data: 2025-12-15
|
||||
Stato: Pianificazione Iniziale
|
||||
|
||||
## Obiettivo
|
||||
Creare una Web App SaaS ("Zentral") per la gestione della formazione sicurezza OBIS, sostituendo Excel con un sistema automatizzato.
|
||||
|
||||
## 1. Architettura del Sistema
|
||||
|
||||
### Backend (Node.js)
|
||||
- **Framework**: Express.js con TypeScript.
|
||||
- **Struttura**: Modulare (vedi `src/backend/src/modules`).
|
||||
- **Database**:
|
||||
- **ORM**: Prisma (Supporto nativo per SQLite in dev e PostgreSQL in prod).
|
||||
- **Dev**: SQLite (`dev.db`).
|
||||
- **Prod**: PostgreSQL.
|
||||
- **API**: RESTful standard `api/[modulo]/[risorsa]`.
|
||||
- **Sicurezza**: Helmet, CORS, input validation (Zod/Joi), password hashing (Argon2/Bcrypt).
|
||||
|
||||
### Frontend (React)
|
||||
- **Build Tool**: Vite.
|
||||
- **Linguaggio**: TypeScript.
|
||||
- **UI/UX**:
|
||||
- Design System: Custom basato su "Material Design" ma con estetica "Premium" (colori vibranti, glassmorphism).
|
||||
- Styling: Vanilla CSS (Variabili CSS per temi) + CSS Modules per scoping.
|
||||
- Componenti: React standard.
|
||||
- **Stato**: React Context + Hooks per gestione globale semplice.
|
||||
|
||||
## 2. Roadmap di Implementazione
|
||||
|
||||
### Fase 1: Setup e Fondamenta (Oggi)
|
||||
- [x] Inizializzazione Repository e Cartelle (`src/backend`, `src/frontend`).
|
||||
- [x] Setup Backend: Express, Prisma, Struttura Modulare base.
|
||||
- [x] Setup Frontend: Vite React, Configurazione CSS Base (Design Tokens), Layout App Shell (Sidebar, Header).
|
||||
- [x] Configurazione Database iniziale (Schema Prisma: User, Company preliminary).
|
||||
|
||||
### Fase 2: Gestione Anagrafiche
|
||||
- [x] Modulo Aziende (Companies): CRUD, Sedi.
|
||||
- [x] Modulo Lavoratori (Workers): CRUD, Associazione Azienda.
|
||||
- [x] UI per Anagrafiche: Tabelle moderne, Form di inserimento laterali o modali.
|
||||
|
||||
### Fase 3: Core Formazione
|
||||
- [x] Modulo Corsi (Courses): Catalogo, tipologie, validità.
|
||||
- [x] Modulo Eventi (TrainingEvents): Gestione eventi, upload attestati (Parziale).
|
||||
- [x] Logica Calcolo Scadenze (Service layer dedicate).
|
||||
|
||||
### Fase 4: Scadenzario e Dashboard
|
||||
- [x] Dashboard KPI: Grafici di copertura.
|
||||
- [x] Scadenzario: Datatable avanzata (Filtri, Sort, Export Excel).
|
||||
|
||||
### Fase 5: Notifiche e Comunicazioni
|
||||
- [x] Sistema Code Mail (Redis/Bull o tabella DB semplice per MVP).
|
||||
- [x] Template Engine (Mock/Simple).
|
||||
- [x] Workflow approvazione manuale invii.
|
||||
|
||||
## 3. Modello Dati Preliminare (Schema ER semplificato)
|
||||
|
||||
- **Company**: id, name, vatNumber, email, phone, status...
|
||||
- **Site**: id, companyId, address, city...
|
||||
- **Worker**: id, companyId, siteId, firstName, lastName, taxCode (CF), jobTitle, status...
|
||||
- **Course**: id, title, type, validityYears, hasPostExpiryReminder...
|
||||
- **TrainingEvent**: id, workerId, courseId, eventDate, expiryDate, provider, status (Valid/Expiring/Expired), certificateUrl...
|
||||
- **Notification**: id, companyId, type (Pre/At/Post), status (Pending/Sent/Error), scheduledDate...
|
||||
|
||||
## 4. Azioni Immediate
|
||||
1. Creare struttura cartelle.
|
||||
2. Inizializzare Backend (`npm init`, installazione dipendenze base).
|
||||
3. Inizializzare Frontend (`npm create vite`).
|
||||
4. Definire Schema Prisma iniziale.
|
||||
24
docs/development/devlog/2025-12-15-113000_setup_complete.md
Normal file
24
docs/development/devlog/2025-12-15-113000_setup_complete.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Setup Completato
|
||||
Data: 2025-12-15
|
||||
Stato: Completato
|
||||
|
||||
## Attività Svolte
|
||||
1. **Backend**:
|
||||
- Creato progetto Node.js + TypeScript (`src/backend`).
|
||||
- Configurato Prisma ORM con SQLite (`dev.db`).
|
||||
- Definito Schema iniziale (Company, Site, Worker).
|
||||
- Configurato Express server base.
|
||||
2. **Frontend**:
|
||||
- Creato progetto Vite React + TypeScript (`src/frontend`).
|
||||
- Implementato Design System in `index.css` (CSS Variables, Glassmorphism).
|
||||
- Creata struttura cartelle modulare.
|
||||
3. **Verifica**:
|
||||
- Database inizializzato con successo.
|
||||
- Script `dev` backend aggiunto.
|
||||
|
||||
## Prossimi Passi (Fase 2)
|
||||
Implementare la gestione Anagrafiche (Aziende e Lavoratori):
|
||||
- [ ] Backend: Controller e Service per `Companies`.
|
||||
- [ ] Backend: Controller e Service per `Workers`.
|
||||
- [ ] Frontend: Pagina lista Aziende.
|
||||
- [ ] Frontend: Form creazione Azienda.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Implementazione Anagrafiche (Aziende e Lavoratori)
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Implementare il modulo gestione anagrafiche completo (Backend API + Frontend UI) per Aziende e Lavoratori.
|
||||
|
||||
## Backend (Node.js/Express)
|
||||
- [ ] Struttura Modulare: setup cartelle `src/modules/{companies,workers}/{controllers,services,routes}`.
|
||||
- [ ] **Companies Module**:
|
||||
- [ ] Service: `create`, `findAll`, `findOne`, `update`, `delete`.
|
||||
- [ ] Controller: Endpoint REST.
|
||||
- [ ] Routes: `GET /api/companies`, `POST`, `PUT`, `DELETE`.
|
||||
- [ ] **Workers Module**:
|
||||
- [ ] Service: CRUD con relazione Azienda/Sede.
|
||||
- [ ] Controller: Endpoint REST.
|
||||
- [ ] Routes: `GET /api/workers` (con filtri), `POST`, etc.
|
||||
|
||||
## Frontend (React)
|
||||
- [ ] **Core**:
|
||||
- [ ] Setup `react-router-dom`.
|
||||
- [ ] Setup Client API (Axios instance).
|
||||
- [ ] Layout Component (Sidebar Menu).
|
||||
- [ ] **Companies UI**:
|
||||
- [ ] Page: Lista Aziende (Tabella).
|
||||
- [ ] Component: Form Azienda (Modale o Pagina dedicata).
|
||||
- [ ] **Workers UI**:
|
||||
- [ ] Page: Lista Lavoratori.
|
||||
- [ ] Component: Form Lavoratore.
|
||||
|
||||
## Note Tecniche
|
||||
- Usare `zod` per validazione input backend (se possibile, altrimenti validazione manuale per velocità MVP).
|
||||
- Frontend: usare componenti riutilizzabili per inputs e tabelle.
|
||||
@@ -0,0 +1,61 @@
|
||||
# Fase 3 & 4: Core Formazione e Scadenzario
|
||||
Data: 2025-12-15
|
||||
Stato: Pianificazione
|
||||
|
||||
## Obiettivo
|
||||
Implementare il cuore del sistema: Catalogo Corsi, Eventi Formativi e Logica Scadenze, concludendo con la Dashboard Scadenzario.
|
||||
|
||||
## 3. Core Formazione (Backend + Frontend)
|
||||
|
||||
### Backend
|
||||
- **Schema Prisma Aggiornato**:
|
||||
- `Course` (nome, validità anni, isSafety).
|
||||
- `TrainingEvent` (workerId, courseId, date, expiryDate, fileUrl).
|
||||
- **Moduli**:
|
||||
- `src/modules/courses`: CRUD.
|
||||
- `src/modules/training`:
|
||||
- CRUD Eventi.
|
||||
- **Logica Business**: Calcolo automatico `expiryDate` (Data Corso + Validità Corso).
|
||||
- Upload file (Multer locale per ora).
|
||||
|
||||
### Frontend
|
||||
- **Courses UI**:
|
||||
- Lista Corsi (Tabella).
|
||||
- Gestione (Add/Edit) per definire le tipologie.
|
||||
- **Training UI**:
|
||||
- Pagina dettaglio Lavoratore: Tab "Formazione".
|
||||
- Form registrazione evento: Selezione Corso, Data. Calcolo scadenza automatico (mostrato preview).
|
||||
- Upload file.
|
||||
|
||||
### Stato Avanzamento
|
||||
- [x] Backend: Model `Course` e `TrainingEvent`
|
||||
- [x] Backend: Service e Controller CRUD Base
|
||||
- [x] Backend: Calcolo automatico scadenza
|
||||
- [x] Frontend: Pagina Lista Corsi
|
||||
- [x] Frontend: Form Creazione/Modifica Corsi
|
||||
- [x] Frontend: Integrazione Formazione in Dettaglio Lavoratore
|
||||
- [x] Frontend: Form Aggiunta Evento Formativo
|
||||
- [ ] Backend: Scheduler per controllo scadenze (Job notturno)
|
||||
- [ ] Backend: Endpoint Report Scadenze (Dashboard)
|
||||
|
||||
## 4. Scadenzario & Dashboard
|
||||
|
||||
### Backend
|
||||
- **Service Scadenzario**:
|
||||
- Query ottimizzate per trovare scadenze in range (prossimi 60gg).
|
||||
- Stati: `VALID`, `EXPIRING` (es. < 2 mesi), `EXPIRED`.
|
||||
|
||||
### Frontend
|
||||
- **Dashboard Home**:
|
||||
- Card KPI (Totale Lavoratori, Scadenze imminenti, Scaduti).
|
||||
- **Pagina Scadenzario**:
|
||||
- Grande tabella filtrabile.
|
||||
- Celle colorate per stato (Verde, Giallo, Rosso).
|
||||
- Export Excel (lato client con libreria `xlsx` o simile).
|
||||
|
||||
## Ordine di esecuzione immediato
|
||||
1. Aggiornamento schema Prisma (Corsi, Eventi).
|
||||
2. Backend API Corsi & Eventi.
|
||||
3. Frontend UI Corsi.
|
||||
4. Frontend UI Eventi (dentro lavoratore).
|
||||
5. Dashboard Scadenzario.
|
||||
@@ -0,0 +1,29 @@
|
||||
# Implementazione Scadenzario (Deadlines)
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Creare la vista "Scadenzario" che permette di monitorare tutte le scadenze formative. È il cuore operativo del sistema.
|
||||
|
||||
## Funzionalità Richieste
|
||||
1. **Lista Scadenze**: Tabella con Lavoratore, Azienda, Corso, Data Scadenza, Stato.
|
||||
2. **Filtri**:
|
||||
- Per Stato (Scaduto, In Scadenza, Valido).
|
||||
- Per Periodo (Mese/Anno o Range di date).
|
||||
- Per Azienda.
|
||||
3. **Indicatori Visivi**: Semafori (Rosso=Scaduto, Arancio=In Scadenza < 30gg, Verde=Valido).
|
||||
|
||||
## Piano Tecnico
|
||||
|
||||
### Backend (`src/backend/src/modules/deadlines`)
|
||||
- [x] `deadline.service.ts`: Query su `TrainingEvent` con ordinamento per `expiryDate`.
|
||||
- [x] `deadline.controller.ts`: API endpoint con supporto query params per filtri.
|
||||
- [x] `deadlines.routes.ts`: Route `GET /`.
|
||||
|
||||
### Frontend (`src/frontend/src/modules/deadlines`)
|
||||
- [x] `DeadlinesPage.tsx`: Pagina principale.
|
||||
- [x] Integrazione in `Layout.tsx` (Menu laterale).
|
||||
- [x] Tabella avanzata con filtri lato server (o client per MVP se i dati sono pochi). *Decisione: Lato Server per scalabilità.*
|
||||
|
||||
## Modifiche
|
||||
...
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
# Piano di Sviluppo: Completamento Anagrafiche (Sedi) e Dashboard
|
||||
|
||||
Obiettivo: Completare le funzionalità mancanti per rendere l'applicazione pienamente operativa per la gestione della formazione.
|
||||
|
||||
## 1. Gestione Sedi (Sites)
|
||||
Le sedi operative sono fondamentali per allocare i lavoratori.
|
||||
- [x] **Backend**: Modulo `sites` (CRUD).
|
||||
- Rotte: `GET /sites`, `GET /sites?companyId=...`, `POST /sites`, `PUT /sites/:id`, `DELETE /sites/:id`.
|
||||
- [x] **Frontend**: Pagina Dettaglio Azienda.
|
||||
- Visualizzazione dati azienda.
|
||||
- Tabella Sedi associate.
|
||||
- Form (Modal) per Aggiunta/Modifica Sede.
|
||||
- [x] **Frontend**: Integrazione nel Form Lavoratore.
|
||||
- Abilitare la select "Sede" filtrata in base all'azienda selezionata.
|
||||
|
||||
## 2. Dashboard e Scadenziario
|
||||
- [x] **Backend**: Endpoint `GET /dashboard/stats`.
|
||||
- Conteggio scadenze (Scaduti, In scadenza 30gg, Validi).
|
||||
- Prossimi corsi in programma.
|
||||
- [x] **Frontend**: Widget Dashboard.
|
||||
- Cards riepilogative (KPI).
|
||||
- Tabella "In Scadenza" veloce (Solo KPI per ora).
|
||||
|
||||
## 3. Notifiche (Base)
|
||||
- [x] Implementazione servizio invio mail (Stub/Log per ora).
|
||||
22
docs/development/devlog/2025-12-15-120500_phase6_auth.md
Normal file
22
docs/development/devlog/2025-12-15-120500_phase6_auth.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Fase 6: Autenticazione e Sicurezza
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Proteggere l'accesso all'applicazione tramite login e gestire gli utenti amministratori.
|
||||
|
||||
## Piano Tecnico
|
||||
|
||||
### Backend
|
||||
- [x] Aggiornare Schema: `User` (email, passwordHash, role).
|
||||
- [x] `auth.service.ts`:
|
||||
- Funzioni per hashing password (bcrypt/argon2).
|
||||
- Login (verifica password e emissione JWT).
|
||||
- [x] `auth.middleware.ts`: Verifica JWT su rotte protette.
|
||||
- [x] `auth.controller.ts`: Endpoint `/login`, `/me`.
|
||||
|
||||
### Frontend
|
||||
- [x] `AuthContext.tsx`: Gestione stato utente e token.
|
||||
- [x] `LoginPage.tsx`: Form di login.
|
||||
- [x] `PrivateRoute.tsx`: Protezione rotte.
|
||||
- [x] Aggiornare `Layout` con pulsante Logout.
|
||||
26
docs/development/devlog/2025-12-15-121000_phase7_import.md
Normal file
26
docs/development/devlog/2025-12-15-121000_phase7_import.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Fase 7: Importazione Dati Massiva
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Permettere l'importazione massiva di dati da file Excel per facilitare la migrazione iniziale dai vecchi sistemi.
|
||||
|
||||
## Funzionalità
|
||||
1. **Upload Excel**: L'utente carica un file `.xlsx`.
|
||||
2. **Parsing & Validazione**: Il sistema legge il file e valida i dati (campi obbligatori, formati).
|
||||
3. **Inserimento/Upsert**: Creazione o aggiornamento dei record nel database.
|
||||
4. **Supporto Entità**:
|
||||
- Aziende
|
||||
- Lavoratori (collegati ad aziende esistenti o create al volo)
|
||||
- Storico Formazione (opzionale/avanzato)
|
||||
|
||||
## Piano Tecnico
|
||||
|
||||
### Backend
|
||||
- [x] Installare `multer` (upload) e `xlsx` (parsing).
|
||||
- [x] `import.service.ts`: Logica di lettura Excel e mappatura verso Prisma.
|
||||
- [x] `import.controller.ts`: Endpoint `POST /api/import/workers`.
|
||||
|
||||
### Frontend
|
||||
- [x] `ImportPage.tsx`: Interfaccia di upload drag & drop.
|
||||
- [x] Feedback importazione (Righe importate, eventuali errori).
|
||||
@@ -0,0 +1,26 @@
|
||||
# Fase 5: Notifiche e Comunicazioni
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Implementare il sistema di generazione e invio delle notifiche di scadenza alle aziende.
|
||||
|
||||
## Requisiti
|
||||
1. **Generazione Automatica**: Il sistema deve identificare i corsi in scadenza (es. preavviso 30gg) e generare una "proposta di notifica".
|
||||
2. **Review Umana**: Le notifiche non partono subito; l'operatore deve poterle visionare nella sezione "Comunicazioni" e approvarle.
|
||||
3. **Queue System**: Gestione dello stato della notifica (Pending -> Sending -> Sent/Error).
|
||||
4. **Email Templates**: Uso di template HTML per le mail.
|
||||
|
||||
## Piano Tecnico
|
||||
|
||||
### Backend
|
||||
- [x] Installazione `nodemailer` e `ejs` per templating.
|
||||
- [x] Aggiornamento Schema Prisma: Aggiunta model `Notification` (type: EXPIRING_REMINDER, status: PENDING/SENT).
|
||||
- [x] `notification.service.ts`:
|
||||
- `generateReminders()`: Scansiona `TrainingEvent` e crea record `Notification`.
|
||||
- `sendPending(ids[])`: Invia le mail selezionate.
|
||||
- [x] `notification.controller.ts`: Endpoints per lista, generazione e invio.
|
||||
|
||||
### Frontend
|
||||
- [x] `CommunicationsPage.tsx`: Tabella delle notifiche generate.
|
||||
- [x] Azioni massive: "Genera Nuove" e "Invia Selezionate".
|
||||
@@ -0,0 +1,19 @@
|
||||
# Fase 8: Deployment e Configurazione Produzione
|
||||
Data: 2025-12-15
|
||||
Stato: In Corso
|
||||
|
||||
## Obiettivo
|
||||
Configurare l'ambiente di produzione utilizzando Docker per garantire replicabilità e stabilità. Passaggio da SQLite (Dev) a PostgreSQL (Prod).
|
||||
|
||||
## Requisiti
|
||||
1. **Containerizzazione**: Dockerfile per Backend e Frontend.
|
||||
2. **Orchestrazione**: `docker-compose.yml` per gestire i servizi (App, DB, Reverse Proxy).
|
||||
3. **Database**: PostgreSQL per produzione.
|
||||
4. **Automazione**: Makefile per comandi rapidi.
|
||||
|
||||
## Piano Tecnico
|
||||
- [x] Creare `src/backend/Dockerfile`.
|
||||
- [x] Creare `src/frontend/Dockerfile` (Nginx per serve statico).
|
||||
- [x] Creare `docker-compose.yml` (Backend, Frontend, Postgres).
|
||||
- [x] Aggiornare Prisma per supportare PostgreSQL via Environment Variable (gestito via `sed` in build).
|
||||
- [x] Creare `Makefile` per shortcut (build, up, down, logs).
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
# 2025-12-15 12:30:00 - Bug Fixes and Verification
|
||||
|
||||
## Stato Attuale
|
||||
L'applicazione è stata riparata e verificata.
|
||||
|
||||
## Problemi Risolti
|
||||
1. **Backend non rispondeva/non sincronizzato**: Il servizio backend in esecuzione (`npm run dev`) non era sincronizzato con il database SQLite, portando a errori di autenticazione ("Errore durante l'autenticazione").
|
||||
- *Soluzione*: Eseguito `npx prisma generate` e `npx prisma db push`. Riavviato il servizio backend sulla porta 3000.
|
||||
2. **Import Error nel Frontend**: L'applicazione non si avviava a causa di percorsi di import errati per `api.ts` in diversi file.
|
||||
- *Soluzione*: Corretti i percorsi relativi in `ImportPage.tsx`, `CommunicationsPage.tsx`, `DeadlinesPage.tsx`, `LoginPage.tsx`, `AuthContext.tsx`.
|
||||
3. **Lint Errors**:
|
||||
- Rimosso import inutilizzato di `useDebounce` in `DeadlinesPage.tsx`.
|
||||
- Corretto import `type ReactNode` e rimosso `api`/`useLocation` inutilizzati in `AuthContext.tsx`.
|
||||
|
||||
## Verifiche Effettuate
|
||||
- **Database**: Verificato che lo schema è sincronizzato.
|
||||
- **Registrazione Utente**: Creato utente admin (`admin@test.com` / `admin`) tramite script diretto.
|
||||
- **Login**: Accesso via browser riuscito con successo.
|
||||
- **Dashboard**: La Dashboard si carica correttamente e mostra i contatori a 0.
|
||||
|
||||
## Prossimi Passi
|
||||
- Proseguire con l'implementazione del modulo di Importazione (Phase 7) o popolamento dati.
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
# Completamento Sistema: Scheduler Notifiche
|
||||
|
||||
Obiettivo: Automatizzare la generazione e l'invio delle notifiche di scadenza.
|
||||
|
||||
## Backend
|
||||
- [x] Installazione `node-cron`.
|
||||
- [x] Creazione `src/backend/src/scheduler.ts`.
|
||||
- Job notturno (es. 02:00 AM) per generare i reminder (`generateReminders`).
|
||||
- Job frequente (es. ogni 10 min o subito dopo) per processare la coda (`sendPending`).
|
||||
- [x] Integrazione in `src/backend/src/index.ts` per avviare lo scheduler.
|
||||
|
||||
## Verifica
|
||||
- [ ] Avvio backend e verifica log "Scheduler started".
|
||||
- [ ] Test manuale (trigger via API o modificando crontab per esecuzione immediata).
|
||||
|
||||
## Chiusura Progetto
|
||||
- [ ] Aggiornamento `DEVELOPMENT.md` finale.
|
||||
- [ ] Verifica `devlog` precedenti e mark as complete.
|
||||
21
docs/development/devlog/2025-12-15-123500_ui_overhaul.md
Normal file
21
docs/development/devlog/2025-12-15-123500_ui_overhaul.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 2025-12-15-123500_ui_overhaul.md
|
||||
|
||||
## Objective
|
||||
Overhaul the UI/UX to create a premium, modern, and aesthetically pleasing experience ("Wow" factor), moving away from the "unwatchable" current state.
|
||||
|
||||
## Design Direction
|
||||
- **Theme:** Modern Dark/Light mode (default Dark deep premium).
|
||||
- **Palette:** Deep slate/navy backgrounds, vibrant accents (violet/indigo/teal gradients), glassmorphism effects.
|
||||
- **Typography:** Modern sans-serif (Inter/Roboto).
|
||||
- **Components:**
|
||||
- **Sidebar:** Glassmorphism, better spacing, active state indicators.
|
||||
- **Cards:** Subtle borders, soft shadows, hover lifts.
|
||||
- **Tables:** Clean headers, spacious rows, hover effects, specific status badges.
|
||||
- **Animations:** Page transitions, button hover states.
|
||||
|
||||
## Tasks
|
||||
- [x] Define new Color Palette and CSS Variables in `index.css`.
|
||||
- [x] Refactor `MainLayout` for better structure and glass sidebar.
|
||||
- [x] Update `Dashboard` widgets style.
|
||||
- [x] Update `Companies` table style.
|
||||
- [x] Global typography update.
|
||||
Reference in New Issue
Block a user