fix(widgets): align tabbed post layouts with reference

This commit is contained in:
kate522 committed 2026-10-29 20:31:39 +08:00
1 parent 17515cf9c5
commit fd034ff055
16 files changed
+1256 -37

No files matched your search

+42 -9
View File
@@ -79,9 +79,9 @@
if (window.AksrtYiyan) window.AksrtYiyan.init(figure);
}
function errorMarkup() {
function errorMarkup(page, append) {
var i18n = config.i18n || {};
return '<div class="aksrt-widget-request-error" role="alert"><span>' + (i18n.error || '加载失败,请重试。') + '</span><button type="button" data-widget-retry>' + (i18n.retry || '重试') + '</button></div>';
return '<div class="aksrt-widget-request-error" role="alert"><span>' + (i18n.error || '加载失败,请重试。') + '</span><button type="button" data-widget-retry data-retry-page="' + page + '" data-retry-append="' + (append ? '1' : '0') + '">' + (i18n.retry || '重试') + '</button></div>';
}
function itemsUrl(widget, instance, page, segment) {
@@ -142,6 +142,7 @@
var instance = owner.dataset.instance || container.dataset.instance;
var segment = container.dataset.segment || owner.dataset.segment || '';
if (!widget || !instance || !config.restUrl || container.dataset.loading === '1') return;
container.querySelectorAll(':scope > .aksrt-widget-request-error').forEach(function (error) { error.remove(); });
setBusy(container, true);
anchorLoader(container);
return fetch(itemsUrl(widget, instance, page, segment), { credentials: 'same-origin', headers: { Accept: 'application/json' } })
@@ -173,13 +174,14 @@
container.dataset.loaded = '1';
anchorLoader(container);
scan(container);
if (window.jQuery) window.jQuery(document).trigger('auto_fun');
})
.catch(function () {
var loader = loaderOf(container);
if (loader && loader.parentNode === container) {
loader.insertAdjacentHTML('beforebegin', errorMarkup());
loader.insertAdjacentHTML('beforebegin', errorMarkup(page, append));
} else {
container.insertAdjacentHTML('afterbegin', errorMarkup());
container.insertAdjacentHTML('afterbegin', errorMarkup(page, append));
}
})
.finally(function () { setBusy(container, false); });
@@ -187,12 +189,40 @@
function initItems(container) {
if (!once(container, 'Items')) return;
function jumpTo(input) {
var page = Math.min(Number(input.max), Math.floor(Number(input.value)));
if (!Number.isFinite(page) || page < 1 || page === Number(container.dataset.page || 1)) {
input.focus();
return;
}
loadItems(container, page, false);
}
container.addEventListener('input', function (event) {
if (!event.target.matches('[data-widget-jump]')) return;
event.stopPropagation();
var page = Math.floor(Number(event.target.value));
event.target.value = page > 0 ? String(Math.min(Number(event.target.max), page)) : '';
});
container.addEventListener('keydown', function (event) {
if (event.key !== 'Enter' || !event.target.matches('[data-widget-jump]')) return;
event.preventDefault();
event.stopPropagation();
jumpTo(event.target);
});
container.addEventListener('click', function (event) {
var jump = event.target.closest('[data-widget-jump-go]');
if (jump) {
event.preventDefault();
event.stopPropagation();
jumpTo(jump.parentElement.querySelector('[data-widget-jump]'));
return;
}
var retry = event.target.closest('[data-widget-retry]');
var trigger = event.target.closest('[data-next-page]');
var pageLink = event.target.closest('.page-numbers[data-widget-page]');
if (retry) {
loadItems(container, Number(container.dataset.page || 1), false);
event.preventDefault();
loadItems(container, Number(retry.dataset.retryPage || 1), retry.dataset.retryAppend === '1');
return;
}
if (trigger) {
@@ -217,6 +247,12 @@
var button = event.target.closest('[role="tab"][data-segment]');
if (!button) return;
event.preventDefault();
var nav = button.closest('[role="tablist"]');
if (nav && nav.scrollWidth > nav.clientWidth) {
var tabBounds = button.getBoundingClientRect();
var navBounds = nav.getBoundingClientRect();
nav.scrollTo({ left: nav.scrollLeft + tabBounds.left - navBounds.left + tabBounds.width / 2 - nav.clientWidth / 2, behavior: reducedMotion ? 'auto' : 'smooth' });
}
tabs.querySelectorAll('[role="tab"]').forEach(function (tab) {
tab.setAttribute('aria-selected', tab === button ? 'true' : 'false');
tab.setAttribute('tabindex', tab === button ? '0' : '-1');
@@ -227,10 +263,7 @@
item.classList.toggle('active', active); item.classList.toggle('in', active);
});
var panel = tabs.querySelector('[data-widget-items][data-segment="' + button.dataset.segment + '"]');
if (!panel) panel = tabs.querySelector('[data-widget-items]');
if (!panel) return;
panel.dataset.segment = button.dataset.segment;
panel.setAttribute('aria-labelledby', button.id);
if (panel.dataset.loaded !== '1') loadItems(panel, 1, false);
});
}
@@ -311,7 +344,7 @@
scope.querySelectorAll('.aksrt-widget-video[data-video-url]').forEach(initVideo);
scope.querySelectorAll('.aksrt-widget-quote').forEach(initQuote);
scope.querySelectorAll('[data-widget-items]').forEach(initItems);
scope.querySelectorAll('.aksrt-widget-tabs, .widget-tab-post').forEach(initTabs);
scope.querySelectorAll('.widget-tab-post').forEach(initTabs);
scope.querySelectorAll('.aksrt-faq').forEach(initFaq);
scope.querySelectorAll('.aksrt-feature-intro').forEach(initFeatures);
scope.querySelectorAll('[data-count-up]').forEach(initCount);