diff --git a/assets/js/user-ban.js b/assets/js/user-ban.js index d28355d5..123c88bc 100644 --- a/assets/js/user-ban.js +++ b/assets/js/user-ban.js @@ -113,7 +113,13 @@ var form = shell.querySelector('[data-aksrt-appeal-form]'); if (!form || form.dataset.aksrtAppealBound === '1') return; form.dataset.aksrtAppealBound = '1'; - Array.prototype.forEach.call(form.querySelectorAll('textarea.form-control'), bindAutoHeight); + // autoHeight 仅对显式声明 autoHeight/maxHeight 的文本框生效: + // 申诉说明框(1:1 参考主题)为 rows=3 自然高度 + 容器滚动, + // 无 maxHeight 时执行 grow 会被压成 0px。 + Array.prototype.forEach.call( + form.querySelectorAll('textarea[autoHeight], textarea[maxHeight]'), + bindAutoHeight + ); form.addEventListener('submit', function (event) { event.preventDefault(); submitAppeal(form); diff --git a/inc/helpers/user-ban.php b/inc/helpers/user-ban.php index e08aa156..19e28d47 100644 --- a/inc/helpers/user-ban.php +++ b/inc/helpers/user-ban.php @@ -89,8 +89,9 @@ function aksrt_get_user_ban_identity_badge(int $user_id, string $class = ''): st /** * 「查看禁封状态」入口(用户中心元信息位,参考主题 user_page_header_desc - * 钩子 / zib_get_user_ban_info_link:but 按钮 = 徽章 + 文案 + 右箭头, - * 点击经 data-aksrt-ban-info 委托打开禁封信息弹窗)。 + * 钩子 / zib_get_user_ban_info_link:but 按钮 = 内层 badg 徽章(带色)+ + * 右箭头,外层 but 为默认按钮色——不在内外两层重复着色)。 + * 点击经 data-aksrt-ban-info 委托打开禁封信息弹窗。 */ function aksrt_get_user_ban_info_link(int $user_id, string $class = ''): string { @@ -105,7 +106,8 @@ function aksrt_get_user_ban_info_link(int $user_id, string $class = ''): string if ($badge === '') { return ''; } - $classes = trim('but p2-10 ' . (string) $state['tone'] . ($class !== '' ? ' ' . $class : '')); + // 外层 but 不重复状态色:颜色仅由内层 badg 承载(1:1 参考主题)。 + $classes = trim('but p2-10' . ($class !== '' ? ' ' . $class : '')); return '' . $badge @@ -292,8 +294,10 @@ function aksrt_get_user_ban_appeal_modal(int $user_id): string } $desc_html = (string) $settings['desc'] !== '' ? '
' . wp_kses_post(nl2br(esc_html((string) $settings['desc']))) . '
' : ''; + // 滚动容器 1:1 参考主题申诉弹窗:scroll-y + mini-scrollbar(无侧边滚动栏)+ max-vh5(50vh, + // 内层滚动、外层对话框不滚动);说明框保持 rows=3 自然高度,不做 autoHeight 压缩。 $html .= '
' - . '
' . $info_box . $input . $desc_html . '
' + . '
' . $info_box . $input . $desc_html . '
' . $footer . '
'; $html .= ''; @@ -354,7 +358,7 @@ function aksrt_get_user_ban_log_modal(int $user_id): string } $html .= '
' . esc_html(sprintf(__('该用户共有%d次禁封记录', 'aksrt'), count($logs))) . '
'; - $html .= '
'; + $html .= '
'; $i = 1; foreach ($logs as $log) { $type = (string) ($log['type'] ?? ''); diff --git a/tests/widget-system/report-ban-contract.test.cjs b/tests/widget-system/report-ban-contract.test.cjs index 03f5498a..98a25628 100644 --- a/tests/widget-system/report-ban-contract.test.cjs +++ b/tests/widget-system/report-ban-contract.test.cjs @@ -208,6 +208,22 @@ test('ban prompt surface mirrors the reference theme modals and block page', () assert.match(userBanHelper, /您的申诉正在审核中,请耐心等待/) assert.match(userBanHelper, /name="data\[/) assert.match(userBanHelper, /详细的说明更容易通过审核喔/) + // 申诉弹窗滚动容器 1:1 参考主题:scroll-y + mini-scrollbar(无侧边滚动栏)+ max-vh5; + // 说明框保持 rows=3 自然高度(禁封弹窗留言框才有 autoHeight/maxHeight)。 + assert.match(userBanHelper, /scroll-y mini-scrollbar max-vh5/) + const appealModalFn = userBanHelper.slice(userBanHelper.indexOf('function aksrt_get_user_ban_appeal_modal')) + const appealModalBody = appealModalFn.slice(0, appealModalFn.indexOf('\n}')) + const appealTextarea = (appealModalBody.match(/]*>/) || [''])[0] + assert.ok(appealTextarea !== '' && appealTextarea.includes('rows="3"'), 'appeal textarea keeps natural rows=3 height') + assert.ok(!appealTextarea.includes('autoHeight'), 'appeal textarea must not opt into autoHeight') + assert.ok(!appealTextarea.includes('maxHeight'), 'appeal textarea must not carry maxHeight (bindAutoHeight would squash it to 0)') + // JS:autoHeight 仅对显式声明的文本框生效。 + assert.match(userBanJs, /querySelectorAll\('textarea\[autoHeight\], textarea\[maxHeight\]'\)/) + // 用户中心元信息按钮:外层 but 不重复状态色,颜色仅由内层 badg 承载。 + const infoLinkFn = userBanHelper.slice(userBanHelper.indexOf('function aksrt_get_user_ban_info_link')) + const infoLinkBody = infoLinkFn.slice(0, infoLinkFn.indexOf('\n}')) + assert.match(infoLinkBody, /\$classes = trim\('but p2-10'\s*\./) + assert.ok(!infoLinkBody.includes("'but p2-10 ' . (string) \$state['tone']"), 'outer but must not repeat the badge tone') // 申诉表单 data[key] 结构与后端兼容。 assert.match(banAppeal, /is_array\(\$_POST\['data'\]\)/) assert.match(banAppeal, /申诉说明/)