:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:#171923;font-synthesis:none;background:#f5f6f8;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Helvetica Neue,Arial,sans-serif}*{box-sizing:border-box}html,body{min-width:320px;min-height:100%;margin:0}body{background:#f5f6f8}button{font:inherit}.brand-bar{z-index:20;color:#fff;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#111827f5;border-bottom:1px solid #ffffff1f;position:sticky;top:0}.brand-inner,.content-width{width:min(1080px,100% - 40px);margin:0 auto}.brand-inner{align-items:center;gap:12px;min-height:68px;display:flex}.brand-icon{border-radius:8px;width:42px;height:42px;box-shadow:0 8px 24px #00000038}.brand-name,.brand-subtitle,.eyebrow,.report-date,.state-panel p{margin:0}.brand-name{font-size:15px;font-weight:700}.brand-subtitle{color:#b6bdc9;margin-top:2px;font-size:12px}.state-panel{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:calc(100vh - 68px);padding:40px 24px;display:flex}.loading-mark{border:3px solid #dfe2e8;border-top-color:#6a35ff;border-radius:50%;width:38px;height:38px;margin-bottom:18px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.error-symbol{color:#c24124;background:#ffe7df;border-radius:50%;place-items:center;width:52px;height:52px;margin-bottom:18px;font-size:28px;font-weight:800;display:grid}.state-panel h1{margin:0 0 8px;font-size:23px}.state-panel p{color:#6b7280;max-width:420px;line-height:1.6}.state-panel button{color:#fff;cursor:pointer;background:#171923;border:0;border-radius:6px;margin-top:24px;padding:11px 18px;font-weight:700}.report-heading{background:#fff;padding:38px 0 34px}.heading-layout,.owner-block,.section-heading,.court-layout,.report-footer{align-items:center;display:flex}.heading-layout{justify-content:space-between;gap:24px}.owner-block{gap:16px;min-width:0}.avatar-shell{color:#6a35ff;background:#ece8ff;border:1px solid #e6e8ed;border-radius:50%;flex:none;place-items:center;width:58px;height:58px;font-size:22px;font-weight:800;display:grid;overflow:hidden}.avatar-shell img{object-fit:cover;width:100%;height:100%}.eyebrow{color:#6a35ff;text-transform:uppercase;font-size:12px;font-weight:800}.report-heading h1,.report-section h2,.court-band h2{letter-spacing:0;margin:4px 0 0}.report-heading h1{overflow-wrap:anywhere;font-size:26px;line-height:1.25}.report-date{color:#737986;margin-top:6px;font-size:13px}.level-badge{color:#b54720;background:#fff4ee;border:1px solid #ffd3bd;border-radius:6px;flex:none;padding:8px 12px;font-size:13px;font-weight:800}.metric-band{background:#fff;border-top:1px solid #eceef2;border-bottom:1px solid #e1e4e9;padding:18px 0}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.metric-item{background:#fafafa;border:1px solid #e5e7eb;border-radius:8px;min-height:108px;padding:17px 18px}.metric-primary{background:#f3f0ff;border-color:#d8ceff}.metric-label,.metric-unit{color:#747b87;font-size:12px;display:block}.metric-item strong{margin:7px 4px 1px 0;font-size:29px;line-height:1;display:inline-block}.metric-unit{display:inline}.report-section{background:#f5f6f8;padding:44px 0}.two-column{grid-template-columns:minmax(0,1.35fr) minmax(300px,.9fr);gap:34px;display:grid}.section-heading{justify-content:space-between;gap:20px;margin-bottom:22px}.section-heading h2,.court-band h2{font-size:21px}.speed-summary{text-align:right}.speed-summary span,.round-summary span,.serve-grid span{color:#737986;font-size:12px;display:block}.speed-summary strong{color:#d15527;margin-top:3px;font-size:15px;display:block}.stroke-list{gap:12px;display:grid}.stroke-row{grid-template-columns:52px minmax(0,1fr) 68px;align-items:center;gap:12px;display:grid}.stroke-row>span{font-size:14px;font-weight:700}.stroke-track,.distribution-track{background:#dfe2e7;border-radius:4px;height:8px;overflow:hidden}.stroke-track i,.distribution-track i{border-radius:inherit;background:#6a35ff;width:0;height:100%;transition:width .55s;display:block}.stroke-row strong{text-align:right;font-size:13px}.stroke-row small{color:#7b818d;font-weight:500}.stroke-chips,.round-summary,.serve-grid{gap:10px;display:grid}.stroke-chips{grid-template-columns:repeat(3,1fr);margin-top:24px}.stroke-chips>div,.serve-grid>div{background:#fff;border:1px solid #e1e4e9;border-radius:7px;padding:14px}.stroke-chips span{color:#737986;font-size:12px}.stroke-chips strong{margin-top:5px;font-size:20px;display:block}.round-panel{border-left:1px solid #dfe2e7;padding-left:32px}.round-summary{grid-template-columns:repeat(3,1fr);margin-bottom:25px}.round-summary strong{margin-bottom:4px;font-size:26px;display:block}.distribution{gap:13px;display:grid}.distribution-row{color:#5f6672;grid-template-columns:58px minmax(0,1fr) 24px;align-items:center;gap:10px;font-size:12px;display:grid}.distribution-row strong{text-align:right;color:#171923}.distribution-blue{background:#2b7fff}.distribution-orange{background:#ef7545}.court-band{color:#fff;background:#151a22;padding:46px 0}.court-layout{justify-content:space-between;gap:44px}.court-copy{flex:0 0 240px}.court-copy .eyebrow{color:#a996ff}.court-legend{color:#c7ccd5;gap:10px;margin-top:26px;font-size:12px;display:grid}.court-legend span{align-items:center;gap:8px;display:flex}.legend-dot{border-radius:50%;width:9px;height:9px}.my-dot,.court-point.my{background:#b9ff62}.opponent-dot,.court-point.opponent{background:#64a8ff}.serve-dot,.court-point.serve{background:#ff9b65}.tennis-court{aspect-ratio:1.72;background:#287c5b;border:10px solid #1f694c;border-radius:8px;width:min(620px,68vw);position:relative;overflow:hidden;box-shadow:0 24px 60px #0000004d}.court-line{border-color:#ffffffeb;position:absolute}.court-outline{border:2px solid #ffffffeb;inset:8%}.court-net{border-left:2px solid #ffffffeb;top:8%;bottom:8%;left:50%}.court-center{border-top:2px solid #ffffffeb;top:50%;left:28%;right:28%}.court-service-top,.court-service-bottom{border-left:2px solid #ffffffeb;top:8%;bottom:8%}.court-service-top{left:28%}.court-service-bottom{right:28%}.court-points{position:absolute;inset:8%}.court-point{border:1px solid #ffffffb3;border-radius:50%;width:9px;height:9px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 2px 7px #00000052}.court-point.out{background:0 0;border:2px solid #ffdfd1}.court-empty{color:#ffffffb8;place-items:center;margin:0;font-size:13px;display:grid;position:absolute;inset:0}.compact-heading{margin-bottom:20px}.serve-rate{color:#22724c;font-size:27px}.serve-grid{grid-template-columns:repeat(4,1fr)}.serve-grid strong{margin-top:6px;font-size:22px;display:block}.report-footer{padding:30px 20px calc(30px + env(safe-area-inset-bottom));color:#313641;background:#fff;border-top:1px solid #e3e5e9;justify-content:center;gap:11px}.report-footer img{border-radius:7px;width:38px;height:38px}.report-footer strong,.report-footer span{display:block}.report-footer strong{font-size:13px}.report-footer span{color:#7b818d;margin-top:2px;font-size:11px}@media (width<=760px){.brand-inner,.content-width{width:min(100% - 28px,1080px)}.brand-inner{min-height:62px}.report-heading{padding:28px 0 24px}.heading-layout{align-items:flex-start}.report-heading h1{font-size:21px}.avatar-shell{width:50px;height:50px}.metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-item{min-height:98px;padding:15px}.metric-item strong{font-size:25px}.report-section,.court-band{padding:34px 0}.two-column{grid-template-columns:1fr;gap:34px}.round-panel{border-top:1px solid #dfe2e7;border-left:0;padding:32px 0 0}.court-layout{flex-direction:column;align-items:stretch;gap:25px}.court-copy{flex-basis:auto}.court-legend{grid-template-columns:repeat(3,auto);gap:14px;margin-top:16px}.tennis-court{width:100%}.serve-grid{grid-template-columns:repeat(2,1fr)}}@media (width<=430px){.level-badge{display:none!important}.stroke-row{grid-template-columns:45px minmax(0,1fr) 62px;gap:8px}.stroke-chips>div,.serve-grid>div{padding:12px}.court-legend{grid-template-columns:1fr 1fr}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
