Files
InsanityLab-web/src/layouts/StressIndex.astro
T
Adriano 3cda76b4c4 Stress Index: Analytics e Sport rifatti sulle viste reali
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>
2026-07-31 16:20:40 +02:00

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>