Compare commits
12 Commits
feat/issue
...
docs/legal
| Author | SHA1 | Date | |
|---|---|---|---|
| 5854401de3 | |||
| c793688762 | |||
| d12826b314 | |||
| 85e470f58a | |||
| b7e051ec34 | |||
| ffdb6979ff | |||
| c6d13418f7 | |||
| ee610a8853 | |||
| 01e3815820 | |||
| 0714ec1335 | |||
| ddab32d3ef | |||
| f33d29fe7b |
@ -7,10 +7,7 @@ CONTACT_FORM_MODE=dev
|
||||
CONTACT_FORM_RESEND_API_KEY=
|
||||
CONTACT_FORM_FROM_EMAIL=no-reply@nexstudio.com
|
||||
CONTACT_FORM_TO_EMAIL=info@nexstudio.com
|
||||
CONTACT_FORM_TO_EMAIL_SUPPORT=support@nexstudio.com
|
||||
CONTACT_FORM_TO_EMAIL_INFO=info@nexstudio.com
|
||||
CONTACT_FORM_TO_EMAIL_PRIVACY=
|
||||
CONTACT_FORM_TO_EMAIL_SECURITY=
|
||||
CONTACT_FORM_TO_EMAIL_ETHICS=
|
||||
CONTACT_FORM_TO_EMAIL_LEGAL=
|
||||
CONTACT_FORM_TO_EMAIL_HR=
|
||||
CONTACT_FORM_TO_EMAIL_CAREERS=
|
||||
CONTACT_TURNSTILE_SECRET_KEY=
|
||||
|
||||
183
README.md
183
README.md
@ -1,104 +1,123 @@
|
||||
# Astro Starter Kit: Minimal
|
||||
# NexStudio Website Runbook
|
||||
|
||||
```sh
|
||||
npm create astro@latest -- --template minimal
|
||||
```
|
||||
Sito istituzionale NexStudio basato su Astro, con deploy su Cloudflare e form contatti protetto da Turnstile.
|
||||
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
## Obiettivo del repository
|
||||
|
||||
## 🚀 Project Structure
|
||||
- Presentazione aziendale e servizi (homepage e pagine legali).
|
||||
- Entry point unico per richieste commerciali e supporto.
|
||||
- Base pronta per contenuti multilingua IT/EN/TH.
|
||||
- Pipeline di deploy stabile su Cloudflare.
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
## Stack tecnico
|
||||
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
├── src/
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
- Astro + Tailwind CSS
|
||||
- Adapter Cloudflare (`@astrojs/cloudflare`)
|
||||
- Sitemap (`@astrojs/sitemap`)
|
||||
- Form backend su endpoint `/api/contact`
|
||||
- Turnstile + Resend per anti-spam e invio email
|
||||
|
||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||
## Struttura essenziale
|
||||
|
||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
||||
- `src/pages/`: pagine pubbliche e route API (`src/pages/api/contact.ts`)
|
||||
- `src/components/`: componenti UI condivisi
|
||||
- `src/data/`: contenuti testuali e configurazioni pagine
|
||||
- `public/`: asset statici (loghi, immagini, robots)
|
||||
- `.env.example`: variabili locali di riferimento
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
## Prerequisiti
|
||||
|
||||
## 🧞 Commands
|
||||
- Node.js 20+
|
||||
- npm 10+
|
||||
- Account Cloudflare (Pages/Workers + Turnstile)
|
||||
- Account Resend (API key + sender verificato)
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
## Avvio locale
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
1. Installazione dipendenze:
|
||||
- `npm install`
|
||||
2. Copia variabili di ambiente:
|
||||
- copia `.env.example` in `.env`
|
||||
3. Avvio sviluppo:
|
||||
- `npm run dev`
|
||||
4. Se Vite resta in cache incoerente:
|
||||
- `npm run dev:fresh`
|
||||
|
||||
## 👀 Want to learn more?
|
||||
## Comandi utili
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
||||
- `npm run dev`: sviluppo locale
|
||||
- `npm run dev:fresh`: reset cache `.vite` e `.astro` + avvio dev server
|
||||
- `npm run build`: build produzione
|
||||
- `npm run preview`: preview locale della build
|
||||
- `npm run deploy:cf`: build + deploy con wrangler su output Astro
|
||||
|
||||
## Cloudflare deploy notes
|
||||
## Configurazione contatti
|
||||
|
||||
If you deploy with Wrangler in CI/Cloudflare, build first and deploy using Astro's generated Worker config:
|
||||
Variabili pubbliche (frontend):
|
||||
|
||||
- `PUBLIC_CONTACT_FORM_ACTION_URL` (default consigliato: `/api/contact`)
|
||||
- `PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT` (URL assoluto della pagina post-submit)
|
||||
- `PUBLIC_CONTACT_FORM_MAILTO` (fallback se action URL non disponibile)
|
||||
- `PUBLIC_CONTACT_TURNSTILE_SITE_KEY`
|
||||
|
||||
Variabili server (Cloudflare/local):
|
||||
|
||||
- `CONTACT_FORM_MODE` (`dev` oppure `live`)
|
||||
- `CONTACT_FORM_RESEND_API_KEY`
|
||||
- `CONTACT_FORM_FROM_EMAIL` (consigliato: `no-reply@nexstudio.ai`)
|
||||
- `CONTACT_FORM_TO_EMAIL` (default destinatario, es. `info@nexstudio.ai`)
|
||||
- `CONTACT_FORM_TO_EMAIL_INFO` (opzionale, override esplicito per area "info")
|
||||
- `CONTACT_FORM_TO_EMAIL_PRIVACY`
|
||||
- `CONTACT_FORM_TO_EMAIL_CAREERS`
|
||||
- `CONTACT_TURNSTILE_SECRET_KEY`
|
||||
|
||||
Comportamento:
|
||||
|
||||
- `dev`: accetta submit e scrive payload nei log (senza invio reale)
|
||||
- `live`: valida Turnstile e invia email via Resend
|
||||
|
||||
Routing pubblico consigliato (portale vetrina):
|
||||
|
||||
- `info`: informazioni generali/commerciali
|
||||
- `privacy`: richieste privacy e diritti interessato
|
||||
- `careers`: candidature e collaborazioni
|
||||
|
||||
Indirizzi consigliati portale:
|
||||
|
||||
- `info@nexstudio.ai`
|
||||
- `privacy@nexstudio.ai`
|
||||
- `careers@nexstudio.ai`
|
||||
- `no-reply@nexstudio.ai` (solo invio comunicazioni/newsletter, non destinazione inbound)
|
||||
|
||||
## Deploy Cloudflare
|
||||
|
||||
Impostazioni consigliate:
|
||||
|
||||
- Build command: `npm run build`
|
||||
- Deploy command: `npm run deploy:cf`
|
||||
|
||||
This avoids entrypoint errors like `@astrojs/cloudflare/entrypoints/server` not found.
|
||||
Questa configurazione evita errori tipo:
|
||||
`The entry-point file at "@astrojs/cloudflare/entrypoints/server" was not found.`
|
||||
|
||||
## Contact form configuration
|
||||
## Dominio e sicurezza
|
||||
|
||||
Set these variables for the website contact form.
|
||||
|
||||
Public (frontend):
|
||||
|
||||
- `PUBLIC_CONTACT_FORM_ACTION_URL` (default `/api/contact`)
|
||||
- `PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT` (absolute URL for `_next`)
|
||||
- `PUBLIC_CONTACT_FORM_MAILTO` (fallback only if `ACTION_URL` is empty)
|
||||
- `PUBLIC_CONTACT_TURNSTILE_SITE_KEY`
|
||||
|
||||
Server-side (Cloudflare runtime / local `.env`):
|
||||
|
||||
- `CONTACT_FORM_MODE` (`dev` or `live`)
|
||||
- `CONTACT_FORM_RESEND_API_KEY`
|
||||
- `CONTACT_FORM_FROM_EMAIL` (verified sender in Resend, recommended `no-reply@nexstudio.com`)
|
||||
- `CONTACT_FORM_TO_EMAIL` (default recipient inbox or alias, recommended `info@nexstudio.com`)
|
||||
- `CONTACT_FORM_TO_EMAIL_SUPPORT`
|
||||
- `CONTACT_FORM_TO_EMAIL_PRIVACY`
|
||||
- `CONTACT_FORM_TO_EMAIL_SECURITY`
|
||||
- `CONTACT_FORM_TO_EMAIL_ETHICS`
|
||||
- `CONTACT_FORM_TO_EMAIL_LEGAL`
|
||||
- `CONTACT_FORM_TO_EMAIL_HR`
|
||||
- `CONTACT_TURNSTILE_SECRET_KEY`
|
||||
|
||||
Mode behavior:
|
||||
|
||||
- `dev`: accepts form and logs payload server-side (no real email send)
|
||||
- `live`: verifies Turnstile (if secret configured) and sends via Resend API
|
||||
|
||||
Department routing:
|
||||
|
||||
- the contact form includes a department selector
|
||||
- if a department-specific env is set, the email is routed to that recipient
|
||||
- otherwise it falls back to `CONTACT_FORM_TO_EMAIL`
|
||||
|
||||
Suggested operational use:
|
||||
|
||||
- `info@...` for prospects and generic clarifications (non-clients)
|
||||
- `support@...` for existing customers
|
||||
- `no-reply@...` as sender for newsletters and automated communications
|
||||
|
||||
Copy `.env.example` to `.env` for local development and configure the same keys in Cloudflare Pages/Workers for production.
|
||||
|
||||
## Production domain
|
||||
|
||||
- Official domain: `https://nexstudio.ai`
|
||||
- Keep Turnstile widget hostnames aligned with:
|
||||
- Dominio ufficiale: `https://nexstudio.ai`
|
||||
- Hostname Turnstile da mantenere allineati:
|
||||
- `nexstudio.ai`
|
||||
- `www.nexstudio.ai` (if used)
|
||||
- `localhost` (for local testing)
|
||||
- `www.nexstudio.ai` (se usato)
|
||||
- `localhost` (test locale)
|
||||
- Accesso pre-go-live gestito con Cloudflare Zero Trust Access
|
||||
|
||||
## Stato operativo attuale
|
||||
|
||||
- Issue #1 (contact form live): implementata
|
||||
- Issue #2 (anti-spam Turnstile): implementata
|
||||
- Issue #3 (SEO base): implementata (sitemap, robots, canonical/OG/Twitter)
|
||||
- Issue #4: in avanzamento (contenuti non placeholder)
|
||||
- Issue #5: da completare (localizzazione reale IT/EN/TH)
|
||||
|
||||
## Note operative
|
||||
|
||||
- Per modifiche non minori usare branch dedicato (`feat/*`, `fix/*`) e merge su `main` dopo verifica.
|
||||
- Evitare commit su `main` per attivita complesse.
|
||||
- Rigenerare eventuali API key esposte e aggiornare subito i secret su Cloudflare.
|
||||
|
||||
@ -1,5 +1,10 @@
|
||||
---
|
||||
import { cta } from '../data/home';
|
||||
import { getCta } from '../data/home';
|
||||
|
||||
const path = Astro.url.pathname;
|
||||
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
|
||||
const cta = getCta(currentLocale);
|
||||
|
||||
const cf = cta.contactForm;
|
||||
const model = {
|
||||
@ -14,6 +19,15 @@ const model = {
|
||||
fieldDepartment: cf.fieldDepartment,
|
||||
fieldEmail: cf.fieldEmail,
|
||||
fieldMessage: cf.fieldMessage,
|
||||
turnstileError: cf.errors.turnstile,
|
||||
configError: cf.errors.config,
|
||||
mailtoFallbackSubject: cf.mailtoFallbackSubject,
|
||||
mailtoLabelName: cf.mailtoLabels.name,
|
||||
mailtoLabelCompany: cf.mailtoLabels.company,
|
||||
mailtoLabelEmail: cf.mailtoLabels.email,
|
||||
mailtoLabelCountry: cf.mailtoLabels.country,
|
||||
mailtoLabelDepartment: cf.mailtoLabels.department,
|
||||
mailtoDefaultDepartment: cf.mailtoLabels.defaultDepartment,
|
||||
};
|
||||
const hasFormspree =
|
||||
typeof cf.actionUrl === 'string' && cf.actionUrl.length > 0;
|
||||
@ -203,11 +217,11 @@ const fieldClass =
|
||||
class="cf-turnstile"
|
||||
data-sitekey={cf.turnstileSiteKey}
|
||||
data-theme="dark"
|
||||
data-language="it"
|
||||
data-language={cf.turnstileLanguage}
|
||||
data-size="normal"
|
||||
></div>
|
||||
<p class="mt-1.5 text-xs leading-relaxed text-nx-muted">
|
||||
Verifica anti-spam: completa il controllo prima di inviare il messaggio.
|
||||
{cf.turnstileHint}
|
||||
</p>
|
||||
</div>
|
||||
) : null
|
||||
|
||||
@ -1,5 +1,10 @@
|
||||
---
|
||||
import { footer } from '../data/home';
|
||||
import { getFooter } from '../data/home';
|
||||
|
||||
const path = Astro.url.pathname;
|
||||
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
|
||||
const footer = getFooter(currentLocale);
|
||||
|
||||
const hasNewsletterAction =
|
||||
typeof footer.newsletter.actionUrl === 'string' &&
|
||||
@ -17,9 +22,6 @@ const notifySubject =
|
||||
|
||||
const linkClass =
|
||||
'text-sm text-sky-400/90 transition-colors hover:text-sky-300';
|
||||
const path = Astro.url.pathname;
|
||||
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||
const currentLocale = localeMatch?.[1] ?? 'it';
|
||||
const withLocale = (href: string) => {
|
||||
if (currentLocale === 'it') return href;
|
||||
if (href.startsWith(`/${currentLocale}`)) return href;
|
||||
@ -91,7 +93,7 @@ const withLocale = (href: string) => {
|
||||
) : (
|
||||
<span
|
||||
class="cursor-not-allowed text-nx-muted opacity-50"
|
||||
title="URL da configurare in footer.ts"
|
||||
title={footer.labels.socialPlaceholderTitle}
|
||||
>
|
||||
{item.label}
|
||||
</span>
|
||||
@ -115,7 +117,7 @@ const withLocale = (href: string) => {
|
||||
{link.label}
|
||||
</a>
|
||||
) : (
|
||||
<span class="text-sm text-nx-muted" title="Collegamento in arrivo">
|
||||
<span class="text-sm text-nx-muted" title={footer.labels.companyPlaceholderTitle}>
|
||||
{link.label}
|
||||
</span>
|
||||
)}
|
||||
@ -131,7 +133,7 @@ const withLocale = (href: string) => {
|
||||
>
|
||||
<div class="min-w-0">
|
||||
<p class="text-xs font-semibold uppercase tracking-wider text-nx-fg">
|
||||
Impostazioni cookie
|
||||
{footer.labels.cookieTitle}
|
||||
</p>
|
||||
<p class="mt-1.5 max-w-xl text-xs leading-relaxed text-nx-muted">
|
||||
{footer.cookiePreferences.hint}
|
||||
@ -204,7 +206,7 @@ const withLocale = (href: string) => {
|
||||
{nl.buttonLabel}
|
||||
</button>
|
||||
<p id="nx-newsletter-hint" class="text-xs leading-relaxed text-nx-muted">
|
||||
Iscrizione in arrivo: configura l’endpoint nel progetto per attivare il modulo.
|
||||
{footer.labels.newsletterComingSoon}
|
||||
</p>
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
/**
|
||||
* Pagina GDPR: diritti degli interessati e modalita' operative.
|
||||
* Pagina GDPR: diritti degli interessati e modalità operative.
|
||||
* Documento di supporto alla privacy policy quadro del portale NexStudio.
|
||||
*/
|
||||
export const gdprDocument = {
|
||||
version: '1.0',
|
||||
inVigoreDal: '22 aprile 2026',
|
||||
ultimoAggiornamento: '22 aprile 2026',
|
||||
version: '1.1',
|
||||
inVigoreDal: '[DATA]',
|
||||
ultimoAggiornamento: '[DATA]',
|
||||
} as const;
|
||||
|
||||
export const gdprCrossReferences = {
|
||||
@ -24,6 +24,8 @@ export type GdprSection = {
|
||||
title: string;
|
||||
paragraphs: readonly string[];
|
||||
bullets?: readonly string[];
|
||||
/** Paragrafi dopo l’elenco puntato. */
|
||||
paragraphsAfterBullets?: readonly string[];
|
||||
};
|
||||
|
||||
export const gdprSections: readonly GdprSection[] = [
|
||||
@ -32,57 +34,57 @@ export const gdprSections: readonly GdprSection[] = [
|
||||
title: '1. Quadro normativo e ambito',
|
||||
paragraphs: [
|
||||
"Il Regolamento (UE) 2016/679 (GDPR) tutela i diritti degli interessati e disciplina il trattamento dei dati personali. Questa pagina spiega come esercitare tali diritti verso NexStudio nel contesto del portale corporate e dei servizi collegati.",
|
||||
"La presente pagina integra, ma non sostituisce, l'informativa privacy generale: per categorie dati, finalita' e basi giuridiche si rimanda a `/privacy`; per cookie e tecnologie simili si rimanda a `/cookies`.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'diritti',
|
||||
title: '2. Diritti riconosciuti agli interessati',
|
||||
paragraphs: [
|
||||
"Nei limiti previsti dalla normativa applicabile, l'interessato puo' esercitare i seguenti diritti:",
|
||||
"Nei limiti previsti dalla normativa applicabile, l'interessato può esercitare i seguenti diritti:",
|
||||
],
|
||||
bullets: [
|
||||
"accesso ai dati personali e ottenimento di copia in formato intelligibile;",
|
||||
"rettifica dei dati inesatti e integrazione dei dati incompleti;",
|
||||
"cancellazione dei dati (diritto all'oblio), quando ne ricorrono i presupposti di legge;",
|
||||
"limitazione del trattamento in presenza delle condizioni previste dal GDPR;",
|
||||
"portabilita' dei dati trattati con mezzi automatizzati sulla base di consenso o contratto;",
|
||||
"opposizione al trattamento fondato su legittimo interesse, inclusa l'opposizione a comunicazioni marketing ove applicabile;",
|
||||
"revoca del consenso in qualsiasi momento, senza pregiudicare la liceita' del trattamento precedente;",
|
||||
"reclamo all'autorita' di controllo competente.",
|
||||
'Accesso ai dati personali e ottenimento di copia in formato intelligibile;',
|
||||
'Rettifica dei dati inesatti e integrazione dei dati incompleti;',
|
||||
'Cancellazione dei dati (diritto all\'oblio), quando ne ricorrono i presupposti;',
|
||||
'Limitazione del trattamento in presenza delle condizioni previste dal GDPR;',
|
||||
'Portabilità dei dati trattati con mezzi automatizzati sulla base di consenso o contratto;',
|
||||
"Opposizione al trattamento fondato su legittimo interesse, inclusa l'opposizione a comunicazioni marketing;",
|
||||
'Revoca del consenso in qualsiasi momento, senza pregiudicare la liceità del trattamento precedente;',
|
||||
"Reclamo all'autorità di controllo competente.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'chi-contattare',
|
||||
title: '3. Chi contattare per esercitare i diritti',
|
||||
paragraphs: [
|
||||
"Per trattamenti in cui NexStudio agisce come titolare (es. contatti dal sito, gestione richieste corporate, sicurezza infrastrutturale di propria competenza), la richiesta puo' essere inviata tramite i canali di contatto privacy indicati nei riferimenti istituzionali.",
|
||||
"Per trattamenti svolti nei tenant SaaS del cliente (LexAura/MediAura), il primo punto di contatto resta di norma il cliente titolare (es. studio legale, struttura sanitaria, organizzazione cliente), che determina finalita' e mezzi del trattamento.",
|
||||
"NexStudio, ove operi come responsabile del trattamento, supporta il cliente titolare nella gestione delle richieste ricevute, secondo DPA e accordi contrattuali applicabili.",
|
||||
paragraphs: [],
|
||||
bullets: [
|
||||
'Email: privacy@nexstudio.com',
|
||||
'Form: nexstudio.ai/contatti',
|
||||
'Per trattamenti nei tenant SaaS (LexAura/MediAura): rivolgersi prima al cliente titolare (studio legale, struttura sanitaria). NexStudio supporta il cliente titolare secondo DPA e accordi contrattuali.',
|
||||
],
|
||||
paragraphsAfterBullets: [
|
||||
"Autorità di controllo competente: Garante per la protezione dei dati personali (www.garanteprivacy.it) per i trattamenti soggetti al GDPR.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'identificazione',
|
||||
title: "4. Verifica dell'identita' e gestione della richiesta",
|
||||
title: "4. Verifica dell'identità e gestione della richiesta",
|
||||
paragraphs: [
|
||||
"Per tutelare riservatezza e sicurezza, NexStudio puo' richiedere informazioni minime aggiuntive necessarie a verificare l'identita' del richiedente e la legittimazione ad agire.",
|
||||
"Le richieste sono gestite con procedure tracciate e prese in carico nei tempi previsti dal GDPR; in caso di richieste complesse o multiple, i termini possono essere prorogati nei limiti consentiti dalla legge, con comunicazione motivata.",
|
||||
"Per tutelare riservatezza e sicurezza, NexStudio può richiedere informazioni minime aggiuntive necessarie a verificare l'identità del richiedente. Le richieste sono gestite con procedure tracciate e prese in carico nei tempi previsti dal GDPR; in caso di richieste complesse o multiple, i termini possono essere prorogati nei limiti consentiti dalla legge, con comunicazione motivata.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'limitazioni',
|
||||
title: '5. Casi di limitazione o rigetto',
|
||||
paragraphs: [
|
||||
"L'esercizio dei diritti puo' essere limitato o non accolto, in tutto o in parte, quando sussistono obblighi legali prevalenti, esigenze di difesa in giudizio, tutela dei diritti di terzi o altre eccezioni previste dalla normativa.",
|
||||
"In tali casi NexStudio fornisce, ove possibile, un riscontro motivato e indica i rimedi disponibili, incluso il diritto di proporre reclamo all'autorita' competente.",
|
||||
"L'esercizio dei diritti può essere limitato o non accolto quando sussistono obblighi legali prevalenti, esigenze di difesa in giudizio, tutela dei diritti di terzi o altre eccezioni previste dalla normativa. In tali casi NexStudio fornisce un riscontro motivato e indica i rimedi disponibili, incluso il diritto di proporre reclamo all'autorità competente.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'trasferimenti',
|
||||
title: '6. Trasferimenti internazionali e garanzie',
|
||||
paragraphs: [
|
||||
"Qualora il trattamento comporti trasferimenti extra SEE/UE, NexStudio adotta le misure richieste dalla normativa (es. clausole contrattuali standard e misure supplementari tecniche/organizzative) secondo quanto descritto nell'informativa privacy.",
|
||||
"Le informazioni rilevanti sui trasferimenti possono essere fornite all'interessato nei limiti consentiti e in coerenza con obblighi contrattuali e di sicurezza.",
|
||||
"Qualora il trattamento comporti trasferimenti extra SEE/UE, NexStudio adotta le misure richieste dalla normativa (es. clausole contrattuali standard e misure supplementari). I dati risiedono primariamente in UE via infrastruttura Cloudflare.",
|
||||
],
|
||||
},
|
||||
{
|
||||
@ -90,7 +92,11 @@ export const gdprSections: readonly GdprSection[] = [
|
||||
title: '7. Coordinamento con le privacy dei SaaS',
|
||||
paragraphs: [
|
||||
"Le privacy policy dei portali SaaS LexAura e MediAura dettagliano, per ciascun prodotto, flussi dati, tempi di conservazione, ruoli privacy e canali dedicati. In caso di differenze tra documenti, prevalgono i documenti specifici del servizio e gli accordi contrattuali applicabili.",
|
||||
"Questa pagina mantiene funzione di riferimento generale sul quadro GDPR del gruppo di servizi NexStudio.",
|
||||
'Per consultare le privacy dei prodotti:',
|
||||
],
|
||||
bullets: [
|
||||
'LexAura: vedere il portale dedicato',
|
||||
'MediAura: mediaura.doctor/privacy',
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
|
||||
@ -5,48 +5,48 @@ const contactSuccessRedirect = (env.PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT ?? '').
|
||||
const contactMailto = (env.PUBLIC_CONTACT_FORM_MAILTO ?? '').trim();
|
||||
const contactTurnstileSiteKey = (env.PUBLIC_CONTACT_TURNSTILE_SITE_KEY ?? '').trim();
|
||||
|
||||
export const cta = {
|
||||
/** Riga sezione (stesso ruolo di FAQ, Stack, …) */
|
||||
eyebrow: 'Contatti',
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** Titolo CTA su due righe (dopo il punto) */
|
||||
const ctaByLocale = {
|
||||
it: {
|
||||
eyebrow: 'Contatti',
|
||||
titleLine1: 'Automatizza il complesso.',
|
||||
titleLine2: 'Velocizza il processo.',
|
||||
body:
|
||||
'Dai modelli LLM alla distribuzione globale in pochi millisecondi. La directory definitiva per il LegalTech e MedTech. Utilizza il modulo contatto qui a fianco e ti forniremo tutti i chiarimenti che ti servono.',
|
||||
|
||||
/**
|
||||
* Modulo contatti in pagina (sezione Contatti).
|
||||
*
|
||||
* **Formspree:** crea un form su https://formspree.io e incolla l’URL in `actionUrl`.
|
||||
* **Solo mailto:** lascia `actionUrl` vuoto e imposta `mailto` con l’indirizzo destinatario
|
||||
* (si apre il client di posta dell’utente).
|
||||
*/
|
||||
contactForm: {
|
||||
/** Lasciare vuoti endpoint/chiavi nelle fasi di sola UI. */
|
||||
title: 'Parliamone',
|
||||
description:
|
||||
'Lascia i tuoi dati e il messaggio: ti risponde il team NexStudio.',
|
||||
nameLabel: 'Nome',
|
||||
companyLabel: 'Azienda (opzionale)',
|
||||
countryLabel: 'Paese',
|
||||
departmentLabel: 'Reparto',
|
||||
departmentLabel: 'Area',
|
||||
emailLabel: 'Email',
|
||||
messageLabel: 'Scrivi qui il tuo messaggio',
|
||||
submitLabel: 'Invia messaggio',
|
||||
/** Formspree: `https://formspree.io/f/xxxx` — valorizzato via `PUBLIC_CONTACT_FORM_ACTION_URL` */
|
||||
actionUrl: contactActionUrl,
|
||||
/** Formspree `_next` — URL assoluta in produzione (`PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT`) */
|
||||
successRedirect: contactSuccessRedirect,
|
||||
/**
|
||||
* Cloudflare Turnstile (anti-spam): inserisci qui la site key pubblica.
|
||||
* Se vuota, il CAPTCHA non viene mostrato.
|
||||
*/
|
||||
turnstileSiteKey: contactTurnstileSiteKey,
|
||||
/** Formspree `_subject` e oggetto mailto */
|
||||
turnstileLanguage: 'it',
|
||||
turnstileHint:
|
||||
'Verifica anti-spam: completa il controllo prima di inviare il messaggio.',
|
||||
notifySubject: 'Richiesta contatto — sito NexStudio',
|
||||
/** Fallback se `actionUrl` e' vuoto (`PUBLIC_CONTACT_FORM_MAILTO`) */
|
||||
mailto: contactMailto,
|
||||
mailtoFallbackSubject: 'Contatto sito',
|
||||
mailtoLabels: {
|
||||
name: 'Nome',
|
||||
company: 'Azienda',
|
||||
email: 'Email',
|
||||
country: 'Paese',
|
||||
department: 'Area',
|
||||
defaultDepartment: 'general',
|
||||
},
|
||||
errors: {
|
||||
turnstile: 'Completa il controllo anti-spam prima di inviare il messaggio.',
|
||||
config:
|
||||
'Configura `contactForm.actionUrl` (Formspree) o `contactForm.mailto` in `src/data/home/cta.ts`.',
|
||||
},
|
||||
fieldName: 'name',
|
||||
fieldCompany: 'company',
|
||||
fieldCountry: 'country',
|
||||
@ -54,13 +54,116 @@ export const cta = {
|
||||
fieldEmail: 'email',
|
||||
fieldMessage: 'message',
|
||||
departmentOptions: [
|
||||
{ value: 'general', label: 'Generale' },
|
||||
{ value: 'support', label: 'Support' },
|
||||
{ value: 'privacy', label: 'Privacy / DPO' },
|
||||
{ value: 'security', label: 'Security / Incident Response' },
|
||||
{ value: 'ethics', label: 'Segnalazioni confidenziali (Ethics)' },
|
||||
{ value: 'legal', label: 'Legal' },
|
||||
{ value: 'hr', label: 'HR' },
|
||||
{ value: 'info', label: 'Informazioni generali e commerciali' },
|
||||
{ value: 'privacy', label: 'Privacy' },
|
||||
{ value: 'careers', label: 'Careers / Collaborazioni' },
|
||||
],
|
||||
},
|
||||
},
|
||||
en: {
|
||||
eyebrow: 'Contacts',
|
||||
titleLine1: 'Automate complexity.',
|
||||
titleLine2: 'Accelerate operations.',
|
||||
body:
|
||||
'From LLM models to global distribution in milliseconds. Use the contact form and our team will provide all the details you need.',
|
||||
contactForm: {
|
||||
title: 'Let’s talk',
|
||||
description: 'Share your details and message: the NexStudio team will reply.',
|
||||
nameLabel: 'Name',
|
||||
companyLabel: 'Company (optional)',
|
||||
countryLabel: 'Country',
|
||||
departmentLabel: 'Area',
|
||||
emailLabel: 'Email',
|
||||
messageLabel: 'Write your message',
|
||||
submitLabel: 'Send message',
|
||||
actionUrl: contactActionUrl,
|
||||
successRedirect: contactSuccessRedirect,
|
||||
turnstileSiteKey: contactTurnstileSiteKey,
|
||||
turnstileLanguage: 'en',
|
||||
turnstileHint:
|
||||
'Anti-spam verification: complete the challenge before sending your message.',
|
||||
notifySubject: 'Contact request — NexStudio website',
|
||||
mailto: contactMailto,
|
||||
mailtoFallbackSubject: 'Website contact',
|
||||
mailtoLabels: {
|
||||
name: 'Name',
|
||||
company: 'Company',
|
||||
email: 'Email',
|
||||
country: 'Country',
|
||||
department: 'Area',
|
||||
defaultDepartment: 'general',
|
||||
},
|
||||
errors: {
|
||||
turnstile: 'Complete the anti-spam check before sending your message.',
|
||||
config:
|
||||
'Configure `contactForm.actionUrl` (Formspree) or `contactForm.mailto` in `src/data/home/cta.ts`.',
|
||||
},
|
||||
fieldName: 'name',
|
||||
fieldCompany: 'company',
|
||||
fieldCountry: 'country',
|
||||
fieldDepartment: 'department',
|
||||
fieldEmail: 'email',
|
||||
fieldMessage: 'message',
|
||||
departmentOptions: [
|
||||
{ value: 'info', label: 'General and commercial information' },
|
||||
{ value: 'privacy', label: 'Privacy' },
|
||||
{ value: 'careers', label: 'Careers / Collaborations' },
|
||||
],
|
||||
},
|
||||
},
|
||||
th: {
|
||||
eyebrow: 'ติดต่อ',
|
||||
titleLine1: 'ทำงานซับซ้อนให้อัตโนมัติ',
|
||||
titleLine2: 'เร่งความเร็วกระบวนการ',
|
||||
body:
|
||||
'จากโมเดล LLM สู่การกระจายระบบระดับโลกภายในไม่กี่มิลลิวินาที ใช้ฟอร์มติดต่อด้านข้าง แล้วทีม NexStudio จะตอบกลับพร้อมข้อมูลที่คุณต้องการ',
|
||||
contactForm: {
|
||||
title: 'คุยกับเรา',
|
||||
description: 'กรอกข้อมูลและข้อความ แล้วทีม NexStudio จะติดต่อกลับ',
|
||||
nameLabel: 'ชื่อ',
|
||||
companyLabel: 'บริษัท (ไม่บังคับ)',
|
||||
countryLabel: 'ประเทศ',
|
||||
departmentLabel: 'แผนก',
|
||||
emailLabel: 'อีเมล',
|
||||
messageLabel: 'พิมพ์ข้อความของคุณ',
|
||||
submitLabel: 'ส่งข้อความ',
|
||||
actionUrl: contactActionUrl,
|
||||
successRedirect: contactSuccessRedirect,
|
||||
turnstileSiteKey: contactTurnstileSiteKey,
|
||||
turnstileLanguage: 'th',
|
||||
turnstileHint: 'การยืนยันป้องกันสแปม: กรุณาทำขั้นตอนให้เสร็จก่อนส่งข้อความ',
|
||||
notifySubject: 'คำขอติดต่อ — เว็บไซต์ NexStudio',
|
||||
mailto: contactMailto,
|
||||
mailtoFallbackSubject: 'ติดต่อจากเว็บไซต์',
|
||||
mailtoLabels: {
|
||||
name: 'ชื่อ',
|
||||
company: 'บริษัท',
|
||||
email: 'อีเมล',
|
||||
country: 'ประเทศ',
|
||||
department: 'แผนก',
|
||||
defaultDepartment: 'general',
|
||||
},
|
||||
errors: {
|
||||
turnstile: 'กรุณายืนยันการป้องกันสแปมก่อนส่งข้อความ',
|
||||
config:
|
||||
'กรุณาตั้งค่า `contactForm.actionUrl` (Formspree) หรือ `contactForm.mailto` ใน `src/data/home/cta.ts`',
|
||||
},
|
||||
fieldName: 'name',
|
||||
fieldCompany: 'company',
|
||||
fieldCountry: 'country',
|
||||
fieldDepartment: 'department',
|
||||
fieldEmail: 'email',
|
||||
fieldMessage: 'message',
|
||||
departmentOptions: [
|
||||
{ value: 'info', label: 'ข้อมูลทั่วไปและเชิงพาณิชย์' },
|
||||
{ value: 'privacy', label: 'ความเป็นส่วนตัว' },
|
||||
{ value: 'careers', label: 'Careers / Collaborations' },
|
||||
],
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getCta = (locale: SupportedLocale) => ctaByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const cta = ctaByLocale.it;
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** FAQ — domande/risposte allineate a hero, prodotti, servizi e stack */
|
||||
export const faq = {
|
||||
const faqByLocale = {
|
||||
it: {
|
||||
eyebrow: 'FAQ',
|
||||
title: 'Domande frequenti',
|
||||
items: [
|
||||
@ -44,4 +47,102 @@ export const faq = {
|
||||
'Il punto di ingresso principale è la chat dal pulsante «Chattiamo» in header: prima vedi se il canale è con operatore umano, solo chatbot o misto, poi lasci email (e facoltativamente il nome) per ricevere un link o un codice monouso e aprire la sessione senza perdite di tempo. In chat operatore umano e chatbot collaborano per orientamento iniziale, requisiti e passi successivi. Per il supporto via web ci interfacciamo in italiano, inglese, tedesco, francese, spagnolo o tailandese. Per materiale sensibile useremo sempre i canali concordati in fase di rapporto commerciale. Se ci si sente più a proprio agio usando un form di contatto, in fondo alla homepage nella sezione Contatti trovate il modulo a destra del testo introduttivo.',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
en: {
|
||||
eyebrow: 'FAQ',
|
||||
title: 'Frequently asked questions',
|
||||
items: [
|
||||
{
|
||||
question: 'What organizations do you support with LexAura and MediAura?',
|
||||
answer:
|
||||
'We work with law firms and healthcare organizations, from solo professionals to multi-site teams, that manage high information volumes and need reliable tools in regulated environments.',
|
||||
},
|
||||
{
|
||||
question: 'Does AI replace lawyers or doctors?',
|
||||
answer:
|
||||
'No. Our products support professional workflows with summarization, research, assisted drafting, and automation. Final decisions and responsibility always remain with the professional.',
|
||||
},
|
||||
{
|
||||
question: 'What happens after software adoption?',
|
||||
answer:
|
||||
'Our service model goes beyond licensing: specialist onboarding and training, continuous technical support and consulting, and ongoing engine updates aligned with regulations and market context.',
|
||||
},
|
||||
{
|
||||
question: 'Can you integrate LexAura or MediAura with our existing systems?',
|
||||
answer:
|
||||
'Yes, when needed. We support API integrations and custom modules within our SaaS perimeter to connect existing management or document flows.',
|
||||
},
|
||||
{
|
||||
question: 'How do you handle security, availability, and sensitive data?',
|
||||
answer:
|
||||
'We design for high-availability cloud-native architectures, encryption, perimeter protection, and operational continuity, with clear data-governance practices aligned with applicable regulations.',
|
||||
},
|
||||
{
|
||||
question: 'Do you work only locally or also with international clients?',
|
||||
answer:
|
||||
'We are based in Bangkok and collaborate internationally. Workshops can be remote or on-site depending on the project.',
|
||||
},
|
||||
{
|
||||
question: 'How do you handle software usage rights and ownership?',
|
||||
answer:
|
||||
'This depends on the contract. In many engagements, exclusive rights on deliverables are transferred after final payment, with explicit clauses for open source and third-party components.',
|
||||
},
|
||||
{
|
||||
question: 'What is the fastest way to talk with your team?',
|
||||
answer:
|
||||
'The primary entry point is the chat button in the header. You provide your email to receive a one-time link or code, then start the session without delay.',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
th: {
|
||||
eyebrow: 'คำถามที่พบบ่อย',
|
||||
title: 'คำถามที่พบบ่อย',
|
||||
items: [
|
||||
{
|
||||
question: 'องค์กรแบบไหนที่เหมาะกับ LexAura และ MediAura?',
|
||||
answer:
|
||||
'เราทำงานกับสำนักงานกฎหมายและองค์กรสุขภาพ ตั้งแต่ผู้เชี่ยวชาญเดี่ยวไปจนถึงทีมหลายสาขา ที่ต้องจัดการข้อมูลจำนวนมากในบริบทที่มีข้อกำกับสูง',
|
||||
},
|
||||
{
|
||||
question: 'AI จะแทนที่ทนายหรือแพทย์หรือไม่?',
|
||||
answer:
|
||||
'ไม่ใช่ เป้าหมายของเราคือช่วยงานเชิงวิเคราะห์ งานเอกสาร และเวิร์กโฟลว์ซ้ำ ๆ โดยการตัดสินใจสุดท้ายยังคงเป็นหน้าที่ของผู้เชี่ยวชาญ',
|
||||
},
|
||||
{
|
||||
question: 'หลังเริ่มใช้งานซอฟต์แวร์แล้วจะเกิดอะไรขึ้น?',
|
||||
answer:
|
||||
'เรามีบริการหลังการใช้งานครบวงจร ทั้ง onboarding การอบรมเฉพาะทาง การสนับสนุนทางเทคนิค และการอัปเดตระบบอย่างต่อเนื่อง',
|
||||
},
|
||||
{
|
||||
question: 'สามารถเชื่อม LexAura หรือ MediAura กับระบบเดิมของเราได้ไหม?',
|
||||
answer:
|
||||
'ได้ เรารองรับการเชื่อมต่อผ่าน API และโมดูลแบบกำหนดเองภายในขอบเขต SaaS ของเรา',
|
||||
},
|
||||
{
|
||||
question: 'จัดการความปลอดภัย ความพร้อมใช้งาน และข้อมูลอ่อนไหวอย่างไร?',
|
||||
answer:
|
||||
'เราใช้สถาปัตยกรรมคลาวด์ที่พร้อมใช้งานสูง การเข้ารหัส การป้องกันระดับเครือข่าย และแนวปฏิบัติด้านการกำกับข้อมูลให้สอดคล้องข้อกำกับที่เกี่ยวข้อง',
|
||||
},
|
||||
{
|
||||
question: 'รับงานเฉพาะในพื้นที่หรือรับลูกค้าต่างประเทศด้วย?',
|
||||
answer:
|
||||
'สำนักงานใหญ่ปฏิบัติการของเราอยู่ที่กรุงเทพฯ และทำงานกับลูกค้าต่างประเทศได้ ทั้งออนไลน์และออนไซต์ตามความเหมาะสมของโครงการ',
|
||||
},
|
||||
{
|
||||
question: 'สิทธิการใช้งานและความเป็นเจ้าของซอฟต์แวร์กำหนดอย่างไร?',
|
||||
answer:
|
||||
'ขึ้นกับสัญญา โดยทั่วไปจะระบุเงื่อนไขการใช้งาน ความรับผิดชอบ และสิทธิในชิ้นงานอย่างชัดเจน รวมถึงส่วนประกอบโอเพนซอร์สและ third-party',
|
||||
},
|
||||
{
|
||||
question: 'ถ้าต้องการคุยเร็วที่สุดควรติดต่อช่องทางไหน?',
|
||||
answer:
|
||||
'กดปุ่มแชทบนส่วนหัวเว็บไซต์ ใส่อีเมลเพื่อรับลิงก์หรือโค้ดแบบใช้ครั้งเดียว แล้วเริ่มเซสชันได้ทันที',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getFaq = (locale: SupportedLocale) => faqByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const faq = faqByLocale.it;
|
||||
|
||||
@ -1,87 +1,178 @@
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** Footer — griglia 4 colonne (link); newsletter in blocco unico sotto, allineata a sinistra */
|
||||
export const footer = {
|
||||
const footerByLocale = {
|
||||
it: {
|
||||
brandName: 'NexStudio',
|
||||
tagline: 'Ingegneria del software e IA per settori regolamentati.',
|
||||
legalLine: 'P.IVA e note legali: da inserire.',
|
||||
|
||||
columnTitles: {
|
||||
sections: 'Sezioni',
|
||||
legal: 'Normative',
|
||||
social: 'Reti sociali',
|
||||
company: 'Azienda',
|
||||
} as const,
|
||||
|
||||
/** Colonna 1 — ancore sulla homepage */
|
||||
homeNav: [
|
||||
{ label: 'Prodotti', href: '/#prodotti' },
|
||||
{ label: 'Servizi', href: '/#servizi' },
|
||||
{ label: 'Stack', href: '/#stack' },
|
||||
{ label: 'FAQ', href: '/#faq' },
|
||||
] as const,
|
||||
|
||||
/** Pannello preferenze (CMP): non è un documento legale; tenuto fuori dalla colonna Normative */
|
||||
cookiePreferences: {
|
||||
label: 'Impostazioni cookie',
|
||||
hint: 'Preferenze di consenso sul tuo browser (non è un testo legale).',
|
||||
} as const,
|
||||
|
||||
/** Colonna 2 — documenti legali (testi bozza nelle rispettive pagine) */
|
||||
legalColumnNav: [
|
||||
{ label: 'Condizioni d’uso', href: '/terms' },
|
||||
{ label: 'Informativa cookie', href: '/cookies' },
|
||||
{ label: 'Privacy', href: '/privacy' },
|
||||
{ label: 'Diritti privacy (GDPR)', href: '/gdpr' },
|
||||
] as const,
|
||||
|
||||
/**
|
||||
* Colonna 3 — social (sostituire gli URL con i profili reali).
|
||||
* Lasciare `href` vuoto per mostrare solo etichetta disabilitata finché non configurato.
|
||||
*/
|
||||
socialLinks: [
|
||||
{ label: 'Facebook', href: '' },
|
||||
{ label: 'LinkedIn', href: '' },
|
||||
{ label: 'Twitter / X', href: '' },
|
||||
{ label: 'GitHub', href: '' },
|
||||
] as const,
|
||||
|
||||
/** Colonna 4 — pagine istituzionali e compliance */
|
||||
companyNav: [
|
||||
{ label: 'Chi siamo', href: '/about' },
|
||||
{ label: 'Codice etico', href: '/codice-etico' },
|
||||
{ label: 'Modello organizzativo', href: '/modello-organizzativo' },
|
||||
{ label: 'Dove siamo', href: '/dove-siamo' },
|
||||
] as const,
|
||||
|
||||
/**
|
||||
* Newsletter — invio via POST a un endpoint esterno.
|
||||
*
|
||||
* Opzione A (consigliata per partire): Formspree
|
||||
* 1. Crea account su https://formspree.io e un nuovo form.
|
||||
* 2. Copia l’URL tipo `https://formspree.io/f/abcdefgh` in `actionUrl`.
|
||||
* 3. Opzionale: `successRedirect` = URL assoluta della pagina di ringraziamento
|
||||
* (es. `https://tuodominio.com/newsletter/grazie` — vedi `src/pages/newsletter/grazie.astro`).
|
||||
* 4. In Formspree collega l’invio a email / Slack / Google Sheets.
|
||||
*
|
||||
* Opzione B: Brevo, Mailchimp, Buttondown, ConvertKit — usano spesso un URL
|
||||
* dedicato o un embed; adatta `fieldName` al nome campo richiesto dalla doc.
|
||||
*
|
||||
* Opzione C: Worker Cloudflare + lista in KV/D1 (più controllo, più codice).
|
||||
*/
|
||||
newsletter: {
|
||||
title: 'Newsletter',
|
||||
description: 'Aggiornamenti su prodotti e roadmap.',
|
||||
placeholder: 'La tua email',
|
||||
buttonLabel: 'Iscriviti',
|
||||
/** Formspree: `https://formspree.io/f/xxxx` — vuoto = modulo disabilitato */
|
||||
actionUrl: '',
|
||||
/** Nome campo email richiesto dal provider (Formspree: di solito `email`) */
|
||||
fieldName: 'email',
|
||||
/**
|
||||
* Formspree: redirect dopo invio (`_next`). Deve essere URL **assoluta**
|
||||
* (es. produzione). Vuoto = pagina di ringrazio predefinita Formspree.
|
||||
*/
|
||||
successRedirect: '',
|
||||
/** Formspree: oggetto della mail di notifica (`_subject`) */
|
||||
notifySubject: 'Nuova iscrizione newsletter — NexStudio',
|
||||
},
|
||||
labels: {
|
||||
cookieTitle: 'Impostazioni cookie',
|
||||
socialPlaceholderTitle: 'URL da configurare in footer.ts',
|
||||
companyPlaceholderTitle: 'Collegamento in arrivo',
|
||||
newsletterComingSoon:
|
||||
'Iscrizione in arrivo: configura l’endpoint nel progetto per attivare il modulo.',
|
||||
},
|
||||
},
|
||||
en: {
|
||||
brandName: 'NexStudio',
|
||||
tagline: 'Software engineering and AI for regulated industries.',
|
||||
legalLine: 'VAT number and legal notes: to be added.',
|
||||
columnTitles: {
|
||||
sections: 'Sections',
|
||||
legal: 'Legal',
|
||||
social: 'Social',
|
||||
company: 'Company',
|
||||
} as const,
|
||||
homeNav: [
|
||||
{ label: 'Products', href: '/#prodotti' },
|
||||
{ label: 'Services', href: '/#servizi' },
|
||||
{ label: 'Stack', href: '/#stack' },
|
||||
{ label: 'FAQ', href: '/#faq' },
|
||||
] as const,
|
||||
cookiePreferences: {
|
||||
label: 'Cookie settings',
|
||||
hint: 'Consent preferences in your browser (this is not a legal document).',
|
||||
} as const,
|
||||
legalColumnNav: [
|
||||
{ label: 'Terms of use', href: '/terms' },
|
||||
{ label: 'Cookie policy', href: '/cookies' },
|
||||
{ label: 'Privacy', href: '/privacy' },
|
||||
{ label: 'Privacy rights (GDPR)', href: '/gdpr' },
|
||||
] as const,
|
||||
socialLinks: [
|
||||
{ label: 'Facebook', href: '' },
|
||||
{ label: 'LinkedIn', href: '' },
|
||||
{ label: 'Twitter / X', href: '' },
|
||||
{ label: 'GitHub', href: '' },
|
||||
] as const,
|
||||
companyNav: [
|
||||
{ label: 'About us', href: '/about' },
|
||||
{ label: 'Code of ethics', href: '/codice-etico' },
|
||||
{ label: 'Organizational model', href: '/modello-organizzativo' },
|
||||
{ label: 'Where we are', href: '/dove-siamo' },
|
||||
] as const,
|
||||
newsletter: {
|
||||
title: 'Newsletter',
|
||||
description: 'Updates on products and roadmap.',
|
||||
placeholder: 'Your email',
|
||||
buttonLabel: 'Subscribe',
|
||||
actionUrl: '',
|
||||
fieldName: 'email',
|
||||
successRedirect: '',
|
||||
notifySubject: 'New newsletter signup — NexStudio',
|
||||
},
|
||||
labels: {
|
||||
cookieTitle: 'Cookie settings',
|
||||
socialPlaceholderTitle: 'URL to configure in footer.ts',
|
||||
companyPlaceholderTitle: 'Coming soon',
|
||||
newsletterComingSoon:
|
||||
'Newsletter signups coming soon: configure the endpoint in the project to enable this form.',
|
||||
},
|
||||
},
|
||||
th: {
|
||||
brandName: 'NexStudio',
|
||||
tagline: 'วิศวกรรมซอฟต์แวร์และ AI สำหรับอุตสาหกรรมที่มีข้อกำกับ',
|
||||
legalLine: 'เลขประจำตัวผู้เสียภาษีและข้อมูลทางกฎหมาย: รอเพิ่มภายหลัง',
|
||||
columnTitles: {
|
||||
sections: 'ส่วนต่าง ๆ',
|
||||
legal: 'กฎหมาย',
|
||||
social: 'โซเชียล',
|
||||
company: 'บริษัท',
|
||||
} as const,
|
||||
homeNav: [
|
||||
{ label: 'ผลิตภัณฑ์', href: '/#prodotti' },
|
||||
{ label: 'บริการ', href: '/#servizi' },
|
||||
{ label: 'สแตก', href: '/#stack' },
|
||||
{ label: 'คำถามที่พบบ่อย', href: '/#faq' },
|
||||
] as const,
|
||||
cookiePreferences: {
|
||||
label: 'ตั้งค่าคุกกี้',
|
||||
hint: 'การตั้งค่าความยินยอมในเบราว์เซอร์ของคุณ (ไม่ใช่เอกสารทางกฎหมาย)',
|
||||
} as const,
|
||||
legalColumnNav: [
|
||||
{ label: 'เงื่อนไขการใช้งาน', href: '/terms' },
|
||||
{ label: 'นโยบายคุกกี้', href: '/cookies' },
|
||||
{ label: 'ความเป็นส่วนตัว', href: '/privacy' },
|
||||
{ label: 'สิทธิความเป็นส่วนตัว (GDPR)', href: '/gdpr' },
|
||||
] as const,
|
||||
socialLinks: [
|
||||
{ label: 'Facebook', href: '' },
|
||||
{ label: 'LinkedIn', href: '' },
|
||||
{ label: 'Twitter / X', href: '' },
|
||||
{ label: 'GitHub', href: '' },
|
||||
] as const,
|
||||
companyNav: [
|
||||
{ label: 'เกี่ยวกับเรา', href: '/about' },
|
||||
{ label: 'จรรยาบรรณ', href: '/codice-etico' },
|
||||
{ label: 'โมเดลองค์กร', href: '/modello-organizzativo' },
|
||||
{ label: 'ที่ตั้ง', href: '/dove-siamo' },
|
||||
] as const,
|
||||
newsletter: {
|
||||
title: 'จดหมายข่าว',
|
||||
description: 'อัปเดตเกี่ยวกับผลิตภัณฑ์และโรดแมป',
|
||||
placeholder: 'อีเมลของคุณ',
|
||||
buttonLabel: 'สมัครรับข่าวสาร',
|
||||
actionUrl: '',
|
||||
fieldName: 'email',
|
||||
successRedirect: '',
|
||||
notifySubject: 'มีผู้สมัครจดหมายข่าวใหม่ — NexStudio',
|
||||
},
|
||||
labels: {
|
||||
cookieTitle: 'ตั้งค่าคุกกี้',
|
||||
socialPlaceholderTitle: 'ต้องตั้งค่า URL ใน footer.ts',
|
||||
companyPlaceholderTitle: 'กำลังจะเปิดใช้งาน',
|
||||
newsletterComingSoon:
|
||||
'ระบบสมัครจดหมายข่าวกำลังจะเปิดใช้งาน: ตั้งค่า endpoint ในโปรเจกต์เพื่อเปิดฟอร์มนี้',
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getFooter = (locale: SupportedLocale) => footerByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const footer = footerByLocale.it;
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** Sezione hero */
|
||||
export const hero = {
|
||||
const heroByLocale = {
|
||||
it: {
|
||||
badge: 'Restituiamo valore al tuo tempo',
|
||||
/** Parte prima dell’evidenziazione nel titolo */
|
||||
titleBefore: "Ingegneria del software per l'era dell'",
|
||||
/** Segmento con gradiente nel titolo */
|
||||
titleHighlight: 'Intelligenza Artificiale',
|
||||
titleAfter: '.',
|
||||
subtitle:
|
||||
'Sviluppiamo soluzioni SaaS ad alta complessità per settori regolamentati.',
|
||||
/** Paragrafi introduttivi */
|
||||
paragraphs: [
|
||||
"Ci occupiamo di progettazione di ecosistemi digitali evoluti. La nostra specializzazione risiede nell'integrazione di modelli di Intelligenza Artificiale all'interno di flussi di lavoro professionali dove precisione, sicurezza e affidabilità sono requisiti non negoziabili.",
|
||||
'Il nostro approccio si concentra sulla trasformazione di dati complessi in strumenti operativi fluidi, attraverso lo sviluppo di algoritmi proprietari, interfacce vocali e architetture cloud scalabili.',
|
||||
@ -26,4 +26,60 @@ export const hero = {
|
||||
description: 'Sistemi avanzati per la gestione e l’automazione sanitaria.',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
en: {
|
||||
badge: 'We give your time back',
|
||||
titleBefore: "Software engineering for the era of ",
|
||||
titleHighlight: 'Artificial Intelligence',
|
||||
titleAfter: '.',
|
||||
subtitle:
|
||||
'We build high-complexity SaaS solutions for regulated industries.',
|
||||
paragraphs: [
|
||||
'We design advanced digital ecosystems. Our specialization is integrating AI models into professional workflows where accuracy, security, and reliability are non-negotiable requirements.',
|
||||
'Our approach turns complex data into smooth operational tools through proprietary algorithms, voice interfaces, and scalable cloud-native architectures.',
|
||||
] as const,
|
||||
businessUnitsHeading: 'Our Business Units:',
|
||||
businessUnitsIntro:
|
||||
'We operate through specialized divisions to ensure deep domain expertise and vertical focus:',
|
||||
businessUnits: [
|
||||
{
|
||||
name: 'Legal Tech',
|
||||
description: 'Solutions for legal automation and regulatory analysis.',
|
||||
},
|
||||
{
|
||||
name: 'Health Tech',
|
||||
description:
|
||||
'Advanced systems for healthcare workflow management and automation.',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
th: {
|
||||
badge: 'คืนคุณค่าให้กับเวลาของคุณ',
|
||||
titleBefore: 'วิศวกรรมซอฟต์แวร์สำหรับยุคของ',
|
||||
titleHighlight: 'ปัญญาประดิษฐ์',
|
||||
titleAfter: '.',
|
||||
subtitle: 'เราพัฒนาโซลูชัน SaaS ที่ซับซ้อนสูงสำหรับอุตสาหกรรมที่มีข้อกำกับ',
|
||||
paragraphs: [
|
||||
'เราออกแบบระบบนิเวศดิจิทัลขั้นสูง โดยเชี่ยวชาญในการผสานโมเดล AI เข้ากับเวิร์กโฟลว์ระดับมืออาชีพที่ต้องการความแม่นยำ ความปลอดภัย และความน่าเชื่อถือ',
|
||||
'แนวทางของเราคือเปลี่ยนข้อมูลที่ซับซ้อนให้เป็นเครื่องมือการทำงานที่ลื่นไหล ผ่านอัลกอริทึมเฉพาะทาง อินเทอร์เฟซเสียง และสถาปัตยกรรมคลาวด์ที่ขยายได้',
|
||||
] as const,
|
||||
businessUnitsHeading: 'หน่วยธุรกิจของเรา:',
|
||||
businessUnitsIntro:
|
||||
'เราดำเนินงานผ่านทีมเฉพาะทางเพื่อให้ได้ความเชี่ยวชาญเชิงลึกในแต่ละโดเมน:',
|
||||
businessUnits: [
|
||||
{
|
||||
name: 'Legal Tech',
|
||||
description: 'โซลูชันสำหรับงานกฎหมายอัตโนมัติและการวิเคราะห์ข้อกำกับ',
|
||||
},
|
||||
{
|
||||
name: 'Health Tech',
|
||||
description: 'ระบบขั้นสูงสำหรับการจัดการและทำงานอัตโนมัติในภาคสุขภาพ',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getHero = (locale: SupportedLocale) => heroByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const hero = heroByLocale.it;
|
||||
|
||||
@ -3,13 +3,21 @@
|
||||
* Modifica i file in questa cartella per aggiornare testi senza toccare il markup.
|
||||
*/
|
||||
export { siteMeta } from './site-meta';
|
||||
export { getSiteMeta } from './site-meta';
|
||||
export { chat } from './chat';
|
||||
export { navigation } from './navigation';
|
||||
export { getNavigation } from './navigation';
|
||||
export { hero } from './hero';
|
||||
export { getHero } from './hero';
|
||||
export { stats } from './stats';
|
||||
export { services } from './services';
|
||||
export { getServices } from './services';
|
||||
export { stackSection } from './stack';
|
||||
export { getStackSection } from './stack';
|
||||
export { productsSection } from './products';
|
||||
export { faq } from './faq';
|
||||
export { getFaq } from './faq';
|
||||
export { cta } from './cta';
|
||||
export { getCta } from './cta';
|
||||
export { footer } from './footer';
|
||||
export { getFooter } from './footer';
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
import { chat } from './chat';
|
||||
|
||||
/** Header — CTA unico: ingresso chat live (config in `chat.ts`) */
|
||||
export const navigation = {
|
||||
export type SupportedLocale = 'it' | 'en' | 'th';
|
||||
|
||||
const navigationByLocale = {
|
||||
it: {
|
||||
brandName: 'NexStudio',
|
||||
items: [
|
||||
{ label: 'Prodotti', href: '/#prodotti' },
|
||||
@ -16,4 +18,60 @@ export const navigation = {
|
||||
ariaLabel:
|
||||
'Richiedi accesso alla chat NexStudio: stato operatore e chatbot, identificazione con email (link o codice) prima della sessione.',
|
||||
},
|
||||
labels: {
|
||||
mainNavAria: 'Principale',
|
||||
mobileNavAria: 'Navigazione mobile',
|
||||
languageSelectorAria: 'Seleziona lingua',
|
||||
openMenuAria: 'Apri menu',
|
||||
},
|
||||
},
|
||||
en: {
|
||||
brandName: 'NexStudio',
|
||||
items: [
|
||||
{ label: 'Products', href: '/#prodotti' },
|
||||
{ label: 'Services', href: '/#servizi' },
|
||||
{ label: 'Stack', href: '/#stack' },
|
||||
{ label: 'FAQ', href: '/#faq' },
|
||||
{ label: 'Contact', href: '/#contatti' },
|
||||
] as const,
|
||||
cta: {
|
||||
label: 'Let’s chat',
|
||||
linkTitle: 'Open NexStudio chat access request.',
|
||||
ariaLabel:
|
||||
'Request access to NexStudio chat: operator and chatbot availability, email verification link or code before session start.',
|
||||
},
|
||||
labels: {
|
||||
mainNavAria: 'Main navigation',
|
||||
mobileNavAria: 'Mobile navigation',
|
||||
languageSelectorAria: 'Select language',
|
||||
openMenuAria: 'Open menu',
|
||||
},
|
||||
},
|
||||
th: {
|
||||
brandName: 'NexStudio',
|
||||
items: [
|
||||
{ label: 'ผลิตภัณฑ์', href: '/#prodotti' },
|
||||
{ label: 'บริการ', href: '/#servizi' },
|
||||
{ label: 'สแตก', href: '/#stack' },
|
||||
{ label: 'คำถามที่พบบ่อย', href: '/#faq' },
|
||||
{ label: 'ติดต่อเรา', href: '/#contatti' },
|
||||
] as const,
|
||||
cta: {
|
||||
label: 'เริ่มแชท',
|
||||
linkTitle: 'เปิดคำขอเข้าใช้งานแชทของ NexStudio',
|
||||
ariaLabel:
|
||||
'ขอเข้าใช้งานแชท NexStudio: ตรวจสอบสถานะผู้ดูแลและแชทบอต พร้อมยืนยันตัวตนด้วยอีเมลก่อนเริ่มใช้งาน',
|
||||
},
|
||||
labels: {
|
||||
mainNavAria: 'เมนูหลัก',
|
||||
mobileNavAria: 'เมนูบนมือถือ',
|
||||
languageSelectorAria: 'เลือกภาษา',
|
||||
openMenuAria: 'เปิดเมนู',
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getNavigation = (locale: SupportedLocale) => navigationByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const navigation = navigationByLocale.it;
|
||||
|
||||
@ -2,7 +2,10 @@
|
||||
* Servizi (griglia bento).
|
||||
* layout: wide = 2 colonne, tall = 2 righe + elenco puntato
|
||||
*/
|
||||
export const services = {
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
const servicesByLocale = {
|
||||
it: {
|
||||
eyebrow: 'I nostri servizi',
|
||||
title: 'Implementazione, evoluzione e supporto',
|
||||
lead:
|
||||
@ -10,7 +13,6 @@ export const services = {
|
||||
cards: [
|
||||
{
|
||||
layout: 'tall' as const,
|
||||
/** Sfera geodetica vettoriale (SVG) in basso a destra */
|
||||
decoration: 'wireframe-globe' as const,
|
||||
title: 'Onboarding e formazione specialistica',
|
||||
body:
|
||||
@ -49,4 +51,104 @@ export const services = {
|
||||
'Il mondo dell’IA e delle normative (legali e sanitarie) è in costante mutamento. Il nostro servizio include l’aggiornamento continuo dei motori di analisi, garantendo che il software sia sempre allineato con le ultime tecnologie e le evoluzioni del mercato di riferimento.',
|
||||
},
|
||||
],
|
||||
},
|
||||
en: {
|
||||
eyebrow: 'Our services',
|
||||
title: 'Implementation, evolution, and support',
|
||||
lead:
|
||||
'At NexStudio, our commitment goes beyond software licensing. Our service model helps each professional and organization unlock the full value of AI integrated into LexAura and MediAura.',
|
||||
cards: [
|
||||
{
|
||||
layout: 'tall' as const,
|
||||
decoration: 'wireframe-globe' as const,
|
||||
title: 'Onboarding and specialist training',
|
||||
body:
|
||||
'Adopting AI-powered systems is a methodological shift, not only a technical one. We provide dedicated programs for legal and medical teams to:',
|
||||
bullets: [
|
||||
'Improve interaction with search and summarization algorithms.',
|
||||
'Master voice commands and document workflow automation.',
|
||||
'Significantly reduce the technology learning curve.',
|
||||
],
|
||||
},
|
||||
{
|
||||
layout: 'wide' as const,
|
||||
title: 'Technical support and operational consulting',
|
||||
body:
|
||||
'We provide continuous, high-level assistance to ensure operational continuity. NexStudio is not just a support vendor, but a strategic partner for legal firms and healthcare organizations.',
|
||||
callout: {
|
||||
title: '“Breaking Glass” intervention',
|
||||
body:
|
||||
'For critical urgency or systemic incidents, we offer rapid-access and priority intervention protocols. This emergency procedure bypasses standard support flows to restore continuity as fast as possible.',
|
||||
},
|
||||
},
|
||||
{
|
||||
layout: 'default' as const,
|
||||
title: 'Custom extensions and integrations',
|
||||
body:
|
||||
'Although LexAura and MediAura are complete, ready-to-use products, complex organizations may still require specific interoperability needs.',
|
||||
bullets: [
|
||||
'API integration: we integrate our SaaS with your existing management systems.',
|
||||
'Custom modules: we build tailored extensions inside our product perimeter to support unique workflows.',
|
||||
],
|
||||
},
|
||||
{
|
||||
layout: 'default' as const,
|
||||
title: 'Evolutionary updates and maintenance',
|
||||
body:
|
||||
'AI and regulated frameworks evolve continuously. Our service includes ongoing analysis-engine updates to keep software aligned with new technologies and market requirements.',
|
||||
},
|
||||
],
|
||||
},
|
||||
th: {
|
||||
eyebrow: 'บริการของเรา',
|
||||
title: 'การติดตั้ง การพัฒนา และการสนับสนุน',
|
||||
lead:
|
||||
'ที่ NexStudio ความมุ่งมั่นของเราไม่ได้จบแค่การให้สิทธิ์ใช้งานซอฟต์แวร์ โมเดลบริการของเราช่วยให้ทีมงานดึงศักยภาพสูงสุดจาก AI ที่ผสานใน LexAura และ MediAura',
|
||||
cards: [
|
||||
{
|
||||
layout: 'tall' as const,
|
||||
decoration: 'wireframe-globe' as const,
|
||||
title: 'การเริ่มใช้งานและการอบรมเฉพาะทาง',
|
||||
body:
|
||||
'การนำระบบ AI มาใช้ต้องอาศัยการเปลี่ยนผ่านเชิงวิธีการ ไม่ใช่แค่เทคนิค เรามีโปรแกรมอบรมสำหรับทีมกฎหมายและการแพทย์เพื่อ:',
|
||||
bullets: [
|
||||
'เพิ่มประสิทธิภาพการใช้งานอัลกอริทึมค้นหาและสรุปผล',
|
||||
'ใช้งานคำสั่งเสียงและระบบงานเอกสารอัตโนมัติได้อย่างคล่องตัว',
|
||||
'ลดช่วงเวลาเรียนรู้เทคโนโลยีอย่างมีนัยสำคัญ',
|
||||
],
|
||||
},
|
||||
{
|
||||
layout: 'wide' as const,
|
||||
title: 'สนับสนุนทางเทคนิคและที่ปรึกษาการปฏิบัติงาน',
|
||||
body:
|
||||
'เราให้การสนับสนุนอย่างต่อเนื่องเพื่อคงความต่อเนื่องในการดำเนินงาน NexStudio ไม่ได้เป็นเพียงผู้ให้บริการซัพพอร์ต แต่เป็นพาร์ตเนอร์เชิงกลยุทธ์สำหรับองค์กร',
|
||||
callout: {
|
||||
title: 'การแทรกแซงแบบ “Breaking Glass”',
|
||||
body:
|
||||
'เมื่อเกิดเหตุเร่งด่วนหรือความผิดปกติระดับวิกฤต เรามีโปรโตคอลเข้าถึงด่วนและจัดลำดับความสำคัญสูงสุด เพื่อแก้ปัญหาได้ทันทีและรักษาความต่อเนื่องของบริการ',
|
||||
},
|
||||
},
|
||||
{
|
||||
layout: 'default' as const,
|
||||
title: 'ส่วนขยายและการเชื่อมต่อแบบกำหนดเอง',
|
||||
body:
|
||||
'แม้ LexAura และ MediAura จะพร้อมใช้งานทันที แต่บางองค์กรอาจต้องการการเชื่อมต่อเฉพาะทางกับระบบเดิม',
|
||||
bullets: [
|
||||
'API integration: เชื่อม SaaS ของเราเข้ากับระบบจัดการที่ใช้อยู่แล้ว',
|
||||
'Custom modules: ออกแบบส่วนขยายเฉพาะงานภายในขอบเขตผลิตภัณฑ์ของเรา',
|
||||
],
|
||||
},
|
||||
{
|
||||
layout: 'default' as const,
|
||||
title: 'อัปเดตและบำรุงรักษาเชิงพัฒนา',
|
||||
body:
|
||||
'โลกของ AI และข้อกำกับเปลี่ยนแปลงตลอดเวลา บริการของเรารวมถึงการอัปเดตเอนจินวิเคราะห์อย่างต่อเนื่องเพื่อให้ซอฟต์แวร์ทันสมัยและสอดคล้องบริบทตลาด',
|
||||
},
|
||||
],
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getServices = (locale: SupportedLocale) => servicesByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const services = servicesByLocale.it;
|
||||
|
||||
@ -1,6 +1,25 @@
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** Meta pagina principale — usato da BaseLayout */
|
||||
export const siteMeta = {
|
||||
const siteMetaByLocale = {
|
||||
it: {
|
||||
title: 'NexStudio — Ingegneria del software e IA per settori regolamentati',
|
||||
description:
|
||||
'NexStudio: software company con sede a Bangkok. SaaS ad alta complessità, integrazione di IA in flussi professionali, Legal Tech e Health Tech.',
|
||||
},
|
||||
en: {
|
||||
title: 'NexStudio — Software engineering and AI for regulated industries',
|
||||
description:
|
||||
'NexStudio is a software company based in Bangkok. We build high-complexity SaaS products and integrate AI into professional workflows across Legal Tech and Health Tech.',
|
||||
},
|
||||
th: {
|
||||
title: 'NexStudio — วิศวกรรมซอฟต์แวร์และ AI สำหรับอุตสาหกรรมที่มีข้อกำกับ',
|
||||
description:
|
||||
'NexStudio คือบริษัทซอฟต์แวร์ในกรุงเทพฯ พัฒนา SaaS ความซับซ้อนสูง และผสาน AI เข้ากับเวิร์กโฟลว์ระดับมืออาชีพในสาย Legal Tech และ Health Tech',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getSiteMeta = (locale: SupportedLocale) => siteMetaByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const siteMeta = siteMetaByLocale.it;
|
||||
|
||||
@ -1,9 +1,12 @@
|
||||
import type { SupportedLocale } from './navigation';
|
||||
|
||||
/** Sezione stack — infrastruttura Cloudflare e sicurezza */
|
||||
export const stackSection = {
|
||||
const stackIt = {
|
||||
eyebrow: 'Lo stack tecnologico',
|
||||
title: 'Infrastruttura e sicurezza',
|
||||
lead:
|
||||
'In NexStudio, la qualità dell’esperienza utente è inscindibile dalla solidità dell’infrastruttura. Per questo motivo ci affidiamo a partner globali ad alta efficienza che garantiscono i più elevati standard di disponibilità e protezione dei dati.',
|
||||
infrastructureHeading: 'Infrastruttura',
|
||||
cloudflare: {
|
||||
title: 'Ecosistema Cloudflare',
|
||||
intro:
|
||||
@ -145,3 +148,168 @@ export const stackSection = {
|
||||
] as const,
|
||||
},
|
||||
} as const;
|
||||
|
||||
const stackByLocale = {
|
||||
it: stackIt,
|
||||
en: {
|
||||
...stackIt,
|
||||
eyebrow: 'Technology stack',
|
||||
title: 'Infrastructure and security',
|
||||
lead:
|
||||
'At NexStudio, user experience quality is inseparable from infrastructure resilience. That is why we rely on high-efficiency global partners that provide strong availability and data protection standards.',
|
||||
infrastructureHeading: 'Infrastructure',
|
||||
cloudflare: {
|
||||
...stackIt.cloudflare,
|
||||
title: 'Cloudflare ecosystem',
|
||||
intro:
|
||||
'"Cloudflare helps accelerate performance, secure app availability, and optimize web experiences globally."',
|
||||
points: [
|
||||
{
|
||||
title: 'Performance without compromise',
|
||||
body:
|
||||
'Access to our services remains low-latency worldwide, ensuring fluid usage even during complex data-processing operations.',
|
||||
},
|
||||
{
|
||||
title: 'Advanced security',
|
||||
body:
|
||||
'We apply modern protection layers including end-to-end encryption, DDoS mitigation, and Web Application Firewall controls.',
|
||||
},
|
||||
{
|
||||
title: 'Compliance and data integrity',
|
||||
body:
|
||||
'We use geographic data-control capabilities to align legal and medical data processing with local and international privacy requirements.',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
continuity: {
|
||||
title: 'Continuity and scalability',
|
||||
body:
|
||||
'We provide professional-grade SLA uptime. Our cloud-native architecture scales instantly for workload peaks, large offices, and multi-site organizations.',
|
||||
},
|
||||
whyThisChoice: {
|
||||
title: 'Why NexStudio',
|
||||
points: [
|
||||
'Regulated vertical focus: we design for Legal Tech and Health Tech, where traceability, privacy, and service continuity are core product requirements.',
|
||||
'AI in real professional workflows: we embed models and automation with attention to accuracy, auditability, and human oversight.',
|
||||
'End-to-end responsibility: architecture, development, and evolution stay under one ownership model for clearer priorities and delivery.',
|
||||
] as const,
|
||||
},
|
||||
cloudflareBadge: {
|
||||
...stackIt.cloudflareBadge,
|
||||
label: 'Cloudflare ecosystem',
|
||||
slogan: '"Helping build a better Internet."',
|
||||
},
|
||||
awsBadge: {
|
||||
...stackIt.awsBadge,
|
||||
label: 'AWS ecosystem',
|
||||
slogan: '"The world’s most comprehensive and broadly adopted cloud platform."',
|
||||
},
|
||||
infrastructureCarousel: {
|
||||
...stackIt.infrastructureCarousel,
|
||||
ariaLabel: 'NexStudio infrastructure and technology partners',
|
||||
items: [
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[0],
|
||||
label: 'Cloudflare ecosystem',
|
||||
slogan: '"Helping build a better Internet."',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[1],
|
||||
label: 'AWS ecosystem',
|
||||
slogan: '"The world’s most comprehensive and broadly adopted cloud platform."',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[2],
|
||||
label: 'GitHub ecosystem',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[3],
|
||||
label: 'OpenAI ecosystem',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
},
|
||||
th: {
|
||||
...stackIt,
|
||||
eyebrow: 'เทคโนโลยีสแตก',
|
||||
title: 'โครงสร้างพื้นฐานและความปลอดภัย',
|
||||
lead:
|
||||
'ที่ NexStudio คุณภาพประสบการณ์ผู้ใช้แยกไม่ออกจากความมั่นคงของโครงสร้างพื้นฐาน เราจึงเลือกพาร์ตเนอร์ระดับโลกที่มีประสิทธิภาพสูงเพื่อให้ได้มาตรฐานด้านความพร้อมใช้งานและความปลอดภัยของข้อมูล',
|
||||
infrastructureHeading: 'โครงสร้างพื้นฐาน',
|
||||
cloudflare: {
|
||||
...stackIt.cloudflare,
|
||||
title: 'ระบบนิเวศ Cloudflare',
|
||||
intro:
|
||||
'"Cloudflare ช่วยเร่งประสิทธิภาพ รับประกันความพร้อมใช้งานของแอป และยกระดับประสบการณ์เว็บทั่วโลก"',
|
||||
points: [
|
||||
{
|
||||
title: 'ประสิทธิภาพที่ไม่ประนีประนอม',
|
||||
body:
|
||||
'เข้าถึงบริการของเราได้อย่างหน่วงต่ำจากทุกที่ทั่วโลก แม้ในงานประมวลผลข้อมูลที่ซับซ้อน',
|
||||
},
|
||||
{
|
||||
title: 'ความปลอดภัยขั้นสูง',
|
||||
body:
|
||||
'เราใช้กลไกป้องกันสมัยใหม่ เช่น การเข้ารหัส end-to-end การป้องกัน DDoS และ Web Application Firewall',
|
||||
},
|
||||
{
|
||||
title: 'การปฏิบัติตามข้อกำกับและความถูกต้องของข้อมูล',
|
||||
body:
|
||||
'เราใช้ความสามารถในการกำกับตำแหน่งข้อมูลเพื่อให้การจัดการข้อมูลอ่อนไหวด้านกฎหมายและการแพทย์สอดคล้องกับข้อกำกับความเป็นส่วนตัว',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
continuity: {
|
||||
title: 'ความต่อเนื่องและการขยายตัว',
|
||||
body:
|
||||
'เรารับประกัน uptime ระดับมืออาชีพตาม SLA และสถาปัตยกรรม cloud-native ที่ขยายได้ทันทีเมื่อมีโหลดสูง',
|
||||
},
|
||||
whyThisChoice: {
|
||||
title: 'ทำไมต้อง NexStudio',
|
||||
points: [
|
||||
'เชี่ยวชาญอุตสาหกรรมที่มีข้อกำกับ: Legal Tech และ Health Tech',
|
||||
'ผสาน AI เข้ากับงานจริง โดยคำนึงถึงความแม่นยำ การตรวจสอบย้อนหลัง และการกำกับโดยมนุษย์',
|
||||
'รับผิดชอบแบบ end-to-end: สถาปัตยกรรม การพัฒนา และการต่อยอดอยู่ภายใต้ทีมเดียว',
|
||||
] as const,
|
||||
},
|
||||
cloudflareBadge: {
|
||||
...stackIt.cloudflareBadge,
|
||||
label: 'ระบบนิเวศ Cloudflare',
|
||||
slogan: '"ช่วยกันสร้างอินเทอร์เน็ตที่ดีกว่า"',
|
||||
},
|
||||
awsBadge: {
|
||||
...stackIt.awsBadge,
|
||||
label: 'ระบบนิเวศ AWS',
|
||||
slogan: '"แพลตฟอร์มคลาวด์ที่ครอบคลุมและได้รับการใช้งานอย่างกว้างขวางที่สุดในโลก"',
|
||||
},
|
||||
infrastructureCarousel: {
|
||||
...stackIt.infrastructureCarousel,
|
||||
ariaLabel: 'พาร์ตเนอร์โครงสร้างพื้นฐานและเทคโนโลยีของ NexStudio',
|
||||
items: [
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[0],
|
||||
label: 'ระบบนิเวศ Cloudflare',
|
||||
slogan: '"ช่วยกันสร้างอินเทอร์เน็ตที่ดีกว่า"',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[1],
|
||||
label: 'ระบบนิเวศ AWS',
|
||||
slogan: '"แพลตฟอร์มคลาวด์ที่ครอบคลุมและได้รับการใช้งานอย่างกว้างขวางที่สุดในโลก"',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[2],
|
||||
label: 'ระบบนิเวศ GitHub',
|
||||
},
|
||||
{
|
||||
...stackIt.infrastructureCarousel.items[3],
|
||||
label: 'ระบบนิเวศ OpenAI',
|
||||
},
|
||||
] as const,
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const getStackSection = (locale: SupportedLocale) => stackByLocale[locale];
|
||||
|
||||
/** Retro-compatibilità: fallback italiano. */
|
||||
export const stackSection = stackByLocale.it;
|
||||
|
||||
@ -3,14 +3,14 @@
|
||||
* Questo file centralizza i contenuti della pagina /privacy per facilitare revisioni legali.
|
||||
*/
|
||||
export const privacyDocument = {
|
||||
version: '1.0',
|
||||
inVigoreDal: '22 aprile 2026',
|
||||
ultimoAggiornamento: '22 aprile 2026',
|
||||
version: '1.1',
|
||||
inVigoreDal: '[DATA]',
|
||||
ultimoAggiornamento: '[DATA]',
|
||||
} as const;
|
||||
|
||||
export const privacyCrossReferences = {
|
||||
lead:
|
||||
"L'informativa distingue il portale istituzionale NexStudio dai servizi SaaS LexAura e MediAura, che rispondono a esigenze operative e livelli di rischio differenti; le informative privacy specifiche dei singoli SaaS, pubblicate nei rispettivi siti/portali applicativi, restano il riferimento di dettaglio per l'uso del prodotto.",
|
||||
"L'informativa distingue il portale istituzionale NexStudio dai servizi SaaS LexAura e MediAura; le informative privacy specifiche dei singoli SaaS, pubblicate nei rispettivi portali applicativi, restano il riferimento di dettaglio per l'uso del prodotto.",
|
||||
} as const;
|
||||
|
||||
export const privacyRiferimenti: readonly { label: string; href: string }[] = [
|
||||
@ -24,6 +24,8 @@ export type PrivacySection = {
|
||||
title: string;
|
||||
paragraphs: readonly string[];
|
||||
bullets?: readonly string[];
|
||||
/** Paragrafi dopo l’elenco puntato (es. nota DPO in §2). */
|
||||
paragraphsAfterBullets?: readonly string[];
|
||||
};
|
||||
|
||||
export const privacySections: readonly PrivacySection[] = [
|
||||
@ -31,106 +33,112 @@ export const privacySections: readonly PrivacySection[] = [
|
||||
id: 'ambito',
|
||||
title: '1. Ambito della presente informativa',
|
||||
paragraphs: [
|
||||
"La presente informativa descrive il quadro generale con cui NexStudio tratta i dati personali raccolti tramite il sito istituzionale pubblico e i canali corporate (contatti, richieste demo, onboarding commerciale) collegati anche ai prodotti LexAura (Legal Tech) e MediAura (Health Tech).",
|
||||
"Per l'uso operativo dei SaaS (area riservata, tenant cliente, funzionalita' applicative), il livello di dettaglio e il ruolo privacy possono variare: NexStudio puo' operare come titolare, contitolare o responsabile del trattamento a seconda del servizio concretamente attivato e degli accordi contrattuali sottoscritti con il cliente business.",
|
||||
"La presente informativa descrive il quadro generale con cui NexStudio S.r.l. tratta i dati personali raccolti tramite il sito istituzionale pubblico e i canali corporate (collegati anche ai prodotti LexAura e MediAura).",
|
||||
"Per l'uso operativo dei SaaS, il livello di dettaglio e il ruolo privacy possono variare: NexStudio può operare come titolare, contitolare o responsabile del trattamento a seconda del servizio e degli accordi contrattuali.",
|
||||
"In caso di conflitto tra questa pagina e un Data Processing Agreement (DPA), un contratto quadro o condizioni speciali firmate, prevalgono i documenti contrattuali specifici per il servizio acquistato.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'titolare',
|
||||
title: "2. Identita' del titolare e punti di contatto",
|
||||
title: "2. Identità del titolare e punti di contatto",
|
||||
paragraphs: [
|
||||
"Titolare del trattamento: NexStudio (sede operativa a Bangkok, Thailandia). I dati anagrafici societari completi e il recapito privacy ufficiale sono indicati nei contatti istituzionali e nei documenti contrattuali applicabili.",
|
||||
"Canali per richieste privacy: sezione contatti del sito, recapito email privacy dedicato ove attivo, ed eventuali canali autenticati/ticket previsti per i clienti SaaS. Se nominato, il DPO/Privacy Lead e' indicato con i relativi contatti.",
|
||||
"Titolare del trattamento: NexStudio S.r.l., con sede legale in Italia, [INDIRIZZO_COMPLETO], P.IVA [DA_INSERIRE].",
|
||||
"Canali per richieste privacy:",
|
||||
],
|
||||
bullets: [
|
||||
'Email: privacy@nexstudio.com',
|
||||
'Form di contatto su nexstudio.ai',
|
||||
'Per i clienti SaaS: canali autenticati/ticket previsti nei rispettivi portali (LexAura, MediAura)',
|
||||
],
|
||||
paragraphsAfterBullets: [
|
||||
'Il Responsabile della Protezione dei Dati (DPO) è contattabile agli stessi recapiti.',
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'categorie-dati',
|
||||
title: '3. Categorie di dati trattati',
|
||||
paragraphs: [
|
||||
"Le categorie di dati variano in funzione del canale utilizzato e dei moduli/feature attivi. Di seguito il perimetro tipico a livello corporate; i dettagli di prodotto sono disciplinati nelle privacy dedicate dei singoli SaaS.",
|
||||
"Le categorie di dati variano in funzione del canale utilizzato e dei moduli/feature attivi.",
|
||||
],
|
||||
bullets: [
|
||||
"Portale NexStudio: dati di navigazione (log tecnici, IP, user agent), dati di contatto inviati volontariamente (nome, email, azienda, contenuto del messaggio), preferenze cookie e metriche aggregate.",
|
||||
"LexAura (Legal Tech): dati di account e profilo utente, metadati di workspace, documenti giuridici caricati o generati, richieste testuali ai motori di analisi/sintesi, log di audit su accessi e operazioni.",
|
||||
"MediAura (Health Tech): dati di account e ruoli, metadati organizzativi di struttura/reparto, documentazione sanitaria o amministrativa trattata nel servizio, input vocali e relative trascrizioni ove la funzione sia attivata, log tecnici e di sicurezza.",
|
||||
"MediAura (Health Tech): dati di account e ruoli, metadati organizzativi, documentazione sanitaria o amministrativa, input vocali e relative trascrizioni, log tecnici e di sicurezza.",
|
||||
"Categorie particolari ex art. 9 GDPR: possono emergere in MediAura (e, in specifici casi, in LexAura) quando i clienti caricano contenuti che includono dati sanitari o altri dati sensibili; il trattamento avviene solo nei limiti del servizio e delle istruzioni ricevute dal cliente titolare.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'finalita-basi',
|
||||
title: "4. Finalita' e basi giuridiche del trattamento",
|
||||
paragraphs: [
|
||||
"NexStudio tratta i dati personali per finalita' determinate e legittime, applicando la base giuridica adeguata al singolo trattamento.",
|
||||
],
|
||||
title: '4. Finalità e basi giuridiche del trattamento',
|
||||
paragraphs: [],
|
||||
bullets: [
|
||||
"Gestione del sito istituzionale, sicurezza e continuita' operativa (base: legittimo interesse alla sicurezza, prevenzione abusi e mantenimento del servizio).",
|
||||
"Gestione del sito istituzionale, sicurezza e continuità operativa (base: legittimo interesse alla sicurezza, prevenzione abusi e mantenimento del servizio).",
|
||||
"Gestione richieste pre-contrattuali, demo, contatti commerciali e supporto (base: misure precontrattuali su richiesta dell'interessato; legittimo interesse nella gestione B2B).",
|
||||
"Erogazione dei SaaS LexAura e MediAura, autenticazione utenti, gestione tenant e assistenza tecnica (base: esecuzione del contratto con il cliente business).",
|
||||
"Conformita' normativa, adempimenti amministrativi/fiscali, gestione contenziosi e difesa di diritti (base: obbligo legale e legittimo interesse alla tutela in giudizio).",
|
||||
"Conformità normativa, adempimenti amministrativi/fiscali, gestione contenziosi e difesa di diritti (base: obbligo legale e legittimo interesse alla tutela in giudizio).",
|
||||
"Comunicazioni marketing/newsletter, ove attive (base: consenso, salvo eccezioni di soft spam consentite dalla normativa applicabile).",
|
||||
"Attivita' di miglioramento del servizio, quality assurance e sviluppo funzionalita' IA con dati del cliente solo se previsto dal contratto o da istruzioni documentate; in assenza di tale base i dati non sono utilizzati per training generalista.",
|
||||
"Miglioramento del servizio e sviluppo funzionalità IA: solo se previsto dal contratto o da istruzioni documentate; in assenza di tale base i dati non sono utilizzati per training generalista.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'ruoli-saas',
|
||||
title: '5. Ruoli privacy specifici per LexAura e MediAura',
|
||||
paragraphs: [
|
||||
"Per i servizi SaaS B2B, il cliente (studio legale, impresa, struttura sanitaria, professionista) determina normalmente finalita' e mezzi del trattamento relativi ai dati caricati nel proprio ambiente applicativo, agendo come titolare del trattamento.",
|
||||
"NexStudio agisce di regola come responsabile del trattamento per conto del cliente, con nomina contrattuale e istruzioni documentate, limitando l'accesso ai dati al personale autorizzato che ne abbia necessita' operativa (supporto, manutenzione, sicurezza).",
|
||||
"Qualora NexStudio determini autonomamente finalita' specifiche (es. prevenzione frodi, sicurezza infrastrutturale, metriche aggregate non riconducibili al singolo interessato), agisce come titolare autonomo per tali trattamenti.",
|
||||
"Per i servizi SaaS B2B, il cliente determina normalmente finalità e mezzi del trattamento relativi ai dati caricati nel proprio ambiente applicativo, agendo come titolare del trattamento. NexStudio agisce di regola come responsabile del trattamento per conto del cliente, con nomina contrattuale e istruzioni documentate.",
|
||||
"Qualora NexStudio determini autonomamente finalità specifiche (es. prevenzione frodi, sicurezza infrastrutturale, metriche aggregate non riconducibili al singolo interessato), agisce come titolare autonomo per tali trattamenti.",
|
||||
"Le informative privacy dedicate di LexAura e MediAura, pubblicate nei rispettivi siti o ambienti applicativi, approfondiscono categorie dati, flussi, tempi di retention e basi giuridiche specifiche del singolo prodotto.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'conservazione',
|
||||
title: '6. Tempi di conservazione',
|
||||
paragraphs: [
|
||||
"I tempi di conservazione sono definiti in base a principio di minimizzazione, obblighi di legge e ciclo di vita del servizio. Durate puntuali possono essere regolate da contratto, configurazioni del cliente e policy interne.",
|
||||
],
|
||||
paragraphs: [],
|
||||
bullets: [
|
||||
"Dati di contatto dal sito: per il tempo necessario alla gestione della richiesta e, se pertinente, per il successivo follow-up commerciale entro termini ragionevoli.",
|
||||
"Dati di account SaaS: per tutta la durata del rapporto contrattuale e per il periodo tecnico-amministrativo necessario a chiusura, backup, audit e adempimenti post-contratto.",
|
||||
"Log tecnici e di sicurezza: retention proporzionata a monitoraggio, incident response, prevenzione abusi e dimostrazione di conformita'.",
|
||||
"Dati contrattuali/amministrativi: conservazione secondo i termini imposti dalla normativa fiscale, civilistica e regolatoria applicabile.",
|
||||
"Dati di contatto dal sito: 24 mesi dall'ultima interazione.",
|
||||
"Dati di account SaaS: per tutta la durata del rapporto contrattuale + 30 giorni dalla cancellazione.",
|
||||
"Log tecnici e di sicurezza: massimo 30 giorni.",
|
||||
"Dati di fatturazione: 10 anni come richiesto dalla normativa fiscale italiana.",
|
||||
"Dati sanitari: secondo le istruzioni del titolare (cliente) e gli obblighi di legge.",
|
||||
"Dati analitici aggregati: indefinitamente in forma anonima.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'destinatari',
|
||||
title: '7. Destinatari e categorie di soggetti autorizzati',
|
||||
paragraphs: [
|
||||
"I dati possono essere trattati da personale NexStudio autorizzato e istruito, nonche' da fornitori qualificati che operano come responsabili/sub-responsabili (es. hosting cloud, servizi infrastrutturali, monitoraggio sicurezza, strumenti di comunicazione e assistenza).",
|
||||
"L'elenco aggiornato dei responsabili e sub-responsabili rilevanti per i clienti SaaS e' messo a disposizione nei canali contrattuali o su richiesta, secondo quanto previsto dagli accordi in essere.",
|
||||
"I dati possono essere trattati da personale NexStudio autorizzato e istruito, nonché da fornitori qualificati che operano come responsabili/sub-responsabili (es. hosting cloud, servizi infrastrutturali, monitoraggio sicurezza, strumenti di comunicazione).",
|
||||
"L'elenco aggiornato dei responsabili e sub-responsabili rilevanti per i clienti SaaS è messo a disposizione nei canali contrattuali o su richiesta.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'trasferimenti',
|
||||
title: '8. Trasferimenti internazionali di dati',
|
||||
paragraphs: [
|
||||
"In ragione della struttura operativa internazionale e dell'uso di fornitori cloud globali, alcuni trattamenti possono comportare trasferimenti verso Paesi extra SEE/UE.",
|
||||
"Quando richiesto dalla normativa, NexStudio adotta garanzie adeguate (es. clausole contrattuali standard, misure supplementari tecniche/organizzative, valutazioni di impatto sul trasferimento) e limita il trasferimento ai soli dati necessari.",
|
||||
"In ragione dell'uso di fornitori cloud globali, alcuni trattamenti possono comportare trasferimenti verso Paesi extra SEE/UE. Quando richiesto dalla normativa, NexStudio adotta garanzie adeguate (es. clausole contrattuali standard, misure supplementari tecniche/organizzative, valutazioni di impatto sul trasferimento) e limita il trasferimento ai soli dati necessari.",
|
||||
"I dati sono preferibilmente trattati nello Spazio Economico Europeo. Cloudflare Inc. aderisce al Data Privacy Framework UE-USA e adotta Clausole Contrattuali Standard (SCC).",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'sicurezza',
|
||||
title: '9. Misure di sicurezza e governance',
|
||||
paragraphs: [
|
||||
"NexStudio adotta misure tecniche e organizzative proporzionate al rischio, con particolare attenzione ai contesti Legal Tech e Health Tech dove integrita', riservatezza e tracciabilita' sono requisiti essenziali.",
|
||||
"NexStudio adotta misure tecniche e organizzative proporzionate al rischio:",
|
||||
],
|
||||
bullets: [
|
||||
"Controlli di accesso basati su ruoli, autenticazione, segregazione logica degli ambienti cliente e principio del minimo privilegio.",
|
||||
"Cifratura dei dati in transito e, ove previsto dall'architettura, a riposo; gestione sicura delle chiavi e dei segreti applicativi.",
|
||||
"Logging, monitoraggio, audit trail e procedure di gestione incidenti con escalation interna e tracciamento delle azioni correttive.",
|
||||
"Procedure di backup, continuita' operativa e disaster recovery in funzione del piano di servizio sottoscritto.",
|
||||
"Cifratura dei dati in transito (TLS 1.3) e a riposo; gestione sicura delle chiavi.",
|
||||
"Logging, monitoraggio, audit trail e procedure di gestione incidenti.",
|
||||
"Procedure di backup, continuità operativa e disaster recovery.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'diritti',
|
||||
title: "10. Diritti degli interessati e modalita' di esercizio",
|
||||
title: "10. Diritti degli interessati e modalità di esercizio",
|
||||
paragraphs: [
|
||||
"Gli interessati possono esercitare i diritti previsti dalla normativa applicabile (accesso, rettifica, cancellazione, limitazione, opposizione, portabilita', revoca del consenso ove prestato, reclamo all'autorita' competente).",
|
||||
"Per dati trattati nel contesto dei SaaS, la richiesta va di norma indirizzata prima al cliente titolare (es. studio legale o struttura sanitaria) che determina finalita' e mezzi del trattamento. NexStudio fornisce supporto al cliente titolare secondo contratto.",
|
||||
"Per dati trattati da NexStudio come titolare (es. contatti dal sito, log di sicurezza propri), le richieste possono essere inviate ai recapiti privacy indicati in questa pagina o nella sezione contatti del sito.",
|
||||
"Gli interessati possono esercitare i diritti previsti dalla normativa applicabile (accesso, rettifica, cancellazione, limitazione, opposizione, portabilità, revoca del consenso, reclamo all'autorità competente).",
|
||||
"Per dati trattati nel contesto dei SaaS, la richiesta va di norma indirizzata prima al cliente titolare (es. studio legale o struttura sanitaria). NexStudio fornisce supporto al cliente titolare secondo contratto.",
|
||||
"Per dati trattati da NexStudio come titolare (es. contatti dal sito, log di sicurezza propri), le richieste possono essere inviate a privacy@nexstudio.com o tramite il form su nexstudio.ai.",
|
||||
"Autorità di controllo competente: Garante per la protezione dei dati personali (www.garanteprivacy.it).",
|
||||
],
|
||||
},
|
||||
{
|
||||
@ -138,23 +146,20 @@ export const privacySections: readonly PrivacySection[] = [
|
||||
title: '11. Cookie, analytics e tracciamenti',
|
||||
paragraphs: [
|
||||
"Le informazioni su cookie tecnici, eventuali cookie analitici e strumenti di tracciamento sono descritte nella Cookie Policy, da leggere congiuntamente alla presente informativa.",
|
||||
"La gestione delle preferenze cookie avviene tramite banner/strumenti dedicati, con possibilita' di revisione successiva delle scelte quando tecnicamente disponibile.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'minori',
|
||||
title: '12. Trattamento dati di minori',
|
||||
paragraphs: [
|
||||
"I servizi NexStudio sono progettati per un'utenza professionale e business. Non sono rivolti intenzionalmente a minori e non viene perseguita la raccolta volontaria di dati di minori al di fuori dei casi strettamente necessari e leciti nel contesto sanitario gestito dal cliente titolare.",
|
||||
"Se viene rilevata una raccolta non appropriata di dati riferibili a minori al di fuori delle basi giuridiche consentite, NexStudio adotta le misure necessarie per la cancellazione o la regolarizzazione del trattamento, coordinandosi con il cliente titolare ove necessario.",
|
||||
"I servizi NexStudio sono progettati per un'utenza professionale e business. Non sono rivolti intenzionalmente a minori.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'aggiornamenti',
|
||||
title: '13. Aggiornamenti della policy',
|
||||
paragraphs: [
|
||||
"NexStudio puo' aggiornare questa informativa per adeguamenti normativi, evoluzione dei servizi, modifiche organizzative o introduzione di nuove funzionalita'.",
|
||||
"Le modifiche rilevanti saranno pubblicate su questa pagina con aggiornamento di versione e data. Per i clienti SaaS, ulteriori notifiche possono essere fornite tramite canali contrattuali o in-app, quando previsto.",
|
||||
"NexStudio può aggiornare questa informativa per adeguamenti normativi, evoluzione dei servizi, modifiche organizzative o introduzione di nuove funzionalità. Le modifiche rilevanti saranno pubblicate su questa pagina con aggiornamento di versione e data.",
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
* Aggiornare versione e data in sync con la pagina (box in testa).
|
||||
*/
|
||||
export const termsDocument = {
|
||||
version: '1.0',
|
||||
inVigoreDal: '22 aprile 2026',
|
||||
version: '1.1',
|
||||
inVigoreDal: '[DATA]',
|
||||
} as const;
|
||||
|
||||
export type TermsSection = {
|
||||
@ -20,7 +20,7 @@ export const termsSections: readonly TermsSection[] = [
|
||||
id: 'premessa',
|
||||
title: '1. Premessa e ambito',
|
||||
paragraphs: [
|
||||
"Le presenti condizioni d’uso regolano l’accesso e la consultazione del sito web di NexStudio (di seguito «NexStudio», «noi») e dei contenuti informativi resi disponibili online. La sede operativa di riferimento è a Bangkok, Thailandia; i servizi software commerciali (inclusi prodotti e soluzioni per Legal Tech e Health Tech, ad es. le linee LexAura e MediAura) sono regolati da condizioni generali, ordini, offerte o accordi specifici sottoscritti con i clienti: in caso di conflitto tra il presente testo e un contratto B2B sottoscritto, prevalgono i documenti specifici del servizio e gli accordi contrattuali applicabili.",
|
||||
"Le presenti condizioni d’uso regolano l’accesso e la consultazione del sito web di NexStudio S.r.l. (di seguito «NexStudio», «noi»), con sede legale in Italia, [INDIRIZZO_COMPLETO]. I servizi software commerciali (inclusi i prodotti LexAura e MediAura) sono regolati da condizioni generali, ordini, offerte o accordi specifici sottoscritti con i clienti: in caso di conflitto tra il presente testo e un contratto B2B sottoscritto, prevalgono i documenti specifici del servizio e gli accordi contrattuali applicabili.",
|
||||
"Per il trattamento dei dati personali e i cookie si rimanda rispettivamente all’informativa privacy e alla cookie policy, citate più sotto.",
|
||||
],
|
||||
},
|
||||
@ -83,16 +83,16 @@ export const termsSections: readonly TermsSection[] = [
|
||||
},
|
||||
{
|
||||
id: 'legge',
|
||||
title: '9. Legge applicabile e foro (da confermare con il legale)',
|
||||
title: '9. Legge applicabile e foro competente',
|
||||
paragraphs: [
|
||||
"Salvo disposizioni inderogabili, le presenti condizioni e ogni contestazione inerente al sito informativo sono regolate dalla legge indicata qui sotto, con foro competente ove ammesso (da definire in base alla entità operativa, ai clienti e al mercato: es. Tailandia, o altra scelta con parere legale).",
|
||||
"Salvo disposizioni inderogabili a tutela del consumatore, le presenti condizioni e ogni contestazione inerente al sito informativo sono regolate dalla legge italiana. Il foro competente è Padova.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'contatti-termini',
|
||||
title: '10. Contatti in merito a queste condizioni',
|
||||
paragraphs: [
|
||||
"Per domande sulle presenti condizioni d’uso del sito, utilizzare i contatti e i canali indicati nel sito. Per trattamento dei dati personali e diritti, seguire l’informativa privacy; per cookie, la cookie policy.",
|
||||
"Per domande sulle presenti condizioni d’uso del sito, utilizzare i canali indicati nella sezione contatti del sito. Per trattamento dei dati personali e diritti: privacy@nexstudio.com o il form su nexstudio.ai.",
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
@ -106,5 +106,5 @@ export const termsRiferimenti: readonly { label: string; href: string }[] = [
|
||||
|
||||
export const termsCrossReferences = {
|
||||
leadNote:
|
||||
'I documenti collegati vanno allineati alla stessa data di revisione ove si tratti di un pacchetto unico di pubblicazione; per LexAura e MediAura, le informative privacy dedicate pubblicate sui portali SaaS restano il riferimento di dettaglio del singolo prodotto.',
|
||||
"Per LexAura e MediAura, le informative privacy dedicate pubblicate sui rispettivi portali SaaS restano il riferimento di dettaglio del singolo prodotto.",
|
||||
} as const;
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
---
|
||||
import '../styles/global.css';
|
||||
import globalStylesheetHref from '../styles/global.css?url';
|
||||
import CookieConsent from '../components/CookieConsent.astro';
|
||||
import ChatGateModal from '../components/ChatGateModal.astro';
|
||||
|
||||
@ -36,6 +37,7 @@ const canonicalUrl = Astro.url.toString();
|
||||
<meta name="twitter:description" content={description} />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<link rel="stylesheet" href={globalStylesheetHref} />
|
||||
<title>{title}</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
---
|
||||
import BaseLayout from './BaseLayout.astro';
|
||||
import SiteFooter from '../components/SiteFooter.astro';
|
||||
import { getNavigation } from '../data/home';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
@ -29,7 +30,8 @@ const printDate = new Intl.DateTimeFormat('it-IT', {
|
||||
const printSource = Astro.url.href;
|
||||
const path = Astro.url.pathname;
|
||||
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||
const currentLocale = localeMatch?.[1] ?? 'it';
|
||||
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
|
||||
const navigation = getNavigation(currentLocale);
|
||||
const strippedPath = path.replace(/^\/(en|th)(?=\/|$)/, '') || '/';
|
||||
const localeHref = (locale: 'it' | 'en' | 'th') => {
|
||||
if (locale === 'it') return strippedPath;
|
||||
@ -71,7 +73,7 @@ const langMeta = {
|
||||
<details class="relative" data-lang-dropdown>
|
||||
<summary
|
||||
class="inline-flex h-10 cursor-pointer list-none items-center gap-2 rounded-lg border border-nx-border/80 bg-nx-bg/50 px-3 text-xs font-medium text-nx-fg transition-colors hover:border-sky-500/35 hover:text-white"
|
||||
aria-label="Seleziona lingua"
|
||||
aria-label={navigation.labels.languageSelectorAria}
|
||||
>
|
||||
<img src={langMeta[currentLocale].flagSrc} alt="" class="h-3.5 w-5 rounded-[2px] object-cover" loading="lazy" decoding="async" />
|
||||
<span>{langMeta[currentLocale].code}</span>
|
||||
@ -129,7 +131,7 @@ const langMeta = {
|
||||
</details>
|
||||
<a
|
||||
class="text-sm font-medium text-sky-400/90 hover:text-sky-300"
|
||||
href={localize('/#contatti')}>Contattaci</a
|
||||
href={localize('/#contatti')}>{navigation.items[4]?.label ?? 'Contattaci'}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -82,12 +82,9 @@ async function sendWithResend(apiKey: string, fromEmail: string, toEmail: string
|
||||
function resolveDepartmentRecipient(runtimeEnv: RuntimeEnv, defaultRecipient: string, department: string): string {
|
||||
const normalized = department.trim().toLowerCase();
|
||||
const map: Record<string, string> = {
|
||||
support: readEnv('CONTACT_FORM_TO_EMAIL_SUPPORT', runtimeEnv),
|
||||
info: readEnv('CONTACT_FORM_TO_EMAIL_INFO', runtimeEnv) || defaultRecipient,
|
||||
privacy: readEnv('CONTACT_FORM_TO_EMAIL_PRIVACY', runtimeEnv),
|
||||
security: readEnv('CONTACT_FORM_TO_EMAIL_SECURITY', runtimeEnv),
|
||||
ethics: readEnv('CONTACT_FORM_TO_EMAIL_ETHICS', runtimeEnv),
|
||||
legal: readEnv('CONTACT_FORM_TO_EMAIL_LEGAL', runtimeEnv),
|
||||
hr: readEnv('CONTACT_FORM_TO_EMAIL_HR', runtimeEnv),
|
||||
careers: readEnv('CONTACT_FORM_TO_EMAIL_CAREERS', runtimeEnv),
|
||||
};
|
||||
return map[normalized] || defaultRecipient;
|
||||
}
|
||||
@ -111,7 +108,7 @@ export const POST: APIRoute = async ({ request, locals, url }) => {
|
||||
const company = required(form.get('company'));
|
||||
const email = required(form.get('email'));
|
||||
const country = required(form.get('country'));
|
||||
const department = required(form.get('department')) || 'general';
|
||||
const department = required(form.get('department')) || 'info';
|
||||
const message = required(form.get('message'));
|
||||
|
||||
if (!name || !email || !country || !message) {
|
||||
|
||||
@ -1,24 +1,30 @@
|
||||
---
|
||||
import SubpageLayout from '../layouts/SubpageLayout.astro';
|
||||
import { cookieConsentMeta, cookieCategories } from '../data/cookie-consent';
|
||||
import { cookieConsentMeta } from '../data/cookie-consent';
|
||||
|
||||
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
|
||||
const tbl = 'mt-4 w-full border-collapse text-left text-sm';
|
||||
const th = 'border border-nx-border bg-nx-surface/60 px-3 py-2 font-semibold text-nx-fg';
|
||||
const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
|
||||
const riferimenti = [
|
||||
{ label: 'Informativa privacy', href: '/privacy' },
|
||||
{ label: "Condizioni d'uso", href: '/terms' },
|
||||
{ label: 'Diritti GDPR', href: '/gdpr' },
|
||||
] as const;
|
||||
---
|
||||
|
||||
<SubpageLayout
|
||||
title="Cookie Policy — NexStudio"
|
||||
description="Cookie Policy NexStudio: categorie, base giuridica, consenso, terze parti, diritti e contatti. Sede Bangkok."
|
||||
description="Cookie Policy NexStudio S.r.l.: categorie, base giuridica, consenso, terze parti, diritti e contatti. Sede legale in Italia."
|
||||
heading="Cookie Policy"
|
||||
lead="Per NexStudio, con sede a Bangkok, Thailandia. Versione documento 1.0, in vigore dal 21 aprile 2026. Integra l'uso del modulo di consenso first-party descritto sotto; per il trattamento dei dati personali vedi l'informativa privacy."
|
||||
lead="Titolare del trattamento: NexStudio S.r.l., con sede legale in Italia, [INDIRIZZO_COMPLETO]."
|
||||
>
|
||||
<div class="[&_h3]:mt-6 [&_h3]:text-base [&_h3]:font-semibold [&_h3]:text-nx-fg">
|
||||
<p class="border-l-2 border-sky-500/35 pl-4 text-sm leading-relaxed text-nx-muted">
|
||||
<span class="font-medium text-nx-fg">Versione</span> 1.0
|
||||
<span class="font-medium text-nx-fg">Versione</span> 1.1
|
||||
<span class="text-nx-muted/80"> · </span>
|
||||
<span class="font-medium text-nx-fg">In vigore dal</span> 21 aprile 2026
|
||||
<span class="font-medium text-nx-fg">In vigore dal</span> [DATA]
|
||||
<span class="text-nx-muted/80"> · </span>
|
||||
<span class="font-medium text-nx-fg">Versione tecnica consenso</span>{' '}
|
||||
<code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
|
||||
@ -26,13 +32,25 @@ const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
>
|
||||
</p>
|
||||
|
||||
<p class="!mt-5 text-sm text-nx-muted sm:text-base">
|
||||
Documenti connessi:{' '}
|
||||
{
|
||||
riferimenti.map((r, i) => (
|
||||
<span>
|
||||
{i > 0 && <span class="text-nx-muted/80"> · </span>}
|
||||
<a class={link} href={r.href}>{r.label}</a>
|
||||
</span>
|
||||
))
|
||||
}
|
||||
</p>
|
||||
|
||||
<h2 id="indice" class="!mt-8">Indice</h2>
|
||||
<ol class="!mt-3 list-decimal space-y-1.5 pl-5 text-sm leading-relaxed sm:text-base">
|
||||
<li><a class={link} href="#premessa">Premessa</a></li>
|
||||
<li><a class={link} href="#definizioni">Definizioni</a></li>
|
||||
<li><a class={link} href="#finalita">Finalità dei cookie e categorie</a></li>
|
||||
<li><a class={link} href="#elenco">Elenco dei cookie (modello da compilare)</a></li>
|
||||
<li><a class={link} href="#sanitario-legale">Base giuridica e ambito sanitario/legale</a></li>
|
||||
<li><a class={link} href="#elenco">Elenco dei cookie utilizzati</a></li>
|
||||
<li><a class={link} href="#base-giuridica">Base giuridica</a></li>
|
||||
<li><a class={link} href="#consenso">Modalità di raccolta del consenso e registro</a></li>
|
||||
<li><a class={link} href="#revoca">Gestione e revoca del consenso</a></li>
|
||||
<li><a class={link} href="#browser">Disabilitazione via browser e impatto</a></li>
|
||||
@ -45,23 +63,21 @@ const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
<li><a class={link} href="#effetti">Effetti di rifiuto o accettazione</a></li>
|
||||
<li><a class={link} href="#modifiche">Modifiche alla Cookie Policy</a></li>
|
||||
<li><a class={link} href="#diritti">Diritti degli interessati e contatti</a></li>
|
||||
<li><a class={link} href="#appendice-tabella">Registro dei cookie (appendice)</a></li>
|
||||
<li><a class={link} href="#implementazione">Implementazione tecnica e strumenti</a></li>
|
||||
<li><a class={link} href="#test-qc">Test e controllo qualità</a></li>
|
||||
<li><a class={link} href="#banner-testi">Esempio di testi per il banner (IT / EN)</a></li>
|
||||
<li><a class={link} href="#note-legali">Note legali</a></li>
|
||||
<li><a class={link} href="#versioning">Versioning e storico revisioni</a></li>
|
||||
</ol>
|
||||
|
||||
<h2 id="premessa">1. Premessa</h2>
|
||||
<p>
|
||||
Questa Cookie Policy descrive le tipologie di cookie e tecnologie simili utilizzate sul sito
|
||||
web di <strong>NexStudio</strong> (di seguito «Società», «noi»), con sede a Bangkok,
|
||||
Thailandia, e spiega come gestire le preferenze. Per il trattamento dei dati personali e per i
|
||||
diritti degli interessati si rimanda all’<a class={link} href="/privacy"
|
||||
web di NexStudio S.r.l. (di seguito «NexStudio», «noi»), con sede legale in Italia,
|
||||
[INDIRIZZO_COMPLETO], e spiega come gestire le preferenze. Per il trattamento dei dati
|
||||
personali e per i diritti degli interessati si rimanda all’<a class={link} href="/privacy"
|
||||
>Informativa privacy</a
|
||||
>.
|
||||
</p>
|
||||
<p>
|
||||
Per le cookie policy dei prodotti SaaS LexAura e MediAura, consultare le rispettive pagine sui
|
||||
portali dedicati.
|
||||
</p>
|
||||
|
||||
<h2 id="definizioni">2. Definizioni</h2>
|
||||
<ul>
|
||||
@ -78,89 +94,46 @@ const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
</li>
|
||||
<li>
|
||||
<strong>Tecnologie simili:</strong> web beacon, pixel, <em>local storage</em>, e in generale
|
||||
identificatori lato client. Tecnologie invasive (es. fingerprinting) richiedono base legale
|
||||
adeguata e massima trasparenza.
|
||||
identificatori lato client.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="finalita">3. Finalità dei cookie e categorie</h2>
|
||||
<p>I cookie sul sito possono essere raggruppati come segue.</p>
|
||||
|
||||
<h3>3.1 Cookie strettamente necessari (essenziali)</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Finalità:</strong> navigazione, sicurezza, gestione sessione ove prevista,
|
||||
memorizzazione delle preferenze di consenso.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Base giuridica:</strong> esecuzione di misure precontrattuali / necessità tecnica e,
|
||||
ove applicabile, interesse legittimo limitato al funzionamento del servizio richiesto
|
||||
dall’utente.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Esempi tipici:</strong> token di sessione, cookie anti-CSRF, chiave di consenso in
|
||||
<em>local storage</em> (se usata al posto di cookie HTTP).
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<strong>Finalità:</strong> navigazione, sicurezza, gestione sessione, memorizzazione delle
|
||||
preferenze di consenso. <strong>Base giuridica:</strong> legittimo interesse del titolare
|
||||
(Art. 6.1.f GDPR) a garantire il funzionamento del servizio richiesto dall’utente.
|
||||
</p>
|
||||
|
||||
<h3>3.2 Cookie di preferenza / funzionali</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Finalità:</strong> lingua, regione, tema o altre impostazioni di interfaccia non
|
||||
strettamente indispensabili.
|
||||
</li>
|
||||
<li><strong>Base giuridica:</strong> consenso, salvo trattamenti minimi e non invasivi.</li>
|
||||
<li><strong>Esempi:</strong> <code class="font-mono text-xs text-sky-300/90">lang</code>, preferenze UI.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<strong>Finalità:</strong> lingua, regione, tema o altre impostazioni di interfaccia.{' '}
|
||||
<strong>Base giuridica:</strong> consenso (Art. 6.1.a GDPR).
|
||||
</p>
|
||||
|
||||
<h3>3.3 Cookie di performance / analytics</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Finalità:</strong> statistiche aggregate su visite e percorsi per migliorare il
|
||||
sito.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Base giuridica:</strong> consenso, salvo misurazione strettamente anonimizzata e
|
||||
non identificativa secondo orientamenti applicabili.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Esempi:</strong> <code class="font-mono text-xs text-sky-300/90">_ga</code>, <code
|
||||
class="font-mono text-xs text-sky-300/90">_gid</code
|
||||
> (Google Analytics), strumenti tipo Hotjar, se integrati.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<strong>Finalità:</strong> statistiche aggregate su visite e percorsi per migliorare il sito.{' '}
|
||||
<strong>Base giuridica:</strong> consenso (Art. 6.1.a GDPR).
|
||||
</p>
|
||||
|
||||
<h3>3.4 Cookie per advertising e targeting</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Finalità:</strong> pubblicità mirata, remarketing, misura delle campagne.
|
||||
</li>
|
||||
<li><strong>Base giuridica:</strong> consenso esplicito.</li>
|
||||
<li>
|
||||
<strong>Esempi:</strong> identificatori di reti pubblicitarie, pixel di retargeting, cookie
|
||||
DSP.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<strong>Finalità:</strong> pubblicità mirata, remarketing, misura delle campagne.{' '}
|
||||
<strong>Base giuridica:</strong> consenso esplicito.
|
||||
</p>
|
||||
|
||||
<h3>3.5 Cookie di terze parti e integrazioni social</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Finalità:</strong> video incorporati, pulsanti social, mappe, chat di terze parti.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Nota:</strong> il trattamento da parte di terzi è regolato dalle rispettive policy;
|
||||
NexStudio non controlla cookie impostati senza adeguata configurazione e consenso.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="elenco">4. Elenco dei cookie utilizzati (modello da compilare)</h2>
|
||||
<p>
|
||||
Per ogni cookie reale indicare: nome, fornitore, categoria, finalità, durata, prima o terza
|
||||
parte, base giuridica, link alla privacy del fornitore e, se utile, opt-out.
|
||||
<strong>Finalità:</strong> video incorporati, pulsanti social, mappe, chat di terze parti. Il
|
||||
trattamento da parte di terzi è regolato dalle rispettive policy.
|
||||
</p>
|
||||
|
||||
<h2 id="elenco">4. Elenco dei cookie utilizzati</h2>
|
||||
<p>
|
||||
La tabella sotto è <strong>esemplificativa</strong>: va sostituita con l’inventario aggiornato
|
||||
(ideale: hash o versione e data di aggiornamento in calce alla tabella pubblicata).
|
||||
Elenco in appendice tecnica (da mantenere aggiornato con scansione periodica).
|
||||
</p>
|
||||
<table class={tbl}>
|
||||
<thead>
|
||||
@ -175,54 +148,26 @@ const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class={td}><code class="font-mono text-xs">_ga</code> (es.)</td>
|
||||
<td class={td}>Google LLC</td>
|
||||
<td class={td}>Analytics</td>
|
||||
<td class={td}>24 mesi (tipico)</td>
|
||||
<td class={td}>3rd</td>
|
||||
<td class={td}>Consenso</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class={td}>
|
||||
<code class="font-mono text-xs">{cookieConsentMeta.storageKey}</code> (non cookie HTTP)
|
||||
<td class={td} colspan="6">
|
||||
<em>Da compilare dopo scansione del sito in staging e produzione.</em>
|
||||
</td>
|
||||
<td class={td}>NexStudio</td>
|
||||
<td class={td}>Necessario</td>
|
||||
<td class={td}>Fino a revoca / aggiornamento policy</td>
|
||||
<td class={td}>1st (local)</td>
|
||||
<td class={td}>Necessario / consenso informato</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class={td}><code class="font-mono text-xs">_fbp</code> (es.)</td>
|
||||
<td class={td}>Meta</td>
|
||||
<td class={td}>Advertising</td>
|
||||
<td class={td}>90 giorni (tipico)</td>
|
||||
<td class={td}>3rd</td>
|
||||
<td class={td}>Consenso</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 id="sanitario-legale">5. Base giuridica e trattamento in ambito sanitario o legale</h2>
|
||||
<h2 id="base-giuridica">5. Base giuridica</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Per cookie che comportano trattamento di dati particolari (salute, dati giudiziari o
|
||||
assimilabili) è richiesto <strong>consenso esplicito</strong> informato e misure tecniche e
|
||||
organizzative aggiuntive, salvo diversa base prevista dalla legge applicabile.
|
||||
Cookie tecnici essenziali: legittimo interesse del titolare (Art. 6.1.f GDPR).
|
||||
</li>
|
||||
<li>
|
||||
Nei servizi SaaS medico-legali la raccolta tramite cookie sul sito vetrina è da
|
||||
<strong>limitare e segregare</strong>; per test e analytics privilegiare dati sintetici o
|
||||
anonimizzazione efficace.
|
||||
Cookie analitici e di marketing: consenso libero, informato e revocabile (Art. 6.1.a GDPR).
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="consenso">6. Modalità di raccolta del consenso e registro</h2>
|
||||
<p>
|
||||
Il sito utilizza una <strong>CMP first-party</strong> sviluppata per NexStudio, orientata ai
|
||||
requisiti di trasparenza e granularità (inclusi riferimenti GDPR e PDPA tailandese come quadro
|
||||
di riferimento per le descrizioni). Al primo accesso, o dopo aumento della versione della
|
||||
policy tecnica, viene mostrato un banner con:
|
||||
Il sito utilizza una CMP first-party. Al primo accesso viene mostrato un banner con:
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>Rifiuta non essenziali</strong></li>
|
||||
@ -230,232 +175,78 @@ const td = 'border border-nx-border px-3 py-2 align-top text-nx-muted';
|
||||
<li><strong>Accetta tutto</strong></li>
|
||||
</ul>
|
||||
<p>
|
||||
La prova della scelta è memorizzata nel browser in <em>local storage</em> alla chiave{' '}
|
||||
<code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
|
||||
>{cookieConsentMeta.storageKey}</code
|
||||
>, con versione <code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
|
||||
>v{cookieConsentMeta.policyVersion}</code
|
||||
>, timestamp di aggiornamento e stato per categoria. I cookie strettamente necessari possono
|
||||
restare attivi compatibilmente con informativa chiara. Per audit avanzati si può integrare in
|
||||
futuro un log lato server (IP, user-agent, ID sessione) con informativa dedicata.
|
||||
</p>
|
||||
<p class="font-medium text-nx-fg">Categorie gestite dal modulo attuale</p>
|
||||
<ul>
|
||||
{
|
||||
cookieCategories.map((c) => (
|
||||
<li>
|
||||
<strong class="text-nx-fg">{c.label}</strong>
|
||||
{c.required ? ' — sempre attiva.' : ' — attiva solo se accettata.'}{' '}
|
||||
{c.description}
|
||||
</li>
|
||||
))
|
||||
}
|
||||
</ul>
|
||||
<p>
|
||||
Il codice espone <code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
|
||||
>window.NexStudioCookieConsent</code
|
||||
> e l’evento <code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
|
||||
>nexstudio:cookie-consent</code
|
||||
> per caricare script non necessari solo dopo consenso.
|
||||
La prova della scelta è memorizzata nel browser in <em>local storage</em>.
|
||||
</p>
|
||||
|
||||
<h2 id="revoca">7. Gestione e revoca del consenso</h2>
|
||||
<ul>
|
||||
<li>Tramite il banner o il pannello <strong>Personalizza</strong> al primo accesso.</li>
|
||||
<li>
|
||||
In qualsiasi momento tramite <strong>Impostazioni cookie</strong> nel footer del sito (sotto
|
||||
le colonne di navigazione).
|
||||
</li>
|
||||
<li>
|
||||
Cancellando i dati locali del sito dalle impostazioni del browser (inclusa la voce di{' '}
|
||||
<em>local storage</em> citata sopra): al successivo caricamento il banner si ripresenta.
|
||||
In qualsiasi momento tramite <strong>Impostazioni cookie</strong> nel footer del sito.
|
||||
</li>
|
||||
<li>Cancellando i dati locali del sito dalle impostazioni del browser.</li>
|
||||
</ul>
|
||||
<p>
|
||||
Dopo la revoca non devono essere impostati cookie non essenziali; alcune funzioni (es.
|
||||
preferenze memorizzate, statistiche) possono risultare limitate.
|
||||
</p>
|
||||
|
||||
<h2 id="browser">8. Disabilitazione via browser e impatto</h2>
|
||||
<p>
|
||||
È possibile bloccare o cancellare i cookie dalle impostazioni del browser (Chrome, Firefox,
|
||||
Safari, Edge e altri). Disabilitando i cookie possono smettere di funzionare login, preferenze
|
||||
o strumenti che ne dipendono.
|
||||
Safari, Edge e altri).
|
||||
</p>
|
||||
|
||||
<h2 id="terze-parti">9. Cookie di terze parti e responsabilità</h2>
|
||||
<p>
|
||||
Il sito può integrare strumenti di terze parti (analytics, CDN, social, gateway di pagamento,
|
||||
video). Le terze parti possono impostare cookie propri e trattare dati secondo le loro policy.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Esempi di fornitori</strong> spesso usati in contesti analoghi (elenco da adattare al
|
||||
sito reale): Google Analytics, Google Tag Manager, Cloudflare, Stripe, Vimeo, YouTube, Meta,
|
||||
LinkedIn, Hotjar. Per ciascuno vanno indicati link a privacy/cookie policy e strumenti di
|
||||
opt-out ove disponibili.
|
||||
Il sito può integrare strumenti di terze parti (analytics, CDN, social). Le terze parti
|
||||
possono impostare cookie propri e trattare dati secondo le loro policy.
|
||||
</p>
|
||||
|
||||
<h2 id="retention">10. Conservazione e criteri di retention</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Le durate dei singoli cookie seguono le tabelle pubblicate e le policy dei fornitori (es.
|
||||
finestra indicativa <strong>24 mesi</strong> per dati aggregati di analytics, salvo obblighi
|
||||
di legge o contratto diversi — da confermare con il legale).
|
||||
</li>
|
||||
<li>
|
||||
Prove di consenso e gestione DSR: periodi di conservazione da definire nella retention
|
||||
policy (orientamento comune per documentazione di conformità: <strong
|
||||
>3–7 anni</strong
|
||||
>, da calibrare su base legale e rischio — non vincolante in questa pagina).
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Le durate dei singoli cookie seguono le tabelle pubblicate e le policy dei fornitori. Cookie
|
||||
di consenso: 365 giorni, rinnovabili. Log di sicurezza: massimo 30 giorni.
|
||||
</p>
|
||||
|
||||
<h2 id="trasferimenti">11. Trasferimenti internazionali</h2>
|
||||
<p>
|
||||
Alcuni fornitori possono trattare dati in Paesi terzi (es. Stati Uniti). Ove applicabile si
|
||||
adottano garanzie come clausole contrattuali standard, decisioni di adeguatezza o altre basi
|
||||
previste dalla legge. Per dettagli su trasferimenti specifici contattare il referente privacy
|
||||
indicato sotto.
|
||||
previste dalla legge.
|
||||
</p>
|
||||
|
||||
<h2 id="minori">12. Minori età</h2>
|
||||
<p>
|
||||
Il sito non è rivolto alla raccolta intenzionale di dati di minori. Per utenti sotto la soglia
|
||||
prevista dalla legge locale, i trattamenti non essenziali richiedono consenso del titore
|
||||
della responsabilità genitoriale ove imposto dalla normativa applicabile.
|
||||
</p>
|
||||
<p>Il sito non è rivolto alla raccolta intenzionale di dati di minori.</p>
|
||||
|
||||
<h2 id="sicurezza">13. Misure di sicurezza</h2>
|
||||
<p>
|
||||
Si applicano misure tecniche e organizzative appropriate: trasmissione su TLS, accesso
|
||||
limitato ai log, principio di minimizzazione, monitoraggio anomalie ove in uso.
|
||||
limitato ai log, principio di minimizzazione.
|
||||
</p>
|
||||
|
||||
<h2 id="advertising">14. Consenso per scopi pubblicitari e profiling</h2>
|
||||
<p>
|
||||
Profilazione e pubblicità comportano <strong>consenso esplicito</strong> e tracciabilità
|
||||
della scelta. Ove si usino reti pubblicitarie, fornire link agli strumenti di opt-out del
|
||||
fornitore (es. impostazioni annunci Google).
|
||||
Profilazione e pubblicità comportano consenso esplicito e tracciabilità della scelta.
|
||||
</p>
|
||||
|
||||
<h2 id="effetti">15. Effetti di rifiuto o accettazione</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Accettando</strong> le categorie opzionali si abilitano preferenze avanzate,
|
||||
analytics e, se configurate, funzioni di marketing.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Rifiutando</strong> i non essenziali il sito resta navigabile con funzioni core; le
|
||||
altre possono essere limitate.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Accettando le categorie opzionali si abilitano preferenze avanzate, analytics e funzioni di
|
||||
marketing. Rifiutando i non essenziali il sito resta navigabile.
|
||||
</p>
|
||||
|
||||
<h2 id="modifiche">16. Modifiche alla Cookie Policy</h2>
|
||||
<p>
|
||||
La Policy può essere aggiornata quando cambiano cookie, fornitori o norme. Sarà indicata la
|
||||
data di revisione; ove richiesto dalla legge o dall’impatto del cambiamento, si richiederà un
|
||||
nuovo consenso (incrementando la versione tecnica nel modulo).
|
||||
data di revisione.
|
||||
</p>
|
||||
|
||||
<h2 id="diritti">17. Diritti degli interessati e contatti</h2>
|
||||
<p>
|
||||
Diritti: accesso, rettifica, cancellazione, limitazione, portabilità, opposizione e revoca del
|
||||
consenso ove previsti. Per esercitarli: <a class={link} href="mailto:privacy@nexstudio.com"
|
||||
>privacy@nexstudio.com</a
|
||||
> (DPO o referente privacy, da formalizzare).
|
||||
consenso. Per esercitarli:{' '}
|
||||
<a class={link} href="mailto:privacy@nexstudio.com">privacy@nexstudio.com</a>
|
||||
{' '}e tramite il form su nexstudio.ai. Autorità di controllo: Garante per la protezione dei
|
||||
dati personali (<a class={link} href="https://www.garanteprivacy.it" target="_blank" rel="noopener noreferrer"
|
||||
>www.garanteprivacy.it</a
|
||||
>).
|
||||
</p>
|
||||
|
||||
<h2 id="appendice-tabella">18. Registro dei cookie e informazioni tecniche (appendice)</h2>
|
||||
<p>
|
||||
Pubblicare qui la tabella completa con colonne: nome, provider, categoria, descrizione
|
||||
tecnica, durata, 1st/3rd, link opt-out, link privacy, note (GTM, embed, CDN, ecc.).
|
||||
</p>
|
||||
<table class={tbl}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class={th}>Nome</th>
|
||||
<th class={th}>Provider</th>
|
||||
<th class={th}>Categoria</th>
|
||||
<th class={th}>Scopo / durata</th>
|
||||
<th class={th}>Note</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class={td} colspan="5">
|
||||
<em>Da compilare dopo scansione del sito in staging e produzione.</em>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 id="implementazione">19. Implementazione tecnica e strumenti</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>CMP:</strong> modulo first-party NexStudio (nessun OneTrust/Cookiebot obbligatorio
|
||||
in questa build); estensibile verso CMP commerciali se richiesto da clienti o policy
|
||||
aziendale.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Log consenso:</strong> attualmente payload JSON in <em>local storage</em> con
|
||||
versione policy, timestamp ISO e booleani per categoria; valutare integrazione server-side
|
||||
per audit e correlazione sessione.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Banner:</strong> testo breve, link a questa Cookie Policy, tre azioni come da §6.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Sviluppo:</strong> caricare script di analytics, marketing o embed solo dopo lettura
|
||||
del consenso tramite API/evento sopra citati.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="test-qc">20. Test e controllo qualità</h2>
|
||||
<ul>
|
||||
<li>Scansione periodica del sito per elenco cookie (strumenti automatici + revisione manuale).</li>
|
||||
<li>Allineamento tra tabella pubblicata, CMP e script effettivamente caricati.</li>
|
||||
<li>Audit trimestrale delle terze parti e aggiornamento categorie/testi.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="banner-testi">21. Esempio di testi per il banner (IT / EN)</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Italiano (allineato al sito):</strong> «Utilizziamo cookie e memorizzazione locale.
|
||||
Seleziona le categorie che preferisci. I necessari restano attivi per registrare la tua
|
||||
scelta. Dettagli nell’informativa cookie.» — pulsanti: <strong>Rifiuta non essenziali</strong
|
||||
>, <strong>Personalizza</strong>, <strong>Accetta tutto</strong>.
|
||||
</li>
|
||||
<li>
|
||||
<strong>English (per versione bilingue futura):</strong> «We use cookies and local storage.
|
||||
Choose the categories you prefer. Necessary ones stay on to record your choice. See our
|
||||
cookie policy.» — <strong>Reject non-essential</strong>, <strong>Customize</strong>, <strong
|
||||
>Accept all</strong
|
||||
>.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="note-legali">22. Note legali</h2>
|
||||
<p>
|
||||
Questa Cookie Policy <strong>integra ma non sostituisce</strong> l’Informativa privacy. Per
|
||||
aspetti di trattamento dei dati personali collegati ai cookie fare riferimento anche a{' '}
|
||||
<a class={link} href="/gdpr">GDPR</a> / documenti privacy pubblicati e al counsel locale per
|
||||
Thailandia, UE o altri mercati serviti.
|
||||
</p>
|
||||
|
||||
<h2 id="versioning">23. Versioning e storico revisioni</h2>
|
||||
<ul>
|
||||
<li><strong>Versione 1.0</strong> — 21 aprile 2026 — Prima pubblicazione strutturata.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Appendice: checklist tecnica per il rilascio</h2>
|
||||
<ul class="list-none space-y-2 pl-0 [&_li]:flex [&_li]:gap-2">
|
||||
<li><span class="text-nx-muted">☐</span> Scansione cookie completa e tabella aggiornata</li>
|
||||
<li><span class="text-nx-muted">☐</span> CMP e prova consenso / revoca funzionanti</li>
|
||||
<li><span class="text-nx-muted">☐</span> Traduzioni banner (es. EN / TH) se richieste dal mercato</li>
|
||||
<li><span class="text-nx-muted">☐</span> Script non essenziali bloccati fino a consenso</li>
|
||||
<li><span class="text-nx-muted">☐</span> Tabella cookie con metadati e versioning pubblico</li>
|
||||
<li><span class="text-nx-muted">☐</span> Procedure DSR e revoca collegate dall’informativa privacy</li>
|
||||
<li><span class="text-nx-muted">☐</span> Link a privacy e contatti DPO/referente nel footer</li>
|
||||
</ul>
|
||||
</div>
|
||||
</SubpageLayout>
|
||||
|
||||
@ -9,13 +9,13 @@ import {
|
||||
|
||||
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
|
||||
const lead =
|
||||
"Diritti degli interessati e modalita' di esercizio ai sensi del Regolamento (UE) 2016/679, in coerenza con l'informativa privacy quadro del portale NexStudio. " +
|
||||
"Diritti degli interessati e modalità di esercizio ai sensi del Regolamento (UE) 2016/679, in coerenza con l'informativa privacy quadro di NexStudio S.r.l. (Italia, [INDIRIZZO_COMPLETO]). " +
|
||||
gdprCrossReferences.lead;
|
||||
---
|
||||
|
||||
<SubpageLayout
|
||||
title="GDPR — NexStudio"
|
||||
description="Pagina GDPR NexStudio: diritti degli interessati, modalita' operative, ruoli tra portale corporate e SaaS LexAura/MediAura, coordinamento con privacy dedicate."
|
||||
description="Pagina GDPR NexStudio S.r.l.: diritti degli interessati, modalità operative, ruoli tra portale corporate e SaaS LexAura/MediAura, coordinamento con privacy dedicate."
|
||||
heading="GDPR e diritti degli interessati"
|
||||
lead={lead}
|
||||
>
|
||||
@ -67,6 +67,9 @@ const lead =
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
{s.paragraphsAfterBullets?.map((p) => (
|
||||
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">{p}</p>
|
||||
))}
|
||||
</section>
|
||||
))
|
||||
}
|
||||
|
||||
@ -6,21 +6,33 @@ import ContactFormInline from '../components/ContactFormInline.astro';
|
||||
import CardBottomRightTexture from '../components/CardBottomRightTexture.astro';
|
||||
import SiteFooter from '../components/SiteFooter.astro';
|
||||
import {
|
||||
siteMeta,
|
||||
navigation,
|
||||
hero,
|
||||
getSiteMeta,
|
||||
getNavigation,
|
||||
getHero,
|
||||
stats,
|
||||
services,
|
||||
stackSection,
|
||||
getServices,
|
||||
getStackSection,
|
||||
productsSection,
|
||||
faq,
|
||||
cta,
|
||||
getFaq,
|
||||
getCta,
|
||||
} from '../data/home';
|
||||
|
||||
const infrastructureCarouselItems = stackSection.infrastructureCarousel.items;
|
||||
const path = Astro.url.pathname;
|
||||
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||
const currentLocale = localeMatch?.[1] ?? 'it';
|
||||
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
|
||||
const navigation = getNavigation(currentLocale);
|
||||
const siteMeta = getSiteMeta(currentLocale);
|
||||
const hero = getHero(currentLocale);
|
||||
const services = getServices(currentLocale);
|
||||
const stackSection = getStackSection(currentLocale);
|
||||
const faq = getFaq(currentLocale);
|
||||
const cta = getCta(currentLocale);
|
||||
const infrastructureCarouselItems = stackSection.infrastructureCarousel.items;
|
||||
const pageLabels = {
|
||||
it: { focus: 'Focus' },
|
||||
en: { focus: 'Focus' },
|
||||
th: { focus: 'จุดเน้น' },
|
||||
}[currentLocale];
|
||||
const localize = (href: string) => {
|
||||
if (currentLocale === 'it') return href;
|
||||
if (href.startsWith(`/${currentLocale}`)) return href;
|
||||
@ -64,7 +76,7 @@ const langMeta = {
|
||||
|
||||
<nav
|
||||
class="hidden items-center gap-8 text-sm md:flex"
|
||||
aria-label="Principale"
|
||||
aria-label={navigation.labels.mainNavAria}
|
||||
>
|
||||
{navigation.items.map((item) => {
|
||||
const sectionId = item.href.includes('#')
|
||||
@ -87,7 +99,7 @@ const langMeta = {
|
||||
<details class="relative hidden sm:block" data-lang-dropdown>
|
||||
<summary
|
||||
class="inline-flex h-10 cursor-pointer list-none items-center gap-2 rounded-lg border border-nx-border/80 bg-nx-bg/50 px-3 text-xs font-medium text-nx-fg transition-colors hover:border-sky-500/35 hover:text-white"
|
||||
aria-label="Seleziona lingua"
|
||||
aria-label={navigation.labels.languageSelectorAria}
|
||||
>
|
||||
<img src={langMeta[currentLocale].flagSrc} alt="" class="h-3.5 w-5 rounded-[2px] object-cover" loading="lazy" decoding="async" />
|
||||
<span>{langMeta[currentLocale].code}</span>
|
||||
@ -157,7 +169,7 @@ const langMeta = {
|
||||
@click="mobile = !mobile"
|
||||
:aria-expanded="mobile"
|
||||
aria-controls="mobile-nav"
|
||||
aria-label="Apri menu"
|
||||
aria-label={navigation.labels.openMenuAria}
|
||||
>
|
||||
<svg
|
||||
x-show="!mobile"
|
||||
@ -191,7 +203,7 @@ const langMeta = {
|
||||
x-cloak
|
||||
class="border-b border-nx-border bg-black px-4 py-4 md:hidden"
|
||||
>
|
||||
<nav class="flex flex-col gap-3 text-sm" aria-label="Mobile">
|
||||
<nav class="flex flex-col gap-3 text-sm" aria-label={navigation.labels.mobileNavAria}>
|
||||
{navigation.items.map((item) => {
|
||||
const sectionId = item.href.includes('#')
|
||||
? item.href.split('#').pop()!
|
||||
@ -356,7 +368,7 @@ const langMeta = {
|
||||
pi === 0 ? 'text-sky-200/85' : 'text-emerald-200/85',
|
||||
]}
|
||||
>
|
||||
<span class="text-nx-muted font-normal">Focus — </span>
|
||||
<span class="text-nx-muted font-normal">{pageLabels.focus} — </span>
|
||||
{product.focus}
|
||||
</p>
|
||||
<p class="mt-5 text-sm leading-relaxed text-nx-muted sm:text-base">
|
||||
@ -497,7 +509,7 @@ const langMeta = {
|
||||
class="relative z-[1] mt-12 rounded-2xl border border-orange-500/20 bg-gradient-to-br from-orange-950/20 to-nx-elevated/40 p-6 sm:p-8"
|
||||
>
|
||||
<p class="text-xs font-medium uppercase tracking-wider text-orange-200/90">
|
||||
Infrastruttura
|
||||
{stackSection.infrastructureHeading}
|
||||
</p>
|
||||
<div
|
||||
class="nx-infra-carousel mt-5"
|
||||
|
||||
@ -6,13 +6,32 @@ import SubpageLayout from '../layouts/SubpageLayout.astro';
|
||||
title="Novità — NexStudio"
|
||||
description="Novità, release e articoli da NexStudio."
|
||||
heading="Novità"
|
||||
lead="Hub comunicazioni: collegate qui il vostro blog CMS, oppure elencate manualmente le notizie."
|
||||
lead="Aggiornamenti ufficiali su piattaforma, compliance, infrastruttura e contenuti editoriali."
|
||||
>
|
||||
<p>
|
||||
Quando avrete contenuti da pubblicare (release di prodotto, note di
|
||||
conformità, eventi), potete sostituire questa pagina con una raccolta
|
||||
articoli Astro, un redirect verso Medium/Substack, o un headless CMS.
|
||||
<p class="rounded-xl border border-emerald-500/30 bg-emerald-500/10 px-4 py-3 text-emerald-100">
|
||||
Stato editoriale: canale attivo. Le prossime pubblicazioni verranno aggiornate su questa pagina con frequenza periodica.
|
||||
</p>
|
||||
|
||||
<h2>Programma editoriale</h2>
|
||||
<ul>
|
||||
<li><strong>Release tecniche:</strong> aggiornamenti su funzionalita, integrazioni e miglioramenti di stabilita.</li>
|
||||
<li><strong>Compliance:</strong> novita su policy, sicurezza applicativa e adempimenti normativi.</li>
|
||||
<li><strong>Case e risultati:</strong> note operative su adozione, scalabilita e impatti di business.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Canali di distribuzione</h2>
|
||||
<ul>
|
||||
<li>Questa pagina resta il punto di riferimento ufficiale per annunci e changelog sintetici.</li>
|
||||
<li>La newsletter verra attivata appena disponibile il canale comunicazioni dedicato.</li>
|
||||
<li>I contenuti long-form potranno essere pubblicati anche su canali esterni, con rimando qui.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Archivio</h2>
|
||||
<p class="text-nx-muted">Nessuna news pubblicata per il momento.</p>
|
||||
<p class="text-nx-muted">
|
||||
In questa fase il sito e in pre-lancio operativo. Il primo blocco di news verra pubblicato con il go-live ufficiale.
|
||||
</p>
|
||||
<p>
|
||||
Per richieste stampa, partnership o approfondimenti tecnici e possibile usare il form nella sezione
|
||||
<a href="/#contatti" class="text-sky-300 hover:text-sky-200">Contatti</a>.
|
||||
</p>
|
||||
</SubpageLayout>
|
||||
|
||||
@ -9,13 +9,13 @@ import {
|
||||
|
||||
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
|
||||
const lead =
|
||||
"Informativa quadro sul trattamento dei dati personali per il portale istituzionale NexStudio (sede operativa: Bangkok, Thailandia) e per le interazioni corporate con i servizi SaaS LexAura e MediAura. " +
|
||||
"Informativa quadro sul trattamento dei dati personali per il portale istituzionale NexStudio S.r.l., con sede legale in Italia, [INDIRIZZO_COMPLETO], e per i servizi SaaS LexAura e MediAura. " +
|
||||
privacyCrossReferences.lead;
|
||||
---
|
||||
|
||||
<SubpageLayout
|
||||
title="Privacy — NexStudio"
|
||||
description="Informativa privacy quadro NexStudio: sito istituzionale, contatti corporate, rimandi ai dettagli privacy dei SaaS LexAura (Legal Tech) e MediAura (Health Tech)."
|
||||
description="Informativa privacy quadro NexStudio S.r.l.: sito istituzionale, contatti corporate, rimandi ai dettagli privacy dei SaaS LexAura (Legal Tech) e MediAura (Health Tech)."
|
||||
heading="Informativa sulla privacy"
|
||||
lead={lead}
|
||||
>
|
||||
@ -70,6 +70,9 @@ const lead =
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
{s.paragraphsAfterBullets?.map((p) => (
|
||||
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">{p}</p>
|
||||
))}
|
||||
</section>
|
||||
))
|
||||
}
|
||||
|
||||
@ -4,13 +4,13 @@ import { termsDocument, termsSections, termsRiferimenti, termsCrossReferences }
|
||||
|
||||
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
|
||||
const lead =
|
||||
"Si applicano alla navigazione e all'uso del sito informativo pubblico di NexStudio (sede: Bangkok, Thailandia). I contratti d'abbonamento o d'acquisto sui prodotti software restano retti da offerte, ordini o accordi separati. " +
|
||||
"Si applicano alla navigazione e all'uso del sito informativo pubblico di NexStudio S.r.l., con sede legale in Italia, [INDIRIZZO_COMPLETO]. I contratti d'abbonamento o d'acquisto sui prodotti software restano retti da offerte, ordini o accordi separati. " +
|
||||
termsCrossReferences.leadNote;
|
||||
---
|
||||
|
||||
<SubpageLayout
|
||||
title="Condizioni d’uso — NexStudio"
|
||||
description="Condizioni d’uso del sito web NexStudio: accettazione, utilizzo lecito, responsabilità, legge applicabile. Bangkok, LexAura e MediAura, servizi B2B per contratto a parte."
|
||||
description="Condizioni d’uso del sito web NexStudio S.r.l.: accettazione, utilizzo lecito, responsabilità, legge italiana e foro di Padova. LexAura e MediAura, servizi B2B per contratto a parte."
|
||||
heading="Condizioni d’uso"
|
||||
lead={lead}
|
||||
>
|
||||
|
||||
@ -11,6 +11,15 @@ interface ContactFormCfg {
|
||||
fieldDepartment: string;
|
||||
fieldEmail: string;
|
||||
fieldMessage: string;
|
||||
turnstileError: string;
|
||||
configError: string;
|
||||
mailtoFallbackSubject: string;
|
||||
mailtoLabelName: string;
|
||||
mailtoLabelCompany: string;
|
||||
mailtoLabelEmail: string;
|
||||
mailtoLabelCountry: string;
|
||||
mailtoLabelDepartment: string;
|
||||
mailtoDefaultDepartment: string;
|
||||
}
|
||||
|
||||
function readCfg(): ContactFormCfg {
|
||||
@ -29,6 +38,15 @@ function readCfg(): ContactFormCfg {
|
||||
fieldDepartment: 'department',
|
||||
fieldEmail: 'email',
|
||||
fieldMessage: 'message',
|
||||
turnstileError: 'Complete anti-spam verification before sending.',
|
||||
configError: 'Contact form endpoint is not configured.',
|
||||
mailtoFallbackSubject: 'Website contact',
|
||||
mailtoLabelName: 'Name',
|
||||
mailtoLabelCompany: 'Company',
|
||||
mailtoLabelEmail: 'Email',
|
||||
mailtoLabelCountry: 'Country',
|
||||
mailtoLabelDepartment: 'Department',
|
||||
mailtoDefaultDepartment: 'general',
|
||||
};
|
||||
}
|
||||
return JSON.parse(raw) as ContactFormCfg;
|
||||
@ -52,8 +70,7 @@ function bind(): void {
|
||||
if (!token) {
|
||||
e.preventDefault();
|
||||
if (err) {
|
||||
err.textContent =
|
||||
'Completa il controllo anti-spam prima di inviare il messaggio.';
|
||||
err.textContent = cfg.turnstileError;
|
||||
err.classList.remove('hidden');
|
||||
}
|
||||
return;
|
||||
@ -72,17 +89,20 @@ function bind(): void {
|
||||
const department = String(fd.get(cfg.fieldDepartment) ?? '').trim();
|
||||
const message = String(fd.get(cfg.fieldMessage) ?? '').trim();
|
||||
if (cfg.mailto) {
|
||||
const subject = encodeURIComponent(cfg.notifySubject || 'Contatto sito');
|
||||
const companyLine = company ? `\nAzienda: ${company}` : '';
|
||||
const subject = encodeURIComponent(
|
||||
cfg.notifySubject || cfg.mailtoFallbackSubject || 'Website contact',
|
||||
);
|
||||
const companyLine = company
|
||||
? `\n${cfg.mailtoLabelCompany}: ${company}`
|
||||
: '';
|
||||
const body = encodeURIComponent(
|
||||
`Nome: ${name}${companyLine}\nEmail: ${email}\nPaese: ${country}\nReparto: ${department || 'general'}\n\n${message}`,
|
||||
`${cfg.mailtoLabelName}: ${name}${companyLine}\n${cfg.mailtoLabelEmail}: ${email}\n${cfg.mailtoLabelCountry}: ${country}\n${cfg.mailtoLabelDepartment}: ${department || cfg.mailtoDefaultDepartment}\n\n${message}`,
|
||||
);
|
||||
window.location.href = `mailto:${cfg.mailto}?subject=${subject}&body=${body}`;
|
||||
return;
|
||||
}
|
||||
if (err) {
|
||||
err.textContent =
|
||||
'Configura `contactForm.actionUrl` (Formspree) o `contactForm.mailto` in `src/data/home/cta.ts`.';
|
||||
err.textContent = cfg.configError;
|
||||
err.classList.remove('hidden');
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user