"""Render the v5 app shell around a validated, non-executable JSON bundle."""
from __future__ import annotations

import html
from typing import Any

from dashboard_v5.contracts import safe_json

VIEW_LABELS = (
    ("today", "Heute", "Heute"), ("cockpit", "Cockpit", "Trend"), ("explorer", "Explorer", "Daten"),
    ("nutrition", "Ernährung", "Essen"), ("doctor", "Arzt", "Arzt"),
)


def render(
    bundle: dict[str, Any], *, echarts_prototype: bool = False,
    explorer_6c: bool = False, calendar_day_6d: bool = False,
    health_record_6e: bool = False,
) -> str:
    payload = safe_json(bundle)
    calendar_day_6d = calendar_day_6d or health_record_6e
    explorer_6c = explorer_6c or calendar_day_6d or health_record_6e
    base_labels = tuple((key, "Akte" if key == "doctor" and health_record_6e else label, "Akte" if key == "doctor" and health_record_6e else short) for key, label, short in VIEW_LABELS)
    view_labels = base_labels + (("calendar", "Kalender", "Kalender"),) if calendar_day_6d else base_labels
    nav = "".join(
        f"<button type='button' class='nav-item' data-dashboard-view='{key}' role='tab' aria-label='{html.escape(label)}' aria-controls='view-{key}' aria-selected='{'true' if key == 'today' else 'false'}'><span class='nav-label-full'>{html.escape(label)}</span><span class='nav-label-short' aria-hidden='true'>{html.escape(short_label)}</span></button>"
        for key, label, short_label in view_labels
    )
    periods = "".join(
        f"<button type='button' data-dashboard-period='{value}' aria-pressed='{'true' if value == '30' else 'false'}'>{label}</button>"
        for value, label in (("7", "7 T"), ("30", "30 T"), ("90", "90 T"), ("180", "180 T"), ("all", "Alle"))
    )
    symptom_fields = "".join(
        f"<label><span>{label}</span><select name='{key}' required><option value=''>–</option>"
        + "".join(f"<option value='{score}'>{score}</option>" for score in range(4))
        + "</select></label>"
        for key, label in (
            ("aphthen", "Aphthen"), ("gi", "GI/Darm"), ("fatigue", "Fatigue"),
            ("skin", "Haut"), ("eyes", "Augen"), ("joints", "Gelenke"), ("vascular", "Vaskulär"),
        )
    )
    prototype_controls = "".join(
        f"<div class='prototype-series-control'><button type='button' data-prototype-series-toggle data-series='Synthetische Reihe {index}' aria-pressed='true'>Reihe {index}</button><button type='button' data-prototype-series-solo data-series='Synthetische Reihe {index}' aria-label='Nur synthetische Reihe {index} anzeigen'>solo</button></div>"
        for index in range(1, 9)
    )
    prototype_markup = f"""
<article class='v5-card echarts-prototype' data-echarts-prototype data-prototype-ready='false' data-pan-active='false' data-brush-active='false'>
  <div class='panel-heading'><div><span class='v5-badge'>Sprint 6A · nur synthetisch</span><h3>Apache-ECharts-Interaktionsprototyp</h3></div><p>365 Tage, acht deterministische Reihen; keine produktiven Gesundheitsdaten.</p></div>
  <div class='prototype-toolbar' role='group' aria-label='Synthetische Chartinteraktionen'><button type='button' data-prototype-action='zoom-90'>Letzte 90 Tage</button><button type='button' data-prototype-action='zoom-all'>Gesamtzeitraum</button><button type='button' data-prototype-action='pan'>Drag/Pan</button><button type='button' data-prototype-action='brush'>Bereich auswählen</button><button type='button' data-prototype-action='clear-brush'>Auswahl löschen</button><button type='button' data-prototype-action='all'>Reihen zurücksetzen</button></div>
  <div class='prototype-series-controls' aria-label='Synthetische Reihen ein- oder ausblenden'>{prototype_controls}</div>
  <p class='prototype-legend-note'><span class='reference-swatch' aria-hidden='true'></span>Synthetisches Referenzband: 40–60. <span class='event-swatch' aria-hidden='true'>◆</span>E1, E2 und E3 markieren synthetische Ereignisse. Muster, Text und Form ergänzen Farbe.</p>
  <div class='prototype-chart' data-prototype-chart role='img' aria-label='Synthetischer Verlauf mit acht Reihen über 365 Tage'></div>
  <p class='v5-meta'>Ausgewählter Tag: <time data-prototype-selected-day datetime='2025-07-14'>noch keiner</time></p><p class='sr-summary' data-prototype-status aria-live='polite'></p>
  <details class='prototype-table-wrap'><summary>Zugängliche synthetische Datentabelle</summary><div class='table-scroll'><table><caption>365 synthetische Tage und acht synthetische Reihen; Datumsschaltflächen lösen denselben dokumentierten ISO-Callback wie Chartpunkte aus.</caption><thead><tr><th>Datum</th>{''.join(f'<th>Reihe {index}</th>' for index in range(1, 9))}</tr></thead><tbody></tbody></table></div></details>
</article>
""" if echarts_prototype else ""
    prototype_scripts = (
        "<script src='/health-assets/echarts-6.1.0.min.js'></script>"
        "<script src='/health-assets/dashboard-v5-echarts-prototype.js'></script>"
        if echarts_prototype else ""
    )
    echarts_scripts = (
        "<script src='/health-assets/echarts-6.1.0.min.js'></script>"
        "<script src='/health-assets/dashboard-v5-echarts.js'></script>"
        if explorer_6c else ""
    )
    explorer_scripts = "<script src='/health-assets/dashboard-v5-api-explorer.js'></script>" if explorer_6c else ""
    cockpit_chart = (
        "<div id='cockpit-chart' class='v5-echart' role='img' aria-label='Gesundheitsverlauf'></div>"
        if explorer_6c
        else "<canvas id='cockpit-chart' aria-label='Gesundheitsverlauf' role='img'></canvas>"
    )
    calendar_header = (
        "<button type='button' data-today-day-open>Heutigen Tag öffnen</button>"
        if calendar_day_6d else ""
    )
    calendar_markup = """
<section id='view-calendar' class='app-view calendar-view' data-calendar-day-enabled='1' data-dashboard-panel='calendar' aria-labelledby='title-calendar' hidden>
  <div class='view-heading'><div><span class='eyebrow'>Dokumentierte Tage</span><h2 id='title-calendar' tabindex='-1'>Kalender</h2></div><p class='context-note'>Kalenderkategorien zeigen vorhandene Dokumentation, keine medizinische Bewertung.</p></div>
  <div class='calendar-toolbar' aria-label='Kalender steuern'><button type='button' data-calendar-previous>Vorheriger Monat</button><strong data-calendar-title aria-live='polite'></strong><button type='button' data-calendar-today>Heute</button><button type='button' data-calendar-next>Nächster Monat</button><label class='calendar-month-picker'>Monat <input type='month' data-calendar-month></label></div>
  <div class='calendar-legend' aria-label='Kategorien'><span>● Messwerte</span><span>● Symptome</span><span>● Ernährung</span><span>● Medikamente</span><span>● Labor</span><span>● Dokumente</span><span>● Termine/Ereignisse</span></div>
  <div data-calendar-status role='status' aria-live='polite'></div>
  <div class='calendar-grid' data-calendar-grid aria-labelledby='title-calendar'></div>
  <div class='calendar-range-panel v5-surface'><div><label>Von <input type='date' data-calendar-range-from></label><label>Bis <input type='date' data-calendar-range-to></label></div><button type='button' data-calendar-range-compare disabled>Zeitraum im Explorer vergleichen</button><p data-calendar-selected aria-live='polite'>Bereich im Kalender ziehen oder Von/Bis eingeben.</p></div>
</section>
<section id='view-day' class='app-view day-view' data-dashboard-panel='day' aria-labelledby='title-day' hidden>
  <div class='day-hero v5-surface'><div><span class='eyebrow'>Tagesübersicht</span><h2 id='title-day' data-day-title tabindex='-1'>Tag</h2><p data-day-weekday class='day-weekday'></p></div><div class='day-toolbar'><button type='button' data-day-previous>Vorheriger Tag</button><button type='button' data-day-next>Nächster Tag</button><button type='button' data-day-today>Heute</button><button type='button' data-day-calendar>Kalender öffnen</button><button type='button' data-day-compare>Im Explorer vergleichen</button><button type='button' data-day-symptom>Symptome erfassen</button></div></div>
  <div data-day-status role='status' aria-live='polite'></div>
  <div data-day-summary class='day-kpi-grid'></div>
  <div data-day-notices class='day-notices'></div>
  <section class='day-context-section' aria-labelledby='day-context-title'><div class='section-heading'><div><span class='eyebrow'>7-Tage-Kontext</span><h3 id='day-context-title'>Dokumentierte Messwerte</h3></div><p>Persönlicher Verlauf; fehlende Werte bleiben unbekannt.</p></div><div data-day-context class='day-context-grid'></div></section>
  <div class='day-sections'>
    <section class='v5-surface' data-day-section='symptoms'><h3>Symptome</h3><div data-day-symptoms></div></section>
    <section class='v5-surface' data-day-section='nutrition'><h3>Ernährung</h3><div data-day-nutrition></div></section>
    <section class='v5-surface' data-day-section='medications'><h3>Medikamente</h3><div data-day-medications></div></section>
    <section class='v5-surface' data-day-section='labs'><h3>Labor</h3><div data-day-labs></div></section>
    <section class='v5-surface' data-day-section='events'><h3>Termine und Ereignisse</h3><div data-day-events></div></section>
    <section class='v5-surface' data-day-section='documents'><h3>Dokumente</h3><div data-day-documents></div></section>
  </div>
  <section class='day-missing v5-surface'><h3>Nicht erfasst</h3><p data-day-missing></p></section>
  <details class='v5-surface day-provenance'><summary>Details und Datenherkunft</summary><p data-day-technical></p></details>
</section>
""" if calendar_day_6d else ""
    calendar_scripts = (
        "<script src='/health-assets/fullcalendar-6.1.21.min.js'></script>"
        "<script src='/health-assets/dashboard-v5-day-controller.js'></script>"
        if calendar_day_6d else ""
    )
    record_markup = """
<section id='view-doctor' class='app-view record-view' data-dashboard-panel='doctor' aria-labelledby='title-doctor' hidden>
  <div class='record-hero'><div><span class='eyebrow'>Persönliche Gesundheitsakte</span><h2 id='title-doctor' tabindex='-1'>Gesundheitsakte</h2><p class='context-note'>Dokumentierte Fakten; keine Diagnose, Kausalitäts- oder Therapieaussage.</p></div><button type='button' data-record-back>Zur Übersicht</button></div>
  <nav class='record-tabs' aria-label='Bereiche der Gesundheitsakte'><button type='button' data-record-tab='overview'>Übersicht</button><button type='button' data-record-tab='labs'>Labore</button><button type='button' data-record-tab='medications'>Medikamente</button><button type='button' data-record-tab='appointments'>Termine</button><button type='button' data-record-tab='documents'>Dokumente</button><button type='button' data-record-tab='report'>Arzt-Zusammenfassung</button></nav>
  <div data-record-breadcrumb class='record-breadcrumb' aria-live='polite'>Akte / Übersicht</div><div data-record-status role='status' aria-live='polite'></div><div data-record-content></div>
</section>
""" if health_record_6e else """<section id='view-doctor' class='app-view' data-dashboard-panel='doctor' aria-labelledby='title-doctor' hidden><h2 id='title-doctor'>Arzt</h2><p class='context-note'>Nur gegen das Original verifizierte, kanonisch freigegebene Laborwerte. Fehlende oder unvollständige Daten bleiben unbekannt. Keine Diagnose, Kausalitätsaussage oder Therapieempfehlung.</p><div id='doctor-medication'></div><h3>Verifizierte Labore</h3><div id='verified-labs'></div><button type='button' id='print-view'>Drucken</button></section>"""
    record_scripts = "<script src='/health-assets/dashboard-v5-record.js'></script>" if health_record_6e else ""
    range_scripts = "<script src='/health-assets/dashboard-v5-range.js'></script>" if explorer_6c else ""
    global_search_markup = """<button type='button' class='global-search-open' data-global-search-open aria-haspopup='dialog' aria-controls='global-search-dialog'>Suchen <span aria-hidden='true'>⌘K</span></button><dialog id='global-search-dialog' class='global-search-dialog' data-global-search-dialog aria-labelledby='global-search-title'><div class='global-search-header'><h2 id='global-search-title'>Globale Suche</h2><button type='button' data-global-search-close aria-label='Suche schließen'>×</button></div><label for='global-search-input'>Gesundheitsdaten durchsuchen</label><div class='global-search-input-row'><input id='global-search-input' type='search' data-global-search-input autocomplete='off'><button type='button' data-global-search-submit>Suchen</button></div><p data-global-search-status role='status' aria-live='polite'></p><div data-global-search-results class='global-search-results'></div></dialog>""" if health_record_6e else ""
    global_search_scripts = "<script src='/health-assets/dashboard-v5-global-search.js'></script>" if health_record_6e else ""
    return f"""<!doctype html>
<html lang='de'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'>
<title>JARVIS Health Dashboard v5</title>
<meta name='health-browser-session-csrf' content='__BROWSER_SESSION_CSRF__'>
<link rel='icon' href='data:,'>
<link rel='stylesheet' href='/health-assets/dashboard-v5.css'>
</head><body><div data-dashboard-v5>
<a class='skip-link' href='#main'>Zum Inhalt</a>
<header class='app-header v5-header'><div><span class='eyebrow'>JARVIS HealthManager</span><h1>Gesundheit</h1></div>
<div class='header-actions'>{calendar_header}{global_search_markup}<span id='active-period-label' hidden>Letzte 30 Tage</span><span id='header-data-status' class='v5-badge'>Datenstand wird geprüft</span><button type='button' id='privacy-toggle' aria-pressed='false'>Privacy</button><button type='button' id='more-toggle' aria-controls='view-more' aria-expanded='false'>Mehr</button></div></header>
<div class='global-controls range-toolbar' data-context-range aria-label='Ansichtsspezifischer Zeitraum' hidden>{periods}<details data-range-details><summary>Von/Bis</summary><div class='range-custom'><label>Von <input type='date' data-range-from></label><label>Bis <input type='date' data-range-to></label><button type='button' data-range-apply>Anwenden</button><p data-range-status role='status' aria-live='polite'></p></div></details></div>
<nav class='bottom-nav' data-dashboard-nav role='tablist' aria-label='Hauptnavigation'>{nav}</nav>
<main id='main' tabindex='-1'>
<section id='view-today' class='app-view' data-dashboard-panel='today' aria-labelledby='title-today'><div class='view-heading'><div><span class='eyebrow'>Tagesübersicht</span><h2 id='title-today'>Heute</h2></div><p class='context-note'>Das Wichtigste aus den zuletzt dokumentierten Daten. Fehlende Werte bleiben unbekannt.</p></div>
<div class='today-grid'><article class='hero-card today-snapshot-card'><h3>Momentaufnahme</h3><div id='today-snapshot'></div></article><article><h3>Aufgaben</h3><div id='today-tasks'></div><p id='today-task-status' class='v5-meta' role='status' aria-live='polite'></p></article><article><h3>Medikation</h3><div id='today-medication'></div></article></div>
<p id='capture-status' class='capture-status v5-meta' role='status' aria-live='polite' data-queued='__CAPTURE_QUEUED__' hidden></p>
<section class='capture-workspace v5-surface' aria-labelledby='capture-workspace-title'><div class='section-heading'><div><span class='eyebrow'>Patienten-Workflows</span><h3 id='capture-workspace-title'>Erfassen</h3></div></div><div class='capture-primary-actions'><button type='button' class='primary-action' id='open-checkin'>Beschwerden erfassen</button><button type='button' class='primary-action' id='open-medication-event'>Medikament dokumentieren</button><button type='button' class='primary-action' id='open-general-event'>Ereignis erfassen</button></div><button type='button' id='open-additional-symptom'>Weitere Beschwerde einzeln erfassen</button><p id='capture-helper' class='v5-meta'>Der bestehende 7-Dimensionen-Tageswert bleibt unverändert. Zusätzliche Beschwerden werden als getrennte Ereignisse dokumentiert.</p></section>
<dialog id='checkin-dialog' aria-labelledby='checkin-title'><form method='post' action='/health-actions/symptom-checkin'><input type='hidden' name='csrf_token' value='__CSRF_TOKEN__'><input type='hidden' name='return_to' value='v5'><input type='hidden' name='date' value='__CAPTURE_DATE__'><h2 id='checkin-title'>Beschwerden erfassen</h2><p class='v5-meta'>Erfassung für <time id='capture-date' datetime='__CAPTURE_DATE__'>__CAPTURE_DATE_LABEL__</time></p><div class='score-grid'>{symptom_fields}</div><label>Notiz, optional<textarea name='notes' maxlength='300'></textarea></label><div class='dialog-actions'><button type='button' data-close-dialog>Abbrechen</button><button type='submit'>Sicher vormerken</button></div></form></dialog>
<dialog id='additional-symptom-dialog' aria-labelledby='additional-symptom-title'><form method='post' action='/health-actions/symptom-event' data-confirm-action='Beschwerde sicher vormerken?'><input type='hidden' name='csrf_token' value='__CSRF_TOKEN__'><input type='hidden' name='return_to' value='v5'><h2 id='additional-symptom-title'>Weitere Beschwerde</h2><label>Zeitpunkt<input type='datetime-local' name='occurred_at' value='__CAPTURE_DATETIME__' required></label><label>Beschwerde<select name='symptom_type' required><option value='headache'>Kopfschmerzen</option><option value='aphthae'>Aphte/Mundulzera</option><option value='gi'>Durchfall/GI-Beschwerden</option><option value='joints'>Gelenkbeschwerden</option><option value='skin'>Hautveränderung</option><option value='eyes'>Augenbeschwerden</option><option value='fatigue'>Müdigkeit/Fatigue</option><option value='other'>Andere Beschwerde</option></select></label><label>Bezeichnung bei „andere“<input name='label' maxlength='80'></label><label>Schweregrad 0–3<select name='severity' required><option value='0'>0</option><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option></select></label><label>Beginn, optional<input type='datetime-local' name='onset_at'></label><label>Dauer in Minuten, optional<input type='number' name='duration_minutes' min='0' max='10080'></label><label>Kurze Notiz<textarea name='notes' maxlength='300'></textarea></label><div class='dialog-actions'><button type='button' data-close-dialog>Abbrechen</button><button type='submit'>Sicher vormerken</button></div></form></dialog>
<dialog id='medication-event-dialog' aria-labelledby='medication-event-title'><form method='post' action='/health-actions/medication-event' data-confirm-action='Medikationsereignis sicher vormerken?'><input type='hidden' name='csrf_token' value='__CSRF_TOKEN__'><input type='hidden' name='return_to' value='v5'><h2 id='medication-event-title'>Medikament dokumentieren</h2><label>Zeitpunkt<input type='datetime-local' name='occurred_at' value='__CAPTURE_DATETIME__' required></label><label>Status<select name='event_type' required><option value='administered'>Eingenommen/verabreicht</option><option value='missed'>Ausgelassen</option><option value='corrected'>Korrigiert</option></select></label><label>Bekanntes Medikament<select name='medication_name' data-known-medications required></select></label><label>Dosis, optional<input name='dose' maxlength='40'></label><label>Einheit, optional<input name='unit' maxlength='30'></label><label>Applikationsart, optional<input name='route' maxlength='60'></label><label>Notiz<textarea name='notes' maxlength='300'></textarea></label><div class='dialog-actions'><button type='button' data-close-dialog>Abbrechen</button><button type='submit'>Sicher vormerken</button></div></form></dialog>
<dialog id='general-event-dialog' aria-labelledby='general-event-title'><form method='post' action='/health-actions/general-event' data-confirm-action='Ereignis sicher vormerken?'><input type='hidden' name='csrf_token' value='__CSRF_TOKEN__'><input type='hidden' name='return_to' value='v5'><h2 id='general-event-title'>Allgemeines Ereignis</h2><label>Zeitpunkt<input type='datetime-local' name='occurred_at' value='__CAPTURE_DATETIME__' required></label><label>Kategorie<select name='category' required><option value='stress'>Stress</option><option value='infection'>Infekt</option><option value='appointment'>Arzttermin/Untersuchung</option><option value='physical_load'>Besondere körperliche Belastung</option><option value='sleep_disruption'>Schlafstörung</option><option value='heat'>Sauna/Hitze</option><option value='travel'>Reise</option><option value='other'>Sonstige Beobachtung</option></select></label><label>Kurze Bezeichnung<input name='label' maxlength='100' required></label><label>Intensität, optional<select name='intensity'><option value=''>Nicht angegeben</option><option value='0'>0</option><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option></select></label><label>Notiz<textarea name='notes' maxlength='300'></textarea></label><div class='dialog-actions'><button type='button' data-close-dialog>Abbrechen</button><button type='submit'>Sicher vormerken</button></div></form></dialog>
</section>
<section id='view-cockpit' class='app-view' data-dashboard-panel='cockpit' aria-labelledby='title-cockpit' hidden><div class='view-heading'><div><span class='eyebrow'>Persönliche Trends</span><h2 id='title-cockpit'>Cockpit</h2></div><p class='context-note'>Dokumentierte Werte im persönlichen Verlauf; keine generische medizinische Bewertung.</p></div><div id='metric-cards' class='metric-grid'></div><article class='chart-panel cockpit-chart-panel'><div class='panel-heading'><div><span class='v5-badge'>Verlauf</span><h3 id='cockpit-chart-title'>Gesundheitsverlauf</h3></div><p id='cockpit-chart-context' class='v5-meta'></p></div>{cockpit_chart}<p id='cockpit-chart-empty' class='v5-empty' hidden>Keine dokumentierten Beobachtungen im gewählten Zeitraum.</p><div id='cockpit-chart-summary' class='sr-summary'></div><details class='v5-card api-explorer-table-wrap'><summary>Zugängliche Datentabelle</summary><div class='table-scroll'><table id='cockpit-chart-table'></table></div></details></article><div id='event-track' class='event-track' aria-label='Ereignisspur'></div></section>
<section id='view-explorer' class='app-view' data-explorer-shell='unified-echarts' data-dashboard-panel='explorer' aria-labelledby='title-explorer' hidden>
  <div class='explorer-heading'><div><span class='eyebrow'>Explorer</span><h2 id='title-explorer'>Gesundheitsverläufe</h2></div><p class='context-note'>Einheitliche ECharts-Verlaufsansicht. Dokumentierte Werte ohne Diagnose-, Kausalitäts- oder Therapieaussage.</p></div>
  <div data-api-explorer data-api-explorer-enabled='{int(explorer_6c)}' hidden>
    <div class='explorer-toolbar v5-card' aria-label='Explorer steuern'>
      <div class='mode-selector' role='group' aria-label='Darstellung'><button type='button' data-api-explorer-mode='stacked' aria-pressed='true'>Gestapelt</button><button type='button' data-api-explorer-mode='overlay' aria-pressed='false'>Überlagert</button></div>
      <div class='mode-selector' role='group' aria-label='Auflösung'><button type='button' data-api-explorer-resolution='day' aria-pressed='true'>Täglich</button><button type='button' data-api-explorer-resolution='week' aria-pressed='false'>Wöchentlich</button></div>
      <button type='button' data-api-explorer-clear>Auswahl leeren</button>
    </div>
    <div class='explorer-shortcuts' aria-label='Vorauswahl'><span class='v5-label'>Abkürzungen</span><button type='button' data-api-explorer-shortcut='Herz'>Herz/Kreislauf</button><button type='button' data-api-explorer-shortcut='Schlaf'>Schlaf/Erholung</button><button type='button' data-api-explorer-shortcut='Schritte'>Aktivität</button><button type='button' data-api-explorer-shortcut='Symptome'>Symptome</button></div>
    <div class='metric-add v5-card'><label for='explorer-metric-search'>Gesundheitswert hinzufügen</label><div class='metric-add-row'><input id='explorer-metric-search' type='search' data-api-explorer-search autocomplete='off'><button type='button' data-api-explorer-search-button>Suchen</button></div><div data-api-explorer-results class='api-explorer-result-list'></div></div>
    <div data-api-explorer-selected class='api-explorer-selected' aria-live='polite'></div>
    <div class='explorer-status-row'><p data-api-explorer-status role='status' aria-live='polite'></p><button type='button' data-api-explorer-retry>Erneut versuchen</button></div>
    <div data-api-explorer-chart class='api-explorer-chart' role='img' aria-label='API-basierter ECharts-Gesundheitsverlauf'></div>
    <div data-api-explorer-events class='api-explorer-events' aria-live='polite'></div>
    <details class='v5-card api-explorer-table-wrap'><summary>Zugängliche Datentabelle</summary><div class='table-scroll'><table data-api-explorer-table></table></div></details>
  </div>
  {prototype_markup}
</section>
{calendar_markup}
<section id='view-nutrition' class='app-view nutrition-cockpit' data-dashboard-panel='nutrition' data-mapping-enabled='{int(health_record_6e)}' aria-labelledby='title-nutrition' data-mapping-csrf='__CSRF_TOKEN__' hidden><div class='view-heading'><div><span class='eyebrow'>YAZIO-Datenbasis</span><h2 id='title-nutrition'>Ernährung</h2></div><p class='context-note'>Dokumentierte Werte; fehlende Angaben bleiben unbekannt. Keine medizinischen Ziel- oder Normwerte.</p></div><nav class='nutrition-area-tabs' aria-label='Ernährungsbereiche'><button type='button' data-nutrition-area-tab='day'>Tagesprotokoll</button><button type='button' data-nutrition-area-tab='trends'>Verlauf</button><button type='button' data-nutrition-area-tab='mappings'>Zuordnungen</button></nav><section data-nutrition-area='day' aria-labelledby='nutrition-day-title'><div class='nutrition-day-toolbar v5-surface'><button type='button' data-nutrition-day-shift='-1' aria-label='Vorheriger Tag'>←</button><label id='nutrition-day-title'>Datum <input type='date' data-nutrition-b3-date></label><button type='button' data-nutrition-day-shift='1' aria-label='Nächster Tag'>→</button><button type='button' data-nutrition-today>Heute</button><button type='button' data-nutrition-calendar>Kalender öffnen</button></div><p data-nutrition-b3-status role='status' aria-live='polite'></p><div data-nutrition-b3-day></div></section><section data-nutrition-area='trends' aria-labelledby='nutrition-trends-title' hidden><div class='section-heading'><div><span class='eyebrow'>Dokumentierte Tage</span><h3 id='nutrition-trends-title'>Ernährungsverlauf</h3></div><p>Datenabdeckung bleibt sichtbar; fehlende Tage sind Lücken.</p></div><div data-nutrition-trend-summary class='metric-grid'></div><article class='chart-panel'><h4>Energieverlauf</h4><div data-nutrition-chart='energy' class='nutrition-trend-chart v5-echart'></div></article><article class='chart-panel'><h4>Makronährstoffe</h4><div data-nutrition-chart='macros' class='nutrition-trend-chart v5-echart'></div></article><article class='chart-panel'><h4>Ballaststoffe, Zucker und gesättigte Fettsäuren</h4><div data-nutrition-chart='factors' class='nutrition-trend-chart v5-echart'></div></article><article class='chart-panel'><h4>Histamin-Zuordnungsindex</h4><div data-nutrition-chart='histamine' class='nutrition-trend-chart v5-echart'></div></article><article class='chart-panel'><h4>Mappingabdeckung</h4><div data-nutrition-chart='coverage' class='nutrition-trend-chart v5-echart'></div></article><section class='v5-surface nutrition-inflammation'><h3>Entzündungsrelevante Ernährungsfaktoren</h3><p data-nutrition-inflammation-statement></p><div data-nutrition-inflammation-factors class='metric-grid'></div></section><details class='v5-card api-explorer-table-wrap'><summary>Zugängliche Datentabelle</summary><div class='table-scroll'><table data-nutrition-trend-table></table></div></details></section><section data-nutrition-area='mappings' aria-labelledby='mapping-review-title' hidden><h3 id='mapping-review-title' tabindex='-1'>Lebensmittel-Zuordnungen</h3><p class='v5-meta'>Validierte Aktionen werden lokal vorgemerkt und erst vom privaten Worker angewendet.</p><div id='mapping-review'></div></section></section>
{record_markup}
<section id='view-more' class='app-view' data-dashboard-panel='more' aria-labelledby='title-more' hidden><h2 id='title-more'>Daten & System</h2><div id='data-status'></div><p>Technische Datenqualität und sekundäre Arbeitsansichten sind bewusst von den primären Gesundheitsansichten getrennt.</p></section>
</main>
<script type='application/json' id='health-dashboard-bundle'>{payload}</script>
{'' if explorer_6c else "<script src='/health-assets/chart.umd.min.js'></script>"}{echarts_scripts}{range_scripts}<script src='/health-assets/dashboard-v5.js'></script><script src='/health-assets/dashboard-v5-nutrition.js'></script>{explorer_scripts}{calendar_scripts}{record_scripts}{global_search_scripts}{prototype_scripts}
<noscript>Dashboard v5 benötigt lokales JavaScript. Dashboard v4 bleibt als Fallback verfügbar.</noscript>
</div></body></html>"""
