Design System (wiki interna)

Design system · privato

Wiki MetaCometa

Riferimento di tutti i componenti, token e regole del design system di webducks.it. Pagina privata, non indicizzata, accessibile solo da admin loggati.

Come usare

Ogni componente ha: nome classe (copiabile), descrizione, anteprima live, snippet di codice. Quando aggiungi una nuova sezione/componente in /tmp/build_webducks.py, aggiungi anche una voce qui per i futuri me/te.

Tokens

CSS custom-properties definite in :root. Usa var(--c-...) ovunque invece di hex inline.

<a class="mc-btn-action is-primary">Azione</a>
Eyebrow esempio
<p class="mc-eyebrow">Eyebrow</p>
Una famiglia per ogni bambino
Corpo testo in DM Sans, 17px, line-height 1.55.
font-family: var(--f-display);  /* Young Serif, headings */
font-family: var(--f-body);     /* DM Sans, body */

Palette completa

–c-primary
#E97E3A
–c-primary-deep
#C25E1F
–c-primary-soft
#FAD8BD
–c-action
#B25420
–c-action-deep
#8F4214
–c-eyebrow-on-orange
#FFF3E8
–c-secondary
#4F2D7F
–c-secondary-deep
#371E5C
–c-secondary-soft
#DCCDEF
–c-bg
#FBF5EE
–c-bg-alt
#FFFBF4
–c-bg-deep
#F1E7DA
–c-paper
#FFFFFF
–c-ink
#1F1633
–c-ink-soft
#4A3F5C
–c-ink-mute
#6F6385
–c-line
#E6DBD0
–c-accent
#F2B645

Layout & container

Tre container widths. Usa sempre uno di questi, mai max-width inline.

max-width: 1240px
<div class="wp-block-group mc-container">…</div>
max-width: 720px
<div class="wp-block-group mc-container-narrow">…</div>
max-width: 1080px
<div class="wp-block-group mc-container-wide">…</div>

Sezioni & sfondi

Le sezioni full-width usano sempre il gradiente del body. Solo .mc-bg-deep spezza la continuità. .mc-bg-warm e .mc-bg-soft sono mappate a trasparente per coerenza globale.

mc-section · padding-block fluido
group_full(content, classname="mc-section")
mc-bg-deep · soft purple gradient
group_full(content, classname="mc-section mc-bg-deep")
mc-trust · hairline only
group_full(content, classname="mc-trust")

Tipografia & eyebrow

Display
Heading 2
<h1 class="wp-block-heading mc-h-display">Title</h1>

Sezione · Cosa facciamo

<p class="mc-eyebrow">Cosa facciamo</p>
Una famiglia per ogni bambino.
<h1>Per ogni <em class="mc-h-em">bambino</em></h1>

Body text editoriale. Il primo paragrafo riceve un drop-cap Young Serif di 3.2em.

<div class="mc-prose"><p>Lungo paragrafo…</p></div>
“Casa è dove qualcuno ti sceglie.”
<blockquote class="mc-pullquote">"…"</blockquote>

Bottoni

Sistema unificato .mc-btn-action + modificatore. Funziona come <a>, <button>, dentro wp:html.

<a href="…" class="mc-btn-action is-primary">Dona ora</a>
<a href="…" class="mc-btn-action is-secondary">Scopri</a>
<a href="…" class="mc-btn-action is-light">Continua</a>
<a href="…" class="mc-btn-action is-ghost-light">Skip</a>

Card

Card title
Contenuto della card
<div class="mc-card" style="padding:32px">…</div>

5×1000

Non costa nulla.

Vale moltissimo.

<div class="mc-orange-card" style="padding:48px">…</div>
Tre passi.

Scegli il tuo.

<div class="wp-block-group mc-cta-card">…</div>
Card con gradient body-like dentro
<div class="mc-aziende-card-gradient" style="padding:56px;border-radius:18px">…</div>
<a href="/storia-xyz/" class="mc-story-card-link">
  <img src="…" class="mc-story-card-img"/>
  <div class="mc-story-card-body">…</div>
</a>

Form

<form class="mc-form" action="…">
  <div><label>Nome</label><input/></div>
  …
</form>

Componenti specializzati

featured
featured
med
med
med
med
<div class="mc-fr-mixed">
  <a class="mc-fr-card is-featured">…</a>
  …
  <a class="mc-fr-card is-medium">…</a>
</div>
25
1.500+ minori accolti
<div class="mc-impact-editorial">
  <div><div class="mc-impact-lead">25<span class="mc-impact-lead-suffix">anni</span></div></div>
  <div><div class="mc-impact-sentence"><p class="label"><span class="num">N</span> …</p></div></div>
</div>
82% / 12% / 6%
<div class="mc-allocation">
  <div class="mc-allocation-bar">
    <div class="mc-allocation-seg is-direct" style="flex:82"></div>
    …
  </div>
</div>
Risposta.
<div class="mc-faq-item" data-open="false">
  <button class="mc-faq-q" aria-expanded="false">
    <span>Q?</span><span class="mc-faq-toggle">+</span>
  </button>
  <div class="mc-faq-a-wrap">
    <div class="mc-faq-a"><div class="mc-faq-a-inner">A.</div></div>
  </div>
</div>
<div class="mc-hero-slideshow" id="mc-hero-slideshow">
  <img class="mc-hero-slide is-active" src="…"/>
  …
  <div class="mc-hero-dots"></div>
</div>
<section class="mc-section mc-stories-fw">
  <img class="mc-stories-bg-photo mc-stories-photo-1"/>
  …
</section>
Regioni:CataniaUdineFirenze
<div class="mc-trust-strip">
  <span class="mc-trust-label">…</span>
  <span class="mc-trust-region">Citta</span>
</div>

Utilità & helper

Categoria Pill
<span class="mc-badge">Tag</span>
<span class="mc-pill">Pill</span>
  • Punto uno
  • Punto due
<ul class="mc-volo-bullets">
  <li>Item</li>
</ul>
<a href="/storie/" class="mc-back-link">← Torna alle storie</a>

Regole & anti-pattern

NO  em-dashes (, ) nei contenuti. Usa virgola, due-punti, punto, parentesi. Solo en-dash (–) per range tipo “Lun–Sab”.
NO  testo bianco su –c-primary (#E97E3A). Solo 2.7:1, FAIL WCAG AA. Usa –c-action (#B25420 → 4.7:1 ✓).
NO  hero-metric template (big-number + small-label tiles). Usa .mc-impact-editorial o .mc-allocation.
NO  griglie di card identiche. Usa .mc-fr-mixed (featured + medium + quiet) per variare.
NO  backdrop-filter di default (glassmorphism). Solo casi puntuali, mai come pattern.
NO  side-stripe borders (border-left/right > 1px). Usa full border, tint bg, leading icon.
NO  gradient text (background-clip:text). Single solid color sempre.
NO  #000 o #fff puri. Tutti i neutri tinted verso ink/paper.
SI  sezioni full-width via group_full(). Container interno via container(). Mai max-width inline.
SI  tokens (–c-*) ovunque. Solo 3 #fff letterali inline ammessi (color text white).

Vetro & card uniformi

Card “di vetro”: sfondo translucido + blur(14px), bordo chiaro, ombra md. Tre tinte. Padding uniforme via --card-pad. (agg. 2026-06, §15b–c)

clear
orange
violet
.mc-glass{border:1px solid;border-radius:18px;box-shadow:var(--shadow-md);color:var(--c-ink)}
.mc-glass-clear { background:rgba(255,251,244,.55); border-color:rgba(255,255,255,.55) }
.mc-glass-orange{ background:rgba(233,126,58,.20); border-color:rgba(233,126,58,.40) }
.mc-glass-violet{ background:rgba(79,45,127,.22);  border-color:rgba(79,45,127,.40) }
:root{ --card-pad: clamp(24px,3.2vw,40px); }
.tcard{ padding:var(--card-pad) }  /* tutte le card-sezione di vetro */
SI  Vetro su bg/gradienti (serve qualcosa dietro per vedere il blur).
SI  CTA a destra della card (align-self:flex-end;margin-top:auto). Radius bottone armonizzato: max(8px, radius_card − card-pad/2).
NO  Testo ink su vetro viola pieno → usa paper.

Marquee orizzontale grabbable

Riga di card che scorre in orizzontale, trascinabile (grab) + auto-scroll + loop infinito. Usato in home → “I nostri progetti”. (§15c)

aMALI
Lotuiani
Diurna
Dopo di noi
+altri

Anteprima statica (cursor:grab + mask). Drag, auto-scroll e loop sono aggiunti dal JS qui sotto.

.mc-prog-rail{ overflow-x:auto; overflow-y:hidden; cursor:grab; scrollbar-width:none;
  width:100vw; margin-left:calc(50% - 50vw);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 4%,#000 96%,transparent) }
.mc-prog-rail::-webkit-scrollbar{ display:none }
.mc-prog-rail.is-grab  { cursor:grabbing }
.mc-prog-rail.is-grab a{ pointer-events:none }   /* no click accidentale dopo drag */
.mc-prog-track{ display:flex; gap:18px; width:max-content }   /* card duplicate x2 nel DOM */
var down=false, sx=0, sl=0, auto=true;
function wrap(){ var h=track.scrollWidth/2;
  if(rail.scrollLeft>=h) rail.scrollLeft-=h; else if(rail.scrollLeft<=0) rail.scrollLeft+=h; }
// auto-scroll idle  (NB: niente && -> WP lo converte in &#038; -> SyntaxError; annida gli if)
requestAnimationFrame(function tick(){ if(auto){ if(!down){ rail.scrollLeft+=0.6; wrap(); } }
  requestAnimationFrame(tick); });
// drag
rail.addEventListener('pointerdown',function(e){ down=true; sx=e.clientX; sl=rail.scrollLeft;
  rail.classList.add('is-grab'); rail.setPointerCapture(e.pointerId); });
rail.addEventListener('pointermove',function(e){ if(down) rail.scrollLeft = sl-(e.clientX-sx); });
rail.addEventListener('pointerup',  function(){ down=false; rail.classList.remove('is-grab'); });
SI  Card duplicate ×2 nel DOM → loop infinito senza salti.
SI  Niente &&/|| nel JS inline (WP li rompe) → annida gli if.
NO  overflow:hidden sul rail → usa overflow-x:auto + scrollbar nascosta + mask.

Full-bleed & template

Band a tutta larghezza e pagine senza margini laterali. (§15d)

/* band a tutta larghezza dentro un container (100vw include la scrollbar!) */
.full-bleed{ width:100vw; margin-left:calc(50% - 50vw) }
/* niente margine laterale sitewide (clip non rompe position:sticky, hidden si) */
html,body{ overflow-x:clip !important }
<!-- template custom: twentytwentyfive//fullbleed -->
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:post-content {"align":"full","layout":{"type":"default"}} /-->
<!-- wp:template-part {"slug":"footer"} /-->
NO  alignfull + has-global-padding → doppio padding (45px×2) = margine. alignfull da solo non basta.
SI  Template fullbleed per pagine che devono toccare i bordi.

Filtri contenuto WordPress

I filtri WP corrompono JS/CSS inline dentro wp:html. Verificati sul campo. (§15e)

if(auto && !down){ ... }          // sorgente
if(auto &#038;&#038; !down){ ... }  // come arriva al browser -> SyntaxError
NO  &&/& nel JS (→ &#038;). Annida gli if.
NO  --, ..., " ', 1/2 nel testo (wptexturize → en-dash / … / curly / ½).
NO  [...] non-shortcode (do_shortcode). Upload .js/.css in Media bloccato (.html permesso).
SI  Workaround: 1) evita i char a rischio · 2) hex-encode + bootstrap backtick · 3) iframe a un .html in Media (isolamento totale).

Gradienti multi-radial

Sfondi sezione morbidi e continui (§3): 4 ellissi radiali sparse + base solida (tecnica mc-aziende-card-gradient). (§15f)

.mc-grad-1{ background:
  radial-gradient(ellipse 60% 55% at 15% 20%, rgba(233,126,58,.07), transparent 65%),
  radial-gradient(ellipse 55% 50% at 90% 25%, rgba(79,45,127,.06), transparent 65%),
  radial-gradient(ellipse 65% 50% at 30% 95%, rgba(242,182,69,.06), transparent 65%),
  radial-gradient(ellipse 50% 50% at 85% 90%, rgba(220,205,239,.18), transparent 65%),
  #FFFBF4; }

Il tuo 5×1000 non costa nulla e per noi è tantissimo. Codice fiscale

Come si fa