💄 fix(ui): логотип без обводки, крупные загрузчики, подпись «Работает на Chatballs»

Логотип организации в сайдбаре рисовался с рамкой и подложкой — снято,
знак стоит на прозрачном фоне.

Загрузчик портала до прихода манифеста и темы появлялся в левом верхнем
углу и только потом прыгал в центр: его стиль лежал в CSS портала, а этот
чанк грузится лениво, и первый кадр шёл без стилей. Стиль перенесён в
общий state.css, слой фиксирован на весь экран и центрирован независимо
от отступов документа. Загрузчик системы на экране входа в сессию и
загрузчик портала увеличены.

В футере всех шаблонов портала — подпись «Работает на Chatballs» со
ссылкой на chatballs.ru.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
AndreyandClaude Fable 5.1 committed 2026-09-14 07:31:50 +03:00
1 parent 234a3e43da
commit c286ba7903
10 files changed
+61 -17

No files matched your search

@@ -64,7 +64,7 @@ export function HelpCenterApp() {
);
}
if (!manifest || !themeReady) {
return <main className="help-boot-loading"><Loader size={44} /></main>;
return <main className="help-boot-loading"><Loader size={72} /></main>;
}
return route.articleSlug
? <HelpArticle manifest={manifest} articleSlug={route.articleSlug} />
@@ -42,11 +42,17 @@ export function HelpLayout({
</header>
<main>{children}</main>
<footer className="help-footer">
<a className="help-footer-brand" href={homeHref}>
<span className="help-brand-mark"><LogoIcon /></span>
<span>{portal.name}</span>
</a>
<span>{t("portals.knowledge_base_support")}</span>
<div className="help-footer-row">
<a className="help-footer-brand" href={homeHref}>
<span className="help-brand-mark"><LogoIcon /></span>
<span>{portal.name}</span>
</a>
<span>{t("portals.knowledge_base_support")}</span>
</div>
<span className="help-footer-powered">
{t("portals.powered_by")}{" "}
<a href="https://chatballs.ru" target="_blank" rel="noopener noreferrer">Chatballs</a>
</span>
</footer>
{portal.webWidgetKey && <PortalWebWidget widgetKey={portal.webWidgetKey} />}
</div>
@@ -153,17 +153,37 @@ html.help-center-document body {
}
.help-footer {
display: flex;
display: grid;
width: min(1024px, calc(100% - 48px));
margin: 80px auto 0;
padding: 34px 0 42px;
align-items: center;
justify-content: space-between;
gap: 18px;
border-top: 1px solid var(--help-line-soft);
color: var(--help-text-muted);
font-size: 14px;
}
.help-footer-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.help-footer-powered {
font-size: 12px;
opacity: 0.8;
}
.help-footer-powered a {
color: inherit;
text-decoration: underline;
text-underline-offset: 2px;
}
.help-footer-powered a:hover {
color: var(--help-ink);
}
.help-footer-brand {
gap: 9px;
font-size: 16px;
@@ -256,8 +276,7 @@ html.help-center-document body {
color: var(--help-text-muted);
}
.help-fatal,
.help-boot-loading {
.help-fatal {
display: grid;
min-height: 100vh;
place-content: center;
@@ -115,10 +115,14 @@
}
.help-footer {
gap: 14px;
margin-top: 54px;
}
.help-footer-row {
display: grid;
justify-content: start;
gap: 12px;
margin-top: 54px;
}
.help-support-launcher {
+1
View File
@@ -905,6 +905,7 @@ export const en: Record<MessageKey, Message> = {
"portals.invalid_yaml": "Invalid YAML",
"portals.ip_of_installation": "{value} · this installation's IP",
"portals.knowledge_base_support": "Knowledge base and support",
"portals.powered_by": "Powered by",
"portals.language": "Language",
"portals.language_2": "Language:",
"portals.language_3": "LANGUAGE",
+1
View File
@@ -906,6 +906,7 @@ export const ru = {
"portals.invalid_yaml": "Невалидный YAML",
"portals.ip_of_installation": "{value} · IP этой установки",
"portals.knowledge_base_support": "База знаний и поддержка",
"portals.powered_by": "Работает на",
"portals.language": "Язык",
"portals.language_2": "Язык:",
"portals.language_3": "ЯЗЫК",
+1 -2
View File
@@ -266,8 +266,7 @@
.hub-brand-mark.has-logo {
overflow: hidden;
color: inherit;
background: var(--surface-card);
border: 1px solid var(--n-7);
background: transparent;
}
.hub-brand-mark img {
+2 -2
View File
@@ -29,10 +29,10 @@ function SurfaceApp() {
}, [surface]);
if (surface === "loading") {
return <main className="help-boot-loading"><Loader size={44} /></main>;
return <main className="help-boot-loading"><Loader size={72} /></main>;
}
return surface === "help"
? <Suspense fallback={<main className="help-boot-loading"><Loader size={44} /></main>}><HelpCenterApp /></Suspense>
? <Suspense fallback={<main className="help-boot-loading"><Loader size={72} /></main>}><HelpCenterApp /></Suspense>
: <App />;
}
+14
View File
@@ -15,3 +15,17 @@
color: var(--n-3);
font-size: 13px;
}
/* Загрузчик портала до прихода манифеста и темы. Живёт в общем CSS, а не в
чанке портала: чанк грузится лениво, и первый кадр иначе рисуется без
стилей. Фиксированный слой на весь экран — центр не зависит от отступов
и высоты документа. */
.help-boot-loading {
position: fixed;
inset: 0;
display: grid;
place-items: center;
margin: 0;
background: var(--help-bg, var(--surface-page));
color: var(--help-ink, var(--text-body));
}
+1 -1
View File
@@ -108,7 +108,7 @@ export function LoadingState({ variant = "page" }: { variant?: "page" | "inline"
}
export function LoadingScreen() {
return <main className="state-screen"><div className="state-card"><LoadingState variant="inline" /></div></main>;
return <main className="state-screen"><LogoSpinner size={56} /></main>;
}
export function ErrorScreen({ retry }: { retry: () => void }) {