Last active
March 24, 2026 22:37
-
-
Save trepidity/e92fc3c65aefb6e361a3009c4ba2891b to your computer and use it in GitHub Desktop.
Jason Trainer — Program Builder Improvement Proposals (March 2026)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Movement Assessment Feature — Jason Trainer</title> | |
| <style> | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #f7f8fa; color: #1a1a1a; } | |
| .header { background: #1A365D; color: white; padding: 32px 40px; text-align: center; } | |
| .header h1 { font-size: 28px; font-weight: 700; margin-bottom: 8px; } | |
| .header p { font-size: 15px; opacity: 0.8; max-width: 600px; margin: 0 auto; line-height: 1.5; } | |
| .flow-section { max-width: 1100px; margin: 40px auto; padding: 0 24px; } | |
| .flow-section h2 { font-size: 20px; font-weight: 700; color: #1A365D; margin-bottom: 6px; } | |
| .flow-section .subtitle { font-size: 14px; color: #666; margin-bottom: 24px; } | |
| .flow-diagram { display: flex; align-items: center; justify-content: center; gap: 0; margin: 32px auto 48px; flex-wrap: wrap; max-width: 900px; } | |
| .flow-step { background: white; border: 2px solid #e2e8f0; border-radius: 12px; padding: 14px 18px; text-align: center; min-width: 130px; } | |
| .flow-step.active { border-color: #1A365D; background: #EBF0F7; } | |
| .flow-step.new { border-color: #ED8936; background: #FFFAF0; } | |
| .flow-step .label { font-size: 11px; text-transform: uppercase; font-weight: 700; color: #888; letter-spacing: 0.5px; } | |
| .flow-step .label.new-label { color: #ED8936; } | |
| .flow-step .name { font-size: 14px; font-weight: 600; margin-top: 4px; } | |
| .flow-arrow { font-size: 20px; color: #cbd5e0; padding: 0 6px; } | |
| .screens { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; margin-top: 16px; } | |
| .screens.three-col { grid-template-columns: 1fr 1fr 1fr; } | |
| @media (max-width: 768px) { .screens, .screens.three-col { grid-template-columns: 1fr; } } | |
| .screen { background: white; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 12px rgba(0,0,0,0.06); border: 1px solid #e8ecf0; } | |
| .screen-header { background: #f0f2f5; padding: 10px 16px; font-size: 12px; font-weight: 600; color: #666; border-bottom: 1px solid #e8ecf0; display: flex; align-items: center; gap: 8px; } | |
| .screen-header .dot { width: 8px; height: 8px; border-radius: 50%; } | |
| .screen-header .dot.r { background: #ff5f57; } | |
| .screen-header .dot.y { background: #febd2f; } | |
| .screen-header .dot.g { background: #28c840; } | |
| .screen-body { padding: 0; } | |
| .badge { display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 600; } | |
| .badge-new { background: #FFF3E0; color: #E65100; } | |
| .divider { border: none; border-top: 2px dashed #e2e8f0; margin: 48px 0; } | |
| /* Phone frame */ | |
| .phone { max-width: 375px; margin: 0 auto; background: white; border-radius: 24px; overflow: hidden; box-shadow: 0 4px 24px rgba(0,0,0,0.1); border: 1px solid #e0e0e0; } | |
| .phone-notch { height: 28px; background: #f0f2f5; display: flex; align-items: center; justify-content: center; } | |
| .phone-notch-inner { width: 120px; height: 6px; background: #ccc; border-radius: 3px; } | |
| .phone-body { min-height: 580px; } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- Hero --> | |
| <div class="header"> | |
| <h1>Movement Assessment Feature</h1> | |
| <p>A new diagnostic flow that lets trainers assess trainees' movement quality through video before assigning programs.</p> | |
| </div> | |
| <!-- Onboarding Flow Diagram --> | |
| <div class="flow-section"> | |
| <h2>How It Fits Into Onboarding</h2> | |
| <p class="subtitle">The assessment slots into the existing invite flow — trainees complete it before they can access the app.</p> | |
| <div class="flow-diagram"> | |
| <div class="flow-step active"> | |
| <div class="label">Step 1</div> | |
| <div class="name">Accept Invite</div> | |
| </div> | |
| <div class="flow-arrow">→</div> | |
| <div class="flow-step active"> | |
| <div class="label">Step 2</div> | |
| <div class="name">Data Consent</div> | |
| </div> | |
| <div class="flow-arrow">→</div> | |
| <div class="flow-step new"> | |
| <div class="label new-label">New Step</div> | |
| <div class="name">Assessment</div> | |
| </div> | |
| <div class="flow-arrow">→</div> | |
| <div class="flow-step active"> | |
| <div class="label">Step 3</div> | |
| <div class="name">Today's Workout</div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr class="divider" style="max-width:1100px;margin:0 auto 48px;"> | |
| <!-- TRAINER SIDE --> | |
| <div class="flow-section"> | |
| <h2>Trainer: Create Assessment Templates</h2> | |
| <p class="subtitle">Trainers build reusable assessment templates with movements they want to evaluate — then attach them to invites.</p> | |
| <div class="screens"> | |
| <!-- Template List --> | |
| <div class="screen"> | |
| <div class="screen-header"> | |
| <span class="dot r"></span><span class="dot y"></span><span class="dot g"></span> | |
| /trainer/assessments | |
| </div> | |
| <div class="screen-body" style="font-family:system-ui;"> | |
| <div style="display:flex;min-height:420px;"> | |
| <div style="width:180px;background:#1A365D;padding:16px 0;flex-shrink:0;"> | |
| <div style="padding:0 12px 16px;color:white;font-size:15px;font-weight:700;">Jason Trainer</div> | |
| <div style="padding:4px 12px;font-size:12px;color:rgba(255,255,255,0.5);"> | |
| <div style="padding:6px 10px;border-radius:5px;margin-bottom:1px;">Dashboard</div> | |
| <div style="padding:6px 10px;border-radius:5px;margin-bottom:1px;">Programs</div> | |
| <div style="padding:6px 10px;border-radius:5px;margin-bottom:1px;">Exercises</div> | |
| <div style="padding:6px 10px;border-radius:5px;margin-bottom:1px;">Trainees</div> | |
| <div style="padding:6px 10px;border-radius:5px;margin-bottom:1px;background:rgba(255,255,255,0.15);color:white;font-weight:600;">Assessments</div> | |
| <div style="padding:6px 10px;border-radius:5px;">Glossary</div> | |
| </div> | |
| </div> | |
| <div style="flex:1;padding:20px 24px;"> | |
| <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:18px;"> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;">Assessments</div> | |
| <button style="padding:8px 16px;background:#1A365D;color:white;border:none;border-radius:7px;font-size:12px;font-weight:600;">+ Create Assessment</button> | |
| </div> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:8px;padding:14px 16px;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center;"> | |
| <div> | |
| <div style="font-size:14px;font-weight:600;">New Client Movement Screen</div> | |
| <div style="font-size:11px;color:#888;margin-top:3px;">5 movements · Created Mar 10</div> | |
| </div> | |
| <div style="display:flex;gap:6px;"> | |
| <span style="font-size:10px;color:#555;background:#e8ecf0;padding:3px 8px;border-radius:10px;">Used 8x</span> | |
| <button style="padding:4px 10px;border:1px solid #e2e8f0;background:white;border-radius:5px;font-size:11px;color:#555;">Edit</button> | |
| </div> | |
| </div> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:8px;padding:14px 16px;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center;"> | |
| <div> | |
| <div style="font-size:14px;font-weight:600;">Olympic Lifting Readiness</div> | |
| <div style="font-size:11px;color:#888;margin-top:3px;">8 movements · Created Feb 22</div> | |
| </div> | |
| <div style="display:flex;gap:6px;"> | |
| <span style="font-size:10px;color:#555;background:#e8ecf0;padding:3px 8px;border-radius:10px;">Used 3x</span> | |
| <button style="padding:4px 10px;border:1px solid #e2e8f0;background:white;border-radius:5px;font-size:11px;color:#555;">Edit</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Create Form --> | |
| <div class="screen"> | |
| <div class="screen-header"> | |
| <span class="dot r"></span><span class="dot y"></span><span class="dot g"></span> | |
| /trainer/assessments/new | |
| </div> | |
| <div class="screen-body" style="padding:20px 24px;font-family:system-ui;"> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;margin-bottom:16px;">Create Assessment</div> | |
| <label style="display:block;font-size:11px;font-weight:600;color:#555;margin-bottom:4px;">Assessment Name</label> | |
| <input style="width:100%;padding:8px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:13px;margin-bottom:12px;box-sizing:border-box;" value="New Client Movement Screen" /> | |
| <label style="display:block;font-size:11px;font-weight:600;color:#555;margin-bottom:4px;">Instructions for Trainee</label> | |
| <textarea style="width:100%;padding:8px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:12px;margin-bottom:16px;box-sizing:border-box;height:44px;resize:none;font-family:inherit;">Film each movement from the side. Bodyweight only.</textarea> | |
| <label style="display:block;font-size:11px;font-weight:600;color:#555;margin-bottom:8px;">Movements</label> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:8px;padding:12px;margin-bottom:6px;display:flex;gap:8px;"> | |
| <div style="color:#ccc;font-size:14px;">☰</div> | |
| <div style="flex:1;"> | |
| <div style="display:flex;gap:6px;align-items:center;margin-bottom:4px;"> | |
| <span style="background:#1A365D;color:white;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;">1</span> | |
| <input style="flex:1;padding:6px 10px;border:1px solid #cbd5e0;border-radius:5px;font-size:12px;" value="Bodyweight Squat" /> | |
| </div> | |
| <textarea style="width:100%;padding:4px 10px;border:1px solid #e8ecf0;border-radius:5px;font-size:11px;color:#666;height:28px;resize:none;font-family:inherit;">Full depth, feet shoulder width</textarea> | |
| </div> | |
| </div> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:8px;padding:12px;margin-bottom:6px;display:flex;gap:8px;"> | |
| <div style="color:#ccc;font-size:14px;">☰</div> | |
| <div style="flex:1;"> | |
| <div style="display:flex;gap:6px;align-items:center;margin-bottom:4px;"> | |
| <span style="background:#1A365D;color:white;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;">2</span> | |
| <input style="flex:1;padding:6px 10px;border:1px solid #cbd5e0;border-radius:5px;font-size:12px;" value="Overhead Squat" /> | |
| </div> | |
| <textarea style="width:100%;padding:4px 10px;border:1px solid #e8ecf0;border-radius:5px;font-size:11px;color:#666;height:28px;resize:none;font-family:inherit;">PVC pipe, wide grip overhead</textarea> | |
| </div> | |
| </div> | |
| <button style="width:100%;padding:10px;border:2px dashed #cbd5e0;border-radius:8px;background:white;color:#1A365D;font-size:12px;font-weight:600;margin-bottom:16px;">+ Add Movement</button> | |
| <button style="padding:10px 24px;background:#1A365D;color:white;border:none;border-radius:7px;font-size:13px;font-weight:600;">Save Assessment</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Invite with Assessment --> | |
| <div class="flow-section"> | |
| <h2>Trainer: Attach Assessment to Invite</h2> | |
| <p class="subtitle">When inviting a new trainee, the trainer can optionally select which assessment they should complete.</p> | |
| <div style="max-width:460px;margin:0 auto;"> | |
| <div class="screen"> | |
| <div class="screen-header"> | |
| <span class="dot r"></span><span class="dot y"></span><span class="dot g"></span> | |
| Invite Trainee Modal | |
| </div> | |
| <div class="screen-body" style="padding:24px;font-family:system-ui;"> | |
| <div style="font-size:16px;font-weight:700;color:#1A365D;margin-bottom:16px;">Invite Trainee</div> | |
| <label style="display:block;font-size:11px;font-weight:600;color:#555;margin-bottom:4px;">Email Address</label> | |
| <input style="width:100%;padding:9px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:13px;margin-bottom:14px;box-sizing:border-box;" value="sarah@example.com" /> | |
| <label style="display:block;font-size:11px;font-weight:600;color:#555;margin-bottom:4px;">Movement Assessment <span style="color:#aaa;font-weight:400;">(optional)</span></label> | |
| <select style="width:100%;padding:9px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:13px;margin-bottom:4px;box-sizing:border-box;background:white;"> | |
| <option>New Client Movement Screen (5 movements)</option> | |
| </select> | |
| <p style="font-size:11px;color:#888;margin-bottom:20px;">Trainee will complete this before accessing the app</p> | |
| <div style="display:flex;gap:8px;justify-content:flex-end;"> | |
| <button style="padding:9px 18px;background:white;color:#555;border:1px solid #e2e8f0;border-radius:7px;font-size:13px;">Cancel</button> | |
| <button style="padding:9px 18px;background:#1A365D;color:white;border:none;border-radius:7px;font-size:13px;font-weight:600;">Send Invite</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr class="divider" style="max-width:1100px;margin:24px auto 48px;"> | |
| <!-- TRAINEE SIDE --> | |
| <div class="flow-section"> | |
| <h2>Trainee: Complete Assessment (Mobile)</h2> | |
| <p class="subtitle">After accepting the invite and consenting to data sharing, the trainee sees one movement at a time. They film each movement, then submit everything to the trainer.</p> | |
| <div class="screens three-col"> | |
| <!-- Step: Recording --> | |
| <div class="phone"> | |
| <div class="phone-notch"><div class="phone-notch-inner"></div></div> | |
| <div class="phone-body" style="font-family:system-ui;background:#f7f8fa;display:flex;flex-direction:column;"> | |
| <div style="padding:14px 16px 0;"> | |
| <div style="display:flex;justify-content:space-between;font-size:11px;color:#666;margin-bottom:4px;"> | |
| <span>Movement 2 of 5</span> | |
| <span>40%</span> | |
| </div> | |
| <div style="height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden;"> | |
| <div style="width:40%;height:100%;background:#1A365D;border-radius:2px;"></div> | |
| </div> | |
| </div> | |
| <div style="padding:16px 16px 8px;"> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;">Overhead Squat</div> | |
| <div style="font-size:12px;color:#555;margin-top:4px;line-height:1.4;">PVC pipe or empty bar, wide grip overhead. Squat to full depth.</div> | |
| </div> | |
| <div style="margin:0 16px;background:#e2e8f0;border-radius:10px;height:140px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:6px;"> | |
| <div style="width:40px;height:40px;background:#1A365D;border-radius:50%;display:flex;align-items:center;justify-content:center;"> | |
| <span style="color:white;font-size:16px;">▶</span> | |
| </div> | |
| <span style="font-size:11px;color:#666;">Watch demo</span> | |
| </div> | |
| <div style="margin:12px 16px;padding:28px 16px;border:2px dashed #cbd5e0;border-radius:10px;text-align:center;"> | |
| <div style="font-size:28px;margin-bottom:6px;">📷</div> | |
| <div style="font-size:13px;font-weight:600;color:#1A365D;">Record or upload video</div> | |
| <div style="font-size:11px;color:#888;margin-top:2px;">Tap to open camera</div> | |
| </div> | |
| <div style="margin-top:auto;padding:12px 16px 20px;display:flex;gap:10px;"> | |
| <button style="flex:1;padding:12px;border-radius:8px;border:2px solid #1A365D;background:white;color:#1A365D;font-size:13px;font-weight:600;">Back</button> | |
| <button style="flex:2;padding:12px;border-radius:8px;border:none;background:#cbd5e0;color:#888;font-size:13px;font-weight:600;">Next</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Step: Video Uploaded --> | |
| <div class="phone"> | |
| <div class="phone-notch"><div class="phone-notch-inner"></div></div> | |
| <div class="phone-body" style="font-family:system-ui;background:#f7f8fa;display:flex;flex-direction:column;"> | |
| <div style="padding:14px 16px 0;"> | |
| <div style="display:flex;justify-content:space-between;font-size:11px;color:#666;margin-bottom:4px;"> | |
| <span>Movement 2 of 5</span> | |
| <span>40%</span> | |
| </div> | |
| <div style="height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden;"> | |
| <div style="width:40%;height:100%;background:#1A365D;border-radius:2px;"></div> | |
| </div> | |
| </div> | |
| <div style="padding:16px 16px 8px;"> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;">Overhead Squat</div> | |
| <div style="font-size:12px;color:#555;margin-top:4px;line-height:1.4;">PVC pipe or empty bar, wide grip overhead. Squat to full depth.</div> | |
| </div> | |
| <div style="margin:0 16px;background:#1a1a1a;border-radius:10px;height:160px;display:flex;align-items:center;justify-content:center;position:relative;"> | |
| <div style="width:40px;height:40px;background:rgba(255,255,255,0.9);border-radius:50%;display:flex;align-items:center;justify-content:center;"> | |
| <span style="font-size:16px;margin-left:2px;">▶</span> | |
| </div> | |
| <div style="position:absolute;bottom:6px;right:6px;background:rgba(0,0,0,0.7);color:white;padding:2px 6px;border-radius:3px;font-size:10px;">0:14</div> | |
| <div style="position:absolute;top:-6px;right:-6px;width:24px;height:24px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;border:2px solid white;"> | |
| <span style="color:white;font-size:12px;">✓</span> | |
| </div> | |
| </div> | |
| <div style="text-align:center;margin-top:10px;"> | |
| <button style="padding:6px 16px;border-radius:6px;border:1px solid #e2e8f0;background:white;color:#666;font-size:11px;">Re-record video</button> | |
| </div> | |
| <div style="margin-top:auto;padding:12px 16px 20px;display:flex;gap:10px;"> | |
| <button style="flex:1;padding:12px;border-radius:8px;border:2px solid #1A365D;background:white;color:#1A365D;font-size:13px;font-weight:600;">Back</button> | |
| <button style="flex:2;padding:12px;border-radius:8px;border:none;background:#1A365D;color:white;font-size:13px;font-weight:600;">Next →</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Review & Submit --> | |
| <div class="phone"> | |
| <div class="phone-notch"><div class="phone-notch-inner"></div></div> | |
| <div class="phone-body" style="font-family:system-ui;background:#f7f8fa;display:flex;flex-direction:column;"> | |
| <div style="padding:16px 16px 8px;"> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;">Review & Submit</div> | |
| <div style="font-size:12px;color:#555;margin-top:4px;">Review your videos before submitting</div> | |
| </div> | |
| <div style="padding:0 16px 8px;"> | |
| <div style="height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden;"> | |
| <div style="width:100%;height:100%;background:#38a169;border-radius:2px;"></div> | |
| </div> | |
| <div style="font-size:10px;color:#38a169;margin-top:3px;font-weight:600;">5 of 5 movements recorded</div> | |
| </div> | |
| <div style="padding:0 16px;"> | |
| <div style="display:flex;align-items:center;padding:11px 0;border-bottom:1px solid #e2e8f0;gap:10px;"> | |
| <div style="width:48px;height:36px;background:#1a1a1a;border-radius:5px;flex-shrink:0;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:8px;">▶</span></div> | |
| <div style="flex:1;font-size:13px;font-weight:600;">Bodyweight Squat</div> | |
| <div style="width:18px;height:18px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:10px;">✓</span></div> | |
| </div> | |
| <div style="display:flex;align-items:center;padding:11px 0;border-bottom:1px solid #e2e8f0;gap:10px;"> | |
| <div style="width:48px;height:36px;background:#1a1a1a;border-radius:5px;flex-shrink:0;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:8px;">▶</span></div> | |
| <div style="flex:1;font-size:13px;font-weight:600;">Overhead Squat</div> | |
| <div style="width:18px;height:18px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:10px;">✓</span></div> | |
| </div> | |
| <div style="display:flex;align-items:center;padding:11px 0;border-bottom:1px solid #e2e8f0;gap:10px;"> | |
| <div style="width:48px;height:36px;background:#1a1a1a;border-radius:5px;flex-shrink:0;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:8px;">▶</span></div> | |
| <div style="flex:1;font-size:13px;font-weight:600;">Romanian Deadlift</div> | |
| <div style="width:18px;height:18px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:10px;">✓</span></div> | |
| </div> | |
| <div style="display:flex;align-items:center;padding:11px 0;border-bottom:1px solid #e2e8f0;gap:10px;"> | |
| <div style="width:48px;height:36px;background:#1a1a1a;border-radius:5px;flex-shrink:0;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:8px;">▶</span></div> | |
| <div style="flex:1;font-size:13px;font-weight:600;">Push-up</div> | |
| <div style="width:18px;height:18px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:10px;">✓</span></div> | |
| </div> | |
| <div style="display:flex;align-items:center;padding:11px 0;gap:10px;"> | |
| <div style="width:48px;height:36px;background:#1a1a1a;border-radius:5px;flex-shrink:0;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:8px;">▶</span></div> | |
| <div style="flex:1;font-size:13px;font-weight:600;">Walking Lunge</div> | |
| <div style="width:18px;height:18px;background:#38a169;border-radius:50%;display:flex;align-items:center;justify-content:center;"><span style="color:white;font-size:10px;">✓</span></div> | |
| </div> | |
| </div> | |
| <div style="margin-top:auto;padding:14px 16px 20px;"> | |
| <button style="width:100%;padding:14px;border-radius:8px;border:none;background:#1A365D;color:white;font-size:14px;font-weight:600;">Submit to Trainer</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr class="divider" style="max-width:1100px;margin:24px auto 48px;"> | |
| <!-- TRAINER REVIEW --> | |
| <div class="flow-section"> | |
| <h2>Trainer: Review Submitted Videos</h2> | |
| <p class="subtitle">After the trainee submits, the trainer reviews each movement video and can leave feedback on form, mobility, and areas to work on.</p> | |
| <div class="screen" style="max-width:900px;margin:0 auto;"> | |
| <div class="screen-header"> | |
| <span class="dot r"></span><span class="dot y"></span><span class="dot g"></span> | |
| /trainer/trainees/sarah/assessments/review | |
| </div> | |
| <div class="screen-body" style="padding:24px;font-family:system-ui;"> | |
| <div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:20px;"> | |
| <div> | |
| <div style="font-size:18px;font-weight:700;color:#1A365D;">New Client Movement Screen</div> | |
| <div style="font-size:12px;color:#888;margin-top:3px;">Sarah Chen · Submitted Mar 23, 2026</div> | |
| </div> | |
| <span style="background:#c6f6d5;color:#276749;padding:5px 12px;border-radius:12px;font-size:11px;font-weight:600;">Completed</span> | |
| </div> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;margin-bottom:14px;"> | |
| <div style="display:flex;"> | |
| <div style="width:260px;background:#1a1a1a;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;min-height:140px;"> | |
| <div style="width:40px;height:40px;background:rgba(255,255,255,0.9);border-radius:50%;display:flex;align-items:center;justify-content:center;"> | |
| <span style="font-size:16px;margin-left:2px;">▶</span> | |
| </div> | |
| <div style="position:absolute;bottom:6px;right:6px;background:rgba(0,0,0,0.7);color:white;padding:2px 6px;border-radius:3px;font-size:10px;">0:12</div> | |
| </div> | |
| <div style="flex:1;padding:14px 16px;"> | |
| <span style="font-size:9px;text-transform:uppercase;color:#888;font-weight:600;letter-spacing:0.4px;">Movement 1 of 5</span> | |
| <div style="font-size:14px;font-weight:600;margin-top:2px;">Bodyweight Squat</div> | |
| <div style="font-size:11px;color:#888;margin-top:2px;">Full depth, feet shoulder width</div> | |
| <div style="margin-top:10px;"> | |
| <label style="font-size:10px;font-weight:600;color:#555;display:block;margin-bottom:3px;">Your Feedback</label> | |
| <textarea style="width:100%;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;font-size:11px;height:48px;resize:none;font-family:inherit;box-sizing:border-box;">Good depth. Slight knee valgus at the bottom — add banded squats to warm-up.</textarea> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div style="background:#f8f9fa;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;margin-bottom:14px;"> | |
| <div style="display:flex;"> | |
| <div style="width:260px;background:#1a1a1a;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;min-height:140px;"> | |
| <div style="width:40px;height:40px;background:rgba(255,255,255,0.9);border-radius:50%;display:flex;align-items:center;justify-content:center;"> | |
| <span style="font-size:16px;margin-left:2px;">▶</span> | |
| </div> | |
| <div style="position:absolute;bottom:6px;right:6px;background:rgba(0,0,0,0.7);color:white;padding:2px 6px;border-radius:3px;font-size:10px;">0:14</div> | |
| </div> | |
| <div style="flex:1;padding:14px 16px;"> | |
| <span style="font-size:9px;text-transform:uppercase;color:#888;font-weight:600;letter-spacing:0.4px;">Movement 2 of 5</span> | |
| <div style="font-size:14px;font-weight:600;margin-top:2px;">Overhead Squat</div> | |
| <div style="font-size:11px;color:#888;margin-top:2px;">PVC pipe, wide grip overhead</div> | |
| <div style="margin-top:10px;"> | |
| <label style="font-size:10px;font-weight:600;color:#555;display:block;margin-bottom:3px;">Your Feedback</label> | |
| <textarea style="width:100%;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;font-size:11px;height:48px;resize:none;font-family:inherit;box-sizing:border-box;">Limited thoracic extension — bar drifts forward. Prioritize t-spine mobility work.</textarea> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <button style="padding:10px 24px;background:#1A365D;color:white;border:none;border-radius:7px;font-size:13px;font-weight:600;margin-top:8px;">Save Feedback</button> | |
| </div> | |
| </div> | |
| </div> | |
| <div style="text-align:center;padding:40px 24px 48px;color:#888;font-size:13px;"> | |
| Built for Jason Trainer · Movement Assessment Feature · March 2026 | |
| </div> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Jason Trainer — Dark Power Design</title> | |
| <style> | |
| @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;0,9..40,800&family=Space+Grotesk:wght@300;400;500;600;700&display=swap'); | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { | |
| font-family: 'DM Sans', -apple-system, sans-serif; | |
| background: #050505; | |
| color: #fff; | |
| min-height: 100vh; | |
| overflow-x: hidden; | |
| } | |
| /* ===== Page Layout ===== */ | |
| .page-header { | |
| text-align: center; | |
| padding: 48px 20px 16px; | |
| } | |
| .page-header h1 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 36px; | |
| font-weight: 700; | |
| letter-spacing: -1px; | |
| background: linear-gradient(135deg, #FF6B35, #FF9F1C); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| } | |
| .page-header p { | |
| color: #555; | |
| font-size: 15px; | |
| margin-top: 8px; | |
| } | |
| .screen-nav { | |
| display: flex; | |
| justify-content: center; | |
| gap: 8px; | |
| padding: 24px 20px; | |
| flex-wrap: wrap; | |
| } | |
| .screen-nav button { | |
| background: #1a1a1a; | |
| border: 1px solid #2a2a2a; | |
| color: #888; | |
| padding: 10px 20px; | |
| border-radius: 100px; | |
| font-family: 'DM Sans', sans-serif; | |
| font-size: 14px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| } | |
| .screen-nav button:hover { | |
| border-color: #FF6B35; | |
| color: #FF6B35; | |
| } | |
| .screen-nav button.active { | |
| background: linear-gradient(135deg, #FF6B35, #FF9F1C); | |
| border-color: transparent; | |
| color: white; | |
| } | |
| .screens-container { | |
| display: flex; | |
| justify-content: center; | |
| padding: 20px; | |
| } | |
| .phone-showcase { | |
| position: relative; | |
| } | |
| /* Phone Frame */ | |
| .phone-frame { | |
| width: 375px; | |
| height: 812px; | |
| background: #000; | |
| border-radius: 48px; | |
| padding: 12px; | |
| box-shadow: | |
| 0 0 0 2px #1a1a1a, | |
| 0 0 0 4px #111, | |
| 0 20px 80px rgba(255,107,53,0.15), | |
| 0 40px 120px rgba(0,0,0,0.8); | |
| position: relative; | |
| } | |
| .phone-inner { | |
| width: 100%; | |
| height: 100%; | |
| border-radius: 38px; | |
| overflow: hidden; | |
| position: relative; | |
| background: #0D0D0D; | |
| } | |
| /* Dynamic Island */ | |
| .dynamic-island { | |
| position: absolute; | |
| top: 10px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 126px; | |
| height: 36px; | |
| background: #000; | |
| border-radius: 20px; | |
| z-index: 50; | |
| } | |
| /* Screen containers */ | |
| .screen { | |
| display: none; | |
| width: 100%; | |
| height: 100%; | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| -ms-overflow-style: none; | |
| scrollbar-width: none; | |
| } | |
| .screen::-webkit-scrollbar { display: none; } | |
| .screen.active { display: flex; flex-direction: column; } | |
| /* ================================================================ | |
| SCREEN 1: HOME DASHBOARD | |
| ================================================================ */ | |
| .home { | |
| background: #0D0D0D; | |
| padding-bottom: 80px; | |
| } | |
| .home .top-bar { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 56px 24px 0; | |
| } | |
| .home .avatar { | |
| width: 44px; | |
| height: 44px; | |
| border-radius: 50%; | |
| background: linear-gradient(135deg, #FF6B35, #FF9F1C); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: white; | |
| } | |
| .home .top-icons { | |
| display: flex; | |
| gap: 12px; | |
| } | |
| .home .icon-btn { | |
| width: 44px; | |
| height: 44px; | |
| border-radius: 50%; | |
| background: #1a1a1a; | |
| border: 1px solid #222; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 18px; | |
| position: relative; | |
| } | |
| .home .icon-btn .badge { | |
| position: absolute; | |
| top: -2px; | |
| right: -2px; | |
| width: 18px; | |
| height: 18px; | |
| background: #FF6B35; | |
| border-radius: 50%; | |
| font-size: 10px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-weight: 700; | |
| border: 2px solid #0D0D0D; | |
| } | |
| .home .greeting { | |
| padding: 20px 24px 0; | |
| } | |
| .home .greeting .sub { | |
| font-size: 14px; | |
| color: #666; | |
| font-weight: 500; | |
| } | |
| .home .greeting h1 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 28px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-top: 2px; | |
| letter-spacing: -0.5px; | |
| } | |
| /* Today's Mission Card */ | |
| .mission-card { | |
| margin: 20px 20px 0; | |
| background: linear-gradient(135deg, #1a1a1a 0%, #111 100%); | |
| border-radius: 24px; | |
| padding: 24px; | |
| border: 1px solid #222; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .mission-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 3px; | |
| background: linear-gradient(90deg, #FF6B35, #FF9F1C, #FF6B35); | |
| } | |
| .mission-card::after { | |
| content: ''; | |
| position: absolute; | |
| right: -30px; | |
| bottom: -30px; | |
| width: 120px; | |
| height: 120px; | |
| background: radial-gradient(circle, rgba(255,107,53,0.08) 0%, transparent 70%); | |
| border-radius: 50%; | |
| } | |
| .mission-card .mission-top { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: flex-start; | |
| } | |
| .mission-card .mission-label { | |
| font-size: 11px; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| color: #FF6B35; | |
| font-weight: 700; | |
| } | |
| .mission-card .mission-title { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 22px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-top: 8px; | |
| letter-spacing: -0.3px; | |
| } | |
| .mission-card .mission-sub { | |
| font-size: 13px; | |
| color: #666; | |
| margin-top: 4px; | |
| } | |
| .mission-card .mission-ring { | |
| width: 64px; | |
| height: 64px; | |
| position: relative; | |
| flex-shrink: 0; | |
| } | |
| .mission-card .mission-ring svg { | |
| width: 64px; | |
| height: 64px; | |
| transform: rotate(-90deg); | |
| } | |
| .mission-card .mission-ring .ring-bg { | |
| fill: none; | |
| stroke: #2a2a2a; | |
| stroke-width: 5; | |
| } | |
| .mission-card .mission-ring .ring-fill { | |
| fill: none; | |
| stroke: url(#orangeGrad); | |
| stroke-width: 5; | |
| stroke-linecap: round; | |
| stroke-dasharray: 163.36; | |
| stroke-dashoffset: 106.18; | |
| } | |
| .mission-card .ring-text { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| font-size: 15px; | |
| font-weight: 800; | |
| color: #FF6B35; | |
| } | |
| .mission-card .progress-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| margin-top: 18px; | |
| } | |
| .mission-card .progress-bar { | |
| flex: 1; | |
| height: 6px; | |
| background: #2a2a2a; | |
| border-radius: 3px; | |
| overflow: hidden; | |
| } | |
| .mission-card .progress-fill { | |
| width: 35%; | |
| height: 100%; | |
| background: linear-gradient(90deg, #FF6B35, #FF9F1C); | |
| border-radius: 3px; | |
| transition: width 0.5s ease; | |
| } | |
| .mission-card .progress-label { | |
| font-size: 12px; | |
| font-weight: 700; | |
| color: #FF9F1C; | |
| white-space: nowrap; | |
| } | |
| /* Stats Row */ | |
| .stats-row { | |
| display: flex; | |
| gap: 12px; | |
| padding: 20px 20px 0; | |
| } | |
| .stat-card { | |
| flex: 1; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 18px; | |
| padding: 16px 12px; | |
| text-align: center; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .stat-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 40%; | |
| height: 1px; | |
| background: linear-gradient(90deg, transparent, rgba(255,107,53,0.3), transparent); | |
| } | |
| .stat-card .stat-emoji { font-size: 22px; margin-bottom: 6px; } | |
| .stat-card .stat-val { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 22px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .stat-card .stat-label { | |
| font-size: 10px; | |
| color: #555; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| margin-top: 4px; | |
| font-weight: 600; | |
| } | |
| /* Workout Section */ | |
| .section-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 24px 24px 12px; | |
| } | |
| .section-header h3 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .section-header .see-all { | |
| font-size: 13px; | |
| color: #FF6B35; | |
| font-weight: 600; | |
| letter-spacing: 0.3px; | |
| } | |
| .exercise-list { | |
| padding: 0 20px; | |
| } | |
| .exercise-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 18px; | |
| padding: 16px; | |
| margin-bottom: 10px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .exercise-card.completed { | |
| opacity: 0.5; | |
| } | |
| .exercise-card.completed::after { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 3px; | |
| background: #27AE60; | |
| } | |
| .exercise-card.current::after { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 3px; | |
| background: linear-gradient(180deg, #FF6B35, #FF9F1C); | |
| } | |
| .exercise-icon-wrap { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 22px; | |
| flex-shrink: 0; | |
| } | |
| .exercise-icon-wrap.warmup { background: rgba(255,159,28,0.1); } | |
| .exercise-icon-wrap.primary { background: rgba(255,107,53,0.12); } | |
| .exercise-icon-wrap.accessory { background: rgba(255,107,53,0.06); } | |
| .exercise-info { flex: 1; } | |
| .exercise-info h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .exercise-info .exercise-meta { | |
| font-size: 12px; | |
| color: #555; | |
| margin-top: 3px; | |
| } | |
| .exercise-info .exercise-meta span { | |
| color: #FF9F1C; | |
| font-weight: 600; | |
| } | |
| .exercise-check { | |
| width: 28px; | |
| height: 28px; | |
| border-radius: 50%; | |
| border: 2px solid #333; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .exercise-check.done { | |
| background: linear-gradient(135deg, #27AE60, #2ECC71); | |
| border: none; | |
| color: white; | |
| font-size: 13px; | |
| font-weight: 800; | |
| } | |
| /* Bottom Nav */ | |
| .bottom-nav { | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| display: flex; | |
| justify-content: space-around; | |
| padding: 12px 8px 28px; | |
| background: linear-gradient(180deg, transparent 0%, #0D0D0D 30%); | |
| z-index: 10; | |
| } | |
| .nav-item { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 4px; | |
| cursor: pointer; | |
| position: relative; | |
| } | |
| .nav-item .nav-icon { | |
| font-size: 22px; | |
| opacity: 0.35; | |
| transition: all 0.2s; | |
| } | |
| .nav-item .nav-label { | |
| font-size: 10px; | |
| color: #444; | |
| font-weight: 600; | |
| letter-spacing: 0.3px; | |
| transition: all 0.2s; | |
| } | |
| .nav-item.active .nav-icon { | |
| opacity: 1; | |
| } | |
| .nav-item.active .nav-label { | |
| color: #FF6B35; | |
| } | |
| .nav-item.active::before { | |
| content: ''; | |
| position: absolute; | |
| top: -12px; | |
| width: 20px; | |
| height: 3px; | |
| background: #FF6B35; | |
| border-radius: 2px; | |
| } | |
| /* ================================================================ | |
| SCREEN 2: ONBOARDING / DAILY BRIEFING | |
| ================================================================ */ | |
| .onboarding { | |
| background: #0D0D0D; | |
| padding-bottom: 80px; | |
| } | |
| .onboarding .ob-header { | |
| padding: 56px 24px 0; | |
| text-align: center; | |
| } | |
| .onboarding .ob-step { | |
| font-size: 11px; | |
| color: #FF6B35; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| font-weight: 700; | |
| } | |
| .onboarding .ob-title { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 26px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-top: 12px; | |
| letter-spacing: -0.5px; | |
| line-height: 1.2; | |
| } | |
| .onboarding .ob-sub { | |
| font-size: 14px; | |
| color: #555; | |
| margin-top: 8px; | |
| line-height: 1.5; | |
| } | |
| .onboarding .ob-visual { | |
| margin: 28px 24px 0; | |
| background: #111; | |
| border-radius: 24px; | |
| border: 1px solid #1a1a1a; | |
| padding: 28px 20px; | |
| text-align: center; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .onboarding .ob-visual::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: linear-gradient(90deg, #FF6B35, #FF9F1C); | |
| } | |
| .onboarding .ob-big-icon { | |
| font-size: 56px; | |
| margin-bottom: 12px; | |
| } | |
| .onboarding .ob-focus-label { | |
| font-size: 11px; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| color: #555; | |
| font-weight: 600; | |
| } | |
| .onboarding .ob-focus-title { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 20px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-top: 6px; | |
| } | |
| .onboarding .ob-details { | |
| padding: 20px 24px 0; | |
| } | |
| .ob-detail-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| padding: 14px 0; | |
| border-bottom: 1px solid #1a1a1a; | |
| } | |
| .ob-detail-row:last-child { border-bottom: none; } | |
| .ob-detail-icon { | |
| width: 42px; | |
| height: 42px; | |
| border-radius: 12px; | |
| background: rgba(255,107,53,0.08); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 20px; | |
| flex-shrink: 0; | |
| } | |
| .ob-detail-text h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .ob-detail-text p { | |
| font-size: 12px; | |
| color: #555; | |
| margin-top: 2px; | |
| } | |
| .onboarding .ob-cta { | |
| margin: 28px 24px 0; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 12px; | |
| } | |
| .btn-primary { | |
| background: linear-gradient(135deg, #FF6B35, #FF9F1C); | |
| border: none; | |
| color: white; | |
| padding: 16px; | |
| border-radius: 16px; | |
| font-family: 'DM Sans', sans-serif; | |
| font-size: 16px; | |
| font-weight: 700; | |
| cursor: pointer; | |
| letter-spacing: 0.3px; | |
| text-align: center; | |
| } | |
| .btn-secondary { | |
| background: transparent; | |
| border: 1px solid #333; | |
| color: #888; | |
| padding: 16px; | |
| border-radius: 16px; | |
| font-family: 'DM Sans', sans-serif; | |
| font-size: 14px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| text-align: center; | |
| } | |
| .onboarding .ob-progress-dots { | |
| display: flex; | |
| justify-content: center; | |
| gap: 8px; | |
| margin-top: 28px; | |
| } | |
| .ob-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: #333; | |
| } | |
| .ob-dot.active { | |
| width: 24px; | |
| border-radius: 4px; | |
| background: linear-gradient(90deg, #FF6B35, #FF9F1C); | |
| } | |
| /* ================================================================ | |
| SCREEN 3: CALENDAR | |
| ================================================================ */ | |
| .calendar-screen { | |
| background: #0D0D0D; | |
| padding-bottom: 80px; | |
| } | |
| .cal-header { | |
| padding: 56px 24px 0; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .cal-header h2 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| } | |
| .cal-month-nav { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .cal-month-btn { | |
| width: 36px; | |
| height: 36px; | |
| border-radius: 50%; | |
| background: #1a1a1a; | |
| border: 1px solid #222; | |
| color: #888; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 16px; | |
| cursor: pointer; | |
| } | |
| .cal-month-label { | |
| padding: 20px 24px 0; | |
| font-size: 16px; | |
| font-weight: 700; | |
| color: #FF6B35; | |
| } | |
| .cal-week-labels { | |
| display: grid; | |
| grid-template-columns: repeat(7, 1fr); | |
| padding: 16px 16px 8px; | |
| text-align: center; | |
| } | |
| .cal-week-labels span { | |
| font-size: 11px; | |
| color: #444; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| } | |
| .cal-grid { | |
| display: grid; | |
| grid-template-columns: repeat(7, 1fr); | |
| padding: 0 12px; | |
| gap: 4px; | |
| } | |
| .cal-day { | |
| aspect-ratio: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: 14px; | |
| font-size: 15px; | |
| font-weight: 600; | |
| color: #555; | |
| position: relative; | |
| cursor: pointer; | |
| gap: 3px; | |
| } | |
| .cal-day.other-month { color: #2a2a2a; } | |
| .cal-day.has-workout { color: #fff; } | |
| .cal-day.has-workout::after { | |
| content: ''; | |
| width: 5px; | |
| height: 5px; | |
| border-radius: 50%; | |
| background: #FF6B35; | |
| } | |
| .cal-day.completed { color: #27AE60; } | |
| .cal-day.completed::after { | |
| content: ''; | |
| width: 5px; | |
| height: 5px; | |
| border-radius: 50%; | |
| background: #27AE60; | |
| } | |
| .cal-day.today { | |
| background: linear-gradient(135deg, #FF6B35, #FF9F1C); | |
| color: #fff; | |
| font-weight: 800; | |
| } | |
| .cal-day.today::after { display: none; } | |
| .cal-day.rest-day { color: #333; } | |
| /* Weekly Summary */ | |
| .cal-week-summary { | |
| margin: 20px 20px 0; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 20px; | |
| padding: 20px; | |
| } | |
| .cal-week-summary h4 { | |
| font-size: 13px; | |
| color: #666; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| font-weight: 600; | |
| margin-bottom: 14px; | |
| } | |
| .cal-summary-stats { | |
| display: flex; | |
| justify-content: space-around; | |
| } | |
| .cal-stat { | |
| text-align: center; | |
| } | |
| .cal-stat .val { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .cal-stat .val.orange { color: #FF6B35; } | |
| .cal-stat .val.green { color: #27AE60; } | |
| .cal-stat .label { | |
| font-size: 11px; | |
| color: #555; | |
| margin-top: 4px; | |
| font-weight: 500; | |
| } | |
| /* Upcoming */ | |
| .cal-upcoming { | |
| margin: 16px 20px 0; | |
| } | |
| .cal-upcoming h4 { | |
| font-size: 15px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-bottom: 12px; | |
| } | |
| .cal-upcoming-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 16px; | |
| padding: 14px 16px; | |
| margin-bottom: 8px; | |
| } | |
| .cal-upcoming-day { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| background: rgba(255,107,53,0.1); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .cal-upcoming-day .day-name { | |
| font-size: 10px; | |
| color: #FF6B35; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| } | |
| .cal-upcoming-day .day-num { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .cal-upcoming-info h5 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .cal-upcoming-info p { | |
| font-size: 12px; | |
| color: #555; | |
| margin-top: 2px; | |
| } | |
| /* ================================================================ | |
| SCREEN 4: ANALYTICS / PROGRESS | |
| ================================================================ */ | |
| .analytics { | |
| background: #0D0D0D; | |
| padding-bottom: 80px; | |
| } | |
| .analytics .an-header { | |
| padding: 56px 24px 0; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .analytics .an-header h2 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| } | |
| .an-period { | |
| background: #1a1a1a; | |
| border: 1px solid #222; | |
| border-radius: 100px; | |
| padding: 8px 16px; | |
| font-size: 13px; | |
| color: #FF6B35; | |
| font-weight: 600; | |
| font-family: 'DM Sans', sans-serif; | |
| cursor: pointer; | |
| } | |
| /* Streak Banner */ | |
| .streak-banner { | |
| margin: 20px 20px 0; | |
| background: linear-gradient(135deg, #1a1a1a, #111); | |
| border: 1px solid #222; | |
| border-radius: 20px; | |
| padding: 20px; | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .streak-banner::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: linear-gradient(90deg, #FF6B35, #FF9F1C, #FF6B35); | |
| } | |
| .streak-fire { | |
| font-size: 40px; | |
| } | |
| .streak-info h3 { | |
| font-family: 'Space Grotesk', sans-serif; | |
| font-size: 28px; | |
| font-weight: 800; | |
| color: #fff; | |
| } | |
| .streak-info h3 span { color: #FF6B35; } | |
| .streak-info p { | |
| font-size: 13px; | |
| color: #555; | |
| margin-top: 2px; | |
| } | |
| /* Chart Card */ | |
| .chart-card { | |
| margin: 16px 20px 0; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 20px; | |
| padding: 20px; | |
| } | |
| .chart-card h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-bottom: 4px; | |
| } | |
| .chart-card .chart-sub { | |
| font-size: 12px; | |
| color: #555; | |
| margin-bottom: 16px; | |
| } | |
| /* Bar chart */ | |
| .bar-chart { | |
| display: flex; | |
| align-items: flex-end; | |
| gap: 8px; | |
| height: 120px; | |
| padding: 0 4px; | |
| } | |
| .bar-col { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 6px; | |
| height: 100%; | |
| justify-content: flex-end; | |
| } | |
| .bar { | |
| width: 100%; | |
| border-radius: 6px 6px 2px 2px; | |
| min-height: 4px; | |
| transition: height 0.5s ease; | |
| } | |
| .bar.orange { background: linear-gradient(180deg, #FF6B35, #FF9F1C); } | |
| .bar.dim { background: #2a2a2a; } | |
| .bar.green { background: linear-gradient(180deg, #27AE60, #2ECC71); } | |
| .bar-label { | |
| font-size: 10px; | |
| color: #444; | |
| font-weight: 600; | |
| } | |
| /* Weekly rings */ | |
| .weekly-rings { | |
| display: flex; | |
| justify-content: space-around; | |
| margin: 16px 20px 0; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 20px; | |
| padding: 20px 12px; | |
| } | |
| .ring-item { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .mini-ring { | |
| width: 48px; | |
| height: 48px; | |
| position: relative; | |
| } | |
| .mini-ring svg { | |
| width: 48px; | |
| height: 48px; | |
| transform: rotate(-90deg); | |
| } | |
| .mini-ring .ring-bg { | |
| fill: none; | |
| stroke: #2a2a2a; | |
| stroke-width: 4; | |
| } | |
| .mini-ring .ring-fill { | |
| fill: none; | |
| stroke-width: 4; | |
| stroke-linecap: round; | |
| stroke-dasharray: 125.66; | |
| } | |
| .mini-ring .ring-text { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| font-size: 11px; | |
| font-weight: 800; | |
| color: #fff; | |
| } | |
| .ring-label { | |
| font-size: 10px; | |
| color: #555; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| } | |
| /* Achievement cards */ | |
| .achievements-section { | |
| padding: 0 20px; | |
| margin-top: 16px; | |
| } | |
| .achievements-section h4 { | |
| font-size: 15px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-bottom: 12px; | |
| } | |
| .achievement-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #111; | |
| border: 1px solid #1a1a1a; | |
| border-radius: 16px; | |
| padding: 14px 16px; | |
| margin-bottom: 8px; | |
| } | |
| .achievement-card .ach-icon { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 24px; | |
| flex-shrink: 0; | |
| } | |
| .achievement-card .ach-icon.gold { | |
| background: linear-gradient(135deg, rgba(255,159,28,0.15), rgba(255,107,53,0.1)); | |
| } | |
| .achievement-card .ach-icon.silver { | |
| background: rgba(255,255,255,0.05); | |
| } | |
| .achievement-card .ach-info h5 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #fff; | |
| } | |
| .achievement-card .ach-info p { | |
| font-size: 12px; | |
| color: #555; | |
| margin-top: 2px; | |
| } | |
| .achievement-card .ach-date { | |
| margin-left: auto; | |
| font-size: 11px; | |
| color: #444; | |
| flex-shrink: 0; | |
| } | |
| /* ===== Utility ===== */ | |
| .glow-line { | |
| height: 1px; | |
| background: linear-gradient(90deg, transparent, rgba(255,107,53,0.2), transparent); | |
| margin: 0 24px; | |
| } | |
| /* ===== Mobile Responsive ===== */ | |
| @media (max-width: 500px) { | |
| .phone-frame { | |
| width: 100%; | |
| height: 100vh; | |
| border-radius: 0; | |
| padding: 0; | |
| box-shadow: none; | |
| } | |
| .phone-inner { | |
| border-radius: 0; | |
| } | |
| .dynamic-island { | |
| display: none; | |
| } | |
| .phone-showcase { | |
| width: 100%; | |
| } | |
| .page-header { | |
| padding: 16px 20px 8px; | |
| } | |
| .page-header h1 { | |
| font-size: 24px; | |
| } | |
| .screen-nav { | |
| padding: 8px 12px; | |
| gap: 4px; | |
| } | |
| .screen-nav button { | |
| padding: 8px 14px; | |
| font-size: 12px; | |
| } | |
| .screens-container { | |
| padding: 0; | |
| } | |
| body { | |
| padding: 0; | |
| } | |
| } | |
| </style> | |
| <!-- SVG Gradient Definition --> | |
| <svg width="0" height="0"> | |
| <defs> | |
| <linearGradient id="orangeGrad" x1="0%" y1="0%" x2="100%" y2="0%"> | |
| <stop offset="0%" style="stop-color:#FF6B35"/> | |
| <stop offset="100%" style="stop-color:#FF9F1C"/> | |
| </linearGradient> | |
| <linearGradient id="greenGrad" x1="0%" y1="0%" x2="100%" y2="0%"> | |
| <stop offset="0%" style="stop-color:#27AE60"/> | |
| <stop offset="100%" style="stop-color:#2ECC71"/> | |
| </linearGradient> | |
| </defs> | |
| </svg> | |
| </head> | |
| <body> | |
| <div class="page-header"> | |
| <h1>Dark Power</h1> | |
| <p>4 screens — tap to navigate between them</p> | |
| </div> | |
| <div class="screen-nav"> | |
| <button class="active" onclick="showScreen('home', this)">Home</button> | |
| <button onclick="showScreen('onboarding', this)">Daily Briefing</button> | |
| <button onclick="showScreen('calendar', this)">Calendar</button> | |
| <button onclick="showScreen('analytics', this)">Analytics</button> | |
| </div> | |
| <div class="screens-container"> | |
| <div class="phone-showcase"> | |
| <div class="phone-frame"> | |
| <div class="phone-inner"> | |
| <div class="dynamic-island"></div> | |
| <!-- ==================== HOME SCREEN ==================== --> | |
| <div class="screen home active" id="screen-home"> | |
| <div class="top-bar"> | |
| <div class="avatar">S</div> | |
| <div class="top-icons"> | |
| <div class="icon-btn">🔔<div class="badge">2</div></div> | |
| <div class="icon-btn">⚙️</div> | |
| </div> | |
| </div> | |
| <div class="greeting"> | |
| <div class="sub">Good evening</div> | |
| <h1>Sarah's Training</h1> | |
| </div> | |
| <div class="mission-card"> | |
| <div class="mission-top"> | |
| <div> | |
| <div class="mission-label">Today's Mission</div> | |
| <div class="mission-title">Lower Body Power</div> | |
| <div class="mission-sub">Olympic Strength · Week 4, Day 2</div> | |
| </div> | |
| <div class="mission-ring"> | |
| <svg viewBox="0 0 56 56"> | |
| <circle class="ring-bg" cx="28" cy="28" r="26"/> | |
| <circle class="ring-fill" cx="28" cy="28" r="26"/> | |
| </svg> | |
| <div class="ring-text">35%</div> | |
| </div> | |
| </div> | |
| <div class="progress-row"> | |
| <div class="progress-bar"><div class="progress-fill"></div></div> | |
| <div class="progress-label">2 of 6</div> | |
| </div> | |
| </div> | |
| <div class="stats-row"> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">🔥</div> | |
| <div class="stat-val">12</div> | |
| <div class="stat-label">Streak</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">⏱</div> | |
| <div class="stat-val">48m</div> | |
| <div class="stat-label">Est. Time</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">📈</div> | |
| <div class="stat-val">+8%</div> | |
| <div class="stat-label">Volume</div> | |
| </div> | |
| </div> | |
| <div class="section-header"> | |
| <h3>Exercises</h3> | |
| <span class="see-all">See all →</span> | |
| </div> | |
| <div class="exercise-list"> | |
| <div class="exercise-card completed"> | |
| <div class="exercise-icon-wrap warmup">🏃</div> | |
| <div class="exercise-info"> | |
| <h4>Dynamic Warm-up</h4> | |
| <div class="exercise-meta">10 min · Mobility</div> | |
| </div> | |
| <div class="exercise-check done">✓</div> | |
| </div> | |
| <div class="exercise-card completed"> | |
| <div class="exercise-icon-wrap primary">🏋️</div> | |
| <div class="exercise-info"> | |
| <h4>Barbell Back Squat</h4> | |
| <div class="exercise-meta">5×5 · <span>185 lbs</span></div> | |
| </div> | |
| <div class="exercise-check done">✓</div> | |
| </div> | |
| <div class="exercise-card current"> | |
| <div class="exercise-icon-wrap primary">🦵</div> | |
| <div class="exercise-info"> | |
| <h4>Romanian Deadlift</h4> | |
| <div class="exercise-meta">4×8 · <span>135 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap accessory">💪</div> | |
| <div class="exercise-info"> | |
| <h4>Bulgarian Split Squat</h4> | |
| <div class="exercise-meta">3×10 · <span>50 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap accessory">🦶</div> | |
| <div class="exercise-info"> | |
| <h4>Calf Raises</h4> | |
| <div class="exercise-meta">4×15 · <span>90 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap warmup">🧘</div> | |
| <div class="exercise-info"> | |
| <h4>Cool Down Stretch</h4> | |
| <div class="exercise-meta">5 min · Recovery</div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== DAILY BRIEFING / ONBOARDING ==================== --> | |
| <div class="screen onboarding" id="screen-onboarding"> | |
| <div class="ob-header"> | |
| <div class="ob-step">Day 23 of 84</div> | |
| <div class="ob-title">Today's Focus:<br>Explosive Power</div> | |
| <div class="ob-sub">Your coach designed today's session to build lower body strength and power output.</div> | |
| </div> | |
| <div class="ob-visual"> | |
| <div class="ob-big-icon">⚡</div> | |
| <div class="ob-focus-label">Primary Focus</div> | |
| <div class="ob-focus-title">Lower Body Power</div> | |
| </div> | |
| <div class="ob-details"> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">🎯</div> | |
| <div class="ob-detail-text"> | |
| <h4>6 Exercises</h4> | |
| <p>3 blocks: warm-up, primary, accessory</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">⏱</div> | |
| <div class="ob-detail-text"> | |
| <h4>~48 Minutes</h4> | |
| <p>Including rest periods</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">💪</div> | |
| <div class="ob-detail-text"> | |
| <h4>Main Lift: Back Squat</h4> | |
| <p>5×5 at 185 lbs — aim for depth</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">📝</div> | |
| <div class="ob-detail-text"> | |
| <h4>Coach's Note</h4> | |
| <p>Focus on bracing. Watch the video before your first set.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="ob-cta"> | |
| <div class="btn-primary">Start Workout →</div> | |
| <div class="btn-secondary">Review Exercises First</div> | |
| </div> | |
| <div class="ob-progress-dots"> | |
| <div class="ob-dot"></div> | |
| <div class="ob-dot"></div> | |
| <div class="ob-dot active"></div> | |
| <div class="ob-dot"></div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== CALENDAR ==================== --> | |
| <div class="screen calendar-screen" id="screen-calendar"> | |
| <div class="cal-header"> | |
| <h2>Calendar</h2> | |
| <div class="cal-month-nav"> | |
| <div class="cal-month-btn">‹</div> | |
| <div class="cal-month-btn">›</div> | |
| </div> | |
| </div> | |
| <div class="cal-month-label">March 2026</div> | |
| <div class="cal-week-labels"> | |
| <span>Mon</span><span>Tue</span><span>Wed</span><span>Thu</span><span>Fri</span><span>Sat</span><span>Sun</span> | |
| </div> | |
| <div class="cal-grid"> | |
| <div class="cal-day other-month">23</div> | |
| <div class="cal-day other-month">24</div> | |
| <div class="cal-day other-month">25</div> | |
| <div class="cal-day other-month">26</div> | |
| <div class="cal-day other-month">27</div> | |
| <div class="cal-day other-month">28</div> | |
| <div class="cal-day rest-day">1</div> | |
| <div class="cal-day completed">2</div> | |
| <div class="cal-day completed">3</div> | |
| <div class="cal-day completed">4</div> | |
| <div class="cal-day completed">5</div> | |
| <div class="cal-day completed">6</div> | |
| <div class="cal-day rest-day">7</div> | |
| <div class="cal-day rest-day">8</div> | |
| <div class="cal-day completed">9</div> | |
| <div class="cal-day completed">10</div> | |
| <div class="cal-day completed">11</div> | |
| <div class="cal-day completed">12</div> | |
| <div class="cal-day completed">13</div> | |
| <div class="cal-day rest-day">14</div> | |
| <div class="cal-day rest-day">15</div> | |
| <div class="cal-day completed">16</div> | |
| <div class="cal-day completed">17</div> | |
| <div class="cal-day completed">18</div> | |
| <div class="cal-day completed">19</div> | |
| <div class="cal-day completed">20</div> | |
| <div class="cal-day rest-day">21</div> | |
| <div class="cal-day rest-day">22</div> | |
| <div class="cal-day completed">23</div> | |
| <div class="cal-day today">24</div> | |
| <div class="cal-day has-workout">25</div> | |
| <div class="cal-day has-workout">26</div> | |
| <div class="cal-day has-workout">27</div> | |
| <div class="cal-day rest-day">28</div> | |
| <div class="cal-day rest-day">29</div> | |
| <div class="cal-day has-workout">30</div> | |
| <div class="cal-day has-workout">31</div> | |
| <div class="cal-day other-month">1</div> | |
| <div class="cal-day other-month">2</div> | |
| <div class="cal-day other-month">3</div> | |
| <div class="cal-day other-month">4</div> | |
| <div class="cal-day other-month">5</div> | |
| </div> | |
| <div class="cal-week-summary"> | |
| <h4>This Week</h4> | |
| <div class="cal-summary-stats"> | |
| <div class="cal-stat"> | |
| <div class="val orange">4/5</div> | |
| <div class="label">Workouts</div> | |
| </div> | |
| <div class="cal-stat"> | |
| <div class="val green">87%</div> | |
| <div class="label">Completion</div> | |
| </div> | |
| <div class="cal-stat"> | |
| <div class="val">3h 12m</div> | |
| <div class="label">Total Time</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="cal-upcoming"> | |
| <h4>Coming Up</h4> | |
| <div class="cal-upcoming-card"> | |
| <div class="cal-upcoming-day"> | |
| <div class="day-name">Wed</div> | |
| <div class="day-num">25</div> | |
| </div> | |
| <div class="cal-upcoming-info"> | |
| <h5>Upper Body Hypertrophy</h5> | |
| <p>7 exercises · ~55 min</p> | |
| </div> | |
| </div> | |
| <div class="cal-upcoming-card"> | |
| <div class="cal-upcoming-day"> | |
| <div class="day-name">Thu</div> | |
| <div class="day-num">26</div> | |
| </div> | |
| <div class="cal-upcoming-info"> | |
| <h5>Olympic Technique</h5> | |
| <p>5 exercises · ~40 min</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== ANALYTICS ==================== --> | |
| <div class="screen analytics" id="screen-analytics"> | |
| <div class="an-header"> | |
| <h2>Progress</h2> | |
| <div class="an-period">This Month ▾</div> | |
| </div> | |
| <div class="streak-banner"> | |
| <div class="streak-fire">🔥</div> | |
| <div class="streak-info"> | |
| <h3><span>12 Day</span> Streak!</h3> | |
| <p>Your longest streak was 18 days</p> | |
| </div> | |
| </div> | |
| <div class="chart-card"> | |
| <h4>Weekly Volume</h4> | |
| <div class="chart-sub">Total sets completed per week</div> | |
| <div class="bar-chart"> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:40%"></div> | |
| <div class="bar-label">W1</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:55%"></div> | |
| <div class="bar-label">W2</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:65%"></div> | |
| <div class="bar-label">W3</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar orange" style="height:82%"></div> | |
| <div class="bar-label">W4</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="weekly-rings"> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#FF6B35" style="stroke-dashoffset: 25.13"/> | |
| </svg> | |
| <div class="ring-text">80%</div> | |
| </div> | |
| <div class="ring-label">Workouts</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#FF9F1C" style="stroke-dashoffset: 37.70"/> | |
| </svg> | |
| <div class="ring-text">70%</div> | |
| </div> | |
| <div class="ring-label">Volume</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#27AE60" style="stroke-dashoffset: 12.57"/> | |
| </svg> | |
| <div class="ring-text">90%</div> | |
| </div> | |
| <div class="ring-label">Form</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#FF6B35" style="stroke-dashoffset: 50.27"/> | |
| </svg> | |
| <div class="ring-text">60%</div> | |
| </div> | |
| <div class="ring-label">Goals</div> | |
| </div> | |
| </div> | |
| <div class="achievements-section"> | |
| <h4>Recent Achievements</h4> | |
| <div class="achievement-card"> | |
| <div class="ach-icon gold">🏆</div> | |
| <div class="ach-info"> | |
| <h5>Iron Consistency</h5> | |
| <p>10 workouts completed in a row</p> | |
| </div> | |
| <div class="ach-date">2 days ago</div> | |
| </div> | |
| <div class="achievement-card"> | |
| <div class="ach-icon gold">⚡</div> | |
| <div class="ach-info"> | |
| <h5>PR Crusher</h5> | |
| <p>New personal record on Back Squat</p> | |
| </div> | |
| <div class="ach-date">5 days ago</div> | |
| </div> | |
| <div class="achievement-card"> | |
| <div class="ach-icon silver">📹</div> | |
| <div class="ach-info"> | |
| <h5>Form Check Pro</h5> | |
| <p>Uploaded 5 form check videos</p> | |
| </div> | |
| <div class="ach-date">1 week ago</div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| function showScreen(name, btn) { | |
| document.querySelectorAll('.screen').forEach(s => s.classList.remove('active')); | |
| document.querySelectorAll('.screen-nav button').forEach(b => b.classList.remove('active')); | |
| document.getElementById('screen-' + name).classList.add('active'); | |
| btn.classList.add('active'); | |
| if (window.__recordEvent) { | |
| window.__recordEvent({ type: 'click', choice: name, text: 'Viewing: ' + name }); | |
| } | |
| } | |
| </script> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Jason Trainer — Soft Vitality Design</title> | |
| <style> | |
| @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap'); | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { | |
| font-family: 'Plus Jakarta Sans', -apple-system, sans-serif; | |
| background: #F8F6FF; | |
| color: #1a1a2e; | |
| min-height: 100vh; | |
| overflow-x: hidden; | |
| } | |
| /* ===== Page Layout ===== */ | |
| .page-header { | |
| text-align: center; | |
| padding: 48px 20px 16px; | |
| } | |
| .page-header h1 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 36px; | |
| font-weight: 700; | |
| letter-spacing: -1px; | |
| background: linear-gradient(135deg, #6C5CE7, #A78BFA); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| } | |
| .page-header p { | |
| color: #8B8BA8; | |
| font-size: 15px; | |
| margin-top: 8px; | |
| } | |
| .screen-nav { | |
| display: flex; | |
| justify-content: center; | |
| gap: 8px; | |
| padding: 24px 20px; | |
| flex-wrap: wrap; | |
| } | |
| .screen-nav button { | |
| background: #EEECF5; | |
| border: 1px solid #E0DCF0; | |
| color: #6B6B8D; | |
| padding: 10px 20px; | |
| border-radius: 100px; | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 14px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| } | |
| .screen-nav button:hover { | |
| border-color: #6C5CE7; | |
| color: #6C5CE7; | |
| } | |
| .screen-nav button.active { | |
| background: linear-gradient(135deg, #6C5CE7, #A78BFA); | |
| border-color: transparent; | |
| color: white; | |
| } | |
| .screens-container { | |
| display: flex; | |
| justify-content: center; | |
| padding: 20px; | |
| } | |
| .phone-showcase { | |
| position: relative; | |
| } | |
| /* Phone Frame */ | |
| .phone-frame { | |
| width: 375px; | |
| height: 812px; | |
| background: #E0DCF0; | |
| border-radius: 48px; | |
| padding: 12px; | |
| box-shadow: | |
| 0 0 0 2px #D0CBE5, | |
| 0 0 0 4px #E0DCF0, | |
| 0 20px 80px rgba(108,92,231,0.12), | |
| 0 40px 120px rgba(0,0,0,0.08); | |
| position: relative; | |
| } | |
| .phone-inner { | |
| width: 100%; | |
| height: 100%; | |
| border-radius: 38px; | |
| overflow: hidden; | |
| position: relative; | |
| background: #F8F6FF; | |
| } | |
| /* Dynamic Island */ | |
| .dynamic-island { | |
| position: absolute; | |
| top: 10px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 126px; | |
| height: 36px; | |
| background: #1a1a2e; | |
| border-radius: 20px; | |
| z-index: 50; | |
| } | |
| /* Screen containers */ | |
| .screen { | |
| display: none; | |
| width: 100%; | |
| height: 100%; | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| -ms-overflow-style: none; | |
| scrollbar-width: none; | |
| } | |
| .screen::-webkit-scrollbar { display: none; } | |
| .screen.active { display: flex; flex-direction: column; } | |
| /* ================================================================ | |
| SCREEN 1: HOME DASHBOARD | |
| ================================================================ */ | |
| .home { | |
| background: #F8F6FF; | |
| padding-bottom: 80px; | |
| } | |
| .home .top-bar { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 56px 24px 0; | |
| } | |
| .home .avatar { | |
| width: 44px; | |
| height: 44px; | |
| border-radius: 50%; | |
| background: linear-gradient(135deg, #6C5CE7, #A78BFA); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: white; | |
| } | |
| .home .top-icons { | |
| display: flex; | |
| gap: 12px; | |
| } | |
| .home .icon-btn { | |
| width: 44px; | |
| height: 44px; | |
| border-radius: 50%; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 18px; | |
| position: relative; | |
| } | |
| .home .icon-btn .badge { | |
| position: absolute; | |
| top: -2px; | |
| right: -2px; | |
| width: 18px; | |
| height: 18px; | |
| background: #6C5CE7; | |
| border-radius: 50%; | |
| font-size: 10px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-weight: 700; | |
| color: white; | |
| border: 2px solid #F8F6FF; | |
| } | |
| .home .greeting { | |
| padding: 20px 24px 0; | |
| } | |
| .home .greeting .sub { | |
| font-size: 14px; | |
| color: #6B6B8D; | |
| font-weight: 500; | |
| } | |
| .home .greeting h1 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 28px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-top: 2px; | |
| letter-spacing: -0.5px; | |
| } | |
| /* Today's Mission Card */ | |
| .mission-card { | |
| margin: 20px 20px 0; | |
| background: linear-gradient(135deg, #6C5CE7 0%, #A78BFA 100%); | |
| border-radius: 24px; | |
| padding: 24px; | |
| border: none; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .mission-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 3px; | |
| background: linear-gradient(90deg, rgba(255,255,255,0.3), rgba(255,255,255,0.1)); | |
| } | |
| .mission-card::after { | |
| content: ''; | |
| position: absolute; | |
| right: -30px; | |
| bottom: -30px; | |
| width: 120px; | |
| height: 120px; | |
| background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%); | |
| border-radius: 50%; | |
| } | |
| .mission-card .mission-top { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: flex-start; | |
| } | |
| .mission-card .mission-label { | |
| font-size: 11px; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| color: rgba(255,255,255,0.8); | |
| font-weight: 700; | |
| } | |
| .mission-card .mission-title { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 22px; | |
| font-weight: 700; | |
| color: #fff; | |
| margin-top: 8px; | |
| letter-spacing: -0.3px; | |
| } | |
| .mission-card .mission-sub { | |
| font-size: 13px; | |
| color: rgba(255,255,255,0.7); | |
| margin-top: 4px; | |
| } | |
| .mission-card .mission-ring { | |
| width: 64px; | |
| height: 64px; | |
| position: relative; | |
| flex-shrink: 0; | |
| } | |
| .mission-card .mission-ring svg { | |
| width: 64px; | |
| height: 64px; | |
| transform: rotate(-90deg); | |
| } | |
| .mission-card .mission-ring .ring-bg { | |
| fill: none; | |
| stroke: rgba(255,255,255,0.2); | |
| stroke-width: 5; | |
| } | |
| .mission-card .mission-ring .ring-fill { | |
| fill: none; | |
| stroke: white; | |
| stroke-width: 5; | |
| stroke-linecap: round; | |
| stroke-dasharray: 163.36; | |
| stroke-dashoffset: 106.18; | |
| } | |
| .mission-card .ring-text { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| font-size: 15px; | |
| font-weight: 800; | |
| color: #fff; | |
| } | |
| .mission-card .progress-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| margin-top: 18px; | |
| } | |
| .mission-card .progress-bar { | |
| flex: 1; | |
| height: 6px; | |
| background: rgba(255,255,255,0.2); | |
| border-radius: 3px; | |
| overflow: hidden; | |
| } | |
| .mission-card .progress-fill { | |
| width: 35%; | |
| height: 100%; | |
| background: white; | |
| border-radius: 3px; | |
| transition: width 0.5s ease; | |
| } | |
| .mission-card .progress-label { | |
| font-size: 12px; | |
| font-weight: 700; | |
| color: rgba(255,255,255,0.9); | |
| white-space: nowrap; | |
| } | |
| /* Stats Row */ | |
| .stats-row { | |
| display: flex; | |
| gap: 12px; | |
| padding: 20px 20px 0; | |
| } | |
| .stat-card { | |
| flex: 1; | |
| background: #F5F3FF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 18px; | |
| padding: 16px 12px; | |
| text-align: center; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .stat-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 40%; | |
| height: 1px; | |
| background: linear-gradient(90deg, transparent, rgba(108,92,231,0.3), transparent); | |
| } | |
| .stat-card .stat-emoji { font-size: 22px; margin-bottom: 6px; } | |
| .stat-card .stat-val { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 22px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .stat-card .stat-label { | |
| font-size: 10px; | |
| color: #8B8BA8; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| margin-top: 4px; | |
| font-weight: 600; | |
| } | |
| /* Workout Section */ | |
| .section-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 24px 24px 12px; | |
| } | |
| .section-header h3 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .section-header .see-all { | |
| font-size: 13px; | |
| color: #6C5CE7; | |
| font-weight: 600; | |
| letter-spacing: 0.3px; | |
| } | |
| .exercise-list { | |
| padding: 0 20px; | |
| } | |
| .exercise-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 18px; | |
| padding: 16px; | |
| margin-bottom: 10px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .exercise-card.completed { | |
| opacity: 0.5; | |
| } | |
| .exercise-card.completed::after { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 3px; | |
| background: #27AE60; | |
| } | |
| .exercise-card.current::after { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 3px; | |
| background: linear-gradient(180deg, #6C5CE7, #A78BFA); | |
| } | |
| .exercise-icon-wrap { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 22px; | |
| flex-shrink: 0; | |
| } | |
| .exercise-icon-wrap.warmup { background: #FFF3E0; } | |
| .exercise-icon-wrap.primary { background: #EDE7F6; } | |
| .exercise-icon-wrap.accessory { background: #E8F5E9; } | |
| .exercise-info { flex: 1; } | |
| .exercise-info h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .exercise-info .exercise-meta { | |
| font-size: 12px; | |
| color: #8B8BA8; | |
| margin-top: 3px; | |
| } | |
| .exercise-info .exercise-meta span { | |
| color: #A78BFA; | |
| font-weight: 600; | |
| } | |
| .exercise-check { | |
| width: 28px; | |
| height: 28px; | |
| border-radius: 50%; | |
| border: 2px solid #D0CBE5; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .exercise-check.done { | |
| background: linear-gradient(135deg, #27AE60, #2ECC71); | |
| border: none; | |
| color: white; | |
| font-size: 13px; | |
| font-weight: 800; | |
| } | |
| /* Bottom Nav */ | |
| .bottom-nav { | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| display: flex; | |
| justify-content: space-around; | |
| padding: 12px 8px 28px; | |
| background: #FFFFFF; | |
| border-top: 1px solid #EEECF5; | |
| z-index: 10; | |
| } | |
| .nav-item { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 4px; | |
| cursor: pointer; | |
| position: relative; | |
| } | |
| .nav-item .nav-icon { | |
| font-size: 22px; | |
| opacity: 0.35; | |
| transition: all 0.2s; | |
| } | |
| .nav-item .nav-label { | |
| font-size: 10px; | |
| color: #A0A0BB; | |
| font-weight: 600; | |
| letter-spacing: 0.3px; | |
| transition: all 0.2s; | |
| } | |
| .nav-item.active .nav-icon { | |
| opacity: 1; | |
| } | |
| .nav-item.active .nav-label { | |
| color: #6C5CE7; | |
| } | |
| .nav-item.active::before { | |
| content: ''; | |
| position: absolute; | |
| top: -12px; | |
| width: 20px; | |
| height: 3px; | |
| background: #6C5CE7; | |
| border-radius: 2px; | |
| } | |
| /* ================================================================ | |
| SCREEN 2: ONBOARDING / DAILY BRIEFING | |
| ================================================================ */ | |
| .onboarding { | |
| background: #F8F6FF; | |
| padding-bottom: 80px; | |
| } | |
| .onboarding .ob-header { | |
| padding: 56px 24px 0; | |
| text-align: center; | |
| } | |
| .onboarding .ob-step { | |
| font-size: 11px; | |
| color: #6C5CE7; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| font-weight: 700; | |
| } | |
| .onboarding .ob-title { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 26px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-top: 12px; | |
| letter-spacing: -0.5px; | |
| line-height: 1.2; | |
| } | |
| .onboarding .ob-sub { | |
| font-size: 14px; | |
| color: #8B8BA8; | |
| margin-top: 8px; | |
| line-height: 1.5; | |
| } | |
| .onboarding .ob-visual { | |
| margin: 28px 24px 0; | |
| background: #FFFFFF; | |
| border-radius: 24px; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| padding: 28px 20px; | |
| text-align: center; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .onboarding .ob-visual::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: linear-gradient(90deg, #6C5CE7, #A78BFA); | |
| } | |
| .onboarding .ob-big-icon { | |
| font-size: 56px; | |
| margin-bottom: 12px; | |
| } | |
| .onboarding .ob-focus-label { | |
| font-size: 11px; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| color: #8B8BA8; | |
| font-weight: 600; | |
| } | |
| .onboarding .ob-focus-title { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 20px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-top: 6px; | |
| } | |
| .onboarding .ob-details { | |
| padding: 20px 24px 0; | |
| } | |
| .ob-detail-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| padding: 14px 0; | |
| border-bottom: 1px solid #EEECF5; | |
| } | |
| .ob-detail-row:last-child { border-bottom: none; } | |
| .ob-detail-icon { | |
| width: 42px; | |
| height: 42px; | |
| border-radius: 12px; | |
| background: rgba(108,92,231,0.08); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 20px; | |
| flex-shrink: 0; | |
| } | |
| .ob-detail-text h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .ob-detail-text p { | |
| font-size: 12px; | |
| color: #8B8BA8; | |
| margin-top: 2px; | |
| } | |
| .onboarding .ob-cta { | |
| margin: 28px 24px 0; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 12px; | |
| } | |
| .btn-primary { | |
| background: linear-gradient(135deg, #6C5CE7, #A78BFA); | |
| border: none; | |
| color: white; | |
| padding: 16px; | |
| border-radius: 16px; | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 16px; | |
| font-weight: 700; | |
| cursor: pointer; | |
| letter-spacing: 0.3px; | |
| text-align: center; | |
| } | |
| .btn-secondary { | |
| background: transparent; | |
| border: 1px solid #D0CBE5; | |
| color: #6B6B8D; | |
| padding: 16px; | |
| border-radius: 16px; | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 14px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| text-align: center; | |
| } | |
| .onboarding .ob-progress-dots { | |
| display: flex; | |
| justify-content: center; | |
| gap: 8px; | |
| margin-top: 28px; | |
| } | |
| .ob-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: #D0CBE5; | |
| } | |
| .ob-dot.active { | |
| width: 24px; | |
| border-radius: 4px; | |
| background: linear-gradient(90deg, #6C5CE7, #A78BFA); | |
| } | |
| /* ================================================================ | |
| SCREEN 3: CALENDAR | |
| ================================================================ */ | |
| .calendar-screen { | |
| background: #F8F6FF; | |
| padding-bottom: 80px; | |
| } | |
| .cal-header { | |
| padding: 56px 24px 0; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .cal-header h2 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .cal-month-nav { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .cal-month-btn { | |
| width: 36px; | |
| height: 36px; | |
| border-radius: 50%; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| color: #6B6B8D; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 16px; | |
| cursor: pointer; | |
| } | |
| .cal-month-label { | |
| padding: 20px 24px 0; | |
| font-size: 16px; | |
| font-weight: 700; | |
| color: #6C5CE7; | |
| } | |
| .cal-week-labels { | |
| display: grid; | |
| grid-template-columns: repeat(7, 1fr); | |
| padding: 16px 16px 8px; | |
| text-align: center; | |
| } | |
| .cal-week-labels span { | |
| font-size: 11px; | |
| color: #A0A0BB; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| } | |
| .cal-grid { | |
| display: grid; | |
| grid-template-columns: repeat(7, 1fr); | |
| padding: 0 12px; | |
| gap: 4px; | |
| } | |
| .cal-day { | |
| aspect-ratio: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: 14px; | |
| font-size: 15px; | |
| font-weight: 600; | |
| color: #8B8BA8; | |
| position: relative; | |
| cursor: pointer; | |
| gap: 3px; | |
| } | |
| .cal-day.other-month { color: #D0CBE5; } | |
| .cal-day.has-workout { color: #1a1a2e; } | |
| .cal-day.has-workout::after { | |
| content: ''; | |
| width: 5px; | |
| height: 5px; | |
| border-radius: 50%; | |
| background: #6C5CE7; | |
| } | |
| .cal-day.completed { color: #27AE60; } | |
| .cal-day.completed::after { | |
| content: ''; | |
| width: 5px; | |
| height: 5px; | |
| border-radius: 50%; | |
| background: #27AE60; | |
| } | |
| .cal-day.today { | |
| background: linear-gradient(135deg, #6C5CE7, #A78BFA); | |
| color: #fff; | |
| font-weight: 800; | |
| } | |
| .cal-day.today::after { display: none; } | |
| .cal-day.rest-day { color: #D0CBE5; } | |
| /* Weekly Summary */ | |
| .cal-week-summary { | |
| margin: 20px 20px 0; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 20px; | |
| padding: 20px; | |
| } | |
| .cal-week-summary h4 { | |
| font-size: 13px; | |
| color: #6B6B8D; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| font-weight: 600; | |
| margin-bottom: 14px; | |
| } | |
| .cal-summary-stats { | |
| display: flex; | |
| justify-content: space-around; | |
| } | |
| .cal-stat { | |
| text-align: center; | |
| } | |
| .cal-stat .val { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .cal-stat .val.orange { color: #6C5CE7; } | |
| .cal-stat .val.green { color: #27AE60; } | |
| .cal-stat .label { | |
| font-size: 11px; | |
| color: #8B8BA8; | |
| margin-top: 4px; | |
| font-weight: 500; | |
| } | |
| /* Upcoming */ | |
| .cal-upcoming { | |
| margin: 16px 20px 0; | |
| } | |
| .cal-upcoming h4 { | |
| font-size: 15px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-bottom: 12px; | |
| } | |
| .cal-upcoming-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 16px; | |
| padding: 14px 16px; | |
| margin-bottom: 8px; | |
| } | |
| .cal-upcoming-day { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| background: #EDE7F6; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .cal-upcoming-day .day-name { | |
| font-size: 10px; | |
| color: #6C5CE7; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| } | |
| .cal-upcoming-day .day-num { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .cal-upcoming-info h5 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .cal-upcoming-info p { | |
| font-size: 12px; | |
| color: #8B8BA8; | |
| margin-top: 2px; | |
| } | |
| /* ================================================================ | |
| SCREEN 4: ANALYTICS / PROGRESS | |
| ================================================================ */ | |
| .analytics { | |
| background: #F8F6FF; | |
| padding-bottom: 80px; | |
| } | |
| .analytics .an-header { | |
| padding: 56px 24px 0; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .analytics .an-header h2 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 24px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .an-period { | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 100px; | |
| padding: 8px 16px; | |
| font-size: 13px; | |
| color: #6C5CE7; | |
| font-weight: 600; | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| cursor: pointer; | |
| } | |
| /* Streak Banner */ | |
| .streak-banner { | |
| margin: 20px 20px 0; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 20px; | |
| padding: 20px; | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .streak-banner::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: linear-gradient(90deg, #6C5CE7, #A78BFA, #6C5CE7); | |
| } | |
| .streak-fire { | |
| font-size: 40px; | |
| } | |
| .streak-info h3 { | |
| font-family: 'Plus Jakarta Sans', sans-serif; | |
| font-size: 28px; | |
| font-weight: 800; | |
| color: #1a1a2e; | |
| } | |
| .streak-info h3 span { color: #6C5CE7; } | |
| .streak-info p { | |
| font-size: 13px; | |
| color: #8B8BA8; | |
| margin-top: 2px; | |
| } | |
| /* Chart Card */ | |
| .chart-card { | |
| margin: 16px 20px 0; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 20px; | |
| padding: 20px; | |
| } | |
| .chart-card h4 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-bottom: 4px; | |
| } | |
| .chart-card .chart-sub { | |
| font-size: 12px; | |
| color: #8B8BA8; | |
| margin-bottom: 16px; | |
| } | |
| /* Bar chart */ | |
| .bar-chart { | |
| display: flex; | |
| align-items: flex-end; | |
| gap: 8px; | |
| height: 120px; | |
| padding: 0 4px; | |
| } | |
| .bar-col { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 6px; | |
| height: 100%; | |
| justify-content: flex-end; | |
| } | |
| .bar { | |
| width: 100%; | |
| border-radius: 6px 6px 2px 2px; | |
| min-height: 4px; | |
| transition: height 0.5s ease; | |
| } | |
| .bar.orange { background: linear-gradient(180deg, #6C5CE7, #A78BFA); } | |
| .bar.dim { background: #E8E5F5; } | |
| .bar.green { background: linear-gradient(180deg, #27AE60, #2ECC71); } | |
| .bar-label { | |
| font-size: 10px; | |
| color: #A0A0BB; | |
| font-weight: 600; | |
| } | |
| /* Weekly rings */ | |
| .weekly-rings { | |
| display: flex; | |
| justify-content: space-around; | |
| margin: 16px 20px 0; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 20px; | |
| padding: 20px 12px; | |
| } | |
| .ring-item { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .mini-ring { | |
| width: 48px; | |
| height: 48px; | |
| position: relative; | |
| } | |
| .mini-ring svg { | |
| width: 48px; | |
| height: 48px; | |
| transform: rotate(-90deg); | |
| } | |
| .mini-ring .ring-bg { | |
| fill: none; | |
| stroke: #E8E5F5; | |
| stroke-width: 4; | |
| } | |
| .mini-ring .ring-fill { | |
| fill: none; | |
| stroke-width: 4; | |
| stroke-linecap: round; | |
| stroke-dasharray: 125.66; | |
| } | |
| .mini-ring .ring-text { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| font-size: 11px; | |
| font-weight: 800; | |
| color: #1a1a2e; | |
| } | |
| .ring-label { | |
| font-size: 10px; | |
| color: #8B8BA8; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| } | |
| /* Achievement cards */ | |
| .achievements-section { | |
| padding: 0 20px; | |
| margin-top: 16px; | |
| } | |
| .achievements-section h4 { | |
| font-size: 15px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| margin-bottom: 12px; | |
| } | |
| .achievement-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| background: #FFFFFF; | |
| box-shadow: 0 2px 12px rgba(108,92,231,0.08); | |
| border-radius: 16px; | |
| padding: 14px 16px; | |
| margin-bottom: 8px; | |
| } | |
| .achievement-card .ach-icon { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 14px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 24px; | |
| flex-shrink: 0; | |
| } | |
| .achievement-card .ach-icon.gold { | |
| background: linear-gradient(135deg, rgba(108,92,231,0.15), rgba(167,139,250,0.1)); | |
| } | |
| .achievement-card .ach-icon.silver { | |
| background: rgba(108,92,231,0.05); | |
| } | |
| .achievement-card .ach-info h5 { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: #1a1a2e; | |
| } | |
| .achievement-card .ach-info p { | |
| font-size: 12px; | |
| color: #8B8BA8; | |
| margin-top: 2px; | |
| } | |
| .achievement-card .ach-date { | |
| margin-left: auto; | |
| font-size: 11px; | |
| color: #A0A0BB; | |
| flex-shrink: 0; | |
| } | |
| /* ===== Utility ===== */ | |
| .glow-line { | |
| height: 1px; | |
| background: linear-gradient(90deg, transparent, rgba(108,92,231,0.2), transparent); | |
| margin: 0 24px; | |
| } | |
| /* ===== Mobile Responsive ===== */ | |
| @media (max-width: 500px) { | |
| .phone-frame { | |
| width: 100%; | |
| height: 100vh; | |
| border-radius: 0; | |
| padding: 0; | |
| box-shadow: none; | |
| } | |
| .phone-inner { | |
| border-radius: 0; | |
| } | |
| .dynamic-island { | |
| display: none; | |
| } | |
| .phone-showcase { | |
| width: 100%; | |
| } | |
| .page-header { | |
| padding: 16px 20px 8px; | |
| } | |
| .page-header h1 { | |
| font-size: 24px; | |
| } | |
| .screen-nav { | |
| padding: 8px 12px; | |
| gap: 4px; | |
| } | |
| .screen-nav button { | |
| padding: 8px 14px; | |
| font-size: 12px; | |
| } | |
| .screens-container { | |
| padding: 0; | |
| } | |
| body { | |
| padding: 0; | |
| } | |
| } | |
| </style> | |
| <!-- SVG Gradient Definition --> | |
| <svg width="0" height="0"> | |
| <defs> | |
| <linearGradient id="purpleGrad" x1="0%" y1="0%" x2="100%" y2="0%"> | |
| <stop offset="0%" style="stop-color:#6C5CE7"/> | |
| <stop offset="100%" style="stop-color:#A78BFA"/> | |
| </linearGradient> | |
| <linearGradient id="greenGrad" x1="0%" y1="0%" x2="100%" y2="0%"> | |
| <stop offset="0%" style="stop-color:#27AE60"/> | |
| <stop offset="100%" style="stop-color:#2ECC71"/> | |
| </linearGradient> | |
| </defs> | |
| </svg> | |
| </head> | |
| <body> | |
| <div class="page-header"> | |
| <h1>Soft Vitality</h1> | |
| <p>4 screens — tap to navigate between them</p> | |
| </div> | |
| <div class="screen-nav"> | |
| <button class="active" onclick="showScreen('home', this)">Home</button> | |
| <button onclick="showScreen('onboarding', this)">Daily Briefing</button> | |
| <button onclick="showScreen('calendar', this)">Calendar</button> | |
| <button onclick="showScreen('analytics', this)">Analytics</button> | |
| </div> | |
| <div class="screens-container"> | |
| <div class="phone-showcase"> | |
| <div class="phone-frame"> | |
| <div class="phone-inner"> | |
| <div class="dynamic-island"></div> | |
| <!-- ==================== HOME SCREEN ==================== --> | |
| <div class="screen home active" id="screen-home"> | |
| <div class="top-bar"> | |
| <div class="avatar">S</div> | |
| <div class="top-icons"> | |
| <div class="icon-btn">🔔<div class="badge">2</div></div> | |
| <div class="icon-btn">⚙️</div> | |
| </div> | |
| </div> | |
| <div class="greeting"> | |
| <div class="sub">Good evening</div> | |
| <h1>Sarah's Training</h1> | |
| </div> | |
| <div class="mission-card"> | |
| <div class="mission-top"> | |
| <div> | |
| <div class="mission-label">Today's Mission</div> | |
| <div class="mission-title">Lower Body Power</div> | |
| <div class="mission-sub">Olympic Strength · Week 4, Day 2</div> | |
| </div> | |
| <div class="mission-ring"> | |
| <svg viewBox="0 0 56 56"> | |
| <circle class="ring-bg" cx="28" cy="28" r="26"/> | |
| <circle class="ring-fill" cx="28" cy="28" r="26"/> | |
| </svg> | |
| <div class="ring-text">35%</div> | |
| </div> | |
| </div> | |
| <div class="progress-row"> | |
| <div class="progress-bar"><div class="progress-fill"></div></div> | |
| <div class="progress-label">2 of 6</div> | |
| </div> | |
| </div> | |
| <div class="stats-row"> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">🔥</div> | |
| <div class="stat-val">12</div> | |
| <div class="stat-label">Streak</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">⏱</div> | |
| <div class="stat-val">48m</div> | |
| <div class="stat-label">Est. Time</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-emoji">📈</div> | |
| <div class="stat-val">+8%</div> | |
| <div class="stat-label">Volume</div> | |
| </div> | |
| </div> | |
| <div class="section-header"> | |
| <h3>Exercises</h3> | |
| <span class="see-all">See all →</span> | |
| </div> | |
| <div class="exercise-list"> | |
| <div class="exercise-card completed"> | |
| <div class="exercise-icon-wrap warmup">🏃</div> | |
| <div class="exercise-info"> | |
| <h4>Dynamic Warm-up</h4> | |
| <div class="exercise-meta">10 min · Mobility</div> | |
| </div> | |
| <div class="exercise-check done">✓</div> | |
| </div> | |
| <div class="exercise-card completed"> | |
| <div class="exercise-icon-wrap primary">🏋️</div> | |
| <div class="exercise-info"> | |
| <h4>Barbell Back Squat</h4> | |
| <div class="exercise-meta">5×5 · <span>185 lbs</span></div> | |
| </div> | |
| <div class="exercise-check done">✓</div> | |
| </div> | |
| <div class="exercise-card current"> | |
| <div class="exercise-icon-wrap primary">🦵</div> | |
| <div class="exercise-info"> | |
| <h4>Romanian Deadlift</h4> | |
| <div class="exercise-meta">4×8 · <span>135 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap accessory">💪</div> | |
| <div class="exercise-info"> | |
| <h4>Bulgarian Split Squat</h4> | |
| <div class="exercise-meta">3×10 · <span>50 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap accessory">🦶</div> | |
| <div class="exercise-info"> | |
| <h4>Calf Raises</h4> | |
| <div class="exercise-meta">4×15 · <span>90 lbs</span></div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| <div class="exercise-card"> | |
| <div class="exercise-icon-wrap warmup">🧘</div> | |
| <div class="exercise-info"> | |
| <h4>Cool Down Stretch</h4> | |
| <div class="exercise-meta">5 min · Recovery</div> | |
| </div> | |
| <div class="exercise-check"></div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== DAILY BRIEFING / ONBOARDING ==================== --> | |
| <div class="screen onboarding" id="screen-onboarding"> | |
| <div class="ob-header"> | |
| <div class="ob-step">Day 23 of 84</div> | |
| <div class="ob-title">Today's Focus:<br>Explosive Power</div> | |
| <div class="ob-sub">Your coach designed today's session to build lower body strength and power output.</div> | |
| </div> | |
| <div class="ob-visual"> | |
| <div class="ob-big-icon">⚡</div> | |
| <div class="ob-focus-label">Primary Focus</div> | |
| <div class="ob-focus-title">Lower Body Power</div> | |
| </div> | |
| <div class="ob-details"> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">🎯</div> | |
| <div class="ob-detail-text"> | |
| <h4>6 Exercises</h4> | |
| <p>3 blocks: warm-up, primary, accessory</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">⏱</div> | |
| <div class="ob-detail-text"> | |
| <h4>~48 Minutes</h4> | |
| <p>Including rest periods</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">💪</div> | |
| <div class="ob-detail-text"> | |
| <h4>Main Lift: Back Squat</h4> | |
| <p>5×5 at 185 lbs — aim for depth</p> | |
| </div> | |
| </div> | |
| <div class="ob-detail-row"> | |
| <div class="ob-detail-icon">📝</div> | |
| <div class="ob-detail-text"> | |
| <h4>Coach's Note</h4> | |
| <p>Focus on bracing. Watch the video before your first set.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="ob-cta"> | |
| <div class="btn-primary">Start Workout →</div> | |
| <div class="btn-secondary">Review Exercises First</div> | |
| </div> | |
| <div class="ob-progress-dots"> | |
| <div class="ob-dot"></div> | |
| <div class="ob-dot"></div> | |
| <div class="ob-dot active"></div> | |
| <div class="ob-dot"></div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== CALENDAR ==================== --> | |
| <div class="screen calendar-screen" id="screen-calendar"> | |
| <div class="cal-header"> | |
| <h2>Calendar</h2> | |
| <div class="cal-month-nav"> | |
| <div class="cal-month-btn">‹</div> | |
| <div class="cal-month-btn">›</div> | |
| </div> | |
| </div> | |
| <div class="cal-month-label">March 2026</div> | |
| <div class="cal-week-labels"> | |
| <span>Mon</span><span>Tue</span><span>Wed</span><span>Thu</span><span>Fri</span><span>Sat</span><span>Sun</span> | |
| </div> | |
| <div class="cal-grid"> | |
| <div class="cal-day other-month">23</div> | |
| <div class="cal-day other-month">24</div> | |
| <div class="cal-day other-month">25</div> | |
| <div class="cal-day other-month">26</div> | |
| <div class="cal-day other-month">27</div> | |
| <div class="cal-day other-month">28</div> | |
| <div class="cal-day rest-day">1</div> | |
| <div class="cal-day completed">2</div> | |
| <div class="cal-day completed">3</div> | |
| <div class="cal-day completed">4</div> | |
| <div class="cal-day completed">5</div> | |
| <div class="cal-day completed">6</div> | |
| <div class="cal-day rest-day">7</div> | |
| <div class="cal-day rest-day">8</div> | |
| <div class="cal-day completed">9</div> | |
| <div class="cal-day completed">10</div> | |
| <div class="cal-day completed">11</div> | |
| <div class="cal-day completed">12</div> | |
| <div class="cal-day completed">13</div> | |
| <div class="cal-day rest-day">14</div> | |
| <div class="cal-day rest-day">15</div> | |
| <div class="cal-day completed">16</div> | |
| <div class="cal-day completed">17</div> | |
| <div class="cal-day completed">18</div> | |
| <div class="cal-day completed">19</div> | |
| <div class="cal-day completed">20</div> | |
| <div class="cal-day rest-day">21</div> | |
| <div class="cal-day rest-day">22</div> | |
| <div class="cal-day completed">23</div> | |
| <div class="cal-day today">24</div> | |
| <div class="cal-day has-workout">25</div> | |
| <div class="cal-day has-workout">26</div> | |
| <div class="cal-day has-workout">27</div> | |
| <div class="cal-day rest-day">28</div> | |
| <div class="cal-day rest-day">29</div> | |
| <div class="cal-day has-workout">30</div> | |
| <div class="cal-day has-workout">31</div> | |
| <div class="cal-day other-month">1</div> | |
| <div class="cal-day other-month">2</div> | |
| <div class="cal-day other-month">3</div> | |
| <div class="cal-day other-month">4</div> | |
| <div class="cal-day other-month">5</div> | |
| </div> | |
| <div class="cal-week-summary"> | |
| <h4>This Week</h4> | |
| <div class="cal-summary-stats"> | |
| <div class="cal-stat"> | |
| <div class="val orange">4/5</div> | |
| <div class="label">Workouts</div> | |
| </div> | |
| <div class="cal-stat"> | |
| <div class="val green">87%</div> | |
| <div class="label">Completion</div> | |
| </div> | |
| <div class="cal-stat"> | |
| <div class="val">3h 12m</div> | |
| <div class="label">Total Time</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="cal-upcoming"> | |
| <h4>Coming Up</h4> | |
| <div class="cal-upcoming-card"> | |
| <div class="cal-upcoming-day"> | |
| <div class="day-name">Wed</div> | |
| <div class="day-num">25</div> | |
| </div> | |
| <div class="cal-upcoming-info"> | |
| <h5>Upper Body Hypertrophy</h5> | |
| <p>7 exercises · ~55 min</p> | |
| </div> | |
| </div> | |
| <div class="cal-upcoming-card"> | |
| <div class="cal-upcoming-day"> | |
| <div class="day-name">Thu</div> | |
| <div class="day-num">26</div> | |
| </div> | |
| <div class="cal-upcoming-info"> | |
| <h5>Olympic Technique</h5> | |
| <p>5 exercises · ~40 min</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ==================== ANALYTICS ==================== --> | |
| <div class="screen analytics" id="screen-analytics"> | |
| <div class="an-header"> | |
| <h2>Progress</h2> | |
| <div class="an-period">This Month ▾</div> | |
| </div> | |
| <div class="streak-banner"> | |
| <div class="streak-fire">🔥</div> | |
| <div class="streak-info"> | |
| <h3><span>12 Day</span> Streak!</h3> | |
| <p>Your longest streak was 18 days</p> | |
| </div> | |
| </div> | |
| <div class="chart-card"> | |
| <h4>Weekly Volume</h4> | |
| <div class="chart-sub">Total sets completed per week</div> | |
| <div class="bar-chart"> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:40%"></div> | |
| <div class="bar-label">W1</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:55%"></div> | |
| <div class="bar-label">W2</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar dim" style="height:65%"></div> | |
| <div class="bar-label">W3</div> | |
| </div> | |
| <div class="bar-col"> | |
| <div class="bar orange" style="height:82%"></div> | |
| <div class="bar-label">W4</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="weekly-rings"> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#6C5CE7" style="stroke-dashoffset: 25.13"/> | |
| </svg> | |
| <div class="ring-text">80%</div> | |
| </div> | |
| <div class="ring-label">Workouts</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#A78BFA" style="stroke-dashoffset: 37.70"/> | |
| </svg> | |
| <div class="ring-text">70%</div> | |
| </div> | |
| <div class="ring-label">Volume</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#27AE60" style="stroke-dashoffset: 12.57"/> | |
| </svg> | |
| <div class="ring-text">90%</div> | |
| </div> | |
| <div class="ring-label">Form</div> | |
| </div> | |
| <div class="ring-item"> | |
| <div class="mini-ring"> | |
| <svg viewBox="0 0 44 44"> | |
| <circle class="ring-bg" cx="22" cy="22" r="20"/> | |
| <circle class="ring-fill" cx="22" cy="22" r="20" stroke="#6C5CE7" style="stroke-dashoffset: 50.27"/> | |
| </svg> | |
| <div class="ring-text">60%</div> | |
| </div> | |
| <div class="ring-label">Goals</div> | |
| </div> | |
| </div> | |
| <div class="achievements-section"> | |
| <h4>Recent Achievements</h4> | |
| <div class="achievement-card"> | |
| <div class="ach-icon gold">🏆</div> | |
| <div class="ach-info"> | |
| <h5>Iron Consistency</h5> | |
| <p>10 workouts completed in a row</p> | |
| </div> | |
| <div class="ach-date">2 days ago</div> | |
| </div> | |
| <div class="achievement-card"> | |
| <div class="ach-icon gold">⚡</div> | |
| <div class="ach-info"> | |
| <h5>PR Crusher</h5> | |
| <p>New personal record on Back Squat</p> | |
| </div> | |
| <div class="ach-date">5 days ago</div> | |
| </div> | |
| <div class="achievement-card"> | |
| <div class="ach-icon silver">📹</div> | |
| <div class="ach-info"> | |
| <h5>Form Check Pro</h5> | |
| <p>Uploaded 5 form check videos</p> | |
| </div> | |
| <div class="ach-date">1 week ago</div> | |
| </div> | |
| </div> | |
| <div class="bottom-nav"> | |
| <div class="nav-item"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">Home</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">📅</div> | |
| <div class="nav-label">Calendar</div> | |
| </div> | |
| <div class="nav-item active"> | |
| <div class="nav-icon">📊</div> | |
| <div class="nav-label">Progress</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">Chat</div> | |
| </div> | |
| <div class="nav-item"> | |
| <div class="nav-icon">👤</div> | |
| <div class="nav-label">Profile</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| function showScreen(name, btn) { | |
| document.querySelectorAll('.screen').forEach(s => s.classList.remove('active')); | |
| document.querySelectorAll('.screen-nav button').forEach(b => b.classList.remove('active')); | |
| document.getElementById('screen-' + name).classList.add('active'); | |
| btn.classList.add('active'); | |
| if (window.__recordEvent) { | |
| window.__recordEvent({ type: 'click', choice: name, text: 'Viewing: ' + name }); | |
| } | |
| } | |
| </script> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Program Builder Improvements — Design Proposals</title> | |
| <style> | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #f7f8fa; color: #1a1a1a; } | |
| .header { background: #1A365D; color: white; padding: 32px 40px; text-align: center; } | |
| .header h1 { font-size: 28px; font-weight: 700; margin-bottom: 8px; } | |
| .header p { font-size: 15px; opacity: 0.8; max-width: 640px; margin: 0 auto; line-height: 1.5; } | |
| .section { max-width: 1000px; margin: 40px auto; padding: 0 24px; } | |
| .section h2 { font-size: 22px; font-weight: 700; color: #1A365D; margin-bottom: 6px; } | |
| .section .subtitle { font-size: 14px; color: #666; margin-bottom: 24px; line-height: 1.5; } | |
| .change-tag { display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 600; margin-bottom: 12px; } | |
| .change-tag.simple { background: #E8F5E9; color: #2E7D32; } | |
| .change-tag.needs-input { background: #FFF3E0; color: #E65100; } | |
| .screen { background: white; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 12px rgba(0,0,0,0.06); border: 1px solid #e8ecf0; margin-bottom: 32px; } | |
| .screen-header { background: #f0f2f5; padding: 10px 16px; font-size: 12px; font-weight: 600; color: #666; border-bottom: 1px solid #e8ecf0; display: flex; align-items: center; gap: 8px; } | |
| .screen-header .dot { width: 8px; height: 8px; border-radius: 50%; } | |
| .screen-header .dot.r { background: #ff5f57; } | |
| .screen-header .dot.y { background: #febd2f; } | |
| .screen-header .dot.g { background: #28c840; } | |
| .screen-body { padding: 0; } | |
| .divider { border: none; border-top: 2px dashed #e2e8f0; margin: 48px auto; max-width: 1000px; } | |
| .before-after { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; } | |
| @media (max-width: 768px) { .before-after { grid-template-columns: 1fr; } } | |
| .before-after .label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; } | |
| .before-after .label.before { color: #999; } | |
| .before-after .label.after { color: #2E7D32; } | |
| .option-card { background: white; border: 2px solid #e2e8f0; border-radius: 16px; overflow: hidden; margin-bottom: 24px; } | |
| .option-card.recommended { border-color: #1A365D; } | |
| .option-header { padding: 16px 20px; border-bottom: 1px solid #e8ecf0; display: flex; justify-content: space-between; align-items: center; } | |
| .option-header h3 { font-size: 17px; font-weight: 700; color: #1A365D; } | |
| .option-badge { padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: 600; } | |
| .option-badge.rec { background: #1A365D; color: white; } | |
| .option-body { padding: 20px; } | |
| .option-desc { font-size: 14px; color: #555; line-height: 1.5; margin-bottom: 16px; } | |
| .pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 12px; } | |
| .pros h4, .cons h4 { font-size: 12px; font-weight: 700; text-transform: uppercase; margin-bottom: 6px; } | |
| .pros h4 { color: #2E7D32; } | |
| .cons h4 { color: #C62828; } | |
| .pros li, .cons li { font-size: 13px; color: #555; line-height: 1.5; margin-bottom: 4px; } | |
| /* Table styles for mockups */ | |
| .ex-table { width: 100%; border-collapse: collapse; font-size: 13px; } | |
| .ex-table th { text-align: left; padding: 6px 10px; color: #888; font-size: 11px; font-weight: 600; border-bottom: 1px solid #e2e8f0; text-transform: uppercase; letter-spacing: 0.3px; } | |
| .ex-table td { padding: 8px 10px; border-bottom: 1px solid #f0f2f5; } | |
| .ex-table .exercise-name { font-weight: 600; color: #1A365D; } | |
| .ex-table .dim { color: #aaa; } | |
| .ex-table .actions { display: flex; gap: 4px; } | |
| .ex-table .btn-sm { padding: 3px 8px; border-radius: 4px; font-size: 11px; border: none; cursor: pointer; } | |
| .ex-table .btn-edit { background: #f0f2f5; color: #555; } | |
| .ex-table .btn-del { background: #FEE2E2; color: #C62828; } | |
| .block-header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: #f8f9fa; border-bottom: 1px solid #e8ecf0; } | |
| .block-name { font-size: 15px; font-weight: 700; color: #1A365D; } | |
| .block-actions { display: flex; gap: 6px; } | |
| .block-btn { padding: 5px 12px; border-radius: 6px; font-size: 11px; font-weight: 600; border: none; cursor: pointer; } | |
| .block-btn.remove { background: #C62828; color: white; } | |
| .block-btn.add { background: none; color: #1A365D; border: 1px dashed #1A365D; font-size: 12px; } | |
| .series-badge { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 22px; border-radius: 4px; font-size: 11px; font-weight: 700; margin-right: 6px; } | |
| .series-a { background: #E3F2FD; color: #1565C0; } | |
| .series-b { background: #F3E5F5; color: #7B1FA2; } | |
| .series-c { background: #FFF3E0; color: #E65100; } | |
| .series-none { background: #f0f2f5; color: #999; } | |
| .superset-group { border-left: 3px solid; padding-left: 0; margin: 0; } | |
| .superset-group.group-a { border-color: #1565C0; } | |
| .superset-group.group-b { border-color: #7B1FA2; } | |
| .group-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; padding: 4px 10px 2px; } | |
| .group-label.a { color: #1565C0; } | |
| .group-label.b { color: #7B1FA2; } | |
| .footer-note { text-align: center; padding: 40px 24px 48px; color: #888; font-size: 13px; } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="header"> | |
| <h1>Program Builder Improvements</h1> | |
| <p>Three proposed changes: reorder columns, add superset/triset grouping, and default to 4-week phases.</p> | |
| </div> | |
| <!-- ============================================ --> | |
| <!-- CHANGE 1: COLUMN REORDER --> | |
| <!-- ============================================ --> | |
| <div class="section"> | |
| <span class="change-tag simple">Straightforward Change</span> | |
| <h2>Change 1: Move Tempo to End</h2> | |
| <p class="subtitle">Tempo is the least-used column for most exercises. Moving it after Rest keeps the most important data (Sets, Reps, Rest) together and left-aligned where the eye lands first.</p> | |
| <div class="before-after"> | |
| <!-- Before --> | |
| <div> | |
| <div class="label before">Before</div> | |
| <div class="screen"> | |
| <div class="screen-header"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>Current column order</div> | |
| <div class="screen-body" style="padding:0;"> | |
| <div class="block-header"> | |
| <span class="block-name">Primary</span> | |
| </div> | |
| <table class="ex-table"> | |
| <thead><tr> | |
| <th>Exercise</th><th>Sets</th><th>Reps</th><th style="background:#FFF3E0;">Tempo</th><th>Rest (s)</th><th>Actions</th> | |
| </tr></thead> | |
| <tbody> | |
| <tr><td class="exercise-name">Bench Press</td><td>4</td><td>8</td><td style="background:#FFF8F0;">3-1-1-0</td><td>120</td><td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td></tr> | |
| <tr><td class="exercise-name">Overhead Press</td><td>3</td><td>10</td><td style="background:#FFF8F0;" class="dim">-</td><td>90</td><td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- After --> | |
| <div> | |
| <div class="label after">After</div> | |
| <div class="screen"> | |
| <div class="screen-header"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>New column order</div> | |
| <div class="screen-body" style="padding:0;"> | |
| <div class="block-header"> | |
| <span class="block-name">Primary</span> | |
| </div> | |
| <table class="ex-table"> | |
| <thead><tr> | |
| <th>Exercise</th><th>Sets</th><th>Reps</th><th>Rest (s)</th><th style="background:#E8F5E9;">Tempo</th><th>Actions</th> | |
| </tr></thead> | |
| <tbody> | |
| <tr><td class="exercise-name">Bench Press</td><td>4</td><td>8</td><td>120</td><td style="background:#F1F8E9;">3-1-1-0</td><td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td></tr> | |
| <tr><td class="exercise-name">Overhead Press</td><td>3</td><td>10</td><td>90</td><td style="background:#F1F8E9;" class="dim">-</td><td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr class="divider"> | |
| <!-- ============================================ --> | |
| <!-- CHANGE 2: DEFAULT 4-WEEK PHASE --> | |
| <!-- ============================================ --> | |
| <div class="section"> | |
| <span class="change-tag simple">Straightforward Change</span> | |
| <h2>Change 2: Default Phase = 4 Weeks</h2> | |
| <p class="subtitle">Currently defaults to 1 week. A 4-week block is the standard training phase — this saves a step for every new program.</p> | |
| <div class="before-after"> | |
| <div> | |
| <div class="label before">Before</div> | |
| <div style="background:white;border:1px solid #e8ecf0;border-radius:12px;padding:20px;font-family:system-ui;"> | |
| <label style="font-size:12px;font-weight:600;color:#555;display:block;margin-bottom:4px;">Duration (weeks)</label> | |
| <input style="padding:8px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:14px;width:80px;text-align:center;" value="1" /> | |
| <span style="font-size:12px;color:#aaa;margin-left:8px;">← Default</span> | |
| </div> | |
| </div> | |
| <div> | |
| <div class="label after">After</div> | |
| <div style="background:white;border:1px solid #e8ecf0;border-radius:12px;padding:20px;font-family:system-ui;"> | |
| <label style="font-size:12px;font-weight:600;color:#555;display:block;margin-bottom:4px;">Duration (weeks)</label> | |
| <input style="padding:8px 12px;border:1px solid #cbd5e0;border-radius:7px;font-size:14px;width:80px;text-align:center;" value="4" /> | |
| <span style="font-size:12px;color:#2E7D32;font-weight:600;margin-left:8px;">← New default</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr class="divider"> | |
| <!-- ============================================ --> | |
| <!-- CHANGE 3: SUPERSET/TRISET SERIES --> | |
| <!-- ============================================ --> | |
| <div class="section"> | |
| <span class="change-tag needs-input">Needs Jason's Input</span> | |
| <h2>Change 3: Superset & Triset Grouping (A/B Series)</h2> | |
| <p class="subtitle">Exercises within a block need to be grouped into series — A1/A2 for supersets, A1/A2/A3 for trisets. Three design options below. Which feels most natural for building programs?</p> | |
| </div> | |
| <!-- OPTION A --> | |
| <div class="section"> | |
| <div class="option-card recommended"> | |
| <div class="option-header"> | |
| <h3>Option A: Series Letter Tags</h3> | |
| <span class="option-badge rec">Recommended</span> | |
| </div> | |
| <div class="option-body"> | |
| <p class="option-desc">Each exercise gets an optional series letter (A, B, C...) with an auto-number. Exercises with the same letter are performed together. Exercises without a letter are standalone. Simple dropdown or click-to-assign.</p> | |
| <div class="screen" style="max-width:700px;"> | |
| <div class="screen-header"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>Option A: Series tags on each exercise</div> | |
| <div class="screen-body" style="padding:0;"> | |
| <div class="block-header"> | |
| <span class="block-name">Primary</span> | |
| </div> | |
| <table class="ex-table"> | |
| <thead><tr> | |
| <th style="width:40px;"></th><th>Exercise</th><th>Sets</th><th>Reps</th><th>Rest (s)</th><th>Tempo</th><th>Actions</th> | |
| </tr></thead> | |
| <tbody> | |
| <tr> | |
| <td><span class="series-badge series-a">A1</span></td> | |
| <td class="exercise-name">Bench Press</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr> | |
| <td><span class="series-badge series-a">A2</span></td> | |
| <td class="exercise-name">Bent-Over Row</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr style="border-top:2px solid #e2e8f0;"> | |
| <td><span class="series-badge series-b">B1</span></td> | |
| <td class="exercise-name">Incline DB Press</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr> | |
| <td><span class="series-badge series-b">B2</span></td> | |
| <td class="exercise-name">Lateral Raise</td><td>3</td><td>15</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr> | |
| <td><span class="series-badge series-b">B3</span></td> | |
| <td class="exercise-name">Tricep Pushdown</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div style="padding:10px 16px;"> | |
| <span class="block-btn add">+ Add Exercise</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="pros-cons"> | |
| <div class="pros"><h4>Pros</h4><ul> | |
| <li>Familiar notation — most trainers already use A1/A2</li> | |
| <li>Flexible — supports supersets, trisets, giant sets</li> | |
| <li>Minimal UI change — just adds a column</li> | |
| <li>Easy to read at a glance</li> | |
| </ul></div> | |
| <div class="cons"><h4>Cons</h4><ul> | |
| <li>Trainer must manually assign letters</li> | |
| <li>Visual grouping relies on sorting</li> | |
| </ul></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- OPTION B --> | |
| <div class="section"> | |
| <div class="option-card"> | |
| <div class="option-header"> | |
| <h3>Option B: Visual Group Containers</h3> | |
| </div> | |
| <div class="option-body"> | |
| <p class="option-desc">Exercises are wrapped in visual containers that clearly show which ones are performed together. A "Create Superset" button groups selected exercises. The container shows the series letter and a colored left border.</p> | |
| <div class="screen" style="max-width:700px;"> | |
| <div class="screen-header"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>Option B: Visual group containers</div> | |
| <div class="screen-body" style="padding:0;"> | |
| <div class="block-header"> | |
| <span class="block-name">Primary</span> | |
| </div> | |
| <!-- Group A --> | |
| <div style="margin:12px 12px 0;"> | |
| <div style="border:1px solid #BBDEFB;border-radius:10px;overflow:hidden;background:#FAFCFF;"> | |
| <div style="display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background:#E3F2FD;"> | |
| <span style="font-size:11px;font-weight:700;color:#1565C0;">SUPERSET A</span> | |
| <button style="font-size:10px;color:#1565C0;background:none;border:none;cursor:pointer;">Ungroup</button> | |
| </div> | |
| <table class="ex-table" style="margin:0;"> | |
| <tbody> | |
| <tr><td class="exercise-name">Bench Press</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td><td class="actions"><span class="btn-sm btn-edit">Edit</span></td></tr> | |
| <tr><td class="exercise-name">Bent-Over Row</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td><td class="actions"><span class="btn-sm btn-edit">Edit</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- Group B --> | |
| <div style="margin:8px 12px;"> | |
| <div style="border:1px solid #E1BEE7;border-radius:10px;overflow:hidden;background:#FDFAFF;"> | |
| <div style="display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background:#F3E5F5;"> | |
| <span style="font-size:11px;font-weight:700;color:#7B1FA2;">TRISET B</span> | |
| <button style="font-size:10px;color:#7B1FA2;background:none;border:none;cursor:pointer;">Ungroup</button> | |
| </div> | |
| <table class="ex-table" style="margin:0;"> | |
| <tbody> | |
| <tr><td class="exercise-name">Incline DB Press</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td><td class="actions"><span class="btn-sm btn-edit">Edit</span></td></tr> | |
| <tr><td class="exercise-name">Lateral Raise</td><td>3</td><td>15</td><td>60</td><td class="dim">-</td><td class="actions"><span class="btn-sm btn-edit">Edit</span></td></tr> | |
| <tr><td class="exercise-name">Tricep Pushdown</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td><td class="actions"><span class="btn-sm btn-edit">Edit</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <div style="padding:10px 16px;"> | |
| <span class="block-btn add">+ Add Exercise</span> | |
| <span class="block-btn add" style="margin-left:6px;">+ Create Superset</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="pros-cons"> | |
| <div class="pros"><h4>Pros</h4><ul> | |
| <li>Very clear visual grouping — impossible to miss</li> | |
| <li>Auto-labels (Superset/Triset) based on count</li> | |
| <li>Ungroup button makes it easy to break apart</li> | |
| </ul></div> | |
| <div class="cons"><h4>Cons</h4><ul> | |
| <li>More complex UI — nested containers</li> | |
| <li>Harder to reorder exercises between groups</li> | |
| <li>Takes more vertical space</li> | |
| </ul></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- OPTION C --> | |
| <div class="section"> | |
| <div class="option-card"> | |
| <div class="option-header"> | |
| <h3>Option C: Inline Tags + Color Bars</h3> | |
| </div> | |
| <div class="option-body"> | |
| <p class="option-desc">Hybrid approach: series letter tags like Option A, but with a colored left border to visually connect grouped exercises. Combines the simplicity of tags with the visual clarity of grouping.</p> | |
| <div class="screen" style="max-width:700px;"> | |
| <div class="screen-header"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>Option C: Tags with color bars</div> | |
| <div class="screen-body" style="padding:0;"> | |
| <div class="block-header"> | |
| <span class="block-name">Primary</span> | |
| </div> | |
| <table class="ex-table"> | |
| <thead><tr> | |
| <th style="width:40px;"></th><th>Exercise</th><th>Sets</th><th>Reps</th><th>Rest (s)</th><th>Tempo</th><th>Actions</th> | |
| </tr></thead> | |
| <tbody> | |
| <tr style="border-left:3px solid #1565C0;"> | |
| <td><span class="series-badge series-a">A1</span></td> | |
| <td class="exercise-name">Bench Press</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr style="border-left:3px solid #1565C0;"> | |
| <td><span class="series-badge series-a">A2</span></td> | |
| <td class="exercise-name">Bent-Over Row</td><td>4</td><td>8</td><td>90</td><td>3-1-1-0</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr style="height:6px;"><td colspan="7" style="padding:0;border:none;"></td></tr> | |
| <tr style="border-left:3px solid #7B1FA2;"> | |
| <td><span class="series-badge series-b">B1</span></td> | |
| <td class="exercise-name">Incline DB Press</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr style="border-left:3px solid #7B1FA2;"> | |
| <td><span class="series-badge series-b">B2</span></td> | |
| <td class="exercise-name">Lateral Raise</td><td>3</td><td>15</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| <tr style="border-left:3px solid #7B1FA2;"> | |
| <td><span class="series-badge series-b">B3</span></td> | |
| <td class="exercise-name">Tricep Pushdown</td><td>3</td><td>12</td><td>60</td><td class="dim">-</td> | |
| <td class="actions"><span class="btn-sm btn-edit">Edit</span><span class="btn-sm btn-del">Del</span></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div style="padding:10px 16px;"> | |
| <span class="block-btn add">+ Add Exercise</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="pros-cons"> | |
| <div class="pros"><h4>Pros</h4><ul> | |
| <li>Best of both worlds — tags + visual grouping</li> | |
| <li>Clean table layout (no nesting)</li> | |
| <li>Color bars make groups scannable at a glance</li> | |
| <li>Familiar A1/A2 notation</li> | |
| </ul></div> | |
| <div class="cons"><h4>Cons</h4><ul> | |
| <li>Slightly more visual complexity than A alone</li> | |
| <li>Still needs manual letter assignment</li> | |
| </ul></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- TRAINEE VIEW --> | |
| <hr class="divider"> | |
| <div class="section"> | |
| <h2>How Trainees Would See It</h2> | |
| <p class="subtitle">Regardless of which option we choose, the trainee's daily view would show grouped exercises together with a visual indicator that they're a superset.</p> | |
| <div class="before-after"> | |
| <div> | |
| <div class="label before">Current (no grouping)</div> | |
| <div style="max-width:375px;background:white;border-radius:16px;overflow:hidden;border:1px solid #e0e0e0;font-family:system-ui;"> | |
| <div style="padding:16px;"> | |
| <div style="font-size:11px;color:#888;text-transform:uppercase;font-weight:600;letter-spacing:0.3px;">Primary Block</div> | |
| <div style="margin-top:12px;"> | |
| <div style="padding:12px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;">Bench Press</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">4 × 8 · Rest 90s</div> | |
| </div> | |
| <div style="padding:12px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;">Bent-Over Row</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">4 × 8 · Rest 90s</div> | |
| </div> | |
| <div style="padding:12px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;">Incline DB Press</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">3 × 12 · Rest 60s</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div> | |
| <div class="label after">With series grouping</div> | |
| <div style="max-width:375px;background:white;border-radius:16px;overflow:hidden;border:1px solid #e0e0e0;font-family:system-ui;"> | |
| <div style="padding:16px;"> | |
| <div style="font-size:11px;color:#888;text-transform:uppercase;font-weight:600;letter-spacing:0.3px;">Primary Block</div> | |
| <div style="margin-top:12px;"> | |
| <!-- Superset A --> | |
| <div style="border-left:3px solid #1565C0;padding-left:12px;margin-bottom:12px;"> | |
| <div style="font-size:10px;font-weight:700;color:#1565C0;margin-bottom:6px;">SUPERSET A</div> | |
| <div style="padding:8px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;"><span style="color:#1565C0;margin-right:4px;">A1</span> Bench Press</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">4 × 8 · Rest 90s</div> | |
| </div> | |
| <div style="padding:8px 0;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;"><span style="color:#1565C0;margin-right:4px;">A2</span> Bent-Over Row</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">4 × 8 · Rest 90s</div> | |
| </div> | |
| </div> | |
| <!-- Triset B --> | |
| <div style="border-left:3px solid #7B1FA2;padding-left:12px;"> | |
| <div style="font-size:10px;font-weight:700;color:#7B1FA2;margin-bottom:6px;">TRISET B</div> | |
| <div style="padding:8px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;"><span style="color:#7B1FA2;margin-right:4px;">B1</span> Incline DB Press</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">3 × 12 · Rest 60s</div> | |
| </div> | |
| <div style="padding:8px 0;border-bottom:1px solid #f0f2f5;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;"><span style="color:#7B1FA2;margin-right:4px;">B2</span> Lateral Raise</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">3 × 15 · Rest 60s</div> | |
| </div> | |
| <div style="padding:8px 0;"> | |
| <div style="font-size:15px;font-weight:600;color:#1A365D;"><span style="color:#7B1FA2;margin-right:4px;">B3</span> Tricep Pushdown</div> | |
| <div style="font-size:12px;color:#888;margin-top:2px;">3 × 12 · Rest 60s</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- SUMMARY --> | |
| <hr class="divider"> | |
| <div class="section"> | |
| <h2>Summary</h2> | |
| <div style="background:white;border:1px solid #e8ecf0;border-radius:12px;padding:24px;font-size:14px;line-height:1.6;"> | |
| <table style="width:100%;border-collapse:collapse;"> | |
| <thead><tr style="border-bottom:2px solid #e2e8f0;"> | |
| <th style="text-align:left;padding:8px 12px;font-size:13px;color:#888;">Change</th> | |
| <th style="text-align:left;padding:8px 12px;font-size:13px;color:#888;">Status</th> | |
| <th style="text-align:left;padding:8px 12px;font-size:13px;color:#888;">Impact</th> | |
| </tr></thead> | |
| <tbody> | |
| <tr style="border-bottom:1px solid #f0f2f5;"> | |
| <td style="padding:10px 12px;font-weight:600;">Tempo → end of columns</td> | |
| <td style="padding:10px 12px;"><span style="background:#E8F5E9;color:#2E7D32;padding:3px 10px;border-radius:10px;font-size:11px;font-weight:600;">Ready to build</span></td> | |
| <td style="padding:10px 12px;color:#555;">UI only — reorder table headers and cells</td> | |
| </tr> | |
| <tr style="border-bottom:1px solid #f0f2f5;"> | |
| <td style="padding:10px 12px;font-weight:600;">Default phase = 4 weeks</td> | |
| <td style="padding:10px 12px;"><span style="background:#E8F5E9;color:#2E7D32;padding:3px 10px;border-radius:10px;font-size:11px;font-weight:600;">Ready to build</span></td> | |
| <td style="padding:10px 12px;color:#555;">DB default + UI default value</td> | |
| </tr> | |
| <tr> | |
| <td style="padding:10px 12px;font-weight:600;">A/B series (supersets)</td> | |
| <td style="padding:10px 12px;"><span style="background:#FFF3E0;color:#E65100;padding:3px 10px;border-radius:10px;font-size:11px;font-weight:600;">Needs Jason's pick</span></td> | |
| <td style="padding:10px 12px;color:#555;">New DB field + UI for trainer & trainee views</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <div class="footer-note"> | |
| Program Builder Improvements — Jason Trainer · March 2026 | |
| </div> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment