dock-rush 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2AQ6S3IJ.mjs +2 -0
- package/dist/chunk-2AQ6S3IJ.mjs.map +1 -0
- package/dist/client.cjs +4 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +32 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.mjs +4 -0
- package/dist/client.mjs.map +1 -0
- package/dist/markdown-viewer-2GZNJGML.mjs +2 -0
- package/dist/markdown-viewer-2GZNJGML.mjs.map +1 -0
- package/dist/plugin.cjs +4 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +104 -0
- package/dist/plugin.d.ts +104 -0
- package/dist/plugin.mjs +4 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/style.css +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/doc-page/markdown-viewer.lazy.tsx","../src/components/errors-list/errors-list.tsx","../src/components/language-toggle.tsx","../src/components/ui/select.tsx","../src/components/logo.tsx","../src/components/ui/command.tsx","../src/components/ui/dialog.tsx","../src/lib/documentation/helpers/getAvailableLanguages.ts","../src/lib/documentation/helpers/getEntityType.ts","../src/lib/documentation/helpers/types-helper.ts","../src/lib/documentation/helpers/getSortEntities.ts","../src/lib/documentation/helpers/getTitle.ts","../src/lib/documentation/helpers/patternsFiles.ts","../src/components/search-bar.tsx","../src/components/sidebar/sidebar.tsx","../src/components/ui/sidebar.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/tooltip.tsx","../src/hooks/use-mobile.tsx","../src/lib/documentation/icon-resolver.ts","../src/components/sidebar/documentation-entity-item.tsx","../src/components/theme-toggle.tsx","../src/hooks/useDocumentationRouter.ts","../src/lib/documentation/frontmatter-parser.ts","../src/lib/errorBuilder/error-builder.ts","../src/lib/documentation/client-parser.ts","../src/components/doc-page/doc-page.tsx"],"sourcesContent":["import { Skeleton } from '@/components/ui/skeleton'\r\nimport * as React from 'react'\r\n\r\nconst LazyMarkdownViewer = React.lazy(() =>\r\n\timport('./markdown-viewer').then(m => ({\r\n\t\tdefault: m.MarkdownViewer,\r\n\t}))\r\n)\r\n\r\nexport function MarkdownViewerLazy(props: any) {\r\n\treturn (\r\n\t\t<React.Suspense\r\n\t\t\tfallback={\r\n\t\t\t\t<div className='p-6'>\r\n\t\t\t\t\t<Skeleton className='h-8 w-3/4 mb-4' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full mb-2' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full mb-2' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-2/3' />\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t>\r\n\t\t\t<LazyMarkdownViewer {...props} />\r\n\t\t</React.Suspense>\r\n\t)\r\n}\r\n","import { Button } from '@/components/ui/button'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n\tAlertCircle,\r\n\tCheckCircle2,\r\n\tCopy,\r\n\tFileWarning,\r\n\tFileX,\r\n\tFolderTree,\r\n\tFolderX,\r\n} from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nexport interface DocumentationError {\r\n\ttype:\r\n\t\t| 'ROOT_FILE_ERROR'\r\n\t\t| 'VERSION_FORMAT_ERROR'\r\n\t\t| 'ORPHAN_FILE_ERROR'\r\n\t\t| 'FILE_IN_WRONG_FOLDER'\r\n\t\t| 'NESTED_VERSION_ERROR'\r\n\t\t| 'NESTED_DIRECTORY_ERROR'\r\n\t\t| 'DUPLICATE_FILE_ERROR'\r\n\t\t| 'INVALID_ROOT_MD_FILE'\r\n\t\t| 'NESTED_DIRECTORY_IN_GROUP'\r\n\t\t| 'NESTED_DIRECTORY_IN_DROPDOWN'\r\n\t\t| 'BUTTON_FILE_IN_WRONG_PLACE'\r\n\tfile?: string\r\n\tfolder?: string\r\n\tfiles?: string[]\r\n\tpath: string\r\n\tpaths?: string[]\r\n\treason: string\r\n\tfix: string\r\n\tparentVersion?: string\r\n\tnestedVersion?: string\r\n}\r\n\r\ninterface ErrorCardProps {\r\n\treadonly error: DocumentationError\r\n\treadonly index: number\r\n}\r\n\r\nfunction getErrorIcon(type: DocumentationError['type']) {\r\n\tswitch (type) {\r\n\t\tcase 'ROOT_FILE_ERROR':\r\n\t\tcase 'ORPHAN_FILE_ERROR':\r\n\t\t\treturn FileX\r\n\t\tcase 'VERSION_FORMAT_ERROR':\r\n\t\t\treturn FolderX\r\n\t\tcase 'FILE_IN_WRONG_FOLDER':\r\n\t\t\treturn FileWarning\r\n\t\tcase 'NESTED_VERSION_ERROR':\r\n\t\tcase 'NESTED_DIRECTORY_ERROR':\r\n\t\t\treturn FolderTree\r\n\t\tcase 'DUPLICATE_FILE_ERROR':\r\n\t\t\treturn Copy\r\n\t\tdefault:\r\n\t\t\treturn AlertCircle\r\n\t}\r\n}\r\n\r\nfunction getErrorTypeLabel(type: DocumentationError['type']): string {\r\n\tswitch (type) {\r\n\t\tcase 'ROOT_FILE_ERROR':\r\n\t\t\treturn 'Файл в корне'\r\n\t\tcase 'VERSION_FORMAT_ERROR':\r\n\t\t\treturn 'Неверный формат версии'\r\n\t\tcase 'ORPHAN_FILE_ERROR':\r\n\t\t\treturn 'Файл без версии'\r\n\t\tcase 'FILE_IN_WRONG_FOLDER':\r\n\t\t\treturn 'Файл в неправильной папке'\r\n\t\tcase 'NESTED_VERSION_ERROR':\r\n\t\t\treturn 'Вложенная версия'\r\n\t\tcase 'NESTED_DIRECTORY_ERROR':\r\n\t\t\treturn 'Вложенная директория'\r\n\t\tcase 'DUPLICATE_FILE_ERROR':\r\n\t\t\treturn 'Дубликат файла'\r\n\t\tcase 'INVALID_ROOT_MD_FILE':\r\n\t\t\treturn 'Неверный .md файл в корне версии'\r\n\t\tcase 'NESTED_DIRECTORY_IN_GROUP':\r\n\t\t\treturn 'Вложенная папка в группе'\r\n\t\tcase 'NESTED_DIRECTORY_IN_DROPDOWN':\r\n\t\t\treturn 'Вложенная папка в dropdown'\r\n\t\tcase 'BUTTON_FILE_IN_WRONG_PLACE':\r\n\t\t\treturn 'Кнопка в неправильном месте'\r\n\t\tdefault:\r\n\t\t\treturn 'Ошибка'\r\n\t}\r\n}\r\n\r\nfunction ErrorCard({ error, index }: ErrorCardProps) {\r\n\tconst Icon = getErrorIcon(error.type)\r\n\tconst [copied, setCopied] = React.useState(false)\r\n\r\n\tconst handleCopyPath = () => {\r\n\t\tconst pathToCopy = error.path || error.paths?.join(', ') || ''\r\n\t\tnavigator.clipboard.writeText(pathToCopy)\r\n\t\tsetCopied(true)\r\n\t\tsetTimeout(() => setCopied(false), 2000)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'group relative rounded-lg border border-destructive/20 bg-destructive/5 p-4 transition-all hover:border-destructive/40 hover:bg-destructive/10',\r\n\t\t\t\t'flex flex-col gap-3'\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t<div className='flex items-start gap-3'>\r\n\t\t\t\t<div className='mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-destructive/10 text-destructive'>\r\n\t\t\t\t\t<Icon className='h-4 w-4' />\r\n\t\t\t\t</div>\r\n\t\t\t\t<div className='flex-1 space-y-1'>\r\n\t\t\t\t\t<div className='flex items-center justify-between gap-2'>\r\n\t\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t\t<span className='text-xs font-semibold text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t#{index + 1}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<span className='text-sm font-semibold text-destructive'>\r\n\t\t\t\t\t\t\t\t{getErrorTypeLabel(error.type)}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant='ghost'\r\n\t\t\t\t\t\t\tsize='sm'\r\n\t\t\t\t\t\t\tclassName='h-7 w-7 p-0'\r\n\t\t\t\t\t\t\tonClick={handleCopyPath}\r\n\t\t\t\t\t\t\ttitle='Копировать путь'\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{copied ? (\r\n\t\t\t\t\t\t\t\t<CheckCircle2 className='h-3.5 w-3.5 text-green-600' />\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<Copy className='h-3.5 w-3.5' />\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className='space-y-2'>\r\n\t\t\t\t\t\t{(error.file || error.folder || error.files) && (\r\n\t\t\t\t\t\t\t<div className='flex flex-wrap items-center gap-2'>\r\n\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t\t{error.file && `Файл:`}\r\n\t\t\t\t\t\t\t\t\t{error.folder && `Папка:`}\r\n\t\t\t\t\t\t\t\t\t{error.files && `Файлы:`}\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t{error.file && (\r\n\t\t\t\t\t\t\t\t\t<code className='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t\t\t{error.file}\r\n\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{error.folder && (\r\n\t\t\t\t\t\t\t\t\t<code className='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t\t\t{error.folder}\r\n\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{error.files && (\r\n\t\t\t\t\t\t\t\t\t<div className='flex flex-wrap gap-1'>\r\n\t\t\t\t\t\t\t\t\t\t{error.files.map(file => (\r\n\t\t\t\t\t\t\t\t\t\t\t<code\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={file}\r\n\t\t\t\t\t\t\t\t\t\t\t\tclassName='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{file}\r\n\t\t\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<div className='flex items-start gap-2'>\r\n\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground'>Путь:</span>\r\n\t\t\t\t\t\t\t<code className='break-all rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t{error.path || error.paths?.join(', ')}\r\n\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div className='ml-11 space-y-2 border-t border-destructive/10 pt-3'>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<span className='text-xs font-medium text-muted-foreground'>\r\n\t\t\t\t\t\tПричина:\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-foreground'>{error.reason}</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<span className='text-xs font-medium text-green-700 dark:text-green-400'>\r\n\t\t\t\t\t\tРешение:\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-green-800 dark:text-green-300'>\r\n\t\t\t\t\t\t{error.fix}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t)\r\n}\r\n\r\ninterface ErrorsListProps {\r\n\treadonly errors: DocumentationError[]\r\n}\r\n\r\nexport function ErrorsList({ errors }: ErrorsListProps) {\r\n\tif (!errors || errors.length === 0) {\r\n\t\treturn (\r\n\t\t\t<div className='flex flex-col items-center justify-center rounded-lg border border-green-200 bg-green-50/50 p-12 dark:border-green-900 dark:bg-green-950/20'>\r\n\t\t\t\t<CheckCircle2 className='mb-4 h-12 w-12 text-green-600 dark:text-green-400' />\r\n\t\t\t\t<h3 className='mb-2 text-lg font-semibold text-green-900 dark:text-green-100'>\r\n\t\t\t\t\tОшибок не найдено\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p className='text-center text-sm text-green-700 dark:text-green-300'>\r\n\t\t\t\t\tСтруктура документации соответствует всем требованиям\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div className='space-y-4'>\r\n\t\t\t<div className='flex items-center justify-between'>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h2 className='text-2xl font-bold tracking-tight'>\r\n\t\t\t\t\t\tОшибки структуры документации\r\n\t\t\t\t\t</h2>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-muted-foreground'>\r\n\t\t\t\t\t\tНайдено {errors.length} {errors.length === 1 ? 'ошибка' : 'ошибок'}{' '}\r\n\t\t\t\t\t\tв структуре документации\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div className='flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10 text-destructive'>\r\n\t\t\t\t\t<AlertCircle className='h-5 w-5' />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div className='space-y-3'>\r\n\t\t\t\t{errors.map((error, index) => (\r\n\t\t\t\t\t<ErrorCard\r\n\t\t\t\t\t\tkey={`${error.type}-${error.path}-${index}`}\r\n\t\t\t\t\t\terror={error}\r\n\t\t\t\t\t\tindex={index}\r\n\t\t\t\t\t/>\r\n\t\t\t\t))}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { Languages } from 'lucide-react'\r\nimport * as React from 'react'\r\nimport {\r\n\tSelect,\r\n\tSelectContent,\r\n\tSelectItem,\r\n\tSelectTrigger,\r\n\tSelectValue,\r\n} from './ui/select'\r\n\r\ninterface LanguageToggleProps {\r\n\treadonly languages: string[]\r\n\treadonly selectedLanguage: string | null\r\n\treadonly onLanguageChange: (language: string | null) => void\r\n}\r\n\r\nexport function LanguageToggle({\r\n\tlanguages,\r\n\tselectedLanguage,\r\n\tonLanguageChange,\r\n}: LanguageToggleProps) {\r\n\tif (languages.length === 0) {\r\n\t\treturn null\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Select\r\n\t\t\tvalue={selectedLanguage || ''}\r\n\t\t\tonValueChange={(value) => {\r\n\t\t\t\tonLanguageChange(value || null)\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<SelectTrigger className='h-9 w-[120px]'>\r\n\t\t\t\t<Languages className='mr-2 h-4 w-4' />\r\n\t\t\t\t<SelectValue placeholder='Language' />\r\n\t\t\t</SelectTrigger>\r\n\t\t\t<SelectContent>\r\n\t\t\t\t{languages.map(lang => (\r\n\t\t\t\t\t<SelectItem key={lang} value={lang}>\r\n\t\t\t\t\t\t{lang.toUpperCase()}\r\n\t\t\t\t\t</SelectItem>\r\n\t\t\t\t))}\r\n\t\t\t</SelectContent>\r\n\t\t</Select>\r\n\t)\r\n}\r\n\r\n","import * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Select = SelectPrimitive.Root\r\n\r\nconst SelectGroup = SelectPrimitive.Group\r\n\r\nconst SelectValue = SelectPrimitive.Value\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n))\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n))\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n))\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = \"popper\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n))\r\nSelectContent.displayName = SelectPrimitive.Content.displayName\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n))\r\nSelectItem.displayName = SelectPrimitive.Item.displayName\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n}\r\n","export function Logo({ className }: Readonly<{ className?: string }>) {\r\n\treturn (\r\n\t\t<svg\r\n\t\t\twidth='653'\r\n\t\t\theight='566'\r\n\t\t\tviewBox='0 0 653 566'\r\n\t\t\tfill='none'\r\n\t\t\txmlns='http://www.w3.org/2000/svg'\r\n\t\t\tclassName={className}\r\n\t\t>\r\n\t\t\t<path\r\n\t\t\t\td='M272.258 0.0970342C274.805 0.091891 277.352 0.0846067 279.9 0.0753515C286.078 0.0587971 292.255 0.065435 298.434 0.0834397C303.457 0.09751 308.48 0.101349 313.504 0.0979975C314.58 0.0972813 314.58 0.0972813 315.677 0.0965507C317.134 0.0955243 318.591 0.0944689 320.048 0.0933849C332.908 0.0848336 345.768 0.101443 358.627 0.131214C371.088 0.16006 383.548 0.167127 396.008 0.151722C409.601 0.134939 423.193 0.130945 436.786 0.148432C438.237 0.150276 439.688 0.152111 441.139 0.153936C442.209 0.155304 442.209 0.155304 443.301 0.1567C448.316 0.162292 453.331 0.159011 458.346 0.152391C465.101 0.143827 471.856 0.156886 478.612 0.18424C481.087 0.191114 483.563 0.191232 486.039 0.184025C489.425 0.175306 492.81 0.191328 496.195 0.213474C497.169 0.205233 498.144 0.196993 499.148 0.188502C507.901 0.293827 515.66 2.53276 522.07 8.7462C522.898 9.53763 523.727 10.3291 524.581 11.1445C525.441 11.9971 526.301 12.8497 527.188 13.7281C528.096 14.6106 529.005 15.493 529.942 16.4021C533.01 19.3908 536.043 22.4141 539.075 25.4391C540.231 26.5885 541.387 27.7378 542.543 28.8869C546.299 32.6221 550.05 36.3625 553.801 40.1031C555.1 41.3985 556.4 42.6938 557.699 43.9891C563.799 50.0696 569.896 56.1526 575.99 62.2384C583.001 69.2395 590.02 76.2321 597.046 83.2178C602.497 88.6387 607.94 94.0672 613.378 99.5015C616.618 102.739 619.86 105.973 623.111 109.199C626.166 112.23 629.211 115.271 632.25 118.319C633.361 119.432 634.477 120.541 635.596 121.646C643.722 129.678 651.502 137.997 652.44 149.949C652.443 151.704 652.443 151.704 652.445 153.495C652.448 154.154 652.452 154.813 652.455 155.491C652.465 157.696 652.46 159.901 652.455 162.106C652.459 163.703 652.463 165.301 652.469 166.899C652.481 171.288 652.481 175.677 652.478 180.066C652.478 184.8 652.489 189.535 652.498 194.269C652.515 203.544 652.52 212.819 652.522 222.095C652.523 229.635 652.527 237.175 652.533 244.716C652.551 266.095 652.56 287.475 652.558 308.855C652.558 310.584 652.558 310.584 652.558 312.348C652.558 313.502 652.558 314.656 652.558 315.845C652.557 334.545 652.576 353.245 652.604 371.945C652.633 391.147 652.647 410.35 652.645 429.552C652.645 440.332 652.65 451.112 652.672 461.892C652.69 471.072 652.694 480.251 652.681 489.431C652.674 494.112 652.674 498.794 652.691 503.476C652.707 507.766 652.704 512.056 652.687 516.347C652.684 517.894 652.687 519.442 652.698 520.99C652.791 534.716 650.361 545.439 640.527 555.412C629.894 565.125 618.211 566.028 604.347 565.982C602.832 565.984 601.317 565.988 599.802 565.992C595.651 566 591.5 565.996 587.349 565.99C582.868 565.985 578.386 565.992 573.905 565.998C565.131 566.006 556.357 566.005 547.583 565.999C540.452 565.994 533.32 565.994 526.189 565.996C525.174 565.996 524.159 565.996 523.113 565.997C521.051 565.997 518.988 565.998 516.926 565.999C497.59 566.004 478.254 565.998 458.918 565.987C442.329 565.978 425.74 565.98 409.151 565.989C389.884 566 370.617 566.004 351.35 565.998C349.295 565.997 347.241 565.996 345.186 565.996C343.669 565.995 343.669 565.995 342.122 565.995C335 565.993 327.878 565.996 320.756 566.001C312.076 566.006 303.395 566.005 294.715 565.994C290.287 565.989 285.859 565.987 281.43 565.993C277.375 565.999 273.32 565.996 269.265 565.986C267.8 565.983 266.334 565.984 264.869 565.989C251.256 566.031 239.211 564.046 228.785 554.533C220.018 544.629 218.021 534.074 218.09 521.298C218.092 519.813 218.092 519.813 218.094 518.297C218.1 515.149 218.112 512.001 218.125 508.853C218.13 506.713 218.135 504.572 218.139 502.431C218.15 497.197 218.166 491.963 218.188 486.728C217.579 486.731 216.97 486.734 216.343 486.737C201.529 486.803 186.714 486.852 171.9 486.884C164.735 486.899 157.571 486.92 150.407 486.954C144.162 486.984 137.918 487.004 131.673 487.01C128.367 487.014 125.061 487.025 121.754 487.045C118.063 487.067 114.371 487.07 110.679 487.069C109.584 487.08 108.489 487.09 107.361 487.101C98.0972 487.064 98.0972 487.064 94.1875 483.728C91.9221 481.165 90.3109 479.227 90.0234 475.736C90.3972 471.02 91.729 468.088 95.1875 464.728C98.2778 462.835 100.586 462.48 104.186 462.488C105.696 462.484 105.696 462.484 107.237 462.479C108.335 462.486 109.434 462.494 110.565 462.501C111.727 462.501 112.888 462.501 114.084 462.5C117.926 462.502 121.768 462.517 125.609 462.533C128.272 462.537 130.934 462.54 133.596 462.541C139.89 462.548 146.183 462.564 152.476 462.584C159.642 462.606 166.807 462.617 173.973 462.628C188.711 462.648 203.449 462.685 218.188 462.728C218.188 446.558 218.188 430.388 218.188 413.728C213.221 413.749 208.254 413.77 203.136 413.792C186.744 413.858 170.351 413.902 153.958 413.935C144.017 413.956 134.077 413.984 124.136 414.03C115.471 414.07 106.807 414.096 98.1425 414.104C93.5546 414.11 88.967 414.122 84.3792 414.151C80.0602 414.178 75.7415 414.187 71.4224 414.181C69.8381 414.182 68.2539 414.19 66.6697 414.205C64.5037 414.225 62.3391 414.22 60.1731 414.209C58.9618 414.213 57.7506 414.217 56.5027 414.22C52.4811 413.623 50.3377 412.256 47.1875 409.728C44.3587 405.485 44.5348 401.711 45.1875 396.728C47.3067 393.095 49.308 391.242 53.1875 389.728C56.2566 389.482 56.2566 389.482 59.9326 389.488C60.9484 389.485 60.9484 389.485 61.9847 389.482C64.2526 389.479 66.5202 389.49 68.7881 389.501C70.4143 389.502 72.0405 389.501 73.6666 389.5C78.0816 389.5 82.4964 389.511 86.9114 389.525C91.5252 389.538 96.1389 389.539 100.753 389.541C109.49 389.548 118.227 389.564 126.964 389.584C136.91 389.606 146.857 389.617 156.804 389.628C177.265 389.648 197.726 389.685 218.188 389.728C218.188 373.558 218.188 357.388 218.188 340.728C214.008 340.749 209.829 340.77 205.523 340.792C191.725 340.858 177.927 340.902 164.128 340.935C155.761 340.956 147.394 340.984 139.027 341.03C131.734 341.07 124.441 341.096 117.148 341.104C113.286 341.11 109.425 341.122 105.564 341.151C101.928 341.178 98.2922 341.187 94.6559 341.181C92.689 341.182 90.722 341.204 88.7551 341.226C77.8936 341.175 77.8936 341.175 73.1875 336.728C70.3587 332.485 70.5348 328.711 71.1875 323.728C73.3119 320.086 75.3184 318.28 79.1875 316.728C81.8505 316.482 81.8505 316.482 84.9455 316.488C86.1206 316.485 87.2956 316.482 88.5063 316.479C89.7917 316.486 91.077 316.494 92.4014 316.501C93.7714 316.502 95.1414 316.501 96.5115 316.5C100.228 316.5 103.945 316.511 107.661 316.525C111.546 316.538 115.431 316.539 119.316 316.541C126.672 316.548 134.028 316.564 141.384 316.584C149.759 316.606 158.133 316.617 166.508 316.628C183.735 316.648 200.961 316.685 218.188 316.728C218.188 300.888 218.188 285.048 218.188 268.728C213.009 268.749 207.83 268.77 202.494 268.792C185.403 268.858 168.312 268.902 151.22 268.935C140.856 268.956 130.491 268.984 120.126 269.03C111.093 269.07 102.059 269.096 93.0257 269.104C88.2422 269.11 83.459 269.122 78.6756 269.151C74.1727 269.178 69.6702 269.187 65.1672 269.181C63.5152 269.182 61.8632 269.19 60.2113 269.205C57.9534 269.225 55.6968 269.22 53.4388 269.209C51.5445 269.215 51.5445 269.215 49.612 269.22C44.614 268.502 41.4647 266.303 38.3125 262.416C36.8553 258.935 36.7863 256.473 37.1875 252.728C39.0115 248.504 41.0912 246.723 45.1875 244.728C48.5202 244.359 48.5202 244.359 52.3945 244.367C53.4667 244.364 53.4667 244.364 54.5606 244.36C56.9499 244.355 59.3385 244.371 61.7278 244.388C63.4428 244.388 65.1578 244.388 66.8728 244.386C71.5253 244.385 76.1776 244.403 80.8301 244.424C85.6935 244.443 90.5568 244.444 95.4202 244.448C104.628 244.457 113.836 244.482 123.044 244.512C133.528 244.546 144.011 244.562 154.495 244.577C176.059 244.609 197.623 244.664 219.188 244.728C219.188 228.228 219.188 211.728 219.188 194.728C209.594 194.76 209.594 194.76 199.806 194.792C178.711 194.858 157.617 194.902 136.522 194.935C123.729 194.956 110.935 194.984 98.1409 195.03C86.9916 195.07 75.8423 195.096 64.6929 195.104C58.7878 195.11 52.8828 195.122 46.9777 195.151C41.4218 195.178 35.8661 195.187 30.3102 195.181C28.2691 195.182 26.2281 195.19 24.1871 195.205C21.4034 195.225 18.6208 195.22 15.8371 195.209C15.0268 195.221 14.2165 195.232 13.3816 195.244C9.60827 195.204 7.43328 194.887 4.22894 192.821C1.62187 190.148 0.321584 188.29 0 184.545C0.495746 178.585 0.495746 178.585 2.52734 176.068C7.53889 171.865 11.1076 171.585 17.4004 171.608C18.2597 171.607 19.1189 171.606 20.0042 171.605C22.9001 171.604 25.796 171.609 28.6919 171.615C30.7611 171.615 32.8304 171.615 34.8996 171.614C40.5315 171.614 46.1635 171.62 51.7954 171.627C57.6758 171.633 63.5561 171.634 69.4365 171.635C80.5783 171.638 91.7201 171.646 102.862 171.656C115.544 171.667 128.225 171.673 140.907 171.678C167.001 171.688 193.094 171.707 219.188 171.728C219.188 155.228 219.188 138.728 219.188 121.728C214.887 121.754 210.587 121.781 206.156 121.807C191.958 121.89 177.761 121.946 163.564 121.987C154.954 122.013 146.345 122.048 137.736 122.105C130.232 122.155 122.728 122.187 115.224 122.199C111.251 122.205 107.278 122.22 103.305 122.257C99.5636 122.291 95.823 122.301 92.0816 122.294C90.0573 122.296 88.0331 122.323 86.009 122.35C76.0882 122.294 76.0882 122.294 72.387 119.318C69.3308 115.72 68.8417 113.591 68.9023 108.83C69.369 105.39 70.9688 103.317 73.1875 100.728C76.4767 98.6001 79.1487 98.4807 83.0214 98.4876C84.2133 98.4849 85.4052 98.4821 86.6332 98.4793C88.5893 98.4901 88.5893 98.4901 90.585 98.5011C91.9747 98.5016 93.3644 98.5013 94.7542 98.5002C98.5245 98.4996 102.295 98.5114 106.065 98.5253C110.006 98.5378 113.947 98.539 117.888 98.5414C125.351 98.5476 132.813 98.564 140.275 98.5841C148.77 98.6065 157.266 98.6174 165.762 98.6275C183.237 98.6484 200.712 98.6836 218.188 98.7281C218.179 97.9154 218.17 97.1027 218.161 96.2653C218.08 88.5578 218.019 80.8505 217.98 73.1427C217.959 69.1813 217.931 65.2202 217.886 61.2589C217.842 57.4269 217.818 53.5951 217.808 49.7629C217.801 48.3102 217.786 46.8575 217.765 45.405C217.581 32.6699 219.25 21.3579 228.188 11.7281C228.689 11.1854 229.19 10.6427 229.707 10.0836C241.674 -1.41723 256.834 0.0179299 272.258 0.0970342Z'\r\n\t\t\t\tfill='#686868'\r\n\t\t\t/>\r\n\t\t\t<path\r\n\t\t\t\td='M494.188 170.728C499.905 173.209 503.988 177.113 508.535 181.318C511.084 183.634 513.696 185.816 516.375 187.978C521.515 192.139 526.511 196.446 531.497 200.788C535.556 204.32 539.637 207.822 543.75 211.291C544.529 211.95 544.529 211.95 545.324 212.623C548.194 215.052 551.076 217.467 553.969 219.869C555.23 220.926 556.49 221.983 557.75 223.041C558.334 223.52 558.918 224 559.52 224.494C563.879 228.17 567.786 231.918 568.625 237.791C567.78 243.466 564.657 246.45 560.25 249.853C556.069 253.17 552.084 256.589 548.188 260.228C544.48 263.681 540.703 266.993 536.75 270.166C532.565 273.532 528.605 277.06 524.688 280.728C519.846 285.261 514.872 289.542 509.692 293.689C507.328 295.614 505.069 297.616 502.813 299.666C498.891 303.103 496.004 304.459 490.813 305.228C485.947 304.557 483.45 302.285 480.188 298.728C478.551 295.455 478.945 291.822 478.871 288.22C478.851 287.38 478.83 286.539 478.808 285.673C478.743 282.983 478.684 280.293 478.625 277.603C478.582 275.782 478.538 273.96 478.494 272.138C478.387 267.668 478.286 263.198 478.188 258.728C465.696 258.635 453.204 258.564 440.712 258.521C434.911 258.5 429.111 258.472 423.31 258.426C417.707 258.383 412.106 258.359 406.503 258.349C404.37 258.341 402.237 258.327 400.103 258.305C397.107 258.276 394.111 258.272 391.114 258.274C390.239 258.26 389.364 258.245 388.463 258.231C379.967 258.287 372.974 261.285 366.692 267.013C362.236 272.094 360.075 278.298 360.027 284.975C360.017 286.047 360.007 287.119 359.998 288.223C359.993 289.382 359.989 290.542 359.985 291.736C359.976 293.529 359.976 293.529 359.967 295.358C359.958 297.891 359.951 300.425 359.948 302.959C359.938 306.817 359.907 310.675 359.875 314.533C359.869 316.996 359.863 319.46 359.86 321.923C359.847 323.071 359.835 324.218 359.822 325.4C359.849 335.302 361.396 342.69 368.285 350.002C373.269 354.524 378.606 356.842 385.333 356.866C386.56 356.874 386.56 356.874 387.813 356.883C389.147 356.884 389.147 356.884 390.508 356.886C391.923 356.894 391.923 356.894 393.367 356.901C395.417 356.912 397.467 356.921 399.517 356.927C402.773 356.939 406.028 356.959 409.283 356.981C418.54 357.042 427.797 357.096 437.054 357.13C442.719 357.151 448.384 357.186 454.049 357.23C456.198 357.244 458.347 357.253 460.495 357.256C481.316 357.291 499.213 359.545 516.188 372.728C516.813 373.188 517.438 373.649 518.082 374.123C530.153 383.578 537.338 398.951 540.188 413.728C540.716 419.168 540.754 424.564 540.719 430.021C540.722 431.544 540.726 433.067 540.731 434.59C540.736 437.756 540.728 440.922 540.709 444.087C540.686 448.115 540.7 452.142 540.724 456.169C540.738 459.305 540.733 462.441 540.723 465.577C540.72 467.061 540.724 468.545 540.733 470.029C540.78 479.457 540.813 489.532 534.204 496.957C527.872 502.901 522.148 504.321 513.551 504.166C507.299 503.352 502.515 500.534 498.496 495.689C495.008 490.382 494.067 486.066 494.046 479.725C494.035 477.908 494.035 477.908 494.025 476.053C494.02 474.746 494.016 473.438 494.012 472.091C494.002 470.729 493.99 469.366 493.978 468.003C493.925 462.228 493.877 456.452 493.862 450.677C493.852 447.138 493.822 443.6 493.781 440.062C493.762 438.074 493.765 436.086 493.768 434.098C493.631 423.891 491.608 415.98 484.188 408.728C478.511 404.964 473.514 404.152 466.813 404.23C465.911 404.224 465.009 404.219 464.079 404.213C462.132 404.204 460.185 404.204 458.237 404.212C455.14 404.224 452.044 404.213 448.947 404.196C443.476 404.169 438.004 404.163 432.533 404.165C423.806 404.167 415.079 404.153 406.352 404.109C403.327 404.1 400.304 404.108 397.28 404.118C370.94 404.089 350.237 397.743 331.25 378.795C320.19 366.919 313.165 350.037 313.011 333.739C312.998 332.553 312.985 331.367 312.972 330.145C312.964 328.868 312.957 327.591 312.949 326.275C312.945 325.617 312.941 324.959 312.937 324.28C312.916 320.785 312.902 317.291 312.893 313.796C312.884 310.939 312.863 308.082 312.831 305.225C312.532 277.898 314.71 253.66 334.73 233.142C353.674 214.769 375.375 211.129 400.528 211.119C402.748 211.104 404.969 211.087 407.189 211.069C412.984 211.025 418.779 211.005 424.574 210.99C430.507 210.97 436.44 210.928 442.373 210.888C453.978 210.813 465.583 210.763 477.188 210.728C477.202 209.42 477.202 209.42 477.216 208.085C477.26 204.821 477.322 201.559 477.395 198.295C477.423 196.888 477.445 195.481 477.459 194.074C477.614 179.521 477.614 179.521 482.188 173.728C486.068 170.477 489.21 170.127 494.188 170.728Z'\r\n\t\t\t\tfill='#F9F9F9'\r\n\t\t\t/>\r\n\t\t\t<path\r\n\t\t\t\td='M507.188 1.72815C518.614 2.3141 526.874 12.9781 534.421 20.5575C535.626 21.7562 536.831 22.9543 538.036 24.1518C541.289 27.3866 544.532 30.6308 547.773 33.8774C550.486 36.5939 553.204 39.3058 555.922 42.0177C562.336 48.4175 568.742 54.8251 575.143 61.2377C581.734 67.8398 588.337 74.429 594.947 81.012C600.636 86.6789 606.317 92.3535 611.992 98.0343C615.376 101.421 618.762 104.805 622.155 108.181C625.346 111.356 628.526 114.54 631.699 117.733C632.861 118.898 634.027 120.06 635.196 121.219C649.032 134.94 649.032 134.941 651.188 144.728C650.528 144.728 649.868 144.728 649.188 144.728C649.188 143.738 649.188 142.748 649.188 141.728C647.876 141.737 646.564 141.746 645.213 141.755C632.811 141.836 620.41 141.896 608.008 141.935C601.633 141.956 595.259 141.984 588.884 142.03C582.724 142.074 576.565 142.097 570.405 142.108C568.062 142.115 565.72 142.129 563.378 142.151C546.158 142.304 531.519 142.101 518.188 129.728C509.005 119.284 507.023 108.101 507.074 94.5919C507.074 93.5864 507.074 92.5809 507.074 91.545C507.074 88.2336 507.082 84.9223 507.09 81.611C507.092 79.3103 507.093 77.0095 507.094 74.7088C507.098 68.6623 507.108 62.6158 507.119 56.5693C507.129 50.3957 507.134 44.2221 507.139 38.0485C507.15 25.9417 507.167 13.8349 507.188 1.72815Z'\r\n\t\t\t\tfill='#4F4F4F'\r\n\t\t\t/>\r\n\t\t</svg>\r\n\t)\r\n}\r\n","import * as React from \"react\"\r\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\"\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Search } from \"lucide-react\"\r\n\r\nconst Command = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\r\n\t\t\t\"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommand.displayName = \"Command\"\r\n\r\nconst CommandInput = React.forwardRef<\r\n\tHTMLInputElement,\r\n\tReact.ComponentProps<\"input\"> & {\r\n\t\tonValueChange?: (value: string) => void\r\n\t}\r\n>(({ className, onValueChange, ...props }, ref) => {\r\n\tconst [value, setValue] = React.useState(props.value || \"\")\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (props.value !== undefined) {\r\n\t\t\tsetValue(String(props.value))\r\n\t\t}\r\n\t}, [props.value])\r\n\r\n\tconst handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n\t\tconst newValue = e.target.value\r\n\t\tsetValue(newValue)\r\n\t\tonValueChange?.(newValue)\r\n\t\tif (props.onChange) {\r\n\t\t\tprops.onChange(e)\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div className=\"flex items-center border-b px-3\">\r\n\t\t\t<Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\r\n\t\t\t<input\r\n\t\t\t\tref={ref}\r\n\t\t\t\t{...props}\r\n\t\t\t\tvalue={value}\r\n\t\t\t\tonChange={handleChange}\r\n\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\r\n\t\t\t\t\tclassName\r\n\t\t\t\t)}\r\n\t\t\t/>\r\n\t\t</div>\r\n\t)\r\n})\r\nCommandInput.displayName = \"CommandInput\"\r\n\r\nconst CommandList = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommandList.displayName = \"CommandList\"\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\"py-6 text-center text-sm\", className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommandEmpty.displayName = \"CommandEmpty\"\r\n\r\nconst CommandGroup = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement> & {\r\n\t\theading?: string\r\n\t}\r\n>(({ className, heading, ...props }, ref) => (\r\n\t<div ref={ref} className={cn(\"overflow-hidden p-1 text-foreground\", className)} {...props}>\r\n\t\t{heading && (\r\n\t\t\t<div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground\">\r\n\t\t\t\t{heading}\r\n\t\t\t</div>\r\n\t\t)}\r\n\t\t<div>\r\n\t\t\t{props.children}\r\n\t\t</div>\r\n\t</div>\r\n))\r\nCommandGroup.displayName = \"CommandGroup\"\r\n\r\nconst CommandItem = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement> & {\r\n\t\tonSelect?: () => void\r\n\t\tvalue?: string\r\n\t}\r\n>(({ className, onSelect, ...props }, ref) => {\r\n\tconst handleClick = () => {\r\n\t\tonSelect?.()\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\tonClick={handleClick}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nCommandItem.displayName = \"CommandItem\"\r\n\r\nconst CommandDialog = ({\r\n\topen,\r\n\tonOpenChange,\r\n\tchildren,\r\n}: {\r\n\topen: boolean\r\n\tonOpenChange: (open: boolean) => void\r\n\tchildren: React.ReactNode\r\n}) => {\r\n\treturn (\r\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\r\n\t\t\t<DialogContent className=\"overflow-hidden p-0\">\r\n\t\t\t\t<Command>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</Command>\r\n\t\t\t</DialogContent>\r\n\t\t</Dialog>\r\n\t)\r\n}\r\n\r\nexport {\r\n\tCommand,\r\n\tCommandDialog,\r\n\tCommandEmpty,\r\n\tCommandGroup,\r\n\tCommandInput,\r\n\tCommandItem,\r\n\tCommandList,\r\n}\r\n\r\n","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\r\n>(({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-lg font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n\r\n","import { FileInfo } from '@/plugin'\r\n\r\n/**\r\n * Определяет доступные языки для версии\r\n */\r\nconst LANGUAGE_PATTERN = /^[a-z]{2}$/\r\nexport function getAvailableLanguages(\r\n\tversion: string,\r\n\tfiles: FileInfo[]\r\n): string[] {\r\n\tconst versionFiles = files.filter(file => {\r\n\t\tconst pathParts = file.relativePath.split(/[\\\\/]/)\r\n\t\treturn pathParts[0] === version\r\n\t})\r\n\r\n\t// Ищем папки с языками на уровне версии (depth = 1)\r\n\tconst languageDirs = versionFiles.filter(\r\n\t\tf =>\r\n\t\t\tf.depth === 1 && f.type === 'directory' && LANGUAGE_PATTERN.test(f.name)\r\n\t)\r\n\r\n\tif (languageDirs.length === 0) {\r\n\t\treturn []\r\n\t}\r\n\r\n\treturn languageDirs.map(dir => dir.name).sort()\r\n}\r\n","import { FileInfo } from '@/plugin'\r\n\r\n/**\r\n * Определяет тип сущности по имени файла/папки (клиентская версия)\r\n */\r\nconst GROUP_PATTERN = /^\\(group-.*\\)$/\r\nconst BUTTON_PATTERN = /\\.button\\.md$/\r\n\r\nexport function getEntityType(\r\n\titem: FileInfo,\r\n\tallFiles: FileInfo[]\r\n): 'page' | 'dropdown' | 'group' | 'button' | null {\r\n\tif (item.type === 'file') {\r\n\t\tif (BUTTON_PATTERN.test(item.name)) {\r\n\t\t\treturn 'button'\r\n\t\t}\r\n\t\tif (item.extension === 'md') {\r\n\t\t\treturn 'page'\r\n\t\t}\r\n\t\treturn null\r\n\t}\r\n\r\n\tif (item.type === 'directory') {\r\n\t\tif (GROUP_PATTERN.test(item.name)) {\r\n\t\t\treturn 'group'\r\n\t\t}\r\n\t\t// Проверяем, есть ли внутри файлы\r\n\t\tconst hasFiles = allFiles.some(\r\n\t\t\tf =>\r\n\t\t\t\tf.relativePath.startsWith(item.relativePath + '/') ||\r\n\t\t\t\t(f.relativePath.startsWith(item.relativePath + '\\\\') &&\r\n\t\t\t\t\tf.type === 'file')\r\n\t\t)\r\n\t\tif (hasFiles) {\r\n\t\t\treturn 'dropdown'\r\n\t\t}\r\n\t}\r\n\r\n\treturn null\r\n}\r\n","import { DocumentationEntity, PageFrontmatter } from '../types'\r\n\r\nexport const isPage = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'page' }> => e.type === 'page'\r\n\r\nexport const isButton = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'button' }> => e.type === 'button'\r\n\r\nexport const isDropdown = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'dropdown' }> =>\r\n\te.type === 'dropdown'\r\n\r\nexport const isGroup = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'group' }> => e.type === 'group'\r\n\r\nexport function getFrontmatter(\r\n\te: DocumentationEntity\r\n): PageFrontmatter | undefined {\r\n\treturn isPage(e) ? e.frontmatter : undefined\r\n}\r\n\r\nexport function isHidden(e: DocumentationEntity): boolean {\r\n\tif (isPage(e)) return e.frontmatter?.hidden ?? false\r\n\tif (isButton(e)) return e.settings.hidden ?? false\r\n\tif (isDropdown(e)) return e.settings?.hidden ?? false\r\n\tif (isGroup(e)) return e.settings?.hidden ?? false\r\n\treturn false\r\n}\r\n","import { DocumentationEntity } from '../types'\r\nimport { isButton, isDropdown, isGroup } from './types-helper'\r\n\r\nexport function getSortEntities(\r\n\tlist: DocumentationEntity[]\r\n): DocumentationEntity[] {\r\n\treturn list.sort((a, b) => {\r\n\t\tconst ao = isButton(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: isGroup(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: isDropdown(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: a.frontmatter?.order ?? 100\r\n\r\n\t\tconst bo = isButton(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: isGroup(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: isDropdown(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: b.frontmatter?.order ?? 100\r\n\r\n\t\tif (ao !== bo) return ao - bo\r\n\r\n\t\tconst at = isButton(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: isGroup(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: isDropdown(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: a.frontmatter?.title ?? ''\r\n\r\n\t\tconst bt = isButton(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: isGroup(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: isDropdown(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: b.frontmatter?.title ?? ''\r\n\r\n\t\treturn at.localeCompare(bt)\r\n\t})\r\n}\r\n","import { DocumentationEntity } from '../types'\r\n\r\nexport function getTitle(entity: DocumentationEntity): string {\r\n\tif (entity.type === 'page') {\r\n\t\treturn entity.frontmatter?.title || entity.file.name.replaceAll('.md', '')\r\n\t}\r\n\tif (entity.type === 'button') {\r\n\t\treturn entity.settings.title\r\n\t}\r\n\tif (entity.type === 'dropdown') {\r\n\t\treturn entity.settings?.title || entity.folder.name\r\n\t}\r\n\tif (entity.type === 'group') {\r\n\t\treturn (\r\n\t\t\tentity.settings?.title ||\r\n\t\t\tentity.folder.name.replace(/^\\(group-/, '').replace(/\\)$/, '')\r\n\t\t)\r\n\t}\r\n\treturn ''\r\n}\r\n","export const LANGUAGE_PATTERN = /^[a-z]{2}$/\r\nexport const BUTTON_PATTERN = /\\.button\\.md$/\r\nexport const VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+/\r\nexport const GROUP_PATTERN = /^\\(group-.*\\)$/\r\n","import { Button } from '@/components/ui/button'\r\nimport {\r\n\tCommandDialog,\r\n\tCommandEmpty,\r\n\tCommandGroup,\r\n\tCommandInput,\r\n\tCommandItem,\r\n\tCommandList,\r\n} from '@/components/ui/command'\r\nimport { getTitle } from '@/lib/documentation/helpers'\r\nimport type {\r\n\tDocumentationEntity,\r\n\tVersionStructure,\r\n} from '@/lib/documentation/types'\r\nimport { Search } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\ninterface SearchBarProps {\r\n\tdocumentationStructure: VersionStructure[]\r\n\tselectedVersion: string | undefined\r\n\tselectedLanguage: string | null\r\n\tonPageSelect: (filePath: string | null) => void\r\n\tscannedFiles?: {\r\n\t\tfiles: Array<{\r\n\t\t\trelativePath: string\r\n\t\t\toriginalRelativePath?: string\r\n\t\t\tcontent?: string\r\n\t\t}>\r\n\t}\r\n}\r\n\r\ninterface SearchResult {\r\n\tentity: DocumentationEntity\r\n\tversion: string\r\n\tpath: string\r\n\ttitle: string\r\n\tcontent?: string // Содержимое файла для поиска\r\n\tsnippet?: string // Фрагмент текста с найденным словом\r\n}\r\n\r\nexport function SearchBar({\r\n\tdocumentationStructure,\r\n\tselectedVersion,\r\n\tselectedLanguage,\r\n\tonPageSelect,\r\n\tscannedFiles,\r\n}: SearchBarProps) {\r\n\tconst [open, setOpen] = React.useState(false)\r\n\tconst [query, setQuery] = React.useState('')\r\n\r\n\t// Создаем Map для быстрого доступа к содержимому файлов\r\n\tconst contentMap = React.useMemo(() => {\r\n\t\tconst map = new Map<string, string>()\r\n\t\tif (scannedFiles?.files) {\r\n\t\t\tfor (const file of scannedFiles.files) {\r\n\t\t\t\tconst key = file.originalRelativePath || file.relativePath\r\n\t\t\t\tif (file.content) {\r\n\t\t\t\t\tmap.set(key, file.content)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn map\r\n\t}, [scannedFiles])\r\n\r\n\t// Получаем все страницы для поиска\r\n\tconst searchablePages = React.useMemo(() => {\r\n\t\tconst results: SearchResult[] = []\r\n\r\n\t\tfor (const structure of documentationStructure) {\r\n\t\t\t// Фильтруем по выбранной версии, если она задана\r\n\t\t\tif (selectedVersion && structure.version !== selectedVersion) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tconst collectPages = (\r\n\t\t\t\tentities: DocumentationEntity[],\r\n\t\t\t\tversion: string\r\n\t\t\t): void => {\r\n\t\t\t\tfor (const entity of entities) {\r\n\t\t\t\t\tif (entity.type === 'page') {\r\n\t\t\t\t\t\t// Проверяем searchable\r\n\t\t\t\t\t\tif (entity.frontmatter?.searchable === false) {\r\n\t\t\t\t\t\t\tcontinue\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst filePath =\r\n\t\t\t\t\t\t\tentity.file.originalRelativePath || entity.file.relativePath\r\n\t\t\t\t\t\tconst title = getTitle(entity)\r\n\r\n\t\t\t\t\t\t// Получаем содержимое файла из Map\r\n\t\t\t\t\t\tconst content = contentMap.get(filePath)\r\n\r\n\t\t\t\t\t\tresults.push({\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\t\tpath: filePath,\r\n\t\t\t\t\t\t\ttitle,\r\n\t\t\t\t\t\t\tcontent,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else if (entity.type === 'dropdown' || entity.type === 'group') {\r\n\t\t\t\t\t\t// Рекурсивно собираем страницы из dropdown и group\r\n\t\t\t\t\t\tcollectPages(entity.pages, version)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcollectPages(structure.entities, structure.version)\r\n\t\t}\r\n\r\n\t\treturn results\r\n\t}, [documentationStructure, selectedVersion, contentMap])\r\n\r\n\t// Функция для извлечения фрагмента текста с найденным словом\r\n\tconst extractSnippet = (\r\n\t\tcontent: string,\r\n\t\tquery: string,\r\n\t\tmaxLength = 150\r\n\t): string => {\r\n\t\tconst lowerContent = content.toLowerCase()\r\n\t\tconst lowerQuery = query.toLowerCase()\r\n\t\tconst index = lowerContent.indexOf(lowerQuery)\r\n\r\n\t\tif (index === -1) return ''\r\n\r\n\t\t// Находим начало фрагмента (стараемся взять целое предложение)\r\n\t\tlet start = Math.max(0, index - maxLength / 2)\r\n\t\t// Ищем начало предложения или пробел\r\n\t\tconst beforeMatch = content.substring(start, index)\r\n\t\tconst lastSentence = beforeMatch.lastIndexOf('. ')\r\n\t\tconst lastNewline = beforeMatch.lastIndexOf('\\n')\r\n\t\tconst lastSpace = beforeMatch.lastIndexOf(' ')\r\n\r\n\t\tconst bestStart = Math.max(\r\n\t\t\tlastSentence + 2,\r\n\t\t\tlastNewline + 1,\r\n\t\t\tlastSpace + 1,\r\n\t\t\tstart\r\n\t\t)\r\n\r\n\t\t// Находим конец фрагмента\r\n\t\tlet end = Math.min(content.length, index + query.length + maxLength / 2)\r\n\t\t// Ищем конец предложения или пробел\r\n\t\tconst afterMatch = content.substring(index + query.length, end)\r\n\t\tconst nextSentence = afterMatch.indexOf('. ')\r\n\t\tconst nextNewline = afterMatch.indexOf('\\n')\r\n\t\tconst nextSpace = afterMatch.indexOf(' ')\r\n\r\n\t\tlet bestEnd = end\r\n\t\tif (nextSentence !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextSentence + 1\r\n\t\t} else if (nextNewline !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextNewline\r\n\t\t} else if (nextSpace !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextSpace\r\n\t\t}\r\n\r\n\t\tlet snippet = content.substring(bestStart, bestEnd).trim()\r\n\r\n\t\t// Добавляем многоточие если обрезали\r\n\t\tif (bestStart > 0) snippet = '...' + snippet\r\n\t\tif (bestEnd < content.length) snippet = snippet + '...'\r\n\r\n\t\treturn snippet\r\n\t}\r\n\r\n\t// Фильтруем результаты по запросу и извлекаем фрагменты\r\n\tconst filteredResults = React.useMemo(() => {\r\n\t\tif (!query.trim()) return []\r\n\r\n\t\tconst lowerQuery = query.toLowerCase().trim()\r\n\r\n\t\treturn searchablePages\r\n\t\t\t.filter(page => {\r\n\t\t\t\tconst titleMatch = page.title.toLowerCase().includes(lowerQuery)\r\n\t\t\t\tconst pathMatch = page.path.toLowerCase().includes(lowerQuery)\r\n\t\t\t\tconst contentMatch = page.content?.includes(lowerQuery) ?? false\r\n\r\n\t\t\t\treturn titleMatch || pathMatch || contentMatch\r\n\t\t\t})\r\n\t\t\t.map(page => {\r\n\t\t\t\tlet snippet: string | undefined\r\n\r\n\t\t\t\t// Если найдено в содержимом, извлекаем фрагмент\r\n\t\t\t\tif (page.content?.includes(lowerQuery)) {\r\n\t\t\t\t\tsnippet = extractSnippet(page.content, query)\r\n\t\t\t\t} else if (page.title.toLowerCase().includes(lowerQuery)) {\r\n\t\t\t\t\t// Если найдено только в заголовке, используем заголовок как snippet\r\n\t\t\t\t\tsnippet = page.title\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\t...page,\r\n\t\t\t\t\tsnippet,\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t}, [query, searchablePages])\r\n\r\n\t// Обработка выбора страницы\r\n\tconst handleSelect = (path: string) => {\r\n\t\tonPageSelect(path)\r\n\t\tsetOpen(false)\r\n\t\tsetQuery('')\r\n\t}\r\n\r\n\t// Обработка горячих клавиш\r\n\tReact.useEffect(() => {\r\n\t\tconst down = (e: KeyboardEvent) => {\r\n\t\t\tif (e.key === 'k' && (e.metaKey || e.ctrlKey)) {\r\n\t\t\t\te.preventDefault()\r\n\t\t\t\tsetOpen(open => !open)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdocument.addEventListener('keydown', down)\r\n\t\treturn () => document.removeEventListener('keydown', down)\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Button\r\n\t\t\t\tvariant='outline'\r\n\t\t\t\tclassName='relative h-9 w-full justify-start text-sm text-muted-foreground sm:pr-12 md:w-64 lg:w-80'\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t<Search className='mr-2 h-4 w-4' />\r\n\t\t\t\t<span className='hidden lg:inline-flex'>Поиск документации...</span>\r\n\t\t\t\t<span className='inline-flex lg:hidden'>Поиск...</span>\r\n\t\t\t\t<kbd className='pointer-events-none absolute right-1.5 top-1.5 hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 sm:flex'>\r\n\t\t\t\t\t<span className='text-xs'>⌘</span>K\r\n\t\t\t\t</kbd>\r\n\t\t\t</Button>\r\n\r\n\t\t\t<CommandDialog open={open} onOpenChange={setOpen}>\r\n\t\t\t\t<CommandInput\r\n\t\t\t\t\tplaceholder='Поиск по документации...'\r\n\t\t\t\t\tvalue={query}\r\n\t\t\t\t\tonValueChange={setQuery}\r\n\t\t\t\t/>\r\n\t\t\t\t<CommandList>\r\n\t\t\t\t\t{filteredResults.length === 0 && query.trim() && (\r\n\t\t\t\t\t\t<CommandEmpty>Ничего не найдено.</CommandEmpty>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{filteredResults.length > 0 && (\r\n\t\t\t\t\t\t<CommandGroup heading='Страницы'>\r\n\t\t\t\t\t\t\t{filteredResults.map((result, index) => {\r\n\t\t\t\t\t\t\t\t// Выделяем найденное слово в snippet\r\n\t\t\t\t\t\t\t\tconst highlightSnippet = (text: string, query: string) => {\r\n\t\t\t\t\t\t\t\t\tif (!text || !query) return text\r\n\t\t\t\t\t\t\t\t\tconst regex = new RegExp(\r\n\t\t\t\t\t\t\t\t\t\t`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`,\r\n\t\t\t\t\t\t\t\t\t\t'gi'\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\tconst parts = text.split(regex)\r\n\t\t\t\t\t\t\t\t\treturn parts.map((part, i) =>\r\n\t\t\t\t\t\t\t\t\t\tpart.toLowerCase() === query.toLowerCase() ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<mark\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={i}\r\n\t\t\t\t\t\t\t\t\t\t\t\tclassName='bg-primary/20 text-primary font-medium px-0.5 rounded'\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{part}\r\n\t\t\t\t\t\t\t\t\t\t\t</mark>\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\tpart\r\n\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<CommandItem\r\n\t\t\t\t\t\t\t\t\t\tkey={`${result.version}-${result.path}-${index}`}\r\n\t\t\t\t\t\t\t\t\t\tvalue={`${result.title} ${result.path}`}\r\n\t\t\t\t\t\t\t\t\t\tonSelect={() => handleSelect(result.path)}\r\n\t\t\t\t\t\t\t\t\t\tclassName='cursor-pointer'\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div className='flex flex-col gap-1'>\r\n\t\t\t\t\t\t\t\t\t\t\t<span className='font-medium'>{result.title}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t{result.snippet && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground line-clamp-2'>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{highlightSnippet(result.snippet, query)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground/70'>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{result.version} • {result.path}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</CommandItem>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</CommandGroup>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{!query.trim() && (\r\n\t\t\t\t\t\t<CommandEmpty>Введите запрос для поиска...</CommandEmpty>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</CommandList>\r\n\t\t\t</CommandDialog>\r\n\t\t</>\r\n\t)\r\n}\r\n","import { FileText } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n\tSelect,\r\n\tSelectContent,\r\n\tSelectItem,\r\n\tSelectTrigger,\r\n\tSelectValue,\r\n} from '@/components/ui/select'\r\nimport {\r\n\tSidebar,\r\n\tSidebarContent,\r\n\tSidebarGroup,\r\n\tSidebarGroupLabel,\r\n\tSidebarHeader,\r\n\tSidebarMenu,\r\n\tSidebarMenuButton,\r\n\tSidebarMenuItem,\r\n} from '@/components/ui/sidebar'\r\nimport {\r\n\tDocumentationProps,\r\n\tInternalDocumentationProps,\r\n} from '../types/DocumentationProps'\r\nimport { DocumentationEntityItem } from './documentation-entity-item'\r\n\r\nexport function AppSidebar({\r\n\ttitle,\r\n\tlogo,\r\n\tversionSelect,\r\n\tversions = [],\r\n\tdocumentationStructure = [],\r\n\tonPageSelect,\r\n\tversionStorageKey,\r\n\t...props\r\n}: React.ComponentProps<typeof Sidebar> &\r\n\tDocumentationProps &\r\n\tInternalDocumentationProps & {\r\n\t\tversionStorageKey?: string\r\n\t}) {\r\n\t// Восстанавливаем сохраненную версию из localStorage\r\n\tconst [selectedVersion, setSelectedVersion] = React.useState<\r\n\t\tstring | undefined\r\n\t>(() => {\r\n\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\tif (saved && versions.includes(saved)) {\r\n\t\t\t\treturn saved\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn versions[0]\r\n\t})\r\n\r\n\tconst [openDropdowns, setOpenDropdowns] = React.useState<Set<string>>(\r\n\t\tnew Set()\r\n\t)\r\n\r\n\t// Обновляем selectedVersion когда versions загружается или меняется\r\n\tReact.useEffect(() => {\r\n\t\tif (versions.length > 0) {\r\n\t\t\t// Проверяем сохраненную версию\r\n\t\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\t\tif (saved && versions.includes(saved)) {\r\n\t\t\t\t\tsetSelectedVersion(saved)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Если сохраненной версии нет или она невалидна, используем первую доступную\r\n\t\t\tif (!selectedVersion || !versions.includes(selectedVersion)) {\r\n\t\t\t\tsetSelectedVersion(versions[0])\r\n\t\t\t}\r\n\t\t}\r\n\t}, [versions, versionStorageKey])\r\n\r\n\t// Сохраняем selectedVersion в localStorage при изменении\r\n\tReact.useEffect(() => {\r\n\t\tif (versionStorageKey && selectedVersion && typeof window !== 'undefined') {\r\n\t\t\tlocalStorage.setItem(versionStorageKey, selectedVersion)\r\n\t\t}\r\n\t}, [selectedVersion, versionStorageKey])\r\n\r\n\t// Получаем структуру для выбранной версии\r\n\tconst currentStructure = React.useMemo(() => {\r\n\t\tif (!selectedVersion) return null\r\n\t\treturn documentationStructure.find(s => s.version === selectedVersion)\r\n\t}, [selectedVersion, documentationStructure])\r\n\r\n\tconst toggleDropdown = (path: string) => {\r\n\t\tsetOpenDropdowns(prev => {\r\n\t\t\tconst next = new Set(prev)\r\n\t\t\tif (next.has(path)) {\r\n\t\t\t\tnext.delete(path)\r\n\t\t\t} else {\r\n\t\t\t\tnext.add(path)\r\n\t\t\t}\r\n\t\t\treturn next\r\n\t\t})\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Sidebar {...props}>\r\n\t\t\t<SidebarHeader>\r\n\t\t\t\t<div className='flex items-center justify-between gap-2 px-2 py-2'>\r\n\t\t\t\t\t<a\r\n\t\t\t\t\t\thref='/'\r\n\t\t\t\t\t\tclassName='flex items-center gap-3 rounded-md px-2 py-1.5 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground transition-colors'\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div className='flex aspect-square size-8 items-center justify-center text-primary-foreground'>\r\n\t\t\t\t\t\t\t{logo}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<span className='font-semibold'>{title}</span>\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t{versionSelect ? (\r\n\t\t\t\t\t\t<Select\r\n\t\t\t\t\t\t\tvalue={selectedVersion || ''}\r\n\t\t\t\t\t\t\tonValueChange={value => {\r\n\t\t\t\t\t\t\t\tsetSelectedVersion(value)\r\n\t\t\t\t\t\t\t\t// При смене версии очищаем выбранную страницу,\r\n\t\t\t\t\t\t\t\t// так как она может не существовать в новой версии\r\n\t\t\t\t\t\t\t\tif (onPageSelect) {\r\n\t\t\t\t\t\t\t\t\tonPageSelect(null)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<SelectTrigger className='h-6 w-auto min-w-16 border border-sidebar-border bg-sidebar-accent/50 hover:bg-sidebar-accent shadow-none focus:ring-0 focus:ring-offset-0 p-0 px-2 text-xs'>\r\n\t\t\t\t\t\t\t\t<SelectValue />\r\n\t\t\t\t\t\t\t</SelectTrigger>\r\n\t\t\t\t\t\t\t<SelectContent>\r\n\t\t\t\t\t\t\t\t{versions.map(version => (\r\n\t\t\t\t\t\t\t\t\t<SelectItem key={version} value={version}>\r\n\t\t\t\t\t\t\t\t\t\t{version}\r\n\t\t\t\t\t\t\t\t\t</SelectItem>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</SelectContent>\r\n\t\t\t\t\t\t</Select>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<div className='h-6 w-auto min-w-16 border border-sidebar-border bg-sidebar-accent/50 shadow-none focus:ring-0 text-center items-center justify-center flex rounded-md focus:ring-offset-0 p-0 px-2 text-xs text-white'>\r\n\t\t\t\t\t\t\t<span className='text-sm text-foreground'>\r\n\t\t\t\t\t\t\t\t{versions[0] || 'N/A'}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t</SidebarHeader>\r\n\t\t\t<SidebarContent>\r\n\t\t\t\t{currentStructure && currentStructure.entities.length > 0 ? (\r\n\t\t\t\t\t<SidebarGroup>\r\n\t\t\t\t\t\t<SidebarMenu>\r\n\t\t\t\t\t\t\t{currentStructure.entities.map((entity, index) => {\r\n\t\t\t\t\t\t\t\tconst entityKey =\r\n\t\t\t\t\t\t\t\t\tentity.type === 'page' || entity.type === 'button'\r\n\t\t\t\t\t\t\t\t\t\t? entity.file.originalRelativePath ||\r\n\t\t\t\t\t\t\t\t\t\t entity.file.relativePath\r\n\t\t\t\t\t\t\t\t\t\t: entity.folder.originalRelativePath ||\r\n\t\t\t\t\t\t\t\t\t\t entity.folder.relativePath\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<DocumentationEntityItem\r\n\t\t\t\t\t\t\t\t\t\tkey={`${entity.type}-${index}-${entityKey}`}\r\n\t\t\t\t\t\t\t\t\t\tentity={entity}\r\n\t\t\t\t\t\t\t\t\t\topenDropdowns={openDropdowns}\r\n\t\t\t\t\t\t\t\t\t\tonToggleDropdown={toggleDropdown}\r\n\t\t\t\t\t\t\t\t\t\tonPageSelect={onPageSelect}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</SidebarMenu>\r\n\t\t\t\t\t</SidebarGroup>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<SidebarGroup>\r\n\t\t\t\t\t\t<SidebarGroupLabel>Документация</SidebarGroupLabel>\r\n\t\t\t\t\t\t<SidebarMenu>\r\n\t\t\t\t\t\t\t<SidebarMenuItem>\r\n\t\t\t\t\t\t\t\t<SidebarMenuButton disabled>\r\n\t\t\t\t\t\t\t\t\t<FileText />\r\n\t\t\t\t\t\t\t\t\t<span>Нет документации</span>\r\n\t\t\t\t\t\t\t\t</SidebarMenuButton>\r\n\t\t\t\t\t\t\t</SidebarMenuItem>\r\n\t\t\t\t\t\t</SidebarMenu>\r\n\t\t\t\t\t</SidebarGroup>\r\n\t\t\t\t)}\r\n\t\t\t</SidebarContent>\r\n\t\t</Sidebar>\r\n\t)\r\n}\r\n","import { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { PanelLeft } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/ui/button'\r\nimport { Input } from '@/components/ui/input'\r\nimport { Separator } from '@/components/ui/separator'\r\nimport {\r\n\tSheet,\r\n\tSheetContent,\r\n\tSheetDescription,\r\n\tSheetHeader,\r\n\tSheetTitle,\r\n} from '@/components/ui/sheet'\r\nimport { Skeleton } from '@/components/ui/skeleton'\r\nimport {\r\n\tTooltip,\r\n\tTooltipContent,\r\n\tTooltipProvider,\r\n\tTooltipTrigger,\r\n} from '@/components/ui/tooltip'\r\nimport { useIsMobile } from '@/hooks/use-mobile'\r\nimport { cn } from '@/lib/utils'\r\n\r\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state'\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\r\nconst SIDEBAR_WIDTH = '20rem'\r\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\r\nconst SIDEBAR_WIDTH_ICON = '3rem'\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\r\n\r\ntype SidebarContextProps = {\r\n\tstate: 'expanded' | 'collapsed'\r\n\topen: boolean\r\n\tsetOpen: (open: boolean) => void\r\n\topenMobile: boolean\r\n\tsetOpenMobile: (open: boolean) => void\r\n\tisMobile: boolean\r\n\ttoggleSidebar: () => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\r\n\r\nfunction useSidebar() {\r\n\tconst context = React.useContext(SidebarContext)\r\n\tif (!context) {\r\n\t\tthrow new Error('useSidebar must be used within a SidebarProvider.')\r\n\t}\r\n\r\n\treturn context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tdefaultOpen?: boolean\r\n\t\topen?: boolean\r\n\t\tonOpenChange?: (open: boolean) => void\r\n\t}\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tdefaultOpen = true,\r\n\t\t\topen: openProp,\r\n\t\t\tonOpenChange: setOpenProp,\r\n\t\t\tclassName,\r\n\t\t\tstyle,\r\n\t\t\tchildren,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst isMobile = useIsMobile()\r\n\t\tconst [openMobile, setOpenMobile] = React.useState(false)\r\n\r\n\t\t// This is the internal state of the sidebar.\r\n\t\t// We use openProp and setOpenProp for control from outside the component.\r\n\t\tconst [_open, _setOpen] = React.useState(defaultOpen)\r\n\t\tconst open = openProp ?? _open\r\n\t\tconst setOpen = React.useCallback(\r\n\t\t\t(value: boolean | ((value: boolean) => boolean)) => {\r\n\t\t\t\tconst openState = typeof value === 'function' ? value(open) : value\r\n\t\t\t\tif (setOpenProp) {\r\n\t\t\t\t\tsetOpenProp(openState)\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_setOpen(openState)\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// This sets the cookie to keep the sidebar state.\r\n\t\t\t\tdocument.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\r\n\t\t\t},\r\n\t\t\t[setOpenProp, open]\r\n\t\t)\r\n\r\n\t\t// Helper to toggle the sidebar.\r\n\t\tconst toggleSidebar = React.useCallback(() => {\r\n\t\t\treturn isMobile ? setOpenMobile(open => !open) : setOpen(open => !open)\r\n\t\t}, [isMobile, setOpen, setOpenMobile])\r\n\r\n\t\t// Adds a keyboard shortcut to toggle the sidebar.\r\n\t\tReact.useEffect(() => {\r\n\t\t\tconst handleKeyDown = (event: KeyboardEvent) => {\r\n\t\t\t\tif (\r\n\t\t\t\t\tevent.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n\t\t\t\t\t(event.metaKey || event.ctrlKey)\r\n\t\t\t\t) {\r\n\t\t\t\t\tevent.preventDefault()\r\n\t\t\t\t\ttoggleSidebar()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\twindow.addEventListener('keydown', handleKeyDown)\r\n\t\t\treturn () => window.removeEventListener('keydown', handleKeyDown)\r\n\t\t}, [toggleSidebar])\r\n\r\n\t\t// We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n\t\t// This makes it easier to style the sidebar with Tailwind classes.\r\n\t\tconst state = open ? 'expanded' : 'collapsed'\r\n\r\n\t\tconst contextValue = React.useMemo<SidebarContextProps>(\r\n\t\t\t() => ({\r\n\t\t\t\tstate,\r\n\t\t\t\topen,\r\n\t\t\t\tsetOpen,\r\n\t\t\t\tisMobile,\r\n\t\t\t\topenMobile,\r\n\t\t\t\tsetOpenMobile,\r\n\t\t\t\ttoggleSidebar,\r\n\t\t\t}),\r\n\t\t\t[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n\t\t)\r\n\r\n\t\treturn (\r\n\t\t\t<SidebarContext.Provider value={contextValue}>\r\n\t\t\t\t<TooltipProvider delayDuration={0}>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tstyle={\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t'--sidebar-width': SIDEBAR_WIDTH,\r\n\t\t\t\t\t\t\t\t'--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\r\n\t\t\t\t\t\t\t\t...style,\r\n\t\t\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t\t'group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar',\r\n\t\t\t\t\t\t\tclassName\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\tref={ref}\r\n\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</TooltipProvider>\r\n\t\t\t</SidebarContext.Provider>\r\n\t\t)\r\n\t}\r\n)\r\nSidebarProvider.displayName = 'SidebarProvider'\r\n\r\nconst Sidebar = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tside?: 'left' | 'right'\r\n\t\tvariant?: 'sidebar' | 'floating' | 'inset'\r\n\t\tcollapsible?: 'offcanvas' | 'icon' | 'none'\r\n\t}\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tside = 'left',\r\n\t\t\tvariant = 'sidebar',\r\n\t\t\tcollapsible = 'offcanvas',\r\n\t\t\tclassName,\r\n\t\t\tchildren,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst { isMobile, state, openMobile, setOpenMobile } = useSidebar()\r\n\r\n\t\tif (collapsible === 'none') {\r\n\t\t\treturn (\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t'flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground',\r\n\t\t\t\t\t\tclassName\r\n\t\t\t\t\t)}\r\n\t\t\t\t\tref={ref}\r\n\t\t\t\t\t{...props}\r\n\t\t\t\t>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</div>\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\tif (isMobile) {\r\n\t\t\treturn (\r\n\t\t\t\t<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n\t\t\t\t\t<SheetContent\r\n\t\t\t\t\t\tdata-sidebar='sidebar'\r\n\t\t\t\t\t\tdata-mobile='true'\r\n\t\t\t\t\t\tclassName='w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden'\r\n\t\t\t\t\t\tstyle={\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t'--sidebar-width': SIDEBAR_WIDTH_MOBILE,\r\n\t\t\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tside={side}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<SheetHeader className='sr-only'>\r\n\t\t\t\t\t\t\t<SheetTitle>Sidebar</SheetTitle>\r\n\t\t\t\t\t\t\t<SheetDescription>Displays the mobile sidebar.</SheetDescription>\r\n\t\t\t\t\t\t</SheetHeader>\r\n\t\t\t\t\t\t<div className='flex h-full w-full flex-col'>{children}</div>\r\n\t\t\t\t\t</SheetContent>\r\n\t\t\t\t</Sheet>\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\treturn (\r\n\t\t\t<div\r\n\t\t\t\tref={ref}\r\n\t\t\t\tclassName='group peer hidden text-sidebar-foreground md:block'\r\n\t\t\t\tdata-state={state}\r\n\t\t\t\tdata-collapsible={state === 'collapsed' ? collapsible : ''}\r\n\t\t\t\tdata-variant={variant}\r\n\t\t\t\tdata-side={side}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t'relative hidden h-svh w-[--sidebar-width] transition-[width] duration-200 ease-linear md:flex',\r\n\t\t\t\t\t\t'group-data-[collapsible=offcanvas]:w-0',\r\n\t\t\t\t\t\tvariant === 'floating' || variant === 'inset'\r\n\t\t\t\t\t\t\t? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'\r\n\t\t\t\t\t\t\t: 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l',\r\n\t\t\t\t\t\tclassName\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{...props}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tdata-sidebar='sidebar'\r\n\t\t\t\t\t\tclassName='flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow'\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n)\r\nSidebar.displayName = 'Sidebar'\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n\tReact.ElementRef<typeof Button>,\r\n\tReact.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n\tconst { toggleSidebar } = useSidebar()\r\n\r\n\treturn (\r\n\t\t<Button\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='trigger'\r\n\t\t\tvariant='ghost'\r\n\t\t\tsize='icon'\r\n\t\t\tclassName={cn('h-7 w-7', className)}\r\n\t\t\tonClick={event => {\r\n\t\t\t\tonClick?.(event)\r\n\t\t\t\ttoggleSidebar()\r\n\t\t\t}}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t<PanelLeft />\r\n\t\t\t<span className='sr-only'>Toggle Sidebar</span>\r\n\t\t</Button>\r\n\t)\r\n})\r\nSidebarTrigger.displayName = 'SidebarTrigger'\r\n\r\nconst SidebarRail = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'>\r\n>(({ className, ...props }, ref) => {\r\n\tconst { toggleSidebar } = useSidebar()\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='rail'\r\n\t\t\taria-label='Toggle Sidebar'\r\n\t\t\ttabIndex={-1}\r\n\t\t\tonClick={toggleSidebar}\r\n\t\t\ttitle='Toggle Sidebar'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\r\n\t\t\t\t'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar',\r\n\t\t\t\t'[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\r\n\t\t\t\t'[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarRail.displayName = 'SidebarRail'\r\n\r\nconst SidebarInset = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'main'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<main\r\n\t\t\tref={ref}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'relative flex flex-1 flex-col bg-background transition-all duration-200 ease-linear',\r\n\t\t\t\t'md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarInset.displayName = 'SidebarInset'\r\n\r\nconst SidebarInput = React.forwardRef<\r\n\tReact.ElementRef<typeof Input>,\r\n\tReact.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<Input\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='input'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarInput.displayName = 'SidebarInput'\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='header'\r\n\t\t\tclassName={cn('flex flex-col gap-2 p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarHeader.displayName = 'SidebarHeader'\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='footer'\r\n\t\t\tclassName={cn('flex flex-col gap-2 p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarFooter.displayName = 'SidebarFooter'\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n\tReact.ElementRef<typeof Separator>,\r\n\tReact.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<Separator\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='separator'\r\n\t\t\tclassName={cn('mx-2 w-auto bg-sidebar-border', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarSeparator.displayName = 'SidebarSeparator'\r\n\r\nconst SidebarContent = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='content'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarContent.displayName = 'SidebarContent'\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group'\r\n\t\t\tclassName={cn('relative flex w-full min-w-0 flex-col p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroup.displayName = 'SidebarGroup'\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'div'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group-label'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'button'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group-action'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t// Increases the hit area of the button on mobile.\r\n\t\t\t\t'after:absolute after:-inset-2 after:md:hidden',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroupAction.displayName = 'SidebarGroupAction'\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tdata-sidebar='group-content'\r\n\t\tclassName={cn('w-full text-sm', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarGroupContent.displayName = 'SidebarGroupContent'\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n\tHTMLUListElement,\r\n\tReact.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n\t<ul\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu'\r\n\t\tclassName={cn('flex w-full min-w-0 flex-col gap-1', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenu.displayName = 'SidebarMenu'\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n\tHTMLLIElement,\r\n\tReact.ComponentProps<'li'>\r\n>(({ className, ...props }, ref) => (\r\n\t<li\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-item'\r\n\t\tclassName={cn('group/menu-item relative', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuItem.displayName = 'SidebarMenuItem'\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n\t'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t{\r\n\t\tvariants: {\r\n\t\t\tvariant: {\r\n\t\t\t\tdefault: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\r\n\t\t\t\toutline:\r\n\t\t\t\t\t'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\r\n\t\t\t},\r\n\t\t\tsize: {\r\n\t\t\t\tdefault: 'h-8 text-sm',\r\n\t\t\t\tsm: 'h-7 text-xs',\r\n\t\t\t\tlg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',\r\n\t\t\t},\r\n\t\t},\r\n\t\tdefaultVariants: {\r\n\t\t\tvariant: 'default',\r\n\t\t\tsize: 'default',\r\n\t\t},\r\n\t}\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & {\r\n\t\tasChild?: boolean\r\n\t\tisActive?: boolean\r\n\t\ttooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n\t} & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tasChild = false,\r\n\t\t\tisActive = false,\r\n\t\t\tvariant = 'default',\r\n\t\t\tsize = 'default',\r\n\t\t\ttooltip,\r\n\t\t\tclassName,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst Comp = asChild ? Slot : 'button'\r\n\t\tconst { isMobile, state } = useSidebar()\r\n\r\n\t\tconst button = (\r\n\t\t\t<Comp\r\n\t\t\t\tref={ref}\r\n\t\t\t\tdata-sidebar='menu-button'\r\n\t\t\t\tdata-size={size}\r\n\t\t\t\tdata-active={isActive}\r\n\t\t\t\tclassName={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n\t\t\t\t{...props}\r\n\t\t\t/>\r\n\t\t)\r\n\r\n\t\tif (!tooltip) {\r\n\t\t\treturn button\r\n\t\t}\r\n\r\n\t\tif (typeof tooltip === 'string') {\r\n\t\t\ttooltip = {\r\n\t\t\t\tchildren: tooltip,\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn (\r\n\t\t\t<Tooltip>\r\n\t\t\t\t<TooltipTrigger asChild>{button}</TooltipTrigger>\r\n\t\t\t\t<TooltipContent\r\n\t\t\t\t\tside='right'\r\n\t\t\t\t\talign='center'\r\n\t\t\t\t\thidden={state !== 'collapsed' || isMobile}\r\n\t\t\t\t\t{...tooltip}\r\n\t\t\t\t/>\r\n\t\t\t</Tooltip>\r\n\t\t)\r\n\t}\r\n)\r\nSidebarMenuButton.displayName = 'SidebarMenuButton'\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & {\r\n\t\tasChild?: boolean\r\n\t\tshowOnHover?: boolean\r\n\t}\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'button'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-action'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t// Increases the hit area of the button on mobile.\r\n\t\t\t\t'after:absolute after:-inset-2 after:md:hidden',\r\n\t\t\t\t'peer-data-[size=sm]/menu-button:top-1',\r\n\t\t\t\t'peer-data-[size=default]/menu-button:top-1.5',\r\n\t\t\t\t'peer-data-[size=lg]/menu-button:top-2.5',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tshowOnHover &&\r\n\t\t\t\t\t'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarMenuAction.displayName = 'SidebarMenuAction'\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-badge'\r\n\t\tclassName={cn(\r\n\t\t\t'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground',\r\n\t\t\t'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\r\n\t\t\t'peer-data-[size=sm]/menu-button:top-1',\r\n\t\t\t'peer-data-[size=default]/menu-button:top-1.5',\r\n\t\t\t'peer-data-[size=lg]/menu-button:top-2.5',\r\n\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tshowIcon?: boolean\r\n\t}\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n\t// Random width between 50 to 90%.\r\n\tconst width = React.useMemo(() => {\r\n\t\treturn `${Math.floor(Math.random() * 40) + 50}%`\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-skeleton'\r\n\t\t\tclassName={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{showIcon && (\r\n\t\t\t\t<Skeleton\r\n\t\t\t\t\tclassName='size-4 rounded-md'\r\n\t\t\t\t\tdata-sidebar='menu-skeleton-icon'\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<Skeleton\r\n\t\t\t\tclassName='h-4 max-w-[--skeleton-width] flex-1'\r\n\t\t\t\tdata-sidebar='menu-skeleton-text'\r\n\t\t\t\tstyle={\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t'--skeleton-width': width,\r\n\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t}\r\n\t\t\t/>\r\n\t\t</div>\r\n\t)\r\n})\r\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n\tHTMLUListElement,\r\n\tReact.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n\t<ul\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-sub'\r\n\t\tclassName={cn(\r\n\t\t\t'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\r\n\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuSub.displayName = 'SidebarMenuSub'\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n\tHTMLLIElement,\r\n\tReact.ComponentProps<'li'>\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n\tHTMLAnchorElement,\r\n\tReact.ComponentProps<'a'> & {\r\n\t\tasChild?: boolean\r\n\t\tsize?: 'sm' | 'md'\r\n\t\tisActive?: boolean\r\n\t}\r\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'a'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-sub-button'\r\n\t\t\tdata-size={size}\r\n\t\t\tdata-active={isActive}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\r\n\t\t\t\t'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\r\n\t\t\t\tsize === 'sm' && 'text-xs',\r\n\t\t\t\tsize === 'md' && 'text-sm',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\r\n\r\nexport {\r\n\tSidebar,\r\n\tSidebarContent,\r\n\tSidebarFooter,\r\n\tSidebarGroup,\r\n\tSidebarGroupAction,\r\n\tSidebarGroupContent,\r\n\tSidebarGroupLabel,\r\n\tSidebarHeader,\r\n\tSidebarInput,\r\n\tSidebarInset,\r\n\tSidebarMenu,\r\n\tSidebarMenuAction,\r\n\tSidebarMenuBadge,\r\n\tSidebarMenuButton,\r\n\tSidebarMenuItem,\r\n\tSidebarMenuSkeleton,\r\n\tSidebarMenuSub,\r\n\tSidebarMenuSubButton,\r\n\tSidebarMenuSubItem,\r\n\tSidebarProvider,\r\n\tSidebarRail,\r\n\tSidebarSeparator,\r\n\tSidebarTrigger,\r\n\tuseSidebar,\r\n}\r\n","import * as React from \"react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = \"Input\"\r\n\r\nexport { Input }\r\n","import * as React from \"react\"\r\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(\r\n (\r\n { className, orientation = \"horizontal\", decorative = true, ...props },\r\n ref\r\n ) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n \"shrink-0 bg-border\",\r\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }\r\n","import * as React from \"react\"\r\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Sheet = SheetPrimitive.Root\r\n\r\nconst SheetTrigger = SheetPrimitive.Trigger\r\n\r\nconst SheetClose = SheetPrimitive.Close\r\n\r\nconst SheetPortal = SheetPrimitive.Portal\r\n\r\nconst SheetOverlay = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\r\n\r\nconst sheetVariants = cva(\r\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n {\r\n variants: {\r\n side: {\r\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n bottom:\r\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\r\n right:\r\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\r\n },\r\n },\r\n defaultVariants: {\r\n side: \"right\",\r\n },\r\n }\r\n)\r\n\r\ninterface SheetContentProps\r\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\r\n VariantProps<typeof sheetVariants> {}\r\n\r\nconst SheetContent = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Content>,\r\n SheetContentProps\r\n>(({ side = \"right\", className, children, ...props }, ref) => (\r\n <SheetPortal>\r\n <SheetOverlay />\r\n <SheetPrimitive.Content\r\n ref={ref}\r\n className={cn(sheetVariants({ side }), className)}\r\n {...props}\r\n >\r\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </SheetPrimitive.Close>\r\n {children}\r\n </SheetPrimitive.Content>\r\n </SheetPortal>\r\n))\r\nSheetContent.displayName = SheetPrimitive.Content.displayName\r\n\r\nconst SheetHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetHeader.displayName = \"SheetHeader\"\r\n\r\nconst SheetFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetFooter.displayName = \"SheetFooter\"\r\n\r\nconst SheetTitle = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetTitle.displayName = SheetPrimitive.Title.displayName\r\n\r\nconst SheetDescription = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetDescription.displayName = SheetPrimitive.Description.displayName\r\n\r\nexport {\r\n Sheet,\r\n SheetPortal,\r\n SheetOverlay,\r\n SheetTrigger,\r\n SheetClose,\r\n SheetContent,\r\n SheetHeader,\r\n SheetFooter,\r\n SheetTitle,\r\n SheetDescription,\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </TooltipPrimitive.Portal>\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import * as React from \"react\"\r\n\r\nconst MOBILE_BREAKPOINT = 768\r\n\r\nexport function useIsMobile() {\r\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\r\n const onChange = () => {\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n }\r\n mql.addEventListener(\"change\", onChange)\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n return () => mql.removeEventListener(\"change\", onChange)\r\n }, [])\r\n\r\n return !!isMobile\r\n}\r\n","import * as LucideIcons from 'lucide-react'\r\n\r\n/**\r\n * Разрешает имя иконки в компонент из lucide-react\r\n */\r\nexport function resolveIcon(iconName?: string): React.ComponentType<{ className?: string }> | null {\r\n\tif (!iconName) return null\r\n\t\r\n\t// Преобразуем имя иконки в формат PascalCase\r\n\tconst pascalCaseName = iconName\r\n\t\t.split(/[-_\\s]/)\r\n\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n\t\t.join('')\r\n\t\r\n\t// Ищем иконку в lucide-react\r\n\tconst IconComponent = (LucideIcons as Record<string, React.ComponentType<{ className?: string }>>)[pascalCaseName]\r\n\t\r\n\treturn IconComponent || null\r\n}\r\n\r\n","import {\n\tSidebarMenuButton,\n\tSidebarMenuItem,\n\tSidebarMenuSub,\n\tSidebarMenuSubButton,\n\tSidebarMenuSubItem,\n} from '@/components/ui/sidebar'\nimport { resolveIcon } from '@/lib/documentation/icon-resolver'\nimport type { DocumentationEntity } from '@/lib/documentation/types'\nimport { FolderOpen } from 'lucide-react'\nimport * as React from 'react'\n\nfunction getEntityKey(entity: DocumentationEntity): string {\n\tif (entity.type === 'page' || entity.type === 'button') {\n\t\treturn entity.file.originalRelativePath || entity.file.relativePath\n\t}\n\treturn entity.folder.originalRelativePath || entity.folder.relativePath\n}\n\nfunction getEntityTitle(entity: DocumentationEntity): string {\n\tif (entity.type === 'page') {\n\t\treturn entity.frontmatter?.title || entity.file.name.replaceAll('.md', '')\n\t}\n\tif (entity.type === 'button') {\n\t\treturn entity.settings.title\n\t}\n\tif (entity.type === 'dropdown') {\n\t\treturn entity.settings?.title || entity.folder.name\n\t}\n\tif (entity.type === 'group') {\n\t\treturn (\n\t\t\tentity.settings?.title ||\n\t\t\tentity.folder.name.replace(/^\\(group-/, '').replace(/\\)$/, '')\n\t\t)\n\t}\n\treturn ''\n}\n\nfunction getEntityIcon(\n\tentity: DocumentationEntity\n): React.ComponentType<{ className?: string }> | null {\n\tif (entity.type === 'page') {\n\t\treturn resolveIcon(entity.frontmatter?.icon) || null\n\t}\n\tif (entity.type === 'button') {\n\t\treturn resolveIcon(entity.settings.icon)\n\t}\n\tif (entity.type === 'dropdown') {\n\t\treturn resolveIcon(entity.settings?.icon) || null\n\t}\n\tif (entity.type === 'group') {\n\t\treturn resolveIcon(entity.settings?.icon) || null\n\t}\n\treturn null\n}\n\ninterface DocumentationEntityItemProps {\n\treadonly entity: DocumentationEntity\n\treadonly openDropdowns: Set<string>\n\treadonly onToggleDropdown: (path: string) => void\n\treadonly onPageSelect?: (filePath: string | null) => void\n}\n\nexport function DocumentationEntityItem({\n\tentity,\n\topenDropdowns,\n\tonToggleDropdown,\n\tonPageSelect,\n}: DocumentationEntityItemProps) {\n\tconst entityKey = getEntityKey(entity)\n\tconst isOpen = openDropdowns.has(entityKey)\n\tconst Icon = getEntityIcon(entity)\n\n\tif (entity.type === 'page') {\n\t\tconst title = getEntityTitle(entity)\n\t\tconst filePath =\n\t\t\tentity.file.originalRelativePath || entity.file.relativePath\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton onClick={() => onPageSelect?.(filePath)} asChild>\n\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'button') {\n\t\tconst title = getEntityTitle(entity)\n\t\t// Если есть URL в метаданных, это ссылка (независимо от variant)\n\t\tconst url = entity.settings.url\n\n\t\tif (url) {\n\t\t\tconst target = entity.settings.target || '_self'\n\n\t\t\t// Останавливаем всплытие события, чтобы не вызывать onPageSelect\n\t\t\tconst handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\t// Для внешних ссылок открываем в новой вкладке\n\t\t\t\tif (target === '_blank') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer')\n\t\t\t\t}\n\t\t\t\t// Для внутренних ссылок позволяем браузеру обработать переход естественным образом\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<SidebarMenuItem>\n\t\t\t\t\t<SidebarMenuButton asChild>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={url}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\trel={target === '_blank' ? 'noopener noreferrer' : undefined}\n\t\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t\tclassName='w-full' // Убеждаемся, что ссылка занимает всю ширину как кнопка\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</SidebarMenuButton>\n\t\t\t\t</SidebarMenuItem>\n\t\t\t)\n\t\t}\n\n\t\t// Если URL нет, это кнопка, открывающая markdown файл (variant === 'page')\n\t\tconst filePath =\n\t\t\tentity.file.originalRelativePath || entity.file.relativePath\n\n\t\tconst handlePageClick = () => {\n\t\t\tonPageSelect?.(filePath)\n\t\t}\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton onClick={handlePageClick} asChild>\n\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'dropdown') {\n\t\tconst title = getEntityTitle(entity)\n\t\tconst dropdownState = entity.settings?.dropdown || 'collapsed'\n\t\tconst shouldBeOpen =\n\t\t\tdropdownState === 'open' ||\n\t\t\tdropdownState === 'always-open' ||\n\t\t\t(dropdownState === 'collapsed' && isOpen)\n\t\tconst isAlwaysOpen = dropdownState === 'always-open'\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!isAlwaysOpen) {\n\t\t\t\t\t\t\tonToggleDropdown(entityKey)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tdata-state={shouldBeOpen ? 'open' : 'closed'}\n\t\t\t\t>\n\t\t\t\t\t{shouldBeOpen ? (\n\t\t\t\t\t\t<FolderOpen className='size-4' />\n\t\t\t\t\t) : (\n\t\t\t\t\t\tIcon && <Icon className='size-4' />\n\t\t\t\t\t)}\n\t\t\t\t\t<span>{title}</span>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t\t{shouldBeOpen && entity.pages.length > 0 && (\n\t\t\t\t\t<SidebarMenuSub>\n\t\t\t\t\t\t{entity.pages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\tp =>\n\t\t\t\t\t\t\t\t\tp.type === 'page' &&\n\t\t\t\t\t\t\t\t\t!p.file.name.endsWith('dropdown-settings.md')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((page, idx) => {\n\t\t\t\t\t\t\t\t// Проверяем, что это страница (page)\n\t\t\t\t\t\t\t\tif (page.type !== 'page') return null\n\n\t\t\t\t\t\t\t\tconst pageTitle =\n\t\t\t\t\t\t\t\t\tpage.frontmatter?.title ||\n\t\t\t\t\t\t\t\t\tpage.file.name.replaceAll('.md', '')\n\t\t\t\t\t\t\t\tconst filePath =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\tconst PageIcon = resolveIcon(page.frontmatter?.icon)\n\t\t\t\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<SidebarMenuSubItem key={`${pageKey}-${idx}`}>\n\t\t\t\t\t\t\t\t\t\t<SidebarMenuSubButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPageSelect?.(filePath)}\n\t\t\t\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t\t\t\t\t\t\t{PageIcon && <PageIcon className='size-4' />}\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{pageTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</SidebarMenuSubButton>\n\t\t\t\t\t\t\t\t\t</SidebarMenuSubItem>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t</SidebarMenuSub>\n\t\t\t\t)}\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'group') {\n\t\tconst title = getEntityTitle(entity)\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton disabled>\n\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t<span>{title}</span>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t\t{entity.pages.length > 0 && (\n\t\t\t\t\t<SidebarMenuSub>\n\t\t\t\t\t\t{entity.pages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\tp =>\n\t\t\t\t\t\t\t\t\tp.type === 'page' &&\n\t\t\t\t\t\t\t\t\t!p.file.name.endsWith('group-settings.md')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((page, idx) => {\n\t\t\t\t\t\t\t\t// Проверяем, что это страница (page)\n\t\t\t\t\t\t\t\tif (page.type !== 'page') return null\n\n\t\t\t\t\t\t\t\tconst pageTitle =\n\t\t\t\t\t\t\t\t\tpage.frontmatter?.title ||\n\t\t\t\t\t\t\t\t\tpage.file.name.replaceAll('.md', '')\n\t\t\t\t\t\t\t\tconst filePath =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\tconst PageIcon = resolveIcon(page.frontmatter?.icon)\n\t\t\t\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<SidebarMenuSubItem key={`${pageKey}-${idx}`}>\n\t\t\t\t\t\t\t\t\t\t<SidebarMenuSubButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPageSelect?.(filePath)}\n\t\t\t\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t\t\t\t\t\t\t{PageIcon && <PageIcon className='size-4' />}\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{pageTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</SidebarMenuSubButton>\n\t\t\t\t\t\t\t\t\t</SidebarMenuSubItem>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t</SidebarMenuSub>\n\t\t\t\t)}\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\treturn null\n}\n","import { Moon, Sun } from 'lucide-react'\r\nimport * as React from 'react'\r\nimport { Button } from './ui/button'\r\n\r\nexport function ThemeToggle() {\r\n\tconst [theme, setTheme] = React.useState<'light' | 'dark'>(() => {\r\n\t\tif (globalThis.window === undefined) return 'dark'\r\n\t\tconst stored = globalThis.localStorage.getItem('theme')\r\n\t\tif (stored === 'light' || stored === 'dark') return stored\r\n\t\treturn 'dark'\r\n\t})\r\n\r\n\tReact.useEffect(() => {\r\n\t\tconst root = document.documentElement\r\n\t\tif (theme === 'dark') {\r\n\t\t\troot.classList.add('dark')\r\n\t\t} else {\r\n\t\t\troot.classList.remove('dark')\r\n\t\t}\r\n\t\tif (globalThis.window !== undefined) {\r\n\t\t\tglobalThis.localStorage.setItem('theme', theme)\r\n\t\t}\r\n\t}, [theme])\r\n\r\n\tconst toggleTheme = () => {\r\n\t\tsetTheme(prev => (prev === 'dark' ? 'light' : 'dark'))\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Button\r\n\t\t\tvariant='ghost'\r\n\t\t\tsize='icon'\r\n\t\t\tonClick={toggleTheme}\r\n\t\t\tclassName='h-9 w-9'\r\n\t\t\taria-label='Toggle theme'\r\n\t\t>\r\n\t\t\t<Sun className='h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0' />\r\n\t\t\t<Moon className='absolute h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100' />\r\n\t\t\t<span className='sr-only'>Toggle theme</span>\r\n\t\t</Button>\r\n\t)\r\n}\r\n","import { useEffect, useState, useCallback } from 'react'\r\n\r\n/**\r\n * Хук для синхронизации URL с выбранной страницей документации\r\n * Использует hash (#) для хранения пути к файлу в читаемом формате\r\n * Формат: http://localhost:5173/#2.0.2/ru/advanced/advanced-settings.md\r\n */\r\nexport function useDocumentationRouter(\r\n\tfolderPath: string\r\n): [string | null, (page: string | null) => void] {\r\n\t// Получаем текущую страницу из URL hash при инициализации\r\n\tconst getPageFromURL = useCallback((): string | null => {\r\n\t\tif (typeof window === 'undefined') return null\r\n\r\n\t\tconst hash = window.location.hash\r\n\t\tif (!hash || hash.length <= 1) return null\r\n\r\n\t\t// Убираем символ # в начале\r\n\t\tconst pagePath = hash.slice(1)\r\n\t\tif (!pagePath) return null\r\n\r\n\t\t// Декодируем путь (на случай если есть специальные символы)\r\n\t\ttry {\r\n\t\t\treturn decodeURIComponent(pagePath)\r\n\t\t} catch {\r\n\t\t\treturn pagePath\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// Инициализируем состояние из URL\r\n\tconst [currentPage, setCurrentPageState] = useState<string | null>(\r\n\t\tgetPageFromURL\r\n\t)\r\n\r\n\t// Обновляем URL при изменении страницы\r\n\tconst setCurrentPage = useCallback(\r\n\t\t(page: string | null) => {\r\n\t\t\tsetCurrentPageState(page)\r\n\r\n\t\t\tif (typeof window === 'undefined') return\r\n\r\n\t\t\t// Нормализуем путь: заменяем обратные слэши на прямые\r\n\t\t\tconst normalized = page ? page.replace(/\\\\/g, '/') : ''\r\n\r\n\t\t\tif (normalized) {\r\n\t\t\t\t// Кодируем только специальные символы, оставляя путь читаемым\r\n\t\t\t\t// encodeURI не кодирует /, что делает URL более читаемым\r\n\t\t\t\tconst encoded = encodeURI(normalized)\r\n\t\t\t\twindow.location.hash = encoded\r\n\t\t\t} else {\r\n\t\t\t\t// Удаляем hash если страница не выбрана\r\n\t\t\t\twindow.history.pushState(\r\n\t\t\t\t\t'',\r\n\t\t\t\t\tdocument.title,\r\n\t\t\t\t\twindow.location.pathname + window.location.search\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t},\r\n\t\t[]\r\n\t)\r\n\r\n\t// Слушаем изменения URL (кнопки назад/вперед и прямые изменения hash)\r\n\tuseEffect(() => {\r\n\t\tif (typeof window === 'undefined') return\r\n\r\n\t\tconst handleHashChange = () => {\r\n\t\t\tconst page = getPageFromURL()\r\n\t\t\tsetCurrentPageState(page)\r\n\t\t}\r\n\r\n\t\t// Слушаем событие hashchange для прямых изменений hash\r\n\t\twindow.addEventListener('hashchange', handleHashChange)\r\n\t\t// Слушаем popstate для кнопок назад/вперед\r\n\t\twindow.addEventListener('popstate', handleHashChange)\r\n\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener('hashchange', handleHashChange)\r\n\t\t\twindow.removeEventListener('popstate', handleHashChange)\r\n\t\t}\r\n\t}, [getPageFromURL])\r\n\r\n\treturn [currentPage, setCurrentPage]\r\n}\r\n\r\n","import matter from 'gray-matter'\r\nimport { errorBuilder } from '../errorBuilder/error-builder'\r\nimport type {\r\n\tBaseMeta,\r\n\tButtonSettings,\r\n\tDropdownSettings,\r\n\tGroupSettings,\r\n\tLanguageSettings,\r\n\tPageFrontmatter,\r\n\tVersionSettings,\r\n} from './types'\r\n\r\n/**\r\n * Парсит frontmatter из markdown файла\r\n */\r\nexport function parseFrontmatter(content: string): {\r\n\tfrontmatter: Record<string, unknown>\r\n\tcontent: string\r\n} {\r\n\ttry {\r\n\t\tconst parsed = matter(content)\r\n\t\treturn {\r\n\t\t\tfrontmatter: parsed.data || {},\r\n\t\t\tcontent: parsed.content,\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t// Если frontmatter некорректный, возвращаем весь контент как есть\r\n\t\terrorBuilder([], {\r\n\t\t\ttype: 'VERSION_FORMAT_ERROR',\r\n\t\t\treason: `frontmatter некорректный`,\r\n\t\t\tfix: `1`,\r\n\t\t})\r\n\t\treturn {\r\n\t\t\tfrontmatter: {},\r\n\t\t\tcontent,\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит метаданные страницы из frontmatter\r\n */\r\nexport function parsePageFrontmatter(\r\n\tfrontmatter: Record<string, unknown>\r\n): PageFrontmatter {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tlang: typeof frontmatter.lang === 'string' ? frontmatter.lang : undefined,\r\n\t\ttags: Array.isArray(frontmatter.tags)\r\n\t\t\t? frontmatter.tags.filter((t): t is string => typeof t === 'string')\r\n\t\t\t: undefined,\r\n\t\tlayout:\r\n\t\t\ttypeof frontmatter.layout === 'string' ? frontmatter.layout : undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки dropdown из frontmatter\r\n */\r\nexport function parseDropdownSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): DropdownSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tdropdown:\r\n\t\t\ttypeof frontmatter.dropdown === 'string' &&\r\n\t\t\t['open', 'collapsed', 'always-open'].includes(frontmatter.dropdown)\r\n\t\t\t\t? (frontmatter.dropdown as 'open' | 'collapsed' | 'always-open')\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки group из frontmatter\r\n */\r\nexport function parseGroupSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): GroupSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tdescription:\r\n\t\t\ttypeof frontmatter.description === 'string'\r\n\t\t\t\t? frontmatter.description\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки кнопки из frontmatter\r\n */\r\nexport function parseButtonSettings(\r\n\tfrontmatter: Record<string, unknown>,\r\n\tdefaultTitle: string\r\n): ButtonSettings {\r\n\treturn {\r\n\t\ttype: 'button',\r\n\t\tvariant:\r\n\t\t\ttypeof frontmatter.variant === 'string' &&\r\n\t\t\t['link', 'page'].includes(frontmatter.variant)\r\n\t\t\t\t? (frontmatter.variant as 'link' | 'page')\r\n\t\t\t\t: 'page',\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : defaultTitle,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable === false\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: false, // Кнопки по умолчанию не участвуют в поиске\r\n\t\turl: typeof frontmatter.url === 'string' ? frontmatter.url : undefined,\r\n\t\tstyle:\r\n\t\t\ttypeof frontmatter.style === 'string' &&\r\n\t\t\t['primary', 'secondary', 'ghost'].includes(frontmatter.style)\r\n\t\t\t\t? (frontmatter.style as 'primary' | 'secondary' | 'ghost')\r\n\t\t\t\t: undefined,\r\n\t\ttarget:\r\n\t\t\ttypeof frontmatter.target === 'string' &&\r\n\t\t\t['_blank', '_self'].includes(frontmatter.target)\r\n\t\t\t\t? (frontmatter.target as '_blank' | '_self')\r\n\t\t\t\t: undefined,\r\n\t\tposition:\r\n\t\t\ttypeof frontmatter.position === 'string' &&\r\n\t\t\t['sidebar', 'header'].includes(frontmatter.position)\r\n\t\t\t\t? (frontmatter.position as 'sidebar' | 'header')\r\n\t\t\t\t: 'sidebar',\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки версии из frontmatter\r\n */\r\nexport function parseVersionSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): VersionSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\tdefault:\r\n\t\t\ttypeof frontmatter.default === 'boolean'\r\n\t\t\t\t? frontmatter.default\r\n\t\t\t\t: frontmatter.default === 'true',\r\n\t\tdeprecated:\r\n\t\t\ttypeof frontmatter.deprecated === 'boolean'\r\n\t\t\t\t? frontmatter.deprecated\r\n\t\t\t\t: frontmatter.deprecated === 'true',\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки языка из frontmatter\r\n */\r\nexport function parseLanguageSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): LanguageSettings {\r\n\treturn {\r\n\t\tlabel:\r\n\t\t\ttypeof frontmatter.label === 'string' ? frontmatter.label : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Применяет значения по умолчанию к базовым метаданным\r\n */\r\nexport function applyBaseMetaDefaults(meta: Partial<BaseMeta>): BaseMeta {\r\n\treturn {\r\n\t\torder: meta.order ?? 100,\r\n\t\thidden: meta.hidden ?? false,\r\n\t\tsearchable: meta.searchable ?? true,\r\n\t\t...meta,\r\n\t}\r\n}\r\n\r\n/**\r\n * Наследует метаданные от родителя к дочернему элементу\r\n */\r\nexport function inheritMeta(\r\n\tchildMeta: Partial<BaseMeta>,\r\n\tparentMeta?: Partial<BaseMeta>\r\n): BaseMeta {\r\n\tif (!parentMeta) {\r\n\t\treturn applyBaseMetaDefaults(childMeta)\r\n\t}\r\n\r\n\t// Наследуем значения, если они не заданы в дочернем элементе\r\n\tconst inherited: Partial<BaseMeta> = {\r\n\t\ticon: childMeta.icon ?? parentMeta.icon,\r\n\t\t// hidden не наследуется вверх (если дочерний hidden, он остается hidden)\r\n\t\thidden: childMeta.hidden ?? false,\r\n\t\t// searchable наследуется, но если родитель false, то и дочерний false\r\n\t\tsearchable:\r\n\t\t\tchildMeta.searchable !== undefined\r\n\t\t\t\t? childMeta.searchable\r\n\t\t\t\t: parentMeta.searchable ?? true,\r\n\t}\r\n\r\n\treturn applyBaseMetaDefaults({\r\n\t\t...parentMeta,\r\n\t\t...inherited,\r\n\t\t...childMeta, // Дочерние значения имеют приоритет\r\n\t})\r\n}\r\n","import { FileInfo } from '../scanningFolder'\r\n\r\nexport function errorBuilder(items: Array<FileInfo>, err?: Object) {\r\n\tconst errors = []\r\n\r\n\tif (err) {\r\n\t\terrors.push(err)\r\n\t}\r\n\r\n\t// Паттерны для проверки структуры\r\n\tconst versionPattern = /^\\d+\\.\\d+\\.\\d+/\r\n\tconst groupPattern = /^\\(group-.*\\)$/\r\n\tconst languagePattern = /^[a-z]{2}$/ // Языковые коды (ISO 639-1)\r\n\r\n\t// Получаем корневые элементы (depth = 0)\r\n\tconst rootItems = items.filter(item => item.depth === 0)\r\n\r\n\t// Проверяем каждый корневой элемент\r\n\trootItems.forEach(item => {\r\n\t\t// Проверка 1: В корне должны быть только папки (директории)\r\n\t\tif (item.type !== 'directory') {\r\n\t\t\terrors.push({\r\n\t\t\t\ttype: 'ROOT_FILE_ERROR',\r\n\t\t\t\tfile: item.name,\r\n\t\t\t\tpath: item.relativePath,\r\n\t\t\t\treason: 'В корневой директории docs/ не должно быть файлов',\r\n\t\t\t\tfix: `Переместите файл \"${item.name}\" в соответствующую версионную папку (например, \"1.0.0/\")`,\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\t// Проверка 2: Папки в корне должны соответствовать паттерну версии\r\n\t\tif (item.type === 'directory') {\r\n\t\t\tif (!versionPattern.test(item.name)) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'VERSION_FORMAT_ERROR',\r\n\t\t\t\t\tfolder: item.name,\r\n\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\treason: `Папка \"${item.name}\" не соответствует формату версии (должно быть \"x.x.x\")`,\r\n\t\t\t\t\tfix: `Переименуйте папку в формат версии, например: \"1.0.0\"`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n\r\n\t// 2. Проверяем структуру вложенных файлов\r\n\titems.forEach(item => {\r\n\t\t// Проверка 3: Файлы должны быть внутри версионных папок\r\n\t\tif (item.type === 'file') {\r\n\t\t\tconst pathParts = item.relativePath.split(/[\\\\/]/)\r\n\r\n\t\t\t// Проверяем, находится ли файл внутри папки с версией\r\n\t\t\tif (pathParts.length < 2) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'ORPHAN_FILE_ERROR',\r\n\t\t\t\t\tfile: item.name,\r\n\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\treason: `Файл \"${item.name}\" находится в корне, а не внутри версионной папки`,\r\n\t\t\t\t\tfix: `Переместите файл в соответствующую версионную папку (например, \"1.0.0/${item.name}\")`,\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tconst parentFolder = pathParts[0]\r\n\r\n\t\t\t\t// Проверяем, что родительская папка - это версия\r\n\t\t\t\tif (!versionPattern.test(parentFolder)) {\r\n\t\t\t\t\terrors.push({\r\n\t\t\t\t\t\ttype: 'FILE_IN_WRONG_FOLDER',\r\n\t\t\t\t\t\tfile: item.name,\r\n\t\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\t\treason: `Файл \"${item.name}\" находится в папке \"${parentFolder}\", которая не является версионной папкой`,\r\n\t\t\t\t\t\tfix: `Переместите файл в папку с версией (например, \"1.0.0/\")`,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Проверка 4: Вложенные директории (не считая версионных)\r\n\t\t// Эта проверка теперь выполняется в разделе 4 для каждой версии отдельно\r\n\t})\r\n\r\n\t// 3. Проверяем структуру внутри версионных папок\r\n\tconst versionFolders = items.filter(\r\n\t\titem =>\r\n\t\t\titem.depth === 0 &&\r\n\t\t\titem.type === 'directory' &&\r\n\t\t\tversionPattern.test(item.name)\r\n\t)\r\n\r\n\tversionFolders.forEach(versionFolder => {\r\n\t\tconst versionFiles = items.filter(item => {\r\n\t\t\tconst pathParts = item.relativePath.split(/[\\\\/]/)\r\n\t\t\treturn pathParts[0] === versionFolder.name\r\n\t\t})\r\n\r\n\t\t// Проверка: .md файлы в корне версии должны быть только .button.md\r\n\t\tconst rootMdFiles = versionFiles.filter(\r\n\t\t\tf => f.depth === 1 && f.type === 'file' && f.extension === 'md'\r\n\t\t)\r\n\r\n\t\trootMdFiles.forEach(file => {\r\n\t\t\tif (!file.name.endsWith('.button.md')) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'INVALID_ROOT_MD_FILE',\r\n\t\t\t\t\tfile: file.name,\r\n\t\t\t\t\tpath: file.relativePath,\r\n\t\t\t\t\treason: `В корне версионной папки \"${versionFolder.name}\" обычные .md файлы не допускаются. Используйте .button.md для кнопок или переместите файл в подпапку`,\r\n\t\t\t\t\tfix: `Переименуйте файл в \"${\r\n\t\t\t\t\t\tfile.name.endsWith('.md')\r\n\t\t\t\t\t\t\t? file.name.slice(0, -3) + '.button.md'\r\n\t\t\t\t\t\t\t: file.name + '.button.md'\r\n\t\t\t\t\t}\" или переместите в подпапку`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: папки (group-*) должны содержать только файлы, не вложенные папки\r\n\t\tconst groupFolders = versionFiles.filter(\r\n\t\t\tf => f.depth === 1 && f.type === 'directory' && groupPattern.test(f.name)\r\n\t\t)\r\n\r\n\t\tgroupFolders.forEach(groupFolder => {\r\n\t\t\tconst nestedDirs = versionFiles.filter(\r\n\t\t\t\tf =>\r\n\t\t\t\t\tf.relativePath.startsWith(groupFolder.relativePath) &&\r\n\t\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t\tf.depth > groupFolder.depth\r\n\t\t\t)\r\n\r\n\t\t\tif (nestedDirs.length > 0) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'NESTED_DIRECTORY_IN_GROUP',\r\n\t\t\t\t\tfolder: nestedDirs[0].name,\r\n\t\t\t\t\tpath: nestedDirs[0].relativePath,\r\n\t\t\t\t\treason: `Внутри группы \"${groupFolder.name}\" не допускаются вложенные папки`,\r\n\t\t\t\t\tfix: `Переместите содержимое папки \"${nestedDirs[0].name}\" на уровень группы или удалите вложенную структуру`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: обычные папки (dropdown) не должны содержать другие папки\r\n\t\t// Исключение: языковые папки могут содержать любые вложенные папки\r\n\t\tconst dropdownFolders = versionFiles.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.depth === 1 &&\r\n\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t!groupPattern.test(f.name) &&\r\n\t\t\t\t!versionPattern.test(f.name)\r\n\t\t)\r\n\r\n\t\tdropdownFolders.forEach(dropdownFolder => {\r\n\t\t\t// Если dropdown папка - это языковая папка, разрешаем любые вложенные папки\r\n\t\t\tconst isLanguageFolder = languagePattern.test(dropdownFolder.name)\r\n\r\n\t\t\t// Пропускаем проверку для языковых папок\r\n\t\t\tif (isLanguageFolder) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst nestedDirs = versionFiles.filter(\r\n\t\t\t\tf =>\r\n\t\t\t\t\tf.relativePath.startsWith(dropdownFolder.relativePath) &&\r\n\t\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t\tf.depth > dropdownFolder.depth\r\n\t\t\t)\r\n\r\n\t\t\tif (nestedDirs.length > 0) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'NESTED_DIRECTORY_IN_DROPDOWN',\r\n\t\t\t\t\tfolder: nestedDirs[0].name,\r\n\t\t\t\t\tpath: nestedDirs[0].relativePath,\r\n\t\t\t\t\treason: `Внутри dropdown папки \"${dropdownFolder.name}\" не допускаются вложенные папки`,\r\n\t\t\t\t\tfix: `Переместите содержимое папки \"${nestedDirs[0].name}\" на уровень dropdown или используйте плоскую структуру`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: .button.md файлы должны быть только в корне версии или в папке языка\r\n\t\tconst buttonFiles = versionFiles.filter(\r\n\t\t\tf => f.type === 'file' && f.name.endsWith('.button.md')\r\n\t\t)\r\n\r\n\t\tbuttonFiles.forEach(buttonFile => {\r\n\t\t\tconst pathParts = buttonFile.relativePath.split(/[\\\\/]/)\r\n\r\n\t\t\t// Разрешаем .button.md в корне версии (depth = 1) или в папке языка (depth = 2, где второй элемент - языковая папка)\r\n\t\t\tconst isInRoot = buttonFile.depth === 1\r\n\t\t\tconst isInLanguageFolder =\r\n\t\t\t\tbuttonFile.depth === 2 &&\r\n\t\t\t\tpathParts.length > 1 &&\r\n\t\t\t\tlanguagePattern.test(pathParts[1])\r\n\r\n\t\t\tif (!isInRoot && !isInLanguageFolder) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'BUTTON_FILE_IN_WRONG_PLACE',\r\n\t\t\t\t\tfile: buttonFile.name,\r\n\t\t\t\t\tpath: buttonFile.relativePath,\r\n\t\t\t\t\treason: `Файл .button.md \"${buttonFile.name}\" должен находиться только в корне версионной папки или в папке языка`,\r\n\t\t\t\t\tfix: `Переместите файл \"${buttonFile.name}\" в корень версионной папки \"${versionFolder.name}/\" или в папку языка (например, \"${versionFolder.name}/ru/\")`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n\r\n\treturn errors\r\n}\r\n","import type { FileInfo } from '../scanningFolder'\r\nimport { inheritMeta } from './frontmatter-parser'\r\nimport { BUTTON_PATTERN, LANGUAGE_PATTERN } from './helpers'\r\nimport { getEntityType } from './helpers/getEntityType'\r\nimport { getSortEntities } from './helpers/getSortEntities'\r\nimport { isHidden } from './helpers/types-helper'\r\nimport {\r\n\ttype ButtonSettings,\r\n\ttype DocumentationEntity,\r\n\ttype DropdownSettings,\r\n\ttype GroupSettings,\r\n\ttype PageFrontmatter,\r\n} from './types'\r\n\r\n/**\r\n * Парсит структуру документации для версии и языка (клиентская версия)\r\n */\r\n\r\ntype FileExtended = FileInfo & { originalRelativePath?: string }\r\nexport function parseVersionStructure(\r\n\tversion: string,\r\n\tfiles: FileInfo[],\r\n\tlanguage?: string | null,\r\n\tmetadata?: Record<\r\n\t\tstring,\r\n\t\tPageFrontmatter | ButtonSettings | DropdownSettings | GroupSettings\r\n\t>\r\n): DocumentationEntity[] {\r\n\t/* 1. отфильтровать и «схлопнуть» языковые папки */\r\n\tconst versionFiles = prepareFilesForVersion(files, version, language)\r\n\r\n\t/* 2. собрать сущности */\r\n\tconst entities = buildEntities(versionFiles, metadata || {})\r\n\r\n\t/* 3. отсортировать один раз */\r\n\treturn getSortEntities(entities)\r\n}\r\n\r\n/* ================================================================== */\r\n/* 1. подготовка файлов (фильтр по версии + язык) */\r\n/* ================================================================== */\r\nfunction prepareFilesForVersion(\r\n\tfiles: FileInfo[],\r\n\tversion: string,\r\n\tlanguage: string | null | undefined\r\n): FileExtended[] {\r\n\t/* оставляем только файлы нужной версии */\r\n\tlet list = files.filter(f => f.relativePath.split(/[/\\\\]/)[0] === version)\r\n\r\n\tconst hasLangFolders = list.some(\r\n\t\tf =>\r\n\t\t\tf.depth === 1 && f.type === 'directory' && LANGUAGE_PATTERN.test(f.name)\r\n\t)\r\n\r\n\t/* если языковых папок нет – просто дополняем поле */\r\n\tif (!hasLangFolders) {\r\n\t\treturn list.map(f => ({ ...f, originalRelativePath: f.relativePath }))\r\n\t}\r\n\r\n\t/* язык задан – берём только его; не задан – выбрасываем языковые папки */\r\n\tconst wantedLang = language || null\r\n\tlist = list.filter(f => {\r\n\t\tconst p = f.relativePath.split(/[/\\\\]/)\r\n\t\tif (p.length < 2) return true /* корень версии */\r\n\t\tconst second = p[1]\r\n\t\tif (!LANGUAGE_PATTERN.test(second)) return true /* не языковая папка */\r\n\t\treturn wantedLang ? second === wantedLang : false\r\n\t})\r\n\r\n\t/* корректируем depth / path для файлов внутри языковых папок */\r\n\treturn list.map(f => {\r\n\t\tconst p = f.relativePath.split(/[/\\\\]/)\r\n\t\tif (p.length >= 2 && LANGUAGE_PATTERN.test(p[1])) {\r\n\t\t\treturn {\r\n\t\t\t\t...f,\r\n\t\t\t\tdepth: f.depth - 1,\r\n\t\t\t\trelativePath: p.slice(2).join('/'),\r\n\t\t\t\toriginalRelativePath: f.relativePath,\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn { ...f, originalRelativePath: f.relativePath }\r\n\t})\r\n}\r\n\r\n/* ================================================================== */\r\n/* 2. сбор сущностей */\r\n/* ================================================================== */\r\n\r\nfunction buildEntities(\r\n\tfiles: FileExtended[],\r\n\tmetadata: Record<string, any>\r\n): DocumentationEntity[] {\r\n\tconst entities: DocumentationEntity[] = []\r\n\r\n\t/* корневые файлы */\r\n\tfiles\r\n\t\t.filter(f => f.depth === 1 && f.type === 'file')\r\n\t\t.forEach(file => {\r\n\t\t\tconst type = getEntityType(file, files)\r\n\t\t\tconst meta =\r\n\t\t\t\tmetadata[file.relativePath] || metadata[file.originalRelativePath!]\r\n\t\t\tif (type === 'page') {\r\n\t\t\t\tconst p = makePage(file, meta)\r\n\t\t\t\tif (!isHidden(p)) entities.push(p)\r\n\t\t\t} else if (type === 'button') {\r\n\t\t\t\tconst b = makeButton(file, meta)\r\n\t\t\t\tif (!isHidden(b)) entities.push(b)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t/* корневые папки (без языковых) */\r\n\tconst processedDirs = new Set<string>()\r\n\tfiles\r\n\t\t.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.depth === 1 &&\r\n\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t!LANGUAGE_PATTERN.test(f.name)\r\n\t\t)\r\n\t\t.forEach(dir => {\r\n\t\t\tif (processedDirs.has(dir.relativePath)) return\r\n\t\t\tprocessedDirs.add(dir.relativePath)\r\n\r\n\t\t\tconst type = getEntityType(dir, files)\r\n\t\t\tconst dirPath = dir.relativePath.replace(/\\\\/g, '/')\r\n\t\t\tconst originalDirPath =\r\n\t\t\t\tdir.originalRelativePath?.replace(/\\\\/g, '/') || dirPath\r\n\t\t\tconst meta = metadata[originalDirPath]\r\n\r\n\t\t\tif (type === 'group') {\r\n\t\t\t\tconst g = makeGroup(dir, files, meta, metadata)\r\n\t\t\t\tif (!isHidden(g)) entities.push(g)\r\n\t\t\t} else if (type === 'dropdown') {\r\n\t\t\t\tconst d = makeDropdown(dir, files, meta, metadata)\r\n\t\t\t\tif (!isHidden(d)) entities.push(d)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\treturn entities\r\n}\r\n\r\n/* ================================================================== */\r\n/* 3. фабрики сущностей */\r\n/* ================================================================== */\r\nfunction makePage(\r\n\tfile: FileExtended,\r\n\tmeta?: PageFrontmatter\r\n): DocumentationEntity {\r\n\tconst frontmatter: PageFrontmatter = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\t...meta,\r\n\t\ttitle: meta?.title || file.name.replace(/\\.md$/i, ''),\r\n\t}\r\n\treturn { type: 'page', file, frontmatter }\r\n}\r\n\r\nfunction makeButton(\r\n\tfile: FileExtended,\r\n\tmeta?: ButtonSettings\r\n): Extract<DocumentationEntity, { type: 'button' }> {\r\n\tconst settings: ButtonSettings = {\r\n\t\ttype: 'button',\r\n\t\tvariant: meta?.variant || 'page',\r\n\t\torder: meta?.order ?? 100,\r\n\t\thidden: meta?.hidden ?? false,\r\n\t\tsearchable: meta?.searchable ?? false,\r\n\t\tposition: meta?.position || 'sidebar',\r\n\t\ttitle: meta?.title || file.name.replace(BUTTON_PATTERN, ''),\r\n\t\turl: meta?.url,\r\n\t\ttarget: meta?.target,\r\n\t\tstyle: meta?.style,\r\n\t\ticon: meta?.icon,\r\n\t}\r\n\treturn { type: 'button', file, settings } as const\r\n}\r\n\r\nfunction makeGroup(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirMeta?: GroupSettings,\r\n\tallMeta: Record<string, any> = {}\r\n): DocumentationEntity {\r\n\tconst settings: GroupSettings = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\t...dirMeta,\r\n\t\ttitle:\r\n\t\t\tdirMeta?.title || dir.name.replace(/^\\(group-/, '').replace(/\\)$/, ''),\r\n\t}\r\n\r\n\tconst pages = collectPagesUnder(dir, files, settings, allMeta)\r\n\treturn { type: 'group', folder: dir, pages, settings }\r\n}\r\n\r\nfunction makeDropdown(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirMeta?: DropdownSettings,\r\n\tallMeta: Record<string, any> = {}\r\n): DocumentationEntity {\r\n\tconst settings: DropdownSettings = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\tdropdown: 'collapsed',\r\n\t\t...dirMeta,\r\n\t\ttitle: dirMeta?.title || dir.name,\r\n\t}\r\n\r\n\tconst pages = collectPagesUnder(dir, files, settings, allMeta)\r\n\treturn { type: 'dropdown', folder: dir, pages, settings }\r\n}\r\n\r\n/* ---------- вспомогательный сбор страниц внутри папки ------------- */\r\nfunction collectPagesUnder(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirSettings: GroupSettings | DropdownSettings,\r\n\tallMeta: Record<string, any>\r\n): DocumentationEntity[] {\r\n\treturn files\r\n\t\t.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.type === 'file' &&\r\n\t\t\t\tf.extension === 'md' &&\r\n\t\t\t\t!BUTTON_PATTERN.test(f.name) &&\r\n\t\t\t\t(f.relativePath.startsWith(dir.relativePath + '/') ||\r\n\t\t\t\t\tf.relativePath.startsWith(dir.relativePath + '\\\\'))\r\n\t\t)\r\n\t\t.map(file => {\r\n\t\t\tconst metaKey = file.originalRelativePath || file.relativePath\r\n\t\t\tconst pageMeta = allMeta[metaKey] as PageFrontmatter | undefined\r\n\r\n\t\t\t// Наследуем только нужные поля, не трогаем title\r\n\t\t\tconst inherited = inheritMeta(pageMeta || {}, {\r\n\t\t\t\torder: dirSettings.order,\r\n\t\t\t\thidden: dirSettings.hidden,\r\n\t\t\t\tsearchable: dirSettings.searchable,\r\n\t\t\t}) as PageFrontmatter\r\n\r\n\t\t\tconst frontmatter: PageFrontmatter = {\r\n\t\t\t\t...inherited,\r\n\t\t\t\ttitle: pageMeta?.title || file.name.replace(/\\.md$/i, ''),\r\n\t\t\t}\r\n\r\n\t\t\treturn { type: 'page' as const, file, frontmatter }\r\n\t\t})\r\n\t\t.filter(p => !isHidden(p))\r\n}\r\n","import { MarkdownViewerLazy as MarkdownViewer } from '@/components/doc-page/markdown-viewer.lazy'\r\nimport {\r\n\tErrorsList,\r\n\ttype DocumentationError,\r\n} from '@/components/errors-list/errors-list'\r\nimport { LanguageToggle } from '@/components/language-toggle'\r\nimport { Logo } from '@/components/logo'\r\nimport { SearchBar } from '@/components/search-bar'\r\nimport { AppSidebar } from '@/components/sidebar/sidebar'\r\nimport { ThemeToggle } from '@/components/theme-toggle'\r\nimport { Separator } from '@/components/ui/separator'\r\nimport {\r\n\tSidebarInset,\r\n\tSidebarProvider,\r\n\tSidebarTrigger,\r\n} from '@/components/ui/sidebar'\r\nimport { useDocumentationRouter } from '@/hooks/useDocumentationRouter'\r\nimport { parseVersionStructure } from '@/lib/documentation/client-parser'\r\nimport { getAvailableLanguages } from '@/lib/documentation/helpers'\r\nimport type { VersionStructure } from '@/lib/documentation/types'\r\nimport { errorBuilder } from '@/lib/errorBuilder/error-builder'\r\nimport { ScanResult } from '@/plugin'\r\nimport { useEffect, useMemo, useState } from 'react'\r\nimport { DocumentationProps } from '../types/DocumentationProps'\r\nexport function Documentation({\r\n\ttitle = 'Documentation',\r\n\tuseToggleTheme = false,\r\n\tuseToggleLanguage = false,\r\n\tuseSearch = false,\r\n\tlogo = <Logo className='h-10 w-10' />,\r\n\tfolderPath = 'docs',\r\n\tlogTreeFiles = {},\r\n\tversionSelect = false,\r\n}: Readonly<DocumentationProps>) {\r\n\tconst [scannedFiles, setScannedFiles] = useState<ScanResult>()\r\n\tconst [receivedErrors, setReceivedErrors] = useState<DocumentationError[]>([])\r\n\tconst [documentationStructure, setDocumentationStructure] = useState<\r\n\t\tVersionStructure[]\r\n\t>([])\r\n\tconst [selectedVersion, setSelectedVersion] = useState<string | undefined>()\r\n\r\n\t// Ключи для localStorage\r\n\tconst versionStorageKey = `dock-rush-version-${folderPath}`\r\n\tconst languageStorageKey = `dock-rush-language-${folderPath}`\r\n\r\n\t// Используем хук для синхронизации URL с выбранной страницей\r\n\tconst [currentPage, setCurrentPage] = useDocumentationRouter(folderPath)\r\n\r\n\t// Состояние для выбранного языка\r\n\tconst [selectedLanguage, setSelectedLanguage] = useState<string | null>(\r\n\t\t() => {\r\n\t\t\tif (typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(languageStorageKey)\r\n\t\t\t\treturn saved || null\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t}\r\n\t)\r\n\r\n\t// Получаем выбранную версию из localStorage или используем первую доступную\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.versions && scannedFiles.versions.length > 0) {\r\n\t\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\t\tif (saved && scannedFiles.versions.includes(saved)) {\r\n\t\t\t\t\tsetSelectedVersion(saved)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetSelectedVersion(scannedFiles.versions[0])\r\n\t\t}\r\n\t}, [scannedFiles?.versions, versionStorageKey])\r\n\r\n\t// URL теперь синхронизируется автоматически через useDocumentationRouter\r\n\r\n\t// Сохраняем selectedLanguage в localStorage при изменении\r\n\tuseEffect(() => {\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\tif (selectedLanguage) {\r\n\t\t\t\tlocalStorage.setItem(languageStorageKey, selectedLanguage)\r\n\t\t\t} else {\r\n\t\t\t\tlocalStorage.removeItem(languageStorageKey)\r\n\t\t\t}\r\n\t\t}\r\n\t}, [selectedLanguage, languageStorageKey])\r\n\r\n\t// Стабилизируем массив ignore, чтобы избежать бесконечных циклов\r\n\tconst ignoreArray = useMemo(\r\n\t\t() => logTreeFiles.ignore || [],\r\n\t\t[JSON.stringify(logTreeFiles.ignore || [])]\r\n\t)\r\n\r\n\tuseEffect(() => {\r\n\t\t// Триггерим нодовый сканер через dev‑сервер (Vite‑плагин в template/vite.config.ts)\r\n\t\tif (!folderPath) return\r\n\t\tconst params = new URLSearchParams()\r\n\t\tparams.set('folderPath', folderPath)\r\n\t\tparams.set('console', String(logTreeFiles.console ?? false))\r\n\t\tif (logTreeFiles.consoleFormat) {\r\n\t\t\tparams.set('consoleFormat', logTreeFiles.consoleFormat)\r\n\t\t}\r\n\t\tlogTreeFiles.ignore?.forEach(pattern => {\r\n\t\t\tparams.append('ignore', pattern)\r\n\t\t})\r\n\r\n\t\t// Получение отсканированных файлов\r\n\t\tconst scanFolder = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst response = await fetch(`/api/dock-rush-scan?${params.toString()}`)\r\n\t\t\t\tconst files = await response.json()\r\n\t\t\t\tsetScannedFiles(files)\r\n\t\t\t} catch (error) {\r\n\t\t\t\t// Игнорируем ошибки сканирования\r\n\t\t\t}\r\n\t\t}\r\n\t\tscanFolder()\r\n\t}, [\r\n\t\tfolderPath,\r\n\t\tlogTreeFiles.console,\r\n\t\tlogTreeFiles.consoleFormat,\r\n\t\tignoreArray,\r\n\t])\r\n\r\n\t// Определяем доступные языки и устанавливаем язык по умолчанию\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.files && scannedFiles?.versions) {\r\n\t\t\t// Проверяем, есть ли языки в любой версии\r\n\t\t\tconst allLanguages = new Set<string>()\r\n\t\t\tscannedFiles.versions.forEach(version => {\r\n\t\t\t\tconst languages = getAvailableLanguages(version, scannedFiles.files)\r\n\t\t\t\tlanguages.forEach(lang => allLanguages.add(lang))\r\n\t\t\t})\r\n\r\n\t\t\t// Если есть языки, но язык не выбран, устанавливаем 'ru' по умолчанию\r\n\t\t\tif (allLanguages.size > 0 && !selectedLanguage) {\r\n\t\t\t\tconst defaultLang = allLanguages.has('ru')\r\n\t\t\t\t\t? 'ru'\r\n\t\t\t\t\t: Array.from(allLanguages)[0]\r\n\t\t\t\tsetSelectedLanguage(defaultLang)\r\n\t\t\t\tif (typeof window !== 'undefined') {\r\n\t\t\t\t\tlocalStorage.setItem(languageStorageKey, defaultLang)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [scannedFiles, selectedLanguage, languageStorageKey])\r\n\r\n\t// Сканирование на ошибки структуры и парсинг структуры документации\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.files && scannedFiles?.versions) {\r\n\t\t\tsetReceivedErrors(errorBuilder(scannedFiles.files))\r\n\r\n\t\t\t// Парсим структуру для каждой версии\r\n\t\t\tconst structures: VersionStructure[] = scannedFiles.versions.map(\r\n\t\t\t\tversion => {\r\n\t\t\t\t\tconst languages = getAvailableLanguages(version, scannedFiles.files)\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\tentities: parseVersionStructure(\r\n\t\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\t\tscannedFiles.files,\r\n\t\t\t\t\t\t\tselectedLanguage,\r\n\t\t\t\t\t\t\tscannedFiles.metadata\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t\tlanguages: languages.length > 0 ? languages : undefined,\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t\t\tsetDocumentationStructure(structures)\r\n\r\n\t\t\t// Проверяем, существует ли текущая страница из URL в структуре\r\n\t\t\tif (currentPage) {\r\n\t\t\t\t// Нормализуем путь для сравнения (заменяем обратные слэши на прямые)\r\n\t\t\t\tconst normalizedCurrentPage = currentPage.replace(/\\\\/g, '/')\r\n\r\n\t\t\t\tconst allFiles = scannedFiles.files.filter(file => {\r\n\t\t\t\t\tconst normalizedRelative = file.relativePath?.replace(/\\\\/g, '/')\r\n\t\t\t\t\tconst normalizedOriginal = file.originalRelativePath?.replace(\r\n\t\t\t\t\t\t/\\\\/g,\r\n\t\t\t\t\t\t'/'\r\n\t\t\t\t\t)\r\n\t\t\t\t\tconst normalizedPath = file.path?.replace(/\\\\/g, '/')\r\n\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\tnormalizedRelative === normalizedCurrentPage ||\r\n\t\t\t\t\t\tnormalizedOriginal === normalizedCurrentPage ||\r\n\t\t\t\t\t\tnormalizedPath === normalizedCurrentPage\r\n\t\t\t\t\t)\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (allFiles.length === 0) {\r\n\t\t\t\t\t// Страница не найдена, очищаем URL\r\n\t\t\t\t\tsetCurrentPage(null)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [scannedFiles, currentPage, selectedLanguage, setCurrentPage])\r\n\r\n\tif (receivedErrors.length > 0) {\r\n\t\treturn (\r\n\t\t\t<div className='flex flex-1 flex-col gap-4 p-6'>\r\n\t\t\t\t<ErrorsList errors={receivedErrors} />\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<SidebarProvider className='h-screen overflow-hidden'>\r\n\t\t\t<AppSidebar\r\n\t\t\t\ttitle={title}\r\n\t\t\t\tlogo={logo}\r\n\t\t\t\tversionSelect={versionSelect}\r\n\t\t\t\tversions={scannedFiles?.versions || []}\r\n\t\t\t\tdocumentationStructure={documentationStructure}\r\n\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\tversionStorageKey={versionStorageKey}\r\n\t\t\t/>\r\n\t\t\t<SidebarInset>\r\n\t\t\t\t<header className='flex h-16 shrink-0 items-center justify-between gap-2 border-b px-3'>\r\n\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t<SidebarTrigger />\r\n\t\t\t\t\t\t<Separator orientation='vertical' className='mr-2 h-4' />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t{useSearch && documentationStructure.length > 0 && (\r\n\t\t\t\t\t\t\t<SearchBar\r\n\t\t\t\t\t\t\t\tdocumentationStructure={documentationStructure}\r\n\t\t\t\t\t\t\t\tselectedVersion={selectedVersion}\r\n\t\t\t\t\t\t\t\tselectedLanguage={selectedLanguage}\r\n\t\t\t\t\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\t\t\t\t\tscannedFiles={scannedFiles}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{useToggleLanguage && documentationStructure.length > 0 && (\r\n\t\t\t\t\t\t\t<LanguageToggle\r\n\t\t\t\t\t\t\t\tlanguages={documentationStructure\r\n\t\t\t\t\t\t\t\t\t.flatMap(s => s.languages || [])\r\n\t\t\t\t\t\t\t\t\t.filter((lang, index, arr) => arr.indexOf(lang) === index)}\r\n\t\t\t\t\t\t\t\tselectedLanguage={selectedLanguage}\r\n\t\t\t\t\t\t\t\tonLanguageChange={lang => {\r\n\t\t\t\t\t\t\t\t\tsetSelectedLanguage(lang)\r\n\t\t\t\t\t\t\t\t\t// При смене языка очищаем выбранную страницу и URL\r\n\t\t\t\t\t\t\t\t\tsetCurrentPage(null)\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{useToggleTheme && <ThemeToggle />}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</header>\r\n\t\t\t\t<main className='overflow-auto'>\r\n\t\t\t\t\t{currentPage ? (\r\n\t\t\t\t\t\t<div className='animate-in fade-in-0 duration-300'>\r\n\t\t\t\t\t\t\t<MarkdownViewer\r\n\t\t\t\t\t\t\t\tfilePath={currentPage}\r\n\t\t\t\t\t\t\t\tfolderPath={folderPath}\r\n\t\t\t\t\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<div className='flex flex-1 items-center justify-center p-12 animate-in fade-in-0 duration-300'>\r\n\t\t\t\t\t\t\t<div className='text-center'>\r\n\t\t\t\t\t\t\t\t<Logo className='mx-auto mb-4 h-12 w-12 text-muted-foreground' />\r\n\t\t\t\t\t\t\t\t<h2 className='mb-2 text-2xl font-semibold'>\r\n\t\t\t\t\t\t\t\t\tДобро пожаловать\r\n\t\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t\t<p className='text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t\tВыберите страницу документации из бокового меню\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</main>\r\n\t\t\t</SidebarInset>\r\n\t\t</SidebarProvider>\r\n\t)\r\n}\r\n"],"mappings":"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","names":["React","jsx","jsxs","LazyMarkdownViewer","m","MarkdownViewerLazy","props","Skeleton","AlertCircle","CheckCircle2","Copy","FileWarning","FileX","FolderTree","FolderX","React","jsx","jsxs","getErrorIcon","type","getErrorTypeLabel","ErrorCard","error","index","Icon","copied","setCopied","handleCopyPath","pathToCopy","cn","Button","file","ErrorsList","errors","Languages","React","SelectPrimitive","Check","ChevronDown","ChevronUp","jsx","jsxs","Select","SelectValue","SelectTrigger","className","children","props","ref","jsxs","cn","jsx","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","Check","SelectSeparator","jsx","jsxs","LanguageToggle","languages","selectedLanguage","onLanguageChange","Select","value","SelectTrigger","Languages","SelectValue","SelectContent","lang","SelectItem","jsx","jsxs","Logo","className","React","React","DialogPrimitive","X","jsx","jsxs","Dialog","DialogPortal","DialogOverlay","className","props","ref","jsx","cn","DialogContent","children","jsxs","DialogPortal","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","Search","jsx","jsxs","Command","className","props","ref","cn","CommandInput","onValueChange","value","setValue","e","newValue","CommandList","CommandEmpty","CommandGroup","heading","CommandItem","onSelect","handleClick","CommandDialog","open","onOpenChange","children","Dialog","DialogContent","LANGUAGE_PATTERN","getAvailableLanguages","version","files","languageDirs","file","f","dir","GROUP_PATTERN","BUTTON_PATTERN","getEntityType","item","allFiles","f","isPage","isButton","isDropdown","isGroup","isHidden","isPage","isButton","isDropdown","isGroup","getSortEntities","list","a","b","ao","isButton","isGroup","isDropdown","bo","at","bt","getTitle","entity","LANGUAGE_PATTERN","BUTTON_PATTERN","Search","React","Fragment","jsx","jsxs","SearchBar","documentationStructure","selectedVersion","selectedLanguage","onPageSelect","scannedFiles","open","setOpen","query","setQuery","contentMap","map","file","key","searchablePages","results","structure","collectPages","entities","version","entity","filePath","title","getTitle","content","extractSnippet","maxLength","lowerContent","lowerQuery","index","start","beforeMatch","lastSentence","lastNewline","lastSpace","bestStart","end","afterMatch","nextSentence","nextNewline","nextSpace","bestEnd","snippet","filteredResults","page","titleMatch","pathMatch","contentMatch","handleSelect","path","down","e","Button","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","result","highlightSnippet","text","regex","part","i","CommandItem","FileText","React","PanelLeft","React","React","jsx","Input","className","type","props","ref","cn","React","SeparatorPrimitive","jsx","Separator","className","orientation","decorative","props","ref","cn","React","SheetPrimitive","X","jsx","jsxs","Sheet","SheetPortal","SheetOverlay","className","props","ref","jsx","cn","sheetVariants","cva","SheetContent","side","children","jsxs","X","SheetHeader","SheetFooter","SheetTitle","SheetDescription","React","TooltipPrimitive","jsx","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","className","sideOffset","props","ref","cn","React","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","mql","onChange","jsx","jsxs","SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","className","style","children","props","ref","isMobile","useIsMobile","openMobile","setOpenMobile","_open","_setOpen","open","setOpen","value","openState","toggleSidebar","handleKeyDown","event","state","contextValue","TooltipProvider","cn","Sidebar","side","variant","collapsible","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SidebarTrigger","onClick","Button","PanelLeft","SidebarRail","SidebarInset","SidebarInput","Input","SidebarHeader","SidebarFooter","SidebarSeparator","Separator","SidebarContent","SidebarGroup","SidebarGroupLabel","asChild","Slot","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","cva","SidebarMenuButton","isActive","size","tooltip","Comp","button","Tooltip","TooltipTrigger","TooltipContent","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","width","Skeleton","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","LucideIcons","resolveIcon","iconName","pascalCaseName","word","FolderOpen","jsx","jsxs","getEntityKey","entity","getEntityTitle","getEntityIcon","resolveIcon","DocumentationEntityItem","openDropdowns","onToggleDropdown","onPageSelect","entityKey","isOpen","Icon","title","filePath","SidebarMenuItem","SidebarMenuButton","url","target","e","dropdownState","shouldBeOpen","isAlwaysOpen","SidebarMenuSub","p","page","idx","pageTitle","PageIcon","pageKey","SidebarMenuSubItem","SidebarMenuSubButton","jsx","jsxs","AppSidebar","title","logo","versionSelect","versions","documentationStructure","onPageSelect","versionStorageKey","props","selectedVersion","setSelectedVersion","saved","openDropdowns","setOpenDropdowns","currentStructure","s","toggleDropdown","path","prev","next","Sidebar","SidebarHeader","Select","value","SelectTrigger","SelectValue","SelectContent","version","SelectItem","SidebarContent","SidebarGroup","SidebarMenu","entity","index","entityKey","DocumentationEntityItem","SidebarGroupLabel","SidebarMenuItem","SidebarMenuButton","FileText","Moon","Sun","React","jsx","jsxs","ThemeToggle","theme","setTheme","stored","root","Button","prev","Sun","Moon","useEffect","useState","useCallback","useDocumentationRouter","folderPath","getPageFromURL","hash","pagePath","currentPage","setCurrentPageState","setCurrentPage","page","normalized","encoded","handleHashChange","matter","errorBuilder","items","err","errors","versionPattern","groupPattern","languagePattern","item","pathParts","parentFolder","versionFolder","versionFiles","f","file","groupFolder","nestedDirs","dropdownFolder","buttonFile","isInRoot","isInLanguageFolder","applyBaseMetaDefaults","meta","inheritMeta","childMeta","parentMeta","inherited","parseVersionStructure","version","files","language","metadata","versionFiles","prepareFilesForVersion","entities","buildEntities","getSortEntities","list","f","LANGUAGE_PATTERN","wantedLang","second","file","type","getEntityType","meta","makePage","isHidden","b","makeButton","processedDirs","dir","dirPath","originalDirPath","g","makeGroup","d","makeDropdown","frontmatter","settings","BUTTON_PATTERN","dirMeta","allMeta","pages","collectPagesUnder","dirSettings","metaKey","pageMeta","inheritMeta","p","useEffect","useMemo","useState","jsx","jsxs","Documentation","title","useToggleTheme","useToggleLanguage","useSearch","logo","Logo","folderPath","logTreeFiles","versionSelect","scannedFiles","setScannedFiles","receivedErrors","setReceivedErrors","documentationStructure","setDocumentationStructure","selectedVersion","setSelectedVersion","versionStorageKey","languageStorageKey","currentPage","setCurrentPage","useDocumentationRouter","selectedLanguage","setSelectedLanguage","saved","ignoreArray","params","pattern","files","allLanguages","version","getAvailableLanguages","lang","defaultLang","errorBuilder","structures","languages","parseVersionStructure","normalizedCurrentPage","file","normalizedRelative","normalizedOriginal","normalizedPath","ErrorsList","SidebarProvider","AppSidebar","SidebarInset","SidebarTrigger","Separator","SearchBar","LanguageToggle","s","index","arr","ThemeToggle","MarkdownViewerLazy"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as h,e as P}from"./chunk-2AQ6S3IJ.mjs";import{Check as D,Copy as W}from"lucide-react";import*as d from"react";import B from"react-markdown";import{Prism as L}from"react-syntax-highlighter";import{oneDark as A,oneLight as j}from"react-syntax-highlighter/dist/esm/styles/prism";import F from"rehype-raw";import q from"rehype-sanitize";import H from"remark-gfm";import{jsx as t,jsxs as w}from"react/jsx-runtime";function N(o){let c=/[^\w\s-]/g,g=/\s+/g,u=/-+/g;return typeof o=="string"?o.toLowerCase().replace(c,"").replace(g,"-").replace(u,"-").trim():Array.isArray(o)?o.map(f=>{if(typeof f=="string")return f;if(d.isValidElement(f)){let p=f.props;if(p.children)return N(p.children)}return""}).join("").toLowerCase().replace(c,"").replace(g,"-").replace(u,"-").trim():""}function I({codeString:o,language:c,copiedCode:g,setCopiedCode:u,codeTheme:f}){let p=d.useId();return w("div",{className:"my-6 overflow-hidden rounded-lg border border-border bg-card",children:[w("div",{className:"flex h-12 items-center justify-between border-b border-border bg-muted/50 px-4",children:[t("span",{className:"text-sm font-medium text-foreground",children:c}),w(P,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0",onClick:()=>{navigator.clipboard.writeText(o),u(p),setTimeout(()=>u(null),2e3)},children:[g===p?t(D,{className:"h-4 w-4"}):t(W,{className:"h-4 w-4"}),t("span",{className:"sr-only",children:"Copy code"})]})]}),t(L,{style:f,language:c,PreTag:"div",showLineNumbers:!1,customStyle:{margin:0,padding:"1rem",fontSize:"14px",lineHeight:"1.5",background:"transparent"},children:o})]})}function V(o,c,g){if(!o||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:"))return o;if(o.startsWith("/")){let m=g.replace(/^\/+/,"").replace(/\/+$/,"");return o.startsWith(`/${m}/`)?o:m?`/${m}${o}`:o}if(!c){let m=g.replace(/^\/+/,"").replace(/\/+$/,""),k=o.replace(/\\/g,"/").replace(/^\.\//,"");return m?`/${m}/${k}`:`/${k}`}let u=c.replace(/[/\\][^/\\]*\.md$/,"").replace(/\\/g,"/"),p=o.replace(/\\/g,"/").replace(/^\.\//,"").split("/").filter(Boolean),y=u?u.split("/").filter(Boolean):[];for(let m of p)m===".."?y.length>0&&y.pop():m!=="."&&y.push(m);let x=y.length>0?y.join("/"):"",v=g.replace(/^\/+/,"").replace(/\/+$/,"");return v?x?`/${v}/${x}`:`/${v}`:x?`/${x}`:"/"}function Y({filePath:o,folderPath:c,onPageSelect:g}){let[u,f]=d.useState(""),[p,y]=d.useState(!0),[x,v]=d.useState(null),[m,k]=d.useState(!1),[S,E]=d.useState(null);d.useEffect(()=>{let r=()=>{k(document.documentElement.classList.contains("dark"))};r();let e=new MutationObserver(r);return e.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>e.disconnect()},[]);let T=m?A:j;return d.useEffect(()=>{o&&(async()=>{y(!0),v(null),f("");let e=200;try{let a=Date.now(),n=new URLSearchParams;n.set("filePath",o),n.set("folderPath",c);let i=await fetch(`/api/dock-rush-markdown?${n.toString()}`,{headers:{Accept:"application/json"}});if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);let s=await i.json(),l=Date.now()-a,b=Math.max(0,e-l);if(await new Promise(C=>setTimeout(C,b)),s.success)f(s.content),setTimeout(()=>{y(!1)},100);else throw new Error(s.error||"Failed to load markdown")}catch(a){v(a instanceof Error?a.message:"Unknown error"),y(!1)}})()},[o,c]),x?t("div",{className:"flex flex-col items-center justify-center p-12 animate-in fade-in-0 duration-300",children:w("p",{className:"text-destructive",children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0444\u0430\u0439\u043B\u0430: ",x]})}):w("div",{className:"relative mx-auto max-w-4xl px-6 py-8 h-full",children:[p&&w("div",{className:"flex flex-col gap-4 p-6 animate-in fade-in-0 duration-200",children:[t(h,{className:"h-8 w-3/4"}),t(h,{className:"h-4 w-full"}),t(h,{className:"h-4 w-full"}),t(h,{className:"h-4 w-2/3"}),t(h,{className:"h-4 w-full"}),t(h,{className:"h-4 w-5/6"}),t(h,{className:"h-4 w-full"}),t(h,{className:"h-4 w-4/5"})]}),!p&&u&&t("div",{className:"animate-in fade-in-0 duration-300",children:t(B,{remarkPlugins:[H],rehypePlugins:[F,q],components:{h1:({node:r,...e})=>{let a=N(e.children);return t("h1",{id:a,className:"mb-6 mt-8 scroll-mt-20 text-4xl font-bold tracking-tight",...e})},h2:({node:r,...e})=>{let a=N(e.children);return t("h2",{id:a,className:"mb-4 mt-8 scroll-mt-20 text-3xl font-semibold tracking-tight",...e})},h3:({node:r,...e})=>{let a=N(e.children);return t("h3",{id:a,className:"mb-3 mt-6 scroll-mt-20 text-2xl font-semibold tracking-tight",...e})},h4:({node:r,...e})=>{let a=N(e.children);return t("h4",{id:a,className:"mb-2 mt-4 scroll-mt-20 text-xl font-semibold tracking-tight",...e})},h5:({node:r,...e})=>{let a=N(e.children);return t("h5",{id:a,className:"mb-2 mt-4 scroll-mt-20 text-lg font-semibold",...e})},h6:({node:r,...e})=>{let a=N(e.children);return t("h6",{id:a,className:"mb-2 mt-4 scroll-mt-20 text-base font-semibold",...e})},p:({node:r,children:e,...a})=>{if(d.Children.toArray(e).some(s=>{if(d.isValidElement(s)){if(s.type==="figure"||s.type==="img")return!0;let l=s.props;if(l?.node){let b=l.node;if(b.type==="element"&&(b.tagName==="img"||b.tagName==="figure"))return!0}}return!1})){let{ref:s,...l}=a;return t("div",{className:"mb-6 leading-7 text-muted-foreground",...l,children:e})}return t("p",{className:"mb-6 leading-7 text-muted-foreground",...a,children:e})},ul:({node:r,...e})=>t("ul",{className:"my-6 ml-6 list-disc space-y-2 text-muted-foreground",...e}),ol:({node:r,...e})=>t("ol",{className:"my-6 ml-6 list-decimal space-y-2 text-muted-foreground",...e}),li:({node:r,...e})=>t("li",{className:"leading-7 pl-2",...e}),input:({node:r,...e})=>e.type==="checkbox"?t("input",{type:"checkbox",className:"mr-2 h-4 w-4 rounded border-border accent-primary",disabled:!0,...e}):t("input",{...e}),blockquote:({node:r,...e})=>t("blockquote",{className:"my-6 border-l-2 border-border bg-muted/50 pl-6 italic text-muted-foreground",...e}),code:({node:r,inline:e,className:a,children:n,...i})=>{let s=/language-(\w+)/.exec(a||""),l=String(n).replace(/\n$/,"");return!e&&s?t(I,{codeString:l,language:s[1],copiedCode:S,setCopiedCode:E,codeTheme:T}):t("code",{className:"relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold",...i,children:n})},pre:({node:r,...e})=>{let{ref:a,...n}=e;return t("div",{...n})},img:({src:r,alt:e,title:a})=>{let n=V(r||"",o||"",c||"docs");return w("figure",{className:"my-8",children:[t("img",{src:n,alt:e,title:a,loading:"lazy",className:"rounded-lg border border-border bg-muted max-w-full h-auto",onError:i=>{let s=i.target;s.style.display="none";let l=s.closest("figure");if(l&&!l.querySelector(".image-error")){let b=document.createElement("div");b.className="image-error p-4 text-center text-sm text-muted-foreground border border-dashed border-border rounded-lg",b.textContent=`\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E: ${r} (\u043F\u0443\u0442\u044C: ${n})`,l.appendChild(b)}}}),e&&t("figcaption",{className:"mt-3 text-center text-sm text-muted-foreground",children:e})]})},a:({href:r,children:e,...a})=>!r||r.startsWith("http")||r.startsWith("#")||r.startsWith("mailto:")||r.startsWith("tel:")?t("a",{href:r,className:"font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80",target:"_blank",rel:"noopener noreferrer",...a,children:e}):r.toLowerCase().endsWith(".md")?t("a",{href:r,onClick:i=>{i.preventDefault();let l=o.replace(/[/\\][^/\\]*\.md$/,"").replace(/\\/g,"/"),C=r.replace(/\\/g,"/").split("/").filter(Boolean),R=l.split("/").filter(Boolean);for(let $ of C)$===".."?R.pop():$!=="."&&R.push($);let M=R.join("/");g(M)},className:"font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80 cursor-pointer",...a,children:e}):t("a",{href:r,className:"font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80",...a}),table:({children:r})=>t("div",{className:"my-6 w-full overflow-y-auto",children:t("table",{className:"w-full border-collapse",children:r})}),thead:({node:r,...e})=>t("thead",{className:"[&_tr]:border-b",...e}),th:({node:r,...e})=>t("th",{className:"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",...e}),td:({node:r,...e})=>t("td",{className:"p-4 align-middle [&:has([role=checkbox])]:pr-0",...e}),tbody:({node:r,...e})=>t("tbody",{className:"[&_tr:last-child]:border-0",...e}),tr:({node:r,...e})=>t("tr",{className:"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",...e}),hr:({node:r,...e})=>t("hr",{className:"my-8 border-t border-border",...e}),strong:({node:r,...e})=>t("strong",{className:"font-semibold text-foreground",...e}),em:({node:r,...e})=>t("em",{className:"italic text-foreground",...e}),del:({node:r,...e})=>t("del",{className:"line-through text-muted-foreground",...e}),mark:({node:r,...e})=>t("mark",{className:"bg-yellow-200 dark:bg-yellow-900/50 px-1 rounded",...e}),kbd:({node:r,...e})=>t("kbd",{className:"px-2 py-1 text-xs font-semibold text-foreground bg-muted border border-border rounded shadow-sm",...e}),abbr:({node:r,title:e,...a})=>t("abbr",{title:e,className:"underline decoration-dotted cursor-help",...a}),sub:({node:r,...e})=>t("sub",{className:"text-xs align-sub",...e}),sup:({node:r,...e})=>t("sup",{className:"text-xs align-super",...e}),details:({node:r,...e})=>t("details",{className:"my-4 px-4 rounded-lg border border-border bg-muted/30",...e}),summary:({node:r,...e})=>t("summary",{className:"cursor-pointer px-4 py-2 font-semibold hover:bg-muted/50",...e}),dl:({node:r,...e})=>t("dl",{className:"my-4 space-y-2",...e}),dt:({node:r,...e})=>t("dt",{className:"font-semibold text-foreground",...e}),dd:({node:r,...e})=>t("dd",{className:"ml-6 text-muted-foreground",...e}),video:({node:r,src:e,...a})=>t("video",{src:e,controls:!0,className:"my-4 w-full rounded-lg border border-border",...a}),iframe:({node:r,src:e,title:a,...n})=>t("iframe",{src:e,title:a,className:"my-4 w-full rounded-lg border border-border",allowFullScreen:!0,...n}),audio:({node:r,src:e,...a})=>t("audio",{src:e,controls:!0,className:"my-4 w-full",...a}),br:({node:r,...e})=>t("br",{...e}),div:({node:r,className:e,...a})=>{let n=e?`${e} my-2`:"my-2";return t("div",{className:n,...a})},span:({node:r,...e})=>t("span",{...e}),section:({node:r,...e})=>t("section",{className:"my-6",...e}),article:({node:r,...e})=>t("article",{className:"my-6",...e}),aside:({node:r,...e})=>t("aside",{className:"my-4 border-l-4 border-primary pl-4 italic text-muted-foreground",...e}),address:({node:r,...e})=>t("address",{className:"my-4 not-italic",...e}),time:({node:r,datetime:e,...a})=>t("time",{dateTime:e,className:"text-muted-foreground",...a}),small:({node:r,...e})=>t("small",{className:"text-sm text-muted-foreground",...e}),ins:({node:r,...e})=>t("ins",{className:"no-underline bg-green-100 dark:bg-green-900/30 px-1 rounded",...e}),samp:({node:r,...e})=>t("samp",{className:"font-mono bg-muted px-1 py-0.5 rounded text-sm",...e}),var:({node:r,...e})=>t("var",{className:"italic font-mono text-primary",...e}),cite:({node:r,...e})=>t("cite",{className:"italic text-muted-foreground",...e}),q:({node:r,...e})=>t("q",{className:"italic text-muted-foreground",...e}),dfn:({node:r,...e})=>t("dfn",{className:"italic font-semibold",...e}),bdi:({node:r,...e})=>t("bdi",{...e}),bdo:({node:r,dir:e,...a})=>t("bdo",{dir:e,...a}),wbr:({node:r,...e})=>t("wbr",{...e}),ruby:({node:r,...e})=>t("ruby",{className:"text-base",...e}),rt:({node:r,...e})=>t("rt",{className:"text-xs text-muted-foreground",...e}),rp:({node:r,...e})=>t("rp",{className:"text-xs text-muted-foreground",...e}),meter:({node:r,value:e,min:a,max:n,...i})=>t("meter",{value:e,min:a,max:n,className:"w-full h-2 rounded",...i}),progress:({node:r,value:e,max:a,...n})=>t("progress",{value:e,max:a,className:"w-full h-2 rounded",...n})},children:u})})]})}export{Y as MarkdownViewer};
|
|
2
|
+
//# sourceMappingURL=markdown-viewer-2GZNJGML.mjs.map
|