Files
wordpress-theme-aksrt/assets/js/core/footer-tabbar.js
T
kate522andClaude Opus 5 35bb96e82f refactor: rename the theme brand and every identifier from AKSRT to Jio
Full-project rename. `git grep -i aksrt` is now empty apart from the
DBMigrator 3.3.0 changelog note that documents the rename itself.

Code identifiers
- PHP namespace AKSRT\ -> Jio\ (composer PSR-4 + 378 declarations)
- global constants AKSRT_* -> JIO_* (VERSION/DIR/URI, PAY_TYPE_*, CAPTCHA_*)
- procedural functions, hooks, options, meta keys, table names,
  cookies, query vars, ajax actions and nonces: aksrt_ -> jio_
- text domain aksrt -> jio; Theme Name -> Jio
- JS globals: aksrtData/aksrtAdminData/... -> jioData/jioAdminData/...,
  window.AKSRTCaptcha & friends -> window.JioCaptcha, Aksrt* -> Jio*
- Vue components Aks*.vue -> Jio*.vue (15 files renamed + imports)
- CSS classes/data-attrs/custom properties: aksrt- -> jio-
- REST namespace aksrt/v1 -> jio/v1 (incl. payment gateway callbacks)

Storage layer
- DB tables {prefix}aksrt_* -> {prefix}jio_*; SCHEMA_VERSION 3.2.0 -> 3.3.0
  so dbDelta creates the new names on install
- widget id_base aksrt_widget_* -> jio_widget_*
- uninstall.php drop list rebuilt from the actual migrator tables
  (dropped 3 stale entries, added the 17 missing ones)

Removed
- hardcoded https://api.aksrt.com/version.json default update endpoint;
  get_endpoint() now reads the 「更新端点」 setting and do_check() no-ops
  when it is empty

Files renamed: inc/helpers/aksrt-*.php -> jio-*.php (54),
assets/admin/src/components/form/Aks*.vue -> Jio*.vue (15).
Build artifacts regenerated: assets/css/build, assets/js/runtime,
assets/admin/build.

Verified: audit-psr4-paths errors=0, audit-admin-contracts errors=0
(warnings=56, unchanged baseline), 813/813 widget-system tests,
44/44 phpunit, php -l clean across all PHP.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-01 20:05:04 +08:00

146 lines
3.8 KiB
JavaScript

/**
* Jio Footer Tabbar
*/
(function () {
"use strict";
function initFooterTabbar() {
var tabbar = document.getElementById("footer-tabbar");
if (!tabbar || tabbar.dataset.jioTabbarInit === "1") return;
tabbar.dataset.jioTabbarInit = "1";
var addBackdrop = document.getElementById("tabbar-add-backdrop");
var ticking = false;
var scrollThreshold = 100;
var isHidden = false;
// Use body scroll bus classes from runtime/main.js
function handleScrollDownHide() {
var body = document.body;
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > scrollThreshold) {
if (body.classList.contains("scroll-down") && !isHidden) {
// 向下滚动 - 隐藏
tabbar.classList.add("is-hidden");
isHidden = true;
} else if (body.classList.contains("scroll-up") && isHidden) {
tabbar.classList.remove("is-hidden");
isHidden = false;
}
} else {
tabbar.classList.remove("is-hidden");
isHidden = false;
}
}
// 返回顶部按钮切换
function handleOntopWrap() {
var ontopWraps = tabbar.querySelectorAll(".tabbar-ontop-wrap");
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
ontopWraps.forEach(function (wrap) {
if (scrollTop > scrollThreshold) {
wrap.classList.add("is-scrolled");
} else {
wrap.classList.remove("is-scrolled");
}
});
}
// 滚动事件处理
function onScroll() {
if (!ticking) {
requestAnimationFrame(function () {
if (tabbar.classList.contains("scroll-down-hide")) {
handleScrollDownHide();
}
handleOntopWrap();
ticking = false;
});
ticking = true;
}
}
window.addEventListener("scroll", onScroll, { passive: true });
function closeAddPanels() {
document.querySelectorAll(".tabbar-add-panel").forEach(function (panel) {
panel.setAttribute("hidden", "");
});
if (addBackdrop) addBackdrop.setAttribute("hidden", "");
document.body.classList.remove("tabbar-add-open");
}
function openAddPanel(panelId) {
closeAddPanels();
var panel = document.getElementById(panelId);
if (!panel) return;
panel.removeAttribute("hidden");
if (addBackdrop) addBackdrop.removeAttribute("hidden");
document.body.classList.add("tabbar-add-open");
}
if (addBackdrop) {
addBackdrop.addEventListener("click", closeAddPanels);
}
document.addEventListener("keydown", function (e) {
if (e.key === "Escape") closeAddPanels();
});
// 返回顶部点击事件 + 双击首页刷新
var homeClickTimer = null;
tabbar.addEventListener("click", function (e) {
var addBtn = e.target.closest('.tabbar-item[data-type="add"]');
if (addBtn) {
e.preventDefault();
openAddPanel(addBtn.getAttribute("data-panel-id"));
return;
}
var searchBtn = e.target.closest('.tabbar-item[data-type="search"]');
if (searchBtn) {
e.preventDefault();
if (typeof window.__jioOpenSearchPanel === "function") {
window.__jioOpenSearchPanel();
}
return;
}
var ontopBtn = e.target.closest(".tabbar-ontop-btn");
if (ontopBtn) {
e.preventDefault();
window.scrollTo({ top: 0, behavior: "smooth" });
return;
}
// 双击首页Tab刷新页面
var homeBtn = e.target.closest('.tabbar-item[data-type="home"]');
if (homeBtn && tabbar.classList.contains("has-animation")) {
if (homeClickTimer) {
clearTimeout(homeClickTimer);
homeClickTimer = null;
window.location.reload();
return;
}
homeClickTimer = setTimeout(function () {
homeClickTimer = null;
}, 350);
}
});
document.addEventListener("click", function (e) {
if (e.target.closest("[data-close-tabbar-add-panel]")) {
closeAddPanels();
}
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initFooterTabbar);
} else {
initFooterTabbar();
}
})();