mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 09:14:58 +03:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bd76042d2 | ||
|
|
c286ba7903 | ||
|
|
234a3e43da | ||
|
|
17b0c9387f |
No files matched your search
@@ -498,7 +498,7 @@ MESSAGES: dict[str, object] = {
|
||||
"notifications.type_dialog_new_message": "A new message in my conversation",
|
||||
"notifications.type_dialog_assigned": "A conversation was assigned to me",
|
||||
"notifications.type_dialog_waiting_long": "A conversation has been waiting a long time",
|
||||
"notifications.type_ai_stopped": "AI stopped by an error or a limit",
|
||||
"notifications.type_ai_stopped": "AI stopped by an error",
|
||||
"integrations.check_no_connection": "No connection: {error}",
|
||||
"integrations.check_api_key_missing": "The API key is not set",
|
||||
"integrations.check_base_url_missing": "Base URL is not set",
|
||||
|
||||
@@ -502,7 +502,7 @@ MESSAGES: dict[str, object] = {
|
||||
"notifications.type_dialog_new_message": "Новое сообщение в моём диалоге",
|
||||
"notifications.type_dialog_assigned": "Диалог назначили на меня",
|
||||
"notifications.type_dialog_waiting_long": "Диалог долго ждёт человека",
|
||||
"notifications.type_ai_stopped": "AI остановлен ошибкой или лимитом",
|
||||
"notifications.type_ai_stopped": "AI остановлен ошибкой",
|
||||
"integrations.check_no_connection": "Нет связи: {error}",
|
||||
"integrations.check_api_key_missing": "Не указан API-ключ",
|
||||
"integrations.check_base_url_missing": "Не указан Base URL",
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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",
|
||||
@@ -1062,7 +1063,7 @@ export const en: Record<MessageKey, Message> = {
|
||||
"onboarding.s1.name": "AI provider",
|
||||
"onboarding.s1.time": "3 min",
|
||||
"onboarding.s1.title": "Connect an AI provider",
|
||||
"onboarding.s1.lead": "Without a provider the agent cannot answer anyone. The key is yours: spend, limits and tokens are all counted in the system.",
|
||||
"onboarding.s1.lead": "Without a provider the agent cannot answer anyone. The key is yours: you pay the provider at your own rate.",
|
||||
"onboarding.s1.path": "Settings → AI provider → Add provider",
|
||||
"onboarding.s1.do_1": "Open Settings in the sidebar and pick the AI provider section.",
|
||||
"onboarding.s1.do_2": "Click Add provider: OpenRouter, Custom (OpenAI-compatible) or a local model.",
|
||||
|
||||
@@ -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": "ЯЗЫК",
|
||||
@@ -1063,7 +1064,7 @@ export const ru = {
|
||||
"onboarding.s1.name": "AI-провайдер",
|
||||
"onboarding.s1.time": "3 мин",
|
||||
"onboarding.s1.title": "Подключите AI-провайдера",
|
||||
"onboarding.s1.lead": "Без провайдера агент не ответит ни одному клиенту. Ключ ваш: расходы, лимиты и токены считаются в системе.",
|
||||
"onboarding.s1.lead": "Без провайдера агент не ответит ни одному клиенту. Ключ ваш: расходы идут по вашему тарифу у провайдера.",
|
||||
"onboarding.s1.path": "Настройки → AI-провайдер → Добавить провайдера",
|
||||
"onboarding.s1.do_1": "В сайдбаре откройте «Настройки» и выберите раздел «AI-провайдер».",
|
||||
"onboarding.s1.do_2": "Нажмите «Добавить провайдера»: OpenRouter, Custom (OpenAI-compatible) или локальная модель.",
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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 }) {
|
||||
|
||||
Reference in new issue
Block a user