Compare commits

3 Commits
Author SHA1 Message Date
arswarog 8596500665 chat/widget: отображение статуса подключения бота
Заменяет захардкоженное "Ready to help" на живой индикатор.
Статус берётся из поля status ответа GET /v1/status, капитализируется
и показывается справа от имени бота. Polling каждые 30с, пауза при
скрытой вкладке, recheck по клику, tooltip с API URL.
2026-08-08 16:00:45 +03:00
arswarog 2690754abd chat: добавление чата
Reviewed-on: #7
Co-authored-by: Arswarog <arswarog@yandex.ru>
2026-08-08 15:59:25 +03:00
arswarog ec5d2f14f4 feat(theme): тёмная тема на палитре Nord
## Зачем

Более комфортно для глаз

## Реализация

**Почему не хватило конфига в themeConfig.mermaid.options**

Docusaurus инициализирует Mermaid так:

```ts
mermaid.initialize({
  ...options,          // статично, оба режима
  theme: isDark ? 'base' : 'default',
});
```

`themeVariables` лежат внутри `options` и применяются независимо от `colorMode`. Попытка передать Nord-цвета через `options` дала бы Nord-оттенки и в светлом режиме.

**Почему swizzle, а не CSS-переопределения**

Mermaid рендерит SVG и встраивает финальные hex-значения непосредственно в `<style>` внутри SVG-элемента. CSS снаружи SVG не пробивает эти стили без `!important` на каждый конкретный селектор — хрупко и нестабильно при обновлениях Mermaid.Reviewed-on: #9

Co-authored-by: Arswarog <arswarog@yandex.ru>
2026-08-08 10:37:30 +03:00
3 changed files with 2 additions and 22 deletions
-3
View File
@@ -8,13 +8,10 @@
classDiagram classDiagram
class IApi class IApi
class ProductService { class ProductService {
+IProduct[] getProducts +IProduct[] getProducts
} }
ProductService --> IApi ProductService --> IApi
Animal <|-- Duck Animal <|-- Duck
+1 -18
View File
@@ -20,23 +20,6 @@ export interface IChatMessage {
sources?: IChatSource[]; sources?: IChatSource[];
} }
function stripNumericPrefixes(p: string): string {
return p
.split('/')
.map((seg) => seg.replace(/^\d+-/, ''))
.join('/');
}
export function sourceToUrl(file: string, anchor: string): string { export function sourceToUrl(file: string, anchor: string): string {
let p = file.replace(/^docs\//, '').replace(/\.md$/, ''); return `/${file}${anchor ? `#${anchor}` : ''}`;
p = stripNumericPrefixes(p);
return `/docs/${p}${anchor ? `#${anchor}` : ''}`;
}
export function sourceToPath(file: string): string {
const p = file.replace(/^docs\//, '').replace(/\.md$/, '');
return stripNumericPrefixes(p);
} }
+1 -1
View File
@@ -32,7 +32,7 @@ export function Message({ role, content, sources }: MessageProps): ReactNode {
to={sourceToUrl(src.file, src.anchor)} to={sourceToUrl(src.file, src.anchor)}
className={b('sourceLink')} className={b('sourceLink')}
> >
{src.heading || sourceToPath(src.file)} {src.heading}
</Link> </Link>
))} ))}
</div> </div>