/* Base */ * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; } /* Plugin settings collapsibles use a custom SVG chevron — hide the browser's default disclosure triangle so we don't get two indicators side-by-side. */ .plugin-settings-summary { list-style: none; } .plugin-settings-summary::-webkit-details-marker { display: none; } .plugin-settings-summary::marker { content: ''; } /* Screens */ .screen { display: none; } .screen.active { display: block; } /* Player is special — needs flex column for canvas + controls */ #player.active { display: flex; flex-direction: column; height: 100dvh; position: fixed; inset: 0; z-index: 100; background: #050508; } #highway { flex: 1; width: 100%; min-height: 0; } /* The section_map plugin injects #section-map as #player's first child, a ~20px bar pinned to top:0. #player-hud is also top:0/absolute but at a higher z-index, so its song name (top-left) and timer (top-right) would paint on top of that bar. When the bar is present, push the HUD's content below it, preserving the HUD's original py-3 (0.75rem) inset *under* the bar (bar height + py-3). The general-sibling combinator only matches when #section-map precedes #player-hud — which is exactly how the plugin inserts it (#highway sits between them) — so the bar-less layout is untouched. ID-on-ID specificity overrides Tailwind's .py-3 top padding. */ #section-map ~ #player-hud { padding-top: calc(20px + 0.75rem); } /* Player controls need their own stacking context so visualization plugins that paint absolutely-positioned overlays (e.g. the bundled 3D Highway's WebGL wrap at z-index:2, or any community viz plugin) don't paint over the picker / mixer / lyrics toggle. Without this, the bottom controls bar would silently sit underneath the canvas and become click-through invisible. Folds in the fix from got-feedback/feedBack#99. */ /* The footer pins the section-practice bar + transport row to the bottom of #player. margin-top:auto lives here (not on #player-controls) so the bar, which now sits outside #player-controls, stays directly above the row. */ #player-footer { position: relative; z-index: 10; margin-top: auto; } #player-controls { position: relative; } /* Section Practice collapses behind a pill; the multi-row bar is a popover. */ .section-practice-control { position: relative; display: flex; padding: 4px 12px; } .section-practice-control.section-practice-control--hidden { display: none; } .section-practice-pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 9999px; font-size: 12px; font-weight: 600; color: #cbd5e1; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.12); cursor: pointer; transition: background 0.15s, border-color 0.15s, color 0.15s; } .section-practice-pill:hover { background: rgba(255, 255, 255, 0.12); color: #fff; } .section-practice-pill[aria-expanded="true"] { background: rgba(64, 128, 224, 0.18); border-color: rgba(64, 128, 224, 0.5); color: #bfdbfe; } .section-practice-pill.section-practice-pill--active { border-color: #4080e0; color: #93c5fd; } .section-practice-pill-icon { font-size: 13px; line-height: 1; } .section-practice-pill-caret { font-size: 10px; opacity: 0.8; } /* The bar is now an absolutely-positioned popover anchored above the pill. */ #section-practice-bar { display: none; position: absolute; left: 12px; bottom: calc(100% + 6px); z-index: 60; width: max-content; max-width: min(640px, calc(100vw - 32px)); flex-direction: column; align-items: stretch; gap: 4px; padding: 10px 12px; border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(12, 12, 22, 0.98); box-shadow: 0 12px 30px rgba(0, 0, 0, 0.5); pointer-events: auto !important; } #section-practice-bar.section-practice-bar--open { display: flex; } /* v3 chrome: the pill rides the left icon rail; popover opens to its right. */ .section-practice-control--v3 { padding: 0; } .section-practice-control--v3 .section-practice-pill-text, .section-practice-control--v3 .section-practice-pill-caret { display: none; } .section-practice-control--v3 #section-practice-bar { left: calc(100% + 8px); right: auto; bottom: auto; top: 0; } .section-practice-mode-wrap { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; user-select: none; flex-shrink: 0; font-size: 11px; color: #9ca3af; } .section-practice-mode-wrap input[type="checkbox"] { accent-color: #4080e0; } .section-practice-mode-text { font-weight: 600; letter-spacing: 0.02em; } .section-practice-mode-wrap:has(input:checked) .section-practice-mode-text { color: #93c5fd; } .section-practice-controls-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; width: 100%; } .section-practice-chips-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; width: 100%; min-width: 0; } .section-practice-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; width: 100%; min-width: 0; } .section-practice-label { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280; flex-shrink: 0; } .section-practice-scroll { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; min-width: 0; flex: 1 1 auto; } .section-practice-chip { font-size: 11px; line-height: 1.2; padding: 3px 8px; border-radius: 6px; border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(255, 255, 255, 0.04); color: #d1d5db; cursor: pointer; transition: background 0.12s, border-color 0.12s, color 0.12s; flex-shrink: 0; } .section-practice-chip:hover { background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); } .section-practice-chip.section-practice-chip--intro:not(.is-selected):not(.is-playing) { background: rgba(96, 165, 250, 0.1); border-color: rgba(96, 165, 250, 0.28); color: #93c5fd; } .section-practice-chip.section-practice-chip--verse:not(.is-selected):not(.is-playing) { background: rgba(52, 211, 153, 0.1); border-color: rgba(52, 211, 153, 0.28); color: #6ee7b7; } .section-practice-chip.section-practice-chip--chorus:not(.is-selected):not(.is-playing) { background: rgba(251, 191, 36, 0.1); border-color: rgba(251, 191, 36, 0.3); color: #fcd34d; } .section-practice-chip.section-practice-chip--bridge:not(.is-selected):not(.is-playing) { background: rgba(167, 139, 250, 0.1); border-color: rgba(167, 139, 250, 0.3); color: #c4b5fd; } .section-practice-chip.section-practice-chip--solo:not(.is-selected):not(.is-playing) { background: rgba(244, 114, 182, 0.1); border-color: rgba(244, 114, 182, 0.3); color: #f9a8d4; } .section-practice-chip.section-practice-chip--riff:not(.is-selected):not(.is-playing) { background: rgba(163, 230, 53, 0.12); border-color: rgba(163, 230, 53, 0.3); color: #bef264; } .section-practice-chip.section-practice-chip--outro:not(.is-selected):not(.is-playing) { background: rgba(148, 163, 184, 0.12); border-color: rgba(148, 163, 184, 0.32); color: #cbd5e1; } .section-practice-chip.is-playing { border-color: rgba(64, 128, 224, 0.55); box-shadow: 0 0 0 1px rgba(64, 128, 224, 0.25); } .section-practice-chip.is-selected { background: rgba(64, 128, 224, 0.22); border-color: rgba(96, 165, 250, 0.55); color: #e0f2fe; } .section-practice-chip.is-playing.is-selected { background: rgba(64, 128, 224, 0.32); } .section-practice-piece-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; width: 100%; } .section-practice-piece-label { font-size: 11px; color: #9ca3af; min-width: 5.5rem; flex-shrink: 0; } .section-practice-whole-wrap { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: #9ca3af; cursor: pointer; user-select: none; flex-shrink: 0; } .section-practice-whole-wrap input[type="checkbox"] { accent-color: #4080e0; } .section-practice-whole-text { font-weight: 500; } .button-icon-svg { width: 14px; height: 14px; vertical-align: middle; display: inline-block; } /* Song cards */ .song-card { background: linear-gradient(145deg, #10101e 0%, #0d0d18 100%); border: 1px solid rgba(255,255,255,0.04); border-radius: 16px; overflow: hidden; cursor: pointer; transition: all 0.25s ease; } .song-card:hover { border-color: rgba(64,128,224,0.2); transform: translateY(-4px); box-shadow: 0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px rgba(64,128,224,0.1); } /* Keyboard-focused card: ring without the lift, since the lift is a pointer affordance and would feel jumpy when arrow-keying through. :focus is a fallback for environments without :focus-visible support so keyboard users always see SOMETHING; modern browsers that do support :focus-visible only show the ring on keyboard focus, not on click, because the same rule applies via the more specific :focus-visible selector below. */ .song-card { outline: none; } .song-card:focus, .song-card:focus-visible { border-color: rgba(64,128,224,0.7); box-shadow: 0 0 0 2px rgba(64,128,224,0.5), 0 0 24px rgba(64,128,224,0.3); } /* In :focus-visible-supporting browsers, suppress the focus ring on click-derived focus so card hover/selection stays the dominant visual on mouse use. */ .song-card:focus:not(:focus-visible) { border-color: rgba(255,255,255,0.04); box-shadow: none; } /* Persistent selection (survives focus loss). Slightly heavier than focus alone so the user can glance back and still see where they were after clicking away. */ .song-card.selected { border-color: rgba(64,128,224,0.6); box-shadow: 0 0 0 2px rgba(64,128,224,0.4), 0 8px 32px rgba(64,128,224,0.18); } /* When a selected card also has keyboard-visible focus, keep the persistent selection styling but restore a stronger focus ring so keyboard focus remains visually distinct from selection. */ .song-card.selected:focus-visible { border-color: rgba(64,128,224,0.7); box-shadow: 0 0 0 3px rgba(64,128,224,0.55), 0 0 24px rgba(64,128,224,0.3), 0 8px 32px rgba(64,128,224,0.18); } /* In :focus-visible-supporting browsers, keep click-focused selected cards looking selected without reintroducing the stronger focus ring. */ .song-card.selected:focus:not(:focus-visible) { border-color: rgba(64,128,224,0.6); box-shadow: 0 0 0 2px rgba(64,128,224,0.4), 0 8px 32px rgba(64,128,224,0.18); } .song-card .card-art { aspect-ratio: 1; background: linear-gradient(135deg, #1a1a30 0%, #0f0f1e 100%); display: flex; align-items: center; justify-content: center; overflow: hidden; position: relative; } .song-card .card-art img { width: 100%; height: 100%; object-fit: cover; } .song-card .card-art .placeholder { font-size: 3rem; opacity: 0.15; } /* Library tree */ .artist-row { background: linear-gradient(145deg, #10101e 0%, #0d0d18 100%); border: 1px solid rgba(255,255,255,0.04); border-radius: 12px; overflow: hidden; transition: border-color 0.2s; } .artist-row:hover { border-color: rgba(64,128,224,0.15); } .artist-header { display: flex; align-items: center; gap: 12px; padding: 12px 16px; cursor: pointer; user-select: none; outline: none; } .artist-header:focus, .artist-header:focus-visible { background: rgba(64,128,224,0.14); box-shadow: inset 0 0 0 2px rgba(64,128,224,0.55); } .artist-header:focus:not(:focus-visible) { background: transparent; box-shadow: none; } .artist-header.selected { background: rgba(64,128,224,0.10); box-shadow: inset 3px 0 0 rgba(64,128,224,0.7); } .artist-header.selected:focus-visible { background: rgba(64,128,224,0.14); box-shadow: inset 3px 0 0 rgba(64,128,224,0.7), inset 0 0 0 2px rgba(64,128,224,0.55); } .artist-header.selected:focus:not(:focus-visible) { background: rgba(64,128,224,0.10); box-shadow: inset 3px 0 0 rgba(64,128,224,0.7); } .artist-header .chevron { transition: transform 0.2s; color: #555; flex-shrink: 0; } .artist-row.open .artist-header .chevron { transform: rotate(90deg); } .artist-body { display: none; padding: 0 12px 12px; } .artist-row.open .artist-body { display: block; } .album-group { background: rgba(255,255,255,0.02); border-radius: 10px; margin-bottom: 6px; overflow: hidden; } .album-header { display: flex; align-items: center; gap: 10px; padding: 8px 12px; cursor: pointer; user-select: none; outline: none; } .album-header:focus, .album-header:focus-visible { background: rgba(64,128,224,0.13); box-shadow: inset 0 0 0 2px rgba(64,128,224,0.5); } .album-header:focus:not(:focus-visible) { background: transparent; box-shadow: none; } .album-header.selected { background: rgba(64,128,224,0.09); box-shadow: inset 3px 0 0 rgba(64,128,224,0.6); } .album-header.selected:focus-visible { background: rgba(64,128,224,0.13); box-shadow: inset 3px 0 0 rgba(64,128,224,0.6), inset 0 0 0 2px rgba(64,128,224,0.5); } .album-header.selected:focus:not(:focus-visible) { background: rgba(64,128,224,0.09); box-shadow: inset 3px 0 0 rgba(64,128,224,0.6); } .album-header .chevron { transition: transform 0.2s; color: #444; flex-shrink: 0; } .album-group.open .album-header .chevron { transform: rotate(90deg); } .album-body { display: none; padding: 0 8px 8px; } .album-group.open .album-body { display: block; } .album-art-sm { width: 36px; height: 36px; border-radius: 6px; object-fit: cover; background: #1a1a2e; flex-shrink: 0; } .song-row { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 8px; cursor: pointer; transition: background 0.15s; outline: none; } .song-row:hover { background: rgba(64,128,224,0.08); } .song-row:focus, .song-row:focus-visible { background: rgba(64,128,224,0.14); box-shadow: 0 0 0 1px rgba(64,128,224,0.5); } .song-row:focus:not(:focus-visible) { background: transparent; box-shadow: none; } .song-row.selected { background: rgba(64,128,224,0.12); box-shadow: inset 2px 0 0 rgba(64,128,224,0.7); } .song-row.selected:focus-visible { background: rgba(64,128,224,0.14); box-shadow: inset 2px 0 0 rgba(64,128,224,0.7), 0 0 0 1px rgba(64,128,224,0.5); } .song-row.selected:focus:not(:focus-visible) { background: rgba(64,128,224,0.12); box-shadow: inset 2px 0 0 rgba(64,128,224,0.7); } /* Search result items */ .result-item { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: #10101e; border: 1px solid rgba(255,255,255,0.03); border-radius: 12px; cursor: pointer; transition: all 0.15s; } .result-item:hover { background: #181830; border-color: rgba(64,128,224,0.15); } /* Progress bar */ .progress-bar { height: 6px; background: #1a1a2e; border-radius: 999px; overflow: hidden; } .progress-bar .fill { height: 100%; background: linear-gradient(90deg, #4080e0, #60a0ff); border-radius: 999px; transition: width 0.3s ease; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* Scrollbar */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: #2a2a50; border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: #3a3a60; } /* Mobile controls */ @media (max-width: 640px) { #player-controls { gap: 4px; padding: 6px; } #player-controls button { padding: 4px 8px; font-size: 11px; } } /* Library filter drawer (feedBack#129/#69) */ #lib-filter-drawer.open { transform: translateX(0); } #lib-filter-drawer .filter-pill { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 500; border: 1px solid rgba(75, 85, 99, 0.5); background: #181830; color: #d1d5db; cursor: pointer; user-select: none; transition: background 0.15s, border-color 0.15s, color 0.15s; } #lib-filter-drawer .filter-pill:hover { border-color: rgba(64, 128, 224, 0.5); } #lib-filter-drawer .filter-pill.state-require { border-color: rgba(34, 197, 94, 0.7); background: rgba(34, 197, 94, 0.15); color: #86efac; } #lib-filter-drawer .filter-pill.state-exclude { border-color: rgba(248, 113, 113, 0.7); background: rgba(248, 113, 113, 0.15); color: #fca5a5; } #lib-filter-drawer .filter-pill.state-disabled { opacity: 0.4; cursor: not-allowed; } #lib-filter-drawer .filter-pill::before { content: ''; display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: rgba(156, 163, 175, 0.4); } #lib-filter-drawer .filter-pill.state-require::before { background: #22c55e; } #lib-filter-drawer .filter-pill.state-exclude::before { background: #f87171; /* tiny minus indicator: use a horizontal bar instead of dot */ width: 12px; height: 2px; border-radius: 1px; } #lib-filter-drawer .tuning-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; border-radius: 6px; cursor: pointer; font-size: 13px; color: #d1d5db; } #lib-filter-drawer .tuning-row:hover { background: rgba(64, 128, 224, 0.1); } #lib-filter-drawer .tuning-row .tuning-count { margin-left: auto; font-size: 11px; color: #6b7280; } /* Active-filter chips row */ #lib-filter-chips { display: none; } #lib-filter-chips:not(.hidden) { display: flex; } #lib-filter-chips .chip { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px 3px 10px; border-radius: 999px; font-size: 12px; background: #1e1e3a; border: 1px solid rgba(75, 85, 99, 0.5); color: #d1d5db; } #lib-filter-chips .chip.chip-exclude { border-color: rgba(248, 113, 113, 0.5); color: #fca5a5; } #lib-filter-chips .chip button { margin-left: 4px; padding: 0 4px; color: #6b7280; font-weight: bold; line-height: 1; } #lib-filter-chips .chip button:hover { color: #fff; } /* Audio mixer popover — centered faders with symmetric inset; scrolling lives on the popover so the scrollbar does not carve space only on one side of .mixer-row. */ #mixer-popover:not(.hidden) { display: flex; flex-direction: column; align-items: center; width: fit-content; max-width: 90vw; min-width: 0; box-sizing: border-box; /* Single symmetric inset (replaces Tailwind p-3 on the node). */ padding: 12px; overflow-x: auto; overflow-y: visible; } #mixer-popover .mixer-strip { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 0; /* Same column width — fit-content strips differ when labels differ (“Song” vs “Amp…”), which pushes fader tracks closer to one edge of the popover despite justify-content:center. */ width: 110px; flex: 0 0 auto; box-sizing: border-box; } #mixer-popover .mixer-strip-label { font-size: 11px; color: #9ca3af; max-width: 80px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: center; } #mixer-popover .mixer-strip-fader { width: 110px; height: 24px; margin: 55px 0 0 0; /* Push the fader down so the track is centered under the label text */ padding: 0; vertical-align: middle; transform: rotate(-90deg); transform-origin: center; -webkit-appearance: none; background: transparent; cursor: pointer; } #mixer-popover .mixer-strip-fader::-webkit-slider-runnable-track { height: 16px; /* Match the Firefox ::-moz-range-track height so the fader renders consistently across browsers */ background: linear-gradient(to right, rgb(var(--sm-accent, 64, 128, 224)) var(--range-pct, 0%), rgb(var(--sm-bg-900, 10, 10, 18)) var(--range-pct, 0%)); border-radius: 8px; border: 1px solid rgb(55 65 81 / var(--tw-border-opacity, 1)); } #mixer-popover .mixer-strip-fader::-webkit-slider-thumb { -webkit-appearance: none; height: 0px; width: 0px; background: #ffffff; border-radius: 0px; margin-top: 9px; opacity: 0; } /* --- Firefox --- */ #mixer-popover .mixer-strip-fader::-moz-range-track { height: 16px; background: linear-gradient(to right, rgb(var(--sm-accent, 64, 128, 224)) var(--range-pct, 0%), rgb(var(--sm-bg-900, 10, 10, 18)) var(--range-pct, 0%)); border-radius: 8px; border: 1px solid rgb(55 65 81 / var(--tw-border-opacity, 1)); } #mixer-popover .mixer-strip-fader::-moz-range-thumb { height: 0px; width: 0px; background: #ffffff; border-radius: 0px; border: 0; } #mixer-popover .mixer-strip-value { font-size: 10px; color: #6b7280; font-variant-numeric: tabular-nums; margin-top: 55px; } @supports ((-webkit-appearance: slider-vertical) or (appearance: slider-vertical)) { #mixer-popover .mixer-strip-fader { width: 24px; height: 110px; transform: none; transform-origin: center; writing-mode: vertical-lr; direction: rtl; -webkit-appearance: slider-vertical; appearance: slider-vertical; margin: 0; } #mixer-popover .mixer-strip-fader::-webkit-slider-runnable-track { height: auto; /* Vertical slider: let the track span the full length instead of the fixed 16px used by the rotated fallback */ background: linear-gradient(to top, rgb(var(--sm-accent, 64, 128, 224)) var(--range-pct, 0%), rgb(var(--sm-bg-900, 10, 10, 18)) var(--range-pct, 0%)); border-radius: 8px; } #mixer-popover .mixer-strip-value { margin-top: 0; } } #mixer-popover .mixer-row { display: flex; justify-content: center; align-items: stretch; gap: 12px; flex: 0 0 auto; width: max-content; overflow: visible; flex-wrap: nowrap; min-height: 134px; /* Fix for incorrect height in firefox */ } /* ////// start sliders /////// */ .slider-input { -webkit-appearance: none; background: transparent; cursor: pointer; } /* --- Webkit Browsers --- */ .slider-input::-webkit-slider-runnable-track { height: 26px; background: linear-gradient(to right, rgb(var(--sm-accent, 64, 128, 224)) var(--range-pct, 0%), rgb(var(--sm-bg-600, 35, 35, 50)) var(--range-pct, 0%)); border-radius: 8px; border: 1px solid rgb(55 65 81 / var(--tw-border-opacity, 1)); } .slider-input::-webkit-slider-thumb { -webkit-appearance: none; height: 22px; width: 12px; background: #ffffff; border-radius: 4px; margin-top: 1px; cursor: grab; box-shadow: 0 0 0 1px rgb(0 0 0 / 0.4); } .slider-input::-webkit-slider-thumb:active { cursor: grabbing; } /* --- Firefox --- */ .slider-input::-moz-range-track { height: 26px; background: linear-gradient(to right, rgb(var(--sm-accent, 64, 128, 224)) var(--range-pct, 0%), rgb(var(--sm-bg-600, 35, 35, 50)) var(--range-pct, 0%)); border-radius: 8px; border: 1px solid rgb(55 65 81 / var(--tw-border-opacity, 1)); } .slider-input::-moz-range-thumb { height: 22px; width: 12px; background: #ffffff; border-radius: 4px; border: 0; cursor: grab; box-shadow: 0 0 0 1px rgb(0 0 0 / 0.4); } .slider-input::-moz-range-thumb:active { cursor: grabbing; } /* ////// end sliders /////// */ /* ── Notation-view hint ────────────────────────────────────────────────── One-shot overlay shown by _autoMatchViz() when a notation-only arrangement (no wire notes) falls back to the built-in highway. Positioned over #player (fixed flex column, see layout invariants). */ .notation-view-hint { position: absolute; top: 4rem; left: 50%; transform: translateX(-50%); z-index: 60; max-width: 34rem; padding: 0.75rem 2.25rem 0.75rem 1rem; border-radius: 0.5rem; border: 1px solid rgb(var(--sm-accent, 64, 128, 224)); background: rgb(var(--sm-bg-600, 35, 35, 50) / 0.95); color: #e5e7eb; font-size: 0.875rem; line-height: 1.4; box-shadow: 0 4px 16px rgb(0 0 0 / 0.5); } .notation-view-hint-close { position: absolute; top: 0.25rem; right: 0.5rem; background: none; border: 0; color: #9ca3af; font-size: 1.1rem; cursor: pointer; } .notation-view-hint-close:hover { color: #e5e7eb; } .notation-view-hint-close:focus { outline: none; } .notation-view-hint-close:focus-visible { outline: none; color: #e5e7eb; box-shadow: 0 0 0 2px rgba(64, 128, 224, 0.7); border-radius: 0.25rem; } /* Feedpak contributor credits shown over the highway when a song loads (manifest `authors:`, spec §5.4). Anchored to the upper third so it sits ABOVE the vertically-centered count-in number; click-through. */ .song-credits-overlay { position: fixed; left: 0; right: 0; top: 15%; /* Above the modal layer (z-[200], incl. the "Loading audio" backdrop) and the count-in number (z-[100]) so the credits stay prominent through the whole load → count-in → play window. */ z-index: 205; display: flex; justify-content: center; pointer-events: none; animation: song-credits-fade-in 0.45s cubic-bezier(0.16, 1, 0.3, 1); } .song-credits-card { position: relative; min-width: 16rem; max-width: min(90vw, 34rem); padding: 1.4rem 2.5rem 1.5rem; text-align: center; background: radial-gradient(120% 140% at 50% 0%, rgb(56 78 130 / 0.45) 0%, transparent 60%), linear-gradient(165deg, rgb(23 30 48 / 0.92) 0%, rgb(11 15 26 / 0.94) 100%); border: 1px solid rgb(129 140 248 / 0.28); border-radius: 1rem; box-shadow: 0 18px 50px rgb(0 0 0 / 0.55), 0 0 0 1px rgb(0 0 0 / 0.35), inset 0 1px 0 rgb(255 255 255 / 0.07); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); } /* Accent bar across the top edge of the card. */ .song-credits-card::before { content: ""; position: absolute; top: 0; left: 50%; transform: translateX(-50%); width: 3.25rem; height: 3px; border-radius: 0 0 3px 3px; background: linear-gradient(90deg, #38bdf8, #818cf8); box-shadow: 0 0 12px rgb(99 102 241 / 0.7); } .song-credits-eyebrow { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.22em; text-transform: uppercase; color: rgb(165 180 252 / 0.9); margin-bottom: 0.4rem; } .song-credits-heading { font-size: 1.3rem; font-weight: 800; color: #f8fafc; margin-bottom: 0.7rem; letter-spacing: 0.01em; text-shadow: 0 1px 8px rgb(0 0 0 / 0.5); } .song-credits-line { font-size: 1.1rem; line-height: 1.55; color: #e2e8f0; } .song-credits-role { color: rgb(148 163 184 / 0.95); font-weight: 500; } .song-credits-name { font-weight: 700; color: #ffffff; } @keyframes song-credits-fade-in { from { opacity: 0; transform: translateY(-12px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } }