diff --git a/apps/docs/src/app/components/docsearch/docsearch.directive.spec.ts b/apps/docs/src/app/components/docsearch/docsearch.directive.spec.ts deleted file mode 100644 index 5b3a7f80a0..0000000000 --- a/apps/docs/src/app/components/docsearch/docsearch.directive.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { DocsDocsearchDirective } from './docsearch.directive'; - -@Component({ - imports: [DocsDocsearchDirective], - template: '' -}) -class TestApp {} - -const render = (): ComponentFixture => { - TestBed.configureTestingModule({ imports: [TestApp] }).compileComponents(); - const fixture = TestBed.createComponent(TestApp); - - fixture.autoDetectChanges(); - - return fixture; -}; - -const getDocsearchButton = (): HTMLButtonElement => { - return document.getElementsByClassName('DocSearch-Button')[0] as HTMLButtonElement; -}; - -const getDocsearchModal = (): HTMLDivElement => { - return document.getElementsByClassName('DocSearch-Modal')[0] as HTMLDivElement; -}; - -describe(DocsDocsearchDirective.name, () => { - it(`should render docsearch button`, async () => { - render(); - expect(getDocsearchButton()).toBeInstanceOf(HTMLButtonElement); - }); - - it(`should open docsearch modal`, async () => { - render(); - expect(getDocsearchModal()).toBeUndefined(); - getDocsearchButton().click(); - expect(getDocsearchModal()).toBeInstanceOf(HTMLDivElement); - }); -}); diff --git a/apps/docs/src/app/components/docsearch/docsearch.directive.ts b/apps/docs/src/app/components/docsearch/docsearch.directive.ts index 77510560f4..3ef3245141 100644 --- a/apps/docs/src/app/components/docsearch/docsearch.directive.ts +++ b/apps/docs/src/app/components/docsearch/docsearch.directive.ts @@ -1,26 +1,115 @@ import { afterNextRender, DestroyRef, Directive, inject } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import docsearch from '@docsearch/js'; -import { isMac, KBQ_WINDOW } from '@koobiq/components/core'; +import docsearch, { DocSearchInstance, DocSearchProps } from '@docsearch/js'; +import { KBQ_WINDOW, ThemeService } from '@koobiq/components/core'; +import { combineLatest } from 'rxjs'; +import { distinctUntilChanged, map } from 'rxjs/operators'; import { docsIsRuLocale, DocsLocaleState } from '../../services/locale'; -type DocsDocsearchProps = Parameters[0]; - const SELECTOR = 'docs-docsearch'; - const HOST = 'koobiq.io'; - const PROTOCOL = 'https:'; -const CONFIG: DocsDocsearchProps = { - container: SELECTOR, - appId: '7N2W9AKEM6', - apiKey: '0f0df042e7b349df5cb381e72f268b4d', - indexName: 'koobiq', - maxResultsPerGroup: 20, - disableUserPersonalization: false, - resultsFooterComponent: () => null -} as const; +type AnyFunction = (...args: any[]) => any; + +/** + * Forces every non-function translation leaf to be provided so a newly added key + * (e.g. from enabling Ask AI) fails at compile time instead of silently rendering + * an empty string in the UI. Function-valued overrides stay optional since they + * have no meaningful "required" value. + */ +type DeepRequired = T extends AnyFunction + ? T + : T extends object + ? { [K in keyof T as T[K] extends AnyFunction | undefined ? never : K]-?: DeepRequired } & { + [K in keyof T as T[K] extends AnyFunction | undefined ? K : never]?: T[K]; + } + : T; + +const TRANSLATION_RU: DeepRequired> = { + button: { + buttonText: 'Поиск', + buttonAriaLabel: 'Поиск' + }, + modal: { + searchBox: { + clearButtonTitle: 'Очистить запрос', + clearButtonAriaLabel: 'Очистить запрос', + closeButtonText: 'Отмена', + closeButtonAriaLabel: 'Отмена', + placeholderText: 'Поиск в документации', + placeholderTextAskAi: 'Задайте вопрос ИИ-ассистенту', + placeholderTextAskAiStreaming: 'Получаем ответ…', + enterKeyHint: 'Enter', + enterKeyHintAskAi: 'Enter', + searchInputLabel: 'Поиск', + backToKeywordSearchButtonText: 'Вернуться к поиску', + backToKeywordSearchButtonAriaLabel: 'Вернуться к поиску', + newConversationPlaceholder: 'Задайте новый вопрос', + conversationHistoryTitle: 'История диалогов', + startNewConversationText: 'Начать новый диалог', + viewConversationHistoryText: 'Показать историю диалогов', + threadDepthErrorPlaceholder: 'Достигнута максимальная длина диалога' + }, + newConversation: { + newConversationTitle: 'Новый диалог с ИИ', + newConversationDescription: 'Задайте вопрос, и ИИ-ассистент найдёт ответ в документации' + }, + startScreen: { + recentSearchesTitle: 'Недавние', + noRecentSearchesText: 'Нет недавних поисков', + saveRecentSearchButtonTitle: 'Сохранить этот поиск', + removeRecentSearchButtonTitle: 'Удалить этот поиск из истории', + favoriteSearchesTitle: 'Избранное', + removeFavoriteSearchButtonTitle: 'Удалить этот поиск из избранного', + recentConversationsTitle: 'Недавние диалоги', + removeRecentConversationButtonTitle: 'Удалить этот диалог из истории' + }, + errorScreen: { + titleText: 'Не удалось получить результаты', + helpText: 'Возможно, вам следует проверить соединение с интернетом.' + }, + footer: { + selectText: 'Выбрать', + submitQuestionText: 'Задать вопрос', + selectKeyAriaLabel: 'Клавиша Enter', + navigateText: 'Вниз (вверх)', + navigateUpKeyAriaLabel: 'Клавиша стрелка вверх', + navigateDownKeyAriaLabel: 'Клавиша стрелка вниз', + closeText: 'Закрыть', + backToSearchText: 'Вернуться к поиску', + closeKeyAriaLabel: 'Клавиша Escape', + poweredByText: 'Работает на' + }, + noResultsScreen: { + noResultsText: 'Нет результатов для', + suggestedQueryText: 'Попробуйте поискать', + reportMissingResultsText: 'Считаете, что этот запрос должен вернуть результаты?', + reportMissingResultsLinkText: 'Сообщите нам.' + }, + resultsScreen: { + askAiPlaceholder: 'Спросить ИИ-ассистента:', + noResultsAskAiPlaceholder: 'Спросить ИИ-ассистента вместо этого:' + }, + askAiScreen: { + disclaimerText: 'Ответы ИИ-ассистента могут быть неточными. Проверяйте важную информацию.', + relatedSourcesText: 'Источники', + thinkingText: 'Думаю…', + copyButtonText: 'Копировать', + copyButtonCopiedText: 'Скопировано', + copyButtonTitle: 'Копировать ответ', + likeButtonTitle: 'Полезный ответ', + dislikeButtonTitle: 'Бесполезный ответ', + thanksForFeedbackText: 'Спасибо за отзыв!', + preToolCallText: 'Ищу', + duringToolCallText: 'Ищу', + afterToolCallText: 'Найдено по запросу', + stoppedStreamingText: 'Генерация ответа остановлена', + errorTitleText: 'Не удалось получить ответ', + startNewConversationButtonText: 'Начать новый диалог' + } + } +}; /** Algolia DocSearch component implementation */ @Directive({ @@ -31,39 +120,58 @@ const CONFIG: DocsDocsearchProps = { }) export class DocsDocsearchDirective extends DocsLocaleState { private readonly window = inject(KBQ_WINDOW); - /** should transform item URL to work docsearch on DEV stand */ - private readonly shouldTransformItemURL = - this.window.location.host !== HOST || this.window.location.protocol !== PROTOCOL; - private readonly destroyRef = inject(DestroyRef); + private readonly theme = inject(ThemeService); + + private instance: DocSearchInstance | null = null; constructor() { super(); afterNextRender(() => { - this.initDocsearch(); + this.init(); + }); + + this.destroyRef.onDestroy(() => { + this.instance?.destroy(); + this.instance = null; }); } - private initDocsearch(): void { - this.docsLocaleService.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((locale) => { - const _isRuLocale = docsIsRuLocale(locale); - - docsearch({ - ...CONFIG, - searchParameters: { - hitsPerPage: 40, - facetFilters: [`lang:${locale}`] - }, - placeholder: _isRuLocale ? 'Поиск' : 'Search', - transformItems: this.transformItems, - translations: this.translations(_isRuLocale) + private init(): void { + combineLatest([ + this.theme.current.pipe(map((t) => t?.className.replace('kbq-', ''))).pipe(distinctUntilChanged()), + this.docsLocaleService.changes.pipe(distinctUntilChanged()) + ]) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(([theme, locale]) => { + // docsearch() re-renders into the same container on every call (no full teardown), + // so calling it again just updates theme/locale in place; destroying first would + // unmount the modal (losing scroll/open state) and cause a visible flicker. + this.instance = docsearch({ + container: SELECTOR, + appId: '7N2W9AKEM6', + apiKey: '0f0df042e7b349df5cb381e72f268b4d', + maxResultsPerGroup: 20, + theme: !theme || theme === 'light' ? 'light' : 'dark', + indices: [ + { name: 'koobiq', searchParameters: { hitsPerPage: 40, facetFilters: [`lang:${locale}`] } } + ], + transformItems: this.transformItems, + translations: docsIsRuLocale(locale) ? TRANSLATION_RU : {}, + askAi: { + assistantId: 'f6ddad78-2e0d-4f11-8cf0-d7e34c354d0e', + agentStudio: true + } + }); }); - }); } - private readonly transformItems: DocsDocsearchProps['transformItems'] = (items) => { - if (this.shouldTransformItemURL) { + private readonly transformItems: DocSearchProps['transformItems'] = (items) => { + // should transform item URL to work docsearch on DEV stand (firebase preview) + const shouldTransformItemURL = this.window.location.host !== HOST || this.window.location.protocol !== PROTOCOL; + + if (shouldTransformItemURL) { items = items.map((item) => { item.url = item.url.replace(HOST, this.window.location.host); item.url = item.url.replace(PROTOCOL, this.window.location.protocol); @@ -73,7 +181,7 @@ export class DocsDocsearchDirective extends DocsLocaleState { } return items.filter((item) => { - /** should hide hit, whose 'lvl2' header doesn't match with search query */ + // should hide hit, whose 'lvl2' header doesn't match with search query if (item.type === 'lvl2') { const { matchLevel } = item._highlightResult?.hierarchy.lvl2 || item._snippetResult?.hierarchy.lvl2 || {}; @@ -84,60 +192,4 @@ export class DocsDocsearchDirective extends DocsLocaleState { return item; }); }; - - private readonly translations = (isRuLocale: boolean): DocsDocsearchProps['translations'] => { - let buttonText = isRuLocale ? 'Поиск' : 'Search'; - - buttonText += isMac() ? ' ⌘K' : ' Ctrl+K'; - - return isRuLocale - ? { - button: { - buttonText, - buttonAriaLabel: 'Поиск' - }, - modal: { - searchBox: { - resetButtonTitle: 'Очистить запрос', - resetButtonAriaLabel: 'Очистить запрос', - cancelButtonText: 'Отмена', - cancelButtonAriaLabel: 'Отмена', - searchInputLabel: 'Поиск' - }, - startScreen: { - recentSearchesTitle: 'Недавние', - noRecentSearchesText: 'Нет недавних поисков', - saveRecentSearchButtonTitle: 'Сохранить этот поиск', - removeRecentSearchButtonTitle: 'Удалить этот поиск из истории', - favoriteSearchesTitle: 'Избранное', - removeFavoriteSearchButtonTitle: 'Удалить этот поиск из избранного' - }, - errorScreen: { - titleText: 'Не удалось получить результаты', - helpText: 'Возможно, вам следует проверить соединение с интернетом.' - }, - footer: { - selectText: 'Выбрать', - selectKeyAriaLabel: 'Клавиша Enter', - navigateText: 'Вниз (вверх)', - navigateUpKeyAriaLabel: 'Клавиша стрелка вверх', - navigateDownKeyAriaLabel: 'Клавиша стрелка вниз', - closeText: 'Закрыть', - closeKeyAriaLabel: 'Клавиша Escape', - searchByText: 'Поиск' - }, - noResultsScreen: { - noResultsText: 'Нет результатов для', - suggestedQueryText: 'Попробуйте поискать', - reportMissingResultsText: 'Считаете, что этот запрос должен вернуть результаты?', - reportMissingResultsLinkText: 'Сообщите нам.' - } - } - } - : { - button: { - buttonText - } - }; - }; } diff --git a/apps/docs/src/styles/_docsearch.scss b/apps/docs/src/styles/_docsearch.scss index 8519091379..a21d4ac8b4 100644 --- a/apps/docs/src/styles/_docsearch.scss +++ b/apps/docs/src/styles/_docsearch.scss @@ -1,333 +1,6 @@ -/* stylelint-disable scss/at-extend-no-missing-placeholder */ - @use '@docsearch/css/dist/style'; -@use '@koobiq/icons/fonts/kbq-icons'; - -.DocSearch-Button { - padding: 0 var(--kbq-size-m); - margin: 0; - border-radius: var(--kbq-size-s); - border-width: var(--kbq-size-border-width); - border-style: solid; - border-color: var(--kbq-line-contrast-fade); - color: inherit; - font-size: 15px; - line-height: var(--kbq-typography-text-normal-medium-line-height); - font-weight: var(--kbq-typography-text-normal-medium-font-weight); - font-family: var(--kbq-typography-text-normal-medium-font-family); - - &:focus-visible { - outline: 1px solid var(--kbq-states-line-focus-theme); - border-color: var(--kbq-states-line-focus-theme); - } - - @media (width <= 768px) { - border-color: transparent; - } -} - -.DocSearch-Button:hover { - background-color: var(--kbq-states-background-transparent-hover); -} - -.DocSearch-Button-Placeholder { - font-size: inherit; - padding: 0 var(--kbq-size-xs); -} - -.DocSearch-Button-Container::before { - @extend .kbq; - @extend .kbq-magnifying-glass_16; - - @media (width <= 768px) { - font-size: 20px; - } -} - -.DocSearch-Modal { - border-radius: var(--kbq-size-s); - - @media (max-width: 768px) { - height: calc(var(--docsearch-vh, 1vh) * 85); - } -} .DocSearch-Container { - // more than `.cdk-overlay-pane` z-index + // higher than kbq-top-bar z-index: 1001; - - @media (max-width: 768px) { - display: flex; - align-items: flex-end; - } -} - -.DocSearch-SearchBar { - padding: 0; - border-bottom-width: 1px; - border-bottom-style: solid; - border-bottom-color: var(--kbq-line-contrast-fade); -} - -.DocSearch-Form { - border-radius: var(--kbq-size-s) var(--kbq-size-s) 0 0; -} - -.DocSearch-MagnifierLabel::before { - @extend .kbq; - @extend .kbq-magnifying-glass_16; - - color: var(--kbq-icon-contrast-fade); -} - -.DocSearch-Input { - font-size: 15px; - padding-left: var(--kbq-size-xs); - - @media (max-width: 768px) { - font-size: 16px; - } -} - -.DocSearch-Input::placeholder { - color: var(--kbq-foreground-contrast-tertiary); -} - -.DocSearch-Reset::before { - @extend .kbq; - @extend .kbq-circle-xmark_16; -} - -.DocSearch-Reset:hover { - color: var(--kbq-states-icon-contrast-fade-hover); -} - -.DocSearch-Logo a { - display: flex; - justify-content: center; - align-items: center; -} - -.DocSearch-Dropdown { - min-height: 0; - scrollbar-color: var(--docsearch-icon-color); - padding: 0 var(--kbq-size-s) var(--kbq-size-xxl) var(--kbq-size-s); - - @media (max-width: 768px) { - max-height: calc( - var(--docsearch-vh, 1vh) * 85 - var(--docsearch-searchbox-height) - var(--docsearch-footer-height) - ); - } -} - -.DocSearch-Dropdown-Container { - padding-top: var(--kbq-size-s); -} - -.DocSearch-Hit { - border-radius: var(--kbq-size-s); - padding-bottom: 0; -} - -.DocSearch-Hit a { - padding-left: var(--kbq-size-l); - border-radius: var(--kbq-size-s); - outline-offset: -1px; - outline-width: 1px; -} - -.DocSearch-Hit[aria-selected='true'] a { - background-color: var(--kbq-states-background-transparent-active); -} - -.DocSearch-Hit mark, -.DocSearch-Hit[aria-selected='true'] mark { - text-decoration: none; - color: var(--kbq-foreground-warning) !important; -} - -.DocSearch-Hit-action { - width: auto; - height: auto; -} - -.DocSearch-Hit .DocSearch-Hit-title mark { - background-color: var(--kbq-background-warning-fade); -} - -.DocSearch-Hit-Container { - padding-right: var(--kbq-size-l); -} - -.DocSearch-Hit-content-wrapper { - font-size: 16px; - font-weight: 400; - line-height: 24px; - width: auto; - margin: 0 0 0 var(--kbq-size-l); -} - -.DocSearch-Hit-source { - font-size: 15px; - font-weight: 600; - line-height: 20px; - letter-spacing: -0.14px; - margin: 0; - padding: var(--kbq-size-xs) var(--kbq-size-m); - - // safari bug: - // https://github.com/algolia/docsearch/issues/1477 - position: relative; -} - -.DocSearch-Hit-title { - font-size: 15px; - font-weight: 400; - line-height: 20px; - overflow: inherit; - text-overflow: inherit; -} - -.DocSearch-Hit-path { - font-size: 13px; - line-height: 16px; - letter-spacing: 0.005em; -} - -.DocSearch-Footer { - border-radius: 0 0 var(--kbq-size-s) var(--kbq-size-s); - border-top-width: 1px; - border-top-style: solid; - border-top-color: var(--kbq-line-contrast-fade); -} - -.DocSearch-Commands li { - margin-right: var(--kbq-size-l); -} - -.DocSearch-Commands-Key { - border-radius: 6px; - width: var(--kbq-size-xxl); - height: var(--kbq-size-xxl); - padding: var(--kbq-size-3xs) var(--kbq-size-xxs); - margin-right: var(--kbq-size-xs); -} - -.DocSearch-Label { - font-size: 12px; - line-height: 16px; - letter-spacing: 0.01em; -} - -.DocSearch-StartScreen .DocSearch-Help, -.DocSearch-NoResults .DocSearch-Title { - font-size: 15px; - font-weight: 400; - line-height: 24px; -} - -.DocSearch-NoResults .DocSearch-Title strong { - font-weight: inherit; -} - -.DocSearch-Hit-Select-Icon, -.DocSearch-Button-Keys, -.DocSearch-Cancel, -.DocSearch-Button-Container svg, -.DocSearch-MagnifierLabel svg, -.DocSearch-Reset svg, -.DocSearch-Screen-Icon, -.DocSearch-NoResults-Prefill-List { - display: none !important; -} - -body.kbq-light { - --docsearch-primary-color: inherit; - --docsearch-text-color: var(--kbq-foreground-contrast); - --docsearch-spacing: var(--kbq-size-xxl); - --docsearch-highlight-color: inherit; - --docsearch-muted-color: var(--kbq-foreground-contrast-secondary); - --docsearch-container-background: var(--kbq-background-overlay); - --docsearch-icon-color: var(--kbq-icon-contrast-fade); - --docsearch-modal-width: 640px; - --docsearch-modal-height: 550px; - --docsearch-modal-background: var(--kbq-background-bg); - --docsearch-modal-shadow: none; - --docsearch-searchbox-height: var(--kbq-size-5xl); - --docsearch-searchbox-background: var(--kbq-background-card); - --docsearch-searchbox-focus-background: var(--kbq-background-bg); - --docsearch-searchbox-shadow: none; - --docsearch-hit-height: var(--kbq-size-6xl); - --docsearch-hit-color: var(--kbq-foreground-contrast); - --docsearch-hit-active-color: var(--kbq-foreground-contrast); - --docsearch-hit-background: var(--kbq-background-card); - --docsearch-hit-shadow: none; - --docsearch-key-gradient: var(--kbq-background-contrast-fade); - --docsearch-key-shadow: none; - --docsearch-key-pressed-shadow: none; - --docsearch-footer-height: var(--kbq-size-5xl); - --docsearch-footer-background: var(--kbq-background-bg); - --docsearch-footer-shadow: none; -} - -body.kbq-dark { - --docsearch-highlight-color: inherit; - --docsearch-icon-color: var(--kbq-icon-contrast-fade); - --docsearch-text-color: var(--kbq-foreground-contrast); - --docsearch-container-background: var(--kbq-background-overlay); - --docsearch-modal-background: var(--kbq-background-card); - --docsearch-modal-shadow: none; - --docsearch-searchbox-background: var(--kbq-background-card); - --docsearch-searchbox-focus-background: var(--kbq-background-bg); - --docsearch-hit-color: var(--kbq-foreground-contrast); - --docsearch-hit-shadow: none; - --docsearch-hit-background: var(--kbq-background-card); - --docsearch-key-gradient: var(--kbq-background-contrast-fade); - --docsearch-key-shadow: none; - --docsearch-key-pressed-shadow: none; - --docsearch-footer-background: var(--kbq-background-card); - --docsearch-footer-shadow: none; - --docsearch-muted-color: var(--kbq-foreground-contrast-secondary); - --docsearch-hit-active-color: var(--kbq-foreground-contrast); - - .DocSearch-Button { - border-color: var(--kbq-line-contrast-fade); - } - - .DocSearch-Button:hover { - background-color: var(--kbq-states-background-transparent-hover); - } - - .DocSearch-SearchBar { - border-bottom-color: var(--kbq-line-contrast-fade); - } - - .DocSearch-MagnifierLabel { - color: var(--kbq-icon-contrast-fade); - } - - .DocSearch-Input::placeholder { - color: var(--kbq-foreground-contrast-tertiary); - } - - .DocSearch-Reset:hover { - color: var(--kbq-states-icon-contrast-fade-hover); - } - - .DocSearch-Hit[aria-selected='true'] a { - background-color: var(--kbq-states-background-transparent-active); - } - - .DocSearch-Hit mark, - .DocSearch-Hit[aria-selected='true'] mark { - color: var(--kbq-foreground-warning) !important; - } - - .DocSearch-Hit .DocSearch-Hit-title mark { - background-color: var(--kbq-background-warning-fade); - } - - .DocSearch-Footer { - border-top-color: var(--kbq-line-contrast-fade); - } } diff --git a/package.json b/package.json index b7a878862c..ae88fb1d0f 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "@angular/core": "20.3.25", "@angular/forms": "20.3.25", "@angular/platform-browser": "20.3.25", - "@docsearch/css": "^3.9.0", - "@docsearch/js": "^3.9.0", + "@docsearch/css": "^4.6.3", + "@docsearch/js": "^4.6.3", "@fontsource/inter": "^5.2.8", "@fontsource/jetbrains-mono": "^5.2.6", "@koobiq/ag-grid-angular-theme": "^34.4.0", diff --git a/yarn.lock b/yarn.lock index bcb59a7597..401bad390e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,61 +24,6 @@ __metadata: languageName: node linkType: hard -"@algolia/autocomplete-core@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-core@npm:1.17.9" - dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.9" - "@algolia/autocomplete-shared": "npm:1.17.9" - checksum: 10c0/e1111769a8723b9dd45fc38cd7edc535c86c1f908b84b5fdc5de06ba6b8c7aca14e5f52ebce84fa5f7adf857332e396b93b7e7933b157b2c9aefc0a19d9574ab - languageName: node - linkType: hard - -"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" - dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10c0/05c21502631643abdcd6e9f70b5814a60d34bad59bca501e26e030fd72e689be5cecfb6e8939a0a1bdcb2394591e55e26a42a82c7247528eafeff714db0819a4 - languageName: node - linkType: hard - -"@algolia/autocomplete-preset-algolia@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" - dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/99159c7e02a927d0d96717cb4cfd2f8dbc4da73267a8eae4f83af5bf74087089f6e7dbffd316512e713a4cc534e936b6a7ccb5c4a5ff84b4bf73f2d3cc050e79 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-shared@npm:1.17.9" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/b318281aecdaae09171b47ee4f7bc66b613852cad4506e9d6278fff35ba68a12dd9cce2d90b5f4c3ba0e3d7d780583cbe46b22275260e41bbf09fb01e4a18f49 - languageName: node - linkType: hard - -"@algolia/client-abtesting@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-abtesting@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/614044c066e34cbc41b74a2242c3b0a08e952e96f90e0f2afbcd04711cf29fa88dea211f15bcef162bfd15b3f27555641bff229618cdf45bb83fe7c48100a7bf - languageName: node - linkType: hard - "@algolia/client-abtesting@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-abtesting@npm:5.35.0" @@ -91,18 +36,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-analytics@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-analytics@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/76068a9558df85c469c77a8facd10927800c347363b1b73e43fbecc3e2de9d1404e0c3769c1e2d7e4670f0b435c819f239f5399d81728a9d735b72f9a1a9df53 - languageName: node - linkType: hard - "@algolia/client-analytics@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-analytics@npm:5.35.0" @@ -115,13 +48,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-common@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-common@npm:5.25.0" - checksum: 10c0/e75370c9e5353badcd322db3b573a1f1cad1dbe5e576552e940c3db848778cd0849a028894da3f08dc551e3a53d1613239bc8cb06eef6dd4734e93ce5f49a895 - languageName: node - linkType: hard - "@algolia/client-common@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-common@npm:5.35.0" @@ -129,18 +55,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-insights@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-insights@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/8bbabcf7a86a649932b56525843d2b431c89077576e939832152859be398e9bf31a54b6c1565086b9e66deef045216d85adac8edcf538ebc9bcefc80f1a9711d - languageName: node - linkType: hard - "@algolia/client-insights@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-insights@npm:5.35.0" @@ -153,18 +67,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-personalization@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-personalization@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/0d937519adbf0231e985718e32e7b0e54d15d30a01bd0491c357eb937a4ebb44a6b8024de736cb1da5919ca23e10a6dbb1bdda06ed46848e15d1bb3a9533f0fc - languageName: node - linkType: hard - "@algolia/client-personalization@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-personalization@npm:5.35.0" @@ -177,18 +79,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-query-suggestions@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-query-suggestions@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/84f327d0bd98c2da8b37d3c51712baa794d44e78fd7e60f372899b882ac4d02e1836df27ed397dcb3deede820c7a8f20d1c043378166baaf1f855c89551cc5fd - languageName: node - linkType: hard - "@algolia/client-query-suggestions@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-query-suggestions@npm:5.35.0" @@ -201,18 +91,6 @@ __metadata: languageName: node linkType: hard -"@algolia/client-search@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-search@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/5a09f4e66aa802ec7a292595f8d08dcd7de12683d0ddde1feb640062011dbd8bd8b521627f7c904e27e0f3e80ad8a451e58e0bc790b0f2e4faf4e55dfe2df297 - languageName: node - linkType: hard - "@algolia/client-search@npm:5.35.0": version: 5.35.0 resolution: "@algolia/client-search@npm:5.35.0" @@ -225,18 +103,6 @@ __metadata: languageName: node linkType: hard -"@algolia/ingestion@npm:1.25.0": - version: 1.25.0 - resolution: "@algolia/ingestion@npm:1.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/6c2ffddaabfa62a87c45917ddd311d12adca1263de22be4c9023e7d526cc43c2a6fe1a5ea28f46a118762bd8a143bba903aded9ba3c70953e6f6af67e6b9e12f - languageName: node - linkType: hard - "@algolia/ingestion@npm:1.35.0": version: 1.35.0 resolution: "@algolia/ingestion@npm:1.35.0" @@ -249,18 +115,6 @@ __metadata: languageName: node linkType: hard -"@algolia/monitoring@npm:1.25.0": - version: 1.25.0 - resolution: "@algolia/monitoring@npm:1.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/d28b0af9ff0e864ad8ada43e735d763052b605410813c26ea595c21b9a3bcc323ebf3b04e810bc23cc8c28840952dbda7d111d583b8884e91e5692a14ad427e8 - languageName: node - linkType: hard - "@algolia/monitoring@npm:1.35.0": version: 1.35.0 resolution: "@algolia/monitoring@npm:1.35.0" @@ -273,18 +127,6 @@ __metadata: languageName: node linkType: hard -"@algolia/recommend@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/recommend@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/cfab69aec97096ac4db3fb7a20af3e6263362ad65100e33f1523ddfdb37a3bd1ca8d4002e83f8b52009ca5650cb9486e9e38410fb0f0b49336cd8c2bed58cd0e - languageName: node - linkType: hard - "@algolia/recommend@npm:5.35.0": version: 5.35.0 resolution: "@algolia/recommend@npm:5.35.0" @@ -297,15 +139,6 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-browser-xhr@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/c190525b68d7d255568d20e6024094bb8b273f3234f698e4da52edb97697cddb5df99038f5dc780a54da9c89837c8e6d81e2e230ab2f819b6ec689ebbabd049a - languageName: node - linkType: hard - "@algolia/requester-browser-xhr@npm:5.35.0": version: 5.35.0 resolution: "@algolia/requester-browser-xhr@npm:5.35.0" @@ -315,15 +148,6 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-fetch@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-fetch@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/126ed1c1cd6033a979da071018a5a1ada00df87e7ef5196385b6f241ca8f41f77c40827461a1aa04612a75ba651786c50b8e7a9f7636ba58b723c8bf8fd039a1 - languageName: node - linkType: hard - "@algolia/requester-fetch@npm:5.35.0": version: 5.35.0 resolution: "@algolia/requester-fetch@npm:5.35.0" @@ -333,15 +157,6 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-node-http@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-node-http@npm:5.25.0" - dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/310ecc88d6769b67d1959dfb11554699759ad358ce88b20edbe82cc007511efda3777451b3194ff26a600dc41bfe49588a74168c3f122302b945fe4e2e8b2063 - languageName: node - linkType: hard - "@algolia/requester-node-http@npm:5.35.0": version: 5.35.0 resolution: "@algolia/requester-node-http@npm:5.35.0" @@ -4227,46 +4042,17 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.9.0, @docsearch/css@npm:^3.9.0": - version: 3.9.0 - resolution: "@docsearch/css@npm:3.9.0" - checksum: 10c0/6300551e1cab7a5487063ec3581ae78ddaee3d93ec799556b451054448559b3ba849751b825fbd8b678367ef944bd82b3f11bc1d9e74e08e3cc48db40487b396 - languageName: node - linkType: hard - -"@docsearch/js@npm:^3.9.0": - version: 3.9.0 - resolution: "@docsearch/js@npm:3.9.0" - dependencies: - "@docsearch/react": "npm:3.9.0" - preact: "npm:^10.0.0" - checksum: 10c0/f96b9d452c87ada7ff368138442da96b8daa33f4edd956ed14209d284e267eb546ad20a85fa6f70352fc4bf530293635978329ca12a40aacf4e2d0595e91d61e +"@docsearch/css@npm:^4.6.3": + version: 4.6.3 + resolution: "@docsearch/css@npm:4.6.3" + checksum: 10c0/10c1282f102332915eaced15b16422d6aeb6b845311483e73d0f789fdc9c0913278adfa9f6ab29c856d769eafd1598d3271d6ef7059d74bec9d3f3c53a29f132 languageName: node linkType: hard -"@docsearch/react@npm:3.9.0": - version: 3.9.0 - resolution: "@docsearch/react@npm:3.9.0" - dependencies: - "@algolia/autocomplete-core": "npm:1.17.9" - "@algolia/autocomplete-preset-algolia": "npm:1.17.9" - "@docsearch/css": "npm:3.9.0" - algoliasearch: "npm:^5.14.2" - peerDependencies: - "@types/react": ">= 16.8.0 < 20.0.0" - react: ">= 16.8.0 < 20.0.0" - react-dom: ">= 16.8.0 < 20.0.0" - search-insights: ">= 1 < 3" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - checksum: 10c0/5e737a5d9ef1daae1cd93e89870214c1ab0c36a3a2193e898db044bcc5d9de59f85228b2360ec0e8f10cdac7fd2fe3c6ec8a05d943ee7e17d6c1cef2e6e9ff2d +"@docsearch/js@npm:^4.6.3": + version: 4.6.3 + resolution: "@docsearch/js@npm:4.6.3" + checksum: 10c0/90aecad104a4a14a2a6607f3ab4015dfb40ad0e2dfa85c49b924683f6493e7beae1575fcd3e880f1fa1f448c883a7e573800aee195edfba93d921f3a96f5bc4f languageName: node linkType: hard @@ -10313,27 +10099,6 @@ __metadata: languageName: node linkType: hard -"algoliasearch@npm:^5.14.2": - version: 5.25.0 - resolution: "algoliasearch@npm:5.25.0" - dependencies: - "@algolia/client-abtesting": "npm:5.25.0" - "@algolia/client-analytics": "npm:5.25.0" - "@algolia/client-common": "npm:5.25.0" - "@algolia/client-insights": "npm:5.25.0" - "@algolia/client-personalization": "npm:5.25.0" - "@algolia/client-query-suggestions": "npm:5.25.0" - "@algolia/client-search": "npm:5.25.0" - "@algolia/ingestion": "npm:1.25.0" - "@algolia/monitoring": "npm:1.25.0" - "@algolia/recommend": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/fdf2b03c48415a7f284697bbe316bba41d4d6b0c5c76e886aa9841e69b8bc79305b0679d29dece71a347eef8ef3715980ed6a736febaca8f869b6551e470decf - languageName: node - linkType: hard - "angular-eslint@npm:^20.7.0": version: 20.7.0 resolution: "angular-eslint@npm:20.7.0" @@ -18297,8 +18062,8 @@ __metadata: "@commitlint/config-conventional": "npm:^19.8.1" "@cspell/dict-markdown": "npm:^2.0.17" "@cspell/dict-ru_ru": "npm:^2.3.2" - "@docsearch/css": "npm:^3.9.0" - "@docsearch/js": "npm:^3.9.0" + "@docsearch/css": "npm:^4.6.3" + "@docsearch/js": "npm:^4.6.3" "@eslint-community/eslint-plugin-eslint-comments": "npm:^4.5.0" "@eslint/js": "npm:^9.0.0" "@fontsource/inter": "npm:^5.2.8" @@ -21673,13 +21438,6 @@ __metadata: languageName: node linkType: hard -"preact@npm:^10.0.0": - version: 10.22.0 - resolution: "preact@npm:10.22.0" - checksum: 10c0/dc5466c5968c56997e917580c00983cec2f6486a89ea9ba29f1bb88dcfd2f9ff67c8d561a69a1b3acdab17f2bb36b311fef0c348b62e89c332d00c674f7871f0 - languageName: node - linkType: hard - "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1"