Files
InsanityLab-web/src/pages/piattaforme/index.astro
T
Adriano c4eb598a3a Piattaforme riservate: ruolo dedicato e port della dashboard Stress Index
Il ruolo `campus` diventa `piattaforme` e non apre più solo la sezione
Biohacking: copre tutte le aree riservate, con migrazione guardata sugli
utenti esistenti. Nell'header la vecchia voce Biohacking lascia il posto a
un menu Piattaforme con i due link, visibile solo a chi ha il ruolo, e
/piattaforme diventa la pagina di atterraggio.

Stress Index è portata dentro il sito: le nove viste dell'area
professionisti diventano pagine Astro sotto /piattaforme/stress-index,
con lo stile del sito al posto del design system del prototipo. React
resta solo dove serve davvero — grafici recharts e scheda cliente — il
resto è Astro con un filo di JS. I dati sono ancora quelli dimostrativi,
raccolti in lib/stress-index/data.ts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:49:47 +02:00

47 lines
2.0 KiB
Plaintext

---
// Indice delle piattaforme riservate: è la pagina di atterraggio del ruolo `piattaforme`
// (vedi landingFor in lib/auth). L'accesso è già filtrato dal middleware.
import Base from '../../layouts/Base.astro';
import { piattaforme } from '../../data/piattaforme';
export const prerender = false;
---
<Base title="Piattaforme" description="Le piattaforme riservate InsanityLab.">
<section class="section plat-index">
<div class="container">
<p class="plat-index__eyebrow">Area riservata</p>
<h1>Piattaforme</h1>
<p class="plat-index__lead">Gli strumenti riservati agli utenti abilitati.</p>
<div class="plat-index__grid">
{piattaforme.map((p) => (
<a class="plat-card" href={p.href}>
<h2 class="plat-card__title">{p.label}</h2>
<p class="plat-card__desc">{p.description}</p>
<span class="plat-card__cta">Entra</span>
</a>
))}
</div>
</div>
</section>
</Base>
<style>
.plat-index__eyebrow {
font-family: var(--font-heading); font-size: .72rem; font-weight: 600; letter-spacing: .18em;
text-transform: uppercase; color: var(--c-accent-dark); margin: 0 0 .6em;
}
.plat-index__lead { max-width: 46ch; color: var(--c-text-light); margin-bottom: 46px; }
.plat-index__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; }
.plat-card {
display: block; text-decoration: none; background: var(--c-bg-alt); padding: 34px 30px 30px;
border-top: 3px solid var(--c-accent); transition: transform .3s ease, box-shadow .3s ease;
}
.plat-card:hover { transform: translateY(-4px); box-shadow: 0 14px 30px rgba(0,0,0,.08); }
.plat-card__title { font-size: 1.25rem; margin-bottom: .4em; }
.plat-card__desc { color: var(--c-text-light); font-size: .92rem; margin-bottom: 1.4em; }
.plat-card__cta {
font-family: var(--font-heading); font-size: .72rem; font-weight: 600; letter-spacing: .18em;
text-transform: uppercase; color: var(--c-accent-dark);
}
.plat-card__cta::after { content: ' →'; }
</style>