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\)/)