{"elements":[{"id":7014,"title":"Componenti UI","body":"<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Architettura dei Componenti<\/h2>\n    <p class=\"lead\">DressAPI include una libreria di componenti UI riutilizzabili che si integrano nativamente con il template engine. I componenti permettono di inserire elementi complessi &mdash; carousel, accordion, tab, card, tabelle dati &mdash; con una sintassi dichiarativa semplice, mantenendo la coerenza visiva con il framework CSS scelto.<\/p>\n\n\n    <h3>Modalit&agrave; di Visualizzazione (View Modes)<\/h3>\n    <p>I componenti DressAPI sono organizzati per modalit&agrave; di visualizzazione (framework). Ogni modalit&agrave; fornisce le proprie implementazioni dei componenti ottimizzate per un framework CSS specifico.<\/p>\n\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr>\n          <th>Modalit&agrave;<\/th><th>Framework<\/th><th>Percorso<\/th><th>Note<\/th>\n        <\/tr><\/thead>\n        <tbody>\n          <tr><td><strong>bi5<\/strong><\/td><td>Bootstrap Italia 5<\/td><td><code>cms\/plugins\/base\/views\/bi5\/components\/<\/code><\/td><td>Implementazione di riferimento, conforme alle linee guida di design italiane<\/td><\/tr>\n          <tr><td><strong>b5<\/strong><\/td><td>Bootstrap 5<\/td><td><code>cms\/plugins\/base\/views\/b5\/components\/<\/code><\/td><td>Applicazioni generiche con Bootstrap 5 standard<\/td><\/tr>\n          <tr><td><strong>default<\/strong><\/td><td>Nessuno (agnostico)<\/td><td><code>core\/src\/modules\/base\/views\/default\/components\/<\/code><\/td><td>Versione minimale senza dipendenze da framework CSS<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Flusso di Rendering<\/h3>\n    <ol>\n      <li><strong>Database\/JSON<\/strong> &rarr; I dati del componente sono salvati come JSON<\/li>\n      <li><strong>CComponent::Get()<\/strong> &rarr; Risolve il template HTML del componente<\/li>\n      <li><strong>CHtmlRender::Render()<\/strong> &rarr; Elabora i placeholder e i tag template<\/li>\n      <li><strong>CComponent::PostProcessHtml()<\/strong> &rarr; Processing custom (es. <code>&lt;dropdown-item&gt;<\/code>)<\/li>\n      <li><strong>Output HTML<\/strong> &rarr; HTML finale renderizzato<\/li>\n    <\/ol>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Sintassi di Utilizzo dei Componenti<\/h2>\n    <p>I componenti si utilizzano con il tag <code>&lt;component&gt;<\/code> specificando il tipo e i parametri JSON:<\/p>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Sintassi base<\/div><pre><code>&lt;component type=\"button\" id=\"btn1\"&gt;\n&#123;&#123;\"label\":\"Clicca qui\",\"type\":\"primary\",\"link\":\"\/azione\"&#125;&#125;\n&lt;\/component&gt;<\/code><\/pre><\/div>\n\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Componente con array (multipli)<\/div><pre><code>&lt;component type=\"card\" id=\"cards1\"&gt;\n[\n  &#123;&#123;\"title\":\"Card 1\",\"body\":\"Contenuto 1\"&#125;&#125;,\n  &#123;&#123;\"title\":\"Card 2\",\"body\":\"Contenuto 2\"&#125;&#125;\n]\n&lt;\/component&gt;<\/code><\/pre><\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Catalogo Componenti<\/h2>\n    <p>Tutti i componenti sono disponibili nei tre view mode (bi5, b5, default):<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr>\n          <th>Componente<\/th><th>Descrizione<\/th><th>bi5<\/th><th>b5<\/th><th>default<\/th>\n        <\/tr><\/thead>\n        <tbody>\n          <tr><td><strong>accordion<\/strong><\/td><td>Pannelli espandibili a fisarmonica<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>affix<\/strong><\/td><td>Elemento fissato durante lo scroll<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>alert<\/strong><\/td><td>Messaggio di notifica<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>avatar<\/strong><\/td><td>Immagine profilo utente<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>badge<\/strong><\/td><td>Etichetta\/contatore<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>breadcrumb<\/strong><\/td><td>Percorso di navigazione<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>button<\/strong><\/td><td>Pulsante o link stilizzato<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>callout<\/strong><\/td><td>Box evidenziato per note importanti<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>card<\/strong><\/td><td>Scheda contenuto<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>carousel<\/strong><\/td><td>Slideshow di immagini<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>collapse<\/strong><\/td><td>Contenitore espandibile\/collassabile<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>contact-info<\/strong><\/td><td>Informazioni di contatto<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>dropdown<\/strong><\/td><td>Menu a tendina<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>event-teaser<\/strong><\/td><td>Anteprima evento<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>hero<\/strong><\/td><td>Sezione hero con immagine<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>list-group<\/strong><\/td><td>Lista di elementi raggruppati<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>modal<\/strong><\/td><td>Finestra modale<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>news-teaser<\/strong><\/td><td>Anteprima notizia<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>person-card<\/strong><\/td><td>Scheda persona<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>service-card<\/strong><\/td><td>Scheda servizio<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>stats-counter<\/strong><\/td><td>Contatore statistiche animato<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n          <tr><td><strong>video<\/strong><\/td><td>Player video responsivo<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><td class=\"text-center\">&check;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Componenti Predefiniti - Parametri<\/h2>\n\n    <h3>Button<\/h3>\n    <p>Pulsante o link stilizzato.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>label<\/code><\/td><td>string<\/td><td>Testo del pulsante<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>type<\/code><\/td><td>string<\/td><td>Tipo visuale (primary, secondary, success, danger, warning, info, light, dark)<\/td><td>'primary'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>link<\/code><\/td><td>string<\/td><td>URL destinazione<\/td><td>'#'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>icon<\/code><\/td><td>string<\/td><td>Nome icona (bi5: \"it-pencil\", b5: \"bi bi-pencil\")<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>size<\/code><\/td><td>string<\/td><td>Dimensione (sm, lg)<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Dropdown<\/h3>\n    <p>Menu a tendina con lista di azioni.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>text<\/code><\/td><td>string<\/td><td>Testo del pulsante dropdown<\/td><td>'Menu'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>type<\/code><\/td><td>string<\/td><td>Tipo visuale<\/td><td>'primary'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>items<\/code><\/td><td>array<\/td><td>Voci del menu (label, link, onclick, divider, header, disabled, active, icon, badge, danger)<\/td><td>-<\/td><td>No<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Collapse<\/h3>\n    <p>Contenitore espandibile\/collassabile.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>label<\/code><\/td><td>string<\/td><td>Testo del pulsante toggle<\/td><td>'Toggle'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>content<\/code><\/td><td>string<\/td><td>Contenuto del pannello espandibile<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>expanded<\/code><\/td><td>bool<\/td><td>Se aperto di default<\/td><td>false<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Modal<\/h3>\n    <p>Finestra modale (dialog).<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>title<\/code><\/td><td>string<\/td><td>Titolo della modale<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>body<\/code><\/td><td>string<\/td><td>Contenuto HTML<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>footer<\/code><\/td><td>string<\/td><td>Contenuto footer<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>size<\/code><\/td><td>string<\/td><td>Dimensione (sm, lg, xl)<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Card<\/h3>\n    <p>Scheda contenuto.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>title<\/code><\/td><td>string<\/td><td>Titolo card<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>body<\/code><\/td><td>string<\/td><td>Contenuto principale<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>image<\/code><\/td><td>string<\/td><td>URL immagine header<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>footer<\/code><\/td><td>string<\/td><td>Contenuto footer<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Alert<\/h3>\n    <p>Messaggio di notifica.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>message<\/code><\/td><td>string<\/td><td>Testo del messaggio<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>type<\/code><\/td><td>string<\/td><td>Tipo (success, warning, danger, info)<\/td><td>'info'<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>dismissible<\/code><\/td><td>bool<\/td><td>Mostra pulsante chiusura<\/td><td>false<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Carousel<\/h3>\n    <p>Slideshow di immagini.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>image<\/code><\/td><td>string<\/td><td>URL dell'immagine<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>title<\/code><\/td><td>string<\/td><td>Titolo slide<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n          <tr><td><code>caption<\/code><\/td><td>string<\/td><td>Descrizione slide<\/td><td>-<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3>Accordion<\/h3>\n    <p>Pannelli espandibili a fisarmonica.<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Parametro<\/th><th>Tipo<\/th><th>Descrizione<\/th><th>Default<\/th><th>Opzionale<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>title<\/code><\/td><td>string<\/td><td>Titolo del pannello<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>body<\/code><\/td><td>string<\/td><td>Contenuto del pannello<\/td><td>-<\/td><td>No<\/td><\/tr>\n          <tr><td><code>expanded<\/code><\/td><td>bool<\/td><td>Se aperto di default<\/td><td>false<\/td><td>S&igrave;<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Direttive Template<\/h2>\n    <p>I template dei componenti utilizzano direttive speciali per gestire la cardinalit&agrave; dei dati:<\/p>\n\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Direttiva<\/th><th>Descrizione<\/th><th>Uso<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>&#91;single&#93;...&#91;\/single&#93;<\/code><\/td><td>Template per un singolo elemento<\/td><td>Quando il JSON contiene un solo oggetto<\/td><\/tr>\n          <tr><td><code>&#91;multiple&#93;...&#91;\/multiple&#93;<\/code><\/td><td>Template per elementi multipli<\/td><td>Quando il JSON contiene un array con 2+ elementi<\/td><\/tr>\n          <tr><td><code>&#91;empty&#93;...&#91;\/empty&#93;<\/code><\/td><td>Template per nessun elemento<\/td><td>Quando il JSON &egrave; un array vuoto<\/td><\/tr>\n          <tr><td><code>&#91;repeat&#93;...&#91;\/repeat&#93;<\/code><\/td><td>Blocco ripetuto per ogni elemento<\/td><td>Dentro &#91;multiple&#93; per iterare sugli elementi<\/td><\/tr>\n          <tr><td><code>&#91;if-exists(var)&#93;...&#91;\/if-exists&#93;<\/code><\/td><td>Mostra solo se la variabile esiste<\/td><td>Per contenuti opzionali<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Esempio di template componente<\/div><pre><code>&lt;!-- Template per singolo elemento --&gt;\n&#91;single&#93;\n&lt;div class=\"my-component\"&gt;\n    &lt;h3&gt;&#123;&#123;title&#125;&#125;&lt;\/h3&gt;\n    &#91;if-exists(text)&#93;\n        &lt;p&gt;&#123;&#123;text&#125;&#125;&lt;\/p&gt;\n    &#91;\/if-exists&#93;\n&lt;\/div&gt;\n&#91;\/single&#93;\n\n&lt;!-- Template per elementi multipli --&gt;\n&#91;multiple&#93;\n&#91;repeat&#93;\n&lt;div class=\"my-component\"&gt;\n    &lt;h3&gt;&#123;&#123;title&#125;&#125;&lt;\/h3&gt;\n&lt;\/div&gt;\n&#91;\/repeat&#93;\n&#91;\/multiple&#93;<\/code><\/pre><\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Variabili di Loop<\/h2>\n    <p>All'interno dei blocchi <code>&#91;repeat&#93;<\/code>, sono disponibili variabili speciali per il ciclo:<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Variabile<\/th><th>Tipo<\/th><th>Descrizione<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>&#123;&#123;loop::index&#125;&#125;<\/code><\/td><td>int<\/td><td>Indice corrente (parte da 0)<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::index1&#125;&#125;<\/code><\/td><td>int<\/td><td>Indice corrente (parte da 1)<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::first&#125;&#125;<\/code><\/td><td>bool<\/td><td>true se &egrave; il primo elemento<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::last&#125;&#125;<\/code><\/td><td>bool<\/td><td>true se &egrave; l'ultimo elemento<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::total&#125;&#125;<\/code><\/td><td>int<\/td><td>Numero totale di elementi<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::odd&#125;&#125;<\/code><\/td><td>bool<\/td><td>true se l'indice &egrave; dispari<\/td><\/tr>\n          <tr><td><code>&#123;&#123;loop::even&#125;&#125;<\/code><\/td><td>bool<\/td><td>true se l'indice &egrave; pari<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Esempio con variabili di loop<\/div><pre><code>&#91;repeat&#93;\n&lt;li class=\"list-item&#123;&#123; loop::first ? ' first' : '' &#125;&#125;&#123;&#123; loop::last ? ' last' : '' &#125;&#125;\"&gt;\n    &#123;&#123;loop::index1&#125;&#125;. &#123;&#123;label&#125;&#125;\n&lt;\/li&gt;\n&#91;\/repeat&#93;<\/code><\/pre><\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Creare Componenti Custom<\/h2>\n\n    <h3>1. Struttura Directory<\/h3>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Struttura file<\/div><pre><code>cms\/plugins\/base\/views\/bi5\/components\/mycomponent\/\n└── mycomponent.html    (obbligatorio - template HTML)\n└── mycomponent.css     (opzionale - stili CSS)\n┌── mycomponent.js      (opzionale - JavaScript)<\/code><\/pre><\/div>\n\n    <h3>2. Template HTML<\/h3>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">mycomponent.html<\/div><pre><code>&lt;!--\nMYCOMPONENT Component\n\n@example &#123;&#123;\"title\":\"Hello\",\"text\":\"World\"&#125;&#125;\n\n@param string title - Component title\n@param string text - Component text (optional)\n--&gt;\n&#91;single&#93;\n&lt;div class=\"my-component\"&gt;\n    &lt;h3&gt;&#123;&#123;title&#125;&#125;&lt;\/h3&gt;\n    &#91;if-exists(text)&#93;\n        &lt;p&gt;&#123;&#123;text&#125;&#125;&lt;\/p&gt;\n    &#91;\/if-exists&#93;\n&lt;\/div&gt;\n&#91;\/single&#93;<\/code><\/pre><\/div>\n\n    <h3>3. CSS e JavaScript<\/h3>\n    <p>I file CSS e JS vengono caricati automaticamente da <code>CComponent<\/code> se presenti nella directory del componente. Non &egrave; necessario includerli manualmente.<\/p>\n\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">mycomponent.css<\/div><pre><code>.my-component &#123;\n    border: 1px solid #ddd;\n    padding: 1rem;\n&#125;<\/code><\/pre><\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Operatore Ternario nei Componenti<\/h2>\n    <p>L'operatore ternario &egrave; ideale per gestire classi e attributi condizionali:<\/p>\n\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Sintassi ternaria<\/div><pre><code>&lt;!-- Classe condizionale per stato attivo --&gt;\n&lt;button class=\"btn btn-primary&#123;&#123; active ? ' active' : '' &#125;&#125;\"&gt;\n\n&lt;!-- Attributi condizionali --&gt;\n&lt;button&#123;&#123;disabled ? ' disabled' : ''&#125;&#125;&gt;\n\n&lt;!-- Aria attributes per accessibilit&agrave; --&gt;\n&lt;div aria-expanded=\"&#123;&#123; expanded ? 'true' : 'false' &#125;&#125;\"&gt;<\/code><\/pre><\/div>\n\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\"><tr><th>Caso d'uso<\/th><th>Sintassi consigliata<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>Aggiungere classe CSS se booleano &egrave; true<\/td><td><code>&#123;&#123; active ? ' active' : '' &#125;&#125;<\/code><\/td><\/tr>\n          <tr><td>Mostrare\/nascondere elemento HTML<\/td><td><code>&#91;if-exists(icon)&#93;...&#91;\/if-exists&#93;<\/code><\/td><\/tr>\n          <tr><td>Scegliere tra due valori<\/td><td><code>&#123;&#123; theme == 'dark' ? 'white' : 'black' &#125;&#125;<\/code><\/td><\/tr>\n          <tr><td>Verificare esistenza variabile<\/td><td><code>&#91;if-exists(variable)&#93;<\/code><\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Best Practices<\/h2>\n\n    <h3>Convenzioni di Naming<\/h3>\n    <ul>\n      <li>Pulsanti &rarr; <code>label<\/code> (NON <code>text<\/code>)<\/li>\n      <li>URL &rarr; <code>link<\/code> (NON <code>href<\/code>)<\/li>\n      <li>Contenuto &rarr; <code>body<\/code> o <code>content<\/code><\/li>\n      <li>Titolo &rarr; <code>title<\/code><\/li>\n      <li>Tutti i parametri devono essere in inglese<\/li>\n    <\/ul>\n\n    <h3>Valori di Fallback<\/h3>\n    <p>Fornire sempre valori di default ragionevoli:<\/p>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Fallback con operatore ??<\/div><pre><code>&#123;&#123;text ?? 'Menu'&#125;&#125;\n&#123;&#123;type ?? 'primary'&#125;&#125;\n&#123;&#123;link ?? '#'&#125;&#125;<\/code><\/pre><\/div>\n\n    <h3>Documentazione dei Componenti<\/h3>\n    <p>Ogni componente DEVE avere un commento iniziale con:<\/p>\n    <ul>\n      <li><code>@example<\/code> con JSON di esempio<\/li>\n      <li><code>@param<\/code> per ogni parametro con tipo, descrizione, opzionalit&agrave;<\/li>\n    <\/ul>\n\n    <h3>Test Multi-View<\/h3>\n    <p>Testare SEMPRE il componente in tutti e tre i view mode: <strong>bi5<\/strong>, <strong>b5<\/strong>, <strong>default<\/strong>.<\/p>\n\n    <h3>Performance<\/h3>\n    <ul>\n      <li>Usare file separati <code>.css<\/code> e <code>.js<\/code> (caricati automaticamente)<\/li>\n      <li>Evitare nidificazioni eccessive di componenti<\/li>\n    <\/ul>\n  <\/div>\n<\/section>\n\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Limitazioni Note<\/h2>\n\n    <h3>1. &#91;if-exists&#93; dentro &#91;foreach&#93;<\/h3>\n    <p>I tag <code>&#91;if-exists&#93;<\/code> vengono processati PRIMA che i cicli <code>&#91;foreach&#93;<\/code> vengano eseguiti. Non &egrave; possibile usare <code>&#91;if-exists&#93;<\/code> su variabili create dai cicli.<\/p>\n    <div class=\"da-snippet\"><div class=\"da-snippet-label\">Soluzione<\/div><pre><code>&lt;!-- NON funziona --&gt;\n&#91;foreach from=\"items\" item=\"item\"&#93;\n    &#91;if-exists(item::label)&#93;&#123;&#123;item::label&#125;&#125;&#91;\/if-exists&#93;\n&#91;\/foreach&#93;\n\n&lt;!-- Soluzione: usare placeholder con fallback --&gt;\n&#91;foreach from=\"items\" item=\"item\"&#93;\n    &#123;&#123;item::label&#125;&#125;\n&#91;\/foreach&#93;<\/code><\/pre><\/div>\n\n    <h3>2. Boolean vs String<\/h3>\n    <p>I booleani JSON vengono convertiti in stringhe dal template engine: <code>true<\/code> &rarr; <code>\"1\"<\/code>, <code>false<\/code> &rarr; <code>\"\"<\/code> (stringa vuota).<\/p>\n\n    <h3>3. Custom Elements Post-Processing<\/h3>\n    <p>I custom elements come <code>&lt;dropdown-item&gt;<\/code> vengono processati DOPO il rendering del template. Usare solo placeholder semplici nel loro contenuto.<\/p>\n  <\/div>\n<\/section>\n\n<section class=\"da-section text-center\">\n  <a href=\"\/tutorials\" class=\"btn btn-outline-primary\">&larr; Torna ai Tutorial<\/a>\n<\/section>","description":"Guida completa al sistema di componenti UI riutilizzabili di DressAPI: architettura, catalogo, sintassi, direttive template, variabili di loop e creazione di componenti custom.","meta_keywords":"","visible":"yes","status":"public","creation_date":"0000-00-00","id__user":1,"priority":0,"groupname":"TUTORIAL"}],"module":"pages","permissions":{"can_read":true},"main_item_title":"title","related_tables":[{"name":"Newsonpage","module":"newsonpage","FK":"id_cmspage","permissions":[]}],"page_info":{"table":"","key":"id","url":"\/pages","url_list":"\/pages","filters":{"id":["=","7014"]},"pagination":{"total_items":23,"page":1,"total_pages":2,"step":1,"items_per_page":20,"url_prev":"\/pages","url_next":"\/pages\/p\/2","url_tmpl":"\/pages\/p\/[[p]]","url_tmpl_with_order":"\/pages\/p\/[[p]]\/ob\/[[ob]]"},"order":{"field":"id","type":"DESC","url_tmpl":"\/pages\/p\/[[p]]"},"module":{"title":"Pages","description":"List of pages","name":"pages"},"current":{"title":"Pages","description":"List of pages","name":"pages","url":"\/tutorials\/components"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}