import { Group, Stack, Title, Text, Box, MediaQuery, Aside, ScrollArea, Skeleton } from '@mantine/core';
import { useMediaQuery } from '@mantine/hooks';
import { useRouter } from 'next/router';
import { Fragment, ReactNode } from 'react';
import {
VscSymbolClass,
VscSymbolMethod,
VscSymbolEnum,
VscSymbolInterface,
VscSymbolVariable,
VscListSelection,
VscSymbolParameter,
} from 'react-icons/vsc';
import { PrismAsyncLight as SyntaxHighlighter } from 'react-syntax-highlighter';
import { vscDarkPlus } from 'react-syntax-highlighter/dist/cjs/styles/prism';
import { HyperlinkedText } from './HyperlinkedText';
import { Section } from './Section';
import { TableOfContentItems } from './TableOfContentItems';
import { TypeParamTable } from './TypeParamTable';
import { TSDoc } from './tsdoc/TSDoc';
import type { ApiClassJSON, ApiInterfaceJSON, ApiItemJSON } from '~/DocModel/ApiNodeJSONEncoder';
import type { TypeParameterData } from '~/DocModel/TypeParameterMixin';
import type { AnyDocNodeJSON } from '~/DocModel/comment/CommentNode';
import type { TokenDocumentation } from '~/util/parse.server';
export interface DocContainerProps {
name: string;
kind: string;
excerpt: string;
summary?: ApiItemJSON['summary'];
children?: ReactNode;
extendsTokens?: TokenDocumentation[] | null;
implementsTokens?: TokenDocumentation[][];
typeParams?: TypeParameterData[];
comment?: AnyDocNodeJSON | null;
methods?: ApiClassJSON['methods'] | ApiInterfaceJSON['methods'] | null;
properties?: ApiClassJSON['properties'] | ApiInterfaceJSON['properties'] | null;
}
function generateIcon(kind: string) {
const icons = {
Class: ,
Method: ,
Function: ,
Enum: ,
Interface: ,
TypeAlias: ,
};
return icons[kind as keyof typeof icons];
}
export function DocContainer({
name,
kind,
excerpt,
summary,
typeParams,
children,
extendsTokens,
implementsTokens,
methods,
properties,
}: DocContainerProps) {
const router = useRouter();
const matches = useMediaQuery('(max-width: 768px)', true, { getInitialValueInEffect: false });
return (
{generateIcon(kind)}
{name}
} padded dense={matches}>
{summary ? : No summary provided.}
{excerpt}
{extendsTokens?.length ? (
Extends
) : null}
{implementsTokens?.length ? (
Implements
{implementsTokens.map((token, idx) => (
{idx < implementsTokens.length - 1 ? ', ' : ''}
))}
) : null}
{typeParams?.length ? (
}
padded
dense={matches}
defaultClosed
>
) : null}
{children}
{(kind === 'Class' || kind === 'Interface') && (methods?.length || properties?.length) ? (
) : null}
);
}