diff --git a/.gitignore b/.gitignore index 6dbefc3ed5566..b20571f6b8397 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ test-results playwright-report ## MacOS Ignored Files -.DS_Store \ No newline at end of file +.DS_Store +.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/Chat/ChatActions/index.module.css b/apps/site/components/Common/Searchbox/Chat/ChatActions/index.module.css new file mode 100644 index 0000000000000..25293793ae1be --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatActions/index.module.css @@ -0,0 +1,36 @@ +.chatActionsContainer { + @apply flex; + @apply items-center; + @apply justify-end; + @apply pt-2; +} + +.chatActionsList { + @apply flex; + @apply list-none; + @apply items-center; + @apply gap-2; + @apply p-0; +} + +.chatAction { + @apply cursor-pointer; + @apply rounded-full; + @apply p-2; + @apply text-neutral-800; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-neutral-300; + @apply dark:text-neutral-400; + @apply dark:hover:bg-neutral-900; + + svg { + @apply h-4; + @apply w-4; + } +} + +.chatActionIconSelected { + @apply text-green-600; + @apply dark:text-green-400; +} diff --git a/apps/site/components/Common/Searchbox/Chat/ChatActions/index.tsx b/apps/site/components/Common/Searchbox/Chat/ChatActions/index.tsx new file mode 100644 index 0000000000000..6f55187827986 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatActions/index.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { + DocumentCheckIcon, + ClipboardIcon, + ArrowPathIcon, +} from '@heroicons/react/24/solid'; +import type { Interaction } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import type { FC } from 'react'; + +import styles from './index.module.css'; + +type ChatActionsProps = { + interaction: Interaction; + index: number; + totalInteractions: number; +}; + +export const ChatActions: FC = ({ + interaction, + index, + totalInteractions, +}) => { + if (!interaction.response) return null; + + return ( + + + {index === totalInteractions - 1 && ( + + + + + + )} + + + {(copied: boolean) => + copied ? ( + + ) : ( + + ) + } + + + + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Chat/ChatInput/index.module.css b/apps/site/components/Common/Searchbox/Chat/ChatInput/index.module.css new file mode 100644 index 0000000000000..e4f57a0ba823d --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatInput/index.module.css @@ -0,0 +1,42 @@ +.promptWrapperCustom { + @apply relative; +} + +.promptFieldCustom { + font-family: inherit !important; +} + +.promptButtonCustom { + @apply absolute; + @apply right-3; + @apply top-1/2; + @apply -translate-y-1/2; + @apply border-none; + @apply rounded-lg; + @apply text-white; + @apply cursor-pointer; + @apply p-2; + @apply transition-colors; + @apply duration-300; + @apply bg-green-500; + @apply flex; + @apply items-center; + @apply justify-center; + @apply min-h-8; + @apply min-w-8; +} + +.promptButtonCustom:hover:not(:disabled) { + @apply bg-green-600; +} + +.promptButtonCustom:disabled { + @apply bg-gray-200; + @apply text-gray-500; + @apply cursor-not-allowed; + @apply opacity-60; +} + +.slidingPanelFooter { + @apply flex; +} diff --git a/apps/site/components/Common/Searchbox/Chat/ChatInput/index.tsx b/apps/site/components/Common/Searchbox/Chat/ChatInput/index.tsx new file mode 100644 index 0000000000000..fc5efda45990b --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatInput/index.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { PaperAirplaneIcon } from '@heroicons/react/20/solid'; +import { PauseCircleIcon } from '@heroicons/react/24/solid'; +import { PromptTextArea } from '@orama/ui/components'; +import { useTranslations } from 'next-intl'; +import type { FC } from 'react'; + +import styles from './index.module.css'; + +export const ChatInput: FC = () => { + const t = useTranslations(); + + return ( + + + + } + className={`${styles.promptButtonCustom} orama-custom-button`} + > + + + + + {t('components.search.disclaimer')} + + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.module.css b/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.module.css new file mode 100644 index 0000000000000..2aaacc1d6f8c6 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.module.css @@ -0,0 +1,159 @@ +.chatUserPrompt { + @apply block; +} + +.chatLoader { + @apply my-4; +} + +.chatLoadingWrapper { + @apply mx-8; + @apply mb-6; + @apply flex; + @apply min-h-[60px]; + @apply items-center; + @apply justify-center; + @apply rounded-xl; + @apply p-6; + @apply bg-[#0d121c]; +} + +.typingIndicator { + @apply flex; + @apply gap-2; +} + +.typingDot { + @apply h-3; + @apply w-3; + @apply rounded-full; + @apply bg-white; + @apply opacity-80; + + animation: typing 1.4s infinite ease-in-out; +} + +.typingDot:nth-child(1) { + animation-delay: 0s; +} + +.typingDot:nth-child(2) { + animation-delay: 0.2s; +} + +.typingDot:nth-child(3) { + animation-delay: 0.4s; +} + +@keyframes typing { + 0%, + 60%, + 100% { + opacity: 0.7; + transform: translateY(0); + } + + 30% { + opacity: 1; + transform: translateY(-10px); + } +} + +.chatAssistantMessageMain { + @apply mb-4, + text-base, + text-neutral-900, + dark:text-neutral-200; +} + +.chatAssistantMessageWrapper { + @apply block; +} + +.chatAssistantMessage { + @apply my-4, + mb-6, + max-w-full, + rounded-xl, + px-6, + py-4, + text-base; + + background: transparent; + border: none; + + @apply !text-white; + + margin: 0; + padding: 0; +} + +.chatAssistantMessage p { + @apply font-sm-line-height, + mb-3, + text-white; +} + +.chatAssistantMessage pre { + @apply my-4, + rounded-md, + bg-black/20, + p-4, + text-xs, + text-white; + + code { + @apply rounded-lg, + p-3, + text-sm; + } +} + +.chatAssistantMessage code { + @apply rounded, + bg-black/30, + p-1, + text-white; +} + +.chatAssistantMessage ul { + @apply list-disc, + pl-6; +} + +.chatAssistantMessage ol { + @apply list-decimal, + pl-6; +} + +.chatAssistantMessage li { + @apply mb-1; +} + +.chatAssistantMessage h1, +.chatAssistantMessage h2, +.chatAssistantMessage h3 { + @apply mb-2, + text-lg, + font-bold; +} + +.markdownPre { + border-radius: 0.5rem !important; + padding: 0.1875rem 0.3125rem !important; +} + +:global(pre[class*='prism']) { + border-radius: 0.5rem !important; + padding: 0.1875rem 0.3125rem !important; +} + +:global(.chatAssistantMessage pre) { + border-radius: 0.5rem !important; + padding: 0.1875rem 0.3125rem !important; +} + +:global(pre[style*='background-color']) { + border-radius: 0.5rem !important; + padding: 0.1875rem 0.3125rem !important; +} diff --git a/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.tsx b/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.tsx new file mode 100644 index 0000000000000..51d7e643202c5 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatMessage/index.tsx @@ -0,0 +1,88 @@ +'use client'; + +import type { Interaction } from '@orama/core'; +import { ChatInteractions } from '@orama/ui/components'; +import type { FC } from 'react'; + +import { ChatActions } from '../ChatActions'; +import { ChatSources } from '../ChatSources'; +import styles from './index.module.css'; + +type ChatMessageProps = { + interaction: Interaction; + index: number; + totalInteractions: number; +}; + +const TypingIndicator: FC = () => ( + + + + + +); + +export const ChatMessage: FC = ({ + interaction, + index, + totalInteractions, +}) => { + if (!interaction) return null; + + return ( + <> + + {interaction?.query || ''} + + + + + + + + + + + {interaction && ( + + + {interaction.response || ''} + + + + + + + )} + > + ); +}; diff --git a/apps/site/components/Common/Searchbox/Chat/ChatSources/index.module.css b/apps/site/components/Common/Searchbox/Chat/ChatSources/index.module.css new file mode 100644 index 0000000000000..40d5f69dfcd9e --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatSources/index.module.css @@ -0,0 +1,45 @@ +.chatSources { + @apply mb-4; + @apply flex; + @apply flex-nowrap; + @apply items-center; + @apply gap-3; + @apply overflow-x-scroll; + @apply scroll-smooth; + @apply [scrollbar-width:none]; + @apply [&::-webkit-scrollbar]:hidden; +} + +.chatSource { + @apply flex; + @apply max-w-xs; + @apply items-center; + @apply gap-2; + @apply text-base; +} + +.chatSourceLink { + @apply rounded-xl; + @apply bg-neutral-100; + @apply px-4; + @apply py-2; + @apply text-neutral-900; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-neutral-200; + @apply focus:bg-neutral-200; + @apply dark:bg-neutral-950; + @apply dark:text-neutral-200; + @apply hover:dark:bg-neutral-900; + @apply focus:dark:bg-neutral-900; +} + +.chatSourceTitle { + @apply max-w-full; + @apply overflow-hidden; + @apply truncate; + @apply text-ellipsis; + @apply whitespace-nowrap; + @apply text-sm; + @apply font-semibold; +} diff --git a/apps/site/components/Common/Searchbox/Chat/ChatSources/index.tsx b/apps/site/components/Common/Searchbox/Chat/ChatSources/index.tsx new file mode 100644 index 0000000000000..3c3cf04b576ad --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/ChatSources/index.tsx @@ -0,0 +1,45 @@ +'use client'; + +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 { DocumentLink } from '../../DocumentLink'; + +type DocumentSource = { + path: string; + siteSection: string; + pageSectionTitle?: string; + [key: string]: unknown; +}; + +type ChatSourcesProps = { + interaction: Interaction; +}; + +export const ChatSources: FC = ({ interaction }) => { + if (!interaction?.sources) return null; + + return ( + + {(document: AnyObject, index: number) => ( + + + + {document.pageSectionTitle as string} + + + + )} + + ); +}; diff --git a/apps/site/components/Common/Searchbox/Chat/index.module.css b/apps/site/components/Common/Searchbox/Chat/index.module.css new file mode 100644 index 0000000000000..e46afaba31260 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/index.module.css @@ -0,0 +1,384 @@ +@reference "../../../styles/index.css"; + +.slidingPanelCloseButton { + @apply absolute; + @apply right-6; + @apply top-6; + @apply z-20; + @apply cursor-pointer; + @apply rounded-full; + @apply bg-white/10; + @apply p-2; + @apply text-white; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-white/20; + @apply focus:bg-white/20; + @apply focus:outline-none; + + svg { + @apply h-6; + @apply w-6; + } +} + +.slidingPanelContentWrapper { + @apply fixed, + bottom-0, + left-0, + z-[10019], + box-border, + h-[95vh], + w-full, + overflow-hidden, + p-0, + !bg-neutral-950, + !border, + !border-neutral-700, + !text-white; + + border-radius: var(--radius-m, calc(12rem / var(--orama-base-font-size, 16))) + var(--radius-m, calc(12rem / var(--orama-base-font-size, 16))) 0 0; + transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1); +} + +.slidingPanelContent { + @apply h-[90vh]; + @apply max-w-[100vw]; + @apply overflow-hidden; + @apply rounded-xl; + @apply p-4; + @apply shadow-lg; +} + +.slidingPanelInner { + @apply mx-auto; + @apply flex; + @apply h-full; + @apply max-w-4xl; + @apply flex-col; + @apply justify-between; +} + +.slidingPanelTop { + @apply flex; + @apply min-h-0; + @apply flex-1; + @apply flex-col; + @apply pb-6; +} + +.chatInteractionsWrapper { + @apply relative; + @apply h-full; + @apply items-start; + @apply overflow-y-auto; + @apply px-8; +} + +.chatInteractionsWrapper::-webkit-scrollbar { + width: 4px; +} + +.chatInteractionsWrapper::-webkit-scrollbar-track { + background: transparent; +} + +.chatInteractionsWrapper::-webkit-scrollbar-thumb { + background: rgb(255 255 255 / 20%); + border-radius: 2px; +} + +.chatInteractionsWrapper::-webkit-scrollbar-thumb:hover { + background: rgb(255 255 255 / 30%); +} + +.slidingPanelBottom { + @apply relative; + @apply flex-shrink-0; +} + +.chatUserPrompt { + @apply mb-6; + @apply flex; + @apply justify-end; + + p { + @apply max-w-2xl; + @apply rounded-xl; + @apply bg-white; + @apply px-4; + @apply py-3; + @apply text-black; + } +} + +.chatLoader { + @apply mb-6; + @apply flex; + @apply items-center; + @apply space-x-2; + @apply text-white; + + span { + @apply h-2; + @apply w-2; + @apply animate-pulse; + @apply rounded-full; + @apply bg-white; + } + + p { + @apply text-sm; + @apply text-white/70; + } +} + +.chatAssistantMessageWrapper { + @apply mb-6; + @apply w-full; +} + +.chatAssistantMessage { + @apply prose; + @apply prose-invert; + @apply max-w-none; + @apply text-white; + + p { + color: white; + margin-bottom: 16px; + } + + a { + @apply text-blue-400; + @apply hover:text-blue-300; + } + + code { + @apply rounded; + @apply bg-white/10; + @apply px-1; + @apply py-0.5; + @apply text-sm; + @apply text-white; + } + + pre { + @apply rounded-lg; + @apply bg-gray-900; + @apply p-4; + + code { + @apply bg-transparent; + @apply p-0; + } + } +} + +.chatSources { + @apply mb-4; + @apply flex; + @apply flex-wrap; + @apply gap-2; +} + +.chatSource { + @apply inline-block; +} + +.chatSourceLink { + @apply rounded-xl; + @apply bg-neutral-100; + @apply px-4; + @apply py-2; + @apply text-neutral-900; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-neutral-200; + @apply focus:bg-neutral-200; + @apply dark:bg-neutral-950; + @apply dark:text-neutral-200; + @apply hover:dark:bg-neutral-900; + @apply focus:dark:bg-neutral-900; +} + +.chatSourceTitle { + @apply max-w-full; + @apply overflow-hidden; + @apply truncate; + @apply text-ellipsis; + @apply whitespace-nowrap; + @apply text-sm; + @apply font-semibold; +} + +.chatActionsContainer { + @apply mb-4; + @apply flex; + @apply justify-end; +} + +.chatActionsList { + @apply flex; + @apply space-x-2; +} + +.chatAction { + @apply flex; + @apply h-8; + @apply w-8; + @apply items-center; + @apply justify-center; + @apply rounded-full; + @apply bg-white/10; + @apply text-white; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-white/20; + @apply focus:bg-white/20; + + svg { + @apply h-4; + @apply w-4; + } +} + +.chatActionIconSelected { + @apply bg-white/30; +} + +.promptWrapperCustom { + @apply relative; + @apply flex-shrink-0; +} + +.promptFieldCustom { + @apply w-full; + @apply resize-none; + @apply border-0; + @apply bg-transparent; + @apply px-0; + @apply py-0; + @apply text-white; + @apply placeholder:text-neutral-400; + @apply focus:outline-none; +} + +.promptButtonCustom { + @apply absolute; + @apply right-3; + @apply top-1/2; + @apply -translate-y-1/2; + @apply cursor-pointer; + @apply rounded-lg; + @apply bg-green-600; + @apply p-2; + @apply text-white; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-green-500; + @apply disabled:cursor-not-allowed; + @apply disabled:bg-neutral-600; + @apply disabled:text-neutral-400; + + svg { + @apply h-4; + @apply w-4; + } +} + +.slidingPanelFooter { + align-items: center; + color: #a3a3a3; + display: flex; + flex-direction: row; + font-size: 12px; + justify-content: center; + padding-top: 4px; +} + +/* Textarea styles moved to ChatInput component */ + +:global(.hljs) { + @apply !bg-gray-800, + !text-gray-300; +} + +.scrollDownButton { + @apply absolute; + @apply -top-12; + @apply right-4; + @apply flex; + @apply h-8; + @apply w-8; + @apply items-center; + @apply justify-center; + @apply rounded-full; + @apply bg-white/10; + @apply text-white; + @apply transition-colors; + @apply duration-300; + @apply hover:bg-white/20; + @apply focus:bg-white/20; + @apply focus:outline-none; + + svg { + @apply h-4; + @apply w-4; + } +} + +.chatCustomPanel { + background-color: rgb(13 18 28); + border-radius: 0.75rem; + margin-bottom: 1.5rem; + padding: 1rem; + width: auto; +} + +.chatDesktopContainer { + max-width: 52.5rem; + width: 80%; +} + +.chatContentWrapper { + display: flex; +} + +.chatMobileContainer { + display: block; +} + +.chatMobilePadding { + position: relative; +} + +@media (max-width: 768px) { + .slidingPanelInner { + @apply px-4; + } + + .chatUserPrompt > div, + .chatAssistantMessage { + @apply max-w-full; + } +} + +@media (max-width: 600px) { + .chatMobilePadding { + padding-left: 8px !important; + padding-right: 8px !important; + } + + .chatCustomPanel { + overflow: auto; + } + + .chatMobileContainer { + max-width: 100% !important; + padding-left: 0 !important; + padding-right: 0 !important; + width: 100% !important; + } +} diff --git a/apps/site/components/Common/Searchbox/Chat/index.tsx b/apps/site/components/Common/Searchbox/Chat/index.tsx new file mode 100644 index 0000000000000..10349c9090005 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Chat/index.tsx @@ -0,0 +1,163 @@ +'use client'; + +import { ArrowDownIcon, XMarkIcon } from '@heroicons/react/24/solid'; +import type { Interaction } from '@orama/core'; +import { ChatInteractions, SlidingPanel } from '@orama/ui/components'; +import { useChatDispatch } from '@orama/ui/contexts'; +import { useScrollableContainer } from '@orama/ui/hooks/useScrollableContainer'; +import { useTranslations } from 'next-intl'; +import type { FC, PropsWithChildren } from 'react'; +import { useEffect } from 'react'; + +import { ChatInput } from './ChatInput'; +import { ChatMessage } from './ChatMessage'; +import styles from './index.module.css'; + +type SlidingChatPanelProps = PropsWithChildren<{ + open: boolean; + onClose: () => void; + autoTriggerQuery?: string | null; + onAutoTriggerComplete?: () => void; +}>; + +export const SlidingChatPanel: FC = ({ + open, + onClose, + autoTriggerQuery, + onAutoTriggerComplete, +}) => { + const t = useTranslations(); + const { + containerRef, + showGoToBottomButton, + scrollToBottom, + recalculateGoToBottomButton, + } = useScrollableContainer(); + const dispatch = useChatDispatch(); + + useEffect(() => { + if (open && autoTriggerQuery && dispatch) { + const timer = setTimeout(() => { + dispatch({ + type: 'SET_USER_PROMPT', + payload: { + userPrompt: autoTriggerQuery, + }, + }); + + setTimeout(() => { + const submitButton = document.querySelector( + '.orama-custom-button' + ) as HTMLButtonElement; + if (submitButton && !submitButton.disabled) { + submitButton.click(); + } + + onAutoTriggerComplete?.(); + }, 300); + }, 500); + + return () => clearTimeout(timer); + } + }, [open, autoTriggerQuery, onAutoTriggerComplete, dispatch]); + + return ( + <> + + + + + + + + + scrollToBottom({ animated: true })} + className={`${styles.chatMobilePadding} relative h-full items-start overflow-y-auto`} + style={{ maxHeight: '100%', overflowY: 'auto' }} + > + {( + interaction: Interaction, + index?: number, + totalInteractions?: number + ) => ( + + )} + + + + {showGoToBottomButton && ( + scrollToBottom({ animated: true })} + className={styles.scrollDownButton} + aria-label={t('components.search.scrollToBottom')} + > + + + )} + + + + + + > + ); +}; 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..f6954702efbca --- /dev/null +++ b/apps/site/components/Common/Searchbox/DocumentLink/index.module.css @@ -0,0 +1,25 @@ +.documentLink { + @apply rounded-xl, + bg-neutral-100, + px-4, + py-2, + text-neutral-900, + transition-colors, + duration-300, + hover:bg-neutral-200, + focus:bg-neutral-200, + dark:bg-neutral-950, + dark:text-neutral-200, + hover:dark:bg-neutral-900, + focus:dark:bg-neutral-900; +} + +.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..7e1ccd6fa8711 --- /dev/null +++ b/apps/site/components/Common/Searchbox/DocumentLink/index.tsx @@ -0,0 +1,48 @@ +'use client'; + +import Link from 'next/link'; +import { useLocale } from 'next-intl'; +import type { FC } from 'react'; + +import styles from './index.module.css'; + +type DocumentLinkProps = { + document: { + path: string; + siteSection: string; + pageSectionTitle?: string; + }; + 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/Search/index.module.css b/apps/site/components/Common/Searchbox/Search/index.module.css new file mode 100644 index 0000000000000..59ee46fa581a7 --- /dev/null +++ b/apps/site/components/Common/Searchbox/Search/index.module.css @@ -0,0 +1,336 @@ +@reference "../../../../styles/index.css"; + +.searchInputWrapper { + @apply relative; + + svg { + @apply absolute + left-3 + top-1/2 + h-4 + w-4 + -translate-y-1/2 + text-neutral-500 + dark:text-neutral-600; + } +} + +.searchInput { + @apply w-full + border-0 + 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 border-b + border-neutral-200 + p-2 + dark:border-neutral-900; + + svg { + @apply h-4 + w-4; + } +} + +.chatButton { + @apply flex + w-full + cursor-pointer + items-center + gap-2 + rounded-lg + border + border-transparent + bg-transparent + p-3 + text-sm + transition-colors + duration-300 + hover:bg-neutral-300 + dark:hover:bg-neutral-900; +} + +.chatButtonWithSearch { + @apply bg-neutral-300 + dark:bg-neutral-900; +} + +.suggestionsWrapper { + @apply flex + min-h-0 + flex-1 + flex-col + overflow-y-auto + text-neutral-900 + dark:text-neutral-200; +} + +.suggestionsList { + @apply mt-1 + space-y-1; +} + +.suggestionsTitle { + @apply mb-3 + mt-3 + text-xs + font-semibold + uppercase + text-neutral-700 + dark:text-neutral-500; +} + +.suggestionItem { + @apply flex + cursor-pointer + items-center + gap-2 + py-2 + text-sm + text-green-600 + dark:text-green-400; + + svg { + @apply h-5 + w-5; + } +} + +.searchResultsWrapper { + @apply overflow-y-auto + px-5 + pt-3 + text-neutral-900 + dark:text-neutral-200; + + flex: 0 1 auto; + max-height: 40vh; + min-height: 0; + padding-bottom: 0; +} + +.noResultsWrapper { + @apply flex + h-full + items-center + justify-center + py-10 + text-sm + text-neutral-700 + dark:text-neutral-500; +} + +.facetTabItem { + @apply flex + cursor-pointer + items-center + gap-2 + rounded-3xl + border + border-neutral-200 + px-3 + py-1 + text-sm + transition-colors + duration-300 + dark:border-neutral-900; +} + +.facetTabItemSelected { + @apply border-green-600 + dark:border-green-400; +} + +.facetTabsWrapper { + @apply mb-4; +} + +.facetTabsList { + @apply flex + items-center + gap-2; +} + +.facetTabItemCount { + @apply text-neutral-700 + dark:text-neutral-700; +} + +.searchResultsGroup { + @apply mb-6; +} + +.searchResultsGroupTitle { + @apply my-2 + pl-2 + text-sm + font-semibold + text-neutral-600 + dark:text-neutral-400; +} + +.searchResultsItem { + > a { + @apply flex + items-center + gap-4 + rounded-lg + px-2 + py-4 + text-sm + outline-none + transition-colors + duration-300 + hover:bg-neutral-300 + focus:bg-neutral-300 + dark:border-neutral-900 + dark:bg-neutral-950 + dark:hover:bg-neutral-900 + dark:focus:bg-neutral-900; + } + + svg { + @apply h-5 + w-5; + } +} + +.searchResultsItemDescription { + @apply text-sm + text-neutral-600 + dark:text-neutral-700; +} + +.footer { + @apply flex + items-center + justify-between + rounded-b-xl + border-t + border-neutral-200 + bg-neutral-100 + p-4 + dark:border-neutral-900 + dark:bg-neutral-950; +} + +.poweredByLink { + @apply flex + items-center + gap-2 + text-sm + text-neutral-700 + dark:text-neutral-400; +} + +.shortcutWrapper { + @apply flex + items-center + gap-2; +} + +.shortcutItem { + @apply flex + items-center + gap-2 + text-xs + text-neutral-700 + dark:text-neutral-700; +} + +.shortcutKey { + @apply rounded-md + bg-neutral-200 + p-1 + font-mono + text-xs + dark:bg-neutral-900; + + svg { + @apply h-4 + w-4; + } +} + +@media (max-width: 600px) { + .shortcutWrapper { + display: none !important; + } + + .footer { + align-items: center; + flex-direction: column; + justify-content: center; + margin-top: auto; + text-align: center; + width: 100%; + } + + .searchPanelContainer { + background-color: #050505; + display: flex; + flex-direction: column; + height: 94vh; + } + + .poweredByLink { + align-items: center; + display: inline-flex; + margin: 0 auto; + } + + .facetTabsWrapper { + margin-bottom: 0.5rem; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + } + + .facetTabsList { + flex-wrap: nowrap; + gap: 0.25rem; + min-width: max-content; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + } + + .facetTabItem { + border-radius: 1rem; + font-size: 0.85rem; + min-width: unset; + padding: 0.25rem 0.75rem; + white-space: nowrap; + } + + .facetTabsWrapper, + .facetTabsList, + .searchResultsWrapper { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } + + .facetTabsWrapper::-webkit-scrollbar, + .facetTabsList::-webkit-scrollbar, + .searchResultsWrapper::-webkit-scrollbar { + display: none; /* Chrome, Safari, Opera */ + } + + .searchResultsWrapper { + flex: 1 1 auto; + max-height: unset; + min-height: 0; + overflow-y: auto; + } +} 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..9f62219789a0a --- /dev/null +++ b/apps/site/components/Common/Searchbox/Search/index.tsx @@ -0,0 +1,468 @@ +'use client'; + +import { SparklesIcon, DocumentTextIcon } from '@heroicons/react/24/outline'; +import { + MagnifyingGlassIcon, + ArrowTurnDownLeftIcon, + ArrowDownIcon, + ArrowUpIcon, +} from '@heroicons/react/24/solid'; +import type { Hit, SearchParams } from '@orama/core'; +import { + SearchInput, + FacetTabs, + SearchResults, + Suggestions, +} from '@orama/ui/components'; +import { useSearchContext, useSearchDispatch } from '@orama/ui/contexts'; +import classNames from 'classnames'; +import { useTranslations } from 'next-intl'; +import { + useMemo, + useState, + useEffect, + useRef, + useCallback, + type FC, + type PropsWithChildren, +} from 'react'; + +import { + DEFAULT_ORAMA_QUERY_PARAMS, + ORAMA_CLOUD_DATASOURCE_ID, +} from '#site/next.constants.mjs'; + +import { DocumentLink } from '../DocumentLink'; +import styles from './index.module.css'; +import { getFormattedPath } from './utils'; + +type SearchProps = PropsWithChildren<{ + onChatTrigger: () => void; +}>; + +type CloudSearchResponse = { + hits?: Array; + count?: number; + facets?: { siteSection?: { values?: Record } }; + aggregations?: { siteSection?: { values?: Record } }; +}; + +type Group = { name: string; count: number }; + +export const Search: FC = ({ onChatTrigger }) => { + const t = useTranslations(); + const { client, searchTerm, groupsCount, results, selectedFacet } = + useSearchContext(); + const dispatch = useSearchDispatch(); + + const [facetsEverShown, setFacetsEverShown] = useState(false); + + const defaultFacetsRef = useRef>( + DEFAULT_ORAMA_QUERY_PARAMS.facets + ); + + const dataSourcesRef = useRef>([ORAMA_CLOUD_DATASOURCE_ID]); + + const lastIssuedSigRef = useRef(''); + + const baselineGroupsRef = useRef | null>(null); + + const clearAll = useCallback(() => { + lastIssuedSigRef.current = ''; + baselineGroupsRef.current = null; + + dispatch({ type: 'SET_SEARCH_TERM', payload: { searchTerm: '' } }); + dispatch({ type: 'SET_SELECTED_FACET', payload: { selectedFacet: 'All' } }); + dispatch({ type: 'SET_RESULTS', payload: { results: [] } }); + dispatch({ type: 'SET_GROUPS_COUNT', payload: { groupsCount: null } }); + dispatch({ type: 'SET_COUNT', payload: { count: 0 } }); + }, [dispatch]); + + useEffect(() => { + clearAll(); + return () => { + clearAll(); + }; + }, [clearAll]); + + useEffect(() => { + baselineGroupsRef.current = null; + }, [searchTerm]); + + useEffect(() => { + if (!client) return; + + const term = searchTerm ?? ''; + const facet = selectedFacet ?? null; + + if (term.trim() === '') return; + + const sig = `${term}|||${facet ?? ''}`; + if (lastIssuedSigRef.current === sig) return; + lastIssuedSigRef.current = sig; + + const id = window.setTimeout(async () => { + const where: SearchParams['where'] | undefined = + facet && facet !== 'All' ? { siteSection: facet } : undefined; + + const params = { + term: term, + facets: defaultFacetsRef.current, + datasources: dataSourcesRef.current, + ...(where ? { where } : {}), + }; + + const raw = await client.search(params); + const res = raw as unknown as CloudSearchResponse; + + dispatch({ + type: 'SET_RESULTS', + payload: { results: res.hits ?? [] }, + }); + dispatch({ + type: 'SET_COUNT', + payload: { count: res.count ?? 0 }, + }); + + const siteFacetValues: Record | undefined = + res.facets?.siteSection?.values ?? + res.aggregations?.siteSection?.values; + + if (siteFacetValues) { + const entries = Object.entries(siteFacetValues); + const derivedGroups: Array = [ + { name: 'All', count: res.count ?? 0 }, + ...entries + .map(([name, c]) => { + const count = Number(c); + return { name, count }; + }) + .sort((a, b) => a.name.localeCompare(b.name)), + ]; + + if (!facet || facet === 'All') { + baselineGroupsRef.current = derivedGroups; + dispatch({ + type: 'SET_GROUPS_COUNT', + payload: { groupsCount: derivedGroups }, + }); + } else { + const toShow = baselineGroupsRef.current ?? derivedGroups; + dispatch({ + type: 'SET_GROUPS_COUNT', + payload: { groupsCount: toShow }, + }); + } + } else { + if (facet && facet !== 'All' && baselineGroupsRef.current) { + dispatch({ + type: 'SET_GROUPS_COUNT', + payload: { groupsCount: baselineGroupsRef.current }, + }); + } + } + }, 120); + + return () => window.clearTimeout(id); + }, [client, searchTerm, selectedFacet, dispatch]); + + const generatedGroupsCount = useMemo(() => { + if (!results || results.length === 0) { + return groupsCount || []; + } + + const sectionCounts = new Map(); + let totalCount = 0; + + results.forEach(result => { + const siteSection = result.document?.siteSection; + if (siteSection && typeof siteSection === 'string') { + sectionCounts.set( + siteSection, + (sectionCounts.get(siteSection) || 0) + 1 + ); + totalCount += 1; + } + }); + + const groups: Array = [{ name: 'All', count: totalCount }]; + + Array.from(sectionCounts.entries()) + .sort(([a], [b]) => a.localeCompare(b)) + .forEach(([siteSection, count]) => { + groups.push({ name: siteSection, count: count }); + }); + + return groups; + }, [results, groupsCount]); + + const [allKnownFacets, setAllKnownFacets] = useState>(new Set()); + + const displayFacetsList = useMemo(() => { + if (!facetsEverShown) return generatedGroupsCount; + + const currentCounts = new Map(); + let totalCount = 0; + + generatedGroupsCount.forEach((group: { name: string; count: number }) => { + currentCounts.set(group.name, group.count); + if (group.name !== 'All') { + totalCount += group.count; + } else { + totalCount = group.count; + } + }); + + const displayList: Array<{ name: string; count: number }> = [ + { name: 'All', count: totalCount }, + ]; + + Array.from(allKnownFacets) + .filter(facetName => facetName !== 'All') + .sort() + .forEach(facetName => { + displayList.push({ + name: facetName, + count: currentCounts.get(facetName) ?? 0, + }); + }); + + return displayList; + }, [generatedGroupsCount, allKnownFacets, facetsEverShown]); + + useEffect(() => { + if (generatedGroupsCount.length > 1) { + setFacetsEverShown(true); + + const newKnownFacets = new Set(allKnownFacets); + generatedGroupsCount.forEach((group: { name: string }) => { + newKnownFacets.add(group.name); + }); + + if (newKnownFacets.size > allKnownFacets.size) { + setAllKnownFacets(newKnownFacets); + } + } + }, [generatedGroupsCount, allKnownFacets]); + + useEffect(() => { + if (searchTerm) { + setAllKnownFacets(new Set()); + } + }, [searchTerm]); + + return ( + <> + + + + + + + + + + + {searchTerm ? `${searchTerm} - ` : ''} + {t('components.search.chatButtonLabel')} + + + + + + + {facetsEverShown && displayFacetsList.length > 1 && ( + + + + + {(group, isSelected) => ( + + {group.name}({group.count}) + + )} + + + + + )} + + + {term => ( + <> + {term ? ( + + + {t('components.search.noResultsFoundFor')} "{term}" + + + ) : ( + + + {t('components.search.suggestions')} + + + + {t('components.search.suggestionOne')} + + + + {t('components.search.suggestionTwo')} + + + + {t('components.search.suggestionThree')} + + + )} + > + )} + + + + {group => ( + + {/* header without counts */} + + {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 + )} + + )} + + + + )} + + + )} + + + + + + + + + + + + {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/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/index.module.css b/apps/site/components/Common/Searchbox/index.module.css new file mode 100644 index 0000000000000..1afbb11123492 --- /dev/null +++ b/apps/site/components/Common/Searchbox/index.module.css @@ -0,0 +1,185 @@ +@reference "../../../styles/index.css"; + +/* .searchWrapper { + @apply relative + flex + w-full + flex-shrink-0; +} */ + +.searchButton { + @apply flex + grow + cursor-pointer + items-center + justify-between + gap-1 + rounded-xl + border + border-neutral-300 + bg-white + py-1 + pl-2 + pr-1 + text-neutral-900 + transition-colors + duration-300 + hover:bg-neutral-100 + 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 + p-2 + text-sm; + + svg { + @apply h-4 + w-4; + } +} + +.searchButtonShortcut { + @apply hidden + rounded-md + bg-neutral-300 + px-2 + py-1 + text-sm + text-neutral-800 + sm:inline + dark:bg-neutral-900 + dark:text-neutral-400; +} + +.modalWrapper { + @apply fixed + left-0 + top-0 + z-50 + flex + h-full + w-full + bg-white/70 + dark:bg-neutral-950/85; + + align-items: flex-start; + justify-content: center; + padding-top: 5vh; +} + +.mobileOnly { + display: none; +} + +.modalInner { + @apply flex + flex-col + bg-neutral-100 + dark:bg-neutral-950; + + inset: 0; + + /* Mobile styles */ + position: fixed; + + /* Desktop styles */ + @media (min-width: 640px) { + border: 1px solid rgb(229 229 229); + border-radius: 12px; + height: auto; + max-height: none; + max-width: 720px; + min-height: auto; + padding: 0; + position: static; + width: 80%; + } + + @media (min-width: 640px) and (prefers-color-scheme: dark) { + border-color: rgb(38 38 38); + } +} + +.modalWrapper.modalWrapperWithResults .modalInner { + display: flex; + flex-direction: column; + max-height: 70vh; +} + +.modalContent { + @apply flex + flex-col; + + /* Mobile full height */ + height: 100%; + min-height: 0; + overflow: hidden; + + /* Desktop auto height - fit content exactly */ + @media (min-width: 640px) { + flex-shrink: 0; + height: fit-content; + min-height: 0; + } +} + +.active { + @apply block; +} + +@media (max-width: 600px) { + .mobileOnly { + @apply block; + } + + .mobileTopBar { + align-items: center; + background: #181c23; + border-bottom: 1px solid #222; + display: flex; + padding: 0.5rem 1rem; + } + + .mobileTopBarArrow { + align-items: center; + background: none; + border: none; + color: #fff; + display: flex; + font-size: 1.5rem; + margin-right: 1rem; + } + + .mobileTopBarTabs { + display: flex; + flex: 1; + justify-content: center; + } + + .mobileTopBarTab { + background: none; + border: none; + border-radius: 999px; + color: #aaa; + font-size: 1rem; + font-weight: 500; + padding: 0.5rem 1rem; + transition: + background 0.2s, + color 0.2s; + } + + .mobileTopBarTab.active, + .mobileTopBarTab:focus { + background: #23272f; + color: #fff; + } +} diff --git a/apps/site/components/Common/Searchbox/index.tsx b/apps/site/components/Common/Searchbox/index.tsx new file mode 100644 index 0000000000000..c2449964ad942 --- /dev/null +++ b/apps/site/components/Common/Searchbox/index.tsx @@ -0,0 +1,174 @@ +'use client'; + +import { MagnifyingGlassIcon, ArrowLeftIcon } 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 { useState, type FC, type PropsWithChildren } from 'react'; +import '@orama/ui/styles.css'; + +import { + ORAMA_CLOUD_PROJECT_ID, + ORAMA_CLOUD_API_KEY, +} from '#site/next.constants.mjs'; + +import { SlidingChatPanel } from './Chat'; +import styles from './index.module.css'; +import { Search } from './Search'; + +const orama = new OramaCloud({ + projectId: ORAMA_CLOUD_PROJECT_ID, + apiKey: ORAMA_CLOUD_API_KEY, +}); + +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 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); + }; + + const MobileTopBar: FC<{ + isChatOpen: boolean; + onClose: () => void; + onSelect: (mode: 'search' | 'chat') => void; + }> = ({ isChatOpen, onClose, onSelect }) => ( + + + + + + onSelect('search')} + > + Search + + onSelect('chat')} + > + Ask AI + + + + ); + + return ( + <> + {/* Only show on mobile */} + + + + {mode === 'search' && ( + { + setAutoTriggerValue(searchTerm ?? null); + handleSelectMode('chat'); + }} + /> + )} + {mode === 'chat' && ( + <> + { + setIsChatOpen(false); + setMode('search'); + 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 { searchTerm } = useSearchContext(); + + const toggleSearchBox = (): void => { + setOpen(!open); + }; + + return ( + <> + + + + {t('components.search.searchPlaceholder')} + + ⌘ K + + + setOpen(false)} + closeOnOutsideClick={true} + closeOnEscape={true} + className={classNames(styles.modalWrapper, { + [styles.modalWrapperWithResults]: searchTerm, + })} + > + + + setOpen(false)} /> + + + + > + ); +}; + +const OramaSearch: FC = () => ( + + + + + +); + +export default OramaSearch; diff --git a/apps/site/components/withNavBar.tsx b/apps/site/components/withNavBar.tsx index 2ac1f16a3e130..6c151bf697340 100644 --- a/apps/site/components/withNavBar.tsx +++ b/apps/site/components/withNavBar.tsx @@ -19,12 +19,15 @@ 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 SearchButton = dynamic( + () => import('#site/components/Common/Searchbox'), + { + 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..8d23f0ab205db 100644 --- a/apps/site/next.constants.mjs +++ b/apps/site/next.constants.mjs @@ -161,6 +161,26 @@ export const ORAMA_CLOUD_ENDPOINT = export const ORAMA_CLOUD_API_KEY = process.env.NEXT_PUBLIC_ORAMA_API_KEY || 'qopIuAERiWP2EZOpDjvczjws7WV40yrj'; +/** + * The default Orama Cloud Datasource ID to use when searching with Orama Cloud. + */ +export const ORAMA_CLOUD_DATASOURCE_ID = + process.env.NEXT_PUBLIC_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_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 1c33850e433c4..c15f9faff8249 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": "^0.0.17", "@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.12", diff --git a/apps/site/scripts/orama-search/sync-orama-cloud.mjs b/apps/site/scripts/orama-search/sync-orama-cloud.mjs index fe8b53b1117e9..b2e6c8c97aed9 100644 --- a/apps/site/scripts/orama-search/sync-orama-cloud.mjs +++ b/apps/site/scripts/orama-search/sync-orama-cloud.mjs @@ -1,54 +1,41 @@ -import { CloudManager } from '@oramacloud/client'; +import { OramaCloud } from '@orama/core'; -import { getDocuments } from './get-documents.mjs'; +import { siteContent } 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 || ''); -// Helper to batch documents -const batchDocuments = (documents, batchSize) => { - const batches = []; - for (let i = 0; i < documents.length; i += batchSize) { - batches.push(documents.slice(i, i + batchSize)); - } - return batches; -}; +console.log(`Syncing ${siteContent.length} documents to Orama Cloud index`); -// Orama allows to send several documents at once, so we batch them in groups of ORAMA_SYNC_BATCH_SIZE. +// 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 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); +const runUpdate = async () => { + const batchSize = ORAMA_SYNC_BATCH_SIZE; + const batches = []; + + for (let i = 0; i < siteContent.length; i += batchSize) { + batches.push(siteContent.slice(i, i + batchSize)); } -}; -// 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(); + console.log(`Sending ${batches.length} batches of ${batchSize} documents`); -await runUpdate(await getDocuments()); + for (const batch of batches) { + await datasource.insertDocuments(batch); + } +}; -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/packages/i18n/src/locales/en.json b/packages/i18n/src/locales/en.json index 18faf3a92c9af..686de89625da6 100644 --- a/packages/i18n/src/locales/en.json +++ b/packages/i18n/src/locales/en.json @@ -299,7 +299,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/pnpm-lock.yaml b/pnpm-lock.yaml index c17f79f6944d3..f2369e8e5eab0 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: ^0.0.17 + version: 0.0.17(@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) @@ -1810,17 +1810,6 @@ packages: '@keyv/serialize@1.1.0': resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==} - '@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==} @@ -2038,44 +2027,20 @@ 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@0.0.17': + resolution: {integrity: sha512-8CtDRFjyR/hVT7yNga37ApP1u2t1vT0rLarbgqBzA+qwbp1CqpVL1zPq97UjGnBZn4vjBK55JUPaMS57J3krbg==} 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.0 + react: ^19.0.0 '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2506,46 +2471,6 @@ packages: '@reporters/github@1.10.0': resolution: {integrity: sha512-tchP8NR7poV/0H9s8lOqvIcJfjM2AWvq4pMU+WI9HEQR46wkdkNWmx9YGBAUn9kA1WeKDlun0MC7/f+cNtt+4Q==} - '@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==} @@ -2555,39 +2480,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.12.0': resolution: {integrity: sha512-rPfCBd6gHIKBPpf2hKKWn2ISPSrmRKAFi+bYDjvZHpzs3zlksWvEwaF3Z4jnvW+xHxSRef7qDooIJkY0RpA9EA==} - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - '@shikijs/engine-javascript@3.12.0': resolution: {integrity: sha512-Ni3nm4lnKxyKaDoXQQJYEayX052BL7D0ikU5laHp+ynxPpIF1WIwyhzrMU6WDN7AoAfggVR4Xqx3WN+JTS+BvA==} - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@3.12.0': resolution: {integrity: sha512-IfDl3oXPbJ/Jr2K8mLeQVpnF+FxjAc7ZPDkgr38uEw/Bg3u638neSrpwqOTnTHXt1aU0Fk1/J+/RBdst1kVqLg==} - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - '@shikijs/langs@3.12.0': resolution: {integrity: sha512-HIca0daEySJ8zuy9bdrtcBPhcYBo8wR1dyHk1vKrOuwDsITtZuQeGhEkcEfWc6IDyTcom7LRFCH6P7ljGSCEiQ==} - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - '@shikijs/themes@3.12.0': resolution: {integrity: sha512-/lxvQxSI5s4qZLV/AuFaA4Wt61t/0Oka/P9Lmpr1UV+HydNCczO3DMHOC/CsXCCpbv4Zq8sMD0cDa7mvaVoj0Q==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@3.12.0': resolution: {integrity: sha512-jsFzm8hCeTINC3OCmTZdhR9DOl/foJWplH2Px0bTi4m8z59fnsueLsweX82oGcjRQ7mfQAluQYKGoH2VzsWY4A==} @@ -2953,24 +2860,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: @@ -3247,9 +3136,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==} @@ -3349,9 +3235,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==} @@ -4118,9 +4001,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==} @@ -4336,14 +4216,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: @@ -4432,9 +4304,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==} @@ -4442,19 +4311,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==} @@ -4482,9 +4341,6 @@ packages: electron-to-chromium@1.5.211: resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -4515,18 +4371,10 @@ 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.0: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5218,10 +5066,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.0: resolution: {integrity: sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==} @@ -5229,9 +5073,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'} @@ -5244,19 +5085,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==} @@ -5272,9 +5107,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==} @@ -5750,9 +5582,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.1.6: resolution: {integrity: sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==} engines: {node: '>=20.17'} @@ -5762,15 +5591,6 @@ packages: resolution: {integrity: sha512-0aeh5HHHgmq1KRdMMDHfhMWQmIT/m7nRDTlxlFqni2Sp0had9baqsjJRvDGdlvgd6NmPE0nPloOipiQJGFtTHQ==} 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==} @@ -5845,23 +5665,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'} @@ -5935,9 +5741,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'} @@ -6361,9 +6164,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==} @@ -6441,9 +6241,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'} @@ -6720,6 +6517,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} @@ -6750,10 +6552,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'} @@ -6803,8 +6601,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==} @@ -6884,18 +6685,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==} @@ -7226,9 +7021,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.12.0: resolution: {integrity: sha512-E+ke51tciraTHpaXYXfqnPZFSViKHhSQ3fiugThlfs/om/EonlQ0hSldcqgzOWWqX6PcjkKKzFgrjIaiPAXoaA==} @@ -7311,9 +7103,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'} @@ -7448,18 +7237,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==} @@ -7652,9 +7432,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==} @@ -7757,9 +7534,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==} @@ -9940,16 +9714,6 @@ snapshots: '@keyv/serialize@1.1.0': {} - '@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 @@ -10231,71 +9995,29 @@ 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@0.0.17(@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) + '@orama/core': 1.2.8 + prism-react-renderer: 1.3.5(react@19.1.1) react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react-markdown: 10.1.0(@types/react@19.1.12)(react@19.1.1) + remark-gfm: 4.0.1 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 + - supports-color '@pkgjs/parseargs@0.11.0': optional: true @@ -10705,45 +10427,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.12.0': dependencies: '@shikijs/types': 3.12.0 @@ -10751,49 +10440,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.12.0': dependencies: '@shikijs/types': 3.12.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.12.0': dependencies: '@shikijs/types': 3.12.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/langs@3.12.0': dependencies: '@shikijs/types': 3.12.0 - '@shikijs/themes@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/themes@3.12.0': dependencies: '@shikijs/types': 3.12.0 - '@shikijs/types@1.29.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/types@3.12.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -11368,33 +11033,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.3(@testing-library/dom@10.4.0)(prettier@3.6.2))(webpack@5.101.3(@swc/core@1.11.24)(esbuild@0.25.9))': dependencies: storybook: 9.1.3(@testing-library/dom@10.4.0)(prettier@3.6.2) @@ -11680,13 +11318,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': @@ -11798,8 +11429,6 @@ snapshots: '@types/supports-color@8.1.3': {} - '@types/trusted-types@2.0.7': {} - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -12611,8 +12240,6 @@ snapshots: transitivePeerDependencies: - encoding - code-block-writer@13.0.3: {} - collapse-white-space@2.1.0: {} color-convert@2.0.1: @@ -12805,8 +12432,6 @@ snapshots: dedent@0.7.0: {} - dedent@1.5.3: {} - dedent@1.6.0: {} deep-eql@5.0.2: {} @@ -12875,38 +12500,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 @@ -12935,8 +12540,6 @@ snapshots: electron-to-chromium@1.5.211: {} - emoji-regex-xs@1.0.0: {} - emoji-regex@10.4.0: {} emoji-regex@10.5.0: {} @@ -12965,12 +12568,8 @@ snapshots: entities@2.2.0: {} - entities@4.5.0: {} - entities@6.0.0: {} - entities@6.0.1: {} - env-paths@2.2.1: {} environment@1.1.0: {} @@ -13183,7 +12782,7 @@ snapshots: eslint: 9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.34.0(jiti@2.5.1)) @@ -13220,7 +12819,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color @@ -13236,7 +12835,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.34.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color @@ -13263,7 +12862,7 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: @@ -13273,17 +12872,18 @@ snapshots: eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color + optional: true - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.42.0(eslint@9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3) eslint: 9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - optional: true eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)): dependencies: @@ -13314,7 +12914,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.34.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13331,8 +12931,9 @@ snapshots: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + optional: true - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.34.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13343,7 +12944,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.34.0(jiti@2.5.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.34.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.42.0(eslint@9.34.0(jiti@2.5.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.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13354,11 +12955,12 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.42.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - optional: true eslint-plugin-jsx-a11y@6.10.2(eslint@9.34.0(jiti@2.5.1)): dependencies: @@ -14055,19 +13657,12 @@ snapshots: he@1.2.0: {} - highlight.js@11.11.1: {} - hookified@1.12.0: {} 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 @@ -14084,18 +13679,10 @@ snapshots: relateurl: 0.2.7 terser: 5.43.1 - 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.101.3(@swc/core@1.11.24)(esbuild@0.25.9)): @@ -14108,13 +13695,6 @@ snapshots: optionalDependencies: webpack: 5.101.3(@swc/core@1.11.24)(esbuild@0.25.9) - 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 @@ -14568,10 +14148,6 @@ snapshots: lines-and-columns@2.0.4: {} - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - lint-staged@16.1.6: dependencies: chalk: 5.6.0 @@ -14596,22 +14172,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - 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 @@ -14681,23 +14241,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: {} @@ -14907,8 +14452,6 @@ snapshots: mdn-data@2.12.2: {} - mdurl@2.0.0: {} - media-typer@1.1.0: {} memfs@3.5.3: @@ -15464,12 +15007,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 @@ -15572,8 +15109,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: {} @@ -15784,6 +15319,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: {} @@ -15808,8 +15347,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - punycode.js@2.3.1: {} - punycode@2.3.1: {} qs@6.13.0: @@ -15865,7 +15402,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: @@ -15970,21 +15523,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 @@ -16710,17 +16254,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.12.0: dependencies: '@shikijs/core': 3.12.0 @@ -16817,8 +16350,6 @@ snapshots: sprintf-js@1.0.3: {} - sse.js@2.6.0: {} - stable-hash-x@0.2.0: {} stable-hash@0.0.5: {} @@ -16983,20 +16514,10 @@ snapshots: dependencies: webpack: 5.101.3(@swc/core@1.11.24)(esbuild@0.25.9) - 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 @@ -17203,11 +16724,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: @@ -17323,8 +16839,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 + )} +