{"__meta":{"id":"01KZXJADXQ49KE74RJQK1Y90EH","tabUuid":null,"batchId":null,"timestamp":"2026-08-13T12:42:28.151Z","utime":1786624948.151766,"method":"GET","url":"http://127.0.0.1:8000/dashboard","component":null,"requestType":"http","status":200,"redirectLocation":null,"serverTimingMs":2.8845,"visitId":null},"http":{"requestHeaders":{"host":"127.0.0.1:8000","connection":"keep-alive","sec-ch-ua":"\"Not=A?Brand\";v=\"99\", \"Google Chrome\";v=\"151\", \"Chromium\";v=\"151\"","sec-ch-ua-mobile":"?0","sec-ch-ua-platform":"\"macOS\"","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","sec-fetch-site":"same-origin","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","referer":"http://127.0.0.1:8000/trades","accept-encoding":"gzip, deflate, br, zstd","accept-language":"fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7","cookie":"[REDACTED]"},"responseHeaders":{"content-type":"text/html; charset=utf-8","cache-control":"no-cache, private","date":"Thu, 13 Aug 2026 12:42:28 GMT","vary":"X-Inertia","x-inertia-devtools-id":"01KZXJADXQ49KE74RJQK1Y90EH","x-inertia-devtools-parent-out":"01KZXJADXQ49KE74RJQK1Y90EH"},"requestBody":{"status":"empty"},"responseBody":{"status":"present","value":"<!DOCTYPE html>\n<html lang=\"fr\" data-theme=\"dark\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <title>Dashboard — ICT Performance Lab</title>\n\n    <script>\n        (() => {\n            const savedTheme = localStorage.getItem('ict-theme') || 'dark';\n            document.documentElement.dataset.theme = savedTheme;\n        })();\n    </script>\n\n    <style>\n        :root,\n        html[data-theme=\"dark\"] {\n            --bg-base: #070b12;\n            --bg-surface: #0d1420;\n            --bg-elevated: #111a2b;\n            --bg-hover: #162033;\n\n            --border: rgba(255, 255, 255, 0.06);\n            --border-strong: rgba(255, 255, 255, 0.10);\n\n            --text-primary: #e8edf5;\n            --text-secondary: #8b9cb8;\n            --text-muted: #5c6b82;\n\n            --accent: #3b82f6;\n            --accent-hover: #2563eb;\n            --accent-light: #60a5fa;\n            --accent-glow: rgba(59, 130, 246, 0.22);\n\n            --positive: #22c55e;\n            --negative: #ef4444;\n\n            --long: #22c55e;\n            --long-bg: rgba(34, 197, 94, 0.10);\n\n            --short: #ef4444;\n            --short-bg: rgba(239, 68, 68, 0.10);\n\n            --radius: 10px;\n            --radius-sm: 6px;\n\n            --font-sans:\n                -apple-system,\n                BlinkMacSystemFont,\n                \"Segoe UI\",\n                Roboto,\n                \"Helvetica Neue\",\n                Arial,\n                sans-serif;\n\n            --font-mono:\n                \"SF Mono\",\n                \"Fira Code\",\n                \"Roboto Mono\",\n                monospace;\n        }\n\n        html[data-theme=\"light\"] {\n            --bg-base: #f4f6fa;\n            --bg-surface: #ffffff;\n            --bg-elevated: #f8fafc;\n            --bg-hover: #edf1f6;\n\n            --border: rgba(15, 23, 42, 0.08);\n            --border-strong: rgba(15, 23, 42, 0.14);\n\n            --text-primary: #172033;\n            --text-secondary: #64748b;\n            --text-muted: #94a3b8;\n\n            --accent: #2563eb;\n            --accent-hover: #1d4ed8;\n            --accent-light: #3b82f6;\n            --accent-glow: rgba(37, 99, 235, 0.16);\n\n            --positive: #16a34a;\n            --negative: #dc2626;\n\n            --long: #16a34a;\n            --long-bg: rgba(22, 163, 74, 0.09);\n\n            --short: #dc2626;\n            --short-bg: rgba(220, 38, 38, 0.08);\n        }\n\n        * {\n            box-sizing: border-box;\n        }\n\n        html {\n            font-size: 15px;\n        }\n\n        body {\n            margin: 0;\n            min-height: 100vh;\n\n            font-family: var(--font-sans);\n\n            background: var(--bg-base);\n            color: var(--text-primary);\n\n            line-height: 1.5;\n            -webkit-font-smoothing: antialiased;\n\n            transition:\n                background-color 0.2s ease,\n                color 0.2s ease;\n        }\n\n        body::before {\n            content: \"\";\n\n            position: fixed;\n            inset: 0;\n\n            background:\n                radial-gradient(\n                    ellipse 80% 50% at 50% -20%,\n                    rgba(59, 130, 246, 0.08),\n                    transparent\n                ),\n                radial-gradient(\n                    ellipse 60% 40% at 100% 100%,\n                    rgba(34, 197, 94, 0.04),\n                    transparent\n                );\n\n            pointer-events: none;\n            z-index: -1;\n        }\n\n        .app-topbar {\n            position: sticky;\n            top: 0;\n            z-index: 100;\n\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n\n            gap: 1rem;\n\n            padding: 0.75rem 1.25rem;\n\n            background: var(--bg-surface);\n\n            border-bottom: 1px solid var(--border);\n\n            box-shadow: 0 5px 25px rgba(0, 0, 0, 0.08);\n        }\n\n        .app-brand {\n            display: flex;\n            flex-direction: column;\n\n            text-decoration: none;\n        }\n\n        .app-brand__name {\n            color: var(--text-primary);\n\n            font-size: 0.9rem;\n            font-weight: 750;\n\n            line-height: 1.2;\n        }\n\n        .app-brand__author {\n            margin-top: 0.15rem;\n\n            color: var(--accent);\n\n            font-size: 0.62rem;\n            font-weight: 650;\n\n            letter-spacing: 0.13em;\n            text-transform: uppercase;\n        }\n\n        .theme-selector {\n            display: flex;\n            align-items: center;\n\n            gap: 0.25rem;\n\n            padding: 0.25rem;\n\n            background: var(--bg-elevated);\n\n            border: 1px solid var(--border-strong);\n            border-radius: 8px;\n        }\n\n        .theme-button {\n            appearance: none;\n\n            border: none;\n\n            padding: 0.45rem 0.75rem;\n\n            background: transparent;\n            color: var(--text-secondary);\n\n            border-radius: 6px;\n\n            font-family: var(--font-sans);\n            font-size: 0.78rem;\n            font-weight: 650;\n\n            cursor: pointer;\n\n            transition:\n                background 0.15s ease,\n                color 0.15s ease,\n                box-shadow 0.15s ease;\n        }\n\n        .theme-button:hover {\n            background: var(--bg-hover);\n            color: var(--text-primary);\n        }\n\n        .theme-button.is-active {\n            background: var(--accent);\n            color: #ffffff;\n\n            box-shadow:\n                0 4px 14px var(--accent-glow);\n        }\n\n        .app-content {\n            position: relative;\n            z-index: 1;\n            width: 100%;\n        }\n\n        @media (max-width: 650px) {\n            .app-topbar {\n                flex-direction: column;\n                align-items: stretch;\n            }\n\n            .theme-selector {\n                width: 100%;\n            }\n\n            .theme-button {\n                flex: 1;\n            }\n        }\n\n        \n    .overview {\n        max-width: 1320px;\n        margin: 0 auto;\n        padding: 2rem 1.5rem 3rem;\n    }\n\n    .overview-top {\n        display: flex;\n        justify-content: space-between;\n        align-items: flex-start;\n        gap: 1.25rem;\n        margin-bottom: 1.6rem;\n        flex-wrap: wrap;\n    }\n\n    .overview-title__eyebrow {\n        display: block;\n        margin-bottom: 0.35rem;\n        font-size: 0.7rem;\n        font-weight: 750;\n        letter-spacing: 0.14em;\n        text-transform: uppercase;\n        color: var(--accent);\n    }\n\n    .overview-title h1 {\n        margin: 0;\n        font-size: clamp(2rem, 4vw, 2.7rem);\n        font-weight: 800;\n        letter-spacing: -0.045em;\n        color: var(--text-primary);\n    }\n\n    .overview-title p {\n        margin: 0.45rem 0 0;\n        color: var(--text-secondary);\n        font-size: 0.95rem;\n    }\n\n    .top-actions {\n        display: flex;\n        align-items: center;\n        gap: 0.65rem;\n        flex-wrap: wrap;\n    }\n\n    .action-btn {\n        min-height: 42px;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.45rem;\n        padding: 0.7rem 1rem;\n        border: 1px solid var(--border);\n        border-radius: 10px;\n        background: var(--bg-surface);\n        color: var(--text-secondary);\n        font-size: 0.82rem;\n        font-weight: 750;\n        text-decoration: none;\n        transition: 0.15s ease;\n    }\n\n    .action-btn:hover {\n        color: var(--text-primary);\n        border-color: var(--border-strong);\n        transform: translateY(-1px);\n    }\n\n    .action-btn--primary {\n        color: #fff;\n        border-color: transparent;\n        background: linear-gradient(135deg, var(--accent-light), var(--accent));\n        box-shadow: 0 9px 24px var(--accent-glow);\n    }\n\n    .filters-line {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 1rem;\n        margin-bottom: 1.25rem;\n        flex-wrap: wrap;\n    }\n\n    .mode-switch {\n        display: inline-flex;\n        gap: 0.3rem;\n        padding: 0.32rem;\n        border: 1px solid var(--border);\n        border-radius: 11px;\n        background: var(--bg-surface);\n    }\n\n    .mode-switch a {\n        min-width: 72px;\n        padding: 0.58rem 0.8rem;\n        border-radius: 8px;\n        text-align: center;\n        color: var(--text-secondary);\n        font-size: 0.76rem;\n        font-weight: 800;\n        text-decoration: none;\n    }\n\n    .mode-switch a.active {\n        color: #fff;\n        background: linear-gradient(135deg, var(--accent-light), var(--accent));\n        box-shadow: 0 6px 18px var(--accent-glow);\n    }\n\n    .view-context {\n        font-size: 0.75rem;\n        color: var(--text-muted);\n    }\n\n    .hero-metrics {\n        display: grid;\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        gap: 0.9rem;\n        margin-bottom: 1rem;\n    }\n\n    .hero-card {\n        position: relative;\n        min-height: 145px;\n        padding: 1.05rem 1.1rem;\n        overflow: hidden;\n        border: 1px solid var(--border);\n        border-radius: 16px;\n        background: var(--bg-surface);\n        box-shadow: 0 8px 28px rgba(15, 23, 42, 0.03);\n    }\n\n    .hero-card__label {\n        margin-bottom: 0.42rem;\n        font-size: 0.68rem;\n        font-weight: 800;\n        letter-spacing: 0.09em;\n        text-transform: uppercase;\n        color: var(--text-muted);\n    }\n\n    .hero-card__value {\n        font-family: var(--font-mono);\n        font-size: 1.55rem;\n        font-weight: 800;\n        color: var(--text-primary);\n        letter-spacing: -0.03em;\n    }\n\n    .hero-card__sub {\n        margin-top: 0.4rem;\n        font-size: 0.76rem;\n        color: var(--text-secondary);\n    }\n\n    .hero-card__footer {\n        position: absolute;\n        left: 1.1rem;\n        right: 1.1rem;\n        bottom: 0.95rem;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 0.75rem;\n        color: var(--text-muted);\n        font-size: 0.7rem;\n    }\n\n    .mini-bar {\n        height: 5px;\n        flex: 1;\n        overflow: hidden;\n        border-radius: 999px;\n        background: var(--bg-elevated);\n    }\n\n    .mini-bar > span {\n        display: block;\n        height: 100%;\n        border-radius: inherit;\n        background: linear-gradient(90deg, var(--accent), var(--accent-light));\n    }\n\n    .positive { color: var(--positive) !important; }\n    .negative { color: var(--negative) !important; }\n\n    .main-grid {\n        display: grid;\n        grid-template-columns: 0.82fr 1.55fr 0.9fr;\n        gap: 1rem;\n        margin-bottom: 1rem;\n        align-items: stretch;\n    }\n\n    .module {\n        border: 1px solid var(--border);\n        border-radius: 17px;\n        background: var(--bg-surface);\n        overflow: hidden;\n    }\n\n    .module-head {\n        display: flex;\n        justify-content: space-between;\n        align-items: flex-start;\n        gap: 1rem;\n        padding: 1rem 1.1rem;\n        border-bottom: 1px solid var(--border);\n        background: var(--bg-elevated);\n    }\n\n    .module-head h2 {\n        margin: 0;\n        font-size: 0.86rem;\n        font-weight: 800;\n        color: var(--text-primary);\n    }\n\n    .module-head p {\n        margin: 0.25rem 0 0;\n        font-size: 0.72rem;\n        color: var(--text-muted);\n    }\n\n    .module-head__meta {\n        font-family: var(--font-mono);\n        font-size: 0.72rem;\n        font-weight: 750;\n        color: var(--text-secondary);\n        white-space: nowrap;\n    }\n\n    .module-body {\n        padding: 1.1rem;\n    }\n\n    .score-ring {\n        --score: 50;\n        width: 170px;\n        height: 170px;\n        margin: 0.65rem auto 1.15rem;\n        border-radius: 50%;\n        display: grid;\n        place-items: center;\n        background:\n            radial-gradient(circle at center, var(--bg-surface) 0 60%, transparent 61%),\n            conic-gradient(\n                var(--accent-light) calc(var(--score) * 1%),\n                var(--bg-elevated) 0\n            );\n        box-shadow: inset 0 0 0 1px var(--border);\n    }\n\n    .score-ring__inner {\n        text-align: center;\n    }\n\n    .score-ring__value {\n        display: block;\n        font-family: var(--font-mono);\n        font-size: 2rem;\n        font-weight: 850;\n        color: var(--text-primary);\n    }\n\n    .score-ring__label {\n        display: block;\n        margin-top: 0.1rem;\n        font-size: 0.72rem;\n        color: var(--text-muted);\n    }\n\n    .score-stats {\n        display: grid;\n        grid-template-columns: repeat(2, 1fr);\n        gap: 0.65rem;\n    }\n\n    .score-stat {\n        padding: 0.75rem;\n        border: 1px solid var(--border);\n        border-radius: 10px;\n        background: var(--bg-base);\n    }\n\n    .score-stat span {\n        display: block;\n    }\n\n    .score-stat__label {\n        margin-bottom: 0.25rem;\n        font-size: 0.65rem;\n        font-weight: 750;\n        text-transform: uppercase;\n        letter-spacing: 0.06em;\n        color: var(--text-muted);\n    }\n\n    .score-stat__value {\n        font-family: var(--font-mono);\n        font-weight: 800;\n        color: var(--text-primary);\n    }\n\n    .equity-kpis {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 0.75rem;\n        margin-bottom: 0.8rem;\n    }\n\n    .equity-kpi {\n        padding: 0.7rem 0.8rem;\n        border-radius: 10px;\n        background: var(--bg-base);\n        border: 1px solid var(--border);\n    }\n\n    .equity-kpi__label {\n        font-size: 0.65rem;\n        text-transform: uppercase;\n        font-weight: 750;\n        color: var(--text-muted);\n        letter-spacing: 0.06em;\n    }\n\n    .equity-kpi__value {\n        margin-top: 0.2rem;\n        font-family: var(--font-mono);\n        font-size: 0.9rem;\n        font-weight: 800;\n        color: var(--text-primary);\n    }\n\n    .equity-chart {\n        display: block;\n        width: 100%;\n        min-height: 285px;\n    }\n\n    .chart-grid {\n        stroke: var(--border);\n        stroke-width: 1;\n        vector-effect: non-scaling-stroke;\n    }\n\n    .chart-zero {\n        stroke: var(--text-muted);\n        stroke-width: 1.2;\n        stroke-dasharray: 6 6;\n        opacity: 0.55;\n        vector-effect: non-scaling-stroke;\n    }\n\n    .chart-area {\n        fill: var(--accent-glow);\n        opacity: 0.34;\n    }\n\n    .chart-line {\n        fill: none;\n        stroke: var(--accent-light);\n        stroke-width: 3.2;\n        stroke-linecap: round;\n        stroke-linejoin: round;\n        vector-effect: non-scaling-stroke;\n    }\n\n    .chart-point {\n        fill: var(--bg-surface);\n        stroke: var(--accent-light);\n        stroke-width: 2;\n        vector-effect: non-scaling-stroke;\n    }\n\n    .chart-label {\n        fill: var(--text-muted);\n        font-family: var(--font-mono);\n        font-size: 18px;\n    }\n\n    .chart-empty {\n        min-height: 300px;\n        display: grid;\n        place-items: center;\n        text-align: center;\n        color: var(--text-muted);\n        font-size: 0.82rem;\n    }\n\n    .risk-stack {\n        display: grid;\n        gap: 0.75rem;\n    }\n\n    .risk-block {\n        padding: 0.9rem;\n        border: 1px solid var(--border);\n        border-radius: 11px;\n        background: var(--bg-base);\n    }\n\n    .risk-block__top {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        gap: 1rem;\n        margin-bottom: 0.55rem;\n    }\n\n    .risk-block__label {\n        font-size: 0.68rem;\n        font-weight: 800;\n        color: var(--text-secondary);\n    }\n\n    .risk-block__value {\n        font-family: var(--font-mono);\n        font-size: 0.88rem;\n        font-weight: 850;\n        color: var(--text-primary);\n    }\n\n    .risk-progress {\n        height: 6px;\n        overflow: hidden;\n        border-radius: 999px;\n        background: var(--bg-elevated);\n    }\n\n    .risk-progress span {\n        display: block;\n        height: 100%;\n        border-radius: inherit;\n        background: linear-gradient(90deg, var(--accent), var(--accent-light));\n    }\n\n    .risk-reason {\n        margin-top: 0.6rem;\n        padding: 0.65rem 0.7rem;\n        border-radius: 9px;\n        background: var(--bg-elevated);\n        color: var(--text-secondary);\n        font-size: 0.7rem;\n        line-height: 1.45;\n    }\n\n    .risk-note {\n        margin-top: 0.8rem;\n        padding: 0.75rem;\n        border: 1px dashed var(--border-strong);\n        border-radius: 10px;\n        color: var(--text-muted);\n        font-size: 0.72rem;\n        line-height: 1.45;\n    }\n\n    .risk-meta-grid {\n        display: grid;\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 0.65rem;\n        margin-top: 0.8rem;\n    }\n\n    .risk-meta {\n        padding: 0.8rem;\n        border: 1px solid var(--border);\n        border-radius: 10px;\n        background: var(--bg-base);\n    }\n\n    .risk-meta__label {\n        display: block;\n        margin-bottom: 0.25rem;\n        font-size: 0.64rem;\n        font-weight: 800;\n        text-transform: uppercase;\n        letter-spacing: 0.06em;\n        color: var(--text-muted);\n    }\n\n    .risk-meta__value {\n        display: block;\n        font-family: var(--font-mono);\n        font-size: 0.86rem;\n        font-weight: 850;\n        color: var(--text-primary);\n    }\n\n    .risk-settings-link {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 100%;\n        margin-top: 0.8rem;\n        padding: 0.65rem 0.8rem;\n        border: 1px solid var(--border);\n        border-radius: 10px;\n        color: var(--text-secondary);\n        background: var(--bg-surface);\n        font-size: 0.72rem;\n        font-weight: 800;\n        text-decoration: none;\n        transition: 0.15s ease;\n    }\n\n    .risk-settings-link:hover {\n        color: var(--text-primary);\n        border-color: var(--border-strong);\n        transform: translateY(-1px);\n    }\n\n    .lab-strip {\n        display: grid;\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        gap: 0.9rem;\n        margin-bottom: 1rem;\n    }\n\n    .lab-tile {\n        padding: 1rem;\n        border: 1px solid var(--border);\n        border-radius: 14px;\n        background: var(--bg-surface);\n    }\n\n    .lab-tile__label {\n        font-size: 0.66rem;\n        font-weight: 800;\n        text-transform: uppercase;\n        letter-spacing: 0.07em;\n        color: var(--text-muted);\n    }\n\n    .lab-tile__value {\n        margin-top: 0.35rem;\n        font-family: var(--font-mono);\n        font-size: 1.1rem;\n        font-weight: 850;\n        color: var(--text-primary);\n    }\n\n    .lab-tile__sub {\n        margin-top: 0.25rem;\n        font-size: 0.7rem;\n        color: var(--text-secondary);\n    }\n\n    .breakdowns {\n        display: grid;\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        gap: 1rem;\n        margin-bottom: 1rem;\n    }\n\n    .breakdown-card {\n        border: 1px solid var(--border);\n        border-radius: 15px;\n        background: var(--bg-surface);\n        overflow: hidden;\n    }\n\n    .breakdown-card__title {\n        padding: 0.9rem 1rem;\n        margin: 0;\n        background: var(--bg-elevated);\n        border-bottom: 1px solid var(--border);\n        font-size: 0.76rem;\n        font-weight: 800;\n        color: var(--text-primary);\n    }\n\n    .breakdown-card__body {\n        padding: 0.4rem 0.9rem;\n    }\n\n    .breakdown-row {\n        display: grid;\n        grid-template-columns: 1fr auto auto;\n        gap: 0.7rem;\n        align-items: center;\n        padding: 0.72rem 0;\n        border-bottom: 1px solid var(--border);\n    }\n\n    .breakdown-row:last-child {\n        border-bottom: none;\n    }\n\n    .breakdown-row__name {\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        font-size: 0.78rem;\n        color: var(--text-secondary);\n    }\n\n    .breakdown-row__count {\n        font-family: var(--font-mono);\n        font-size: 0.7rem;\n        color: var(--text-muted);\n    }\n\n    .breakdown-row__r {\n        min-width: 68px;\n        text-align: right;\n        font-family: var(--font-mono);\n        font-size: 0.78rem;\n        font-weight: 800;\n        color: var(--text-primary);\n    }\n\n    .empty-small {\n        padding: 1rem 0;\n        text-align: center;\n        color: var(--text-muted);\n        font-size: 0.75rem;\n    }\n\n    .footer {\n        padding-top: 1rem;\n        text-align: center;\n        color: var(--text-muted);\n        font-size: 0.7rem;\n    }\n\n    @media (max-width: 1100px) {\n        .hero-metrics,\n        .lab-strip {\n            grid-template-columns: repeat(2, 1fr);\n        }\n\n        .main-grid {\n            grid-template-columns: 1fr;\n        }\n\n        .breakdowns {\n            grid-template-columns: 1fr;\n        }\n    }\n\n    @media (max-width: 620px) {\n        .overview {\n            padding: 1.2rem 1rem 2rem;\n        }\n\n        .hero-metrics,\n        .lab-strip {\n            grid-template-columns: 1fr;\n        }\n\n        .top-actions {\n            width: 100%;\n        }\n\n        .action-btn {\n            flex: 1;\n        }\n\n        .mode-switch {\n            width: 100%;\n        }\n\n        .mode-switch a {\n            flex: 1;\n        }\n\n        .view-context {\n            width: 100%;\n        }\n\n        .equity-kpis,\n        .score-stats {\n            grid-template-columns: 1fr;\n        }\n    }\n\n    </style>\n<script id=\"browser-logger-active\">\n(function() {\n    const ENDPOINT = 'http://127.0.0.1:8000/_boost/browser-logs';\n    const logQueue = [];\n    let flushTimeout = null;\n    const captureTypes = [\"error\",\"warning\",\"info\",\"log\",\"debug\",\"table\"];\n\n    console.log('🔍 Browser logger active (MCP server detected). Posting to: ' + ENDPOINT);\n\n    // Store original console methods\n    const originalConsole = {\n        log: console.log,\n        debug: console.debug,\n        info: console.info,\n        error: console.error,\n        warn: console.warn,\n        table: console.table\n    };\n\n    // Helper to safely stringify values\n    function safeStringify(obj) {\n        const seen = new WeakSet();\n        return JSON.stringify(obj, (key, value) => {\n            if (typeof value === 'object' && value !== null) {\n                if (seen.has(value)) return '[Circular]';\n                seen.add(value);\n            }\n            if (value instanceof Error) {\n                return {\n                    name: value.name,\n                    message: value.message,\n                    stack: value.stack\n                };\n            }\n            return value;\n        });\n    }\n\n    // Normalize log type for consistency (e.g., 'warn' to 'warning')\n    function normalizeType(type) {\n        return type === 'warn' ? 'warning' : type;\n    }\n\n    // Determine if a log type should be captured based on configured levels\n    function shouldCapture(type) {\n        return captureTypes.includes(normalizeType(type));\n    }\n\n    // Batch and send logs\n    function flushLogs() {\n        if (logQueue.length === 0) return;\n\n        const batch = logQueue.splice(0, logQueue.length);\n\n        fetch(ENDPOINT, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n                'X-Requested-With': 'XMLHttpRequest'\n            },\n            body: JSON.stringify({ logs: batch })\n        }).catch(err => {\n            // Silently fail to avoid infinite loops\n            originalConsole.error('Failed to send logs:', err);\n        });\n    }\n\n    // Debounced flush (100ms)\n    function scheduleFlush() {\n        if (flushTimeout) clearTimeout(flushTimeout);\n        flushTimeout = setTimeout(flushLogs, 100);\n    }\n\n    // Intercept console methods\n    ['log', 'debug', 'info', 'error', 'warn', 'table'].forEach(method => {\n        console[method] = function(...args) {\n            // Call original method\n            originalConsole[method].apply(console, args);\n\n            // Capture log data\n            try {\n                if (!shouldCapture(method)) {\n                    return;\n                }\n\n                logQueue.push({\n                    type: method,\n                    timestamp: new Date().toISOString(),\n                    data: args.map(arg => {\n                        try {\n                            return typeof arg === 'object' ? JSON.parse(safeStringify(arg)) : arg;\n                        } catch (e) {\n                            return String(arg);\n                        }\n                    }),\n                    url: window.location.href,\n                    userAgent: navigator.userAgent\n                });\n\n                scheduleFlush();\n            } catch (e) {\n                // Fail silently\n            }\n        };\n    });\n\n    // Global error handlers for uncaught errors\n    const originalOnError = window.onerror;\n    window.onerror = function boostErrorHandler(errorMsg, url, lineNumber, colNumber, error) {\n        try {\n            if (shouldCapture('error')) {\n                logQueue.push({\n                    type: 'uncaught_error',\n                    timestamp: new Date().toISOString(),\n                    data: [{\n                        message: errorMsg,\n                        filename: url,\n                        lineno: lineNumber,\n                        colno: colNumber,\n                        error: error ? {\n                            name: error.name,\n                            message: error.message,\n                            stack: error.stack\n                        } : null\n                    }],\n                    url: window.location.href,\n                    userAgent: navigator.userAgent\n                });\n\n                scheduleFlush();\n            }\n\n        } catch (e) {\n            // Fail silently\n        }\n\n        // Call original handler if it exists\n        if (originalOnError && typeof originalOnError === 'function') {\n            return originalOnError(errorMsg, url, lineNumber, colNumber, error);\n        }\n\n        // Let the error continue to propagate\n        return false;\n    }\n    window.addEventListener('error', (event) => {\n        try {\n            if (!shouldCapture('error')) {\n                return false;\n            }\n\n            logQueue.push({\n                type: 'window_error',\n                timestamp: new Date().toISOString(),\n                data: [{\n                    message: event.message,\n                    filename: event.filename,\n                    lineno: event.lineno,\n                    colno: event.colno,\n                    error: event.error ? {\n                        name: event.error.name,\n                        message: event.error.message,\n                        stack: event.error.stack\n                    } : null\n                }],\n                url: window.location.href,\n                userAgent: navigator.userAgent\n            });\n\n            scheduleFlush();\n        } catch (e) {\n            // Fail silently\n        }\n\n        // Let the error continue to propagate\n        return false;\n    });\n    window.addEventListener('unhandledrejection', (event) => {\n        try {\n            if (!shouldCapture('error')) {\n                return false;\n            }\n\n            logQueue.push({\n                type: 'error',\n                timestamp: new Date().toISOString(),\n                data: [{\n                    message: 'Unhandled Promise Rejection',\n                    reason: event.reason instanceof Error ? {\n                        name: event.reason.name,\n                        message: event.reason.message,\n                        stack: event.reason.stack\n                    } : event.reason\n                }],\n                url: window.location.href,\n                userAgent: navigator.userAgent\n            });\n\n            scheduleFlush();\n        } catch (e) {\n            // Fail silently\n        }\n\n        // Let the rejection continue to propagate\n        return false;\n    });\n\n    // Flush on page unload\n    window.addEventListener('beforeunload', () => {\n        if (logQueue.length > 0) {\n            navigator.sendBeacon(ENDPOINT, JSON.stringify({ logs: logQueue }));\n        }\n    });\n})();\n</script>\n</head>\n\n<body>\n\n<header class=\"app-topbar\">\n\n    <a\n        href=\"http://127.0.0.1:8000/trades\"\n        class=\"app-brand\"\n    >\n        <span class=\"app-brand__name\">\n            ICT Performance Lab\n        </span>\n\n        <span class=\"app-brand__author\">\n            by Jul\n        </span>\n    </a>\n\n    <div\n        class=\"theme-selector\"\n        aria-label=\"Thème de l'application\"\n    >\n\n        <button\n            type=\"button\"\n            class=\"theme-button\"\n            data-theme-choice=\"dark\"\n        >\n            ☾ Sombre\n        </button>\n\n        <button\n            type=\"button\"\n            class=\"theme-button\"\n            data-theme-choice=\"light\"\n        >\n            ☀ Clair\n        </button>\n\n    </div>\n\n</header>\n\n<main class=\"app-content\">\n    \n\n\n\n<div class=\"overview\">\n\n    <div class=\"overview-top\">\n\n        <div class=\"overview-title\">\n            <span class=\"overview-title__eyebrow\">\n                ICT Performance Lab by Jul\n            </span>\n\n            <h1>Vue d'ensemble</h1>\n\n            <p>\n                Une lecture rapide de ta performance, de ton risque et de la qualité de tes setups.\n            </p>\n        </div>\n\n        <div class=\"top-actions\">\n            <a href=\"http://127.0.0.1:8000/trading-settings\" class=\"action-btn\">\n                ⚙ Paramètres\n            </a>\n\n            <a href=\"http://127.0.0.1:8000/trades/create\" class=\"action-btn\">\n                ＋ Nouveau trade\n            </a>\n\n            <a href=\"http://127.0.0.1:8000/trades\" class=\"action-btn action-btn--primary\">\n                Voir le journal\n            </a>\n        </div>\n\n    </div>\n\n\n    <div class=\"filters-line\">\n\n        <nav class=\"mode-switch\">\n            <a\n                href=\"http://127.0.0.1:8000/dashboard?mode=real\"\n                class=\"active\"\n            >\n                RÉEL\n            </a>\n\n            <a\n                href=\"http://127.0.0.1:8000/dashboard?mode=paper\"\n                class=\"\"\n            >\n                PAPER\n            </a>\n\n            <a\n                href=\"http://127.0.0.1:8000/dashboard?mode=all\"\n                class=\"\"\n            >\n                TOTAL\n            </a>\n        </nav>\n\n        <div class=\"view-context\">\n            Vue : <strong>Réel</strong> · Trades réellement exécutés\n        </div>\n\n    </div>\n\n\n    <section class=\"hero-metrics\">\n\n        <article class=\"hero-card\">\n            <div class=\"hero-card__label\">Performance</div>\n\n            <div class=\"hero-card__value negative\">\n                -1.56R\n            </div>\n\n            <div class=\"hero-card__sub\">\n                Depuis le début de la vue\n            </div>\n\n            <div class=\"hero-card__footer\">\n                <span>3 idée(s)</span>\n                <div class=\"mini-bar\">\n                    <span style=\"width: 24%;\"></span>\n                </div>\n            </div>\n        </article>\n\n\n        <article class=\"hero-card\">\n            <div class=\"hero-card__label\">Win Rate</div>\n\n            <div class=\"hero-card__value\">\n                50%\n            </div>\n\n            <div class=\"hero-card__sub\">\n                1 gagnant(s) · 1 perdant(s)\n            </div>\n\n            <div class=\"hero-card__footer\">\n                <span>2 clôturés</span>\n                <div class=\"mini-bar\">\n                    <span style=\"width: 50%;\"></span>\n                </div>\n            </div>\n        </article>\n\n\n        <article class=\"hero-card\">\n            <div class=\"hero-card__label\">Profit Factor</div>\n\n            <div class=\"hero-card__value\">\n                                    0.22\n                            </div>\n\n            <div class=\"hero-card__sub\">\n                Gains bruts / pertes brutes\n            </div>\n\n            <div class=\"hero-card__footer\">\n                <span>Espérance</span>\n                <strong class=\"negative\">\n                    -0.78R\n                </strong>\n            </div>\n        </article>\n\n\n        <article class=\"hero-card\">\n            <div class=\"hero-card__label\">R / R moyen</div>\n\n            <div class=\"hero-card__value negative\">\n                -0.78R\n            </div>\n\n            <div class=\"hero-card__sub\">\n                Moyenne par idée clôturée\n            </div>\n\n            <div class=\"hero-card__footer\">\n                <span>Drawdown max</span>\n                <strong class=\"negative\">\n                    2.00R\n                </strong>\n            </div>\n        </article>\n\n    </section>\n\n\n    <section class=\"main-grid\">\n\n        <article class=\"module\">\n\n            <div class=\"module-head\">\n                <div>\n                    <h2>Score Performance</h2>\n                    <p>Vue synthétique de la qualité globale</p>\n                </div>\n            </div>\n\n            <div class=\"module-body\">\n\n                <div\n                    class=\"score-ring\"\n                    style=\"--score: 40;\"\n                >\n                    <div class=\"score-ring__inner\">\n                        <span class=\"score-ring__value\">\n                            40\n                        </span>\n                        <span class=\"score-ring__label\">\n                            / 100\n                        </span>\n                    </div>\n                </div>\n\n                <div class=\"score-stats\">\n\n                    <div class=\"score-stat\">\n                        <span class=\"score-stat__label\">Discipline</span>\n                        <span class=\"score-stat__value\">\n                            —\n                        </span>\n                    </div>\n\n                    <div class=\"score-stat\">\n                        <span class=\"score-stat__label\">Max DD</span>\n                        <span class=\"score-stat__value negative\">\n                            2.00R\n                        </span>\n                    </div>\n\n                    <div class=\"score-stat\">\n                        <span class=\"score-stat__label\">Série gains</span>\n                        <span class=\"score-stat__value positive\">\n                            1W\n                        </span>\n                    </div>\n\n                    <div class=\"score-stat\">\n                        <span class=\"score-stat__label\">Série pertes</span>\n                        <span class=\"score-stat__value negative\">\n                            1L\n                        </span>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </article>\n\n\n        <article class=\"module\">\n\n            <div class=\"module-head\">\n                <div>\n                    <h2>Courbe d'équité</h2>\n                    <p>Performance cumulée en R</p>\n                </div>\n\n                <div class=\"module-head__meta\">\n                    Réel\n                </div>\n            </div>\n\n            <div class=\"module-body\">\n\n                <div class=\"equity-kpis\">\n\n                    <div class=\"equity-kpi\">\n                        <div class=\"equity-kpi__label\">Rendement</div>\n                        <div class=\"equity-kpi__value negative\">\n                            -1.56R\n                        </div>\n                    </div>\n\n                    <div class=\"equity-kpi\">\n                        <div class=\"equity-kpi__label\">Idées clôturées</div>\n                        <div class=\"equity-kpi__value\">\n                            2\n                        </div>\n                    </div>\n\n                    <div class=\"equity-kpi\">\n                        <div class=\"equity-kpi__label\">Drawdown Max</div>\n                        <div class=\"equity-kpi__value negative\">\n                            2.00R\n                        </div>\n                    </div>\n\n                </div>\n\n                \n                    <svg\n                        class=\"equity-chart\"\n                        viewBox=\"0 0 1000 280\"\n                        role=\"img\"\n                        aria-label=\"Courbe d'équité cumulée en R\"\n                    >\n\n                        \n                            \n                            <line\n                                class=\"chart-grid\"\n                                x1=\"55\"\n                                y1=\"20\"\n                                x2=\"975\"\n                                y2=\"20\"\n                            />\n\n                            <text\n                                class=\"chart-label\"\n                                x=\"41\"\n                                y=\"26\"\n                                text-anchor=\"end\"\n                            >\n                                +0.9R\n                            </text>\n\n                        \n                            \n                            <line\n                                class=\"chart-grid\"\n                                x1=\"55\"\n                                y1=\"75\"\n                                x2=\"975\"\n                                y2=\"75\"\n                            />\n\n                            <text\n                                class=\"chart-label\"\n                                x=\"41\"\n                                y=\"81\"\n                                text-anchor=\"end\"\n                            >\n                                +0.2R\n                            </text>\n\n                        \n                            \n                            <line\n                                class=\"chart-grid\"\n                                x1=\"55\"\n                                y1=\"130\"\n                                x2=\"975\"\n                                y2=\"130\"\n                            />\n\n                            <text\n                                class=\"chart-label\"\n                                x=\"41\"\n                                y=\"136\"\n                                text-anchor=\"end\"\n                            >\n                                -0.6R\n                            </text>\n\n                        \n                            \n                            <line\n                                class=\"chart-grid\"\n                                x1=\"55\"\n                                y1=\"185\"\n                                x2=\"975\"\n                                y2=\"185\"\n                            />\n\n                            <text\n                                class=\"chart-label\"\n                                x=\"41\"\n                                y=\"191\"\n                                text-anchor=\"end\"\n                            >\n                                -1.3R\n                            </text>\n\n                        \n                            \n                            <line\n                                class=\"chart-grid\"\n                                x1=\"55\"\n                                y1=\"240\"\n                                x2=\"975\"\n                                y2=\"240\"\n                            />\n\n                            <text\n                                class=\"chart-label\"\n                                x=\"41\"\n                                y=\"246\"\n                                text-anchor=\"end\"\n                            >\n                                -2.1R\n                            </text>\n\n                        \n                        <line\n                            class=\"chart-zero\"\n                            x1=\"55\"\n                            y1=\"88.933333333333\"\n                            x2=\"975\"\n                            y2=\"88.933333333333\"\n                        />\n\n                        <polygon\n                            class=\"chart-area\"\n                            points=\"55,240 55,88.93 515,56.67 975,203.33 975,240\"\n                        />\n\n                        <polyline\n                            class=\"chart-line\"\n                            points=\"55,88.93 515,56.67 975,203.33\"\n                        />\n\n                                                    <circle\n                                class=\"chart-point\"\n                                cx=\"55\"\n                                cy=\"88.93\"\n                                r=\"4\"\n                            >\n                                <title>\n                                    0.00R\n                                </title>\n                            </circle>\n                                                    <circle\n                                class=\"chart-point\"\n                                cx=\"515\"\n                                cy=\"56.67\"\n                                r=\"4\"\n                            >\n                                <title>\n                                    +0.44R\n                                </title>\n                            </circle>\n                                                    <circle\n                                class=\"chart-point\"\n                                cx=\"975\"\n                                cy=\"203.33\"\n                                r=\"4\"\n                            >\n                                <title>\n                                    -1.56R\n                                </title>\n                            </circle>\n                        \n                        <text\n                            class=\"chart-label\"\n                            x=\"55\"\n                            y=\"272\"\n                        >\n                            Départ\n                        </text>\n\n                        <text\n                            class=\"chart-label\"\n                            x=\"975\"\n                            y=\"272\"\n                            text-anchor=\"end\"\n                        >\n                            Dernière idée\n                        </text>\n\n                    </svg>\n\n                \n            </div>\n\n        </article>\n\n\n        <article class=\"module\">\n\n            <div class=\"module-head\">\n                <div>\n                    <h2>Risk Manager</h2>\n                    <p>Toujours basé sur le compte réel</p>\n                </div>\n            </div>\n\n            <div class=\"module-body\">\n\n                <div class=\"risk-stack\">\n\n                    <div class=\"risk-block\">\n                        <div class=\"risk-block__top\">\n                            <span class=\"risk-block__label\">Prochain risque</span>\n                            <span class=\"risk-block__value\">\n                                0,50%\n                            </span>\n                        </div>\n\n                        <div class=\"risk-progress\">\n                            <span style=\"width: 50%;\"></span>\n                        </div>\n\n                        <div class=\"risk-reason\">\n                            Gain enregistré — risque augmenté à 0,50 %.\n                        </div>\n                    </div>\n\n                    <div class=\"risk-block\">\n                        <div class=\"risk-block__top\">\n                            <span class=\"risk-block__label\">Performance cycle</span>\n                            <span class=\"risk-block__value negative\">\n                                -1,08%\n                            </span>\n                        </div>\n\n                        <div class=\"risk-progress\">\n                            <span style=\"width: 0%;\"></span>\n                        </div>\n                    </div>\n\n                    <div class=\"risk-block\">\n                        <div class=\"risk-block__top\">\n                            <span class=\"risk-block__label\">Objectif cycle</span>\n                            <span class=\"risk-block__value positive\">\n                                +3,00%\n                            </span>\n                        </div>\n\n                        <div class=\"risk-progress\">\n                            <span style=\"width: 100%;\"></span>\n                        </div>\n                    </div>\n\n                </div>\n\n                <div class=\"risk-meta-grid\">\n                    <div class=\"risk-meta\">\n                        <span class=\"risk-meta__label\">Trades clôturés</span>\n                        <span class=\"risk-meta__value\">\n                            3\n                        </span>\n                    </div>\n\n                    <div class=\"risk-meta\">\n                        <span class=\"risk-meta__label\">Dernier résultat</span>\n                        <span class=\"risk-meta__value positive\">\n                            TP\n                        </span>\n                    </div>\n                </div>\n\n                <a\n                    href=\"http://127.0.0.1:8000/trading-settings\"\n                    class=\"risk-settings-link\"\n                >\n                    ⚙ Modifier les paramètres du Risk Manager\n                </a>\n\n                <div class=\"risk-note\">\n                    Les Paper Trades n'impactent jamais le risque autorisé,\n                    le cycle réel ni le déblocage du niveau de risque.\n                </div>\n\n            </div>\n\n        </article>\n\n    </section>\n\n\n    <section class=\"lab-strip\">\n\n        <article class=\"lab-tile\">\n            <div class=\"lab-tile__label\">Max Drawdown</div>\n            <div class=\"lab-tile__value negative\">\n                2.00R\n            </div>\n            <div class=\"lab-tile__sub\">Recul maximal depuis un sommet</div>\n        </article>\n\n        <article class=\"lab-tile\">\n            <div class=\"lab-tile__label\">Espérance</div>\n            <div class=\"lab-tile__value negative\">\n                -0.78R\n            </div>\n            <div class=\"lab-tile__sub\">R moyen attendu par idée</div>\n        </article>\n\n        <article class=\"lab-tile\">\n            <div class=\"lab-tile__label\">Meilleure idée</div>\n            <div class=\"lab-tile__value positive\">\n                                    GBPUSD · +0.44R\n                            </div>\n            <div class=\"lab-tile__sub\">Meilleure performance par idée</div>\n        </article>\n\n        <article class=\"lab-tile\">\n            <div class=\"lab-tile__label\">Plus mauvaise idée</div>\n            <div class=\"lab-tile__value negative\">\n                                    EUR · -2.00R\n                            </div>\n            <div class=\"lab-tile__sub\">Plus forte perte par idée</div>\n        </article>\n\n    </section>\n\n\n    <section class=\"breakdowns\">\n\n        <article class=\"breakdown-card\">\n            <h2 class=\"breakdown-card__title\">Performance par jour</h2>\n\n            <div class=\"breakdown-card__body\">\n                \n                    <div class=\"breakdown-row\">\n                        <span class=\"breakdown-row__name\">Non renseigné</span>\n                        <span class=\"breakdown-row__count\">\n                            2 · 50%\n                        </span>\n                        <span class=\"breakdown-row__r negative\">\n                            -1.56R\n                        </span>\n                    </div>\n\n                            </div>\n        </article>\n\n\n        <article class=\"breakdown-card\">\n            <h2 class=\"breakdown-card__title\">Performance par session</h2>\n\n            <div class=\"breakdown-card__body\">\n                \n                    <div class=\"breakdown-row\">\n                        <span class=\"breakdown-row__name\">Non renseigné</span>\n                        <span class=\"breakdown-row__count\">\n                            2 · 50%\n                        </span>\n                        <span class=\"breakdown-row__r negative\">\n                            -1.56R\n                        </span>\n                    </div>\n\n                            </div>\n        </article>\n\n\n        <article class=\"breakdown-card\">\n            <h2 class=\"breakdown-card__title\">Performance par setup</h2>\n\n            <div class=\"breakdown-card__body\">\n                \n                    <div class=\"breakdown-row\">\n                        <span class=\"breakdown-row__name\">Non renseigné</span>\n                        <span class=\"breakdown-row__count\">\n                            2 · 50%\n                        </span>\n                        <span class=\"breakdown-row__r negative\">\n                            -1.56R\n                        </span>\n                    </div>\n\n                            </div>\n        </article>\n\n    </section>\n\n\n    <div class=\"footer\">\n        ICT Performance Lab by Jul — 2026\n    </div>\n\n</div>\n\n</main>\n\n<script>\n    (() => {\n        const buttons =\n            document.querySelectorAll('[data-theme-choice]');\n\n        function applyTheme(theme) {\n            document.documentElement.dataset.theme = theme;\n\n            localStorage.setItem(\n                'ict-theme',\n                theme\n            );\n\n            buttons.forEach(button => {\n                const active =\n                    button.dataset.themeChoice === theme;\n\n                button.classList.toggle(\n                    'is-active',\n                    active\n                );\n\n                button.setAttribute(\n                    'aria-pressed',\n                    active ? 'true' : 'false'\n                );\n            });\n        }\n\n        const savedTheme =\n            localStorage.getItem('ict-theme') || 'dark';\n\n        applyTheme(savedTheme);\n\n        buttons.forEach(button => {\n            button.addEventListener('click', () => {\n                applyTheme(\n                    button.dataset.themeChoice\n                );\n            });\n        });\n    })();\n</script>\n\n\n</body>\n</html>"}},"props":[],"propValues":[],"route":{"name":"dashboard","uri":"/dashboard","action":"Closure","actionSource":{"file":"/Users/jul/Documents/ICT-Performance-Lab/routes/web.php","line":24}},"renderSource":null,"componentPath":null}