FaceFlow Components
Reusable business blocks with schema-driven fields, Facet templates, scoped styles, and optional runtime behavior.
Documentazione per sviluppatori dei Componenti
I componenti sono sezioni del sito guidate da uno schema e renderizzate tramite FaceFlow.
Per gli utenti tecnici, i componenti sono il contratto centrale di sezione riutilizzabile nel sistema. Combinano definizioni di campo, output del template Facet, stili opzionali, comportamento opzionale lato client e riuso consapevole dell'ambito.
Responsabilità principali
Un componente è responsabile di:
- definire un contratto di sezione riutilizzabile
- esporre uno schema di authoring controllato
- renderizzare l'output tramite Facet
- opzionalmente allegare stili e comportamenti con ambito limitato
- supportare il riuso a livello di pagina, layout o sito
I componenti dovrebbero risolvere problemi di sezione ripetibili. Non dovrebbero diventare contenitori generici per markup arbitrario specifico di una pagina.
Modello di definizione del componente
Una tipica definizione di Componente include:
{
"name": "contact-section",
"title": "Contact Section",
"version": "1.0.0",
"type": "component",
"category": "contact",
"defaultScope": "page",
"description": "Contact section with CTA and embedded form support",
"fields": [
{ "name": "title", "label": "Title", "type": "text" },
{ "name": "summary", "label": "Summary", "type": "textarea" },
{ "name": "contactForm", "label": "Form", "type": "formSelect" }
],
"html": "<section><h2>{{ title }}</h2><p>{{ summary }}</p><div data-form-embed=\"{contactForm}\"></div></section>",
"style": ".contact-section { padding: 4rem 0; }",
"script": "/* optional behavior */"
}Questo modello permette a un Componente di comportarsi come un contratto di sezione governato invece che come un frammento di codice copiato e scollegato.
Metadati principali
I campi di metadati importanti includono:
nametitleversiontypecategorydefaultScopedescription
Indicazioni:
- mantenere
namestabile dopo il rilascio - usare
titleper chiarezza nell'editor - aggiornare
versionintenzionalmente quando lo schema o il comportamento di rendering cambiano - scegliere
defaultScopein base al riuso previsto, non per comodità
Schema dei campi
Lo schema dei campi definisce ciò che gli autori possono modificare senza alterare la struttura della sezione.
I tipi di campo di primo livello supportati includono:
texttextareanumberurldateimageimagesfileselectcheckboxrichtexthtmlcodemaprepeaterformSelectreviewSelect
Tipi di sottocampo aggiuntivi possono essere usati all'interno di repeater, inclusi:
coloremailtelrange
Esempio:
{
"name": "faqItems",
"label": "FAQ Items",
"type": "repeater",
"fields": [
{ "name": "question", "type": "text" },
{ "name": "answer", "type": "textarea" }
]
}Scegli i tipi di campo in base all'intento del contenuto, non per convenienza. Un url dovrebbe rimanere un URL. Un insieme ripetuto di card dovrebbe essere un repeater, non diversi campi di testo scollegati.
Vedi il riferimento completo dei campi:
Modello del template
La porzione html di un Componente è renderizzata tramite Facet.
Ciò significa che i template possono usare:
- output dei campi
- condizionali
- loop
- filtri
- contesto consapevole della pagina
- Variabili riutilizzabili
Esempio:
<section class="hero-section">
<div class="container">
<h1>{{ title }}</h1>
{{#if summary}}
<p>{{ summary }}</p>
{{/if}}
{{#if ctaUrl}}
<a href="{{ ctaUrl }}" class="btn-primary">{{ ctaLabel }}</a>
{{/if}}
</div>
</section>Oppure con un repeater:
<div class="faq-list">
{{#each faqItems as="item"}}
<article class="faq-item">
<h3>{{ item.question }}</h3>
<p>{{ item.answer }}</p>
</article>
{{/each}}
</div>Per dettagli sulla sintassi:
Modello di ambito
I componenti possono esistere a tre livelli di riuso:
sitelayoutpage
Concettualmente:
site scope -> reusable across the broader site
layout scope -> shared inside one page family
page scope -> local to one pageL'ambito determina sia la visibilità sia l'impatto delle modifiche. Se un Componente cambia a livello site, quella è una modifica architetturale ampia, non una modifica locale.
Per il modello più ampio:
Comportamento di rendering
Al momento del rendering, FaceFlow risolve l'istanza del Componente combinando:
- la definizione del Componente
- i valori dei campi salvati
- il contesto di rendering corrente
- servizi runtime correlati come media, Variabili, Moduli e Recensioni
Concettualmente:
component definition
+ saved field values
+ runtime context
-> Facet render
-> final section outputQuesto è il punto in cui i dati dei campi diventano markup a runtime.
Stili e comportamento
I componenti possono allegare stili opzionali e comportamenti opzionali.
Esempio:
.pricing-card {
border-radius: 1rem;
padding: 2rem;
}document.querySelectorAll('.faq-item button').forEach((button) => {
button.addEventListener('click', () => {
button.closest('.faq-item').classList.toggle('is-open');
});
});Usa questo con parsimonia. La maggior parte del comportamento della sezione dovrebbe rimanere semplice, prevedibile e facile da manutenere.
Moduli e recensioni all'interno dei componenti
Due tipi di campo sono particolarmente importanti per le sezioni interattive:
formSelectreviewSelect
Questi permettono ai componenti di incorporare flussi di lavoro aziendali senza codificare rigidamente un modello specifico.
Marcatori tipici:
<div data-form-embed="{contactForm}"></div>
<div data-review-embed="{serviceReview}"></div>Questo mantiene la sezione riutilizzabile pur consentendo al Modulo o al modello di Recensione selezionato di cambiare in fase di authoring.
Esempi di pattern per componenti
Basic content section:
fields:
title
summary
template:
heading + paragraphFAQ section:
fields:
faqItems repeater
template:
each item -> question + answerLead capture section:
fields:
title
summary
contactForm (formSelect)
template:
copy + data-form-embed markerChecklist di revisione tecnica
- il Componente risolve un problema di sezione ripetibile?
- lo schema dei campi è chiaro e intenzionale?
- il template è leggibile e stabile?
- l'ambito scelto è corretto per il riuso previsto?
- un futuro editor capirebbe come usarlo solo dal contratto dei campi?
Pratiche da evitare
Evitare:
- sovraccaricare un singolo Componente con casi d'uso non correlati
- aggiungere logica aziendale specifica della pagina che dovrebbe rimanere fuori dal contratto di sezione
- usare
htmlcodequando un modello di campo strutturato sarebbe più sicuro - ampliare l'ambito solo perché la sezione potrebbe essere riutilizzata un giorno
- rinominare i campi dopo che i contenuti sono già stati memorizzati contro di essi
Quando separare un componente
Dividi un Componente quando:
- lo schema dei campi è diventato troppo ampio
- diversi layout o contesti di pagina necessitano versioni conflittuali
- il template è pieno di eccezioni e rami una tantum
- gli editor non capiscono più cosa la sezione dovrebbe fare
Se il contratto smette di essere chiaro, il riuso di solito smette di essere utile.