@ctonti/ask-golf-veneto 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -11,8 +11,8 @@ import { toast } from "sonner";
|
|
|
11
11
|
//#region src/components/intro.tsx
|
|
12
12
|
function Intro() {
|
|
13
13
|
const { PromptIntro } = useContext(ComponentsContext);
|
|
14
|
-
const
|
|
15
|
-
const title = contents
|
|
14
|
+
const chatCtx = useContext(ChatContext);
|
|
15
|
+
const title = chatCtx?.contents?.intro?.title || "Progetta la tua <em>vacanza golf</em> in Veneto";
|
|
16
16
|
const [activeTab, setActiveTab] = useState("wizard");
|
|
17
17
|
const [period, setPeriod] = useState("Maggio - Giugno");
|
|
18
18
|
const [duration, setDuration] = useState("7 Giorni (1 Settimana)");
|
|
@@ -30,25 +30,42 @@ function Intro() {
|
|
|
30
30
|
const toggleInterest = (item) => {
|
|
31
31
|
setInterests((prev) => prev.includes(item) ? prev.filter((i) => i !== item) : [...prev, item]);
|
|
32
32
|
};
|
|
33
|
+
const submitMessage = (formattedText) => {
|
|
34
|
+
console.log("Submitting prompt to chat:", formattedText);
|
|
35
|
+
if (typeof chatCtx?.append === "function") {
|
|
36
|
+
chatCtx.append({
|
|
37
|
+
role: "user",
|
|
38
|
+
content: formattedText
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (typeof chatCtx?.sendMessage === "function") {
|
|
43
|
+
chatCtx.sendMessage({ text: formattedText });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (typeof chatCtx?.setInput === "function") {
|
|
47
|
+
chatCtx.setInput(formattedText);
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
if (typeof chatCtx?.handleSubmit === "function") chatCtx.handleSubmit();
|
|
50
|
+
}, 50);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
33
54
|
const handleWizardSubmit = (e) => {
|
|
34
55
|
e.preventDefault();
|
|
35
|
-
|
|
56
|
+
submitMessage(`Desidero organizzare una vacanza su misura in Veneto con i seguenti dettagli:
|
|
36
57
|
|
|
37
58
|
- **Periodo desiderato:** ${period}
|
|
38
59
|
- **Durata del soggiorno:** ${duration}
|
|
39
60
|
- **Tipologia di viaggiatori:** ${travelers}
|
|
40
61
|
- **Frequenza di gioco:** ${golfFrequency}
|
|
41
62
|
- **Livello / Handicap:** ${golfLevel}
|
|
42
|
-
- **
|
|
63
|
+
- **Interests principali (oltre al golf):** ${interests.length > 0 ? interests.join(", ") : "Nessuno in particolare"}
|
|
43
64
|
- **Tipologia di alloggio preferita:** ${stayType}
|
|
44
65
|
- **Modalità di trasporto e logistica:** ${transport}
|
|
45
66
|
${notes.trim() ? `- **Note e desideri particolari:** ${notes}` : ""}
|
|
46
67
|
|
|
47
|
-
Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in Veneto, selezionando i migliori Golf Club affiliati al consorzio e le migliori esperienze correlate
|
|
48
|
-
append?.({
|
|
49
|
-
role: "user",
|
|
50
|
-
content: formattedPrompt
|
|
51
|
-
});
|
|
68
|
+
Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in Veneto, selezionando i migliori Golf Club affiliati al consorzio e le migliori esperienze correlate.`);
|
|
52
69
|
};
|
|
53
70
|
return /* @__PURE__ */ jsxs("section", {
|
|
54
71
|
className: "relative flex min-h-[calc(100vh-80px)] w-full flex-col items-center justify-center py-12 px-4 bg-[#faf8f3] text-[#213f31] overflow-hidden",
|
|
@@ -254,7 +271,7 @@ Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in V
|
|
|
254
271
|
"Cucina Gourmet & Trattorie Tipiche",
|
|
255
272
|
"Dolomiti & Escursioni in Natura",
|
|
256
273
|
"Lago di Garda & Parchi per la Famiglia"
|
|
257
|
-
].map((item, i) => /* @__PURE__ */ jsxs("
|
|
274
|
+
].map((item, i) => /* @__PURE__ */ jsxs("div", {
|
|
258
275
|
onClick: () => toggleInterest(item),
|
|
259
276
|
className: `flex items-center gap-3 p-3 rounded-xl border cursor-pointer transition-all ${interests.includes(item) ? "bg-[#213f31]/10 border-[#213f31] text-[#213f31] font-semibold" : "bg-[#faf8f3] border-[#e8d9c0] text-[#213f31]/70 hover:border-[#213f31]/40"}`,
|
|
260
277
|
children: [/* @__PURE__ */ jsx("input", {
|
|
@@ -367,10 +384,7 @@ Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in V
|
|
|
367
384
|
"Tour di 10 giorni: Dolomiti, Lago di Garda e Golf"
|
|
368
385
|
].map((prompt, i) => /* @__PURE__ */ jsx("button", {
|
|
369
386
|
type: "button",
|
|
370
|
-
onClick: () =>
|
|
371
|
-
role: "user",
|
|
372
|
-
content: prompt
|
|
373
|
-
}),
|
|
387
|
+
onClick: () => submitMessage(prompt),
|
|
374
388
|
className: "px-4 py-2 rounded-full bg-[#213f31]/5 hover:bg-[#213f31] text-[#213f31] hover:text-[#faf8f3] text-xs font-medium border border-[#213f31]/15 transition-all duration-200 cursor-pointer shadow-sm",
|
|
375
389
|
children: prompt
|
|
376
390
|
}, i))
|
|
@@ -502,4 +516,4 @@ function getHtmlLang() {
|
|
|
502
516
|
//#endregion
|
|
503
517
|
export { Preview as a, Renderer$1 as i, Chat as n, PreviewRenderer as o, COMPONENTS as r, Main as s, App as t };
|
|
504
518
|
|
|
505
|
-
//# sourceMappingURL=app-
|
|
519
|
+
//# sourceMappingURL=app-Ce4Q8eKi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-Ce4Q8eKi.mjs","names":["Renderer","JsonRenderer"],"sources":["../src/components/intro.tsx","../src/components/main.tsx","../src/components/preview.tsx","../src/components/renderer.tsx","../src/components.ts","../src/components/chat.tsx","../src/components/app.tsx"],"sourcesContent":["'use client';\n\nimport { ChatContext, ComponentsContext } from '@websolutespa/ask-plugin';\nimport { useContext, useState } from 'react';\nimport { Flag, Calendar, Users, Compass, Car, Sparkles, Send, MessageSquareText } from 'lucide-react';\n\nexport function Intro() {\n const { PromptIntro } = useContext(ComponentsContext);\n const chatCtx = useContext(ChatContext) as any;\n\n const title = chatCtx?.contents?.intro?.title || 'Progetta la tua <em>vacanza golf</em> in Veneto';\n\n const [activeTab, setActiveTab] = useState<'wizard' | 'chat'>('wizard');\n\n // Form State\n const [period, setPeriod] = useState<string>('Maggio - Giugno');\n const [duration, setDuration] = useState<string>('7 Giorni (1 Settimana)');\n const [travelers, setTravelers] = useState<string>('Coppia');\n const [golfFrequency, setGolfFrequency] = useState<string>('Golf a giorni alterni');\n const [golfLevel, setGolfLevel] = useState<string>('Giocatore Amatoriale (HCP 15-28)');\n const [interests, setInterests] = useState<string[]>([\n 'Degustazioni Vini (Prosecco DOCG / Amarone)',\n 'Arte & Città Storiche (Venezia, Verona, Vicenza)',\n 'Terme & Benessere (Colli Euganei)'\n ]);\n const [stayType, setStayType] = useState<string>('Golf Resort & Hotel 5★');\n const [transport, setTransport] = useState<string>('Volo + Noleggio Auto');\n const [notes, setNotes] = useState<string>('');\n\n const toggleInterest = (item: string) => {\n setInterests(prev =>\n prev.includes(item) ? prev.filter(i => i !== item) : [...prev, item]\n );\n };\n\n const submitMessage = (formattedText: string) => {\n console.log(\"Submitting prompt to chat:\", formattedText);\n \n // Method 1: direct append if available\n if (typeof chatCtx?.append === 'function') {\n chatCtx.append({ role: 'user', content: formattedText });\n return;\n }\n \n // Method 2: sendMessage if available\n if (typeof chatCtx?.sendMessage === 'function') {\n chatCtx.sendMessage({ text: formattedText });\n return;\n }\n\n // Method 3: setInput + handleSubmit\n if (typeof chatCtx?.setInput === 'function') {\n chatCtx.setInput(formattedText);\n setTimeout(() => {\n if (typeof chatCtx?.handleSubmit === 'function') {\n chatCtx.handleSubmit();\n }\n }, 50);\n return;\n }\n };\n\n const handleWizardSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n const formattedPrompt = `Desidero organizzare una vacanza su misura in Veneto con i seguenti dettagli:\n\n- **Periodo desiderato:** ${period}\n- **Durata del soggiorno:** ${duration}\n- **Tipologia di viaggiatori:** ${travelers}\n- **Frequenza di gioco:** ${golfFrequency}\n- **Livello / Handicap:** ${golfLevel}\n- **Interests principali (oltre al golf):** ${interests.length > 0 ? interests.join(', ') : 'Nessuno in particolare'}\n- **Tipologia di alloggio preferita:** ${stayType}\n- **Modalità di trasporto e logistica:** ${transport}\n${notes.trim() ? `- **Note e desideri particolari:** ${notes}` : ''}\n\nPer favore, progetta per noi un itinerario dettagliatissimo e motivazionale in Veneto, selezionando i migliori Golf Club affiliati al consorzio e le migliori esperienze correlate.`;\n\n submitMessage(formattedPrompt);\n };\n\n const quickPrompts = [\n \"7 giorni tra Golf, Colline del Prosecco e Venezia\",\n \"Weekend lungo Golf & Relax Termale a Galzignano\",\n \"Golf & Amarone in Valpolicella per 4 amici\",\n \"Tour di 10 giorni: Dolomiti, Lago di Garda e Golf\"\n ];\n\n return (\n <section className=\"relative flex min-h-[calc(100vh-80px)] w-full flex-col items-center justify-center py-12 px-4 bg-[#faf8f3] text-[#213f31] overflow-hidden\">\n {/* Background Decorative Pattern */}\n <div className=\"absolute -top-32 -right-32 w-[500px] h-[500px] rounded-full bg-[#213f31]/5 pointer-events-none blur-3xl\" />\n <div className=\"absolute -bottom-32 -left-32 w-[500px] h-[500px] rounded-full bg-[#478264]/5 pointer-events-none blur-3xl\" />\n\n <div className=\"relative z-10 w-full max-w-4xl mx-auto flex flex-col items-center gap-6 text-center\">\n {/* Subtitle Badge */}\n <div className=\"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-[#213f31]/10 border border-[#213f31]/20\">\n <span className=\"w-2 h-2 rounded-full bg-[#34674e] animate-pulse\" />\n <span className=\"text-[#213f31] font-sans text-xs font-semibold uppercase tracking-[0.25em]\">\n Concierge Ufficiale Golf in Veneto\n </span>\n </div>\n\n {/* Main Title */}\n {title && (\n <h1\n className=\"text-4xl @md:text-5xl @lg:text-6xl font-normal leading-[1.15] font-heading italic text-[#213f31] drop-shadow-sm max-w-3xl\"\n dangerouslySetInnerHTML={{ __html: title }}\n />\n )}\n\n <p className=\"font-sans text-[#213f31]/80 text-base @md:text-lg max-w-2xl font-light leading-relaxed\">\n Compila il form per ricevere un programma di viaggio dettagliatissimo ideato dai nostri esperti per i 15 campi da golf affiliati in Veneto.\n </p>\n\n {/* Mode Selector Tabs */}\n <div className=\"flex items-center gap-2 bg-[#213f31]/10 p-1.5 rounded-full border border-[#213f31]/15 mb-2\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('wizard')}\n className={`flex items-center gap-2 px-5 py-2 rounded-full text-xs font-bold uppercase tracking-wider transition-all cursor-pointer ${\n activeTab === 'wizard'\n ? 'bg-[#213f31] text-[#faf8f3] shadow-md'\n : 'text-[#213f31]/70 hover:text-[#213f31]'\n }`}\n >\n <Sparkles className=\"w-4 h-4 text-[#e8d9c0]\" />\n <span>Planner Su Misura (Consigliato)</span>\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('chat')}\n className={`flex items-center gap-2 px-5 py-2 rounded-full text-xs font-bold uppercase tracking-wider transition-all cursor-pointer ${\n activeTab === 'chat'\n ? 'bg-[#213f31] text-[#faf8f3] shadow-md'\n : 'text-[#213f31]/70 hover:text-[#213f31]'\n }`}\n >\n <MessageSquareText className=\"w-4 h-4\" />\n <span>Messaggio Libero</span>\n </button>\n </div>\n\n {/* TAB 1: ADVANCED WIZARD FORM */}\n {activeTab === 'wizard' && (\n <form\n onSubmit={handleWizardSubmit}\n className=\"w-full bg-white rounded-3xl p-6 @md:p-8 shadow-2xl border border-[#e8d9c0] text-left space-y-6 text-[#213f31]\"\n >\n {/* SECTION 1: PERIODO & DURATA */}\n <div className=\"space-y-3 pb-5 border-b border-[#e8d9c0]/50\">\n <div className=\"flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-[#34674e]\">\n <Calendar className=\"w-4 h-4 text-[#34674e]\" />\n <span>1. Periodo & Durata</span>\n </div>\n <div className=\"grid grid-cols-1 @md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Mese / Stagione Ideale\n </label>\n <select\n value={period}\n onChange={(e) => setPeriod(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-4 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Primavera (Aprile - Maggio)\">Primavera (Aprile - Maggio)</option>\n <option value=\"Inizio Estate (Giugno - Luglio)\">Inizio Estate (Giugno - Luglio)</option>\n <option value=\"Tarda Estate / Autunno (Settembre - Ottobre)\">Tarda Estate / Autunno (Settembre - Ottobre)</option>\n <option value=\"Inverno (Golf & Spa/Montagna)\">Inverno (Golf & Spa/Montagna)</option>\n <option value=\"Date Flessibili / Tutto l'anno\">Date Flessibili / Tutto l'anno</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Durata del Viaggio\n </label>\n <select\n value={duration}\n onChange={(e) => setDuration(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-4 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"3-4 Giorni (Weekend Lungo)\">3-4 Giorni (Weekend Lungo)</option>\n <option value=\"5 Giorni (Feriali o Breve Vacanza)\">5 Giorni (Feriali o Breve Vacanza)</option>\n <option value=\"7 Giorni (1 Settimana Classica)\">7 Giorni (1 Settimana Classica)</option>\n <option value=\"10-14 Giorni (Grand Tour Veneto)\">10-14 Giorni (Grand Tour Veneto)</option>\n </select>\n </div>\n </div>\n </div>\n\n {/* SECTION 2: VIAGGIATORI & ESPERIENZA GOLF */}\n <div className=\"space-y-3 pb-5 border-b border-[#e8d9c0]/50\">\n <div className=\"flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-[#34674e]\">\n <Users className=\"w-4 h-4 text-[#34674e]\" />\n <span>2. Chi Viaggia & Frequenza Golf</span>\n </div>\n <div className=\"grid grid-cols-1 @md:grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Composizione Gruppo\n </label>\n <select\n value={travelers}\n onChange={(e) => setTravelers(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-3.5 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Coppia (Golf & Relax)\">Coppia (Golf & Relax)</option>\n <option value=\"Gruppo di Amici Golfisti\">Gruppo di Amici Golfisti</option>\n <option value=\"Famiglia con bambini/ragazzi\">Famiglia con bambini/ragazzi</option>\n <option value=\"Viaggiatore Singolo (Solo Traveler)\">Viaggiatore Singolo (Solo Traveler)</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Ritmo di Gioco Desiderato\n </label>\n <select\n value={golfFrequency}\n onChange={(e) => setGolfFrequency(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-3.5 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Golf Intenso (Tutti i giorni 18 buche)\">Golf Intenso (Tutti i giorni 18 buche)</option>\n <option value=\"Golf a giorni alterni (Equilibrato)\">Golf a giorni alterni (Equilibrato)</option>\n <option value=\"Golf Rilassante (2-3 uscite in totale)\">Golf Rilassante (2-3 uscite in totale)</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Livello / Handicap\n </label>\n <select\n value={golfLevel}\n onChange={(e) => setGolfLevel(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-3.5 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Giocatore Amatoriale (HCP 15-28)\">Giocatore Amatoriale (HCP 15-28)</option>\n <option value=\"Giocatore Esperto / Single Digit (HCP < 12)\">Giocatore Esperto / Single Digit (HCP < 12)</option>\n <option value=\"Principiante / Pratica & Accademia\">Principiante / Pratica & Accademia</option>\n <option value=\"Misto (Golfisti + Non-Golfisti)\">Misto (Golfisti + Non-Golfisti)</option>\n </select>\n </div>\n </div>\n </div>\n\n {/* SECTION 3: INTERESSI EXTRA GOLF */}\n <div className=\"space-y-3 pb-5 border-b border-[#e8d9c0]/50\">\n <div className=\"flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-[#34674e]\">\n <Compass className=\"w-4 h-4 text-[#34674e]\" />\n <span>3. Interessi ed Esperienze Extra Golf</span>\n </div>\n <div className=\"grid grid-cols-1 @md:grid-cols-2 gap-2.5\">\n {[\n 'Degustazioni Vini (Prosecco DOCG / Amarone)',\n 'Arte & Città Storiche (Venezia, Verona, Vicenza)',\n 'Terme & Benessere (Colli Euganei)',\n 'Cucina Gourmet & Trattorie Tipiche',\n 'Dolomiti & Escursioni in Natura',\n 'Lago di Garda & Parchi per la Famiglia'\n ].map((item, i) => (\n <div\n key={i}\n onClick={() => toggleInterest(item)}\n className={`flex items-center gap-3 p-3 rounded-xl border cursor-pointer transition-all ${\n interests.includes(item)\n ? 'bg-[#213f31]/10 border-[#213f31] text-[#213f31] font-semibold'\n : 'bg-[#faf8f3] border-[#e8d9c0] text-[#213f31]/70 hover:border-[#213f31]/40'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={interests.includes(item)}\n onChange={() => {}}\n className=\"w-4 h-4 accent-[#213f31]\"\n />\n <span className=\"text-xs\">{item}</span>\n </div>\n ))}\n </div>\n </div>\n\n {/* SECTION 4: ALLOGGIO & LOGISTICA */}\n <div className=\"space-y-3 pb-4\">\n <div className=\"flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-[#34674e]\">\n <Car className=\"w-4 h-4 text-[#34674e]\" />\n <span>4. Ospitalità & Logistica</span>\n </div>\n <div className=\"grid grid-cols-1 @md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Stile di Alloggio\n </label>\n <select\n value={stayType}\n onChange={(e) => setStayType(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-4 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Golf Resort & Hotel 5★\">Golf Resort & Hotel 5★</option>\n <option value=\"Boutique Hotel in Ville Storiche Venete\">Boutique Hotel in Ville Storiche Venete</option>\n <option value=\"Hotel Termale & Spa Resort\">Hotel Termale & Spa Resort</option>\n <option value=\"Agriturismo di Charme tra i Vigneti\">Agriturismo di Charme tra i Vigneti</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Trasporto & Trasferimenti\n </label>\n <select\n value={transport}\n onChange={(e) => setTransport(e.target.value)}\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl px-4 py-2.5 text-sm font-medium text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n >\n <option value=\"Auto propria (Guido la mia vettura)\">Auto propria (Guido la mia vettura)</option>\n <option value=\"Volo + Noleggio Auto all'arrivo\">Volo + Noleggio Auto all'arrivo</option>\n <option value=\"Volo + Transfer Privato NCC con Chauffeur\">Volo + Transfer Privato NCC con Chauffeur</option>\n <option value=\"Treno Alta Velocità + Noleggio / Taxi\">Treno Alta Velocità + Noleggio / Taxi</option>\n </select>\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-[#213f31]/70 mb-1.5\">\n Desideri Speciali o Requisiti Particolari (Facoltativo)\n </label>\n <textarea\n rows={2}\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n placeholder=\"Es. Vorremmo prenotare il noleggio sacche da golf in loco, oppure festeggiare un anniversario...\"\n className=\"w-full bg-[#faf8f3] border border-[#e8d9c0] rounded-xl p-3 text-xs text-[#213f31] focus:outline-none focus:ring-2 focus:ring-[#34674e]\"\n />\n </div>\n </div>\n\n {/* SUBMIT BUTTON */}\n <div className=\"pt-2\">\n <button\n type=\"submit\"\n className=\"w-full py-4 px-6 rounded-2xl bg-[#213f31] hover:bg-[#34674e] text-[#faf8f3] font-bold text-sm uppercase tracking-widest shadow-xl flex items-center justify-center gap-3 transition-all cursor-pointer hover:scale-[1.01]\"\n >\n <Flag className=\"w-5 h-5 text-[#e8d9c0]\" />\n <span>Progetta il mio Itinerario in Veneto</span>\n <Send className=\"w-4 h-4 ml-auto text-[#e8d9c0]\" />\n </button>\n </div>\n </form>\n )}\n\n {/* TAB 2: FREE MESSAGE PROMPT */}\n {activeTab === 'chat' && (\n <div className=\"w-full max-w-2xl bg-white rounded-3xl p-6 shadow-2xl border border-[#e8d9c0] space-y-4\">\n <PromptIntro />\n <div className=\"flex flex-wrap items-center justify-center gap-2 pt-2\">\n {quickPrompts.map((prompt, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => submitMessage(prompt)}\n className=\"px-4 py-2 rounded-full bg-[#213f31]/5 hover:bg-[#213f31] text-[#213f31] hover:text-[#faf8f3] text-xs font-medium border border-[#213f31]/15 transition-all duration-200 cursor-pointer shadow-sm\"\n >\n {prompt}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n","'use client';\n\nimport { ChatContext, ComponentsContext } from '@websolutespa/ask-plugin';\nimport { useContext } from 'react';\n\nexport function Main() {\n const { Intro, Thread } = useContext(ComponentsContext);\n const { shouldShowIntro } = useContext(ChatContext);\n return (\n <div className=\"w-full min-h-svh flex flex-col gap-8 bg-background text-foreground\">\n {shouldShowIntro ? <Intro /> : <Thread />}\n </div>\n );\n}\n","'use client';\n\nimport { Spec } from '@json-render/core';\nimport { ComponentsContext, ComponentsProvider } from '@websolutespa/ask-plugin';\nimport { cn } from '@websolutespa/ask-ui';\nimport { Toaster } from '@websolutespa/ask-ui/components/sonner';\nimport { useContext } from 'react';\nimport { COMPONENTS } from '../components';\n\nexport function Preview({ spec }: { spec?: Spec | null }) {\n return (\n <ComponentsProvider components={COMPONENTS}>\n <PreviewRenderer spec={spec} />\n <Toaster />\n </ComponentsProvider>\n );\n}\n\nexport function PreviewRenderer({\n spec,\n className,\n}: {\n spec?: Spec | null;\n className?: string;\n}) {\n const { Renderer } = useContext(ComponentsContext);\n return (\n <div className={cn('w-full flex flex-col gap-10 py-5 @md:gap-20 @md:py-10', className)}>\n {spec ? <Renderer spec={spec} /> : <div>Spec not provided</div>}\n </div>\n );\n}\n","'use client';\n\nimport { Spec } from '@json-render/core';\nimport {\n ActionProvider,\n Renderer as JsonRenderer,\n StateProvider,\n VisibilityProvider,\n} from '@json-render/react';\nimport { ComponentsContext } from '@websolutespa/ask-plugin';\nimport { useContext } from 'react';\nimport { toast } from 'sonner';\n// IMPORTANT: import YOUR OWN registry so your custom blocks are rendered.\nimport { registry } from '../registry';\n\nexport function Renderer({\n spec,\n isStreaming = false,\n mounted = false,\n}: {\n spec?: Spec | null;\n isStreaming?: boolean;\n mounted?: boolean;\n}) {\n const { Fallback } = useContext(ComponentsContext);\n if (!spec) {\n return;\n }\n return (\n <StateProvider initialState={spec.state ?? {}}>\n <VisibilityProvider>\n <ActionProvider\n handlers={{\n linkClick: async (params) => {\n const href = (params?.href as string) || '#';\n if (mounted) {\n const { url } = params as { url?: string };\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n } else {\n toast.info(`Navigating to: ${href}`);\n }\n },\n }}\n >\n <JsonRenderer\n spec={spec}\n registry={registry}\n fallback={Fallback}\n loading={isStreaming}\n />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n","import { App } from './components/app';\nimport { Chat } from './components/chat';\nimport { Intro } from './components/intro';\nimport { Main } from './components/main';\nimport { Preview } from './components/preview';\nimport { Renderer } from './components/renderer';\n\n// Components injected into the shared chat engine via ComponentsProvider.\n// Only list what you override; everything else falls back to @websolutespa/ask-plugin.\nexport const COMPONENTS = {\n App,\n Chat,\n Intro,\n Main,\n Preview,\n Renderer,\n};\n\nexport type Components = typeof COMPONENTS;\n\nexport * from './components/app';\nexport * from './components/chat';\nexport * from './components/main';\nexport * from './components/preview';\nexport * from './components/renderer';\n","'use client';\n\nimport {\n ChatProvider,\n ChatProviderProps,\n ComponentsProvider,\n ViewProvider,\n} from '@websolutespa/ask-plugin';\nimport { Toaster } from '@websolutespa/ask-ui/components/sonner';\nimport { COMPONENTS } from '../components';\nimport { Main } from './main';\n\nexport function Chat({ appKey, apiKey, ...props }: Partial<ChatProviderProps>) {\n if (!appKey) {\n return <div>appKey not defined</div>;\n }\n if (!apiKey) {\n return <div>apiKey not defined</div>;\n }\n return (\n <ComponentsProvider components={COMPONENTS}>\n <ChatProvider appKey={appKey} apiKey={apiKey} {...props}>\n <ViewProvider>\n <Main />\n <Toaster />\n </ViewProvider>\n </ChatProvider>\n </ComponentsProvider>\n );\n}\n","'use client';\n\nimport type { PageData, PluginOptions } from '@websolutespa/ask-plugin';\nimport { TooltipProvider } from '@websolutespa/ask-ui/components/tooltip';\nimport { useMemo } from 'react';\nimport { Chat } from './chat';\nimport { Preview } from './preview';\n\nexport type AppProps = PluginOptions;\n\nexport const App = (props: AppProps) => {\n const _data = useMemo<PageData>(() => {\n if (typeof window !== 'undefined') {\n const htmlLang = getHtmlLang();\n const title = document.querySelector('title');\n const description = document.querySelector('meta[name=\"description\"]');\n const canonical = document.querySelector('link[rel=\"canonical\"]');\n return {\n locale: htmlLang?.locale || 'it',\n market: htmlLang?.market || 'ww',\n origin: window.origin,\n canonical: canonical?.getAttribute('href') || window.location.href,\n title: title ? title.innerText : 'Untitled',\n description: description?.getAttribute('content') || '',\n slug: window.location.pathname,\n };\n }\n return {\n locale: 'it',\n market: 'ww',\n origin: '',\n canonical: '',\n title: 'Untitled',\n description: '',\n slug: '',\n };\n }, []);\n\n return (\n <div className=\"@container w-full\">\n <TooltipProvider>\n {props.preview ? (\n <Preview spec={props.initialSpec} />\n ) : (\n <Chat {...props} />\n )}\n </TooltipProvider>\n </div>\n );\n};\n\nfunction getHtmlLang(): { locale: string; market: string } | undefined {\n const html = document.querySelector('html');\n const htmlLang = html?.getAttribute('lang');\n if (htmlLang) {\n const segments = htmlLang.toLowerCase().split('-');\n return { locale: segments[0], market: segments[1] || 'ww' };\n }\n return undefined;\n}\n"],"mappings":"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"}
|
package/dist/browser.js
CHANGED
|
@@ -69183,8 +69183,8 @@ function Chat$1({ appKey, apiKey, ...props }) {
|
|
|
69183
69183
|
//#region src/components/intro.tsx
|
|
69184
69184
|
function Intro() {
|
|
69185
69185
|
const { PromptIntro } = (0, import_react.useContext)(ComponentsContext);
|
|
69186
|
-
const
|
|
69187
|
-
const title = contents
|
|
69186
|
+
const chatCtx = (0, import_react.useContext)(ChatContext);
|
|
69187
|
+
const title = chatCtx?.contents?.intro?.title || "Progetta la tua <em>vacanza golf</em> in Veneto";
|
|
69188
69188
|
const [activeTab, setActiveTab] = (0, import_react.useState)("wizard");
|
|
69189
69189
|
const [period, setPeriod] = (0, import_react.useState)("Maggio - Giugno");
|
|
69190
69190
|
const [duration, setDuration] = (0, import_react.useState)("7 Giorni (1 Settimana)");
|
|
@@ -69202,25 +69202,42 @@ function Intro() {
|
|
|
69202
69202
|
const toggleInterest = (item) => {
|
|
69203
69203
|
setInterests((prev) => prev.includes(item) ? prev.filter((i) => i !== item) : [...prev, item]);
|
|
69204
69204
|
};
|
|
69205
|
+
const submitMessage = (formattedText) => {
|
|
69206
|
+
console.log("Submitting prompt to chat:", formattedText);
|
|
69207
|
+
if (typeof chatCtx?.append === "function") {
|
|
69208
|
+
chatCtx.append({
|
|
69209
|
+
role: "user",
|
|
69210
|
+
content: formattedText
|
|
69211
|
+
});
|
|
69212
|
+
return;
|
|
69213
|
+
}
|
|
69214
|
+
if (typeof chatCtx?.sendMessage === "function") {
|
|
69215
|
+
chatCtx.sendMessage({ text: formattedText });
|
|
69216
|
+
return;
|
|
69217
|
+
}
|
|
69218
|
+
if (typeof chatCtx?.setInput === "function") {
|
|
69219
|
+
chatCtx.setInput(formattedText);
|
|
69220
|
+
setTimeout(() => {
|
|
69221
|
+
if (typeof chatCtx?.handleSubmit === "function") chatCtx.handleSubmit();
|
|
69222
|
+
}, 50);
|
|
69223
|
+
return;
|
|
69224
|
+
}
|
|
69225
|
+
};
|
|
69205
69226
|
const handleWizardSubmit = (e) => {
|
|
69206
69227
|
e.preventDefault();
|
|
69207
|
-
|
|
69228
|
+
submitMessage(`Desidero organizzare una vacanza su misura in Veneto con i seguenti dettagli:
|
|
69208
69229
|
|
|
69209
69230
|
- **Periodo desiderato:** ${period}
|
|
69210
69231
|
- **Durata del soggiorno:** ${duration}
|
|
69211
69232
|
- **Tipologia di viaggiatori:** ${travelers}
|
|
69212
69233
|
- **Frequenza di gioco:** ${golfFrequency}
|
|
69213
69234
|
- **Livello / Handicap:** ${golfLevel}
|
|
69214
|
-
- **
|
|
69235
|
+
- **Interests principali (oltre al golf):** ${interests.length > 0 ? interests.join(", ") : "Nessuno in particolare"}
|
|
69215
69236
|
- **Tipologia di alloggio preferita:** ${stayType}
|
|
69216
69237
|
- **Modalità di trasporto e logistica:** ${transport}
|
|
69217
69238
|
${notes.trim() ? `- **Note e desideri particolari:** ${notes}` : ""}
|
|
69218
69239
|
|
|
69219
|
-
Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in Veneto, selezionando i migliori Golf Club affiliati al consorzio e le migliori esperienze correlate
|
|
69220
|
-
append?.({
|
|
69221
|
-
role: "user",
|
|
69222
|
-
content: formattedPrompt
|
|
69223
|
-
});
|
|
69240
|
+
Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in Veneto, selezionando i migliori Golf Club affiliati al consorzio e le migliori esperienze correlate.`);
|
|
69224
69241
|
};
|
|
69225
69242
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
69226
69243
|
className: "relative flex min-h-[calc(100vh-80px)] w-full flex-col items-center justify-center py-12 px-4 bg-[#faf8f3] text-[#213f31] overflow-hidden",
|
|
@@ -69426,7 +69443,7 @@ Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in V
|
|
|
69426
69443
|
"Cucina Gourmet & Trattorie Tipiche",
|
|
69427
69444
|
"Dolomiti & Escursioni in Natura",
|
|
69428
69445
|
"Lago di Garda & Parchi per la Famiglia"
|
|
69429
|
-
].map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("
|
|
69446
|
+
].map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
69430
69447
|
onClick: () => toggleInterest(item),
|
|
69431
69448
|
className: `flex items-center gap-3 p-3 rounded-xl border cursor-pointer transition-all ${interests.includes(item) ? "bg-[#213f31]/10 border-[#213f31] text-[#213f31] font-semibold" : "bg-[#faf8f3] border-[#e8d9c0] text-[#213f31]/70 hover:border-[#213f31]/40"}`,
|
|
69432
69449
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
|
|
@@ -69539,10 +69556,7 @@ Per favore, progetta per noi un itinerario dettagliatissimo e motivazionale in V
|
|
|
69539
69556
|
"Tour di 10 giorni: Dolomiti, Lago di Garda e Golf"
|
|
69540
69557
|
].map((prompt, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
69541
69558
|
type: "button",
|
|
69542
|
-
onClick: () =>
|
|
69543
|
-
role: "user",
|
|
69544
|
-
content: prompt
|
|
69545
|
-
}),
|
|
69559
|
+
onClick: () => submitMessage(prompt),
|
|
69546
69560
|
className: "px-4 py-2 rounded-full bg-[#213f31]/5 hover:bg-[#213f31] text-[#213f31] hover:text-[#faf8f3] text-xs font-medium border border-[#213f31]/15 transition-all duration-200 cursor-pointer shadow-sm",
|
|
69547
69561
|
children: prompt
|
|
69548
69562
|
}, i))
|