diff --git a/.gitignore b/.gitignore index 6dbefc3ed5566..3e5db9342a1f8 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,7 @@ test-results playwright-report ## MacOS Ignored Files -.DS_Store \ No newline at end of file +.DS_Store + +## Other Files +.env diff --git a/apps/site/components/Common/Search/index.tsx b/apps/site/components/Common/Search/index.tsx deleted file mode 100644 index 0c12664b61826..0000000000000 --- a/apps/site/components/Common/Search/index.tsx +++ /dev/null @@ -1,145 +0,0 @@ -'use client'; - -import { OramaSearchBox, OramaSearchButton } from '@orama/react-components'; -import { useTranslations, useLocale } from 'next-intl'; -import { useTheme } from 'next-themes'; -import type { FC } from 'react'; - -import { useRouter } from '#site/navigation.mjs'; -import { - ORAMA_CLOUD_ENDPOINT, - ORAMA_CLOUD_API_KEY, - DEFAULT_ORAMA_QUERY_PARAMS, - DEFAULT_ORAMA_SUGGESTIONS, - BASE_URL, -} from '#site/next.constants.mjs'; - -type ResultMapDescription = { - path: string; - pageSectionTitle: string; -}; - -type ResultMapPath = { path: string; siteSection: string }; - -import { themeConfig, translationKeys } from './utils'; - -const uppercaseFirst = (word: string) => - word.charAt(0).toUpperCase() + word.slice(1); - -const getFormattedPath = (path: string, title: string) => - `${path - .replace(/#.+$/, '') - .split('/') - .map(element => element.replaceAll('-', ' ')) - .map(element => uppercaseFirst(element)) - .filter(Boolean) - .join(' > ')} — ${title}`; - -const SearchButton: FC = () => { - const { resolvedTheme } = useTheme(); - const t = useTranslations(); - const locale = useLocale(); - const colorScheme = resolvedTheme as 'light' | 'dark'; - const router = useRouter(); - - const sourceMap = { - title: 'pageSectionTitle', - description: 'formattedPath', - path: 'path', - }; - - const resultMap = { - ...sourceMap, - description: ({ path, pageSectionTitle }: ResultMapDescription) => - getFormattedPath(path, pageSectionTitle), - path: ({ path, siteSection }: ResultMapPath) => - siteSection.toLowerCase() === 'docs' ? `/${path}` : `/${locale}/${path}`, - section: 'siteSection', - }; - - return ( - <> - - {t('components.search.searchPlaceholder')} - - - [key, t(`components.search.${key}`)]) - )} - searchParams={DEFAULT_ORAMA_QUERY_PARAMS} - suggestions={DEFAULT_ORAMA_SUGGESTIONS} - chatMarkdownLinkHref={({ href }) => { - if (!href) { - return href; - } - - const baseURLObject = new URL(BASE_URL); - const baseURLHostName = baseURLObject.hostname; - - const searchBoxURLObject = new URL(href); - const searchBoxURLHostName = searchBoxURLObject.hostname; - const serachBoxURLPathName = searchBoxURLObject.pathname; - - // We do not want to add the locale to the url for external links and docs links - if ( - baseURLHostName !== searchBoxURLHostName || - serachBoxURLPathName.startsWith('/docs/') - ) { - return href; - } - - const URLWithLocale = new URL( - `${locale}${searchBoxURLObject.pathname}`, - searchBoxURLObject.origin - ); - - return URLWithLocale.href; - }} - onAnswerSourceClick={event => { - event.preventDefault(); - - const baseURLObject = new URL(BASE_URL); - - const { path } = event.detail.source; - - const finalPath = path.startsWith('docs/') - ? path - : `${locale}/${path}`; - - const finalURL = new URL(finalPath, baseURLObject); - - window.open(finalURL, '_blank'); - }} - onSearchResultClick={event => { - event.preventDefault(); - - const fullURLObject = new URL(event.detail.result.path, BASE_URL); - - // result.path already contains LOCALE. Locale is set to undefined here so router does not add it once again. - router.push(fullURLObject.href, { locale: undefined }); - }} - /> - > - ); -}; - -export default SearchButton; diff --git a/apps/site/components/Common/Search/utils.ts b/apps/site/components/Common/Search/utils.ts deleted file mode 100644 index dca1281ad7154..0000000000000 --- a/apps/site/components/Common/Search/utils.ts +++ /dev/null @@ -1,60 +0,0 @@ -export const themeConfig = { - typography: { - '--font-primary': 'var(--font-open-sans)', - }, - colors: { - light: { - '--text-color-primary': 'var(--color-neutral-900)', - '--text-color-accent': 'var(--color-green-600)', - '--background-color-secondary': 'var(--color-neutral-100)', - '--background-color-tertiary': 'var(--color-neutral-300)', - '--border-color-accent': 'var(--color-green-600)', - '--border-color-primary': 'var(--color-neutral-200)', - '--border-color-tertiary': 'var(--color-green-700)', - '--button-background-color-primary': 'var(--color-green-600)', - '--button-background-color-secondary': 'var(--color-white)', - '--button-background-color-secondary-hover': 'var(--color-neutral-100)', - '--button-border-color-secondary': 'var(--color-neutral-300)', - '--button-text-color-secondary': 'var(--color-neutral-900)', - '--chat-button-border-color-gradientThree': 'var(--color-green-400)', - '--chat-button-border-color-gradientFour': 'var(--color-green-700)', - '--chat-button-background-color-gradientOne': 'var(--color-green-600)', - '--chat-button-background-color-gradientTwo': 'var(--color-green-300)', - }, - dark: { - '--text-color-primary': 'var(--color-neutral-100)', - '--text-color-accent': 'var(--color-green-400)', - '--background-color-secondary': 'var(--color-neutral-950)', - '--background-color-tertiary': 'var(--color-neutral-900)', - '--border-color-accent': 'var(--color-green-400)', - '--border-color-primary': 'var(--color-neutral-900)', - '--border-color-tertiary': 'var(--color-green-300)', - '--button-background-color-primary': 'var(--color-green-400)', - '--button-background-color-secondary': 'var(--color-neutral-950)', - '--button-background-color-secondary-hover': 'var(--color-neutral-900)', - '--button-border-color-secondary': 'var(--color-neutral-900)', - '--button-text-color-secondary': 'var(--color-neutral-200)', - '--chat-button-border-color-gradientThree': 'var(--color-green-400)', - '--chat-button-border-color-gradientFour': 'var(--color-green-700)', - '--chat-button-background-color-gradientOne': 'var(--color-green-400)', - '--chat-button-background-color-gradientTwo': 'var(--color-green-800)', - }, - }, -}; - -export const translationKeys = [ - 'searchPlaceholder', - 'chatPlaceholder', - 'noResultsFoundFor', - 'suggestions', - 'seeAll', - 'addMore', - 'clearChat', - 'errorMessage', - 'disclaimer', - 'startYourSearch', - 'initErrorSearch', - 'initErrorChat', - 'chatButtonLabel', - 'searchButtonLabel', -] as const; diff --git a/apps/site/components/Common/Searchbox/ChatActions/index.module.css b/apps/site/components/Common/Searchbox/ChatActions/index.module.css new file mode 100644 index 0000000000000..a6081326ce8f9 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatActions/index.module.css @@ -0,0 +1,44 @@ +@reference "../../../../styles/index.css"; + +.chatActionsContainer { + @apply flex + items-center + justify-end; +} + +.chatActionsList { + @apply flex + list-none + items-center + gap-2 + p-0; +} + +.chatAction { + @apply cursor-pointer + rounded-full + p-2 + text-neutral-800 + duration-300 + hover:bg-neutral-300 + focus:bg-neutral-300 + focus:outline-none + motion-safe:transition-colors + dark:text-neutral-400 + dark:hover:bg-neutral-900 + dark:focus:bg-neutral-900; + + svg { + @apply size-4; + } +} + +.chatActionIconSelected { + @apply text-green-600 + dark:text-green-400; +} + +.chatActionDisaliked { + @apply text-neutral-900 + dark:text-neutral-800; +} diff --git a/apps/site/components/Common/Searchbox/ChatActions/index.tsx b/apps/site/components/Common/Searchbox/ChatActions/index.tsx new file mode 100644 index 0000000000000..79f25bfd0e840 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatActions/index.tsx @@ -0,0 +1,70 @@ +'use client'; + +import { + DocumentCheckIcon, + ClipboardIcon, + ArrowPathIcon, + HandThumbDownIcon, +} from '@heroicons/react/24/solid'; +import type { Interaction } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import classNames from 'classnames'; +import type { FC } from 'react'; +import { useState } from 'react'; + +import styles from './index.module.css'; + +type ChatActionsProps = { + interaction: Interaction; +}; + +export const ChatActions: FC = ({ interaction }) => { + const [isDisliked, setIsDisliked] = useState(false); + + const dislikeMessage = () => setIsDisliked(!isDisliked); + + if (!interaction.response) { + return null; + } + + return ( + + + + + + + + + + {(copied: boolean) => + copied ? ( + + ) : ( + + ) + } + + + {!interaction.loading && ( + + + + + + )} + + + ); +}; diff --git a/apps/site/components/Common/Searchbox/ChatInput/index.module.css b/apps/site/components/Common/Searchbox/ChatInput/index.module.css new file mode 100644 index 0000000000000..3cb7979d6f233 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatInput/index.module.css @@ -0,0 +1,99 @@ +@reference "../../../../styles/index.css"; + +.textareaContainer { + @apply px-1; +} + +.textareaWrapper { + @apply flex + items-center + rounded-2xl + border + border-neutral-300 + bg-neutral-100 + py-2 + pl-3 + pr-1 + dark:border-neutral-900 + dark:bg-neutral-950; +} + +.textareaField { + @apply flex-1 + border-0 + bg-transparent + text-neutral-900 + focus:outline-none + dark:text-neutral-200; +} + +.textareaButton { + @apply cursor-pointer + rounded-xl + bg-green-600 + p-2 + text-white + duration-300 + focus:bg-green-600/75 + focus:outline-none + disabled:cursor-not-allowed + disabled:bg-neutral-200/60 + disabled:text-neutral-800 + motion-safe:transition-colors + dark:bg-green-400 + dark:text-neutral-400 + focus:dark:bg-green-400/75 + disabled:dark:bg-neutral-900/60; + + svg { + @apply size-4; + } +} + +.textareaFooter { + @apply pt-1 + text-center + text-xs + text-neutral-800 + sm:text-sm + dark:text-neutral-500; +} + +.suggestionsWrapper { + @apply mb-4 + flex + items-center + gap-2 + overflow-x-auto + px-1 + text-sm + lg:justify-center; + + &::-webkit-scrollbar { + @apply hidden; + } +} + +.suggestionsItem { + @apply flex + size-max + cursor-pointer + whitespace-nowrap + rounded-full + border + border-neutral-300 + bg-neutral-200 + px-3 + py-1 + text-neutral-900 + duration-300 + hover:bg-neutral-300 + focus:bg-neutral-300 + focus:outline-none + motion-safe:transition-colors + dark:border-neutral-900 + dark:bg-neutral-950 + dark:text-neutral-200 + dark:hover:bg-neutral-900 + dark:focus:bg-neutral-900; +} diff --git a/apps/site/components/Common/Searchbox/ChatInput/index.tsx b/apps/site/components/Common/Searchbox/ChatInput/index.tsx new file mode 100644 index 0000000000000..2b78591179131 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatInput/index.tsx @@ -0,0 +1,73 @@ +'use client'; + +import { PaperAirplaneIcon } from '@heroicons/react/20/solid'; +import { PauseCircleIcon } from '@heroicons/react/24/solid'; +import { PromptTextArea, Suggestions } from '@orama/ui/components'; +import { useChat } from '@orama/ui/hooks'; +import { useTranslations } from 'next-intl'; +import type { FC } from 'react'; +import { useEffect, useRef } from 'react'; + +import styles from './index.module.css'; + +export const ChatInput: FC = () => { + const t = useTranslations(); + const { + context: { interactions }, + } = useChat(); + const textareaRef = useRef(null); + + const suggestions = [ + t('components.search.suggestionOne'), + t('components.search.suggestionTwo'), + t('components.search.suggestionThree'), + ]; + + const hasInteractions = !!interactions?.length; + + useEffect(() => { + setTimeout(() => { + textareaRef.current?.focus(); + }, 100); + }, []); + + return ( + <> + {!hasInteractions && ( + + {suggestions.map(suggestion => ( + + {suggestion} + + ))} + + )} + + + + } + className={styles.textareaButton} + > + + + + + {t('components.search.disclaimer')} + + + > + ); +}; diff --git a/apps/site/components/Common/Searchbox/ChatInteractions/index.module.css b/apps/site/components/Common/Searchbox/ChatInteractions/index.module.css new file mode 100644 index 0000000000000..2bb4384ee51f5 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatInteractions/index.module.css @@ -0,0 +1,64 @@ +@reference "../../../../styles/index.css"; + +.chatInteractionsContainer { + @apply relative + mb-6 + flex + h-full + flex-1 + flex-col + items-start + overflow-auto + px-1; + + &::-webkit-scrollbar { + @apply size-1.5; + } + + &::-webkit-scrollbar-track { + @apply rounded-md + bg-transparent; + } + + &::-webkit-scrollbar-thumb { + @apply rounded-md + bg-neutral-900; + } +} + +.chatInteractionsWrapper { + @apply flex + w-full + flex-wrap + gap-6; + + > div { + @apply w-full; + } +} + +.scrollDownButton { + @apply absolute + bottom-36 + left-1/2 + inline-flex + -translate-x-1/2 + items-center + justify-center + rounded-xl + bg-neutral-200 + p-2 + text-neutral-900 + duration-300 + focus:bg-neutral-300 + focus:outline-none + motion-safe:transition-colors + lg:bottom-28 + dark:bg-neutral-900 + dark:text-neutral-200 + focus:dark:bg-neutral-800; + + svg { + @apply size-4; + } +} diff --git a/apps/site/components/Common/Searchbox/ChatInteractions/index.tsx b/apps/site/components/Common/Searchbox/ChatInteractions/index.tsx new file mode 100644 index 0000000000000..2fd2a1c77f026 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatInteractions/index.tsx @@ -0,0 +1,46 @@ +'use client'; + +import { ArrowDownIcon } from '@heroicons/react/24/solid'; +import type { Interaction } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import { useScrollableContainer } from '@orama/ui/hooks/useScrollableContainer'; +import { useTranslations } from 'next-intl'; + +import { ChatMessage } from '../ChatMessage'; +import styles from './index.module.css'; + +export const ChatInteractionsContainer = () => { + const t = useTranslations(); + const { + containerRef, + scrollToBottom, + recalculateGoToBottomButton, + showGoToBottomButton, + } = useScrollableContainer(); + + return ( + <> + + scrollToBottom({ animated: true })} + className={styles.chatInteractionsWrapper} + > + {(interaction: Interaction) => ( + + )} + + + {showGoToBottomButton && ( + scrollToBottom({ animated: true })} + className={styles.scrollDownButton} + aria-label={t('components.search.scrollToBottom')} + > + + + )} + > + ); +}; diff --git a/apps/site/components/Common/Searchbox/ChatMessage/index.module.css b/apps/site/components/Common/Searchbox/ChatMessage/index.module.css new file mode 100644 index 0000000000000..792c1857f9b8c --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatMessage/index.module.css @@ -0,0 +1,50 @@ +@reference "../../../../styles/index.css"; + +.chatUserPrompt { + @apply py-3; + + p { + @apply max-w-2xl + rounded-xl + text-neutral-900 + dark:text-neutral-200; + } +} + +.chatAssistantMessageWrapper { + @apply my-2 + rounded-xl + bg-neutral-100 + px-4 + py-1 + text-neutral-900 + empty:hidden + dark:bg-neutral-950 + dark:text-neutral-200; +} + +.typingIndicator { + @apply flex + items-center + gap-1 + rounded-xl + bg-neutral-200 + p-4 + dark:bg-neutral-950; +} + +.typingDot { + @apply animate-dot-move + size-1 + rounded-full + bg-neutral-500 + dark:bg-neutral-400; + + &:nth-child(2) { + @apply animate-dot-move-delay-200; + } + + &:nth-child(3) { + @apply animate-dot-move-delay-400; + } +} diff --git a/apps/site/components/Common/Searchbox/ChatMessage/index.tsx b/apps/site/components/Common/Searchbox/ChatMessage/index.tsx new file mode 100644 index 0000000000000..133d83a5a5bd4 --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatMessage/index.tsx @@ -0,0 +1,71 @@ +import type { Interaction } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import type { FC } from 'react'; + +import styles from './index.module.css'; +import { ChatActions } from '../ChatActions'; +import ChatSources from '../ChatSources'; + +type ChatMessageProps = { + interaction: Interaction; +}; + +const TypingIndicator: FC = () => ( + + + + + +); + +export const ChatMessage: FC = ({ interaction }) => { + if (!interaction) { + return null; + } + + return ( + <> + + {interaction?.query} + + + + + + + + + + + {interaction.response && ( + + + {interaction.response || ''} + + + + )} + > + ); +}; diff --git a/apps/site/components/Common/Searchbox/ChatSources/index.module.css b/apps/site/components/Common/Searchbox/ChatSources/index.module.css new file mode 100644 index 0000000000000..0f6f09a15e77b --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatSources/index.module.css @@ -0,0 +1,53 @@ +@reference "../../../../styles/index.css"; + +.chatSources { + @apply mb-4 + flex + flex-nowrap + items-center + gap-3 + overflow-x-scroll + scroll-smooth + [-ms-overflow-style:none] + [scrollbar-width:none]; + + &::-webkit-scrollbar { + @apply hidden; + } +} + +.chatSource { + @apply flex + max-w-full + items-center + gap-2 + text-base; +} + +.chatSourceLink { + @apply w-3xs + rounded-xl + bg-neutral-100 + px-4 + py-2 + text-neutral-900 + duration-300 + hover:bg-neutral-200 + focus:bg-neutral-200 + focus:outline-none + motion-safe:transition-colors + dark:bg-neutral-950 + dark:text-neutral-200 + hover:dark:bg-neutral-900 + focus:dark:bg-neutral-900; +} + +.chatSourceTitle { + @apply max-w-full + overflow-hidden + truncate + text-ellipsis + whitespace-nowrap + text-sm + font-semibold; +} diff --git a/apps/site/components/Common/Searchbox/ChatSources/index.tsx b/apps/site/components/Common/Searchbox/ChatSources/index.tsx new file mode 100644 index 0000000000000..76ceca6c159fe --- /dev/null +++ b/apps/site/components/Common/Searchbox/ChatSources/index.tsx @@ -0,0 +1,46 @@ +import type { Interaction, AnyObject } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import type { FC } from 'react'; + +import styles from './index.module.css'; +import type { Document } from '../DocumentLink'; +import { DocumentLink } from '../DocumentLink'; + +type ChatSourcesProps = { + interaction: Interaction; +}; + +const ChatSources: FC = ({ interaction }) => { + if (!interaction?.sources) { + return null; + } + + return ( + + {(document: AnyObject, index: number) => ( + + {typeof document.pageSectionTitle === 'string' && ( + + + {document.pageSectionTitle && + document.pageSectionTitle.length > 25 + ? `${document.pageSectionTitle.substring(0, 25)}...` + : document.pageSectionTitle} + + + )} + + )} + + ); +}; + +export default ChatSources; diff --git a/apps/site/components/Common/Searchbox/DocumentLink/index.module.css b/apps/site/components/Common/Searchbox/DocumentLink/index.module.css new file mode 100644 index 0000000000000..31b802682b825 --- /dev/null +++ b/apps/site/components/Common/Searchbox/DocumentLink/index.module.css @@ -0,0 +1,32 @@ +@reference "../../../../styles/index.css"; + +.documentLink { + @apply rounded-xl + bg-white + px-4 + py-2 + text-neutral-900 + duration-300 + hover:bg-neutral-200 + focus:bg-neutral-200 + motion-safe:transition-colors + lg:bg-neutral-100 + dark:bg-neutral-950 + dark:text-neutral-200 + hover:dark:bg-neutral-900 + focus:dark:bg-neutral-900; + + svg { + @apply size-5; + } +} + +.documentTitle { + @apply max-w-full + overflow-hidden + truncate + text-ellipsis + whitespace-nowrap + text-sm + font-semibold; +} diff --git a/apps/site/components/Common/Searchbox/DocumentLink/index.tsx b/apps/site/components/Common/Searchbox/DocumentLink/index.tsx new file mode 100644 index 0000000000000..4c2164207ba02 --- /dev/null +++ b/apps/site/components/Common/Searchbox/DocumentLink/index.tsx @@ -0,0 +1,50 @@ +'use client'; + +import Link from 'next/link'; +import { useLocale } from 'next-intl'; +import type { FC } from 'react'; + +import styles from './index.module.css'; + +export type Document = { + path: string; + siteSection: string; + pageSectionTitle?: string; +}; + +type DocumentLinkProps = { + document: Document; + className?: string; + children?: React.ReactNode; + 'data-focus-on-arrow-nav'?: boolean; +}; + +export const DocumentLink: FC = ({ + document, + className = styles.documentLink, + children, + 'data-focus-on-arrow-nav': dataFocusOnArrowNav, + ...props +}) => { + const locale = useLocale(); + + const href = + document.siteSection?.toLowerCase() === 'docs' + ? `/${document.path}` + : `/${locale}/${document.path}`; + + return ( + + {children || ( + + {document.pageSectionTitle} + + )} + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Footer/index.module.css b/apps/site/components/Common/Searchbox/Footer/index.module.css new file mode 100644 index 0000000000000..95ec47b281a27 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Footer/index.module.css @@ -0,0 +1,53 @@ +@reference "../../../../styles/index.css"; + +.footer { + @apply flex + justify-center + border-t + border-neutral-200 + bg-neutral-100 + p-4 + align-baseline + lg:justify-between + lg:rounded-b-xl + dark:border-neutral-900 + dark:bg-neutral-950; +} + +.poweredByLink { + @apply flex + items-center + gap-2 + text-sm + text-neutral-800 + dark:text-neutral-600; +} + +.shortcutWrapper { + @apply hidden + items-center + gap-2 + lg:flex; +} + +.shortcutItem { + @apply flex + items-center + gap-2 + text-xs + text-neutral-800 + dark:text-neutral-600; +} + +.shortcutKey { + @apply font-ibm-plex-mono + rounded-md + bg-neutral-200 + p-1 + text-xs + dark:bg-neutral-900; + + svg { + @apply size-4; + } +} diff --git a/apps/site/components/Common/Searchbox/Footer/index.tsx b/apps/site/components/Common/Searchbox/Footer/index.tsx new file mode 100644 index 0000000000000..383ede4211022 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Footer/index.tsx @@ -0,0 +1,83 @@ +'use client'; + +import { + ArrowTurnDownLeftIcon, + ArrowDownIcon, + ArrowUpIcon, +} from '@heroicons/react/24/solid'; +import { useSearchDispatch } from '@orama/ui/contexts'; +import Image from 'next/image'; +import { useTranslations } from 'next-intl'; +import { useTheme } from 'next-themes'; +import { useEffect, useCallback } from 'react'; + +import styles from './index.module.css'; + +export const Footer = () => { + const t = useTranslations(); + const { resolvedTheme } = useTheme(); + const dispatch = useSearchDispatch(); + + const oramaLogo = `https://website-assets.oramasearch.com/orama-when-${resolvedTheme}.svg`; + + const clearAll = useCallback(() => { + dispatch({ type: 'SET_SEARCH_TERM', payload: { searchTerm: '' } }); + dispatch({ type: 'SET_SELECTED_FACET', payload: { selectedFacet: 'All' } }); + dispatch({ type: 'SET_RESULTS', payload: { results: [] } }); + }, [dispatch]); + + useEffect(() => { + clearAll(); + return () => { + clearAll(); + }; + }, [clearAll]); + + return ( + + + + + + + + {t('components.search.keyboardShortcuts.select')} + + + + + + + + + + + {t('components.search.keyboardShortcuts.navigate')} + + + + esc + + {t('components.search.keyboardShortcuts.close')} + + + + + + {t('components.search.poweredBy')} + + + + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Search/index.module.css b/apps/site/components/Common/Searchbox/Search/index.module.css new file mode 100644 index 0000000000000..e82cf050151f3 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Search/index.module.css @@ -0,0 +1,318 @@ +@reference "../../../../styles/index.css"; + +.searchContainer { + @apply flex + grow + flex-col + overflow-hidden; +} + +.searchResultsContainer { + @apply flex + grow + flex-col + overflow-y-auto; +} + +.searchInputWrapper { + @apply relative; + + svg { + @apply absolute + left-3 + top-1/2 + size-4 + -translate-y-1/2 + text-neutral-500 + dark:text-neutral-600; + } +} + +.searchInput { + @apply w-full + border-b + border-neutral-200 + bg-transparent + py-4 + pl-9 + pr-4 + text-sm + text-neutral-900 + placeholder:text-neutral-500 + focus:outline-none + dark:border-neutral-900 + dark:text-neutral-200 + dark:placeholder:text-neutral-600; +} + +.chatButtonWrapper { + @apply hidden + border-b + border-neutral-200 + p-2 + lg:block + dark:border-neutral-900; + + svg { + @apply size-4; + } +} + +.chatButton { + @apply flex + w-full + cursor-pointer + items-center + gap-2 + rounded-lg + border + border-transparent + bg-transparent + p-3 + text-sm + duration-300 + hover:bg-neutral-300 + focus-visible:border-green-600 + focus-visible:outline-none + motion-safe:transition-colors + dark:hover:bg-neutral-900 + dark:focus-visible:border-green-400; +} + +.chatButtonWithSearch { + @apply bg-neutral-300 + dark:bg-neutral-900; +} + +.suggestionsWrapper { + @apply flex + min-h-0 + flex-1 + flex-col + overflow-y-auto + pb-4 + text-neutral-900 + dark:text-neutral-200; +} + +.suggestionsList { + @apply mt-1 + space-y-1; +} + +.suggestionsTitle { + @apply my-3 + text-xs + font-semibold + uppercase + text-neutral-800 + dark:text-neutral-500; +} + +.suggestionItem { + @apply flex + cursor-pointer + items-center + gap-2 + rounded-lg + border + border-transparent + py-2 + text-sm + text-green-600 + focus-visible:border-green-600 + focus-visible:outline-none + dark:text-green-400 + dark:focus-visible:border-green-400; + + svg { + @apply size-5; + } +} + +.searchResultsWrapper { + @apply grow + overflow-y-auto + px-5 + pt-3 + text-neutral-900 + lg:grow-0 + dark:text-neutral-200; + + &::-webkit-scrollbar { + @apply size-1.5; + } + + &::-webkit-scrollbar-track { + @apply bg-transparent; + } + + &::-webkit-scrollbar-thumb { + @apply rounded-md + bg-neutral-900; + } +} + +.noResultsWrapper { + @apply pb-31 + flex + h-full + items-center + justify-center + pt-10 + text-sm + text-neutral-800 + dark:text-neutral-500; +} + +.facetTabsWrapper { + @apply mb-2 + overflow-x-auto; + + &::-webkit-scrollbar { + @apply hidden; + } +} + +.facetTabItem { + @apply flex + cursor-pointer + items-center + gap-2 + rounded-3xl + border + border-neutral-200 + px-3 + py-1 + text-sm + duration-300 + focus:outline-none + focus-visible:bg-neutral-300 + motion-safe:transition-colors + dark:border-neutral-900 + dark:focus-visible:bg-neutral-900; +} + +.facetTabItemSelected { + @apply border-2 + border-green-600 + dark:border-green-400; +} + +.facetTabsList { + @apply flex + items-center + gap-2 + overflow-x-auto; + + &::-webkit-scrollbar { + @apply hidden; + } +} + +.facetTabItemCount { + @apply text-neutral-700; +} + +.searchResultsGroupWrapper { + @apply relative + items-start + overflow-y-auto; +} + +.searchResultsGroup { + @apply mb-3 + border-t + border-neutral-200 + dark:border-neutral-900; +} + +.searchResultsGroup:first-of-type { + @apply border-0; +} + +.searchResultsGroupTitle { + @apply mb-3 + mt-4 + pl-2 + text-sm + font-semibold + text-neutral-600 + dark:text-neutral-600; +} + +.searchResultsItem { + > a { + @apply flex + items-center + gap-4 + rounded-lg + border + border-transparent + px-2 + py-3 + text-sm + outline-none + duration-300 + hover:bg-neutral-300 + focus-visible:border-green-600 + focus-visible:bg-transparent + motion-safe:transition-colors + dark:bg-zinc-950 + dark:hover:bg-neutral-900 + lg:dark:bg-neutral-950; + } + + svg { + @apply size-5 + shrink-0; + } +} + +.searchResultsItemDescription { + @apply text-sm + text-neutral-600 + dark:text-neutral-700; +} + +.skeletonWrapper { + @apply flex + flex-col + gap-5 + py-6; +} + +.skeletonItem { + @apply flex + items-center + gap-4; +} + +.skeletonAnim { + @apply dark:animate-pulse-dark + animate-pulse + rounded-md; +} + +.skeletonAvatar { + @apply h-6 + w-5 + shrink-0; +} + +.skeletonText { + @apply flex + flex-1 + flex-col + gap-2; +} + +.skeletonLineShort { + @apply h-3 + w-1/3; +} + +.skeletonLineLong { + @apply h-3 + w-2/3; +} diff --git a/apps/site/components/Common/Searchbox/Search/index.tsx b/apps/site/components/Common/Searchbox/Search/index.tsx new file mode 100644 index 0000000000000..b85c3b2fd9532 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Search/index.tsx @@ -0,0 +1,260 @@ +'use client'; + +import { SparklesIcon, DocumentTextIcon } from '@heroicons/react/24/outline'; +import { MagnifyingGlassIcon } from '@heroicons/react/24/solid'; +import { + SearchInput, + FacetTabs, + SearchResults, + Suggestions, + SlidingPanel, +} from '@orama/ui/components'; +import { useSearch } from '@orama/ui/hooks/useSearch'; +import classNames from 'classnames'; +import { useTranslations } from 'next-intl'; +import type { FC, PropsWithChildren } from 'react'; +import { useEffect, useCallback, useRef } from 'react'; + +import { DEFAULT_ORAMA_QUERY_PARAMS } from '#site/next.constants.mjs'; + +import styles from './index.module.css'; +import { getFormattedPath } from './utils'; +import { DocumentLink } from '../DocumentLink'; +import type { Document } from '../DocumentLink'; +import { Footer } from '../Footer'; + +type SearchProps = PropsWithChildren<{ + onChatTrigger: () => void; + mode?: 'search' | 'chat'; +}>; + +export const Search: FC = ({ onChatTrigger, mode = 'search' }) => { + const t = useTranslations(); + const { + dispatch, + context: { searchTerm, selectedFacet }, + } = useSearch(); + const containerRef = useRef(null); + + const clearAll = useCallback(() => { + dispatch({ type: 'SET_SEARCH_TERM', payload: { searchTerm: '' } }); + dispatch({ type: 'SET_SELECTED_FACET', payload: { selectedFacet: 'All' } }); + dispatch({ type: 'SET_RESULTS', payload: { results: [] } }); + }, [dispatch]); + + useEffect(() => { + clearAll(); + return () => { + clearAll(); + }; + }, [clearAll]); + + useEffect(() => { + const interactiveElements = containerRef.current?.querySelectorAll( + 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])' + ); + + if (mode === 'search') { + interactiveElements?.forEach(el => { + el.removeAttribute('tabindex'); + }); + } else { + interactiveElements?.forEach(el => { + el.setAttribute('tabindex', '-1'); + }); + } + }, [mode]); + + return ( + + + + + + + + + + + + {searchTerm ? `${searchTerm} - ` : ''} + {t('components.search.chatButtonLabel')} + + + + + + + + + {(group, isSelected) => ( + <> + + {group.name} + + ({group.count}) + + + > + )} + + + + + + {[...Array(3)].map((_, index) => ( + + + + + + + + ))} + + + + + {term => ( + <> + {term ? ( + + + {t('components.search.noResultsFoundFor')} "{term}" + + + ) : ( + + + {t('components.search.suggestions')} + + + + {t('components.search.suggestionOne')} + + + + {t('components.search.suggestionTwo')} + + + + {t('components.search.suggestionThree')} + + + )} + > + )} + + + + {group => ( + + + {group.name} + + + {hit => ( + + + + + {typeof hit.document?.pageSectionTitle === + 'string' && ( + + {hit.document?.pageSectionTitle} + + )} + {typeof hit.document?.pageSectionTitle === + 'string' && + typeof hit.document?.path === 'string' && ( + + {getFormattedPath( + hit.document?.path, + hit.document?.pageSectionTitle + )} + + )} + + + + )} + + + )} + + + + + + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Search/utils.ts b/apps/site/components/Common/Searchbox/Search/utils.ts new file mode 100644 index 0000000000000..5fc41ceac70f1 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Search/utils.ts @@ -0,0 +1,11 @@ +export const uppercaseFirst = (word: string) => + word.charAt(0).toUpperCase() + word.slice(1); + +export const getFormattedPath = (path: string, title: string) => + `${path + .replace(/#.+$/, '') + .split('/') + .map(element => element.replaceAll('-', ' ')) + .map(element => uppercaseFirst(element)) + .filter(Boolean) + .join(' > ')} — ${title}`; diff --git a/apps/site/components/Common/Searchbox/SlidingChatPanel/index.module.css b/apps/site/components/Common/Searchbox/SlidingChatPanel/index.module.css new file mode 100644 index 0000000000000..e13ca6df1a662 --- /dev/null +++ b/apps/site/components/Common/Searchbox/SlidingChatPanel/index.module.css @@ -0,0 +1,57 @@ +@reference "../../../../styles/index.css"; + +.slidingPanelCloseButton { + @apply absolute + right-6 + top-2 + z-20 + cursor-pointer + rounded-full + p-2 + text-neutral-700 + duration-300 + hover:bg-white/20 + focus:bg-white/20 + focus:outline-none + motion-safe:transition-colors + dark:text-white; + + svg { + @apply size-5; + } +} + +.slidingPanelContentWrapper { + @apply fixed + bottom-0 + left-0 + box-border + h-[95vh] + w-full + overflow-hidden + rounded-lg + border + border-neutral-300 + bg-white + p-0 + text-white + duration-300 + motion-safe:ease-in-out + dark:border-neutral-900 + dark:bg-zinc-950; +} + +.slidingPanelInner { + @apply relative + mx-auto + flex + h-full + max-w-4xl + flex-col + justify-between + py-6; +} + +.slidingPanelBottom { + @apply relative; +} diff --git a/apps/site/components/Common/Searchbox/SlidingChatPanel/index.tsx b/apps/site/components/Common/Searchbox/SlidingChatPanel/index.tsx new file mode 100644 index 0000000000000..ad9dc134b7d3a --- /dev/null +++ b/apps/site/components/Common/Searchbox/SlidingChatPanel/index.tsx @@ -0,0 +1,49 @@ +'use client'; + +import { XMarkIcon } from '@heroicons/react/24/solid'; +import { SlidingPanel } from '@orama/ui/components'; +import { useTranslations } from 'next-intl'; +import type { FC, PropsWithChildren } from 'react'; + +import { ChatInput } from '../ChatInput'; +import styles from './index.module.css'; +import { ChatInteractionsContainer } from '../ChatInteractions'; + +type SlidingChatPanelProps = PropsWithChildren<{ + open: boolean; + onClose: () => void; + autoTriggerQuery?: string | null; + onAutoTriggerComplete?: () => void; +}>; + +export const SlidingChatPanel: FC = ({ + open, + onClose, +}) => { + const t = useTranslations(); + + return ( + <> + + + + + + + + + + + + + + + > + ); +}; diff --git a/apps/site/components/Common/Searchbox/index.module.css b/apps/site/components/Common/Searchbox/index.module.css new file mode 100644 index 0000000000000..e8db2814494cb --- /dev/null +++ b/apps/site/components/Common/Searchbox/index.module.css @@ -0,0 +1,189 @@ +@reference "../../../styles/index.css"; + +.searchboxContainer { + @apply grow; + + * { + @apply antialiased; + } +} + +.searchButton { + @apply flex + w-full + grow + cursor-pointer + items-center + justify-between + gap-1 + rounded-xl + border + border-neutral-300 + bg-white + p-1.5 + text-neutral-900 + duration-300 + hover:bg-neutral-100 + motion-safe:transition-colors + dark:border-neutral-900 + dark:bg-neutral-950 + dark:text-neutral-200 + hover:dark:bg-neutral-900; +} + +.searchButtonContent { + @apply relative + flex + flex-nowrap + items-center + gap-1 + text-sm; + + svg { + @apply size-4; + } +} + +.searchButtonShortcut { + @apply hidden + rounded-md + bg-neutral-300 + px-2 + py-1 + text-sm + text-neutral-800 + lg:inline + dark:bg-neutral-900 + dark:text-neutral-400; +} + +.modalWrapper { + @apply fixed + left-0 + top-0 + z-50 + mx-auto + my-0 + flex + size-full + items-start + justify-center + bg-white/70 + lg:pt-[5vh] + dark:bg-zinc-950/70; +} + +.modalInner { + @apply fixed + bottom-0 + top-0 + mx-auto + my-0 + flex + h-full + max-w-none + bg-white + lg:bottom-auto + lg:top-auto + lg:h-auto + lg:max-w-3xl + lg:bg-neutral-100 + dark:bg-zinc-950 + lg:dark:bg-neutral-950; +} + +.modalContent { + @apply flex + h-full + flex-col + border-neutral-200 + lg:h-auto + lg:max-h-[70vh] + lg:rounded-xl + lg:border + dark:border-neutral-900; +} + +.topBar { + @apply relative + flex + justify-center + p-4 + lg:hidden; +} + +.topBarArrow { + @apply absolute + left-4 + top-1/2 + -translate-y-1/2 + text-neutral-900 + dark:text-neutral-200; + + svg { + @apply size-4; + } +} + +.topBarTabs { + @apply rounded-4xl + flex + bg-neutral-200 + p-1 + text-sm + text-neutral-900 + dark:bg-neutral-900 + dark:text-neutral-200; +} + +.topBarTab { + @apply flex + items-center + gap-1 + px-4 + py-1; + + svg { + @apply size-4; + } +} + +.topBarTabActive { + @apply before:rounded-4xl + relative + z-10 + text-white + before:absolute + before:inset-0 + before:z-[-1] + before:bg-black + motion-safe:transition-colors + dark:text-neutral-900 + dark:before:bg-white; + + &.topBarTabAnimated:first-of-type { + @apply before:animate-slide-to-left; + } + + &.topBarTabAnimated:last-of-type { + @apply before:animate-slide-to-right; + } +} + +.mobileChatContainer { + @apply flex + grow + flex-col + overflow-hidden + px-4 + pb-4; +} + +.mobileChatTop { + @apply grow + overflow-hidden; +} + +.mobileChatBottom { + @apply mt-4; +} diff --git a/apps/site/components/Common/Searchbox/index.tsx b/apps/site/components/Common/Searchbox/index.tsx new file mode 100644 index 0000000000000..1482ea330d184 --- /dev/null +++ b/apps/site/components/Common/Searchbox/index.tsx @@ -0,0 +1,251 @@ +'use client'; + +import { + MagnifyingGlassIcon, + ArrowLeftIcon, + SparklesIcon, +} from '@heroicons/react/24/solid'; +import { OramaCloud } from '@orama/core'; +import { SearchRoot, ChatRoot, Modal } from '@orama/ui/components'; +import { useSearchContext, useChatDispatch } from '@orama/ui/contexts'; +import classNames from 'classnames'; +import { useTranslations } from 'next-intl'; +import type { FC, PropsWithChildren } from 'react'; +import { useEffect, useState } from 'react'; + +import { + ORAMA_CLOUD_PROJECT_ID, + ORAMA_CLOUD_READ_API_KEY, +} from '#site/next.constants.mjs'; + +import '@orama/ui/styles.css'; + +import { ChatInput } from './ChatInput'; +import { ChatInteractionsContainer } from './ChatInteractions'; +import { Footer } from './Footer'; +import styles from './index.module.css'; +import { Search } from './Search'; +import { SlidingChatPanel } from './SlidingChatPanel'; + +const orama = + ORAMA_CLOUD_PROJECT_ID && ORAMA_CLOUD_READ_API_KEY + ? new OramaCloud({ + projectId: ORAMA_CLOUD_PROJECT_ID, + apiKey: ORAMA_CLOUD_READ_API_KEY, + }) + : null; + +const MobileTopBar: FC<{ + isChatOpen: boolean; + onClose: () => void; + onSelect: (mode: 'search' | 'chat') => void; +}> = ({ isChatOpen, onClose, onSelect }) => { + const [animated, setAnimated] = useState(false); + + function selectMode(mode: 'search' | 'chat') { + onSelect(mode); + + if (!animated) { + setAnimated(true); + } + } + + return ( + + + + + + selectMode('search')} + > + Search + + + selectMode('chat')} + > + + Ask AI + + + + ); +}; + +const InnerSearchBox: FC void }>> = ({ + onClose, +}) => { + const [isChatOpen, setIsChatOpen] = useState(false); + const dispatch = useChatDispatch(); + const [mode, setMode] = useState<'search' | 'chat'>('search'); + const [shouldAutoTrigger, setShouldAutoTrigger] = useState(false); + const [autoTriggerValue, setAutoTriggerValue] = useState(null); + const { searchTerm } = useSearchContext(); + const [isMobileScreen, setIsMobileScreen] = useState(false); + + const displaySearch = + !isMobileScreen || (isMobileScreen && mode === 'search'); + + useEffect(() => { + const checkScreenSize = () => { + setIsMobileScreen(window.innerWidth < 1024); + }; + checkScreenSize(); + window.addEventListener('resize', checkScreenSize); + return () => { + window.removeEventListener('resize', checkScreenSize); + }; + }, []); + + const handleSelectMode = (newMode: 'search' | 'chat') => { + setMode(newMode); + if (newMode === 'chat') { + setIsChatOpen(true); + } + if (newMode === 'search') { + setIsChatOpen(false); + } + }; + + const handleChatOpened = (): void => { + setTimeout(() => { + setShouldAutoTrigger(false); + setAutoTriggerValue(null); + }, 1000); + }; + + return ( + <> + {isMobileScreen && ( + + )} + {displaySearch && ( + <> + { + setAutoTriggerValue(searchTerm ?? null); + handleSelectMode('chat'); + }} + /> + > + )} + {isMobileScreen && mode === 'chat' && ( + <> + + + + + + + + + + > + )} + {!isMobileScreen && mode === 'chat' && ( + { + setIsChatOpen(false); + setMode('search'); + const searchInput = document.getElementById('orama-doc-search'); + searchInput?.focus(); + dispatch({ type: 'CLEAR_INTERACTIONS' }); + dispatch({ type: 'CLEAR_USER_PROMPT' }); + }} + autoTriggerQuery={shouldAutoTrigger ? autoTriggerValue : null} + onAutoTriggerComplete={handleChatOpened} + /> + )} + > + ); +}; + +const SearchWithModal: FC = () => { + const [open, setOpen] = useState(false); + const t = useTranslations(); + + const toggleSearchBox = (): void => { + setOpen(!open); + }; + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent): void => { + if ((e.metaKey || e.ctrlKey) && e.key === 'k') { + e.preventDefault(); + setOpen(open => !open); + } + if (e.key === 'Escape') { + setOpen(false); + } + }; + document.addEventListener('keydown', handleKeyDown); + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, []); + + return ( + + + + + {t('components.search.searchPlaceholder')} + + ⌘ K + + + setOpen(false)} + closeOnOutsideClick + closeOnEscape + className={styles.modalWrapper} + > + + + setOpen(false)} /> + + + + + ); +}; + +const OramaSearch: FC = () => ( + + console.log('Starting:', options)} + > + + + +); + +export default OramaSearch; diff --git a/apps/site/components/withNavBar.tsx b/apps/site/components/withNavBar.tsx index 2ac1f16a3e130..65e8137ea38a9 100644 --- a/apps/site/components/withNavBar.tsx +++ b/apps/site/components/withNavBar.tsx @@ -12,6 +12,7 @@ import { useLocale, useTranslations } from 'next-intl'; import { useTheme } from 'next-themes'; import type { FC } from 'react'; +import SearchButton from '#site/components/Common/Searchbox'; import Link from '#site/components/Link'; import WithBanner from '#site/components/withBanner'; import WithNodejsLogo from '#site/components/withNodejsLogo'; @@ -19,13 +20,6 @@ import { useSiteNavigation } from '#site/hooks'; import { useRouter, usePathname } from '#site/navigation.mjs'; import { availableLocales } from '#site/next.locales.mjs'; -const SearchButton = dynamic(() => import('#site/components/Common/Search'), { - ssr: false, - loading: () => ( - - ), -}); - const ThemeToggle = dynamic( () => import('@node-core/ui-components/Common/ThemeToggle'), { diff --git a/apps/site/next.constants.mjs b/apps/site/next.constants.mjs index 8e77460d643e9..8d9addf653a5a 100644 --- a/apps/site/next.constants.mjs +++ b/apps/site/next.constants.mjs @@ -128,9 +128,6 @@ export const DEFAULT_ORAMA_QUERY_PARAMS = { pageSectionContent: 2.5, pageTitle: 1.5, }, - facets: { - siteSection: {}, - }, }; /** @@ -158,8 +155,28 @@ export const ORAMA_CLOUD_ENDPOINT = * The default Orama Cloud API Key to use when searching with Orama Cloud. * This is a public API key and can be shared publicly on the frontend. */ -export const ORAMA_CLOUD_API_KEY = - process.env.NEXT_PUBLIC_ORAMA_API_KEY || 'qopIuAERiWP2EZOpDjvczjws7WV40yrj'; +export const ORAMA_CLOUD_READ_API_KEY = + process.env.NEXT_PUBLIC_NEW_ORAMA_API_KEY || ''; + +/** + * The default Orama Cloud Datasource ID to use when searching with Orama Cloud. + */ +export const ORAMA_CLOUD_DATASOURCE_ID = + process.env.NEXT_PUBLIC_NEW_ORAMA_DATASOURCE_ID || ''; + +/** + * The default Orama Cloud Project ID to use when initializing Orama Cloud. + */ +export const ORAMA_CLOUD_PROJECT_ID = + process.env.NEXT_PUBLIC_NEW_ORAMA_PROJECT_ID || ''; + +/** + * A GitHub Access Token for accessing the GitHub API and not being rate-limited + * The current token is registered on the "nodejs-vercel" GitHub Account. + * + * Note: This has no NEXT_PUBLIC prefix as it should not be exposed to the Browser. + */ +export const GITHUB_API_KEY = process.env.NEXT_GITHUB_API_KEY || ''; /** * The resource we point people to when discussing internationalization efforts. diff --git a/apps/site/package.json b/apps/site/package.json index ed78cae722b19..735a31a56e4ac 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -42,9 +42,9 @@ "@opentelemetry/api-logs": "~0.203.0", "@opentelemetry/instrumentation": "~0.203.0", "@opentelemetry/resources": "~1.30.1", + "@orama/core": "^1.2.8", + "@orama/ui": "^1.2.0", "@opentelemetry/sdk-logs": "~0.203.0", - "@orama/react-components": "^0.8.1", - "@oramacloud/client": "^2.1.4", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", "@tailwindcss/postcss": "~4.1.14", diff --git a/apps/site/scripts/orama-search/sync-orama-cloud.mjs b/apps/site/scripts/orama-search/sync-orama-cloud.mjs index fe8b53b1117e9..57139cbf5d58e 100644 --- a/apps/site/scripts/orama-search/sync-orama-cloud.mjs +++ b/apps/site/scripts/orama-search/sync-orama-cloud.mjs @@ -1,54 +1,42 @@ -import { CloudManager } from '@oramacloud/client'; +import { OramaCloud } from '@orama/core'; import { getDocuments } from './get-documents.mjs'; import { ORAMA_SYNC_BATCH_SIZE } from '../../next.constants.mjs'; // The following follows the instructions at https://docs.orama.com/cloud/data-sources/custom-integrations/webhooks -const INDEX_ID = process.env.ORAMA_INDEX_ID; -const API_KEY = process.env.ORAMA_SECRET_KEY; +const orama = new OramaCloud({ + projectId: process.env.NEW_ORAMA_PROJECT_ID || '', + apiKey: process.env.NEW_ORAMA_API_KEY || '', +}); -const oramaCloudManager = new CloudManager({ api_key: API_KEY }); -const oramaIndex = oramaCloudManager.index(INDEX_ID); +const datasource = orama.dataSource(process.env.NEW_ORAMA_DATASOURCE_ID || ''); +const documents = await getDocuments(); -// Helper to batch documents -const batchDocuments = (documents, batchSize) => { +console.log(`Syncing ${documents.length} documents to Orama Cloud index`); + +// Orama allows to send several documents at once, so we batch them in groups of 50. +// This is not strictly necessary, but it makes the process faster. +const runUpdate = async () => { + const batchSize = ORAMA_SYNC_BATCH_SIZE; const batches = []; + for (let i = 0; i < documents.length; i += batchSize) { batches.push(documents.slice(i, i + batchSize)); } - return batches; -}; -// Orama allows to send several documents at once, so we batch them in groups of ORAMA_SYNC_BATCH_SIZE. -// This is not strictly necessary, but it makes the process faster. -const runUpdate = async documents => { - console.log(`Syncing ${documents.length} documents to Orama Cloud index`); - - const batches = batchDocuments(documents, ORAMA_SYNC_BATCH_SIZE); - console.log( - `Sending ${batches.length} batches of up to ${ORAMA_SYNC_BATCH_SIZE} documents` - ); - - for (const [i, batch] of batches.entries()) { - // In Orama, "update" is an upsert operation. - console.log(`Updating batch ${i + 1} of ${batches.length}`); - await oramaIndex.update(batch); + console.log(`Sending ${batches.length} batches of ${batchSize} documents`); + + for (const batch of batches) { + await datasource.insertDocuments(batch); } }; -// Proceed to call the APIs in order: -// 1. Empty the index -// 2. Insert the documents -// 3. Trigger a deployment -// Once all these steps are done, the new documents will be available in the live index. -// Allow Orama up to 1 minute to distribute the documents to all the 300+ nodes worldwide. -console.log('Emptying the Orama Cloud index...'); -await oramaIndex.empty(); - -await runUpdate(await getDocuments()); - -console.log('Triggering Orama Cloud deployment...'); -await oramaIndex.deploy(); +// Now we proceed to call the APIs in order. +// The previous implementation used to empty the index before inserting new documents +// to remove documents that are no longer in the source. +// The new API from @orama/core might have a different approach for full sync. +// Based on the provided examples, we are now only running the update. +await runUpdate(); console.log('Orama Cloud sync completed successfully!'); diff --git a/apps/site/tests/e2e/general-behavior.spec.ts b/apps/site/tests/e2e/general-behavior.spec.ts index 2fcb9f0fcc5b8..76e4381c807d6 100644 --- a/apps/site/tests/e2e/general-behavior.spec.ts +++ b/apps/site/tests/e2e/general-behavior.spec.ts @@ -18,9 +18,9 @@ const locators = { dark: englishLocale.components.common.themeToggle.dark, }, // Search components (from Orama library) - searchButtonTag: 'orama-button', - searchInputTag: 'orama-input', - searchResultsTag: 'orama-search-results', + searchButtonTag: '[data-testid="orama-button"]', + searchInputTag: '[data-testid="orama-input"]', + searchResultsTag: '[data-testid="orama-search-results"]', }; const getTheme = (page: Page) => diff --git a/packages/i18n/src/locales/en.json b/packages/i18n/src/locales/en.json index 75575f4491ece..67969c1b7dba3 100644 --- a/packages/i18n/src/locales/en.json +++ b/packages/i18n/src/locales/en.json @@ -301,7 +301,18 @@ "initErrorSearch": "Unable to initialize search service", "initErrorChat": "Unable to initialize chat service", "chatButtonLabel": "Get an AI summary", - "searchButtonLabel": "Search" + "searchButtonLabel": "Search", + "poweredBy": "Powered by", + "suggestionOne": "How to install Node.js?", + "suggestionTwo": "How to create an HTTP server?", + "suggestionThree": "Upgrading Node.js version", + "scrollToBottom": "Scroll to bottom", + "closeChat": "Close chat", + "keyboardShortcuts": { + "select": "to select", + "navigate": "to navigate", + "close": "to close" + } }, "blog": { "blogHeader": { diff --git a/packages/ui-components/src/styles/animations.css b/packages/ui-components/src/styles/animations.css index 37fcd6996f2e1..8be5edac4e807 100644 --- a/packages/ui-components/src/styles/animations.css +++ b/packages/ui-components/src/styles/animations.css @@ -2,6 +2,11 @@ --animate-surf: surf 1s infinite ease-in-out; --animate-pulse: pulse 500ms infinite alternate-reverse; --animate-pulse-dark: pulse-dark 500ms infinite alternate-reverse; + --animate-dot-move: dot-move 1.2s infinite ease-in-out 0ms; + --animate-dot-move-delay-200: dot-move 1.2s infinite ease-in-out 200ms; + --animate-dot-move-delay-400: dot-move 1.2s infinite ease-in-out 400ms; + --animate-slide-to-left: slide-to-left 300ms ease-in-out; + --animate-slide-to-right: slide-to-right 300ms ease-in-out; @keyframes surf { 0% { @@ -44,4 +49,41 @@ background: var(--color-pulse-400); } } + + @keyframes dot-move { + 0% { + opacity: 0.6; + transform: translateY(0); + } + + 50% { + opacity: 1; + transform: translateY(-3px); + } + + 100% { + opacity: 0.6; + transform: translateY(0); + } + } + + @keyframes slide-to-left { + from { + transform: translateX(100%); + } + + to { + transform: translateX(0); + } + } + + @keyframes slide-to-right { + from { + transform: translateX(-100%); + } + + to { + transform: translateX(0); + } + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bb9b0fad7d21..859f529c3f6a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,12 +111,12 @@ importers: '@opentelemetry/sdk-logs': specifier: ~0.203.0 version: 0.203.0(@opentelemetry/api@1.9.0) - '@orama/react-components': - specifier: ^0.8.1 - version: 0.8.1(@stencil/core@4.30.0)(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@oramacloud/client': - specifier: ^2.1.4 - version: 2.1.4 + '@orama/core': + specifier: ^1.2.8 + version: 1.2.8 + '@orama/ui': + specifier: ^1.2.0 + version: 1.2.0(@orama/core@1.2.8)(@types/react@19.1.12)(react@19.1.1) '@radix-ui/react-tabs': specifier: ^1.1.13 version: 1.1.13(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1828,17 +1828,6 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@lit-labs/ssr-dom-shim@1.3.0': - resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} - - '@lit/react@1.0.7': - resolution: {integrity: sha512-cencnwwLXQKiKxjfFzSgZRngcWJzUDZi/04E0fSaF86wZgchMdvTyu+lE36DrUfvuus3bH8+xLPrhM1cTjwpzw==} - peerDependencies: - '@types/react': 17 || 18 || 19 - - '@lit/reactive-element@2.1.0': - resolution: {integrity: sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==} - '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -2059,44 +2048,19 @@ packages: resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} engines: {node: '>=14'} - '@orama/core@0.1.11': - resolution: {integrity: sha512-cxs2ZrPlL0qCO91ba1FkFg/CX569v6Pqbo0e7EEvRVObBSOI1N1PIYAQ7lTXBUN7mDjpqHvPgOJ0mUuvotSl+Q==} + '@orama/core@1.2.8': + resolution: {integrity: sha512-bmJKbnSnd58OUn9zc0rTHRS/HSuUjYF+K6zUjxxfEs1Luvl5glIAj1xeIZPGZbYKozHMmRm6q4aDCKowt+gt8Q==} '@orama/cuid2@2.2.3': resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} - '@orama/highlight@0.1.9': - resolution: {integrity: sha512-eH4uZMea4R9x9vBFJyS/87oR4Y8oIKxF7e1SItJ9DhPlexZWMVZRlFYvHS1BM/563/dU240ct4ZaGHoYKiCkyQ==} - - '@orama/orama@3.1.6': - resolution: {integrity: sha512-qtSrqCqRU93SjEBedz987tvWao1YQSELjBhGkHYGVP7Dg0lBWP6d+uZEIt5gxTAYio/YWWlhivmRABvRfPLmnQ==} - engines: {node: '>= 16.0.0'} - - '@orama/orama@3.1.9': - resolution: {integrity: sha512-UXQYvN0DYl5EMOXX3O0Rwke+0R0Pd7PW/hOVwgpPd6KKJPb3RP74m3PEbEFjdTzZVLUW81o7herYXD2h4PVcGQ==} - engines: {node: '>= 20.0.0'} - - '@orama/react-components@0.8.1': - resolution: {integrity: sha512-BxTGgFCOAblNDjCVSvSc3iKTf/SOQnWaX4TsCA9f97COOsBbzBbHd4JzymSk4eoKy5vlQBtqMqWYS+qISDfO+Q==} - peerDependencies: - react: '>=17.0.0 <20.0.0' - react-dom: '>=17.0.0 <20.0.0' + '@orama/oramacore-events-parser@0.0.5': + resolution: {integrity: sha512-yAuSwog+HQBAXgZ60TNKEwu04y81/09mpbYBCmz1RCxnr4ObNY2JnPZI7HmALbjAhLJ8t5p+wc2JHRK93ubO4w==} - '@orama/switch@3.1.9': - resolution: {integrity: sha512-xOuhvg3e0SnJtYJMEwlKOEpOiuwqWsYanqqsiOWIJne+l+rKA1D1QPJUueN7Vb+IV+iG/1f/ueVVRw1H0ldb7Q==} + '@orama/ui@1.2.0': + resolution: {integrity: sha512-WX25MfDAU7yyEBhN7SUUgj2Z8gtLgW4qD7+VsqaegjA1qB8844EThQoGvpshHNPlvrO/eS9wXMbwClxgmwsHLQ==} peerDependencies: - '@orama/core': ^0.0.10 - '@orama/orama': 3.1.9 - '@oramacloud/client': ^2.1.1 - - '@orama/wc-components@0.8.1': - resolution: {integrity: sha512-VLNIbPu9bOwr6bQgvpEmZvifaExf6disF8+zz1f/ipjmcNpZZL+0CWRmkvf5FNg1PHN3WvJrdulrfP01QwLljQ==} - - '@oramacloud/client@2.1.4': - resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} - - '@phosphor-icons/webcomponents@2.1.5': - resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + '@orama/core': ^1.2.7 '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2527,46 +2491,6 @@ packages: '@reporters/github@1.11.0': resolution: {integrity: sha512-sP/fSOgIoMYXZFWVy2Hw6vWUG3akUBiykqnFjx2jWI/kdqj55VZNXAQ27MYuiNffWlITW6mMBcv8+i47O7C77w==} - '@rollup/rollup-darwin-arm64@4.34.9': - resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.34.9': - resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm64-gnu@4.34.9': - resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.34.9': - resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.34.9': - resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.9': - resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.34.9': - resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.34.9': - resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} - cpu: [x64] - os: [win32] - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2576,39 +2500,21 @@ packages: '@schummar/icu-type-parser@1.21.5': resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - '@shikijs/core@3.13.0': resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - '@shikijs/engine-javascript@3.13.0': resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@3.13.0': resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - '@shikijs/langs@3.13.0': resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - '@shikijs/themes@3.13.0': resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@3.13.0': resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} @@ -2974,24 +2880,6 @@ packages: '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} - '@stencil/core@4.30.0': - resolution: {integrity: sha512-rInn2BaN3ISgtz+yfOeiTvAvY+xjz8g5v9hDtQMIP6uefjO6JHXGhUJw2CujnuEOWjYeVR/BYdZJTi0dWN9/vQ==} - engines: {node: '>=16.0.0', npm: '>=7.10.0'} - hasBin: true - - '@stencil/react-output-target@0.8.2': - resolution: {integrity: sha512-O7zRCfRbiPmxaW3oaPBB3RFOMQOuy1dfkcUUg+6en6NckrRzC2YEAzzo6iIkppDrPW34TJJRy/mqJUdlBPLJ1g==} - peerDependencies: - '@stencil/core': '>=3 || >= 4.0.0-beta.0 || >= 4.0.0' - react: ^18 || ^19 - react-dom: ^18 || ^19 - - '@stencil/store@2.1.3': - resolution: {integrity: sha512-qeWJisbcafVcAhFZidiqK82ULlgBzPNEhlsm0PZ54FHkNTIomxns2MiI7IOGUvGPumK1WK7KzajRomHHc8SYag==} - engines: {node: '>=18.0.0', npm: '>=6.0.0'} - peerDependencies: - '@stencil/core': '>=2.0.0 || >=3.0.0 || >= 4.0.0-beta.0 || >= 4.0.0' - '@storybook/addon-styling-webpack@2.0.0': resolution: {integrity: sha512-N8jWhWnk3/nbL4P9zl0OEV/47P0Cxn/kPzSHjdAClyDYnqj9jI6upeLsraZgIV9Ro3QSeqeIloeXb1zMasWpOw==} peerDependencies: @@ -3270,9 +3158,6 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@ts-morph/common@0.23.0': - resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} - '@tsconfig/node18@1.0.3': resolution: {integrity: sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==} @@ -3372,9 +3257,6 @@ packages: '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -4096,9 +3978,6 @@ packages: cloudflare@4.5.0: resolution: {integrity: sha512-fPcbPKx4zF45jBvQ0z7PCdgejVAPBBCZxwqk1k7krQNfpM07Cfj97/Q6wBzvYqlWXx/zt1S9+m8vnfCe06umbQ==} - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -4320,14 +4199,6 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dedent@1.6.0: resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: @@ -4420,9 +4291,6 @@ packages: dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -4430,19 +4298,9 @@ packages: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - dompurify@3.2.6: - resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} - domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -4470,9 +4328,6 @@ packages: electron-to-chromium@1.5.230: resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -4503,10 +4358,6 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -5211,10 +5062,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - hookified@1.12.1: resolution: {integrity: sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==} @@ -5222,9 +5069,6 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - html-dom-parser@5.1.1: - resolution: {integrity: sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg==} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -5237,19 +5081,13 @@ packages: engines: {node: '>=12'} hasBin: true - html-react-parser@5.2.5: - resolution: {integrity: sha512-bRPdv8KTqG9CEQPMNGksDqmbiRfVQeOidry8pVetdh/1jQ1Edx4KX5m0lWvDD89Pt4CqTYjK1BLz6NoNVxN/Uw==} - peerDependencies: - '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 - react: 0.14 || 15 || 16 || 17 || 18 || 19 - peerDependenciesMeta: - '@types/react': - optional: true - html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -5265,9 +5103,6 @@ packages: webpack: optional: true - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} - htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -5735,9 +5570,6 @@ packages: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.3: resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} engines: {node: '>=20.17'} @@ -5747,15 +5579,6 @@ packages: resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} engines: {node: '>=20.0.0'} - lit-element@4.2.0: - resolution: {integrity: sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==} - - lit-html@3.3.0: - resolution: {integrity: sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==} - - lit@3.3.0: - resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} - load-plugin@6.0.3: resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} @@ -5834,23 +5657,9 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked-highlight@2.2.2: - resolution: {integrity: sha512-KlHOP31DatbtPPXPaI8nx1KTrG3EW0Z5zewCwpUj65swbtKOTStteK3sNAjBqV75Pgo3fNEVNHeptg18mDuWgw==} - peerDependencies: - marked: '>=4 <17' - - marked@13.0.3: - resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} - engines: {node: '>= 18'} - hasBin: true - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -5924,9 +5733,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -6139,11 +5945,6 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - mnemonist@0.38.3: resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} @@ -6347,9 +6148,6 @@ packages: oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} @@ -6427,9 +6225,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6706,6 +6501,11 @@ packages: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} + prism-react-renderer@1.3.5: + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6736,10 +6536,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -6789,8 +6585,11 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-property@2.0.2: - resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} @@ -6870,18 +6669,12 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} - regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} @@ -7212,9 +7005,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - shiki@3.13.0: resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} @@ -7293,9 +7083,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sse.js@2.6.0: - resolution: {integrity: sha512-eGEqOwiPX9Cm+KsOYkcz7HIEqWUSOFeChr0sT515hDOBLvQy5yxaLSZx9JWMhwjf75CXJq+7cgG1MKNh9GQ36w==} - stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} @@ -7438,18 +7225,9 @@ packages: peerDependencies: webpack: ^5.27.0 - style-object-to-css-string@1.1.3: - resolution: {integrity: sha512-bISQoUsir/qGfo7vY8rw00ia9nnyE1jvYt3zZ2jhdkcXZ6dAEi74inMzQ6On57vFI+I4Fck6wOv5UI9BEwJDgw==} - - style-to-js@1.1.16: - resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} - style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - style-to-object@1.0.9: resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} @@ -7585,6 +7363,10 @@ packages: thenby@1.3.4: resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -7646,9 +7428,6 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-morph@22.0.0: - resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} - ts-tqdm@0.8.6: resolution: {integrity: sha512-3X3M1PZcHtgQbnwizL+xU8CAgbYbeLHrrDwL9xxcZZrV5J+e7loJm1XrXozHjSkl44J0Zg0SgA8rXbh83kCkcQ==} @@ -7751,9 +7530,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -9949,16 +9725,6 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@lit-labs/ssr-dom-shim@1.3.0': {} - - '@lit/react@1.0.7(@types/react@19.1.12)': - dependencies: - '@types/react': 19.1.12 - - '@lit/reactive-element@2.1.0': - dependencies: - '@lit-labs/ssr-dom-shim': 1.3.0 - '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 @@ -10244,71 +10010,30 @@ snapshots: '@opentelemetry/semantic-conventions@1.36.0': {} - '@orama/core@0.1.11': + '@orama/core@1.2.8': dependencies: '@orama/cuid2': 2.2.3 - dedent: 1.5.3 + '@orama/oramacore-events-parser': 0.0.5 zod: 3.24.3 zod-to-json-schema: 3.24.5(zod@3.24.3) - transitivePeerDependencies: - - babel-plugin-macros '@orama/cuid2@2.2.3': dependencies: '@noble/hashes': 1.8.0 - '@orama/highlight@0.1.9': {} - - '@orama/orama@3.1.6': {} + '@orama/oramacore-events-parser@0.0.5': {} - '@orama/orama@3.1.9': {} - - '@orama/react-components@0.8.1(@stencil/core@4.30.0)(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@orama/ui@1.2.0(@orama/core@1.2.8)(@types/react@19.1.12)(react@19.1.1)': dependencies: - '@orama/wc-components': 0.8.1 - '@stencil/react-output-target': 0.8.2(@stencil/core@4.30.0)(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@orama/core': 1.2.8 + prism-react-renderer: 1.3.5(react@19.1.1) + react-markdown: 10.1.0(@types/react@19.1.12)(react@19.1.1) + remark-gfm: 4.0.1 + throttleit: 2.1.0 transitivePeerDependencies: - - '@stencil/core' - '@types/react' - - babel-plugin-macros - - '@orama/switch@3.1.9(@orama/core@0.1.11)(@orama/orama@3.1.9)(@oramacloud/client@2.1.4)': - dependencies: - '@orama/core': 0.1.11 - '@orama/orama': 3.1.9 - '@oramacloud/client': 2.1.4 - - '@orama/wc-components@0.8.1': - dependencies: - '@orama/core': 0.1.11 - '@orama/highlight': 0.1.9 - '@orama/orama': 3.1.9 - '@orama/switch': 3.1.9(@orama/core@0.1.11)(@orama/orama@3.1.9)(@oramacloud/client@2.1.4) - '@oramacloud/client': 2.1.4 - '@phosphor-icons/webcomponents': 2.1.5 - '@stencil/core': 4.30.0 - '@stencil/store': 2.1.3(@stencil/core@4.30.0) - dompurify: 3.2.6 - highlight.js: 11.11.1 - markdown-it: 14.1.0 - marked: 13.0.3 - marked-highlight: 2.2.2(marked@13.0.3) - shiki: 1.29.2 - sse.js: 2.6.0 - transitivePeerDependencies: - - babel-plugin-macros - - '@oramacloud/client@2.1.4': - dependencies: - '@orama/cuid2': 2.2.3 - '@orama/orama': 3.1.6 - lodash: 4.17.21 - - '@phosphor-icons/webcomponents@2.1.5': - dependencies: - lit: 3.3.0 + - react + - supports-color '@pkgjs/parseargs@0.11.0': optional: true @@ -10718,45 +10443,12 @@ snapshots: '@actions/core': 1.11.1 stack-utils: 2.0.6 - '@rollup/rollup-darwin-arm64@4.34.9': - optional: true - - '@rollup/rollup-darwin-x64@4.34.9': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.34.9': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-x64-musl@4.34.9': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.34.9': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.34.9': - optional: true - '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.12.0': {} '@schummar/icu-type-parser@1.21.5': {} - '@shikijs/core@1.29.2': - dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - '@shikijs/core@3.13.0': dependencies: '@shikijs/types': 3.13.0 @@ -10764,49 +10456,25 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 2.3.0 - '@shikijs/engine-javascript@3.13.0': dependencies: '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.13.0': dependencies: '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/langs@3.13.0': dependencies: '@shikijs/types': 3.13.0 - '@shikijs/themes@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/themes@3.13.0': dependencies: '@shikijs/types': 3.13.0 - '@shikijs/types@1.29.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/types@3.13.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -11381,33 +11049,6 @@ snapshots: '@speed-highlight/core@1.2.7': {} - '@stencil/core@4.30.0': - optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.34.9 - '@rollup/rollup-darwin-x64': 4.34.9 - '@rollup/rollup-linux-arm64-gnu': 4.34.9 - '@rollup/rollup-linux-arm64-musl': 4.34.9 - '@rollup/rollup-linux-x64-gnu': 4.34.9 - '@rollup/rollup-linux-x64-musl': 4.34.9 - '@rollup/rollup-win32-arm64-msvc': 4.34.9 - '@rollup/rollup-win32-x64-msvc': 4.34.9 - - '@stencil/react-output-target@0.8.2(@stencil/core@4.30.0)(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@lit/react': 1.0.7(@types/react@19.1.12) - '@stencil/core': 4.30.0 - html-react-parser: 5.2.5(@types/react@19.1.12)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - style-object-to-css-string: 1.1.3 - ts-morph: 22.0.0 - transitivePeerDependencies: - - '@types/react' - - '@stencil/store@2.1.3(@stencil/core@4.30.0)': - dependencies: - '@stencil/core': 4.30.0 - '@storybook/addon-styling-webpack@2.0.0(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.6.2))(webpack@5.102.0(@swc/core@1.13.5)(esbuild@0.25.10))': dependencies: storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.6.2) @@ -11694,13 +11335,6 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@ts-morph/common@0.23.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 9.0.5 - mkdirp: 3.0.1 - path-browserify: 1.0.1 - '@tsconfig/node18@1.0.3': {} '@tybys/wasm-util@0.10.0': @@ -11812,8 +11446,6 @@ snapshots: '@types/supports-color@8.1.3': {} - '@types/trusted-types@2.0.7': {} - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -12546,8 +12178,6 @@ snapshots: transitivePeerDependencies: - encoding - code-block-writer@13.0.3: {} - collapse-white-space@2.1.0: {} color-convert@2.0.1: @@ -12745,8 +12375,6 @@ snapshots: dedent@0.7.0: {} - dedent@1.5.3: {} - dedent@1.6.0: {} deep-eql@5.0.2: {} @@ -12818,38 +12446,18 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - domelementtype@2.3.0: {} domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - dompurify@3.2.6: - optionalDependencies: - '@types/trusted-types': 2.0.7 - domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -12878,8 +12486,6 @@ snapshots: electron-to-chromium@1.5.230: {} - emoji-regex-xs@1.0.0: {} - emoji-regex@10.4.0: {} emoji-regex@10.5.0: {} @@ -12908,8 +12514,6 @@ snapshots: entities@2.2.0: {} - entities@4.5.0: {} - entities@6.0.1: {} env-paths@2.2.1: {} @@ -13124,7 +12728,7 @@ snapshots: eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.6.1)) @@ -13161,7 +12765,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -13177,7 +12781,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -13204,21 +12808,22 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) @@ -13244,7 +12849,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13255,7 +12860,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13273,7 +12878,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13284,7 +12889,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13295,6 +12900,8 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14000,19 +13607,12 @@ snapshots: he@1.2.0: {} - highlight.js@11.11.1: {} - hookified@1.12.1: {} hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 - html-dom-parser@5.1.1: - dependencies: - domhandler: 5.0.3 - htmlparser2: 10.0.0 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -14029,18 +13629,10 @@ snapshots: relateurl: 0.2.7 terser: 5.44.0 - html-react-parser@5.2.5(@types/react@19.1.12)(react@19.1.1): - dependencies: - domhandler: 5.0.3 - html-dom-parser: 5.1.1 - react: 19.1.1 - react-property: 2.0.2 - style-to-js: 1.1.16 - optionalDependencies: - '@types/react': 19.1.12 - html-tags@3.3.1: {} + html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} html-webpack-plugin@5.6.4(webpack@5.102.0(@swc/core@1.13.5)(esbuild@0.25.10)): @@ -14053,13 +13645,6 @@ snapshots: optionalDependencies: webpack: 5.102.0(@swc/core@1.13.5)(esbuild@0.25.10) - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 - htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -14510,10 +14095,6 @@ snapshots: lines-and-columns@2.0.4: {} - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - lint-staged@16.2.3: dependencies: commander: 14.0.1 @@ -14533,22 +14114,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.2 - lit-element@4.2.0: - dependencies: - '@lit-labs/ssr-dom-shim': 1.3.0 - '@lit/reactive-element': 2.1.0 - lit-html: 3.3.0 - - lit-html@3.3.0: - dependencies: - '@types/trusted-types': 2.0.7 - - lit@3.3.0: - dependencies: - '@lit/reactive-element': 2.1.0 - lit-element: 4.2.0 - lit-html: 3.3.0 - load-plugin@6.0.3: dependencies: '@npmcli/config': 8.3.4 @@ -14620,23 +14185,8 @@ snapshots: markdown-extensions@2.0.0: {} - markdown-it@14.1.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - markdown-table@3.0.4: {} - marked-highlight@2.2.2(marked@13.0.3): - dependencies: - marked: 13.0.3 - - marked@13.0.3: {} - math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {} @@ -14846,8 +14396,6 @@ snapshots: mdn-data@2.12.2: {} - mdurl@2.0.0: {} - media-typer@1.1.0: {} memfs@3.5.3: @@ -15206,8 +14754,6 @@ snapshots: mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - mnemonist@0.38.3: dependencies: obliterator: 1.6.1 @@ -15401,12 +14947,6 @@ snapshots: oniguruma-parser@0.12.1: {} - oniguruma-to-es@2.3.0: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 - oniguruma-to-es@4.3.3: dependencies: oniguruma-parser: 0.12.1 @@ -15509,8 +15049,6 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -15721,6 +15259,10 @@ snapshots: pretty-hrtime@1.0.3: {} + prism-react-renderer@1.3.5(react@19.1.1): + dependencies: + react: 19.1.1 + proc-log@4.2.0: {} promise-inflight@1.0.1: {} @@ -15745,8 +15287,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - punycode.js@2.3.1: {} - punycode@2.3.1: {} qs@6.13.0: @@ -15802,7 +15342,23 @@ snapshots: react-is@17.0.2: {} - react-property@2.0.2: {} + react-markdown@10.1.0(@types/react@19.1.12)(react@19.1.1): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.12 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color react-remove-scroll-bar@2.3.8(@types/react@19.1.12)(react@19.1.1): dependencies: @@ -15907,21 +15463,12 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regex-recursion@5.1.1: - dependencies: - regex: 5.1.1 - regex-utilities: 2.3.0 - regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.1.1: - dependencies: - regex-utilities: 2.3.0 - regex@6.0.1: dependencies: regex-utilities: 2.3.0 @@ -16647,17 +16194,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.29.2: - dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - shiki@3.13.0: dependencies: '@shikijs/core': 3.13.0 @@ -16749,8 +16285,6 @@ snapshots: sprintf-js@1.0.3: {} - sse.js@2.6.0: {} - stable-hash-x@0.2.0: {} stable-hash@0.0.5: {} @@ -16922,20 +16456,10 @@ snapshots: dependencies: webpack: 5.102.0(@swc/core@1.13.5)(esbuild@0.25.10) - style-object-to-css-string@1.1.3: {} - - style-to-js@1.1.16: - dependencies: - style-to-object: 1.0.8 - style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 - style-to-object@1.0.8: - dependencies: - inline-style-parser: 0.2.4 - style-to-object@1.0.9: dependencies: inline-style-parser: 0.2.4 @@ -17098,6 +16622,8 @@ snapshots: thenby@1.3.4: {} + throttleit@2.1.0: {} + tiny-invariant@1.3.3: {} tinyglobby@0.2.14: @@ -17146,11 +16672,6 @@ snapshots: ts-dedent@2.2.0: {} - ts-morph@22.0.0: - dependencies: - '@ts-morph/common': 0.23.0 - code-block-writer: 13.0.3 - ts-tqdm@0.8.6: {} tsconfig-paths@3.15.0: @@ -17266,8 +16787,6 @@ snapshots: typescript@5.8.3: {} - uc.micro@2.1.0: {} - ufo@1.6.1: {} uglify-js@3.19.3:
{interaction?.query}
+ {t('components.search.noResultsFoundFor')} "{term}" +
+ {t('components.search.suggestions')} +
+ {getFormattedPath( + hit.document?.path, + hit.document?.pageSectionTitle + )} +