feat: pagina Impostazioni redesign Quiet Luxury — sezioni tokenizzate + PoolManager tassonomie dual-mode

- impostazioni/page.tsx: sezione Analytics con input tariffa bordato (€/h, font-mono) + header uppercase
- TaxonomyManager: card sezione tokenizzata, griglie Offerte (2col) / Catalogo (3col)
- PoolManager: box bg-muted, badge conteggio mono, chip valori, add su Enter, delete cascade confermata
- DESIGN-SYSTEM.md: note pagina Impostazioni

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-12 12:14:52 +02:00
parent d444bd6064
commit dd2d148457
5 changed files with 502 additions and 100 deletions
+25
View File
@@ -303,6 +303,31 @@ header `bg-muted/50` uppercase muted, righe `hover:bg-muted/40` + `divide-y divi
- **Redditività**: `null` (0h tracciate) → `` muted; `>0` → emerald bold con dot
`bg-emerald-500`; `=0` → mono muted. Footer "Mostrando N di N progetti attivi".
### Impostazioni notes
`/admin/impostazioni` migrata a "Quiet Luxury" (replica `design-reference/pagina-impostazioni`).
Pagina a sezioni impilate (`space-y-8`), ogni sezione è una card
`rounded-xl border-border-light bg-card shadow-card p-6`.
- **Header**: `PageHeader` "Impostazioni" + sottotitolo ("Configura le tariffe target e gestisci
le tassonomie globali del sistema").
- **Titoli sezione**: `text-xs font-bold uppercase tracking-wider text-foreground`, sottotitolo
`text-xs text-tertiary`. Le sezioni tassonomia hanno un'icona (`Tag`/`BookOpen`) in un box
`h-9 w-9 rounded-lg border-border-light bg-muted text-muted-foreground`.
- **Analytics Profittabilità**: form server-action con input `type=number` in un gruppo bordato
`focus-within:border-primary focus-within:ring-1 ring-primary`, prefisso ``/suffisso `/h`
muted assoluti, valore `font-mono`; bottone "Salva" `bg-primary text-primary-foreground`.
- **Griglie tassonomia** (`TaxonomyManager`): `border-t border-border-light pt-4` + grid
`gap-6` — Offerte `md:grid-cols-2`, Catalogo `md:grid-cols-2 lg:grid-cols-3`.
- **PoolManager** (box campo): `rounded-xl border-border-light bg-muted/40 p-5 flex flex-col
justify-between`. Testata = label uppercase muted + badge conteggio mono
(`bg-card border-border-light text-tertiary`, sempre visibile anche a 0). Valori = chip
`bg-card border-border/60 text-foreground shadow-sm` con `X` (hover destructive → cascade
delete confermata via `window.confirm`). Vuoto → "Nessun valore inserito" italic muted.
Aggiunta = input full-width `bg-card border-border` con Enter (no bottone `+`); duplicati
bloccati con errore inline `text-destructive`.
- **Footer**: nota `text-xs text-tertiary` sulla sincronizzazione bidirezionale dei valori.
### Client Portal restyle notes
The `/client/[token]` portal was migrated to the same "Quiet Luxury" tokens
+377
View File
@@ -0,0 +1,377 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impostazioni — Luxury Admin CRM</title>
<!-- Google Fonts: Plus Jakarta Sans -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- Tailwind CSS CDN -->
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
fontFamily: {
sans: ['Plus Jakarta Sans', 'sans-serif'],
},
colors: {
brand: {
dark: '#1A463C', /* Verde scuro lusso */
darkHover: '#13342D', /* Variante scura per hover */
active: 'rgba(255, 255, 255, 0.08)',
bg: '#F8F9FA',
}
}
}
}
}
</script>
<style>
.sidebar-transition {
transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
</style>
</head>
<body class="bg-brand-bg font-sans text-slate-800 antialiased min-h-screen flex overflow-x-hidden">
<!-- SIDEBAR -->
<aside id="sidebar" class="w-64 bg-brand-dark text-white flex flex-col justify-between p-6 border-r border-emerald-950/20 shrink-0 sidebar-transition relative z-10">
<div class="overflow-hidden">
<!-- Logo e Intestazione -->
<div class="mb-10 px-2 flex items-center justify-between">
<span id="sidebar-logo-text" class="text-lg font-bold tracking-wider text-emerald-50 whitespace-nowrap transition-opacity duration-300">iamcavalli</span>
</div>
<!-- Navigazione Principale -->
<nav class="space-y-1">
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M4 6a2 2 0 012-2h2a2 2 0 012 2v4a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v4a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v4a2 2 0 01-2 2H6a2 2 0 01-2-2v-4zM14 16a2 2 0 012-2h2a2 2 0 012 2v4a2 2 0 01-2 2h-2a2 2 0 01-2-2v-4z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Dashboard</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M8.625 12a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0H8.25m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0h-.375m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0h-.375M21 12c0 4.556-4.03 8.25-9 8.25a9.764 9.764 0 01-2.555-.337A5.972 5.972 0 015.41 20.97a.598.598 0 01-.73-.578 5.672 5.672 0 011.02-3.155A8.72 8.72 0 013 12c0-4.556 4.03-8.25 9-8.25s9 3.694 9 8.25z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Conversazioni</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Lead</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0 text-emerald-400" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Clienti</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Progetti</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Preventivi</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M7 7h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Offerte</span>
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-emerald-200/70 hover:text-white hover:bg-white/5 transition-all duration-200">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Catalogo</span>
</a>
<!-- Stato Attivo su Impostazioni -->
<a href="#" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm text-white bg-brand-active font-medium transition-all duration-200 shadow-sm">
<svg class="w-4 h-4 shrink-0 text-emerald-400" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066-1.543.94-3.31-.826-2.37-2.37 1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/><path d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/></svg>
<span class="sidebar-text whitespace-nowrap transition-opacity duration-300">Impostazioni</span>
</a>
</nav>
</div>
<!-- Area Inferiore Sidebar -->
<div class="border-t border-white/10 pt-4 space-y-3 overflow-hidden">
<div class="flex items-center justify-between px-3 py-1 text-xs text-emerald-200/50 whitespace-nowrap">
<span class="sidebar-text transition-opacity duration-300">Tema</span>
<button class="p-1 rounded-full bg-white/5 hover:bg-white/10 text-emerald-200 hover:text-white transition-all duration-200">
<svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364-6.364l-.707.707M6.343 17.657l-.707.707m12.728 0l-.707-.707M6.343 6.343l-.707-.707M14 12a2 2 0 11-4 0 2 2 0 014 0z"/></svg>
</button>
</div>
<a href="#" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm text-red-300/80 hover:text-red-200 hover:bg-red-950/20 transition-all duration-200 whitespace-nowrap">
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/></svg>
<span class="sidebar-text transition-opacity duration-300">Esci</span>
</a>
</div>
</aside>
<!-- SEZIONE PRINCIPALE -->
<div class="flex-1 flex flex-col min-w-0">
<!-- BARRA DI INTESTAZIONE SUPERIORE -->
<header class="h-16 border-b border-slate-100 bg-white px-8 flex items-center justify-between shrink-0">
<div class="flex items-center gap-4">
<!-- Pulsante Apri/Chiudi Sidebar -->
<button id="sidebar-toggle" class="p-2 -ml-2 rounded-lg text-slate-500 hover:bg-slate-50 hover:text-slate-800 transition-colors focus:outline-none" title="Espandi/Comprimi Sidebar">
<svg class="w-5 h-5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M4 6h16M4 12h12M4 18h16"/></svg>
</button>
<span class="text-xs text-slate-400 font-medium">Configurazione Sistema</span>
</div>
<div class="flex items-center gap-4">
<span class="text-xs font-semibold text-slate-700 bg-slate-100 px-2.5 py-1 rounded-full">Admin Panel</span>
</div>
</header>
<!-- AREA DEL CONTENUTO -->
<main class="flex-1 p-8 lg:p-10 max-w-[1400px] w-full mx-auto flex flex-col gap-8 overflow-y-auto">
<!-- INTESTAZIONE SEZIONE -->
<div>
<h1 class="text-2xl font-semibold text-slate-900 tracking-tight">Impostazioni</h1>
<p class="text-xs text-slate-400 mt-1">Configura le tariffe target e gestisci le tassonomie globali del sistema</p>
</div>
<!-- SEZIONE 1: ANALYTICS PROFITTABILITÀ -->
<section class="bg-white rounded-xl border border-slate-100 shadow-[0_4px_20px_rgba(0,0,0,0.01)] p-6">
<div class="max-w-2xl">
<h2 class="text-xs font-bold text-slate-900 uppercase tracking-wider mb-1">Analytics Profittabilità</h2>
<p class="text-xs text-slate-400 mb-6">Tariffa oraria target (€/h). Usata per calcolare il costo ideale e il delta profitto/perdita per ogni progetto.</p>
<div class="flex items-center gap-3">
<div class="relative rounded-lg border border-slate-200 focus-within:border-brand-dark focus-within:ring-1 focus-within:ring-brand-dark transition-all duration-150">
<span class="absolute inset-y-0 left-0 pl-3 flex items-center text-xs font-medium text-slate-400 pointer-events-none">
</span>
<input
type="text"
value="100,00"
class="bg-transparent text-xs font-semibold font-mono text-slate-800 pl-7 pr-12 py-2.5 w-36 focus:outline-none"
/>
<span class="absolute inset-y-0 right-0 pr-3 flex items-center text-[11px] font-medium text-slate-400 pointer-events-none">
/h
</span>
</div>
<!-- Bottone Salva -->
<button class="bg-brand-dark hover:bg-brand-darkHover text-white text-xs font-medium px-5 py-2.5 rounded-lg transition-colors shadow-sm">
Salva
</button>
</div>
</div>
</section>
<!-- SEZIONE 2: TASSONOMIE OFFERTE -->
<section class="bg-white rounded-xl border border-slate-100 shadow-[0_4px_20px_rgba(0,0,0,0.01)] p-6">
<div class="flex items-start gap-3 mb-6">
<div class="p-2 bg-slate-50 border border-slate-100 rounded-lg text-slate-500">
<svg class="w-5 h-5" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581a2.25 2.25 0 003.182 0l5.174-5.173a2.25 2.25 0 000-3.181L12.016 3.659A2.25 2.25 0 0010.425 3h-.857zM10.5 7.5h.008v.008H10.5V7.5z"/></svg>
</div>
<div>
<h2 class="text-xs font-bold text-slate-900 uppercase tracking-wider">Tassonomie Offerte</h2>
<p class="text-xs text-slate-400 mt-0.5">Valori dei campi Categoria, Ticket, Tipo e Obiettivo dell'editor offerte.</p>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 pt-4 border-t border-slate-50">
<!-- Categoria -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Categoria</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">3</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Entry Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Retainer Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Signature Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
<!-- Ticket -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Ticket</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">3</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
High Ticket <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Low Ticket <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Mid Ticket <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
<!-- Tipo -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Tipo</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">3</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Audit <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Consulenza <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Done For You <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
<!-- Obiettivo -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Obiettivo</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">7</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Aumento LTV <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Caso Studio <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Fatturato <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Lead Generation <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
</div>
</section>
<!-- SEZIONE 3: TASSONOMIE CATALOGO -->
<section class="bg-white rounded-xl border border-slate-100 shadow-[0_4px_20px_rgba(0,0,0,0.01)] p-6">
<div class="flex items-start gap-3 mb-6">
<div class="p-2 bg-slate-50 border border-slate-100 rounded-lg text-slate-500">
<svg class="w-5 h-5" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"><path d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
</div>
<div>
<h2 class="text-xs font-bold text-slate-900 uppercase tracking-wider">Tassonomie Catalogo</h2>
<p class="text-xs text-slate-400 mt-0.5">Valori dei campi Fase, Offerta e Pacchetto del catalogo servizi.</p>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 pt-4 border-t border-slate-50">
<!-- Box: Fase -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Fase</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">5</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Fase 1 ➔ Onboarding <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Fase 2 ➔ Analisi <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Fase 3 ➔ Esecuzione <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
<!-- Box: Offerta -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Offerta</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">3</span>
</div>
<div class="flex flex-wrap gap-1.5 mb-4">
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Entry Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Retainer Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
<span class="inline-flex items-center gap-1 pl-2.5 pr-1.5 py-1 rounded-md text-[11px] font-semibold bg-white border border-slate-200/60 text-slate-700 shadow-sm">
Signature Offer <button class="text-slate-400 hover:text-slate-800">×</button>
</span>
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
<!-- Box: Pacchetto -->
<div class="bg-slate-50/50 border border-slate-100 rounded-xl p-5 flex flex-col justify-between">
<div>
<div class="flex justify-between items-center mb-3">
<span class="text-xs font-bold text-slate-500 uppercase tracking-wider">Pacchetto</span>
<span class="text-[10px] font-bold text-slate-400 font-mono bg-white border border-slate-100 px-1.5 py-0.5 rounded">0</span>
</div>
<div class="text-center py-6 text-slate-400 text-xs italic">
Nessun valore inserito
</div>
</div>
<input type="text" placeholder="Aggiungi valore..." class="w-full bg-white border border-slate-200 rounded-lg px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:border-brand-dark transition-colors" />
</div>
</div>
</section>
<!-- NOTA IN BASSO -->
<footer class="text-xs text-slate-400 max-w-4xl px-2 leading-relaxed">
I valori si sincronizzano ovunque: creandone uno dall'editor offerte o dal catalogo comparirà qui automaticamente. Eliminando un valore da qui viene rimosso ovunque sia usato.
</footer>
</main>
</div>
<!-- SCRIPT DI LOGICA (Gestione Sidebar) -->
<script>
const sidebar = document.getElementById('sidebar');
const toggleButton = document.getElementById('sidebar-toggle');
const logoText = document.getElementById('sidebar-logo-text');
const sidebarTexts = document.querySelectorAll('.sidebar-text');
toggleButton.addEventListener('click', () => {
const isCollapsed = sidebar.classList.contains('w-20');
if (isCollapsed) {
sidebar.classList.remove('w-20');
sidebar.classList.add('w-64');
setTimeout(() => {
logoText.classList.remove('opacity-0');
sidebarTexts.forEach(text => text.classList.remove('opacity-0'));
}, 150);
} else {
logoText.classList.add('opacity-0');
sidebarTexts.forEach(text => text.classList.add('opacity-0'));
sidebar.classList.remove('w-64');
sidebar.classList.add('w-20');
}
});
</script>
</body>
</html>