diff --git a/assets/widgets/frontend.css b/assets/widgets/frontend.css index 3577b351..2329bb56 100644 --- a/assets/widgets/frontend.css +++ b/assets/widgets/frontend.css @@ -67,8 +67,10 @@ .zib-widget-wrap { padding:var(--aksrt-widget-space-top,0) var(--aksrt-widget-space-right,0) var(--aksrt-widget-space-bottom,0) var(--aksrt-widget-space-left,0); background-color:var(--aksrt-widget-bg-light,transparent); background-image:var(--aksrt-widget-bg-image-light,none); background-position:center; background-size:cover; } .dark-theme .zib-widget-wrap, [data-theme="dark"] .zib-widget-wrap { background-color:var(--aksrt-widget-bg-dark,var(--aksrt-widget-bg-light,transparent)); background-image:var(--aksrt-widget-bg-image-dark,var(--aksrt-widget-bg-image-light,none)); } .zib-widget-wrap .widget-container { position:relative; } -.aksrt-user-widget-wrap :where(a, button, input, select, textarea, [tabindex]):focus-visible { outline:3px solid var(--focus-color,#ff5473) !important; outline-offset:3px; } -.dark-theme .aksrt-user-widget-wrap :where(a, button, input, select, textarea, [tabindex]):focus-visible, [data-theme="dark"] .aksrt-user-widget-wrap :where(a, button, input, select, textarea, [tabindex]):focus-visible { outline-color:#ffd166 !important; } +.aksrt-user-widget-wrap :where(a, button, input, select, textarea, [tabindex]):focus-visible, +.aksrt-tab-posts-wrap :where(a, button, input, select, textarea, [tabindex]):focus-visible { outline:3px solid var(--focus-color,#ff5473) !important; outline-offset:3px; } +.dark-theme :is(.aksrt-user-widget-wrap, .aksrt-tab-posts-wrap) :where(a, button, input, select, textarea, [tabindex]):focus-visible, +[data-theme="dark"] :is(.aksrt-user-widget-wrap, .aksrt-tab-posts-wrap) :where(a, button, input, select, textarea, [tabindex]):focus-visible { outline-color:#ffd166 !important; } .user-card.zib-widget { padding:0; overflow:hidden; } .user-card.widget .user-info > .text-center > p:not(.muted-color) { white-space:nowrap; } @@ -155,7 +157,76 @@ .widget-tab-post .tab-content > .tab-pane { display: none; } .widget-tab-post .tab-content > .tab-pane.active { display: block; } .widget-tab-post, .term-aggregation { line-height:1.42857143; } +/* Public typography overrides Bootstrap headings. Match the reference widget + * without changing article headings elsewhere on the page. */ +.aksrt-tab-posts-wrap { font-size:14px; line-height:1.42857143; color:var(--main-color,#4e5358); } +.widget-tab-post .item-heading { font-weight:500; color:inherit; } +.widget-tab-post .item-heading.font-bold { font-weight:700; } +.widget-tab-post .posts-mini { vertical-align:baseline; } +.widget-tab-post .posts-mini-con { flex:auto; } .widget-tab-post .post_ajax_loader { min-height: 40px; } +/* Keep the reference's compact pagination after public pagination.css. */ +.widget-tab-post .pagenav { + display:block; + padding:20px 0; + line-height:1.4; + text-align:center; +} +.widget-tab-post .pagenav .page-numbers { + display:inline-block; + min-width:31px; + min-height:0; + margin:3px; + padding:6px 9px 5px; + border:0; + border-radius:3px; + background:var(--main-border-color); + color:var(--muted-color); + font-size:inherit; + line-height:inherit; + font-weight:400; +} +.widget-tab-post .pagenav a.page-numbers:hover { background:var(--main-border-color); color:var(--muted-color); opacity:.7; } +.widget-tab-post .pagenav .page-numbers > span { + display:inline; + min-width:0; + min-height:0; + margin:0; + padding:0; + border:0; + border-radius:0; + background:none; + color:inherit; + font-size:inherit; + line-height:inherit; +} +.widget-tab-post .pagenav .page-numbers > .ml6 { margin-left:6px; } +.widget-tab-post .pagenav .page-numbers > .mr6 { margin-right:6px; } +.widget-tab-post .pagenav .prev i, +.widget-tab-post .pagenav .next i { font-size:1.2em; } +.widget-tab-post .pagenav .pag-jump { display:inline-flex; position:relative; width:auto; align-items:center; justify-content:normal; gap:0; } +.widget-tab-post .pagenav .pag-jump .jump-input { + position:absolute; + inset:0; + width:100%; + min-width:0; + height:100%; + padding:5px 22px 5px 5px; + border-radius:3px; + opacity:0; + transition:.2s; +} +.widget-tab-post .pagenav .jump-input:focus, +.widget-tab-post .pagenav .pag-jump:hover .jump-input { opacity:1; } +.sidebar .widget-tab-post .pagenav { padding:10px 5px; } +.sidebar .widget-tab-post .theme-pagination { margin:10px; } +.sidebar .widget-tab-post .pagenav .page-numbers { min-width:28px; margin:2px; font-size:12px; } +@media (max-width:640px) { + .widget-tab-post .pagenav a.page-numbers { display:none; } + .widget-tab-post .pagenav a.next, + .widget-tab-post .pagenav a.prev { display:inline-block; } + .widget-tab-post .pagenav .page-numbers { min-width:28px; margin:2px; font-size:12px; } +} /* Widget pagination mirrors the reference .ajax-next rules while staying on the REST client. */ .theme-pagination { margin: 20px 0; } .theme-pagination .next-page a { border-radius: 30px; padding: 5px 15px; color: var(--muted-color, #8a8c98); opacity: .6; cursor: pointer; } diff --git a/assets/widgets/frontend.js b/assets/widgets/frontend.js index 9a7be9b3..bc8730cb 100644 --- a/assets/widgets/frontend.js +++ b/assets/widgets/frontend.js @@ -79,9 +79,9 @@ if (window.AksrtYiyan) window.AksrtYiyan.init(figure); } - function errorMarkup() { + function errorMarkup(page, append) { var i18n = config.i18n || {}; - return '
'; + return ''; } 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); diff --git a/inc/helpers/posts-renderer/config.php b/inc/helpers/posts-renderer/config.php index fcd76c3e..816522e9 100644 --- a/inc/helpers/posts-renderer/config.php +++ b/inc/helpers/posts-renderer/config.php @@ -38,6 +38,7 @@ if (!function_exists('aksrt_renderer_config')) { * @return array