feat(widgets): simplify locations and paid sidebar
Remove deprecated widget locations and widgets, standardize sidebar labels, and render a compact paid-post purchase card in the article sidebar.
This commit is contained in:
1 parent
51d2ab3aa7
commit
bd7d3046a5
43 files changed
+294
-3581
No files matched your search
Vendored
-38
@@ -95,44 +95,6 @@
|
||||
setInterval(update, 1000);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 3. 合作伙伴无缝滚动 (marquee)
|
||||
* 用法:<div class="aksrt-marquee" data-speed="1">...内容...</div>
|
||||
* ============================================================ */
|
||||
function initMarquee() {
|
||||
document.querySelectorAll('.aksrt-marquee').forEach(function (el) {
|
||||
if (el.dataset.marqueeBound) return;
|
||||
el.dataset.marqueeBound = '1';
|
||||
|
||||
var speed = parseFloat(el.dataset.speed || '1');
|
||||
var inner = el.querySelector('.aksrt-marquee__inner') || el.children[0];
|
||||
if (!inner) return;
|
||||
|
||||
// 克隆内容实现无缝
|
||||
var clone = inner.cloneNode(true);
|
||||
el.appendChild(clone);
|
||||
|
||||
var pos = 0;
|
||||
var width = inner.scrollWidth;
|
||||
|
||||
function animate() {
|
||||
pos -= speed;
|
||||
if (Math.abs(pos) >= width) pos = 0;
|
||||
inner.style.transform = 'translateX(' + pos + 'px)';
|
||||
clone.style.transform = 'translateX(' + (pos + width) + 'px)';
|
||||
if (!reducedMotion) requestAnimationFrame(animate);
|
||||
}
|
||||
|
||||
if (!reducedMotion) {
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
|
||||
// 暂停/恢复
|
||||
el.addEventListener('mouseenter', function () { el.dataset.paused = '1'; });
|
||||
el.addEventListener('mouseleave', function () { delete el.dataset.paused; });
|
||||
});
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 4. 3D 悬停倾斜 (vanilla tilt)
|
||||
* 用法:<div data-aksrt-tilt data-tilt-max="15">...</div>
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
/**
|
||||
* AKSRT Frontend Translate — 前端即时翻译
|
||||
*
|
||||
* 渐进增强,默认关。通过 Settings 启用后,
|
||||
* 在语言切换 Widget 中添加"翻译本页"按钮,
|
||||
* 使用浏览器原生翻译或自定义翻译 API。
|
||||
*
|
||||
* @package AKSRT
|
||||
*/
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var config = (window.aksrtData && window.aksrtData.translate) || {};
|
||||
if (!config.enabled) return;
|
||||
|
||||
/**
|
||||
* 触发浏览器原生翻译(Chrome/Edge 内置)
|
||||
*/
|
||||
function triggerBrowserTranslate(targetLang) {
|
||||
// Chrome/Edge 有内置翻译功能
|
||||
if (document.querySelector('.goog-te-banner-frame') || document.querySelector('#goog-gt-tt')) {
|
||||
return; // 已经在翻译中
|
||||
}
|
||||
|
||||
// 尝试使用 Google Translate Element
|
||||
if (window.google && window.google.translate) {
|
||||
new google.translate.TranslateElement({
|
||||
pageLanguage: config.sourceLang || 'zh-CN',
|
||||
includedLanguages: targetLang || '',
|
||||
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
|
||||
autoDisplay: false,
|
||||
}, 'aksrt-translate-container');
|
||||
return;
|
||||
}
|
||||
|
||||
// 动态加载 Google Translate
|
||||
var script = document.createElement('script');
|
||||
script.src = '//translate.google.com/translate_a/element.js?cb=aksrtTranslateInit';
|
||||
document.head.appendChild(script);
|
||||
|
||||
window.aksrtTranslateInit = function () {
|
||||
if (!window.google || !window.google.translate) return;
|
||||
new google.translate.TranslateElement({
|
||||
pageLanguage: config.sourceLang || 'zh-CN',
|
||||
includedLanguages: targetLang || config.targetLang || 'en',
|
||||
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
|
||||
autoDisplay: false,
|
||||
}, 'aksrt-translate-container');
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建翻译容器和按钮
|
||||
*/
|
||||
function init() {
|
||||
// 检查是否有语言切换 Widget
|
||||
var langWidget = document.querySelector('.aksrt-lang-switch, [data-aksrt-lang-switch]');
|
||||
if (!langWidget && !config.showButton) return;
|
||||
|
||||
// 创建隐藏的翻译容器
|
||||
var container = document.createElement('div');
|
||||
container.id = 'aksrt-translate-container';
|
||||
container.style.cssText = 'position:fixed;top:-9999px;left:-9999px;visibility:hidden;';
|
||||
document.body.appendChild(container);
|
||||
|
||||
// 如果配置了显示按钮,在语言切换 Widget 旁添加
|
||||
if (config.showButton && langWidget) {
|
||||
var btn = document.createElement('button');
|
||||
btn.type = 'button';
|
||||
btn.className = 'aksrt-translate-btn';
|
||||
btn.innerHTML = '<i class="fas fa-language"></i> 翻译本页';
|
||||
btn.addEventListener('click', function () {
|
||||
triggerBrowserTranslate(config.targetLang || 'en');
|
||||
btn.textContent = '翻译中...';
|
||||
btn.disabled = true;
|
||||
});
|
||||
langWidget.appendChild(btn);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', init);
|
||||
})();
|
||||
@@ -26,9 +26,9 @@
|
||||
document.querySelector('[data-nav="posts"]') ||
|
||||
document.querySelector('[data-nav]');
|
||||
|
||||
// Support multiple TOC shells (built-in single sidebar + WidgetPostsNavs).
|
||||
// The article sidebar and mobile drawer share one built-in TOC source.
|
||||
var tocWidgets = Array.prototype.slice.call(
|
||||
document.querySelectorAll('.posts-nav-box.toc-widget, .posts-nav-box[data-title]')
|
||||
document.querySelectorAll('.posts-nav-box.toc-widget')
|
||||
);
|
||||
var tocLists = [];
|
||||
tocWidgets.forEach(function (box) {
|
||||
|
||||
@@ -280,42 +280,6 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Feature intro media tabs.
|
||||
function initFeatureIntro() {
|
||||
document.querySelectorAll('[data-aksrt-feature-intro]').forEach(function (root) {
|
||||
if (root.dataset.aksrtFiBound === '1') return;
|
||||
root.dataset.aksrtFiBound = '1';
|
||||
var tabs = [].slice.call(root.querySelectorAll('.aksrt-fi__tab'));
|
||||
var panels = [].slice.call(root.querySelectorAll('.aksrt-fi__panel'));
|
||||
if (!tabs.length || !panels.length) return;
|
||||
function go(i) {
|
||||
tabs.forEach(function (t, idx) {
|
||||
t.classList.toggle('is-active', idx === i);
|
||||
});
|
||||
panels.forEach(function (p, idx) {
|
||||
p.classList.toggle('is-active', idx === i);
|
||||
var v = p.querySelector('video');
|
||||
if (!v) return;
|
||||
if (idx === i) {
|
||||
if (!v.getAttribute('src') && v.getAttribute('data-src')) {
|
||||
v.setAttribute('src', v.getAttribute('data-src'));
|
||||
}
|
||||
if (v.play) v.play().catch(function () {});
|
||||
} else if (v.pause) {
|
||||
v.pause();
|
||||
}
|
||||
});
|
||||
}
|
||||
tabs.forEach(function (t) {
|
||||
t.addEventListener('click', function () {
|
||||
go(parseInt(t.getAttribute('data-index') || '0', 10));
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function initFloatingQRCodes() {
|
||||
var wrap = document.querySelector('.float-right');
|
||||
if (!wrap) return;
|
||||
@@ -363,7 +327,6 @@
|
||||
initCategoryTabs();
|
||||
initProductTabs();
|
||||
initMainPostsLazy();
|
||||
initFeatureIntro();
|
||||
initFloatingQRCodes();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user