Files
wordpress-theme-aksrt/tests/widget-system/runtime-assets-behavior-harness.php
T
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

99 lines
4.5 KiB
PHP

<?php
/** Exercise ScriptsPart1c's _win runtime version with an isolated asset tree. */
declare(strict_types=1);
define('ABSPATH', __DIR__ . DIRECTORY_SEPARATOR);
define('JIO_VERSION', 'theme-fallback');
define('JIO_URI', 'https://example.test/theme');
$GLOBALS['runtime_asset_fixture_root'] = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'jio-runtime-assets-' . bin2hex(random_bytes(6));
$GLOBALS['runtime_asset_localized'] = [];
mkdir($GLOBALS['runtime_asset_fixture_root'] . '/assets/js/runtime', 0777, true);
function get_template_directory(): string { return $GLOBALS['runtime_asset_fixture_root']; }
function get_template_directory_uri(): string { return 'https://example.test/theme'; }
function wp_enqueue_script(...$args): void { unset($args); }
function wp_enqueue_style(...$args): void { unset($args); }
function wp_register_script(...$args): void { unset($args); }
function wp_register_style(...$args): void { unset($args); }
function wp_localize_script(string $handle, string $object_name, array $data): bool {
$GLOBALS['runtime_asset_localized'][$handle][$object_name] = $data;
return true;
}
function __($text, $domain = null): string { return (string) $text; }
function sanitize_key($value): string { return preg_replace('/[^a-z0-9_-]/', '', strtolower((string) $value)) ?? ''; }
function home_url(string $path = '/'): string { return 'https://example.test' . $path; }
function admin_url(string $path = ''): string { return 'https://example.test/wp-admin/' . $path; }
function wp_login_url(): string { return 'https://example.test/login'; }
function wp_registration_url(): string { return 'https://example.test/register'; }
function wp_lostpassword_url(): string { return 'https://example.test/lost-password'; }
function rest_url(string $path = ''): string { return 'https://example.test/wp-json/' . $path; }
function esc_url_raw($url): string { return (string) $url; }
function get_allowed_mime_types(): array { return ['jpg|jpeg' => 'image/jpeg']; }
function wp_create_nonce(string $action): string { return 'nonce-' . $action; }
function get_query_var(string $name, $default = '') { return $default; }
function is_user_logged_in(): bool { return false; }
function get_current_user_id(): int { return 0; }
function wp_max_upload_size(): int { return 1048576; }
function is_page_template(string $template = ''): bool { return false; }
function apply_filters(string $hook, $value) { return $value; }
function jio_is_lazy(string $scope): bool { return false; }
function jio_get_lazy_thumb(string $size = ''): string { return 'https://example.test/lazy.svg'; }
function jio_get_default_avatar_url(): string { return 'https://example.test/avatar.png'; }
require dirname(__DIR__, 2) . '/src/Core/ScriptsPart1c.php';
class RuntimeAssetBehaviorHarness {
use \Jio\Core\ScriptsPart1c;
public function enqueue(): void {
$this->enqueue_public_fonts_js_and_data('https://example.test/theme', 'jio-public', [], false, false, false, false, JIO_VERSION, []);
}
private function resolve_frontend_routes(): array {
return ['orders' => '/orders', 'resources' => '/resources'];
}
}
function write_runtime_file(string $relative, int $mtime): void {
$path = get_template_directory() . '/assets/js/runtime/' . $relative;
if (!is_dir(dirname($path))) mkdir(dirname($path), 0777, true);
file_put_contents($path, '// ' . $relative);
touch($path, $mtime);
clearstatcache(true, $path);
}
function latest_runtime_version(): string {
$GLOBALS['runtime_asset_localized'] = [];
(new RuntimeAssetBehaviorHarness())->enqueue();
return (string) $GLOBALS['runtime_asset_localized']['loader_js']['_win']['ver'];
}
$baseTime = time() - 600;
write_runtime_file('main.js', $baseTime + 10);
write_runtime_file('main.min.js', $baseTime + 30);
write_runtime_file('imgbox.js', $baseTime + 20);
$versions = [latest_runtime_version()];
write_runtime_file('main.min.js', $baseTime + 40);
$versions[] = latest_runtime_version();
write_runtime_file('comment-tools.js', $baseTime + 50);
$versions[] = latest_runtime_version();
foreach (glob(get_template_directory() . '/assets/js/runtime/*.js') ?: [] as $file) unlink($file);
$versions[] = latest_runtime_version();
foreach (glob(get_template_directory() . '/assets/js/runtime/*') ?: [] as $file) {
if (is_dir($file)) rmdir($file);
}
rmdir(get_template_directory() . '/assets/js/runtime');
rmdir(get_template_directory() . '/assets/js');
rmdir(get_template_directory() . '/assets');
rmdir(get_template_directory());
echo json_encode([
'versions' => $versions,
'expected' => [(string) ($baseTime + 30), (string) ($baseTime + 40), (string) ($baseTime + 50), JIO_VERSION],
], JSON_THROW_ON_ERROR);