WordPress Handoff — Design & Dev Documentation

v1.0 — Luglio 2026

01Overview del Progetto

Sito

Green Diamant — Utensili Diamantati e Ricambi Tecnici per Ceramica

Framework origine

React 18 + Vite + Tailwind CSS 3

Router

React Router DOM v6

Animazioni

Framer Motion v11

Icone

Lucide React v0.475

Target WP

WordPress + tema custom (FSE o classico)

Lingua

Italiano + 8 lingue (EN, DE, ES, FR, PT, AR, ZH, JA)

Viewport

Mobile-first, breakpoint lg: 1024px

Temi

Dark (default) + Light (toggle su /light)

Dominio

www.greendiamant.com

Struttura delle pagine

/Home (Dark)
/lightHome (Light)
/newsNews / Blog
/light/newsNews (Light)
/news/:idArticolo (Dark)
/light/news/:idArticolo (Light)
/news/newEditor Articolo
/news/:id/editModifica Articolo

02Design Tokens (Colori)

Il sito ha due temi: Dark (default, su /) e Light (su /light). Tutti i colori usano variabili CSS HSL. Aggiungile nel :root del tema WordPress.

CSS Variables — :root (Dark Mode)

:root (Dark)
:root {
  --background: 0 0% 4%;          /* #0A0A0A — sfondo pagina (void) */
  --foreground: 0 0% 100%;        /* #FFFFFF — testo principale */
  --card: 0 0% 7%;                /* #121212 — sfondo card */
  --card-foreground: 0 0% 100%;
  --primary: 150 100% 26%;        /* #008542 — verde smeraldo (brand) */
  --primary-foreground: 0 0% 100%;
  --secondary: 0 0% 12%;          /* #1F1F1F */
  --secondary-foreground: 0 0% 100%;
  --muted: 0 0% 15%;              /* #262626 */
  --muted-foreground: 0 0% 65%;   /* #A6A6A6 — testo secondario */
  --accent: 150 100% 26%;         /* = primary */
  --accent-foreground: 0 0% 100%;
  --border: 0 0% 18%;             /* #2E2E2E — bordi (silver) */
  --input: 0 0% 18%;
  --ring: 150 100% 26%;
  --radius: 0rem;                 /* Border radius = 0 (angoli vivi) */
  --font-heading: 'Inter Tight', sans-serif;
  --font-body: 'Inter', sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
}

CSS Variables — .light (Light Mode)

.light
/* Light mode — applicato su /light */
.light {
  --background: 0 0% 100%;        /* #FFFFFF */
  --foreground: 0 0% 10%;         /* #1A1A1A */
  --card: 0 0% 96%;               /* #F5F5F5 */
  --card-foreground: 0 0% 10%;
  --primary: 150 100% 26%;        /* #008542 — stesso brand */
  --primary-foreground: 0 0% 100%;
  --secondary: 0 0% 96%;
  --muted: 0 0% 92%;
  --muted-foreground: 0 0% 45%;
  --border: 0 0% 85%;             /* #D9D9D9 */
  --input: 0 0% 85%;
  --ring: 150 100% 26%;
}

Colori personalizzati (Tailwind)

tailwind.config.js
colors: {
  emerald: {
    brand: '#008542'    /* Verde brand — bg-emerald-brand, text-emerald-brand */
  },
  void: '#0A0A0A',     /* Sfondo dark */
  silver: '#333333',   /* Bordi e linee dark */
}

Palette Colori

Primary (Brand)

#008542 — hsl(150,100%,26%)

--primary

Background (Dark)

#0A0A0A — hsl(0,0%,4%)

--background

Foreground

#FFFFFF — hsl(0,0%,100%)

--foreground

Card (Dark)

#121212 — hsl(0,0%,7%)

--card

Silver / Border

#333333 — hsl(0,0%,18%)

--border

Muted Foreground

#A6A6A6 — hsl(0,0%,65%)

--muted-foreground

Utilizzo Tailwind

Esempi utilizzo
<!-- Colore brand su testo/bottone -->
<p class="text-emerald-brand">Testo brand</p>
<button class="bg-emerald-brand text-white">Bottone</button>

<!-- Sfondo dark -->
<section class="bg-void">...</section>

<!-- Bordo silver -->
<div class="border border-silver/20">...</div>

<!-- In WordPress puro (senza Tailwind): usa le variabili CSS -->
<style>
  .brand-text { color: hsl(var(--primary)); }
  .bg-void { background: hsl(var(--background)); }
</style>

03Tipografia

Google Fonts — da inserire nel <head>

<head>
<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=Inter+Tight:wght@400;600;800&family=Inter:wght@400;500&family=JetBrains+Mono:wght@500&display=swap" rel="stylesheet">

Inter Tight

Heading / Titoli

Variabile: --font-heading

Pesi: 400 600 800

Classe Tailwind: font-heading

Inter

Body / Corpo testo

Variabile: --font-body

Pesi: 400 500

Classe Tailwind: font-body

JetBrains Mono

Mono / Label tecnici

Variabile: --font-mono

Pesi: 500

Classe Tailwind: font-mono

CSS Variables font + regola base

CSS
:root {
  --font-heading: 'Inter Tight', sans-serif;
  --font-body: 'Inter', sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
}

body {
  font-family: var(--font-body);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-heading);
}

Scala tipografica

Scala tipografica
/* Hero H1 */
font-size: clamp(2.25rem, 8vw, 6rem); /* text-4xl -> text-8xl */
font-weight: 800;
line-height: 1;
letter-spacing: -0.025em;
text-transform: uppercase;

/* Section H2 */
font-size: clamp(1.875rem, 4vw, 3rem); /* text-3xl -> text-5xl */
font-weight: 800;
text-transform: uppercase;
letter-spacing: -0.02em;

/* Card H3 */
font-size: 1.25rem; /* text-xl */
font-weight: 800;

/* Body base */
font-size: 1rem;
line-height: 1.75;
color: hsl(var(--muted-foreground));

/* Label tecnico (mono) */
font-family: var(--font-mono);
font-size: 0.75rem; /* text-xs */
text-transform: uppercase;
letter-spacing: 0.3em; /* tracking-[0.3em] */
color: hsl(var(--primary));

04Spacing & Layout

Container principale

Container
/* Tutti i contenuti usano questo wrapper */
.container {
  max-width: 80rem; /* max-w-7xl = 1280px */
  margin-left: auto;
  margin-right: auto;
  padding-left: 1.5rem;   /* px-6 mobile */
  padding-right: 1.5rem;
}

@media (min-width: 1024px) { /* lg */
  .container {
    padding-left: 4rem;   /* lg:px-16 desktop */
    padding-right: 4rem;
  }
}

Padding verticale sezioni

Section padding
/* Sezione standard */
.section { padding-top: 6rem; padding-bottom: 6rem; } /* py-24 */

/* Sezione grande */
.section-lg { padding-top: 6rem; padding-bottom: 6rem; }
@media (min-width: 1024px) {
  .section-lg { padding-top: 8rem; padding-bottom: 8rem; } /* lg:py-32 */
}

Grid system

Grid
/* Grid 2 colonne standard (contatti, about) */
.grid-2 {
  display: grid;
  grid-template-columns: 1fr;
  gap: 4rem; /* gap-16 */
}
@media (min-width: 1024px) {
  .grid-2 {
    grid-template-columns: 1fr 1fr;
    gap: 6rem; /* lg:gap-24 */
  }
}

/* Grid prodotti: 1 col mobile, 2 col sm, 3 col lg */
.grid-products {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}
@media (min-width: 640px) { .grid-products { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1024px) { .grid-products { grid-template-columns: 1fr 1fr 1fr; } }

05Componenti UI Riutilizzabili

Facet Clip — angolo smussato (signature element)

Elemento distintivo del design: clip-path con angolo smussato in alto a destra e in basso a sinistra. Usato su bottoni e card.

Facet clip
/* Facet clip grande (card) */
.facet-clip {
  clip-path: polygon(
    0 0,
    calc(100% - 16px) 0,
    100% 16px,
    100% 100%,
    16px 100%,
    0 calc(100% - 16px)
  );
}

/* Facet clip piccolo (bottoni) */
.facet-clip-sm {
  clip-path: polygon(
    0 0,
    calc(100% - 8px) 0,
    100% 8px,
    100% 100%,
    8px 100%,
    0 calc(100% - 8px)
  );
}

Bottone primario (facet clip)

btn-primary
<a href="#contatti" class="btn-primary">Preventivo</a>

<style>
.btn-primary {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
  background: #008542;
  color: #fff;
  padding: 0.875rem 2rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px));
  transition: background 0.2s;
  text-decoration: none;
}
.btn-primary:hover { background: #007038; }
</style>

Bottone outline (su dark bg)

btn-outline
<a href="#about" class="btn-outline">Chi Siamo</a>

<style>
.btn-outline {
  display: inline-flex;
  border: 1px solid rgba(255,255,255,0.2);
  color: rgba(255,255,255,0.8);
  padding: 0.875rem 2rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px));
  transition: border-color 0.2s, color 0.2s;
  text-decoration: none;
}
.btn-outline:hover { border-color: #008542; color: #008542; }
</style>

Card prodotto (con facet clip + hover)

Product card
<div class="product-card facet-clip">
  <div class="product-card__image">
    <img src="..." alt="..." />
  </div>
  <div class="product-card__body">
    <span class="product-card__mono">EDGE</span>
    <h3>Mole Diamantate e Fickert</h3>
    <p>Descrizione...</p>
    <div class="product-card__specs">
      <span>METALLICHE</span><span>IBRIDE</span><span>RESINOIDI</span>
    </div>
  </div>
</div>

<style>
.product-card {
  background: hsl(0 0% 7%);
  border: 1px solid hsl(0 0% 18% / 0.5);
  cursor: pointer;
  transition: border-color 0.3s;
}
.product-card:hover { border-color: rgba(0,133,66,0.4); }
.product-card__mono {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: #008542;
}
</style>

Form contatti (campi con bordo)

Contact form
<form class="contact-form">
  <div class="field">
    <label>Nome</label>
    <input type="text" required />
  </div>
  <div class="field">
    <label>Messaggio</label>
    <textarea rows="5" required></textarea>
  </div>
  <label class="privacy">
    <input type="checkbox" required />
    Ho letto e accetto la <a href="/privacy">Privacy Policy</a>
  </label>
  <button type="submit" class="btn-primary facet-clip-sm">Invia Richiesta</button>
</form>

<style>
.field {
  border: 1px solid hsl(0 0% 18% / 0.5);
  padding: 1.5rem;
}
.field label {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: hsl(0 0% 65%);
  display: block;
  margin-bottom: 0.5rem;
}
.field input, .field textarea {
  width: 100%;
  background: transparent;
  border: none;
  outline: none;
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.875rem;
}
</style>

Cutting line grid (sfondo hero)

Cutting line
.cutting-line {
  background-image: repeating-linear-gradient(
    90deg,
    rgba(51, 51, 51, 0.15) 0px,
    rgba(51, 51, 51, 0.15) 0.5px,
    transparent 0.5px,
    transparent calc(100% / 12)
  );
}

08Hero

Hero full-screen (100dvh) con immagine di sfondo (opacity 40%), gradient overlay da sinistra, cutting-line grid. Titolo uppercase 3 righe (title1 bianco, title2 verde brand, title3 bianco). Stats bar in basso con 3 metriche.

Hero struttura
<section id="hero" class="relative h-[100dvh] flex flex-col cutting-line">
  <!-- Background -->
  <div class="absolute inset-0">
    <img src="hero.jpg" class="w-full h-full object-cover opacity-40" />
    <div class="absolute inset-0 bg-gradient-to-r from-void from-30% via-void/85 to-void/20"></div>
  </div>

  <!-- Content -->
  <div class="relative z-10 flex-1 flex flex-col justify-center container">
    <p class="font-mono text-xs uppercase tracking-[0.3em] text-emerald-brand mb-6">
      Distretto Ceramico di Sassuolo
    </p>
    <h1 class="font-heading font-extrabold uppercase text-4xl lg:text-8xl leading-none text-white">
      Built for<br>
      <span class="text-emerald-brand">Ceramic</span><br>
      Excellence
    </h1>
    <p class="mt-8 text-white/60 max-w-xl">
      Ricambi tecnici di eccellenza per macchine ceramiche...
    </p>
    <div class="mt-10 flex gap-4">
      <button class="btn-primary facet-clip-sm">Scopri i Prodotti</button>
      <button class="btn-outline facet-clip-sm">Chi Siamo</button>
    </div>
  </div>

  <!-- Stats bar -->
  <div class="relative z-10 border-t border-silver/20 grid grid-cols-3">
    <div>20+ / Anni di Esperienza</div>
    <div>500+ / Clienti Attivi</div>
    <div>2.000+ / Componenti a Catalogo</div>
  </div>
</section>

09Pagine — Struttura Sezioni

Home (Dark) — /

Home.jsx
<Navbar />
<HeroSection />          <!-- id="hero" -->
<ProductsSection />      <!-- id="prodotti" - 5 card prodotto -->
<PerformanceSection />   <!-- 4 metriche -->
<AboutSection />         <!-- id="about" - testo + 4 box info -->
<GreenWorkSection />     <!-- id="green-work" - 4 pilastri sostenibilita -->
<ContactSection />       <!-- id="contatti" - form contatti -->
<Footer />

Home (Light) — /light

HomeLight.jsx
<NavbarLight />           <!-- Stessa struttura, tema light -->
<HeroSectionLight />
<ProductsSectionLight />
<PerformanceSectionLight />
<AboutSectionLight />
<GreenWorkSectionLight />
<ContactSectionLight />
<FooterLight />

News / Blog — /news

News.jsx
<!-- Lista articoli con card (cover, titolo, excerpt, autore, data) -->
<!-- Admin: bottone "Nuovo Articolo" -> /news/new -->
<!-- Ogni card: link a /news/:id (ArticleDetail) -->
<!-- Admin: bottone "Modifica" -> /news/:id/edit (ArticleEditor) -->
<!-- ArticleEditor: editor a blocchi (testo, heading, immagine, video, link, citazione, separatore) -->
<!-- ArticleDetail: render articoli con ArticleRenderer -->

Sezioni Home — ordine e ID anchor

#hero

Hero — full screen, titolo + stats

#prodotti

Products — 5 card (Mole, Spazzole, Ricambi, Assistenza, Rigenerazione)

#performance

Performance — 4 metriche (99.8%, <24h, ISO, 360°)

#about

About — testo + 4 box (Sede, Settore, Specializzazione, Servizio)

#green-work

Green Work — 4 pilastri sostenibilità ESG

#contatti

Contact — form + info sede + PDF links

10Animazioni

Animazioni con Framer Motion v11. Pattern principali:

Framer Motion patterns
// 1. Fade in + slide (hero, sezioni)
<motion.div
  initial={{ opacity: 0, y: 40 }}
  animate={{ opacity: 1, y: 0 }}
  transition={{ duration: 0.8, ease: [0.16, 1, 0.3, 1] }}
>

// 2. Scroll reveal (whileInView)
<motion.div
  initial={{ opacity: 0, y: 20 }}
  whileInView={{ opacity: 1, y: 0 }}
  viewport={{ once: true }}
  transition={{ duration: 0.6 }}
>

// 3. Stagger children (card grid)
<motion.div
  initial="hidden"
  whileInView="show"
  variants={{
    hidden: {},
    show: { transition: { staggerChildren: 0.1 } }
  }}
>
  <motion.div variants={{ hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0 } }} />

// 4. Reduced motion (accessibilita)
const prefersReduced = useReducedMotion();
initial={prefersReduced ? {} : { opacity: 0, x: -20 }}

Equivalente CSS (per WordPress senza Framer Motion)

CSS animations
/* Fade in on scroll — usa IntersectionObserver in WP */
.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* JS: IntersectionObserver */
const observer = new IntersectionObserver((entries) => {
  entries.forEach(e => {
    if (e.isIntersecting) e.target.classList.add('is-visible');
  });
}, { threshold: 0.15 });
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));

11Assets

Immagini (gestite via CMS)

Tutte le immagini sono gestibili dall'admin tramite MediaReplaceButton (dark + light variant). In WordPress, mappare queste chiavi sui campi immagine del tema:

hero

Immagine hero (dark + light variant)

product_1 -> product_5

5 immagini prodotti (dark + light)

performance

Immagine sfondo performance (dark + light)

logo

Logo (height configurabile, dark + light)

PDF

codice_etico

Codice Etico PDF (link nella sezione contatti)

catalogo_integrale

Catalogo Integrale PDF

PDF attuale: https://media.base44.com/files/public/6a4b58f290bddd0809e3f93d/4a573f98b_Codice_Etico_GREENDIAMANT_SRL.pdf

Contenuti testuali (i18n)

Tutto il testo è in src/lib/i18n.jsx con 9 lingue. Ogni testo ha una chiave (es. hero.title1) e può essere sovrascritto dall'admin tramite EditableText (salvato in entity SiteText).

Struttura chiavi i18n
// Esempio struttura (Italiano)
hero: {
  tagline: "Distretto Ceramico di Sassuolo",
  title1: "Built for", title2: "Ceramic", title3: "Excellence",
  subtitle: "Ricambi tecnici di eccellenza...",
  cta1: "Scopri i Prodotti", cta2: "Chi Siamo",
  stat1: "Anni di Esperienza", stat2: "Clienti Attivi", stat3: "Componenti a Catalogo",
}
products: {
  tag: "// Catalogo Prodotti",
  items: [
    { title: "Mole Diamantate e Fickert", mono: "EDGE", description: "...", specs: [...] },
    // ...5 items
  ]
}
// ...about, green, contact, footer, nav, news

12WP Notes

Form contatti — invio email

Il form contatti invia email tramite Gmail API (backend function sendContactEmail). In WordPress: usare WP Mail SMTP o un plugin SMTP, oppure integrare l'API Gmail.

Campi form contatti
// Campi inviati:
{
  firstName: "Nome",
  lastName: "Cognome",
  company: "Nome Azienda",
  phone: "Telefono",
  email: "Email",
  message: "Messaggio"
}
// Destinatario: commerciale@greendiamant.com
// Mittente: Greendiamantcom@gmail.com

Multi-lingua

9 lingue supportate: IT, EN, DE, ES, FR, PT, AR (RTL), ZH, JA. In WordPress: usare WPML o Polylang. L'arabo richiede layout RTL (dir="rtl").

Blog / News

Sistema blog con articoli (entity Article): title, slug, excerpt, cover_image, cover_image_light, content (JSON array di blocchi), status, author_name. Editor a blocchi: testo, heading, immagine, video, link, citazione, separatore. In WordPress: usare il Gutenberg editor nativo (i blocchi corrispondono).

Article schema
{
  title: "string",
  slug: "string (auto-generated)",
  excerpt: "string",
  cover_image: "url (dark)",
  cover_image_light: "url (light, fallback a cover_image)",
  content: "JSON array di blocchi",
  status: "draft | published",
  author_name: "string"
}

Cookie & Privacy

Iubenda per cookie consent e privacy policy. Privacy Policy: https://www.iubenda.com/privacy-policy/37534852

SEO

Meta tag essenziali
<title>Green Diamant - Utensili Diamantati e Ricambi Tecnici per Ceramica | Sassuolo</title>
<meta name="description" content="Green Diamant SRL: utensili diamantati, mole, Fickert, spazzole, ricambi industriali e rigenerazione componenti per macchine ceramiche..." />
<link rel="canonical" href="https://www.greendiamant.com/" />
<!-- hreflang per 9 lingue -->
<link rel="alternate" hreflang="it" href="https://www.greendiamant.com/" />
<link rel="alternate" hreflang="x-default" href="https://www.greendiamant.com/" />
<!-- JSON-LD: Organization, WebSite, Product catalog, Professional Service -->

Sitemap

File sitemap.xml e robots.txt già presenti in /public. In WordPress: generati automaticamente da Yoast SEO o Rank Math.

Checklist migrazione

01Installare Google Fonts (Inter Tight, Inter, JetBrains Mono)
02Aggiungere variabili CSS :root (dark) + .light (light mode)
03Riprodurre facet-clip e facet-clip-sm (clip-path polygon)
04Configurare form contatti con SMTP (campi: nome, cognome, azienda, telefono, email, messaggio + privacy checkbox)
05Setup multi-lingua con WPML/Polylang (9 lingue, AR = RTL)
06Mappare immagini CMS sui campi tema (hero, product_1-5, performance, logo)
07Configurare Iubenda cookie consent + privacy policy
08Aggiungere JSON-LD structured data (Organization, WebSite, Product)
09Configurare sitemap.xml + robots.txt (Yoast/Rank Math)
10Riprodurre animazioni scroll-reveal con IntersectionObserver

Noi (www.greendiamant.com/) e terze parti selezionate (4) raccogliamo informazioni personali come specificato nella privacy policy e utilizziamo cookie o tecnologie simili per finalità tecniche e, con il tuo consenso, anche per le finalità di funzionalità, esperienza, misurazione e “marketing (con annunci personalizzati)” come specificato nella cookie policy.

Puoi liberamente prestare, rifiutare o revocare il tuo consenso, in qualsiasi momento, accedendo al pannello delle preferenze. Il rifiuto del consenso può rendere non disponibili le relative funzioni.

Usa il pulsante “Accetta” per acconsentire. Usa il pulsante “Rifiuta” per continuare senza accettare.