const SITE_THEME_STORAGE_KEY = 'dbc-site-theme'; const SITE_LANGUAGE_STORAGE_KEY = 'dbc-site-language'; const LEGACY_REQUEST_STORAGE_KEY = 'biotenRequestFormLast'; const FORM_PRIVACY_NOTICE_VERSION = '2026-07-15'; const SITE_LANGUAGE_PACK_FILES = ['assets/js/site-en-core.js?v=20260715-bioten-packaging-label1']; applyBaseSiteTheme(); applySavedSiteLanguage(); document.addEventListener('DOMContentLoaded', () => { markUnifiedPage(); initSiteLanguageToggle(); syncBiotenHeroDarkMode(); const params = new URLSearchParams(window.location.search); const intent = params.get('intent') || params.get('from'); if (intent) { const field = document.querySelector('[name="intent"]'); if (field) field.value = intent; } document.querySelectorAll('form[data-demo]').forEach(form => { form.addEventListener('submit', event => { event.preventDefault(); form.querySelector('[data-status]').textContent = document.documentElement.dataset.lang === 'en' ? 'Saved as a demo lead for future CRM / CMS integration.' : '已记录为演示线索,可在后续接入 CRM / CMS。'; }); }); const saveButton = document.querySelector('[data-save-page-pdf]'); if (saveButton) { saveButton.addEventListener('click', () => savePageAsPdf(saveButton)); } initHomeReveals(); initBiotenFloatingIcons(); initHomepageCardTilt(); initHomeNewsViewToggle(); initNewsCardImageLinks(); initBrandSphereControl(); initSectionNavState(); initBackToTop(); initNewsArticleEnhancements(); initBiotenRequestForm(); initSiteNavigation(); }); document.addEventListener('dbc:translations-loaded', () => { if (isEnglishReadyPage() && document.documentElement.dataset.lang === 'en') { translatePageLanguage('en'); scheduleSiteLanguageRefreshes(); } }); const SITE_LANGUAGE_DICTIONARY = Object.freeze({ "菜单": "Menu", "世界杯竞猜官网": "DBC", "世界杯竞猜官网首页": "DBC Home", "博碳循环": "BIOTEN", "博碳": "BIOTEN", "主导航": "Main navigation", "博碳生物": "BIOTEN", "博碳包装": "BIOTEN Packaging", "博碳开发者": "BIOTEN Developer", "新闻动态": "Newsroom", "资料中心": "Resource Center", "知识与标准": "Knowledge & Standards", "联系合作": "Contact", "网站地图": "Sitemap", "隐私与数据使用说明": "Privacy & Data Use Notice", "查看": "View", "查看详情": "View details", "了解更多": "Learn more", "联系咨询": "Contact us", "提交": "Submit", "重置": "Reset", "复制": "Copy", "下载": "Download", "回到顶部": "Back to top", "返回顶部": "Back to top", "中文": "中文", "英文": "English", "中": "中", "英": "EN" }); const SITE_LANGUAGE_ATTRIBUTE_NAMES = ['aria-label', 'title', 'alt', 'placeholder', 'content']; const SITE_LANGUAGE_SKIP_SELECTOR = 'script,style,noscript,template,svg,canvas,code,pre'; const SITE_PRODUCT_NAME_REPLACEMENTS = [ ['01 / Bioten™ Plus(通用候选路线)', 'Bioten™ Plus'], ['02 / Bioten™ Pro(定制协同路线)', 'Bioten™ Pro'], ['03 / Bioten™ Ultra(专项验证路线)', 'Bioten™ Ultra'], ['Bioten™ Plus(通用候选路线)', 'Bioten™ Plus'], ['Bioten™ Pro(定制协同路线)', 'Bioten™ Pro'], ['Bioten™ Ultra(专项验证路线)', 'Bioten™ Ultra'], ['(通用候选路线)', ''], ['(定制协同路线)', ''], ['(专项验证路线)', ''], ['通用候选路线', 'Bioten™ Plus'], ['定制协同路线', 'Bioten™ Pro'], ['专项验证路线', 'Bioten™ Ultra'] ]; let siteLanguageMutationObserver = null; let siteLanguageMutationTimer = 0; let siteLanguagePacksRequested = false; let siteLanguageIsTranslating = false; function applyBaseSiteTheme() { document.documentElement.dataset.theme = 'light'; document.documentElement.style.colorScheme = 'light'; } function getStoredSiteLanguage() { if (!isEnglishReadyPage()) return 'zh'; try { return localStorage.getItem(SITE_LANGUAGE_STORAGE_KEY) === 'en' ? 'en' : 'zh'; } catch (error) { return 'zh'; } } function applySavedSiteLanguage(language = getStoredSiteLanguage()) { const lang = isEnglishReadyPage() && language === 'en' ? 'en' : 'zh'; document.documentElement.dataset.lang = lang; document.documentElement.lang = lang === 'en' ? 'en' : 'zh-CN'; } function isEnglishReadyPage() { const htmlFlag = document.documentElement.getAttribute('data-en-ready'); const bodyFlag = document.body ? document.body.getAttribute('data-en-ready') : null; return htmlFlag === '' || htmlFlag === 'true' || bodyFlag === '' || bodyFlag === 'true'; } function translateSiteText(value, language) { const text = String(value || ''); const trimmed = text.trim(); if (!trimmed) return text; if (language !== 'en') return text; const compact = normalizeWhitespaceForTranslation(trimmed); const translated = SITE_LANGUAGE_DICTIONARY[trimmed] || SITE_LANGUAGE_DICTIONARY[compact] || getLoadedSiteTranslation(trimmed) || getLoadedSiteTranslation(compact); const normalized = normalizeProductNamesForEnglish(translated || trimmed); if (!translated && normalized === trimmed) return text; const leading = text.match(/^\s*/)?.[0] || ''; const trailing = text.match(/\s*$/)?.[0] || ''; return `${leading}${normalized}${trailing}`; } function normalizeWhitespaceForTranslation(value) { return String(value || '').replace(/\s+/g, ' ').trim(); } function getLoadedSiteTranslation(key) { const translations = window.DBC_EN_TRANSLATIONS; if (!translations || typeof translations !== 'object') return ''; return translations[key] || ''; } function normalizeProductNamesForEnglish(value) { let normalized = String(value || ''); SITE_PRODUCT_NAME_REPLACEMENTS.forEach(([source, target]) => { normalized = normalized.split(source).join(target); }); return normalized .replace(/\b(Bioten™ (?:Plus|Pro|Ultra))(?=[A-Za-z0-9])/g, '$1 ') .replace(/\s{2,}/g, ' ') .trim(); } function translatePageLanguage(language = getStoredSiteLanguage()) { if (!isEnglishReadyPage()) language = 'zh'; applySavedSiteLanguage(language); if (language === 'en') loadSiteLanguagePacks(); siteLanguageIsTranslating = true; try { if (!document.documentElement.dataset.dbcOriginalTitle) { document.documentElement.dataset.dbcOriginalTitle = document.title; } const originalTitle = document.documentElement.dataset.dbcOriginalTitle; document.title = language === 'en' ? translateSiteText(originalTitle, language) : originalTitle; document.querySelectorAll('*').forEach(element => { if (element.matches(SITE_LANGUAGE_SKIP_SELECTOR)) return; SITE_LANGUAGE_ATTRIBUTE_NAMES.forEach(attribute => { if (!element.hasAttribute(attribute)) return; if (!element.dataset.dbcOriginalAttrs) element.dataset.dbcOriginalAttrs = '{}'; let originals = {}; try { originals = JSON.parse(element.dataset.dbcOriginalAttrs || '{}'); } catch (error) { originals = {}; } if (!Object.prototype.hasOwnProperty.call(originals, attribute)) { originals[attribute] = element.getAttribute(attribute); element.dataset.dbcOriginalAttrs = JSON.stringify(originals); } const original = originals[attribute]; element.setAttribute(attribute, language === 'en' ? translateSiteText(original, language) : original); }); }); const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, { acceptNode(node) { const parent = node.parentElement; if (!parent || parent.closest(SITE_LANGUAGE_SKIP_SELECTOR)) return NodeFilter.FILTER_REJECT; return node.nodeValue.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); const nodes = []; while (walker.nextNode()) nodes.push(walker.currentNode); nodes.forEach(node => { if (typeof node.__dbcOriginalText !== 'string') node.__dbcOriginalText = node.nodeValue; node.nodeValue = language === 'en' ? translateSiteText(node.__dbcOriginalText, language) : node.__dbcOriginalText; }); } finally { siteLanguageIsTranslating = false; } if (language === 'en') translateCurrentChineseFragments(); } function loadSiteLanguagePacks() { if (!isEnglishReadyPage()) return; if (siteLanguagePacksRequested) return; siteLanguagePacksRequested = true; SITE_LANGUAGE_PACK_FILES.forEach(src => { const script = document.createElement('script'); script.src = src; script.defer = true; script.dataset.dbcLanguagePack = 'true'; document.head.appendChild(script); }); } function scheduleSiteLanguageRefreshes() { if (!isEnglishReadyPage()) return; [250, 750, 1500, 3000, 5000].forEach(delay => { window.setTimeout(() => { if (document.documentElement.dataset.lang === 'en') translateCurrentChineseFragments(); }, delay); }); } function translateCurrentChineseFragments(root = document.body) { if (!root || document.documentElement.dataset.lang !== 'en') return; const hasChinese = /[\u4e00-\u9fff]/; const translateCurrentValue = value => { const text = String(value || ''); if (!hasChinese.test(text) || text.trim() === '中') return text; return translateSiteText(text, 'en'); }; document.querySelectorAll('*').forEach(element => { if (element.matches(SITE_LANGUAGE_SKIP_SELECTOR)) return; SITE_LANGUAGE_ATTRIBUTE_NAMES.forEach(attribute => { if (!element.hasAttribute(attribute)) return; const current = element.getAttribute(attribute); const translated = translateCurrentValue(current); if (translated !== current) element.setAttribute(attribute, translated); }); }); const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { acceptNode(node) { const parent = node.parentElement; if (!parent || parent.closest(SITE_LANGUAGE_SKIP_SELECTOR)) return NodeFilter.FILTER_REJECT; return hasChinese.test(node.nodeValue || '') ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); const nodes = []; while (walker.nextNode()) nodes.push(walker.currentNode); nodes.forEach(node => { if (node.nodeValue.trim() === '中') return; const translated = translateCurrentValue(node.nodeValue); if (translated !== node.nodeValue) node.nodeValue = translated; }); } function initSiteLanguageMutationObserver() { if (!isEnglishReadyPage() || siteLanguageMutationObserver || !document.body) return; siteLanguageMutationObserver = new MutationObserver(mutations => { if (siteLanguageIsTranslating) return; if (document.documentElement.dataset.lang !== 'en') return; if (!mutations.some(mutation => (mutation.addedNodes && mutation.addedNodes.length) || mutation.type === 'characterData')) return; mutations.forEach(mutation => { if (mutation.type === 'characterData' && mutation.target && mutation.target.nodeValue && /[\u4e00-\u9fff]/.test(mutation.target.nodeValue)) { mutation.target.__dbcOriginalText = mutation.target.nodeValue; } }); window.clearTimeout(siteLanguageMutationTimer); siteLanguageMutationTimer = window.setTimeout(() => { if (document.documentElement.dataset.lang !== 'en') return; translatePageLanguage('en'); }, 80); }); siteLanguageMutationObserver.observe(document.body, { childList: true, characterData: true, subtree: true }); } function initSiteLanguageToggle() { const headerInner = document.querySelector('.site-header .header-inner'); if (!headerInner) return; headerInner.querySelectorAll('[data-theme-toggle],.theme-toggle').forEach(element => element.remove()); if (!isEnglishReadyPage()) { const unavailableButton = headerInner.querySelector('[data-language-toggle],.language-toggle'); if (unavailableButton && unavailableButton.hasAttribute('data-language-home-fallback')) { unavailableButton.disabled = false; unavailableButton.removeAttribute('data-language-unavailable'); unavailableButton.setAttribute('aria-label', 'Open the English homepage'); unavailableButton.setAttribute('title', '进入英文首页(当前页面正文为中文)'); unavailableButton.setAttribute('aria-pressed', 'false'); } else if (unavailableButton) { unavailableButton.disabled = true; unavailableButton.setAttribute('data-language-unavailable', ''); unavailableButton.setAttribute('aria-label', 'English content is being prepared'); unavailableButton.setAttribute('title', '英文内容正在准备中'); unavailableButton.setAttribute('aria-pressed', 'false'); } applySavedSiteLanguage('zh'); return; } let button = headerInner.querySelector('[data-language-toggle]'); if (!button) { button = document.createElement('button'); headerInner.appendChild(button); } button.className = 'language-toggle'; button.type = 'button'; button.setAttribute('data-language-toggle', ''); if (!button.querySelector('.language-toggle-track')) { button.innerHTML = [ '' ].join(''); } const setButtonState = language => { const isEnglish = language === 'en'; button.setAttribute('aria-label', isEnglish ? 'Switch to Chinese' : 'Switch to English'); button.setAttribute('title', isEnglish ? 'Switch to Chinese' : 'Switch to English'); button.setAttribute('aria-pressed', String(isEnglish)); }; const setLanguage = language => { const nextLanguage = language === 'en' ? 'en' : 'zh'; if (nextLanguage === 'zh') { window.clearTimeout(siteLanguageMutationTimer); siteLanguageMutationTimer = 0; } try { localStorage.setItem(SITE_LANGUAGE_STORAGE_KEY, nextLanguage); } catch (error) { // Language still updates for the current page if storage is unavailable. } if (nextLanguage === 'zh') { applySavedSiteLanguage(nextLanguage); setButtonState(nextLanguage); window.setTimeout(() => window.location.reload(), 0); return; } translatePageLanguage(nextLanguage); setButtonState(nextLanguage); }; const initialLanguage = getStoredSiteLanguage(); translatePageLanguage(initialLanguage); initSiteLanguageMutationObserver(); setButtonState(initialLanguage); button.addEventListener('click', () => { const currentLanguage = document.documentElement.dataset.lang === 'en' ? 'en' : 'zh'; setLanguage(currentLanguage === 'en' ? 'zh' : 'en'); }); } function getStoredSiteTheme() { try { const theme = localStorage.getItem(SITE_THEME_STORAGE_KEY); return theme === 'dark' || theme === 'light' ? theme : ''; } catch (error) { return ''; } } function getPreferredSiteTheme() { return getStoredSiteTheme() || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); } function applySavedSiteTheme(theme = getPreferredSiteTheme()) { document.documentElement.dataset.theme = theme; document.documentElement.style.colorScheme = theme; } function injectDarkModeRuntimeStyles() { if (document.getElementById('dbc-dark-runtime-style')) return; const style = document.createElement('style'); style.id = 'dbc-dark-runtime-style'; style.textContent = ` html[data-theme="dark"] body{ background:#0d1110!important; color:#f5f8f6!important; } html[data-theme="dark"] body .site-header, html[data-theme="dark"] body header.site-header{ background:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.14)!important; } html[data-theme="dark"] body .site-header :is(.header-inner,.brand-logos,.nav,.nav-item){ background:transparent!important; background-image:none!important; } html[data-theme="dark"] body .site-header :is(.nav-link,.nav a){ color:#d8e2de!important; -webkit-text-fill-color:#d8e2de!important; } html[data-theme="dark"] body .site-header :is(.nav-item.is-active>.nav-link,.nav-link[aria-current="page"],.nav-link:hover,.nav-link:focus){ color:#6ee8a2!important; -webkit-text-fill-color:#6ee8a2!important; } html[data-theme="dark"] body .site-header .nav-menu, html[data-theme="dark"] body .site-header .nav-menu::before, html[data-theme="dark"] body .site-header .nav-menu a, html[data-theme="dark"] body .site-header .nav-menu a strong, html[data-theme="dark"] body .site-header .nav-menu a span{ background:#111916!important; background-image:none!important; border-color:rgba(255,255,255,.14)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"] body .theme-toggle{ background:rgba(18,24,22,.88)!important; border-color:rgba(255,255,255,.18)!important; color:#ecf4ef!important; -webkit-text-fill-color:#ecf4ef!important; } html[data-theme="dark"] body main, html[data-theme="dark"] body :is(.product-lines-main,.request-page,.lab-request-hero){ background:#0d1110!important; background-image:none!important; color:#f5f8f6!important; } html[data-theme="dark"] body main :is(section,article,aside,form,table,thead,tbody,tfoot,tr,th,td,dl,ul,ol,li,figure,blockquote,div[class],span:not(.theme-toggle-text):not(.theme-toggle-thumb):not(.theme-toggle-track):not(.company-proof-badge)){ background-color:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; box-shadow:none!important; } html[data-theme="dark"] body main :is(h1,h2,h3,h4,h5,h6,strong,b,dt,th,a){ color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; text-shadow:none!important; } html[data-theme="dark"] body main :is(p,li,dd,td,span,small,em,label,legend){ color:#c8d1cd!important; -webkit-text-fill-color:#c8d1cd!important; text-shadow:none!important; } html[data-theme="dark"] body main :is(.home-eyebrow,.hero-eyebrow,.eyebrow,.section-kicker,.tag,[class*="kicker"],[class*="label"]){ background:transparent!important; color:#6ee8a2!important; -webkit-text-fill-color:#6ee8a2!important; } html[data-theme="dark"] body main :is(button,.button,.home-link,.dbc-btn,input,select,textarea){ background:#111916!important; background-image:none!important; border-color:rgba(110,232,162,.32)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"] body :is(footer,.site-footer,.footer), html[data-theme="dark"] body :is(footer,.site-footer,.footer) :is(.footer-inner,.footer-note,.footer-directory,.footer-column,.footer-column h3,.footer-column a,.footer-bottom,.footer-bottom strong,.footer-legal,.footer-legal span){ background:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; box-shadow:none!important; } html[data-theme="dark"] body :is(footer,.site-footer,.footer) :is(.footer-inner,.footer-note,.footer-bottom,.footer-legal,.footer-legal span){ color:#c8d1cd!important; -webkit-text-fill-color:#c8d1cd!important; } html[data-theme="dark"] body :is(footer,.site-footer,.footer) :is(.footer-column h3,.footer-bottom strong){ color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"] body :is(footer,.site-footer,.footer) .footer-column a{ color:#9ff1bd!important; -webkit-text-fill-color:#9ff1bd!important; } /* Final dark-mode overrides for page templates that lock white panels with high-specificity !important rules. */ html[data-theme="dark"][data-theme] body[class] main:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.product-editorial-page.product-editorial-page.product-lines-detail-page.product-lines-detail-page main.product-lines-main.pro-product-main:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.product-editorial-page.product-editorial-page.bioten-matrix-page.bioten-matrix-page main:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.nav-editorial-page.nav-editorial-page.bioten-request-page.bioten-request-page main.request-page:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#0d1110!important; background-color:#0d1110!important; background-image:none!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme] body[class] main :is(section,article,aside,nav,form,fieldset,table,thead,tbody,tfoot,tr,th,td,dl,ul,ol,li,figure,figcaption,blockquote,details,summary,div[class]):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC):not(.theme-toggle):not(.theme-toggle-track):not(.theme-toggle-thumb){ background-color:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; box-shadow:none!important; } html[data-theme="dark"][data-theme] body[class] main span:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC):not(.theme-toggle-text):not(.theme-toggle-thumb):not(.theme-toggle-track):not(.company-proof-badge):not([class*="icon"]){ background-color:transparent!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; color:#c8d1cd!important; -webkit-text-fill-color:#c8d1cd!important; } html[data-theme="dark"][data-theme] body[class] main :is(h1,h2,h3,h4,h5,h6,strong,b,dt,th,a):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body[class] main :is(h1,h2,h3,h4,h5,h6,strong,b,dt,th,a) span:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; text-shadow:none!important; } html[data-theme="dark"][data-theme] body[class] main :is(p,li,dd,td,small,em,label,legend,summary,figcaption):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ color:#c8d1cd!important; -webkit-text-fill-color:#c8d1cd!important; text-shadow:none!important; } html[data-theme="dark"][data-theme] body.news-article-page.news-article-page.news-article-page.news-article-page main article.news-original-article > header.news-hero.news-original-hero:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.news-article-page.news-article-page main :is(.news-hero,.news-original-hero):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#0d1110!important; background-color:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; box-shadow:none!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme] body.news-article-page.news-article-page main :is(.news-hero,.news-original-hero)::before, html[data-theme="dark"][data-theme] body.news-article-page.news-article-page main :is(.news-hero,.news-original-hero)::after, html[data-theme="dark"][data-theme] body.news-article-page.news-article-page main :is(.news-hero,.news-original-hero) :is(.news-hero-copy,.news-hero-heading)::before, html[data-theme="dark"][data-theme] body.news-article-page.news-article-page main :is(.news-hero,.news-original-hero) :is(.news-hero-copy,.news-hero-heading)::after{ background:none!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; box-shadow:none!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body[class] .site-header.site-header:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#0d1110!important; background-color:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.14)!important; box-shadow:none!important; color:#d8e2de!important; -webkit-text-fill-color:#d8e2de!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header :is(.header-inner,.brand-logos,.nav,.nav-item):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body[class] .site-header.site-header :is(.header-inner,.brand-logos,.nav,.nav-item):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:transparent!important; background-color:transparent!important; background-image:none!important; color:#d8e2de!important; -webkit-text-fill-color:#d8e2de!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header :is(.nav-link.nav-link,#site-nav > .nav-link.nav-link,#site-nav > .nav-item.nav-item > .nav-link.nav-link):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body[class] .site-header.site-header :is(.nav-link.nav-link,#site-nav > .nav-link.nav-link,#site-nav > .nav-item.nav-item > .nav-link.nav-link):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:transparent!important; color:#d8e2de!important; -webkit-text-fill-color:#d8e2de!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header :is(.nav-item.nav-item:hover > .nav-link.nav-link,.nav-item.nav-item:focus-within > .nav-link.nav-link,.nav-item.nav-item.is-active > .nav-link.nav-link,.nav-link.nav-link:hover,.nav-link.nav-link[aria-current="page"]):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body[class] .site-header.site-header :is(.nav-item.nav-item:hover > .nav-link.nav-link,.nav-item.nav-item:focus-within > .nav-link.nav-link,.nav-item.nav-item.is-active > .nav-link.nav-link,.nav-link.nav-link:hover,.nav-link.nav-link[aria-current="page"]):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:rgba(54,199,121,.13)!important; color:#6ee8a2!important; -webkit-text-fill-color:#6ee8a2!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header .nav-menu.nav-menu, html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header .nav-menu.nav-menu a, html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header .nav-menu.nav-menu a strong, html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page .site-header.site-header .nav-menu.nav-menu a span{ background:#111916!important; background-color:#111916!important; background-image:none!important; border-color:rgba(255,255,255,.14)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page main.bioten-lab-main :is(.lab-request-hero,.lab-request-hero *,details,summary,.card,.glass,.field,.summary-card,.callout,.hint,.ok,.warn,.err,.info):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background-color:#0d1110!important; background-image:none!important; border-color:rgba(255,255,255,.12)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; box-shadow:none!important; } html[data-theme="dark"][data-theme] body[class] main :is(a,.button,.dbc-btn,[class*="btn"],[class*="link"]):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC):not(.logo):not(.logo-image):not(.nav-link){ background-color:#111916!important; background-image:none!important; border-color:rgba(110,232,162,.32)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme] body[class] main :is(a,.button,.dbc-btn,[class*="btn"],[class*="link"]):hover:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC):not(.logo):not(.logo-image):not(.nav-link), html[data-theme="dark"][data-theme] body[class] main :is(a,.button,.dbc-btn,[class*="btn"],[class*="link"]):focus:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC):not(.logo):not(.logo-image):not(.nav-link){ background-color:#16231d!important; color:#6ee8a2!important; -webkit-text-fill-color:#6ee8a2!important; } html[data-theme="dark"][data-theme] body.news-list-page.news-list-page main img.openai-news-image:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.news-list-page.news-list-page main .openai-news-image:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#111916!important; background-color:#111916!important; } html[data-theme="dark"][data-theme] body.nav-editorial-page.nav-editorial-page.bioten-request-page.bioten-request-page main.request-page :is(.request-options label,.request-options-grid label,.request-options-featured label,.agreement-check):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#111916!important; background-color:#111916!important; background-image:none!important; border-color:rgba(110,232,162,.24)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme] body.nav-editorial-page.nav-editorial-page.bioten-request-page.bioten-request-page main.request-page :is(.request-options label,.request-options-grid label,.request-options-featured label,.agreement-check):has(input:checked):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#16231d!important; background-color:#16231d!important; border-color:rgba(110,232,162,.46)!important; } html[data-theme="dark"][data-theme] body.compliance-map-page.compliance-map-page main .compliance-map-shell .dog-marker.dog-marker:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.compliance-map-page.compliance-map-page main .compliance-map-shell .dog-marker.dog-marker :is(.dog,.market-flag):not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:transparent!important; background-color:transparent!important; background-image:none!important; border-color:transparent!important; box-shadow:none!important; } html[data-theme="dark"][data-theme] body.compliance-map-page.compliance-map-page main .compliance-map-shell .market-docs.market-docs i:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:rgba(17,25,22,.92)!important; background-color:rgba(17,25,22,.92)!important; background-image:none!important; border-color:rgba(110,232,162,.24)!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } html[data-theme="dark"][data-theme]:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC), html[data-theme="dark"][data-theme] body.bioten-lab-page.bioten-lab-page.nav-editorial-page.nav-editorial-page.site-unified-page.site-unified-page:not(#dbcDarkForceA):not(#dbcDarkForceB):not(#dbcDarkForceC){ background:#0d1110!important; background-color:#0d1110!important; background-image:none!important; color:#f5f8f6!important; -webkit-text-fill-color:#f5f8f6!important; } `; document.head.appendChild(style); } function setImportantStyle(element, property, value) { if (!element) return; element.style.setProperty(property, value, 'important'); } function clearInlineStyles(element, properties) { if (!element) return; properties.forEach(property => element.style.removeProperty(property)); if (!element.getAttribute('style')) element.removeAttribute('style'); } function syncBiotenHeroDarkMode() { const hero = document.getElementById('bioten-particle-hero'); if (!hero) return; const isDark = document.documentElement.dataset.theme === 'dark'; const transparentLayers = hero.querySelectorAll([ '.bioten-hero-floating-icons', '.bioten-hero-floating-icon', '.bioten-particle-hero__content', '.bioten-particle-hero__intro', '.bioten-particle-hero__actions' ].join(',')); const icons = hero.querySelectorAll('.bioten-hero-floating-icon'); const orbs = hero.querySelectorAll('.bioten-hero-floating-orb'); const actions = hero.querySelectorAll('.bioten-particle-hero__actions a'); const styledElements = [hero, ...transparentLayers, ...icons, ...orbs, ...actions]; const touchedProperties = [ 'background', 'background-color', 'background-image', 'border-color', 'box-shadow', 'color', '-webkit-text-fill-color', 'filter' ]; if (!isDark) { styledElements.forEach(element => clearInlineStyles(element, touchedProperties)); return; } setImportantStyle(hero, 'background', 'radial-gradient(circle at 50% 28%,rgba(221,186,87,.16),transparent 34%),linear-gradient(180deg,#0d1110 0%,#121916 72%,#0d1110 100%)'); setImportantStyle(hero, 'background-color', '#0d1110'); transparentLayers.forEach(layer => { setImportantStyle(layer, 'background', 'transparent'); setImportantStyle(layer, 'background-color', 'transparent'); setImportantStyle(layer, 'background-image', 'none'); }); icons.forEach(icon => { setImportantStyle(icon, 'filter', 'drop-shadow(0 18px 34px rgba(221,186,87,.16)) drop-shadow(0 12px 28px rgba(110,232,162,.1))'); }); orbs.forEach(orb => { setImportantStyle(orb, 'background', 'radial-gradient(circle at 50% 50%,rgba(255,255,255,.2) 0%,rgba(216,182,90,.14) 54%,rgba(255,255,255,0) 74%)'); setImportantStyle(orb, 'background-color', 'transparent'); setImportantStyle(orb, 'filter', 'blur(6px)'); }); actions.forEach((action, index) => { if (index === 0) { setImportantStyle(action, 'background', '#d8b65a'); setImportantStyle(action, 'background-color', '#d8b65a'); setImportantStyle(action, 'border-color', '#d8b65a'); setImportantStyle(action, 'color', '#0d1110'); setImportantStyle(action, '-webkit-text-fill-color', '#0d1110'); return; } setImportantStyle(action, 'background', 'rgba(17,25,22,.74)'); setImportantStyle(action, 'background-color', 'rgba(17,25,22,.74)'); setImportantStyle(action, 'border-color', 'rgba(221,186,87,.34)'); setImportantStyle(action, 'color', '#f5f8f6'); setImportantStyle(action, '-webkit-text-fill-color', '#f5f8f6'); }); } function initBrandSphereControl() { const sphere = document.querySelector('.rail-brand-mosaic'); if (!sphere) return; sphere.setAttribute('role', 'button'); sphere.setAttribute('tabindex', '0'); sphere.setAttribute('aria-label', '品牌矩阵旋转球,点击暂停,鼠标移开继续旋转'); sphere.setAttribute('aria-pressed', 'false'); const resume = () => { sphere.classList.remove('is-paused'); sphere.setAttribute('aria-pressed', 'false'); }; const pause = () => { sphere.classList.add('is-paused'); sphere.setAttribute('aria-pressed', 'true'); }; sphere.addEventListener('click', pause); sphere.addEventListener('mouseleave', resume); sphere.addEventListener('blur', resume); sphere.addEventListener('keydown', event => { if (event.key !== 'Enter' && event.key !== ' ') return; event.preventDefault(); if (sphere.classList.contains('is-paused')) { resume(); } else { pause(); } }); } function markUnifiedPage() { const pathname = window.location.pathname.toLowerCase(); const page = (pathname.split('/').pop() || 'index.html').toLowerCase(); const preservedPages = new Set([ 'index.html', 'bioten.html', 'solutions.html', 'bioten-packaging.html', 'solutions-food-packaging.html', 'solutions-industrial.html', 'contact-intent-paper-sample.html', 'bioten-products-plus.html', 'bioten-products-pro.html', 'bioten-products-ultra.html' ]); const isProductDetailRoute = /\/bioten\/products\/(plus|pro|ultra)\/?$/.test(pathname); if (!preservedPages.has(page) && !isProductDetailRoute) { document.body.classList.add('site-unified-page'); } } function savePageAsPdf(button) { const originalLabel = button.textContent; button.disabled = true; button.textContent = '打开中...'; document.body.classList.add('is-exporting'); requestAnimationFrame(() => { window.print(); setTimeout(() => { document.body.classList.remove('is-exporting'); button.disabled = false; button.textContent = originalLabel; }, 800); }); } function initHomeReveals() { const revealItems = document.querySelectorAll('.apple-home .home-band, .apple-home .home-product-focus, .apple-home .site-footer'); if (!revealItems.length) return; if (!('IntersectionObserver' in window)) { revealItems.forEach(item => item.classList.add('is-visible')); return; } const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (!entry.isIntersecting) return; entry.target.classList.add('is-visible'); observer.unobserve(entry.target); }); }, { threshold: 0.14, rootMargin: '0px 0px -8% 0px' }); revealItems.forEach(item => observer.observe(item)); } function initBiotenFloatingIcons() { const hero = document.getElementById('bioten-particle-hero'); if (!hero || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; const items = hero.querySelectorAll('.bioten-hero-floating-icon'); if (!items.length) return; hero.addEventListener('mousemove', event => { items.forEach((item, index) => { const rect = item.getBoundingClientRect(); const itemX = rect.left + rect.width / 2; const itemY = rect.top + rect.height / 2; const dx = itemX - event.clientX; const dy = itemY - event.clientY; const distance = Math.hypot(dx, dy) || 1; const influence = Math.max(0, 1 - distance / 360); const directionX = dx / distance; const directionY = dy / distance; const weight = 7 + index * 1.2; const lift = influence * (5 + index * 0.8); item.style.setProperty('--parallax-x', `${directionX * influence * weight}px`); item.style.setProperty('--parallax-y', `${directionY * influence * weight - lift}px`); }); }); hero.addEventListener('mouseleave', () => { items.forEach(item => { item.style.removeProperty('--parallax-x'); item.style.removeProperty('--parallax-y'); }); }); } function initHomeNewsViewToggle() { const roots = document.querySelectorAll('[data-news-view-root]'); if (!roots.length) return; if (document.body.classList.contains('news-list-page')) { const buttons = document.querySelectorAll('.news-business-panel [data-news-view]'); if (!buttons.length) return; const setSharedView = view => { roots.forEach(root => { root.dataset.view = view; }); buttons.forEach(button => { const isActive = button.dataset.newsView === view; button.classList.toggle('is-active', isActive); button.setAttribute('aria-pressed', String(isActive)); }); }; buttons.forEach(button => { button.addEventListener('click', () => setSharedView(button.dataset.newsView)); }); setSharedView('grid'); return; } roots.forEach(root => { const scope = root.closest('.company-news, .news-business-panel') || document; const buttons = scope.querySelectorAll('[data-news-view]'); if (!buttons.length) return; const setView = view => { root.dataset.view = view; buttons.forEach(button => { const isActive = button.dataset.newsView === view; button.classList.toggle('is-active', isActive); button.setAttribute('aria-pressed', String(isActive)); }); }; buttons.forEach(button => { button.addEventListener('click', () => setView(button.dataset.newsView)); }); setView('grid'); }); } function initNewsCardImageLinks() { const cards = document.querySelectorAll('.home-news-card, .news-event-card'); cards.forEach(card => { const image = card.querySelector('img.openai-news-image, .home-news-media img'); if (!image || image.closest('a')) return; const link = card.querySelector('.news-actions a[href], a[href^="news-"][href$=".html"]'); if (!link) return; const imageLink = document.createElement('a'); imageLink.className = 'news-image-link'; imageLink.href = link.getAttribute('href'); imageLink.setAttribute('aria-label', link.textContent.trim() || image.alt || '阅读新闻详情'); image.parentNode.insertBefore(imageLink, image); imageLink.appendChild(image); }); } function initHomepageCardTilt() { const cards = document.querySelectorAll('.dbc-home-page .brand-feature, .dbc-home-page .brand-mini, .dbc-home-page .product-line, .dbc-home-page .company-news-grid article, .dbc-home-page .barrier-grid div, .dbc-home-page .lab-grid-home div'); if (!cards.length || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; cards.forEach(card => { card.addEventListener('mousemove', event => { const rect = card.getBoundingClientRect(); const rx = ((event.clientX - rect.left) / rect.width) - 0.5; const ry = ((event.clientY - rect.top) / rect.height) - 0.5; card.style.setProperty('--tilt-x', `${ry * -3}deg`); card.style.setProperty('--tilt-y', `${rx * 3}deg`); card.style.transform = `translateY(-4px) rotateX(var(--tilt-x)) rotateY(var(--tilt-y))`; }); card.addEventListener('mouseleave', () => { card.style.removeProperty('--tilt-x'); card.style.removeProperty('--tilt-y'); card.style.transform = ''; }); }); } function initSectionNavState() { const navs = document.querySelectorAll([ '.home-page-nav', '.bioten-page-nav', '.about-anchor-nav', '.knowledge-anchor-nav', '.resources-page-nav', '.packaging-anchor', '.bioten-product-nav', '.pl-anchor-nav', '.vp-anchor-nav', '.article-nav', '.solutions-anchor' ].join(', ')); if (!navs.length) return; navs.forEach(nav => { const links = Array.from(nav.querySelectorAll('a[href^="#"]')); const sectionPairs = []; links.forEach(link => { const target = document.querySelector(link.getAttribute('href')); if (target) sectionPairs.push({ target, link }); }); if (!sectionPairs.length) return; const setActiveLink = activeLink => { links.forEach(link => { const isActive = link === activeLink; link.classList.toggle('is-active', isActive); if (isActive) { link.setAttribute('aria-current', 'true'); } else { link.removeAttribute('aria-current'); } }); }; const updateActiveLink = () => { const marker = window.scrollY + window.innerHeight * 0.42; let activePair = sectionPairs[0]; sectionPairs.forEach(pair => { const top = pair.target.getBoundingClientRect().top + window.scrollY; if (top <= marker) activePair = pair; }); setActiveLink(activePair.link); }; let ticking = false; const queueUpdate = () => { if (ticking) return; ticking = true; window.requestAnimationFrame(() => { ticking = false; updateActiveLink(); }); }; window.addEventListener('scroll', queueUpdate, { passive: true }); window.addEventListener('resize', queueUpdate); updateActiveLink(); }); } function initBackToTop() { let button = document.querySelector('[data-back-to-top]'); if (!button) { button = document.createElement('button'); button.className = 'site-back-to-top'; button.type = 'button'; button.setAttribute('data-back-to-top', ''); button.setAttribute('aria-label', '回到顶部'); button.innerHTML = ''; document.body.appendChild(button); } const toggleButton = () => { button.classList.toggle('is-visible', window.scrollY > window.innerHeight * 0.6); }; button.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); window.addEventListener('scroll', toggleButton, { passive: true }); window.addEventListener('resize', toggleButton); toggleButton(); } function initNewsArticleEnhancements() { if (!document.body.classList.contains('news-article-page')) return; const heading = document.querySelector('.news-article-heading'); const content = document.querySelector('.news-content-original, .news-content'); if (!heading || !content) return; const meta = heading.querySelector('p'); if (meta && !heading.querySelector('.news-article-actions')) { const actions = document.createElement('div'); actions.className = 'news-article-actions'; actions.setAttribute('aria-label', '文章操作'); actions.innerHTML = [ '', '', '' ].join(''); meta.insertAdjacentElement('afterend', actions); actions.querySelector('[data-news-share]').addEventListener('click', async event => { const button = event.currentTarget; const title = document.title; const url = window.location.href; try { if (navigator.share) { await navigator.share({ title, url }); } else if (navigator.clipboard) { await navigator.clipboard.writeText(url); flashActionLabel(button, '已复制链接'); } } catch (error) { if (navigator.clipboard) { await navigator.clipboard.writeText(url); flashActionLabel(button, '已复制链接'); } } }); actions.querySelector('[data-news-pdf]').addEventListener('click', () => { window.print(); }); actions.querySelector('[data-news-like]').addEventListener('click', event => { const button = event.currentTarget; const key = `dbc-news-liked:${window.location.pathname}`; const liked = localStorage.getItem(key) === '1'; localStorage.setItem(key, liked ? '0' : '1'); button.classList.toggle('is-liked', !liked); button.setAttribute('aria-label', liked ? '点赞' : '已点赞'); button.setAttribute('title', liked ? '点赞' : '已点赞'); }); const likeButton = actions.querySelector('[data-news-like]'); if (localStorage.getItem(`dbc-news-liked:${window.location.pathname}`) === '1') { likeButton.classList.add('is-liked'); likeButton.setAttribute('aria-label', '已点赞'); likeButton.setAttribute('title', '已点赞'); } } const continueSection = content.querySelector('.news-continue'); if (continueSection && !content.querySelector('.news-continue-return')) { const returnWrap = document.createElement('div'); returnWrap.className = 'news-continue-return'; returnWrap.innerHTML = '返回企业动态'; continueSection.insertAdjacentElement('beforebegin', returnWrap); } } function flashActionLabel(button, label) { const originalLabel = button.getAttribute('aria-label'); const originalTitle = button.getAttribute('title'); button.setAttribute('aria-label', label); button.setAttribute('title', label); button.classList.add('is-feedback'); window.setTimeout(() => { button.setAttribute('aria-label', originalLabel || ''); button.setAttribute('title', originalTitle || ''); button.classList.remove('is-feedback'); }, 1400); } function escapeAttribute(value) { return escapeHtml(value).replace(/`/g, '`'); } function initBiotenRequestForm() { const form = document.querySelector('[data-bioten-request-form]'); if (!form) return; clearLegacyRequestStorage(); prepareRequestSecurityFields(form); const status = form.querySelector('[data-request-status]'); const result = document.querySelector('[data-request-result]'); const submitButton = form.querySelector('button[type="submit"]'); const isCollaborationForm = form.hasAttribute('data-v7301-collaboration-form'); const endpoint = getSameOriginRequestEndpoint(form); const recipient = (form.dataset.requestRecipient || 'Bioten™ 团队').trim(); const resetStatus = (form.dataset.resetStatus || '提交后,团队将根据申请信息安排对应负责人跟进。').trim(); const isEnglishSiteLanguage = () => document.documentElement.dataset.lang === 'en'; const submittedAtLabel = () => new Date().toLocaleString(isEnglishSiteLanguage() ? 'en-US' : 'zh-CN', { hour12: false }); form.addEventListener('submit', async event => { event.preventDefault(); if (!form.checkValidity()) { form.reportValidity(); return; } const formData = new FormData(form); const submittedAt = submittedAtLabel(); const payload = { submittedAt, fields: Object.fromEntries(formData.entries()) }; formData.forEach((value, key) => { const values = formData.getAll(key).map(item => String(item).trim()).filter(Boolean); if (values.length > 1) payload.fields[key] = values; else payload.fields[key] = String(value).trim(); }); // Historical ANTUX forms used `applicant`; keep the payload compatible with // the shared API contract without discarding the original field. if (!String(payload.fields.contact || '').trim() && String(payload.fields.applicant || '').trim()) { payload.fields.contact = String(payload.fields.applicant).trim(); } if (result) { result.hidden = true; result.innerHTML = ''; } if (status) { status.textContent = isEnglishSiteLanguage() ? `Submitting the form to ${recipient}.` : `表单正在提交至${recipient}。`; } if (submitButton) { submitButton.disabled = true; submitButton.setAttribute('aria-busy', 'true'); } let serverMessage = ''; try { const response = await fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(payload) }); const data = await response.json().catch(() => ({})); if (!response.ok || data.ok === false) { serverMessage = typeof data.message === 'string' ? data.message.trim() : ''; throw new Error('request_failed'); } clearLegacyRequestStorage(); if (status) { status.textContent = isEnglishSiteLanguage() ? `Form submitted to ${recipient}. Submitted at: ${submittedAt}.` : `表单已提交至${recipient}。提交时间:${submittedAt}。`; } if (isCollaborationForm && result) { renderCollaborationReceipt(result, data, submittedAt, isEnglishSiteLanguage()); } } catch (error) { if (status) { status.textContent = isEnglishSiteLanguage() ? 'The submission did not complete. Please retry later or use the published contact channel.' : (serverMessage || '提交暂未完成,请稍后重试或使用页面公布的联系方式。'); } if (isCollaborationForm && result) { renderCollaborationFailure(result, serverMessage, isEnglishSiteLanguage()); } } finally { if (submitButton) { submitButton.disabled = false; submitButton.removeAttribute('aria-busy'); } } }); form.addEventListener('reset', () => { clearLegacyRequestStorage(); window.setTimeout(() => refreshRequestStartTime(form), 0); if (status) status.textContent = isEnglishSiteLanguage() ? `After submission, ${recipient} will arrange the appropriate follow-up.` : resetStatus; if (result) { result.hidden = true; result.innerHTML = ''; } }); } function renderCollaborationReceipt(result, data, submittedAt, english) { const requestId = typeof data.requestId === 'string' ? data.requestId.trim() : ''; const requestType = typeof data.requestType === 'string' ? data.requestType.trim() : ''; result.replaceChildren(); result.className = 'request-result cl7301-receipt'; const heading = document.createElement('strong'); heading.textContent = english ? 'The interface accepted and sent your request.' : '接口已接收并发送本次申请。'; result.appendChild(heading); if (requestId) { const id = document.createElement('span'); id.className = 'cl7301-receipt__id'; id.textContent = requestId; id.setAttribute('aria-label', english ? `Receipt reference ${requestId}` : `回执编号 ${requestId}`); result.appendChild(id); } const summary = document.createElement('p'); const typeText = requestType ? `${requestType} · ` : ''; summary.textContent = english ? `${typeText}${submittedAt}. This reference is for correspondence only; it is not project acceptance, sample confirmation, or partner approval.` : `${typeText}${submittedAt}。该编号仅用于后续沟通引用,不代表项目受理、样品确认或合作伙伴审核通过。`; result.appendChild(summary); const links = document.createElement('div'); links.className = 'cl7301-receipt__links'; [ ['packaging-insights.html', english ? 'Applications & partnerships' : '返回新应用与合作'], ['bioten.html', english ? 'BIOTEN Packaging' : '返回博碳包装'], ['mailto:Bioten@dbc.cn', english ? 'Email Bioten@dbc.cn' : '邮件联系 Bioten@dbc.cn'], ].forEach(([href, label]) => { const link = document.createElement('a'); link.href = href; link.textContent = label; links.appendChild(link); }); result.appendChild(links); result.hidden = false; } function renderCollaborationFailure(result, serverMessage, english) { result.replaceChildren(); result.className = 'request-result cl7301-receipt'; const heading = document.createElement('strong'); heading.textContent = english ? 'The request was not submitted.' : '本次申请未完成提交。'; result.appendChild(heading); const copy = document.createElement('p'); copy.textContent = english ? 'No receipt reference was created. Please retry later or use the published email channel.' : (serverMessage || '系统未生成回执编号。请稍后重试,或通过页面公布的邮箱联系。'); result.appendChild(copy); const links = document.createElement('div'); links.className = 'cl7301-receipt__links'; const email = document.createElement('a'); email.href = 'mailto:Bioten@dbc.cn'; email.textContent = english ? 'Email Bioten@dbc.cn' : '邮件联系 Bioten@dbc.cn'; links.appendChild(email); result.appendChild(links); result.hidden = false; } function clearLegacyRequestStorage() { try { localStorage.removeItem(LEGACY_REQUEST_STORAGE_KEY); } catch (error) { // The form remains usable when browser storage is unavailable. } } function prepareRequestSecurityFields(form) { let privacyVersion = form.querySelector('input[name="privacy_notice_version"]'); if (!privacyVersion) { privacyVersion = document.createElement('input'); privacyVersion.type = 'hidden'; privacyVersion.name = 'privacy_notice_version'; form.prepend(privacyVersion); } privacyVersion.value = FORM_PRIVACY_NOTICE_VERSION; let startedAt = form.querySelector('input[name="form_started_at"]'); if (!startedAt) { startedAt = document.createElement('input'); startedAt.type = 'hidden'; startedAt.name = 'form_started_at'; form.prepend(startedAt); } if (!form.querySelector('input[name="fax_number"]')) { const honeypot = document.createElement('div'); honeypot.hidden = true; honeypot.setAttribute('aria-hidden', 'true'); honeypot.setAttribute('data-form-honeypot', ''); const input = document.createElement('input'); input.type = 'text'; input.name = 'fax_number'; input.tabIndex = -1; input.autocomplete = 'off'; honeypot.appendChild(input); form.prepend(honeypot); } refreshRequestStartTime(form); } function refreshRequestStartTime(form) { const startedAt = form.querySelector('input[name="form_started_at"]'); if (startedAt) startedAt.value = String(Date.now()); } function getSameOriginRequestEndpoint(form) { const fallback = '/api/paper-sample.php'; try { const endpoint = new URL((form.dataset.requestEndpoint || fallback).trim(), window.location.href); if (endpoint.origin !== window.location.origin) return fallback; return `${endpoint.pathname}${endpoint.search}`; } catch (error) { return fallback; } } function escapeHtml(value) { return String(value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function initSiteNavigation() { const header = document.querySelector('.site-header'); const nav = document.getElementById('site-nav'); const toggle = document.querySelector('.nav-toggle'); if (!header || !nav) return; setActiveNavigation(nav); if (toggle) { toggle.addEventListener('click', () => { const isOpen = header.classList.toggle('is-nav-open'); toggle.setAttribute('aria-expanded', String(isOpen)); }); } nav.querySelectorAll('.nav-item > .nav-link').forEach(link => { link.addEventListener('click', event => { if (!window.matchMedia('(max-width: 980px)').matches) return; const item = link.closest('.nav-item'); if (item && item.dataset.navSection === 'bioten') return; const menu = item && item.querySelector('.nav-menu'); if (!menu) return; event.preventDefault(); const willOpen = !item.classList.contains('is-open'); nav.querySelectorAll('.nav-item.is-open').forEach(openItem => { if (openItem !== item) openItem.classList.remove('is-open'); }); item.classList.toggle('is-open', willOpen); }); }); nav.addEventListener('click', event => { const link = event.target.closest('a[href]'); if (!link || link.classList.contains('nav-link')) return; header.classList.remove('is-nav-open'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); nav.querySelectorAll('.nav-item.is-open').forEach(item => item.classList.remove('is-open')); }); document.addEventListener('click', event => { if (header.contains(event.target)) return; header.classList.remove('is-nav-open'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); nav.querySelectorAll('.nav-item.is-open').forEach(item => item.classList.remove('is-open')); }); document.addEventListener('keydown', event => { if (event.key !== 'Escape') return; header.classList.remove('is-nav-open'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); nav.querySelectorAll('.nav-item.is-open').forEach(item => item.classList.remove('is-open')); }); } function setActiveNavigation(nav) { const pathname = window.location.pathname.toLowerCase(); const fileName = (pathname.split('/').pop() || 'index.html').toLowerCase(); const routePath = pathname.replace(/\/index\.html$/, '/'); const sectionMap = [ ['solutions', ['solutions', 'packaging', 'paper-sample']], ['products', ['bioten-products', '/bioten/products/']], ['lab', ['bioten-lab', '/bioten/lab/']], ['resources', ['resources', 'portal-login']], ['knowledge', ['knowledge']], ['about', ['about', 'contact', 'news']], ['bioten', ['bioten']], ['home', ['index.html', '_index.html']] ]; const active = sectionMap.find(([, keys]) => keys.some(key => fileName.includes(key) || routePath.includes(key))) || ['home']; nav.querySelectorAll('[data-nav-section]').forEach(item => { if (item.dataset.navSection === active[0]) { item.classList.add('is-active'); const link = item.matches('a') ? item : item.querySelector('.nav-link'); if (link) link.setAttribute('aria-current', 'page'); } }); nav.querySelectorAll('.nav-menu a[href]').forEach(link => { const href = link.getAttribute('href').split('#')[0].split('?')[0].toLowerCase(); if (href === fileName) { link.setAttribute('aria-current', 'page'); } }); }