(function () { 'use strict'; var root = document.documentElement; var body = document.body; if (!body || root.dataset.v7318PackagingGovernance !== 'packaging-family-r1') return; if (window.__DBC_PACKAGING_V7318_GOVERNANCE__) return; window.__DBC_PACKAGING_V7318_GOVERNANCE__ = true; var pendingReadingAnchor = null; var restoreToken = 0; var lastLanguage = ''; function language() { return root.dataset.lang === 'en' || root.lang === 'en' ? 'en' : 'zh'; } function updateLanguageUrl(next) { try { var url = new URL(window.location.href); if (url.searchParams.get('lang') === next) return; url.searchParams.set('lang', next); window.history.replaceState(window.history.state, '', url.pathname + url.search + url.hash); } catch (error) { /* Local file previews and locked-down browsers may not expose History API. */ } } function semanticReadingAnchor() { var header = document.querySelector('.site-header'); var context = document.querySelector('.bp7140-context'); var threshold = (header ? header.getBoundingClientRect().height : 0) + (context ? Math.min(context.getBoundingClientRect().height, 58) : 0) + 28; var candidates = Array.prototype.filter.call( document.querySelectorAll('main section[id], main article[id], main [data-v7318-reading-anchor][id]'), function (element) { var rect = element.getBoundingClientRect(); return rect.height > 0 && rect.bottom > threshold; } ); var selected = null; candidates.forEach(function (element) { var top = element.getBoundingClientRect().top; if (top <= threshold + 24) selected = element; }); if (!selected) selected = candidates[0] || document.getElementById('main-content'); if (!selected || !selected.id) return null; return { id: selected.id, top: selected.getBoundingClientRect().top }; } function restoreReadingAnchor(anchor) { if (!anchor) return; var token = ++restoreToken; window.requestAnimationFrame(function () { window.requestAnimationFrame(function () { if (token !== restoreToken) return; var target = document.getElementById(anchor.id); if (!target) return; var delta = target.getBoundingClientRect().top - anchor.top; if (Math.abs(delta) > 1) window.scrollBy(0, delta); }); }); } function contextualAlt(image, next) { if (!image.dataset.v7318AltZh) image.dataset.v7318AltZh = image.getAttribute('alt') || ''; if (next !== 'en') { image.alt = image.dataset.altZh || image.dataset.altCn || image.dataset.v7318AltZh; return; } if (image.dataset.altEn) { image.alt = image.dataset.altEn; return; } if (image.closest('.site-header, footer')) { image.alt = image.dataset.altCn || image.dataset.altZh || image.dataset.v7318AltZh; return; } var card = image.closest('article, figure, a, section'); var labelNode = card && card.querySelector('[data-en], [data-html-en], h2, h3, strong'); var label = labelNode && (labelNode.dataset.en || labelNode.textContent || '').trim(); image.alt = label ? label.replace(/\s+/g, ' ') + ' · BIOTEN Packaging visual' : 'BIOTEN Packaging engineering visual'; } function syncBilingualAttributes(next) { document.querySelectorAll('.site-header img, main img, footer img').forEach(function (image) { contextualAlt(image, next); }); document.querySelectorAll('[data-aria-zh], [data-aria-cn]').forEach(function (element) { if (!element.dataset.v7318AriaZh) { element.dataset.v7318AriaZh = element.dataset.ariaZh || element.dataset.ariaCn || element.getAttribute('aria-label') || ''; } var value = next === 'en' ? element.dataset.ariaEn : (element.dataset.ariaZh || element.dataset.ariaCn); if (value) element.setAttribute('aria-label', value); }); var ariaDictionary = { '世界杯竞猜官网首页': 'DBC homepage', '博碳包装主页': 'BIOTEN Packaging homepage', '主导航': 'Main navigation', '展开导航': 'Expanded navigation', '快捷入口': 'Quick links', '发布序号': 'Release number', '新应用发布动态': 'New application release stream', '暂停自动播放技术发布': 'Pause automatic release playback', '恢复自动播放技术发布': 'Resume automatic release playback', '文章目录': 'Article contents' }; document.querySelectorAll('[aria-label]').forEach(function (element) { if (!element.dataset.v7318AriaZh) element.dataset.v7318AriaZh = element.getAttribute('aria-label') || ''; var source = element.dataset.v7318AriaZh; if (next === 'en' && ariaDictionary[source]) element.setAttribute('aria-label', ariaDictionary[source]); if (next !== 'en' && source) element.setAttribute('aria-label', source); }); } function syncHiddenState(element) { var hidden = element.hidden || element.getAttribute('aria-hidden') === 'true'; if (hidden) element.setAttribute('inert', ''); else element.removeAttribute('inert'); if ('inert' in element) element.inert = hidden; } function syncNavigationInert() { document.querySelectorAll('.dbc-desktop-mega, .dbc-nav-overlay, .dbc-nav-view').forEach(syncHiddenState); } function governSampleLanguageBoundary() { if (body.dataset.v7318PackagingPage !== 'sample') return; var note = document.querySelector('main > .v770-language-boundary'); var hero = document.querySelector('main > .request-hero'); if (note && hero && note.previousElementSibling !== hero) hero.insertAdjacentElement('afterend', note); } function centerCurrentContextLink() { var current = document.querySelector('.bp7140-context a[aria-current="page"], .bp7140-context a.is-active'); var track = current && current.closest('.bp7140-context__inner'); if (!current || !track) return; var left = current.offsetLeft - (track.clientWidth - current.offsetWidth) / 2; if (typeof track.scrollTo === 'function') track.scrollTo({ left: Math.max(0, left), behavior: 'auto' }); else track.scrollLeft = Math.max(0, left); } function applyRuntimeLanguage(next, shouldRestore) { syncBilingualAttributes(next); updateLanguageUrl(next); centerCurrentContextLink(); if (shouldRestore && pendingReadingAnchor) { restoreReadingAnchor(pendingReadingAnchor); pendingReadingAnchor = null; } lastLanguage = next; } document.addEventListener('click', function (event) { var languageButton = event.target.closest('[data-language-toggle]'); if (languageButton && !languageButton.hasAttribute('data-language-home-fallback')) { pendingReadingAnchor = semanticReadingAnchor(); return; } var skip = event.target.closest('.skip-link[href="#main-content"]'); if (!skip) return; var main = document.getElementById('main-content'); if (!main) return; event.preventDefault(); if (!main.hasAttribute('tabindex')) main.setAttribute('tabindex', '-1'); main.focus({ preventScroll: true }); main.scrollIntoView({ block: 'start', behavior: 'auto' }); try { window.history.replaceState(window.history.state, '', '#main-content'); } catch (error) { /* no-op */ } }, true); document.addEventListener('keydown', function (event) { if (event.key !== 'Escape') return; var trigger = document.querySelector('[data-dbc-nav-open]'); if (!trigger || trigger.getAttribute('aria-expanded') !== 'true') return; window.setTimeout(function () { if (trigger.getAttribute('aria-expanded') !== 'true') return; var close = document.querySelector('.dbc-nav-close'); if (close) close.click(); }, 0); }, true); document.addEventListener('dbc:navigation-open', function () { var attempts = 0; function focusVisibleCloseButton() { var trigger = document.querySelector('[data-dbc-nav-open]'); var close = document.querySelector('.dbc-nav-close'); if (!trigger || trigger.getAttribute('aria-expanded') !== 'true' || !close) return; if (close.offsetParent !== null && window.getComputedStyle(close).visibility === 'visible') { close.focus({ preventScroll: true }); return; } attempts += 1; if (attempts < 8) window.requestAnimationFrame(focusVisibleCloseButton); } window.requestAnimationFrame(focusVisibleCloseButton); }); document.addEventListener('dbc:languagechange', function (event) { var next = event.detail && event.detail.language === 'en' ? 'en' : 'zh'; applyRuntimeLanguage(next, true); }); var languageObserver = new MutationObserver(function () { var next = language(); if (next !== lastLanguage) applyRuntimeLanguage(next, Boolean(pendingReadingAnchor)); }); languageObserver.observe(root, { attributes: true, attributeFilter: ['data-lang', 'lang'] }); var navigationObserver = new MutationObserver(function (records) { records.forEach(function (record) { var target = record.target; if (target.matches && target.matches('.dbc-desktop-mega, .dbc-nav-overlay, .dbc-nav-view')) syncHiddenState(target); if (target.matches && target.matches('.bp7140-context a')) centerCurrentContextLink(); }); }); navigationObserver.observe(document.documentElement, { subtree: true, attributes: true, attributeFilter: ['aria-hidden', 'aria-current', 'class', 'hidden'] }); document.querySelectorAll('[data-bp7151-ticker-track][aria-live]').forEach(function (track) { track.setAttribute('aria-live', 'off'); }); governSampleLanguageBoundary(); window.setTimeout(governSampleLanguageBoundary, 250); syncNavigationInert(); applyRuntimeLanguage(language(), false); root.dataset.v7318PackagingRuntime = 'ready'; }());