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.
99 lines
4.5 KiB
PHP
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);
|