(function () { 'use strict'; var DOMAIN_CONTEXT = { 'food-beverage': { label: '食品与饮料包装', returnHref: 'developer-domain-food.html' }, 'beauty-care': { label: '美妆与个护包装', returnHref: 'developer-domain-beauty.html' }, 'medical-outer': { label: '医药与医疗包装', returnHref: 'developer-domain-medical-outer.html' }, 'special-performance': { label: '特种包装', returnHref: 'developer-domain-specialty.html' } }; var DOMAIN_ALIAS = { food: 'food-beverage', beauty: 'beauty-care', medical: 'medical-outer', specialty: 'special-performance' }; function toArray(list) { return Array.prototype.slice.call(list || []); } function readDomainFromQuery() { var params = new URLSearchParams(window.location.search); var value = params.get('domain') || ''; return DOMAIN_CONTEXT[value] ? value : ''; } function readDomainFromHash() { var value = window.location.hash.replace(/^#/, '').replace(/^domain-/, ''); return DOMAIN_ALIAS[value] || (DOMAIN_CONTEXT[value] ? value : ''); } function createContextBar(domain) { var context = DOMAIN_CONTEXT[domain]; if (!context || document.querySelector('[data-dv23-domain-context]')) return; var anchor = document.querySelector('.dv2-local-nav') || document.querySelector('.dv2-page-intro'); if (!anchor || !anchor.parentNode) return; var bar = document.createElement('aside'); var inner = document.createElement('div'); var label = document.createElement('span'); var title = document.createElement('strong'); var note = document.createElement('p'); var returnLink = document.createElement('a'); var allLink = document.createElement('a'); bar.className = 'dv23-context-bar'; bar.setAttribute('data-dv23-domain-context', domain); bar.setAttribute('aria-label', '当前包装领域上下文'); inner.className = 'dv2-shell dv23-context-bar__inner'; label.textContent = '当前领域'; title.textContent = context.label; note.textContent = '本页是通用专业底座,内容尚未按领域过滤。'; returnLink.href = context.returnHref; returnLink.textContent = '返回该领域'; allLink.href = window.location.pathname.split('/').pop() || window.location.pathname; allLink.textContent = '查看全部'; inner.appendChild(label); inner.appendChild(title); inner.appendChild(note); inner.appendChild(returnLink); inner.appendChild(allLink); bar.appendChild(inner); anchor.parentNode.insertBefore(bar, anchor.nextSibling); document.body.setAttribute('data-domain-context', domain); } function initDomainContext() { var domain = readDomainFromQuery(); if (!domain) return; createContextBar(domain); } function initJourneyNavigation() { var nav = document.querySelector('[data-dv23-journey-nav]'); if (!nav) return; var links = toArray(nav.querySelectorAll('a[href^="#"]')); var items = links.map(function (link) { var target = document.querySelector(link.getAttribute('href')); return target ? { link: link, target: target } : null; }).filter(Boolean); if (!items.length) return; function activate(target) { items.forEach(function (item) { if (item.target === target) item.link.setAttribute('aria-current', 'step'); else item.link.removeAttribute('aria-current'); }); } activate(items[0].target); if (!('IntersectionObserver' in window)) return; var observer = new IntersectionObserver(function (entries) { var visible = entries.filter(function (entry) { return entry.isIntersecting; }); if (!visible.length) return; visible.sort(function (a, b) { return a.boundingClientRect.top - b.boundingClientRect.top; }); activate(visible[0].target); }, { rootMargin: '-28% 0px -58% 0px', threshold: 0 }); items.forEach(function (item) { observer.observe(item.target); }); } function configureSnapRail(element, label, enabled, reduceMotion) { if (!element) return; if (enabled) { element.classList.add('dv23-snap-rail'); element.setAttribute('tabindex', '0'); element.setAttribute('role', 'region'); if (!element.getAttribute('aria-label')) element.setAttribute('aria-label', label); if (!element.hasAttribute('data-dv23-keyboard')) { element.setAttribute('data-dv23-keyboard', 'true'); element.addEventListener('keydown', function (event) { if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return; event.preventDefault(); var direction = event.key === 'ArrowRight' ? 1 : -1; element.scrollBy({ left: direction * element.clientWidth * .78, behavior: reduceMotion ? 'auto' : 'smooth' }); }); } } else { element.classList.remove('dv23-snap-rail'); element.removeAttribute('tabindex'); if (element.hasAttribute('aria-label') || element.hasAttribute('aria-labelledby')) { element.setAttribute('role', 'group'); } else { element.removeAttribute('role'); } } } function initSnapRails() { var media = window.matchMedia('(max-width: 620px)'); var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; var groups = [ { selector: '.dv21-progressive-steps', label: '横向浏览五步开发路径' }, { selector: '.dv2-tool-list', label: '横向浏览开发工具' }, { selector: '.dv21-deep-links', label: '横向浏览专业模块' }, { selector: '.dv21-domain-summary', label: '横向浏览领域摘要' } ]; function update() { groups.forEach(function (group) { toArray(document.querySelectorAll(group.selector)).forEach(function (element) { configureSnapRail(element, group.label, media.matches, reduceMotion); }); }); } update(); if (media.addEventListener) media.addEventListener('change', update); else if (media.addListener) media.addListener(update); } function filterChallenges(domain) { var cards = toArray(document.querySelectorAll('[data-challenge-domain]')); if (!cards.length || !DOMAIN_CONTEXT[domain]) return; var count = 0; cards.forEach(function (card) { var visible = card.getAttribute('data-challenge-domain') === domain; card.hidden = !visible; if (visible) count += 1; }); var status = document.querySelector('[data-dv23-challenge-status]'); if (status) status.textContent = DOMAIN_CONTEXT[domain].label + ':' + count + ' 个公开问题对象'; var projectLink = document.querySelector('[data-dv23-challenge-project]'); if (projectLink) projectLink.href = 'sample.html?domain=' + domain; } function initChallengeFilter() { var controls = toArray(document.querySelectorAll('[data-domain-tab]')); var cards = toArray(document.querySelectorAll('[data-challenge-domain]')); if (!controls.length || !cards.length) return; function activeDomain() { var hashDomain = readDomainFromHash(); if (hashDomain) return hashDomain; var active = document.querySelector('[data-domain-tab][aria-pressed="true"]'); var value = active ? active.getAttribute('data-domain-tab') : 'food'; return DOMAIN_ALIAS[value] || 'food-beverage'; } controls.forEach(function (control) { control.addEventListener('click', function () { var value = control.getAttribute('data-domain-tab'); filterChallenges(DOMAIN_ALIAS[value] || value); }); control.addEventListener('keydown', function (event) { if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' && event.key !== 'Home' && event.key !== 'End') return; window.requestAnimationFrame(function () { filterChallenges(activeDomain()); }); }); }); window.addEventListener('hashchange', function () { filterChallenges(activeDomain()); }); filterChallenges(activeDomain()); } function init() { if (!document.body.classList.contains('dv23-page')) return; initDomainContext(); initJourneyNavigation(); initSnapRails(); initChallengeFilter(); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init(); }());