Changelog
Novità del sito
Versione attuale: v1.322.1 — tutte le modifiche e i miglioramenti dello shop, dalla più recente.
v1.320.0 07/09/2026 Attuale
Prodotti e lingue per sito dal CRM
lib/bridge.tsdichiara il sito in ogni lettura (site): il bridge restituisce solo i prodottilib/i18n.ts: le lingue attive sono quelle scelte per QUESTO sito nel CRMlib/tailormats/adapters.ts: i decori del bordo hanno un angolo proprio (cornerImageUrl).
v1.319.0 07/09/2026
E-commerce multi-sito: carrello, account, pagamenti ed email servono anche gli spoke (TailorMats)
- Un e-commerce per tutto l'ecosistema.
account.php,payments.php,email.php, - Marchio e link per sito. Le email di uno spoke dicono il suo nome e portano al suo dominio
- Numeri d'ordine per sito:
FLR-…per Floormad,TM-0001…per TailorMats, contatori - Stripe: le sessioni portano
metadata.site; gli URL di ritorno (carrello, /paga) vanno - Impostazioni per sito (
_settings/sites/<id>.json): lo spoke parte dai default del registro - Recupero carrello: lo snapshot ricorda il sito e il link di recupero torna al suo carrello.
- Motore (
lib/*.ts): tutte le librerie e-commerce chiamano il hub (ep()) e dichiarano il sito CartPage: «Modifica» di una rigaconfigKind: 'tailormats'riapre/configuratore.ordernum.php,settings.php,email.php,account.php… : ogni link cablato a
v1.318.0 07/09/2026
Sitebuilder multi-sito: il builder serve anche gli spoke (TailorMats)
- Un builder per tutto l'ecosistema.
pages.php,theme.php,media.phpeupload.php lib/site.tsnel motore:SITE_ID,SITE_NAME,HUB(dove stanno gli endpoint deltheme.php getrisponde anchesaved: uno spoke senza tema salvato tiene il proprio CSS- Barra admin e Bacheca sanno se girano su uno spoke: mostrano solo pagine, media, tema e
- Media di uno spoke: URL assolute verso il hub (le immagini restano lì);
lib/img.ts - Pagine di partenza per TailorMats (
builder/seeds/tailormats.ts): home, materiali, - Un pannello per tutti i siti. Registro degli strumenti in
src/admin/tools.ts(chiave, - Dati separati per sito anche per
coupons.php,redirects.php,leads.php, - Tutte le chiamate del pannello passano da
lib/site.ts(ep()): nessun endpoint relativo al /core.jsonsu ogni sito (lib/coreInfo.ts): versione del core, del sito e data del build,
v1.317.0 07/09/2026
Anteprima delle bozze; «non pubblicato» invece del prodotto sbagliato
?anteprima=<id>sulla pagina prodotto: carica il prodotto anche se è in bozza,- Guard sulla tolleranza degli slug: il permalink di un prodotto esistente ma non
- Il catalogo di anteprima assegna ai pubblicati gli stessi permalink del catalogo vero:
v1.316.0 07/09/2026
Stili di tema pronti; adapter TailorMats
- Stili pronti nel pannello Tema: colori, font e tipografia di uno stile in un clic
- Adapter TailorMats: prodotto MegaCRM → impostazioni del configuratore, e
configKindaccetta'tailormats'.
v1.313.0 03/09/2026
Un solo pagamento: il modulo Stripe in pagina, con TUTTI i metodi
- Via il doppio percorso «Paga sul sito / Paga su Stripe»: resta un solo flusso, il modulo
- Come funziona: la sessione embedded passa a «redirect solo se serve» — carta, Apple Pay e
- Rete di sicurezza: finché il modulo è aperto, il carrello interroga lo stato della
- I vecchi link «Paga su Stripe» già emessi continuano a funzionare: il rientro è lo stesso.
v1.312.0 02/09/2026
Il civico non si appende più alla via a ogni ordine
- L'anagrafica salva via+civico in un campo unico, il checkout li chiede in due: si univa al
- Ora il giro è simmetrico e stabile (sito/src/lib/address.ts):
v1.311.0 02/09/2026
Trame personalizzate e trame tecniche come superficie
- Il sito disegna le trame personalizzate create nel CRM (Tool → Trame): arrivano live dal
- Moquette, Spazzola e Gomma valgono anche come trama di superficie del prodotto o del
v1.310.0 02/09/2026
Le anteprime leggono le dimensioni di default delle trame
- I due configuratori (classico e tecnico) leggono live dal bridge i default globali
- Anche il build li applica, così le pagine statiche disegnano con le stesse misure.
v1.309.0 02/09/2026
La «Dimensione trama» funziona anche sui tappeti tecnici
- Nell'anteprima a doghe dei tappeti tecnici la piastrella della trama era fissa a 20 px:
- Vale per ogni inserto anche sui combinati: ciascun colore porta la sua dimensione trama.
v1.308.0 02/09/2026
Spessore dentro le misure (tappeti tecnici) e ricerca flessibile
- Tappeti tecnici: lo spessore si sceglie nella stessa pagina delle misure, in testa al
- Ricerca flessibile su SearchBox e catalogo: «wide flat», «wideflat» e «wide-flat»
v1.307.0 02/09/2026
Il configuratore tecnico rispetta il colore con la stellina
- Il configuratore dei tappeti tecnici parte dal colore stellato nel gestionale; senza
- Sui combinati (inserti alternati, es. moquette + gomma) vale per OGNI gruppo: in ciascun
- Il configuratore classico la rispettava già: ora i due si comportano uguale.
v1.306.0 02/09/2026
La misura segue lo spessore scelto (e l'etichetta si vede)
- Lo schema del sito scartava
thicknessesMm/colorNamesdalle misure standard (bande e - Ogni card misura porta i vincoli della sua riga: prima si risaliva alla riga per
- Lo spessore scelto dai preset non arrivava mai al motore prezzi (ci arrivavano solo le
- L'etichetta della riga si vede: in piccolo sotto la misura nella card e come nota nel
v1.305.0 02/09/2026
La banda non si taglia più lunga di quanto si può
- Se nel gestionale una banda dichiara la sua lunghezza massima di taglio, il configuratore la
- Il limite della riga vince su quello del prodotto solo quando è più stretto: una riga non
- Senza il campo compilato non cambia nulla: vale il limite del prodotto, come prima.
v1.304.0 01/09/2026
Con un prezzo solo la pagina non scrive più «a partire da»
- Il criterio sta in
hasSinglePrice, accanto al calcolo del «da» - È volutamente prudente: nel dubbio «a partire da» resta. L'errore opposto — prezzo secco su
- Un solo spessore dichiarato a sovrapprezzo zero non conta come scelta: è il caso dei rotoli
- L'etichetta scritta a mano nel gestionale («a rotolo», «al pezzo») continua a vincere su tutto.
- Misurato sul catalogo vivo prima di pubblicare: 6 prodotti su 69 perdono l'etichetta —
v1.303.0 01/09/2026
Il motore spedizioni conosce l'accordo del cliente
shippingOptionsaccetta l'accordo di spedizione del cliente (soglia gratis + costo fisso per- Anche «ti mancano X € alla spedizione gratuita» usa la soglia del cliente quando c'è.
- Il wrapper del carrello lo inoltra (sito/src/lib/shipping.ts): quando
v1.302.0 01/09/2026
Un rotolo solo si apre su quel rotolo, anche senza la stellina
- Ora con un solo rotolo utilizzabile si parte da quello, stellina o no: non c'è niente da
- Con più rotoli e nessuna stellina non cambia nulla: la scelta resta del cliente.
- La lunghezza si legge dalla riga o, sui listini vecchi, dal campo lunghezza del prodotto.
v1.301.0 01/09/2026
Il rotolo si vede disegnato, con la sua misura e il suo prezzo
- Ora c'è l'illustrazione della modalità, la stessa immagine della card «Rotolo intero»
- A destra misura e prezzo nella stessa forma delle card del blocco Misura: la misura grande,
- La misura non è più ripetuta nell'elenco sotto: è già scritta grande nella card.
v1.300.0 01/09/2026
Il rivenditore vede (e paga) il suo sconto quantità
- Lo sconto per quantità ora segue il listino in uso: al rivenditore il suo, se dichiarato nel
- Vale sia sul prezzo sia sui tre riquadri che elencano le fasce e sul suggerimento
v1.299.0 01/09/2026
Il rotolo intero si vede, e due trame nuove
- Prodotto senza niente da scegliere: anteprima accanto al riepilogo. Sui prodotti a misura e
- Trame nuove: SQUAREroll e COMFORTroll (sito/src/lib/matPatterns.ts).
v1.298.0 01/09/2026
La palette dei colori del logo viene dal gestionale
- Nelle stampe a 1/2/3/4 colori il cliente scegle fra i colori dichiarati sul prodotto, non
- Senza una palette sul prodotto non cambia nulla: valgono i sei di sempre (Nero, Bianco, Rosso,
- L'ordine della palette decide quali colori partono selezionati quando si passa a una modalità
v1.297.0 01/09/2026
Anche i preset di spessore partono dal più sottile
- Ora parte selezionato il preset più sottile, e il passo Spessore nasce già spuntato.
- Nessun effetto sul prezzo su questi prodotti: i preset hanno sovrapprezzo zero. In generale si
v1.296.0 01/09/2026
La spunta sulla Misura dice la verità, e lo spessore parte scelto
- La ✓ sullo step Misura compariva anche senza aver scelto lo spessore. Bastava entrarci: la
- Lo spessore parte dal più sottile. Così lo step non nasce in sospeso e la spunta è onesta.
- E il «da €X» non si perde. La preselezione è marcata come *nostra*: finché il cliente non
- Cambiando misura, se lo spessore scelto non esiste per la riga nuova ora si **scende al più basso
- Misura preimpostata dal gestionale: i campi larghezza × altezza della misura libera si aprono
v1.295.0 31/08/2026
Etichetta sotto la larghezza della banda
- Se nel gestionale la banda ha un'etichetta (es. «Passatoia»), il configuratore la mostra
v1.294.0 31/08/2026
«Ti conviene il rotolo intero»
- In Banda fissa, quando il taglio richiesto costa quanto o più del rotolo intero della
- Il prezzo del rotolo usato nel confronto segue le stesse regole della sua card (variante
v1.293.0 31/08/2026
Il configuratore parte dalla banda predefinita
- Con la stellina su una banda nel gestionale, il configuratore si apre in modalità
v1.292.0 31/08/2026
Il listino segue spessore e colore scelti
- Misure standard, bande e rotoli mostrano e prezzano solo le righe valide per il colore e
- A parità di misura vince la riga più specifica; prima si prendeva la prima inserita.
- La regola sta in un modulo solo, usata dal prezzo e dagli elenchi, coperta da 11 test.
v1.291.0 31/08/2026
Prezzo a destra, e la banda lo mostra mentre scrivi
- Nelle Misure standard il prezzo è a destra, centrato sull'altezza della card, come nei
- Banda fissa: prezzo in tempo reale. La banda si paga al metro, quindi il numero cambia a
v1.290.0 31/08/2026
Il rotolo giusto per colore e spessore
- L'elenco dei rotoli mostra solo quelli compatibili con il colore e lo spessore scelti, e di
- A parità di misura vince la riga più specifica: con «90×1830» generico e «90×1830 Nero
- La regola sta in un modulo solo, usato dal prezzo e dall'elenco, coperta da 6 test.
v1.289.1 31/08/2026
Spessore fra la modalità e le misure
- Lo spessore era finito sopra a tutto, prima ancora di «Su misura / Rotolo intero». Ora sta
v1.289.0 31/08/2026
Prima lo spessore, poi la misura
- Lo spessore sta sopra, prima di larghezza/altezza e delle misure del rotolo: è lui a
- Gli spessori stanno su una riga sola quando ci stanno: con sei, la griglia da quattro ne
- Misure e prezzi più grandi nelle card, e nel rotolo il prezzo è a destra, centrato
v1.288.0 31/08/2026
Il configuratore parte dal rotolo predefinito
- Con la stellina sul rotolo nel gestionale il configuratore si apre già su quella misura,
- Lo spessore preselezionato viene scritto sia dove lo legge il prezzo sia dove lo legge
v1.287.0 31/08/2026
Lo spessore si sceglie una volta sola, dentro la Misura
- Sugli zerbini su misura lo spessore era chiedibile due volte. Sul cocco a rotoli
- Ora c'è un solo elenco, dentro il passo Misura, con la grafica delle card del passo 2
- Il passo «Spessore» sparisce dalla barra quando il prodotto ha un passo Misura — resta nel
- Selezionando si scrivono entrambi gli stati: il prezzo legge l'uno, il riepilogo l'altro —
v1.286.0 28/08/2026
Trama tinta e saluto leggibile
- Colore overlay: se il colore lo prevede, la trama si tinge in *multiply* invece di essere
- Carrello: «Bentornato Aldo Torrisi» sta su una riga sua, un punto più grande, e la nota
v1.285.0 28/08/2026
Anteprima a tutto spazio e pagina prodotto mobile
- Anteprima più grande: via i margini interni che la rimpicciolivano e via il pulsante
- Tinta sopra la trama: se il colore lo prevede, si fonde in *multiply* sulla trama.
- Pagina prodotto su telefono (sito/src/components/ProductLive.tsx):
- il titolo ha lo stesso stile e colore di quello del desktop (usciva arancione);
- via il prezzo doppione in cima: lo mostra già la barra fissa in basso;
- le icone si ingrandiscono al tocco e mostrano la didascalia, tornando piccole dopo due
- «Trova il prodotto ideale» scende dopo il configuratore: sopra occupava lo schermo
v1.284.0 28/08/2026
Il colore fa quello che dice il suo pannello
- Tinta piatta vuol dire tinta piatta. Un colore messo su «tinta unita» mostrava lo stesso
- Niente trame prese in prestito da altri colori. Sullo zerbino stampato un colore senza
- Il fondo segue il colore scelto: era inchiodato al beige del cocco, quindi con due fondi
v1.283.0 28/08/2026
Le cornici scalano con lo zerbino
- Le cornici stampate si disegnano in proporzione alla taglia: il fattore è
v1.282.0 28/08/2026
L'inchiostro è una cosa, il fondo un'altra
- Le cornici si disegnano col colore della sovrastampa (lista propria del bordo), mentre il
- Bordo e inchiostro finiscono nell'ordine. Non ci arrivavano affatto: la riga non diceva
- Finché la lista del bordo è vuota si ripiega sui colori del prodotto, così il prodotto resta
v1.281.0 28/08/2026
Il fondo dello zerbino non cambia col colore
- Il cocco è uno solo per tutte le stampe. Il fondo si prendeva dal colore *attivo*, ma qui
- Via il cocco disegnato: era cablato nel codice per questo prodotto. Resta solo se scelto
- Il colore della stampa non tinge più il fondo sotto la trama.
- I colori sono tondini su una riga sola, cinque anche da telefono; le due foto del bordo
v1.280.1 28/08/2026
La stampa è inchiostro, non vernice
- Le cornici dello zerbino si disegnano in multiply: il cocco del fondo continua a leggersi
v1.280.0 28/08/2026
Zerbino stampato: prima il bordo, e la foto vince sul disegno
- Il bordo è il primo passo, col colore della stampa sulla stessa pagina; seguono
- Bordo e colore preselezionati da quanto scelto col CRM (le stelline).
- La foto della trama vince sul disegno. Il cocco disegnato era cablato per questo prodotto
v1.279.0 28/08/2026
La trama personalizzata si vede (e si dimensiona)
- «Trama personalizzata» ora funziona anche qui. Chi nel CRM sceglieva quell'opzione e
- La trama si ripete alla scala giusta: il lato della piastrella arriva dal colore
- I tipi del sito erano rimasti indietro su
previewPattern,customPatternUrle
v1.278.1 27/08/2026
Zerbino stampato: vince la foto del cocco, non la trama disegnata
- Sul bordo stampato forzavo la trama Cocco disegnata, che copriva la foto caricata sul
v1.278.0 27/08/2026
Le misure si adattano al colore scelto
- La larghezza massima cambia col colore (è quella della bobina): scegliendo un colore più
- Il vincolo è sul lato corto: la lunghezza resta quella del prodotto, e la stessa misura vale
- Cambiando colore, una misura più larga della bobina viene riportata dentro il limite invece di
v1.277.0 27/08/2026
Zerbino stampato: il fondo è cocco, il colore è della stampa
- L'anteprima dipingeva tutto lo zerbino del colore selezionato, perché su questo prodotto i
- Non serve più impostare a mano la trama Cocco sul prodotto: la deduce dal bordo stampato.
v1.276.0 27/08/2026
Zerbino con bordo stampato: scelta e anteprima
- Step Bordo con doppio e singolo affiancati; senza foto caricate si disegna il tappeto con le
- L'anteprima disegna le cornici concentriche col colore scelto, staccate dal filo: il viewBox
- Trama Cocco: fibre intrecciate che proseguono oltre il bordo del modulo, così affiancandolo
v1.275.0 27/08/2026
Le bande safety solo dove sono state accese
- Comparivano due strisce verticali su tappeti che non le avevano. Due cause sommate: un
- Ora le bande escono solo se accese nel gestionale e solo sui lati spuntati, sia
v1.274.0 27/08/2026
Il configuratore parte dalla misura predefinita
- La misura con la stella nel gestionale è quella già selezionata all'apertura, e lo step
- Senza stella vale la prima misura dell'elenco, come prima.
v1.273.1 27/08/2026
«Rettangoli stretti» in verticale
- I fori rettangolari sono ora verticali (1,26 × 2,34 cm, proporzione 7:13); la nervatura resta
v1.273.0 27/08/2026
Nuova trama «Rettangoli stretti»
- Maglia a fori rettangolari in proporzione 13×7 (2,34 × 1,26 cm), con la nervatura
- Il sistema delle trame assumeva tile quadrati (unica eccezione le righe): ora l'altezza del
v1.272.0 27/08/2026
Due maglie quadre: «Quadrati» e «Quadrati stretti»
- Quadrati stretti: la maglia fitta di prima torna come trama a sé — foro ~1,8 cm, nervature
- Quadrati resta la maglia larga e diventa ancora più sottile: foro ~3,15 cm, nervatura ~3,5 mm.
- Una sola implementazione parametrica per entrambe: due copie della stessa maglia sarebbero
v1.271.1 27/08/2026
«Quadrati»: maglia da 3 cm, nervature più sottili
- Il foro passa a ~3 cm e la nervatura a ~5 mm: il tile copre 7 cm reali invece di 4,5, quindi
v1.271.0 27/08/2026
Nuova trama «Quadrati»
- Trama Quadrati fra quelle selezionabili: griglia a maglia quadra dei tappeti da drenaggio in
v1.270.0 27/08/2026
Gli incastri passano sopra la banda
- Le linee d'incastro delle piastrelle vengono ridisegnate sopra le bande: sul prodotto vero
- Linea d'incastro più sottile (1,2 → 0,85), dentro e sopra la banda.
v1.269.0 27/08/2026
Bande safety: giallo sicurezza di serie, banda 4 cm
- Il colore di serie della banda è il giallo sicurezza
#ffdd00, e sul sito fa anche da - La larghezza di serie passa da 6 a 4 cm.
v1.268.0 27/08/2026
La chat non mostra più il JSON grezzo
- Quando la risposta del modello non si decodificava — basta un a capo o un apice dentro il testo,
- Ora l'estrazione cerca il primo oggetto JSON bilanciato, saltando le graffe dentro le
- Limite di token alzato (800 → 1400 su Gemini, 1024 → 1400 su Claude): la risposta tagliata a
v1.267.0 27/08/2026
La banda safety è una rampa, e segue la scelta del cliente
- Era disegnata come una striscia piatta: sul prodotto vero è una rampa interna liscia che
- Sui prodotti componibili l'anteprima non seguiva la scelta: le bande si disegnavano sempre,
- Larghezza dal gestionale (default 6 cm) al posto dei 5 fissi nel codice, e nel riepilogo la
- L'arrotondamento era già seguito: la banda sta dentro il gruppo ritagliato dagli angoli.
v1.266.1 27/08/2026
«Completa la configurazione» che non si sbloccava mai
- Su un prodotto sia a misure standard sia componibile (Bubblemat Black), aprire «Misure
v1.266.0 27/08/2026
Step «Bande safety»: il cliente sceglie confrontando due foto
- Quando il gestionale lascia la scelta al cliente compare uno step con **due foto del prodotto
- Nessuna opzione preselezionata: si sceglie, come per il bordo a giro. Preselezionare
- L'anteprima segue la scelta: escludendo le bande spariscono anche dal disegno.
v1.265.1 27/08/2026
Velo del rilievo al 15%
- La sfumatura del bordo va da 0 al 15% (era 30%): basta a far leggere il piano inclinato
v1.265.0 27/08/2026
Il verso della luce sul bordo: ombra fuori, luce in cima
- La sfumatura del rilievo va **dal colore pieno sul filo esterno fino al 30% al punto
v1.264.0 27/08/2026
Rigatura del profilo: due pesi, uno per l'alluminio
- Ammorbidire la rigatura per non coprire il rilievo aveva **sbiadito anche i profili in alluminio
v1.263.2 27/08/2026
Velo del bordo al 30%
- Il velo del rilievo parte dal 30% sul filo esterno invece che dal 50%: a metà opacità
v1.263.1 27/08/2026
«5 Buchi»: foro centrale più largo
- Nella trama 5 Buchi il foro centrale è un filo più largo degli altri quattro (2,25 → 2,5):
v1.263.0 27/08/2026
La sfumatura del bordo parte dal filo esterno
- Il massimo di luce ora sta sul filo ESTERNO e cala fino a zero dove il bordo si aggancia al
- Bordo a rilievo spegnibile: senza, la cornice è una fascia piatta a tinta unita, nessuna
v1.262.0 27/08/2026
Bordo attivo senza lati scelti = tutti e quattro
- Il bordo a giro acceso ma senza lati spuntati veniva scartato: non compariva in anteprima pur
v1.261.0 27/08/2026
Il rilievo del bordo si legge, senza sembrare metallo
- La rampa si VELA, non si ricolora. Prima la sfumatura sostituiva il colore del prodotto con
- Via il picco di luce al 16%, che tagliava netto e faceva sembrare la rampa un nastro
- Rigatura molto più leggera (da 0,5 a 0,09 di bianco): a contrasto pieno copriva la sfumatura
- Anteprima «a filo»: era l'unico ramo che non disegnava né rampa né bordo a giro. E in
v1.260.0 27/08/2026
Nuova trama «5 Fori» (tappeto ad anelli)
- Trama 5 Fori fra quelle selezionabili: 5 fori grandi per piastrella — uno per angolo più uno
v1.259.0 27/08/2026
Il rilievo del bordo si vede anche sul nero · cornice piena
- Nero su nero: il rilievo era invisibile. La faccia in ombra della rampa è già nera come il
- La cornice usciva vuota, con i soli contorni. Anteprima laterale e schermo intero convivono
- Arrotondamento 0–100 dal CRM al posto del solo acceso/spento; il flag storico vale 20, quindi
v1.258.0 27/08/2026
Niente da scegliere? Si va dritti al carrello
- Quando il prodotto ha una misura sola e un colore solo il percorso a step sparisce: al suo
- Il riepilogo usa le stesse righe della colonna «Il tuo prodotto», quindi resta allineato da sé
v1.257.1 27/08/2026
Un prodotto con una misura e un colore ora si può comprare
- Gli step con una sola opzione si nascondono (non c'è nulla da scegliere), ma su un prodotto con
v1.257.0 27/08/2026
Il bordo a giro si vede e si paga su qualsiasi prodotto
- La cornice del bordo a giro compare nell'anteprima di qualunque prodotto che l'abbia attivata
- Se il CRM lascia la scelta al cliente compare uno step Bordo a giro con i lati e, quando ci
v1.256.0 27/08/2026
«A partire da»: legge i prezzi per colore, le bande e i rotoli
- Il «da €X» non resta più a 0 quando il listino è compilato dalla matrice combinazioni
- Prodotti venduti solo a banda o solo a rotolo: prima nessun candidato, quindi 0. Ora bande e
- Il calcolo esce da
catalog.tse vive in un modulo suo senza import di runtime: è la regola che
v1.255.0 27/08/2026
Bande safety anche sul componibile, bordi contati per lato
- Le bande safety si vedono finalmente sui prodotti componibili
- Colore della banda dal CRM (src/lib/crm/configSchema.ts):
- Bordi rampa contati per aggancio E per lato
v1.254.1 25/08/2026
Dot del carosello: torna l'aspetto originale (resta il tocco 44px)
- Ripristinati i pallini piccoli e discreti di prima (10px, bg-white/60, ravvicinati): l'ingrandimento visivo non piaceva. L'area di tocco resta 44px ma invisibile, via pseudo-elemento (src/builder/blocks.tsx).
- Configuratore in chunk separato (lazy): ~300 KB fuori dal bundle iniziale della pagina prodotto; fallback di caricamento con la chiave dizionario corretta (src/components/ProductLive.tsx).
v1.254.0 25/08/2026
Le mattonelle FORATE si vedono anche nel disegno libero
- Nel «Disegna il prodotto» (pianta e designer a schermo pieno) le mattonelle erano rettangoli pieni: sui Fatigue-Step, che sono forati, l'anteprima mostrava un prodotto diverso da quello che arriva. Ora la pianta disegna la trama superficie del prodotto (Forato, Bubble, Dot, Industrial…) alla scala vera della mattonella, come già facevano le altre anteprime (src/components/FreeformPreview.tsx, src/components/FreeformModular.tsx, src/components/FreeformDesignerModal.tsx, src/components/Configurator.tsx).
- I Solid Fatigue-Step restano pieni: la trama la decide il prodotto (campo «Trama superficie»), quindi chi non ne ha una continua a disegnarsi in tinta unita.
v1.253.0 25/08/2026
Superfici per colore disegnate nell'anteprima
- Il configuratore tecnico riconosce le trame superficie scelte sul singolo colore (Bubble, Dot, Industrial, Diamond, Forato, Ribbed, Grip) e le disegna tono su tono nell'inserto e nella card colore, come già faceva con Moquette/Spazzola/Gomma (src/components/TechnicalConfigurator.tsx, src/lib/crm/configSchema.ts).
v1.252.0 25/08/2026
Mobile: prezzo, consegna e configuratore più leggibili e più «toccabili»
- Prezzo: «IVA esclusa» va sotto la cifra su mobile (a fianco stringeva il prezzo e andava a capo a metà) (src/components/ProductLive.tsx).
- Consegna stimata: su mobile la data è corta (10/09/26) con lo stesso corpo del prezzo accanto, così i due box combaciano; su desktop resta per esteso. Il «+ 7 di trasporto» va a capo invece di spezzarsi a metà frase (nuova chiave
pd.transitSuffixin it/en/de) (src/lib/dictionary.ts). - Configuratore a disegno libero su mobile: la pianta usa tutta la larghezza (via i margini laterali) e sale da 30vh a 44vh (78vh espansa) — caselle e bordi gialli diventano più grandi e si centrano col dito. Anche il designer a schermo pieno dà più spazio al disegno: niente padding sul mobile e pannello laterale più basso (src/components/Configurator.tsx, src/components/FreeformDesignerModal.tsx).
v1.251.0 25/08/2026
Trama Dot: cerchi più grandi e più vicini
- Raggio del punto 2,15 → 2,6 unità: i cerchi si avvicinano fino a sfiorarsi lungo la diagonale (i vicini distano 5,66 unità) senza mai sovrapporsi. Passo del motivo stretto da 5,6 a 4,8 cm, così il diametro REALE resta ~3 cm come il prodotto vero: si stringe la trama, non si gonfia il punto (src/lib/matPatterns.ts).
v1.250.0 25/08/2026
Il prezzo del colore si vede PRIMA di scegliere
- Quando il listino cambia col colore (Cobadot al metro lineare: Nitrile Nero 75,40 · Nero 34,80), il prezzo compare sulla card colore sotto il nome e nel riepilogo accanto al colore scelto: la differenza si vede prima di decidere, non dopo (src/components/Configurator.tsx).
- Unità corretta per modalità:
€/mlper la banda al metro lineare,€per rotolo intero e misure fisse. Etichettare come «€/m²» un prezzo al metro lineare (75,40 €/ml su banda 120 cm sono 62,83 €/m²) avrebbe messo sul sito un prezzo falso.
v1.249.1 25/08/2026
L'avviso «composta da N rotoli» non compare più a misura vuota
- Con la lunghezza della banda ancora da inserire, il prezzo si calcolava sul valore iniziale e l'avviso rosso «la tua misura viene composta da 1 rotolo intero…» compariva appena aperta la pagina. Ora avviso e riga «Composizione» nel riepilogo appaiono solo con una misura valida (src/components/Configurator.tsx).
v1.249.0 25/08/2026
Il prezzo segue il colore anche senza spessori
- Rotolo e banda ora leggono
priceByColordalla riga: nei prodotti senza spessori con listino diverso per colore (COBAelite: rotolo Blu ≠ rotolo Nero) il totale è quello del colore scelto, non quello della prima combinazione della riga (src/lib/crm/configSchema.ts).
v1.248.0 25/08/2026
Con la matrice, la MISURA si scegli prima del colore
- Se i colori disponibili cambiano in base alla modalità di vendita (COBAelite: il Blu esiste solo come rotolo intero), il configuratore mette lo step Misura prima di Colore. Prima il colore veniva chiesto per primo e il filtro girava sulla modalità *iniziale* (metro lineare): il Blu non compariva affatto (src/components/Configurator.tsx).
- L'inversione vale SOLO per quei prodotti: dove i colori sono gli stessi in tutte le modalità, l'ordine resta quello configurato nel CRM.
v1.247.0 25/08/2026
I colori offerti seguono la matrice combinazioni
- Se dal CRM arriva la matrice combinazioni, il configuratore mostra solo i colori che esistono davvero in quella modalità (il Blu che a listino è solo rotolo non compare al metro lineare); cambiando modalità, un colore non più disponibile viene sostituito col primo valido. Prodotti senza matrice: nessun filtro, tutto come prima (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.246.0 25/08/2026
Scheda prodotto mobile: prezzo sopra la piega; hero leggibile; badge versione solo admin
- Su mobile NOME e PREZZO stanno prima della galleria (prima: h1 a ~600px, prezzo a ~1000px — la scheda sembrava senza prezzo); prezzo anche nella barra sticky «Configura prodotto»; sottotitolo identico alla descrizione breve deduplicato; breadcrumb visibile anche su mobile (src/components/ProductLive.tsx, [src/pages/prodotto/[slug].astro](sito/src/pages/prodotto/[slug].astro)).
- Hero: swipe touch nel carosello, frecce solo da sm in su (si sovrapponevano al testo), dot con area tocco 44px, ombre piene su titolo/sottotitolo (il testo centrato cadeva nella fascia trasparente del gradiente) (src/builder/blocks.tsx).
- Badge versione in topbar nascosto ai visitatori: lo vede solo chi ha il token editor (src/components/Header.astro). Default topbar qualificato «Produzione in 5 giorni per i prodotti Fast» — il testo LIVE va aggiornato nelle impostazioni (src/lib/siteSettings.ts).
- Le ~123 immagini del menu non puntano più a wp-content a piena risoluzione (fino a 1 MB l'una, ~20,5 MB scaricati su OGNI pagina, mobile incluso): passano da
img.phpconw=96e si montano solo alla prima interazione con la voce — al load non parte più nessuna richiesta immagine del menu (src/components/SiteNav.tsx). - Pannelli del mega-menu chiusi con
display:noneinvece divisibility:hidden: un pannello da 1000 px «invisibile» occupava comunque layout e allargava la pagina a 1912 px su viewport 1440 → scroll orizzontale su tutte le pagine desktop (src/components/SiteNav.tsx). - Props dell'isola menu senza i campi mai letti dall'isola (
labelByLocale,banner) e idratazioneclient:idle: il menu è serializzato due volte per pagina (HTML SSR + props JSON), ogni campo morto pesava doppio (src/components/Header.astro).
v1.244.1 25/08/2026
Anche in modalità BANDA lo spessore parte dal più sottile
- Stessa preselezione del rotolo intero: scegliendo la banda al metro lineare, lo spessore minimo è già selezionato (modificabile) (src/components/Configurator.tsx).
v1.244.0 24/08/2026
Rotolo intero: misura e spessore si selezionano da soli
- Con una sola riga rotolo, la card si seleziona automaticamente (non c'è nulla da scegliere: la card che aspettava un clic lasciava lo step in sospeso), e lo spessore parte già sul più sottile — resta modificabile (src/components/Configurator.tsx).
v1.243.1 24/08/2026
HOTFIX: pagine prodotto bianche
- Dal 1.242.0 il configuratore crashava al primo render (
effectiveSkuleggevaactiveColordichiarato più in basso: temporal dead zone → ReferenceError) e la pagina prodotto restava bianca. Ora usa lo statocolor, come già il calcolo prezzi (src/components/Configurator.tsx).
v1.243.0 24/08/2026
Il prezzo delle combinazioni segue anche il colore
priceFromSchemariceve il colore attivo: se la combinazione misura×spessore ha un prezzo per quel colore (dal CRM), totale e card degli spessori usano quello; senza, eredita dalla combinazione come prima (src/lib/crm/configSchema.ts, src/components/Configurator.tsx).
v1.242.0 24/08/2026
Lo SKU dell'ordine segue anche il COLORE
- Se la combinazione (misura/banda/rotolo × spessore) dichiara «SKU per colore» nel CRM, il configuratore mette su carrello e ordine il codice del colore scelto (Cobadot: CDS01… Nero, CDS06… Grigio); senza, vale il codice generico come prima (src/components/Configurator.tsx).
v1.241.0 24/08/2026
Trama «Diamond»: la Industrial in diagonale
- Stesso chicco a rilievo della Industrial (visibile anche sul nero 100%), ruotato di 45°: alternanza ±45° a scacchiera per un tile che si ripete senza giunte (src/lib/matPatterns.ts).
v1.240.0 24/08/2026
Trama Industrial rifatta: a rilievo, e visibile anche sul nero 100%
- La mandorlata era incisa con toni del colore stesso: su un tappeto nero «più scuro del nero» non esiste, e la trama spariva. Ora i chicchi sono a rilievo — ombra portata, fianco in pendenza, dorso che prende luce e filo di luce sul colmo — con luci bianche e ombre nere in trasparenza, leggibili su qualunque colore (src/lib/matPatterns.ts).
- Disegno più fedele alla gomma vera: chicchi alternati 0°/90° a scacchiera (prima erano ±45°), proporzioni riviste sulla foto del prodotto. Vale ovunque la trama compare: anteprima configuratore, componibile e mockup per la simulazione AI.
v1.239.0 24/08/2026
Ricerca nella barra su mobile, passi della home respirabili, card chat pulita
- Ricerca su mobile (mancava del tutto): l'icona 🔍 nella barra in alto apre un overlay a tutto schermo con input e risultati live — stessa ricerca del desktop, stessa lista risultati condivisa (src/components/SearchBox.tsx).
- Blocco «Timeline / passi»: su mobile i numeri sporgevano fino al bordo dello schermo — aggiunto il margine sinistro (da
smin su torna il centraggio) (src/builder/vetrinaBlocks.tsx). - Anteprima prodotto nella chat: via la descrizione grezza («[IDENTITA PRODOTTO] Nome: … Categoria: …») — restano solo foto raddoppiata (56→112 px) e nome con «Vedi prodotto →» (src/components/ChatAgent.tsx).
v1.238.0 24/08/2026
Il peso della riga segue lo spessore scelto
- I configuratori (standard e tecnico) passano lo spessore selezionato al calcolo del peso: se il prodotto dichiara i kg/m² per spessore (
weight.perSqmByMm, dal CRM) il peso della riga — e quindi la spedizione a peso — usa quello giusto, con interpolazione lineare per gli spessori intermedi (src/lib/crm/shippingEngine.ts, src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx). - Prodotti senza tabella per-spessore: tutto come prima (kg/m² base).
v1.237.0 24/08/2026
Simulazione a due stadi (testo → immagine) e avviso «solo a scopo dimostrativo»
- Avviso sempre in vista sull'immagine generata: «Immagine generata dall'AI a solo scopo dimostrativo: proporzioni, dimensioni, bordi e materiali possono non essere fedeli. Non è la fotografia del prodotto finito» — tradotto in EN/DE (src/lib/dictionary.ts).
- L'avviso viaggia col file: «Salva» non scarica più l'immagine nuda, la ricompone con la frase stampata sotto — perché è il file che poi gira via email o WhatsApp, e senza il disclaimer impresso una scena AI si presenta come la foto del prodotto finito. Se la composizione non riesce, si scarica comunque l'originale (src/components/ProductSimulator.tsx).
- Due stadi opzionali: se in CRM è scelto un modello di testo, questo trasforma il prompt tecnico in una descrizione fotografica ricca (materiali del pavimento, luce, obiettivo, inquadratura) prima di generare l'immagine. I vincoli (misure, lati del bordo, scala) devono essere ricopiati parola per parola: il server verifica che nella riscrittura ci siano ancora, altrimenti la scarta e usa il prompt tecnico originale (public/visualize.php). Il badge Admin mostra la catena, es. «testo: gemini-3-flash-preview → gemini-3-pro-image-preview».
v1.236.2 24/08/2026
Scala: confronti con l'anta della porta invece di percentuali
- Le percentuali («circa il 40% del vano») non funzionavano: i modelli di immagini non misurano, confrontano. Ora il vincolo è ancorato a un oggetto visibile nella scena: «più stretto di UNA singola anta da 75 cm — la porta ha due ante, il tappeto non deve coprirle entrambe», più il vuoto richiesto: «circa 45 cm di pavimento nudo per lato, tra il bordo del tappeto e lo stipite» (src/components/ProductSimulator.tsx).
- Aggiunto il nome dell'errore da evitare, con i numeri sbagliati espliciti: «l'errore tipico è disegnare il tappeto largo quanto tutto l'ingresso: sarebbe un tappeto da 150 cm, non da 60 — sbagliato di 2,5 volte. Nel dubbio fallo troppo piccolo, non troppo grande».
- Controprova sulle piastrelle riformulata come istruzione attiva: «copre circa 1×1,5 piastrelle da 60 — contale sotto il tappeto».
v1.236.1 24/08/2026
Configurazione passata alla simulazione: verificabile a occhio, e i lati nudi dichiarati
- La riga di configurazione (visibile nell'intestazione del modale, quindi controllabile senza guardare il codice) ora dice «bordo/profilo SOLTANTO sui lati: alto, basso — lati SENZA bordo: sinistro, destro» e «misura 60×90 cm (larghezza × profondità)»: prima elencava solo i lati bordati e il resto era implicito (src/components/Configurator.tsx).
- Il lettore nel simulatore accetta entrambe le formulazioni (anche quella vecchia, per le pagine ancora in cache) e non conta più per errore i lati nudi come bordati; coperto anche il caso «bordo sul perimetro (4 lati)», che prima non produceva alcun vincolo (src/components/ProductSimulator.tsx).
- Tracciabilità del motore: ogni immagine generata salva il modello che l'ha prodotta nei metadati di
_uploads(model+ data), oltre al badge in Admin Mode (public/visualize.php).
v1.236.0 24/08/2026
Simulazione AI: motore Nano Banana **Pro** e mockup dichiarato come verità
- Cambio motore: si prova prima
gemini-3-pro-image-preview(Nano Banana Pro), che segue le istruzioni molto meglio del flash su proporzioni, lati del bordo e scala; se la chiave non lo abilita si scende automaticamente sugemini-2.5-flash-image. La risposta dice quale motore ha generato, e in Admin Mode il nome compare sull'immagine — così si vede subito se sta girando il Pro (public/visualize.php). Override da CRM conaiConfig.visualizeModel. - Il mockup è verità, non ispirazione: il prompt dichiara che l'immagine di riferimento è un *disegno tecnico in pianta* di cui sagoma, rapporto, lati bordati, colori, trama e logo sono vincolanti, e che l'unico compito del modello è cambiare il punto di vista e costruire la scena.
- Vincoli in testa al prompt (prima erano in mezzo alla parte descrittiva) con la nota che «prevalgono su qualunque istinto estetico».
- Lati del bordo nominati per misura reale: non più «top/bottom» (parole senza senso in una scena in prospettiva) ma «il lato da 60 cm contro la porta» e «i due lati lunghi da 90 cm restano nudi», con il conteggio esplicito dei lati bordati da rispettare.
- Orientamento in termini di pavimento: «60 cm in larghezza parallelo alla porta, 90 cm di profondità verso chi guarda; la prospettiva comprime la profondità, ma le due misure non si scambiano mai».
v1.235.2 24/08/2026
Scala della simulazione: la porta di riferimento è quella VERA dell'ambiente
- Il paragone era sempre «anta singola 80–90 cm», anche davanti all'ingresso di un locale che ha la doppia da ~150 cm: così un tappeto da 60 cm veniva disegnato larghissimo. Ora la larghezza della porta dipende dall'ambiente (residenziale/B&B ~90, studio/farmacia/ufficio ~100, locali pubblici e retail ~150 a due ante) e il prompt dichiara il rapporto atteso: 60 cm davanti a una doppia = «circa il 40% del vano, pavimento nudo su entrambi i lati» (src/components/ProductSimulator.tsx).
- Due controprove aggiunte, verificabili nell'immagine: quante piastrelle da 60×60 occupa il tappeto e quante scarpe da 28 cm stanno affiancate sulla sua larghezza. Più il divieto esplicito: «è uno zerbino, non un tappeto da salotto — non deve coprire tutto il pavimento d'ingresso».
v1.235.1 24/08/2026
Simulazione AI: scala reale ancorata alla porta, e la cornice non si «chiude» più
- Scala: un tappeto da 60 cm veniva disegnato più largo della porta. Ora il prompt ancora la misura a oggetti di dimensione nota — anta standard 80–90 cm, piastrella 60×60, scarpa 28 cm — e dichiara il confronto atteso («60 cm ⇒ chiaramente più stretto del vano porta, pavimento visibile ai due lati»); l'inquadratura deve includere l'intero vano porta, così la scala è verificabile (src/components/ProductSimulator.tsx).
- Bordo su due lati: il modello tendeva a completare la cornice sui 4 lati. Ora i lati nudi sono nominati uno per uno («i lati sinistro e destro sono a taglio vivo: nessun profilo, nessuna bordatura, non chiudere il bordo in una cornice»).
- Entrambi i vincoli vengono ripetuti in chiusura di prompt («REMEMBER, these two mistakes…»), dove i modelli di immagine pesano di più.
v1.235.0 24/08/2026
«Prova nel tuo ambiente»: Settore → Attività, zerbino DAVANTI ALLA PORTA, fatti del prodotto nel prompt
- Ambientazione a due livelli: prima il Settore poi l'Attività, SOLO tra quelli spuntati nel CRM (tassonomia speculare in src/lib/envTaxonomy.ts); i prodotti vecchi con la selezione piatta funzionano lo stesso (mappatura automatica). Senza selezioni → tendina di default come prima (src/components/ProductSimulator.tsx).
- Blocco «PRODUCT FACTS» nel prompt: misura esatta con proporzioni e verso, lati del bordo (solo alto/basso ⇒ NIENTE bordo a sinistra/destra), materiale (dalla scheda tecnica + riconoscimento dal nome: spaghetto = ricci vinilici, moquette = taglio velour, cocco, gomma, alluminio) e posa (incasso/appoggio). Prima il modello quadrava il tappeto, incorniciava tutti i lati e cambiava trama.
- Regola della porta: uno zerbino sta DAVANTI a una porta (interna o d'ingresso, sotto il portico se esterno coperto), con la porta in inquadratura — mai buttato in mezzo alla sala. Prodotti non-zerbino → al loro punto d'uso naturale.
- Fix chiave i18n grezza: nel riepilogo e nell'email del preventivo salvato compariva
cfg.bordoPerimetraleSu1Latoinvece di «su 1 lato A+A» (src/components/Configurator.tsx).
v1.234.1 24/08/2026
La tolleranza spenta non scrive più nulla (e la % è quella vera)
- Con «Tolleranza di produzione» SPENTA nel CRM, la riga «Tolleranza misure ± X%» spariva dalla misura ma restava nel riepilogo prezzi: ora spenta = nessuna scritta, da nessuna parte (src/lib/crm/configSchema.ts).
- Accanto alla misura compariva un «±3%» fisso anche con una % diversa impostata nel CRM: ora si mostra la percentuale vera, sia nel configuratore standard sia in quelli tecnici (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx).
v1.234.0 24/08/2026
«Ambienti» è un filtro a sé nella pagina categoria
- Location e attività non si mescolano più alle Caratteristiche: nella sidebar della pagina categoria hanno il loro gruppo «Ambienti» (sono "dove lo metto", non "com'è fatto") e vengono escluse dal gruppo Caratteristiche per non comparire doppie (src/data/facets.ts).
- Tolti i tag testuali sopra le foto anche nelle card del catalogo (l'ultima vista rimasta: griglia di /catalogo) (src/components/CatalogBrowser.tsx).
v1.233.1 24/08/2026
Niente tag testuali sopra le immagini
- Con location/attività nei tag, le chip arancioni coprivano la foto del prodotto (galleria e card): sopra le immagini restano solo i badge-icona curati; i tag testuali continuano a valere in ricerca e pagine-tag (src/components/ProductGallery.tsx, src/components/ProductCardR.tsx, src/components/ProductCard.astro).
v1.233.0 24/08/2026
Location/Attività come tag + simulatore AI più fedele
- Le voci «Ambiente & Attività» scelte nel CRM (location: Hotel, Ristorante… e attività) confluiscono nei tag del prodotto — chip in pagina, ricerca interna e pagine-tag — sempre, anche quando la simulazione fotografica AI non è attiva (src/data/catalog.ts).
- «Prova nel tuo ambiente» — posizionamento sempre scelto e sempre vincolato: la scena si genera per Interno / Esterno coperto / Esterno scoperto ma SOLO tra i posizionamenti del prodotto — un tappeto solo-esterno non si simula in salotto (una sola opzione → mostrata bloccata «dal prodotto»; nessuna configurata → tutte e tre). Prima il selettore compariva solo con 2+ opzioni e senza configurazione si finiva su «interno» in silenzio (src/components/ProductSimulator.tsx).
- Forma e orientamento del tappeto rispettati: il prompt dichiara misura esatta (es. 60×90), rapporto e verso del rettangolo (orizzontale/verticale) e vieta esplicitamente di quadrarlo, ruotarlo o ritagliarlo — in entrambe le modalità (scena generata e foto del cliente).
v1.232.1 24/08/2026
Email server↔server: trovato e curato il token mancante (era TUTTO muto)
- Causa scovata dal vivo:
SRV_TOKEN— il token che autorizza gli inviisend_customversoemail.php— non è mai stato configurato sul server (admin_secret.phpnon lo definisce). Essendo tutto fail-closed, OGNI email server↔server moriva in silenzio: candidatura rivenditore, form contatti, follow-up chat, support, sconto recensioni, alert di sicurezza. - Cura senza configurazione a mano: nuovo
srv_secret.phpgenerato e caricato SOLO sul server (mai nel repo, coperto da*_secret.phpin .gitignore); tutti i mittenti eemail.phplo leggono prima del fallback vuoto — mittente e verificatore condividono lo stesso file, quindi il token non può più divergere (public/_security.php, contact, chatscan, email, landing, payments, reseller_apply, stripe_webhook, support, supportscan, reviews). reseller_apply.phpora legge l'esito VERO di ogni invio e lo riporta nella risposta (diag: CRM / mail staff / mail candidato con categoria d'errore corta, mai il log SMTP): è così che il collaudo — «Candidatura ricevuta ✓» e zero email — ha smesso di essere un mistero (public/reseller_apply.php).- Se la candidatura non arriva da nessuna parte (né CRM né staff) il candidato riceve un errore con l'invito a riprovare, invece di un successo finto.
v1.232.0 24/08/2026
«Vuoi diventare un rivenditore?» — candidatura pubblica
- Nuova pagina /diventa-rivenditore: benefit del programma (listino dedicato, portale ordini, livelli a obiettivo) + form di candidatura (azienda, referente, email, P.IVA…) con honeypot e rate-limit. La richiesta arriva allo staff via email e il cliente entra nel CRM come «Rivenditore (Web)»: nessuna attivazione automatica, approva una persona (src/pages/diventa-rivenditore.astro, src/components/ResellerSignup.tsx, public/reseller_apply.php).
- Link «Diventa rivenditore» nel footer accanto all'Area rivenditori (it/en/de).
v1.231.0 24/08/2026
Landing pages: proposte riservate (e campagne) live, con sconto che arriva al carrello
- Nuova pagina
/landing?c=<slug>&t=<token>: shell statica unica (noindex, no-referrer) che carica la landing LIVE dal nuovolanding.php— una landing creata nel CRM è online all'istante. Token HMAC che firma l'id (schema dei link di pagamento); campagne pubblicate si aprono senza token (src/pages/landing.astro, src/components/LandingLive.tsx, public/landing.php). - Struttura a offerta: hero con logo cliente, lettera, sezioni con le card prodotto vere (prezzi live, link al configuratore), prove, bonus, garanzia, scadenza con pagina di cortesia oltre la data.
- Sconto riservato fino all'ordine: il server mantiene un coupon
LP-<SLUG>allineato alla landing; la pagina lo lascia in attesa e il carrello lo applica da solo, validandolo lato server come qualunque coupon (src/components/CartPage.tsx). Le card mostrano listino barrato → «riservato da …». landing_infoè rate-limited e fa whitelist dei campi (mai email del cliente verso il browser).
v1.230.0 21/08/2026
La banda a giro si paga al metro (se prezzata) e può stare fuori dall'ingombro
- Banda a giro del componibile: se nel CRM ha un €/ml, il costo entra nel totale (perimetro della composizione × prezzo), con la riga nel dettaglio prezzi e nel riepilogo; senza prezzo resta inclusa come prima (src/components/Configurator.tsx).
- L'anteprima la disegna con la larghezza vera (cm dal CRM) e nella posizione scelta: dentro le piastrelle o come cornice esterna che allarga l'ingombro — la rampa, se c'è, avvolge anche la banda (src/components/PuzzlePreview.tsx).
- Bordo perimetrale degli altri prodotti: l'anteprima usa la larghezza in cm impostata nel CRM invece dei 7 px fissi.
v1.229.0 21/08/2026
Bordo a giro: uno step dedicato, sulla misura standard e sul componibile
- Il bordo/rampa a giro dei defaticanti è ora uno step a parte, «Bordo a giro», subito dopo la misura: due card — *Senza bordo* / *Con bordo a giro* — e la scelta è obbligatoria (prima era una spunta preselezionata dentro il componibile). Con «sì» si scelgono lati e colore; il costo è €/ml × lati scelti (src/components/Configurator.tsx).
- Vale anche sulla misura standard, non solo sulle piastrelle: prezzo nel totale e nel prezzo unitario, voce «Bordo a giro» nel riepilogo/carrello, e anteprima con la cornice tinta (la stessa grafica della rampa) sui lati scelti, anche a schermo pieno.
- Riaprendo una riga dal carrello la scelta del bordo viene ricordata in entrambe le strade.
v1.228.0 21/08/2026
Standard O componibile: ora si sceglie — e la pagina non si blocca più
- Prodotto con misure standard E componibile (es. Bubblemat Nitrile): il passo misura mostra la scelta tra i due — due card, «Misure Standard» e «Componibile» — e apre il pannello corrispondente. Prima il componibile sostituiva sempre le misure (src/components/Configurator.tsx).
- Fix pagina «in caricamento» per sempre: un componibile con piastrelle salvate senza LARGH/ALT veniva scartato dallo schema e, senza altre modalità, il wizard nasceva vuoto e la pagina crashava. Ora lo schema ripiega sulle misure standard salvate (src/lib/crm/configSchema.ts) e, se proprio non c'è nulla, compare un avviso chiaro invece del blocco.
- Trame Bubble e Dot calibrate sul prodotto vero (~3 cm di diametro per bolla/cerchio) e riscalate nell'anteprima ingrandita: prima usavano i px/cm del riquadro piccolo e a schermo pieno sembravano sabbia (src/lib/matPatterns.ts).
- Pulsante «Salva preventivo»: su due righe — azione sopra, indirizzo email sotto, mai più spezzato a metà parola.
v1.227.0 21/08/2026
I defaticanti mostrano la loro superficie vera
- L'anteprima disegna la trama di superficie del prodotto (Ribbed, Bubble, Forato, Industrial, Dot, Grip — scelta nel CRM) tinta dal colore selezionato, con le proporzioni reali; il Forato tiene il margine pieno ~4 cm ai bordi, anche con gli angoli arrotondati (src/components/Configurator.tsx, src/lib/matPatterns.ts).
- Sulle piastrelle a incastro la trama riempie le sagome (giunti a fungo inclusi) e il margine del Forato segue il profilo del pezzo (src/components/PuzzlePreview.tsx).
v1.226.0 21/08/2026
Defaticanti: giunti a fungo che si incastrano, rampa come l'alluminio
- Giunti dei pannelli a incastro ridisegnati: non più denti squadrati ma il profilo a fungo arrotondato dei pannelli veri (collo stretto, testa larga con angoli tondi); il profilo è simmetrico, quindi il dente di un pannello entra esatto nell'incavo del vicino (src/components/puzzleGeometry.ts).
- La rampa dei defaticanti usa la stessa grafica della rampa dei tappeti in alluminio (trapezi con angolo a 45°, sfumatura dal bordo esterno, rigatura antiscivolo), tinta col colore scelto — nera, gialla… — con i toni derivati; una foto caricata nel CRM la sostituisce mantenendo i tagli a 45°. Unica implementazione condivisa (src/lib/matPatterns.ts, src/components/PuzzlePreview.tsx, src/components/TechnicalConfigurator.tsx).
v1.225.0 21/08/2026
Il webhook Stripe risponde subito: niente più consegne in timeout
- Stripe riceve il 200 appena la firma è verificata, poi il lavoro pesante (dettagli carta dall'API, scrittura dell'ordine sul CRM, email) continua a connessione chiusa. Prima tutto avveniva PRIMA di rispondere: con un pagamento vero si superavano i secondi che Stripe aspetta, ogni consegna risultava «other errors» (email di Stripe del 21/08, errori dal 18/08) e l'endpoint sarebbe stato disattivato il 27/08 (public/stripe_webhook.php).
- Gli eventi non gestiti ricevono lo stesso 200 immediato; le firme non valide restano un 400, come prima.
v1.224.0 21/08/2026
Componibile: sconto a quantità sulle piastrelle e peso più preciso
- Il configuratore applica lo sconto a quantità del modello di piastrella sui pezzi della composizione: il prezzo unitario scende già in anteprima, sia sulla griglia/fila sia nel disegno personalizzato (src/components/Configurator.tsx, src/lib/crm/freeformModular.ts).
- Peso della composizione più preciso: si usa il peso del modello scelto (kg/pz) invece del peso a pezzo generico del prodotto, e si somma la rampa a giro (kg/ml).
v1.223.0 21/08/2026
Prezzo della rampa per spessore
- Il costo della rampa si legge dalla nuova tabella per spessore del CRM: si prende la riga con lo spessore più vicino a quello configurato (la rampa è alta quanto il tappeto) e, in assenza di tabella, resta il prezzo unico di prima (src/lib/crm/technicalMat.ts, src/lib/crm/configSchema.ts).
- La tabella arriva dal prodotto o, se il prodotto non la ha, dai default globali delle impostazioni (src/lib/crm/productSchema.ts).
v1.222.0 21/08/2026
L'anteprima si illumina al passaggio del mouse, con la lente «+» al centro
- Passando sopra l'anteprima non cambia più il cursore in lente: si evidenzia l'anteprima stessa — velo scuro e lente col «+» in un tondo bianco al centro — e il cursore resta la solita mano. Lo stesso effetto compare anche da tastiera, quando l'anteprima prende il fuoco (src/components/TechnicalConfigurator.tsx).
- Profilo di alluminio della doga più sottile: dal 16% al 12% della banda per lato, così l'inserto respira e le proporzioni somigliano di più al profilo vero.
v1.221.0 21/08/2026
Anteprima grande quanto lo schermo, fessure in ombra, gomma allineata
- Anteprima ingrandita che sfrutta lo schermo: ~75% dell'altezza su desktop, ~95% della larghezza su mobile (dove il riquadro va a filo bordo), invece dei 560 px fissi (src/components/TechnicalConfigurator.tsx).
- Ombra dentro la fessura tra una doga e l'altra — l'incavo ha la sua profondità — e ombra portata più forte attorno al tappeto in appoggio: prima, grigio su grigio, le fasce di alluminio non si distinguevano.
- Trama gomma in griglia: rettangolini allineati (uno accanto all'altro e uno sotto l'altro, non più sfalsati a mattoncini) e più larghi che alti, sempre 5 file per doga (src/lib/matPatterns.ts).
v1.220.0 21/08/2026
Il perimetro è alluminio, non più una fascia rossa — e il tappeto fa ombra
- Rampa e profilo a L disegnati in alluminio, fuori sagoma, con l'angolo a 45° sugli spigoli: la rampa d'appoggio è larga 5 cm per lato ed è rigata (antiscivolo), il profilo a L a incasso mostra solo il bordino liscio da 2,5 mm a giro. Il perimetro entra nell'ingombro, quindi l'anteprima si riscala per contenerlo (src/components/TechnicalConfigurator.tsx).
- Il gancio passa sotto le doghe e si intravede solo nella fessura, com'è davvero: prima sembrava una graffa appoggiata sopra.
- Ombra portata quando il tappeto è in appoggio, così le fasce di alluminio si staccano dallo sfondo; ad incasso resta a filo, senza ombra.
- Barra dei passi: su desktop i pulsanti si stringono per stare nella riga (testo 14 px, spaziatura ridotta) e non compare più la barra di scorrimento orizzontale (src/components/CfgStepTabs.tsx).
v1.219.0 21/08/2026
Le doghe hanno il loro profilo di alluminio, e i ganci che le uniscono
- Profilo estruso disegnato sopra e sotto ogni doga (non ai lati): sfumatura grigio chiaro→scuro, ribaltata sul bordo inferiore, così la banda sembra bombata e prende luce dall'alto. La trama dell'inserto si scala sullo spazio che resta in mezzo (src/components/TechnicalConfigurator.tsx).
- Ganci di giunzione: nella fessura tra due doghe compaiono le graffe nere che le tengono insieme, una ogni ~40 cm — calcolate sulla misura reale del tappeto, quindi cambiano di numero con la misura. Prima c'era un solo segno grigio al centro.
- Profili e ganci finiscono anche nel PNG allegato alla scheda ordine, che ora è identico all'anteprima a schermo.
v1.218.0 21/08/2026
Tappeti in alluminio: le doghe mostrano la trama vera del materiale
- Moquette, spazzola e gomma disegnate nell'anteprima del configuratore tecnico: melange a puntini, ciuffi sfalsati su fondo più scuro, mattoncini in rilievo (5 file per doga) — trame SVG generate tono su tono dal colore dell'inserto, anche sui combinati a doghe alternate (src/lib/matPatterns.ts, src/components/TechnicalConfigurator.tsx).
- La trama si applica da sola quando la Categoria/Materiale del colore è Spazzola/Moquette/Gomma (o quando la si forza dal gestionale); le card colore senza foto mostrano la trama; il PNG dell'ordine la include (è SVG inline, niente canvas tainted).
v1.217.0 20/08/2026
I vecchi indirizzi senza «/prodotto/» non danno più 404
- Al build si genera
product-slugs.json: tutti i permalink noti di ogni prodotto (attuale + - Il gestore dei 404 guarda l'ultimo segmento dell'URL in quella mappa e reindirizza con un
- Riconosce anche gli slug col suffisso di disambiguazione (
-1,-2) lasciato dagli import - È un file statico: nessuna chiamata al bridge a ogni 404
v1.216.0 20/08/2026
Anteprima: bande alternate sui tappeti a due inserti
- Con due inserti (spazzola + moquette) l'anteprima alterna le bande tra un materiale e
- Ogni inserto segue la sua impostazione: trama ripetuta, trama alternativa o tinta unita
- Con un solo colore nulla cambia
v1.215.0 20/08/2026
«Colori inserti»: i due materiali in un'unica schermata
- I gruppi colore non sono più due passi consecutivi («4. Colore Spazzola», «5. Colore Moquette»)
- Su un tappeto combinato la decisione è la combinazione — questa spazzola con quella moquette —
- Ogni sotto-blocco resta segnalato «Da completare» finché non si scegle, e il passo prende la
- Se manca qualcosa il pulsante dice quale: «Scegli il colore Spazzola e Moquette», invece di un
v1.214.0 20/08/2026
Configuratore: un passo colore per ogni materiale
- I colori si raggruppano per categoria/materiale e ogni gruppo diventa un passo con le sue
- Ogni scelta finisce nel riepilogo dell'ordine come riga propria («Colore Spazzola: Inserto
- La scelta si conserva nella ripresa del preventivo e nella modifica dal carrello
- Con un solo gruppo (o nessuno) tutto resta come prima: un unico passo «Colore inserto»
v1.213.2 20/08/2026
Menu reattivo (le modifiche annunciate nella 1.213.1)
- Cache del catalogo menu da 2 minuti a 30 secondi (sito/src/lib/menuSync.ts)
- Tornando sul tab del sito il menu si ricontrolla buttando la cache (throttle 20s): è il flusso
v1.213.1 20/08/2026
Menu: si ricontrolla tornando sul tab
- Cache del catalogo menu da 2 minuti a 30 secondi (sito/src/lib/menuSync.ts)
- Tornando sul tab del sito il menu si ricontrolla, buttando la cache: è il flusso vero —
v1.213.0 20/08/2026
Nessun prodotto pubblicato resta invisibile nel menu
- Le colonne di categoria ora includono i prodotti di tutto il ramo (categoria + sottocategorie),
- I prodotti del ramo che nessuna colonna copre finiscono nella voce «Tutti: <categoria>», che
- Vale sia al build sia a runtime, come il resto della sincronizzazione
v1.212.1 19/08/2026
Menu: reattivo al cambio di catalogo, e mai più regressioni
- Trovata la causa vera del menu che mostrava ancora AluDry: il fetch leggero del catalogo
- Cache del catalogo menu da 10 a 2 minuti: chi rinomina un prodotto e ricarica il sito deve
- Se una pagina prodotto scopre che il catalogo è cambiato — prodotto sparito (404) o raggiunto da
v1.212.0 19/08/2026
Il menu si aggiorna da solo col catalogo
- Nuovo modulo di riconciliazione (sito/src/lib/menuSync.ts): una voce che punta a un prodotto ne
- Gira in due punti: al build (sito/src/components/Header.astro) e nel browser
- A runtime il catalogo si legge con una proiezione leggera (identità e categorie, niente
- Se il bridge non risponde il menu resta quello salvato: mai un menu vuoto per un guasto di rete
v1.211.0 19/08/2026
«Salva preventivo»: solo a configurazione completa, e su due righe
- Il pulsante compare solo quando la configurazione è completa: prima stava lì accanto a
- L'etichetta con l'indirizzo email va a capo invece di essere troncata a metà parola
- Chi non è loggato trova il campo email con una riga che spiega a cosa serve: «Ti mandiamo il link
v1.210.0 19/08/2026
«Riprendi il preventivo» riapre davvero la configurazione
- Il difetto grosso: dal link nell'email il configuratore ripartiva da zero. Gli stati iniziali
- Titolo dell'email: «Preventivo Floormad per <nome prodotto>» al posto del generico «Il tuo
- Riepilogo su più righe: una voce per riga in una tabella con etichette a sinistra, dentro un
- Il testo per WhatsApp resta a riga singola: là l'HTML non serve
v1.209.0 19/08/2026
Il menu segue i prodotti rinominati
- Le voci di menu salvano nome e indirizzo come copia: rinominando un prodotto restavano col
- I vecchi indirizzi dei prodotti tornano a rispondere: si genera la pagina anche per i permalink
- «Nessun costo aggiuntivo» in verde e grassetto sulle card Sottofondo e Spessore: è
v1.208.1 19/08/2026
«Nessun costo aggiuntivo» al posto di «incluso»
- Nelle card Sottofondo (Standard / Claw) l'etichetta di costo diventa «Nessun costo aggiuntivo»:
- Cambiata anche sulle card Spessore, che usavano la stessa parola per la stessa cosa: lasciarne
- Il testo passa dal dizionario: prima era scritto nel codice e restava italiano anche in inglese e
v1.208.0 19/08/2026
Consegna stimata: lavorazione + trasporto, non solo trasporto
- La consegna stimata ora somma lavorazione + trasporto in giorni lavorativi, sabato e domenica
- Corretti entrambi i punti che facevano il conto: la pagina prodotto e la stima scritta
- Il conto vive in una funzione sola (
leadTimeDays), così i due punti non possono più divergere; - Sotto la data compare il dettaglio: «Spedito entro 7 giorni lavorativi + 7 di trasporto», in
v1.207.0 19/08/2026
Tappeti tecnici: il «a partire da» non è più 0,00 €
- Il €/m² dei tecnici sta su ogni spessore, non nel prezzo base del listino, e il calcolo del
- Con il prezzo giusto, la nota si scrive da sé: «per ordini superiori a 10 m²»
- Il box fasce e la nota funzionano anche quando gli scaglioni sono definiti **sul singolo
- Verificato sui dati veri di Brush&Dry: spessori 358/369/385/462, fasce 0/−5/−10/−15%
v1.206.0 19/08/2026
Nota sotto il prezzo scritta da sé
- Se nel gestionale la nota è vuota, la pagina prodotto scrive «per ordini superiori a N m²»
- Tradotta in italiano, inglese e tedesco, quindi non è più una frase italiana sulle pagine estere
- Se il prezzo mostrato non viene da una fascia (arriva da una misura standard o dal prezzo
- La nota scritta a mano vince sempre su quella automatica
v1.205.0 19/08/2026
Card di scelta: una sola implementazione
- Le card del passo «Aggiungi un profilo» prendono immagine e testi dal gestionale, con la stessa
- Posizionamento e profilo ora usano la stessa card (sito/src/components/CfgChoiceCard.tsx): erano due
v1.204.0 19/08/2026
Quando manca un passaggio, il pulsante ti porta dov'è
- Il pulsante resta cliccabile e dice cosa fare — «Inserisci le misure», «Scegli i lati
- Il blocco mancante si evidenzia in rosso e lampeggia (intestazione rossa + etichetta «Da
- L'allarme dura una decina di secondi e si spegne da sé, e sparisce appena il passaggio è
- Sotto il pulsante, il nome del passaggio che manca è un collegamento diretto
v1.203.1 19/08/2026
«Tutti e 4 i lati»: nome fisso, come gli altri pulsanti
- Con tutti i lati accesi il pulsante diventava «Nessun lato» in rosso pieno, e si leggeva come
v1.203.0 19/08/2026
Sotto-blocchi evidenziati e ✓ verde sui passi completati
- I sotto-blocchi si vedono. Quando una scelta ne apre altre (profilo perimetrale → su quali
- Il contenitore è condiviso, non copiato:
SubStepè un componente unico, così la regola vale - ✓ verde sui passi completati nelle tab del configuratore tecnico, dove non c'era: un passo si
- Le tab del desktop ora riportano in vista il passo come fanno «Avanti» e quelle mobile
v1.202.3 19/08/2026
«Tutti e 4 i lati» è un pulsante, non un link
- Nella scelta dei lati della rampa la scorciatoia era un link sottolineato sotto i quattro
- Con tutti i lati già selezionati diventa «Nessun lato»: lo stesso comando fa e disfa, invece
v1.202.2 19/08/2026
«Avanti»: l'ancora è la cornice del configuratore
- Lo scroll ora punta alla cornice del configuratore (il box grigio, marcato con
- Anche nel configuratore tecnico lo scroll parte a passo disegnato, non nello stesso istante
- «Indietro» e i numeri dei passi usano lo stesso punto di arrivo del pulsante «Avanti»
v1.202.1 19/08/2026
Posizionamento: foto grande e testo a fianco
- Le card del passo «Posizionamento» (tappeti tecnici) cambiano impaginazione in base al contenuto:
- Prima foto e paragrafo erano impilati in una card stretta: la foto — che in questo passo è
- Su schermo piccolo le due card si impilano invece di stringersi
v1.202.0 19/08/2026
Le card del configuratore spiegano la scelta
- Sotto ogni card (modalità misura, orientamento, incavo, stampa) compare la descrizione scritta
- I tappeti tecnici hanno card di posizionamento proprie: immagine con dimensione ed effetto,
- Le card Sottofondo rispettano il titolo impostato nel gestionale
v1.201.4 19/08/2026
Configuratore tecnico: due ritocchi nel passo dell'incavo
- Nella nota dell'incavo si leggeva
2,5 mmcon l'entità HTML in chiaro: il valore arrivava dal - Il gioco di posa di 2,5 mm era scritto a mano in due punti: adesso è una costante sola, quindi le
- L'avviso sullo spessore consigliato aveva un link sottolineato dentro il testo («Usa 20 mm») che
v1.201.3 19/08/2026
Configuratore: «Avanti» torna a inquadrare l'inizio del passo
- Premendo Avanti la pagina si fermava a metà blocco — col titolo del passo successivo in cima e
- Stesso trattamento per «Indietro», per i numeri dei passi e per il richiamo al passo incompleto:
v1.201.2 19/08/2026
Ponte Danea: gli ordini scendevano vuoti
- Le righe si leggevano da
lineItemse il totale dagrandTotal, che sono i nomi con cui nasce la priceDetails.totalBeforeTaxè il prezzo unitario (il CRM lo moltiplica sempre per la- Nuovo riepilogo diagnostico
&probe=1sull'indirizzo degli ordini: risponde con quanti ordini
v1.201.1 19/08/2026
Ponte Danea: credenziali in un file dedicato
- Le credenziali del ponte si possono mettere in
danea_secret.php(file a sé, non versionato)
v1.201.0 19/08/2026
Favicon e immagine social si scelgono dai Media, e i default SEO funzionano
- Favicon e immagine OG ora hanno il selettore dei Media: carichi il file trascinandolo o
- La favicon viene caricata tale e quale: un
.icoo un.svgnon viene più ridimensionato né - «Titolo default» e «Descrizione default» erano scollegati: si salvavano e venivano ignorati,
v1.200.0 19/08/2026
Il cliente vede le sue fatture (e sa quando arrivano)
- Ponte Danea Easyfatt (
danea.php): Easyfatt scarica gli ordini pagati o confermati da - Fatture nell'Area Clienti con numero, data, ordine collegato, stato e totale. Un ordine pagato la
- Stati della fattura in parole al posto delle sigle, note di credito riconosciute come tali, testi in
- Gli ordini esportati portano spedizione, sconto coupon, P.IVA/CF, codice SDI e PEC, e ogni ordine
- Al cliente esce solo ciò che gli serve: le fatture passano da una whitelist di campi (sito/public/account.php)
v1.199.1 19/08/2026
Aprendo l'indirizzo italiano, il cliente estero arriva sulla pagina tradotta
- Le pagine italiane di area clienti, carrello e pagamento non dichiaravano le loro versioni nelle altre lingue: un cliente con account inglese che apriva
/sito/account/veniva portato sulla home estera invece che su/sito/en/account. Ora ognuna pubblica i suoihreflang(it · en · de · x-default) e il passaggio automatico atterra sulla stessa pagina nella sua lingua (account.astro, carrello.astro, paga.astro). - Vale anche per i motori di ricerca: le tre pagine sono ora correttamente collegate fra le lingue.
v1.199.0 18/08/2026
Area clienti tradotta: ordini, fatture, i miei dati, assistenza
- Tutta l'Area clienti parla ora la lingua del visitatore: le quattro sezioni (Ordini & preventivi, Fatture, I miei dati, Assistenza) con titoli, descrizioni, intestazioni di tabella, stati vuoti («Non hai ancora ordini», «Nessuna fattura disponibile»), etichette dei campi anagrafica e indirizzi, ticket, login/registrazione e recupero password (Account.tsx, dictionary.ts).
- Tradotti anche i momenti chiave del flusso bozza e grafica: «Confermo la bozza» / «Chiedi modifiche», la domanda di conferma prima della stampa, il campo «Cosa va modificato?», i messaggi di esito («Proof approved: your order is in production») e gli avvisi su file troppo grandi o grafica non più modificabile.
- 82 nuove voci di dizionario in italiano, inglese e tedesco; un traduttore a livello di modulo copre tutti i componenti della pagina, così le sezioni aggiunte in futuro partono già multilingua.
v1.198.0 18/08/2026
Lingue completate: carrello, area clienti e pagamento con il segmento tradotto
- Le pagine funzionali esistono ora in ogni lingua e all'indirizzo che i link usano davvero:
/en/cart·/en/account·/en/paye/de/warenkorb·/de/konto·/de/bezahlen. Il giro precedente le aveva create col segmento italiano (/en/carrello), ma i link tradotti puntano al segmento della lingua — da qui il 404 su/en/cart([[lang]/[page].astro](sito/src/pages/[lang]/[page].astro)). - I segmenti di area clienti e pagamento sono entrati nella mappa ufficiale delle rotte tradotte, accanto a prodotto/categoria/catalogo/carrello: link e pagine leggono ora la stessa fonte, così non possono più divergere (i18n.ts).
- Ogni pagina dichiara le sue versioni nelle altre lingue (
hreflang), quindi il passaggio automatico alla lingua del cliente al login atterra sulla traduzione esatta della pagina in cui si trova.
v1.197.0 18/08/2026
Carrello, area clienti e pagina di pagamento esistono in tutte le lingue
- Create le pagine tradotte di carrello, area clienti e pagamento:
/en/carrello,/en/account,/en/pagae le corrispondenti tedesche ([[lang]/carrello.astro](sito/src/pages/[lang]/carrello.astro), [[lang]/account.astro](sito/src/pages/[lang]/account.astro), [[lang]/paga.astro](sito/src/pages/[lang]/paga.astro)). - Il permalink resta italiano (gli indirizzi sono già in giro e indicizzati) ma la pagina è nella lingua del visitatore: chi naviga in inglese apre il carrello e continua in inglese, e chi accede con un account in lingua estera resta nella sua lingua anche nell'area clienti.
- Di conseguenza i link a queste tre pagine tornano a essere localizzati; nell'elenco delle pagine «solo italiano» restano assistenza, ticket, recensioni e i pannelli interni (i18n.ts).
v1.196.0 18/08/2026
Fix: 404 su area clienti e carrello nelle altre lingue
- In inglese e tedesco i link ad area clienti, carrello, pagamento, assistenza, recensioni portavano a indirizzi inesistenti (
/en/account→ 404): quelle pagine esistono solo in italiano. Ora il loro percorso resta italiano in qualunque lingua (i18n.ts — elencoIT_ONLY_PATHS+localizePathche le lascia intatte). - La lingua dei testi però non si perde: arrivando dal sito inglese o tedesco su carrello o area clienti, l'interfaccia resta nella lingua del visitatore (la lingua viene ricordata sulla postazione;
?lang=xxla forza). Prima si passava d'improvviso all'italiano. - Il passaggio automatico alla lingua del cliente al login non scatta su queste pagine: cambiare indirizzo lì avrebbe portato a un 404 (HeaderAccount.tsx).
v1.195.0 18/08/2026
Il sito si mette nella lingua del cliente + marchio di provenienza sull'anagrafica
- Cliente con lingua inglese o tedesca: appena accede, il sito passa da sé nella sua lingua. Si usa il link
alternate hreflangche ogni pagina pubblica già, quindi si atterra sulla traduzione esatta della pagina (permalink inclusi); se manca, sulla home di quella lingua. Succede una volta per sessione, così chi cambia lingua a mano dal selettore non se la vede riportare indietro (HeaderAccount.tsx). - Le anagrafiche create dal checkout portano il marchio del sito di provenienza (
siteBrand, oggi «Floormad (Web)»): con più siti sullo stesso gestionale si vede subito da dove arriva ogni cliente. Si imposta col parametroSITE_BRANDal build (order.ts).
v1.194.0 18/08/2026
Lingua del cliente: email di stato tradotte automaticamente
- Il checkout salva sull'anagrafica la lingua con cui il cliente ha usato il sito (
locale): da lì in poi le email di stato — spedizione, bozza, lavorazione, pagamento — partono in italiano, inglese o tedesco secondo il cliente (order.ts, email.php). - Il cliente può cambiare la lingua da sé in Area Clienti → I miei dati → «Lingua delle comunicazioni»; lo staff dalla scheda cliente del CRM (Account.tsx, account.php).
- Email spedizione più chiara: corriere oltre al numero di tracking e pulsante «Traccia la spedizione», tradotti anch'essi.
v1.193.0 18/08/2026
I link delle email aprono direttamente l'ordine giusto
- I pulsanti delle email della bozza («conferma o chiedi modifiche», solleciti) portano ora direttamente all'ordine: la sua scheda si apre già espansa, evidenziata, e la pagina scorre fino a lei. Prima si atterrava sull'elenco «Ordini & preventivi» con tutte le schede chiuse e bisognava cercarlo a mano (account.php, Account.tsx).
- Il link usa
?v=orders&o=<ordine>: vale per qualunque email che debba puntare a un ordine preciso.
v1.192.2 18/08/2026
Bozze: storico con anteprime nel pannello ordini
- Nel pannello Ordini del backend sito il riquadro Bozza di stampa mostra le miniature di tutte le bozze inviate (con giro, data e chi l'ha caricata) e delle grafiche del cliente: lo storico resta dentro l'ordine (ProofBox.tsx).
v1.192.1 18/08/2026
Pannello ordini: fase di lavorazione e bozza in ogni stato
- Anche nel backend del sito il dettaglio ordine ha il campo «Fase di lavorazione» (in attesa di grafica / di bozza, bozza inviata, bozza confermata, in lavorazione, spedito, consegnato) con la richiesta «avviso il cliente?» quando la fase prevede un'email, e il riquadro Bozza di stampa utilizzabile in qualsiasi stato (OrdersManager.tsx, ProofBox.tsx).
v1.192.0 18/08/2026
Area Clienti: conferma o rifiuto della bozza di stampa
- Quando arriva la bozza, nell'ordine dell'Area Clienti compare il riquadro «Bozza da confermare» con l'anteprima (immagine o PDF) e due pulsanti: Confermo la bozza — «visto si stampi», l'ordine passa in lavorazione e parte l'email di stato — oppure Chiedi modifiche, con il campo obbligatorio in cui scrivere cosa non va (arriva allo staff e resta sull'ordine) (Account.tsx, account.ts).
- Caricando la grafica il cliente riceve ora l'email «grafica ricevuta — ordine in attesa di bozza» con lo stato aggiornato: prima non arrivava nulla (account.php, email.php).
- Il testo delle categorie modificato nel CRM si sostituisce con una breve dissolvenza invece di uno scatto, mentre il sito non è ancora ripubblicato (CategoryLiveText.tsx).
v1.191.2 18/08/2026
Contatore ordini leggibile senza consumarlo
ordernum.php?peek=1restituisce il numero corrente senza incrementarlo: è il segnale che il gestionale usa per accorgersi in tempo reale di un ordine nuovo, con una richiesta da pochi byte (ordernum.php).
v1.191.1 18/08/2026
Backend ordini: compaiono anche gli ordini dei clienti già registrati
- La lista Ordini prendeva solo i clienti con provenienza «Sito Web»: gli ordini fatti da clienti loggati con un'anagrafica importata non comparivano. Ora si riconoscono anche dal numero FLR-… e dalla nota scritta dal checkout (OrdersManager.tsx).
v1.191.0 18/08/2026
Sottofondo: descrizione sotto ciascuna foto
- Sotto le foto Fondo standard e Fondo Claw dello step «Sottofondo» compare ora la descrizione impostata nel CRM (*Icone Prodotto → Card configuratore*, accanto all'immagine) (Configurator.tsx, productSchema.ts).
v1.190.0 18/08/2026
Ordini leggeri: logo e anteprima salvati come file, non dentro l'ordine
- Il checkout caricava logo e anteprima come data:URL dentro la riga dell'ordine: ogni ordine con grafica pesava megabyte, il gestionale li scaricava tutti all'avvio (memoria e lentezza) e le email d'ordine diventavano enormi. Ora i file vengono caricati sul server (nuova azione pubblica
order_media, solo immagini/PDF, max 12MB, con rate-limit per IP) e sull'ordine resta il loro URL; se l'upload non riesce si torna al metodo precedente, così l'ordine non si perde mai (order.ts, account.php). - Gli allegati dell'email d'ordine usano l'URL invece del base64: il server scarica il file al momento dell'invio.
v1.189.0 18/08/2026
Ordini: sollecito grafica, grafica non valida e segnalazione problemi
- Il riquadro grafica del pannello Ordini è ora condiviso col CRM e include: sollecito grafica (con giorni di attesa e ultimo sollecito), «grafica non valida» con il motivo scritto al cliente e ritorno allo stato «grafica mancante», approva/nega cambio grafica, e «segnala un problema» con testo libero → email con oggetto «Problemi relativi all'ordine XXXX» (GraphicStaffBox.tsx, OrdersManager.tsx).
- Nuovi template email
graphic_rejectedeorder_problem, con testata e footer del sito (email.php).
v1.188.0 18/08/2026
Area Clienti: gli ordini si trovano per email (non per una singola anagrafica) + stato ordine e statistiche
- Ordini che «sparivano» dall'Area Clienti: la pagina mostrava solo gli ordini dell'anagrafica collegata all'account. Cambiando l'email di un cliente nel gestionale (o dopo un ordine da ospite) l'ordine restava su un'altra anagrafica e il cliente vedeva «Ordini 0». Ora l'identità è l'email verificata: l'Area Clienti unisce gli ordini e le fatture di tutte le anagrafiche con quella email, e le azioni sull'ordine (grafica, bozza) valgono per tutte (account.php).
- Se la stessa email ha più anagrafiche l'evento viene registrato nel log di sicurezza, così lo staff sa che vanno unificate.
- Backend ordini del sito: nuova colonna «Stato ordine» e statistiche cliccabili identiche a quelle del CRM (OrdersManager.tsx, OrderStats.tsx, orderProof.ts).
- Lato server è pronto il ciclo bozza:
admin_proof_upload(carica la bozza e chiede la conferma),admin_proof_request(richiesta/sollecito),admin_proof_set(stato a mano),proof_approve/proof_rejectper il cliente, con i template emailproof_request,proof_reminder,proof_approved_staff,proof_rejected_staff(account.php, email.php).
v1.187.0 18/08/2026
GLS Italy e Internazionale + conferma prima di riavvisare il cliente
- Riconosciuti i formati GLS nazionale (
LU660766549) e GLS internazionale (WW 14873058, anche con lo spazio), con il link di tracciamento GLS del tipo giusto (NAT/INT) (tracking.ts). - Sotto il menu corriere compare l'esito del riconoscimento (riconosciuto / da selezionare a mano) e, salvando un tracking nuovo o cambiato, il popup «vuoi notificare al cliente?» decide se rimandare l'email «ordine spedito» (OrdersManager.tsx, NotifyChoiceModal.tsx).
v1.186.1 18/08/2026
Tracking: aggiunti UPS, DHL, TNT, Poste e SDA
- Il riconoscimento automatico del corriere dal numero di spedizione copre ora anche UPS (
1Z…), DHL, TNT, Poste Italiane e SDA, con i rispettivi link di tracciamento; il menu del corriere nel pannello Ordini è generato dallo stesso elenco condiviso col CRM (tracking.ts, OrdersManager.tsx).
v1.186.0 18/08/2026
Risolto «Prodotto non trovato»: pagine fantasma dei prodotti rimossi/rinominati
- Causa trovata: il deploy del sito carica i file ma non può cancellarli (il receiver sul server conosce solo
ping,upload_batch,list). Ogni prodotto cancellato o rinominato lasciava online la sua vecchia pagina: Apache la serviva direttamente — senza passare dall'handler dei redirect — e la pagina, non trovando più quello slug nel CRM, diceva «Prodotto non trovato». Sul server c'erano 95 pagine prodotto contro 90 prodotti (e 32 categorie contro 26): 20 pagine fantasma, tra cuitappeto-asciugapasso-personalizzato-prime-100. - Ora il deploy, dopo l'upload, confronta la lista remota col build e sovrascrive ogni pagina non più generata con una pagina segnaposto che: rimanda al prodotto/categoria corrispondente se esiste (stesso slug senza suffisso
-No forte somiglianza, concanonical), altrimenti passa la vecchia URL a_redirect.php, che applica le regole di redirect, prova il prodotto live e in ultima istanza restituisce un 404 pulito (deploy_sito.mjs, _redirect.php). - La pagina prodotto ora distingue «non riesco a caricare» da «non esiste»: se il catalogo non arriva dal CRM (bridge/WAF/timeout) compare «Non riusciamo a caricare il prodotto» con il pulsante Riprova, invece di dire al cliente che il prodotto non esiste. Se invece il permalink è cambiato, vengono proposti i prodotti più simili (ProductLive.tsx, catalog.ts).
- Testi nuovi tradotti in italiano, inglese e tedesco.
v1.185.0 18/08/2026
Niente più anagrafiche doppie: l'ordine si lega all'account (+ registro attività)
- Cliente collegato: l'ordine riusa la sua anagrafica e i dati inseriti al checkout aggiornano il suo profilo (via
account.php, autenticato). Prima ogni ordine creava una riga cliente nuova — le scritture pubbliche sul bridge possono solo inserire — quindi lo stesso cliente si duplicava a ogni acquisto e l'ordine poteva restare agganciato a un'anagrafica con un'email diversa da quella dell'account (order.ts). - Ordine da ospite con un'email che ha già un account: il server ricollega l'ordine all'anagrafica dell'account, archivia il doppione con nota e lo scrive nel registro; a fine ordine il cliente legge «esiste già un'area clienti con questa email: l'ordine è collegato al tuo account» (account.php, CartPage.tsx).
- Accesso fatto dal checkout: i dati dell'account ora hanno la precedenza su quelli già digitati. Era la causa di ordini confermati a un indirizzo diverso da quello con cui si era appena entrati (es. login Google con una mail, conferma inviata a un'altra). E se l'email dell'ordine resta diversa da quella dell'account, compare un avviso con il pulsante «Usa <email dell'account>»; la differenza viene anche registrata sull'ordine per lo staff.
- Registro attività dell'ordine anche nel backend del sito, con le voci scritte dal server per pagamenti accettati/rifiutati e codici sconto (orderLog.ts, OrderLog.tsx, OrdersManager.tsx).
v1.184.0 18/08/2026
Email di aggiornamento ordine: c'è sempre anche il pulsante «paga con carta»
- Riconfermando un ordine a bonifico dal gestionale, l'email al cliente conteneva solo l'IBAN: ora mostra i dati del bonifico e, come alternativa, il pulsante «paga con carta» col nuovo importo (compare solo se Stripe è attivo). Prima il link carta era riservato agli ordini già impostati a carta (orderActions.ts, orderEdit.ts).
- Il link generato viene salvato sull'ordine (
payLinkUrl), così lo staff lo ritrova e può copiarlo dalla scheda dell'ordine. - Backend ordini del sito: «Segna come pagato» apre lo stesso popup di conferma del CRM (riepilogo + «avviso il cliente?») invece di inviare l'email senza chiedere (OrdersManager.tsx, PaidNotifyModal.tsx).
v1.183.0 18/08/2026
Pagina «paga con carta»: campo codice sconto con prezzo prima/dopo
- Nella pagina /paga (link inviato per email) c'è ora il campo «Hai un codice sconto?»: il cliente inserisce il codice che gli abbiamo dato e il totale da pagare si aggiorna subito (PayOrder.tsx).
- Lo sconto lo calcola e lo scrive il server sull'ordine (
orderDiscount,discountLabel, nuovototalAmount, con nota nello storico dell'ordine): il browser non decide mai un importo, e la sessione Stripe parte già dal totale scontato (payments.php). Validità, scadenza, minimo d'ordine e conteggio usi restano gestiti dacoupons.php— l'uso si conta una sola volta per ordine. - Il riepilogo mostra la percentuale applicata e il confronto prezzo prima/dopo: riga «Sconto (CODICE) −20%», totale pieno barrato accanto al nuovo totale e, appena applicato, il riquadro «Prima … · Ora … (risparmi …)». I dati sopravvivono al ricaricamento della pagina perché ricavati dai numeri dell'ordine (payments.ts).
- Rifiuti gestiti con messaggio esplicito (codice inesistente/scaduto/usi esauriti/minimo non raggiunto), con rate-limit per IP sui tentativi.
v1.182.0 18/08/2026
Header: account come ultima voce a destra, con menu utente; checkout invita ad accedere
- L'account è ora l'ultima voce in alto a destra dell'header (dopo carrello e «Configura ora»): icona utente dentro un cerchio con la scritta «Accedi» al posto di «Area clienti» (Header.astro, HeaderAccount.tsx).
- Cliente riconosciuto → al posto di «Accedi» compaiono due righe, «Benvenuto,» e Nome Cognome, così si vede a colpo d'occhio di essere loggati; il clic apre il menu utente (Ordini & preventivi · Fatture · I miei dati · Assistenza · Esci) invece di portare alla sola home dell'area clienti. Si chiude con un clic fuori o con Esc.
- Le voci del menu aprono direttamente la sezione dell'area clienti (
/account?v=orders|invoices|profile|support) (Account.tsx). - Checkout, cliente ospite: riquadro «Hai già un account?» che invita ad accedere per ritrovare dati, ordini e fatture, con pulsante Accedi e «Accedi con Google» (compare solo se il login Google è attivo). Accedendo da lì i campi si precompilano subito, senza perdere quanto già digitato, e resta possibile ordinare come ospite (CartPage.tsx).
- Etichette nuove tradotte in italiano, inglese e tedesco (dictionary.ts).
v1.181.0 18/08/2026
Checkout: l'ordine si conferma solo col pagamento; email diverse per pagato / in attesa / rifiutato
- Bug risolto: un ordine pagato restava in «Bozza» (caso FLR-1625, incassato su Stripe). Il browser scriveva «PAGATO» sull'ordine con una chiamata al bridge senza chiave: il bridge, per sicurezza, accetta dal sito solo l'inserimento di righe nuove e scartava l'aggiornamento rispondendo comunque
success. Ora la conferma di pagamento passa dal server (payments.php), che ha la chiave, viaggia in base64 (busta anti-WAF, come gli ordini) e verifica il contatoreupdated: se la scrittura non va a buon fine parte un alert allo staff «incassato ma ordine non aggiornato» invece del silenzio (CartPage.tsx, payments.php, stripe_webhook.php). - Un ordine si accetta solo se è pagabile: carta con Stripe attivo oppure bonifico con IBAN configurato. Senza nessuna delle due condizioni il checkout si ferma con un messaggio chiaro e non crea l'ordine né manda email (CartPage.tsx).
- Tre email distinte al posto di una uguale per tutti (prima ogni ordine riceveva «pagamento con carta» anche se il pagamento non era mai avvenuto):
- In attesa di pagamento (nuovo template
order_awaiting_payment): riquadro giallo con importo e metodo, IBAN + causale per il bonifico e pulsante «paga con carta» — offerto anche a chi ha scelto il bonifico. Il link resta valido: si può pagare anche dopo aver chiuso il browser. - Ordine completato — pagamento ricevuto (nuovo
order_paid, inviata dal server): riquadro verde con importo, carta •••• ultime 4 cifre, id transazione Stripe e riepilogo righe. Parte una sola volta (claim atomico sulla sessione) qualunque strada confermi il pagamento: webhook, ritorno dal checkout o link di pagamento. - Ordine NON confermato — pagamento non autorizzato (nuovo
order_payment_failed): inviata solo se Stripe riporta un vero rifiuto (last_payment_error), con il motivo della banca e il pulsante per riprovare anche con un'altra carta. L'ordine resta non confermato e il CRM mostra «Pagamento rifiutato» con il motivo (email.php, _orderpaid.php, order.ts). - Carta rifiutata o pagamento abbandonato: il carrello non viene più svuotato e il cliente vede un avviso con il motivo, per riprovare subito. Prima l'esito «non pagato» mostrava comunque la schermata «ordine inviato» (CartPage.tsx).
- Nuove azioni pubbliche su
payments.php:pay_link_pub(link di pagamento per l'ordine appena creato — richiede che l'email combaci con quella dell'ordine, con rate-limit),paid_notifyepayment_failed_notify(esito letto sempre da Stripe lato server, mai dal browser). Il ritorno dal checkout «su Stripe» annullato porta ora con sé l'id sessione, così anche un rifiuto sulla pagina Stripe viene registrato (payments.php, payments.ts). - I due nuovi template sono modificabili da *Impostazioni → Email* insieme agli altri (EmailSettings.tsx).
v1.180.1 17/08/2026
Email: anti-WAF su tutte le chiamate dal browser (conferme d'ordine incluse)
- Causa trovata: il WAF davanti al sito risponde 403 «Forbidden» prima di PHP quando nel corpo della richiesta vede l'HTML dei template email — riprodotto con i template veri (7 KB in chiaro → 403; stesso contenuto in base64 → arriva a PHP). Era il motivo di «Risposta non valida» sul salvataggio della configurazione email.
- Tutte le chiamate del browser a
email.phpviaggiano ora in una busta base64 (payload_b64), lato server retro-compatibile con le chiamate in chiaro (email.php, email.ts). - Stesso blocco colpiva le email d'ordine: il checkout invia
vars.prodotticome tabella HTML esendEmailingoiava l'errore → conferme d'ordine (cliente e staff) scartate in silenzio. Ora passano, e un esito negativo viene almeno segnalato in console invece di sparire (email.ts, order.ts). - Nuova azione pubblica
diag: stato di scrittura di_email, limiti PHP e byte ricevuti, per diagnosticare i salvataggi senza tentativi alla cieca (email.php).
v1.179.1 17/08/2026
Prova SMTP: dice con quali parametri ha provato; spazi invisibili normalizzati
- La prova SMTP riporta con cosa ha provato — utente, host, porta, sicurezza e l'impronta della password (es. «App Password (16 lettere minuscole)» oppure «17 caratteri, forma diversa»), mai il valore in chiaro. Serve a distinguere «credenziali sbagliate» da «sto provando un valore vecchio rimasto nel form» (email.php, EmailSettings.tsx).
- Host, utente SMTP e email mittente vengono normalizzati (
trim): uno spazio invisibile incollato in coda all'utente causava un535identico a quello di una password sbagliata. Sul535il messaggio ora indica anche l'utente usato e ricorda che serve un account Google reale, non un alias (email.php).
v1.179.0 17/08/2026
Email: salvataggio che dice cosa non va + prova SMTP senza salvare + occhio sulla password
- Il salvataggio della configurazione email non può più rispondere «Risposta non valida»: la scrittura è atomica (il config precedente resta intatto se qualcosa fallisce) e l'errore torna sempre come JSON con il motivo (cartella non scrivibile, spazio disco, carattere non codificabile) (email.php).
- Nuova azione
test_smtp: prova le credenziali presenti nel form anche se non salvate e riporta la risposta esatta del server SMTP. Il pulsante «Invia prova» non salva più di nascosto e permette di scegliere il destinatario della prova (email.php, email.ts, EmailSettings.tsx). - Password SMTP: pulsante occhio per mostrarla/nasconderla, più un avviso quando su Gmail il valore non ha la forma di una App Password (16 lettere) (EmailSettings.tsx).
v1.178.0 17/08/2026
Backend sito: accesso con email oltre che con username
- Nel login del backend si può digitare username oppure email dell'amministratore. Il token di sessione porta sempre lo username canonico, quindi ruoli e permessi non cambiano in base a come si è digitato (pages.php).
- Ogni amministratore ha ora un campo email di accesso (facoltativo, unico: non può collidere con username o email di un altro). Salvando un utente esistente con la password vuota si aggiornano solo email e ruolo, senza ridigitare la password (pages.php, AdminUsers.tsx).
- L'admin predefinito (che vive in
admin_secret.phpsul server) può avere la sua email di accesso impostata direttamente da *Utenti admin*, senza toccare file sul server; in alternativa si può definireAUTH_EMAILinadmin_secret.php(pages.php). - I form di login del backend ora dicono «Utente o email» (23 pannelli).
v1.177.2 17/08/2026
Impostazioni: il Client ID Google non valido non viene servito né salvato
settings.phpè pubblico in lettura: ora azzera il campoauth.googleClientIdquando non è un client ID (…apps.googleusercontent.com), sia ingetsia insave. Serve a impedire che un client secret incollato per errore in quel campo resti memorizzato o venga restituito a chiunque (settings.php).
v1.177.1 17/08/2026
Login Google: il campo Client ID accetta solo un vero Client ID
- Se in «Google Client ID» finisce qualcosa che non è un client ID (tipicamente il client secret
GOCSPX-…, che causavaErrore 401: invalid_client), il login Google resta spento e il valore non viene mai esposto al browser daauth_config(account.php). - Nelle Impostazioni Sito il campo mostra un avviso immediato con la correzione da fare (il Client ID finisce con
.apps.googleusercontent.com) (SiteSettings.tsx).
v1.177.0 17/08/2026
Sicurezza: registrazione a doppio opt-in, anti brute-force, monitor d'integrità
- Registrazione a doppio opt-in. Prima
registerscriveva l'anagrafica nel CRM all'istante, senza limiti né verifica: un bot poteva creare migliaia di clienti inventati. Ora l'account nasce in attesa con i dati messi da parte, e nel CRM non entra niente finché il cliente non clicca il link ricevuto per email (valido 48 ore). Chi entra con Google, chi completa un acquisto o chi reimposta la password è già verificato e salta il passaggio; gli account creati prima di oggi restano validi (account.php, Account.tsx, account.ts, email.php). - Tre filtri prima ancora dell'email: honeypot invisibile, rate-limit (5 registrazioni/ora e 15/giorno per IP, 3/giorno per indirizzo) e controllo dell'indirizzo — sintassi, ~70 domini usa-e-getta ed esistenza dei record MX del dominio (_security.php).
- Login a prova di forza bruta. Il login admin del sito non aveva alcun limite: era il vettore
wp-login.php. Ora, per username e IP separatamente, l'attesa cresce dal 5° tentativo fallito (30s → 300s) e dal 12° scatta un blocco di un'ora, con email di allerta allo staff (pages.php). Stesso trattamento su login clienti e recupero password. - Cartelle di upload non più eseguibili. In
_uploads,_leadmediae_orderfilesviene ora depositato un.htaccessche spegne l'esecuzione degli script e serve gli SVG in sandbox: anche se passasse un file malevolo, non partirebbe. Le cartelle dati restano negate del tutto via HTTP. - Header di sicurezza sul sito (HSTS, nosniff, X-Frame-Options, Referrer-Policy, Permissions-Policy) e CSP in modalità solo-report, che registra ciò che bloccherebbe senza bloccare nulla: si attiva davvero dopo qualche giorno di osservazione (.htaccess, csp_report.php).
- **Nuovo pannello *Sistema → Sicurezza*** (/sito/sicurezza, SecurityPanel.tsx): controlla l'impronta dei file contro una baseline, cerca eseguibili intrusi nelle cartelle dati e legge
robots.txt/sitemap.xmla caccia di ideogrammi CJK, keyword di spam e domini estranei — la firma esatta del "chinese hack". Un cron ogni 6 ore fa lo stesso controllo e scrive solo se trova qualcosa (security.php). - Il rate-limit di
contact.phpsi basava suX-Forwarded-For, che il client può scrivere a piacere: bastava cambiarlo a ogni richiesta per non incontrarlo mai. Ora usa l'IP reale (contact.php). - Nella lista account del backend gli account in attesa hanno il badge «Email da confermare» (AccountsAdmin.tsx).
v1.176.0 17/08/2026
Modifica dell'ordine e conversione bonifico ↔ carta
- Editor dell'ordine con righe, prezzi e sconti modificabili come in un preventivo, e riconferma con email al cliente («modificato da Floormad»). Lo stesso componente serve sia il backend del sito sia il CRM (OrderEditor.tsx, orderEdit.ts, orderActions.ts, OrdersManager.tsx).
- Conversione del metodo di pagamento bonifico ↔ carta con generazione del link di pagamento, e nuova pagina pubblica
/pagadove il cliente salda con carta (PayOrder.tsx, paga.astro, payments.ts). - Lato server:
pay_link(admin) piùpay_info/pay_session/pay_confirmpubbliche protette da token firmato. L'importo è sempre riletto dal CRM e mai accettato dal browser (payments.php). - Il webhook Stripe scrive ora il pagamento sul CRM, in modo idempotente: un ordine pagato non può essere registrato due volte (stripe_webhook.php).
- Nuovi template email
order_updated,order_payment_link,order_payment_bank(email.php). - L'ordine salva
orderDiscount/discountLabel: senza, ricalcolando dalle righe si perdeva lo sconto del coupon (order.ts).
v1.175.0 17/08/2026
Recupero carrello abbandonato (solleciti automatici)
- Il carrello viene fotografato appena si conosce l'email del cliente, e un cron orario manda i solleciti maturati: prima un promemoria semplice, poi — se previsto dalla sequenza — uno con coupon monouso generato al momento (abandoned.php, abandoned.ts, CartRecoveryTracker.tsx).
- Il cliente riapre il carrello dal link (
?recover=) ritrovando la configurazione esatta, e ogni email porta il proprio link di disiscrizione (CartPage.tsx, Base.astro). - Pannello Impostazioni Sito → Notifiche → Recupero carrello: sequenza dei solleciti, sconto, statistiche e URL del cron pronto da copiare (SiteSettings.tsx, siteSettings.ts, settings.php, EmailSettings.tsx).
- I solleciti si fermano da soli quando l'ordine viene inviato (order.ts).
v1.174.0 17/08/2026
Area clienti: accesso con Google (account creato automaticamente)
- Nell'area clienti compare il pulsante ufficiale «Continua con Google» (tab Accedi e tab Registrati): al primo accesso l'account cliente viene creato automaticamente dall'email verificata da Google, insieme all'anagrafica nel CRM (
source: Sito Web); se l'email esiste già, l'identità Google viene collegata all'account/cliente esistente (la password resta valida) (GoogleSignIn.tsx, Account.tsx, account.ts). - Lato server, nuove azioni
auth_config(pubblica: dice al front-end se il login Google è attivo) egoogle_login, che verifica l'ID token con l'endpoint ufficialeoauth2.googleapis.com/tokeninfocontrollandoaud(client ID nostro),iss,expedemail_verified(account.php). - Nuova sezione Impostazioni Sito → Generale → «Accesso clienti — Login con Google»: interruttore + Google Client ID. La config è letta a runtime dal browser, quindi si attiva/cambia senza rideployare il sito (SiteSettings.tsx, siteSettings.ts, settings.php).
- Nella lista account del backend gli account Google hanno il badge Google (AccountsAdmin.tsx).
- Nessun client secret coinvolto: il flusso ID token usa solo il Client ID, che è pubblico.
v1.173.1 31/07/2026
Accessorio: fasce sconto cliccabili (impostano la quantità)
- Le pill delle fasce di sconto («2 pz → −10%», «da 3 pz → −20%») sono ora cliccabili: un tap imposta la quantità alla soglia della fascia (aspetto invariato) (Configurator.tsx).
v1.173.0 31/07/2026
Accessorio: notifica fasce sconto quantità + prezzo live con +/−
- Nello step accessorio compare la notifica delle fasce di sconto generata dai valori impostati sul prodotto (es. «2 pz → −10% · da 3 pz → −20%»), con la fascia attiva evidenziata. Lo stepper +/− aggiorna prezzo e sconto in tempo reale (prezzo pieno barrato + totale scontato + «−X%») (Configurator.tsx).
v1.172.0 31/07/2026
Ordine anti-WAF (403 risolto) + accessorio con SKU e sconto quantità propri
- Invio ordine in base64:
syncRowsmanda le righe comerows_b64(base64) → il WAF/CDN non ispeziona l'HTML dell'ordine e non risponde più 403 «Forbidden» (era la causa di «Risposta non valida dal server»). I 4xx non transitori ora non vengono ritentati e danno un messaggio chiaro (lib/bridge.ts). - Accessorio: SKU/identità propri — la riga accessorio nel carrello/ordine usa lo SKU, id, slug e nome del prodotto-accessorio (non più quelli del tappeto) (Configurator.tsx, productSchema.ts, configSchema.ts).
- Sconto quantità dell'accessorio applicato: i
quantityTiersdel prodotto-accessorio ora incidono sul prezzo della riga accessorio (es. 3 pz → −20%) (Configurator.tsx).
v1.171.0 31/07/2026
Checkout: invio ordine resiliente + accessorio come riga a sé
- Invio ordine più robusto:
syncRows(usato dal checkout) ora ha timeout 30s e 3 tentativi su risposta non-JSON/timeout transitori (proxy 502/504, hiccup del server) — così un intoppo momentaneo non fa più fallire l'ordine con «Risposta non valida dal server». Gli errori JSON espliciti del server restano immediati e ora il messaggio include HTTP + estratto del corpo (lib/bridge.ts). - Accessorio come voce aggiuntiva: l'accessorio scelto nel configuratore («Contiene un accessorio») entra nel carrello/ordine come riga a sé (come un prodotto separato), anche a prezzo 0, e non è più duplicato nei dettagli della riga principale (Configurator.tsx).
v1.170.3 31/07/2026
Bordo antinciampo: anteprime card a spigolo vivo
- Tolto l'arrotondamento (
rx) dalle icone delle card «Nessuno / 2 lati / 4 lati» dello step bordo antinciampo: gli angoli ora sono piatti come il bordo reale (Configurator.tsx).
v1.170.2 30/07/2026
Configuratore: ordine step rispettato anche per bordo/antinciampo/decontaminazione
- Il configuratore applica un riordino stabile degli step secondo l'«Ordine step» impostato nel CRM: le voci trascinate (incluso bordo, bordo antinciampo, decontaminazione) vanno nella posizione scelta; le altre restano nell'ordine attuale (retro-compatibile, i prodotti esistenti non cambiano) (Configurator.tsx).
- Bordo antinciampo — icone della selezione step: l'icona «4 lati» ora mostra 3 cornici concentriche continue (come l'anteprima, niente incroci agli angoli) e le icone delle card sono ~40% più grandi (Configurator.tsx).
v1.170.1 30/07/2026
Bordo antinciampo a 4 lati: cornici continue + anteprima più grande
- 4 lati «a giro»: le 3 strisce (nera · rossa · nera) sono ora cornici concentriche continue, senza tagli agli angoli, sia nell'anteprima a schermo sia nel PNG di carrello/PDF; i 2 lati restano invariati (Configurator.tsx).
- Anteprima nelle card dello step «bordo antinciampo» ingrandita (restano 3 card per riga).
v1.170.0 30/07/2026
Bordo antinciampo con lati scelti dal cliente + scelta decontaminazione suole/ruote
- Bordo antinciampo (ex «decontaminante») nel configuratore: il cliente sceglie Nessuno / 2 lati / 4 lati; per i 2 lati la direzione (sopra+sotto o sinistra+destra), con anteprima delle 3 strisce sui lati scelti e prezzo aggiornato (Configurator.tsx, configSchema.ts, leads.ts).
- Scelta decontaminazione: nuovo step con due card suole / ruote (icone e etichette dal CRM), scelta obbligatoria, stesso prezzo (Configurator.tsx).
v1.169.0 30/07/2026
Immagine-da-immagine nel builder + bordo decontaminante nel configuratore
- Builder — immagine da foto (image-to-image): il modale «Crea immagine con AI» ora accetta una foto di riferimento (allegala e l'AI genera partendo da quella, mantenendo texture/colori). Il server
imagen.phpla supportava già; aggiunto il passaggio lato client (AiImageModal.tsx, media.ts). - Bordo decontaminante nel configuratore: nuovo step + anteprima che disegna le 3 strisce nera/rossa/nera sui lati scelti, coerente con la spunta impostata nel CRM (Configurator.tsx, configSchema.ts, leads.ts).
v1.168.0 30/07/2026
Disegno personalizzato nel configuratore, blocco Blog nel builder, tracker MegaSEO
- Disegno personalizzato («Disegna il prodotto»): nuovo popup per i tappeti componibili — il cliente disegna la forma su una griglia di mattonelle (L, U, rettangolo…), con vista Pianta/3D, gestione lati maschio/femmina e bordi rampa, misure ambiente e preventivo live; conteggio pezzi e prezzi in automatico. Lo schema del configuratore è ora condiviso fra sito e CRM (FreeformDesignerModal.tsx, FreeformModular.tsx, FreeformIso.tsx, FreeformPreview.tsx, puzzleGeometry.ts, freeformModular.ts, productSchema.ts, Configurator.tsx).
- Builder — blocco «Blog (carosello articoli)»: nuovo blocco Puck che pesca gli articoli dal CRM, con slider vanilla condiviso (frecce, barra di avanzamento, autoplay in pausa su hover) (puck.config.tsx, dataBlocks.tsx, resolve.ts, commonFields.tsx). L'editor applica ora colori/tipografia del tema anche nel canvas (editor.astro).
- MegaSEO — tracker interno cookieless:
fm-insights.jsviene iniettato sulle pagine pubbliche indicizzabili (mai sul back-officenoindex) e invia gli eventi acollect.phpsame-origin, senza consenso (Base.astro).
v1.167.0 29/07/2026
Configuratore: tabella tensioni cliccabile e banda «Lato + Lunghezza» a 25/25
- La tabella «Tensioni e classi di isolamento» dello step Spessore ora è cliccabile: toccando una riga (classe) si seleziona quello spessore — come le card sopra — e prezzo/SKU si aggiornano. Riga scelta in grigio chiaro, le altre a fondo bianco; funziona anche da tastiera (Enter/Spazio) (Configurator.tsx).
- Blocco banda più compatto: «Lato Banda standard» e «Lunghezza (cm)» occupano ora ~25% della riga ciascuno (metà box in tutto) — prima il campo Lunghezza prendeva tutto lo spazio residuo ed era troppo largo. Su mobile restano a colonna piena (Configurator.tsx).
v1.166.1 29/07/2026
Rotolo intero con prezzi per spessore: la modalità non spariva più
- Con i prezzi per spessore il prezzo della riga è vuoto per definizione, e i controlli «riga valida» lo pretendevano: la modalità Rotolo intero non compariva nel configuratore e la riga veniva scartata (configSchema.ts →
hasThicknessPrice, Configurator.tsx). - Ora una riga (rotolo o banda) è considerata prezzata anche se il prezzo sta solo nelle varianti di spessore, e la card del rotolo mostra «da …» col minimo, dato che il totale dipende dallo spessore scelto dopo.
v1.166.0 29/07/2026
Configuratore: step SPESSORE con prezzo per combinazione (2/3)
- Dopo la misura compare lo step Spessore con i soli spessori che quella misura (o banda, o rotolo) ha in listino: le combinazioni senza prezzo non vengono proposte (Configurator.tsx).
- Prezzo della combinazione: sostituisce quello di riga, non è un sovrapprezzo — vale per misura standard, banda (€/ml per spessore) e rotolo intero (configSchema.ts →
priceFromSchema). - Spessore obbligatorio, nessun preselezionato: senza scelta «Avanti» e «Aggiungi al carrello» restano bloccati con l'avviso «Scegli lo spessore». Cambiando misura, uno spessore non più disponibile si azzera da sé.
- SKU della combinazione in riepilogo, carrello, email e ordine (vince sul codice della riga e su quello del prodotto), con spessore e classe fra i dettagli della riga d'ordine.
- Sotto le card, la tabella delle tensioni con la riga scelta evidenziata: la classe si legge nel momento della scelta.
- «A partire da» usa la combinazione più bassa: per la misura minima è il suo spessore minimo (catalog.ts).
v1.165.0 29/07/2026
Tabella tensioni e classi di isolamento in pagina prodotto
- Nuova sezione «Tensioni e classi di isolamento» (classe BS EN 61111 · spessore · tensione d'esercizio · tenuta alla prova), sopra la scheda tecnica: è un dato di sicurezza, non un dettaglio (ProductLive.tsx). Compare solo se il prodotto ha spessori con almeno una tensione compilata; tradotta in EN e DE.
- Gli spessori con classe e tensioni arrivano dal CRM allo schema del sito (configSchema.ts, catalog.ts).
v1.164.1 29/07/2026
«Misure standard» spenta significa spenta anche sul sito
- Togliendo la spunta Misure standard nel CRM, le misure non arrivano più allo schema del configuratore: prima restavano nei dati (spegnere non le cancella, per non perdere il lavoro) e il sito continuava a mostrare le card delle misure e la modalità (configSchema.ts).
v1.164.0 29/07/2026
Prezzo ed etichetta imposti dal CRM
- La pagina prodotto rispetta l'etichetta personalizzata e il prezzo imposto impostati nel CRM: un numero viene formattato come prezzo, un testo (es. «Gratis») sostituisce il prezzo e nasconde «IVA esclusa» (ProductLive.tsx, catalog.ts).
v1.163.0 29/07/2026
Builder: Prose con immagine a 2 colonne e griglia categorie a schema righe
- Blocco «Testo lungo» (Prose) con immagine accanto: nuovo campo Immagine (media picker) + lato (destra/sinistra). Con l'immagine il blocco diventa due colonne — testo da una parte, foto a riempimento cover alta quanto il testo dall'altra; su mobile una colonna con la foto sempre sopra (4:3). Senza immagine resta identico a prima (vetrinaBlocks.tsx). In home le due sezioni SEO ora hanno le foto dei prodotti (asciugapasso DRY a destra, zerbino intarsiato con logo a sinistra).
- Griglia categorie a schema righe: nuovo campo «Schema righe» (es. «2,3,4») — quante tessere per riga, riga per riga; finito lo schema si ripete l'ultimo numero; vuoto = griglia classica a colonne. Su mobile ogni riga scende a 2 colonne. In home la griglia passa a «2,3,3»: due categorie principali grandi, poi 3+3 (dataBlocks.tsx, puck.config.tsx).
v1.162.0 29/07/2026
Disegno personalizzato: misura finale col bordo e anteprima che apre il disegno
- La misura ora è quella FINALE: il bordo rampa sporge davvero di ~5 cm per lato, quindi 1×2 mattonelle da 90 con bordo a giro = 100×190 cm (senza bordo resta 90×180). La sporgenza si somma solo sui lati dove c'è un pezzo di bordo sul filo esterno del disegno, e vale per quote della pianta, riquadro «Il tuo prodotto», riepilogo, carrello e preventivi (freeformModular.ts
footprintCm, FreeformPreview.tsx, Configurator.tsx). Il valore arriva dal nuovo campo CRM «Bordo effettivo misura (cm/lato)» (modular.rampaOverhangCm, vuoto = 5); «Bordo visibile» resta lo spessore disegnato. - Click sull'anteprima → si apre il popup «Disegna il prodotto» (come il pulsante), non più lo zoom dell'immagine; l'ingrandimento resta sul pulsante ⤢.
v1.161.0 28/07/2026
Disegno personalizzato: bordo femmina in overlay sopra i denti
- Nella pianta 2D i pezzi di bordo femmina vengono ridisegnati sopra le mattonelle con un velo al 60%: nella realtà il pezzo femmina si appoggia sopra gli incastri maschio della mattonella, e ora si vede così — i denti restano intravisti (~40%) sotto il bordo, quindi si capisce l'incastro senza perdere il pezzo. I pezzi maschio (che si agganciano al lato liscio) restano disegnati come prima (FreeformPreview.tsx).
v1.160.0 28/07/2026
Disegno personalizzato: colore bordo unico (M/F automatici) e popup più largo
- Il cliente sceglie solo il COLORE del bordo: le righe bordo del CRM vengono raggruppate per colore ignorando l'eventuale suffisso maschio/femmina nel nome («Giallo Nitrile M» + «Giallo Nitrile F» → un solo swatch «Giallo Nitrile»). Quale pezzo M o F serve su ogni lato lo decide già il disegno (freeformModular.ts).
- Fix prezzo bordi femmina a 0 €: con le righe nominate «… M»/«… F» la variante femmina del colore scelto non veniva trovata (0 € + avviso «non disponibile») anche se era a listino. Ora il pezzo si cerca per colore normalizzato: nel disegno d'esempio 8 maschi + 8 femmine escono a 36,60 € l'uno, totale corretto. Retrocompatibile con le configurazioni salvate che portano ancora il nome con la variante (FreeformModular.tsx, Configurator.tsx).
- Popup «Disegna il prodotto» più largo: da 1152 a 1280 px su desktop (FreeformDesignerModal.tsx).
v1.159.0 28/07/2026
Disegno personalizzato: pannello a tutta larghezza e vista 3D ruotabile
- Via il box «Disegno personalizzato» dal pannello del configuratore: occupava 1/3 dello spazio con la sola descrizione della modalità. Ora il pannello usa tutta la larghezza su due colonne — a sinistra misure ambiente + anteprima e «Disegna il prodotto», a destra preventivo e bordi (FreeformModular.tsx).
- La vista 3D si ruota trascinando (mouse e touch): proiezione dimetrica «a giradischi» con angolo libero — le pareti visibili vengono scelte in base all'angolo (backface culling sulla normale ruotata), l'ombreggiatura segue una luce direzionale fissa (a rotazione zero le tonalità sono identiche a prima), i bordi rampa e le giunzioni seguono. Inquadratura calcolata sul raggio del disegno → niente zoom che «pompa» durante il drag. Suggerimento «Trascina per ruotare il disegno.» sotto la vista, tradotto IT/EN/DE (FreeformIso.tsx, FreeformDesignerModal.tsx, dictionary.ts).
v1.158.0 28/07/2026
Home più curata: categorie con foto distinte, intestazioni uniformi, CTA centrata
- Griglia categorie della home curata a mano: 8 famiglie scelte (zerbini e tappeti, prodotto con logo, consegna in 7 giorni, ambienti di lavoro, decontaminanti, rotoli in gomma, alluminio, sicurezza pavimenti) con immagini-tessera tutte diverse — prima le 20 tessere automatiche ripetevano la stessa foto per le categorie che condividono il primo prodotto.
- Griglia categorie: nuovi campi «Etichetta» e «Sottotitolo» — se presenti l'intestazione diventa centrata nello stesso stile dei blocchi vetrina (dataBlocks.tsx, puck.config.tsx).
- Blocco Hero senza immagine (es. banda CTA a fine pagina): testo centrato invece della griglia a 2 colonne mezza vuota (blocks.tsx); copy della CTA finale rifinita.
- Niente blocco recensioni per ora: l'endpoint non ha ancora recensioni e mostrerebbe una sezione vuota.
v1.157.1 28/07/2026
Pagina prodotto bianca: nome doppio nel configuratore
- Con la 1.157.0 tutte le pagine prodotto restavano bianche. Il configuratore importava dalla libreria del disegno personalizzato una funzione chiamata
borderColorOptions, ma nel suo corpo esiste già una variabile con lo stesso nome (i colori del bordo perimetrale): quella locale oscura l'import per tutta la funzione, così la chiamata la leggeva prima che fosse inizializzata →ReferenceErrore React che non montava nulla. L'import ora ha un alias dedicato (Configurator.tsx). - Perché non l'hanno preso i controlli: la chiamata sta dentro una callback (
useMemo), quindi per TypeScript è legittima e la build resta verde — l'errore esiste solo a runtime. Verificato ora con il browser: pagina prodotto senza errori in console e configuratore che monta.
v1.157.0 28/07/2026
Configuratore «Disegna il prodotto»: forma libera 2D/3D (Fatigue Step)
- I tappeti a mattonelle incastrabili tipo Fatigue Step non si vendono a griglia: il cliente ha una stanza e vuole coprirne una forma qualsiasi (a L attorno a un macchinario, a U, uno scalino). Nuovo configuratore a forma libera: si inseriscono le misure del proprio ambiente, la griglia mostra quante mattonelle intere ci entrano e si disegna toccando le caselle — o trascinando — con forme rapide *Rettangolo / L / U* (FreeformPreview.tsx, FreeformModular.tsx, freeformModular.ts).
- Pulsante «Disegna il prodotto» che apre un popup: a schermo pieno sul telefono, finestra larga sul desktop. Dentro: il disegno grande da toccare, il toggle Pianta / 3D (con la pianta in miniatura mentre si guarda il 3D) e il preventivo che si aggiorna mentre disegni (FreeformDesignerModal.tsx).
- Vista 3D in SVG puro — proiezione isometrica con spessore delle mattonelle e bordi inclinati come rampe, senza aggiungere una libreria 3D al sito (FreeformIso.tsx).
- Bordi rampa dove servono davvero: *nessuno*, *a giro*, oppure lato per lato toccando i bordi esterni del disegno. Gli angoli si chiudono a 45° da soli — anche gli angoli interni di una L o di una U — e sui tratti lunghi si vede la giunzione tra un pezzo da 97 cm e il successivo.
- Maschio/femmina automatici: nel disegno i lati maschio mostrano i denti dell'incastro e i femmina sono lisci (il lato liscio può stare contro la parete anche senza bordo). Il configuratore calcola quanti bordi maschio e quanti femmina servono in base a dove cadono, li prezza sulle righe caricate nel CRM e avvisa se una variante manca per il colore scelto. Pulsante «Inverti maschio/femmina» che ruota le mattonelle di 180°.
- Nel carrello e nella scheda d'ordine finisce la composizione vera — *«12 mattonelle 90×90 [SKU] · 5 bordi maschio [SKU] · 7 bordi femmina [SKU] · ingombro 360×270 cm»* — con il PNG della pianta quotata. Il passo resta bloccato se il disegno è vuoto o se le mattonelle non sono tutte collegate tra loro (staccate non si incastrano: sarebbero due tappeti).
- Riprendere una configurazione componibile ora funziona: modificando la riga dal carrello o riaprendo un preventivo salvato si ritrovano griglia, rampa e — nel disegno personalizzato — la forma esatta con i suoi bordi. Prima si perdevano, perché lo stato salvato non li conteneva (leads.ts).
v1.156.1 28/07/2026
Anteprima a foto: riconosce anche i pezzi a taglia unica
- La condizione guardava le modalità di misura dello schema, ma un prodotto a pezzo con una sola misura standard ha la modalità accesa e lo step nascosto (a taglia unica non c'è nulla da scegliere): l'anteprima restava bianca. Ora conta se lo step misura è davvero visibile (Configurator.tsx).
v1.156.0 28/07/2026
Prodotti a pezzo: anteprima con la foto del prodotto
- Sui prodotti venduti a pezzo senza composizione (misura fissa, nessuna configurazione: es. Superdry Heavy Traffic) il riquadro dell'anteprima restava bianco, perché non c'è niente da disegnare. Lì — e solo lì — l'anteprima mostra la foto del prodotto: non può essere confusa con un tappeto configurato, perché una configurazione non esiste. Nascosti anche i comandi «ingrandisci», che su una foto non servono (Configurator.tsx →
photoOnlyPreview).
v1.155.0 28/07/2026
Home: loghi più grandi senza vuoti ai lati e sezioni testo SEO
- Loghi clienti: nuovo campo «Altezza loghi (px)» sul blocco Loghi/partner (24–120, default 48 come prima); in modalità scorrimento la lista base viene ripetuta finché il nastro è più largo di qualunque schermo e la sfumatura ai bordi è stata tolta → mai spazi vuoti ai lati, su nessuna larghezza. In home i loghi passano a 76 px con giro più lento (vetrinaBlocks.tsx, puck.config.tsx).
- Blocco Card generiche: il numero di colonne scelto ora vale anche su desktop (prima restava bloccato a 2); mobile a 1 colonna (vetrinaBlocks.tsx).
- Home — testi SEO (ispirazione zerbinisumisura.it, testi riscritti da zero): Timeline «Dal configuratore alla tua porta in 4 passi», Cards «Ad ogni ambiente il suo tappeto» (zerbini con logo / su misura / antifatica, con foto e link alle categorie), due sezioni Prose («Tappeti e zerbini su misura: qualità professionale…» e «Lo zerbino con logo è il primo biglietto da visita…») e FAQ con 6 domande (misure al cm, logo, materiali, prezzi, tempi, pulizia). Tutti blocchi builder standard: si spostano/modificano da
/sito/editor, versione precedente in cronologia.
v1.154.0 28/07/2026
Home: carosello prodotti e loghi clienti a scorrimento (spunto da coba.com)
- Nuovo blocco builder «Carosello prodotti/categorie» (
CardSlider, categoria *Dati dal CRM*): striscia orizzontale con frecce tonde, barra di avanzamento, autoplay che si mette in pausa al passaggio del mouse e per 6 s dopo ogni scorrimento manuale. Mostra prodotti o categorie del CRM (limite, categoria, card visibili su desktop 2–5, formato immagine, prezzo, link «Vedi tutto» configurabili). Come gli altri blocchi builder viene reso senza idratazione: l'interattività è vanilla JS scoped per id e gliitemsarrivano dal resolver di build (dataBlocks.tsx, resolve.ts, puck.config.tsx). - Il blocco «Loghi / partner» ora ha la modalità Scorrimento: nastro continuo con lista duplicata (il giro si chiude senza salti), 1 o 2 righe in direzioni opposte, durata del giro regolabile, sfumatura ai bordi, pausa sull'hover e animazione spenta con
prefers-reduced-motion(vetrinaBlocks.tsx). - Home: aggiunti i due blocchi — carosello «I più richiesti» sotto la griglia categorie e i 25 loghi clienti («Hanno scelto i nostri prodotti», 2 righe, scala di grigi) prima della CTA finale. I loghi sono stati portati da floormad.com in
public/loghi-clienti/(PNG a 260px, 312 KB in tutto) così il sito non dipende dal WordPress. La versione precedente della home resta ripristinabile dalla cronologia del builder.
v1.153.3 28/07/2026
Modelli: etichetta col nome completo del prodotto
- I modelli si chiamano ora «Orthomat® Comfort Plus - Nero» invece del solo «Nero», nelle card «Modelli disponibili», nel titolo della scheda quando il modello è selezionato e in galleria. Nel CRM i modelli portano il nome breve della variante e da soli non dicevano di quale prodotto fossero; se il nome del modello contiene già quello del prodotto non viene ripetuto (catalog.ts).
v1.153.2 28/07/2026
Breadcrumb: la categoria compare solo se ha una pagina
- Il caso reale del «Catalogo» doppio: il prodotto è agganciato a una categoria «Catalogo» per cui non viene generata nessuna pagina, quindi la briciola portava a
/categoria/catalogo→ 404. Ora la briciola della categoria compare solo se quella categoria ha davvero una pagina; altrimenti si omette ([prodotto/[slug].astro](src/pages/prodotto/[slug].astro), [[lang]/[section]/[slug].astro](src/pages/[lang]/[section]/[slug].astro)).
v1.153.1 28/07/2026
Breadcrumb: niente «Catalogo» doppio che portava al 404
- Nei prodotti senza categoria il breadcrumb mostrava «Home / Catalogo / Catalogo» e il secondo puntava a
/categoria/(404): la ripetizione era il testo di ripiego usato quando la categoria manca. Ora quella briciola si omette, e se lo slug categoria esiste ma non è in anagrafica l'etichetta si ricava dallo slug ([prodotto/[slug].astro](src/pages/prodotto/[slug].astro), [[lang]/[section]/[slug].astro](src/pages/[lang]/[section]/[slug].astro)).
v1.153.0 28/07/2026
Pulsanti azione impilati con i modelli, etichette maiuscole, popup accessorio a 840px
- Nei prodotti con «Modelli disponibili» i pulsanti Configura il prodotto · Scheda tecnica · Certificati · Guida si spostano sotto l'anteprima (colonna di sinistra), uno sotto l'altro a larghezza piena: a destra lo spazio serve alle card dei modelli (ProductLive.tsx →
actionButtons). - Etichette dei pulsanti MAIUSCOLE in tutte le disposizioni (impilata, in fila da 3, a coppie).
- Il popup «Più dettagli» dell'accessorio passa da 672 a 840px di larghezza (Configurator.tsx).
v1.152.6 28/07/2026
Card accessorio: testo fino a fine frase
- La descrizione sulla card accessorio arriva a ~340 caratteri e viene tagliata al punto più vicino, così finisce con una frase compiuta; solo se non c'è un punto utile taglia alla parola e chiude con «…» (catalog.ts →
accBlurb).
v1.152.5 28/07/2026
Colonne icone decise dallo spazio disponibile
- Il numero di colonne non dipende più dal conteggio delle icone ma dallo spazio: se in colonna singola le icone restano leggibili (rimpicciolimento entro il 40%) si usa una colonna, altrimenti due. Così Deckplate — pagina alta per il blocco «Modelli disponibili» — tiene le sue 10 icone in fila, mentre una pagina corta le sdoppia (ProductLive.tsx). Resta l'isteresi anti-sfarfallio e la regola «entro Max icone per colonna sempre una colonna».
v1.152.4 28/07/2026
Card accessorio: descrizione più lunga e pulsante «Più dettagli»
- La descrizione sulla card dell'accessorio passa da 90 a 260 caratteri: la card è larga 2/3 e lo spazio c'era, prima la frase si troncava a metà (catalog.ts).
- Il pulsante «Più dettagli →» ora compare davvero: la descrizione completa (
infoHtml) si perdeva nel passaggio che costruisce le opzioni degli step del wizard, quindi la card non sapeva di avere qualcosa da mostrare (Configurator.tsx). Stile a pillola bianca con bordo, come «Vedi descrizione completa →» della pagina prodotto; apre il popup con foto grande e testo completo.
v1.152.3 28/07/2026
Sfarfallio icone: via il ResizeObserver dalla colonna icone
- Lo sfarfallio 1↔2 colonne era una retroazione: la colonna icone e il blocco info stanno nella stessa riga flex, quindi ogni nostro cambio di layout cambiava l'altezza misurata, il
ResizeObserverrichiamava il calcolo e il ciclo ripartiva all'infinito (verificato con Puppeteer: alternanza ogni ~150ms per tutta la vita della pagina). Ora il ricalcolo avviene solo al resize della finestra — che il nostro layout non può innescare — più un singolo ricalcolo differito dopo il caricamento delle icone (ProductLive.tsx).
v1.152.2 28/07/2026
Ingrandisci anteprima: icona nell'angolo del blocco
- L'icona ⤢ non sta più sopra il disegno (copriva l'angolo del prodotto) ma nell'angolo alto-destra del blocco «Il tuo prodotto», accanto al titolo. Il disegno resta cliccabile per ingrandire, e la pill «Perfeziona la stampa» dei prodotti stampati resta dov'era perché è un invito, non un comando di zoom (Configurator.tsx).
v1.152.1 28/07/2026
Rifiuto accessorio: divieto grande e nome del prodotto
- Il simbolo di divieto passa da 32 a 64px e sotto si legge «Non voglio» + il nome del prodotto accessorio (es. «ESD Floor Mat Grounding Kit») invece del titolo dello step, che è la categoria. Con più accessori in elenco non si può nominarne uno solo: in quel caso resta il titolo dello step (Configurator.tsx).
v1.152.0 28/07/2026
Step accessorio: rifiuto a 1/3, scheda a 2/3, popup «Più informazioni»
- Lo step accessorio è a 3 colonne: il rifiuto occupa 1/3 con il simbolo di divieto e la scritta «Non voglio «ESD Kit»» (prima era un anonimo «Nessuno»), ogni accessorio occupa 2/3 con la foto grande a sinistra e titolo + descrizione breve a destra (Configurator.tsx).
- Nuovo pulsante «Più informazioni» sulla scheda dell'accessorio: apre un popup con la foto grande e la descrizione completa del prodotto-accessorio presa dal CRM (passata come
infoHtmlin catalog.ts → configSchema.ts). Tradotto in EN e DE. - Colonne icone: torna a comandare «Max icone per colonna» del CRM (default 6), quindi con 10 icone si va su 2 colonne. La colonna singola vale finché le icone stanno in quel tetto e ci entrano in altezza; resta l'isteresi anti-sfarfallio.
v1.151.2 28/07/2026
Colonna icone: via lo sfarfallio 1↔2 colonne
- La colonna icone e il blocco info stanno nella stessa riga flex: cambiare il numero di colonne cambiava l'altezza misurata, il
ResizeObserverricalcolava e si innescava un ping-pong 1↔2 colonne visibile a schermo. Tre freni: si ignorano le variazioni di altezza sotto i 24px, serve superare la soglia di scala di 0,05 per cambiare colonne (isteresi) e dopo qualche aggiustamento la scelta si congela (ProductLive.tsx). - Scala e gap arrotondati: differenze millesimali non contano più come «cambiamento» e non fanno ridisegnare.
v1.151.1 28/07/2026
«Modelli disponibili» rispetta la spunta «Prodotto configurabile»
- Togliendo «Prodotto configurabile» nel CRM il blocco Modelli disponibili non compare più. I modelli restano salvati (spegnere non li cancella), ma il sito controllava solo la presenza del configuratore e non la spunta, quindi continuava a mostrarli (catalog.ts).
v1.151.0 28/07/2026
Step accessorio nel configuratore
- I prodotti-accessorio (spunta «È un accessorio» nel CRM: fuori dal catalogo pubblico) diventano uno step del configuratore dei prodotti che li includono. L'attributo viene composto prima della build dello schema, così lo step riusa il meccanismo esistente degli accessori: card con foto e prezzo, «Nessuno» come default a costo zero, quantità propria e riga a sé nel riepilogo, nel carrello e nell'ordine (catalog.ts).
- Si configura nel prodotto → Extra → «Contiene un accessorio»: titolo dello step, accessori proposti e se il cliente può scegliere la quantità.
v1.150.2 28/07/2026
Bordo arrotondato: curva più contenuta (max 40px)
- Il raggio degli angoli è ora il 10% del lato corto con tetto a 40px (prima 15% senza tetto): ingrandendo l'anteprima la curva diventava enorme. Vale sia per l'anteprima a schermo sia per la miniatura/PNG del carrello, che ora hanno la stessa curva (Configurator.tsx,
ROUND_PCT_G/ROUND_MAX_PX).
v1.150.1 28/07/2026
Barra acquisto: carrello a sinistra del testo e spazio per il chatbot
- Nella barra in basso il carrello sta a sinistra della scritta: quando il pulsante è nello stato «Completa la configurazione» perdeva il
flexdi.btn-accente l'icona finiva sopra al testo (Configurator.tsx). - La barra tiene ora un margine a destra (64–80px): la bolla del chatbot è fissa nell'angolo e copriva la coda del testo del pulsante.
v1.150.0 28/07/2026
Icone in colonna singola, modelli a metà, «Vedi descrizione completa» a pillola
- Colonna icone: si privilegia una sola colonna, riducendo un po' le icone per farle entrare nell'altezza disponibile. Con due colonne restavano grandi ma lasciavano molto bianco sopra e sotto. Si passa a 2 colonne solo se in singola l'icona scenderebbe sotto la metà (illeggibile) (ProductLive.tsx).
- Modelli disponibili: fino a 4 modelli occupano tutta la larghezza a colonne uguali — con 2 modelli sono 50% e 50%, prima erano 1/3 e 1/3 con un buco a destra.
- «Vedi descrizione completa» non è più un link ma un pulsante a pillola: fondo bianco, bordo da 2px del colore del testo (blu scuro); al passaggio del mouse si riempie di blu.
v1.149.0 28/07/2026
Pulsanti da scegliere che lampeggiano, prezzi in arancio
- I pulsanti ancora da scegliere lampeggiano col colore accento, come già facevano i campi da compilare: misure standard, rotolo intero, lato banda, colori e opzioni a card. Appena l'utente sceglie in quel passo il lampeggio si ferma, così resta chiaro dove cliccare senza distrarre dopo (Configurator.tsx,
.fm-need-pickin global.css). Con «riduci animazioni» attivo nel sistema il bordo resta arancione fisso. - Prezzi nelle card 1 pt più grandi e in arancio (colore del template) invece del grigio: si leggono a colpo d'occhio nelle misure standard e nel rotolo intero.
v1.148.0 28/07/2026
Banda standard: lato e lunghezza su una riga, limiti scritti solo se ci sono
- Lato banda + Lunghezza su UNA riga da desktop: le card «90 cm / 120 cm / 150 cm» ora si restringono al testo invece di occupare mezza colonna ciascuna, e il campo Lunghezza si prende lo spazio che resta. Su mobile restano incolonnate (Configurator.tsx).
- Sotto il campo si scrivono solo i limiti che esistono: con il solo minimo si legge «min 90 cm», non più «min 90 — max – cm».
- Avviso di misura minima/massima e riga dei limiti 1 pt più grandi (13px), anche nella misura libera: prima erano difficili da leggere.
v1.147.1 27/07/2026
Piastrelle: sotto il disegno c'è il colore scelto
- La sagoma viene riempita prima con il colore selezionato dal cliente e poi con il disegno del pezzo: se l'SVG è trasparente (solo texture o rilievo) la piastrella resta del colore giusto — nera se il colore è nero — invece di mostrare il vuoto (PuzzlePreview.tsx).
v1.147.0 27/07/2026
Incastro a pettine: i denti quadri dei tappeti antifatica
- La sagoma delle piastrelle aveva tre gobbe arrotondate da puzzle da tavolo, che non è l'incastro dei defaticanti. Ora il profilo è a pettine con denti quadri: 8 denti sul lato lungo (proporzionali sul corto, minimo 4), dente e incavo della stessa larghezza — così due lati opposti combaciano esattamente — e profondità ridotta al 5,5% del lato (PuzzlePreview.tsx →
edgeCmds).
v1.146.0 27/07/2026
Piastrelle: puzzle perfetto usando i disegni come riempimento
- I disegni caricati venivano affiancati come immagini e i bordi non combaciavano mai (prima staccati, poi sovrapposti a occhio). Ora riempiono la sagoma generata — quella che per costruzione ha dente e incavo speculari — quindi l'incastro è perfetto per definizione e la grafica resta quella vera della piastrella (PuzzlePreview.tsx).
- Anteprima del componibile nel carrello: non è più un rettangolo pieno della misura totale ma la composizione vera, ottenuta rasterizzando in PNG l'anteprima disegnata in pagina (x2 per la nitidezza). Se la conversione non riesce si torna al rettangolo, così non si resta mai senza immagine (Configurator.tsx →
rasterizeModularPng).
v1.145.1 27/07/2026
Componibili: il «a partire da» non è più 0,00 €
- Sui prodotti a incastro il prezzo «al pezzo» restava 0,00 €: il calcolo guardava prezzo base, misure standard e scaglioni, ma non le piastrelle, dove per questi prodotti stanno i prezzi. Ora il minimo è una piastrella se esiste il pezzo singolo (es. 54,70 €), altrimenti due pezzi d'estremità — la fila più corta possibile (es. 109,40 €) (catalog.ts →
fromPrice).
v1.145.0 27/07/2026
Componibile nel carrello: misura della composizione e codici dei pezzi
- Nel carrello il prodotto componibile riportava la misura generica dello step («150 × 100 cm»), che per una composizione di piastrelle non vuol dire nulla, e l'anteprima disegnava quel rettangolo. Ora misura, anteprima e riga d'ordine usano la misura della composizione (es. 240 × 70 cm) (Configurator.tsx).
- La riga Composizione elenca i pezzi con il nome giusto per il layout — in fila «laterali», in griglia «angoli» — e con il codice articolo di ogni tipologia: «Comfort-Lok Black · 6 piastrelle (2 laterali [CL010001] · 4 centrali [CL010002]) · 240×70 cm». Il pezzo singolo compare come «1 singolo pezzo [CL010004]».
v1.144.0 27/07/2026
Piastrelle disegnate: ora si incastrano davvero
- I disegni dei pezzi venivano affiancati, quindi tra una piastrella e l'altra restava il vuoto in cui sporgevano i denti (tre riquadri staccati invece di un puzzle). Ora ogni pezzo rientra nel precedente della profondità del dente — la stessa usata dal tracciato generato, il 12% del lato corto — e la larghezza totale della composizione tiene conto delle sovrapposizioni (PuzzlePreview.tsx).
v1.143.1 27/07/2026
Campi quantità: niente freccette, numero più grande e centrato
- Via le freccettine su/giù del campo numerico: in mezzo a un − / + erano di troppo e spingevano il numero fuori centro (classe
.fm-qtyin global.css). Il valore resta scrivibile da tastiera. - Numero 2 pt più grande e in grassetto, perfettamente centrato: vale per il numero di piastrelle, la quantità pezzi e le quantità degli accessori (Configurator.tsx).
v1.143.0 27/07/2026
Anteprima componibile composta con i disegni veri delle piastrelle
- Se nel CRM sono caricati i disegni dei pezzi (SVG/PNG per angolo, laterale, centrale, singolo), l'anteprima non usa più il tracciato generato: compone le immagini una accanto all'altra. In una fila il pezzo di destra è il laterale ruotato di 180°, così i denti guardano il vicino; il pezzo singolo usa il suo disegno senza rotazioni (PuzzlePreview.tsx →
tileArt, portato dallo schema). - Se un disegno manca si ricade su quello disponibile (centrale → laterale → angolo) e, se non ce n'è nessuno, sul disegno generato di prima: nessun prodotto perde l'anteprima.
v1.142.3 27/07/2026
Una piastrella sola: misura e disegno giusti
- Scegliendo 1 piastrella il configuratore continuava a mostrare «2 piastrelle · 160 × 70 cm» e due pezzi nell'anteprima: il numero di colonne veniva forzato a un minimo di 2 più a valle, dopo il selettore. Ora, quando il prodotto ha il prezzo del Singolo pezzo, il minimo effettivo è 1: misura 80 × 70 cm, un pezzo solo e — visto che non ha vicini — con i quattro lati piatti, come la mattonella chiusa che si vende da sola (Configurator.tsx).
v1.142.2 27/07/2026
Pulsanti + / − con hover arancione
- I pulsanti + / − delle quantità (piastrelle, pezzi, accessori) avevano un hover grigio che si confondeva col bordo: ora al passaggio del mouse diventano arancione tenue con il segno in accento. Quando sono disattivati (minimo raggiunto) restano spenti (Configurator.tsx).
v1.142.1 27/07/2026
Fila: si può ordinare una piastrella sola, se esiste il pezzo singolo
- Nel componibile in fila il minimo era fisso a 2 piastrelle. Ora scende a 1 quando il prodotto ha il prezzo del Singolo pezzo (la mattonella chiusa sui 4 lati); senza quel prezzo resta 2, perché un pezzo d'estremità da solo non è vendibile (Configurator.tsx).
v1.142.0 27/07/2026
Step componibile: impaginato come le Misure standard, riepilogo leggibile
- Stessa impaginazione degli altri step: la card «Componibile» occupa 1/3 con icona, titolo H3 e descrizione, e il pannello «componi le piastrelle» i 2/3 restanti (su mobile restano in colonna) (Configurator.tsx).
- Riepilogo della composizione più leggibile: intestazione «2 piastrelle · 160 × 70 cm» più grande (+2 pt), righe con il nome della piastrella davanti alla tipologia («Comfort-Lok Black Laterale: 2 × 54,70 €»), quantità e prezzi unitari in arancione, totale di riga in arancione e più grande (+4 pt rispetto a prima).
v1.141.0 27/07/2026
Componibile in fila: «Laterali», pezzo singolo e incastri visibili sul nero
- Nel riepilogo della composizione, in modalità fila i pezzi d'estremità si chiamano Laterali (gli «Angoli» esistono solo nella griglia 2D) (Configurator.tsx).
- Una sola piastrella usa il prezzo del Singolo pezzo (la mattonella chiusa sui 4 lati) quando il prodotto ce l'ha, con una riga dedicata nel riepilogo.
- Incastri visibili sulle piastrelle nere: il contorno dei denti era nero su nero e il puzzle sembrava un rettangolo pieno. Ora, quando il colore è scuro (luminanza < 0,25), il tratto passa automaticamente a grigio chiaro (PuzzlePreview.tsx).
v1.140.0 27/07/2026
Pallini solo dove servono davvero
- Le classificazioni con «Valore sul prodotto: Nessuno» (o «Testo») non mostrano più i pallini: prima il numero salvato sulla scheda del prodotto vinceva sull'impostazione della libreria e icone-categoria come «Antifatica-Ergonomico» uscivano con 5 pallini pieni (catalog.ts).
v1.139.0 27/07/2026
Checkout: la quantità non si cambia più qui
- Tolti i pulsanti − / + dalle righe del carrello: la quantità resta scritta, ma si modifica solo dal configuratore con «Riprendi e modifica questo prodotto» (CartPage.tsx). Gli sconti a quantità (fasce, prezzi per scaglione) si calcolano lì: cambiando il numero in checkout il prezzo restava quello della fascia sbagliata.
v1.138.0 27/07/2026
Classificazioni: ordine unico per tutti i prodotti, deciso dalla libreria
- Le icone di classificazione non seguono più l'ordine in cui erano state aggiunte alla singola scheda: ora seguono la libreria — prima le classi (e i loro gruppi) nell'ordine di «Icone Prodotto», poi le icone nell'ordine interno alla classe (catalog.ts →
byLibraryOrder). Tutte le schede mostrano la stessa sequenza e per cambiarla basta riordinare la libreria una volta sola, senza toccare i prodotti.
v1.137.0 27/07/2026
Anteprima nel carrello più grande e quadrata, tolleranza ±3% facoltativa
- Finestra dell'anteprima ingrandita: da
max-w-lgamax-w-3xl(~700 px di riquadro) e i due box — foto prodotto e anteprima configurazione — sono quadrati, quindi della stessa altezza (CartPage.tsx). - Quote più leggibili nell'immagine dell'anteprima: numeri da 13 a 17 px, con più margine attorno (Configurator.tsx).
- ±3% solo se il prodotto lo prevede: la tolleranza si legge dal CRM (Extra → Tolleranza di produzione). Spenta = misura esatta ovunque: riepilogo, carrello, scheda ordine.
v1.136.2 27/07/2026
Ricerca: via il «/sito» doppio nei link dei risultati
- Cliccando un risultato della ricerca si finiva su
/sito/sito/prodotto/…(pagina inesistente): rendendo i link localizzati (1.131.0) avevo passatoentityUrl()elocalizePath()dentrourl(), ma quelle funzioni la base/sitola mettono già (SearchBox.tsx). Vale per il clic sul risultato, per l'Invio da tastiera e per «Vedi tutti i risultati».
v1.136.1 27/07/2026
Carrello: anteprima a fianco della foto, e angoli arrotondati proporzionati
- Nel carrello (e quindi nel checkout) foto prodotto e anteprima della configurazione stanno affiancate, non più incolonnate: entrambe si ingrandiscono con un clic (CartPage.tsx).
- Angoli arrotondati proporzionali: il raggio è ora il 15% del lato corto invece di un valore in pixel calcolato sul riquadro piccolo — ingrandendo l'anteprima gli angoli crescono con essa (su un'anteprima a schermo pieno sono ~120 px) (Configurator.tsx →
roundedPx). Stessa percentuale nell'immagine salvata nel carrello.
v1.136.0 27/07/2026
Anteprima grande: bande sui lati giusti, e anteprima del carrello com'è davvero
- Nell'anteprima ingrandita si vedevano solo le bande sopra e sotto: quel riquadro aveva una copia del codice delle bande, ferma alla vecchia regola dei lati lunghi e ai 7 cm. Ora usa lo stesso componente dell'anteprima piccola, con lo spessore ricalcolato sulla scala del box (Configurator.tsx).
- L'immagine dell'anteprima salvata nel carrello (e usata in scheda ordine e PDF) mostrava un rettangolo pieno: non disegnava né bande safety né angoli arrotondati né quote. Ora le disegna tutte, comprese le barre con larghezza e altezza in cm (rasterizeRugPng).
v1.135.0 27/07/2026
Codice articolo: in pagina, nel carrello e sull'ordine
- Pagina prodotto: sotto il titolo compare il Codice articolo (
pd.skuin IT/EN/DE) — serve al cliente per riordinare e per citarlo all'assistenza (ProductLive.tsx). - Carrello e checkout: ogni riga mostra il proprio codice (CartPage.tsx).
- Il codice è quello della MISURA scelta, non più solo quello del prodotto: se la misura standard ha il suo articolo (es.
SED010701) è quello che finisce in carrello, ordine, email e PDF; in banda e rotolo si usa il codice della riga di listino, e solo in mancanza di tutto si ricade sul codice prodotto (Configurator.tsx →effectiveSku, con lo SKU della misura ora portato dallo schema). - Nell'email dell'ordine la riga «SKU:» non compare più vuota quando il codice manca (order.ts).
v1.134.1 27/07/2026
Bande safety: 5 cm, la misura vera
- Nell'anteprima le bande erano disegnate da 7 cm: la banda safety è 5 cm (Configurator.tsx →
SAFETY_BAND_CM). Cambia solo il disegno, non il prezzo.
v1.134.0 27/07/2026
Anteprima del configuratore: bande safety sui lati scelti e angoli arrotondati
- L'anteprima disegna le bande safety sui lati impostati nel CRM (alto/destra/basso/sinistra, anche tutti e quattro); senza impostazione resta il comportamento di prima, i due lati lunghi (Configurator.tsx).
- Angoli arrotondati quando il prodotto ha «Bordo arrotondato»: raggio proporzionale al lato corto, applicato anche all'anteprima piccola della barra sticky (configSchema.ts porta i due campi dal CRM).
v1.133.0 27/07/2026
Banda e rotolo: la misura si legge come il prodotto sta a terra
- Per i prodotti non orientabili (i Coba lo sono tutti) banda e rotolo intero registrano la misura con il lato lungo come larghezza: «1830 × 90 cm» invece di «90 × 1830 cm», in linea con i formati standard (90×60h, 150×90h) (Configurator.tsx →
landscape). Il prezzo non cambia: la fascia banda si riconosce da entrambi i lati.
v1.132.0 27/07/2026
Banda: lunghezza da inserire davvero, niente più righe a 0,00 €
- Etichetta sempre «Lunghezza (cm)» nella banda fissa (prima diceva «Altezza (cm)» quando la banda era orizzontale) e placeholder «Inserisci la misura in cm» (Configurator.tsx).
- Campo vuoto di default: la lunghezza non nasce più preimpostata a 100/altezza corrente, così si legge il placeholder e il campo lampeggia finché non lo si compila.
- Bug: si andava avanti senza misura. Lo step Misura era considerato «sempre completo», quindi con la banda vuota si arrivava al carrello con una riga tipo «90 × 9 cm» a 0,00 €. Ora lo step è completo solo con una misura VALIDA: campo pieno e dentro min/max per banda e misura libera, card scelta per misure standard e rotolo (se la misura standard è una sola vale come già scelta).
- Mai più righe a 0 €: «Aggiungi al carrello» resta bloccato anche se il totale calcolato è 0, qualunque ne sia la causa (misura mancante o listino incompleto).
- Messaggi guida per modalità: «Inserisci la misura in cm (dentro il minimo e il massimo consentiti)» per banda/misura libera, «Scegli la misura» per standard/rotolo — in IT/EN/DE (dictionary.ts).
v1.131.0 26/07/2026
Tutto nella lingua della pagina: assistente, voce, ricerca e carrello
- La voce diceva «effe di greeting»: i messaggi introduttivi del «Trova il prodotto ideale» sono salvati come CHIAVE (
fd.greeting) e venivano tradotti solo a schermo — al TTS arrivava la chiave nuda. Ora si traducono prima di parlare, di pre-sintetizzare e di partire verso l'AI (ProductFinder.tsx). - Nuovo saluto del finder: «Ciao! Rispondi a qualche domanda e ti aiuto a trovare il prodotto più adatto alle tue esigenze…» in IT/EN/DE (dictionary.ts).
- Finder con testi più grandi: bolle
text-base/sm:text-lg, pulsanti delle domande più grandi e in grassetto, campo e invio ingranditi. - Voce nella lingua della pagina:
speak()riceve la lingua e il fallback Web Speech usa la voce giusta (era cablato suit-IT) (tts.ts). - Chatbot tradotto per davvero: titolo, segnaposto, «Invia» e i tooltip erano cablati in italiano; ora sono chiavi in IT/EN/DE. E la conversazione salvata in sessione viene riavviata quando cambia la lingua (prima, passando da IT a DE, restava tutto in italiano, saluto compreso) (ChatAgent.tsx).
- Ricerca dell'header nella lingua giusta: nuovo indice per lingua
/<lang>/search-index.json; su /de si cerca tra i nomi tedeschi e i risultati portano a/de/produkt/…(prima indice e link erano sempre italiani) (SearchBox.tsx, [[lang]/search-index.json.ts](sito/src/pages/%5Blang%5D/search-index.json.ts)). - Carrello senza lingue mescolate: il nome nella riga era quello salvato all'aggiunta, quindi un prodotto messo dal sito italiano e uno dal tedesco convivevano in due lingue. Ora nome e alt si rileggono dall'indice della lingua corrente per id prodotto, con fallback al salvato (CartPage.tsx, mini-carrello in Header.astro via
<html data-search-index>in Base.astro).
v1.130.0 26/07/2026
Pulsante viola «Guida all'installazione» in pagina prodotto
- Quarto pulsante accanto a Configura · Scheda tecnica · Certificati: Guida all'installazione, viola (
bg-violet-600), con la stessa logica degli altri — un file apre il PDF, più file aprono l'elenco (ProductLive.tsx). - Con 4 pulsanti la griglia passa a due righe da due (in fila diventavano stretti e le etichette andavano su tre righe); con 3 restano in fila.
guidesnel mapper del catalogo (catalog.ts, types.ts) e chiavipd.guide/pd.guidesin IT/EN/DE (dictionary.ts).
v1.129.0 26/07/2026
Banda fissa e misura libera in grande, e nessun «1.» quando lo step è uno solo
- Banda fissa ridisegnata: lato banda e misura da scrivere sulla stessa riga, card e campi grandi come nelle Misure standard (Configurator.tsx).
- Il campo da compilare lampeggia finché è vuoto (
.fm-need-value, colore accento) — vale per la lunghezza della banda e per larghezza/altezza della misura libera, con placeholder d'esempio (global.css). Con «riduci le animazioni» resta un bordo arancione fisso. - Misura libera in grande: etichette e campi allineati allo stile delle Misure standard.
- Un solo step = niente numerazione: nella barra arancione spariisce il «1» e sotto non si ripete più il titolo «1. Misura» (quella riga portava solo un «←» disabilitato). Con lo step Modello attivo la numerazione del titolo ora combacia con quella delle tab.
v1.128.0 26/07/2026
Card misura più grandi e a righe piene, scheda tecnica che scorre in dissolvenza
- Misure e prezzi più grandi nelle card di «Misure standard» e «Rotolo intero»: misura
text-base/sm:text-lgin grassetto, prezzotext-sm/sm:text-base, padding da 3 a 4 (Configurator.tsx). - Colonne in base a quante misure ci sono, così le righe restano piene e le card grandi il più possibile: 1–2 → metà riga · 3 → terzi · 4 → due righe da 2 · 5, 6, 7… → terzi. Su mobile una card sola sta a tutta larghezza, altrimenti due per riga (
sizeCardGrid). - Scheda tecnica: cambio pagina animato — la pagina esce in fade + slide verso il lato in cui si sfoglia e la nuova entra dall'altro (170 ms fuori, 260 ms dentro) (ProductLive.tsx, global.css). Con «riduci le animazioni» attivo il cambio è istantaneo, senza rimanere bloccato in attesa dell'animazione.
v1.127.1 26/07/2026
Anteprima del configuratore: mai la foto del prodotto, nero se non c'è colore
- Senza un colore scelto l'anteprima riempiva il rettangolo delle misure con la foto del prodotto ritagliata
cover: sembrava il tappeto configurato (visto su «Diamond Tread — Tappeto Antifatica per Saldatori»). Ora l'anteprima mostra solo il pattern o il colore scelto e, se non c'è nulla, resta nera (Configurator.tsx).
v1.127.0 26/07/2026
Pagina prodotto: pulsanti pari e in minuscolo, galleria più stretta sotto i 1180px
- Pulsanti senza MAIUSCOLE («Configura il prodotto», «Scheda tecnica», «Certificati»): via
uppercaseetracking-wide(ProductLive.tsx). - Certificati pieno azzurro (
bg-sky-500) invece del contorno arancio: stessa forma della scheda tecnica, colore diverso. - Altezze uguali: i pulsanti documenti non si stiravano nella cella della griglia (45 / 41 / 45 px misurati) e sotto i 1180px, con le etichette a capo, la differenza si vedeva molto. Ora contenitore e pulsante hanno
h-full. - Sotto i 1180px la galleria si stringe (colonna 420 → 360px): foto e miniature rimpiccioliscono in proporzione. Nuovo breakpoint
wide: 1180px(tailwind.config.mjs). - Cerchio con la descrizione dentro: le descrizioni incollate da ChatGPT nel CRM portavano dietro il cromo della sua interfaccia (avatar tondo
gizmo-bot-avatar, classibg-token-*) e il testo finiva dentro un cerchio da 32px. NuovostripPastedChromeche toglieclass/stylesolo ai tag con quelle impronte (pastedHtml.ts). Da ripulire comunque nel CRM: 4 prodotti hanno il campo «descrizione breve sito» sporco.
v1.126.0 26/07/2026
Pulsante «Certificato» in pagina prodotto, con elenco quando i file sono più di uno
- In pagina prodotto compare il pulsante Certificato accanto a Scheda tecnica (in CRM 3.296.0 il dato arrivava ma nessuno lo mostrava). Con un solo documento il pulsante apre il PDF; con più documenti apre l'elenco, e ogni riga porta l'etichetta del documento — già tradotta dal CRM (ProductLive.tsx).
- Con tre pulsanti in riga (Configura · Scheda tecnica · Certificato) si stringono tutti e tre — altezza e testo ridotti, griglia a 3 colonne — invece di far andare a capo le etichette. Con uno o due restano grandi come prima.
- Il catalogo espone i documenti raggruppati per pulsante (
datasheets,certificates), tenendo la scheda tecnica principale come primo elemento (è quella allegata a ordini e preventivi) e leggendo anche il certificato unico dei prodotti non ancora ri-salvati (catalog.ts, crm/localize.ts). - Nuove chiavi
pd.certificate,pd.certificates,pd.docsClosein IT/EN/DE (dictionary.ts).
v1.125.0 26/07/2026
Suggerimento «aggiungi m²»: solo quando manca poco, e con lo sconto scritto
- Il nudge della fascia successiva compariva sempre, anche quando serviva quasi il doppio del prodotto (0,51 m² → «+0,49 m² → 75,00 €/m²»): ora si mostra solo se manca al massimo il 5% dell'area attuale, altrimenti è un consiglio inutile (Configurator.tsx).
- Quando si mostra, il messaggio è completo e dice anche quanto si risparmia: «Aggiungi 0,2 m² per avere lo sconto del 12% (75,00 €/m²)». Lo sconto è calcolato sul €/m² della fascia attuale (o sul prezzo base se non si è ancora in fascia). Nuova chiave
cfg.nudgeAddPctin IT/EN/DE (dictionary.ts); i m² sono formattati nella lingua della pagina («0,2» / «0.2»).
v1.124.1 26/07/2026
«Avanti» nel configuratore: l'header sticky non copre più il balloon guida
- Lo scroll al cambio step lasciava sotto l'header il balloon «Scegli il bordo perimetrale → poi premi Avanti» e le tab:
scroll-mtdesktop da 7rem (112px) a 177px (+65) in Configurator.tsx e TechnicalConfigurator.tsx. Su mobile l'offset resta quello calcolato su header + anteprima sticky.
v1.124.0 26/07/2026
Pagine a 1460px, sidebar configuratore 370px, badge pagamento su una riga
- Container delle pagine pubbliche 1320 → 1460px (contenuto 1412px). Resta un massimo: sotto quella soglia la pagina è fluida (tailwind.config.mjs).
- Sidebar del configuratore 360 → 370px, anteprima prodotto
PREV_MAX_W236 → 246 (Configurator.tsx, TechnicalConfigurator.tsx). - Badge «Pagamenti sicuri» su una sola riga: i 5 badge sforavano di ~3px e «stripe» finiva a capo da solo; chip con
px-1.5e gap1invece di1.5(PaymentBadges.tsx).
v1.123.0 26/07/2026
Footer: claim a capo, orario rimosso, email e social in quarta colonna
- Tagline su due righe: «Configura, ordina, ricevi» va a capo rispetto alla frase descrittiva. Lo spezzone si calcola sul primo punto del testo, quindi vale in tutte le lingue anche quando la tagline arriva tradotta dal CRM (Footer.astro).
- Orario di apertura rimosso dal footer in tutte le lingue: via la riga
fm-footer-hourse l'aggiornamento live che la riempiva (Footer.astro, Base.astro). Il campo «Orari» resta nelle impostazioni del sito, semplicemente non è più stampato. - Quarta colonna «Email e social»: la griglia passa a 4 colonne su desktop; email e link social escono da «Contatti», che tiene telefono e indirizzo. Nuova chiave
footer.emailSocialTitlein IT/EN/DE (dictionary.ts).
v1.122.0 26/07/2026
Configuratore: colonna riepilogo 340 → 360px
- La sidebar del configuratore (riepilogo prezzo, «Completa configurazione», «Salva preventivo») passa da 340 a 360px (Configurator.tsx, TechnicalConfigurator.tsx).
- Di conseguenza l'anteprima del prodotto nella sidebar guadagna 20px di larghezza utile:
PREV_MAX_W216 → 236 (le quote intorno al riquadro restano dentro il box).
v1.121.0 26/07/2026
Pagine pubbliche più larghe: container 1200 → 1320px
- La larghezza massima di tutte le pagine pubbliche (classe
.container-site) passa da 1200 a 1320px; il contenuto reale è 1320 − 48 (px-6) = 1272px (tailwind.config.mjs).
v1.120.0 26/07/2026
Configuratore, prezzi a fascia e menu: ultimi testi rimasti in italiano
- Segnaposto mostrati alla lettera:
tr()in ProductLive.tsx scartava i parametri, quindi in pagina compariva «Show full spec ({n} features)» e «Dispatched within {n} working days». Ora i parametri passano. - Fasce di prezzo tradotte: «da 0 a 1 m²» →
band.from/band.over/band.fromLm/band.overLmin ProductLive.tsx e Configurator.tsx. - Etichette degli step «Colore»/«Misura»/«Quantità e prezzo»: nascono come default italiani in configSchema.ts e vincevano sul dizionario. Quando sono ancora quelle di default ora vince il dizionario; l'etichetta personalizzata dal negozio resta e si traduce come contenuto (Configurator.tsx).
- Etichette step del prodotto: se la traduzione non le contiene, quelle italiane standard non vengono più propagate sulle pagine estere (localize.ts).
- Voci di menu senza categoria dietro (gruppi del mega-menu, es. «Accessori di sicurezza»): ora passano dalla mappa librerie, prima ricadevano sempre sull'italiano (Header.astro, SiteNav.tsx).
- Altri testi tradotti: «Pagamenti sicuri» (PaymentBadges.tsx), «Vedi descrizione completa», «Salva preventivo · Ricevi sulla mail», «Con/Senza grafica», «Rotolo intero», «Bordo/Profilo», «Quantità pezzi».
- Dizionario: +10 chiavi in IT/EN/DE e 2 voci italiane mancanti (
cfg.bordo,cfg.dimensioniPersonalizzate) che sul sito italiano avrebbero stampato la chiave nuda (dictionary.ts).
v1.119.1 26/07/2026
Meno «prodotto non trovato»: attesa del bridge portata a 25 secondi
- Le letture dal CRM scadevano dopo 8 secondi: allo scadere il sito ripiegava silenziosamente sui dati d'esempio, e la pagina prodotto rispondeva «prodotto non trovato» pur essendo il prodotto presente. Con tabelle grosse il bridge può richiedere diversi secondi (vedi CRM 3.295.1): timeout alzato a 25s (src/lib/bridge.ts). Meglio attendere che servire una pagina sbagliata.
v1.119.0 26/07/2026
L'assistente parla la lingua della pagina · privacy e cookie non danno più 404
- La chat risponde nella lingua della pagina. Il prompt imponeva l'italiano: su
/ene/deFlora rispondeva «posso assisterti solo in italiano». Ora il sito manda la lingua e l'assistente è vincolato a usarla, sia nel chatbot sia nel finder «Trova il tuo prodotto». Tradotto anche il saluto iniziale (public/chat.php, src/components/ChatAgent.tsx, src/components/ProductFinder.tsx). /en/privacye/en/cookiedavano 404: il footer tradotto puntava a pagine inesistenti. Ora esistono in tutte le lingue con segmento tradotto (/de/datenschutz,/de/cookies) e hreflang reciproci. Il testo resta in italiano: ha valore legale e va tradotto da chi lo ha redatto, non dall'AI (src/components/legal/, [src/pages/[lang]/[page].astro](src/pages/)).- Corpi delle pagine legali estratti in componenti condivisi: una sola fonte per la rotta italiana e per quelle tradotte.
v1.118.0 26/07/2026
Configuratore e pagina prodotto tradotti · niente più lampeggio
- Tradotti (con inglese e tedesco nel codice, senza attendere il giro AI): «Configura il prodotto», «Scheda tecnica», «A partire da», «Spedito entro N giorni lavorativi», «Domande frequenti», «Estendi/Riduci scheda tecnica», «Ingrandisci a schermo pieno», «Completa la configurazione», «Aggiungi al carrello», «Salva preventivo», «Passo N di M», «Avanti: …», il messaggio guida («INIZIA QUI: …→ poi premi Avanti»), il box Trova il tuo prodotto per intero e «Bonifico Bancario».
- Fix del lampeggio: in fase statica il server rendeva sempre in italiano perché
currentLocale()non hawindow, poi il browser ri-renderizzava nella lingua vera — React segnalava un disallineamento (#418/#425) e i testi cambiavano un istante dopo l'apertura. Ora il layout dichiara la lingua prima di renderizzare (src/lib/i18n.ts, src/layouts/Base.astro). - La lingua viene passata anche a galleria, recensioni e badge pagamento.
- Verificato con browser reale su IT/EN/DE: zero errori JS.
v1.117.1 26/07/2026
Footer bar: anteprima prodotto più grande (75×75)
- Nella barra a comparsa del configuratore l'immagine di anteprima passa da 48×48 a 75×75 px, con il padding verticale ridotto (
lg:py-3→lg:py-1.5) così la barra non si alza (src/components/Configurator.tsx).
v1.117.0 25/07/2026
Fix: pagina prodotto vuota («locale is not defined»)
- Le pagine prodotto non caricavano più il prodotto, in tutte le lingue: nel configuratore una dipendenza di
useMemoreferenziavalocale, che in quel componente non era mai stato definito →ReferenceErrorall'idratazione, React smontava l'isola e restava una pagina vuota. Introdotto durante la migrazione dei testi (src/components/Configurator.tsx). - La lingua ora viene PASSATA al configuratore invece di essere dedotta dall'URL: dedurla faceva divergere il render del server (che non ha
window) da quello del browser (src/components/ProductLive.tsx, src/components/TechnicalConfigurator.tsx). - Eliminata una trappola sistemica: la funzione di traduzione era importata come
t, nome usato ovunque come variabile di callback — bastava una chiamata dentro una.map((t) => …)per avere «t is not a function». Ora si chiamai18nin tutti i 33 file.
v1.116.1 25/07/2026
Footer: ragione sociale, versione rimossa, voci legali tradotte
- Copyright del footer: «© 2026 In & On srl» al posto di «Floormad — Sito gestito dal CRM».
- Rimossa la versione del sito dalla riga in fondo (era un dato interno, non per i clienti).
- Privacy Policy, Cookie Policy e Preferenze cookie tradotte, con inglese e tedesco inclusi nel codice (src/components/Footer.astro, src/lib/dictionary.ts).
v1.116.0 25/07/2026
Fix pagina bianca sui prodotti · 404 · home estera come l'italiana
- Fix pagina bianca su alcuni prodotti.
ReviewBadgesusava la funzione di traduzione senza averla definita: ReferenceError a idratazione, React smontava l'albero e restava una pagina vuota dopo «Loading product…». La build non poteva intercettarlo perché in fase statica la pagina prodotto mostra solo il caricamento: il configuratore e i componenti sotto girano solo nel browser (src/components/ReviewBadges.tsx). - Fix 404 su
/en/product/<slug-italiano>: gli slug importati portano spesso un suffisso di disambiguazione (-1), ma i link in giro usano la base. Le pagine tradotte ora generano l'alias anche senza suffisso, come già faceva quella italiana ([src/pages/[lang]/[section]/[slug].astro](src/pages/)). - La home estera ora è quella italiana tradotta, non un layout diverso: se non esiste una home dedicata alla lingua si usa la pagina builder «home» con i testi tradotti ([src/pages/[lang]/index.astro](src/pages/), src/builder/localize.ts).
- Contenuti del builder tradotti ovunque compaiano (barra servizi, header, footer, home, categorie personalizzate) (src/builder/loadPage.ts).
- Filtri del catalogo traducibili: «Colore», «Spessore», «Caratteristiche» e le famiglie colore (Bianco, Nero, Grigio…), con inglese e tedesco già inclusi.
- Corretta la freccia doppia in «Find your ideal product → →».
v1.115.0 25/07/2026
Configuratore, cookie, area clienti e blog traducibili
- ~190 testi migrati a dizionario in una passata esaustiva su tutti i componenti visibili al cliente. Le card del configuratore, i preset del bordo, i nomi degli step e i badge di stato erano valori in oggetti letterali, non testo JSX: nessuna delle passate precedenti li vedeva (src/components/Configurator.tsx, src/components/Account.tsx, src/components/CookieBanner.tsx).
- Risolti tre errori che la sola analisi statica non intercetta e che rompevano la build:
tr()usato in costanti di modulo (eseguite prima che esista), in una funzione non-componente (buildSteps, ora riceve la funzione di traduzione come parametro) e un import duplicato. - Ultimi testi del guscio: etichetta carrello, Cookie Policy, Preferenze cookie.
v1.114.0 25/07/2026
Fix: il menu tornava italiano un istante dopo il caricamento
- Il menu tradotto veniva sovrascritto dopo l'idratazione.
SiteNavrilegge le impostazioni dal server a ogni caricamento (per applicare le modifiche del Menu builder senza redeploy) e rimpiazzava il menu tradotto con quello italiano grezzo: si vedeva il menu cambiare lingua per un istante e poi restare in italiano. Ora la rilettura passa dallo stesso localizzatore e la cache di sessione è separata per lingua (src/components/SiteNav.tsx, src/components/Header.astro). - Tradotti gli ultimi testi del guscio: footer (Azienda, Contatti, Come funziona, Catalogo, Area rivenditori), etichette accessibili di carrello, ricerca, changelog e assistente, badge pagamenti.
- La barra promo e gli altri testi scritti nelle impostazioni del sito ora passano dalla mappa di traduzione del CRM (src/lib/i18n.ts).
- Frase della fascia di sconto ricostruita con segnaposto, così è traducibile per intero.
v1.113.0 25/07/2026
Configuratore, carrello e recensioni traducibili · date nella lingua giusta
- 88 testi migrati a dizionario nei componenti del percorso d'acquisto: configuratore (standard e tecnico), carrello, pagina prodotto, simulatore AI, finder, recensioni. Erano cablati in italiano e nessuna traduzione poteva raggiungerli (src/lib/dictionary.ts).
- Date nella lingua della pagina: la consegna stimata mostrava «29 luglio 2026» anche in inglese e tedesco. Nuovo
formatDateper lingua (29 July 2026 · 29. Juli 2026) (src/components/ProductLive.tsx). - Nuovo endpoint
/sito/locales.jsoncon le lingue presenti nella build, letto dal CRM per dire cosa è davvero online (src/pages/locales.json.ts).
v1.112.2 25/07/2026
Un link vecchio non dà più «Product not found»
- Il prodotto si risolve ora su tutti i permalink noti — italiano, di ogni lingua e quelli dismessi — non solo su quello corrente. Un link già in circolazione, o una pagina generata prima di una ri-traduzione, continua a funzionare invece di mostrare «Product not found» (src/data/catalog.ts).
- Le pagine tradotte generano l'alias su ogni permalink noto, con canonical su quello buono: nessun 404 e nessun contenuto duplicato per Google ([src/pages/[lang]/[section]/[slug].astro](src/pages/[lang]/[section]/[slug].astro)).
v1.112.1 25/07/2026
Rimosso l'ingranaggio dalla topbar
- L'icona ingranaggio accanto alla versione è stata rimossa dal sito pubblico: la scorciatoia alla Configurazione vive nella sidebar del CRM (src/components/Header.astro).
v1.112.0 25/07/2026
Menu, header e footer tradotti · icone tradotte · niente pagine stantie
- Menu tradotto senza lavoro manuale: le voci del Menu builder hanno una sola etichetta italiana, ma quasi tutte puntano a una categoria o a un prodotto — l'etichetta viene ora risolta dal catalogo tradotto tramite lo slug nell'href (46 voci su una pagina tipo). Le voci scritte a mano possono usare
labelByLocale(src/components/Header.astro, src/components/SiteNav.tsx). - Guscio del sito tradotto: area clienti, carrello e mini-carrello, «Configura ora», ricerca, barra promo, barra «Trova il tuo prodotto ideale», footer — 22 testi in IT/EN/DE (src/lib/dictionary.ts).
- Icone e classificazioni tradotte nei badge prodotto e nei filtri del catalogo, dalla libreria tradotta nel CRM (src/data/catalog.ts).
- Niente più pagine stantie dopo una traduzione: tradurre un prodotto ne cambia il permalink, e il deploy carica i file senza cancellare i vecchi → la pagina al vecchio indirizzo restava online, con contenuti d'epoca e indicizzabile come duplicato. Ora si rigenera anche al vecchio slug, con canonical su quello nuovo ([src/pages/[lang]/[section]/[slug].astro](src/pages/[lang]/[section]/[slug].astro)).
- Riconosciute 9 lingue nelle rotte, con segmenti di percorso tradotti (src/lib/i18n.ts).
v1.111.2 25/07/2026
Topbar: ingranaggio per la Configurazione CRM
- Accanto al badge di versione nella topbar compare un'icona ingranaggio che porta alla Configurazione del CRM (
crm.floormad.com/#/settings) (src/components/Header.astro).
v1.111.1 25/07/2026
Fix: da una pagina tradotta ogni link riportava al sito italiano
- Navigazione localizzata. Su una pagina
/deo/enil logo, le voci di menu, il mega-menu, il carrello, l'area clienti e il footer puntavano tutti al sito italiano: bastava un clic per uscire dalla lingua. Ora ogni link del guscio viene riscritto nella lingua della pagina, segmento e slug compresi (/sito/categoria/zerbini→/sito/de/kategorie/<slug-tedesco>), risolvendo i permalink tradotti dal catalogo (src/components/Header.astro, src/components/Footer.astro, src/lib/i18n.ts). - Il selettore lingua resta sulla stessa pagina: prima riportava sempre alla home. Ora usa la versione tradotta dichiarata negli hreflang; se quella pagina non esiste ancora in quella lingua ripiega sulla home localizzata (mai un 404) (src/components/LocaleSwitcher.astro).
- Testi d'interfaccia dal CRM: il sito applica sopra i dizionari inclusi nel codice le traduzioni generate nel CRM, e le passa anche ai componenti interattivi. Una lingua creata dal CRM funziona quindi senza modifiche al codice del sito (src/lib/dictionary.ts, src/layouts/Base.astro).
v1.111.0 25/07/2026
Frontend più leggero: changelog e barra admin on-demand, miniature ottimizzate
- CHANGELOG.md fuori dal chunk della dashboard: i ~240 KB di testo erano importati con
?rawe viaggiavano con/sito/admin(chunk 243 KB). Ora import dinamico al primo clic sulla versione (src/components/AdminDashboard.tsx). - Barra amministratore dietro un gate:
AdminBar(~11 KB + dipendenze notifiche) veniva scaricata e idratata su ogni pagina da ogni visitatore anonimo, per poi non disegnare nulla. Il nuovoAdminBarGatelegge il token admin e carica la barra solo se c'è (src/components/AdminBarGate.tsx, src/layouts/Base.astro). - Miniature attraverso
img.php: la griglia del catalogo serviva le immagini prodotto originali (misurato un PNG da 1.355 KB su una card larga ~400 px). Oraimg()+srcsetresponsive (320/480/640) in catalogo, e proxy anche su carrello, indice blog e risultati di ricerca (src/components/CatalogBrowser.tsx, src/components/CartPage.tsx, src/components/BlogIndexLive.tsx, src/components/SearchBox.tsx).
v1.110.1 25/07/2026
Fix selettore lingua nell'header (non compariva)
- Il selettore lingua non appariva nell'header. Tre cause, tutte corrette:
- Promemoria in *Lingue & Mercati*: il sito è statico, quindi pagine tradotte, selettore e hreflang nascono alla pubblicazione del sito — attivare una lingua nel CRM non basta (components/settings/LocalesSettings.tsx).
v1.110.0 25/07/2026
imagen.php: provider Higgsfield (modelli hf:*) + override modello
public/imagen.phpinstrada i modelli **hf:*(es.hf:soul) sull'API Higgsfield** (submit + polling async) usando Key ID + Secret dai settings CRM; per gli altri usa Gemini. Aggiunto overridemodelper-richiesta (allowlist) per forzare il motore da CRM (es. fallback Gemini se i crediti Higgsfield sono esauriti) (public/imagen.php).
v1.109.0 25/07/2026
Nessun token nel codice del sito (segreti in `admin_secret.php`)
- Token interni ora letti da
public/admin_secret.php(sul server, gitignored) o dalle envFM_*, con fallback vuoto e fail-closed:SRV_TOKEN(versoemail.php), i token dei cron dipostsale.php,chatscan.php,backup.php,supportscan.php, il segreto admin direviews.phpe quello di reset contatore inordernum.php. Modello da copiare: [public/admin_secret.php.example](public/admin_secret.php.example). - Sostituiti i
constcondefine()+if (!defined(…)): unconsta livello di file non era sovrascrivibile daadmin_secret.php, quindi il valore committato vinceva sempre e il file dei segreti era decorativo. supportscan.php: il gate del cron confrontava con===; a token non configurato una richiesta senza?tokensarebbe passata. Ora richiede token non vuoto e usahash_equals().- Impostazioni sito → Recensioni: il comando
curldel cron post-vendita non contiene più il token scritto nel bundle JS. La pagina lo chiede apostsale.php(nuova azionecron_url, protetta dal token admin), che lo legge daadmin_secret.php; se non è configurato lo dice invece di mostrare una URL rotta (src/components/SiteSettings.tsx, src/builder/storage.ts, public/postsale.php). backup.phpesponecronConfiguredinsieme acronUrl, e i token dei due jobbackup/supportscanhanno ora nomi distinti (BACKUP_CRON_TOKEN,SUPPORTSCAN_CRON_TOKEN): prima condividevano per forza lo stesso valore.- ⚠️ Dopo il deploy: creare
public/admin_secret.phpsul server con valori nuovi (i vecchi erano nel repo → compromessi) e aggiornare la crontab su cPanel.
v1.108.1 25/07/2026
La chat saluta il cliente loggato per nome
- Se il visitatore è loggato all'area clienti, l'assistente apre con «Ciao <nome>!» usando il nome di battesimo ricavato dall'anagrafica (referente o ragione sociale); per chi non è loggato il saluto resta quello di prima (src/components/ChatAgent.tsx).
- Il saluto non si ripete a ogni cambio pagina: viene mostrato una volta per sessione di navigazione.
v1.108.0 25/07/2026
Sito multilingua (IT/EN/DE) con URL e SEO dedicati + spedizione per paese
- Struttura URL per la SEO: italiano senza prefisso (
/sito/prodotto/<slug>), le altre lingue con prefisso e segmento tradotto —/sito/en/product/<slug-en>,/sito/de/produkt/<slug-de>,/sito/de/kategorie/…,/sito/en/catalog,/sito/de/katalog. Anche gli slug sono quelli tradotti nel CRM (src/lib/i18n.ts, [src/pages/[lang]/](src/pages/)). - hreflang reciproci su tutte le pagine tradotte *e* sulle corrispondenti italiane (senza reciprocità Google li ignora), con
x-defaultsull'italiano,og:localeeog:locale:alternate(src/layouts/Base.astro). - Sitemap multilingua: ogni URL porta i propri
xhtml:link rel="alternate", così le tre versioni sono riconosciute come stessa pagina in lingue diverse e non come contenuti duplicati (src/pages/sitemap.xml.ts). - Contenuti tradotti dal CRM: catalogo, categorie, prodotti e blog vengono letti con le traduzioni applicate *prima* del mapper — nomi, descrizioni, schede tecniche, FAQ, colori, attributi, title e meta description. I campi non tradotti ricadono sull'italiano (src/lib/crm/localize.ts, src/data/catalog.ts, src/lib/blog.ts).
- Selettore lingua nell'header (compare solo con più lingue pubblicate) e dizionario dell'interfaccia IT/EN/DE per bottoni, etichette, carrello e checkout (src/components/LocaleSwitcher.astro, src/lib/dictionary.ts).
- Spedizione per paese nel carrello: selettore del paese di consegna, peso stimato del carrello (dai pesi prodotto del CRM), opzioni di spedizione con costo e giorni di consegna, IVA del paese (regime OSS) e messaggio «da preventivare» quando la destinazione non è coperta. Costo, metodo, paese e peso vengono allegati all'ordine inviato al CRM e compaiono nella mail di conferma (src/lib/shipping.ts, src/lib/crm/shippingEngine.ts, src/components/CartPage.tsx, src/lib/order.ts).
- Nessun cambiamento visibile finché non si attiva: senza lingue pubblicate e senza calcolo spedizioni il sito resta identico a prima (italiano, spedizione inclusa, IVA 22%).
v1.107.1 24/07/2026
«Prova nel tuo ambiente» anche nella barra sticky in basso
- Il pulsante «Prova nel tuo ambiente» (AI) ora compare (a configurazione completa, se abilitato sul prodotto) anche nella barra arancione sticky in basso, sopra «Aggiungi al carrello» — non solo nel box «Il tuo prodotto» (src/components/Configurator.tsx).
v1.107.0 24/07/2026
Controllo AI del logo caricato (idoneità stampa) + extra lavorazione grafica
- Nello step Personalizzazione, caricando un logo raster (PNG/JPG) un controllo AI (
gemini-2.5-flashvia public/logocheck.php) ne valuta l'idoneità alla stampa: risoluzione bassa, sfocatura/pixelatura, artefatti, tratti o testo troppo sottili. Se non è ottimale compare un avviso con due scelte: caricare un altro file oppure procedere con +€20 di lavorazione grafica (aggiunti al totale + riga dedicata nel carrello). «Aggiungi al carrello» resta bloccato finché non si sceglie. SVG/PDF (vettoriali) sono sempre idonei (nessun controllo) (src/components/Configurator.tsx).
v1.106.1 24/07/2026
Fix "Failed to fetch" (timeout) nella generazione immagini
public/imagen.phpepublic/visualize.php:set_time_limit(120)per evitare che PHP si autotermini durante le generazioni AI lente (causa del "Failed to fetch"); il client CRM ritenta automaticamente una volta (public/imagen.php, public/visualize.php).
v1.106.0 24/07/2026
«Prova nel tuo ambiente» dal tappeto configurato + immagini gemini-2.5-flash-image
- Il pulsante «Prova nel tuo ambiente» (AI) ora compare nel configuratore, sopra «Aggiungi al carrello», solo a configurazione completa (e solo se abilitato sul prodotto nel CRM). Passa al simulatore l'anteprima rasterizzata del tappeto configurato (colore + bordo sui lati scelti + logo) e la descrizione della configurazione (misura, incasso, colore…), per una scena AI fedele e in proporzione. Rimosso il vecchio pulsante generico sotto la galleria (src/components/Configurator.tsx, src/components/ProductLive.tsx, src/components/ProductSimulator.tsx).
- Generazione immagini:
public/imagen.phpinstrada sugemini-2.5-flash-image(:generateContent, conimageConfig.aspectRatio) perché i modelli Imagen:predict(3 e 4) non sono più disponibili per le API key nuove (public/imagen.php). - Blog più visibile: la voce «Blog» è ora garantita nel menu header (aggiunta in coda se un menu personalizzato non la include) (src/components/Header.astro); in fondo alla home una striscia orizzontale scorrevole di anteprime articoli (dal più recente), live dal CRM e nascosta se non ci sono articoli (src/components/BlogCarouselLive.tsx, src/pages/index.astro).
v1.105.1 24/07/2026
Fix generazione immagini: fallback a Imagen 3
public/imagen.phpripiega su Imagen 3 (imagen-3.0-generate-002) quando è richiestoimagen-4.0-generate-001, ritirato da Google per i nuovi account (public/imagen.php).
v1.105.0 24/07/2026
Blog pubblico (/blog) + barra avvisi/ferie configurabile
- Indice /blog con lista LIVE (
client:load): i nuovi articoli compaiono senza rebuild; le pagine articolo sono pre-generate per la SEO in/blog/[slug](src/components/BlogIndexLive.tsx, src/components/BlogLive.tsx, src/lib/blog.ts); inclusi nel sitemap. - Chatbot: quando pertinente suggerisce un articolo del blog (
recommendBlogSlug) accanto ai prodotti (public/chat.php, src/components/ChatAgent.tsx).
v1.104.0 24/07/2026
Redirect permalink storici (migrazione floormad.com)
- Generatore mappa build-redirects.mjs (
npm run redirects:build, oppure la GitHub Action manuale «Genera mappa redirect»): scarica la sitemap del vecchio sito (mentre WP è ancora online) e la incrocia coi prodotti/categorie del CRM (match:crmPublishedUrlesatto → slug → slug-base senza-N→ nome). Scrive public/redirects.generated.json (mappa 301, da committare: resta valida dopo la dismissione di WP) eredirects.report.json(non-matchati da rivedere). Slug/percorso identici → nessuna regola. - Handler runtime public/_redirect.php: tutte le richieste che non sono file reali passano di qui (via
.htaccess). Ordine: override manuali → mappa auto →301/302(con conteggio hit best-effort); altrimenti fallbackprodotto-live(comportamento preesistente) o404sobrio. Base-agnostic: funziona sotto/sitoe alla root del dominio. - Gestione dal backend: nuova tile Redirect in AdminDashboard → pagina redirect.astro / RedirectsAdmin.tsx per aggiungere/modificare/eliminare redirect manuali (che vincono su quelli automatici) e testare un URL. Persistenza server-side via public/redirects.php in
_redirects/manual.json(fuori dadist→ sopravvive ai redeploy), stessa auth HMAC dipages.php. - .htaccess: i miss ora passano dall'handler unico prima del fallback prodotto-live, così un vecchio slug indicizzato viene rediretto invece di mostrare "Prodotto non trovato" (public/.htaccess).
v1.103.0 24/07/2026
«Prova nel tuo ambiente»: simulazione fotografica AI in pagina prodotto
- Genera scena: l'AI crea una foto fotorealistica del prodotto in un'ambientazione scelta (Location), coerente col Posizionamento del prodotto (Interno / Esterno / Esterno coperto — filtra gli ambienti proposti) (src/components/ProductSimulator.tsx, src/components/ProductLive.tsx).
- Usa una tua foto: l'utente carica o scatta (fotocamera) una foto del proprio spazio → l'AI posiziona il tappeto sul pavimento mantenendo proporzioni e prospettiva realistiche rispetto alla foto.
- Motore: nuovo endpoint pubblico public/visualize.php — image-to-image con
gemini-2.5-flash-imagee chiave Gemini server-side (mai esposta), salva in_uploads. Limite giornaliero per visitatore + throttle per IP; gli admin (token builder presente) bypassano il limite e vedono il badge «Generazioni rimanenti: Admin Mode». - I campi
positioning/locations/activitiesarrivano dal CRM (vedi CRM 3.278.0) (src/data/catalog.ts, src/data/types.ts).
v1.101.1 21/07/2026
Imagen 4 come modello immagini di default
imagen.php: modello immagini di default aggiornato a Imagen 4 (imagen-4.0-generate-001); resta sovrascrivibile da Impostazioni CRM (aiFeatureConfig.imageGeneration.model). Usato dal nuovo generatore immagini AI del CRM (categorie/prodotti) (public/imagen.php).
v1.101.0 21/07/2026
"Trova il prodotto ideale": lettura vocale + audio condiviso col chatbot
- Il finder ora legge ad alta voce i messaggi come il chatbot, fin dall'apertura (rispetta il "muto" salvato) (src/components/ProductFinder.tsx).
- Aggiunto il pulsante audio on/off nell'header del finder.
- Preferenza audio condivisa col chatbot: disattivando l'audio in uno si disattiva anche nell'altro (e viceversa), in tempo reale, via evento
fm-voice+ chiavefloormad_chat_voice(src/components/ChatAgent.tsx).
v1.100.0 21/07/2026
Chatbot: nome assistente, saluto vocale, voce più rapida, card prodotto
- Voce più immediata: la lettura ora avviene frase per frase (le frasi si sintetizzano in parallelo e partono appena pronte) invece di attendere l'intera risposta; il TTS Gemini è ~proporzionale alla lunghezza, quindi la prima frase breve parte molto prima (src/lib/tts.ts).
- Nome assistente configurabile (default Flora): impostabile in Chat clienti → «Nome dell'assistente»; usato nel saluto «Ciao! Sono Flora, l'assistente Floormad…» (src/components/ChatsAdmin.tsx, src/lib/siteSettings.ts).
- Saluto letto ad alta voce all'apertura della chat: l'audio del saluto è pre-sintetizzato (
prime) così parte istantaneo; rispetta il pulsante muto (src/components/ChatAgent.tsx). - Card prodotto affidabile (chatbot + finder): foto (via
img()+ segnaposto se mancante/rotta) + titolo + breve descrizione + link. L'AI ora valorizza semprerecommendSkuquando nomina un prodotto e, in fallback, il server aggancia la card cercando il nome nel testo (sito/public/chat.php, src/components/ChatAgent.tsx, src/components/ProductFinder.tsx).
v1.99.1 21/07/2026
Chat/finder: risposta e audio molto più veloci
- Testo ~3x più rapido: disattivato il "thinking" di Gemini 2.5 Flash nella Q&A (
thinkingBudget: 0) +maxOutputTokens— la risposta passa da ~15s a pochi secondi (sito/public/chat.php). - Audio più immediato: la voce (Gemini TTS) sintetizza e riproduce SUBITO la prima frase mentre il resto viene sintetizzato in parallelo, invece di attendere l'intera risposta (src/lib/tts.ts).
v1.99.0 21/07/2026
Trova il prodotto ideale: layout, card prodotto e voce Gemini
- Widget più largo e più basso: modale da
max-w-lgamax-w-3xl, altezza desktop80vhcon tetto600px(src/components/ProductFinder.tsx). - Card prodotto più grande con foto + titolo: immagine instradata dall'helper
img()(proxy/resize) e segnaposto (icona) di fallback se l'URL è mancante/rotto, così niente più riquadro vuoto (src/components/ProductFinder.tsx). - Box delle domande ordinati e più grandi: da pill piccole a griglia (1 col mobile / 2 col desktop) con pulsanti ampi allineati a sinistra (src/components/ProductFinder.tsx).
- Voce sempre Gemini IT: il finder invia
forceGeminie il proxy fissa provider Gemini + chiave Gemini, a prescindere dall'override "Creazione Contenuti" (che può puntare a Claude) — scoped al solo finder (sito/public/chat.php).
v1.98.1 21/07/2026
Configuratore: card "Sottofondo" a tutta larghezza (50/50)
- Le 2 card dello step Sottofondo (Standard / Claw) ora occupano il 50%/50% dello spazio a tutta larghezza, con lo stesso stile degli altri step (es. Misura) — invece delle card strette a larghezza fissa (src/components/Configurator.tsx).
v1.98.0 21/07/2026
Configuratore: step "Sottofondo" (Standard / Claw) con sovrapprezzo €/m²
- Nuovo step "Sottofondo" nel configuratore (quando attivo sul prodotto/modello): 2 card fotografiche Standard vs Claw (fondo ad artigli), con sovrapprezzo €/m² sull'area fatturata. Immagini card globali dal CRM (src/components/Configurator.tsx, src/data/catalog.ts).
- La scelta entra nel prezzo live, nel riepilogo e nel carrello, e viene ripristinata riaprendo una configurazione salvata. Prezzo pubblico sul sito (retail); il prezzo rivenditore vale nel contesto B2B del CRM (src/lib/crm/configSchema.ts).
v1.97.0 20/07/2026
"Trova il prodotto ideale": assistente AI per la scelta del prodotto
- Nuovo product-finder guidato dall'AI: fa domande a catena (con chip di risposta rapida + campo libero) fino a consigliare il prodotto giusto (card con foto + link). Due modalità: *"Rispondi a poche domande"* e *"Descrivi la tua esigenza"*. Riusa il motore già esistente
chat.php(playbook di venditaaiSalesKnowledge+aiKnowledge/FAQ per prodotto): nessun nuovo backend (src/components/ProductFinder.tsx). - Barra "Trova il tuo prodotto ideale" sotto il megamenu, su tutte le pagine (src/components/ProductFinderBar.astro), montata in src/layouts/Base.astro.
- CTA "Non sei sicuro su quale prodotto scegliere?" in pagina prodotto, prima del configuratore (src/components/ProductLive.tsx). Entrambi gli ingressi aprono lo stesso assistente via evento
fm-open-finder.
v1.96.1 20/07/2026
Pagina prodotto: breve in pagina, descrizione prodotto in popup, più spazio ai titoli
- In pagina prodotto si mostra la descrizione breve (~600-700 char); il pulsante "Vedi descrizione completa →" ora apre la descrizione prodotto completa in popup (prima apriva la scheda tecnica) (src/components/ProductLive.tsx, src/data/catalog.ts, src/data/types.ts).
- Più spazio verticale prima dei titoli (
<h2>/<h3>) nel testo, così le sezioni si staccano bene (src/components/ProductLive.tsx).
v1.96.0 20/07/2026
Pagina prodotto: descrizione + popup scheda tecnica; fix contenuti tagliati su mobile
- Descrizione prodotto mostrata in pagina, con pulsante "Vedi descrizione completa →" che apre in popup la Scheda tecnica (descrizione estesa) in HTML formattato (per-modello per i prodotti combinati) (src/components/ProductLive.tsx, src/data/catalog.ts, src/data/types.ts).
- Fix contenuti tagliati su mobile: l'
overflow-x: clipsulbody(per la scrollbar fantasma desktop) nascondeva l'overflow invece di renderlo scrollabile, e la griglia prodotto (gridsenzagrid-cols-1) si dimensionava sulmax-contentsforando il viewport. Ora ilclipè solo su desktop (≥1024px) e la griglia usagrid-cols-1+min-w-0→ niente più tagli su mobile (src/styles/global.css, src/components/ProductLive.tsx). - Anteprima gallery: icona zoom sempre visibile su mobile (solo hover su desktop) (src/components/ProductGallery.tsx).
v1.95.0 20/07/2026
Chat sito su Claude quando Gemini è esaurito + fix icona "Configura il prodotto"
- Chat assistente: il proxy
chat.phpora usa Claude (via bridgeanthropic_proxy, chiave Anthropic condivisa dal CRM) quando *Creazione Contenuti* è impostata su Claude — prima era solo-Gemini, quindi con Gemini esaurito la chat non rispondeva (public/chat.php). - Fix pagina prodotto: l'icona del pulsante "Configura il prodotto" non salta più a sinistra quando l'etichetta va a capo (centratura inline invece di flex) (src/components/ProductLive.tsx).
v1.94.1 18/07/2026
Configuratore su misura: fix input Larghezza/Altezza (min/max)
- Fix "resta sempre a 0": quando un prodotto ha
max = 0(nessun massimo configurato), ilclamplo trattava come tetto reale e al blur forzava ogni valore a 0. Ora un min/max pari a0(o assente) significa "nessun limite" (src/components/Configurator.tsx). - Fix "non riesco a cancellare lo 0": i campi numerici (Su misura e Banda) usavano
value={numero}conNumber()||0→ lo0restava appiccicato e non si poteva svuotare per riscrivere. Ora il campo può essere vuoto (value={w || ''}) e si digita liberamente; rimosso anche l'attributomax="0"fuorviante (src/components/Configurator.tsx). - Il testo "Min …×… — Max …" mostra
–al posto di0quando un limite non è impostato.
v1.94.0 17/07/2026
Icone: sfumatura sotto i pallini + fumetto più stretto (200px)
- Sotto pallini/testo delle icone classificazione ora c'è una sfumatura bianco→trasparente (~20px) che li rende leggibili anche sopra immagini di sfondo (src/components/ProductLive.tsx).
- Tooltip (fumetto) delle icone: larghezza max ridotta a 200px → va a capo su più righe e non esce più dallo schermo (mobile resta toast centrato) (src/components/ProductLive.tsx).
v1.93.0 17/07/2026
Card prodotto: rimosso il tasto "Configura"
- Tolto il tasto "Configura"/"Scopri" dalle card prodotto (griglie catalogo/categoria): l'intera card è già cliccabile (src/components/ProductCardR.tsx, src/components/ProductCard.astro).
v1.92.0 17/07/2026
Categoria: rimosso il doppio scroll della sidebar
- Rimosso lo scroll interno della sidebar filtri (il "doppio scroll" risultava innaturale): torna la sticky semplice di prima (src/components/CategoryShop.tsx).
v1.91.0 17/07/2026
Categoria: scroll ai risultati sul filtro + filtri sticky con scroll proprio
- Al click su un filtro la vista torna in cima ai risultati (prima, accorciandosi la lista, si finiva a vedere il footer) (src/components/CategoryShop.tsx).
- ~~Su desktop la sidebar filtri è sticky con scroll interno~~ (rimosso in 1.92.0).
v1.90.0 17/07/2026
Footer: rimossa la colonna categorie
- Tolta (per il momento) la colonna "Prodotti" con l'elenco di tutte le categorie dal footer; griglia footer da 4 a 3 colonne (src/components/Footer.astro).
v1.89.0 17/07/2026
Carrello evidente, scheda tecnica collassabile, tooltip, pulsanti "fisici"
- Carrello header più evidente: pulsante bordato con icona colorata + badge con il numero prodotti; al passaggio del mouse (desktop) mini-carrello con elenco sintetico dei prodotti (foto, qtà × prezzo) e totale (src/components/Header.astro).
- Scheda tecnica su mobile ora collassabile: mostra le prime 8 righe + pulsante "Mostra altre caratteristiche" (su desktop resta tutto) (src/components/ProductLive.tsx).
- Due CTA prodotto allineate alla griglia del prezzo (grid 50/50 su desktop) (src/components/ProductLive.tsx).
- Tooltip icone: non escono più dallo schermo — su mobile diventano un toast centrato in basso (
max-w-[90vw]), su desktop restano ancorati all'icona (src/components/ProductLive.tsx). - Pulsanti selezionabili del configuratore con aspetto "tasto fisico": fondo bianco, hover che solleva con ombra, selezionato "schiacciato" (ombra quasi nulla) (src/components/Configurator.tsx).
- Anteprima galleria: le frecce ora fanno avanzare/tornare la foto (non solo le miniature) e riavviano il timer di autoplay; anche il click su una miniatura riavvia il timer (src/components/ProductGallery.tsx).
v1.88.0 17/07/2026
Pagina prodotto: 2 CTA + scroll config + tab step colorate
- Sotto il prezzo ora due pulsanti affiancati: "Configura il prodotto" (colore logo
#1d3157, scrolla al configuratore) e "Scheda Tecnica" (arancio, PDF, invariato) (src/components/ProductLive.tsx). - Cliccando Configura ora / Configura il prodotto lo scroll a
#configuralascia margine sopra (scroll-mt=--header-h+ 1.25rem) così si vede il banner "INIZIA QUI: Seleziona il colore → poi premi Avanti" (src/components/ProductLive.tsx). - Le tab degli step (Colore/Misura/Incavo/Personalizzazione) sono più grandi e a contrasto: attiva = arancio pieno, completata = blu pieno con ✓, da fare = bianca con bordo; su desktop si distribuiscono a tutta larghezza (src/components/Configurator.tsx).
v1.87.0 17/07/2026
Scheda tecnica: 2 colonne anche su mobile + wrapping
- La scheda tecnica ora mostra 2 colonne anche su mobile (3 su desktop se ≥9 righe). Su mobile etichetta e valore sono impilati e i valori lunghi vanno a capo su più righe (
break-words), così le righe crescono in altezza secondo necessità. - Aumentato lo spazio tra le colonne, soprattutto a 3 colonne (
gap-x-6→sm:gap-x-10→lg:gap-x-16) (src/components/ProductLive.tsx).
v1.86.0 17/07/2026
Scheda tecnica: colonne responsive (1/2/3)
- La griglia della scheda tecnica è responsive: 1 colonna su mobile, 2 su tablet, 3 su desktop quando ci sono molte righe (≥9) (src/components/ProductLive.tsx).
v1.85.0 17/07/2026
Scheda tecnica dal campo dedicato techSheet
- La sezione "Scheda tecnica" della pagina prodotto usa il campo dedicato techSheet (righe Etichetta→Valore) impostato/generato nel CRM; se vuoto, fallback alle specifiche derivate dagli attributi (src/data/catalog.ts).
v1.84.1 17/07/2026
Fix: rampa non visibile (id SVG duplicati)
- Gli id di gradienti/pattern SVG dell'anteprima erano hardcoded → con anteprima laterale e a schermo intero entrambe nel DOM si sovrapponevano (userSpaceOnUse) e la rampa non si vedeva. Ora id univoci per istanza (
useId) (src/components/PuzzlePreview.tsx).
v1.84.0 17/07/2026
Componibile: spessore rampa + rampa pre-selezionata + gating
- Spessore rampa da cm reali (
rampaThicknessCm, default 7) convertito in unità SVG; rampa pre-selezionata se il prodotto la offre (subito visibile). Gating MODULAR riconosce i modelli piastrella → niente step Quantità/Misura residui (src/components/Configurator.tsx, src/components/PuzzlePreview.tsx, src/lib/crm/configSchema.ts).
v1.83.0 17/07/2026
Componibile: card icona, cuttabile/non-cuttabile, rampa 3D
- Card icona Componibile (
modeConfig.MODULAR) in cima allo step. Cuttabile + tolleranza per prodotto: non cuttabile → piastrelle intere con avviso ambra (misura arrotondata); cuttabile → rifilatura con linea rossa. Rampa con sfumatura di profondità (niente bordo bianco) (src/components/Configurator.tsx, src/components/PuzzlePreview.tsx).
v1.82.0 17/07/2026
Componibile: taglio a misura con tolleranza + linea rossa
- Input a cm: se la misura non è multipla della piastrella (oltre {5} cm di tolleranza) scattano le piastrelle in più e il pezzo va rifilato a misura. Anteprima con linea di taglio rossa tratteggiata in alto (striscia da rimuovere + "✂ taglia qui") e avviso rosso lampeggiante; la nota taglio finisce in riepilogo/carrello/checkout (src/components/Configurator.tsx, src/components/PuzzlePreview.tsx).
v1.81.0 17/07/2026
Componibile: piastrelle multiple, rampa opzionale, fullscreen
- Selettore modello piastrella (se >1); step esclusivo senza Quantità/Misura; riepilogo con prezzo per tipologia (angoli/laterali/centrali × cad); rampa opzionale con scelta lati (alto/basso/sx/dx) e €/ml sui lati scelti, colore e foto come riempimento; anteprima con ≥3 agganci/lato e schermo intero dello schema (src/components/Configurator.tsx, src/components/PuzzlePreview.tsx).
v1.80.0 17/07/2026
Configuratore Componibile 2D
- Nuovo step Componibile: input a n° piastrelle (H×V) o a cm (base×altezza, arrotondato a piastrelle intere), conteggio Angoli/Laterali/Centrali + totale, prezzo per tipologia + rampa (perimetro × €/ml), anteprima SVG 2D con banda e rampa a giro e selettore colore rampa. Composizione riportata in riepilogo/carrello/checkout (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.79.0 17/07/2026
Anteprima puzzle: agganci multipli + base 2D
PuzzlePreviewriscritto: più denti per lato (agganci multipli, non uno solo) e supporto griglia 2D (rows × cols) con angoli/laterali/centrali automatici, banda a giro e rampa a giro. Il puzzle 1D esistente eredita subito gli agganci multipli (src/components/PuzzlePreview.tsx).
v1.78.0 16/07/2026
Card modalità "Rotolo intero" personalizzabile
- La card Rotolo intero nello step misura usa icona/dimensione/effetto/titolo/sottotitolo globali da
modeConfig.ROLL(come le altre modalità) (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.77.0 16/07/2026
Rotoli con lunghezza per larghezza (`rollPrices`)
- I rotoli interi vengono da
dimensions.rollPrices: ogni larghezza ha la sua lunghezza rotolo e prezzi propri. La composizione banda (N rotoli + spezzone) e la modalità Rotolo intero usano la riga della larghezza scelta; fallback legacy surollLengthCm(src/lib/crm/configSchema.ts, src/components/Configurator.tsx).
v1.76.0 16/07/2026
Rotolo intero come modalità separata
- Nuova modalità Rotolo intero (card dedicata nello step misura): una card per larghezza → rotolo completo (larghezza × lunghezza rotolo) al prezzo rotolo. Separata da Banda; entrambe usano la stessa tabella larghezze (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.75.0 16/07/2026
Bande: composizione rotolo intero + spezzone + avviso
- In modalità Banda, se la lunghezza scelta supera la lunghezza rotolo del prodotto, il prezzo si compone di N rotoli interi (prezzo rotolo) + spezzone della differenza al metro lineare.
PriceResult.rollBreakdownveicola la composizione (src/lib/crm/configSchema.ts). - Avviso rosso (triangolo + lampeggio lento
animate-pulse) nello step misura che spiega la composizione; la composizione compare anche nel riepilogo "Il tuo prodotto", nel carrello e nel checkout (src/components/Configurator.tsx).
v1.74.0 16/07/2026
Bande: prezzo al metro lineare (fix bug misura standard)
- Prezzo banda = €/ml × lunghezza dalla larghezza banda scelta; la modalità misura attiva viene passata al motore prezzi (
PriceSelection.mode) così una misura che combacia con una standard non ne eredità più il prezzo (fix €840). Nuovodimensions.bandPrices(src/lib/crm/configSchema.ts, src/components/Configurator.tsx).
v1.73.1 16/07/2026
Puzzle: banda sul perimetro esterno (non sui giunti)
- L'anteprima puzzle disegna la banda (bordo di sicurezza colorato) sul perimetro esterno dell'insieme — lati lunghi + estremità — e NON sui giunti a incastro interni, come nei tappeti antifatica reali. Estremità leggermente più larghe. Default banda giallo (src/components/PuzzlePreview.tsx).
v1.73.0 16/07/2026
Configuratore PUZZLE componibile + anteprima SVG
- Supporto ai prodotti puzzle componibili: step quantità con minimo pezzi, prezzo = 2×estremità + (n−2)×centrale, riepilogo composizione (2 estremità + N centrali) e ingombro totale (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
- Nuova anteprima SVG
PuzzlePreview: disegna i tasselli assemblati con incastri (dente/incavo) — estremità con incastro su 1 lato, centrali su 2 — colore del prodotto e bordo banda opzionale (src/components/PuzzlePreview.tsx).
v1.72.0 16/07/2026
Chrome LIVE: topbar, logo, contatti footer (audit completo)
- Audit di tutto il sito: le pagine storefront (home, catalogo, categoria, prodotto, attributo) e il menu erano già live (rilettura dal bridge nel browser). Convertiti gli ultimi residui build-time del "chrome" condiviso: messaggio topbar, logo header, contatti footer (email/telefono/indirizzo/orari) ora si aggiornano in tempo reale da
settings.php/theme.phpsenza redeploy (src/layouts/Base.astro, src/components/Header.astro, src/components/Footer.astro). - Restano build-time solo:
<title>/meta SEO (giusto così per Google) e le pagine del page-builder (hero home / landing personalizzate), che sono un sistema separato.
v1.71.0 16/07/2026
Header categoria LIVE (banner/nome/sottotitolo/altezza)
- Anche il banner della pagina categoria (immagine, altezza, nome, sottotitolo) ora si aggiorna in tempo reale dal CRM senza redeploy (isola
CategoryLiveHeader, ibrido SSR-per-SEO + hydrate live). Ora l'intera pagina categoria — banner, testi, griglia prodotti — riflette live le modifiche del CRM (src/components/CategoryLiveHeader.tsx, [src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v1.70.0 16/07/2026
Testi categoria LIVE (aggiornamento senza redeploy)
- Descrizione e testo in fondo della pagina categoria ora si aggiornano in tempo reale dal CRM (rilettura dal bridge nel browser a ogni caricamento pagina), come la pagina prodotto. Ibrido: il valore "baked" al build resta in SSR per la SEO e per il paint immediato, poi viene aggiornato live. Nuova isola
CategoryLiveText(src/components/CategoryLiveText.tsx, [src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v1.69.1 16/07/2026
Testi categoria giustificati e più piccoli
- Descrizione e testo in fondo della pagina categoria ora sono giustificati (
text-justify) e con testo leggermente più piccolo (13px, interlinea rilassata) ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v1.69.0 16/07/2026
Altezza header categoria configurabile
- Il banner della pagina categoria usa l'altezza impostata nel CRM (
headerHeight, px; default 224, clamp 80–800) invece dell'altezza fissah-56([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro), src/data/catalog.ts).
v1.68.2 16/07/2026
Testi categoria a piena larghezza
- Descrizione (in cima) e testo in fondo della pagina categoria ora occupano tutta la larghezza del contenitore (
max-w-noneinvece dimax-w-3xl) ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v1.68.1 16/07/2026
Rebuild: pubblica descrizione/footer/SEO categorie
- Rebuild del sito per pubblicare i testi categoria (descrizione, testo in fondo, SEO) inseriti dal CRM. Le pagine categoria sono statiche → il contenuto si aggiorna online al deploy ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v1.68.0 15/07/2026
Pagina categoria: testo in fondo + SEO dal CRM
- La pagina categoria usa Titolo SEO e Descrizione SEO impostati dal CRM (fallback: "Nome — Floormad" / sottotitolo) e mostra il testo in fondo pagina (
footerHtml, sotto i prodotti) ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro), src/data/catalog.ts).
v1.67.0 15/07/2026
Mega menu: larghezza configurabile + fix entrata laterale
- Larghezza mega menu impostabile dal Menu builder (Stile del menu): Auto (1100px), Full width (il pannello si ancora a tutta la barra) o personalizzata in px; mai oltre il 95% della finestra. Nuovo campo
menuMegaWidth(src/components/MenuBuilder.tsx, src/components/SiteNav.tsx, src/lib/siteSettings.ts). - Fix effetto entrata incoerente (es. "Tappeti tecnici in alluminio": a volte da sinistra, a volte da destra fin fuori schermo): i pannelli avevano
transitionsu TUTTO, incluso iltranslateXdel clamp anti-sbordo → lo spostamento veniva animato come uno slide. Ora i pannelli fanno solo fade (transition-opacity) e il riposizionamento è istantaneo (src/components/SiteNav.tsx).
v1.66.1 15/07/2026
Fix "Prodotto non trovato" su pagine stale (slug -N)
- Per i prodotti con slug suffissato (
-1,-2…, import Woo) il build emette anche una pagina alias alla base "pulita" (es....luxturf-con-logo-stampato/→ prodotto...-1), con canonical sullo slug reale. Il deploy non cancella mai i file rimossi, quindi la pagina della build vecchia (bundle senza tolleranza slug → "Prodotto non trovato") restava online: l'alias la sovrascrive con HTML fresco ([src/pages/prodotto/[slug].astro](src/pages/prodotto/[slug].astro), src/layouts/Base.astro).
v1.66.0 15/07/2026
Card Orientamento personalizzabili
- I blocchi Orientamento (misure standard e banda fissa) usano icona/dimensione/effetto e titolo/sottotitolo globali da
ecommerceCards.orient(CRM → Icone → Card configuratore), con fallback alle icone di sistema; area icona uniforme tra i due blocchi (src/components/Configurator.tsx, src/data/catalog.ts, src/lib/crm/configSchema.ts).
v1.65.0 15/07/2026
Step misura: icone allineate, orientamento a 1/3, titoli h2
- Card modalità misura: area icona ad altezza uniforme (= icona più grande tra le card) — con icone di dimensioni diverse (es. 150/150/110px) ogni icona resta centrata e titoli/sottotitoli restano allineati tra le card (src/components/Configurator.tsx).
- I blocchi Orientamento (misure standard e banda) usano la stessa griglia delle card sopra: ogni blocco largo 1/3 (1/2 se le modalità sono 2), non più compressi a
max-w-sm. - Nuovi titoli h2 nello step misura: "Misure Standard" (prima della griglia misure), "Configura le misure personalizzate" (su misura), "Lato Banda standard" e "Altezza/Lunghezza (cm)" (banda fissa).
v1.64.1 15/07/2026
Fix: card globali anche sui prodotti multi-modello
- Le card configuratore globali (icone/testi misura + stampa da
ecommerceCards) non venivano applicate ai prodotti combinati (es. Orthomat® Dot): il merge toccava solo lo schema radice, mentre il configuratore usa i sotto-schemi per modello → mostravano le icone di sistema. Ora il merge è applicato anche aschema.models[i].schema(src/data/catalog.ts).
v1.64.0 15/07/2026
Card misura/stampa: icone custom con dimensione + blending
- Le card del configuratore (modalità misura e con/senza grafica) applicano alle icone custom la dimensione (px) e il mix-blend-mode configurati dal CRM (es.
multiplyper PNG neri su fondo bianco: resta visibile solo il tratto) (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.63.2 15/07/2026
Modelli: pulsante arancione + tutti su una riga
- Il pulsante "← Torna alla scheda generale" ora è arancione (
btn-accent, come l'Aggiungi al carrello) a tutta larghezza (src/components/ProductLive.tsx). - Con 3-4 modelli le card stanno su un'unica riga (colonne = n. modelli); altri conteggi restano griglia responsive (src/components/ProductLive.tsx).
v1.63.1 15/07/2026
Modelli: via la card "Panoramica", torna-alla-generale come pulsante
- Rimossa la card "Panoramica" dal blocco "Modelli disponibili" (non deve essere una foto). Al suo posto un pulsante "← Torna alla scheda generale di {nome}" che appare solo dopo aver selezionato un modello (src/components/ProductLive.tsx).
v1.63.0 15/07/2026
Prodotti combinati: switch modello LIVE nella pagina
- La pagina prodotto dei prodotti combinati (multi-modello) ora ha un blocco "Modelli disponibili" (card Panoramica + una per modello). Cliccando si aggiornano al volo — senza reload — nome, descrizione, prezzo "a partire da", consegna e foto (solo quelle del modello); "Panoramica" torna alla vista combinata (src/components/ProductLive.tsx).
- Lo step 1 "Modello" del configuratore è ora in stile classico (barra step + card) ed è sincronizzato col blocco della pagina (click su una parte aggiorna l'altra) (src/components/Configurator.tsx).
- Il catalogo espone i dati pagina per-modello (
product.models) allineati ai sotto-schemi; le "Fasce prezzo" seguono il modello selezionato (src/data/catalog.ts, src/data/types.ts).
v1.62.4 15/07/2026
Fix "Prodotto non trovato" dai link del menu (slug non canonico)
- I link prodotto del mega-menu erano generati da
slugify(nome)invece che dallo slug reale: per i prodotti con slug esplicito/anti-collisione (es.…-1, tipico degli import Woo) l'URL del menu non esisteva → 404 "Prodotto non trovato" (mentre card/ricerca/sitemap, che usanoproduct.slug, funzionavano). Da qui l'intermittenza a seconda di dove si cliccava. getProductora è tollerante: se lo slug esatto non c'è, risolve per nome o per base senza suffisso-N→ sistema anche i link già salvati nel menu e i link esterni/vecchi (src/data/catalog.ts).MenuBuildergenera i link col prodSlug canonico (preferisce lo slug esplicito del CRM) (src/components/MenuBuilder.tsx).
v1.62.3 15/07/2026
Fix scrollbar orizzontale fantasma (desktop ~1260px)
- Eliminata la scrollbar orizzontale che compariva senza contenuti laterali (es. a 1260px): causata dai flyout del menu (
absolute+invisible/opacity-0, che restano nel flusso di scroll e sforano a destra). Aggiuntooverflow-x: clipalbody—clipnon crea uno scroll-container, quindi leposition: sticky(sidebar configuratore) restano intatte (src/styles/global.css).
v1.62.2 15/07/2026
Scheda tecnica: riga "Modelli" + colori dai modelli
- Prodotti configurabili: la Scheda tecnica ora elenca i Modelli e il Colore è l'unione dei colori dentro i modelli (non più solo i colori radice) (src/data/catalog.ts).
v1.62.1 15/07/2026
Modello come "step 1" del wizard
- La scelta del modello è ora presentata come step 1 (prima di Colore/Misura); dopo la scelta, la barra step mostra "1 Modello ✓" (cliccabile per cambiarlo) e rinumera gli altri da 2. Rimossa la scritta "Configura →" dalle card (src/components/Configurator.tsx).
v1.62.0 14/07/2026
Configuratore multi-modello + dati modello LIVE
- Step "Modello": i prodotti configurabili con più modelli mostrano prima la scelta del modello (card), poi il configuratore usa misure/colori/prezzi/SKU di QUEL modello (letti live dal CRM). Prima veniva mostrato solo il modello primario e i dati dei modelli non comparivano (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.61.2 14/07/2026
Ricerca: ignora ®/™/simboli e accenti
- La ricerca prodotti normalizza nome e query (minuscolo, senza accenti, simboli/punteggiatura → spazio): "orthomat dot" ora trova "Orthomat® Dot" (src/components/SearchBox.tsx).
v1.61.1 14/07/2026
Anteprima fullscreen più grande + sfondo sfocato
- L'anteprima a schermo pieno ora occupa ~80% dello schermo su desktop (box dimensionato sulla viewport) e quasi pieno su mobile; sfondo sfocato (backdrop-blur) all'apertura (src/components/Configurator.tsx).
v1.61.0 14/07/2026
Configuratore: orientamento fisso (non orientabili) + zoom anteprima ripristinato
- Prodotti non orientabili: rimosso il selettore "Orientamento" anche dalle misure standard; le misure valgono come inserite (nessuno swap L/H). Prima era tolto solo dalla banda (src/components/Configurator.tsx).
- Zoom anteprima ripristinato: l'anteprima del prodotto è di nuovo apribile a schermo pieno (click + icona ⤢) su mobile e desktop, non solo per i prodotti con stampa; le bande bicolore appaiono anche nel fullscreen.
v1.60.1 14/07/2026
upload.php: sovrascrittura in-place (crop "Sostituisci")
upload.phpaccetta un nome file esatto (file) per sovrascrivere un'immagine già presente mantenendo lo stesso URL — usato dalla "Modifica → Sostituisci originale" della Media Library CRM (public/upload.php).
v1.60.0 14/07/2026
Configuratore: bande bicolore, prodotto orientabile, fix "Su misura"
- Bande bicolore: i colori con 2° colore mostrano nell'anteprima del prodotto 2 bande da 7cm sui lati lunghi (interne, solo anteprima). La card colore resta a split diagonale (src/components/Configurator.tsx).
- Prodotto orientabile: se il prodotto non è orientabile (
orientable=false) il configuratore non mostra l'orientamento verticale della banda (solo orizzontale) (src/lib/crm/configSchema.ts, src/components/Configurator.tsx). - Fix "Su misura": non compare più la card misura libera sui prodotti a bande senza spunta "Misura libera" (backfill FREE non più inferito da
allowCustomDimensionsquando ci sono le bande) (src/data/catalog.ts).
v1.59.0 14/07/2026
Configuratore: colori bicolore (split diagonale 45°)
- Colori bicolore: i colori con 2° colore (es. Nero/Giallo) mostrano lo swatch della card e l'anteprima del prodotto come split diagonale a 45° dei due colori (usato quando non c'è foto/trama) (src/components/Configurator.tsx, src/lib/crm/configSchema.ts).
v1.58.0 14/07/2026
Configuratore: foto card colore + misure grandi in metri
- Foto card colore: la card del colore usa la nuova "Foto Colore" (
photoUrl) se presente, altrimenti ricade sulla trama; l'anteprima continua a usare la trama. Niente più foto duplicata tra card e anteprima (src/lib/crm/configSchema.ts). - Misure ≥ 10 m in metri: da 1000 cm in su la misura è mostrata in metri (es.
1830 cm → 18,3 m,1000 cm → 10 m); sotto i 10 m resta in cm. Applicato a riepilogo "Il tuo prodotto", carrello, card misure e testi del configuratore (src/components/Configurator.tsx).
v1.57.0 14/07/2026
Media Library: ritaglio (crop) delle immagini
- Crop nella Media Library (
/sito/media): pulsante ✂ su ogni immagine caricata (ritaglia → salva una copia) e ritaglio al caricamento di una singola immagine (con "Usa originale"). Cropper self-contained con rettangolo trascinabile/ridimensionabile, preset di rapporto (1:1/4:3/3:4/16:9/libero) e sfondo a scacchiera per la trasparenza (src/components/ImageCropModal.tsx, src/components/MediaLibrary.tsx).
v1.56.0 13/07/2026
Assistente concierge: consuma Conoscenza AI, FAQ e playbook di vendita
- Contesto catalogo arricchito: il chat (
chat.php) ora costruisce il contesto prodotto dalla Conoscenza AI compilata da Opus (fallback descrizione) e include le FAQ per-prodotto, non più solo la descrizione troncata a 220 caratteri (public/chat.php). - Playbook di vendita nel system prompt: se presente,
aiSalesKnowledge(albero decisionale, banca domande di chiarimento, cross-sell) guida l'assistente nell'instradare le richieste, al posto delle regole hard-coded. Runtime invariato su Gemini (public/chat.php).
v1.55.0 13/07/2026
FAQ prodotto (sezione + rich snippet) + endpoint AI configurabili
- Domande frequenti in pagina prodotto: nuova sezione a fisarmonica con le FAQ gestite dal CRM, più JSON-LD
FAQPageper i rich snippet Google (src/components/ProductLive.tsx, src/data/catalog.ts, src/data/types.ts). - Endpoint pubblici AI (chat, reviews, alt, imagen, tts, chatscan) ora leggono modelli/parametri da
aiFeatureConfigesposto dal bridge, invece di valori hardcoded (src/public/). - Griglia categorie: scelta manuale + ordine: nuovo campo nel builder per selezionare QUALI categorie mostrare e in che ordine (vuoto = automatico, prime N). Logica condivisa editor/build (src/builder/puck.config.tsx, src/builder/dataBlocks.tsx, src/builder/resolve.ts).
- Pagina categoria personalizzabile + arricchita: se esiste una pagina builder
categoria-<slug>viene renderizzata al posto del template (come la home); altrimenti il template mostra banner (immagine header), descrizione ricca e shop. Nuovi campi categoria (headerImageUrl,frontImageUrl,description) mappati con fallback retro-compatibili ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro), src/data/catalog.ts, src/data/types.ts).
v1.54.0 13/07/2026
Editor: copia-incolla blocchi tra pagine
- "⧉ Copia blocco" / "📋 Incolla" (src/builder/Editor.tsx) nella toolbar dell'editor: copia il blocco selezionato (con le sue DropZone annidate, es. Sezione/Colonne) e incollalo in un'altra pagina — clipboard in localStorage, id rigenerati automaticamente per evitare collisioni. Portato dall'AI Builder.
- Le altre feature editor dell'AI Builder (viewport responsive Smartphone/Tablet/Desktop, autosave bozze, cronologia/revisioni) erano già presenti in Floormad, verificato durante il merge — nessuna azione necessaria.
v1.53.0 13/07/2026
Builder: Mappa/Form/Newsletter + fix critico interattività blocchi
- 3 blocchi nuovi, categoria Contatti: Mappa (OpenStreetMap/Leaflet, nessuna API key), Modulo di contatto (invia email via nuovo endpoint
contact.php), Iscrizione newsletter. public/contact.php(nuovo): endpoint pubblico minimo, invia email al reparto riusando la config SMTP esistente (stesso pattern server-to-server disupport.php), rate-limit anti-spam basico.public/assets/leaflet/(nuovo): libreria Leaflet (CSS+JS, open source, nessuna dipendenza npm).- Reviews (lotto 1A) corretto: usava un parametro (
subject) non supportato dareviews.php→ ora usaproductId, coerente con l'endpoint reale.
v1.52.0 13/07/2026
Builder: generazione immagini con AI nel campo immagine
- "✨ Crea con AI" nel campo immagine del builder (src/builder/ImageField.tsx, src/builder/AiImageModal.tsx): apre un modale per generare un'immagine da un prompt testuale (Imagen, 5 formati: 1:1/16:9/4:3/3:4/9:16), portato dall'AI Builder e adattato sugli endpoint già esistenti di Floormad (nessun backend nuovo). L'immagine generata si aggiunge alla Media Library e viene impostata nel campo.
src/lib/media.ts:generateImage()ora accettaaspectRatio(già supportato daimagen.php, non era esposto lato client); aggiuntereplaceMedia()efileToDataUrl()per la sostituzione in-place di un'immagine.- Richiede una chiave Gemini configurata nel CRM (Impostazioni → AI), come per
alt.php.
v1.51.0 13/07/2026
Builder: blocchi Contenuto informativo (lotto 1C)
- 8 blocchi nuovi (src/builder/vetrinaBlocks.tsx, src/builder/puck.config.tsx), categoria Contenuto informativo: Intestazione pagina (con/senza immagine), Testo lungo (chi siamo/policy), Domande frequenti (accordion), Schede/Tabs (funzionanti, non solo anteprima), Timeline/passi, Il team, Orari di apertura (badge aperto/chiuso live), Card generiche. Ultimo lotto blocchi vetrina: con questo si chiude il set "generici" del merge builder AI Builder → Floormad.
v1.50.0 13/07/2026
Builder: blocchi Media & Promo (lotto 1B)
- 8 blocchi nuovi (src/builder/vetrinaBlocks.tsx, src/builder/puck.config.tsx), categoria Media & Promo: Video (YouTube/Vimeo responsive), Slider immagini (crossfade autoplay), Galleria, Prima/Dopo (slider trascinabile), Conto alla rovescia, Banda CTA, Barra avviso/promo (chiudibile), Testo scorrevole (marquee). Riscritti in Tailwind coi token Floormad, interattività in React (no site.css/JS esterni). Additivo, pagine esistenti intatte.
v1.49.0 13/07/2026
Builder: nuovi blocchi Vetrina (dall'AI Builder, riscritti in Tailwind)
- 6 blocchi nuovi nel builder (src/builder/vetrinaBlocks.tsx, src/builder/puck.config.tsx), categoria Vetrina: Testimonianze (citazioni + stelle + avatar), Recensioni (dal sito, carosello), Numeri/statistiche (KPI), Loghi/partner, Prezzi/piani (con piano in evidenza), Tabella confronto (✓/✗). Portati dal builder AI (rockstaracademy) ma riscritti in Tailwind coi token Floormad (brand/accent/ink) → coerenti col sito, nessun CSS esterno. Usano il sistema di spaziatura esistente. Primo lotto del merge builder; le pagine esistenti non sono toccate (additivo).
v1.48.2 10/07/2026
Mobile: l'anteprima segue l'header quando collassa (no gap con i colori sotto)
- Anteprima sticky sincronizzata con l'header (src/components/Header.astro, src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx): quando l'header si ritrae allo scroll, l'anteprima saliva restando ancorata a
--header-h→ restava uno spazio vuoto in alto sotto cui scorrevano le card colore. Ora l'header espone--header-shift(= sua altezza quando collassato) e l'anteprima usatop: calc(var(--header-h) - var(--header-shift)), salendo di ~90px in cima. Niente più gap.
v1.48.1 10/07/2026
Mobile: anteprima e barra step a filo schermo, meno margine in alto
- Blocco sticky più in alto (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx): rimosso lo spazio morto sopra l'anteprima (top allineato all'header reale + margine negativo), anteprima e barra step a filo schermo (0 margine laterale, full-width). Ridotto il glow del balloon "INIZIA QUI" così non sbava ai bordi.
v1.48.0 10/07/2026
Mobile pagina prodotto: rifiniture UX (anteprima, step, header, densità)
- Anteprima più compatta e pulita (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx): blocco sticky anteprima al 30% vh (era 40%), sfondo opaco + copertura sopra così non "trapela" contenuto tra header e anteprima quando si scorre.
- Step tab ridisegnate (stessi file): fondino grigio con pill bianca sull'attivo, tab compatte (padding/gap ridotti), attaccate al margine. Cambiando step la vista scrolla al contenuto corretto.
- Header hide-on-scroll (src/components/Header.astro): su mobile, SOLO in pagina prodotto, l'header si ritrae scorrendo giù e ricompare scorrendo su (più spazio per configurare).
- Pulsantone "Configura prodotto" (src/components/ProductLive.tsx): sticky in basso mentre si guarda la scheda; al tap porta al configuratore e lascia il posto alla footer bar (prezzo + riepilogo + Avanti). Prezzo footer più piccolo.
- Densità parte alta prodotto (ProductLive): titolo e prezzo prodotto più piccoli su mobile; icone classificazioni a dimensione fissa max 60×60; misure standard a 3 colonne; fasce prezzo a 4 colonne; banda servizi (spedizione/supporto/consegna) nascosta su mobile.
v1.47.0 10/07/2026
Mobile: header compatto, configuratore più snello, home hero/categorie
- Header mobile compatto (src/components/Header.astro, src/components/SiteNav.tsx): hamburger a sinistra + logo centrato + carrello; rimossa la seconda barra "Menu prodotti" sotto l'header (il drawer si apre dall'hamburger via evento
fm-open-menu). Una riga in meno. - Configuratore mobile — anteprima al 40% e adattata (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx): il blocco sticky in cima passa da 33% a 40% vh; il disegno del tappeto si scala all'altezza disponibile (ResizeObserver) così la quota larghezza sotto resta sempre visibile. Pulsante Espandi/Comprimi ora in overlay sull'anteprima (non occupa più una riga).
- Prezzo in footer (stessi file): il prezzo live è stato spostato dal blocco sticky alla barra azione in basso, a sinistra del CTA, con un pulsantino riepilogo (☰) che apre un popup bottom-sheet con il riepilogo completo della configurazione (voci + totale).
- Home mobile (src/builder/blocks.tsx, src/builder/dataBlocks.tsx, src/components/LiveCategoryTiles.tsx): hero slider a 50% dell'altezza schermo su mobile; griglie categorie/prodotti a 2 colonne (50%/50%) su mobile.
v1.46.0 10/07/2026
Ottimizzazione mobile pagina prodotto (configuratore, menu, icone, testi)
- Menu mobile sopra la hero (src/components/SiteNav.tsx): il drawer del menu prodotti su mobile finiva *sotto* la hero slider (le slide usano
transform→ nuovo stacking context, ilz-[100]del drawer valeva solo dentro l'header). Ora il drawer è renderizzato increatePortal(document.body)→ esce dallo stacking dell'header e copre tutta la pagina. Aggiunto scroll-lock del body quando è aperto. - Anteprima + step sticky nel configuratore (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx): su mobile un blocco sticky in cima al configuratore tiene sempre visibili anteprima prodotto (collassabile ~33vh → 70vh con tap ⤢) con prezzo totale live e tab degli step, mentre il corpo scorre sotto. La sidebar 340px resta come prima solo su desktop.
- Footer bar ridotta su mobile (stessi file): la barra azione fissa in basso, che occupava troppo spazio, su mobile mostra solo il CTA (Avanti / Aggiungi al carrello) a piena larghezza — prezzo e anteprima sono già nel blocco sticky. Su desktop invariata.
- Icone classificazioni touch e orizzontali (src/components/ProductLive.tsx): su mobile le classificazioni vanno sempre in una riga orizzontale scrollabile sotto le caratteristiche principali, scalate (~62%) e touch, indipendentemente dalla posizione scelta per il desktop.
- Testi giustificati su mobile (src/styles/global.css): i paragrafi
.prose(descrizioni prodotto, anche da HTML) sono giustificati sotto i 640px.
v1.45.0 10/07/2026
Pagina Novità: ultimo aggiornamento (data/ora + autore) e storico pubblicazioni
- Ultimo aggiornamento + storico (src/pages/changelog.astro): la pagina Novità mostra in cima quando il sito è stato pubblicato l'ultima volta, l'ora e chi l'ha pubblicato (utente CRM che ha premuto "Pubblica sito"), più lo storico espandibile delle pubblicazioni. Dati letti al build da
settings_store.siteDeployLogdel CRM (fallback silenzioso se il bridge è offline).
v1.44.0 09/07/2026
TEMPO REALE: categoria, attributi e home leggono live dal database CRM
- Fine del "congelamento": le pagine categoria (sidebar filtri + griglia), le pagine attributo e la home ("Esplora per categoria" + "In evidenza") ora ricaricano i dati CRM correnti dal bridge AD OGNI apertura di pagina — icone, etichette, classi, "Chiuso in sidebar", prezzi, disponibilità, tag. Modifichi nel CRM → refresh → online. Le pagine prodotto (ProductLive) e il catalogo (CatalogBrowser) erano già live: ora tutto lo storefront legge dal database.
- Architettura (data/facets.ts, components/CategoryShop.tsx, components/ProductCardR.tsx, components/LiveGrid.tsx, components/LiveCategoryTiles.tsx): la logica facet è condivisa build+browser; il build resta solo come primo paint istantaneo + SEO (stesso pattern di CatalogBrowser). Il rebuild serve ormai solo per: nuove categorie (route), menu/tema/pagine builder.
v1.43.0 09/07/2026
Versione del sito in topbar con pagina Novità + filtri sidebar senza icone
- Versione cliccabile in topbar (components/Header.astro): badge
v1.43.0in alto a destra; al click si apre la nuova pagina/changelogcon tutte le novità del sito, generata dal CHANGELOG al momento del build (pages/changelog.astro). - Filtri sidebar più puliti ([pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)): rimossi icona e conteggio accanto alle opzioni dei filtri — restano checkbox + etichetta (richiesta di oggi, era andata persa non committata).
v1.42.0 08/07/2026
Facet sidebar collassabili + macro-titolo (Gruppo › Classe)
- Facet-classe collassabili ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro), src/data/catalog.ts): ogni filtro raggruppato per Classe è ora un
<details>con header cliccabile (chevron). Sopra il nome Classe compare il macro-titolo del Gruppo (groupName). Aperto o chiuso di default in base al flag CRMIconClass.collapsedInSidebar(nuovo campoclassCollapsedinspecIcons). Vedi CRM 3.221.0.
v1.41.0 08/07/2026
Fumetto icone a larghezza adattiva al testo
- Fumetto adattivo (src/components/ProductLive.tsx): il tooltip delle icone del banner "in evidenza" passa da larghezza fissa 300px a
w-max(adatta al contenuto) con tettomax-w-[min(300px,80vw)]. I testi corti (es. "TAPPETI PROMOZIONALI") non occupano più tutta la larghezza; quelli lunghi vanno a capo entro il tetto. Vedi CRM 3.220.0.
v1.40.0 08/07/2026
Facet lista sidebar: via l'icona, testo compatto (come i colori)
- Filtri lista ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)): nei facet a lista (Caratteristiche, Classi, attributi in evidenza) tolta l'iconcina accanto a ogni voce e testo ridotto a
text-xs(come il facet Colore). Solo checkbox + etichetta; niente numero. Rimossa la helpericonBoxBgnon più usata. Vedi CRM 3.219.0.
v1.39.0 08/07/2026
Fumetto icone (hover): colore testo, font e maiuscole
- Stile testo fumetto (src/components/ProductLive.tsx, src/data/catalog.ts): il fumetto descrizione del banner "in evidenza" usa colore testo, font (
tooltipFontFamily, es. Impact) e trasformazione maiuscole (tooltipTransform: none/uppercase/capitalize) impostati nel CRM. Colore testo override o auto a contrasto. Vedi CRM 3.218.0.
v1.38.0 08/07/2026
Filtri sidebar raggruppati per Classe (tassonomia icone), non più "Caratteristiche"
- Facet per Classe ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro), src/data/catalog.ts): la sidebar di categoria non mostra più un unico gruppo "Caratteristiche" per tutte le icone, ma un facet per Classe della tassonomia Icone Prodotto — il titolo del filtro è il nome della Classe (es. "Tipo di Prodotto"). Le icone senza classe restano sotto "Caratteristiche"; i tag semplici anche. Nuovi campi
className/groupNamerisolti per iconId daiconClasses/iconGroupsdel CRM. I facet restano cross-linked (spariscono le opzioni senza prodotti residui). Vedi CRM 3.216.0.
v1.37.0 08/07/2026
Badge card configurabile + hover (zoom + fumetto) + facet Caratteristiche
- Badge card configurabile (src/components/ImageBadges.tsx, src/components/ProductCard.astro, src/data/catalog.ts): il badge "sopra l'immagine" usa dimensione/icona/bordo/raggio dallo stile globale CRM (
badge*) eshowOnImagerisolto come override per-prodotto → libreria → default globale. Al passaggio del mouse si ingrandisce e mostra un fumetto con la descrizione (font 10px). Vedi CRM 3.215.0. - Facet Caratteristiche ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)): rimosso il numero prodotti accanto alle voci (il conteggio resta in
data-countper il cross-linking).
v1.36.0 08/07/2026
Hover avanzato icone (zoom %, overlay) + filtri catalogo cross-linked
- Hover avanzato (src/components/ProductLive.tsx, src/data/catalog.ts): nel banner "in evidenza" l'icona applica in hover lo zoom in % (
hoverScalePct, sostituisce il target fisso ~175px se impostato) e un velo di colore con blend (hoverOverlayColor/hoverOverlayBlend), via var CSS--cls-zoom / --cls-overlay / --cls-oblend. Vedi CRM 3.214.0. - Filtri catalogo cross-linked ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)): le opzioni della sidebar si aggiornano fra loro — spariscono i valori che nessun prodotto residuo ha e i conteggi si ricalcolano (es. prodotto solo Nero → resta solo Nero). AND fra gruppi, OR dentro, ignorando il proprio gruppo. Solo client-side.
v1.35.0 08/07/2026
Arrotondamento box icona che ritaglia anche l'immagine
- Box con overflow:hidden + border-radius (src/components/ProductLive.tsx, src/data/catalog.ts): nel banner "in evidenza" l'immagine dell'icona è ritagliata al raggio del box (
iconStyleDefaults.borderRadius, nuovo campoborderRadiusinspecIcons), così un'icona quadrata segue il bordo arrotondato invece di sbordare dagli angoli. Default 12px (aspetto invariato). Vedi CRM 3.213.0.
v1.34.0 08/07/2026
Blend hover sulle icone (fonde il fondo bianco col box)
- Effetto blend al passaggio del mouse (src/components/ProductLive.tsx, src/data/catalog.ts): nel banner "in evidenza", oltre allo zoom, l'icona applica in hover il
mix-blend-modescelto nel CRM (iconStyleDefaults.hoverBlendMode, nuovo campohoverBlendModeinspecIcons) — es. *multiply* fa sparire il fondo bianco delle icone sul box scuro. Via variabile CSS--cls-hblend; assente = nessun cambio in hover. Vedi CRM 3.212.0.
v1.33.0 08/07/2026
Zoom hover sulle icone-classificazione (fino a ~175×175)
- Zoom al passaggio del mouse (src/components/ProductLive.tsx): nel banner "in evidenza" ogni icona si ingrandisce fino alla dimensione piena (
CLS_ICON_FULL_PX= 175px) con transizione 0.18s, poi torna alla dimensione impostata. Scale = max(1, 175/boxPx) via variabile CSS--cls-zoom: niente spostamenti di layout, l'icona hoverata va sopra le vicine (z-index). Vedi CRM 3.211.0.
v1.32.0 08/07/2026
Effetto blend globale sulle icone (multiply, overlay…)
- mix-blend-mode dallo stile globale CRM (src/data/catalog.ts, src/components/ProductLive.tsx, src/components/ImageBadges.tsx): l'immagine delle icone-classificazione è renderizzata con l'effetto scelto nel CRM (
iconStyleDefaults.blendMode, nuovo campoblendModeinspecIcons) — nel banner "in evidenza" e nei badge sopra l'immagine delle card. Default invariato (nessun effetto). Vedi CRM 3.210.0.
v1.31.0 08/07/2026
Filtro "Caratteristiche" guidato dalla spunta "Filtri" delle icone CRM
- Facet Caratteristiche esplicito (src/data/catalog.ts, src/pages/catalogo.astro, src/components/CatalogBrowser.tsx): le voci del filtro Caratteristiche del catalogo sono ora i nomi delle icone con la spunta Filtri nel CRM (nuovo campo
filterNamessul prodotto; solo testo, l'icona non viene ripetuta). Prima il facet usava l'euristica "classificazioni senza immagine". I badge testuali (symbols) e il banner "in evidenza" (specIcons) sulla pagina prodotto restano invariati. Vedi CRM 3.209.0.
v1.30.0 07/07/2026
Migrazione a repo git condiviso + workflow branch/PR (lavoro multi-utente)
- Sito ora versionato nel repo git condiviso
github.com/floormad/Megacrm(fuori Dropbox). Si lavora da clone locale con workflow branch → Pull Request → merge; niente più push diretti sumain. Nessuna modifica funzionale allo storefront. Vedi CRM 3.207.0.
v1.29.0 05/07/2026
Banner "in evidenza": valore testuale delle classificazioni (es. Bfl-s1)
- Classificazioni con valore testuale (src/components/ProductLive.tsx, src/data/catalog.ts): quando un'icona di libreria è impostata in modalità Testo nel CRM (es. resistenza al fuoco →
Bfl-s1/Cfl-s1o valore libero), il banner mostra il valore testuale sull'icona al posto dei pallini. Le icone in modalità Nessuno mostrano la sola icona; quelle a Pallini restano invariate. Nuovo campotextinspecIcons.
v1.28.1 05/07/2026
Configuratore: nessuna opzione pre-selezionata all'apertura (tranne il colore)
- All'apertura di uno step le opzioni non appaiono più pre-selezionate (prima erano evidenziate pur non essendo scelte, così sembrava di dover cliccare per "attivarle"). Ora l'evidenziazione compare solo dopo il click (src/components/Configurator.tsx):
- Misura: orientamento (Orizzontale/Verticale), taglie standard, orientamento e lato banda.
- Attributi; Personalizzazione (Con/Senza grafica — il box di caricamento appare solo dopo aver scelto "Con grafica"); Bordo ("Nessun bordo").
- L'unico campo pre-selezionato di default resta il colore, quando disponibile.
v1.28.0 04/07/2026
Asciugapasso per incasso: misura finale, banda più vicina, taglio a misura, anteprima abbondanza
- Quando il prodotto ha "Asciugapasso per incasso" e il cliente sceglie l'incasso: la misura inserita è quella FINALE. Si aggiunge l'abbondanza stampa (2,5 cm/lato di default) e si passa alla misura/banda standard più vicina che la copre su entrambi i lati → è quel prezzo che si mostra (es. finale 100×100 → prodotto 115×105) (src/components/Configurator.tsx).
- "Taglio a misura" spuntabile (default incluso, +40€/pz): se il cliente lo toglie riceve il pezzo intero della banda e compare un popup laterale con video tutorial su come tagliarlo (YouTube/Vimeo o file diretto).
- Opzione sottofondo 3 mm (+15€/m²), toggle indipendente.
- Anteprima laterale: il finito (misura ordinata) è al 100% di opacità al centro, l'abbondanza a giro della banda prodotta al 30%; quote sul finito + didascalia banda prodotta.
- Riepilogo, carrello, checkout, PDF/email e totale mostrano misura finale + prodotta, "Taglio a misura" e "Sottofondo 3mm". Tutti i valori sono configurabili dal CRM (CRM 3.196.0).
v1.27.3 04/07/2026
Banda fissa: label campo variabile invertite (H = Altezza, V = Lunghezza)
- Il campo della misura variabile ora è "Altezza (cm)" in orizzontale e "Lunghezza (cm)" in verticale (invertite rispetto a 1.27.2) (src/components/Configurator.tsx).
v1.27.2 04/07/2026
Banda fissa: l'orientamento ruota il tappeto + label "Lato banda"
- In Banda fissa selezionare Orizzontale/Verticale ora ruota davvero il tappeto nell'anteprima, come nelle Misure standard:
applyBandrispetta l'orientamento (H → banda = larghezza; V → banda = altezza, dimensioni scambiate) invece di inviare semprelarghezza = banda(src/components/Configurator.tsx). - Il selettore della banda si chiama ora "Lato banda (cm)" in entrambi gli orientamenti. Il campo lunghezza resta "Lunghezza (cm)" in orizzontale e diventa "Altezza (cm)" in verticale.
v1.27.1 03/07/2026
Configuratore: primo colore selezionato di default
- All'apertura del configuratore il primo colore disponibile è già selezionato (step "Colore" segnato come fatto): l'anteprima laterale mostra subito la texture/hex del colore invece della foto principale del prodotto. L'utente può comunque cambiarlo (src/components/Configurator.tsx).
v1.27.0 03/07/2026
Tolleranza ±3% accanto alla misura (sidebar, checkout, riepiloghi)
- Accanto alla misura (
75 × 85 cm) ora compare ±3% in piccolo, per comunicare la tolleranza di taglio su misura. Appare nella sidebar "Il tuo prodotto" (in grigio piccolo), nel carrello/checkout e in tutti i riepiloghi ordine (email, PDF, foglio ordine, storico Account) (src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx). Propagato viaconfigDetails+summary, così è coerente ovunque. Sui prodotti "a pezzo" (senza misura) non compare.
v1.26.3 03/07/2026
Incavo → voce "Spessore" derivata (std + sottofondo) in riepilogo e checkout
- Ad incasso la voce Spessore (sidebar "Il tuo prodotto" + dettagli checkout/carrello/PDF/email) ora deriva dall'incavo scelto: se l'incavo è uno standard →
28 mm (standard); se è intermedio →28 mm (26 mm + 2 mm extra)(standard più vicino + sottofondo). Si aggiorna in tempo reale muovendo lo slider (src/components/Configurator.tsx). - Nuova sotto-riga "Extra spessore" nel riepilogo (
2 mm · +40,00 €/m²) e riga nel totale "Extra Spessore: +40,00 €/m² (tot. 60,00 €)" quando c'è sottofondo. La riga Incavo resta invariata.
v1.26.2 03/07/2026
Incavo: lo slider può scendere sotto lo spessore scelto
- Con spessore scelto 17 l'incavo parte a 17 (posa a filo) ma ora può scendere fino allo spessore standard minimo (es. 14): gli standard restano senza sovrapprezzo, gli intermedi (15/16…) usano sottofondo dal standard inferiore + prezzo tabella (regole 1.26.1). Cambiando spessore l'incavo si riallinea a filo finché non lo si è toccato; il minimo indicato sotto lo slider è lo standard minimo (src/components/Configurator.tsx).
v1.26.1 03/07/2026
🐛 Incavo: sottofondo e prezzo relativi allo spessore standard più vicino
- Il sottofondo di compensazione ora si calcola come
incavo − spessore-standard-inferiore-più-vicino(prima partiva sempre dal minimorecess.minMm). Es. con standard 14/17/20: incavo 18 → "1 mm di sottofondo", 19 → "2 mm", 20 → nessun sottofondo (è standard). (src/components/Configurator.tsx). - Nota "Aggiungeremo N mm di sottofondo…" e sovrapprezzo incavo ora dipendono dal fatto che il *valore dell'incavo* sia uno spessore standard (prezzo 0 se standard), non dall'aver scelto un preset nello step Spessore.
- Prezzo incavo: override manuale per-mm forzabile (
recess.prices) → altrimenti 0 se standard → altrimentidefaultPrice. - All'attivazione l'incavo parte dallo spessore scelto nello step 2 (slider e valore iniziale = spessore selezionato).
v1.26.0 03/07/2026
Configuratore: anteprima colore singolo, Spessore non pre-selezionato, incavo con spessore standard
- Anteprima colore singolo (src/components/Configurator.tsx): quando il prodotto ha un solo colore (step Colore nascosto perché non selezionabile), l'anteprima ora usa quel colore (texture/hex) invece di ripiegare sulla foto del prodotto — che era errata.
- Fix step Spessore pre-selezionato (src/components/Configurator.tsx): quando lo step ha ≥2 scelte non viene più mostrato il primo preset già evidenziato (che dava "⚠ Seleziona lo spessore per continuare" premendo Avanti). Ora nessuna scelta è pre-selezionata: si sceglie e si prosegue.
- Incavo con spessore standard (src/components/Configurator.tsx): se nello step Spessore si sceglie uno spessore standard (un preset), l'incavo ha prezzo 0 e non compare più il testo "Aggiungeremo N mm di sottofondo…" — il tappeto è già alla quota d'incasso, quindi niente sottofondo né sovrapprezzo. Il sottofondo/sovrapprezzo resta solo con spessore Personalizzato.
v1.25.0 03/07/2026
Step "Stampa" → "Personalizzazione" + modalità "solo con grafica"
- Lo step "Stampa" del configuratore ora si chiama genericamente "Personalizzazione" (etichetta di default; resta sovrascrivibile per-prodotto). Aggiornati anche riepilogo e messaggi (src/components/Configurator.tsx).
- Modalità "solo con grafica" (
printGraphicMode: 'graphicOnly'dal CRM): quando il prodotto è sempre personalizzato, lo step non mostra più le card "Con grafica / Senza grafica" ma va diretto al box di caricamento — carica il file oppure "Non ho al momento la grafica" (invio dopo l'ordine → stato *Grafica Mancante*). Caricare un file ora completa lo step (src/lib/crm/configSchema.ts, src/lib/crm/types.ts).
v1.24.2 02/07/2026
Wizard: ✓ solo dopo essere passati dallo step + step "pronto" non opacizzato
- La ✓ compare solo quando si è entrati nello step e si è andati avanti (touched): la Misura preimpostata non si spunta più da sola completando il Colore (src/components/Configurator.tsx).
- Lo step successivo raggiungibile perde l'opacità (si "accende" quando si è pronti a passarci); diventa arancione quando ci si entra. Restano oscurati e non cliccabili solo gli step irraggiungibili.
v1.24.1 02/07/2026
Wizard: ✓ Misura solo dopo gli step precedenti + tab oscurati non cliccabili
- La ✓ compare su uno step solo se anche tutti i precedenti sono completi: la Misura (preimpostata) non risulta più spuntata finché non si completa il Colore (src/components/Configurator.tsx).
- I tab oscurati (step futuri con passaggi precedenti incompleti) sono disabilitati: niente click, cursore not-allowed.
v1.24.0 02/07/2026
Wizard step-by-step: scelte obbligatorie con avviso, incavo senza preselezione
- Configuratore a step obbligatori (src/components/Configurator.tsx): non si avanza se lo step corrente non è stato scelto — "Avanti" e i tab mostrano un avviso rosso ("Seleziona il colore per continuare.", "Seleziona \"Sì, va incassato\" o \"No, posa normale\"…"). Cliccando un tab futuro si viene portati al primo step incompleto. La Misura è esente (preimpostata 150×100) e la Quantità pure.
- Colore senza preselezione: si parte dallo step 1 senza colore scelto (l'anteprima usa la foto prodotto finché non si sceglie).
- Incavo Sì/No deselezionati: nessuna scelta preimpostata; lo step Bordo appare solo dopo aver scelto "No" (con "Sì" resta nascosto). Riepilogo "Incavo: —" finché non si sceglie.
- Tab: step non attivi con opacità ridotta; il numero diventa ✓ appena lo step è completato.
v1.23.0 02/07/2026
Incavo prima del Bordo + step Bordo nascosto se incassato
- Ordine step (src/components/Configurator.tsx): l'Incavo viene prima del Bordo/Profilo. Scegliendo "Sì, va incassato" lo step Bordo sparisce (i tappeti incassati non hanno bordo); tornando su "No" riappare. L'indice del passo corrente si riadatta da solo.
- Slider incavo: al valore minimo (= spessore del tappeto) mostra "Spessore Tappeto"; oltre il minimo mostra "Extra Spessore" (+ prezzo €/m² e supplemento se configurato) — via l'etichetta "incluso".
v1.22.0 02/07/2026
Incavo con prezzi al m² (come lo spessore) + avviso sottofondo
- Incavo a slider con prezzi (src/components/Configurator.tsx): lo spessore incavo si sceglie con lo slider min→max (stesso stile dello spessore configurabile) e può avere un prezzo €/m² (default + override per mm, campi nuovi nel CRM
recessDefaultPrice/recessPrices): supplemento = €/m² × m², minimo sul carico minimo d'ordine. Resta la riga "Min N mm (spessore del tappeto) — Max N mm." - "Aggiungeremo N mm di sottofondo per compensare l'incavo" ora è un box giallo di avviso (come quello del bordo).
v1.21.2 02/07/2026
Incavo Sì → il bordo si toglie da solo
- Se il cliente sceglie la posa a incasso, il bordo/profilo selezionato viene rimosso e la scelta "Sì" del bordo si disabilita con avviso (src/components/Configurator.tsx): i tappeti incassati non hanno mai bordo.
v1.21.1 02/07/2026
Avviso per-prodotto spostato nello step Bordo/Profilo
- Il box giallo di avviso (src/components/Configurator.tsx) ora compare in cima allo step Bordo/Profilo (campo CRM
borderNotice), non più nello step Spessore.
v1.21.0 02/07/2026
Configuratore: avviso spessore per-prodotto + step "Spessore" e "Bordo/Profilo"
- Avviso nello step spessore (src/components/Configurator.tsx): se il prodotto ha
customThickness.noticenel CRM, lo step mostra un box giallo (es. "⚠ Attenzione: il profilo perimetrale ha uno spessore di 14mm"). - Etichette step accorciate: "Scegli lo spessore" → "Spessore" (anche per i prodotti già salvati con la vecchia etichetta); "Bordo perimetrale"/"Profilo perimetrale" → "Bordo"/"Profilo" (step e riepiloghi). Etichette personalizzate diverse restano invariate.
- Misura manuale: default 150 × 100 cm (ritagliato nei limiti del prodotto; i prodotti con misure standard partono ancora dalla prima misura) (src/components/Configurator.tsx).
- Slider recensioni in loop (src/components/Reviews.tsx): a fine lista riparte dalla prima; fix del blocco a fondo corsa (scroll frazionario clampato dal browser: tolleranza ampia + rilevamento "non si è mosso").
v1.20.0 02/07/2026
Configuratore: etichette colore con codice prima + serie dopo i colori normali
- Etichette colore (src/components/Configurator.tsx): "Antracite 638" ora mostra 638 sopra e Antracite sotto (codice prima); le serie tipo "Chicco Riso - Rosso - 11" si mostrano su 3 righe: Chicco Riso (piccolo), 11, Rosso. Il formato "B01 Nero" resta invariato. Solo visualizzazione: i nomi salvati nel CRM non cambiano (preventivi/carrelli salvati intatti).
- Ordinamento: i colori "serie" (Nome - Colore - N) vengono mostrati dopo i colori normali, ordinati per nome colore; i normali mantengono l'ordine del CRM.
v1.19.1 02/07/2026
Blocco classificazioni verticale: max icone per colonna configurabile
- Il passaggio a 2 colonne del blocco icone verticale (src/components/ProductLive.tsx) non è più fisso a 6: usa "Max icone per colonna" dallo stile globale del CRM (
classificationBanner.maxPerColumn, default 6).
v1.19.0 02/07/2026
Configuratore: spessore extra al m² con minimo d'ordine + minimo automatico
- Spessore extra al m² (src/components/Configurator.tsx): il supplemento spessore = €/m² × m², con minimo fatturabile = carico minimo d'ordine del prodotto (es. 0,7 m² × 40 €/m² = 28 € fissi sotto i 0,7 m²). Le card e lo slider mostrano "€/m²"; riepilogo e totale mostrano il supplemento effettivo. Prodotti a pezzo: supplemento fisso invariato.
- Minimo d'ordine automatico (src/lib/crm/configSchema.ts, src/data/catalog.ts): se il prodotto ha "Automatico" nel CRM, minimo € = fascia €/m² più alta × carico minimo globale (
minOrderLoadM2dalle Impostazioni CRM, default 0,7).
v1.18.0 02/07/2026
Box Specifiche: righe automatiche dai dati prodotto
- Specifiche automatiche (src/data/catalog.ts): il box Specifiche ora si popola da solo, oltre agli attributi spuntati "Nelle specifiche": Colore (nomi se ≤10, altrimenti "N colori disponibili"), Materiale (nuovo campo Extra del CRM), Materiale bordo/profilo (rispetta la terminologia scelta), Spessori disponibili (nominale + preset + opzioni tecniche + range su misura, es. "8 / 11 mm, su misura da 12 a 30 mm"; singolo valore resta "Spessore"), Classificazioni (dalla libreria icone, con valore pallini: es. "Antiscivolo 5"). Un attributo con la stessa etichetta ha la precedenza (niente doppioni).
v1.17.4 02/07/2026
Configuratore: etichette colore su 3 righe + fix "colori spariti"
- Etichette colore (src/components/Configurator.tsx): il nome del colore (es. "Chicco Riso – Blu 609") ora ha fino a 3 righe (line-clamp-3, riquadro testo più alto): niente più troncamenti con "…".
- Fix colori che a volte sparivano: un singolo fetch fallito verso il bridge (rete instabile/timeout 8s) faceva ripiegare sui dati seed e li cachava per tutta la sessione → configuratore senza colori aggiornati fino al reload. Ora il fetch fa un secondo tentativo dopo 600ms (src/lib/bridge.ts) e la cache "degradata" scade dopo 15s e si auto-ripristina (src/data/catalog.ts).
v1.17.3 02/07/2026
Box prezzo/consegna: righe allineate tra i due riquadri
- I due box "A partire da" e "Consegna stimata" (src/components/ProductLive.tsx) ora sono su una griglia identica a 3 righe: etichette allineate e leggermente più in alto (pt-3 + leading-none), prezzo allineato alla data (riga centrale h-8 per entrambi), "per ordini superiori…" allineata a "Spedito entro…" (stesso mt-1.5).
v1.17.2 02/07/2026
Box prezzo: "IVA esclusa" a destra del prezzo, nota sotto
- Box "A partire da" (src/components/ProductLive.tsx): "IVA esclusa" ora sta a destra del prezzo (allineata alla baseline); la nota personalizzata (es. "per ordini superiori a 6 m²") sta sotto, con lo stesso stile di "Spedito entro N giorni lavorativi" (text-xs, grigio 500).
v1.17.1 02/07/2026
Nota personalizzata sotto il prezzo in pagina prodotto
- Box prezzo "A partire da" (src/components/ProductLive.tsx): se il prodotto ha la "Nota sotto il prezzo" impostata nel CRM (campo
priceNote, es. "per ordini superiori a 6mq"), viene mostrata come seconda riga piccola sotto "IVA esclusa" (src/data/catalog.ts, src/data/types.ts).
v1.17.0 02/07/2026
Piano Elevate Fase A: SEO, skeleton, breadcrumb, editor builder potenziato
- Breadcrumb + schema.org (src/components/Breadcrumb.astro): breadcrumb riusabile (aria, variante light) con JSON-LD BreadcrumbList su catalogo, categoria e prodotto; rimosso il doppione inline in ProductLive.tsx. JSON-LD Organization in Base.astro.
- Skeleton loading (src/components/Skeleton.tsx): placeholder animate-pulse al posto di "Caricamento…" in carrello, catalogo e blocchi builder ProductGrid/CategoryGrid.
- Accessibilità/perf: focus-visible ring sui bottoni (src/styles/global.css); preload dell'immagine hero LCP in home via nuovo
slot name="head"di Base (src/pages/index.astro). - Emoji → icone flat: eliminate tutte le emoji UI residue lato cliente (Reviews, ReviewInvite, CartPage, Configurator, TechnicalConfigurator, ProductLive, OrderInfoBox, AddressAutocomplete, chat); 4 icone nuove nel set Ic (Video, Phone, Bulb, Pin) in src/components/icons.tsx.
- Builder — HeroSlider: nuovi campi Transizione (dissolvenza/scorrimento/zoom, direction-aware) e Durata (ms) (src/builder/blocks.tsx); micro-fix: slide inattive con pointer-events:none (prima potevano intercettare i click sulle CTA). Retro-compatibile: pagine esistenti = fade 800ms storico.
- Builder — SEO: il titolo SEO dei root props ora arriva davvero al
<head>delle pagine builder ([src/pages/p/[slug].astro](src/pages/p/[slug].astro), src/pages/index.astro). - Editor builder: anteprima responsive con viewport nativi Puck (375/768/1280, canvas in iframe); autosave bozza in localStorage (debounce 2s) con prompt "Riprendi/Scarta"; cronologia versioni lato server (ultime 20 revisioni in
_pages/_history/, azionihistory/restorein public/pages.php, menu Cronologia nell'editor — il ripristino carica nell'editor senza pubblicare) (src/builder/Editor.tsx, src/builder/storage.ts).
v1.16.13 01/07/2026
Configuratore: "Completa la configurazione" finché mancano step
- Il pulsante Aggiungi al carrello diventa "Completa la configurazione" (stile tratteggiato) finché non sono spuntati (V) tutti gli step (src/components/Configurator.tsx); cliccandolo si viene portati al primo step mancante. La quantità (default ≥1) non blocca; riaprendo una config salvata (carrello/preventivo) gli step risultano già completi.
v1.16.12 01/07/2026
Fix anteprima logo PDF: worker pdfjs inline (MIME cPanel)
- Il worker di pdfjs veniva servito come
.mjsdal server cPanel col MIME sbagliato → il module worker non partiva e l'anteprima PDF dava errore. Ora il worker è inline (blob) (src/components/Configurator.tsx via?worker&inline): non dipende più da come il server serve i.mjs.
v1.16.11 01/07/2026
Anteprima logo PDF (rendering prima pagina)
- Logo in PDF: caricando un logo PDF ora ne viene renderizzata la prima pagina in immagine (src/components/Configurator.tsx via
pdfjs-dist, importato on-demand), con rimozione del bianco → anteprima sul tappeto, allegato email e scheda d'ordine funzionanti. Niente più errore/immagine rotta; se il PDF non è leggibile compare un messaggio chiaro (carica PNG/JPG/SVG).
v1.16.10 01/07/2026
Fix pagina prodotto: descrizione mancante + barra classificazioni verticale
- Descrizione: se
siteDescriptionHtmlè un contenitore vuoto (<p></p>), non oscura più la descrizione principale del prodotto (src/data/catalog.ts) → torna a mostrarsi. - Icone "in evidenza" sballate: la barra verticale delle classificazioni non si allunga più all'altezza della galleria (immagine alta) ma a quella del blocco informazioni, come previsto — aggiunto
self-startal contenitore (src/components/ProductLive.tsx); l'auto-fit delle icone ora combacia con l'altezza reale del testo.
v1.16.9 01/07/2026
Scheda d'ordine: testata Floormad + descrizione con a-capo + consegna stimata + loghetti
- Testata brandizzata (src/lib/orderPdf.ts): logo Floormad (dal Tema), titolo "SCHEDA ORDINE" arancio, numero ordine blu scuro, data, filetto arancio — al posto della vecchia banda blu.
- Descrizione con a-capo: la descrizione prodotto conserva elenchi puntati e paragrafi (
htmlToText) e viene stampata completa (niente più muro di testo troncato). - Consegna stimata: la data di consegna stimata (giorni lavorativi del prodotto) è calcolata al checkout, salvata sull'ordine e mostrata nella scheda (src/lib/order.ts).
- Loghetti/classificazioni (per esterni, per interni, lavabile…): le icone del prodotto vengono mostrate nella scheda d'ordine.
- Tutto salvato sull'ordine → stessa scheda in email (già allegata come
ordine-XXXX.pdf) e in backend/area cliente (src/lib/orderSheet.ts).
v1.16.8 01/07/2026
Email "Pagamento ricevuto" quando si segna il bonifico come pagato
- Quando l'admin segna come pagato un ordine (es. bonifico ricevuto) da src/components/OrdersManager.tsx, il cliente riceve ora l'email di conferma pagamento (nuovo template
order_payment_receivedin public/email.php + WhatsApp): "abbiamo ricevuto il pagamento tramite {metodo} dell'ordine n. {rif}".
v1.16.7 01/07/2026
Fix logo WEBP nell'email + filtri colore su 2 colonne
- Logo WEBP/SVG nell'email (src/components/Configurator.tsx): in stampa "A colori" (fullcolor) il logo veniva tenuto nel formato originale (es. WEBP) che i client email non renderizzano → immagine rotta. Ora il logo è sempre normalizzato in PNG (
toEmailSafeImage) per l'anteprima email e l'allegato. - Filtri colore su 2 colonne ([src/pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)): la facet "Colore" è ora una griglia 2 colonne 50/50 con chip a larghezza piena, perfettamente allineati.
v1.16.6 01/07/2026
Checkout precompilato per i clienti loggati
- Checkout precompilato (src/components/CartPage.tsx): se il cliente è loggato nell'Area Clienti, i campi di fatturazione/spedizione (nome, azienda, email, telefono, CF/P.IVA/SDI/PEC, indirizzo) vengono precompilati dal suo account, con banner "Bentornato". Non sovrascrive i dati se l'utente ha già iniziato a compilare.
v1.16.5 01/07/2026
Scheda d'ordine: SKU salvato sull'ordine (niente più "SKU" vuoto)
- SKU nella scheda d'ordine: lo SKU dell'articolo viene ora salvato sull'ordine (src/lib/order.ts) così compare anche nella scheda rigenerata da backend/area cliente; l'etichetta "SKU" è nascosta se assente (src/lib/orderPdf.ts).
v1.16.4 01/07/2026
Carrello: quantità sotto il prezzo + logo caricato cliccabile (verifica)
- Riga carrello (src/components/CartPage.tsx): il box quantità è ora sotto il prezzo (colonna allineata a destra), con il prezzo in evidenza.
- Logo caricato cliccabile: miniatura + nome file aprono una lightbox con il logo ingrandito su sfondo a scacchi (verifica nitidezza e trasparenza del file).
v1.16.3 01/07/2026
Scheda d'ordine PDF completa (con anteprima + quote) + email più pulita
- Email più pulita (src/lib/order.ts): rimossi dal corpo email la descrizione prodotto ("Caratteristiche principali…") e le didascalie "Foto prodotto" / "Anteprima config.".
- Scheda d'ordine PDF (src/lib/orderPdf.ts): per ogni prodotto titolo · descrizione · riepilogo configurazione · foto prodotto · anteprima "Il tuo prodotto" con quote (linee + numeri, es. 85×50) disegnate attorno all'anteprima, come nel configuratore.
- Anteprima con TRAMA (src/components/Configurator.tsx):
rasterizeRugPngora disegna la texture del colore (ripetuta) + bordo + logo (fallback a solo colore se il canvas viene "sporcato"). L'anteprima salvata (email/PDF) mostra la simulazione reale del tappeto. - Tutto salvato sull'ordine (src/lib/order.ts →
configuration.productImageUrl/description/previewImageUrl/logoName), così la stessa scheda si rigenera identica dal backend/area cliente (src/lib/orderSheet.ts).
v1.16.2 01/07/2026
Backend ordine: box grafica sotto il pagamento + articoli più leggibili + download per riga
- Box "Grafica dell'ordine" nel dettaglio ordine (src/components/OrdersManager.tsx) posizionato sotto "Pagamento accettato" e sopra "Stato ordine": per la Grafica Mancante mostra l'avviso + pulsante "Invia richiesta caricamento grafica" (invio manuale al cliente); per Richiesto cambio i pulsanti Approva/Nega; per Grafica caricata rimanda agli allegati.
- Articoli più leggibili: ogni riga mostra nome + chip (colore, misura, stampa) invece del testo compresso, con miniatura logo, e download per riga (Scarica logo · Scheda tecnica · Scheda d'ordine).
- Sezione Allegati (colonna sinistra): elenco completo grafiche/documenti + Scheda d'ordine PDF.
v1.16.1 01/07/2026
Impostazioni Sito: sotto-schede per categoria (basta muro di sezioni)
- Impostazioni Sito (src/components/SiteSettings.tsx): la pagina era un muro unico di sezioni impilate, illeggibile. Ora è divisa in sotto-schede con barra tab sticky: Generale · SEO & Analytics · Menu & Badge · Pagamenti · Recensioni · Notifiche.
- Salva sempre visibile: pulsante Salva spostato nell'header sticky (salva l'intero set, qualunque scheda sia aperta); rimosso il pulsante in fondo.
- Nessun cambio a dati/schema: solo raggruppamento/ordinamento delle sezioni esistenti (Cookie → SEO & Analytics, Flag/Badge → Menu & Badge, badge "Pagamenti sicuri" → Pagamenti).
v1.16.0 01/07/2026
Scheda ordine: grafica mancante / cambio grafica + allegati + dashboard stati + fix preventivi
- Nuovo box "Non ho al momento la grafica" accanto all'upload nello step Stampa (src/components/Configurator.tsx): il cliente può comprare "con grafica" e inviare il logo dopo → l'ordine nasce in stato Grafica Mancante. Layout upload 66% / box "invierò dopo" 33%, step a larghezza piena (non più bloccato a 480px).
- Balloon guida step: testo più grande e lampeggio più lento; rimosso il titolo "Configura il tuo …" ridondante.
- Campo
graphicStatesull'ordine:PROVIDED / MISSING / UPLOADED / CONFIRMED / CHANGE_REQUESTED / CHANGE_APPROVED / CHANGE_DENIED+ timer/lock (graphicChangeUsed,graphicMissingSince,graphicReminderLast,graphicStaffAlerted). - Area Clienti (src/components/Account.tsx): badge lampeggiante di stato grafica, sezione Allegati (grafiche/loghi + documenti, sola visualizzazione + download), download scheda d'ordine PDF (rigenerata on-demand), pulsante "Carica grafica adesso" (grafica mancante) con conferma, e "Richiedi cambio grafica" (consentito 1 sola volta, bloccato se l'ordine è in lavorazione) con avviso.
- Backend account.php: azioni
request_graphic_change,upload_graphic,confirm_graphic(validano proprietà ordine + stato produzione); i file grafica del cliente vengono salvati in_orderfiles/<ordine>/. Alla conferma del cliente l'ordine va in produzione (se pagato, altrimenti in attesa di pagamento). - Backend Ordini (src/components/OrdersManager.tsx): cruscotto stati a colpo d'occhio (con Grafica mancante / Richiesto cambio / Da verificare lampeggianti), badge grafica in elenco, pannello Grafica & allegati (download grafiche + scheda PDF) e pulsanti Approva / Nega la richiesta di cambio (email al cliente).
- Email (public/email.php): nuovi template
graphic_change_req_staff,graphic_received_staff,graphic_missing_staff,graphic_change_approved,graphic_change_denied,graphic_missing_reminder. - Cron (public/postsale.php): promemoria giornaliero al cliente per la grafica mancante + alert allo staff dopo 2 giorni.
- Fix perdita immagine: il logo dei preventivi salvati non viene più scartato oltre 1.5MB — ora è salvato come file in
_leadmedia/e recuperato per URL (public/leads.php). - Ripresa preventivo (src/components/LeadRecover.tsx + src/components/ProductLive.tsx): riapre la pagina prodotto completa (galleria, titolo, prezzo…) come quando si è sul prodotto, non più solo gli step.
- Nuovo backend "Preventivi web" (src/components/LeadsAdmin.tsx,
/preventivi): storico dei preventivi salvati + pulsante "Invia sconto extra %" (crea un coupon percentuale monouso e lo invia al cliente con il link di ripresa; templatelead_discount).
v1.15.3 01/07/2026
Recensioni prodotto: card intere (niente taglio) + scroll automatico
- Slider recensioni (src/components/Reviews.tsx): le card ora hanno larghezza responsive (1 su mobile, 2 intere su desktop,
calc(50%-0.5rem)) invece di 320px fissi → non si vede più la seconda card tagliata. - Scroll automatico: la slider avanza di una pagina ogni 5s e riparte da capo a fine lista; in pausa al passaggio del mouse. Le frecce ‹ › e lo swipe restano.
v1.15.2 01/07/2026
Launcher chat senza coda + badge Stripe nei pagamenti
- Launcher chat: rimossa la "coda" a fumetto sotto l'icona in basso a destra; ora è una bolla arrotondata pulita con dentro l'immagine (o l'icona flat). (components/ChatAgent.tsx)
- Stripe tra i "Pagamenti sicuri": aggiunto il badge Stripe (viola brand), selezionabile in *Impostazioni Sito › Pagamenti sicuri* e incluso di default. Per mostrarlo sul sito attuale: spunta Stripe in Impostazioni Sito e salva. (components/PaymentBadges.tsx, components/SiteSettings.tsx, lib/siteSettings.ts)
v1.15.1 01/07/2026
Chatbot: voce automatica dopo il primo messaggio
- La chat ora legge le risposte ad alta voce automaticamente dopo il primo messaggio scritto dall'utente (l'invio è il gesto che sblocca l'audio nel browser). L'utente può mutare in qualsiasi momento col pulsante voce nell'header: la scelta di mutare viene ricordata e la voce non si riattiva da sola. (components/ChatAgent.tsx)
v1.15.0 01/07/2026
Carrello/checkout: foto+anteprima, modifica riga, merge identici, scheda ordine PDF completa
- Doppia immagine per riga: nel carrello ogni prodotto mostra sia la Foto prodotto originale sia l'Anteprima configurata (colore/bordo/logo), entrambe ingrandibili. Il fumetto di anteprima mostra le due immagini affiancate + tutti i dettagli + logo con nome file. (src/components/CartPage.tsx)
- Modifica riga d'ordine: nuovo pulsante Modifica (e "Riprendi e modifica") che riapre il configuratore pre-compilato con l'esatta configurazione della riga; il pulsante diventa "Aggiorna prodotto nel carrello" e sostituisce quella riga invece di aggiungerne una nuova. Vale sia per il configuratore standard che per quello tecnico (LUXTURF). (src/components/CartPage.tsx, src/components/ProductLive.tsx, src/components/Configurator.tsx, src/components/TechnicalConfigurator.tsx)
- Righe identiche = quantità sommate: due configurazioni diverse dello stesso prodotto restano righe separate; identiche vengono unite (qty += ) via firma di configurazione. (src/lib/cart.ts)
- Scheda d'ordine PDF completa (allegata all'email): per ogni riga foto prodotto + anteprima con logo, riepilogo completo (misura, incavo, stampa, colore fondo, bordo, materiale bordo, colore stampa, spessore, ecc.), logo di stampa + nome file, nome e descrizione prodotto. Impaginazione curata. (src/lib/orderPdf.ts)
- Email d'ordine più ricca: dettagli riga come nel carrello, foto + anteprima + logo (nome file) inline, descrizione prodotto; allegati = scheda ordine PDF + logo/i + anteprima/e + scheda tecnica. (src/lib/order.ts)
v1.14.3 01/07/2026
Scheda prodotto: sottotitolo nel colore Brand (primario)
- Il sottotitolo del prodotto ora usa il colore Brand primario (
text-brand, blu) invece dell'accent (arancione). (src/components/ProductLive.tsx)
v1.14.2 01/07/2026
Scheda prodotto: icona non rimpicciolita dai pallini + gap/testo descrizione dal CRM
- Icona a piena dimensione anche coi pallini: l'icona dentro il box usa sempre tutto lo spazio del box e non viene più ridotta quando ci sono i pallini (che ora si sovrappongono in basso). Utile con box piccoli. (src/components/ProductLive.tsx)
- Distanza icone configurabile: nuovo slider CRM (Icone Prodotto → Stile globale). In verticale è il massimo (oltre, il gruppo resta centrato); in orizzontale è il gap della riga. (src/components/ProductLive.tsx, src/data/catalog.ts)
- Dimensione testo descrizione (fumetto): nuovo slider CRM; il fumetto usa quel font (default 12px) con interlinea più stretta. (src/components/ProductLive.tsx)
v1.14.1 01/07/2026
Scheda prodotto: colonne icone laterali per conteggio (≤6 = 1 colonna, >6 = 2 colonne)
- Regola colonne semplice: la sidebar icone verticale usa 1 colonna fino a 6 icone e 2 colonne oltre le 6 (7→4+3, 8→4+4, 10→5+5). Sostituisce la scelta basata su scaling/isteresi. Restano attivi l'adattamento all'altezza del blocco e il gap ≤30px con gruppo centrato verticalmente. (src/components/ProductLive.tsx)
v1.14.0 01/07/2026
Carrello: anteprima del prodotto configurato + dettagli completi
- Carrello/checkout (src/components/CartPage.tsx): la miniatura di ogni riga ora mostra l'anteprima renderizzata della configurazione (
previewDataUrl: colore + bordo + logo) invece della sola foto prodotto. - Dettagli completi per ogni articolo (da
configDetails): Colore, Misura, Spessore, attributi, Incavo, Bordo/Profilo perimetrale (materiale, es. gomma), Stampa — al posto del riepilogo compresso. Mantenuto il badge "esito verifica misura". - Logo stampato: mostrata la miniatura del logo caricato sotto i dettagli.
- Click sull'anteprima → modale ingrandita con preview grande, tabella dettagli e logo di stampa.
v1.13.0 01/07/2026
Card prodotto: rimosso tag "Configurabile" + icone-badge sopra l'immagine
- Rimosso il tag "Configurabile" dalle card prodotto (griglia "In evidenza"/builder e catalogo). (src/builder/dataBlocks.tsx, src/components/CatalogBrowser.tsx)
- Icone-badge sopra l'immagine: le classificazioni con flag "Mostra sopra l'immagine" (impostato nella libreria icone del CRM) compaiono come piccoli badge in sovrimpressione sull'immagine del prodotto (in basso a sx), oltre che nel banner/sidebar. Es. "Stampato", "Su misura al cm". Nuovo componente ImageBadges.tsx, reso in ProductCard, griglia builder e catalogo. Flag propagato in catalog.ts.
v1.12.0 01/07/2026
Recensioni: chi non ha acquistato può chiedere di recensire + modifica testo (moderazione)
- Solo acquirenti recensiscono: se un cliente loggato che non ha acquistato prova a recensire, ora appare il pulsante "Richiedi di poter recensire" (src/components/Reviews.tsx) → invia una richiesta all'admin (nuova azione
request_permission). L'admin la vede in *Recensioni → Log richieste* come "Da autorizzare" e con "Autorizza e invia link" (src/components/ReviewsModeration.tsx) manda l'invito tokenizzato (authorize_request). "Accedi per recensire" porta all'area clienti con lo storico ordini. - Modifica recensione dal backend sito (stessa funzione del CRM): correggi voto/nome/titolo/testo inline. Backend
mod_edit(public/reviews.php).
v1.11.1 01/07/2026
Recensioni: 5 stelle preselezionate di default nel form
- All'apertura del form recensione (scheda prodotto src/components/Reviews.tsx e pagina invito src/components/ReviewInvite.tsx) la valutazione parte già a 5 stelle (l'utente può abbassarla). Meno attrito, default positivo.
v1.11.0 01/07/2026
Ciclo ordine e-commerce: Pagato manuale · Spedito automatico · Completato automatico (+2 giorni)
- Backend sito → Ordini (src/components/OrdersManager.tsx): stati ordine allineati al ciclo reale In attesa → Pagato → Spedito → Completato (+ Rimborsato/Annullato/Bozza/Cestinato), con chip filtro aggiornati.
- Segna come pagato (manuale): nel box pagamento dell'ordine, quando NON risulta pagato, pulsante "✓ Segna come pagato" (utile per i bonifici ricevuti). Scrive
paymentStatus=PAID+paidAt+paymentManual. Per i pagamenti segnati a mano c'è "Annulla pagamento". _(In futuro: sync con la riconciliazione bancaria.)_ - Spedito automatico: inserendo il tracking l'ordine passa a Spedito, con
shippedAt(data spedizione) eorderStatus=Speditoscritti sul CRM (letti da Area Clienti e cron). Email "spedito" al cliente come prima. - Completato automatico (+2 giorni): nuovo passaggio nel cron post-vendita (public/postsale.php) che, 2 giorni dopo la spedizione, imposta
orderStatus=Completatoe invia l'emailorder_completedal cliente. In UI l'ordine risulta Completato anche prima del cron (derivato dashippedAt+2gg). Il promemoria recensioni parte poi dai giorni configurati dopo il completamento. - Il cron
postsale.phpora esegue l'auto-completamento anche a post-vendita/recensioni disattivato (i due passaggi sono indipendenti).
v1.10.0 01/07/2026
Recensioni nel backend sito + "Richiedi recensione" dentro l'ordine
- Backend sito → Recensioni (src/components/ReviewsModeration.tsx) ora a tab: *Moderazione* + Richiedi Recensione (prodotto + cliente/email + sconto % + anteprima lettera) + Log richieste (stato inviata→aperta→recensita + testo). Stesso pannello del CRM, portato anche qui.
- Pulsante "Richiedi recensione" dentro l'ordine (src/components/OrdersManager.tsx): invio forzato anche prima degli XX giorni del promemoria automatico; marca l'ordine come
reviewEmailSentcosì il cron non reinvia; quando il cliente recensisce lo stato diventa ✓ Recensito (verde) e cliccandolo si legge la recensione. create_requestora accettaorderIdper collegare la richiesta all'ordine (public/reviews.php); client esteso conadminCreateRequest/adminListRequests(src/lib/reviews.ts).- Sconto erogato SOLO dopo la recensione: l'email d'invito non contiene più il codice; ora mostra il nome prodotto grande con link alla scheda e promette lo sconto "al termine della recensione". Il coupon viene generato e inviato quando il cliente pubblica la recensione (nuovo template email
review_coupon: prodotto in grande, "sconto del X%", "usa il codice … al checkout" su righe separate). (public/reviews.php, public/email.php)
v1.9.0 01/07/2026
Preventivo: "Salva e ricevi per email" (link di recupero) + canale selezionabile Email/WhatsApp
- Salva preventivo → email (nuovo default): il pulsante nel configuratore ora invia una mail col link di recupero invece di aprire WhatsApp.
- Cliente loggato: pulsante "Salva preventivo e ricevilo sulla tua mail *email*" → invio diretto all'email registrata.
- Ospite non loggato: al click compare subito sotto un campo email ("Salva preventivo · Ricevi sulla mail") → inserisce l'indirizzo e riceve il link. (src/components/Configurator.tsx)
- WhatsApp conservato: la vecchia modalità resta disponibile e si seleziona da Impostazioni Sito › Notifiche e Comunicazioni (Email / WhatsApp). (src/components/SiteSettings.tsx,
leadDeliveryin src/lib/siteSettings.ts) - Nuovo template email
lead_recover(link al cliente), editabile da *Email & WhatsApp*. (public/email.php, src/components/EmailSettings.tsx)
v1.8.0 01/07/2026
Configuratore: bordo/profilo secondo il CRM + colore fisso non selezionabile
- Il termine dello step ("Bordo perimetrale" o "Profilo perimetrale"), le card ("Nessun bordo/profilo" e la card di scelta) e le etichette del riepilogo/carrello seguono ora la scelta fatta nel CRM (
border.term). (src/components/Configurator.tsx) - Quando il CRM imposta un colore del bordo non selezionabile, il bordo viene disegnato con quel colore (default Nero) senza mostrare il selettore al cliente. Il selettore compare solo se il CRM rende il colore selezionabile.
v1.7.1 01/07/2026
Tema: dimensione base (scala "DPI") differenziata Mobile / Tablet / Desktop
- Impostazioni tema › Font: la vecchia "Dimensione carattere" (slider unico) diventa tre slider — Mobile (≤640px), Tablet (641–1023px), Desktop (≥1024px) — per scalare l'intero sito (rem) partendo da 16px, aumentando o diminuendo per fascia di dispositivo. (src/components/ThemeSettings.tsx)
- Il tema salva ora
fontSizes {desktop,tablet,mobile}(retrocompat: il vecchiofontSizeresta e viene usato come desktop; i default tablet/mobile derivano dal desktop −1/−2). (src/lib/siteTheme.ts) global.cssmappa le variabili--fs-base/--fs-tablet/--fs-mobilesui breakpoint (cascata per max-width); rimossa la vecchia riduzione fissa −2/−3px. (src/styles/global.css)
v1.7.0 01/07/2026
Recensioni: upload video + invito a recensire (link tokenizzato) + approvazione manuale
- Video nelle recensioni: oltre alle foto ora si può allegare una clip breve (max 15MB), sia dalla scheda prodotto (src/components/Reviews.tsx) sia dall'invito. Le recensioni vengono pubblicate solo dopo l'approvazione dal CRM.
- Pagina invito
/recensione?rt=(src/pages/recensione.astro, src/components/ReviewInvite.tsx): chi riceve la richiesta dal CRM può recensire senza login (il token prova l'invito). Client esteso conuploadMedia/requestInfo/addViaRequest(src/lib/reviews.ts). - Moderazione backend (src/components/ReviewsModeration.tsx) con nuovo filtro "In attesa". Limiti PHP per l'upload video (public/.user.ini).
v1.6.3 01/07/2026
Scheda prodotto: spaziatura icone con tetto a 30px + gruppo centrato verticalmente
- Gap massimo 30px: le icone non si distanziano più a tutta altezza. Il gap tra un'icona e l'altra cresce per riempire lo spazio ma non supera i 30px; oltre, lo spazio in eccesso resta come margine. (src/components/ProductLive.tsx)
- Centratura verticale: quando le icone non riempiono la barra (gap già al massimo), il gruppo viene centrato verticalmente nella barra (
justify-center), sia su 1 che su 2 colonne. La barra resta comunque a tutta altezza. (src/components/ProductLive.tsx)
v1.6.2 01/07/2026
Scheda prodotto: barra icone sempre a tutta altezza (full-height) + icone distanziate equamente
- Barra blu a tutta altezza: la sidebar icone verticale ora si stira all'altezza del blocco info (fino al pulsante *Scheda tecnica*), non si ferma più all'altezza delle sole icone. (src/components/ProductLive.tsx)
- Distribuzione equa: le icone sono spaziate uniformemente lungo tutta l'altezza (
justify-between), sia su 1 che su 2 colonne. Restano comunque entro l'altezza (lo scaling anti-overflow resta attivo). (src/components/ProductLive.tsx)
v1.6.1 01/07/2026
Scheda prodotto: sidebar icone Caratteristiche si adatta all'altezza (no overflow) + 2 colonne quando servono
- Sidebar icone verticale (posizione left/right): la colonna di icone non sfora più sotto il blocco info (titolo → pulsante *Scheda tecnica*). Ora misura l'altezza del blocco e rimpicciolisce le icone quanto basta per rientrarci. (src/components/ProductLive.tsx)
- Passaggio automatico a 2 colonne: se una singola colonna dovesse rimpicciolire troppo (oltre ~30%, cioè scala < 0.70) le icone vanno su 2 colonne bilanciate (10→5+5, 8→4+4, 7→4+3), sempre entro l'altezza del blocco. Con 6 o meno di norma restano su una colonna stringendo il minimo. Isteresi 0.70/0.85 per evitare flip-flop mentre il blocco info cambia altezza. (src/components/ProductLive.tsx)
- Re-layout reattivo via
ResizeObserver: adatta scala/colonne al variare dell'altezza (testo, immagini, resize finestra). Vale solo per la sidebar verticale; la banda orizzontale resta invariata. (src/components/ProductLive.tsx)
v1.6.0 01/07/2026
Configuratore: stampa 3/4 colori (scelta manuale) · colore bordo selezionabile · spessore singolo senza step
- Stampa logo: nuove modalità 3 colori e 4 colori. Il cliente sceglie i colori dalla palette Nero, Bianco, Rosso, Blu, Giallo, Verde; deve selezionarne esattamente N (1/2/3/4 in base alla modalità). Anteprima automatica per posterizzazione a N bande (scuro→chiaro). (src/components/Configurator.tsx)
- Bordo perimetrale: se il CRM lo abilita, il cliente sceglie il colore del bordo (default Nero); l'anteprima (icone, live e snapshot carrello/PDF) usa il colore scelto. Il materiale (es. Gomma) compare nel riepilogo e nelle specifiche (Bordo in Gomma). (src/components/Configurator.tsx, src/data/catalog.ts)
- Spessore: con una sola opzione non è più uno step del configuratore — resta fisso e viene mostrato nel riepilogo e nelle specifiche del prodotto. Con più opzioni resta selezionabile. (src/components/Configurator.tsx, src/data/catalog.ts)
v1.5.7 01/07/2026
Filtri categoria: gruppo Spessore + icone Caratteristiche su box (non più invisibili)
- Nuovo filtro "Spessore" nella sidebar categoria, con mini-pill (es.
8 mm,10 mm,12 mm) in ordine crescente. Valori presi datechnical.thicknessOptionse dai preset dicustomThickness. ([pages/categoria/[slug].astro](src/pages/categoria/%5Bslug%5D.astro)) - Icone delle Caratteristiche ora visibili: le icone-classificazione sono PNG bianchi pensati per un box scuro → su fondo bianco sparivano. Ora ogni icona sta in un box con sfondo (stesso ragionamento del banner "in evidenza": bg scuro dell'icona, o box grigio chiaro per i tag semplici), con
iconColorapplicato via mask quando previsto. ([pages/categoria/[slug].astro](src/pages/categoria/%5Bslug%5D.astro), rif. components/ProductLive.tsx)
v1.5.6 01/07/2026
Configuratore colori: box tutti alla stessa altezza + nome su 2 righe
- Nel configuratore, i box colore hanno ora tutti la stessa altezza: l'area del nome ha altezza fissa, fondo bianco e testo centrato. (src/components/Configurator.tsx)
- Il nome viene mostrato su 2 righe quando ha un codice: es. B01 (riga 1) / Nero (riga 2). I nomi senza codice (es. "Nero 110", "Viola 137") restano interi. (src/components/Configurator.tsx)
v1.5.5 01/07/2026
Scheda prodotto: pulsante "SCHEDA TECNICA" a larghezza piena
- Pulsante Scheda tecnica più grande e prominente: testo maiuscolo "SCHEDA TECNICA", larghezza piena (come il blocco prezzo/consegna sopra), padding e icona ingranditi. (components/ProductLive.tsx)
v1.5.4 01/07/2026
Chatbot: sottotitolo header nel colore secondario (accent)
- Sottotitolo "Ti aiuta a scegliere il prodotto" nell'header della chat ora usa il colore secondario del tema (
text-accent) invece del bianco semitrasparente. (components/ChatAgent.tsx)
v1.5.3 01/07/2026
Chatbot: icone flat, launcher a fumetto + immagine avatar caricabile
- Launcher a fumetto: il pulsante della chat non è più un cerchio con emoji ma una bolla (fumetto) con coda; dentro mostra l'immagine dell'avatar (o l'icona flat
Chatdi default). (components/ChatAgent.tsx) - Immagine del chatbot caricabile dalla sezione Chat: in *Chat clienti* (backend) c'è ora "Immagine del chatbot" → carica un'immagine che compare nel fumetto e nell'header della chat. Salvata in
settings.chat.avatarUrl, letta a runtime dal widget (nessun redeploy per aggiornarla). (components/ChatsAdmin.tsx, lib/siteSettings.ts) - Icone flat ovunque nella chat (niente emoji come icone UI): header, toggle voce (
Volume/VolumeOff), reset (Refresh), chiudi (Close), email gate (Mail), etichetta operatore (User); e lato admin (elimina, entra in conversazione, stato live/attesa). Nuove iconeClose/Volume/VolumeOff. (components/icons.tsx)
v1.5.2 01/07/2026
Icone attributi più grandi quando ci sono i pallini
- Icona più grande in presenza di pallini: lo spazio riservato sotto l'icona per la riga di pallini scende da
15pxa10px(ora pari a quanto i pallini occupano davvero) e i pallini stanno abottom-0.5. L'icona non si rimpicciolisce più troppo — soprattutto sui box piccoli (dove i 15px fissi arrivavano fino a ~30% dell'altezza). Nessuna sovrapposizione icona/pallini. (components/ProductLive.tsx)
v1.5.1 01/07/2026
Recensioni: bannerino Google/Trustpilot/judge.me + sezione Impostazioni
- Bannerino recensioni riutilizzabile con i badge dei servizi (Google, Trustpilot, judge.me + "Le nostre recensioni"): logo, voto con stelle, n° recensioni e link al profilo. Nuovo island components/ReviewBadges.tsx, si aggiorna a runtime dalle impostazioni (come i badge pagamenti). Mostrato in scheda prodotto, homepage, footer e carrello/checkout (posizioni attivabili singolarmente). (components/Footer.astro, pages/index.astro, components/ProductLive.tsx, components/CartPage.tsx)
- Nuova sezione "Recensioni" in *Impostazioni sito*: abilita il bannerino, sceglie dove mostrarlo, e per ogni servizio imposta link + voto + n° recensioni. Modello ibrido: oggi i voti sono inseriti a mano (
source: 'manual'), la struttura è già pronta per il live via API (Place ID Google, Trustpilot Business, judge.me) senza rifare nulla. La vecchia sezione "Post Vendita Cliente" è stata assorbita qui. (components/SiteSettings.tsx, lib/siteSettings.ts) - Email post-consegna: oltre alla recensione sul nostro sito, ora invita a recensire anche su Google/Trustpilot/judge.me (pulsanti per i servizi attivi) offrendo lo sconto configurabile. Nuovo segnaposto
{servizi}nel templatereview_request. (public/postsale.php, public/email.php) - ⚠️ Una tantum: se il template email era già stato personalizzato, apri *Email → "Ordine consegnato (+ recensione)"* e aggiungi il segnaposto
{servizi}dove vuoi i pulsanti dei servizi (i template nuovi lo includono già).
v1.4.36 01/07/2026
Sidebar filtri nelle pagine categoria (colore per famiglia + attributi)
- Sidebar filtri nella pagina categoria (es. /categoria/zerbini-e-tappeti/): filtro per Colore e per Caratteristiche. Prodotti resi lato server (SEO intatta), filtro istantaneo lato client (nessuna chiamata). OR dentro un gruppo, AND fra gruppi; conteggio risultati live, "Azzera", toggle Filtri su mobile. ([pages/categoria/[slug].astro](src/pages/categoria/%5Bslug%5D.astro))
- Colori raggruppati per FAMIGLIA: i tanti colori dei prodotti (es. *Arancio 101, Arancio scuro, Arancetto, Arancino*) vengono raccolti in un'unica pastiglia "Arancio". Match sul nome (colori italiani) con fallback sulla tinta HEX (HSL). ~13 famiglie + "Altri". (lib/colorFamily.ts)
- Caratteristiche = attributi/tag del prodotto (con icona quando presente, es. *Per esterno / Per interno*): usa gli stessi tag già mostrati sulle card. (data/catalog.ts)
- Card prodotto ad altezza uniforme (
h-full) dentro la griglia filtrabile. (components/ProductCard.astro)
v1.4.35 01/07/2026
Campanella "Attiva notifiche" (fix trillo/banner che non partivano)
- Fix: trillo e banner non partivano perché i browser richiedono un gesto utente per far suonare l'audio (AudioContext "suspended") e per mostrare il prompt del permesso notifiche (chiamato da un timer non apre nulla). Aggiunta una campanella nella barra admin (in alto a destra, visibile ad admin/gestore chat): al clic sblocca l'audio, chiede il permesso notifiche e fa un trillo di prova. Pallino rosso finché non è attiva. (components/AdminBar.tsx)
- Logica audio/notifiche centralizzata in lib/notify.ts (AudioContext condiviso e ripreso al primo click,
notifymostra il banner solo se il permesso è concesso). Usata sia dalla barra site-wide sia dalla pagina Chat. IconeBell/BellOff. (components/ChatsAdmin.tsx, components/icons.tsx)
v1.4.34 01/07/2026
Notifiche chat su tutto il sito + ruolo "Gestore chat"
- Notifiche + trillo dei nuovi messaggi in chat su QUALSIASI pagina del sito (non solo nella sezione Chat): mentre un admin o un gestore chat naviga il sito, un nuovo messaggio non letto fa trillare (WebAudio) e mostra una notifica browser cliccabile che apre la conversazione. Poller site-wide nella barra admin, ogni 10s; sulla pagina Chat resta il poller dedicato (niente doppio trillo). (components/AdminBar.tsx, public/chat.php
count_chatsora ritornalastUnreadAt/latest) - Nuovo ruolo "Gestore chat" in *Utenti admin*: oltre all'Amministratore (accesso completo) si può creare un utente Gestore chat. Il ruolo è portato nella sessione (
role) e determina chi riceve notifiche/trillo — i clienti sono sempre esclusi. (components/AdminUsers.tsx, public/pages.php, builder/storage.tsgetSession)
v1.4.33 30/06/2026
Chat con operatore in tempo reale + sottotitolo prodotto
- Subentro operatore live nel chatbot: un operatore (admin) può entrare in conversazione sostituendo il bot. Il cliente riceve il prompt *"Un operatore (Nome) sta subentrando… vuoi accettarlo? Sì/No"*; se accetta, chat in tempo reale (polling) con messaggi dell'operatore evidenziati e banner "in linea". Lato admin (Chat): pulsante Entra in conversazione (chiede il nome operatore), input live, Termina (torna al bot). (public/chat.php, components/ChatAgent.tsx, components/ChatsAdmin.tsx)
- Notifica + trillo all'operatore loggato nella sezione Chat quando un cliente scrive (suono WebAudio + notifica browser), con accesso diretto alla conversazione. (components/ChatsAdmin.tsx)
- Sottotitolo prodotto: mostrato in arancio sotto il titolo sulla scheda. (components/ProductLive.tsx, data/catalog.ts)
- Chat in cima al menu del backend admin. (components/AdminDashboard.tsx)
v1.4.32 30/06/2026
Voce realistica nell'assistente (Gemini TTS)
- L'assistente (chatbot) può leggere ad alta voce le risposte con voce realistica Gemini TTS (
gemini-2.5-flash-preview-tts, stessa chiave Gemini del CRM). Toggle 🔈/🔊 nell'header della chat; fallback automatico alla voce del browser (Web Speech, voce Google se disponibile) se il TTS non è disponibile. (public/tts.php, lib/tts.ts, components/ChatAgent.tsx)
v1.4.31 30/06/2026
Anteprima visiva, step Spessore, preventivo WhatsApp, sticky mobile
- Anteprima visiva live: nel configuratore il tappeto mostra il bordo perimetrale arancione sui lati scelti (sidebar, ramo a pezzo e modale ingrandita). Allo "Aggiungi al carrello" viene generato uno snapshot PNG (
previewDataUrl) con colore+bordo+logo, usato in carrello/PDF/email;order.tspopolaborder.{hasBorder,sides}epreviewImageUrl. (Configurator.tsx, lib/order.ts, lib/cart.ts) - Step "Spessore": lo spessore configurabile è ora uno step dedicato con card numero grande + "mm" per i preset e card Personalizzato che apre lo slider. (Configurator.tsx)
- Preventivo salva-e-recupera (WhatsApp): nuova CTA "Salva preventivo · ricevi su WhatsApp" che salva la configurazione (token) e apre WhatsApp col riepilogo + link di recupero
/preventivo?t=…che reidrata il configuratore; notifica allo staff via email (mai al cliente). (leads.php, lib/leads.ts, components/LeadRecover.tsx, pages/preventivo.astro, public/email.php) - Sticky mobile: la barra prezzo+CTA mostra il nudge fascia anche su mobile e rispetta la safe-area iOS. (Configurator.tsx, TechnicalConfigurator.tsx)
v1.4.30 30/06/2026
Step Bordo perimetrale nel configuratore
- Nuovo step "Vuoi il bordo perimetrale?" (Nessun profilo / Profilo perimetrale). In modalità *lati selezionabili* mostra le 8 combinazioni A/B con anteprima e prezzo; il costo = metri lineari dei lati scelti × €/ml (o gratis se incluso). Si somma al totale per pezzo ed è riportato nel riepilogo e nel carrello. (Configurator.tsx, configSchema.ts)
v1.4.29 30/06/2026
Permalink univoci + orientamento fuori dagli attributi
- Slug/permalink univoci: due prodotti con lo stesso nome non collidono più sullo stesso URL. Si usa lo slug scelto nel CRM; i duplicati ottengono suffisso
-1,-2, … (prima ne restava raggiungibile uno solo). (catalog.ts, crm/types.ts) - L'attributo Orientamento non genera più uno step nel configuratore: l'orientamento esce in automatico dalle card dedicate. (configSchema.ts)
v1.4.28 29/06/2026
Spessore configurabile nel configuratore
- Selettore Spessore nel configuratore: pulsanti per gli spessori fissi (es. 8/11 mm) + opzione Personalizzato con slider (range min→max), prezzo per mm sommato al totale per pezzo e incluso nel carrello. (Configurator.tsx)
v1.4.27 29/06/2026
Stampa: card con/senza grafica (PNG globali) + upload blink/drag&drop
- Step Stampa a 2 card (Con grafica / Senza grafica) con PNG globali (da Icone Prodotto), default Con grafica. (Configurator.tsx)
- Box "Carica il tuo logo/grafica" ora lampeggia e il drag & drop funziona (fix).
- Card Modalità misura ora usano la config globale (da impostazioni CRM). (catalog.ts)
v1.4.26 29/06/2026
Banda: match solo decimali + favicon configurabile
- Banda fissa: una misura conta come banda solo se differisce < 1 cm (assorbe i decimali, niente tolleranza ±%): es. 83 NON è più trattato come banda 85. (configSchema.ts, Configurator.tsx)
- Favicon configurabile da
/sito/impostazioni→ SEO → "Favicon (URL)"; fallback al favicon di default +apple-touch-icon. (Base.astro, SiteSettings.tsx)
v1.4.25 29/06/2026
Fumetto: spessore bordo configurabile
- Il fumetto descrizione rispetta lo spessore bordo (px) impostato nel CRM (0 = nessun bordo). (ProductLive.tsx)
v1.4.24 29/06/2026
Classificazioni: fumetto descrizione con fondo/bordo configurabili
- Il tooltip "fumetto" della descrizione usa fondo e bordo impostati nel CRM (coda inclusa). (ProductLive.tsx)
v1.4.23 29/06/2026
Classificazioni: mostra anche quelle SENZA pallini nel banner
- Fix: una classificazione senza pallini ma con icona non spariva più — ora tutte le icone-classificazione appaiono nel banner "in evidenza" (pallini opzionali), con tooltip descrizione. La riga badge resta solo per eventuali badge testuali senza icona. (catalog.ts)
v1.4.22 29/06/2026
Classificazioni: icona non si sovrappone più ai pallini
- Con i pallini, l'icona riserva spazio in basso (~15px): si rimpicciolisce e sale leggermente, niente sovrapposizione. Senza pallini resta centrata a piena dimensione. (ProductLive.tsx)
v1.4.21 29/06/2026
Classificazioni: allineamento riga + dimensione box
- Allineamento riga icone nella barra (sx/centro/dx); icona sempre centrata nel box. Dimensione box scalabile (50–160%). (ProductLive.tsx, catalog.ts)
v1.4.20 29/06/2026
Configuratore: balloon guida "INIZIA QUI" lampeggiante
- Il blocco guida step ("INIZIA QUI…") ora lampeggia tutto (sfondo + alone pulsante) per maggiore evidenza, testo più marcato. (Configurator.tsx, TechnicalConfigurator.tsx)
v1.4.19 29/06/2026
Classificazioni: allineamento/dimensione/posizione + descrizione per pallino
- Allineamento icona (sx/centro/dx) e dimensione (slider, default 80%) dal CRM. Fondo box trasparente mostra il fondino della barra.
- Posizione blocco: prima/dopo il titolo, dopo la descrizione, oppure verticale a sinistra/destra della colonna. (ProductLive.tsx)
- Descrizione hover per livello pallino: l'hover usa il testo del n° pallini scelto (5 testi configurabili nel CRM). (catalog.ts)
v1.4.18 29/06/2026
Classificazioni: box quadrato, colori, tooltip a fumetto, nome/immagine live
- Box quadrato con icona centrata all'85%; pallini sovrapposti in basso (non spostano l'icona): attivi pieni, restanti a contorno, colore configurabile. Nome solo fuori dal box, colore configurabile. (ProductLive.tsx)
- Nome/immagine/descrizione LIVE dalla libreria CRM (per
iconId); lo stile è quello globale. (catalog.ts) - Tooltip descrizione a fumetto (≥300px) con coda verso il basso.
v1.4.17 29/06/2026
Classificazioni: stile risolto LIVE da libreria CRM + barra globale
- Stile live: il banner risolve lo stile di ogni icona in tempo reale dalle impostazioni CRM (
iconStyleDefaults+ libreriaproductIcons/classificationLibrarypericonId+ override). Niente più snapshot: modificare un'icona nel CRM aggiorna il sito. (catalog.ts) - Barra di fondo (bg + bordo) presa da
classificationBanner(impostazioni CRM). Rimosso il controllo duplicato da /sito/impostazioni. (ProductLive.tsx)
v1.4.16 29/06/2026
Banner classificazioni: più compatto + sfondo banner configurabile
- Classificazioni più piccole: icona 56→64px (era 90), padding ridotto. (ProductLive.tsx)
- Sfondo banner globale: nuovo campo in
/sito/impostazioni→ "Classificazioni in evidenza" (colore o trasparente, default scuro). Si applica al riquadro dietro tutte le icone; le icone senza fondo proprio ereditano questo sfondo, pallini a contrasto. (SiteSettings.tsx, siteSettings.ts)
v1.4.15 29/06/2026
Banner classificazioni: box personalizzabile (colore icona/fondo/bordo/descrizione)
- Banner "in evidenza" ora rispetta lo stile impostato per ogni classificazione: colore icona (ricolora i PNG bianchi via CSS mask), fondo (colore/trasparente), bordo, nome (overlay/sotto) e descrizione in hover. Icona 90×90 su desktop, pallini a contrasto col fondo. (ProductLive.tsx, catalog.ts)
v1.4.14 29/06/2026
Banner classificazioni: icone su tile bianca (no filtro silhouette)
- Banner "in evidenza": rimosso il filtro
brightness(0) invert(1)che trasformava le icone in silhouette bianca → un JPG/PNG pieno diventava un quadrato bianco. Ora ogni icona sta su una tile bianca ed è sempre visibile (flat trasparenti o immagini piene). (ProductLive.tsx)
v1.4.13 29/06/2026
Classificazioni con pallini → banner "in evidenza"
- Classificazioni con pallini (1–5) ora alimentano il banner scuro "in evidenza" (icona + pallini sotto); quelle senza pallini restano nella riga badge. Retrocompatibile con i vecchi
specIcons(prodotti non ancora ri-salvati). (catalog.ts, types.ts)
v1.4.12 29/06/2026
Banda fissa su entrambi i lati + tolleranza ±3% + pagamenti (AMEX/Bonifico)
- Extra Misura Non Standard — banda su entrambi i lati: se uno qualsiasi dei due lati corrisponde a una larghezza banda, la misura è considerata banda fissa → niente extra (es. 50×89 e 89×50 con banda 50). (configSchema.ts)
- Tolleranza ±3% sui decimali: 50,2 cm rientra nella banda 50 → niente extra (usa
tolerancePercent, default 3%). - Avviso banda a 10 cm (era 15) e adattivo al lato: il messaggio indica se intervenire su *larghezza* o *altezza* (quella più vicina alla banda). (Configurator.tsx)
- Pagamenti sicuri: AMEX ora leggibile (sfondo blu Amex forzato, prima
bg-whitevinceva → testo bianco su bianco) e "Bonifico Bancario" scritto per intero. (PaymentBadges.tsx)
v1.4.11 29/06/2026
Orientamento a card grandi (come le modalità misura)
- Orientamento Orizzontale/Verticale: convertito da toggle piccolo a card grandi in stile modalità (icona rettangolo + titolo + descrizione), sia in Misure standard che in Banda fissa. (Configurator.tsx, icons.tsx — nuove icone RectH/RectV)
v1.4.10 29/06/2026
Rinomina "Surcharge/Fuori misura" → "Extra Misura Non Standard"
- Testi user-facing nel configuratore (sidebar prezzo + nudge banda) e label CRM editor rinominati in Extra Misura Non Standard. (Configurator.tsx)
v1.4.9 29/06/2026
Configuratore: slideshow footer + sconti quantità nel step + PNG icone + fix surcharge
- Footer bar: thumbnail prodotto a sinistra che cicla in dissolvenza tra foto principale e galleria (ogni 3s). (Configurator.tsx, ProductLive.tsx)
- Sconti quantità nel step Quantità: tabella qtyTiers visibile nel contenuto principale dello step (oltre che nella sidebar).
- Icone PNG per le card modalità: campo "URL icona PNG" nel CRM editor sovrascrive l'icona SVG.
- Fix surcharge Su misura:
isBandWidthora controlla solowidthCm(non height) → 51×85 riceve correttamente il surcharge fuori misura. - Fix applyBand: l'orientamento verticale non invertiva più width/height →
bandWsempre come widthCm per il calcolo. - (configSchema.ts)
v1.4.8 29/06/2026
Configuratore: modalità Banda fissa + orientamento
- Banda fissa: aggiunta come terza card di selezione nel configuratore (
MeasureStep). Mostra i pulsanti con le larghezze banda (allowedWidths) + input lunghezza personalizzata. - Orientamento banda: toggle ⬌/⬍ uguale alle misure standard — swappa larghezza e altezza trasmesse al prezzo.
- Fix surcharge: le larghezze banda non pagano più il surcharge "fuori misura" in
priceFromSchema(check suallowedWidthsoltre astandardSizes). - Nudge FREE→BANDA: quando in modalità Su misura e si digita una larghezza banda, il messaggio ora suggerisce correttamente "Banda fissa" (non "Standard").
- (Configurator.tsx, configSchema.ts)
v1.4.4 29/06/2026
Configuratore: prezzo calcolato sui box misure standard
- Misure standard senza prezzo esplicito: ogni box mostra ora il prezzo ricalcolato in base al m² (tiers + scaglioni), uguale a quello che verrebbe calcolato al momento della selezione. Se il prezzo è esplicitamente impostato usa quello, altrimenti usa
priceFromSchema. (Configurator.tsx)
v1.4.3 29/06/2026
Checkout: civico separato + Note Spedizione
- Checkout: campo Civico separato accanto alla Via (fatturazione e spedizione), layout affiancato
grid [1fr_5rem]. Al submit i due campi vengono uniti comevia + civiconel DB. - Note Spedizione: rinominato da "Note" a "Note Spedizione".
- (CartPage.tsx, order.ts)
v1.4.2 26/06/2026
🤖 Genera immagini/icone con AI nel Media (Imagen) + prodotti gestiti dal CRM
- Generazione AI nel Media (imagen.php, MediaLibrary.tsx, media.ts): pannello "Genera immagine/icona con AI" — descrivi + titolo, opzione "Stile icona" (line-art bianco su navy, come le amenities); usa Imagen
imagen-3.0-generate-002(chiave Gemini dei settings), salva il PNG in_uploadscon titolo/alt. ⚠️ Imagen richiede chiave su piano a pagamento. - Prodotti: il menu E-commerce → Prodotti torna a puntare al MegaCRM (gestione lì per ora); l'editor sul sito (
/prodotti-edit) resta disponibile ma non linkato.
v1.4.1 26/06/2026
🎨 Sweep emoji → icone flat (lato cliente)
- Sostituite le emoji-icona con il set flat
Ic: configuratore "Aggiungi al carrello" (🛒→Ic.Cart) e upload logo (⬆️→Ic.Upload) su entrambi i configuratori; carrello (🚚→Ic.Truck, 🎟️→Ic.Tag); disponibilità prodotto (🔴/🟠→pallino colorato, 📦 rimosso). (Configurator.tsx, TechnicalConfigurator.tsx, CartPage.tsx, ProductLive.tsx). - (Restano alcune emoji decorative/inline minori — passaggio successivo.)
v1.4.0 26/06/2026
🏷️ Editor prodotto sul sito (Fase 1) sincronizzato col CRM + Box Specifiche
- Nuova pagina Prodotti (
/prodotti-edit, menu E-commerce) (ProductsEditor.tsx): lista/ricerca prodotti, modifica nome/SKU e sezione EXTRA / attributi. - Box "Specifiche tecniche": gli attributi-descrizione stanno in un riquadro dedicato (solo Etichetta → valori, niente prezzo/immagine) e non entrano nel configuratore. Pulsanti per spostare un attributo da Configuratore → Specifiche e viceversa. Le specifiche compaiono in automatico nella tabella "Scheda tecnica" della pagina prodotto (così non serve cancellarle/ricopiarle).
- Salvataggio via
syncRows('products'): preserva tutti gli altri campi del prodotto. Prezzi/colori/misure/configuratore restano per ora nel CRM (Fase 2/3).
v1.3.1 26/06/2026
⏱️ Ferie: tipo "Lavoro" con calcolatore ore (dalle/alle − pausa)
- Nuovo tipo Lavoro nel registro Ferie (FerieAdmin.tsx, ferie.php, ferie.ts): per un giorno inserisci dalle / alle / pausa (min) e calcola le ore nette (es. 9:00–19:00, pausa 120′ → 10 h − 2 h = 8 h). Card riepilogo "Ore lavorate" dell'anno; ore nette mostrate in elenco.
v1.3.0 26/06/2026
📧 Log email inviate (pagina dedicata)
- Nuova pagina Log email (
/log-email, menu Impostazioni): elenco delle ultime 200 email inviate dal sito con data, destinatario, oggetto, tipo, stato (Inviata/Errore), allegati; ricerca e click sulla riga → anteprima completa del contenuto (HTML in iframe) con i nomi degli allegati. (EmailLog.tsx). - Il backend già loggava ogni invio (
_email/log.json+ HTML in_email/sent/); ora salva anche i nomi degli allegati (email.php) e c'è una UI dedicata e trovabile (prima era solo dentro "Backup & Log").
v1.2.5 26/06/2026
✉️ Email di rimborso al cliente + note ordine leggibili + verifica Stripe
- Email di rimborso: all'emissione di un rimborso, il cliente riceve ora la conferma ("Rimborso ordine n. X") + notifica allo staff — inviata lato server dal backend rimborso. (payments.php, OrdersManager.tsx). Prima non partiva.
- Note / cronologia ordine ora a capo e leggibili: la descrizione è renderizzata come HTML con righe separatorie tra gli stati (Ordine → Pagato → Rimborso); prima
stripHtmlschiacciava tutto su una riga. - Verifica rimborso su Stripe: link "↗ Vedi su Stripe" al pagamento nel box rimborso (ricorda: la dashboard dev'essere in Live, non Test). Salvata anche la risposta grezza del rimborso per diagnostica.
- Fix: numero di tracking forzato a stringa (evita crash se il CRM lo salva come numero). Tolte alcune emoji dai pulsanti backend.
v1.2.4 26/06/2026
🐛 Fix schermata bianca su ordine spedito + clienti raggruppati per email
- Fix crash (schermata bianca): aprire un ordine spedito mandava in crash /ordini perché
detectCarrier/trackingUrlricevevano il numero di tracking come numero (il CRM può salvarlo non-stringa) e.toUpperCase()falliva. Coercizione aStringovunque. (tracking.ts, OrdersManager.tsx). - Clienti raggruppati per email (ClientsManager.tsx): lo stesso cliente, duplicato da più ordini (ogni checkout creava una riga nuova), ora compare una sola volta per email; i dati mostrati sono quelli del record più recente, lo storico ordini è unito da tutte le occorrenze, e cestino/ripristino/elimina agiscono su tutte le occorrenze dell'email.
v1.2.3 26/06/2026
📋 Lista ordini: stato Rimborsato visibile + ordinati per data+ora (ultimi in alto)
- Rimborsato ora compare nella lista: lo stato viene rilevato anche dalla nota dell'ordine (
generalDescription), perché il CRM può non persistere il camporefundRef. Stesso per Pagato/Confermato. (OrdersManager.tsx). (Spedito già mostrato.) - Ordinamento ultimi in alto:
createdAtha solo la data → a parità di giorno gli ordini sono ordinati per numero sequenziale (FLR-1608 sopra FLR-1607); i nuovi ordini salvano anchecreatedAtIso(timestamp pieno) per ordinamento per data+ora. (order.ts).
v1.2.2 26/06/2026
🐛 Fix ordini duplicati (carta) + schermata pagamento + favicon
- Fix critico — ordini duplicati: pagando con carta, un ritentativo/riapertura del pagamento creava un secondo ordine con nuovo numero (es. FLR-1607 *e* FLR-1608) + email doppia. Ora l'ordine si crea una sola volta per checkout e viene riusato su eventuale ritentativo; aggiunto guard anti doppio-click. (CartPage.tsx).
- Schermata "Pagamento ricevuto": tolta l'emoji → icona elegante (check), numero ordine su riga propria più grande con a capo. (CartPage.tsx).
- Favicon elegante (SVG, mark a bande sul colore accent) nel tab del browser. (public/favicon.svg, Base.astro).
v1.2.1 26/06/2026
🛠️ Fix definitivo "chunk JS vietato" (asset con separatore '-')
- Causa radice trovata: il deploy_receiver blocca i file con
.db(protezione database SQLite). Quando l'hash Vite iniziava per "Db/DB/db", il chunk si chiamavaComponente.Db….js→ conteneva.db→ skippato/404 → niente hydration (es. /ordini, /media bloccati). Capitava a caso a ~ogni build. - Fix: separatore hash
'-'invece di'.'negli asset (astro.config.mjs) → i nomi diventanoComponente-hash.js,.dbnon può più comparire. Niente più chunk vietati. ✅
v1.2.0 26/06/2026
👥 Gestione Clienti (anagrafica, ordini, ricerca/sort, cestino)
/clientiora è la gestione anagrafica clienti (ClientsManager.tsx): tutti i dati del checkout (personali/aziendali, fatturazione, indirizzo di spedizione), storico ordini per cliente, n° ordini (confermati/pagati) e totale speso.- Ricerca per nome/email/P.IVA, ordinamento per n° ordini (migliori clienti in cima ⭐), totale speso o nome.
- Modifica scheda cliente e cestino clienti: Sposta nel cestino (archivia) → Ripristina → Elimina definitivamente. Scrive sul CRM (
customers) via bridge. - Dall'ordine, click sul nome cliente → apre la scheda completa; dallo storico cliente, click sull'ordine → apre l'ordine. (OrdersManager.tsx).
- Gli account portale/login (reset password, blocca) si gestiscono ora in
/account-portale(linkato dall'header Clienti).
v1.1.0 26/06/2026
🌴 Registro Ferie & permessi (backend)
- Nuova pagina Ferie & permessi (
/ferie, dal menu Admin): registri Ferie / Permesso / Malattia / Altro per intervallo di date + nota; calcolo giorni lavorativi (lun–ven). (FerieAdmin.tsx, ferie.php, ferie.ts). - Riepilogo per anno: ferie usate, ferie residue (su giorni annui configurabili), permessi e malattia. Voci modificabili/eliminabili. Dati salvati sul server (
_ferie/), accesso admin. - Niente timbratura entrata/uscita (su richiesta).
v1.0.11 26/06/2026
🐛 Fix /ordini bloccato in "Verifica sessione" (chunk JS vietato dal deploy_receiver)
- Il chunk
OrdersAdmin.DBlSSan4.jsveniva skippato dal deploy_receiver (hash vietato) → 404 → l'isola non faceva hydration → pagina ferma su "Verifica sessione…". Rinominato il componente in OrdersManager e modificato il contenuto per ottenere un hash nuovo (BW86WM-a) accettato dal deploy. (OrdersManager.tsx, ordini.astro). deploy_sito.mjsora stampa i file skippati (prima erano silenziosi) → diagnosi più rapida in futuro.- Pulizia: header backend "Ordini & preventivi" → "Ordini".
v1.0.10 26/06/2026
🚚 Tracking: menu corriere + URL automatico dal numero
- Nel dettaglio ordine, il corriere è ora un menu a tendina (BRT · GLS · Fedex) con "Rileva automaticamente": dal numero di spedizione capisce il corriere (regole del MegaCRM
detectCarrierFromTracking) e compila in automatico l'URL di tracking. Es.05367104139973→ BRT →https://www.mybrt.it/it/mybrt/my-parcels/incoming?parcelNumber=05367104139973. Pulsante "↗ Apri tracking". (OrdersAdmin.tsx, tracking.ts). - Regole: GLS (
GLS/0901…), FedEx (12 cifre), BRT (BRT/codice numerico lungo). Il corriere resta modificabile a mano.
v1.0.9 26/06/2026
🖼️ Email ordine: foto prodotto a destra della riga
- Nell'email d'ordine la foto del prodotto ora compare a destra del blocco nome/SKU/colore/misura di ogni riga (tabella annidata, compatibile email). Rimossa la foto grande duplicata in cima. (order.ts).
v1.0.8 26/06/2026
✉️ Email automatiche su ogni cambio stato ordine (centralizzate)
- Ora ogni modifica di stato salvata dal backend invia in automatico l'email giusta al cliente (logica unica in
save, vale sia dal menu Stato sia dai pulsanti): Confermato → "in lavorazione" (order_processing), tracking inserito → "spedito" (order_shipped, con link tracking), Annullato → "annullato" (order_cancelled). Esito mostrato nell'header ("✉️ email inviata"). (OrdersAdmin.tsx). - Nessun doppione: i pagamenti carta (Confermato automatico) restano gestiti dal webhook ("pagamento ricevuto"), non da qui.
v1.0.7 26/06/2026
✉️ Email "ordine annullato" al cliente quando si annulla dal backend
- Annullando un ordine dal backend sito (pulsante "Annulla ordine"), parte automaticamente la email "ordine annullato" al cliente (template
order_cancelled+ WhatsApp se attivo), con esito mostrato. (OrdersAdmin.tsx, nuovo helpersendOrderEventin email.ts → azioneorder_eventdi email.php). - Serviva perché annullare dal sito scrive lo stato direttamente nel CRM (nessuna notifica automatica lato CRM).
v1.0.6 26/06/2026
🗑 Cestino ordini (cestina/ripristina/elimina) + rimborso solo se c'è transazione
- Cestino ordini (OrdersAdmin.tsx): pulsante "Sposta nel cestino" (stato → Cestinato, reversibile, salva lo stato precedente). Dal cestino: "Ripristina" (torna allo stato precedente) o "Elimina definitivamente" (irreversibile, via
delete_row hard_deletesul bridge — bridge.ts). Filtro "Cestinato" per vederli. - Rimborso solo con transazione: il box rimborso compare solo se c'è un pagamento reale da rimborsare (transazione tracciata / pagamento accettato) o un rimborso già fatto — non più su ordini carta non pagati.
v1.0.5 26/06/2026
📦 Stati ordine automatici + stato pagamento + annulla manuale
- Auto-stato ordine (order.ts, CartPage.tsx): bonifico → In approvazione (in attesa di pagamento); carta pagata → Confermato automatico (prima restava "Bozza" perché scrivevo uno stato non valido).
- Vista stati arricchita (OrdersAdmin.tsx): oltre agli stati CRM, derivo Spedito (quando c'è il tracking) e Rimborsato (quando c'è un rimborso); filtri aggiornati (In approvazione · Confermato · Spedito · Rimborsato · Annullato · Bozza · Cestinato). "Rifiutato" → "Annullato".
- Stato pagamento nel dettaglio ordine: riquadro verde = pagamento accettato con carta •••• last4, importo, n. transazione, data; rosso = rifiutato; giallo = in attesa (bonifico / non completato).
- Annulla / modifica manuale: pulsante "Annulla ordine" (→ Annullato) + menu stato e tracking modificabili a mano.
- Nota: gli stati "veri" (Spedito/Rimborsato/In attesa) sono derivati lato sito; aggiungerli all'enum del CRM e l'auto-aggiornamento del bonifico da movimenti bancari restano interventi lato CRM. Il "rosso rifiutato" si popola quando un pagamento fallito viene registrato (richiede webhook→CRM).
v1.0.4 26/06/2026
🔗 Doppio webhook Stripe + URL migration-proof
- Doppio signing secret webhook: secondo campo "Webhook secret" in Impostazioni → Pagamenti (PaymentsAdmin.tsx, payments.php). Il webhook (stripe_webhook.php) valida la firma con uno qualsiasi dei secret → si possono registrare due endpoint Stripe (URL temporaneo
…/sito/+ definitivofloormad.com) senza interruzioni alla migrazione. - URL interni relativi all'host/cartella correnti (no più hardcode
crm.floormad.com/sito): le chiamate del webhook aemail.php, i redirect del pagamento *hosted* (success/cancel) e l'email del codice accesso usano host + path correnti → funzionano identici ora e dopo lo spostamento infloormad.com. (stripe_webhook.php, payments.php). - Resta manuale (lato Stripe) solo l'aggiornamento dell'URL dell'endpoint alla migrazione.
v1.0.3 26/06/2026
⭐ Recensioni: filtro prodotto + "Nuove" · fix anteprima configuratore
- Moderazione recensioni (ReviewsModeration.tsx): nuovo filtro per prodotto (menu a tendina con i prodotti che hanno recensioni, nome al posto dell'id) e tab "🆕 Nuove" con contatore. Le recensioni arrivate dopo l'ultima apertura della sezione "Nuove" restano segnate come nuove finché non apri quel tab (timestamp "viste" in localStorage); badge "NUOVA" sulle card.
- Fix anteprima configuratore (Configurator.tsx): il riquadro "Il tuo prodotto" usciva dal box della sidebar destra (300px + quote > 340px). Ridotta la dimensione max dell'anteprima e aggiunto contenimento → resta dentro la sidebar.
v1.0.2 26/06/2026
🛒 Menu "E-commerce" nella top-bar admin
- Nuovo menu E-commerce nella barra admin (AdminBar.tsx): Prodotti (→ MegaCRM, fonte di verità), Ordini, Coupon, Clienti.
- Coupon e "Account clienti" spostati da "Contenuti" a "E-commerce" (niente duplicati); "Contenuti" resta focalizzato su pagine/media/recensioni/assistenza.
v1.0.1 26/06/2026
↩️ Rimborsi Stripe (totale/parziale + motivazione) dal backend ordini
- Nel dettaglio ordine del backend sito (OrdersAdmin.tsx), per gli ordini pagati con carta compare "Rimborsa ordine": importo (default = totale, modificabile per il parziale) + motivazione obbligatoria, con conferma.
- Backend
create_refund(payments.php): rimborso via Stripe Refunds API (admin-protected). Risolve la transazione dalpaymentRefsalvato sull'ordine o, in mancanza, cercandola tra le sessioni pagate. La motivazione va nei metadata Stripe; audit in_payments/refunds/. - L'esito (importo, stato, motivazione, rif. rimborso) viene annotato nella scheda d'ordine (CRM) ed è quindi visibile sia dal backend sito sia dal CRM.
- Nota: il rimborso *avviato dal CRM* (non solo annotato) sarà un'aggiunta lato CRM separata.
v1.0.0 26/06/2026
🔒 GDPR + carta "sul sito o su Stripe" + ciclo pagamento (email cliente, dati su ordine)
- Banner cookie a consenso granulare (Tecnici sempre attivi · Statistici · Marketing) con "Accetta tutti / Rifiuta tutti / Personalizza", riapribile in ogni momento. (CookieBanner.tsx). GA4 e Meta Pixel ora si caricano separatamente solo per la categoria consentita. (Base.astro).
- Nuove pagine Privacy Policy (privacy.astro) e Cookie Policy (cookie.astro) con tabella cookie e pulsante "Gestisci preferenze"; link in footer (Privacy · Cookie · Preferenze). (Footer.astro). I testi sono un modello da far validare/completare.
- Selettore pagamento ridisegnato: un metodo per riga, icone flat (no emoji), titolo + sottotitolo. (CartPage.tsx, icone Card/Bank/Lock in icons.tsx).
- Con carta puoi scegliere "Paga sul sito" (modulo carta integrato, Stripe embedded) o "Paga su Stripe" (pagina sicura, redirect). Tutto sempre via Stripe. (payments.php
create_sessionmode embedded/hosted). - Ciclo pagamento: al pagamento, il webhook invia al cliente la conferma con riepilogo (importo, carta •••• last4, n. transazione) oltre alla notifica staff. (stripe_webhook.php). I dati di pagamento (transazione, carta, importo, data) vengono salvati nella scheda d'ordine (ri-sync del quote nel CRM). (CartPage.tsx, order.ts).
- Oggetto email ordine corretto da "richiesta di preventivo" a "Il tuo ordine n. X" (override lato codice, robusto anche con config email salvate vecchie). (email.php, order.ts).
v0.99.0 26/06/2026
💳 Pagamento con carta nel checkout (Stripe Checkout embedded)
- Selettore metodo nel carrello (Carta / Bonifico) in base a cosa è abilitato in Impostazioni → Pagamenti. Se Stripe è attivo, la carta è il metodo predefinito. (CartPage.tsx).
- Stripe Checkout embedded: il form carta (Visa/Mastercard, Apple/Google Pay) è dentro la pagina (modale),
redirect_on_completion: never→ niente redirect esterno; a pagamento concluso si resta sul sito con l'esito "Pagamento ricevuto!". (StripeCheckout.tsx,@stripe/stripe-js). - Backend (public/payments.php): nuove azioni pubbliche
pub_config(solo publishable key),create_session(crea la Checkout Session server-side con la secret key — mai esposta),session_status. Chiamate all'API Stripe via stream context (no dipendenza php-curl). - Webhook (public/stripe_webhook.php): verifica la firma con il webhook secret, su
checkout.session.completednotifica lo staff via email ("✅ Pagamento ricevuto — Ordine n. X") e segna la sessione pagata (audit in_payments/sessions/). È la conferma di pagamento affidabile. - L'ordine viene creato come DRAFT (come per il bonifico) e marcato "pagamento con CARTA"; il webhook conferma il pagamento. (order.ts).
- ⚠️ Webhook da configurare nella dashboard Stripe → endpoint
https://crm.floormad.com/sito/stripe_webhook.php, eventocheckout.session.completed. Nota: l'importo è calcolato lato client (come l'intero ordine oggi); validazione prezzi server-side = hardening futuro.
v0.98.1 26/06/2026
🎟️ Coupon: opzione "Escludi spedizione"
- Nuovo flag "Escludi spedizione" in fase di creazione/modifica del coupon (CouponsAdmin.tsx): lo sconto non si applica alla spedizione. Persistito in
_coupons/coupons.jsone restituito davalidate(public/coupons.php); il carrello porta con sé il flag sul coupon applicato (CartPage.tsx, coupons.ts). - Indicatore "no spediz." nella tabella coupon esistenti.
- Nota: oggi il totale del carrello non somma la spedizione (c'è solo la soglia "spedizione gratuita"), quindi lo sconto la esclude già di fatto; il flag è salvato sul coupon e diventerà operativo quando verrà aggiunta una riga spedizione ai totali.
v0.98.0 26/06/2026
🛒 Barra azione sticky: BIG BUTTON sempre visibile (Avanti → Aggiungi al carrello)
- Barra azione fissa in basso (desktop e mobile), sempre visibile mentre si configura: a sinistra nome prodotto + totale IVA incl. in tempo reale, a destra un BIG BUTTON unico che guida tutto il flusso. (Configurator.tsx, TechnicalConfigurator.tsx).
- Pulsante dinamico: finché ci sono step mostra "Avanti: {prossimo step} →" (avanza e riporta in vista l'inizio del wizard, utile su mobile); sull'ultimo step diventa "🛒 Aggiungi al carrello". Sui tappeti tecnici resta disabilitato con "Min {misura}" finché la misura non è valida.
- La barra compare solo quando il configuratore è a schermo (IntersectionObserver): non copre footer/recensioni quando si scorre oltre. Aggiunto padding inferiore per non nascondere l'ultimo contenuto.
v0.97.0 24/06/2026
🏷️ Upload ottimizzato + alt SEO automatici (AI)
- Upload → WebP: le immagini caricate (Media Library e selettore del builder) vengono ridimensionate e salvate in WebP (con fallback PNG/JPEG se il browser non lo codifica). (MediaLibrary.tsx, builder/ImageField.tsx).
- Alt SEO automatico (AI): all'upload, l'AI Gemini (vision) genera un testo alt in italiano dall'immagine + nome file → utile per SEO e accessibilità. Attivabile/disattivabile con il toggle "✨ Alt SEO automatico". (public/alt.php).
- Gestione alt in Media Library: ogni immagine ha un campo alt editabile + pulsante "✨ Genera alt (AI)"; badge "alt!" sulle immagini senza testo alternativo. I metadati (alt/title/tag) sono salvati per file in
_uploads/_meta.json. (public/media.php, src/lib/media.ts). alt.phpriusa la chiave Gemini dei settings CRM (server-side, mai esposta) e richiede token admin; riduce l'immagine prima dell'invio per risparmiare banda/token.
v0.96.0 24/06/2026
🖼️ Immagini on-the-fly: WebP/AVIF + resize + cache (proxy img.php)
- Nuovo endpoint
img.php: ridimensiona e converte in WebP (AVIF su richiesta) al volo, con cache su disco (_imgcache/), headerCache-Controlimmutable + ETag/304. Usa Imagick (fallback GD). Sicurezza: allowlist host (no SSRF), path locali confinati a_uploads, e fallback all'originale in caso d'errore → le immagini non si rompono mai. (public/img.php). - Helper
img()/srcset(): instrada le immagini attraverso il proxy consrcsetresponsive (il browser scarica solo la dimensione che serve). Salta SVG/GIF/data-URL e host non gestiti. (src/lib/img.ts). - Applicato a: card prodotto, griglie prodotti/categorie del builder, header categoria, Hero Slider (LCP,
fetchpriority=high), galleria prodotto (+ miniature + lightbox), blocchi immagine. Esempio:moquette-logo-5.jpgnon viene più servita 1200×1200 per 279 px. (ProductCard.astro, ProductGallery.tsx, builder/blocks.tsx, builder/dataBlocks.tsx, pages/index.astro, [pages/categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v0.95.0 24/06/2026
⚡ Performance & a11y: CLS, LCP, font self-hosted, contrasto CTA
- Font self-hosted (CLS): Inter + DM Sans serviti localmente da
/sito/fonts/*.woff2(subset latin, ~14–24 KB/peso vs 48 KB Google) con@font-faceinline +<link rel=preload>dei pesi 400/700 del font attivo. Eliminato il CSS render-blocking di Google Fonts (–370 ms) e soprattutto lo swap tardivo (DM Sans arrivava a ~1,6 s → ri-impaginazione di tutta la home = causa principale del CLS 0.62). Google Fonts resta solo come fallback per font del tema non self-hosted. (src/layouts/Base.astro, public/fonts/). - Logo con
width/height(430×164) in Header e Footer → niente reflow né warning "immagine senza dimensioni". (src/components/Header.astro, src/components/Footer.astro). - LCP: prima slide dell'Hero Slider con
fetchpriority=high+loading=eager(decoding=async), le altreloading=lazy. (src/builder/blocks.tsx). - Contrasto CTA (AA): arancio accent scurito #ff6a00 → #c24e00 (hover #a84300) → bianco su accent passa da ~2,6:1 a ~4,8:1. Aggiornati default (
global.css,theme.php) e tema salvato sul server. (src/styles/global.css, public/theme.php). - Touch target dots del carosello da 10 px a 24 px (area cliccabile, dot visivo invariato). (src/builder/blocks.tsx).
- Link distinguibile: "Informativa" nel cookie banner ora sempre sottolineato. (src/components/CookieBanner.tsx).
v0.94.1 23/06/2026
🛒 Solo Ordini (rimossa modalità "richiesta preventivo")
- Rimossa la modalità "Richiedi preventivo" dal checkout: ora è sempre un Ordine (bonifico), tolto il selettore metodo. (src/components/CartPage.tsx).
- Terminologia → Ordine ovunque: heading carrello, conferma ("Ordine inviato!"), titoli/testi email. La mail staff passa da "Nuova richiesta preventivo {rif}" a "Nuovo Ordine {rif} dal sito". (src/lib/order.ts, public/email.php).
v0.94.0 23/06/2026
📦 Gestione Ordini nel backend /sito (lettura + cambio stato)
- Nuova pagina
/sito/ordini(voce "Ordini" nel backend): elenco ordini/preventivi letti dal CRM via bridge (quotes+customers). (src/components/OrdersAdmin.tsx, src/pages/ordini.astro). - Filtri per stato (Bozza/In approvazione/Visualizzato/Confermato/Rifiutato/Cestinato) con contatori + ricerca per numero/cliente/email; ordinati per data.
- Dettaglio ordine espandibile: articoli, totali, note, dati cliente + spedizione.
- Cambio stato ordine e tracking spedizione (corriere/numero/URL) scritti sul CRM via
sync_table; il tracking compare nell'Area Clienti. Il CRM resta fonte di verità. - Bridge client esteso:
fetchCrmQuotes/fetchCrmCustomers+fetch_tableconwhere/limit/timeout. (src/lib/bridge.ts).
v0.93.3 23/06/2026
🐛 Fix chiavi pagamenti non scrivibili + Bonifico nella pagina Pagamenti
- Fix: i campi Secret key (Stripe), Webhook secret e PayPal Client secret avevano
valuefisso a stringa vuota → input controllato bloccato, impossibile scrivere/incollare. Ora legati al valore digitato. (src/components/PaymentsAdmin.tsx). - Bonifico bancario nella pagina Pagamenti: la sezione bonifico (abilita + intestatario/IBAN/banca/BIC/nota) è ora gestibile anche da
/sito/pagamentiaccanto a Stripe/PayPal; salva susettings.php(bankTransfer). I dati restano usati nell'email d'ordine con causale "Ordine n. XXXX". (src/components/PaymentsAdmin.tsx).
v0.93.2 20/06/2026
🎛️ Misure incavo: 2 bottoni distinti + campi arancio fino a modifica + nota adattata
- Toggle reso come due bottoni distinti (segmentati, bordati) invece di un'unica pillola. (src/components/TechnicalConfigurator.tsx).
- Lato A/Lato B precompilati a 100 ma arancio finché il cliente non li modifica (poi bianchi). (src/components/TechnicalConfigurator.tsx).
- Nota balloon: larghezza adattata al blocco (
w-full max-w-md), niente più overflow; misura finale non negativa (clamp a 0). (src/components/TechnicalConfigurator.tsx).
v0.93.1 20/06/2026
🎯 Step misure incavo: toggle evidenziato + campi guidati + nota balloon
- Configuratore tecnico (zerbino con incavo): il toggle Misura incavo / Misura finale zerbino è evidenziato (ring accento + pulse finché non si sceglie) con hint "👆 Tocca un'opzione". I campi Lato A/Lato B sono evidenziati in arancio finché non compilati correttamente e diventano bianchi quando validi. La nota sullo scarto è ora una balloon evidenziata ("ridotto di 2,5 mm su ogni lato → misura finale …"). (src/components/TechnicalConfigurator.tsx).
v0.93.0 20/06/2026
🏦 Pagamento Bonifico bancario (Fase 1)
- Dati bonifico in Impostazioni (intestatario, IBAN, banca, BIC, nota) + abilitazione. (src/components/SiteSettings.tsx,
SiteSettings.bankTransfer). - Checkout: scelta metodo Bonifico bancario / Richiesta preventivo. Con bonifico l'email d'ordine include il blocco dati banca + importo + causale "Ordine n. XXXX" (oltre a PDF/allegati già presenti); titolo email e descrizione ordine adeguati. (src/components/CartPage.tsx, src/lib/order.ts).
v0.92.1 20/06/2026
🧾 Riepilogo carrello su più righe + esito verifica colorato
- Nel carrello/checkout il riepilogo configurazione è ora una riga per attributo (Label: valore) invece di un'unica stringa con i "·". La riga "Esito verifica spessore" è evidenziata verde (ok) o rossa (scelta diversa dal consigliato). (src/components/CartPage.tsx).
v0.92.0 20/06/2026
📦 Disponibilità + stima spedizione + barra spedizione gratuita
- Stima spedizione sulla pagina prodotto: "📦 Spedito entro X giorni" accanto alla consegna stimata (da
handlingDaysdel prodotto). (src/components/ProductLive.tsx). - Disponibilità: badge Esaurito / Ultimi pezzi / Su ordinazione su card e pagina prodotto (da
stockQty/soglia del CRM). (src/components/ProductCard.astro, catalog.ts). - Barra "spedizione gratuita" nel carrello con progresso ("ti mancano X€"), soglia configurabile (
freeShippingThreshold, default €150). (src/components/CartPage.tsx).
v0.91.1 20/06/2026
🔇 Filtro warning ResizeObserver nell'editor
- Il warning benigno "ResizeObserver loop completed…" (emesso da Puck) non viene più mostrato come "Errore JS" nel reporter di editor/admin. (src/pages/editor.astro, src/pages/admin.astro).
v0.91.0 20/06/2026
🧩 Fix Spacer + spaziatura avanzata (stile Elementor) su tutti i blocchi
- Fix Spacer: il blocco "Spazio" non era registrato in Puck (non si poteva aggiungere) → ora c'è, con altezza Piccolo/Medio/Grande. (src/builder/puck.config.tsx).
- Opzioni avanzate margini/padding (stile Elementor) iniettate su tutti i blocchi: margine sopra/sotto, padding sopra/sotto/laterale (px). Header/Footer esclusi. (src/builder/puck.config.tsx).
v0.90.0 20/06/2026
🧱 Blocco "Blocchi in evidenza" (card personalizzate ordinabili)
- Nuovo blocco builder Blocchi in evidenza (Showcase): array di card personalizzate (immagine, sopra-titolo, titolo, badge, link) ordinabili con drag&drop nell'editor Puck. Stesso effetto hover zoom + oscuramento soft. Per la versione "per categoria" basta creare card che linkano alle categorie e ordinarle a piacere. La Griglia categorie automatica resta disponibile. (src/builder/blocks.tsx, src/builder/puck.config.tsx).
v0.89.0 20/06/2026
🖼️ Sfondi categoria automatici + testo barra + via tag "Configurabile"
- Sfondo categoria automatico: se una categoria non ha immagine, usa quella del primo prodotto della categoria → tutte hanno uno sfondo (hero + griglia). (src/data/catalog.ts).
- Testo introduttivo a destra della barra categorie (configurabile da Menu → "Testo a destra della barra"), reso in
SiteNavsu desktop. (src/components/SiteNav.tsx, MenuBuilder.tsx). - Rimosso il badge "Configurabile" dalle card prodotto (tutti i prodotti lo sono). (src/components/ProductCard.astro).
v0.88.0 20/06/2026
🖼️ Griglia categorie con hover zoom + oscuramento
- Blocco Griglia categorie rinnovato: card con zoom soft all'hover e oscuramento leggero (meno invasivo), eyebrow in accento, titolo, badge opzionale e CTA ("Vai alla categoria →") che appare al passaggio. Nuovi campi: formato immagine (largo/quadrato/verticale) e testo CTA. Default 2 colonne, 16:10. Immagini dalle categorie del CRM. (src/builder/dataBlocks.tsx, src/builder/puck.config.tsx).
v0.87.0 20/06/2026
🏷️ Pagine attributo + flag/badge configurabili
- Pagine attributo
/sito/attributo/[slug]: elenco di tutti i prodotti che hanno quell'attributo/tag. Generate dagetAttributeValues/getProductsByAttribute. Aggiunte al filtro Attributi della sidebar menu. ([src/pages/attributo/[slug].astro](src/pages/attributo/%5Bslug%5D.astro), src/data/catalog.ts, MenuBuilder.tsx). - Flag/Badge configurabili dalle *Impostazioni* (etichetta + colore): es. PROMO/HOT/NEW. Nell'editor Menu il badge si sceglie da un menu a tendina dei flag definiti; il colore viene applicato nel menu. (src/components/SiteSettings.tsx, SiteNav.tsx,
SiteSettings.menuBadges).
v0.86.0 20/06/2026
💳 Pagamenti runtime + in pagina prodotto · menu in cache
- Blocco "Pagamenti sicuri" in tempo reale: convertito in island React; le modifiche dal backend si applicano senza redeploy. Aggiunto anche nella pagina prodotto (sidebar "Il tuo prodotto", sotto "Aggiungi al carrello"). (src/components/PaymentBadges.tsx, Footer.astro, Configurator.tsx).
- Menu più veloce:
SiteNavora usa una cache insessionStorage(render immediato + un solo refresh a sessione). Editor menu: messaggio aggiornato ("ricarica, nessun deploy"). (src/components/SiteNav.tsx, MenuBuilder.tsx).
v0.85.0 20/06/2026
📱 Menu mobile (drawer accordion)
- Prima su mobile la barra categorie era nascosta (nessun menu). Ora
SiteNavmostra su mobile un pulsante "Menu prodotti" che apre un drawer con accordion a 3 livelli: voci → sottocategorie → prodotti (con miniature/badge e link "Tutti →"). Desktop invariato. (src/components/SiteNav.tsx, src/components/Header.astro).
v0.84.0 20/06/2026
🔎 Sidebar menu: prodotti/categorie + filtro + ricerca
- La sidebar dell'editor menu ora elenca anche prodotti e categorie (oltre alle pagine), con miniatura. Aggiunto filtro per tipo (Tutti / Pagine / Categorie / Prodotti, con conteggi) e campo di ricerca. Click → aggiunge la voce al menu (i prodotti con la loro immagine). (src/components/MenuBuilder.tsx).
v0.83.0 20/06/2026
⚡ Menu in tempo reale + auto-compila sottocategorie/prodotti
- Menu real-time: la barra menu è ora un'isola React (
SiteNav) che, oltre al render al build, rilegge le impostazioni a runtime → cambiare stile/menu dal backend si applica subito ricaricando, senza redeploy. (src/components/SiteNav.tsx, src/components/Header.astro). - Editor: auto-compilazione — su una voce collegata a una categoria, "Sottovoci" si apre già con le sottocategorie (+ "Tutti: …"); pulsante ↻ Categoria per ricompilare; per ogni colonna ↻ prodotti carica tutti i prodotti della (sotto)categoria con foto. (src/components/MenuBuilder.tsx).
- Toggle foto per prodotto: pulsante *foto: sì/no* per mostrare o nascondere la miniatura (
MenuItem.hideImage).
v0.82.0 20/06/2026
🎚️ Stili menu selezionabili + link a prodotto
- Selettore stile menu con anteprima in
/sito/menu: *Due pannelli* (Vinted), *Colonne con foto*, *Rail laterale* (FasterPrint), *Tendine semplici*. Il render dell'header si adatta allo stile scelto (SiteSettings.menuStyle). (src/components/MenuBuilder.tsx, src/components/Header.astro). - Link a un prodotto: nell'editor, in ogni colonna mega c'è il picker "+ prodotto…" che aggiunge un link al prodotto con la sua immagine principale. (src/components/MenuBuilder.tsx).
v0.81.0 20/06/2026
🧭 Mega-menu stile Vinted (2 pannelli)
- Il dropdown del menu orizzontale ora è a due pannelli (stile Vinted): sottocategorie verticali a sinistra + voci/prodotti della sottocategoria attiva a destra (in 2 colonne, con miniature/badge). Default sulla prima sottocategoria, switch all'hover. (src/components/Header.astro).
v0.80.0 20/06/2026
💳 Blocco "Pagamenti sicuri" configurabile
- Nuovo blocco badge metodi di pagamento ("Pagamenti sicuri" + icona lucchetto + chip Visa/Mastercard/Amex/PayPal/Paga a rate/…), badge grafici self-contained (nessun logo/immagine esterna). Reso nel footer di tutte le pagine. (src/components/PaymentBadges.astro, src/components/Footer.astro).
- Configurabile dal backend in *Impostazioni*: attiva/disattiva, titolo, e quali metodi mostrare (Visa, Mastercard, Amex, Maestro, PayPal, Paga a rate, Apple/Google Pay, Klarna, Scalapay, Bonifico, Contrassegno). (src/components/SiteSettings.tsx,
SiteSettings.paymentBadges).
v0.79.0 20/06/2026
🗂️ Rail "I nostri prodotti" + badge + editor link
- Rail verticale "I nostri prodotti" (stile FasterPrint): box scuro a sinistra della barra menu che apre la lista categorie con flyout del mega a destra. (src/components/Header.astro).
- Badge PROMO/HOT/NEW sulle voci e sui prodotti del menu (campo
badge), resi come etichetta rossa. (src/lib/siteSettings.ts, Header). - Editor menu (
/sito/menu): per ogni link prodotto ora si imposta miniatura (URL foto) e badge; le colonne del mega si riordinano in drag&drop. (src/components/MenuBuilder.tsx).
v0.78.0 20/06/2026
🍔 Mega-menu con anteprime prodotto (stile FasterPrint)
- Mega-menu con thumbnail prodotto: i link nelle colonne mostrano la miniatura dall'immagine principale del prodotto; pannello più largo e colonne con intestazione categoria. (src/components/Header.astro).
- "✨ Genera dal catalogo" nell'editor Menu (
/sito/menu): costruisce automaticamente il menu mega da categorie + prodotti (voci = categorie radice, colonne = sottocategorie, link = prodotti con immagine, cap 8 + "Vedi tutti"). Resta tutto modificabile prima di salvare. (src/components/MenuBuilder.tsx). MenuItem.imageper la miniatura dei link. (src/lib/siteSettings.ts).
v0.77.0 20/06/2026
🎨 Tema applicato a runtime (no redeploy) + piano migrazione
- Il Tema si applica subito: uno script in
Base.astrocarica il tema più recente datheme.phpad ogni apertura pagina e sovrascrive i valori "cotti" al build → font/colori/dimensione cambiano senza redeploy (basta ricaricare). Cache in sessionStorage per evitare flash. Messaggio di salvataggio aggiornato. (src/layouts/Base.astro, src/components/ThemeSettings.tsx). - Piano di migrazione
/sito→floormad.comdocumentato (build conSITE_BASE=/, trasferimento cartelle dati_*, URL hardcoded, cron). (MIGRATION.md).
v0.76.7 20/06/2026
💶 Fasce prezzo senza scrollbar su mobile
- La tabella Prezzi (scaglioni) ora è a card flex-wrap: niente più scrollbar orizzontale su mobile. Con 4 fasce vanno 2 per riga (2 sopra, 2 sotto); con più di 4 si creano altre righe; su desktop restano in fila. Fascia attuale evidenziata. (src/components/ProductLive.tsx).
v0.76.6 20/06/2026
🔎 Lente solo con stampa + invito lampeggiante
- La lente d'ingrandimento appare solo quando c'è la stampa con un logo da perfezionare; per gli altri prodotti l'anteprima non è più cliccabile/zoomabile. È un badge lampeggiante "🔎 Perfeziona la stampa" sopra l'anteprima che apre l'editor di dettaglio (logo trascinabile + scala + colori). (src/components/Configurator.tsx, src/styles/global.css).
v0.76.5 20/06/2026
🔎 Lente configuratore → anteprima interattiva del tappeto
- La lente sull'anteprima ora apre l'anteprima grande interattiva del tappeto (rettangolo proporzionale con quote larghezza/altezza e, se c'è stampa, logo trascinabile + scala + colori), invece dell'immagine piatta del colore. Funziona anche senza logo. (src/components/Configurator.tsx).
v0.76.4 20/06/2026
📱 Mobile: breadcrumb nascosto + no zoom foto accidentale
- Breadcrumb nascosto su mobile (catalogo, categoria, pagina prodotto): meno spazio sprecato; resta su tablet/desktop. (ProductLive.tsx, catalogo.astro, [categoria/[slug].astro](src/pages/categoria/[slug].astro)).
v0.76.3 20/06/2026
📱 Configuratore: zoom foto solo su desktop
- Lo zoom (lightbox) dell'anteprima si apre solo con puntatore "fine" (mouse): su touch un tap non apre più l'immagine per sbaglio. (src/components/Configurator.tsx).
v0.76.2 20/06/2026
📱 Colori configuratore: 6 per riga su mobile + nome visibile
- Griglia colori a 6 per riga su mobile (8 su tablet, 10 su desktop) con il nome del colore visibile anche da mobile (più piccolo). (src/components/Configurator.tsx).
v0.76.1 20/06/2026
📱 Colori configuratore: 10 per riga su mobile
- Griglia colori a 10 per riga (anche da mobile): swatch più piccoli e compatti. Su mobile l'etichetta col nome è nascosta (resta nel riepilogo "Il tuo prodotto" e nel tooltip); su tablet/desktop l'etichetta riappare. (src/components/Configurator.tsx).
v0.76.0 20/06/2026
🎨 Tema font robusto al build + anteprima configuratore più grande
- Fix font/tema incoerente:
loadTheme()al build ora riprova fino a 4 volte (timeout 15s) invece di un singolo tentativo a 8s. Prima un fetch lento faceva perdere font/colori SOLO ad alcune pagine (es. la home), che si sistemavano a un deploy successivo. (src/lib/siteTheme.ts). - Anteprima "Il tuo prodotto" più grande: cap dimensioni alzati (300×340) e container non più forzato a quadrato (meno spazio vuoto, soprattutto da mobile). (src/components/Configurator.tsx).
v0.75.0 20/06/2026
⭐ Recensioni con foto + reminder/coupon
- Recensioni con foto: il cliente può allegare fino a 4 foto alla recensione; le immagini vengono salvate lato server (
_uploads/) e mostrate in galleria nello slider recensioni. (src/components/Reviews.tsx, public/reviews.php). - Coupon premio ≥4★: quando una recensione viene pubblicata con almeno 4 stelle, parte automaticamente un codice sconto monouso (
GRAZIE-XXXXXX, % configurabile, valido 1 anno) legato all'email del recensore, inviato via email. (public/reviews.php). - Reminder post-vendita configurabile dalla sezione Recensioni → Reminder: attiva/giorni dopo l'acquisto/sconto %. Il cron
postsale.phpinvia l'email-invito a recensire in cambio dello sconto. (src/components/ReviewsModeration.tsx).
v0.74.0 20/06/2026
🖼️ Immagine accessorio nel carrello
- Se l'opzione accessorio (es. bordo) ha un'immagine caricata, viene usata quella nella riga del carrello (e a valle in email/preventivo), invece dell'immagine del prodotto principale. (src/components/Configurator.tsx).
v0.73.1 20/06/2026
🔧 Fix autocompletamento indirizzi
- L'autocompletamento indirizzi non funzionava più: Photon ha smesso di accettare
lang=it. Passato alang=default(src/components/AddressAutocomplete.tsx).
v0.73.0 20/06/2026
🔎 Ricerca live + utenti admin + consegna più grande
- Ricerca live nell'header: mentre scrivi compaiono i prodotti con immagine + prezzo (dropdown), frecce/Invio per aprire, "Vedi tutti i risultati" → catalogo. Indice statico
/sito/search-index.json(SearchBox). - Pagina Utenti admin (
/sito/utenti-admin). - Box Consegna stimata: data e icona camion più grandi, tolto "giorni lavorativi".
v0.72.0 20/06/2026
🖼️ Lightbox galleria prodotto (frecce + swipe + dissolvenza)
- La galleria del prodotto apre l'immagine in lightbox con frecce, swipe mobile, tastiera (← → Esc) e dissolvenza; lente al passaggio del mouse. (src/components/ProductGallery.tsx).
- "Il tuo prodotto": rimosso il doppio bordo attorno all'immagine + sfondo bianco. (Configurator).
v0.71.0 20/06/2026
🔍 Box configuratore + lente/lightbox immagine + etichetta prezzo
- Il configuratore (wizard + "Il tuo prodotto") è racchiuso in un box grigio tenue arrotondato con bordo, più largo (fino a 1260px su schermi grandi). (ProductLive).
- Lente d'ingrandimento sull'immagine del riepilogo: al click apre l'immagine ingrandita in overlay con sfondo nero sfocato. (Configurator).
- L'etichetta sopra il prezzo in pagina prodotto è configurabile dal CRM (
priceLabel).
v0.70.0 20/06/2026
🏷️ Etichette step configuratore personalizzate + unità
- Il configuratore usa l'unità di vendita ("Quantità piastrelle/rotoli/…") e le etichette step personalizzate impostate nel CRM. (src/components/Configurator.tsx, configSchema).
v0.69.0 20/06/2026
🧱 Quantità come step 1 (a pezzo) + riepilogo pulito
- Per i prodotti a pezzo, la quantità è ora il 1° step ("Quantità piastrelle"), poi gli altri (es. Bordo). Nel riepilogo laterale la quantità non si duplica più (lo stepper compare lì solo se non è uno step).
- Riepilogo più chiaro: riga prodotto principale "Nome: N pz", riga accessorio "Opzione: N pz · €", Copertura. Tolto il doppione dell'attributo accessorio. (src/components/Configurator.tsx).
v0.68.0 20/06/2026
➕ Accessorio con/ senza quantità selezionabile
- L'accessorio (es. bordo) mostra il selettore quantità solo se l'attributo ha "Quantità selezionabile"; altrimenti è conteggiato una volta (pezzo singolo / al m²). (src/components/Configurator.tsx).
v0.67.1 20/06/2026
🎯 "Configura ora" contestuale
- Il pulsante Configura ora nell'header: su una pagina prodotto porta alla configurazione di quel prodotto (scroll alla sezione configuratore
#configura); altrove (home/catalogo) apre il catalogo (tutti i prodotti). (Header.astro, ProductLive).
v0.67.0 20/06/2026
🧩 Accessori con quantità propria + riepilogo come carrello + card quadrate
- Accessori con quantità propria (es. Bordo): se l'attributo è "Accessorio extra", scegliendo un'opzione a pagamento (nero/giallo) compare un selettore quantità dedicato; il costo (prezzo × qty accessorio) è una riga separata nel riepilogo e nel carrello, indipendente dalla quantità del prodotto principale. (src/components/Configurator.tsx, configSchema).
- Niente più step finale "Quantità e prezzo": quantità principale, accessori, totale e "Aggiungi al carrello" sono sempre nel riepilogo laterale.
- Card opzioni quadrate con immagine object-contain (non più tagliata).
v0.66.0 19/06/2026
🧱 A pezzo (copertura) + step a opzione unica saltati
- Modalità A pezzo singolo: quantità in pezzi + copertura (≈ m²) calcolata da pezzi × misura del pezzo. (src/components/Configurator.tsx).
- Il configuratore salta gli step con una sola opzione (misura/colore/attributo) preselezionandoli → wizard più corto sui prodotti semplici.
v0.65.0 19/06/2026
🧱 Prodotti "a pezzo": niente anteprima quotata
- Per i prodotti impostati come *A pezzo / Mattonella* nel CRM, il configuratore mostra solo l'immagine + quantità, senza il disegno con le quote L×H (es. Solid Fatigue-Step). (src/components/Configurator.tsx,
pieceMode).
v0.64.1 19/06/2026
🧭 Barra menu full-width a capo (no scroll)
- La riga del menu categorie ora va a capo su due righe se serve (flex-wrap, centrata) invece di scorrere orizzontalmente. (src/components/Header.astro).
v0.64.0 19/06/2026
🟢 Bozze e pianificati nascosti dal catalogo
- I prodotti in bozza o pianificati nel futuro (stato impostato nel CRM) non compaiono nel catalogo/sito finché non pubblicati. (src/data/catalog.ts).
v0.63.0 19/06/2026
🧭 Header ridisegnato (stile floormad.com) + ricerca
- Top bar a 3 righe come floormad.com: annuncio (con link Come funziona/Recensioni/Area rivenditori), barra principale con logo + barra di ricerca (→ catalogo con
?q=) + Area clienti/carrello/Configura, e riga menu categorie dedicata (non si accavalla più anche con molte voci; scroll orizzontale se serve). (src/components/Header.astro). Ricerca pre-filtra il catalogo (CatalogBrowser).
v0.62.0 19/06/2026
🏷️ Specifiche / tag / banner da attributi + menu da categorie
- Gli attributi del prodotto popolano (in base ai toggle CRM): tag prodotto, Scheda tecnica in pagina, e un banner "in evidenza" con i valori. (src/data/catalog.ts, ProductLive).
- Menu header popolato dall'albero categorie del CRM (modificabile dal builder).
v0.61.0 19/06/2026
🗂️ Multi-categoria: un prodotto in più categorie
- Un prodotto compare in tutte le categorie selezionate nel CRM (non solo la principale): filtro per inclusione su
categorySlugs. (src/data/catalog.ts).
v0.60.0 19/06/2026
🎯 Banner icone prodotto (pallini qualità) in pagina
- La pagina prodotto mostra un banner scuro "in evidenza" con le icone prodotto scelte nel CRM, rese in bianco, con pallini qualità 1–5 sotto ciascuna e l'etichetta (nome + livello) al passaggio del mouse. Dati da
specIconsdel prodotto (ProductLive, catalog.ts).
v0.59.0 19/06/2026
🚚 Barra servizi globale su tutte le pagine
- Nuova barra servizi globale (Spedizione/Supporto/Pagamenti/Consegna) mostrata su tutte le pagine sopra il footer, modificabile in un solo punto dal builder (pagina
site-trustbar, link "Barra servizi" in Bacheca e barra admin). Realizzata col blocco *Punti di forza* in nuovo stile scuro (theme: dark) con flat icons. (TrustBar.astro, USPRow, Base.astro).
v0.58.1 19/06/2026
🗑️ Elimina chat (admin) + dati spedizione in sidebar assistenza
- Elimina chat: in *Chat clienti* l'admin può eliminare definitivamente una conversazione (bottone 🗑 nel dettaglio); rimossa anche dal mirror CRM
site_chats. (chat.phpdelete_chat, ChatsAdmin). - Spedizione in scheda cliente (Assistenza): la sidebar mostra ora sempre la riga Spedizione — l'indirizzo se presente (con destinatario), altrimenti "come fatturazione". (AssistenzaAdmin).
v0.58.0 19/06/2026
🖼️ Immagine OpenGraph configurabile
- FIX: l'immagine di anteprima social (OpenGraph) usava un'immagine fissa sbagliata. Ora rispetta la gerarchia: immagine della pagina/prodotto → Immagine OG di *Impostazioni sito › SEO* → fallback. URL reso sempre assoluto (Base.astro).
- Per-pagina dal builder: ogni pagina ha ora i campi root Descrizione (SEO) e Immagine condivisione (OpenGraph) (con selettore Media). Applicati a home e pagine builder. (puck.config, [p/[slug].astro](src/pages/p/[slug].astro), index.astro).
v0.57.1 19/06/2026
🔒 Conferma password nel recupero
- Nel recupero password (sia via codice sia via link) ora si inserisce la nuova password due volte; se non coincidono viene mostrato l'errore. (Account).
v0.57.0 19/06/2026
🔔 Badge notifiche + sync ticket/chat nel CRM + slider logo email
- Badge notifiche: pallino rosso con numero accanto a Chat clienti e Assistenza nella barra admin del sito (AdminBar) e sulla card Assistenza dell'area cliente (ticket aperti). Conteggi da
support.php(admin_counts) echat.php(count_chats, con flag *letto/non letto*). - Sync nel MegaCRM: ogni ticket e chat viene mirrorato nelle tabelle CRM
site_tickets/site_chatsvia bridge (così l'assistenza è sotto controllo anche dal gestionale). - Slider logo email: in *Aspetto email* si regola l'altezza del logo in testata (20–160px) con anteprima live (
emailLogoHeight). - FIX recupero password / area clienti "in caricamento": il
deploy_receiver.phpsul server rifiutava ("forbidden") lo specifico hash di un chunk JS (TicketOrderBox.*.js), che quindi restava 404 → l'island Account non faceva hydration. Componente rinominato (OrderInfoBox) per generare un hash accettato; verificato l'intero grafo di import a 200.
v0.56.0 19/06/2026
👤 Registrazione completa + recupero password (codice/link) + flat icons + anteprima email
- Registrazione completa (Account, account.php): form con tipo Privato/Azienda, dati fiscali (P.IVA/CF/SDI/PEC), indirizzo di fatturazione e spedizione (con autocompletamento), salvati in anagrafica.
- Recupero password: scelta tra codice a 6 cifre (inserito in pagina) o link via email. Nuovo template
account_reset_code. - Flat icons ovunque: il blocco *Punti di forza* usa icone flat SVG (righello, euro, camion, tavolozza…) selezionabili, al posto delle emoji. Aggiunte icone Ruler/Euro/Tag/Clock/Shield/Gift al set.
- Anteprima email nel log: in *Backup* → Log email, pulsante "Vedi email" che mostra il messaggio completo e impaginato esattamente come arriva al cliente (HTML salvato lato server, email.php
log_html).
v0.55.1 19/06/2026
✨ Punti di forza: icone visibili + 4 colonne
- Il blocco Punti di forza (USPRow) ora mostra un'icona (emoji) per voce (prima erano riquadri vuoti) ed è a 4 colonne quando ci sono 4 voci. Home aggiornata con 4 punti (📐 su misura, 💶 prezzo, 🚚 spedizione, 🎨 logo/stampa). L'icona è modificabile dal builder.
v0.55.0 19/06/2026
🎫 Ticket: link ordine/prodotti, magic-link email, scheda cliente, n° ticket, ordini FLR-
- Link ordine e prodotti nella chat (cliente e admin): ogni ticket mostra l'ordine collegato e i link ai prodotti ordinati (TicketOrderBox). Contesto risolto da
support.phpvia bridge. - Scheda cliente lato admin: terza colonna in AssistenzaAdmin con anagrafica completa (contatti, P.IVA/CF, indirizzi) + ordine e prodotti.
- Magic-link nelle email: link diretto cifrato (60 gg, nessun login) per aprire e rispondere alla chat — pagina /sito/ticket. Sostituisce le istruzioni "rispondi a questa email".
- Reply-to de-enfatizzato: le email staff ora rimandano al pannello assistenza (
/sito/assistenza?id=…, apertura diretta del ticket); quelle al cliente al magic-link. - Numero ticket: ogni ticket ha un progressivo "Ticket n. NNNN" mostrato ovunque.
- Elimina ticket (admin): cestino per eliminare definitivamente una chat.
- Ticket chiuso → niente sync email: lo scanner ignora le risposte ai ticket chiusi.
- Ordini formato FLR-NNNN: il checkout genera ID progressivi FLR-1601, FLR-1602, … (contatore atomico public/ordernum.php) al posto di
WEB-….
v0.54.1 19/06/2026
🔧 Fix pulizia citazione nelle risposte email ticket
- public/supportscan.php: le risposte da Gmail con attribuzione spezzata su due righe (*"…Floormad <…> ha\nscritto:"*) non venivano tagliate e il testo citato finiva nella chat. Ora si taglia appena una riga inizia con un marcatore di citazione (
Il giorno,On … wrote:,>,Da:/From:, ecc.), senza pretendere "ha scritto:" sulla stessa riga.
v0.54.0 19/06/2026
📍 Autocompletamento indirizzi (OpenStreetMap)
- Nuovo componente src/components/AddressAutocomplete.tsx: mentre scrivi la via, suggerisce gli indirizzi e compila in automatico via, CAP, città e provincia. Basato su OpenStreetMap/Photon → gratuito, nessuna API key. Attivo nel checkout (fatturazione + spedizione, src/components/CartPage.tsx) e nel profilo area clienti (src/components/Account.tsx).
v0.53.0 19/06/2026
🔑 Account automatico al checkout con password inviata via email
- Al checkout l'area clienti viene creata in automatico e ora invia una password generata (email *Credenziali account*) invece del solo link di attivazione, così il cliente accede subito. (public/account.php
provision, src/lib/order.ts). - Provisioning più robusto: usa il
customerIdpassato dal checkout se l'anagrafica non è ancora indicizzata (timing). - Nuovo template email
account_credentials(modificabile in *Email & WhatsApp*) con email + password + pulsante di accesso e invito a cambiare la password.
v0.52.0 19/06/2026
🎨 Logo e colore barra dedicati per le email
- Aspetto email (*Email & WhatsApp*): nuovi campi Logo email (URL, es. versione bianca) e Colore barra (color picker) con anteprima della testata. Se vuoti, ereditano logo/colore dal Tema. (public/email.php
wrapHtmlora usaemailLogoUrl/emailBarColor.)
v0.51.1 19/06/2026
🔧 Fix sync IMAP ticket (cert SSL + host)
- public/supportscan.php: aggiunto
novalidate-certalla connessione IMAP (risolve l'errore *"Certificate failure … No SNI provided / self-signed"* tipico su hosting condiviso). Se l'host IMAP è vuoto ora viene derivato dall'host SMTP (smtp.xxx→imap.xxx).
v0.51.0 19/06/2026
🖼️ Hero Slider in home con 5 prodotti
- Home page: il banner principale ora è uno slider a 5 slide con le foto reali dei prodotti di categorie diverse (LUXTURF stampato, cocco intarsiato, antifatica Comfort, spaghetto intarsiato, DRY FAST 7 giorni), ognuna con titolo, sottotitolo e pulsante che porta direttamente alla pagina prodotto. Autoplay 6s, overlay sfumato. Modificabile dal builder (blocco *Slider*).
v0.50.0 19/06/2026
🎫 Assistenza a ticket + risposte email sincronizzate + footer
- Assistenza a TICKET (public/support.php, src/components/Account.tsx, src/components/AssistenzaAdmin.tsx): ogni richiesta è un ticket con stato aperto/chiuso. Il cliente apre un nuovo ticket selezionando l'ordine collegato, può chiuderlo; l'admin può riaprirlo/chiuderlo. Lista con badge di stato e "da rispondere".
- Risposte via email sincronizzate (FIX): nuovo cron public/supportscan.php che legge via IMAP la casella dei ticket (
Reply-Tounica + tag[ticket:<id>]nell'oggetto) e inserisce automaticamente nel ticket le risposte sia del cliente sia dello staff (le risposte staff via email vengono anche inoltrate al cliente). Config IMAP in *Email & WhatsApp*; pulsante "↻ Sincronizza email" nella pagina Assistenza. *(Prima rispondere all'email non aggiornava la chat.)* - Footer: ora sempre ancorato in fondo alla pagina (sticky footer anche con poco contenuto). "Modifica Footer"/"Modifica Header": l'editor ora si apre pre-popolato con i blocchi reali invece di una tela vuota.
v0.49.0 19/06/2026
💳 Config pagamenti protetta + ✍️ editor WYSIWYG email
- Pagamenti (
/sito/pagamenti, public/payments.php, src/components/PaymentsAdmin.tsx): config Stripe/PayPal dal backend con accesso protetto da codice via email (step-up auth, token 30 min); i secret non vengono mai mostrati in chiaro. - Editor WYSIWYG (src/components/WysiwygEditor.tsx): i corpi delle email in *Email & WhatsApp* ora si modificano con editor visuale (grassetto, corsivo, liste, link) + toggle HTML.
- Più destinatari: "Email staff" ed "Email assistenza" accettano più indirizzi separati da virgola (l'invio va a tutti).
v0.48.0 19/06/2026
🤖 Scansione AI delle chat (follow-up automatico)
- public/chatscan.php (cron giornaliero): rilegge le chat non ancora analizzate, e se il cliente non ha trovato prezzo/soluzione invia un'email di follow-up personalizzata (riferita alla conversazione) con buono sconto e invito a ricontattarci. Marca le chat come analizzate.
v0.47.0 19/06/2026
🎟️ Coupon / buoni sconto
- Sistema coupon (public/coupons.php, backend
/sito/coupon→ src/components/CouponsAdmin.tsx): crea codici % o € fisso con spesa minima, scadenza, usi max. Nel carrello (src/components/CartPage.tsx) campo "Codice sconto" con validazione live; lo sconto è applicato ai totali e mostrato nelle email (src/lib/order.ts). Usi conteggiati alla conferma.
v0.46.0 19/06/2026
🖼️ Campo immagine del builder collegato ai Media
- src/builder/ImageField.tsx + src/builder/puck.config.tsx: tutti i campi immagine del builder (Hero, Immagine, Box aiuto, slide Hero Slider) aprono un selettore Media — scegli un'immagine esistente o caricane una nuova con drag & drop (ottimizzata in automatico). Resta possibile incollare un URL manuale.
v0.45.1 19/06/2026
🩹 Fix apertura menu a tendina AdminBar (overflow)
v0.45.0 19/06/2026
🆘 Chat assistenza + 🕵️ Simula utente + 📦 Indirizzo spedizione separato
- Chat assistenza (card "Assistenza" nell'area cliente → src/components/Account.tsx; backend
/sito/assistenza→ src/components/AssistenzaAdmin.tsx; public/support.php): thread per cliente, ogni messaggio invia email a staff e cliente con Reply-To incrociato; tutto memorizzato nel thread. - Simula utente (src/components/AdminBar.tsx, public/account.php
impersonate/admin_search): da menu Admin, popup ricerca cliente → navighi il sito come quel cliente (puoi ordinare/vedere la sua area); banner "Simuli: …" e uscita; top-bar admin sempre visibile. - Indirizzo di spedizione separato: spunta nel checkout (src/components/CartPage.tsx) + campi nel profilo (src/lib/order.ts, account.php) → mostrato nelle email come blocco Spedizione distinto dalla Fatturazione.
v0.44.0 19/06/2026
🔐 Recensioni solo da acquirenti + accesso auto + area cliente a card + post-vendita
- Recensioni verificate: scrivibili solo da clienti loggati che hanno acquistato il prodotto (public/reviews.php verifica acquisto via quotes; src/components/Reviews.tsx richiede login → "Accedi per recensire").
- Accesso automatico: alla richiesta preventivo/ordine viene creato l'account e inviata l'email per impostare la password (src/lib/order.ts →
account.phpprovision). - Area cliente a card (niente tab): Ordini & preventivi, Fatture (nuovo), Dati, Assistenza (src/components/Account.tsx).
- Post Vendita Cliente (public/postsale.php cron + Impostazioni Sito): email automatica X giorni dopo la consegna che invita a recensire e promette un buono sconto %. Testo modificabile (template
review_request).
v0.43.0 19/06/2026
💸 Fasce prezzo live + nudge sconto + misura in tempo reale
- src/components/Configurator.tsx: la misura su misura si aggiorna in tempo reale (niente più "Conferma misura"). Nella sidebar: tabellina fasce prezzo con fascia attiva evidenziata + nudge ("aggiungi X m² per la fascia scontata").
- src/components/ProductLive.tsx: la tabella Prezzi in alto evidenzia la fascia attiva in tempo reale (evento
fm-area) e mostra il nudge sconto.
v0.42.0 19/06/2026
👁️ Tema: anteprima live (sidebar destra)
- src/components/ThemeSettings.tsx: la pagina Tema è ora a due colonne — controlli a sinistra, anteprima in tempo reale a destra (sticky) che aggiorna font, dimensioni, tipografia per ruolo, colori, logo e pulsanti mentre modifichi. I font Google selezionati vengono caricati al volo nell'anteprima.
v0.41.1 19/06/2026
🎨 Configuratore: nav in alto + colonne colore adattive
- src/components/Configurator.tsx: pulsanti Indietro/Avanti anche in alto (a destra del titolo dello step), oltre che in basso. Griglia colori adattiva: swatch più grandi se ≤20 colori, fino a 10 colonne se molti.
v0.41.0 19/06/2026
🖼️ Backup: opzione "includi immagini prodotti"
- public/backup.php + src/components/BackupSettings.tsx: nuova opzione "Includi immagini prodotti" — scarica fisicamente le immagini (imageUrl + galleria) nello zip (
images/), filesito-DATA-full.zip. Più pesante e lento (cap 800 img / 300MB); il cron giornaliero resta leggero (solo dati).
v0.40.1 19/06/2026
💾 Backup completo (snapshot dati CRM incluso)
- public/backup.php: il backup ora include anche uno snapshot dei dati CRM (
crm-data/: products, categories, customers, quotes, invoices, jobs, settings, agents) via bridge — non più solo i file del sito. (Le immagini prodotto restano URL remoti del CRM; i riferimenti sono inproducts.json.)
v0.40.0 19/06/2026
🧭 Menu builder (WordPress-style) + mega menu + crea cliente
- Menu Builder (
/sito/menu, src/components/MenuBuilder.tsx): albero voci con auto-scoperta pagine (builder + rotte + categorie CRM), link personalizzati, riordino (drag top-level + frecce), tipo voce Link / Tendina / Mega menu con colonne e banner (immagine + CTA). Header le rende (src/components/Header.astro): dropdown e mega panel stile FlyerAlarm/VistaPrint. - Account clienti: crea cliente manuale (email obbligatoria) con invio automatico dell'email per impostare la password (public/account.php
admin_create).
v0.39.0 19/06/2026
👥 Gestione account clienti (backend)
- Nuova sezione Account clienti (
/sito/clienti, src/components/AccountsAdmin.tsx, public/account.php): elenco account portale con stato, blocca/sblocca (login negato se bloccato) e invio reset password. Link nell'AdminBar e nella dashboard.
v0.38.0 19/06/2026
🧭 Gestione menu header dal backend
- Menu header configurabile da Impostazioni Sito (src/components/SiteSettings.tsx, public/settings.php): voci con etichetta/link, riordino, aggiungi/rimuovi. L'header del sito (src/components/Header.astro) le rende (oltre al menu Prodotti/categorie).
v0.37.0 19/06/2026
🤖 Risposta chat con AI + 📄 PDF ordine allo staff
- Chat → Rispondi via email con AI (public/chat.php
ai_reply, src/components/ChatsAdmin.tsx): genera una bozza di risposta inerente alla conversazione, la rivedi/modifichi e la invii (email brandizzata viaemail.phpsend_custom). - PDF riepilogo ordine (src/lib/orderPdf.ts): ad ogni richiesta dal sito viene allegato alle email (staff + cliente) un PDF ordinato con dati cliente, articoli/configurazione, logo, totali.
v0.36.0 19/06/2026
💬 Chat: email gate, reset, memorizzazione + sezione backend
- Assistente chat (src/components/ChatAgent.tsx): chiede l'email prima di iniziare, pulsante reset/nuova chat, e ogni conversazione viene salvata sul server.
- Sezione Chat backend (
/sito/chat, src/components/ChatsAdmin.tsx, public/chat.php): elenco conversazioni con email/anteprima, lettura completa, "Rispondi via email". Storage in_chats/(protetto). Pronto per la futura scansione AI delle chat (camporeviewed).
v0.35.1 19/06/2026
✍️ Recensioni AI: errori "umani" realistici
- public/reviews.php: la sgrammaticatura (1/10) ora usa errori tipici italiani veri — es. "un pò" invece di "un po'", "e'" al posto di "è", "perchè", accenti/apostrofi sbagliati — per recensioni più autentiche.
v0.35.0 19/06/2026
🎨 Tipografia per ruolo + changelog leggibile + media prodotti + fix UI
- Changelog leggibile (src/components/Changelog.tsx): il modale mostra una timeline (badge versione, data, voci) invece del markdown grezzo.
- Media Library: nuova tab Immagini prodotti (dal CRM, copia URL).
- Tipografia tema (src/lib/siteTheme.ts, src/components/ThemeSettings.tsx): voci Titolo 1/2/3, Descrizioni, Prezzo con font, dimensione, stile (Capitalize/MAIUSCOLO…) e colore, con anteprima dal vivo.
- AdminBar: "Modifica prodotto" porta direttamente all'editor del prodotto nel CRM.
- Configuratore: box anteprima quadrato. Recensioni pagina prodotto: frecce ai lati (niente sovrapposizioni) e box più ampi per recensioni da 300 caratteri.
- Home: ripristinate le 3 icone dei punti di forza (flat).
v0.34.0 19/06/2026
🎞️ Hero Slider (img+video) + AdminBar ovunque + menu Admin
- Hero Slider (src/builder/blocks.tsx): nuovo blocco builder immagini + video con testo overlay (titolo/sottotitolo), pulsante, stile/font/colore/velo configurabili, autoplay, frecce e dots. Funziona statico (script inline). Aggiunto in homepage e disponibile nel builder Puck.
- AdminBar su tutte le pagine (anche backend) quando loggato; nuovo menu Admin in alto a destra (Bacheca, Impostazioni, Stato, MegaCRM, Esci).
- Recensioni AI: date casuali distribuite dal 2023 a oggi.
v0.33.0 19/06/2026
🤖 Recensioni AI + slider + box prodotto + font tema
- Generatore recensioni AI (public/reviews.php
ai_generate, src/components/ReviewsModeration.tsx): da/sito/recensioniscegli prodotto, quantità e opzioni (solo nome+recensione, sgrammaticatura 1/10) → Gemini genera recensioni realistiche (4-5 stelle, ~1/10 critica, mix breve/lungo max 300 char, date sparse). Con nome, stelle, titolo, testo. - Slider recensioni: nella pagina prodotto le recensioni scorrono in carosello (media stelle invariata). Homepage: nuova slider recensioni globale (src/components/GlobalReviews.tsx) con nome prodotto linkabile.
- AdminBar: "Modifica pagina/prodotto" sempre visibili (fuori dai sottomenu).
- Pagina prodotto: box "A partire da" e "Consegna stimata" affiancati ed evidenziati.
- Tema: nuova regolazione dimensione carattere (12–20px, scala tutto il sito; mobile −2px).
v0.32.0 19/06/2026
🎨 Icone flat 1-colore + AdminBar a menu a cascata
- Nuovo set icone flat a 1 colore (src/components/icons.tsx) al posto delle emoji.
- AdminBar riorganizzata con menu a cascata (Contenuti · Impostazioni · Sistema) + toggle Bacheca/Sito — meno affollata.
- Icone flat anche in: dashboard backend (griglia strumenti + "Vai al sito"), header storefront (carrello), Area Clienti (spedizioni). (Sweep delle restanti emoji decorative in corso.)
v0.31.0 19/06/2026
📊 Stato sistema + toggle Bacheca/Sito (stile WordPress)
- Stato sistema (
/sito/stato, public/status.php, src/components/StatusPage.tsx): salute bridge/email/WhatsApp + conteggi (pagine, account, recensioni, media, backup) + ultimo backup. - Toggle Bacheca/Sito sempre visibile: in AdminBar (🖥️ Bacheca · 🏠 Sito) e nell'header backend (🏠 Vai al sito). Stato aggiunto agli strumenti
/admine all'AdminBar.
v0.30.0 19/06/2026
⚙️ Impostazioni Sito + cookie/GA4 + Media drag&drop/ottimizzazione
- Impostazioni Sito (
/sito/impostazioni, public/settings.php, src/components/SiteSettings.tsx): contatti/social/footer, topbar, SEO default (+ noindex), GA4 & Meta Pixel, cookie banner. Footer e topbar ora leggono questi dati. - Cookie banner GDPR (src/components/CookieBanner.tsx): analytics (GA4/Pixel) caricati solo dopo consenso.
- Backend
/admin: griglia "Strumenti" con link a Impostazioni, Tema, Email, Media, Recensioni, Backup, MegaCRM. Link ⚙️ Impostazioni nell'AdminBar. - Media Library: drag & drop, filtri (ricerca + tipo) e ottimizzazione immagini in upload (ridimensiona entro max 2560×1440px, qualità configurabile — stile EWWW).
v0.29.0 19/06/2026
🖼️ Media Library + ⭐ Moderazione recensioni (backend)
- Media Library (
/sito/media, public/media.php, src/components/MediaLibrary.tsx): griglia degli upload, copia URL, elimina. - Moderazione recensioni (
/sito/recensioni, public/reviews.php, src/components/ReviewsModeration.tsx): approva/nascondi, segna "verificata", rispondi (la risposta appare in pagina), elimina. Le recensioni rifiutate spariscono dal sito. - Link 🖼️ Media e ⭐ Recensioni nell'AdminBar.
v0.28.0 19/06/2026
📦 Stati ordine: email per stato + notifiche WhatsApp
- public/email.php: nuovi template order_processing / order_shipped / order_completed (+CTA recensione) / order_cancelled e azione
order_eventche invia email brandizzata + WhatsApp (wesenderapi) al cliente. Config WhatsApp (endpoint/API key/mittente) nel backend Email (src/components/EmailSettings.tsx). - src/components/Account.tsx: la timeline dell'Area Clienti riflette lo stato ordine assegnato dal CRM.
v0.27.1 19/06/2026
🏷️ Versione + changelog nell'header del backend
- src/components/AdminDashboard.tsx: nell'header del backend sito ora c'è il badge vX.Y.Z (cliccabile) che apre il changelog del sito in un modale. Versione anche nel footer del sito.
v0.27.0 19/06/2026
💾 Backup giornaliero + log email + spedizioni + logo backend + versione
- Backup & ripristino (public/backup.php, src/components/BackupSettings.tsx su
/sito/backup): backup ZIP dei dati sito (_pages, _email, _theme, _uploads, _accounts, _reviews), retention 30, download e ripristino (da backup esistente o da file .zip caricato, con backup di sicurezza automatico pre-ripristino). Cron giornaliero viabackup.php?cron=<token>. - Log email inviate (public/email.php azione
log): ogni invio registrato (data, tipo, destinatario, oggetto, esito), visibile nel backend Backup & Log. - Spedizioni: l'ordine mostra al cliente corriere + tracking assegnati dal CRM; timeline avanza a "Spedito/Consegnato" (src/components/Account.tsx).
- Sicurezza:
_accounts/e_email/protetti da accesso diretto HTTP (.htaccess deny) — niente leak di hash/password SMTP. - Logo nel backend (src/components/AdminDashboard.tsx): mostra il logo del Tema al posto del segnaposto. Link 💾 Backup nell'AdminBar.
- Versione sito mostrata nel footer.
v0.26.0 19/06/2026
⭐ Recensioni prodotto + rich snippet Google
- Nuova sezione Recensioni nella pagina prodotto (src/components/Reviews.tsx, public/reviews.php): media stelle, elenco, form "scrivi recensione" (con honeypot anti-spam). Storage in
_reviews/<sha1(productId)>.json. - Le recensioni aggiornano
aggregateRating+reviewnel JSON-LD del prodotto → stelle nei risultati Google.
v0.25.1 19/06/2026
🔎 Area Clienti su filtro `where` del bridge
- public/account.php: query mirate (
fetch_tableconwhere {column,value}) per email / id / customerId, in coppia con il fix bridge CRM v3.132.2. Risolve i record recenti non trovati su tabelle grandi.
v0.25.0 19/06/2026
👤 Area Clienti (login, ordini, tracking, profilo)
- Nuova Area Clienti su
/sito/account(src/components/Account.tsx, public/account.php): registrazione/login, storico ordini & preventivi con timeline stato, tracking spedizioni (dalla scansione email viatrack_public), modifica profilo, recupero password via email. - Tutto in sync col CRM: dati letti/scritti da
customers/quotesvia bridge; le credenziali stanno in_accounts/sul sito (hash bcrypt, mai nel CRM). Niente utenti staff: solo anagrafica. - public/email.php: nuovo template
account_reset(link reimposta password). - src/components/Header.astro: link "Area clienti" nell'header.
v0.24.1 18/06/2026
📄 Icona PDF flat bianca su "Scheda tecnica"
- src/components/ProductLive.tsx: il pulsante "Scheda tecnica" usa un'icona PDF flat bianca (SVG inline) al posto dell'emoji.
v0.24.0 18/06/2026
🧭 Step manuali + regola bianco JPG/PNG
- src/components/Configurator.tsx: la scelta di un'opzione (colore, misura, attributo, incavo, stampa) non avanza più in automatico; si naviga manualmente con Avanti/Indietro o cliccando i tab numerati. La selezione marca lo step come completato (✓).
- Rimozione bianco logo: solo JPG → bianco rimosso ovunque (è sfondo); PNG e altri con alpha → lasciati invariati (il bianco fa parte del logo).
v0.23.2 18/06/2026
🩹 Logo header email (URL assoluto)
- public/email.php: il logo in testata usava l'URL relativo del Tema (
/sito/_uploads/…) → rotto nei client email. Ora viene reso assoluto (https://host/…).
v0.23.1 18/06/2026
🩹 Sfondo bianco loghi + ordine modalità stampa
- src/components/Configurator.tsx: rimozione sfondo bianco con flood-fill dai bordi sui loghi raster (poi rivisto in 0.24.0 → solo JPG). Ordine modalità stampa: A colori, 1 colore, 2 colori (default = A colori).
v0.23.0 18/06/2026
🖨️ Modalità stampa, email brandizzate, orientamento, galleria loop, mobile
- Modalità di stampa per prodotto: dal CRM si scelgono le modalità abilitate — 1 colore / 2 colori / a colori. Nel configuratore: 1 colore = posterizzazione tinta unica; 2 colori = scuro+chiaro per luminanza (rifinito da grafica); a colori = logo come inviato, con avviso 30 dpi se ha molte sfumature.
- Logo stampa: sfondo bianco rimosso per i JPG; slider dimensione logo; modale "Ingrandisci e posiziona" con drag + scala + colori.
- Email brandizzate (stile WooCommerce) (public/email.php, src/lib/order.ts, src/components/EmailSettings.tsx): logo in testata (banda colore brand dal Tema), layout centrato 600px, tabella prodotti + totali (imponibile/IVA/totale), dati cliente, anteprima prodotto, footer con dati azienda. Allegati: logo elaborato + scheda tecnica PDF (multipart MIME).
- Orientamento misure standard (src/components/Configurator.tsx): toggle ⬌ Orizzontale / ⬍ Verticale che inverte larghezza/altezza (misura caricata una sola volta nel CRM).
- Galleria: 4 miniature con loop infinito bidirezionale.
- Mobile: scala ridotta (root font 14px ≤640px, 13px ≤380px) per testi e tabelle.
v0.22.0 18/06/2026
🖨️ Stampa logo: scelta colore (1-colore)
- src/components/Configurator.tsx: nello step Stampa, dopo l'upload del logo, selettore Colore stampa — Originale (a colori) oppure Nero/Rosso/Blu/Verde con posterizzazione a 1 colore reale (canvas: bianco→trasparente, resto→colore scelto).
