(() => { 'use strict'; if (window.__BIOTEN_PACKAGING_RELEASE_STREAM_V7151__) return; window.__BIOTEN_PACKAGING_RELEASE_STREAM_V7151__ = true; const root = document.documentElement; const body = document.body; const feed = window.BIOTEN_PACKAGING_RELEASE_FEED; if (!body || !feed || !Array.isArray(feed.items) || !feed.items.length) return; const items = [...feed.items]; // Lossless alternatives preserve every original image URL as a fallback. const losslessImageVariants = {"assets/images/packaging-v7160-r2/beauty-film-free-cartons.jpg": "/assets/images/packaging-v7160-r2/beauty-film-free-cartons-seo-lossless-20261021.webp", "assets/images/packaging-v7160-r2/coating-film-engineering.jpg": "/assets/images/packaging-v7160-r2/coating-film-engineering-seo-lossless-20261021.webp", "docs/assets/images/news/news-2026-08-06-bioten-pha/cms-image-3e3c55c7ddd97f0b.png": "/docs/assets/images/news/news-2026-08-06-bioten-pha/cms-image-3e3c55c7ddd97f0b-seo-lossless-20261021.webp"}; const typeMap = new Map((feed.contentTypes || []).map((item) => [item.id, item])); const stageMap = new Map((feed.evidenceStages || []).map((item) => [item.id, item])); const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)'); root.dataset.v7318ReleaseLanguage = 'component-managed-r17'; function language() { return root.dataset.lang === 'en' ? 'en' : 'zh'; } function localized(element, zh, en) { element.dataset.v720LanguageManaged = 'true'; element.dataset.zh = zh || ''; element.dataset.en = en || ''; element.textContent = language() === 'en' ? (en || '') : (zh || ''); return element; } function localizedAlt(image, zh, en) { image.dataset.v720LanguageManaged = 'true'; image.dataset.altZh = zh || ''; image.dataset.altEn = en || ''; image.alt = language() === 'en' ? (en || '') : (zh || ''); } function formatDate(value, locale) { if (!/^\d{4}-\d{2}-\d{2}$/.test(value || '')) return value || ''; const [year, month, day] = value.split('-'); if (locale === 'en') { const names = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']; return `${day} ${names[Number(month) - 1]} ${year}`; } return `${year}.${month}.${day}`; } function applyNewsDetailBehavior(link, url) { const pathname = String(url || '').split(/[?#]/, 1)[0].split('/').pop() || ''; if (!/^news-\d{4}-\d{2}-\d{2}-.+\.html$/i.test(pathname)) return link; link.target = '_blank'; link.rel = 'noopener noreferrer'; return link; } function labelsFor(item) { const type = typeMap.get(item.contentType) || {}; const stage = stageMap.get(item.evidenceStage) || {}; return { zh: [type.nameZh, stage.nameZh].filter(Boolean).join(' · '), en: [type.nameEn, stage.nameEn].filter(Boolean).join(' · ').toUpperCase() }; } function createHomeMini(item) { const link = document.createElement('a'); link.className = 'bp7140-release-mini'; link.href = item.url; applyNewsDetailBehavior(link, item.url); link.dataset.bp7151ReleaseId = item.id; const image = document.createElement('img'); if (losslessImageVariants[item.image]) image.srcset = losslessImageVariants[item.image]; image.src = item.image; image.width = 1200; image.height = 900; image.loading = 'lazy'; image.decoding = 'async'; localizedAlt(image, item.imageRoleZh, item.imageRoleEn); const copy = document.createElement('span'); copy.className = 'bp7140-release-mini__copy'; const meta = document.createElement('span'); const labels = labelsFor(item); localized(meta, labels.zh, labels.en); const title = document.createElement('strong'); localized(title, item.titleZh, item.titleEn); copy.append(meta, title); link.append(image, copy); return link; } function renderHomeGrid() { const grid = document.querySelector('[data-bp7151-home-release-grid]'); if (!grid) return; grid.replaceChildren(...items.slice(0, 3).map(createHomeMini)); } function createTickerItem(item, index) { const link = document.createElement('a'); link.className = 'bp7151-release-ticker__item'; link.href = item.url; applyNewsDetailBehavior(link, item.url); link.dataset.bp7151TickerItem = String(index); link.setAttribute('aria-hidden', 'true'); link.tabIndex = -1; const date = document.createElement('time'); date.dataset.v720LanguageManaged = 'true'; date.dateTime = item.publishedAt; date.dataset.dateZh = formatDate(item.publishedAt, 'zh'); date.dataset.dateEn = formatDate(item.publishedAt, 'en'); date.textContent = language() === 'en' ? date.dataset.dateEn : date.dataset.dateZh; const labels = labelsFor(item); const meta = document.createElement('span'); meta.className = 'bp7151-release-ticker__type'; localized(meta, labels.zh, labels.en); const title = document.createElement('strong'); localized(title, item.titleZh, item.titleEn); link.append(date, meta, title); return link; } function initTicker() { const ticker = document.querySelector('[data-bp7151-release-ticker]'); if (!ticker) return; const track = ticker.querySelector('[data-bp7151-ticker-track]'); const toggle = ticker.querySelector('[data-bp7151-ticker-toggle]'); const current = ticker.querySelector('[data-bp7151-ticker-index]'); const total = ticker.querySelector('[data-bp7151-ticker-count]'); const verticalRoll = ticker.dataset.bp7151TickerMotion === 'vertical-roll'; if (!track) return; if (toggle) toggle.dataset.v720LanguageManaged = 'true'; const entries = items.map(createTickerItem); track.replaceChildren(...entries); if (total) total.textContent = String(entries.length).padStart(2, '0'); let active = 0; let timer = 0; let settleTimer = 0; let userPaused = reduceMotion.matches || entries.length < 2; let interactionPaused = false; function updateToggle() { if (!toggle) return; const paused = userPaused || interactionPaused; const zh = paused ? '继续自动播放技术发布' : '暂停自动播放技术发布'; const en = paused ? 'Resume technology release rotation' : 'Pause technology release rotation'; toggle.setAttribute('aria-label', language() === 'en' ? en : zh); toggle.title = language() === 'en' ? en : zh; const icon = toggle.querySelector('[aria-hidden="true"]'); if (icon) icon.textContent = paused ? '▶' : 'Ⅱ'; toggle.setAttribute('aria-pressed', String(userPaused)); } function show(index) { const previous = active; active = (index + entries.length) % entries.length; entries.forEach((entry, entryIndex) => { const selected = entryIndex === active; entry.classList.remove('is-leaving'); entry.classList.toggle('is-active', selected); entry.setAttribute('aria-hidden', String(!selected)); entry.tabIndex = selected ? 0 : -1; }); if (verticalRoll && previous !== active) { const outgoing = entries[previous]; outgoing.classList.add('is-leaving'); window.clearTimeout(settleTimer); settleTimer = window.setTimeout(() => { outgoing.classList.remove('is-leaving'); }, 520); } if (current) current.textContent = String(active + 1).padStart(2, '0'); } function stop() { if (!timer) return; window.clearInterval(timer); timer = 0; } function start() { stop(); if (userPaused || interactionPaused || document.hidden || entries.length < 2) return; timer = window.setInterval(() => show(active + 1), 4800); } if (toggle) { toggle.addEventListener('click', () => { userPaused = !userPaused; updateToggle(); start(); }); } ticker.addEventListener('mouseenter', () => { interactionPaused = true; updateToggle(); stop(); }, { passive: true }); ticker.addEventListener('mouseleave', () => { interactionPaused = false; updateToggle(); start(); }, { passive: true }); ticker.addEventListener('focusin', () => { interactionPaused = true; updateToggle(); stop(); }); ticker.addEventListener('focusout', (event) => { if (ticker.contains(event.relatedTarget)) return; interactionPaused = false; updateToggle(); start(); }); document.addEventListener('visibilitychange', start); document.addEventListener('dbc:languagechange', updateToggle); show(0); updateToggle(); start(); } function createReleaseCard(item) { const article = document.createElement('article'); article.className = 'bp7140-route-card'; article.dataset.bp7140ReleaseCard = ''; article.dataset.bp7140Category = item.contentType; article.dataset.bp7140Reveal = ''; article.dataset.bp7151ReleaseId = item.id; const media = document.createElement('a'); media.className = 'bp7140-route-card__media'; media.href = item.url; applyNewsDetailBehavior(media, item.url); const image = document.createElement('img'); if (losslessImageVariants[item.image]) image.srcset = losslessImageVariants[item.image]; image.src = item.image; image.width = 1200; image.height = 900; image.loading = 'lazy'; image.decoding = 'async'; localizedAlt(image, item.imageRoleZh, item.imageRoleEn); media.append(image); const bodyElement = document.createElement('div'); bodyElement.className = 'bp7140-route-card__body'; const meta = document.createElement('div'); meta.className = 'bp7140-route-card__meta'; const label = document.createElement('span'); const labels = labelsFor(item); localized(label, labels.zh, labels.en); const stamp = document.createElement('time'); stamp.dataset.v720LanguageManaged = 'true'; stamp.dateTime = item.publishedAt; stamp.dataset.dateZh = `${formatDate(item.publishedAt, 'zh')} · ${item.id}`; stamp.dataset.dateEn = `${formatDate(item.publishedAt, 'en')} · ${item.id}`; stamp.textContent = language() === 'en' ? stamp.dataset.dateEn : stamp.dataset.dateZh; meta.append(label, stamp); const heading = document.createElement('h3'); const headingLink = document.createElement('a'); headingLink.href = item.url; applyNewsDetailBehavior(headingLink, item.url); localized(headingLink, item.titleZh, item.titleEn); heading.append(headingLink); const summary = document.createElement('p'); localized(summary, item.evidenceStateZh, item.evidenceStateEn); const action = document.createElement('a'); action.className = 'bp7151-release-card__primary'; action.href = item.url; applyNewsDetailBehavior(action, item.url); localized(action, '查看发布内容 →', 'Open release →'); const actions = document.createElement('div'); actions.className = 'bp7151-release-card__actions'; actions.append(action); if (item.documentUrl) { const documentLink = document.createElement('a'); documentLink.className = 'bp7151-release-card__document'; documentLink.href = item.documentUrl; documentLink.target = '_blank'; documentLink.rel = 'noopener noreferrer'; const documentLabel = document.createElement('span'); localized( documentLabel, item.documentLabelZh || '查看技术资料 TDS', item.documentLabelEn || 'View technical data sheet' ); const documentIcon = document.createElement('span'); documentIcon.className = 'bp7151-release-card__document-icon'; documentIcon.setAttribute('aria-hidden', 'true'); documentIcon.textContent = '↗'; documentLink.append(documentLabel, documentIcon); actions.append(documentLink); } bodyElement.append(meta, heading, summary, actions); article.append(media, bodyElement); return article; } function renderReleaseHub() { const grid = document.querySelector('[data-bp7151-release-grid]'); if (!grid) return; // The checked-in cards remain a no-JavaScript fallback. When the runtime is // active, replace them from the canonical feed so edits, additions, removals, // and ordering all remain single-source operations. grid.replaceChildren(...items.map(createReleaseCard)); document.querySelectorAll('[data-bp7151-release-count]').forEach((count) => { count.textContent = String(items.length).padStart(2, '0'); }); document.querySelectorAll('[data-bp7151-release-updated]').forEach((update) => { update.dataset.v720LanguageManaged = 'true'; update.dateTime = feed.summary?.newestPublishedAt || feed.updatedAt || ''; update.dataset.dateZh = formatDate(update.dateTime, 'zh'); update.dataset.dateEn = formatDate(update.dateTime, 'en'); update.textContent = language() === 'en' ? update.dataset.dateEn : update.dataset.dateZh; }); } function updateReleaseSchema() { const target = document.querySelector('[data-bp7151-release-schema]'); if (!target) return; const schema = { '@context': 'https://schema.org', '@type': 'CollectionPage', name: feed.channel?.nameZh || '博碳包装·新应用发布与合作申请', url: '/packaging-insights.html', description: feed.channel?.roleZh || '', inLanguage: ['zh-CN', 'en'], isPartOf: { '@type': 'WebSite', name: 'DBC 世界杯竞猜官网 · BIOTEN 博碳', url: '/' }, mainEntity: { '@type': 'ItemList', numberOfItems: items.length, itemListElement: items.map((item, index) => ({ '@type': 'ListItem', position: index + 1, url: `/${item.url}` })) } }; target.textContent = JSON.stringify(schema); } function syncRuntimeLanguage() { const currentLanguage = language(); document.querySelectorAll('[data-zh][data-en]').forEach((element) => { const value = currentLanguage === 'en' ? element.dataset.en : element.dataset.zh; if (typeof value === 'string' && element.textContent !== value) element.textContent = value; }); document.querySelectorAll('img[data-alt-zh][data-alt-en]').forEach((image) => { const value = currentLanguage === 'en' ? image.dataset.altEn : image.dataset.altZh; if (typeof value === 'string' && image.alt !== value) image.alt = value; }); document.querySelectorAll('[data-date-zh][data-date-en]').forEach((element) => { element.textContent = currentLanguage === 'en' ? element.dataset.dateEn : element.dataset.dateZh; }); } renderHomeGrid(); renderReleaseHub(); updateReleaseSchema(); initTicker(); syncRuntimeLanguage(); document.addEventListener('dbc:languagechange', syncRuntimeLanguage); body.dataset.bp7151FeedStatus = 'ready'; })();