        .pattern-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: var(--sp-lg);
        }

        .strum-3d-section {
            display: grid;
            grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
            align-items: center;
            gap: var(--sp-lg);
            overflow: hidden;
        }

        .strum-3d-section[hidden],
        .strum-3d-scene canvas[hidden],
        .strum-3d-fallback[hidden] {
            display: none;
        }

        .strum-3d-copy {
            display: grid;
            justify-items: start;
            gap: var(--sp-sm);
        }

        .strum-3d-copy h2 {
            font-size: var(--text-xl);
        }

        .strum-3d-copy p,
        .strum-3d-cue span {
            font-size: var(--text-sm);
            color: var(--text-secondary);
        }

        .strum-3d-scene {
            position: relative;
            height: 280px;
            min-width: 0;
            overflow: hidden;
            border: 1px solid var(--border);
            border-radius: var(--r-md);
            background: radial-gradient(ellipse at center, var(--bg-elevated), var(--bg-base));
        }

        .strum-3d-scene canvas {
            display: block;
            width: 100%;
            height: 100%;
            touch-action: pan-y;
        }

        .strum-3d-fallback {
            position: absolute;
            inset: 0;
            display: grid;
            place-items: center;
            padding: var(--sp-lg);
            color: var(--text-secondary);
            text-align: center;
        }

        .strum-3d-hud {
            position: absolute;
            inset: 8px;
            display: flex;
            justify-content: space-between;
            align-items: flex-start;
            pointer-events: none;
            z-index: 2;
        }

        .strum-3d-hud .cam-presets-bar {
            display: inline-flex;
            gap: 4px;
            background: rgba(10, 14, 26, 0.75);
            backdrop-filter: blur(12px);
            padding: 3px;
            border-radius: var(--r-full);
            border: 1px solid rgba(255, 255, 255, 0.12);
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);
            pointer-events: auto;
        }

        .strum-3d-hud .btn-cam {
            background: transparent;
            border: none;
            color: var(--text-primary);
            font-size: 11px;
            font-weight: 600;
            padding: 3px 8px;
            border-radius: var(--r-full);
            cursor: pointer;
            transition: all 0.15s ease;
            white-space: nowrap;
        }

        .strum-3d-hud .btn-cam:hover {
            background: rgba(255, 255, 255, 0.12);
            color: #fff;
        }

        .strum-3d-hud .btn-cam.active {
            background: var(--accent-fill);
            color: #fff;
            box-shadow: 0 0 8px var(--accent-glow);
        }

        .strum-3d-hud .btn-cam.btn-mirror-toggle.active {
            background: var(--warning, #f59e0b);
            color: #0b0e17;
            font-weight: 700;
        }

        .strum-actions-bar {
            display: inline-flex;
            gap: 6px;
            pointer-events: auto;
        }

        .strum-3d-cue {
            grid-column: 1 / -1;
            display: flex;
            justify-content: space-between;
            gap: var(--sp-md);
            padding: var(--sp-sm) var(--sp-md);
            border-radius: var(--r-sm);
            background: var(--accent-soft);
        }

        .strum-3d-cue strong {
            color: var(--text-accent);
            font-size: var(--text-sm);
        }

        .strum-3d-cue span {
            text-align: right;
        }

        .pattern-card h2 {
            font-size: var(--text-lg);
            font-weight: 700;
            margin-bottom: 0.15rem;
        }

        .pattern-svg {
            display: flex;
            justify-content: center;
            overflow-x: auto;
            padding: 0.5rem 0;
            background: var(--bg-elevated);
            border-radius: var(--r-md);
            margin: var(--sp-md) 0;
        }

        .pattern-legend {
            display: flex;
            gap: var(--sp-md);
            justify-content: center;
            flex-wrap: wrap;
            margin-top: var(--sp-md);
            padding-top: var(--sp-sm);
            border-top: 1px solid var(--border);
        }

        .pattern-legend span {
            font-size: var(--text-sm);
            color: var(--text-muted);
            display: flex;
            align-items: center;
            gap: 0.3rem;
        }

        .strum-arrow {
            transition: all 0.2s;
        }

        .slot-hl {
            transition: opacity 0.08s linear;
        }

        .pattern-actions {
            display: flex;
            gap: var(--sp-sm);
            margin-top: var(--sp-md);
        }

        .pattern-actions .btn {
            flex: 1;
        }

        .tempo-bar {
            display: flex;
            align-items: center;
            gap: var(--sp-sm);
            background: var(--bg-elevated);
            border: 1px solid var(--border);
            border-radius: var(--r-md);
            padding: var(--sp-sm) var(--sp-md);
            flex-wrap: wrap;
        }

        .tempo-bar label {
            font-size: var(--text-sm);
            color: var(--text-muted);
            white-space: nowrap;
        }

        .tempo-bar input[type="range"] {
            flex: 1;
            min-width: 100px;
            accent-color: var(--text-accent);
        }

        .tempo-bar .tempo-value {
            font-family: 'JetBrains Mono', monospace;
            font-size: var(--text-sm);
            color: var(--text-secondary);
            min-width: 65px;
            text-align: right;
            font-weight: 600;
        }

        .tempo-nudge {
            min-width: 32px;
            padding: 2px 8px;
            font-weight: 700;
            font-family: 'JetBrains Mono', monospace;
        }

        .tap-tempo-btn {
            font-weight: 600;
            font-size: var(--text-xs);
            padding: var(--sp-xs) var(--sp-sm);
            white-space: nowrap;
        }

        .speed-presets {
            display: inline-flex;
            gap: 2px;
            background: var(--bg-surface);
            border: 1px solid var(--border);
            border-radius: var(--r-full);
            padding: 2px;
        }

        .speed-btn {
            border-radius: var(--r-full);
            padding: 2px 8px;
            font-size: var(--text-xs);
            font-weight: 600;
        }

        .speed-btn.active {
            background: var(--accent);
            color: #ffffff;
        }

        .tip-box {
            background: var(--warning-soft);
            border: 1px solid rgba(251, 191, 110, 0.15);
            border-radius: var(--r-md);
            padding: var(--sp-md) var(--sp-lg);
            text-align: center;
            font-size: var(--text-sm);
            color: var(--text-secondary);
            line-height: 1.6;
        }

        .tip-box svg,
        .tip-box [data-icon] {
            display: inline-block;
            width: 1.15em;
            height: 1.15em;
            vertical-align: -0.2em;
            margin-right: var(--sp-xs);
        }

        .diff-badge {
            font-size: var(--text-xs);
            font-weight: 600;
            padding: 0.2rem 0.5rem;
            border-radius: 4px;
            font-family: 'JetBrains Mono', monospace;
            text-transform: uppercase;
            letter-spacing: 0.08em;
            display: inline-block;
            margin-left: 0.5rem;
            vertical-align: middle;
        }

        .diff-easy { color: var(--success-text); background: var(--success-soft); }
        .diff-medium { color: var(--warning-text); background: var(--warning-soft); }
        .diff-hard { color: var(--error-text); background: var(--error-soft); }

        .legend-down { color: var(--success-text); font-weight: 700; }
        .legend-up { color: var(--text-accent); font-weight: 700; }
        .legend-chuck { color: var(--warning-text); font-weight: 700; }
        .legend-rest { color: var(--text-muted); }
        @media (max-width: 700px) {
            .strum-3d-section {
                grid-template-columns: 1fr;
                gap: var(--sp-md);
            }

            .strum-3d-scene {
                height: 240px;
            }

            .strum-3d-cue {
                grid-column: auto;
                flex-direction: column;
            }

            .strum-3d-cue span {
                text-align: left;
            }
        }

        .live-coach-card { border: 1px solid var(--border); }
        .live-coach-controls { display: flex; gap: var(--sp-sm); flex-wrap: wrap; align-items: end; margin-bottom: var(--sp-md); }
        .live-coach-controls select { background: var(--bg-elevated); color: var(--text-primary); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 0.4rem 0.6rem; }
        .live-meter { position: relative; height: 10px; background: var(--bg-elevated); border-radius: 99px; overflow: hidden; margin: var(--sp-sm) 0; border: 1px solid var(--border); }
        .live-meter-fill { height: 100%; width: 0%; background: var(--accent); transition: width 0.15s; }
        .live-needle { position: absolute; top: -2px; bottom: -2px; width: 3px; background: var(--success); left: 50%; border-radius: 2px; }
        .live-feedback { display: flex; gap: var(--sp-md); align-items: center; background: var(--bg-elevated); border-radius: var(--r-md); padding: var(--sp-md); }
        .live-score { font-size: 1.4rem; font-weight: 800; }
        .live-dots { display: flex; gap: 6px; flex-wrap: wrap; margin-top: var(--sp-sm); }
        .live-dot { width: 14px; height: 14px; border-radius: 50%; background: var(--border); }
        .live-dot.hit { background: var(--success); } .live-dot.miss { background: var(--error); } .live-dot.now { outline: 2px solid var(--accent); }

        /* ── Pattern Style Filter Bar ─────────────────── */
        .pattern-filter-bar {
            display: flex;
            gap: var(--sp-sm);
            flex-wrap: wrap;
            align-items: center;
        }

        .filter-tab {
            display: inline-flex;
            align-items: center;
            gap: 6px;
            font-size: var(--text-xs);
            font-weight: 600;
            border-radius: var(--r-full);
            padding: 6px 14px;
            transition: all 0.2s ease;
        }

        .pattern-category-pill {
            display: inline-block;
            font-size: var(--text-xs);
            font-weight: 700;
            padding: 0.2rem 0.5rem;
            border-radius: 4px;
            font-family: 'JetBrains Mono', monospace;
            text-transform: uppercase;
            letter-spacing: 0.08em;
            margin-left: 0.4rem;
            vertical-align: middle;
            color: var(--text-accent);
            background: rgba(96, 165, 250, 0.12);
            border: 1px solid rgba(96, 165, 250, 0.25);
        }

        .pattern-category-pill.pill-fingerpick {
            color: var(--warning-text);
            background: rgba(245, 158, 11, 0.12);
            border-color: rgba(245, 158, 11, 0.28);
        }

        .legend-finger-p { color: var(--warning-text); font-weight: 700; font-family: 'JetBrains Mono', monospace; }
        .legend-finger-i { color: var(--success-text); font-weight: 700; font-family: 'JetBrains Mono', monospace; }
        .legend-finger-m { color: var(--text-accent); font-weight: 700; font-family: 'JetBrains Mono', monospace; }
        .legend-finger-a { color: #f472b6; font-weight: 700; font-family: 'JetBrains Mono', monospace; }

        /* ── Real-Time Pocket Meter (Micro-Timing Oscilloscope) ── */
        .pocket-meter-wrap {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--r-md);
            padding: var(--sp-md);
        }
        .pocket-track {
            position: relative;
            height: 14px;
            background: rgba(15, 23, 42, 0.6);
            border-radius: var(--r-full);
            overflow: hidden;
            margin: 8px 0;
            border: 1px solid rgba(255, 255, 255, 0.1);
        }
        .pocket-center-line {
            position: absolute;
            left: 50%;
            top: 0;
            bottom: 0;
            width: 2px;
            background: rgba(255, 255, 255, 0.35);
            transform: translateX(-50%);
        }
        .pocket-zone-target {
            position: absolute;
            left: 35%;
            width: 30%;
            top: 0;
            bottom: 0;
            background: rgba(16, 185, 129, 0.18);
            border-left: 1px dashed rgba(16, 185, 129, 0.5);
            border-right: 1px dashed rgba(16, 185, 129, 0.5);
        }
        .pocket-dot {
            position: absolute;
            top: 50%;
            left: 50%;
            width: 14px;
            height: 14px;
            border-radius: 50%;
            background: var(--success);
            box-shadow: 0 0 10px var(--success);
            transform: translate(-50%, -50%);
            transition: left 0.1s ease-out, background 0.15s ease;
        }
        .stroke-articulation-banner {
            display: flex;
            align-items: center;
            gap: 12px;
            background: var(--bg-surface);
            border: 1px solid var(--border);
            border-radius: var(--r-md);
            padding: 10px 14px;
        }
        .stroke-arrow {
            font-size: 24px;
            font-weight: 800;
            color: var(--text-accent);
            line-height: 1;
        }

