feat(nav): deep 1:1 zibll search-box + navbar-search + newposts unify
Port aksrt_get_search_box/posts for menu_search and layout 1/3 slide; unify publish switch; expand user-box admin row; CSS/JS remote-box parity.
This commit is contained in:
1 parent
70f7ef71e1
commit
1d1fef50af
19 files changed
+980
-267
No files matched your search
@@ -14,12 +14,9 @@ if (!function_exists('aksrt_get_header_newposts_config')) :
|
||||
function aksrt_get_header_newposts_config(): array {
|
||||
$cfg = class_exists('\AKSRT\Settings\Settings')
|
||||
? \AKSRT\Settings\Settings::get_header_newposts_config()
|
||||
: ['enabled' => true, 'text' => __('发布', 'aksrt'), 'radius' => 20, 'class' => '', 'types' => []];
|
||||
$nav = class_exists('\AKSRT\Settings\Settings')
|
||||
? \AKSRT\Settings\Settings::get_header_nav_settings()
|
||||
: ['publish_btn' => true];
|
||||
// Single source: newposts enabled AND header publish switch.
|
||||
$cfg['enabled'] = !empty($cfg['enabled']) && !empty($nav['publish_btn']);
|
||||
: ['enabled' => true, 'text' => __('发布', 'aksrt'), 'radius' => 20, 'class' => 'jb-blue', 'types' => []];
|
||||
// Single source: header_newposts_enabled (zibll nav_newposts).
|
||||
// FacadeBulk maps publish_btn to the same setting.
|
||||
|
||||
$types = is_array($cfg['types'] ?? null) ? $cfg['types'] : [];
|
||||
if (!$types) {
|
||||
@@ -36,6 +33,9 @@ if (!function_exists('aksrt_get_header_newposts_config')) :
|
||||
}
|
||||
}
|
||||
$cfg['types'] = $types;
|
||||
if (empty($cfg['class'])) {
|
||||
$cfg['class'] = 'jb-blue';
|
||||
}
|
||||
return $cfg;
|
||||
}
|
||||
endif;
|
||||
@@ -60,7 +60,6 @@ if (!function_exists('aksrt_get_new_add_actions')) :
|
||||
'type' => 'post',
|
||||
'url' => $url,
|
||||
'label' => __('写文章', 'aksrt'),
|
||||
// FA5 free solid names (avoid FA4 aliases like file-text-o).
|
||||
'icon' => 'fas fa-file-alt',
|
||||
];
|
||||
} elseif ($type === 'topic') {
|
||||
@@ -104,28 +103,24 @@ if (!function_exists('aksrt_normalize_header_cta_label')) :
|
||||
return '<i class="' . esc_attr($fallback_icon) . '" aria-hidden="true"></i> ' . esc_html__('发布', 'aksrt');
|
||||
}
|
||||
|
||||
// Common FA4 → FA5 renames used in admin defaults.
|
||||
$replacements = [
|
||||
'fa-file-text-o' => 'fa-file-alt',
|
||||
'fa-file-text' => 'fa-file-alt',
|
||||
'fa-pencil-square-o' => 'fa-edit',
|
||||
'fa-pencil' => 'fa-pen',
|
||||
'fa-comments-o' => 'fa-comments',
|
||||
'fa-clock-o' => 'fa-clock',
|
||||
'fa-calendar-check-o'=> 'fa-calendar-check',
|
||||
'fa-diamond' => 'fa-gem',
|
||||
'fa-file-text-o' => 'fa-file-alt',
|
||||
'fa-file-text' => 'fa-file-alt',
|
||||
'fa-pencil-square-o' => 'fa-edit',
|
||||
'fa-pencil' => 'fa-pen',
|
||||
'fa-comments-o' => 'fa-comments',
|
||||
'fa-clock-o' => 'fa-clock',
|
||||
'fa-calendar-check-o' => 'fa-calendar-check',
|
||||
'fa-diamond' => 'fa-gem',
|
||||
];
|
||||
$label = strtr($label, $replacements);
|
||||
|
||||
// Ensure icon uses fas (FA5 solid) when only bare "fa " is present.
|
||||
$label = preg_replace('/\bclass=(["\'])fa\s+/', 'class=$1fas ', $label) ?? $label;
|
||||
$label = preg_replace('/<i\s+class=(["\'])(?!fas\b|far\b|fab\b)/', '<i class=$1fas ', $label) ?? $label;
|
||||
|
||||
// If label is plain text without icon markup, prefix default icon.
|
||||
if (stripos($label, '<i') === false) {
|
||||
$label = '<i class="' . esc_attr($fallback_icon) . '" aria-hidden="true"></i> <span class="navbar-cta-text">' . esc_html(wp_strip_all_tags($label)) . '</span>';
|
||||
} else {
|
||||
// Wrap remaining text nodes for flex alignment without raw text siblings.
|
||||
$label = preg_replace(
|
||||
'/(<\/i>)\s*([^<].*)$/u',
|
||||
'$1 <span class="navbar-cta-text">$2</span>',
|
||||
@@ -152,8 +147,8 @@ if (!function_exists('aksrt_render_new_add_btns')) :
|
||||
$label = __('发布', 'aksrt');
|
||||
}
|
||||
$label_html = aksrt_normalize_header_cta_label((string) $label, 'fas fa-pen');
|
||||
// Keep CTA paint classes (e.g. btn-primary) off multi-type wrapper so the
|
||||
// dropdown plate is not filled pink/primary; apply them on the toggle only.
|
||||
|
||||
// Split paint classes vs wrapper tokens.
|
||||
$class_tokens = preg_split('/\s+/', trim($class), -1, PREG_SPLIT_NO_EMPTY) ?: [];
|
||||
$cta_tokens = [];
|
||||
$wrap_tokens = ['newadd-btns'];
|
||||
@@ -161,35 +156,37 @@ if (!function_exists('aksrt_render_new_add_btns')) :
|
||||
if ($token === 'newadd-btns') {
|
||||
continue;
|
||||
}
|
||||
if ($token === 'btn-primary' || $token === 'but' || $token === 'navbar-cta') {
|
||||
if ($token === 'btn-primary' || $token === 'but' || $token === 'navbar-cta' || str_starts_with($token, 'jb-')) {
|
||||
$cta_tokens[] = $token;
|
||||
continue;
|
||||
}
|
||||
$wrap_tokens[] = $token;
|
||||
}
|
||||
if (!in_array('btn-primary', $cta_tokens, true)) {
|
||||
$cta_tokens[] = 'btn-primary';
|
||||
if (!$cta_tokens) {
|
||||
$cta_tokens[] = 'jb-blue';
|
||||
}
|
||||
if (!in_array('but', $cta_tokens, true)) {
|
||||
$cta_tokens[] = 'but';
|
||||
}
|
||||
$cta_class = trim(implode(' ', array_unique($cta_tokens)));
|
||||
|
||||
if (count($actions) === 1) {
|
||||
$a = $actions[0];
|
||||
// Prefer configured label; icon already embedded after normalize.
|
||||
return '<a rel="nofollow" class="' . esc_attr(trim(implode(' ', $wrap_tokens) . ' ' . $cta_class . ' but navbar-cta')) . '" href="' . esc_url($a['url']) . '">'
|
||||
return '<a rel="nofollow" class="' . esc_attr(trim(implode(' ', $wrap_tokens) . ' ' . $cta_class . ' navbar-cta')) . '" href="' . esc_url($a['url']) . '">'
|
||||
. $label_html
|
||||
. '</a>';
|
||||
}
|
||||
|
||||
// data-aksrt-newadd: JS portals the menu to body so chip width cannot track menu.
|
||||
$html = '<span class="' . esc_attr(trim(implode(' ', $wrap_tokens) . ' hover-show')) . '" data-aksrt-newadd="1">';
|
||||
$html .= '<button type="button" class="' . esc_attr(trim('but newadd-btns__toggle navbar-cta ' . $cta_class)) . '" aria-haspopup="menu" aria-expanded="false">'
|
||||
. $label_html
|
||||
. ' <i class="fas fa-caret-down" aria-hidden="true"></i></button>';
|
||||
$html .= '<div class="hover-show-con drop-newadd" role="menu" hidden>';
|
||||
// zibll: span.newadd-btns.hover-show > label + .hover-show-con.dropdown-menu.drop-newadd
|
||||
// data-aksrt-newadd: JS may portal menu to body so chip width cannot track menu.
|
||||
$html = '<span class="' . esc_attr(trim(implode(' ', $wrap_tokens) . ' hover-show ' . $cta_class)) . '" data-aksrt-newadd="1">';
|
||||
$html .= '<span class="newadd-btns__toggle navbar-cta">' . $label_html
|
||||
. ' <i class="fas fa-caret-down" aria-hidden="true"></i></span>';
|
||||
$html .= '<div class="hover-show-con dropdown-menu drop-newadd" role="menu">';
|
||||
foreach ($actions as $a) {
|
||||
$html .= '<a rel="nofollow" class="newadd-btns__item" role="menuitem" href="' . esc_url($a['url']) . '">';
|
||||
$html .= '<a rel="nofollow" class="btn-newadd newadd-btns__item" role="menuitem" href="' . esc_url($a['url']) . '">';
|
||||
$html .= '<i class="' . esc_attr($a['icon']) . '" aria-hidden="true"></i> '
|
||||
. '<span>' . esc_html($a['label']) . '</span>';
|
||||
. '<text>' . esc_html($a['label']) . '</text>';
|
||||
$html .= '</a>';
|
||||
}
|
||||
$html .= '</div></span>';
|
||||
@@ -202,22 +199,26 @@ if (!function_exists('aksrt_render_header_menu_buttons')) :
|
||||
* Publish + optional VIP open button for header CTA.
|
||||
*/
|
||||
function aksrt_render_header_menu_buttons(): string {
|
||||
$cfg = aksrt_get_header_newposts_config();
|
||||
$cfg = aksrt_get_header_newposts_config();
|
||||
$html = '';
|
||||
if (!empty($cfg['enabled'])) {
|
||||
$class = 'btn-primary navbar-newposts';
|
||||
if (!empty($cfg['class'])) {
|
||||
$class .= ' ' . $cfg['class'];
|
||||
// zibll default: but nowave jb-blue (+ radius).
|
||||
$class = 'but nowave navbar-newposts';
|
||||
$skin = trim((string) ($cfg['class'] ?? ''));
|
||||
if ($skin === '') {
|
||||
$skin = 'jb-blue';
|
||||
}
|
||||
$class .= ' ' . $skin;
|
||||
$radius = (int) ($cfg['radius'] ?? 20);
|
||||
$pill = !empty($cfg['radius_pill']) || $radius >= 16;
|
||||
if ($pill && !str_contains($class, 'radius')) {
|
||||
$class .= ' radius';
|
||||
}
|
||||
// Radius applied via CSS variable (zibll pill ≈ 20px when switch on).
|
||||
$radius_attr = $radius > 0 ? ' data-radius="' . esc_attr((string) $radius) . '" style="--navbar-cta-radius:' . $radius . 'px"' : '';
|
||||
$label = (string) ($cfg['text'] ?? __('发布', 'aksrt'));
|
||||
$btn = aksrt_render_new_add_btns($cfg['types'] ?? ['post'], $class, $label);
|
||||
$radius_attr = $radius > 0
|
||||
? ' data-radius="' . esc_attr((string) $radius) . '" style="--navbar-cta-radius:' . $radius . 'px"'
|
||||
: '';
|
||||
$label = (string) ($cfg['text'] ?? __('发布', 'aksrt'));
|
||||
$btn = aksrt_render_new_add_btns($cfg['types'] ?? ['post'], $class, $label);
|
||||
if ($btn !== '') {
|
||||
$html .= '<div class="navbar-form navbar-right navbar-but"' . $radius_attr . '>' . $btn . '</div>';
|
||||
}
|
||||
@@ -227,7 +228,7 @@ if (!function_exists('aksrt_render_header_menu_buttons')) :
|
||||
$user_id = get_current_user_id();
|
||||
$show_vip = false;
|
||||
if (class_exists('\AKSRT\Settings\Settings')) {
|
||||
$vs = \AKSRT\Settings\Settings::get_payment_vip_settings();
|
||||
$vs = \AKSRT\Settings\Settings::get_payment_vip_settings();
|
||||
$show_vip = !empty($vs['enabled']) && !empty(\AKSRT\Settings\Settings::get_header_nav_settings()['nav_pay_vip']);
|
||||
}
|
||||
if ($show_vip) {
|
||||
@@ -236,7 +237,7 @@ if (!function_exists('aksrt_render_header_menu_buttons')) :
|
||||
$is_vip = (int) aksrt_get_user_vip_level($user_id) > 0;
|
||||
}
|
||||
if (!$is_vip) {
|
||||
$cls = $user_id > 0 ? 'pay-vip' : 'signin-loader';
|
||||
$cls = $user_id > 0 ? 'pay-vip' : 'signin-loader';
|
||||
$hover = '';
|
||||
if (class_exists('\AKSRT\Content\VipService')) {
|
||||
$svc = \AKSRT\Content\VipService::get_instance();
|
||||
@@ -247,7 +248,7 @@ if (!function_exists('aksrt_render_header_menu_buttons')) :
|
||||
}
|
||||
}
|
||||
}
|
||||
$html .= '<div class="navbar-form navbar-right navbar-vip">';
|
||||
$html .= '<div class="navbar-form navbar-right navbar-vip">';
|
||||
// zibll: span.hover-show wraps button + .hover-show-con.sub-vip-card
|
||||
$html .= '<span class="hover-show inline-block navbar-vip-hover">';
|
||||
$html .= '<a class="but jb-red radius payvip-icon navbar-cta ' . esc_attr($cls) . '" href="javascript:;"'
|
||||
|
||||
Reference in new issue
Block a user