diff --git a/src/Content/VipServiceModal.php b/src/Content/VipServiceModal.php
index ee809ce6..a41646ba 100644
--- a/src/Content/VipServiceModal.php
+++ b/src/Content/VipServiceModal.php
@@ -250,7 +250,7 @@ trait VipServiceModal {
// (参考主题源码写作 `!$min_val > $user_points`,因运算符优先级恒假,
// 此处按其原意取真实比较,保证提示分支可达。)
if ($min_points > $user_points) {
- $form = '
' . esc_html__('积分不足,暂时无法兑换', 'aksrt') . '
';
+ $form = '' . esc_html__('积分不足,暂时无法兑换', 'aksrt') . '
';
} else {
$form = ''
. '
'
diff --git a/tests/widget-system/vip-points-exchange-modal.test.cjs b/tests/widget-system/vip-points-exchange-modal.test.cjs
index e79d6754..294a2125 100644
--- a/tests/widget-system/vip-points-exchange-modal.test.cjs
+++ b/tests/widget-system/vip-points-exchange-modal.test.cjs
@@ -66,7 +66,9 @@ test('弹窗内容保持参考主题结构:标题/我的积分/卡片选择/
assert.match(modal, /name="action" value="points_initiate_pay"/);
assert.match(modal, /mt6 but jb-yellow btn-block radius padding-lg/);
assert.match(modal, /data-aksrt-vip-points-submit/);
- assert.match(modal, /badg c-red btn-block/);
+ // CTA 与积分不足状态都从卡片选择区留出 20px 上间距,避免状态切换时布局贴紧。
+ assert.match(modal, /\$form = '
'/);
+ assert.match(modal, /'
'/);
});
test('弹窗壳随 wp_footer 全局输出且不进入 catalog 载荷', () => {