diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..5155206 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,32 @@ +name: Deploy Prototype to Pages + +on: + push: + branches: + - claude/fitness-app-styling-7giJD + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v3 + with: + path: fabio-antunes-app/prototype + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/fabio-antunes-app/prototype/README.md b/fabio-antunes-app/prototype/README.md new file mode 100644 index 0000000..1530908 --- /dev/null +++ b/fabio-antunes-app/prototype/README.md @@ -0,0 +1,43 @@ +# Fabio Antunes — Prime Coaching · Prototyp + +Erste Design-Vorschau im "Dark & Athletic / Premium Gold"-Stil. + +## Ansehen + +```bash +# Im Browser direkt öffnen: +open fabio-antunes-app/prototype/index.html + +# Oder mit Live-Server (Auto-Reload): +cd fabio-antunes-app/prototype && python3 -m http.server 8080 +# Dann http://localhost:8080 öffnen +``` + +Auf dem Handy: einfach die `index.html` im mobilen Browser öffnen, sieht in der Realität noch besser aus. + +## Stand + +- ✅ **Heute-Screen** (`index.html`) — Greeting, Workout-Hero, Tagesziele, Schnellzugriff, Coach-Chat-Preview, Bottom-Nav +- ⏳ Workout-Detail (kommt nach Freigabe) +- ⏳ Übungs-Tracking (kommt nach Freigabe) +- ⏳ Fortschritt mit Charts (kommt nach Freigabe) + +## Design-Tokens + +- **Akzent**: Gold `#DAAC2F` (mit `#F5C75A` als Highlight, `#CFA847` als Subtle) +- **Hintergrund**: Tiefschwarz `#0A0A0A` → Surface `#141414` +- **Typo**: Inter (300–800) + +Alle Farben sind als CSS-Variablen in `assets/styles.css` definiert (oben unter `:root`). + +## Logo austauschen + +Aktuell ist ein **SVG-Platzhalter** in `assets/logo.svg`. So tauschst du dein PNG ein: + +1. PNG (transparent, mind. 256×256) in `assets/logo.png` ablegen +2. In `index.html` ersetzen: + ```html + + + + ``` diff --git a/fabio-antunes-app/prototype/assets/logo.png b/fabio-antunes-app/prototype/assets/logo.png new file mode 100644 index 0000000..7b5c736 Binary files /dev/null and b/fabio-antunes-app/prototype/assets/logo.png differ diff --git a/fabio-antunes-app/prototype/assets/logo.svg b/fabio-antunes-app/prototype/assets/logo.svg new file mode 100644 index 0000000..468ecc6 --- /dev/null +++ b/fabio-antunes-app/prototype/assets/logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fabio-antunes-app/prototype/assets/styles.css b/fabio-antunes-app/prototype/assets/styles.css new file mode 100644 index 0000000..7b8cbb7 --- /dev/null +++ b/fabio-antunes-app/prototype/assets/styles.css @@ -0,0 +1,1381 @@ +/* ============================================ + FABIO ANTUNES — PRIME COACHING + Design System v0.1 + ============================================ */ + +:root { + /* Backgrounds */ + --bg-primary: #0A0A0A; + --bg-secondary: #1A1A1A; + --bg-elevated: #1C1C1C; + --bg-overlay: rgba(20, 20, 20, 0.85); + + /* Borders */ + --border-subtle: #1F1F1F; + --border: #2A2A2A; + --border-strong: #3A3A3A; + + /* Brand — Gold */ + --gold: #D4AF37; + --gold-light: #F4C430; + --gold-dark: #8B6914; + --gold-muted: #8C7028; + --gold-glow: rgba(212, 175, 55, 0.18); + + /* Text */ + --text-primary: #FFFFFF; + --text-secondary: #B8B8B8; + --text-tertiary: #6E6E6E; + --text-quaternary: #4A4A4A; + --text-on-gold: #0A0A0A; + + /* Semantic */ + --success: #4ADE80; + --warning: #F59E0B; + --danger: #EF4444; + + /* Spacing */ + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + + /* Radius */ + --radius-sm: 8px; + --radius: 14px; + --radius-lg: 20px; + --radius-xl: 28px; + --radius-full: 999px; + + /* Type */ + --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; + --font-display: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; + + /* Shadows */ + --shadow-card: 0 4px 24px -8px rgba(0, 0, 0, 0.6); + --shadow-gold: 0 8px 32px -12px rgba(212, 175, 55, 0.4); +} + +/* Reset */ +*, *::before, *::after { box-sizing: border-box; } +* { margin: 0; padding: 0; } + +html, body { + height: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +body { + font-family: var(--font-sans); + font-size: 15px; + line-height: 1.5; + color: var(--text-primary); + background: var(--bg-primary); + -webkit-tap-highlight-color: transparent; + overscroll-behavior: none; +} + +img, svg { display: block; max-width: 100%; } +button, input, textarea { font: inherit; color: inherit; } +button { cursor: pointer; border: none; background: none; } +a { color: inherit; text-decoration: none; } + +/* ============================================ + Phone Frame (Desktop preview) + ============================================ */ +.viewport { + min-height: 100dvh; + display: flex; + align-items: center; + justify-content: center; + background: + radial-gradient(circle at 20% 0%, rgba(212, 175, 55, 0.06) 0%, transparent 50%), + radial-gradient(circle at 80% 100%, rgba(212, 175, 55, 0.04) 0%, transparent 50%), + var(--bg-primary); + padding: var(--space-6) var(--space-4); +} + +.phone { + width: 100%; + max-width: 412px; + min-height: 100dvh; + background: var(--bg-primary); + position: relative; + overflow: hidden; +} + +@media (min-width: 768px) { + .phone { + min-height: 880px; + max-height: 880px; + border-radius: 44px; + border: 1px solid var(--border); + box-shadow: + 0 0 0 8px #050505, + 0 0 0 9px #1a1a1a, + 0 40px 80px -20px rgba(0,0,0,0.8), + 0 0 120px rgba(212, 175, 55, 0.05); + overflow: hidden; + } +} + +.screen { + height: 100%; + min-height: 100dvh; + overflow-y: auto; + overflow-x: hidden; + padding-bottom: 96px; /* nav space */ +} + +@media (min-width: 768px) { + .screen { min-height: 880px; max-height: 880px; } +} + +.screen::-webkit-scrollbar { width: 0; } + +/* iOS-style status bar */ +.statusbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-4) var(--space-6) var(--space-2); + font-size: 14px; + font-weight: 600; + letter-spacing: 0.02em; + color: var(--text-primary); +} +.statusbar-icons { display: flex; gap: 6px; align-items: center; opacity: 0.95; } +.statusbar-icons svg { width: 18px; height: 12px; } + +/* ============================================ + Layout + ============================================ */ +.container { + padding: 0 var(--space-5); +} + +/* ============================================ + Header (greeting) + ============================================ */ +.header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-4) var(--space-5) var(--space-6); +} + +.greeting-label { + font-size: 13px; + color: var(--text-tertiary); + font-weight: 500; + letter-spacing: 0.02em; + text-transform: uppercase; +} +.greeting-name { + font-size: 26px; + font-weight: 700; + letter-spacing: -0.02em; + margin-top: 2px; +} +.greeting-name .accent { color: var(--gold); } + +.avatar { + width: 44px; + height: 44px; + border-radius: var(--radius-full); + background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); + border: 1px solid var(--border); + display: grid; + place-items: center; + font-weight: 700; + font-size: 14px; + color: var(--gold); + position: relative; +} +.avatar::after { + content: ''; + position: absolute; + bottom: 0; + right: 0; + width: 11px; + height: 11px; + background: var(--success); + border: 2px solid var(--bg-primary); + border-radius: var(--radius-full); +} + +/* ============================================ + Brand bar + ============================================ */ +.brandbar { + display: flex; + align-items: center; + justify-content: center; + padding: var(--space-3) 0 var(--space-3); + border-bottom: 1px solid var(--border-subtle); + margin: 0 var(--space-5) var(--space-4); +} +.brandbar-logo { + height: 44px; + width: auto; + max-width: 100%; + object-fit: contain; +} +.brandbar-text { + font-size: 11px; + letter-spacing: 0.24em; + color: var(--gold-dark); + font-weight: 600; + text-transform: uppercase; +} + +/* ============================================ + Hero Workout Card + ============================================ */ +.hero-card { + position: relative; + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-6); + border-radius: var(--radius-lg); + background: + linear-gradient(135deg, rgba(212, 175, 55, 0.08) 0%, transparent 50%), + var(--bg-secondary); + border: 1px solid var(--border); + overflow: hidden; +} + +.hero-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent, var(--gold), transparent); + opacity: 0.5; +} + +.hero-eyebrow { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.16em; + text-transform: uppercase; + color: var(--gold); + padding: 6px 10px; + border: 1px solid var(--gold-muted); + border-radius: var(--radius-full); + background: var(--gold-glow); +} +.hero-eyebrow .pulse { + width: 6px; height: 6px; + border-radius: 50%; + background: var(--gold); + box-shadow: 0 0 8px var(--gold); + animation: pulse 1.6s ease-in-out infinite; +} +@keyframes pulse { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.5; transform: scale(1.3); } +} + +.hero-title { + font-size: 28px; + font-weight: 800; + line-height: 1.1; + letter-spacing: -0.03em; + margin-top: var(--space-4); +} +.hero-subtitle { + font-size: 14px; + color: var(--text-secondary); + margin-top: var(--space-2); +} + +.hero-meta { + display: flex; + gap: var(--space-5); + margin-top: var(--space-5); + padding-top: var(--space-5); + border-top: 1px solid var(--border-subtle); +} +.hero-meta-item { flex: 1; } +.hero-meta-value { + font-size: 18px; + font-weight: 700; + font-variant-numeric: tabular-nums; +} +.hero-meta-value .unit { + font-size: 12px; + color: var(--text-tertiary); + font-weight: 500; + margin-left: 2px; +} +.hero-meta-label { + font-size: 11px; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.08em; + margin-top: 2px; +} + +.btn-primary { + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + width: 100%; + margin-top: var(--space-5); + padding: 16px; + background: var(--gold); + color: var(--text-on-gold); + font-weight: 700; + font-size: 15px; + letter-spacing: 0.02em; + border-radius: var(--radius); + transition: transform 0.1s ease, box-shadow 0.2s ease; + box-shadow: var(--shadow-gold); +} +.btn-primary:hover { transform: translateY(-1px); box-shadow: 0 12px 36px -10px rgba(212, 175, 55, 0.6); } +.btn-primary:active { transform: translateY(0); } +.btn-primary svg { width: 18px; height: 18px; } + +/* ============================================ + Section + ============================================ */ +.section { + padding: 0 var(--space-5); + margin-bottom: var(--space-6); +} +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: var(--space-4); +} +.section-title { + font-size: 13px; + font-weight: 600; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--text-tertiary); +} +.section-action { + font-size: 13px; + color: var(--gold); + font-weight: 600; +} + +/* ============================================ + Goals (rings) + ============================================ */ +.goals { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-3); +} +.goal-card { + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + padding: var(--space-4); + display: flex; + flex-direction: column; + align-items: flex-start; + gap: var(--space-3); + transition: border-color 0.2s ease; +} +.goal-card:hover { border-color: var(--border-strong); } + +.ring { + --pct: 60; + --size: 44px; + width: var(--size); + height: var(--size); + border-radius: 50%; + background: + conic-gradient(var(--gold) calc(var(--pct) * 1%), #232323 0); + display: grid; + place-items: center; + position: relative; +} +.ring::before { + content: ''; + position: absolute; + inset: 4px; + background: var(--bg-secondary); + border-radius: 50%; +} +.ring svg { + width: 18px; + height: 18px; + position: relative; + z-index: 1; + color: var(--gold); +} + +.goal-value { + font-size: 17px; + font-weight: 700; + font-variant-numeric: tabular-nums; + letter-spacing: -0.01em; +} +.goal-value .small { + font-size: 12px; + color: var(--text-tertiary); + font-weight: 500; +} +.goal-label { + font-size: 11px; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.06em; + margin-top: -8px; +} + +/* ============================================ + Quick Actions + ============================================ */ +.actions { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-3); +} +.action { + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + padding: var(--space-4); + display: flex; + align-items: center; + gap: var(--space-3); + text-align: left; + transition: all 0.15s ease; +} +.action:hover { border-color: var(--gold-muted); transform: translateY(-1px); } + +.action-icon { + width: 40px; + height: 40px; + border-radius: var(--radius-sm); + background: var(--bg-elevated); + display: grid; + place-items: center; + color: var(--gold); + border: 1px solid var(--border); + flex-shrink: 0; +} +.action-icon svg { width: 18px; height: 18px; } + +.action-label { + font-size: 14px; + font-weight: 600; + letter-spacing: -0.01em; +} +.action-sub { + font-size: 11px; + color: var(--text-tertiary); + margin-top: 2px; +} +.action-badge { + margin-left: auto; + background: var(--gold); + color: var(--text-on-gold); + font-size: 11px; + font-weight: 700; + padding: 2px 7px; + border-radius: var(--radius-full); + min-width: 20px; + text-align: center; +} + +/* ============================================ + Coach card + ============================================ */ +.coach-card { + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + display: flex; + align-items: center; + gap: var(--space-3); +} +.coach-avatar { + width: 44px; + height: 44px; + border-radius: 50%; + background: linear-gradient(135deg, #3a2f0e, #1a1a1a); + border: 1.5px solid var(--gold-muted); + display: grid; + place-items: center; + font-weight: 800; + font-size: 14px; + color: var(--gold); + flex-shrink: 0; +} +.coach-text { flex: 1; min-width: 0; } +.coach-name { + font-size: 14px; + font-weight: 600; +} +.coach-msg { + font-size: 13px; + color: var(--text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; +} +.coach-time { + font-size: 11px; + color: var(--text-tertiary); + align-self: flex-start; +} + +/* ============================================ + Bottom Nav + ============================================ */ +.nav { + position: absolute; + left: 0; + right: 0; + bottom: 0; + background: rgba(10, 10, 10, 0.92); + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); + border-top: 1px solid var(--border-subtle); + padding: var(--space-3) var(--space-2) calc(var(--space-3) + 8px); + display: flex; + justify-content: space-around; + align-items: center; +} +.nav-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; + padding: 6px 12px; + color: var(--text-quaternary); + font-size: 10px; + font-weight: 600; + letter-spacing: 0.04em; + flex: 1; + transition: color 0.15s ease; +} +.nav-item svg { width: 22px; height: 22px; } +.nav-item.active { color: var(--gold); } +.nav-item:hover { color: var(--text-secondary); } +.nav-item.active:hover { color: var(--gold-light); } + +/* ============================================ + Top bar (back / title / action) + ============================================ */ +.topbar { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-2) var(--space-4) var(--space-4); +} +.iconbtn { + width: 40px; + height: 40px; + border-radius: var(--radius-full); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + display: grid; + place-items: center; + color: var(--text-primary); + flex-shrink: 0; + transition: border-color 0.15s ease, color 0.15s ease; +} +.iconbtn:hover { border-color: var(--gold-muted); color: var(--gold); } +.iconbtn svg { width: 20px; height: 20px; } +.topbar-title { flex: 1; min-width: 0; text-align: center; } +.topbar-eyebrow { + font-size: 11px; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.12em; + font-weight: 600; +} +.topbar-name { + font-size: 17px; + font-weight: 700; + letter-spacing: -0.01em; + margin-top: 2px; +} + +/* ============================================ + Banner (workout summary) + ============================================ */ +.banner { + position: relative; + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-6); + border-radius: var(--radius-lg); + overflow: hidden; + background: var(--bg-secondary); + border: 1px solid var(--border); +} +.banner-bg { + position: absolute; + inset: 0; + background: + radial-gradient(circle at 100% 0%, rgba(212, 175, 55, 0.18), transparent 60%), + radial-gradient(circle at 0% 100%, rgba(212, 175, 55, 0.08), transparent 50%); + pointer-events: none; +} +.banner::before { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; height: 1px; + background: linear-gradient(90deg, transparent, var(--gold), transparent); + opacity: 0.6; +} +.banner-content { position: relative; } +.muscle-tags { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-bottom: var(--space-4); +} +.muscle-tag { + font-size: 11px; + font-weight: 600; + letter-spacing: 0.04em; + padding: 5px 10px; + border-radius: var(--radius-full); + background: var(--bg-elevated); + border: 1px solid var(--border); + color: var(--text-secondary); + text-transform: uppercase; +} +.muscle-tag.primary { + background: var(--gold-glow); + border-color: var(--gold-muted); + color: var(--gold); +} +.banner-title { + font-size: 30px; + font-weight: 800; + line-height: 1.05; + letter-spacing: -0.03em; +} +.banner-stats { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--space-3); + margin-top: var(--space-5); + padding-top: var(--space-5); + border-top: 1px solid var(--border-subtle); +} +.banner-stats > div { display: flex; flex-direction: column; gap: 2px; } +.banner-stats strong { + font-size: 16px; + font-weight: 700; + font-variant-numeric: tabular-nums; +} +.banner-stats span { + font-size: 10px; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.08em; + font-weight: 600; +} + +/* ============================================ + Coach Note + ============================================ */ +.coach-note { + display: flex; + gap: var(--space-3); + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-left: 3px solid var(--gold); + border-radius: var(--radius); +} +.coach-note-icon { + width: 32px; + height: 32px; + border-radius: var(--radius-sm); + background: var(--gold-glow); + color: var(--gold); + display: grid; + place-items: center; + flex-shrink: 0; +} +.coach-note-icon svg { width: 16px; height: 16px; } +.coach-note-label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--gold); + font-weight: 700; +} +.coach-note-text { + font-size: 13px; + color: var(--text-secondary); + margin-top: 4px; + line-height: 1.5; +} + +/* ============================================ + Exercise list + ============================================ */ +.exercise-list { + display: flex; + flex-direction: column; + gap: var(--space-2); +} +.exercise { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-3); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + transition: all 0.15s ease; + cursor: pointer; +} +.exercise:hover { border-color: var(--gold-muted); transform: translateX(2px); } +.exercise.superset { border-left: 3px solid var(--gold); } + +.exercise-num { + width: 28px; + height: 28px; + border-radius: var(--radius-sm); + background: var(--bg-elevated); + display: grid; + place-items: center; + font-size: 12px; + font-weight: 700; + color: var(--text-secondary); + font-variant-numeric: tabular-nums; + flex-shrink: 0; +} +.exercise-img { + width: 48px; + height: 48px; + border-radius: var(--radius-sm); + display: grid; + place-items: center; + color: var(--gold); + flex-shrink: 0; + border: 1px solid var(--border-subtle); +} +.exercise-img svg { width: 22px; height: 22px; } +.exercise-body { flex: 1; min-width: 0; } +.exercise-name { + font-size: 15px; + font-weight: 600; + letter-spacing: -0.01em; +} +.exercise-meta { + font-size: 12px; + color: var(--text-tertiary); + margin-top: 2px; + font-variant-numeric: tabular-nums; +} +.exercise-tag { + display: inline-block; + margin-top: 4px; + font-size: 10px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + padding: 2px 8px; + border-radius: var(--radius-full); + background: var(--gold-glow); + color: var(--gold); +} +.exercise-tag.finisher { background: rgba(239, 68, 68, 0.12); color: #FCA5A5; } + +.exercise-status { + width: 28px; + height: 28px; + display: grid; + place-items: center; + color: var(--text-quaternary); + flex-shrink: 0; +} +.exercise-status svg { width: 18px; height: 18px; } + +.superset-label { + display: flex; + align-items: center; + gap: var(--space-3); + margin: var(--space-3) 0 var(--space-1); + font-size: 10px; + color: var(--gold); + text-transform: uppercase; + letter-spacing: 0.2em; + font-weight: 700; +} +.superset-label span { + flex: 1; + height: 1px; + background: linear-gradient(90deg, transparent, var(--gold-muted), transparent); +} + +/* ============================================ + Sticky CTA bar + ============================================ */ +.sticky-cta { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: var(--space-4) var(--space-5) calc(var(--space-4) + 8px); + background: linear-gradient(180deg, transparent, rgba(10,10,10,0.95) 30%); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); +} + +/* ============================================ + Workout progress bar + ============================================ */ +.workout-progress { + height: 3px; + background: var(--border-subtle); + margin: 0 var(--space-5) var(--space-5); + border-radius: 2px; + overflow: hidden; +} +.workout-progress-bar { + height: 100%; + background: linear-gradient(90deg, var(--gold-dark), var(--gold-light)); + border-radius: 2px; + box-shadow: 0 0 8px var(--gold-glow); + transition: width 0.4s ease; +} + +/* ============================================ + Exercise hero (media + targets) + ============================================ */ +.exercise-hero { + margin: 0 var(--space-5) var(--space-5); +} +.exercise-media { + position: relative; + aspect-ratio: 16 / 9; + border-radius: var(--radius-lg); + overflow: hidden; + border: 1px solid var(--border); + display: grid; + place-items: center; + background: linear-gradient(135deg, #1a1409 0%, #0a0a0a 100%); + margin-bottom: var(--space-3); +} +.exercise-media-bg { + position: absolute; + inset: 0; + background: + radial-gradient(circle at 50% 50%, rgba(212, 175, 55, 0.12), transparent 60%); +} +.exercise-media-icon { + width: 60%; + height: auto; + color: var(--gold-dark); + position: relative; + opacity: 0.7; +} +.play-btn { + position: absolute; + width: 64px; + height: 64px; + border-radius: 50%; + background: var(--gold); + color: var(--text-on-gold); + display: grid; + place-items: center; + box-shadow: var(--shadow-gold); + transition: transform 0.15s ease; +} +.play-btn:hover { transform: scale(1.05); } +.play-btn svg { width: 24px; height: 24px; margin-left: 3px; } + +.exercise-targets { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +/* ============================================ + Last performance + ============================================ */ +.lastperf { + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); +} +.lastperf-label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.12em; + color: var(--text-tertiary); + font-weight: 600; + margin-bottom: var(--space-3); +} +.lastperf-grid { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + gap: var(--space-3); +} +.lastperf-item { + padding: var(--space-3); + border-radius: var(--radius-sm); + border: 1px solid var(--border-subtle); +} +.lastperf-item.target { + border-color: var(--gold-muted); + background: var(--gold-glow); +} +.lastperf-value { + font-size: 22px; + font-weight: 800; + font-variant-numeric: tabular-nums; + letter-spacing: -0.02em; +} +.lastperf-value .unit { + font-size: 13px; + color: var(--text-tertiary); + font-weight: 500; + margin-left: 2px; +} +.lastperf-item.target .lastperf-value { color: var(--gold-light); } +.lastperf-item.target .lastperf-value .unit { color: var(--gold); } +.lastperf-meta { + font-size: 12px; + color: var(--text-tertiary); + margin-top: 2px; + font-variant-numeric: tabular-nums; +} +.lastperf-arrow { + color: var(--text-quaternary); +} +.lastperf-arrow svg { width: 18px; height: 18px; } + +/* ============================================ + Sets tracker + ============================================ */ +.sets { + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + padding: var(--space-3); +} +.sets-header, +.set { + display: grid; + grid-template-columns: 32px 1fr 70px 70px 40px; + gap: var(--space-2); + align-items: center; +} +.sets-header { + padding: 0 var(--space-2) var(--space-2); + font-size: 10px; + color: var(--text-tertiary); + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + border-bottom: 1px solid var(--border-subtle); + margin-bottom: var(--space-2); +} +.sets-header > div:nth-child(3), +.sets-header > div:nth-child(4) { text-align: center; } + +.set { + padding: var(--space-2); + border-radius: var(--radius-sm); + transition: background 0.15s ease; +} +.set + .set { border-top: 1px solid var(--border-subtle); margin-top: var(--space-1); padding-top: var(--space-3); } +.set.active { background: var(--gold-glow); border: 1px solid var(--gold-muted); } +.set.done { opacity: 0.6; } + +.set-num { + font-size: 14px; + font-weight: 700; + color: var(--text-secondary); + font-variant-numeric: tabular-nums; + text-align: center; +} +.set.active .set-num { color: var(--gold); } +.set-prev { + font-size: 12px; + color: var(--text-tertiary); + font-variant-numeric: tabular-nums; +} +.set-input { + width: 100%; + height: 38px; + padding: 0 var(--space-2); + border-radius: var(--radius-sm); + background: var(--bg-elevated); + border: 1px solid var(--border); + color: var(--text-primary); + font-size: 15px; + font-weight: 600; + font-variant-numeric: tabular-nums; + text-align: center; + outline: none; + transition: border-color 0.15s ease, background 0.15s ease; +} +.set-input:focus { border-color: var(--gold); background: var(--bg-primary); } +.set.active .set-input { border-color: var(--gold-muted); } +.set-input::placeholder { color: var(--text-quaternary); } + +.set-check { + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + background: var(--bg-elevated); + border: 1px solid var(--border); + display: grid; + place-items: center; + color: var(--text-quaternary); + transition: all 0.15s ease; +} +.set-check:hover { border-color: var(--gold-muted); color: var(--gold); } +.set-check svg { width: 18px; height: 18px; } +.set-check.checked { + background: var(--gold); + border-color: var(--gold); + color: var(--text-on-gold); +} + +.add-set { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + width: 100%; + margin-top: var(--space-3); + padding: var(--space-3); + background: transparent; + border: 1px dashed var(--border-strong); + border-radius: var(--radius-sm); + color: var(--text-secondary); + font-size: 13px; + font-weight: 600; + transition: all 0.15s ease; +} +.add-set:hover { border-color: var(--gold-muted); color: var(--gold); } +.add-set svg { width: 16px; height: 16px; } + +/* ============================================ + Rest timer overlay + ============================================ */ +.rest-timer { + position: absolute; + left: var(--space-5); + right: var(--space-5); + bottom: 90px; + background: linear-gradient(135deg, #1a1409 0%, #0e0e0e 100%); + border: 1px solid var(--gold-muted); + border-radius: var(--radius); + padding: var(--space-4); + display: flex; + align-items: center; + gap: var(--space-4); + box-shadow: 0 12px 40px -8px rgba(0,0,0,0.7), 0 0 24px var(--gold-glow); +} +.rest-timer-label { + font-size: 10px; + color: var(--gold); + letter-spacing: 0.18em; + text-transform: uppercase; + font-weight: 700; +} +.rest-timer-time { + font-size: 28px; + font-weight: 800; + font-variant-numeric: tabular-nums; + letter-spacing: -0.02em; + color: var(--text-primary); + margin-top: 2px; + flex: 1; +} +.rest-timer-actions { + display: flex; + gap: 6px; +} +.timer-btn { + display: grid; + place-items: center; + width: 44px; + height: 44px; + border-radius: var(--radius-sm); + background: var(--bg-elevated); + border: 1px solid var(--border); + color: var(--text-secondary); + font-size: 11px; + font-weight: 700; + position: relative; + transition: all 0.15s ease; +} +.timer-btn:hover { border-color: var(--gold-muted); color: var(--gold); } +.timer-btn svg { width: 12px; height: 12px; } +.timer-btn span { + font-size: 9px; + margin-top: 1px; +} +.timer-btn.skip { + background: var(--gold); + border-color: var(--gold); + color: var(--text-on-gold); + font-size: 12px; + width: auto; + padding: 0 var(--space-3); +} + +/* ============================================ + Tabs + ============================================ */ +.tabs { + display: flex; + gap: 4px; + padding: 0 var(--space-5); + margin-bottom: var(--space-5); + overflow-x: auto; + scrollbar-width: none; +} +.tabs::-webkit-scrollbar { display: none; } +.tab { + flex-shrink: 0; + padding: 8px var(--space-4); + font-size: 13px; + font-weight: 600; + color: var(--text-tertiary); + border-radius: var(--radius-full); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + transition: all 0.15s ease; +} +.tab:hover { color: var(--text-primary); } +.tab.active { + background: var(--gold-glow); + border-color: var(--gold-muted); + color: var(--gold); +} + +/* ============================================ + Metric card with chart + ============================================ */ +.metric-card { + margin: 0 var(--space-5) var(--space-6); + padding: var(--space-5); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); +} +.metric-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: var(--space-4); +} +.metric-label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.12em; + color: var(--text-tertiary); + font-weight: 600; +} +.metric-value { + font-size: 38px; + font-weight: 800; + font-variant-numeric: tabular-nums; + letter-spacing: -0.03em; + margin-top: 2px; + line-height: 1; +} +.metric-value .unit { + font-size: 16px; + color: var(--text-tertiary); + font-weight: 500; + margin-left: 4px; + letter-spacing: 0; +} +.metric-delta { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 6px 10px; + border-radius: var(--radius-full); + font-size: 12px; + font-weight: 700; + font-variant-numeric: tabular-nums; +} +.metric-delta.positive { + background: rgba(74, 222, 128, 0.12); + color: var(--success); +} +.metric-delta svg { width: 14px; height: 14px; } + +.chart { + margin-top: var(--space-5); +} +.chart svg { + width: 100%; + height: 140px; +} +.chart-x { + display: flex; + justify-content: space-between; + margin-top: var(--space-2); + font-size: 10px; + color: var(--text-quaternary); + font-weight: 600; + letter-spacing: 0.04em; +} +.chart-x .active { color: var(--gold); } + +.metric-footer { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-3); + margin-top: var(--space-5); + padding-top: var(--space-4); + border-top: 1px solid var(--border-subtle); +} +.metric-foot-label { + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--text-tertiary); + font-weight: 600; +} +.metric-foot-value { + font-size: 14px; + font-weight: 700; + font-variant-numeric: tabular-nums; + margin-top: 2px; +} + +/* ============================================ + Personal Records + ============================================ */ +.pr-list { + display: flex; + flex-direction: column; + gap: var(--space-2); +} +.pr-card { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-3) var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); + transition: border-color 0.15s ease; +} +.pr-card:hover { border-color: var(--gold-muted); } +.pr-card.new { + background: linear-gradient(135deg, rgba(212, 175, 55, 0.1), transparent 60%), var(--bg-secondary); + border-color: var(--gold-muted); +} +.pr-icon { + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + background: var(--gold-glow); + color: var(--gold); + display: grid; + place-items: center; + flex-shrink: 0; +} +.pr-icon svg { width: 18px; height: 18px; } +.pr-body { flex: 1; min-width: 0; } +.pr-name { font-size: 14px; font-weight: 600; } +.pr-meta { + font-size: 12px; + color: var(--text-tertiary); + margin-top: 2px; + font-variant-numeric: tabular-nums; +} +.pr-badge { + background: var(--gold); + color: var(--text-on-gold); + font-size: 10px; + font-weight: 800; + letter-spacing: 0.1em; + padding: 4px 8px; + border-radius: var(--radius-full); +} +.pr-delta { + font-size: 12px; + font-weight: 700; + color: var(--success); + font-variant-numeric: tabular-nums; +} + +/* ============================================ + Health grid + ============================================ */ +.health-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-3); +} +.health-card { + padding: var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border-subtle); + border-radius: var(--radius); +} +.health-head { + display: flex; + align-items: center; + gap: 6px; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-tertiary); + font-weight: 600; + margin-bottom: var(--space-2); +} +.health-head svg { width: 14px; height: 14px; color: var(--gold); } +.health-value { + font-size: 22px; + font-weight: 800; + font-variant-numeric: tabular-nums; + letter-spacing: -0.02em; +} +.health-value .unit { + font-size: 12px; + color: var(--text-tertiary); + font-weight: 500; + margin-left: 2px; +} +.health-trend { + font-size: 11px; + margin-top: 4px; + font-variant-numeric: tabular-nums; +} +.health-trend.up { color: var(--success); } +.health-trend.down { color: var(--success); } + +/* ============================================ + Utilities + ============================================ */ +.spacer-sm { height: var(--space-4); } +.spacer { height: var(--space-6); } diff --git a/fabio-antunes-app/prototype/exercise.html b/fabio-antunes-app/prototype/exercise.html new file mode 100644 index 0000000..133d346 --- /dev/null +++ b/fabio-antunes-app/prototype/exercise.html @@ -0,0 +1,192 @@ + + + + + + +Bankdrücken — Fabio Antunes + + + + + + +
+
+
+ +
+ 9:43 +
+ + +
+
+ +
+ + + +
+
Übung 1 von 7
+
Bankdrücken
+
+ +
+ + +
+
+
+ + +
+
+
+ + + + + + + +
+ +
+ Brust + Schulter (front) + Trizeps +
+
+ + +
+
Letzte Leistung · 7 Tage
+
+
+
75kg
+
×10, 10, 9, 8
+
+
+ +
+
+
80kg
+
Ziel heute · 8-10
+
+
+
+ + +
+
+

Sätze

+ 4 × 8-10 +
+ +
+ +
+
SATZ
+
VORHER
+
KG
+
WDH
+
+
+ + +
+
1
+
75 × 10
+ + + +
+ + +
+
2
+
75 × 10
+ + + +
+ +
+
3
+
75 × 9
+ + + +
+ +
+
4
+
75 × 8
+ + + +
+ + +
+
+ + +
+
+ +
+
+
Form-Cue
+
Schulterblätter zusammen, Po bleibt auf der Bank, Hantel kontrolliert zur Brust unter den Brustwarzen.
+
+
+ +
+
+ + +
+
PAUSE
+
01:23
+
+ + + +
+
+ + + + +
+
+ + diff --git a/fabio-antunes-app/prototype/index.html b/fabio-antunes-app/prototype/index.html new file mode 100644 index 0000000..693cb0c --- /dev/null +++ b/fabio-antunes-app/prototype/index.html @@ -0,0 +1,190 @@ + + + + + + +Fabio Antunes — Heute + + + + + + +
+
+
+ + +
+ 9:41 +
+ + +
+
+ + +
+
+
Montag · 14. Apr
+

Servus, Fabio

+
+
FA
+
+ + +
+ +
+ + +
+ Heute · Push Day A +

Brust, Schulter,
Trizeps

+

7 Übungen · ~58 Min · Mittlere Intensität

+ +
+
+
12.480kg
+
Volumen Ziel
+
+
+
28×
+
Sätze
+
+
+
RPE 7-8
+
Intensität
+
+
+ + + + Workout starten + +
+ + +
+
+

Tagesziele

+ +
+
+
+
+ +
+
+
128/180
+
Protein
+
+
+
+
+ +
+
+
1,4/3 L
+
Wasser
+
+
+
+
+ +
+
+
8.840/10k
+
Schritte
+
+
+
+
+ + +
+
+

Schnellzugriff

+
+
+ + + + +
+
+ + +
+
F
+
+
Fabio · Coach
+
Stark gestern! Heute volle Power 💪
+
+
07:42
+
+ +
+
+ + + +
+
+ + diff --git a/fabio-antunes-app/prototype/progress.html b/fabio-antunes-app/prototype/progress.html new file mode 100644 index 0000000..df50343 --- /dev/null +++ b/fabio-antunes-app/prototype/progress.html @@ -0,0 +1,223 @@ + + + + + + +Fortschritt — Fabio Antunes + + + + + + +
+
+
+ +
+ 9:45 +
+ + +
+
+ +
+
+
Dein Fortschritt
+

8 Wochen stark

+
+ +
+ + +
+ + + + +
+ + +
+
+
+
Aktuell · Gewicht
+
82,4kg
+
+
+ + +1,8 kg +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Wo 1Wo 2Wo 3Wo 4Wo 5Wo 6Wo 7Wo 8 +
+
+ + +
+ + +
+
+

Persönliche Rekorde

+ +
+ +
+
+
+ +
+
+
Bankdrücken
+
82,5 kg × 8 · vor 2 Tagen
+
+
NEU
+
+ +
+
+ +
+
+
Kniebeuge
+
120 kg × 5 · vor 1 Woche
+
+
+5kg
+
+ +
+
+ +
+
+
Kreuzheben
+
140 kg × 5 · vor 2 Wochen
+
+
+2,5kg
+
+
+
+ + +
+
+

Health-Sync

+ Aktiv +
+ +
+
+
+ + Ruhe-Puls +
+
58bpm
+
−3 bpm · 30 Tage
+
+
+
+ + Schlaf Ø +
+
7,2h
+
+0,4 h · 7 Tage
+
+
+
+ + HRV +
+
68ms
+
+5 ms · 30 Tage
+
+
+
+ + Schritte Ø +
+
9,4k
+
+820 · 7 Tage
+
+
+
+ +
+
+ + + + +
+
+ + diff --git a/fabio-antunes-app/prototype/workout.html b/fabio-antunes-app/prototype/workout.html new file mode 100644 index 0000000..fc29c1f --- /dev/null +++ b/fabio-antunes-app/prototype/workout.html @@ -0,0 +1,203 @@ + + + + + + +Push Day A — Fabio Antunes + + + + + + +
+
+
+ +
+ 9:42 +
+ + +
+
+ + +
+ + + +
+
Woche 3 · Tag 2
+
Push Day A
+
+ +
+ + + + + +
+
+ +
+
+
Notiz von Fabio
+
Heute auf saubere Form bei Schulterdrücken achten — lieber 2,5kg weniger als zucken. Letzte Woche war stark!
+
+
+ + +
+
+

Übungen

+ 7 gesamt +
+ +
+ + +
1
+
+ +
+
+
Bankdrücken
+
4 × 8-10 · 80kg · 90s Pause
+
+
+ +
+
+ +
+
2
+
+ +
+
+
Kurzhantel-Schrägbankdrücken
+
3 × 10-12 · 26kg · 75s Pause
+
+
+ +
+
+ +
+
3
+
+ +
+
+
Schulterdrücken (KH)
+
4 × 8-10 · 18kg · 90s Pause
+
Form-Fokus
+
+
+ +
+
+ +
+
4
+
+ +
+
+
Seitheben (Maschine)
+
3 × 12-15 · 20kg · 60s Pause
+
+
+ +
+
+ + +
+ +
SUPERSATZ
+ +
+ +
+
5a
+
+ +
+
+
Trizeps-Pushdown (Seil)
+
3 × 12 · 35kg · 0s Pause
+
+
+ +
+
+ +
+
5b
+
+ +
+
+
Overhead Trizeps (KH)
+
3 × 12 · 15kg · 90s Pause
+
+
+ +
+
+ +
+
6
+
+ +
+
+
Cable Fly
+
3 × 15 · 12kg · 60s Pause
+
Finisher
+
+
+ +
+
+ +
+
+ +
+
+ + + + +
+
+ +