Compare commits

...

7 Commits

Author SHA1 Message Date
iye
8d8451baa3 chore(tos): bump cache version 6 → 7 for 014-2 recrop
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m26s
The closeup studio cello shot (now atmosphere 2 after the swap)
had too much empty ceiling above the head. Recropped from
1440x2560 to 1440x1920 (3:4) with top offset 450px so the head sits
near the top of the frame and the full upper body is visible.

TOS upload: portraits/014-2.webp (overwrite).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 18:40:11 +08:00
iye
aba9eee0c6 chore(tos): bump cache version 5 → 6 for 014 atmosphere swap
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m43s
14号 gallery atmospheres 1 & 2 swapped + atmosphere 1 recropped to 3:4
to frame the upper body. Same TOS URLs with new content, version bump
forces CDN/browsers to refetch.

TOS uploads: portraits/014.webp (overwrite, now wide-orchestra cropped
to 3:4), portraits/014-2.webp (overwrite, now closeup studio shot).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 18:35:19 +08:00
iye
85717d557d chore(tos): bump cache version 4 → 5 for 019-3 image recrop
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 5m12s
019 氛围图3 was pre-cropped from 9:16 (1440x2560) to 3:4 (1440x1920)
to remove the empty bamboo decoration above the head and frame the
upper body. Same URL with new content, so version bump forces CDN +
browsers to refetch.

TOS upload: portraits/019-3.webp (overwrites).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 18:29:07 +08:00
iye
034bb7ff42 chore(ui): drop nav logo + revert hero to default-muted
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 5m30s
- Navigation: removed top-left <Logo />, NavLinks now sit at the
  left edge. Logo component itself kept (still used by Footer /
  LoginForm / LoginModal).
- HeroBanner: restored simple "default muted + autoplay" behavior.
  The earlier try-unmuted-fallback flow was working but produced
  unpredictable first-paint audio depending on browser autoplay
  policy; muted is the safer default.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 18:12:21 +08:00
iye
1236df31b8 chore(content): round 2 v2 corrections + new solo videos
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 5m32s
- 19 (方凌) cover correction: 氛围图3 → 氛围图2
  (original xlsx row was a "12号" typo for 19号 + wrong atmosphere
   number; corrected after teammate review)
- 13 (虞浓) joins CUSTOM_COVERS, will load portraits/013-cover.webp
  (image content = 虞浓_氛围图2)
- Bumped TOS_VERSION 3 → 4 — round-2 TOS uploads include overwrites
  of 006/007/014.mp4 and 019-cover.webp; new browsers/CDN entries.

TOS uploads (handled separately): 013-cover.webp, 019-cover.webp
(overwrite), 006.mp4 (overwrite), 007.mp4 (overwrite), 014.mp4
(overwrite).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 17:57:47 +08:00
iye
74a7b0ea16 feat(ui): polish hero/logo/cards + bump TOS version + drop missing-video flags
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m21s
- Hero eyebrow: "Top 12 · Virtual Idol Debut Project"
  → "Top 12 · Cyber Star Debut Survival"
- Hero video: attempt unmuted autoplay first, fall back to muted on
  browser autoplay-policy block (sound button reflects actual state).
- Logo: replace with cropped v2 art, drop purple drop-shadow glow.
- ArtistCard: drop non-top12 opacity dim AND the top dark gradient
  overlay — new high-quality portraits look better fully exposed.
- mock-data: 003/010/017/027/033 solo videos are present in v2,
  cleared MISSING_VIDEO set so the video section renders for them.
- tos: bump TOS_VERSION to 3 — videos/portraits overwritten on TOS,
  this cache-busts older URLs in browsers and CDNs.

TOS uploads (handled separately): hero-pv.mp4, 5 solo videos
(003/010/017/027/033), 7 cover images, 6/036 atmosphere images.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 17:02:29 +08:00
iye
49be38ff77 chore(content): apply v2 artist adjustments
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m49s
- 021 (温景然) enName RYAN → KINGSTON
  (fixes duplicate: 006 stays RYAN, 021 was a typo)
- 002/003/005/012/014/019/025 now use portraits/{no}-cover.webp
  for the cover (chosen from v2 atmospheres per 调整.xlsx). Gallery
  remains {no}/{no}-2/{no}-3 as before.
- 036 third atmosphere image is now expected (v2 provides it),
  removed MISSING_ATMOSPHERE_3 set.
- tosUrl now appends ?v=2 cache-buster so overwritten TOS files
  refresh immediately instead of waiting on CDN/browser cache.

Note: this commit is paired with TOS uploads (handled separately).
2026-05-15 15:56:13 +08:00
8 changed files with 42 additions and 28 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -35,7 +35,7 @@ export default function HeroBanner({
if (!v || !videoSrc) return;
v.muted = isMuted;
v.play().catch(() => {});
// 仅在 videoSrc 变化时执行 · 不依赖 isMutedmute 切换由按钮处理)
// 仅在 videoSrc 变化时执行 · 不依赖 isMuted(mute 切换由按钮处理)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [videoSrc]);
@ -93,7 +93,7 @@ export default function HeroBanner({
{/* Eyebrow 左上 · 紧贴导航下方 */}
<div className="absolute top-[6.5rem] sm:top-[7.5rem] left-4 sm:left-6 lg:left-8 z-10">
<p className="font-label text-[10px] sm:text-xs tracking-[0.4em] uppercase text-purple-200/90">
Top 12 · Virtual Idol Debut Project
Top 12 · Cyber Star Debut Survival
</p>
</div>

View File

@ -25,9 +25,10 @@ export default function Logo({
// 用原生 <img> 绕开 Next/Image 的格式转换 —— 某些环境下 sharp 把透明 PNG
// 转 webp/avif 时会铺白底,导致 logo 在深色 nav 上出现白色矩形。
// ?v=2 缓存破坏:logo 改版时 +1,浏览器立刻拉新版而不读老缓存。
const inner = (
<img
src="/logo.png"
src="/logo.png?v=3"
alt="CYBER STAR"
decoding="async"
draggable={false}
@ -35,8 +36,6 @@ export default function Logo({
height: `${h}px`,
width: "auto",
background: "transparent",
// 保留紫色辉光,但 drop-shadow 不会引入白底
filter: "drop-shadow(0 0 14px rgba(139,92,246,0.4))",
}}
className={`block select-none ${className}`}
/>

View File

@ -2,7 +2,6 @@
import { useEffect, useState } from "react";
import { usePathname } from "next/navigation";
import Logo from "./Logo";
import NavLinks from "./NavLinks";
import SearchTrigger from "./SearchTrigger";
import AuthMenu from "./auth/AuthMenu";
@ -82,9 +81,7 @@ export default function Navigation() {
)}
/>
<nav className="relative max-w-[1500px] mx-auto h-20 px-4 sm:px-6 lg:px-8 flex items-center gap-8">
<Logo size="md" />
{/* 中部:首页 / 排行榜 / 我的 */}
{/* 左侧:首页 / 排行榜 / 我的(logo 已移除) */}
<NavLinks className="hidden md:flex" />
{/* 右侧:搜索 + 今日余票 + 登录/注册 (或 头像+下拉) */}

View File

@ -40,8 +40,8 @@ export default function ArtistCard({
className="block"
aria-label={`查看 ${artist.name} 详情`}
>
{/* 立绘区13+ 卡片轻度暗化) */}
<div className={cn("relative aspect-[4/5]", !inTop12 && "opacity-[0.78]")}>
{/* 立绘区 · Top12 区分仅靠紫色边框 + 辉光,不再降低非 Top12 卡片亮度 */}
<div className="relative aspect-[4/5]">
<ArtistPortrait
artist={artist}
rounded="rounded-none"
@ -59,9 +59,6 @@ export default function ArtistCard({
>
{artist.rank}
</div>
{/* 顶部轻微渐变蒙层 */}
<div className="absolute inset-x-0 top-0 h-12 bg-gradient-to-b from-black/40 to-transparent pointer-events-none" />
</div>
{/* 信息区(黑色背景明显分隔) */}

View File

@ -324,7 +324,7 @@ export const ARTIST_SEEDS: ArtistSeed[] = [
{
no: `021`,
name: `温景然`,
enName: `RYAN`,
enName: `KINGSTON`,
age: 27,
gender: `M`,
height: 178,

View File

@ -11,22 +11,34 @@ import { tosUrl } from "./tos";
* / store
*/
/** 没有 solo.mp4 的艺人编号docx 标注"缺视频" */
const MISSING_VIDEO: ReadonlySet<string> = new Set(["003", "010", "017", "027"]);
/** solo.mp4 (docx "")
003/010/017/027 v2 ,033 , */
const MISSING_VIDEO: ReadonlySet<string> = new Set<string>();
/** 缺氛围图3 的艺人编号资料文件夹里实际只到氛围图2 */
const MISSING_ATMOSPHERE_3: ReadonlySet<string> = new Set(["036"]);
/**
* 自定义封面:这些艺人的卡片/ cover ,
* 11/2/3
* (.xlsx "封面图用氛围图N" webp
* portraits/{no}-cover.webp, portrait )
*/
const CUSTOM_COVERS: ReadonlySet<string> = new Set([
"002",
"003",
"005",
"012",
"013",
"014",
"019",
"025",
]);
/** 画廊 = 三张氛围图1/2/3。不包含三视图因为长宽比与卡片不一致。 */
function buildGallery(no: string): string[] {
const items = [
return [
tosUrl(`portraits/${no}.webp`),
tosUrl(`portraits/${no}-2.webp`),
tosUrl(`portraits/${no}-3.webp`),
];
if (!MISSING_ATMOSPHERE_3.has(no)) {
items.push(tosUrl(`portraits/${no}-3.webp`));
}
return items;
}
function buildArtists(): Artist[] {
@ -39,7 +51,11 @@ function buildArtists(): Artist[] {
age: seed.age,
gender: seed.gender,
bio: seed.bio,
portrait: tosUrl(`portraits/${seed.no}.webp`),
portrait: tosUrl(
CUSTOM_COVERS.has(seed.no)
? `portraits/${seed.no}-cover.webp`
: `portraits/${seed.no}.webp`,
),
avatar: "",
gallery: buildGallery(seed.no),
videoUrl: MISSING_VIDEO.has(seed.no)

View File

@ -3,16 +3,21 @@
*
* :
* tosUrl("portraits/001.webp")
* https://cyberstar.tos-cn-shanghai.volces.com/cyber-star/portraits/001.webp
* https://cyberstar.tos-cn-shanghai.volces.com/cyber-star/portraits/001.webp?v=2
*
* NEXT_PUBLIC_TOS_DOMAIN :
* .env.local / .env.production + ( scheme, /)
* fallback (/path/...), public/
*
* TOS_VERSION:每次有 TOS (/),
* +1 CDN URL ,
* , TTL invalidate
*/
const TOS_BASE = (process.env.NEXT_PUBLIC_TOS_DOMAIN ?? "").replace(/\/+$/, "");
const TOS_VERSION = "7";
export function tosUrl(path: string): string {
const clean = path.replace(/^\/+/, "");
if (!TOS_BASE) return `/${clean}`;
return `${TOS_BASE}/${clean}`;
const base = TOS_BASE ? `${TOS_BASE}/${clean}` : `/${clean}`;
return `${base}?v=${TOS_VERSION}`;
}