diff --git a/assets/css/frontend/vip-modal.css b/assets/css/frontend/vip-modal.css index 261e7983..ed54c510 100644 --- a/assets/css/frontend/vip-modal.css +++ b/assets/css/frontend/vip-modal.css @@ -28,6 +28,15 @@ padding: 0; } +@media (max-width: 768px) { + .aksrt-modal-runtime.aksrt-vip-modal-shell.aksrt-modal-runtime--bottom .aksrt-modal-runtime__dialog { + width: 100%; + max-width: 100%; + max-height: calc(100vh - 20px); + border-radius: 16px 16px 0 0; + } +} + .payvip-modal { position: relative; padding: 18px 16px 16px; diff --git a/assets/js/pay-vip.js b/assets/js/pay-vip.js index 9dd08f53..22e6cb6e 100644 --- a/assets/js/pay-vip.js +++ b/assets/js/pay-vip.js @@ -516,7 +516,6 @@ url: "/pay/vip/modal", query: { vip_level: level }, className: "aksrt-vip-modal-shell", - mobileBottom: false, skeleton: '
加载中…
', telemetry: "vip", kind: "vip", diff --git a/tests/widget-system/page-display-contract.test.cjs b/tests/widget-system/page-display-contract.test.cjs index a6b1e033..f21b0415 100644 --- a/tests/widget-system/page-display-contract.test.cjs +++ b/tests/widget-system/page-display-contract.test.cjs @@ -27,6 +27,8 @@ const headerSearch = read('inc/helpers/header/aksrt-header-menu-search.php') const headerCss = read('assets/css/frontend/header-userbox.css') const vipCardRenderer = read('src/Content/VipServiceModal.php') const vipModalCss = read('assets/css/frontend/vip-modal.css') +const payVipJs = read('assets/js/pay-vip.js') +const modalRuntimeJs = read('assets/js/core/modal-runtime.js') const zibllMainCss = read('assets/vendor/zibll/css/main.css') function activeRepositorySource() { @@ -148,6 +150,14 @@ test('header VIP hover cards match the Zibll markup and style contract', () => { assert.match(zibllMainCss, /\.sub-vip-card \.vip-img\s*\{[^}]*display:\s*none;/s) }) +test('VIP purchase modal matches Zibll desktop-center and mobile-bottom positioning', () => { + const purchaseModal = payVipJs.slice(payVipJs.indexOf('function vipPay('), payVipJs.indexOf('function onDocClick(')) + + assert.doesNotMatch(purchaseModal, /mobileBottom:\s*false/) + assert.match(modalRuntimeJs, /options\.mobileBottom !== false && isMobile\(\)/) + assert.match(vipModalCss, /@media \(max-width: 768px\)[\s\S]*?\.aksrt-vip-modal-shell\.aksrt-modal-runtime--bottom \.aksrt-modal-runtime__dialog\s*\{[\s\S]*?width:\s*100%;[\s\S]*?max-height:\s*calc\(100vh - 20px\);[\s\S]*?border-radius:\s*16px 16px 0 0;/) +}) + test('schema REST saves are privileged, section-whitelisted, and deeply sanitized', () => { assert.match(controllerBase, /current_user_can\('manage_options'\)/) assert.match(controllerBase, /sanitize_payload\(\$domain, \$payload, \$section\)/)