Spaces:
Running
Running
| import streamlit as st | |
| import urllib.request | |
| import urllib.error | |
| import time | |
| import re | |
| # ============================================ | |
| # CONFIGURAZIONE E COSTANTI | |
| # ============================================ | |
| st.set_page_config(page_title="Ticino Digital Radar 2026", page_icon="🔍", layout="wide") | |
| st.title("🔍 Ticino Digital Radar 2026") | |
| st.markdown("### Piattaforma di Analisi Strategica per il Mercato Ticinese") | |
| st.write("Moduli separati per PMI esistenti e Nuove Attività in trasferimento.") | |
| st.markdown("---") | |
| CATEGORIE = { | |
| "Edilizia e Costruzioni": ["Impresa edile generale", "Ristrutturazioni", "Idraulico", "Elettricista", "Pittore", "Falegname", "Architetto", "Geometra", "Giardiniere", "Coperture"], | |
| "Ristorazione e Turismo": ["Ristorante", "Pizzeria", "Bar", "Gelateria", "Hotel", "B&B", "Agriturismo", "Catering"], | |
| "Retail e Commercio": ["Abbigliamento", "Elettronica", "Alimentari", "Farmacia", "Libreria", "Fioraio", "Gioielleria", "Arredamento"], | |
| "Servizi B2B e Professionisti": ["Avvocato", "Commercialista", "Fiduciaria", "Consulente aziendale", "Agenzia marketing", "Agenzia immobiliare", "Assicurazioni"], | |
| "Salute e Benessere": ["Medico", "Dentista", "Fisioterapista", "Psicologo", "Palestra", "Centro estetico", "Parrucchiere", "Nutrizionista"], | |
| "Servizi Auto e Trasporti": ["Officina meccanica", "Elettrauto", "Gommista", "Carrozzeria", "Autoscuola", "Noleggio auto", "Trasporti"], | |
| "Altri Servizi": ["Pulizie", "Sicurezza", "Fotografo", "Eventi", "Lavanderia"] | |
| } | |
| DATI_MERCATO = { | |
| "Edilizia e Costruzioni": {"richieste_perse": 18, "valore_medio": 4500, "ltv": 13500, "crescita_annua": "4.2%"}, | |
| "Ristorazione e Turismo": {"richieste_perse": 45, "valore_medio": 85, "ltv": 1200, "crescita_annua": "6.8%"}, | |
| "Retail e Commercio": {"richieste_perse": 60, "valore_medio": 120, "ltv": 1800, "crescita_annua": "3.1%"}, | |
| "Servizi B2B e Professionisti": {"richieste_perse": 12, "valore_medio": 2800, "ltv": 28000, "crescita_annua": "5.5%"}, | |
| "Salute e Benessere": {"richieste_perse": 35, "valore_medio": 150, "ltv": 2400, "crescita_annua": "7.2%"}, | |
| "Servizi Auto e Trasporti": {"richieste_perse": 25, "valore_medio": 380, "ltv": 3800, "crescita_annua": "2.9%"}, | |
| "Altri Servizi": {"richieste_perse": 30, "valore_medio": 200, "ltv": 1600, "crescita_annua": "4.0%"} | |
| } | |
| STRATEGIE_SETTORE = { | |
| "Edilizia e Costruzioni": [ | |
| "Ottimizzare Google Business Profile con foto cantieri reali e zona intervento precisa.", | |
| "Creare landing page 'Pronto Intervento' ottimizzata per mobile con CTA WhatsApp.", | |
| "Registrarsi su Edilizia.ch e Preventivi.ch per intercettare lead qualificati." | |
| ], | |
| "Ristorazione e Turismo": [ | |
| "Configurare TheFork/TripAdvisor con menu digitale e foto professionali.", | |
| "Implementare sistema prenotazioni dirette sul sito per ridurre commissioni.", | |
| "Lanciare campagna Instagram geo-tagged con hashtag locali (#ticinofood)." | |
| ], | |
| "Retail e Commercio": [ | |
| "Attivare Instagram Shopping con catalogo prodotti e tag posizione negozio.", | |
| "Implementare Click & Collect semplice via form o WhatsApp Business.", | |
| "Registrarsi su Ricardo.ch e Galaxus Marketplace per visibilità e-commerce." | |
| ], | |
| "Servizi B2B e Professionisti": [ | |
| "Creare profilo LinkedIn Company con casi studio e contenuti educativi.", | |
| "Preparare Lead Magnet specifico per il mercato ticinese (es. guida fiscale).", | |
| "Partecipare a eventi UCBS/Camera di Commercio per networking B2B." | |
| ], | |
| "Salute e Benessere": [ | |
| "Ottimizzare Google Business Profile con servizi dettagliati e link prenotazioni.", | |
| "Implementare sistema prenotazioni online per ridurre no-show e chiamate.", | |
| "Registrarsi su Doctor.ch/Treatwell.ch per visibilità immediata nel settore." | |
| ], | |
| "Servizi Auto e Trasporti": [ | |
| "Creare pagina 'Preventivo Rapido' con form minimi (targa, problema, contatto).", | |
| "Attivare WhatsApp Business per preventivi veloci e conferme appuntamenti.", | |
| "Registrarsi su Garage.ch e AutoScout24.ch per lead locali qualificati." | |
| ], | |
| "Altri Servizi": [ | |
| "Creare landing page one-page con servizi, prezzi indicativi e contatti chiari.", | |
| "Ottimizzare Google Business Profile con foto lavori e recensioni iniziali.", | |
| "Registrarsi su directory generali e di nicchia del proprio settore." | |
| ] | |
| } | |
| DIRECTORY_GRATUITE = { | |
| "Generali": [ | |
| ("Google Business Profile", "https://www.google.com/business/", "Fondamentale - appare su Maps"), | |
| ("Bing Places", "https://www.bing.com/business/", "Secondo motore di ricerca"), | |
| ("Apple Maps Connect", "https://mapsconnect.apple.com/", "Per utenti iPhone"), | |
| ("Yelp Svizzera", "https://www.yelp.ch/", "Recensioni e visibilità"), | |
| ("PagineGialle.ch", "https://www.paginegialle.ch/", "Directory storica svizzera"), | |
| ("Facebook Business", "https://www.facebook.com/business/", "Pagina aziendale gratuita"), | |
| ("Instagram Business", "https://business.instagram.com/", "Profilo business gratuito"), | |
| ("LinkedIn Company", "https://www.linkedin.com/company/", "Profilo B2B essenziale") | |
| ], | |
| "Edilizia e Costruzioni": [("Edilizia.ch", "https://www.edilizia.ch/", "Settoriale edile"), ("Preventivi.ch", "https://www.preventivi.ch/", "Lead generation")], | |
| "Ristorazione e Turismo": [("TheFork", "https://www.thefork.ch/", "Prenotazioni"), ("TripAdvisor", "https://www.tripadvisor.it/", "Recensioni turismo")], | |
| "Retail e Commercio": [("Ricardo.ch", "https://www.ricardo.ch/", "Marketplace CH"), ("Galaxus", "https://www.galaxus.ch/", "E-commerce leader")], | |
| "Servizi B2B e Professionisti": [("Fiduciari.ch", "https://www.fiduciari.ch/", "Directory fiduciarie"), ("Avvocati.ch", "https://www.avvocati.ch/", "Directory legali")], | |
| "Salute e Benessere": [("Doctor.ch", "https://www.doctor.ch/", "Medici svizzeri"), ("Treatwell.ch", "https://www.treatwell.ch/", "Prenotazioni benessere")], | |
| "Servizi Auto e Trasporti": [("Garage.ch", "https://www.garage.ch/", "Officine svizzere"), ("AutoScout24.ch", "https://www.autoscout24.ch/", "Settore automotive")] | |
| } | |
| # ============================================ | |
| # INPUT UTENTE E SELEZIONE MODULO | |
| # ============================================ | |
| modulo_selezionato = st.radio( | |
| "Seleziona il modulo di analisi:", | |
| ["🏢 PMI Esistente in Ticino", "🚀 Nuova Attività / Trasferimento in Ticino"], | |
| horizontal=True, | |
| label_visibility="collapsed" | |
| ) | |
| st.subheader("📋 Dati Base") | |
| col_nome, col_cat, col_zona = st.columns([2, 1, 1]) | |
| with col_nome: | |
| nome_azienda = st.text_input("Nome Azienda / Progetto", placeholder="Es. Rossi SA o Progetto Alpha") | |
| with col_cat: | |
| macro_categoria = st.selectbox("Settore", list(CATEGORIE.keys())) | |
| categoria = st.selectbox("Tipologia", CATEGORIE[macro_categoria]) | |
| with col_zona: | |
| zona = st.selectbox("Zona", ["Seleziona...", "Luganese", "Mendrisiotto", "Locarnese", "Bellinzonese e Valli", "Tutto il Ticino"]) | |
| sito_web = st.text_input("Sito Web (opzionale)", placeholder="www.esempio.ch") | |
| st.markdown("---") | |
| # ============================================ | |
| # MODULO TRASFERIMENTO: DATI AGGIUNTIVI | |
| # ============================================ | |
| dati_trasferimento = None | |
| if modulo_selezionato == "🚀 Nuova Attività / Trasferimento in Ticino": | |
| st.info("🇭 **Modulo Ricerca Mercato: Trasferimento in Ticino**") | |
| col_t1, col_t2 = st.columns(2) | |
| with col_t1: | |
| provenienza = st.selectbox("Provenienza", ["Italia", "Altro Cantone CH", "Estero", "Già presente <1 anno"]) | |
| concorrenza_percepita = st.radio("Concorrenza locale percepita", ["Alta", "Media", "Bassa", "Non so"]) | |
| with col_t2: | |
| obiettivo_principale = st.selectbox("Obiettivo Anno 1", ["Acquisizione Clienti Rapida", "Brand Awareness", "Networking B2B", "Test di Mercato"]) | |
| dati_trasferimento = { | |
| "provenienza": provenienza, | |
| "obiettivo": obiettivo_principale, | |
| "concorrenza": concorrenza_percepita | |
| } | |
| st.markdown("---") | |
| # ============================================ | |
| # FUNZIONE ANALISI SITO WEB | |
| # ============================================ | |
| def analizza_sito(url): | |
| r = {'raggiungibile': False, 'https': False, 'mobile': False, 'veloce': False, 'title': '', 'errore': ''} | |
| if not url.startswith('http'): url = 'https://' + url | |
| try: | |
| req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) | |
| start = time.time() | |
| resp = urllib.request.urlopen(req, timeout=8) | |
| dur = time.time() - start | |
| r['raggiungibile'] = True | |
| r['https'] = url.startswith('https') | |
| r['veloce'] = dur < 2.5 | |
| html = resp.read().decode('utf-8', errors='ignore').lower() | |
| if 'viewport' in html: r['mobile'] = True | |
| t = re.search(r'<title>([^<]+)</title>', html) | |
| if t: r['title'] = t.group(1).strip()[:80] | |
| except Exception as e: | |
| r['errore'] = str(e)[:100] | |
| return r | |
| # ============================================ | |
| # ESECUZIONE ANALISI | |
| # ============================================ | |
| if st.button("🚀 Genera Report Strategico Completo", type="primary", use_container_width=True): | |
| if not nome_azienda or zona == "Seleziona...": | |
| st.error("⚠️ Inserisci Nome Azienda e Zona Operativa") | |
| else: | |
| # Analisi sito se presente | |
| dati_sito = None | |
| if sito_web and sito_web.strip(): | |
| with st.spinner(f"🔍 Analisi tecnica di {sito_web}..."): | |
| time.sleep(0.5) | |
| dati_sito = analizza_sito(sito_web) | |
| st.success(f"✅ Report generato per: **{nome_azienda}** ({categoria})") | |
| # ========================================================= | |
| # MODULO A: PMI ESISTENTE | |
| # ========================================================= | |
| if modulo_selezionato == "🏢 PMI Esistente in Ticino": | |
| st.subheader(" Audit Presenza Digitale e Perdite Economiche") | |
| # Calcolo Health Score (0-100) | |
| score = 0 | |
| max_score = 100 | |
| dettagli_score = [] | |
| # Punteggio Tecnico Sito (max 40 punti) | |
| if dati_sito: | |
| if dati_sito['raggiungibile']: | |
| score += 20 | |
| dettagli_score.append(("✅ Sito Raggiungibile", "+20")) | |
| if dati_sito['https']: | |
| score += 5 | |
| dettagli_score.append((" HTTPS Attivo", "+5")) | |
| if dati_sito['mobile']: | |
| score += 5 | |
| dettagli_score.append(("📱 Mobile Friendly", "+5")) | |
| if dati_sito['veloce']: | |
| score += 5 | |
| dettagli_score.append(("⚡ Velocità Ottimale", "+5")) | |
| if dati_sito['title']: | |
| score += 5 | |
| dettagli_score.append(("🏷️ Title SEO Presente", "+5")) | |
| else: | |
| dettagli_score.append((" Sito Non Raggiungibile", "0/20")) | |
| else: | |
| dettagli_score.append(("❌ Nessun Sito Web Rilevato", "0/40")) | |
| # Punteggio Social & Directory (max 60 punti - simulato per demo) | |
| score_social = 30 # Valore base di esempio | |
| score += score_social | |
| dettagli_score.append(("📲 Presenza Social/Base", f"+{score_social}/60")) | |
| # Visualizzazione Score | |
| col_s1, col_s2 = st.columns([1, 3]) | |
| with col_s1: | |
| st.metric("Health Score Digitale", f"{score}/100") | |
| with col_s2: | |
| st.progress(score / 100) | |
| st.caption("Composto da: Analisi Tecnica Sito (40%) + Presenza Social/Directory (60%)") | |
| # Dettaglio Analisi Google e Social | |
| st.markdown("### 🔍 Dettaglio Analisi Piattaforme") | |
| tab_google, tab_social, tab_tecnico = st.tabs(["Google & Maps", "Social Media", "Analisi Tecnica Sito"]) | |
| with tab_google: | |
| st.markdown("#### Stato Google Business Profile") | |
| if dati_sito and dati_sito['raggiungibile']: | |
| st.success("✅ Scheda GBP rilevata e collegata al sito") | |
| else: | |
| st.warning("️ Verifica manuale necessaria: Assicurati che la scheda GBP sia claimata e ottimizzata") | |
| st.info("💡 **Consiglio**: Aggiungi almeno 10 foto recenti e rispondi a tutte le recensioni negli ultimi 30 giorni.") | |
| with tab_social: | |
| st.markdown("#### Presenza Social Media") | |
| st.write("- **Facebook**: Verificare pagina attiva e orari aggiornati") | |
| st.write("- **Instagram**: Controllare bio con link diretto e highlight servizi") | |
| st.write("- **LinkedIn**: Essenziale per B2B, verificare completezza profilo company") | |
| st.warning("⚠️ Per un audit social automatico completo, collega le API delle piattaforme nella versione Pro.") | |
| with tab_tecnico: | |
| st.markdown("#### Dettagli Tecnici Sito Web") | |
| for dettaglio, punti in dettagli_score: | |
| if "+" in punti or "✅" in dettaglio: | |
| st.success(f"{dettaglio}: {punti}") | |
| else: | |
| st.error(f"{dettaglio}: {punti}") | |
| # Calcolo Perdite Economiche | |
| dati_settore = DATI_MERCATO.get(macro_categoria, DATI_MERCATO["Altri Servizi"]) | |
| fattore_efficienza = score / 100 | |
| perdita_mese = int(dati_settore["richieste_perse"] * dati_settore["valore_medio"] * (1 - fattore_efficienza)) | |
| perdita_anno = perdita_mese * 12 | |
| st.markdown("---") | |
| st.error(f""" | |
| ### 💸 Quanto Stai Perdendo Se Non Agisci | |
| Con un Health Score di **{score}/100**, stai lasciando sul tavolo circa: | |
| ## CHF {perdita_mese:,.0f} / mese | |
| ### CHF {perdita_anno:,.0f} / anno | |
| *Calcolato su richieste perse medie del settore {macro_categoria} × inefficienza digitale.* | |
| """) | |
| # Azioni di Miglioramento Concrete | |
| st.markdown("### 🛠️ Cosa Devi Fare Ora") | |
| if not dati_sito or not dati_sito['raggiungibile']: | |
| st.markdown(""" | |
| #### 🔴 Priorità Assoluta: Presenza Web Minima | |
| - Crea una landing page one-page con: servizi, contatti, mappa, pulsante WhatsApp | |
| - Costo stimato: CHF 500-800 | Tempo: 1-2 settimane | |
| - Impatto: +100% visibilità online immediata | |
| """) | |
| else: | |
| azioni_immediate = [] | |
| if not dati_sito['https']: | |
| azioni_immediate.append(("🔒 Attiva HTTPS", "Certificato SSL gratuito con hosting. +15% fiducia clienti.")) | |
| if not dati_sito['mobile']: | |
| azioni_immediate.append(("📱 Ottimizza per Mobile", "85% clienti cercano da smartphone. +60% traffico mobile.")) | |
| if not dati_sito['veloce']: | |
| azioni_immediate.append(("⚡ Velocizza il Sito", "Ottimizza immagini e caching. -50% abbandoni.")) | |
| if azioni_immediate: | |
| st.markdown("#### Azioni Immediate (0-30 giorni)") | |
| for azione, impatto in azioni_immediate: | |
| st.warning(f"**{azione}** → {impatto}") | |
| st.markdown("#### Strategie Settore (30-90 giorni)") | |
| strategie = STRATEGIE_SETTORE.get(macro_categoria, STRATEGIE_SETTORE["Altri Servizi"]) | |
| for s in strategie: | |
| st.info(f"• {s}") | |
| # Directory Essenziali | |
| st.markdown("---") | |
| st.subheader("📋 Dove Registrarti (Gratuito)") | |
| col_d1, col_d2 = st.columns(2) | |
| with col_d1: | |
| st.markdown("**Generali (Obbligatorie)**") | |
| for n, u, d in DIRECTORY_GRATUITE["Generali"]: | |
| st.write(f"🔹 [{n}]({u}) - {d}") | |
| with col_d2: | |
| dirs_spec = DIRECTORY_GRATUITE.get(macro_categoria, []) | |
| if dirs_spec: | |
| st.markdown(f"**Specifiche {macro_categoria}**") | |
| for n, u, d in dirs_spec: | |
| st.write(f"🔹 [{n}]({u}) - {d}") | |
| # ========================================================= | |
| # MODULO B: NUOVA ATTIVITÀ / TRASFERIMENTO | |
| # ========================================================= | |
| elif modulo_selezionato == "🚀 Nuova Attività / Trasferimento in Ticino" and dati_trasferimento: | |
| dt = dati_trasferimento | |
| dati_settore = DATI_MERCATO.get(macro_categoria, DATI_MERCATO["Altri Servizi"]) | |
| st.subheader(f"🇨🇭 Analisi Mercato e Opportunità: {nome_azienda}") | |
| # Quadro Situazionale | |
| st.markdown("#### 📌 Contesto Operativo") | |
| col_q1, col_q2, col_q3 = st.columns(3) | |
| with col_q1: | |
| st.metric("Provenienza", dt['provenienza']) | |
| with col_q2: | |
| st.metric("Obiettivo Anno 1", dt['obiettivo']) | |
| with col_q3: | |
| st.metric("Concorrenza Percepita", dt['concorrenza']) | |
| # Mercato Disponibile e Crescita Finanziaria | |
| st.markdown("---") | |
| st.subheader("💰 Mercato Disponibile e Potenziale di Crescita") | |
| richieste_totali_mese = dati_settore["richieste_perse"] | |
| valore_transazione = dati_settore["valore_medio"] | |
| mercato_mensile_chf = richieste_totali_mese * valore_transazione | |
| mercato_annuale_chf = mercato_mensile_chf * 12 | |
| crescita = dati_settore["crescita_annua"] | |
| col_m1, col_m2, col_m3 = st.columns(3) | |
| with col_m1: | |
| st.metric("Richieste Mensili Settore", f"{richieste_totali_mese}", "Nel tuo segmento") | |
| with col_m2: | |
| st.metric("Mercato Annuale Stimato", f"CHF {mercato_annuale_chf:,.0f}", f"Crescita: +{crescita}/anno") | |
| with col_m3: | |
| share_target = 0.15 if dt['concorrenza'] in ['Bassa', 'Media'] else 0.08 | |
| fatturato_target = int(mercato_annuale_chf * share_target) | |
| st.metric("Target Realistico Anno 1", f"CHF {fatturato_target:,.0f}", f"{int(share_target*100)}% market share") | |
| st.info(f""" | |
| **Interpretazione:** Il settore {macro_categoria} nel Ticino genera circa **CHF {mercato_annuale_chf:,.0f}/anno** | |
| in richieste non soddisfatte. Con una crescita annua del **{crescita}**, il mercato è in espansione. | |
| Un nuovo entrante ben posizionato può realisticamente catturare tra l'**8% e il 15%** | |
| di questo mercato nel primo anno. | |
| """) | |
| # Roadmap di Lancio Pulita e Migliorata | |
| st.markdown("---") | |
| st.subheader("🗺️ Roadmap di Insediamento Strategico") | |
| strategie = STRATEGIE_SETTORE.get(macro_categoria, STRATEGIE_SETTORE["Altri Servizi"]) | |
| tab_setup, tab_lancio, tab_crescita = st.tabs(["🏗️ Setup Iniziale", " Go-to-Market", "📈 Consolidamento"]) | |
| with tab_setup: | |
| st.markdown("#### ✅ Fondamenta (Settimane 1-4)") | |
| st.write("- Costituire società e aprire conto bancario svizzero") | |
| st.write("- Ottenere licenze/permessi cantonali specifici per il settore") | |
| st.write("- Creare presenza digitale minima (GBP + landing page)") | |
| st.write("- Registrarsi su directory di settore essenziali") | |
| for s in strategie[:1]: | |
| st.write(f"- {s}") | |
| with tab_lancio: | |
| st.markdown("#### Lancio sul Mercato (Settimane 5-12)") | |
| st.write("- Evento/open day di inaugurazione con invito stampa locale") | |
| st.write("- Campagna Google Ads geo-targeted sulla zona operativa") | |
| st.write("- Attivazione social media con contenuti localizzati") | |
| for s in strategie[1:]: | |
| st.write(f"- {s}") | |
| with tab_crescita: | |
| st.markdown("#### 📈 Consolidamento (Mesi 4-12)") | |
| st.write("- Sistema raccolta recensioni sistematico post-servizio") | |
| st.write("- Partnership con attività complementari non concorrenti") | |
| st.write("- Ottimizzazione campagne ads basata sui dati reali") | |
| st.write("- Espansione offerta servizi in base al feedback clienti") | |
| # Directory Essenziali | |
| st.markdown("---") | |
| st.subheader("📋 Directory Essenziali per il Tuo Settore") | |
| col_d1, col_d2 = st.columns(2) | |
| with col_d1: | |
| st.markdown("**Generali (Obbligatorie)**") | |
| for n, u, d in DIRECTORY_GRATUITE["Generali"]: | |
| st.write(f"🔹 [{n}]({u}) - {d}") | |
| with col_d2: | |
| dirs_spec = DIRECTORY_GRATUITE.get(macro_categoria, []) | |
| if dirs_spec: | |
| st.markdown(f"**Specifiche {macro_categoria}**") | |
| for n, u, d in dirs_spec: | |
| st.write(f"🔹 [{n}]({u}) - {d}") | |
| # ========================================================= | |
| # CALL TO ACTION FINALE E LEAD CAPTURE | |
| # ========================================================= | |
| st.markdown("---") | |
| st.subheader(" Sessione Strategica Gratuita con Professionista") | |
| st.markdown(""" | |
| ### Questo report è solo l'inizio. | |
| Esistono **molte altre strategie avanzate** che non possono essere automatizzate in un report standard: | |
| - **SEO Tecnica Avanzata**: Schema markup complessi, Core Web Vitals optimization, link building locale | |
| - **Content Marketing Strategico**: Piano editoriale geo-targeted, lead magnet ad alta conversione | |
| - **Funnel di Vendita Digitali**: Automazione nurturing, retargeting dinamico, email sequence | |
| - **Analisi Competitor Approfondita**: Reverse engineering delle strategie dei top player del settore | |
| - **Ottimizzazione Conversion Rate**: A/B testing landing page, heatmap analysis, user journey mapping | |
| **Queste tecniche le analizzeremo insieme durante una sessione gratuita di 30 minuti con un professionista strategico.** | |
| """) | |
| st.info("👉 **Prenota ora la tua call gratuita** e ricevi un piano d'azione personalizzato basato su dati reali del tuo business.") | |
| c_a, c_b = st.columns(2) | |
| with c_a: | |
| n_contatto = st.text_input("Nome Referente") | |
| e_contatto = st.text_input("Email Contatto") | |
| with c_b: | |
| tel_contatto = st.text_input("Telefono") | |
| if st.button("📅 Prenota Sessione Strategica Gratuita", type="primary", use_container_width=True): | |
| if n_contatto and e_contatto: | |
| st.balloons() | |
| st.success(f"Grazie {n_contatto}! Ti contatteremo entro 24h a {e_contatto} per fissare la call") | |
| else: | |
| st.error("Compila almeno Nome ed Email") | |
| st.caption("Ticino Digital Radar 2026 | Analisi generata automaticamente") |