From 455c5a11d0e66ec7c2d6b29f89bea2dcb1ed4093 Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Sun, 15 Feb 2026 13:31:00 +0300 Subject: [PATCH 1/8] refactor(104): add fumadocs, rewrite mdx and xi.support structure, rename images --- apps/xi.support/.gitignore | 3 + apps/xi.support/app/[[...slug]]/layout.tsx | 11 + apps/xi.support/app/[[...slug]]/page.tsx | 51 + apps/xi.support/app/[section]/[mdx]/page.tsx | 103 -- apps/xi.support/app/[section]/page.tsx | 31 - apps/xi.support/app/api/search/route.ts | 6 + apps/xi.support/app/layout.tsx | 9 +- apps/xi.support/app/not-found.tsx | 10 +- apps/xi.support/app/page.tsx | 15 - apps/xi.support/components/CallToAction.tsx | 20 + .../components/Common/HeaderDoc.tsx | 33 - .../components/Common/HeaderMain.tsx | 35 - apps/xi.support/components/Common/index.ts | 5 - .../components/DocsHomeSections.tsx | 26 + .../{Common/Layout.tsx => Footer.tsx} | 20 +- .../components/HomePage/CallToAction.tsx | 24 - apps/xi.support/components/HomePage/Hero.tsx | 26 - apps/xi.support/components/HomePage/Parts.tsx | 59 - apps/xi.support/components/HomePage/index.ts | 5 - .../components/MdxPage/Breadcrumbs.tsx | 36 - .../xi.support/components/MdxPage/MdxPage.tsx | 12 - apps/xi.support/components/MdxPage/index.ts | 3 - apps/xi.support/components/SectionList.tsx | 57 + .../components/SectionPage/Sections.tsx | 62 - .../components/SectionPage/Title.tsx | 15 - .../components/SectionPage/index.ts | 0 apps/xi.support/config/pagesConfig.ts | 106 -- apps/xi.support/config/sectionsConfig.ts | 127 +- .../docs/conduct-lesson.mdx} | 22 +- .../docs/control-payments.mdx} | 30 +- apps/xi.support/content/docs/index.mdx | 11 + .../content/docs/prepare-for-lesson.mdx | 40 + .../content/docs/work-beginning.mdx | 113 ++ .../{ => content}/mdxComponents/Image.tsx | 2 +- .../{ => content}/mdxComponents/Link.tsx | 0 apps/xi.support/eslint.config.mjs | 7 +- apps/xi.support/index.css | 49 + apps/xi.support/lib/cn.ts | 1 + apps/xi.support/lib/i18n.ts | 31 + apps/xi.support/lib/layout.shared.tsx | 28 + apps/xi.support/lib/source.ts | 27 + .../prepare-for-lesson/create-lesson.mdx | 11 - .../markdown/prepare-for-lesson/materials.mdx | 19 - .../prepare-for-lesson/set-reminders.mdx | 18 - .../work-beginning/invite-students.mdx | 61 - .../markdown/work-beginning/signup.mdx | 24 - .../markdown/work-beginning/welcome.mdx | 33 - apps/xi.support/mdx-components.tsx | 42 +- .../mdxComponents/AnchorHeading.tsx | 17 - .../{next.config.js => next.config.mjs} | 21 +- apps/xi.support/package.json | 19 +- .../{14videocall.png => begin_videocall.png} | Bin .../{15board.png => online_board.png} | Bin .../{13diagrams.png => analytics.png} | Bin ...1create_invoice.png => create_invoice.png} | Bin .../{12analytics.png => payment_journal.png} | Bin .../{10reminders.png => set_reminders.png} | Bin .../{8invitestudents.png => create_group.png} | Bin .../{9invitestudents.png => invite_group.png} | Bin ...vitestudents.png => invite_individual.png} | Bin ...nvite_students.png => invite_students.png} | Bin .../{5welcome.png => setup_notifications.png} | Bin .../{3welcome.png => setup_profile.png} | Bin .../{1signup.png => signup.png} | Bin apps/xi.support/source.config.ts | 29 + apps/xi.support/tsconfig.json | 7 +- package-lock.json | 1580 +++++++++++++++-- 67 files changed, 2105 insertions(+), 1047 deletions(-) create mode 100644 apps/xi.support/app/[[...slug]]/layout.tsx create mode 100644 apps/xi.support/app/[[...slug]]/page.tsx delete mode 100644 apps/xi.support/app/[section]/[mdx]/page.tsx delete mode 100644 apps/xi.support/app/[section]/page.tsx create mode 100644 apps/xi.support/app/api/search/route.ts delete mode 100644 apps/xi.support/app/page.tsx create mode 100644 apps/xi.support/components/CallToAction.tsx delete mode 100644 apps/xi.support/components/Common/HeaderDoc.tsx delete mode 100644 apps/xi.support/components/Common/HeaderMain.tsx delete mode 100644 apps/xi.support/components/Common/index.ts create mode 100644 apps/xi.support/components/DocsHomeSections.tsx rename apps/xi.support/components/{Common/Layout.tsx => Footer.tsx} (77%) delete mode 100644 apps/xi.support/components/HomePage/CallToAction.tsx delete mode 100644 apps/xi.support/components/HomePage/Hero.tsx delete mode 100644 apps/xi.support/components/HomePage/Parts.tsx delete mode 100644 apps/xi.support/components/HomePage/index.ts delete mode 100644 apps/xi.support/components/MdxPage/Breadcrumbs.tsx delete mode 100644 apps/xi.support/components/MdxPage/MdxPage.tsx delete mode 100644 apps/xi.support/components/MdxPage/index.ts create mode 100644 apps/xi.support/components/SectionList.tsx delete mode 100644 apps/xi.support/components/SectionPage/Sections.tsx delete mode 100644 apps/xi.support/components/SectionPage/Title.tsx delete mode 100644 apps/xi.support/components/SectionPage/index.ts delete mode 100644 apps/xi.support/config/pagesConfig.ts rename apps/xi.support/{markdown/conduct-lesson/videocall.mdx => content/docs/conduct-lesson.mdx} (76%) rename apps/xi.support/{markdown/control-payments/analytics.mdx => content/docs/control-payments.mdx} (72%) create mode 100644 apps/xi.support/content/docs/index.mdx create mode 100644 apps/xi.support/content/docs/prepare-for-lesson.mdx create mode 100644 apps/xi.support/content/docs/work-beginning.mdx rename apps/xi.support/{ => content}/mdxComponents/Image.tsx (80%) rename apps/xi.support/{ => content}/mdxComponents/Link.tsx (100%) create mode 100644 apps/xi.support/lib/cn.ts create mode 100644 apps/xi.support/lib/i18n.ts create mode 100644 apps/xi.support/lib/layout.shared.tsx create mode 100644 apps/xi.support/lib/source.ts delete mode 100644 apps/xi.support/markdown/prepare-for-lesson/create-lesson.mdx delete mode 100644 apps/xi.support/markdown/prepare-for-lesson/materials.mdx delete mode 100644 apps/xi.support/markdown/prepare-for-lesson/set-reminders.mdx delete mode 100644 apps/xi.support/markdown/work-beginning/invite-students.mdx delete mode 100644 apps/xi.support/markdown/work-beginning/signup.mdx delete mode 100644 apps/xi.support/markdown/work-beginning/welcome.mdx delete mode 100644 apps/xi.support/mdxComponents/AnchorHeading.tsx rename apps/xi.support/{next.config.js => next.config.mjs} (75%) rename apps/xi.support/public/assets/markdown/conduct-lesson/{14videocall.png => begin_videocall.png} (100%) rename apps/xi.support/public/assets/markdown/conduct-lesson/{15board.png => online_board.png} (100%) rename apps/xi.support/public/assets/markdown/control-payments/{13diagrams.png => analytics.png} (100%) rename apps/xi.support/public/assets/markdown/control-payments/{11create_invoice.png => create_invoice.png} (100%) rename apps/xi.support/public/assets/markdown/control-payments/{12analytics.png => payment_journal.png} (100%) rename apps/xi.support/public/assets/markdown/prepare-for-lesson/{10reminders.png => set_reminders.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{8invitestudents.png => create_group.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{9invitestudents.png => invite_group.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{7invitestudents.png => invite_individual.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{6invite_students.png => invite_students.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{5welcome.png => setup_notifications.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{3welcome.png => setup_profile.png} (100%) rename apps/xi.support/public/assets/markdown/work-beginning/{1signup.png => signup.png} (100%) create mode 100644 apps/xi.support/source.config.ts diff --git a/apps/xi.support/.gitignore b/apps/xi.support/.gitignore index 8f322f0d..48d93681 100644 --- a/apps/xi.support/.gitignore +++ b/apps/xi.support/.gitignore @@ -33,3 +33,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# generated content +.source \ No newline at end of file diff --git a/apps/xi.support/app/[[...slug]]/layout.tsx b/apps/xi.support/app/[[...slug]]/layout.tsx new file mode 100644 index 00000000..0f9695d0 --- /dev/null +++ b/apps/xi.support/app/[[...slug]]/layout.tsx @@ -0,0 +1,11 @@ +import { source } from '@/lib/source'; +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { baseOptions } from '@/lib/layout.shared'; + +export default function Layout({ children }: LayoutProps<'/[[...slug]]'>) { + return ( + + {children} + + ); +} diff --git a/apps/xi.support/app/[[...slug]]/page.tsx b/apps/xi.support/app/[[...slug]]/page.tsx new file mode 100644 index 00000000..2c0ea0fa --- /dev/null +++ b/apps/xi.support/app/[[...slug]]/page.tsx @@ -0,0 +1,51 @@ +import { getPageImage, source } from '@/lib/source'; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/layouts/docs/page'; +import { notFound } from 'next/navigation'; +import { getMDXComponents } from '@/mdx-components'; +import { createRelativeLink } from 'fumadocs-ui/mdx'; +import type { Metadata } from 'next'; + +export default async function Page(props: PageProps<'/[[...slug]]'>) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const { body, description, updateDate, title, toc } = page.data; + + const MDX = body; + + return ( + +

Обновлено {updateDate}

+ + {title} + {description} + + + + +
+ ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: PageProps<'/[[...slug]]'>): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImage(page).url, + }, + }; +} diff --git a/apps/xi.support/app/[section]/[mdx]/page.tsx b/apps/xi.support/app/[section]/[mdx]/page.tsx deleted file mode 100644 index b0ea9867..00000000 --- a/apps/xi.support/app/[section]/[mdx]/page.tsx +++ /dev/null @@ -1,103 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import React from 'react'; -import { sectionsConfig } from 'config/sectionsConfig'; -import { MdxPage } from 'components/MdxPage'; -import { Layout, HeaderDoc } from 'components/Common'; -import { Link } from '@xipkg/link'; -import { CallToAction } from 'components/HomePage'; -import { pagesConfig } from 'config/pagesConfig'; -import { Breadcrumbs } from 'components/MdxPage/Breadcrumbs'; - -export const dynamicParams = false; // true | false, - -type MdXPageT = { - params: Promise<{ - section: string; - mdx: string; - }>; -}; - -export async function generateStaticParams() { - const itemsArray: { sectionId: string; mdxId: string }[] = []; - sectionsConfig.forEach((item) => { - item.links.forEach((link) => - itemsArray.push({ sectionId: item.sectionName, mdxId: link.pageUrl }), - ); - }); - - return itemsArray.map((item) => ({ - section: item.sectionId, - mdx: item.mdxId, - })); -} - -export default async function Page({ params }: MdXPageT) { - const { mdx, section } = await params; - - const pageData = pagesConfig.find((item) => item.page === mdx && item.section === section); - - const sectionData = sectionsConfig.find((item) => item.sectionName === pageData?.section); - - const pageFromSection = - sectionData && pageData && sectionData.links.find((item) => item.pageUrl === pageData.page); - - if (!pageData || !sectionData || !pageFromSection) return 404; - - return ( - - -
-
-
- Категории -
- {pageData.anchors.map((item, index) => ( - // @ts-expect-error - - {item.title} - - ))} -
-
-
- - - - {`Обновлено ${pageData.updateDate}`} - - {pageData.relatedLinks.length !== 0 && ( -
- Все статьи по теме -
- {!!pageData.relatedLinks.length && - pageData.relatedLinks.map((item, index) => ( - // @ts-expect-error - - {item.title} - - ))} -
-
- )} - -
-
-
-
- ); -} diff --git a/apps/xi.support/app/[section]/page.tsx b/apps/xi.support/app/[section]/page.tsx deleted file mode 100644 index 7f3c7fcf..00000000 --- a/apps/xi.support/app/[section]/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import { HeaderDoc, Layout } from 'components/Common'; -import Sections from 'components/SectionPage/Sections'; -import Title from 'components/SectionPage/Title'; -import { sectionsConfig } from 'config/sectionsConfig'; - -export const dynamicParams = false; // true | false, - -export async function generateStaticParams() { - return sectionsConfig.map((item) => ({ - section: item.sectionName, - })); -} - -const SectionPage = async ({ params }: any) => { - const { section } = await params; - const sectionItem = sectionsConfig.find((item) => item.sectionName === section); - - if (!sectionItem) return; - - return ( - - - - <Sections sections={sectionItem.links} sectionName={sectionItem.sectionName} /> - </Layout> - ); -}; - -export default SectionPage; diff --git a/apps/xi.support/app/api/search/route.ts b/apps/xi.support/app/api/search/route.ts new file mode 100644 index 00000000..01c84aa5 --- /dev/null +++ b/apps/xi.support/app/api/search/route.ts @@ -0,0 +1,6 @@ +import { source } from '@/lib/source'; +import { createFromSource } from 'fumadocs-core/search/server'; + +export const { GET } = createFromSource(source, { + language: 'russian', +}); diff --git a/apps/xi.support/app/layout.tsx b/apps/xi.support/app/layout.tsx index e5c59b71..928e2793 100644 --- a/apps/xi.support/app/layout.tsx +++ b/apps/xi.support/app/layout.tsx @@ -1,8 +1,9 @@ import { ReactNode } from 'react'; - +import { RootProvider } from 'fumadocs-ui/provider/next'; import '../index.css'; import { Inter } from 'next/font/google'; import { Metadata } from 'next'; +import { i18nUIProvider } from '@/lib/i18n'; export const metadata: Metadata = { title: 'База знаний sovlium - документация и поддержка', @@ -95,8 +96,10 @@ const inter = Inter({ export default function RootLayout({ children }: { children: ReactNode }) { return ( - <html lang="ru" className={inter.variable}> - <body className="overflow-x-hidden">{children}</body> + <html lang="ru" className={inter.variable} suppressHydrationWarning> + <body className="flex flex-col min-h-screen"> + <RootProvider i18n={i18nUIProvider('ru')}>{children}</RootProvider> + </body> </html> ); } diff --git a/apps/xi.support/app/not-found.tsx b/apps/xi.support/app/not-found.tsx index 1c133374..0e681358 100644 --- a/apps/xi.support/app/not-found.tsx +++ b/apps/xi.support/app/not-found.tsx @@ -1,7 +1,6 @@ /* eslint-disable no-irregular-whitespace */ 'use client'; -import Header from 'components/Common/HeaderMain'; import Link from 'next/link'; import { Mail } from '@xipkg/icons'; import { useRouter } from 'next/navigation'; @@ -11,9 +10,8 @@ export default function NotFound() { return ( <div className="h-screen overflow-auto bg-[url('/not-found/background.png')] bg-no-repeat bg-auto xl:bg-cover"> - <Header /> <main className="w-screen container max-w-[1920px] mx-auto px-8 sm:px-16 2xl:px-[160px] py-32 flex flex-col items-start justify-center"> - <h1 className="flex flex-col-reverse gap-x-1 sm:inline-block text-[40px] leading-[48px] sm:text-[48px] sm:leading-[62px] lg:text-[64px] font-medium text-gray-100 mb-4"> + <h1 className="flex flex-col-reverse gap-x-1 sm:inline-block text-[40px] leading-[48px] sm:text-[48px] sm:leading-[62px] lg:text-h1-line-height font-medium text-gray-100 mb-4"> Страница затерялась в облаках{' '} <span className="inline-block text-l leading-[100%] align-super lg:text-h5 font-bold text-gray-30"> 404 @@ -27,7 +25,7 @@ export default function NotFound() { Если ошибка повторяется — напишите нам об этом{' '} <a className="text-brand-80" href="mailto:support@sovlium.ru"> <Mail className="inline-block fill-brand-80" /> - <span className='inline-block relative ml-1 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-[1px] after:bg-brand-20'> + <span className='inline-block relative ml-1 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-px after:bg-brand-20'> на электронную почту </span> </a> @@ -37,14 +35,14 @@ export default function NotFound() { Вернитесь{' '} <button type="button" - className='inline-block border-none outline-none bg-transparent relative text-brand-80 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-[1px] after:bg-brand-20' + className='inline-block border-none outline-none bg-transparent relative text-brand-80 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-px after:bg-brand-20' onClick={router.back} > назад </button>{' '} или{' '} <Link - className='inline-block relative text-brand-80 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-[1px] after:bg-brand-20' + className='inline-block relative text-brand-80 after:block after:content-[""] after:left-0 after:bottom-0 after:w-full after:h-px after:bg-brand-20' href="/" > на главную diff --git a/apps/xi.support/app/page.tsx b/apps/xi.support/app/page.tsx deleted file mode 100644 index d702b773..00000000 --- a/apps/xi.support/app/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client'; - -import { CallToAction, Hero, Parts } from 'components/HomePage'; -import { Layout, HeaderMain } from 'components/Common'; - -const Page = () => ( - <Layout> - <HeaderMain /> - <Hero /> - <Parts /> - <CallToAction /> - </Layout> -); - -export default Page; diff --git a/apps/xi.support/components/CallToAction.tsx b/apps/xi.support/components/CallToAction.tsx new file mode 100644 index 00000000..599407f9 --- /dev/null +++ b/apps/xi.support/components/CallToAction.tsx @@ -0,0 +1,20 @@ +import { Button } from '@xipkg/button'; +import { TelegramFilled } from '@xipkg/icons'; +import NextLink from 'next/link'; + +export const CallToAction = () => ( + <section className="flex flex-col justify-center items-center py-16 px-8 sm:py-8 max-w-[1920px] gap-8"> + <h3 className="font-medium text-2xl sm:text-h3 xl:text-h2 leading-[31.2px] sm:leading-[52px] xl:leading-[83.2px] text-gray-100 dark:text-gray-0 mt-0 mb-0"> + Не нашлось ответа? + </h3> + <Button + className="h-8 sm:h-14 xl:h-[84px] font-medium text-sm sm:text-xl xl:text-[30px] xl:leading-[42px] rounded-md sm:rounded-xl xl:rounded-[18px] pl-3 sm:pl-6 xl:pl-9 pr-2 sm:pr-3 xl:pr-[18px]" + asChild + > + <NextLink href="https://t.me/sovlium_support_bot" target="_blank" rel="noopener noreferrer"> + Написать в телеграм + <TelegramFilled className="fill-gray-0 size-4! sm:size-8! xl:size-12! ml-1.5 sm:ml-4 xl:ml-6!" /> + </NextLink> + </Button> + </section> +); diff --git a/apps/xi.support/components/Common/HeaderDoc.tsx b/apps/xi.support/components/Common/HeaderDoc.tsx deleted file mode 100644 index dce0e2b1..00000000 --- a/apps/xi.support/components/Common/HeaderDoc.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -import Image from 'next/image'; -import Link from 'next/link'; -import { Button } from '@xipkg/button'; - -export const HeaderDoc = () => ( - <div className="w-full h-[72px] md:h-[112px] 2xl:h-[176px] p-4 md:p-8 2xl:py-16 2xl:px-40 flex justify-center items-center flex-row z-10"> - <div className="w-full max-w-[1920px] flex flex-row justify-between items-center gap-4"> - <Link href="/"> - <Image - src="/logoforwhite.svg" - alt="Sovlium Support logo" - width={216} - height={64} - className="h-[24px] w-auto sm:h-[40px]" - /> - </Link> - <div className="hidden md:flex items-center gap-1.5 lg:gap-2.5 xl:gap-4 ml-auto"> - <Button - asChild - variant="secondary" - className="text-sm lg:text-m-base md:px-3 lg:px-auto xl:w-53.5 bg-brand-0 bg-brand-0 dark:text-brand-80 hover:bg-brand-80 hover:text-brand-0 dark:hover:bg-brand-80 active:bg-brand-20 dark:active:bg-brand-20 focus:bg-brand-20 dark:focus:bg-brand-20" - > - <Link href="https://app.sovlium.ru/signup">Зарегистрироваться</Link> - </Button> - <Button asChild className="text-sm lg:text-m-base md:px-3 lg:px-auto xl:w-24"> - <Link href="https://app.sovlium.ru/signin">Войти</Link> - </Button> - </div> - </div> - </div> -); diff --git a/apps/xi.support/components/Common/HeaderMain.tsx b/apps/xi.support/components/Common/HeaderMain.tsx deleted file mode 100644 index 0dccba37..00000000 --- a/apps/xi.support/components/Common/HeaderMain.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; - -import Image from 'next/image'; -import Link from 'next/link'; -import { Button } from '@xipkg/button'; - -export const HeaderMain = () => ( - <div className="static sm:absolute w-full h-[72px] md:h-[112px] 2xl:h-[176px] p-4 md:p-8 2xl:py-16 2xl:px-40 flex justify-center items-center flex-row z-10"> - <div className="w-full max-w-[1920px] flex flex-row justify-between items-center gap-4"> - <Link href="/"> - <Image - src="/logofordark.svg" - alt="Sovlium Support logo" - width={216} - height={64} - className="h-[24px] w-auto sm:h-[40px]" - /> - </Link> - <div className="hidden md:flex items-center gap-1.5 lg:gap-2.5 xl:gap-4 ml-auto"> - <Button - asChild - variant="secondary" - className="text-sm lg:text-m-base md:px-3 lg:px-auto xl:w-53.5 bg-brand-0 dark:text-brand-80 hover:bg-brand-80 hover:text-brand-0 dark:hover:bg-brand-80 active:bg-brand-20 dark:active:bg-brand-20 focus:bg-brand-20 dark:focus:bg-brand-20" - > - <Link href="https://app.sovlium.ru/signup">Зарегистрироваться</Link> - </Button> - <Button asChild className="text-sm lg:text-m-base md:px-3 lg:px-auto xl:w-24"> - <Link href="https://app.sovlium.ru/signin">Войти</Link> - </Button> - </div> - </div> - </div> -); - -export default HeaderMain; diff --git a/apps/xi.support/components/Common/index.ts b/apps/xi.support/components/Common/index.ts deleted file mode 100644 index a820db35..00000000 --- a/apps/xi.support/components/Common/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { HeaderDoc } from './HeaderDoc'; -import { HeaderMain } from './HeaderMain'; -import { Layout } from './Layout'; - -export { HeaderDoc, HeaderMain, Layout }; diff --git a/apps/xi.support/components/DocsHomeSections.tsx b/apps/xi.support/components/DocsHomeSections.tsx new file mode 100644 index 00000000..dbbac636 --- /dev/null +++ b/apps/xi.support/components/DocsHomeSections.tsx @@ -0,0 +1,26 @@ +import { sectionsConfig } from '@/config/sectionsConfig'; +import SectionList from './SectionList'; +import { Link } from '@xipkg/link'; +import { Footer } from './Footer'; +import { CallToAction } from './CallToAction'; + +export default function DocsHomeSections() { + return ( + <div className="w-full flex justify-center items-center flex-col z-10 gap-20"> + {sectionsConfig.map((sectionItem) => ( + <section key={sectionItem.pageUrl} className="flex flex-col gap-5 w-full"> + <Link + variant="hover" + href={`/${sectionItem.pageUrl}`} + className="font-medium text-2xl text-brand-100 no-underline hover:underline" + > + {sectionItem.title} + </Link> + <SectionList sections={sectionItem.links} sectionName={sectionItem.pageUrl} /> + </section> + ))} + <CallToAction /> + <Footer /> + </div> + ); +} diff --git a/apps/xi.support/components/Common/Layout.tsx b/apps/xi.support/components/Footer.tsx similarity index 77% rename from apps/xi.support/components/Common/Layout.tsx rename to apps/xi.support/components/Footer.tsx index f8aebd54..d9c8de37 100644 --- a/apps/xi.support/components/Common/Layout.tsx +++ b/apps/xi.support/components/Footer.tsx @@ -1,5 +1,4 @@ -import { ReactNode } from 'react'; -import { Footer } from 'pkg.landing.footer'; +import { Footer as FooterPkg } from 'pkg.landing.footer'; interface SectionLink { link: string; @@ -45,14 +44,11 @@ const sections: Section[] = [ }, ]; -export const Layout = ({ children }: { children: ReactNode }) => ( - <> - <main className="w-screen">{children}</main> - <Footer - topContent={<></>} - sections={sections} - logoPath="/logofordark.svg" - classNameFooter="bg-gray-100 rounded-t-[32px] xl:rounded-t-[64px]" - /> - </> +export const Footer = () => ( + <FooterPkg + topContent={<></>} + sections={sections} + logoPath="/logofordark.svg" + classNameFooter="bg-gray-100 p-0" + /> ); diff --git a/apps/xi.support/components/HomePage/CallToAction.tsx b/apps/xi.support/components/HomePage/CallToAction.tsx deleted file mode 100644 index 2bddf4b0..00000000 --- a/apps/xi.support/components/HomePage/CallToAction.tsx +++ /dev/null @@ -1,24 +0,0 @@ -'use client'; - -import { Button } from '@xipkg/button'; -import { TelegramFilled } from '@xipkg/icons'; -import NextLink from 'next/link'; - -export const CallToAction = () => ( - <section className="flex flex-col justify-center items-center py-16 px-8 sm:py-32"> - <div className="w-full max-w-[1920px] flex flex-col justify-center items-center gap-4"> - <h3 className="font-medium text-[24px] sm:text-[40px] xl:text-[48px] leading-[31.2px] sm:leading-[52px] xl:leading-[83.2px] text-gray-100"> - Не нашлось ответа? - </h3> - <Button - className="h-8 sm:h-[56px] xl:h-[84px] font-medium text-sm sm:text-xl xl:text-[30px] xl:leading-[42px] rounded-md sm:rounded-xl xl:rounded-[18px] pl-3 sm:pl-6 xl:pl-9 pr-2 sm:pr-3 xl:pr-[18px] mt-4 sm:mt-8" - asChild - > - <NextLink href="https://t.me/sovlium_support_bot" target="_blank" rel="noopener noreferrer"> - Написать в телеграм - <TelegramFilled className="fill-gray-0 !size-4 sm:!size-8 xl:!size-12 ml-[6px] sm:ml-4 xl:ml-6" /> - </NextLink> - </Button> - </div> - </section> -); diff --git a/apps/xi.support/components/HomePage/Hero.tsx b/apps/xi.support/components/HomePage/Hero.tsx deleted file mode 100644 index 5f98df21..00000000 --- a/apps/xi.support/components/HomePage/Hero.tsx +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import Image from 'next/image'; - -export const Hero = () => ( - <section className="relative overflow-hidden flex items-center justify-center py-8 px-4 sm:px-8 lg:px-40 w-full sm:h-[600px] sm:bg-brand-20"> - <Image - src="/assets/home-page/home-page-bg.webp" - alt="Задний фон" - fill - className="object-cover hidden sm:flex" - /> - <div className="w-full max-w-[1920px] flex flex-row justify-center items-center gap-4"> - <div className="w-full z-10"> - <div className="text-[24px] leading-[31.2px] sm:text-[48px] md:text-[64px] sm:leading-[62.4px] md:leading-[83.2px] text-gray-100 sm:text-gray-0 font-medium"> - <h2>Привет 👋</h2> - <h2>Это база знаний sovlium</h2> - </div> - <p className="text-[14px] leading-[18.2px] mb-4 sm:text-[20px] sm:leading-[32px] md:text-2xl font-normal sm:mb-8 text-gray-90 sm:text-gray-10"> - Рассказываем как пользоваться приложением - <br />и отвечаем на важные вопросы - </p> - </div> - </div> - </section> -); diff --git a/apps/xi.support/components/HomePage/Parts.tsx b/apps/xi.support/components/HomePage/Parts.tsx deleted file mode 100644 index 9cd8c6ae..00000000 --- a/apps/xi.support/components/HomePage/Parts.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { ChevronRight } from '@xipkg/icons'; -import Image from 'next/image'; -import { Link } from '@xipkg/link'; -import { sectionsConfig } from '../../config/sectionsConfig'; - -export const Parts = () => ( - <section className="flex items-center justify-center p-4 xs:p-8 lg:px-40 md:py-16"> - <div className="w-full max-w-[1920px]"> - <ul className="grid w-full gap-8 md:gap-y-12 grid-cols-1 md:grid-cols-2 2xl:grid-cols-3"> - {sectionsConfig.map((item, index) => ( - <li className="w-full flex" key={index}> - <Image - src={`/assets/home-page/${item.icon}`} - alt={item.icon} - width={0} - height={0} - className="mb-auto size-12 sm:size-16" - /> - <div className="ml-4 sm:ml-8"> - <Link - variant="hover" - href={`/${item.sectionName}`} - className="text-[24px] sm:text-[32px] leading-[31.2px] sm:leading-[41.6px] text-brand-80 font-medium hover:text-brand-80" - > - {item.title} - </Link> - <ul className="font-normal text-gray-90 text-[16px] sm:text-[20px] leading-[20.8px] sm:leading-[26px]"> - {[0, 1, 2].map( - (index) => - item.links[index] && ( - <li className="mt-2" key={index}> - <Link - className="text-[20px] leading-[26px]" - variant="hover" - href={`/${item.sectionName}/${item.links[index].pageUrl}`} - > - {item.links[index].pageTitle} - </Link> - </li> - ), - )} - <div className="mt-4 flex items-center gap-1"> - <Link - className="text-[20px] leading-[26px]" - variant="hover" - href={`/${item.sectionName}`} - > - Показать все - </Link> - <ChevronRight className="!size-4 sm:!size-5 mt-[4px]" /> - </div> - </ul> - </div> - </li> - ))} - </ul> - </div> - </section> -); diff --git a/apps/xi.support/components/HomePage/index.ts b/apps/xi.support/components/HomePage/index.ts deleted file mode 100644 index 578d68d4..00000000 --- a/apps/xi.support/components/HomePage/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Hero } from './Hero'; -import { CallToAction } from './CallToAction'; -import { Parts } from './Parts'; - -export { Hero, CallToAction, Parts }; diff --git a/apps/xi.support/components/MdxPage/Breadcrumbs.tsx b/apps/xi.support/components/MdxPage/Breadcrumbs.tsx deleted file mode 100644 index ffaf6a95..00000000 --- a/apps/xi.support/components/MdxPage/Breadcrumbs.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import { Link } from '@xipkg/link'; -import { ChevronRight } from '@xipkg/icons'; - -type BreadcrumbsPropsT = { - sectionName: string; - sectionLink: string; - pageName: string; - pageLink: string; -}; - -export const Breadcrumbs = ({ - sectionName, - sectionLink, - pageName, - pageLink, -}: BreadcrumbsPropsT) => ( - <div className="w-full flex justify-start items-center flex-row z-10 gap-0.5"> - <Link theme="brand" variant="hover" href="/"> - Главная - </Link> - <div className="flex justify-center items-center w-4 h-4"> - <ChevronRight className="fill-brand-80" /> - </div> - <Link theme="brand" variant="hover" href={`/${sectionLink}`}> - {sectionName} - </Link> - <div className="flex justify-center items-center w-4 h-4"> - <ChevronRight className="fill-brand-80" /> - </div> - <Link theme="brand" variant="hover" href={`/${sectionLink}/${pageLink}`}> - {pageName} - </Link> - </div> -); diff --git a/apps/xi.support/components/MdxPage/MdxPage.tsx b/apps/xi.support/components/MdxPage/MdxPage.tsx deleted file mode 100644 index 10091eee..00000000 --- a/apps/xi.support/components/MdxPage/MdxPage.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import dynamic from 'next/dynamic'; - -type MdxPageT = { - sectionId: string; - mdxId: string; -}; - -export const MdxPage = ({ sectionId, mdxId }: MdxPageT) => { - const MDX = dynamic(() => import(`markdown/${sectionId}/${mdxId}.mdx`)); - - return <MDX />; -}; diff --git a/apps/xi.support/components/MdxPage/index.ts b/apps/xi.support/components/MdxPage/index.ts deleted file mode 100644 index 87da6475..00000000 --- a/apps/xi.support/components/MdxPage/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { MdxPage } from './MdxPage'; - -export { MdxPage }; diff --git a/apps/xi.support/components/SectionList.tsx b/apps/xi.support/components/SectionList.tsx new file mode 100644 index 00000000..29815566 --- /dev/null +++ b/apps/xi.support/components/SectionList.tsx @@ -0,0 +1,57 @@ +import { Link } from '@xipkg/link'; +import Image from 'next/image'; + +type SectionListProps = { + sections: { + pageTitle: string; + pageUrl: string; + items: { + title: string; + image: string; + link: string; + }[]; + }[]; + sectionName: string; +}; + +const SectionList = ({ sections, sectionName }: SectionListProps) => ( + <div className="w-full flex flex-col justify-center items-center z-10 gap-10"> + {sections.map((section) => ( + <section className="flex flex-col w-full gap-5" key={section.pageUrl}> + <Link + variant="hover" + href={`/${sectionName}#${section.pageUrl}`} + className="text-lg no-underline hover:underline" + > + {section.pageTitle} + </Link> + <div className="grid grid-cols-2 gap-8 w-full"> + {section.items.map((item, i) => ( + <div className="flex flex-col w-full gap-2" key={i.toString()}> + <Link + href={`/${sectionName}#${item.link}`} + className={`relative flex justify-center items-center bg-gray-10 h-60 w-full rounded-[12px] md:rounded-[24px] `} + > + <Image + alt={item.title} + src={`/assets/markdown/${sectionName}/${item.image}`} + fill + objectFit="contain" + className="mt-0 mb-0" + /> + </Link> + <Link + href={`/${sectionName}#${item.link}`} + className="font-medium text-[16px] text-center no-underline hover:underline" + > + {item.title} + </Link> + </div> + ))} + </div> + </section> + ))} + </div> +); + +export default SectionList; diff --git a/apps/xi.support/components/SectionPage/Sections.tsx b/apps/xi.support/components/SectionPage/Sections.tsx deleted file mode 100644 index 0f5cf0fa..00000000 --- a/apps/xi.support/components/SectionPage/Sections.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -'use client'; - -import { Link } from '@xipkg/link'; -import Image from 'next/image'; - -type SectionsT = { - sections: any; - sectionName: string; -}; - -const Sections = ({ sections, sectionName }: SectionsT) => ( - <div className="w-full p-4 md:p-8 2xl:py-16 2xl:px-40 flex justify-center items-center flex-row z-10"> - <div className="flex flex-col w-full max-w-[1920px] gap-[64px]"> - {sections.map((section, index) => ( - <section id={section.link} className="flex flex-col" key={index.toString()}> - <Link - variant="hover" - href={`/${sectionName}/${section.pageUrl}`} - className="font-medium text-[24px] md:text-[32px] 2xl:text-[48px]" - > - {section.pageTitle} - </Link> - <div className="mt-6 grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-8 md:gap-y-6 md:gap-x-8"> - {section.items.map((item, i) => ( - <div className="flex flex-col" key={i.toString()}> - <Link - href={`/${sectionName}/${section.pageUrl}#${item.link}`} - className="relative flex justify-center items-center bg-gray-10 aspect-[520/250] rounded-[12px] md:rounded-[24px] p-1" - > - <Image - alt={item.title} - src={ - item.image - ? `/assets/sections/${sectionName}/${item.image}` - : '/assets/sections/empty-cover.png' - } - width={item.width ?? 0} - height={item.height ?? 0} - /> - </Link> - <Link - variant="hover" - href={`/${sectionName}/${section.pageUrl}#${item.link}`} - className="mt-4 font-medium text-[16px] md:text-[24px] 2xl:text-[32px]" - > - {item.title} - </Link> - <span className="text-[16px] md:text-[24px] 2xl:text-[24px] text-gray-70"> - {item.description} - </span> - </div> - ))} - </div> - </section> - ))} - </div> - </div> -); - -export default Sections; diff --git a/apps/xi.support/components/SectionPage/Title.tsx b/apps/xi.support/components/SectionPage/Title.tsx deleted file mode 100644 index 6e3ac7f9..00000000 --- a/apps/xi.support/components/SectionPage/Title.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client'; - -type TitlePropsT = { - title: string; -}; - -const Title = ({ title }: TitlePropsT) => ( - <div className="w-full p-4 md:p-8 2xl:py-20 2xl:px-40 flex justify-center items-center flex-row z-10"> - <div className="w-full max-w-[1920px] flex flex-col gap-2"> - <h2 className="font-medium text-[32px] md:text-[48px] 2xl:text-[64px]">{title}</h2> - </div> - </div> -); - -export default Title; diff --git a/apps/xi.support/components/SectionPage/index.ts b/apps/xi.support/components/SectionPage/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/xi.support/config/pagesConfig.ts b/apps/xi.support/config/pagesConfig.ts deleted file mode 100644 index d1633ad5..00000000 --- a/apps/xi.support/config/pagesConfig.ts +++ /dev/null @@ -1,106 +0,0 @@ -type PageConfigItemT = { - section: string; - page: string; - updateDate: string; - anchors: { title: string; link: string }[]; - relatedLinks: { title: string; link: string }[]; -}; - -export const pagesConfig: PageConfigItemT[] = [ - // work-begining - { - section: 'work-beginning', - page: 'signup', - anchors: [{ title: 'Регистрация', link: 'signup' }], - relatedLinks: [ - { title: 'Настроить профиль', link: 'welcome' }, - { title: 'Пригласить учеников', link: 'invite-students' }, - ], - updateDate: '13.01.2026', - }, - { - section: 'work-beginning', - page: 'welcome', - anchors: [ - { - title: 'Настроить профиль', - link: 'welcome', - }, - ], - relatedLinks: [ - { title: 'Пригласить учеников', link: 'invite-students' }, - { title: 'Назначить занятие', link: 'create-lesson' }, - ], - updateDate: '13.01.2026', - }, - // work-beginning - invite-students - { - section: 'work-beginning', - page: 'invite-students', - anchors: [ - { title: 'Пригласить учеников', link: 'invite' }, - { title: 'Индивидуальные приглашения', link: 'individually' }, - { title: 'Приглашения в группу', link: 'group' }, - ], - relatedLinks: [ - { title: 'Назначить занятие', link: 'create-lesson' }, - { title: 'Настроить напоминания', link: 'reminders' }, - ], - updateDate: '13.01.2026', - }, - // prepare-for-lesson - { - section: 'prepare-for-lesson', - page: 'create-lesson', - anchors: [{ title: 'Назначить занятие', link: 'create_lesson' }], - relatedLinks: [ - { title: 'Подготовить материалы', link: 'materials' }, - { title: 'Настроить напоминания', link: 'reminders' }, - ], - updateDate: '13.01.2026', - }, - { - section: 'prepare-for-lesson', - page: 'materials', - anchors: [{ title: 'Подготовить материалы', link: 'materials' }], - relatedLinks: [ - { title: 'Назначить занятие', link: 'create-lesson' }, - { title: 'Настроить напоминания', link: 'reminders' }, - ], - updateDate: '13.01.2026', - }, - { - section: 'prepare-for-lesson', - page: 'set-reminders', - anchors: [{ title: 'Настроить напоминания', link: 'reminders' }], - relatedLinks: [{ title: 'Подготовить материалы', link: 'materials' }], - updateDate: '13.01.2026', - }, - // conduct-lesson - { - section: 'conduct-lesson', - page: 'videocall', - anchors: [ - { title: 'Начать видеозвонок', link: 'videocall' }, - { title: 'Онлайн-доска', link: 'board' }, - ], - relatedLinks: [{ title: 'Контролировать оплату', link: 'analytics' }], - updateDate: '13.01.2026', - }, - // control-payments - { - section: 'control-payments', - page: 'analytics', - anchors: [ - { title: 'Контролировать оплату', link: 'сontrol_payments' }, - { title: 'Как создать счёт', link: 'invoices' }, - { title: 'Журнал оплат', link: 'jrnl' }, - { title: 'Аналитика', link: 'analytics' }, - ], - relatedLinks: [ - { title: 'Назначить занятие', link: 'create-lesson' }, - { title: 'Пригласить учеников', link: 'invite-students' }, - ], - updateDate: '13.01.2026', - }, -]; diff --git a/apps/xi.support/config/sectionsConfig.ts b/apps/xi.support/config/sectionsConfig.ts index 6a3e1a2c..bde76c73 100644 --- a/apps/xi.support/config/sectionsConfig.ts +++ b/apps/xi.support/config/sectionsConfig.ts @@ -1,198 +1,157 @@ export const sectionsConfig = [ { title: 'Начало работы', + pageUrl: 'work-beginning', + icon: 'start-working.svg', links: [ { pageTitle: 'Регистрация', - pageUrl: 'signup', + pageUrl: 'регистрация', items: [ { title: 'Регистрация', - image: '1signup.png', - width: 368, - height: 516, - description: '', - link: 'signup', + image: 'signup.png', + link: 'регистрация', }, ], }, { pageTitle: 'Настройка профиля после регистрации', - pageUrl: 'welcome', + pageUrl: 'настройка-профиля-после-регистрации', items: [ { title: 'Настроить профиль', - image: '3welcome.png', - width: 368, - height: 516, - description: '', - link: 'welcome', + image: 'setup_profile.png', + link: 'настроить-профиль', }, { title: 'Настроить уведомления', - image: '5welcome.png', - width: 368, - height: 516, - description: '', - link: 'welcome', + image: 'setup_notifications.png', + link: 'настроить-уведомления', }, ], }, { pageTitle: 'Пригласить учеников', - pageUrl: 'invite-students', + pageUrl: 'пригласить-учеников', items: [ { title: 'Пригласить учеников', - image: '6invite_students.png', - width: 368, - height: 516, + image: 'invite_students.png', description: '', - link: 'invite', + link: 'пригласить-учеников', }, { title: 'Индивидуальное приглашение', - image: '7invitestudents.png', - width: 368, - height: 516, + image: 'invite_individual.png', description: '', - link: 'individually', + link: 'индивидуальное-приглашение', }, { title: 'Создать группу', - image: '8invitestudents.png', - width: 368, - height: 516, + image: 'create_group.png', description: '', - link: 'group', + link: 'пригласить-учеников', }, { title: 'Пригласить в группу', - image: '9invitestudents.png', - width: 368, - height: 516, + image: 'invite_group.png', description: '', - link: 'group', + link: 'приглашение-в-группу', }, ], }, ], - sectionName: 'work-beginning', - icon: 'start-working.svg', }, { title: 'Подготовка к занятию', + pageUrl: 'prepare-for-lesson', links: [ { pageTitle: 'Назначить занятие', - pageUrl: 'create-lesson', + pageUrl: 'назначить-занятие', items: [ { title: 'Назначить занятие', image: '', - width: 368, - height: 516, - description: '', - link: 'create_lesson', + link: 'назначить-занятие', }, ], }, { pageTitle: 'Подготовить материалы', - pageUrl: 'materials', + pageUrl: 'подготовить-материалы', items: [ { title: 'Подготовить материалы', image: '', - width: 368, - height: 516, - description: '', - link: 'materials', + link: 'подготовить-материалы', }, ], }, { pageTitle: 'Настроить напоминания', - pageUrl: 'set-reminders', + pageUrl: 'настроить-напоминания', items: [ { title: 'Настроить напоминания', - image: '10reminders.png', - width: 368, - height: 516, - description: '', - link: 'reminders', + image: 'set_reminders.png', + link: 'настроить-напоминания', }, ], }, ], - sectionName: 'prepare-for-lesson', icon: 'schedule.svg', }, { title: 'Проведение занятия', + pageUrl: 'conduct-lesson', + icon: 'video.svg', links: [ { pageTitle: 'Начать видеозвонок', - pageUrl: 'videocall', + pageUrl: 'начать-видеозвонок', items: [ { title: 'Начать видеозвонок', - image: '14videocall.png', - width: 368, - height: 516, - description: '', - link: 'videocall', + image: 'begin_videocall.png', + link: 'начать-видеозвонок', }, { title: 'Онлайн-доска', - image: '15board.png', - width: 368, - height: 516, - description: '', - link: 'board', + image: 'online_board.png', + link: 'онлайн-доска', }, ], }, ], - sectionName: 'conduct-lesson', - icon: 'video.svg', }, { title: 'Контроль оплат', + pageUrl: 'control-payments', + icon: 'settings.svg', links: [ { pageTitle: 'Контролировать оплату', - pageUrl: 'analytics', + pageUrl: 'контролировать-оплату', items: [ { title: 'Создать счёт', - image: '11create_invoice.png', - width: 368, - height: 516, - description: '', - link: 'invoices', + image: 'create_invoice.png', + link: 'как-создать-счёт', }, { title: 'Журнал оплат', - image: '12analytics.png', - width: 368, - height: 516, - description: '', - link: 'jrnl', + image: 'payment_journal.png', + link: 'журнал-оплат', }, { title: 'Аналитика', - image: '13diagrams.png', - width: 368, - height: 516, - description: '', - link: 'analytics', + image: 'analytics.png', + link: 'аналитика', }, ], }, ], - sectionName: 'control-payments', - icon: 'settings.svg', }, ]; diff --git a/apps/xi.support/markdown/conduct-lesson/videocall.mdx b/apps/xi.support/content/docs/conduct-lesson.mdx similarity index 76% rename from apps/xi.support/markdown/conduct-lesson/videocall.mdx rename to apps/xi.support/content/docs/conduct-lesson.mdx index 28bedb92..9ec393e1 100644 --- a/apps/xi.support/markdown/conduct-lesson/videocall.mdx +++ b/apps/xi.support/content/docs/conduct-lesson.mdx @@ -1,10 +1,12 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; +--- +title: Проведение занятия +updateDate: '13.01.2026' +--- -<AnchorHeading type="h1" id="videocall"> - Начать видеозвонок -</AnchorHeading> +import Link from '../mdxComponents/Link'; +import Image from '../mdxComponents/Image'; + +## Начать видеозвонок Когда вы готовы, просто нажмите кнопку «Начать видеозвонок» в карточке занятия. Перед занятием вы сможете проверить качество видео и звука. Для этого браузеру нужно обязательно дать доступ к камере и микрофону. @@ -13,13 +15,11 @@ import Image from 'mdxComponents/Image'; <Image width={1368} height={768} - src="/assets/markdown/conduct-lesson/14videocall.png" + src="/assets/markdown/conduct-lesson/begin_videocall.png" alt="Видеозвонок" /> -<AnchorHeading type="h1" id="board"> - Онлайн-доска -</AnchorHeading> +## Онлайн-доска Чтобы добавить онлайн-доску, нажмите на значок «Доска» на панели управления. Выберите онлайн-доску или создайте новую. Вы можете заниматься на доске прямо во время видеозвонка. @@ -30,6 +30,6 @@ import Image from 'mdxComponents/Image'; <Image width={1368} height={768} - src="/assets/markdown/conduct-lesson/15board.png" + src="/assets/markdown/conduct-lesson/online_board.png" alt="Онлайн-доска" /> diff --git a/apps/xi.support/markdown/control-payments/analytics.mdx b/apps/xi.support/content/docs/control-payments.mdx similarity index 72% rename from apps/xi.support/markdown/control-payments/analytics.mdx rename to apps/xi.support/content/docs/control-payments.mdx index b0ee34bb..abed5066 100644 --- a/apps/xi.support/markdown/control-payments/analytics.mdx +++ b/apps/xi.support/content/docs/control-payments.mdx @@ -1,14 +1,12 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; +--- +title: Контролировать оплату +updateDate: '13.01.2026' +--- -<AnchorHeading type="h1" id="сontrol-payments"> - Контролировать оплату -</AnchorHeading> +import Link from '../mdxComponents/Link'; +import Image from '../mdxComponents/Image'; -<AnchorHeading type="h2" id="invoices"> - Как создать счёт -</AnchorHeading> +## Как создать счёт Чтобы отправить ученику счёт за занятие, нажмите «Создать счёт на оплату». @@ -23,7 +21,7 @@ import Image from 'mdxComponents/Image'; <Image width={1368} height={768} - src="/assets/markdown/control-payments/11create_invoice.png" + src="/assets/markdown/control-payments/create_invoice.png" alt="Создать счёт" /> @@ -33,9 +31,7 @@ import Image from 'mdxComponents/Image'; Если оплата так и не поступила, свяжитесь с учеником. Не подтверждайте счёт. -<AnchorHeading type="h2" id="jrnl"> - Журнал оплат -</AnchorHeading> +## Журнал оплат Для управления платежами перейдите в раздел «Контроль оплат» в меню слева. Используйте подраздел «Журнал оплат», чтобы отслеживать все выставленные счета. @@ -44,19 +40,17 @@ import Image from 'mdxComponents/Image'; <Image width={1368} height={768} - src="/assets/markdown/control-payments/12analytics.png" + src="/assets/markdown/control-payments/payment_journal.png" alt="Журнал оплат" /> -<AnchorHeading type="h2" id="analytics"> - Аналитика -</AnchorHeading> +## Аналитика Отслеживайте доход по месяцам, дням и предметам на вкладке «Аналитика». <Image width={1368} height={768} - src="/assets/markdown/control-payments/13diagrams.png" + src="/assets/markdown/control-payments/analytics.png" alt="Аналитика" /> diff --git a/apps/xi.support/content/docs/index.mdx b/apps/xi.support/content/docs/index.mdx new file mode 100644 index 00000000..4af2d3e9 --- /dev/null +++ b/apps/xi.support/content/docs/index.mdx @@ -0,0 +1,11 @@ +--- +title: Главная +updateDate: '13.01.2026' +--- + +import Link from '../mdxComponents/Link'; +import Image from '../mdxComponents/Image'; + +import DocsHomeSections from '../../components/DocsHomeSections'; + +<DocsHomeSections /> diff --git a/apps/xi.support/content/docs/prepare-for-lesson.mdx b/apps/xi.support/content/docs/prepare-for-lesson.mdx new file mode 100644 index 00000000..7c16d9e1 --- /dev/null +++ b/apps/xi.support/content/docs/prepare-for-lesson.mdx @@ -0,0 +1,40 @@ +--- +title: Подготовка к занятию +updateDate: '13.01.2026' +--- + +import Link from '../mdxComponents/Link'; +import Image from '../mdxComponents/Image'; + +## Назначить занятие + +Перейдите в «Расписание» в меню слева. Выберите день и время и нажмите на ячейку в календаре. + +Откроется окно, в котором вы сможете выбрать ученика или группу, настроить время и описание, а также сделать занятие регулярным. + +## Подготовить материалы + +Вы можете просматривать как все доступные вам материалы, так и материалы в кабинете конкретного ученика. + +Чтобы добавить новые материалы, перейдите на главную страницу и нажмите «Создать доску», «Создать заметку» или «Загрузить файл». + +Чтобы отправить материал в кабинет ученику или группе, выберите «Дублировать». + +Настройте уровень доступа: + +- «Теория» — чтобы редактировать материал могли только вы. +- «Практика» — чтобы редактировать материал могли все участники в кабинете. +- «Черновик» — чтобы материал видели только вы. + +## Настроить напоминания + +Нажмите на верхнюю иконку в меню слева и перейдите в настройки профиля → Уведомления. Добавьте +электронную почту, мессенджер или соцсеть, чтобы получать уведомления о начале урока, изменениях в +расписании или статусе оплаты. + +<Image + width={568} + height={268} + src="/assets/markdown/prepare-for-lesson/set_reminders.png" + alt="Настроить напоминания" +/> diff --git a/apps/xi.support/content/docs/work-beginning.mdx b/apps/xi.support/content/docs/work-beginning.mdx new file mode 100644 index 00000000..aa8d3394 --- /dev/null +++ b/apps/xi.support/content/docs/work-beginning.mdx @@ -0,0 +1,113 @@ +--- +title: Начало работы +updateDate: '13.01.2026' +--- + +import Link from '../mdxComponents/Link'; +import Image from '../mdxComponents/Image'; + +## Регистрация + +Чтобы использовать sovlium, нужно <Link href="https://app.sovlium.ru/signup">зарегистрироваться</Link>. + +- Придумайте имя пользователя — от 4 до 30 символов в нижнем регистре, латиницей, можно добавить цифры, точку, дефис. Имя должно быть уникальным. Пример: anna86. + +<Image + width={468} + height={616} + src="/assets/markdown/work-beginning/signup.png" + alt="Регистрация на платформе" +/> + +- Укажите действующую электронную почту — туда мы отправим подтверждение регистрации. +- Придумайте пароль — от 6 до 100 символов, латиницей, прописные и строчные символы, цифры и специальные символы. +- Нажмите «Зарегистрироваться». +- Чтобы подтвердить почту, перейдите по ссылке в письме. + Если письмо долго не приходит, проверьте папку «Спам». Если письмо так не пришло или возникли другие проблемы — напишите нам, пожалуйста. + +## Настройка профиля после регистрации + +### Настроить профиль + +Подтвердите почту и начните настройку аккаунта. + +Шаг 1. По желанию загрузите фото. + +Шаг 2. Укажите имя, которое будут видеть другие пользователи. Оно может быть неуникальным. Пример: Анна Иванова. + +Шаг 3. Нажмите «Продолжить». + +<Image + width={368} + height={516} + src="/assets/markdown/work-beginning/setup_profile.png" + alt="Окно «Давайте познакомимся»" +/> + +Шаг 4. Выберите роль — ученик или репетитор. + +### Настроить уведомления + +Шаг 5. По желанию добавьте мессенджер, чтобы получать уведомления о статусе оплаты, переносе занятий и будущих занятиях. Наш бот отправляет только служебные уведомления. + +<Image + width={368} + height={516} + src="/assets/markdown/work-beginning/setup_notifications.png" + alt="Настроить уведомления" +/> + +## Пригласить учеников + +### Пригласить учеников + +Чтобы добавить ученика или группу, перейдите в раздел «Кабинеты» в меню слева. + +Кабинет — цифровое пространство для учёбы. У каждого ученика и группы свой кабинет. В кабинете хранятся карточки занятий, материалы и счета на оплату. + +<Image + width={1368} + height={768} + src="/assets/markdown/work-beginning/invite_students.png" + alt="Пригласить учеников" +/> + +### Индивидуальное приглашение + +Нажмите кнопку «Пригласить» в правом верхнем углу. Откроется окно со ссылками-приглашениями. +Скопируйте готовую ссылку или создайте новую. + +<Image + width={1368} + height={768} + src="/assets/markdown/work-beginning/invite_individual.png" + alt="Индивидуальное приглашение" +/> + +Зарегистрировавшись по ссылке, пользователь сразу попадёт в список ваших учеников. + +### Приглашение в группу + +1. Нажмите кнопку «Создать группу» в правом верхнем углу. 2. Придумайте название для группы и + заполните описание. + +<Image + width={1368} + height={768} + src="/assets/markdown/work-beginning/create_group.png" + alt="Создать группу" +/> + +3. Откройте кабинет группы и нажмите «Пригласить в группу». Скопируйте ссылку-приглашение и отправьте ученику. + +Зарегистрировавшись по ссылке, пользователь сразу попадает в группу. + +<Image + width={1368} + height={768} + src="/assets/markdown/work-beginning/invite_group.png" + alt="Пригласить в группу" +/> + +Если ученик уже занимается с вами на платформе индивидуально, а теперь вы хотите пригласить его в +группу, нажмите «Добавить ученика». Переход по общей ссылке-приглашению также сработает. diff --git a/apps/xi.support/mdxComponents/Image.tsx b/apps/xi.support/content/mdxComponents/Image.tsx similarity index 80% rename from apps/xi.support/mdxComponents/Image.tsx rename to apps/xi.support/content/mdxComponents/Image.tsx index c711db1e..33f7cb6e 100644 --- a/apps/xi.support/mdxComponents/Image.tsx +++ b/apps/xi.support/content/mdxComponents/Image.tsx @@ -8,7 +8,7 @@ type ImagePropsT = { const Image = ({ image, alt, noRatio, ...props }: ImagePropsT) => ( <div - className={`flex justify-center items-center w-full bg-gray-10 ${noRatio ? '' : 'aspect-[520/250]'} rounded-[12px] md:rounded-[24px] my-2 p-6 sm:p-12`} + className={`flex justify-center items-center w-full bg-gray-10 ${noRatio ? '' : 'aspect-520/250'} rounded-[12px] md:rounded-[24px] my-2 p-6 sm:p-12`} > <ImageNext className="text-gray-10 rounded-xl" alt={alt} src={image} {...props} /> </div> diff --git a/apps/xi.support/mdxComponents/Link.tsx b/apps/xi.support/content/mdxComponents/Link.tsx similarity index 100% rename from apps/xi.support/mdxComponents/Link.tsx rename to apps/xi.support/content/mdxComponents/Link.tsx diff --git a/apps/xi.support/eslint.config.mjs b/apps/xi.support/eslint.config.mjs index 15768bd7..0cba8303 100644 --- a/apps/xi.support/eslint.config.mjs +++ b/apps/xi.support/eslint.config.mjs @@ -1,3 +1,8 @@ import config from 'common.eslint'; -export default config; +export default [ + ...config, + { + ignores: ['**/.source/**'], + }, +]; diff --git a/apps/xi.support/index.css b/apps/xi.support/index.css index 94a39d0b..6cc28808 100644 --- a/apps/xi.support/index.css +++ b/apps/xi.support/index.css @@ -16,3 +16,52 @@ @source "../../packages/pkg.error-page"; @custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); + +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; + +@theme { + --color-fd-background: hsl(0, 0%, 100%); + --color-fd-foreground: hsl(0, 0%, 0%); + --color-fd-primary: hsl(220, 70%, 60%); + + --color-fd-muted-foreground: hsl(0, 0%, 30%); + + --color-fd-card: hsl(0, 0%, 100%); + --color-fd-card-foreground: hsl(220, 70%, 60%); + --color-fd-primary: hsl(220, 70%, 60%); + --color-fd-primary-foreground: hsl(0, 0%, 98%); + --color-fd-secondary: hsl(0, 0%, 93.1%); + --color-fd-secondary-foreground: hsl(0, 0%, 9%); + --color-fd-accent: hsla(0, 0%, 82%, 50%); + --color-fd-accent-foreground: hsl(0, 0%, 9%); + --color-fd-ring: hsl(0, 0%, 63.9%); +} + +.dark { + --color-fd-background: hsl(0, 0%, 7.04%); + --color-fd-foreground: hsl(0, 0%, 92%); + --color-fd-muted: hsl(0, 0%, 12.9%); + --color-fd-muted-foreground: hsla(0, 0%, 80%, 0.8); + --color-fd-popover: hsl(0, 0%, 11.6%); + --color-fd-popover-foreground: hsl(0, 0%, 86.9%); + --color-fd-card: hsl(0, 0%, 9.8%); + --color-fd-card-foreground: hsl(0, 0%, 98%); + --color-fd-border: hsla(0, 0%, 40%, 20%); + --color-fd-primary: hsl(220, 70%, 60%); + --color-fd-primary-foreground: hsl(0, 0%, 9%); + --color-fd-secondary: hsl(0, 0%, 12.9%); + --color-fd-secondary-foreground: hsl(0, 0%, 92%); + --color-fd-accent: hsla(0, 0%, 40.9%, 30%); + --color-fd-accent-foreground: hsl(0, 0%, 90%); + --color-fd-ring: hsl(0, 0%, 54.9%); +} + +/* #nd-docs-layout { + --fd-sidebar-width: 268px; +} + +aside { + max-width: 268px; +} */ diff --git a/apps/xi.support/lib/cn.ts b/apps/xi.support/lib/cn.ts new file mode 100644 index 00000000..ba66fd25 --- /dev/null +++ b/apps/xi.support/lib/cn.ts @@ -0,0 +1 @@ +export { twMerge as cn } from 'tailwind-merge'; diff --git a/apps/xi.support/lib/i18n.ts b/apps/xi.support/lib/i18n.ts new file mode 100644 index 00000000..9243bac0 --- /dev/null +++ b/apps/xi.support/lib/i18n.ts @@ -0,0 +1,31 @@ +import { defineI18n } from 'fumadocs-core/i18n'; +import { defineI18nUI } from 'fumadocs-ui/i18n'; + +export const i18n = defineI18n({ + defaultLanguage: 'ru', + languages: ['ru', 'en'], + parser: 'dir', +}); + +const { provider } = defineI18nUI(i18n, { + translations: { + ru: { + displayName: 'Русский', + search: 'Поиск', + searchNoResult: 'Ничего не найдено', + toc: 'На этой странице', + tocNoHeadings: 'Нет заголовков', + lastUpdate: 'Обновлено', + chooseLanguage: 'Выбрать язык', + nextPage: 'Далее', + previousPage: 'Назад', + chooseTheme: 'Тема', + editOnGithub: 'Редактировать на GitHub', + }, + en: { + displayName: 'English', + }, + }, +}); + +export { provider as i18nUIProvider }; diff --git a/apps/xi.support/lib/layout.shared.tsx b/apps/xi.support/lib/layout.shared.tsx new file mode 100644 index 00000000..8fa8df5e --- /dev/null +++ b/apps/xi.support/lib/layout.shared.tsx @@ -0,0 +1,28 @@ +import Image from 'next/image'; +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + url: 'https://sovlium.ru/', + title: ( + <> + <Image + src="/logoforwhite.svg" + alt="Sovlium Support logo" + width={216} + height={64} + className="h-[24px] w-auto sm:h-[40px] dark:hidden" + /> + <Image + src="/logofordark.svg" + alt="Sovlium Support logo" + width={216} + height={64} + className="h-[24px] w-auto sm:h-[40px] hidden dark:block" + /> + </> + ), + }, + }; +} diff --git a/apps/xi.support/lib/source.ts b/apps/xi.support/lib/source.ts new file mode 100644 index 00000000..0ff4fed9 --- /dev/null +++ b/apps/xi.support/lib/source.ts @@ -0,0 +1,27 @@ +import { docs } from 'fumadocs-mdx:collections/server'; +import { type InferPageType, loader } from 'fumadocs-core/source'; +import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons'; + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: '/', + source: docs.toFumadocsSource(), + plugins: [lucideIconsPlugin()], +}); + +export function getPageImage(page: InferPageType<typeof source>) { + const segments = [...page.slugs, 'image.png']; + + return { + segments, + url: `/og/${segments.join('/')}`, + }; +} + +export async function getLLMText(page: InferPageType<typeof source>) { + const processed = await page.data.getText('processed'); + + return `# ${page.data.title} + +${processed}`; +} diff --git a/apps/xi.support/markdown/prepare-for-lesson/create-lesson.mdx b/apps/xi.support/markdown/prepare-for-lesson/create-lesson.mdx deleted file mode 100644 index e0dcfa49..00000000 --- a/apps/xi.support/markdown/prepare-for-lesson/create-lesson.mdx +++ /dev/null @@ -1,11 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="create-lesson"> - Назначить занятие -</AnchorHeading> - -Перейдите в «Расписание» в меню слева. Выберите день и время и нажмите на ячейку в календаре. - -Откроется окно, в котором вы сможете выбрать ученика или группу, настроить время и описание, а также сделать занятие регулярным. diff --git a/apps/xi.support/markdown/prepare-for-lesson/materials.mdx b/apps/xi.support/markdown/prepare-for-lesson/materials.mdx deleted file mode 100644 index 3f417f7d..00000000 --- a/apps/xi.support/markdown/prepare-for-lesson/materials.mdx +++ /dev/null @@ -1,19 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="materials"> - Подготовить материалы -</AnchorHeading> - -Вы можете просматривать как все доступные вам материалы, так и материалы в кабинете конкретного ученика. - -Чтобы добавить новые материалы, перейдите на главную страницу и нажмите «Создать доску», «Создать заметку» или «Загрузить файл». - -Чтобы отправить материал в кабинет ученику или группе, выберите «Дублировать». - -Настройте уровень доступа: - -- «Теория» — чтобы редактировать материал могли только вы. -- «Практика» — чтобы редактировать материал могли все участники в кабинете. -- «Черновик» — чтобы материал видели только вы. diff --git a/apps/xi.support/markdown/prepare-for-lesson/set-reminders.mdx b/apps/xi.support/markdown/prepare-for-lesson/set-reminders.mdx deleted file mode 100644 index 7ec26d99..00000000 --- a/apps/xi.support/markdown/prepare-for-lesson/set-reminders.mdx +++ /dev/null @@ -1,18 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="reminders"> - Настроить напоминания -</AnchorHeading> - -Нажмите на верхнюю иконку в меню слева и перейдите в настройки профиля → Уведомления. Добавьте -электронную почту, мессенджер или соцсеть, чтобы получать уведомления о начале урока, изменениях в -расписании или статусе оплаты. - -<Image - width={568} - height={268} - src="/assets/markdown/prepare-for-lesson/10reminders.png" - alt="Настроить напоминания" -/> diff --git a/apps/xi.support/markdown/work-beginning/invite-students.mdx b/apps/xi.support/markdown/work-beginning/invite-students.mdx deleted file mode 100644 index 6f7aa341..00000000 --- a/apps/xi.support/markdown/work-beginning/invite-students.mdx +++ /dev/null @@ -1,61 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="invite"> - Пригласить учеников -</AnchorHeading> - -Чтобы добавить ученика или группу, перейдите в раздел «Кабинеты» в меню слева. - -Кабинет — цифровое пространство для учёбы. У каждого ученика и группы свой кабинет. В кабинете хранятся карточки занятий, материалы и счета на оплату. - -<Image - width={1368} - height={768} - src="/assets/markdown/work-beginning/6invite_students.png" - alt="Пригласить учеников" -/> - -<AnchorHeading type="h2" id="individually"> - Индивидуальные приглашения -</AnchorHeading> -Нажмите кнопку «Пригласить» в правом верхнем углу. Откроется окно со ссылками-приглашениями. -Скопируйте готовую ссылку или создайте новую. - -<Image - width={1368} - height={768} - src="/assets/markdown/work-beginning/7invitestudents.png" - alt="Индивидуальное приглашение" -/> - -Зарегистрировавшись по ссылке, пользователь сразу попадёт в список ваших учеников. - -<AnchorHeading type="h2" id="group"> - Приглашения в группу -</AnchorHeading> - -1. Нажмите кнопку «Создать группу» в правом верхнем углу. 2. Придумайте название для группы и - заполните описание. - -<Image - width={1368} - height={768} - src="/assets/markdown/work-beginning/8invitestudents.png" - alt="Создать группу" -/> - -3. Откройте кабинет группы и нажмите «Пригласить в группу». Скопируйте ссылку-приглашение и отправьте ученику. - -Зарегистрировавшись по ссылке, пользователь сразу попадает в группу. - -<Image - width={1368} - height={768} - src="/assets/markdown/work-beginning/9invitestudents.png" - alt="Пригласить в группу" -/> - -Если ученик уже занимается с вами на платформе индивидуально, а теперь вы хотите пригласить его в -группу, нажмите «Добавить ученика». Переход по общей ссылке-приглашению также сработает. diff --git a/apps/xi.support/markdown/work-beginning/signup.mdx b/apps/xi.support/markdown/work-beginning/signup.mdx deleted file mode 100644 index 35c4a40d..00000000 --- a/apps/xi.support/markdown/work-beginning/signup.mdx +++ /dev/null @@ -1,24 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="signup"> - Регистрация -</AnchorHeading> - -Чтобы использовать sovlium, нужно <Link href="https://app.sovlium.ru/signup">зарегистрироваться</Link>. - -- Придумайте имя пользователя — от 4 до 30 символов в нижнем регистре, латиницей, можно добавить цифры, точку, дефис. Имя должно быть уникальным. Пример: anna86. - -<Image - width={468} - height={616} - src="/assets/markdown/work-beginning/1signup.png" - alt="Регистрация на платформе" -/> - -- Укажите действующую электронную почту — туда мы отправим подтверждение регистрации. -- Придумайте пароль — от 6 до 100 символов, латиницей, прописные и строчные символы, цифры и специальные символы. -- Нажмите «Зарегистрироваться». -- Чтобы подтвердить почту, перейдите по ссылке в письме. - Если письмо долго не приходит, проверьте папку «Спам». Если письмо так не пришло или возникли другие проблемы — напишите нам, пожалуйста. diff --git a/apps/xi.support/markdown/work-beginning/welcome.mdx b/apps/xi.support/markdown/work-beginning/welcome.mdx deleted file mode 100644 index 447dac23..00000000 --- a/apps/xi.support/markdown/work-beginning/welcome.mdx +++ /dev/null @@ -1,33 +0,0 @@ -import Link from 'mdxComponents/Link'; -import AnchorHeading from 'mdxComponents/AnchorHeading'; -import Image from 'mdxComponents/Image'; - -<AnchorHeading type="h1" id="welcome"> - Настроить профиль -</AnchorHeading> - -Подтвердите почту и начните настройку аккаунта. - -Шаг 1. По желанию загрузите фото. - -Шаг 2. Укажите имя, которое будут видеть другие пользователи. Оно может быть неуникальным. Пример: Анна Иванова. - -Шаг 3. Нажмите «Продолжить». - -<Image - width={368} - height={516} - src="/assets/markdown/work-beginning/3welcome.png" - alt="Окно «Давайте познакомимся»" -/> - -Шаг 4. Выберите роль — ученик или репетитор. - -Шаг 5. По желанию добавьте мессенджер, чтобы получать уведомления о статусе оплаты, переносе занятий и будущих занятиях. Наш бот отправляет только служебные уведомления. - -<Image - width={368} - height={516} - src="/assets/markdown/work-beginning/5welcome.png" - alt="Настроить уведомления" -/> diff --git a/apps/xi.support/mdx-components.tsx b/apps/xi.support/mdx-components.tsx index e188f049..bb0679f8 100644 --- a/apps/xi.support/mdx-components.tsx +++ b/apps/xi.support/mdx-components.tsx @@ -1,45 +1,9 @@ import type { MDXComponents } from 'mdx/types'; -import { PropsWithChildren } from 'react'; +import defaultMdxComponents from 'fumadocs-ui/mdx'; -const H1 = ({ children }: PropsWithChildren) => ( - <h1 className="my-4 font-bold text-gray-100 text-[32px] 2xl:text-[36px]">{children}</h1> -); - -const H2 = ({ children }: PropsWithChildren) => ( - <h2 className="my-4 font-bold text-gray-100 text-[24px] 2xl:text-[28px]">{children}</h2> -); - -const H3 = ({ children }: PropsWithChildren) => ( - <h3 className="my-4 font-bold text-gray-100 text-[20px] 2xl:text-[24px]">{children}</h3> -); - -const P = ({ children }: PropsWithChildren) => <p className="my-4 text-gray-100">{children}</p>; - -const Li = ({ children }: PropsWithChildren) => ( - <li className="my-1 text-gray-100 text-[16px] 2xl:text-[20px]">{children}</li> -); - -const Ul = ({ children }: PropsWithChildren) => ( - <ul className="my-4 text-gray-100 text-[16px] 2xl:text-[20px] list-disc list-inside"> - {children} - </ul> -); - -const Ol = ({ children }: PropsWithChildren) => ( - <ol className="my-4 text-gray-100 text-[16px] 2xl:text-[20px] list-decimal list-inside"> - {children} - </ol> -); - -export function useMDXComponents(components: MDXComponents): MDXComponents { +export function getMDXComponents(components?: MDXComponents): MDXComponents { return { - h1: H1, - h2: H2, - h3: H3, - li: Li, - p: P, - ul: Ul, - ol: Ol, + ...defaultMdxComponents, ...components, }; } diff --git a/apps/xi.support/mdxComponents/AnchorHeading.tsx b/apps/xi.support/mdxComponents/AnchorHeading.tsx deleted file mode 100644 index 34e108e8..00000000 --- a/apps/xi.support/mdxComponents/AnchorHeading.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Link } from '@xipkg/link'; - -const classNames = { - h1: 'my-4 font-bold text-gray-100 text-[32px] 2xl:text-[36px]', - h2: 'my-4 font-bold text-gray-100 text-[24px] 2xl:text-[28px]', - h3: 'my-4 font-bold text-gray-100 text-[20px] 2xl:text-[24px]', -}; - -const AnchorHeading = ({ type = 'h1', id, children }) => ( - <h2 className="my-4" id={id}> - <Link className={classNames[type]} variant="hover" href={`#${id}`}> - {children} - </Link> - </h2> -); - -export default AnchorHeading; diff --git a/apps/xi.support/next.config.js b/apps/xi.support/next.config.mjs similarity index 75% rename from apps/xi.support/next.config.js rename to apps/xi.support/next.config.mjs index 597e13f9..f904a7c8 100644 --- a/apps/xi.support/next.config.js +++ b/apps/xi.support/next.config.mjs @@ -1,16 +1,14 @@ -// Не поддавайтесь соблазну использовать здесь import +import { createMDX } from 'fumadocs-mdx/next'; +import { fileURLToPath } from 'url'; +import path from 'path'; -/** @type {import('next').NextConfig} */ - -const path = require('path'); - -const withMDX = require('@next/mdx')(); - -const plugins = []; +const withMDX = createMDX(); -plugins.push(withMDX); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const nextConfig = { +/** @type {import('next').NextConfig} */ +const config = { + reactStrictMode: true, outputFileTracingRoot: path.join(__dirname, '../../'), transpilePackages: [ '@xipkg/typescript', @@ -24,7 +22,6 @@ const nextConfig = { compiler: { removeConsole: process.env.NODE_ENV !== 'development', }, - reactStrictMode: true, images: { unoptimized: true, remotePatterns: [ @@ -40,4 +37,4 @@ const nextConfig = { typescript: { ignoreBuildErrors: true }, }; -module.exports = () => plugins.reduce((acc, next) => next(acc), nextConfig); +export default withMDX(config); diff --git a/apps/xi.support/package.json b/apps/xi.support/package.json index e2fc6d91..838c3c9d 100644 --- a/apps/xi.support/package.json +++ b/apps/xi.support/package.json @@ -6,7 +6,8 @@ "dev": "next dev --port 3900", "build": "next build", "start": "next start", - "lint": "eslint \"**/*.{ts,tsx}\"" + "lint": "eslint \"**/*.{ts,tsx}\"", + "postinstall": "fumadocs-mdx" }, "dependencies": { "@hookform/resolvers": "^3.2.0", @@ -14,31 +15,35 @@ "@mdx-js/react": "^3.1.0", "@next/mdx": "16.1.4", "@types/mdx": "^2.0.13", - "@xipkg/tailwind": "0.8.1", + "@xipkg/button": "^4.0.0", "@xipkg/icons": "^2.7.2", "@xipkg/input": "^1.2.0", "@xipkg/link": "^2.0.12", - "@xipkg/button": "^4.0.0", - "pkg.landing.footer": "*", + "@xipkg/tailwind": "0.8.1", + "fumadocs-core": "^16.5.1", + "fumadocs-mdx": "^14.2.6", + "fumadocs-ui": "^16.5.1", "next": "16.1.6", + "pkg.landing.footer": "*", "react": "19.2.4", "react-dom": "19.2.4", "react-hook-form": "^7.45.2", "uuid": "^9.0.0", - "yup": "^1.2.0" + "yup": "^1.2.0", + "zod": "^4.3.6" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.11", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.17.0", + "@tailwindcss/postcss": "^4.1.11", "@types/node": "^20.3.1", "@types/react": "19.2.10", "@types/react-dom": "19.2.3", "@xipkg/eslint": "4.6.0", "@xipkg/typescript": "latest", "autoprefixer": "^10.4.20", - "eslint": "^9.17.0", "common.eslint": "*", + "eslint": "^9.17.0", "ignore-loader": "^0.1.2", "postcss": "^8.4.24", "tailwindcss": "^3.3.2", diff --git a/apps/xi.support/public/assets/markdown/conduct-lesson/14videocall.png b/apps/xi.support/public/assets/markdown/conduct-lesson/begin_videocall.png similarity index 100% rename from apps/xi.support/public/assets/markdown/conduct-lesson/14videocall.png rename to apps/xi.support/public/assets/markdown/conduct-lesson/begin_videocall.png diff --git a/apps/xi.support/public/assets/markdown/conduct-lesson/15board.png b/apps/xi.support/public/assets/markdown/conduct-lesson/online_board.png similarity index 100% rename from apps/xi.support/public/assets/markdown/conduct-lesson/15board.png rename to apps/xi.support/public/assets/markdown/conduct-lesson/online_board.png diff --git a/apps/xi.support/public/assets/markdown/control-payments/13diagrams.png b/apps/xi.support/public/assets/markdown/control-payments/analytics.png similarity index 100% rename from apps/xi.support/public/assets/markdown/control-payments/13diagrams.png rename to apps/xi.support/public/assets/markdown/control-payments/analytics.png diff --git a/apps/xi.support/public/assets/markdown/control-payments/11create_invoice.png b/apps/xi.support/public/assets/markdown/control-payments/create_invoice.png similarity index 100% rename from apps/xi.support/public/assets/markdown/control-payments/11create_invoice.png rename to apps/xi.support/public/assets/markdown/control-payments/create_invoice.png diff --git a/apps/xi.support/public/assets/markdown/control-payments/12analytics.png b/apps/xi.support/public/assets/markdown/control-payments/payment_journal.png similarity index 100% rename from apps/xi.support/public/assets/markdown/control-payments/12analytics.png rename to apps/xi.support/public/assets/markdown/control-payments/payment_journal.png diff --git a/apps/xi.support/public/assets/markdown/prepare-for-lesson/10reminders.png b/apps/xi.support/public/assets/markdown/prepare-for-lesson/set_reminders.png similarity index 100% rename from apps/xi.support/public/assets/markdown/prepare-for-lesson/10reminders.png rename to apps/xi.support/public/assets/markdown/prepare-for-lesson/set_reminders.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/8invitestudents.png b/apps/xi.support/public/assets/markdown/work-beginning/create_group.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/8invitestudents.png rename to apps/xi.support/public/assets/markdown/work-beginning/create_group.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/9invitestudents.png b/apps/xi.support/public/assets/markdown/work-beginning/invite_group.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/9invitestudents.png rename to apps/xi.support/public/assets/markdown/work-beginning/invite_group.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/7invitestudents.png b/apps/xi.support/public/assets/markdown/work-beginning/invite_individual.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/7invitestudents.png rename to apps/xi.support/public/assets/markdown/work-beginning/invite_individual.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/6invite_students.png b/apps/xi.support/public/assets/markdown/work-beginning/invite_students.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/6invite_students.png rename to apps/xi.support/public/assets/markdown/work-beginning/invite_students.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/5welcome.png b/apps/xi.support/public/assets/markdown/work-beginning/setup_notifications.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/5welcome.png rename to apps/xi.support/public/assets/markdown/work-beginning/setup_notifications.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/3welcome.png b/apps/xi.support/public/assets/markdown/work-beginning/setup_profile.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/3welcome.png rename to apps/xi.support/public/assets/markdown/work-beginning/setup_profile.png diff --git a/apps/xi.support/public/assets/markdown/work-beginning/1signup.png b/apps/xi.support/public/assets/markdown/work-beginning/signup.png similarity index 100% rename from apps/xi.support/public/assets/markdown/work-beginning/1signup.png rename to apps/xi.support/public/assets/markdown/work-beginning/signup.png diff --git a/apps/xi.support/source.config.ts b/apps/xi.support/source.config.ts new file mode 100644 index 00000000..ef596dd2 --- /dev/null +++ b/apps/xi.support/source.config.ts @@ -0,0 +1,29 @@ +import { defineConfig, defineDocs, metaSchema } from 'fumadocs-mdx/config'; +import lastModified from 'fumadocs-mdx/plugins/last-modified'; +import { z } from 'zod/v4'; + +const frontmatterSchema = z.object({ + title: z.string(), + description: z.string().optional(), + updateDate: z.string().optional(), +}); + +export const docs = defineDocs({ + dir: 'content/docs', + docs: { + schema: frontmatterSchema.extend({ + updateDate: z.string().optional(), + }), + postprocess: { + includeProcessedMarkdown: true, + }, + }, + meta: { + schema: metaSchema, + }, +}); + +export default defineConfig({ + mdxOptions: {}, + plugins: [lastModified()], +}); diff --git a/apps/xi.support/tsconfig.json b/apps/xi.support/tsconfig.json index 44737408..08198c4d 100644 --- a/apps/xi.support/tsconfig.json +++ b/apps/xi.support/tsconfig.json @@ -7,7 +7,12 @@ { "name": "next" } - ] + ], + "paths": { + "@/*": ["./*"], + "fumadocs-mdx:collections/*": [".source/*"] + }, + "moduleResolution": "bundler" }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] diff --git a/package-lock.json b/package-lock.json index cace00cf..b3166d40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,6 +93,7 @@ }, "apps/xi.support": { "version": "1.0.0", + "hasInstallScript": true, "license": "ISC", "dependencies": { "@hookform/resolvers": "^3.2.0", @@ -105,13 +106,17 @@ "@xipkg/input": "^1.2.0", "@xipkg/link": "^2.0.12", "@xipkg/tailwind": "0.8.1", + "fumadocs-core": "^16.5.1", + "fumadocs-mdx": "^14.2.6", + "fumadocs-ui": "^16.5.1", "next": "16.1.6", "pkg.landing.footer": "*", "react": "19.2.4", "react-dom": "19.2.4", "react-hook-form": "^7.45.2", "uuid": "^9.0.0", - "yup": "^1.2.0" + "yup": "^1.2.0", + "zod": "^4.3.6" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -182,6 +187,15 @@ "node": ">=14.0.0" } }, + "apps/xi.support/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "apps/xi.vacancy": { "version": "1.0.0", "license": "ISC", @@ -899,27 +913,443 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1109,6 +1539,55 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" }, + "node_modules/@formatjs/fast-memoize": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.0.tgz", + "integrity": "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.1.tgz", + "integrity": "sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "3.1.0", + "tslib": "^2.8.1" + } + }, + "node_modules/@fumadocs/tailwind": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.0.1.tgz", + "integrity": "sha512-ZUoDIIqfXibEV3rftBVcBxUfQsmjWzO9ZCMnB6CAHp9JmVLjE8LNaeUGeZfwnaHUEeX+h66HaDCRGtsZN0JuAA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.1" + }, + "peerDependencies": { + "tailwindcss": "^4.0.0" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@fumadocs/tailwind/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@gsap/react": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@gsap/react/-/react-2.1.2.tgz", @@ -2001,6 +2480,15 @@ "node": ">=12.4.0" } }, + "node_modules/@orama/orama": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz", + "integrity": "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20.0.0" + } + }, "node_modules/@pkgr/core": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", @@ -3029,6 +3517,161 @@ } } }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", @@ -3782,15 +4425,112 @@ } } }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/rehype": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.22.0.tgz", + "integrity": "sha512-69b2VPc6XBy/VmAJlpBU5By+bJSBdE2nvgRCZXav7zujbrjXuT0F60DIrjKuutjPqNufuizE+E8tIZr2Yn8Z+g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@types/hast": "^3.0.4", + "hast-util-to-string": "^3.0.1", + "shiki": "3.22.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.22.0.tgz", + "integrity": "sha512-E7eRV7mwDBjueLF6852n2oYeJYxBq3NSsDk+uyruYAXONv4U8holGmIrT+mPRJQ1J1SNOH6L8G19KRzmBawrFw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } }, - "node_modules/@rtsao/scc": { + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" }, "node_modules/@standard-schema/utils": { "version": "0.3.0", @@ -4299,7 +5039,8 @@ "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -5264,8 +6005,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { "version": "1.2.6", @@ -6075,6 +6815,12 @@ "dot-prop": "^5.1.0" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6231,7 +6977,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6803,6 +7548,47 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -7597,6 +8383,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, "node_modules/estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", @@ -7871,81 +8669,447 @@ "engines": { "node": ">= 0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.33.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.33.0.tgz", + "integrity": "sha512-ca8d+rRPcDP5iIF+MoT3WNc0KHJMjIyFAbtVLvM9eA7joGSpeqDfiNH/kCs1t4CHi04njYvWyj0jS4QlEK/rJQ==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.33.0", + "motion-utils": "^12.29.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fumadocs-core": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.5.1.tgz", + "integrity": "sha512-6jvt7hBHh8H9uOKQ8uIzIkvpswPN8WxC+yGis9/vExJ8lSowINhN1zIbPgp0kMD5runU+2+l4qj5k7QwOTVe1g==", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "^0.8.0", + "@orama/orama": "^3.1.18", + "@shikijs/rehype": "^3.21.0", + "@shikijs/transformers": "^3.21.0", + "estree-util-value-to-estree": "^3.5.0", + "github-slugger": "^2.0.0", + "hast-util-to-estree": "^3.1.3", + "hast-util-to-jsx-runtime": "^2.3.6", + "image-size": "^2.0.2", + "negotiator": "^1.0.0", + "npm-to-yarn": "^3.0.1", + "path-to-regexp": "^8.3.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "scroll-into-view-if-needed": "^3.1.0", + "shiki": "^3.21.0", + "tinyglobby": "^0.2.15", + "unist-util-visit": "^5.1.0" + }, + "peerDependencies": { + "@mixedbread/sdk": "^0.46.0", + "@orama/core": "1.x.x", + "@oramacloud/client": "2.x.x", + "@tanstack/react-router": "1.x.x", + "@types/react": "*", + "algoliasearch": "5.x.x", + "lucide-react": "*", + "next": "16.x.x", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router": "7.x.x", + "waku": "^0.26.0 || ^0.27.0", + "zod": "4.x.x" + }, + "peerDependenciesMeta": { + "@mixedbread/sdk": { + "optional": true + }, + "@orama/core": { + "optional": true + }, + "@oramacloud/client": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "algoliasearch": { + "optional": true + }, + "lucide-react": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-router": { + "optional": true + }, + "waku": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/fumadocs-mdx": { + "version": "14.2.6", + "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-14.2.6.tgz", + "integrity": "sha512-T8i5IllZ6OGaZ3/4Wwjl1zovvypSsr6Cco9ZACvoABLqpqTQ2TDfrW1nBt1o9YUKyfzkwDnjKdrnrq/nDexfcg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.1.1", + "@standard-schema/spec": "^1.1.0", + "chokidar": "^5.0.0", + "esbuild": "^0.27.2", + "estree-util-value-to-estree": "^3.5.0", + "js-yaml": "^4.1.1", + "mdast-util-to-markdown": "^2.1.2", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", + "remark-mdx": "^3.1.1", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "zod": "^4.3.5" + }, + "bin": { + "fumadocs-mdx": "dist/bin.js" + }, + "peerDependencies": { + "@fumadocs/mdx-remote": "^1.4.0", + "@types/react": "*", + "fumadocs-core": "^15.0.0 || ^16.0.0", + "next": "^15.3.0 || ^16.0.0", + "react": "*", + "vite": "6.x.x || 7.x.x" + }, + "peerDependenciesMeta": { + "@fumadocs/mdx-remote": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/fumadocs-mdx/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/fumadocs-mdx/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/fumadocs-mdx/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/fumadocs-mdx/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/fumadocs-ui": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.5.1.tgz", + "integrity": "sha512-c+9BrSZ9GSmhQ2vhL+aophnn+qoEBB7PavyiNoNAFKHQswRjDhqhEuocLJJZB8n5MTbC15ZQ6AECg9OB5hDPTA==", + "license": "MIT", + "dependencies": { + "@fumadocs/tailwind": "0.0.1", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-direction": "^1.1.1", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-presence": "^1.1.5", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "lucide-react": "^0.563.0", + "motion": "^12.30.1", + "next-themes": "^0.4.6", + "react-medium-image-zoom": "^5.4.0", + "react-remove-scroll": "^2.7.2", + "scroll-into-view-if-needed": "^3.1.0", + "tailwind-merge": "^3.4.0" + }, + "peerDependencies": { + "@types/react": "*", + "fumadocs-core": "16.5.1", + "next": "16.x.x", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "tailwindcss": "^4.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "next": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/fumadocs-ui/node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "engines": { - "node": "*" + "node_modules/fumadocs-ui/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/framer-motion": { - "version": "12.25.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.25.0.tgz", - "integrity": "sha512-mlWqd0rApIjeyhTCSNCqPYsUAEhkcUukZxH3ke6KbstBRPcxhEpuIjmiUQvB+1E9xkEm5SpNHBgHCapH/QHTWg==", + "node_modules/fumadocs-ui/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", "dependencies": { - "motion-dom": "^12.24.11", - "motion-utils": "^12.24.10", - "tslib": "^2.4.0" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { + "@types/react": { "optional": true }, - "react-dom": { + "@types/react-dom": { "optional": true } } }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "node_modules/fumadocs-ui/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@radix-ui/react-compose-refs": "1.1.2" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/fumadocs-ui/node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node_modules/fumadocs-ui/node_modules/lucide-react": { + "version": "0.563.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz", + "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/function-bind": { @@ -8122,6 +9286,12 @@ "node": ">=16" } }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8419,6 +9589,29 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -8445,6 +9638,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -8487,6 +9693,16 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -8588,6 +9804,18 @@ "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA==", "dev": true }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -9358,7 +10586,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -11072,11 +12299,12 @@ } }, "node_modules/motion": { - "version": "12.25.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.25.0.tgz", - "integrity": "sha512-jBFohEYklpZ+TL64zv03sHdqr1Tsc8/yDy7u68hVzi7hTJYtv53AduchqCiY3aWi4vY1hweS8DWtgCuckusYdQ==", + "version": "12.33.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.33.0.tgz", + "integrity": "sha512-TcND7PijsrTeIA9SRVUB8TOJQ+6mJnJ5K4a9oAJZvyI0Zy47Gq5oofU+VkTxbLcvDoKXnHspQcII2mnk3TbFsQ==", + "license": "MIT", "dependencies": { - "framer-motion": "^12.25.0", + "framer-motion": "^12.33.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -11097,17 +12325,19 @@ } }, "node_modules/motion-dom": { - "version": "12.24.11", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.24.11.tgz", - "integrity": "sha512-DlWOmsXMJrV8lzZyd+LKjG2CXULUs++bkq8GZ2Sr0R0RRhs30K2wtY+LKiTjhmJU3W61HK+rB0GLz6XmPvTA1A==", + "version": "12.33.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.33.0.tgz", + "integrity": "sha512-XRPebVypsl0UM+7v0Hr8o9UAj0S2djsQWRdHBd5iVouVpMrQqAI0C/rDAT3QaYnXnHuC5hMcwDHCboNeyYjPoQ==", + "license": "MIT", "dependencies": { - "motion-utils": "^12.24.10" + "motion-utils": "^12.29.2" } }, "node_modules/motion-utils": { - "version": "12.24.10", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.24.10.tgz", - "integrity": "sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==" + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", + "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "license": "MIT" }, "node_modules/mrmime": { "version": "2.0.1", @@ -11175,6 +12405,15 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -11243,6 +12482,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -11385,6 +12634,18 @@ "node": ">=8" } }, + "node_modules/npm-to-yarn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.0.1.tgz", + "integrity": "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11525,6 +12786,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -11797,6 +13075,16 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -12303,6 +13591,22 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-medium-image-zoom": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-5.4.0.tgz", + "integrity": "sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/rpearce" + } + ], + "license": "BSD-3-Clause", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-remove-scroll": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", @@ -12500,6 +13804,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -12555,6 +13883,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -12842,6 +14186,15 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -12971,6 +14324,22 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -13558,7 +14927,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, "engines": { "node": ">=18" } @@ -14079,6 +15447,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -14092,9 +15474,10 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -14267,8 +15650,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "9.0.1", From 4baa93394a6c24536887e51b723cc1525acd1acb Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Sun, 15 Feb 2026 17:32:15 +0300 Subject: [PATCH 2/8] feat(104): add pages order, add cards, style footer, simplify config --- apps/xi.support/components/CallToAction.tsx | 6 +- apps/xi.support/components/Card.tsx | 24 +++ .../components/DocsHomeSections.tsx | 26 ---- apps/xi.support/components/Footer.tsx | 85 ++++++++++- apps/xi.support/components/HomePage.tsx | 23 +++ apps/xi.support/config/sectionsConfig.ts | 142 +----------------- apps/xi.support/content/docs/index.mdx | 9 +- apps/xi.support/content/docs/meta.json | 4 + 8 files changed, 142 insertions(+), 177 deletions(-) create mode 100644 apps/xi.support/components/Card.tsx delete mode 100644 apps/xi.support/components/DocsHomeSections.tsx create mode 100644 apps/xi.support/components/HomePage.tsx create mode 100644 apps/xi.support/content/docs/meta.json diff --git a/apps/xi.support/components/CallToAction.tsx b/apps/xi.support/components/CallToAction.tsx index 599407f9..125b8710 100644 --- a/apps/xi.support/components/CallToAction.tsx +++ b/apps/xi.support/components/CallToAction.tsx @@ -3,12 +3,12 @@ import { TelegramFilled } from '@xipkg/icons'; import NextLink from 'next/link'; export const CallToAction = () => ( - <section className="flex flex-col justify-center items-center py-16 px-8 sm:py-8 max-w-[1920px] gap-8"> - <h3 className="font-medium text-2xl sm:text-h3 xl:text-h2 leading-[31.2px] sm:leading-[52px] xl:leading-[83.2px] text-gray-100 dark:text-gray-0 mt-0 mb-0"> + <section className="flex flex-col justify-center items-center max-w-[1920px] gap-8"> + <h3 className="font-medium text-2xl sm:text-h3 xl:text-h6 text-gray-100 dark:text-gray-0 mt-0 mb-0"> Не нашлось ответа? </h3> <Button - className="h-8 sm:h-14 xl:h-[84px] font-medium text-sm sm:text-xl xl:text-[30px] xl:leading-[42px] rounded-md sm:rounded-xl xl:rounded-[18px] pl-3 sm:pl-6 xl:pl-9 pr-2 sm:pr-3 xl:pr-[18px]" + className="h-8 sm:h-14 font-medium text-sm sm:text-xl xl:text-2xl rounded-md sm:rounded-xl xl:rounded-[18px] px-8 py-8" asChild > <NextLink href="https://t.me/sovlium_support_bot" target="_blank" rel="noopener noreferrer"> diff --git a/apps/xi.support/components/Card.tsx b/apps/xi.support/components/Card.tsx new file mode 100644 index 00000000..69a9621f --- /dev/null +++ b/apps/xi.support/components/Card.tsx @@ -0,0 +1,24 @@ +import { Link } from '@xipkg/link'; + +interface CardProps { + title: string; + href: string; + description: string; +} + +export const Card = ({ title, href, description }: CardProps) => { + return ( + <Link + href={href} + className={`flex flex-col gap-2 + no-underline p-4 h-full rounded-[18px] + border border-gray-10 dark:border-gray-80 shadow-xs + bg-gray-5 hover:bg-gray-10 + dark:bg-gray-90 dark:hover:bg-gray-100 + transition-all duration-300 ease-in-out`} + > + <p className="mt-0 mb-0 font-medium text-lg text-brand-80 dark:text-brand-60">{title}</p> + <p className="mt-0 mb-0 text-sm text-gray-80 dark:text-gray-20">{description}</p> + </Link> + ); +}; diff --git a/apps/xi.support/components/DocsHomeSections.tsx b/apps/xi.support/components/DocsHomeSections.tsx deleted file mode 100644 index dbbac636..00000000 --- a/apps/xi.support/components/DocsHomeSections.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { sectionsConfig } from '@/config/sectionsConfig'; -import SectionList from './SectionList'; -import { Link } from '@xipkg/link'; -import { Footer } from './Footer'; -import { CallToAction } from './CallToAction'; - -export default function DocsHomeSections() { - return ( - <div className="w-full flex justify-center items-center flex-col z-10 gap-20"> - {sectionsConfig.map((sectionItem) => ( - <section key={sectionItem.pageUrl} className="flex flex-col gap-5 w-full"> - <Link - variant="hover" - href={`/${sectionItem.pageUrl}`} - className="font-medium text-2xl text-brand-100 no-underline hover:underline" - > - {sectionItem.title} - </Link> - <SectionList sections={sectionItem.links} sectionName={sectionItem.pageUrl} /> - </section> - ))} - <CallToAction /> - <Footer /> - </div> - ); -} diff --git a/apps/xi.support/components/Footer.tsx b/apps/xi.support/components/Footer.tsx index d9c8de37..d06c9e9e 100644 --- a/apps/xi.support/components/Footer.tsx +++ b/apps/xi.support/components/Footer.tsx @@ -1,4 +1,5 @@ -import { Footer as FooterPkg } from 'pkg.landing.footer'; +import { Link } from '@xipkg/link'; +import Image from 'next/image'; interface SectionLink { link: string; @@ -44,11 +45,81 @@ const sections: Section[] = [ }, ]; +const email = 'support@sovlium.ru'; + +const renderSection = (section: Section) => ( + <div key={section.title} className="xs:gap-6 flex flex-col gap-4"> + <p className="text-gray-60 text-m-base xs:text-lg mb-0 mt-0">{section.title}</p> + <ul className="flex flex-col gap-6 mb-0 mt-0 pl-0"> + {section.links.map((link, index) => ( + <li key={index} className="mb-0 mt-0 list-none"> + <Link + className="no-underline text-m-base text-gray-0 hover:text-gray-0 hover:decoration-gray-0" + variant="hover" + href={link.link} + size="l" + > + {link.title} + </Link> + </li> + ))} + </ul> + </div> +); + +const SvgColumn = () => ( + <svg + width="300" + height="243" + viewBox="0 0 365 295" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M228.997 230.083C230.019 226.273 233.942 224.011 237.753 225.032C241.563 226.054 243.825 229.977 242.804 233.788L203.971 378.704C202.949 382.514 199.033 384.776 195.222 383.755C191.411 382.734 189.15 378.817 190.171 375.006L228.997 230.083ZM124.198 124.342C125.219 120.533 129.137 118.272 132.947 119.291L236.462 147.031L237.16 147.254C240.544 148.54 242.471 152.207 241.513 155.78C240.556 159.351 237.056 161.562 233.483 160.985L232.764 160.831L212.057 155.278L155.663 365.762C154.641 369.571 150.725 371.834 146.914 370.813C143.104 369.792 140.844 365.874 141.863 362.064L198.257 151.587L163.749 142.336L107.363 352.813L107.132 353.51C105.847 356.896 102.18 358.821 98.6067 357.864C94.7975 356.841 92.5345 352.925 93.5555 349.115L149.949 138.638L129.249 133.091C125.44 132.069 123.177 128.152 124.198 124.342ZM80.6344 190.329C81.6566 186.519 85.5729 184.257 89.3833 185.278C93.1931 186.299 95.454 190.217 94.4345 194.027L55.6015 338.95C54.5791 342.759 50.6629 345.022 46.8525 344.001C43.0422 342.98 40.7819 339.062 41.8013 335.252L80.6344 190.329ZM64.2876 43.2714C70.0779 43.3528 73.746 44.601 79.225 46.0691L319.675 110.151C324.436 111.427 328.96 112.376 334.019 115.203C339.688 118.37 345.89 123.139 351.224 129.728C362.105 143.172 368.86 163.571 361.354 191.585C353.582 220.59 331.679 234.933 308.965 236.753C286.723 238.535 263.182 228.308 251.797 208.085C244.185 194.564 246.414 177.444 254.26 164.689C262.255 151.692 276.908 141.887 295.402 144.394C314.329 146.959 323.458 161.455 324.614 175.455C325.703 188.638 319.706 204.56 305.093 208.741L304.382 208.909C300.817 209.549 297.278 207.393 296.261 203.836C295.176 200.043 297.372 196.089 301.165 195.004L302.163 194.648C307.125 192.542 311.116 185.603 310.375 176.627C309.65 167.87 304.43 160.033 293.484 158.55C281.704 156.953 272.103 162.962 266.435 172.175C260.617 181.633 259.774 193.121 264.251 201.074C272.48 215.691 290.22 223.923 307.821 222.513C324.952 221.141 341.458 210.637 347.554 187.887C353.914 164.148 348.031 148.491 340.117 138.715C336.053 133.695 331.314 130.06 327.049 127.677C323.803 125.864 320.142 125.059 316.577 124.119L74.9622 59.7158C71.2197 58.7467 68.0725 57.616 64.0853 57.5599C59.2008 57.4915 53.2792 58.2722 47.2502 60.5879C35.5085 65.0984 22.585 75.7169 16.2242 99.4559C10.1297 122.204 19.1757 139.552 33.3244 149.305C47.863 159.326 67.3439 161.066 81.7786 152.522C89.6306 147.872 94.6461 137.505 94.3369 126.407C94.0354 115.594 88.7232 105.59 77.725 101.081C67.5034 96.8929 59.0581 101.067 54.0526 108.289C48.9238 115.689 48.9132 123.692 52.1549 127.998L52.8456 128.807L53.327 129.359C55.5687 132.202 55.3351 136.338 52.6782 138.91C50.019 141.481 45.8731 141.58 43.1059 139.245L42.5757 138.742L41.6199 137.703C32.1831 126.773 35.0107 110.687 42.3106 100.154C50.3117 88.608 65.466 80.6184 83.139 87.8604C100.408 94.937 108.193 110.756 108.618 126.01C109.035 140.978 102.408 156.918 89.0554 164.822C69.0847 176.643 43.5822 173.733 25.2104 161.068C6.45007 148.135 -5.34668 124.762 2.424 95.7581C9.9308 67.7424 25.9833 53.4497 42.1292 47.2482C50.0433 44.2085 57.7952 43.1801 64.2876 43.2714ZM52.5456 5.29644C53.503 1.72357 57.0086 -0.487021 60.5829 0.0917197L61.3015 0.24521L354.587 78.8323L355.278 79.0556C358.664 80.3405 360.596 84.0074 359.638 87.5813C358.68 91.1542 355.175 93.3654 351.601 92.786L350.889 92.6325L57.6038 14.0454L56.9061 13.8221C53.5203 12.537 51.5887 8.86975 52.5456 5.29644Z" + fill="#26262A" + /> + </svg> +); + export const Footer = () => ( - <FooterPkg - topContent={<></>} - sections={sections} - logoPath="/logofordark.svg" - classNameFooter="bg-gray-100 p-0" - /> + <footer className="z-10 flex rounded-t-[32px] bg-gray-100 xl:rounded-t-[64px] 2xl:justify-center"> + <div className="text-gray-0 relative flex w-full flex-col gap-8 xl:flex-row xl:justify-between px-4 py-8"> + <div className="absolute bottom-0 left-0"> + <SvgColumn /> + </div> + <div className="relative"> + <Link href="/" className="mt-0 mb-0"> + <Image + alt="sovlium logo" + src={'/logofordark.svg'} + className="mt-0 mb-0" + width={216} + height={64} + priority={false} + /> + </Link> + </div> + <div className="z-5 flex flex-col gap-8 xl:gap-16"> + <div className="xs:grid-cols-2 xs:gap-y-10 gap-0 grid grid-cols-1 md:grid-cols-4 2xl:grid-cols-[repeat(4,minmax(0,240px))] xl:justify-end "> + {sections.map(renderSection)} + </div> + <div className="text-xs-base xl:text-m-base xl:text-gray-0 text-gray-60 xs:gap-x-8 flex flex-wrap gap-x-4 gap-y-2"> + <span className="">© sovlium с 2025 года</span> + <span className="xs:order-1"> + <Link + className="text-gray-60 xl:text-gray-0 hover:text-gray-0 hover:decoration-gray-0 xl:text-[16px]" + target="_blank" + variant="hover" + href={`mailto:${email}`} + size="s" + > + {email} + </Link> + </span> + <span className="">Сделано с ♥ в России</span> + </div> + </div> + </div> + </footer> ); diff --git a/apps/xi.support/components/HomePage.tsx b/apps/xi.support/components/HomePage.tsx new file mode 100644 index 00000000..44e47a8f --- /dev/null +++ b/apps/xi.support/components/HomePage.tsx @@ -0,0 +1,23 @@ +import { sectionsConfig } from '@/config/sectionsConfig'; +import { Footer } from './Footer'; +import { CallToAction } from './CallToAction'; +import { Card } from './Card'; + +export default function HomePage() { + return ( + <div className="w-full flex justify-center items-center flex-col z-10 gap-12"> + <div className="w-full grid grid-cols-2 justify-center items-center z-10 gap-5"> + {sectionsConfig.map((sectionItem) => ( + <Card + key={sectionItem.pageUrl} + title={sectionItem.title} + href={`/${sectionItem.pageUrl}`} + description={sectionItem.description} + /> + ))} + </div> + <CallToAction /> + <Footer /> + </div> + ); +} diff --git a/apps/xi.support/config/sectionsConfig.ts b/apps/xi.support/config/sectionsConfig.ts index bde76c73..9c5e1724 100644 --- a/apps/xi.support/config/sectionsConfig.ts +++ b/apps/xi.support/config/sectionsConfig.ts @@ -1,157 +1,29 @@ export const sectionsConfig = [ { title: 'Начало работы', + description: + 'Зарегистрируйтесь на платформе, настройте профиль и уведомления. Приглашайте учеников по ссылке и создавайте группы — у каждого будет свой кабинет.', pageUrl: 'work-beginning', icon: 'start-working.svg', - links: [ - { - pageTitle: 'Регистрация', - pageUrl: 'регистрация', - items: [ - { - title: 'Регистрация', - image: 'signup.png', - link: 'регистрация', - }, - ], - }, - { - pageTitle: 'Настройка профиля после регистрации', - pageUrl: 'настройка-профиля-после-регистрации', - items: [ - { - title: 'Настроить профиль', - image: 'setup_profile.png', - link: 'настроить-профиль', - }, - { - title: 'Настроить уведомления', - image: 'setup_notifications.png', - link: 'настроить-уведомления', - }, - ], - }, - { - pageTitle: 'Пригласить учеников', - pageUrl: 'пригласить-учеников', - items: [ - { - title: 'Пригласить учеников', - image: 'invite_students.png', - description: '', - link: 'пригласить-учеников', - }, - { - title: 'Индивидуальное приглашение', - image: 'invite_individual.png', - description: '', - link: 'индивидуальное-приглашение', - }, - { - title: 'Создать группу', - image: 'create_group.png', - description: '', - link: 'пригласить-учеников', - }, - { - title: 'Пригласить в группу', - image: 'invite_group.png', - description: '', - link: 'приглашение-в-группу', - }, - ], - }, - ], }, { title: 'Подготовка к занятию', + description: + 'Назначайте занятия, готовьте материалы, заметки и файлы и настраивайте напоминания о уроках.', pageUrl: 'prepare-for-lesson', - links: [ - { - pageTitle: 'Назначить занятие', - pageUrl: 'назначить-занятие', - items: [ - { - title: 'Назначить занятие', - image: '', - link: 'назначить-занятие', - }, - ], - }, - { - pageTitle: 'Подготовить материалы', - pageUrl: 'подготовить-материалы', - items: [ - { - title: 'Подготовить материалы', - image: '', - link: 'подготовить-материалы', - }, - ], - }, - { - pageTitle: 'Настроить напоминания', - pageUrl: 'настроить-напоминания', - items: [ - { - title: 'Настроить напоминания', - image: 'set_reminders.png', - link: 'настроить-напоминания', - }, - ], - }, - ], icon: 'schedule.svg', }, { title: 'Проведение занятия', + description: 'Запускайте видеозвонок, демонстрируйте экран и работайте на общей онлайн-доске.', pageUrl: 'conduct-lesson', icon: 'video.svg', - links: [ - { - pageTitle: 'Начать видеозвонок', - pageUrl: 'начать-видеозвонок', - items: [ - { - title: 'Начать видеозвонок', - image: 'begin_videocall.png', - link: 'начать-видеозвонок', - }, - { - title: 'Онлайн-доска', - image: 'online_board.png', - link: 'онлайн-доска', - }, - ], - }, - ], }, { title: 'Контроль оплат', + description: + 'Создавайте счета для учеников, отслеживайте оплаты в журнале и анализируйте доходы по месяцам и предметам.', pageUrl: 'control-payments', icon: 'settings.svg', - links: [ - { - pageTitle: 'Контролировать оплату', - pageUrl: 'контролировать-оплату', - items: [ - { - title: 'Создать счёт', - image: 'create_invoice.png', - link: 'как-создать-счёт', - }, - { - title: 'Журнал оплат', - image: 'payment_journal.png', - link: 'журнал-оплат', - }, - { - title: 'Аналитика', - image: 'analytics.png', - link: 'аналитика', - }, - ], - }, - ], }, ]; diff --git a/apps/xi.support/content/docs/index.mdx b/apps/xi.support/content/docs/index.mdx index 4af2d3e9..10201d49 100644 --- a/apps/xi.support/content/docs/index.mdx +++ b/apps/xi.support/content/docs/index.mdx @@ -1,11 +1,8 @@ --- -title: Главная +title: База знаний sovlium updateDate: '13.01.2026' --- -import Link from '../mdxComponents/Link'; -import Image from '../mdxComponents/Image'; +import HomePage from '../../components/HomePage'; -import DocsHomeSections from '../../components/DocsHomeSections'; - -<DocsHomeSections /> +<HomePage /> diff --git a/apps/xi.support/content/docs/meta.json b/apps/xi.support/content/docs/meta.json new file mode 100644 index 00000000..80e9cb51 --- /dev/null +++ b/apps/xi.support/content/docs/meta.json @@ -0,0 +1,4 @@ +{ + "title": "База знаний", + "pages": ["index", "work-beginning", "prepare-for-lesson", "conduct-lesson", "control-payments"] +} From 4f34d0c272e0016685660d0c0f63f57b75e42c69 Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:10:49 +0300 Subject: [PATCH 3/8] feat(104): improve styles --- apps/xi.support/components/CallToAction.tsx | 14 +++-- apps/xi.support/components/Footer.tsx | 6 +-- apps/xi.support/components/HomePage.tsx | 17 +++--- apps/xi.support/components/SectionList.tsx | 57 --------------------- apps/xi.support/config/sectionsConfig.ts | 2 +- apps/xi.support/content/docs/index.mdx | 2 +- 6 files changed, 22 insertions(+), 76 deletions(-) delete mode 100644 apps/xi.support/components/SectionList.tsx diff --git a/apps/xi.support/components/CallToAction.tsx b/apps/xi.support/components/CallToAction.tsx index 125b8710..1d306546 100644 --- a/apps/xi.support/components/CallToAction.tsx +++ b/apps/xi.support/components/CallToAction.tsx @@ -4,14 +4,22 @@ import NextLink from 'next/link'; export const CallToAction = () => ( <section className="flex flex-col justify-center items-center max-w-[1920px] gap-8"> - <h3 className="font-medium text-2xl sm:text-h3 xl:text-h6 text-gray-100 dark:text-gray-0 mt-0 mb-0"> + <h3 className="font-medium text-2xl md:text-h6 text-gray-100 dark:text-gray-0 mt-0 mb-0"> Не нашлось ответа? </h3> <Button - className="h-8 sm:h-14 font-medium text-sm sm:text-xl xl:text-2xl rounded-md sm:rounded-xl xl:rounded-[18px] px-8 py-8" + className={`font-medium hover:bg-brand-80 + text-m-base md:text-lg xl:text-2xl text-gray-0 + rounded-md sm:rounded-xl xl:rounded-[18px] + p-6 md:p-8`} asChild > - <NextLink href="https://t.me/sovlium_support_bot" target="_blank" rel="noopener noreferrer"> + <NextLink + href="https://t.me/sovlium_support_bot" + target="_blank" + rel="noopener noreferrer" + className="no-underline" + > Написать в телеграм <TelegramFilled className="fill-gray-0 size-4! sm:size-8! xl:size-12! ml-1.5 sm:ml-4 xl:ml-6!" /> </NextLink> diff --git a/apps/xi.support/components/Footer.tsx b/apps/xi.support/components/Footer.tsx index d06c9e9e..f20c6a07 100644 --- a/apps/xi.support/components/Footer.tsx +++ b/apps/xi.support/components/Footer.tsx @@ -83,7 +83,7 @@ const SvgColumn = () => ( ); export const Footer = () => ( - <footer className="z-10 flex rounded-t-[32px] bg-gray-100 xl:rounded-t-[64px] 2xl:justify-center"> + <footer className="w-full flex rounded-t-[32px] bg-gray-100 xl:rounded-t-[64px] 2xl:justify-center"> <div className="text-gray-0 relative flex w-full flex-col gap-8 xl:flex-row xl:justify-between px-4 py-8"> <div className="absolute bottom-0 left-0"> <SvgColumn /> @@ -101,10 +101,10 @@ export const Footer = () => ( </Link> </div> <div className="z-5 flex flex-col gap-8 xl:gap-16"> - <div className="xs:grid-cols-2 xs:gap-y-10 gap-0 grid grid-cols-1 md:grid-cols-4 2xl:grid-cols-[repeat(4,minmax(0,240px))] xl:justify-end "> + <div className="grid grid-cols-1 xs:grid-cols-2 md:grid-cols-4 2xl:grid-cols-[repeat(4,minmax(0,240px))] gap-y-10 xl:justify-end "> {sections.map(renderSection)} </div> - <div className="text-xs-base xl:text-m-base xl:text-gray-0 text-gray-60 xs:gap-x-8 flex flex-wrap gap-x-4 gap-y-2"> + <div className="text-xs-base xl:text-m-base xl:text-gray-0 text-gray-60 xs:gap-x-8 flex flex-wrap justify-between gap-x-4 gap-y-2"> <span className="">© sovlium с 2025 года</span> <span className="xs:order-1"> <Link diff --git a/apps/xi.support/components/HomePage.tsx b/apps/xi.support/components/HomePage.tsx index 44e47a8f..80c1c9a8 100644 --- a/apps/xi.support/components/HomePage.tsx +++ b/apps/xi.support/components/HomePage.tsx @@ -3,21 +3,16 @@ import { Footer } from './Footer'; import { CallToAction } from './CallToAction'; import { Card } from './Card'; -export default function HomePage() { +export const HomePage = () => { return ( - <div className="w-full flex justify-center items-center flex-col z-10 gap-12"> - <div className="w-full grid grid-cols-2 justify-center items-center z-10 gap-5"> - {sectionsConfig.map((sectionItem) => ( - <Card - key={sectionItem.pageUrl} - title={sectionItem.title} - href={`/${sectionItem.pageUrl}`} - description={sectionItem.description} - /> + <div className="w-full flex justify-center items-center flex-col gap-10 md:gap-20"> + <div className="w-full grid grid-cols-1 sm:grid-cols-2 justify-center items-center gap-5"> + {sectionsConfig.map(({ title, description, pageUrl }) => ( + <Card key={pageUrl} title={title} href={`/${pageUrl}`} description={description} /> ))} </div> <CallToAction /> <Footer /> </div> ); -} +}; diff --git a/apps/xi.support/components/SectionList.tsx b/apps/xi.support/components/SectionList.tsx deleted file mode 100644 index 29815566..00000000 --- a/apps/xi.support/components/SectionList.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Link } from '@xipkg/link'; -import Image from 'next/image'; - -type SectionListProps = { - sections: { - pageTitle: string; - pageUrl: string; - items: { - title: string; - image: string; - link: string; - }[]; - }[]; - sectionName: string; -}; - -const SectionList = ({ sections, sectionName }: SectionListProps) => ( - <div className="w-full flex flex-col justify-center items-center z-10 gap-10"> - {sections.map((section) => ( - <section className="flex flex-col w-full gap-5" key={section.pageUrl}> - <Link - variant="hover" - href={`/${sectionName}#${section.pageUrl}`} - className="text-lg no-underline hover:underline" - > - {section.pageTitle} - </Link> - <div className="grid grid-cols-2 gap-8 w-full"> - {section.items.map((item, i) => ( - <div className="flex flex-col w-full gap-2" key={i.toString()}> - <Link - href={`/${sectionName}#${item.link}`} - className={`relative flex justify-center items-center bg-gray-10 h-60 w-full rounded-[12px] md:rounded-[24px] `} - > - <Image - alt={item.title} - src={`/assets/markdown/${sectionName}/${item.image}`} - fill - objectFit="contain" - className="mt-0 mb-0" - /> - </Link> - <Link - href={`/${sectionName}#${item.link}`} - className="font-medium text-[16px] text-center no-underline hover:underline" - > - {item.title} - </Link> - </div> - ))} - </div> - </section> - ))} - </div> -); - -export default SectionList; diff --git a/apps/xi.support/config/sectionsConfig.ts b/apps/xi.support/config/sectionsConfig.ts index 9c5e1724..3e508aa3 100644 --- a/apps/xi.support/config/sectionsConfig.ts +++ b/apps/xi.support/config/sectionsConfig.ts @@ -2,7 +2,7 @@ export const sectionsConfig = [ { title: 'Начало работы', description: - 'Зарегистрируйтесь на платформе, настройте профиль и уведомления. Приглашайте учеников по ссылке и создавайте группы — у каждого будет свой кабинет.', + 'Зарегистрируйтесь на платформе, настройте профиль и уведомления. Приглашайте учеников по ссылке и создавайте группы.', pageUrl: 'work-beginning', icon: 'start-working.svg', }, diff --git a/apps/xi.support/content/docs/index.mdx b/apps/xi.support/content/docs/index.mdx index 10201d49..cea7fac4 100644 --- a/apps/xi.support/content/docs/index.mdx +++ b/apps/xi.support/content/docs/index.mdx @@ -3,6 +3,6 @@ title: База знаний sovlium updateDate: '13.01.2026' --- -import HomePage from '../../components/HomePage'; +import { HomePage } from '@/components/HomePage'; <HomePage /> From 877acaff528a406b8fa87028c5ab691008941edb Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:11:23 +0300 Subject: [PATCH 4/8] fix(104): build issue --- apps/xi.support/next.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/xi.support/next.config.mjs b/apps/xi.support/next.config.mjs index f904a7c8..54d581dd 100644 --- a/apps/xi.support/next.config.mjs +++ b/apps/xi.support/next.config.mjs @@ -32,7 +32,7 @@ const config = { { protocol: 'https', hostname: 'sovlium.ru' }, ], }, - output: process.env.NODE_ENV === 'development' ? 'standalone' : 'export', + output: 'standalone', pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], typescript: { ignoreBuildErrors: true }, }; From 59a9189e7d56c2b36e0ad700c60efa0ce9abb28c Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:23:57 +0300 Subject: [PATCH 5/8] fix(104): prettier check problem --- apps/xi.support/.prettierignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/xi.support/.prettierignore diff --git a/apps/xi.support/.prettierignore b/apps/xi.support/.prettierignore new file mode 100644 index 00000000..fe434aba --- /dev/null +++ b/apps/xi.support/.prettierignore @@ -0,0 +1,2 @@ +# Сгенерированные fumadocs-mdx файлы +**/.source/ \ No newline at end of file From 27b27fcb331186a7fdd738c4306ff43a79e54275 Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:31:14 +0300 Subject: [PATCH 6/8] fix(104): move prettierignore file to the root --- apps/xi.support/.prettierignore => .prettierignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/xi.support/.prettierignore => .prettierignore (100%) diff --git a/apps/xi.support/.prettierignore b/.prettierignore similarity index 100% rename from apps/xi.support/.prettierignore rename to .prettierignore From e7dc151dcc65ee6051fdd31cf61fbd25b0e277bd Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Thu, 19 Feb 2026 22:19:01 +0300 Subject: [PATCH 7/8] fix(104): remove api search to avoid build problem --- apps/xi.support/app/api/search/route.ts | 6 ------ apps/xi.support/next.config.mjs | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 apps/xi.support/app/api/search/route.ts diff --git a/apps/xi.support/app/api/search/route.ts b/apps/xi.support/app/api/search/route.ts deleted file mode 100644 index 01c84aa5..00000000 --- a/apps/xi.support/app/api/search/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { source } from '@/lib/source'; -import { createFromSource } from 'fumadocs-core/search/server'; - -export const { GET } = createFromSource(source, { - language: 'russian', -}); diff --git a/apps/xi.support/next.config.mjs b/apps/xi.support/next.config.mjs index 54d581dd..f904a7c8 100644 --- a/apps/xi.support/next.config.mjs +++ b/apps/xi.support/next.config.mjs @@ -32,7 +32,7 @@ const config = { { protocol: 'https', hostname: 'sovlium.ru' }, ], }, - output: 'standalone', + output: process.env.NODE_ENV === 'development' ? 'standalone' : 'export', pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], typescript: { ignoreBuildErrors: true }, }; From 82a0862b06406b9dda463d22919369ec2fb7f3cb Mon Sep 17 00:00:00 2001 From: Gleb Batyan <66956508+Batlay@users.noreply.github.com> Date: Sat, 21 Feb 2026 23:34:21 +0300 Subject: [PATCH 8/8] feat(104): move footer to the bottom, remove search input --- apps/xi.support/app/[[...slug]]/page.tsx | 6 +++--- apps/xi.support/app/layout.tsx | 4 +++- apps/xi.support/components/Footer.tsx | 2 +- apps/xi.support/content/docs/conduct-lesson.mdx | 3 +++ apps/xi.support/content/docs/control-payments.mdx | 3 +++ apps/xi.support/content/docs/prepare-for-lesson.mdx | 3 +++ apps/xi.support/content/docs/work-beginning.mdx | 3 +++ apps/xi.support/content/mdxComponents/Link.tsx | 8 +------- apps/xi.support/index.css | 8 ++------ 9 files changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/xi.support/app/[[...slug]]/page.tsx b/apps/xi.support/app/[[...slug]]/page.tsx index 2c0ea0fa..43ae3990 100644 --- a/apps/xi.support/app/[[...slug]]/page.tsx +++ b/apps/xi.support/app/[[...slug]]/page.tsx @@ -15,13 +15,13 @@ export default async function Page(props: PageProps<'/[[...slug]]'>) { const MDX = body; return ( - <DocsPage toc={toc}> + <DocsPage toc={toc} className="gap-0"> <p className="text-fd-muted-foreground text-sm">Обновлено {updateDate}</p> - <DocsTitle>{title}</DocsTitle> + <DocsTitle className="mt-4">{title}</DocsTitle> <DocsDescription>{description}</DocsDescription> - <DocsBody> + <DocsBody className="mt-4"> <MDX components={getMDXComponents({ a: createRelativeLink(source, page), diff --git a/apps/xi.support/app/layout.tsx b/apps/xi.support/app/layout.tsx index 928e2793..865ba325 100644 --- a/apps/xi.support/app/layout.tsx +++ b/apps/xi.support/app/layout.tsx @@ -98,7 +98,9 @@ export default function RootLayout({ children }: { children: ReactNode }) { return ( <html lang="ru" className={inter.variable} suppressHydrationWarning> <body className="flex flex-col min-h-screen"> - <RootProvider i18n={i18nUIProvider('ru')}>{children}</RootProvider> + <RootProvider i18n={i18nUIProvider('ru')} search={{ enabled: false }}> + {children} + </RootProvider> </body> </html> ); diff --git a/apps/xi.support/components/Footer.tsx b/apps/xi.support/components/Footer.tsx index f20c6a07..6dfb2f4c 100644 --- a/apps/xi.support/components/Footer.tsx +++ b/apps/xi.support/components/Footer.tsx @@ -83,7 +83,7 @@ const SvgColumn = () => ( ); export const Footer = () => ( - <footer className="w-full flex rounded-t-[32px] bg-gray-100 xl:rounded-t-[64px] 2xl:justify-center"> + <footer className="w-full flex rounded-t-[32px] bg-gray-100 xl:rounded-t-[64px] 2xl:justify-center mt-10"> <div className="text-gray-0 relative flex w-full flex-col gap-8 xl:flex-row xl:justify-between px-4 py-8"> <div className="absolute bottom-0 left-0"> <SvgColumn /> diff --git a/apps/xi.support/content/docs/conduct-lesson.mdx b/apps/xi.support/content/docs/conduct-lesson.mdx index 9ec393e1..114d5140 100644 --- a/apps/xi.support/content/docs/conduct-lesson.mdx +++ b/apps/xi.support/content/docs/conduct-lesson.mdx @@ -5,6 +5,7 @@ updateDate: '13.01.2026' import Link from '../mdxComponents/Link'; import Image from '../mdxComponents/Image'; +import { Footer } from '../../components/Footer.tsx'; ## Начать видеозвонок @@ -33,3 +34,5 @@ import Image from '../mdxComponents/Image'; src="/assets/markdown/conduct-lesson/online_board.png" alt="Онлайн-доска" /> + +<Footer /> diff --git a/apps/xi.support/content/docs/control-payments.mdx b/apps/xi.support/content/docs/control-payments.mdx index abed5066..4d77a9ab 100644 --- a/apps/xi.support/content/docs/control-payments.mdx +++ b/apps/xi.support/content/docs/control-payments.mdx @@ -5,6 +5,7 @@ updateDate: '13.01.2026' import Link from '../mdxComponents/Link'; import Image from '../mdxComponents/Image'; +import { Footer } from '../../components/Footer.tsx'; ## Как создать счёт @@ -54,3 +55,5 @@ import Image from '../mdxComponents/Image'; src="/assets/markdown/control-payments/analytics.png" alt="Аналитика" /> + +<Footer /> diff --git a/apps/xi.support/content/docs/prepare-for-lesson.mdx b/apps/xi.support/content/docs/prepare-for-lesson.mdx index 7c16d9e1..de767b0e 100644 --- a/apps/xi.support/content/docs/prepare-for-lesson.mdx +++ b/apps/xi.support/content/docs/prepare-for-lesson.mdx @@ -5,6 +5,7 @@ updateDate: '13.01.2026' import Link from '../mdxComponents/Link'; import Image from '../mdxComponents/Image'; +import { Footer } from '../../components/Footer.tsx'; ## Назначить занятие @@ -38,3 +39,5 @@ import Image from '../mdxComponents/Image'; src="/assets/markdown/prepare-for-lesson/set_reminders.png" alt="Настроить напоминания" /> + +<Footer /> diff --git a/apps/xi.support/content/docs/work-beginning.mdx b/apps/xi.support/content/docs/work-beginning.mdx index aa8d3394..4f6d655b 100644 --- a/apps/xi.support/content/docs/work-beginning.mdx +++ b/apps/xi.support/content/docs/work-beginning.mdx @@ -5,6 +5,7 @@ updateDate: '13.01.2026' import Link from '../mdxComponents/Link'; import Image from '../mdxComponents/Image'; +import { Footer } from '../../components/Footer.tsx'; ## Регистрация @@ -111,3 +112,5 @@ import Image from '../mdxComponents/Image'; Если ученик уже занимается с вами на платформе индивидуально, а теперь вы хотите пригласить его в группу, нажмите «Добавить ученика». Переход по общей ссылке-приглашению также сработает. + +<Footer /> diff --git a/apps/xi.support/content/mdxComponents/Link.tsx b/apps/xi.support/content/mdxComponents/Link.tsx index c9709488..63440d3b 100644 --- a/apps/xi.support/content/mdxComponents/Link.tsx +++ b/apps/xi.support/content/mdxComponents/Link.tsx @@ -1,13 +1,7 @@ import { Link as LinkPkg } from '@xipkg/link'; const Link = ({ href, children }) => ( - <LinkPkg - className="text-[16px] 2xl:text-[20px]" - theme="brand" - variant="always" - href={href} - target="_blank" - > + <LinkPkg className="text-[16px]" theme="brand" variant="always" href={href} target="_blank"> {children} </LinkPkg> ); diff --git a/apps/xi.support/index.css b/apps/xi.support/index.css index 6cc28808..c5a84215 100644 --- a/apps/xi.support/index.css +++ b/apps/xi.support/index.css @@ -58,10 +58,6 @@ --color-fd-ring: hsl(0, 0%, 54.9%); } -/* #nd-docs-layout { - --fd-sidebar-width: 268px; +#nd-page > div.grid > a { + border-radius: 0; } - -aside { - max-width: 268px; -} */