@font-face { font-family: "Rajdhani"; font-display: swap; font-weight: 600; src: url("fonts/rajdhani-semibold-webfont.woff") format("woff"); } @font-face { font-family: "Rajdhani"; font-display: swap; font-weight: 700; src: url("fonts/rajdhani-bold-webfont.woff") format("woff"); } * { box-sizing: border-box; } html { font-size: calc(var(--scale, 1) * 10px); } body { display: flex; flex-direction: column; gap: 0.5rem; height: 100vh; margin: 0; padding: 1.4rem 1.6rem; overflow: hidden; font-family: "Rajdhani", sans-serif; font-size: 1.6rem; font-weight: 600; line-height: 1.2; white-space: nowrap; background: rgba(0, 0, 0, 0); color: white; filter: drop-shadow(0 0 0.1rem black) drop-shadow(0 0 0.1rem black); } #overlayStack { position: relative; flex: 1 1 auto; min-height: 0; width: 100%; display: flex; flex-direction: column; } #songOverlay { flex: 1; display: flex; flex-direction: column; gap: 0.5rem; min-height: 0; opacity: 1; transition-property: opacity; transition-timing-function: ease-out; transition-duration: calc(var(--fade, 300) * 1ms); } #requestOverlay { position: absolute; left: 0; right: 0; top: 0; max-height: 100%; overflow: hidden; display: flex; flex-direction: column; gap: 0.45rem; white-space: normal; opacity: 1; transition-property: opacity; transition-timing-function: ease-out; transition-duration: calc(var(--fade, 300) * 1ms); } /* Song panel: hide when not Playing (or loading map meta). Use body.preview to show placeholders (click). */ body.loading #songOverlay, body:not([data-game-state="Playing"], .preview) #songOverlay { opacity: 0; pointer-events: none; } /* Request queue: show when idle (Menu); hide while Playing, preview, or loading map meta */ body[data-game-state="Playing"] #requestOverlay, body.preview #requestOverlay, body.loading #requestOverlay { opacity: 0; pointer-events: none; } #requestHeader { font-size: 2.2rem; font-weight: 700; line-height: 1.1; } #requestList { margin: 0; padding-left: 2.2rem; font-size: 1.5rem; line-height: 1.25; } #requestList:empty { display: none; } #requestList .request-item + .request-item { margin-top: 0.35rem; } #requestEmpty { font-size: 1.45rem; opacity: 0.88; } #requestOverlay.has-items #requestEmpty { display: none; } .request-item { display: list-item; } .request-title { font-weight: 700; } .request-meta { opacity: 0.92; font-size: 1.45rem; } .request-meta::before { content: "· "; } span { align-self: baseline; } span:empty { display: none; } .row { display: flex; gap: 1.6rem; } /* Map info */ #coverImg { width: 6.8rem; height: 6.8rem; margin-bottom: 0.2rem; border-radius: 0.6rem; flex-shrink: 0; filter: url(#gamma); } #mapInfo { display: flex; flex-direction: column; flex-grow: 1; gap: 0.35rem; margin-top: -0.4rem; overflow: hidden; } #mapInfo .row { gap: 0.9rem; } #mapInfo * { overflow: hidden; text-overflow: ellipsis; } #title { font-size: 2.4rem; font-weight: 700; } #subTitle, #difficultyLabel { flex-shrink: 99999; } #mapper::before { content: "‹"; } #mapper::after { content: "›"; } #difficulty { font-size: 1.5rem; } #characteristicImg { width: 1.7rem; height: 1.7rem; flex-shrink: 0; align-self: center; } #difficultyLabel { font-size: 1.4rem; } #type, #bsrKey { font-weight: 700; flex-shrink: 0; } #bsrKey { letter-spacing: 0.2rem; } #bsrKey::before { content: "!bsr "; letter-spacing: normal; } #type:not(:empty) + #bsrKey { display: none; } /* Song time */ #time { display: flex; flex-direction: column; width: 6.8rem; font-size: 1.35rem; text-align: right; line-height: 1.7; letter-spacing: -0.05em; } #timeBar { max-width: 100%; height: 0.2rem; margin-top: -0.2rem; background: currentColor; border-radius: 0.6rem; } #time, #accuracy, #mistakes { font-feature-settings: "tnum"; font-variant-numeric: tabular-nums; } /* Score */ #score { display: contents; } #accuracy { font-size: 2.4rem; font-weight: 700; } #accuracy::after { display: inline-block; content: "%"; font-size: 1.8rem; } #accuracy.failed { text-decoration: line-through red; } #mistakes { display: inline; font-size: 1.8rem; } #mistakes::after { content: "⤫"; } #mistakes:empty::after { content: "FC"; } /* Mutual friend scores */ #friendScores { display: flex; flex-direction: column; gap: 0.3rem; margin-top: 0.1rem; max-width: 44rem; } #friendScoresHeader { font-size: 1.3rem; font-weight: 700; opacity: 0.92; display: flex; align-items: center; gap: 0.45rem; } #friendScoresHeaderImg { width: 2.5rem; height: 2.5rem; object-fit: contain; } #friendScoresList { margin: 0; padding-inline-start: 2rem; font-size: 1.35rem; line-height: 1.2; } #friendScoresList:empty { display: none; } #friendScoresEmpty { font-size: 1.2rem; opacity: 0.82; } #friendScores.has-items #friendScoresEmpty { display: none; } #friendScores.is-loading #friendScoresEmpty { opacity: 1; } .friend-score-item { display: flex; align-items: center; gap: 0.55rem; } .friend-avatar { width: 1.5rem; height: 1.5rem; border-radius: 50%; object-fit: cover; flex-shrink: 0; } .friend-name { flex: 1; min-width: 0; } .friend-acc { font-weight: 700; flex-shrink: 0; } /* Settings */ body:not(.cover) #coverImg, body:not(.mapInfo) #mapInfo, body:not(.time) #time, body:not(.score) #score, body:not(.friends) #friendScores, body:not(.bsr) #bsrKey { display: none; } body.right #songOverlay > .row { flex-direction: row-reverse; } body.right #mapInfo .row { justify-content: flex-end; } body.bottom { flex-direction: column-reverse; } body.bottom #time { flex-direction: column-reverse; } #settings { display: none; position: absolute; top: 50%; transform: translateY(-50%); flex-direction: column; gap: 2px; font-family: system-ui; font-size: 16px; } .preview #settings { display: flex; } #settings label * { float: right; margin-left: 1em; } #settings .debugSongIdRow { display: flex; align-items: baseline; gap: 0.5em; } #debugSongIdInput { flex: 0 0 10rem; width: 10rem; max-width: 50%; } /* One wrapper sets weight; inner