fix: Broken header in public Help Center portal (#11704)
Fixes https://linear.app/chatwoot/issue/CW-4473/broken-header-in-help-center-portal
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
<header class="sticky top-0 z-50 w-full bg-white shadow-sm dark:bg-slate-900">
|
||||
<nav class="flex max-w-5xl px-4 mx-auto md:px-8" aria-label="Top">
|
||||
<nav class="hidden sm:flex max-w-5xl px-4 mx-auto md:px-8" aria-label="Top">
|
||||
<div class="flex items-center w-full py-5 overflow-hidden">
|
||||
<a href="<%= generate_home_link(@portal.slug, @portal.config['default_locale'] || params[:locale], @theme_from_params, @is_plain_layout_enabled) %>" class="flex items-center h-10 text-lg font-semibold text-slate-900 dark:text-white">
|
||||
<a href="<%= generate_home_link(@portal.slug, @portal.config['default_locale'] || params[:locale], @theme_from_params, @is_plain_layout_enabled) %>" class="flex items-center h-10">
|
||||
<% if @portal.logo.present? %>
|
||||
<img src="<%= url_for(@portal.logo) %>" class="w-auto h-10 ltr:mr-2 rtl:ml-2" />
|
||||
<% end %>
|
||||
<%= @portal.name %>
|
||||
<span class="text-lg font-semibold text-slate-900 dark:text-white <%= @portal.logo.present? ? 'hidden' : 'hidden sm:block' %>"><%= @portal.name %></span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -42,8 +42,12 @@
|
||||
</div>
|
||||
</button>
|
||||
<%# Appearance dropdown section %>
|
||||
<div id="appearance-dropdown" data-current-theme="<%= @theme_from_params %>" class="absolute flex-col w-32 h-auto bg-white border border-solid rounded dark:bg-slate-900 top-9 ltr:right-1 rtl:left-1 border-slate-100 dark:border-slate-800" aria-hidden="true" style="display: none;" data-dropdown="appearance-dropdown">
|
||||
<button id="toggle-theme-button" data-theme="system" class="flex flex-row items-center justify-between gap-1 px-2 py-2 border-b border-solid border-slate-100 dark:border-slate-800 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100">
|
||||
<div id="appearance-dropdown"
|
||||
data-current-theme="<%= @theme_from_params %>"
|
||||
class="appearance-menu absolute hidden flex-col w-32 h-auto bg-white border border-solid rounded dark:bg-slate-900 top-9 ltr:right-1 rtl:left-1 border-slate-100 dark:border-slate-800 shadow-lg transition-all duration-200 ease-out opacity-0 scale-95 data-[dropdown-open=true]:opacity-100 data-[dropdown-open=true]:scale-100 data-[dropdown-open=true]:flex"
|
||||
aria-hidden="true"
|
||||
data-dropdown="appearance-dropdown">
|
||||
<button class="desktop-theme-button flex flex-row items-center justify-between gap-1 px-2 py-2 border-b border-solid border-slate-100 dark:border-slate-800 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors" data-theme="system">
|
||||
<div class="flex flex-row items-center gap-1">
|
||||
<%= render partial: 'icons/monitor' %>
|
||||
<span class="text-xs font-medium"><%= I18n.t('public_portal.header.appearance.system') %></span>
|
||||
@@ -52,7 +56,7 @@
|
||||
<%= render partial: 'icons/check-mark' %>
|
||||
</span>
|
||||
</button>
|
||||
<button id="toggle-theme-button" data-theme="light" class="flex flex-row items-center justify-between gap-1 px-2 py-2 border-b border-solid border-slate-100 dark:border-slate-800 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100">
|
||||
<button class="desktop-theme-button flex flex-row items-center justify-between gap-1 px-2 py-2 border-b border-solid border-slate-100 dark:border-slate-800 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors" data-theme="light">
|
||||
<div class="flex flex-row items-center gap-1">
|
||||
<%= render partial: 'icons/sun' %>
|
||||
<span class="text-xs font-medium"><%= I18n.t('public_portal.header.appearance.light') %></span>
|
||||
@@ -61,7 +65,7 @@
|
||||
<%= render partial: 'icons/check-mark' %>
|
||||
</span>
|
||||
</button>
|
||||
<button id="toggle-theme-button" data-theme="dark" class="flex flex-row items-center justify-between gap-1 px-2 py-2 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100">
|
||||
<button class="desktop-theme-button flex flex-row items-center justify-between gap-1 px-2 py-2 stroke-slate-700 dark:stroke-slate-200 text-slate-800 dark:text-slate-100 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors rounded-b" data-theme="dark">
|
||||
<div class="flex flex-row items-center gap-1">
|
||||
<%= render partial: 'icons/moon' %>
|
||||
<span class="text-xs font-medium"><%= I18n.t('public_portal.header.appearance.dark') %></span>
|
||||
@@ -92,4 +96,22 @@
|
||||
<% end %>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<nav class="flex sm:hidden max-w-5xl px-4 mx-auto" aria-label="Mobile Top">
|
||||
<div class="flex items-center justify-between w-full py-5">
|
||||
<a href="<%= generate_home_link(@portal.slug, @portal.config['default_locale'] || params[:locale], @theme_from_params, @is_plain_layout_enabled) %>" class="flex items-center h-10 text-lg font-semibold text-slate-900 dark:text-white">
|
||||
<% if @portal.logo.present? %>
|
||||
<img src="<%= url_for(@portal.logo) %>" class="w-auto h-10 ltr:mr-2 rtl:ml-2" />
|
||||
<% end %>
|
||||
<span class="text-lg font-semibold text-slate-900 dark:text-white <%= @portal.logo.present? ? 'hidden' : 'sm:hidden block' %>"><%= @portal.name %></span>
|
||||
</a>
|
||||
|
||||
<!-- Mobile Menu Component -->
|
||||
<%= render partial: 'public/api/v1/portals/mobile_menu', locals: {
|
||||
portal: @portal,
|
||||
locale: @locale,
|
||||
theme_from_params: @theme_from_params
|
||||
} %>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
<% if !@is_plain_layout_enabled %>
|
||||
<section id="portal-bg" class="w-full bg-white dark:bg-slate-900 shadow-inner">
|
||||
<div id="portal-bg-gradient" class="pt-8 pb-8 md:pt-14 md:pb-6 min-h-[240px] md:min-h-[260px]">
|
||||
<div class="mx-auto max-w-5xl px-4 md:px-8 flex flex-col items-center sm:items-start">
|
||||
<div class="mx-auto max-w-5xl px-4 md:px-8 flex flex-col items-start">
|
||||
<span class="text-sm leading-[24px] font-semibold text-slate-600 dark:text-slate-300 mb-1 <%= @portal.logo.present? ? 'block' : 'hidden' %>"><%= @portal.name %></span>
|
||||
<h1 class="text-2xl md:text-4xl text-slate-900 dark:text-white font-semibold leading-normal">
|
||||
<%= portal.header_text %>
|
||||
</h1>
|
||||
<p class="text-slate-600 dark:text-slate-200 text-center text-lg leading-normal pt-4 pb-4"><%= I18n.t('public_portal.hero.sub_title') %></p>
|
||||
<p class="text-slate-600 dark:text-slate-200 text-start text-lg leading-normal pt-2 pb-4"><%= I18n.t('public_portal.hero.sub_title') %></p>
|
||||
<div id="search-wrap" class="w-full"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
83
app/views/public/api/v1/portals/_mobile_menu.html.erb
Normal file
83
app/views/public/api/v1/portals/_mobile_menu.html.erb
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
<input type="checkbox" id="mobile-menu-toggle" class="peer/menu hidden" />
|
||||
|
||||
<label for="mobile-menu-toggle" class="relative p-2 text-slate-700 dark:text-slate-200 cursor-pointer z-[60] hover:bg-slate-100 dark:hover:bg-slate-800 rounded-lg transition-colors" aria-label="Toggle menu">
|
||||
<%= render partial: 'icons/hamburger' %>
|
||||
</label>
|
||||
|
||||
<div class="fixed inset-0 z-[1000] invisible select-none opacity-0 peer-checked/menu:visible peer-checked/menu:opacity-100 transition-all duration-300 sm:hidden">
|
||||
<div class="w-full h-full bg-white dark:bg-slate-900 shadow-xl transition-transform duration-300 ease-out">
|
||||
<div class="flex flex-col h-full">
|
||||
<div class="flex items-center justify-end py-5 px-4 border-b border-slate-100 dark:border-slate-800">
|
||||
<label for="mobile-menu-toggle" class="p-2 text-slate-700 dark:text-slate-200 cursor-pointer hover:bg-slate-100 dark:hover:bg-slate-800 rounded-lg transition-colors" aria-label="Close menu">
|
||||
<%= render partial: 'icons/close' %>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="flex-1 overflow-y-auto px-5 pb-5 pt-2 flex flex-col gap-4">
|
||||
|
||||
<!-- Theme Switcher Section -->
|
||||
<div class="flex flex-col gap-2">
|
||||
<h3 class="text-base font-medium text-slate-700 dark:text-slate-300 my-2">
|
||||
<%= I18n.t('public_portal.header.appearance.title', default: 'Appearance') %>
|
||||
</h3>
|
||||
<div id="mobile-appearance-dropdown" data-current-theme="<%= @theme_from_params %>" class="appearance-menu space-y-1">
|
||||
<button class="mobile-theme-button group flex items-center gap-3 justify-start w-full py-2 hover:text-slate-700 dark:hover:text-slate-200 text-slate-800 dark:text-slate-100 transition-colors stroke-slate-800 dark:stroke-slate-100" data-theme="system">
|
||||
<%= render partial: 'icons/monitor' %>
|
||||
<span class="text-lg font-medium"><%= I18n.t('public_portal.header.appearance.system') %></span>
|
||||
<span class="check-mark-icon system-theme">
|
||||
<%= render partial: 'icons/check-mark' %>
|
||||
</span>
|
||||
</button>
|
||||
<button class="mobile-theme-button group flex items-center gap-3 justify-start w-full py-2 hover:text-slate-700 dark:hover:text-slate-200 text-slate-800 dark:text-slate-100 transition-colors stroke-slate-800 dark:stroke-slate-100" data-theme="light">
|
||||
<%= render partial: 'icons/sun' %>
|
||||
<span class="text-lg font-medium"><%= I18n.t('public_portal.header.appearance.light') %></span>
|
||||
<span class="check-mark-icon light-theme">
|
||||
<%= render partial: 'icons/check-mark' %>
|
||||
</span>
|
||||
</button>
|
||||
<button class="mobile-theme-button group flex items-center gap-3 justify-start py-2 hover:text-slate-700 dark:hover:text-slate-200 text-slate-800 dark:text-slate-100 transition-colors stroke-slate-800 dark:stroke-slate-100" data-theme="dark">
|
||||
<%= render partial: 'icons/moon' %>
|
||||
<span class="text-lg font-medium"><%= I18n.t('public_portal.header.appearance.dark') %></span>
|
||||
<span class="check-mark-icon dark-theme">
|
||||
<%= render partial: 'icons/check-mark' %>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="h-px bg-slate-100/70 dark:bg-slate-800/70 w-full"></span>
|
||||
|
||||
<!-- Locale Switcher -->
|
||||
<% if @portal.config["allowed_locales"].length > 1 %>
|
||||
<div id="header-action-button" class="flex flex-col gap-2">
|
||||
<h3 class="text-base font-medium text-slate-700 dark:text-slate-300 my-2">
|
||||
<%= I18n.t('public_portal.header.language', default: 'Language') %>
|
||||
</h3>
|
||||
<div class="flex items-center gap-3 py-2 cursor-pointer stroke-slate-800 dark:stroke-slate-100">
|
||||
<%= render partial: 'icons/globe' %>
|
||||
<select
|
||||
data-portal-slug="<%= @portal.slug %>"
|
||||
class="flex-1 bg-transparent text-lg font-medium cursor-pointer focus:outline-none locale-switcher text-slate-800 dark:text-slate-100 hover:text-slate-700 dark:hover:text-slate-200"
|
||||
>
|
||||
<% @portal.config["allowed_locales"].each do |locale| %>
|
||||
<option <%= locale == @locale ? 'selected': '' %> value="<%= locale %>"><%= "#{language_name(locale)} (#{locale})" %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<span class="h-px bg-slate-100/70 dark:bg-slate-800/70 w-full"></span>
|
||||
|
||||
<!-- Homepage Link -->
|
||||
<% if @portal.homepage_link %>
|
||||
<a href="<%= @portal.homepage_link %>" target="_blank" rel="noopener noreferrer nofollow" class="flex items-center gap-3 py-2 cursor-pointer stroke-slate-800 dark:stroke-slate-100 text-slate-800 dark:text-slate-100 hover:text-slate-700 dark:hover:text-slate-200 transition-colors">
|
||||
<%= render partial: 'icons/redirect' %>
|
||||
<span class="text-lg font-medium"><%= I18n.t('public_portal.header.visit_website') %></span>
|
||||
</a>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user