Completa le traduzioni EN/TH e corregge sezioni home ancora solo in italiano.

Stats e prodotti non usavano il locale, quindi dopo lo switch lingua lo scroll mostrava ancora l'italiano.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Javaxman
2026-07-29 23:53:46 +02:00
parent 3b52e5815c
commit 04a1892c0d
26 changed files with 6172 additions and 1830 deletions

View File

@ -1,83 +1,40 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import type { SupportedLocale } from '../data/home/navigation';
import { getAbout } from '../data/about';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const about = getAbout(currentLocale);
const { page, intro, sections } = about;
---
<SubpageLayout
title="Chi siamo — NexStudio"
description="Missione, valori e come lavoriamo con studi legali e strutture sanitarie: qualità, verticalità e impegno nel tempo."
heading="Chi siamo"
lead="Siamo un team internazionale — tra Bangkok e lItalia — che unisce ingegneria del software, intelligenza artificiale applicata e conoscenza dei domini regolamentati, per strumenti professionali usabili e sostenibili nel tempo."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<p>
Ci impegniamo a rendere la tecnologia invisibile nel lavoro quotidiano. Progettiamo
<strong>software che assume su di sé</strong> processi strutturati, controlli e
complessità computazionale, così che chi lavora su norme, pazienti o documentazione
possa concentrarsi su <strong>giudizio, responsabilità e relazione</strong> — non su
menu, formati o incertezze operative. Nascondere la complessità sotto
<strong>interfaccia essenziale, tempi reattivi e tracciabilità</strong> è al centro di
come disegniamo il prodotto, non un optional estetico.
</p>
<p>{intro}</p>
<h2>La nostra missione</h2>
<p>
Operiamo dove un errore pesa: <strong>Legal Tech e Health Tech</strong>. Qui servono
precisione, tracciamento delle scelte e rispetto dei vincoli normativi, non
sperimenti generici. La nostra missione è fornire <strong>piattaforme SaaS mature</strong>
— come <strong>LexAura</strong> e <strong>MediAura</strong> — che integrino modelli
dintelligenza artificiale in flussi già vissuti dallo studio o dalla struttura, con
continuità tra automazione, revisione umana e responsabilità riconoscibile.
</p>
<h2>Perché possiamo meritare la tua fiducia</h2>
<p>
La fiducia non si ottiene con un motto, ma con <strong>ingegneria, chiarezza e
continuità</strong>. Significa architetture provate, aggiornamenti regolari dei
modelli danalisi, assistenza e formazione laddove ladozione chiede metodo oltre
al click. Significa anche onestà sui confini: lIA nelle nostre offerte è pensata
per <strong>estendere e accelerare</strong> il lavoro professionale, lasciando a
avvocato, medico o organizzazione <strong>la decisione finale e la
documentazione</strong> che la norma richiede.
</p>
<h2>Come lavoriamo, in sintesi</h2>
<ul>
<li>
<strong>Verticalità e dominio.</strong> Less genericismo, più requisiti operativi
(normative, flussi, audit) incorporati fin dalla progettazione.
</li>
<li>
<strong>Qualità e sicurezza come priorità, non retorica.</strong> Ingegneria, test
e infrastrutture coerenti con lesposizione a dati sensibili.
</li>
<li>
<strong>Supporto e evoluzione.</strong> Il rapporto con il cliente non finisce
allabbonamento: manutenzione evolutiva, assistenza e procedure chiare in caso di
urgenze operative, dove serve.
</li>
<li>
<strong>Comunicazione trasparente.</strong> Documentazione, informativa privacy
(dove obbligo) e <strong>aspettative reciproche</strong> esplicite, perché
lonboarding non diventi il primo ostacolo.
</li>
</ul>
<h2>Team e cultura</h2>
<p>
Siamo developer, product e specialisti di dominio in un <strong>modello
distribuito</strong>: fusi orari diversi e linguaggi comuni, un solo obiettivo
prodotto. Ci muoviamo con <strong>iterazioni rapide</strong> laddove serve
innovazione, e con <strong>governance</strong> laddove un cambiamento impatta
validazione, conformità o continuità del servizio. La diversità del gruppo
(competenze, contesti) è per noi vantaggio competitivo: riduce lassunto implicito
e costringe a rendere esplicito ciò che il software promette, e a chi.
</p>
<h2>Impegno nel tempo</h2>
<p>
Il settore che ci sceglie non cerca un prototipo, ma <strong>un percorso
sostenibile</strong>: allineamento normativo, adozione in team, affiancamento quando
qualcosa non gira. Costruiamo e manteniamo il prodotto con quella lente, perché
nelle vostre professioni la <strong>continuità</strong> non è comodità, è
requisito.
</p>
{
sections.map((s) => (
<>
<h2>{s.title}</h2>
{s.paragraphs?.map((p) => (
<p>{p}</p>
))}
{s.bullets && s.bullets.length > 0 ? (
<ul>
{s.bullets.map((b) => (
<li>
<strong>{b.title}</strong> {b.text}
</li>
))}
</ul>
) : null}
</>
))
}
</SubpageLayout>

View File

@ -1,143 +1,77 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import {
getCodiceEticoPremessa,
codiceEticoConformityBlocks,
qualitaValidazioneProdotto,
getCodiceEticoProductListPhrase,
notePraticheDPIA,
codiceEticoTutelaDatiRuoli,
} from '../data/codice-etico';
import { getCodiceEtico } from '../data/codice-etico';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
const c = getCodiceEtico(currentLocale);
const { page } = c;
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
const isLabeled = (item: string | { label: string; text: string }): item is { label: string; text: string } =>
typeof item !== 'string';
---
<SubpageLayout
title="Codice etico — NexStudio"
description="Codice etico definitivo NexStudio: valori, conformità legale e sanitaria, privacy, sicurezza, AI, governance e segnalazioni."
heading="Codice etico definitivo"
lead="Per NexStudio — sede: Bangkok, Thailandia. Versione 1.0, in vigore dal 21 aprile 2026. Documento interno ed esterno: principi, obblighi e procedure operative per chi collabora con la Società."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<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">{page.versionLabel}</span> 1.0
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">Entrata in vigore</span>: 21 aprile 2026
<span class="font-medium text-nx-fg">{page.inForceLabel}</span>: {page.inForceDate}
</p>
<h2 id="indice" class="!mt-8">Indice sintetico</h2>
<h2 id="indice" class="!mt-8">{page.indexTitle}</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="#ambito">Ambito di applicazione</a></li>
<li><a class={link} href="#valori">Valori e principi fondamentali</a></li>
<li>
<a class={link} href="#conformita">Conformità normativa (per perimetro: piattaforma, legale, sanitario)</a>
<ol class="mt-2 list-decimal space-y-1 pl-5 text-nx-muted/95">
{
c.index.map((item) => (
<li>
<a class={link} href="#conformita-piattaforma">4.1 Piattaforma e SaaS (orizzontale)</a>
<a class={link} href={item.href}>
{item.label}
</a>
{item.children ? (
<ol class="mt-2 list-decimal space-y-1 pl-5 text-nx-muted/95">
{item.children.map((child) => (
<li>
<a class={link} href={child.href}>
{child.label}
</a>
</li>
))}
</ol>
) : null}
</li>
<li>
<a class={link} href="#conformita-legal">4.2 Ambito legale (LexAura)</a>
</li>
<li>
<a class={link} href="#conformita-sanitario">4.3 Ambito sanitario (MediAura)</a>
</li>
</ol>
</li>
<li>
<a class={link} href="#tutela-dati">Tutela dei dati personali e dati sensibili</a>
<ol class="mt-2 list-decimal space-y-1 pl-5 text-nx-muted/95">
<li>
<a class={link} href="#tutela-dati-ruoli"
>5.1 Ruoli: pazienti, clienti, abbonati, Società</a
>
</li>
</ol>
</li>
<li>
<a class={link} href="#sicurezza">Sicurezza dellinformazione e resilienza operativa</a>
</li>
<li>
<a class={link} href="#qualita"
>Qualità del software, validazione clinica e rischio per gli utenti</a
>
</li>
<li>
<a class={link} href="#proprieta-intellettuale"
>Proprietà intellettuale e uso di componenti esterni</a
>
</li>
<li><a class={link} href="#ai-ml">Uso responsabile di AI/ML e automazione</a></li>
<li>
<a class={link} href="#conflitti">Conflitti di interesse e integrità commerciale</a>
</li>
<li>
<a class={link} href="#linee-operative"
>Linee operative: sviluppo, rilascio e gestione vulnerabilità</a
>
</li>
<li><a class={link} href="#governance">Governance, ruoli e responsabilità</a></li>
<li>
<a class={link} href="#onboarding">Onboarding, formazione e certificazione</a>
</li>
<li>
<a class={link} href="#segnalazioni"
>Segnalazioni, protezione del segnalante e investigazioni</a
>
</li>
<li><a class={link} href="#violazioni">Gestione delle violazioni e sanzioni</a></li>
<li>
<a class={link} href="#monitoraggio">Monitoraggio, audit e miglioramento continuo</a>
</li>
<li>
<a class={link} href="#documentazione">Documentazione obbligatoria e registri</a>
</li>
<li><a class={link} href="#allegati">Allegati e moduli</a></li>
<li><a class={link} href="#approvazione">Approvazione e contatti utili</a></li>
))
}
</ol>
<h2 id="premessa">1. Premessa</h2>
<p>
{getCodiceEticoPremessa()}
</p>
<h2 id="premessa">{c.premessaTitle}</h2>
<p>{c.premessa}</p>
<h2 id="ambito">2. Ambito di applicazione</h2>
<p>
Si applica a: fondatori, dirigenti, dipendenti (full-time, part-time), collaboratori esterni,
consulenti, appaltatori e fornitori. Copre tutte le attività: analisi, progettazione,
sviluppo, test, rilascio, manutenzione, supporto, marketing, vendite e ricerca.
</p>
<h2 id="ambito">{c.ambito.title}</h2>
<p>{c.ambito.text}</p>
<h2 id="valori">3. Valori e principi fondamentali</h2>
<h2 id="valori">{c.valori.title}</h2>
<ul>
<li>Integrità, onestà e trasparenza.</li>
<li>Rispetto della dignità umana, inclusione e non discriminazione.</li>
<li>Responsabilità tecnico-professionale e qualità del servizio.</li>
<li>Riservatezza e protezione dei dati personali e sensibili.</li>
<li>Sicurezza e resilienza operativa.</li>
<li>Conformità legale e regolamentare.</li>
<li>Miglioramento continuo e accountability.</li>
{c.valori.items.map((item) => <li>{item}</li>)}
</ul>
<h2 id="conformita">4. Conformità normativa specifica</h2>
<h2 id="conformita">{c.conformita.title}</h2>
<p>
I riferimenti sotto sono raggruppati: obblighi orizzontali a tutte le offerte
<strong>SaaS</strong>, riferimenti distinti per il perimetro
<strong>Legal Tech / LexAura</strong> e per <strong>Health Tech / MediAura</strong> (ciascuna
linea può estendersi o diversificare secondo prodotto e mercato, senza commistione indebita
ad altri perimetri). Riepilogo riga prodotto:
<span class="text-nx-fg">{getCodiceEticoProductListPhrase()}</span>.
{c.conformita.introBefore}
<span class="text-nx-fg">{c.productListPhrase}</span>
{c.conformita.introAfter}
</p>
{
codiceEticoConformityBlocks.map((block, i) => (
<section
class:list={['', i > 0 && 'mt-5']}
data-conformity-block={block.id}
>
<h3
id={block.anchorId}
class="scroll-mt-8 text-base font-semibold text-nx-fg"
>
c.conformityBlocks.map((block, i) => (
<section class:list={['', i > 0 && 'mt-5']} data-conformity-block={block.id}>
<h3 id={block.anchorId} class="scroll-mt-8 text-base font-semibold text-nx-fg">
{block.title}
</h3>
{block.lead ? <p class="text-sm text-nx-muted sm:text-base">{block.lead}</p> : null}
@ -149,392 +83,242 @@ const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underl
</section>
))
}
<p class="mt-6 text-sm sm:text-base">
La Società effettua DPIA (Data Protection Impact Assessment) per trattamenti ad alto rischio e
consulta autorità o <em>regulatory counsel</em> quando necessario, con riferimenti
<strong>per ciascun trattamento</strong> al perimetro (piattaforma, legale, sanitario) ove
interessa.
</p>
<p class="mt-6 text-sm sm:text-base">{c.conformita.afterBlocks}</p>
<h2 id="tutela-dati">5. Tutela dei dati personali e dati sensibili</h2>
<p class="text-nx-muted sm:text-base">{codiceEticoTutelaDatiRuoli.intro}</p>
<h2 id="tutela-dati">{c.tutelaDati.title}</h2>
<p class="text-nx-muted sm:text-base">{c.tutelaDatiRuoli.intro}</p>
<h3
id={codiceEticoTutelaDatiRuoli.anchorId}
id={c.tutelaDatiRuoli.anchorId}
class="!mt-6 text-base font-semibold text-nx-fg"
>
{codiceEticoTutelaDatiRuoli.title}
{c.tutelaDatiRuoli.title}
</h3>
{
codiceEticoTutelaDatiRuoli.rows.map((r) => (
c.tutelaDatiRuoli.rows.map((r) => (
<p class="mt-3 sm:text-base">
<span class="font-semibold text-nx-fg">{r.label}.</span>{' '}
{r.text}
<span class="font-semibold text-nx-fg">{r.label}.</span> {r.text}
</p>
))
}
<p
class="mt-4 border-l-2 border-sky-500/30 pl-4 text-sm leading-relaxed text-nx-muted"
>
{codiceEticoTutelaDatiRuoli.note}
<p class="mt-4 border-l-2 border-sky-500/30 pl-4 text-sm leading-relaxed text-nx-muted">
{c.tutelaDatiRuoli.note}
</p>
<p class="mt-8 text-sm font-medium text-nx-fg sm:text-base">
Nella concreta operatività, la Società e i collaboratori si attengono ai principi operativi
seguenti (complementari ai ruoli sopra):
{c.tutelaDati.operationalIntro}
</p>
<ul>
<li><strong>Minimizzazione:</strong> raccogliere solo i dati necessari e pertinenti.</li>
<li>
<strong>Base giuridica:</strong> documentare la base legale per ogni trattamento (consenso,
esecuzione del contratto, obbligo legale, interesse legittimo valutato).
</li>
<li>
<strong>Informativa e consenso:</strong> fornire informative chiare e ottenere consensi
quando richiesto; gestire il consenso in modo verificabile.
</li>
<li>
<strong>Classificazione:</strong> definire categorie (PII, dati sanitari, informazioni legali
privilegiate) e applicare misure differenziate.
</li>
<li>
<strong>Conservazione e cancellazione:</strong> politiche di retention documentate;
anonimizzazione o cancellazione al termine delle finalità.
</li>
<li>
<strong>Trasferimenti internazionali:</strong> valutare basi legali (clausole contrattuali
standard, decisioni di adeguatezza, misure tecniche) per trasferimenti fuori dalla
Thailandia.
</li>
<li>
<strong>Diritti degli interessati:</strong> procedure per accesso, rettifica, cancellazione,
limitazione, portabilità e opposizione, con tempi e log documentati.
</li>
<li>
<strong>Sub-processori:</strong> contratti che impongono misure di sicurezza equivalenti,
obblighi di notifica in caso di violazione (<em>breach</em>) e divieti di ulteriori
sub-affidamenti non autorizzati.
</li>
</ul>
<h2 id="sicurezza">6. Sicurezza dellinformazione e resilienza operativa</h2>
<ul>
<li>
<strong>Security by design</strong> e <strong>privacy by design:</strong> integrazione di
sicurezza e privacy nel ciclo di vita del prodotto.
</li>
<li>
<strong>Controlli di accesso:</strong> principio del privilegio minimo, MFA obbligatorio per
accesso a risorse sensibili, gestione centralizzata delle identità.
</li>
<li>
<strong>Crittografia:</strong> cifratura a riposo e in transito con algoritmi aggiornati;
gestione sicura delle chiavi.
</li>
<li>
<strong>Logging e monitoraggio:</strong> log immutabili per accessi e operazioni su dati
sensibili e ambienti di produzione.
</li>
<li>
<strong>Vulnerability management:</strong> scansioni automatiche, penetration test
periodici, processo di patching e programma di responsible disclosure o bug bounty.
</li>
<li>
<strong>Continuità operativa e disaster recovery:</strong> piani testati regolarmente con
RTO/RPO definiti.
</li>
<li>
<strong>Gestione incidenti:</strong> playbook documentato (identificazione, containment,
eradicazione, recovery, post-mortem), ruoli e tempi di notifica interni ed esterni.
</li>
</ul>
<h2 id="qualita">7. Qualità del software, validazione clinica e rischio per gli utenti</h2>
<ul>
<li>
<strong>Standard di sviluppo:</strong> codice leggibile, test automatici, code review
obbligatorie, CI/CD sicuro.
</li>
<li>
<strong>Test e copertura:</strong> definire copertura minima per componenti critici; test di
integrazione, performance e sicurezza.
</li>
{
qualitaValidazioneProdotto.map((v) => (
c.tutelaDati.principles.map((p) => (
<li>
<strong>Validazione (per {v.id === 'legal' ? 'perimetro legale' : 'perimetro sanitario'}):</strong>{' '}
<strong>{p.label}:</strong> {p.text}
</li>
))
}
</ul>
<h2 id="sicurezza">{c.sicurezza.title}</h2>
<ul>
{
c.sicurezza.items.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
</ul>
<h2 id="qualita">{c.qualita.title}</h2>
<ul>
{
c.qualita.itemsBefore.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
{
c.qualitaValidazioneProdotto.map((v) => (
<li>
<strong>
{v.id === 'legal'
? c.qualita.validazioneLabelLegal
: c.qualita.validazioneLabelHealth}
:
</strong>{' '}
{v.text}
</li>
))
}
{
c.qualita.itemsAfter.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
</ul>
<h2 id="proprieta-intellettuale">{c.proprieta.title}</h2>
<ul>
{
c.proprieta.items.map((item) =>
item.kind === 'labeled' ? (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
) : (
<li>{item.text}</li>
),
)
}
</ul>
<h2 id="ai-ml">{c.ai.title}</h2>
<ul>
{
c.ai.items.map((item) =>
isLabeled(item) ? (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
) : (
<li>{item}</li>
),
)
}
</ul>
<h2 id="conflitti">{c.conflitti.title}</h2>
<ul>
{c.conflitti.items.map((item) => <li>{item}</li>)}
</ul>
<h2 id="linee-operative">{c.lineeOperative.title}</h2>
<ul>
{
c.lineeOperative.items.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
</ul>
<h2 id="governance">{c.governance.title}</h2>
<ul>
{
c.governance.items.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
</ul>
<h2 id="onboarding">{c.onboarding.title}</h2>
<ul>
<li>
<strong>Classificazione del rischio:</strong> valutare impatto su salute o diritti e
applicare misure di mitigazione proporzionate.
{c.onboarding.item1Before}
{c.productListPhrase}
{c.onboarding.item1After}
</li>
{c.onboarding.itemsRest.map((item) => <li>{item}</li>)}
</ul>
<h2 id="segnalazioni">{c.segnalazioni.title}</h2>
<ul>
<li>
<strong>{c.segnalazioni.channelsLabel}:</strong>{' '}
{c.segnalazioni.channelsBefore}{' '}
<a class={link} href="mailto:ethics@nexstudio.com">ethics@nexstudio.com</a>
{c.segnalazioni.channelsAfter}
</li>
<li>
<strong>Non sostituzione del professionista:</strong> la piattaforma fornisce supporto e
strumenti informativi; non si presenta come sostitutiva di pareri professionali senza
esplicita supervisione e avallo professionale.
<strong>{c.segnalazioni.protection.label}:</strong>{' '}
{c.segnalazioni.protection.text}
</li>
<li>
<strong>Registri ed evidenze:</strong> mantenere documentazione di test clinici, valutazioni
di rischio e approvazioni regolatorie.
<strong>{c.segnalazioni.investigations.label}:</strong>{' '}
{c.segnalazioni.investigations.text}
</li>
</ul>
<h2 id="proprieta-intellettuale">8. Proprietà intellettuale e uso di componenti esterni</h2>
<h2 id="violazioni">{c.violazioni.title}</h2>
<ul>
<li>
I contributi di dipendenti e consulenti inerenti a software, documentazione e know-how sono
di proprietà della Società, salvo diverso accordo scritto.
</li>
<li>
<strong>Open source:</strong> mantenere SBOM (Software Bill of Materials), verificare la
compatibilità delle licenze, rispettare obblighi di disclosure e aggiornamento delle patch.
</li>
<li>
Divieto di uso non autorizzato di codice o proprietà intellettuale di terzi; gestione dei
rischi di contaminazione IP.
</li>
{c.violazioni.items.map((item) => <li>{item}</li>)}
</ul>
<h2 id="ai-ml">9. Uso responsabile di AI/ML e automazione</h2>
<h2 id="monitoraggio">{c.monitoraggio.title}</h2>
<ul>
<li>Documentare dataset di training, provenienza, pre-elaborazione e limiti noti.</li>
<li>
<strong>Bias assessment:</strong> condurre analisi per identificare e mitigare pregiudizi
che possano discriminare o causare danni.
</li>
<li>
<strong>Supervisione umana:</strong> per decisioni che influenzano salute, procedimenti
legali o diritti fondamentali, prevedere supervisione umana e avvisi chiari sui limiti del
sistema.
</li>
<li>
<strong>Explainability e responsabilità:</strong> fornire informazioni comprensibili su
come i modelli supportano le decisioni e su prestazioni e affidabilità.
</li>
<li>
<strong>Monitoraggio post-release:</strong> misurare le prestazioni in produzione e
correggere drift o comportamenti inattesi.
</li>
{
c.monitoraggio.items.map((item) =>
isLabeled(item) ? (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
) : (
<li>{item}</li>
),
)
}
</ul>
<h2 id="conflitti">10. Conflitti di interesse e integrità commerciale</h2>
<h2 id="documentazione">{c.documentazione.title}</h2>
<p>{c.documentazione.intro}</p>
<ul>
<li>
Dichiarazione obbligatoria di conflitti reali o potenziali (investimenti, relazioni con
fornitori o clienti).
</li>
<li>Politiche anticorruzione e anti-tangenti conformi a leggi nazionali e internazionali.</li>
<li>
Comunicazioni commerciali veritiere; non ingannare su capacità, approvazioni regolatorie o
risultati.
</li>
<li>
Trasparenza contrattuale: SLA, limitazioni di responsabilità e condizioni duso chiare e
accessibili.
</li>
{c.documentazione.items.map((item) => <li>{item}</li>)}
</ul>
<h2 id="linee-operative">11. Linee operative: sviluppo, rilascio e gestione vulnerabilità</h2>
<h2 id="allegati">{c.allegati.title}</h2>
<ul>
<li>
<strong>Sviluppo:</strong> strategia di branch, code review obbligatoria, merge solo con CI
positiva, checklist pre-release (sicurezza, privacy, compliance).
</li>
<li>
<strong>Ambiente di test:</strong> uso di dati sintetici o anonimizzati; accesso a dati
reali solo su base minima e autorizzata, in ambienti isolati.
</li>
<li>
<strong>Deployment:</strong> CI/CD standardizzato con piano di rollback e rilasci graduali
per funzionalità critiche.
</li>
<li>
<strong>Gestione vulnerabilità:</strong> canale pubblico o privato per segnalazioni (bug
bounty o indirizzo dedicato <em>security@</em>), conferma di ricezione entro 72 ore, piano di
remediation con tempi stimati.
</li>
<li>
<strong>Patch management:</strong> tempi di rilascio delle patch definiti in base alla
severità.
</li>
<li>
<strong>Documentazione di rilascio:</strong> changelog, impatti noti e raccomandazioni
operative.
</li>
{c.allegati.items.map((item) => <li>{item}</li>)}
</ul>
<h2 id="governance">12. Governance, ruoli e responsabilità</h2>
<h2 id="approvazione">{c.approvazione.title}</h2>
<ul>
<li><strong>Board / fondatori:</strong> approvano le politiche, definiscono strategia e risorse.</li>
<li><strong>CEO:</strong> responsabilità complessiva di conformità e governance.</li>
<li><strong>CTO:</strong> qualità tecnica, architettura e pratiche di sviluppo.</li>
<li>
<strong>CISO / responsabile sicurezza:</strong> sicurezza operativa, risposta agli incidenti,
gestione delle vulnerabilità.
</li>
<li>
<strong>DPO / referente privacy:</strong> conformità PDPA e GDPR, DPIA, gestione richieste
degli interessati.
</li>
<li>
<strong>Legal &amp; compliance:</strong> supervisione legale, contratti e valutazioni
regolatorie.
</li>
<li><strong>HR:</strong> formazione, codice di condotta e gestione disciplinare.</li>
<li>
<strong>Team lead / PM:</strong> applicano le policy operative e garantiscono conformità
quotidiana.
</li>
<li>
<strong>Comitato etico (consigliato):</strong> gruppo multidisciplinare per valutare casi
complessi (impatti clinici o legali, conflitti), con riunioni periodiche e su richiesta.
</li>
{
c.approvazione.items.map((item) => (
<li>
<strong>{item.label}:</strong> {item.text}
</li>
))
}
</ul>
<p class="font-medium text-nx-fg">{page.contactsTitle}</p>
<ul>
{
c.approvazione.contacts.map((contact) => (
<li>
{contact.label}:{' '}
<a class={link} href={`mailto:${contact.email}`}>
{contact.email}
</a>
{contact.note === 'anonymous' ? (
<> {page.anonymousPlatformNote}</>
) : null}
</li>
))
}
</ul>
<h2 id="onboarding">13. Onboarding, formazione e certificazione</h2>
<ul>
<li>
Onboarding obbligatorio su: sicurezza informatica, privacy (PDPA e GDPR), gestione dati
sensibili, requisiti e documentazione riferibili a ciascuna linea prodotto
(oggi: {getCodiceEticoProductListPhrase()}; estendere il curriculum quando lelenco
cresce), uso responsabile dellAI, pratiche di coding sicuro.
</li>
<li>Formazione annuale obbligatoria e formazione aggiuntiva per ruoli critici.</li>
<li>Registrazione e conservazione dei record di formazione.</li>
</ul>
<h2 id="segnalazioni">14. Segnalazioni, protezione del segnalante e investigazioni</h2>
<ul>
<li>
<strong>Canali:</strong> almeno un canale confidenziale interno (es. <a
class={link}
href="mailto:ethics@nexstudio.com">ethics@nexstudio.com</a
>), piattaforma anonima esterna o servizio terzo; contatto per escalation indipendente.
</li>
<li>
<strong>Protezione:</strong> divieto di ritorsioni; misure disciplinari per ritorsioni
comprovate.
</li>
<li>
<strong>Indagini:</strong> condotte in modo imparziale, documentato e con tempi definiti;
comunicazione dei risultati alla persona segnalante e alle parti interessate, nei limiti
della riservatezza.
</li>
</ul>
<h2 id="violazioni">15. Gestione delle violazioni e sanzioni</h2>
<ul>
<li>
Azioni proporzionate alla gravità: formazione correttiva, richiamo, riassegnazione,
sospensione, risoluzione del rapporto contrattuale, azioni legali se necessario.
</li>
<li>Registro delle infrazioni e delle azioni intraprese; diritto di difesa dellinteressato.</li>
</ul>
<h2 id="monitoraggio">16. Monitoraggio, audit e miglioramento continuo</h2>
<ul>
<li>Audit interni ed esterni regolari su sicurezza, privacy, compliance e controllo qualità.</li>
<li>
<strong>KPI (esempi):</strong> numero di incidenti, tempo medio di remediation, percentuale
di copertura dei test, percentuale di formazione completata, tempo medio di risposta alle
segnalazioni.
</li>
<li>
Revisione del Codice: almeno annuale o in caso di cambiamenti normativi, tecnologici o di
mercato.
</li>
</ul>
<h2 id="documentazione">17. Documentazione obbligatoria e registri</h2>
<p>La Società mantiene e aggiorna, tra laltro:</p>
<ul>
<li>registro dei trattamenti e DPIA;</li>
<li>SBOM e inventario dei componenti (open source);</li>
<li>log di accesso e audit trail;</li>
<li>registro incidenti e violazioni dei dati;</li>
<li>contratti con fornitori e sub-processori;</li>
<li>record di formazione e dichiarazioni di adesione al Codice.</li>
</ul>
<h2 id="allegati">18. Allegati e moduli (inclusi)</h2>
<ul>
<li>Dichiarazione personale di adesione al Codice (da firmare in onboarding).</li>
<li>Template NDA e clausole minime per fornitori e sub-processori.</li>
<li>Checklist pre-release (security e privacy).</li>
<li>Flowchart gestione incidenti e template di notifica.</li>
<li>Modello DPIA semplificato ed esempio compilato.</li>
<li>Modello informativa privacy e modulo consenso per utenti o pazienti.</li>
<li>Template SBOM.</li>
<li>Policy di retention dei dati (tempi e giustificazioni).</li>
<li>Template per valutazione dimpatto AI/ML.</li>
</ul>
<h2 id="approvazione">19. Approvazione e contatti utili</h2>
<ul>
<li>
<strong>Approvato da:</strong> organo competente / amministratore delegato (nome e cognome
alla firma).
</li>
<li>
<strong>Responsabile aggiornamenti:</strong> Legal &amp; compliance, con supporto di DPO
e CISO.
</li>
<li>
<strong>Revisione:</strong> minimo annuale o a fronte di mutamenti rilevanti.
</li>
</ul>
<p class="font-medium text-nx-fg">Contatti</p>
<ul>
<li>
DPO / referente privacy: <a class={link} href="mailto:privacy@nexstudio.com"
>privacy@nexstudio.com</a
>
</li>
<li>
Security / incident response: <a class={link} href="mailto:security@nexstudio.com"
>security@nexstudio.com</a
>
</li>
<li>
Segnalazioni confidenziali: <a class={link} href="mailto:ethics@nexstudio.com"
>ethics@nexstudio.com</a
>
(o link a piattaforma anonima dedicata)
</li>
<li>
Legal: <a class={link} href="mailto:legal@nexstudio.com">legal@nexstudio.com</a>
</li>
<li>HR: <a class={link} href="mailto:hr@nexstudio.com">hr@nexstudio.com</a></li>
</ul>
<h2 id="clausola-adesione">Clausola finale di adesione (da firmare in onboarding)</h2>
<h2 id="clausola-adesione">{c.adesione.title}</h2>
<p>
Dichiaro di aver letto e compreso il Codice Etico di <strong>NexStudio</strong> e mi impegno a
rispettarne i principi e le procedure. Mi impegno inoltre a segnalare, in buona fede, eventuali
violazioni di cui dovessi venire a conoscenza.
{c.adesione.textBefore}
<strong>NexStudio</strong>
{c.adesione.textAfter}
</p>
<p class="mt-4 text-nx-fg">
Firma: <span class="inline-block min-w-[12rem] border-b border-nx-border"> </span>
{page.signatureLabel}:{' '}
<span class="inline-block min-w-[12rem] border-b border-nx-border"> </span>
<span class="mx-3 text-nx-muted">·</span>
Data: <span class="inline-block min-w-[6rem] border-b border-nx-border"> </span>
{page.dateLabel}:{' '}
<span class="inline-block min-w-[6rem] border-b border-nx-border"> </span>
</p>
<h2 id="note-pratiche">Note pratiche e prossimi passi consigliati</h2>
<h2 id="note-pratiche">{c.notePratiche.title}</h2>
<ul>
<li>
Personalizzare il documento con il nome ufficiale della società (se diverso dal marchio
operativo), firme e riferimenti legali locali a Bangkok.
</li>
<li>
Allegare i template elencati come documenti separati e implementare i canali tecnici per
segnalazioni e bug bounty.
</li>
<li>
Predisporre un piano di formazione di 90 giorni per lonboarding e formazione ricorrente
annuale.
</li>
{notePraticheDPIA.map((t) => <li>{t}</li>)}
{c.notePratiche.items.map((item) => <li>{item}</li>)}
{c.notePraticheDPIA.map((t) => <li>{t}</li>)}
</ul>
</div>
</SubpageLayout>

View File

@ -1,252 +1,203 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import { cookieConsentMeta } from '../data/cookie-consent';
import type { SupportedLocale } from '../data/home/navigation';
import { getCookies } from '../data/cookies';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const cookies = getCookies(currentLocale);
const { document: cookiesDocument, riferimenti, sections, page } = cookies;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
const resolveHref = (href: string) =>
href.startsWith('mailto:') || href.startsWith('http') ? href : localize(href);
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;
const indexTitle = (title: string) => title.replace(/^\d+\.\s*/, '');
---
<SubpageLayout
title="Cookie Policy — NexStudio"
description="Cookie Policy NexStudio S.r.l.: categorie, base giuridica, consenso, terze parti, diritti e contatti. Sede legale in Italia."
heading="Cookie Policy"
lead="Titolare del trattamento: NexStudio S.r.l., con sede legale in Italia, [INDIRIZZO_COMPLETO]."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<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.1
<span class="font-medium text-nx-fg">{page.versionLabel}</span> {cookiesDocument.version}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">In vigore dal</span> [DATA]
<span class="font-medium text-nx-fg">{page.inForceFromLabel}</span> {cookiesDocument.inVigoreDal}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">Versione tecnica consenso</span>{' '}
<span class="font-medium text-nx-fg">{page.consentVersionLabel}</span>{' '}
<code class="rounded bg-nx-elevated px-1.5 py-0.5 font-mono text-xs text-sky-300/90"
>v{cookieConsentMeta.policyVersion}</code
>
</p>
<p class="!mt-5 text-sm text-nx-muted sm:text-base">
Documenti connessi:{' '}
{page.relatedDocsLabel}:{' '}
{
riferimenti.map((r, i) => (
<span>
{i > 0 && <span class="text-nx-muted/80"> · </span>}
<a class={link} href={r.href}>{r.label}</a>
<a class={link} href={localize(r.href)}>{r.label}</a>
</span>
))
}
</p>
<h2 id="indice" class="!mt-8">Indice</h2>
<h2 id="indice" class="!mt-8">{page.indexLabel}</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 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>
<li><a class={link} href="#terze-parti">Cookie di terze parti e responsabilità</a></li>
<li><a class={link} href="#retention">Conservazione e criteri di retention</a></li>
<li><a class={link} href="#trasferimenti">Trasferimenti internazionali</a></li>
<li><a class={link} href="#minori">Minori età</a></li>
<li><a class={link} href="#sicurezza">Misure di sicurezza</a></li>
<li><a class={link} href="#advertising">Consenso per scopi pubblicitari e profiling</a></li>
<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>
{
sections.map((s) => (
<li>
<a class={link} href={`#${s.id}`}>{indexTitle(s.title)}</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 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>
{
sections.map((s) => (
<section class="mt-10" id={s.id}>
<h2 class="scroll-mt-8 text-lg font-semibold text-nx-fg sm:text-xl">{s.title}</h2>
<h2 id="definizioni">2. Definizioni</h2>
<ul>
<li>
<strong>Cookie:</strong> piccolo file di testo inviato dal sito al browser e memorizzato sul
dispositivo, re-inviato al sito alle visite successive.
</li>
<li>
<strong>Cookie di prima parte:</strong> impostati dal dominio del sito che lutente visita.
</li>
<li>
<strong>Cookie di terze parti:</strong> impostati da domini diversi (fornitori esterni,
embed, CDN, strumenti di misura).
</li>
<li>
<strong>Tecnologie simili:</strong> web beacon, pixel, <em>local storage</em>, e in generale
identificatori lato client.
</li>
</ul>
{s.richParagraphs?.map((parts) => (
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">
{parts.map((part) => {
if (part.t === 'text') return part.v;
if (part.t === 'em') return <em>{part.v}</em>;
if (part.t === 'strong') return <strong>{part.v}</strong>;
if (part.external) {
return (
<a class={link} href={part.href} target="_blank" rel="noopener noreferrer">
{part.label}
</a>
);
}
return (
<a class={link} href={resolveHref(part.href)}>
{part.label}
</a>
);
})}
</p>
))}
<h2 id="finalita">3. Finalità dei cookie e categorie</h2>
{s.paragraphs?.map((p) => (
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">{p}</p>
))}
<h3>3.1 Cookie strettamente necessari (essenziali)</h3>
<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 dallutente.
</p>
{s.definitions && s.definitions.length > 0 ? (
<ul class="mt-3 list-disc space-y-2 pl-5 text-sm sm:text-base">
{s.definitions.map((d) => (
<li class="text-nx-muted">
<strong>{d.term}:</strong> {d.definition}
</li>
))}
</ul>
) : null}
<h3>3.2 Cookie di preferenza / funzionali</h3>
<p>
<strong>Finalità:</strong> lingua, regione, tema o altre impostazioni di interfaccia.{' '}
<strong>Base giuridica:</strong> consenso (Art. 6.1.a GDPR).
</p>
{s.subsections?.map((sub) => (
<>
<h3>{sub.title}</h3>
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">
{sub.purposeLabel ? (
<>
<strong>{sub.purposeLabel}:</strong> {sub.purpose}{' '}
</>
) : null}
{sub.legalBasisLabel ? (
<>
<strong>{sub.legalBasisLabel}:</strong> {sub.legalBasis}
</>
) : null}
</p>
</>
))}
<h3>3.3 Cookie di performance / analytics</h3>
<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>
{s.bullets && s.bullets.length > 0 ? (
<ul class="mt-3 list-disc space-y-2 pl-5 text-sm sm:text-base">
{s.bullets.map((b) => (
<li class="text-nx-muted">
{typeof b === 'string' ? (
b
) : 'before' in b ? (
<>
{b.before}
<strong>{b.strong}</strong>
{b.after || ''}
</>
) : (
<>
<strong>{b.strong}</strong>
{b.after || ''}
</>
)}
</li>
))}
</ul>
) : null}
<h3>3.4 Cookie per advertising e targeting</h3>
<p>
<strong>Finalità:</strong> pubblicità mirata, remarketing, misura delle campagne.{' '}
<strong>Base giuridica:</strong> consenso esplicito.
</p>
{s.paragraphsAfterBullets?.map((p) =>
typeof p === 'string' ? (
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">{p}</p>
) : (
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">
{p.map((part) => {
if (part.t === 'text') return part.v;
if (part.t === 'em') return <em>{part.v}</em>;
if (part.t === 'strong') return <strong>{part.v}</strong>;
if (part.external) {
return (
<a class={link} href={part.href} target="_blank" rel="noopener noreferrer">
{part.label}
</a>
);
}
return (
<a class={link} href={resolveHref(part.href)}>
{part.label}
</a>
);
})}
</p>
),
)}
<h3>3.5 Cookie di terze parti e integrazioni social</h3>
<p>
<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>
Elenco in appendice tecnica (da mantenere aggiornato con scansione periodica).
</p>
<table class={tbl}>
<thead>
<tr>
<th class={th}>Nome</th>
<th class={th}>Provider</th>
<th class={th}>Categoria</th>
<th class={th}>Durata</th>
<th class={th}>Tipo</th>
<th class={th}>Base giuridica</th>
</tr>
</thead>
<tbody>
<tr>
<td class={td} colspan="6">
<em>Da compilare dopo scansione del sito in staging e produzione.</em>
</td>
</tr>
</tbody>
</table>
<h2 id="base-giuridica">5. Base giuridica</h2>
<ul>
<li>
Cookie tecnici essenziali: legittimo interesse del titolare (Art. 6.1.f GDPR).
</li>
<li>
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 CMP first-party. Al primo accesso viene mostrato un banner con:
</p>
<ul>
<li><strong>Rifiuta non essenziali</strong></li>
<li><strong>Personalizza</strong> (apertura pannello categorie)</li>
<li><strong>Accetta tutto</strong></li>
</ul>
<p>
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.
</li>
<li>Cancellando i dati locali del sito dalle impostazioni del browser.</li>
</ul>
<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).
</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). 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>
<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.
</p>
<h2 id="minori">12. Minori età</h2>
<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.
</p>
<h2 id="advertising">14. Consenso per scopi pubblicitari e profiling</h2>
<p>
Profilazione e pubblicità comportano consenso esplicito e tracciabilità della scelta.
</p>
<h2 id="effetti">15. Effetti di rifiuto o accettazione</h2>
<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.
</p>
<h2 id="diritti">17. Diritti degli interessati e contatti</h2>
<p>
Diritti: accesso, rettifica, cancellazione, limitazione, portabilità, opposizione e revoca del
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>
{s.table ? (
<table class={tbl}>
<thead>
<tr>
{s.table.headers.map((h) => (
<th class={th}>{h}</th>
))}
</tr>
</thead>
<tbody>
<tr>
<td class={td} colspan={s.table.headers.length}>
<em>{s.table.emptyNote}</em>
</td>
</tr>
</tbody>
</table>
) : null}
</section>
))
}
</div>
</SubpageLayout>

View File

@ -1,22 +1,37 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import type { SupportedLocale } from '../data/home/navigation';
import { getDoveSiamo } from '../data/dove-siamo';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const doveSiamo = getDoveSiamo(currentLocale);
const { page, sections } = doveSiamo;
---
<SubpageLayout
title="Dove siamo — NexStudio"
description="Sede operativa a Bangkok, Thailandia; fusi orari e lingue per lavorare con clienti in Europa e altre regioni."
heading="Dove siamo"
lead="NexStudio ha base a Bangkok, in Thailandia. Sotto, come organizziamo fusi orari e lingue rispetto a clienti in Europa e oltre."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<h2>Sede</h2>
<p>
<strong>Thailandia</strong> — <strong>Bangkok</strong>
</p>
<h2>Fusi orari e lingue</h2>
<p>
Il sito e il supporto via web possono essere gestiti in italiano, inglese,
tedesco, francese, spagnolo e tailandese, con orari da concordare in base
al team e al fuso rispetto ai clienti in Europa e altre regioni.
</p>
{
sections.map((s) => (
<>
<h2>{s.title}</h2>
{s.paragraphs.map((p) =>
s.locationLine ? (
<p>
<strong>{p.split(' — ')[0]}</strong>
{' — '}
<strong>{p.split(' — ')[1]}</strong>
</p>
) : (
<p>{p}</p>
),
)}
</>
))
}
</SubpageLayout>

View File

@ -1,49 +1,56 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import {
gdprCrossReferences,
gdprDocument,
gdprRiferimenti,
gdprSections,
} from '../data/gdpr';
import type { SupportedLocale } from '../data/home/navigation';
import { getGdpr } from '../data/gdpr';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const gdpr = getGdpr(currentLocale);
const { document: gdprDocument, riferimenti, sections, page } = gdpr;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
const lead =
"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 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}
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<div>
<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> {gdprDocument.version}
<span class="font-medium text-nx-fg">{page.versionLabel}</span> {gdprDocument.version}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">In vigore dal</span> {gdprDocument.inVigoreDal}
<span class="font-medium text-nx-fg">{page.inForceFromLabel}</span> {gdprDocument.inVigoreDal}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">Ultimo aggiornamento</span> {gdprDocument.ultimoAggiornamento}
<span class="font-medium text-nx-fg">{page.lastUpdateLabel}</span> {gdprDocument.ultimoAggiornamento}
</p>
<p class="!mt-5 text-sm text-nx-muted sm:text-base">
Documenti connessi:{' '}
{page.relatedDocsLabel}:{' '}
{
gdprRiferimenti.map((r, i) => (
riferimenti.map((r, i) => (
<span>
{i > 0 && <span class="text-nx-muted/80"> · </span>}
<a class={link} href={r.href}>{r.label}</a>
<a class={link} href={localize(r.href)}>{r.label}</a>
</span>
))
}
</p>
<h2 id="indice" class="!mt-8">Indice</h2>
<h2 id="indice" class="!mt-8">{page.indexLabel}</h2>
<ol class="!mt-3 list-decimal space-y-1.5 pl-5 text-sm leading-relaxed sm:text-base">
{
gdprSections.map((s) => (
sections.map((s) => (
<li>
<a class={link} href={`#${s.id}`}>{s.title}</a>
</li>
@ -52,7 +59,7 @@ const lead =
</ol>
{
gdprSections.map((s) => (
sections.map((s) => (
<section class="mt-10" id={s.id}>
<h2 class="scroll-mt-8 text-lg font-semibold text-nx-fg sm:text-xl">
{s.title}

View File

@ -9,10 +9,10 @@ import {
getSiteMeta,
getNavigation,
getHero,
stats,
getStats,
getServices,
getStackSection,
productsSection,
getProductsSection,
getFaq,
getCta,
} from '../data/home';
@ -23,8 +23,10 @@ const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
const navigation = getNavigation(currentLocale);
const siteMeta = getSiteMeta(currentLocale);
const hero = getHero(currentLocale);
const stats = getStats(currentLocale);
const services = getServices(currentLocale);
const stackSection = getStackSection(currentLocale);
const productsSection = getProductsSection(currentLocale);
const faq = getFaq(currentLocale);
const cta = getCta(currentLocale);
const infrastructureCarouselItems = stackSection.infrastructureCarousel.items;

View File

@ -1,66 +1,66 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import {
modelloOrganizzativo,
modelloOrganizzativoRuoli,
modelloOrganizzativoGovernance,
modelloOrganizzativoResponsabilitaSintesi,
modelloOrganizzativoControlliLean,
modelloOrganizzativoKpi,
modelloOrganizzativoDocumentazione,
modelloOrganizzativoPiano30,
modelloOrganizzativoOutsourcing,
modelloOrganizzativoNote,
modelloOrganizzativoFlussiDecisionali,
} from '../data/modello-organizzativo';
import { getModelloOrganizzativo } from '../data/modello-organizzativo';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
const m = getModelloOrganizzativo(currentLocale);
const { page } = m;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
const tbl = 'min-w-[22rem] 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 tableWrap = 'mt-2 overflow-x-auto';
const mark = (on?: boolean) => (on ? '●' : '');
---
<SubpageLayout
title="Modello organizzativo — NexStudio"
description="Modello organizzativo NexStudio: governance, ruoli, RACI, controlli lean, KPI, piano 30 giorni — per le linee LexAura (Legal Tech) e MediAura (Health Tech)."
heading="Modello organizzativo"
lead="Ruoli, ritmi di governo, processi e controlli «lean» in una software house con SaaS a elevata regolamentazione. Complementare al codice etico. Non sostituisce statuti, modelli di compliance societari (es. 231) né pareri legali: andate in parallelo con struttura reale e consulenti."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<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">
{modelloOrganizzativo.introBox}
{m.introBox}
</p>
<p class="mt-3 text-sm leading-relaxed text-nx-muted sm:text-base">
{modelloOrganizzativo.perimetro}
{m.perimetro}
</p>
<h2 id="indice" class="!mt-8">Indice</h2>
<h2 id="indice" class="!mt-8">{page.indexTitle}</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="#ruoli">Ruoli e perimetro</a></li>
<li><a class={link} href="#governance">Governance essenziale</a></li>
<li><a class={link} href="#responsabilita">Principali responsabilità (sintesi)</a></li>
<li><a class={link} href="#raci">RACI per processi critici</a></li>
<li><a class={link} href="#flussi">Flussi decisionali rapidi</a></li>
<li><a class={link} href="#controlli">Controlli minimi obbligatori (lean)</a></li>
<li><a class={link} href="#kpi">KPI essenziali</a></li>
<li><a class={link} href="#documentazione">Documentazione minima da mantenere</a></li>
<li><a class={link} href="#piano-30">Primo piano operativo (30 giorni)</a></li>
<li><a class={link} href="#outsourcing">Outsourcing consigliato</a></li>
<li><a class={link} href="#note">Note pratiche e raccomandazioni</a></li>
{
page.index.map((item) => (
<li>
<a class={link} href={item.href}>
{item.label}
</a>
</li>
))
}
</ol>
<h2 id="ruoli">1. Ruoli e perimetro</h2>
<h2 id="ruoli">{page.sectionTitles.ruoli}</h2>
<p>
Elenco sintetico delle funzioni e delle attese di impegno. Per allineare il dominio
prodotto (Legal Tech, Health Tech) a ruoli e consiglieri, fate riferimento anche a <a
class={link}
href="/codice-etico">codice etico</a
> e, per i trattamenti di dati, a privacy policy e DPA.
{page.ruoliIntroBefore}{' '}
<a class={link} href={localize(page.codiceEticoHref)}>{page.codiceEticoLabel}</a>
{' '}
{page.ruoliIntroAfter}
</p>
<ul>
{
modelloOrganizzativoRuoli.map((r) => (
m.ruoli.map((r) => (
<li>
<strong>{r.label}:</strong> {r.text}
</li>
@ -68,217 +68,85 @@ const tableWrap = 'mt-2 overflow-x-auto';
}
</ul>
<h2 id="governance">2. Governance essenziale</h2>
<h2 id="governance">{page.sectionTitles.governance}</h2>
<ul>
{
modelloOrganizzativoGovernance.map((g) => (
m.governance.map((g) => (
<li>
<strong>{g.nome}:</strong> {g.partecipanti}. <span class="text-nx-muted/95">— {g.nota}</span>
<strong>{g.nome}:</strong> {g.partecipanti}.{' '}
<span class="text-nx-muted/95">— {g.nota}</span>
</li>
))
}
</ul>
<h2 id="responsabilita">3. Principali responsabilità (sintesi)</h2>
<h2 id="responsabilita">{page.sectionTitles.responsabilita}</h2>
<ul>
{modelloOrganizzativoResponsabilitaSintesi.map((l) => <li>{l}</li>)}
{m.responsabilitaSintesi.map((l) => <li>{l}</li>)}
</ul>
<h2 id="raci">4. RACI sintetico per processi critici</h2>
<h2 id="raci">{page.sectionTitles.raci}</h2>
<p>
Legenda: <strong>R</strong> = Responsible, <strong>A</strong> = Accountable,
<strong>C</strong> = Consulted, <strong>I</strong> = Informed.
<strong>{page.raciLegendBefore}</strong> {page.raciLegend}
</p>
<h3 class="!mt-5" id="raci-release">Rilascio in produzione</h3>
<div class={tableWrap}>
<table class={tbl}>
<thead>
<tr>
<th class={th} scope="col">Ruolo</th>
<th class={th} scope="col">R</th>
<th class={th} scope="col">A</th>
<th class={th} scope="col">C</th>
<th class={th} scope="col">I</th>
</tr>
</thead>
<tbody>
<tr>
<td class={td}>Lead engineer</td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>CTO</td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Security lead, DPO, product advisor</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>CEO, customer success</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
</tr>
</tbody>
</table>
</div>
{
m.raci.map((matrix) => (
<>
<h3 class:list={[matrix.id === 'raci-release' && '!mt-5']} id={matrix.id}>
{matrix.title}
</h3>
{'note' in matrix && matrix.note ? (
<p class="text-sm text-nx-muted sm:text-base">
{matrix.note}{' '}
<a class={link} href={localize(matrix.noteLinkHref!)}>
{matrix.noteLinkLabel}
</a>
{'noteAfter' in matrix ? matrix.noteAfter : null}
</p>
) : null}
<div class={tableWrap}>
<table class={tbl}>
<thead>
<tr>
<th class={th} scope="col">
{page.roleCol}
</th>
<th class={th} scope="col">
R
</th>
<th class={th} scope="col">
A
</th>
<th class={th} scope="col">
C
</th>
<th class={th} scope="col">
I
</th>
</tr>
</thead>
<tbody>
{matrix.rows.map((row) => (
<tr>
<td class={td}>{row.role}</td>
<td class={td}>{mark(row.r)}</td>
<td class={td}>{mark(row.a)}</td>
<td class={td}>{mark(row.c)}</td>
<td class={td}>{mark(row.i)}</td>
</tr>
))}
</tbody>
</table>
</div>
</>
))
}
<h3 id="raci-incident">Incident response (violazione dei dati o incidente P0)</h3>
<div class={tableWrap}>
<table class={tbl}>
<thead>
<tr>
<th class={th} scope="col">Ruolo</th>
<th class={th} scope="col">R</th>
<th class={th} scope="col">A</th>
<th class={th} scope="col">C</th>
<th class={th} scope="col">I</th>
</tr>
</thead>
<tbody>
<tr>
<td class={td}>Security lead</td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>CEO</td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>DPO, legal, CTO</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Clienti interessati, board (se impatto elevato)</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
</tr>
</tbody>
</table>
</div>
<h3 id="raci-vendor">Onboarding vendor (sub-processore)</h3>
<div class={tableWrap}>
<table class={tbl}>
<thead>
<tr>
<th class={th} scope="col">Ruolo</th>
<th class={th} scope="col">R</th>
<th class={th} scope="col">A</th>
<th class={th} scope="col">C</th>
<th class={th} scope="col">I</th>
</tr>
</thead>
<tbody>
<tr>
<td class={td}>Operations</td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Legal</td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Security lead, DPO</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>CTO, finance</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
</tr>
</tbody>
</table>
</div>
<h3 id="raci-dpia">DPIA (per perimetro: LexAura, MediAura, piattaforma)</h3>
<p class="text-sm text-nx-muted sm:text-base">
La matrice RACI non sostituisce il criterio legale (chi è titolare, chi responsabile) definito
in contratti e in <a class={link} href="/codice-etico#tutela-dati-ruoli">§5.1 del codice etico</a
>. Qui: chi coordina lesercizio interno della valutazione dimpatto.
</p>
<div class={tableWrap}>
<table class={tbl}>
<thead>
<tr>
<th class={th} scope="col">Ruolo</th>
<th class={th} scope="col">R</th>
<th class={th} scope="col">A</th>
<th class={th} scope="col">C</th>
<th class={th} scope="col">I</th>
</tr>
</thead>
<tbody>
<tr>
<td class={td}>DPO</td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Legal</td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>Product advisor, CTO, security lead</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
<td class={td}></td>
</tr>
<tr>
<td class={td}>CEO</td>
<td class={td}></td>
<td class={td}></td>
<td class={td}></td>
<td class={td}>●</td>
</tr>
</tbody>
</table>
</div>
<h2 id="flussi">5. Flussi decisionali rapidi</h2>
<h2 id="flussi">{page.sectionTitles.flussi}</h2>
<ul>
{
modelloOrganizzativoFlussiDecisionali.map((f) => (
m.flussiDecisionali.map((f) => (
<li>
<strong>{f.titolo}:</strong> {f.testo}
</li>
@ -286,15 +154,15 @@ const tableWrap = 'mt-2 overflow-x-auto';
}
</ul>
<h2 id="controlli">6. Controlli minimi obbligatori (lean)</h2>
<h2 id="controlli">{page.sectionTitles.controlli}</h2>
<ul>
{modelloOrganizzativoControlliLean.map((c) => <li>{c}</li>)}
{m.controlliLean.map((c) => <li>{c}</li>)}
</ul>
<h2 id="kpi">7. KPI essenziali</h2>
<h2 id="kpi">{page.sectionTitles.kpi}</h2>
<ul>
{
modelloOrganizzativoKpi.map((k) => (
m.kpi.map((k) => (
<li>
<strong>{k.area}:</strong> {k.testo}
</li>
@ -302,15 +170,15 @@ const tableWrap = 'mt-2 overflow-x-auto';
}
</ul>
<h2 id="documentazione">8. Documentazione minima da mantenere</h2>
<h2 id="documentazione">{page.sectionTitles.documentazione}</h2>
<ul>
{modelloOrganizzativoDocumentazione.map((d) => <li>{d}</li>)}
{m.documentazione.map((d) => <li>{d}</li>)}
</ul>
<h2 id="piano-30">9. Primo piano operativo (30 giorni)</h2>
<h2 id="piano-30">{page.sectionTitles.piano30}</h2>
<ol>
{
modelloOrganizzativoPiano30.map((p) => (
m.piano30.map((p) => (
<li>
<strong>{p.quando}:</strong> {p.testo}
</li>
@ -318,10 +186,10 @@ const tableWrap = 'mt-2 overflow-x-auto';
}
</ol>
<h2 id="outsourcing">10. Outsourcing consigliato (per restare snelli)</h2>
<h2 id="outsourcing">{page.sectionTitles.outsourcing}</h2>
<ul>
{
modelloOrganizzativoOutsourcing.map((o) => (
m.outsourcing.map((o) => (
<li>
<strong>{o.titolo}:</strong> {o.testo}
</li>
@ -329,9 +197,9 @@ const tableWrap = 'mt-2 overflow-x-auto';
}
</ul>
<h2 id="note">11. Note pratiche e raccomandazioni</h2>
<h2 id="note">{page.sectionTitles.note}</h2>
<ul>
{modelloOrganizzativoNote.map((n) => <li>{n}</li>)}
{m.note.map((n) => <li>{n}</li>)}
</ul>
</div>
</SubpageLayout>

View File

@ -1,37 +1,56 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import type { SupportedLocale } from '../data/home/navigation';
import { getNews } from '../data/news';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const news = getNews(currentLocale);
const { page, statusBanner, sections, contact } = news;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
---
<SubpageLayout
title="Novità — NexStudio"
description="Novità, release e articoli da NexStudio."
heading="Novità"
lead="Aggiornamenti ufficiali su piattaforma, compliance, infrastruttura e contenuti editoriali."
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<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.
{statusBanner}
</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>
{
sections.map((s) => (
<>
<h2>{s.title}</h2>
{s.bullets && s.bullets.length > 0 ? (
<ul>
{s.bullets.map((b) => (
<li>
{b.title ? <strong>{b.title}</strong> : null} {b.text}
</li>
))}
</ul>
) : null}
{s.paragraphs?.map((p) => (
<p class="text-nx-muted">{p}</p>
))}
</>
))
}
<h2>Canali di distribuzione</h2>
<ul>
<li>Questa pagina resta il punto di riferimento ufficiale per annunci e changelog sintetici.</li>
<li>La newsletter è attiva dal footer del sito (iscrizione con conferma email).</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">
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>.
{contact.before}
<a href={localize(contact.href)} class="text-sky-300 hover:text-sky-200">{contact.linkLabel}</a>
{contact.after}
</p>
</SubpageLayout>

View File

@ -1,50 +1,57 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import {
privacyCrossReferences,
privacyDocument,
privacyRiferimenti,
privacySections,
} from '../data/privacy';
import type { SupportedLocale } from '../data/home/navigation';
import { getPrivacy } from '../data/privacy';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const privacy = getPrivacy(currentLocale);
const { document: privacyDocument, riferimenti, sections, page } = privacy;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
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 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 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}
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<div>
<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> {privacyDocument.version}
<span class="font-medium text-nx-fg">{page.versionLabel}</span> {privacyDocument.version}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">In vigore dal</span> {privacyDocument.inVigoreDal}
<span class="font-medium text-nx-fg">{page.inForceFromLabel}</span> {privacyDocument.inVigoreDal}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">Ultimo aggiornamento</span>{' '}
<span class="font-medium text-nx-fg">{page.lastUpdateLabel}</span>{' '}
{privacyDocument.ultimoAggiornamento}
</p>
<p class="!mt-5 text-sm text-nx-muted sm:text-base">
Documenti connessi:{' '}
{page.relatedDocsLabel}:{' '}
{
privacyRiferimenti.map((r, i) => (
riferimenti.map((r, i) => (
<span>
{i > 0 && <span class="text-nx-muted/80"> · </span>}
<a class={link} href={r.href}>{r.label}</a>
<a class={link} href={localize(r.href)}>{r.label}</a>
</span>
))
}
</p>
<h2 id="indice" class="!mt-8">Indice</h2>
<h2 id="indice" class="!mt-8">{page.indexLabel}</h2>
<ol class="!mt-3 list-decimal space-y-1.5 pl-5 text-sm leading-relaxed sm:text-base">
{
privacySections.map((s) => (
sections.map((s) => (
<li>
<a class={link} href={`#${s.id}`}>{s.title}</a>
</li>
@ -53,7 +60,7 @@ const lead =
</ol>
{
privacySections.map((s) => (
sections.map((s) => (
<section class="mt-10" id={s.id}>
<h2
class="scroll-mt-8 text-lg font-semibold text-nx-fg sm:text-xl"

View File

@ -1,42 +1,54 @@
---
import SubpageLayout from '../layouts/SubpageLayout.astro';
import { termsDocument, termsSections, termsRiferimenti, termsCrossReferences } from '../data/terms';
import type { SupportedLocale } from '../data/home/navigation';
import { getTerms } from '../data/terms';
const path = Astro.url.pathname;
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
const currentLocale = (localeMatch?.[1] ?? 'it') as SupportedLocale;
const terms = getTerms(currentLocale);
const { document: termsDocument, riferimenti, sections, page } = terms;
const localize = (href: string) => {
if (currentLocale === 'it') return href;
if (href.startsWith(`/${currentLocale}`)) return href;
if (href.startsWith('/#')) return `/${currentLocale}${href}`;
if (href.startsWith('/')) return `/${currentLocale}${href}`;
return href;
};
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 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 duso — NexStudio"
description="Condizioni duso 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 duso"
lead={lead}
title={page.title}
description={page.description}
heading={page.heading}
lead={page.lead}
>
<div>
<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> {termsDocument.version}
<span class="font-medium text-nx-fg">{page.versionLabel}</span> {termsDocument.version}
<span class="text-nx-muted/80"> · </span>
<span class="font-medium text-nx-fg">In vigore dal</span> {termsDocument.inVigoreDal}
<span class="font-medium text-nx-fg">{page.inForceFromLabel}</span> {termsDocument.inVigoreDal}
</p>
<p class="!mt-5 text-sm text-nx-muted sm:text-base">
Documenti connessi:{' '}
{page.relatedDocsLabel}:{' '}
{
termsRiferimenti.map((r, i) => (
riferimenti.map((r, i) => (
<span>
{i > 0 && <span class="text-nx-muted/80"> · </span>}
<a class={link} href={r.href}>{r.label}</a>
<a class={link} href={localize(r.href)}>{r.label}</a>
</span>
))
}
</p>
<h2 id="indice" class="!mt-8">Indice</h2>
<h2 id="indice" class="!mt-8">{page.indexLabel}</h2>
<ol class="!mt-3 list-decimal space-y-1.5 pl-5 text-sm leading-relaxed sm:text-base">
{
termsSections.map((s) => (
sections.map((s) => (
<li>
<a class={link} href={`#${s.id}`}>{s.title}</a>
</li>
@ -45,7 +57,7 @@ const lead =
</ol>
{
termsSections.map((s) => (
sections.map((s) => (
<section class="mt-10" id={s.id}>
<h2
class="scroll-mt-8 text-lg font-semibold text-nx-fg sm:text-xl"