3cda76b4c4
Le due sezioni erano ferme al prototipo locale, più povero della piattaforma vera. Analytics ha ora l'intervallo di date, i KPI con la nota sotto il valore, la distribuzione dello score a quattro serie per fascia, le classifiche per recupero medio col numero di misurazioni e il confronto segmenti con selettore di dimensione. Sport diventa Dashboard, Sessioni con filtri atleta/periodo/sport e schede atleta con carico e tendenza. I numeri non sono più costanti scritte a mano: si calcolano dai dati nel periodo scelto. La logica sta in lib/stress-index/analytics.ts e sport.ts, coperta da test — che hanno subito trovato uno slittamento delle settimane dovuto alle date costruite in ora locale invece che in UTC. Le sessioni hanno ora ora di inizio, HR max, RPE e durata al secondo, che il prototipo non prevedeva. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
77 lines
2.5 KiB
Plaintext
77 lines
2.5 KiB
Plaintext
---
|
|
// Layout della piattaforma Stress Index. Come il Campus: token, font e palette del sito,
|
|
// senza Header e Footer pubblici — la navigazione è tutta interna alla piattaforma.
|
|
import '@fontsource/montserrat/400.css';
|
|
import '@fontsource/montserrat/500.css';
|
|
import '@fontsource/montserrat/600.css';
|
|
import '@fontsource/open-sans/400.css';
|
|
import '@fontsource/open-sans/600.css';
|
|
import '../styles/global.css';
|
|
import '../styles/stress-index.css';
|
|
import { professional } from '../lib/stress-index/data';
|
|
|
|
interface Props {
|
|
title: string;
|
|
/** Voci di percorso mostrate nella topbar, dopo "Stress Index". */
|
|
crumbs?: string[];
|
|
}
|
|
const { title, crumbs = [] } = Astro.props;
|
|
const path = Astro.url.pathname;
|
|
|
|
const BASE = '/piattaforme/stress-index';
|
|
const NAV = [
|
|
{ href: BASE, label: 'Oggi' },
|
|
{ href: `${BASE}/clienti`, label: 'Clienti' },
|
|
{ href: `${BASE}/analytics`, label: 'Analytics' },
|
|
{ href: `${BASE}/sport`, label: 'Sport', badge: 'Pro' },
|
|
{ href: `${BASE}/sport/team-live`, label: 'Team live' },
|
|
{ href: `${BASE}/impostazioni`, label: 'Impostazioni' },
|
|
{ href: `${BASE}/organizzazione`, label: 'Organizzazione' },
|
|
];
|
|
---
|
|
<!doctype html>
|
|
<html lang="it">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>{title} — Stress Index InsanityLab</title>
|
|
<meta name="robots" content="noindex, nofollow" />
|
|
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
</head>
|
|
<body class="si">
|
|
<input type="checkbox" id="si-menu" class="si-menu-toggle" hidden />
|
|
<label for="si-menu" class="si-menu-btn" aria-label="Apri il menu">☰ Menu</label>
|
|
|
|
<aside class="si-side">
|
|
<a class="si-brand" href={BASE}>
|
|
<span class="eyebrow">InsanityLab</span>
|
|
Stress Index
|
|
</a>
|
|
<a class="si-home" href="/piattaforme">Piattaforme</a>
|
|
|
|
<nav class="si-nav">
|
|
{NAV.map((item) => (
|
|
<a
|
|
href={item.href}
|
|
class:list={['si-nav__link', { 'is-active': path === item.href }]}
|
|
>
|
|
{item.label}
|
|
{item.badge && <span class="si-nav__badge">{item.badge}</span>}
|
|
</a>
|
|
))}
|
|
</nav>
|
|
</aside>
|
|
|
|
<div class="si-body">
|
|
<header class="si-top">
|
|
<p class="si-top__crumbs">
|
|
<strong>Stress Index</strong>
|
|
{crumbs.map((c) => <span> / {c}</span>)}
|
|
</p>
|
|
<p class="si-top__studio">{professional.studio}</p>
|
|
</header>
|
|
<main class="si-main"><slot /></main>
|
|
</div>
|
|
</body>
|
|
</html>
|