澶у鎴剁敓鏃ョ壒娆?/title> <link rel="stylesheet" href="style.css" /> <!-- publish-version: 2026-07-14-ttl30-5e169c04020c4d2fa6e1024cb081d420 --> </head> <body> <main class="page-shell"> <div class="ambient ambient-one"></div> <div class="ambient ambient-two"></div> <div class="sparkles" aria-hidden="true">鉁︺€€路銆€鉁с€€銆€鉁︺€€路銆€鉁?/div> <section class="phone" aria-label="澶у鎴剁敓鏃ョ壒娆婃椿鍕曢爜"> <header class="hero"> <button class="back" aria-label="杩斿洖">鈥?/button> <div class="balloon balloon-left"><span></span></div> <div class="balloon balloon-right"><span></span></div> <h1>澶у鎴?br><span>鐢熸棩鐗规瑠</span></h1> <button class="rules-btn" id="rulesButton">鐗规瑠瑾槑</button> </header> <div class="mode-switch" aria-label="鍘熷瀷鐙€鎱嬪垏鎻?> <span>闋愯韬唤</span> <button id="modeToggle" class="active"><b>澶у鎴舵湰浜?/b><i><em></em></i></button> </div> <nav class="tabs" aria-label="娲诲嫊鍒嗛爜"> <button id="starsTab" class="selected" aria-selected="true">鏈湀澹芥槦</button> <button id="benefitsTab" aria-selected="false">鐢熸棩绂忓埄</button> </nav> <section class="content stars-panel" id="starsPanel"> <div class="date-simulator" aria-label="妯℃摤鏃ユ湡绡╅伕鍣?> <span>妯℃摤鏃ユ湡</span> <label><select id="simulatedMonth"></select><b>鏈?/b></label> <label><select id="simulatedDay"></select><b>鏃?/b></label> </div> <div class="ranking" id="ranking"></div> </section> <section class="content benefits-panel" id="benefitsPanel" hidden> <article class="benefits-profile vip" id="profileCard"> <div class="profile-title"><span>鉁?/span> 鎴戠殑鐢熸棩</div> <div class="profile-main"> <img src="profile.jpg" alt="鎴戠殑闋儚"> <div class="profile-name" id="profileName"></div> <div class="profile-birthday"><span>鐢熸棩</span><b id="birthdayText">7鏈?21鏃?/b><button id="editBirthday" aria-label="绶ㄨ集鐢熸棩">鉁?/button></div> </div> </article> <section class="benefits-showcase" aria-label="鐢熸棩绂忓埄鍦栫墖瑾槑"> <div class="showcase-heading"><span>鉁?/span><h2>鐢熸棩绂忓埄</h2><span>鉁?/span></div> <div class="benefit-thumbnails" id="benefitThumbnails" role="tablist" aria-label="鐢熸棩绂忓埄閬搁爡"></div> <div class="benefit-stage"> <button class="benefit-arrow previous" id="previousBenefit" aria-label="涓婁竴闋呯鍒?>鈥?/button> <div id="benefitVisual"></div> <button class="benefit-arrow next" id="nextBenefit" aria-label="涓嬩竴闋呯鍒?>鈥?/button> </div> <div class="benefit-caption"><h3 id="benefitTitle"></h3></div> </section> <div class="benefits-heading"><span>鉁?/span><h2>鐢熸棩绂忓埄瑾槑</h2><span>鉁?/span></div> <div class="benefits-table-wrap"> <table class="benefits-table"> <thead><tr><th>鐢熸棩绂忓埄</th><th>LV.1</th><th>LV.2</th><th>LV.3</th></tr></thead> <tbody> <tr><td>鐢熸棩闋儚妗?7d<br>鐢熸棩姘f场*7d<br>鐢熸棩璩囨枡鍗?7d</td><td>鉁?/td><td>鉁?/td><td>鉁?/td></tr> <tr><td>澹芥槦椐曞埌灏剧噲*7d</td><td>鉁?/td><td>鉁?/td><td>鉁?/td></tr> <tr class="icon-row"><td>瀹樻柟寤抽粸鍦栨</td><td><small>鐟伴噾铔嬬硶鍦栨*1</small></td><td><small>鐟伴噾铔嬬硶鍦栨*1<br>鑷伕鈮?0钀懡鐭冲湒妯?1</small></td><td><small>鐟伴噾铔嬬硶鍦栨*1<br>鑷伕鈮?0钀懡鐭冲湒妯?1<br>鑷伕鈮?0钀懡鐭冲湒妯?1<br>鑷伕鈮?00钀懡鐭冲湒妯?1</small></td></tr> <tr><td>灏堝爆鐢熸棩鑳屾櫙*1d</td><td>鉁?/td><td>鉁?/td><td>鉁?/td></tr> <tr><td>瀹樻柟寤崇敓鏃ユ渻</td><td></td><td></td><td>鉁?/td></tr> <tr><td>鍏ㄦ湇鐢熸棩绁濈闁嬪睆*1d</td><td></td><td></td><td>鉁?/td></tr> </tbody> </table> </div> <p class="benefits-note"><b>娉ㄦ剰锛?/b>鐢熸棩瑁濇壆锛堥牠鍍忔銆佹埃娉°€佽硣鏂欏崱銆佸熬鐕堬級鏈冩寜鐓у€嬩汉璩囨枡濉鐨勭敓鏃ワ紝鏂肩暥澶?榛炶嚜鍕曠櫦鏀俱€傚叾浠栫敓鏃ョ鍒╄珛鑱公绠″绯曠硶锛圛D锛?99锛夌櫦鏀撅紝閫炬湡涓嶄簣瑁滅櫦銆?/p> </section> </section> <div class="modal-backdrop" id="editModal" role="presentation" hidden> <section class="modal" role="dialog" aria-modal="true" aria-labelledby="edit-title"> <div class="modal-icon">鈾?/div><button class="close" id="closeEdit">脳</button> <h2 id="edit-title">淇敼鐢熸棩鏃ユ湡</h2> <p class="modal-copy">璜嬬⒑瑾嶆偍鍦ㄧ暥鍓嶉爜闈㈢殑鐢熸棩璩囪▕锛屾瘡鍊嬭嚜鐒跺勾鍍呭彲淇敼涓€娆°€傜暥鍓嶄慨鏀逛笉褰遍熆鍊嬩汉璩囨枡闋佺殑鐢熸棩璩囪▕銆?/p> <div class="date-fields"> <label>鏈堜唤<select id="monthSelect"></select><span>鏈?/span></label> <label>鏃ユ湡<select id="daySelect"></select><span>鏃?/span></label> </div> <div class="modal-actions"> <button class="cancel" id="cancelEdit">鏆笉淇敼</button> <button class="confirm" id="saveBirthday">纰鸿獚淇敼</button> </div> </section> </div> <div class="modal-backdrop" id="rulesModal" role="presentation" hidden> <section class="modal rules-modal" role="dialog" aria-modal="true" aria-labelledby="rules-title"> <div class="modal-icon">鉁?/div><button class="close" id="closeRules">脳</button> <h2 id="rules-title">鐗规瑠瑾槑</h2> <ol class="rules-content"> <li>鐢熸棩鐣跺ぉ闇€淇濇湁澶у鎴惰韩浠斤紝鎵嶅彲闋樺彇鐢熸棩绂忓埄銆傝嫢鐢熸棩鐣跺ぉ鐒″ぇ瀹㈡埗韬唤锛屽墖鐒℃硶闋樺彇銆?/li> <li>鐢熸棩鏃ユ湡鍙埌鍊嬩汉璩囨枡闋佽嚜琛屼慨鏀癸紝姣忔淇敼闇€鑺辫不1000閼界煶銆傜敓鏃ヨ鎵渻鎸夌収鍊嬩汉璩囨枡濉鐨勭敓鏃ワ紝鏂肩暥澶?榛炶嚜鍕曠櫦鏀俱€傚叾浠栫敓鏃ョ鍒╄珛鑱公绠″绯曠硶锛圛D锛?99锛夌櫦鏀撅紝閫炬湡涓嶄簣瑁滅櫦銆?/li> <li>姣忎綅澶у鎴舵瘡骞村儏鍙牁鍙?娆$敓鏃ョ鍒╋紝涓嶅彲澶氭闋樺彇銆?span class="rules-emphasis">鑻ヤ粖骞村凡缍撻牁鍙栭亷鐢熸棩绂忓埄锛屼慨鏀圭敓鏃ヤ笉鑳藉啀娆¢牁鍙栫敓鏃ョ鍒┿€?/span></li> <li>榛炲湒妯欑鍒╀笉鑳介伕鐣跺墠姝e湪涓婃灦鐨勫湒妯欙紝闇€鍒板畼鏂瑰怀锛圛D锛?99锛夋敹鍦栨锛屼笖鏀剁Ξ蹇冨嫊涓嶇祼绠椼€傚儏闄愮敓鏃ュぇ瀹㈡埗甯宠櫉鏀跺湒妯欙紝涓嶅彲杞夎磮鍏朵粬浜恒€?/li> </ol> </section> </div> <div class="toast" id="toast" role="status" hidden></div> </main> <script> const stars = [ { name: "鏋楃煡澶?, date: "7鏈?03鏃?, avatar: "star-1.jpg", crown: true }, { name: "闄虫槦濡?, date: "7鏈?08鏃?, avatar: "star-2.jpg" }, { name: "娌堣伩鐧?, date: "7鏈?12鏃?, avatar: "star-3.jpg" }, { name: "铇囨櫄鏅?, date: "7鏈?18鏃?, avatar: "star-4.jpg" }, { name: "椤ц█宸?, date: "7鏈?26鏃?, avatar: "star-5.jpg" } ]; const benefitSlides = [ { title: "鐢熸棩闋儚妗?7d\n鐢熸棩姘f场*7d\n鐢熸棩璩囨枡鍗?7d", description: "", image: "appearance-kit.png" }, { title: "澹芥槦椐曞埌灏剧噲*7d", description: "", image: "tail-light.png" }, { title: "瀹樻柟寤抽粸鍦栨", description: "", image: "icon-gifts.png" }, { title: "灏堝爆鐢熸棩鑳屾櫙*1d", description: "" }, { title: "瀹樻柟寤崇敓鏃ユ渻", description: "LV.3 澶у鎴跺彲鐛插緱瀹樻柟寤崇敓鏃ユ渻灏堝爆绂亣銆? }, { title: "鍏ㄦ湇鐢熸棩绁濈闁嬪睆*1d", description: "" } ]; const state = { tab: "stars", simulatedMonth: "7", simulatedDay: "13", benefitIndex: 0, ownerMode: true, birthday: "7鏈?21鏃?, month: "7", day: "21" }; const $ = (id) => document.getElementById(id); function getDateValue(date) { const match = date.match(/(\d+)鏈圽s*(\d+)鏃?); return match ? Number(match[1]) * 100 + Number(match[2]) : 0; } function showToast(text) { const toast = $("toast"); toast.textContent = text; toast.hidden = false; window.clearTimeout(showToast.timer); showToast.timer = window.setTimeout(() => { toast.hidden = true; }, 2200); } function renderTabs() { $("starsTab").classList.toggle("selected", state.tab === "stars"); $("starsTab").setAttribute("aria-selected", state.tab === "stars"); $("benefitsTab").classList.toggle("selected", state.tab === "benefits"); $("benefitsTab").setAttribute("aria-selected", state.tab === "benefits"); $("starsPanel").hidden = state.tab !== "stars"; $("benefitsPanel").hidden = state.tab !== "benefits"; } function renderStars() { $("simulatedMonth").value = state.simulatedMonth; $("simulatedDay").value = state.simulatedDay; const simulatedDateValue = Number(state.simulatedMonth) * 100 + Number(state.simulatedDay); const rows = stars .map((star) => { const dateValue = getDateValue(star.date); return { star, dateValue, expired: dateValue < simulatedDateValue }; }) .sort((a, b) => { if (a.expired !== b.expired) return a.expired ? 1 : -1; return a.expired ? b.dateValue - a.dateValue : a.dateValue - b.dateValue; }) .map(({ star, expired }, index) => '<article class="star-row ' + (expired ? "expired" : "") + '">' + '<div class="rank rank-' + (index + 1) + '">' + (index + 1) + '</div>' + '<div class="avatar-wrap">' + (star.crown ? '<span class="crown">鈾?/span>' : '') + '<img src="' + star.avatar + '" alt="' + star.name + '鐨勯牠鍍?></div>' + '<div class="identity"><h3>' + star.name + '</h3><p><span>鉁?/span> 鐢熸棩銉? + star.date + '</p></div>' + (expired ? '' : '<button class="bless-btn" data-name="' + star.name + '"><span>馃巶</span> 绁濈TA</button>') + '</article>').join(""); $("ranking").innerHTML = rows; document.querySelectorAll(".bless-btn").forEach((button) => { button.onclick = () => showToast("姝e湪鍓嶅線鑸?" + button.dataset.name + " 鐨勭鑱娾€?); }); } function renderProfile() { $("modeToggle").classList.toggle("active", state.ownerMode); $("modeToggle").querySelector("b").textContent = state.ownerMode ? "澶у鎴舵湰浜? : "鏅€氳í瀹?; $("profileCard").className = "benefits-profile " + (state.ownerMode ? "vip" : "locked-profile"); $("profileName").innerHTML = "<h2>瑷辨竻姝?" + (state.ownerMode ? "<b>LV.3</b>" : "") + "</h2>" + (state.ownerMode ? "" : "<p>鏈В閹栧ぇ瀹㈡埗韬唤</p>"); $("birthdayText").textContent = state.birthday; } function renderBenefits() { $("benefitThumbnails").innerHTML = benefitSlides.map((benefit, index) => '<button class="' + (index === state.benefitIndex ? "active" : "") + '" role="tab" aria-selected="' + (index === state.benefitIndex) + '" aria-label="' + benefit.title + '" data-index="' + index + '">' + (benefit.image ? '<img src="' + benefit.image + '" alt="">' : "<span>鉁?/span>") + '</button>').join(""); document.querySelectorAll("#benefitThumbnails button").forEach((button) => { button.onclick = () => { state.benefitIndex = Number(button.dataset.index); renderBenefits(); }; }); const current = benefitSlides[state.benefitIndex]; $("benefitVisual").innerHTML = current.image ? '<img src="' + current.image + '" alt="' + current.title + '">' : '<div class="benefit-blank"><span>鉁?/span><p>绂忓埄鍦栫墖寰呰鍏?/p></div>'; $("benefitTitle").textContent = current.title; } function openEdit() { showToast("姝e湪鍓嶅線鍊嬩汉璩囨枡绶ㄨ集闋佲€?); } function closeEdit() { $("editModal").hidden = true; } function renderAll() { renderTabs(); renderStars(); renderProfile(); renderBenefits(); } for (let index = 1; index <= 12; index++) $("monthSelect").insertAdjacentHTML("beforeend", "<option>" + index + "</option>"); for (let index = 1; index <= 31; index++) $("daySelect").insertAdjacentHTML("beforeend", "<option>" + index + "</option>"); for (let index = 1; index <= 12; index++) $("simulatedMonth").insertAdjacentHTML("beforeend", "<option>" + index + "</option>"); for (let index = 1; index <= 31; index++) $("simulatedDay").insertAdjacentHTML("beforeend", "<option>" + index + "</option>"); $("starsTab").onclick = () => { state.tab = "stars"; renderTabs(); }; $("benefitsTab").onclick = () => { state.tab = "benefits"; renderTabs(); }; $("simulatedMonth").onchange = () => { state.simulatedMonth = $("simulatedMonth").value; renderStars(); }; $("simulatedDay").onchange = () => { state.simulatedDay = $("simulatedDay").value; renderStars(); }; $("modeToggle").onclick = () => { state.ownerMode = !state.ownerMode; renderProfile(); }; $("rulesButton").onclick = () => { $("rulesModal").hidden = false; }; $("closeRules").onclick = () => { $("rulesModal").hidden = true; }; $("rulesModal").onclick = (event) => { if (event.target.id === "rulesModal") $("rulesModal").hidden = true; }; $("editBirthday").onclick = openEdit; $("closeEdit").onclick = closeEdit; $("cancelEdit").onclick = closeEdit; $("editModal").onclick = (event) => { if (event.target.id === "editModal") closeEdit(); }; $("saveBirthday").onclick = () => { state.month = $("monthSelect").value; state.day = $("daySelect").value; state.birthday = state.month + "鏈?" + state.day.padStart(2, "0") + "鏃?; closeEdit(); renderProfile(); showToast("鐢熸棩宸叉洿鏂帮紝鏄庡勾鍙啀娆′慨鏀?); }; $("previousBenefit").onclick = () => { state.benefitIndex = (state.benefitIndex + benefitSlides.length - 1) % benefitSlides.length; renderBenefits(); }; $("nextBenefit").onclick = () => { state.benefitIndex = (state.benefitIndex + 1) % benefitSlides.length; renderBenefits(); }; renderAll(); </script> <!--__BP_ANCHORS__-->