(function (){
'use strict';
var labels=window.xnrsHomeFront||{};
function setLabel(button, mode){
var text=button&&button.querySelector('[data-xnhs-theme-text]');
if(text) text.textContent=mode==='dark' ? (labels.lightLabel||'昼'):(labels.darkLabel||'夜');
}
function copyEntryToPreview(preview, source){
if(!preview||!source||preview===source) return;
preview.innerHTML=source.innerHTML;
var href=source.getAttribute('href');
if(href!==null) preview.setAttribute('href', href); else preview.removeAttribute('href');
var target=source.getAttribute('target');
if(target!==null) preview.setAttribute('target', target); else preview.removeAttribute('target');
var rel=source.getAttribute('rel');
if(rel!==null) preview.setAttribute('rel', rel); else preview.removeAttribute('rel');
preview.setAttribute('data-xnhs-preview-source', source.getAttribute('data-xnhs-gallery-index')||'');
}
function bindEntryGallery(root){
if(!root||root.getAttribute('data-xnhs-entry-gallery')!=='1'||root.__xnhsGalleryBound) return;
root.__xnhsGalleryBound=true;
var grid=root.querySelector('.xnhs-entry-grid');
if(!grid) return;
var cards=[].slice.call(grid.querySelectorAll('.xnhs-entry-card'));
if(cards.length < 2) return;
var preview=cards[0];
var mobileQuery=window.matchMedia ? window.matchMedia('(max-width: 767px)'):{ matches: window.innerWidth <=767 };
var thumbs=cards.slice(1, 4);
cards.forEach(function (card, index){ card.setAttribute('data-xnhs-gallery-index', String(index)); });
preview.setAttribute('data-xnhs-preview-source', '0');
function activate(source){
copyEntryToPreview(preview, source);
thumbs.forEach(function (thumb){
thumb.classList.toggle('is-preview-active', thumb===source);
thumb.setAttribute('aria-pressed', thumb===source ? 'true':'false');
});
}
thumbs.forEach(function (thumb){
thumb.setAttribute('role', 'button');
thumb.setAttribute('tabindex', '0');
thumb.setAttribute('aria-pressed', 'false');
});
grid.addEventListener('click', function (event){
var card=event.target.closest('.xnhs-entry-card');
if(!card||thumbs.indexOf(card)===-1||!mobileQuery.matches) return;
event.preventDefault();
event.stopPropagation();
activate(card);
});
grid.addEventListener('keydown', function (event){
if(event.key!=='Enter'&&event.key!==' ') return;
var card=event.target.closest('.xnhs-entry-card');
if(!card||thumbs.indexOf(card)===-1||!mobileQuery.matches) return;
event.preventDefault();
activate(card);
});
var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if(reduce||root.getAttribute('data-xnhs-entry-auto')!=='1') return;
var delay=parseInt(root.getAttribute('data-xnhs-entry-interval')||'3500', 10);
if(!delay||delay < 1200) delay=3500;
var timer=null, activeIndex=-1;
function schedule(){
if(timer) window.clearTimeout(timer);
timer=null;
if(document.hidden) return;
timer=window.setTimeout(function (){
activeIndex=(activeIndex + 1) % thumbs.length;
activate(thumbs[activeIndex]);
schedule();
}, delay);
}
document.addEventListener('visibilitychange', schedule);
schedule();
}
function bindSoupCarousel(root){
if(!root||root.__xnhsSoupBound) return;
root.__xnhsSoupBound=true;
var track=root.querySelector('.xnhs-grid');
if(!track) return;
var cards=[].slice.call(track.querySelectorAll('.xnhs-soup-card'));
if(!cards.length) return;
if(root.classList.contains('xnhs-soup--wave-5')&&window.innerWidth >=768) return;
var activeCard=cards[0];
var resizeTimer=null;
var scrollTimer=null;
var mobileQuery=window.matchMedia ? window.matchMedia('(max-width: 767px)'):{ matches: window.innerWidth <=767 };
function setActive(card){
activeCard=card;
cards.forEach(function (item){
var active=item===card;
item.classList.toggle('is-soup-active', active);
item.setAttribute('aria-selected', active ? 'true':'false');
});
}
function targetFor(card){
var index=cards.indexOf(card);
if(index < 0) return track.scrollLeft;
var maxScroll=Math.max(0, track.scrollWidth - track.clientWidth);
var trackRect=track.getBoundingClientRect();
var cardRect=card.getBoundingClientRect();
var currentCardLeft=cardRect.left - trackRect.left + track.scrollLeft;
var target=currentCardLeft - (track.clientWidth - cardRect.width) / 2;
return Math.max(0, Math.min(maxScroll, target));
}
function centerCard(card, behavior){
if(!card||cards.indexOf(card)===-1) return;
setActive(card);
var target=targetFor(card);
if(typeof track.scrollTo==='function'){
track.scrollTo({ left: target, behavior: behavior||'smooth' });
}else{
track.scrollLeft=target;
}}
cards.forEach(function (card){
card.setAttribute('role', 'option');
card.setAttribute('tabindex', '0');
card.setAttribute('aria-selected', 'false');
});
track.setAttribute('role', 'listbox');
centerCard(cards[0], 'auto');
track.addEventListener('click', function (event){
var card=event.target.closest('.xnhs-soup-card');
if(!card||cards.indexOf(card)===-1) return;
if(card!==activeCard){
event.preventDefault();
event.stopPropagation();
centerCard(card, 'smooth');
}});
track.addEventListener('keydown', function (event){
var card=event.target.closest('.xnhs-soup-card');
if(!card||cards.indexOf(card)===-1) return;
var index=cards.indexOf(card), next=null;
if(event.key==='ArrowRight') next=cards[Math.min(cards.length - 1, index + 1)];
else if(event.key==='ArrowLeft') next=cards[Math.max(0, index - 1)];
else if(event.key==='Home') next=cards[0];
else if(event.key==='End') next=cards[cards.length - 1];
else if(event.key==='Enter'||event.key===' ') next=card;
if(!next) return;
event.preventDefault();
centerCard(next, 'smooth');
try { next.focus({ preventScroll: true });} catch (error){ next.focus(); }});
function activateNearest(){
if(!mobileQuery.matches) return;
var trackRect=track.getBoundingClientRect();
var center=trackRect.left + trackRect.width / 2;
var nearest=cards[0], distance=Infinity;
cards.forEach(function (card){
var rect=card.getBoundingClientRect();
var current=Math.abs((rect.left + rect.width / 2) - center);
if(current < distance){ distance=current; nearest=card; }});
setActive(nearest);
}
track.addEventListener('scroll', function (){
if(!mobileQuery.matches) return;
window.clearTimeout(scrollTimer);
scrollTimer=window.setTimeout(activateNearest, 55);
}, { passive: true });
track.addEventListener('touchend', function (){
window.clearTimeout(scrollTimer);
scrollTimer=window.setTimeout(activateNearest, 30);
}, { passive: true });
window.addEventListener('resize', function (){
window.clearTimeout(resizeTimer);
resizeTimer=window.setTimeout(function (){
centerCard(activeCard, 'auto');
}, 120);
});
}
function bindNoticeRotator(root){
if(!root||root.__xnhsNoticeBound) return;
root.__xnhsNoticeBound=true;
var items=[].slice.call(root.querySelectorAll('[data-xnhs-notice-item]'));
if(!items.length) return;
if(window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches){
items.forEach(function (item, index){ item.classList.toggle('is-active', index===0); });
return;
}
var index=0, timer=null, token=0;
var holdSeconds=parseFloat(root.getAttribute('data-xnhs-notice-speed')||'4');
if(!holdSeconds||holdSeconds < 1) holdSeconds=4;
var startPercent=parseFloat(root.getAttribute('data-xnhs-notice-start')||'50');
if(isNaN(startPercent)) startPercent=50;
startPercent=Math.max(0, Math.min(100, startPercent));
var moveSpeed=parseFloat(root.getAttribute('data-xnhs-notice-move-speed')||'90');
if(!moveSpeed||moveSpeed < 30) moveSpeed=90;
moveSpeed=Math.max(30, Math.min(360, moveSpeed));
function clearTimer(){ if(timer) window.clearTimeout(timer); timer=null; }
function resetTrack(item){
var track=item&&item.querySelector('.xnhs-notice__scroll');
if(!track) return null;
track.style.transition='none';
track.style.transform='translateX(0px)';
item.classList.remove('is-marquee');
return track;
}
function scheduleNext(delay, currentToken){
clearTimer();
if(!delay||delay <=0||document.hidden) return;
timer=window.setTimeout(function (){
if(currentToken!==token) return;
if(items.length > 1) activate(index + 1);
else run(items[index], ++token);
}, delay);
}
function run(item, currentToken){
var track=resetTrack(item);
if(!track||document.hidden) return;
window.requestAnimationFrame(function (){
if(currentToken!==token||document.hidden) return;
var viewWidth=root.clientWidth||0, textWidth=track.scrollWidth||0;
if(textWidth > viewWidth + 8){
item.classList.add('is-marquee');
var startX=Math.round(viewWidth * (startPercent / 100));
var distance=startX + textWidth + 24;
var duration=Math.max(2200, Math.round((distance / moveSpeed) * 1000));
track.style.transition='none';
track.style.transform='translateX(' + startX + 'px)';
track.offsetHeight;
track.style.transition='transform ' + duration + 'ms linear';
track.style.transform='translateX(-' + (textWidth + 24) + 'px)';
scheduleNext(duration + 260, currentToken);
} else scheduleNext(items.length > 1 ? Math.round(holdSeconds * 1000):0, currentToken);
});
}
function activate(next){
clearTimer(); token++;
var old=items[index];
index=(next + items.length) % items.length;
var current=items[index];
items.forEach(function (item){
if(item!==old&&item!==current){
item.classList.remove('is-active', 'is-entering', 'is-leaving', 'is-marquee');
resetTrack(item);
}});
if(old&&old!==current){
old.classList.remove('is-active', 'is-entering');
old.classList.add('is-leaving'); resetTrack(old);
}
current.classList.add('is-entering'); current.classList.remove('is-leaving'); resetTrack(current);
current.offsetHeight; current.classList.add('is-active'); current.classList.remove('is-entering');
window.setTimeout(function (){ if(old&&old!==current) old.classList.remove('is-leaving'); }, 520);
run(current, token);
}
items.forEach(function (item, itemIndex){ item.classList.toggle('is-active', itemIndex===0); resetTrack(item); });
run(items[0], ++token);
document.addEventListener('visibilitychange', function (){
if(document.hidden) clearTimer(); else run(items[index], ++token);
});
}
function init(){
document.querySelectorAll('[data-xnhs-theme-toggle]').forEach(function (button){
setLabel(button, document.documentElement.getAttribute('data-xnhs-theme')||'light');
});
document.querySelectorAll('[data-xnhs-entry-gallery]').forEach(bindEntryGallery);
document.querySelectorAll('.xnhs-soup').forEach(bindSoupCarousel);
document.querySelectorAll('[data-xnhs-notice-rotator]').forEach(bindNoticeRotator);
}
if(document.readyState==='loading') document.addEventListener('DOMContentLoaded', init);
else init();
document.addEventListener('click', function (event){
var button=event.target.closest('[data-xnhs-theme-toggle]');
if(!button) return;
event.preventDefault();
var root=document.documentElement;
var next=root.getAttribute('data-xnhs-theme')==='dark' ? 'light':'dark';
root.setAttribute('data-xnhs-theme', next);
try { localStorage.setItem('xnhs2Theme', next); } catch (error){}
try { window.dispatchEvent(new CustomEvent('xnhs2-theme-change', { detail: next })); } catch (error){}
setLabel(button, next);
});
})();