Files
kate522 41366e7fc4 feat(auth): rebuild the sign-in surfaces on the shared sign-card contract
The login/register page and the auth modal had drifted into a parallel
system: floating-input fields, a sign-page-card shell and a bespoke
jio-auth-modal wrapper that none of the theme's own sign CSS targeted.
The reference card rules (.sign, .sign-img, .sign-content, .line-form-input,
.scale-placeholder, .social_loginbar, .title-h-left, #u_sign .modal-dialog,
.qrcode-signin-container) have been in main.css all along, so the fix is to
render the reference DOM instead of re-styling a second one.

auth-content.php now emits one .sign.jio-panel.blur-bg.relative card with a
.tab-content of #tab-sign-in / #tab-sign-up / #tab-resetpassword /
#tab-qrcode-signin / #tab-bind panes. Each pane opens with a
.title-h-left.fa-2x heading plus a .muted-color.px12 link, fields are
.relative.line-form.mb10 > .line-form-input + .scale-placeholder +
.line-form-line, the verification trigger is the .yztx.abs-right captchsubmit
button, and submits are .but.radius.jb-blue|jb-green.padding-lg.btn-block.
Social entries come from the shared render_social_buttons() separator +
.social_loginbar, and the OAuth bind pane uses the oauth-data-box avatar card.

The modal shell is #u_sign.modal > .modal-dialog > .sign-content >
.sign-img.absolute.hide-sm + .sign, and the page shell is the reference
.container.sign-page > .row.sign-row.gutters-5 > .col-md-6(.col-md-offset-6/
.col-md-offset-3).sign-col with a .fixed.lazyload background and a blurred
fixed footer. auth.js drives .in instead of .is-open, toggles the new
password/signin-mode/invite-gate controls and no longer touches the retired
markup. The page also drops two footer-hook removals that targeted functions
which no longer exist, and opts out of the fixed-nav offset.

The sign page's custom theme setting now actually applies: Router answers
jio_forced_theme_mode, jioData.themeForced wins over the stored cookie in
theme.js, theme-toggle positions are suppressed, and the page marks html/body
dark or white accordingly.

sign.css shrinks from ~114 lines of bespoke component styling to a thin
positioning layer, and the retired classes are gone rather than kept.

Verification: php -l on every changed PHP file, node --check on both JS files,
node --test across widget-system, navigation and front-submit (873 passing),
and tools/audit-psr4-paths.php / audit-admin-contracts.php both at 0 errors.
assets/js/runtime/main.min.js was rebuilt because theme.js gained the forced
theme branch.
2026-11-04 16:04:24 +08:00

86 lines
3.5 KiB
PHP

<?php
/**
* Auth frontend presentation helpers.
*
* @package Jio
*/
defined('ABSPATH') || exit;
if (!function_exists('jio_get_auth_agreement_view')) {
/**
* Build user-agreement checkbox contract for full-page and modal auth.
*
* @return array{enabled:bool,required:bool,label_html:string,field_name:string}
*/
function jio_get_auth_agreement_view(): array {
$enabled = false;
$privacy_enabled = false;
$required = false;
$page_ref = '';
$privacy_ref = '';
if (class_exists('\Jio\Settings\Settings') && method_exists('\Jio\Settings\Settings', 'user_agreement_settings')) {
$cfg = \Jio\Settings\Settings::user_agreement_settings();
$enabled = !empty($cfg['enabled']);
$privacy_enabled = !empty($cfg['privacy']);
$required = !empty($cfg['required']);
$page_ref = (string) ($cfg['page'] ?? '');
$privacy_ref = (string) ($cfg['privacy_page'] ?? '');
}
$url = '';
if ($page_ref !== '') {
if (ctype_digit($page_ref)) {
$permalink = get_permalink((int) $page_ref);
if (is_string($permalink) && $permalink !== '') {
$url = $permalink;
}
} else {
$url = esc_url_raw($page_ref);
}
}
$privacy_url = '';
if ($privacy_ref !== '') {
$privacy_url = ctype_digit($privacy_ref) ? (string) get_permalink((int) $privacy_ref) : esc_url_raw($privacy_ref);
}
$links = [];
if ($enabled) {
$links[] = $url !== '' ? sprintf('<a class="focus-color" href="%s" target="_blank" rel="noopener noreferrer">%s</a>', esc_url($url), esc_html__('用户协议', 'jio')) : esc_html__('用户协议', 'jio');
}
if ($privacy_enabled) {
$links[] = $privacy_url !== '' ? sprintf('<a class="focus-color" href="%s" target="_blank" rel="noopener noreferrer">%s</a>', esc_url($privacy_url), esc_html__('隐私协议', 'jio')) : esc_html__('隐私协议', 'jio');
}
$links_html = implode(esc_html__('、', 'jio'), $links);
$label_html = esc_html__('我已阅读并同意', 'jio') . implode(esc_html__('和', 'jio'), $links);
return [
'enabled' => $enabled || $privacy_enabled,
'required' => $required,
'links_html' => $links_html,
'label_html' => $label_html,
'field_name' => 'agree_terms',
];
}
}
if (!function_exists('jio_get_auth_sign_logo_html')) {
/**
* Shared logo block for the sign card (modal and /sign/).
*/
function jio_get_auth_sign_logo_html(): string {
$logo_url = class_exists('\Jio\Settings\Settings') ? \Jio\Settings\Settings::user_logo_url() : '';
$logo_dark_url = class_exists('\Jio\Settings\Settings') ? \Jio\Settings\Settings::user_logo_dark_url() : $logo_url;
$home = home_url('/');
$name = get_bloginfo('name');
if ($logo_url) {
$img = function_exists('jio_get_adaptive_theme_img')
? jio_get_adaptive_theme_img($logo_url, $logo_dark_url, $name)
: '<img src="' . esc_url($logo_url) . '" alt="' . esc_attr($name) . '">';
return '<div class="text-center"><div class="sign-logo box-body"><a href="' . esc_url($home) . '">' . $img . '</a></div></div>';
}
return '<div class="text-center"><div class="sign-logo box-body"><a href="' . esc_url($home) . '" class="sign-logo__text">' . esc_html(mb_substr((string) $name, 0, 2)) . '</a></div></div>';
}
}