From 73fcd4ed72afe9fbe882e6b4d9bec36ffa3d17fd Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 23 Aug 2026 18:26:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DXGJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/widgets/frontend.css | 2 +- src/WidgetSystem/Renderers/UserRenderer.php | 27 ++++++++++--------- .../page-display-contract.test.cjs | 14 ++++++---- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/assets/widgets/frontend.css b/assets/widgets/frontend.css index e612fe23..430e8758 100644 --- a/assets/widgets/frontend.css +++ b/assets/widgets/frontend.css @@ -126,7 +126,7 @@ .aksrt-widget-slider { height: var(--aksrt-slider-height); overflow: hidden; border-radius: var(--aksrt-widget-radius); background: #111; }.aksrt-widget-slider .swiper-slide, .aksrt-widget-slider .swiper-slide > a { position: relative; display: block; width: 100%; height: 100%; overflow: hidden; }.aksrt-widget-slider .swiper-slide > img, .aksrt-widget-slider .swiper-slide > video, .aksrt-widget-slider .swiper-slide > a > img, .aksrt-widget-slider .swiper-slide > a > video { width: 100%; height: 100%; object-fit: cover; }.aksrt-slide-copy { position: absolute; z-index: 2; right: 8%; bottom: 12%; left: 8%; color: #fff; text-shadow: 0 2px 12px rgba(0,0,0,.4); }.aksrt-slide-copy.is-center { top: 50%; bottom: auto; text-align: center; transform: translateY(-50%); }.aksrt-slide-copy.is-right-bottom { text-align: right; }.aksrt-slide-copy h3 { margin: 0; font-size: clamp(25px,4vw,44px); }.aksrt-slide-copy p { margin: 8px 0 0; }.aksrt-slide-layer { position: absolute; z-index: 1; inset: 0; width: 100%; height: 100%; object-fit: contain; pointer-events: none; }.aksrt-slider-combo { display: grid; grid-template-columns: minmax(0,2fr) minmax(240px,1fr); gap: 15px; }.aksrt-slider-combo__side { display: grid; gap: 15px; }.aksrt-slider-combo__side .aksrt-media-card { min-height: 0; }.aksrt-slider-combo__side .aksrt-media-card__media { aspect-ratio: 2/1; } -.aksrt-user-card { position: relative; overflow: hidden; border-radius: var(--main-radius,8px); background: var(--main-bg-color,#fff); box-shadow: 0 0 10px var(--main-shadow,rgba(116,116,116,.08)); text-align: center; }.aksrt-user-card__cover { height: 105px; background: var(--muted-border-color,#eee); background-position: center; background-size: cover; }.aksrt-user-card__body { position: relative; padding: 15px; }.aksrt-user-card__avatar { display: inline-block; margin-top: -62px; padding: 4px; border-radius: 50%; background: var(--main-bg-color,#fff); }.aksrt-user-card__avatar img { display: block; width: 84px; height: 84px; border-radius: 50%; object-fit: cover; }.aksrt-user-card.is-guest .aksrt-user-card__avatar { margin-top: -58px; }.aksrt-user-card h3 { margin: 7px 0; }.aksrt-user-card__identity { margin: 6px 0; }.aksrt-user-card__body > p { color: var(--muted-color,#8a8c98); }.aksrt-user-card__stats { display: flex; justify-content: center; gap: 24px; margin: 16px 0; }.aksrt-user-card__stats span { display: flex; flex-direction: column; font-size: 12px; color: var(--muted-color,#8a8c98); }.aksrt-user-card__stats b { color: inherit; font-size: 17px; }.aksrt-user-card__actions { display: flex; justify-content: center; gap: 9px; }.aksrt-user-card__actions > .aksrt-widget-button, .aksrt-user-card__actions > .aksrt-user-card__checkin { flex: 1 1 0; min-width: 0; }.aksrt-user-card__checkin > .aksrt-header-checkin { height: 100%; min-height: 40px; }.aksrt-user-card__checkin.is-primary > .aksrt-header-checkin { background: var(--focus-color,#ff5473) !important; color: #fff !important; }.aksrt-user-card__checkin.is-primary > .aksrt-header-checkin > i { color: inherit !important; }.aksrt-user-card__checkin.is-secondary > .aksrt-header-checkin { background: rgba(127,127,127,.12) !important; color: inherit !important; }.aksrt-user-card__checkin.is-secondary > .aksrt-header-checkin > i { color: inherit !important; }.aksrt-user-card__follow { position: absolute; top: 14px; right: 14px; padding: 5px 12px; border: 0; border-radius: 999px; background: var(--focus-color,#ff5473); color: #fff; cursor: pointer; }.aksrt-user-card__follow.is-following { background: rgba(0,0,0,.5); }.aksrt-user-card__posts { padding: 0 16px 16px; text-align: left; } +.aksrt-user-card { position: relative; overflow: hidden; border-radius: var(--main-radius,8px); background: var(--main-bg-color,#fff); box-shadow: 0 0 10px var(--main-shadow,rgba(116,116,116,.08)); text-align: center; }.aksrt-user-card__cover { height: 105px; overflow: hidden; background: var(--muted-border-color,#eee); background-position: center; background-size: cover; }.aksrt-user-card__cover img { display: block; width: 100%; height: 100%; object-fit: cover; }.aksrt-user-card__body { position: relative; padding: 15px; }.aksrt-user-card__avatar { display: inline-block; margin-top: -62px; padding: 4px; border-radius: 50%; background: var(--main-bg-color,#fff); }.aksrt-user-card__avatar img { display: block; width: 84px; height: 84px; border-radius: 50%; object-fit: cover; }.aksrt-user-card.is-guest .aksrt-user-card__avatar { margin-top: -58px; }.aksrt-user-card h3 { margin: 7px 0; }.aksrt-user-card__identity { margin: 6px 0; }.aksrt-user-card__body > p { color: var(--muted-color,#8a8c98); }.aksrt-user-card__guest-title { margin: 8px 0 14px; font-size: 14px; }.aksrt-user-card__guest-actions { display: flex; flex-wrap: nowrap; justify-content: center; gap: 10px; }.aksrt-user-card__guest-actions > .aksrt-widget-button { flex: 1 1 0; min-width: 0; }.aksrt-user-card__stats { display: flex; justify-content: center; gap: 24px; margin: 16px 0; }.aksrt-user-card__stats span { display: flex; flex-direction: column; font-size: 12px; color: var(--muted-color,#8a8c98); }.aksrt-user-card__stats b { color: inherit; font-size: 17px; }.aksrt-user-card__actions { display: flex; justify-content: center; gap: 9px; }.aksrt-user-card__actions > .aksrt-widget-button, .aksrt-user-card__actions > .aksrt-user-card__checkin { flex: 1 1 0; min-width: 0; }.aksrt-user-card__checkin > .aksrt-header-checkin { height: 100%; min-height: 40px; }.aksrt-user-card__checkin.is-primary > .aksrt-header-checkin { background: var(--focus-color,#ff5473) !important; color: #fff !important; }.aksrt-user-card__checkin.is-primary > .aksrt-header-checkin > i { color: inherit !important; }.aksrt-user-card__checkin.is-secondary > .aksrt-header-checkin { background: rgba(127,127,127,.12) !important; color: inherit !important; }.aksrt-user-card__checkin.is-secondary > .aksrt-header-checkin > i { color: inherit !important; }.aksrt-user-card__follow { position: absolute; top: 14px; right: 14px; padding: 5px 12px; border: 0; border-radius: 999px; background: var(--focus-color,#ff5473); color: #fff; cursor: pointer; }.aksrt-user-card__follow.is-following { background: rgba(0,0,0,.5); }.aksrt-user-card__posts { padding: 0 16px 16px; text-align: left; } .aksrt-user-ranking { display: grid; gap: 11px; margin: 0; padding: 0; list-style: none; }.aksrt-user-ranking li { display: flex; align-items: center; gap: 9px; }.aksrt-user-ranking__index { width: 24px; text-align: center; color: var(--muted-color,#8a8c98); font-weight: 700; }.aksrt-user-ranking__index.is-top { color: #f59e0b; }.aksrt-user-tile { display: flex; min-width: 0; flex: 1; align-items: center; gap: 10px; }.aksrt-user-tile img { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; }.aksrt-user-tile span { display: flex; min-width: 0; flex-direction: column; }.aksrt-user-tile strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.aksrt-user-tile small { color: var(--muted-color,#8a8c98); }.aksrt-user-list { --aksrt-cols: 4; }.aksrt-user-list article { padding: 14px; border-radius: 10px; background: var(--main-bg,#fff); box-shadow: 0 6px 20px rgba(31,35,48,.06); } .aksrt-user-card.no-cover .aksrt-user-card__avatar { margin-top: 0; }.aksrt-user-card__oauth { margin-top: 14px; } diff --git a/src/WidgetSystem/Renderers/UserRenderer.php b/src/WidgetSystem/Renderers/UserRenderer.php index 09d19632..a3aae397 100644 --- a/src/WidgetSystem/Renderers/UserRenderer.php +++ b/src/WidgetSystem/Renderers/UserRenderer.php @@ -29,8 +29,7 @@ final class UserRenderer { } /** - * 未登录卡片 — legacy parity zib_widget_ui_user(zibll inc/widgets/widget-user.php:29-43) - * 与 zib_get_user_singin_page_box(zibll inc/functions/user/user.php:178-203)。 + * 未登录卡片使用独立组件结构,避免嵌套全局 .widget 卡片外观。 */ private static function guest_card(array $i): string { $login = function_exists('aksrt_get_login_url') ? aksrt_get_login_url() : wp_login_url(); @@ -40,14 +39,17 @@ final class UserRenderer { $title = __('Hi!请登录', 'aksrt'); } + $card_classes = 'aksrt-user-card is-guest'; $cover = ''; if (!empty($i['show_cover'])) { - $cover = '
'; + $cover = '
'; + } else { + $card_classes .= ' no-cover'; } - $buttons = '' . esc_html__('登录', 'aksrt') . ''; + $buttons = '' . esc_html__('登录', 'aksrt') . ''; if (get_option('users_can_register')) { - $buttons .= '' . esc_html__('注册', 'aksrt') . ''; + $buttons .= '' . esc_html__('注册', 'aksrt') . ''; } $oauth_html = ''; @@ -58,16 +60,15 @@ final class UserRenderer { } } - $avatar = '' . aksrt_get_avatar_html(0, 80, ['class' => 'avatar fit-cover']) . ''; + $avatar = '' . aksrt_get_avatar_html(0, 80, ['class' => 'avatar fit-cover']) . ''; - return '
' . $cover - . '
' - . '
' . $avatar . '
' - . '
'; + . '
'; } private static function author_card(array $i): string { diff --git a/tests/widget-system/page-display-contract.test.cjs b/tests/widget-system/page-display-contract.test.cjs index d053d70f..1f3cdbc2 100644 --- a/tests/widget-system/page-display-contract.test.cjs +++ b/tests/widget-system/page-display-contract.test.cjs @@ -21,6 +21,7 @@ const frontendBaseCss = read('assets/css/frontend/base.css') const headerMenuButtons = read('inc/helpers/aksrt-header-menu-buttons.php') const frontendRenderer = read('src/WidgetSystem/FrontendRenderer.php') const userRenderer = read('src/WidgetSystem/Renderers/UserRenderer.php') +const widgetCss = read('assets/widgets/frontend.css') const headerNavbar = read('inc/helpers/header/aksrt-header-navbar.php') const headerUserbox = read('inc/helpers/aksrt-header-userbox.php') const headerSearch = read('inc/helpers/header/aksrt-header-menu-search.php') @@ -264,11 +265,14 @@ test('user profile widget owns its only card surface and keeps membership below assert.match(userRenderer, /aksrt-user-card__identity.*aksrt_render_user_identity_chips\(\$user_id, 'widget'\)/s) assert.doesNotMatch(userRenderer, /display_name\) \. '<\/a>' \. \(function_exists\('aksrt_render_vip_badge'/) assert.match(userRenderer, /\$variant = \$primary \? ' is-primary' : ' is-secondary'/) - // 未登录卡片复刻 zibll user-card 结构(zib_widget_ui_user + zib_get_user_singin_page_box) - assert.match(userRenderer, /user-card widget/) - assert.match(userRenderer, /signin-loader but jb-blue/) - assert.match(userRenderer, /signup-loader but jb-yellow/) - assert.doesNotMatch(userRenderer, /aksrt-user-card is-guest/) + // 未登录卡片使用独立结构,避免嵌套通用 .widget 卡片背景。 + assert.doesNotMatch(userRenderer, /user-card widget/) + assert.match(userRenderer, /aksrt-user-card is-guest/) + assert.match(userRenderer, /aksrt-user-card__guest-actions/) + assert.match(userRenderer, /signin-loader aksrt-widget-button is-primary/) + assert.match(userRenderer, /signup-loader aksrt-widget-button is-secondary/) + assert.match(userRenderer, /fa fas fa-fw fa-sign-in-alt/) + assert.match(widgetCss, /\.aksrt-user-card__guest-actions\s*\{[^}]*display:\s*flex;[^}]*flex-wrap:\s*nowrap;/s) assert.doesNotMatch(userRenderer, /aksrt-widget-button is-ghost/) })