15b6cd93dSBartosz Kaszubowskiimport { css } from '@emotion/react';
2f4b1168bSBartosz Kaszubowskiimport { shadows, theme, typography } from '@expo/styleguide';
3f4b1168bSBartosz Kaszubowskiimport { borderRadius, breakpoints, spacing } from '@expo/styleguide-base';
4a16a3d18SBartosz Kaszubowskiimport type { ComponentProps, ComponentType } from 'react';
512abeb84SBartosz Kaszubowskiimport { Fragment } from 'react';
6299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown';
7dc379e46SBartosz Kaszubowskiimport remarkGfm from 'remark-gfm';
8299f02f2SBartosz Kaszubowski
9f8204ef0SBartosz Kaszubowskiimport { APIDataType } from './APIDataType';
10f8204ef0SBartosz Kaszubowski
11a16a3d18SBartosz Kaszubowskiimport { HeadingType } from '~/common/headingManager';
1212abeb84SBartosz Kaszubowskiimport { Code as PrismCodeBlock } from '~/components/base/code';
13299f02f2SBartosz Kaszubowskiimport {
145990cc31SBartosz Kaszubowski  CommentContentData,
15299f02f2SBartosz Kaszubowski  CommentData,
16adede39aSŁukasz Kosmaty  MethodDefinitionData,
17299f02f2SBartosz Kaszubowski  MethodParamData,
18b15ebaf2SBartosz Kaszubowski  MethodSignatureData,
19f52aa21eSBartosz Kaszubowski  PropData,
20299f02f2SBartosz Kaszubowski  TypeDefinitionData,
21b15ebaf2SBartosz Kaszubowski  TypePropertyDataFlags,
225990cc31SBartosz Kaszubowski  TypeSignaturesData,
23299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
24b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
25d9bd5b6cSBartosz Kaszubowskiimport { Callout } from '~/ui/components/Callout';
266a5c065cSBartosz Kaszubowskiimport { Cell, HeaderCell, Row, Table, TableHead } from '~/ui/components/Table';
276a5c065cSBartosz Kaszubowskiimport { tableWrapperStyle } from '~/ui/components/Table/Table';
28a0c5fbc5SBartosz Kaszubowskiimport { Tag } from '~/ui/components/Tag';
29a16a3d18SBartosz Kaszubowskiimport {
30a16a3d18SBartosz Kaszubowski  A,
31a16a3d18SBartosz Kaszubowski  BOLD,
32a16a3d18SBartosz Kaszubowski  CODE,
33a16a3d18SBartosz Kaszubowski  H4,
34a16a3d18SBartosz Kaszubowski  LI,
35a16a3d18SBartosz Kaszubowski  OL,
36a16a3d18SBartosz Kaszubowski  P,
37a16a3d18SBartosz Kaszubowski  RawH3,
38a16a3d18SBartosz Kaszubowski  RawH4,
39a16a3d18SBartosz Kaszubowski  UL,
40a16a3d18SBartosz Kaszubowski  createPermalinkedComponent,
41be43ea08SBartosz Kaszubowski  DEMI,
42be43ea08SBartosz Kaszubowski  CALLOUT,
43be43ea08SBartosz Kaszubowski  createTextComponent,
44a16a3d18SBartosz Kaszubowski} from '~/ui/components/Text';
45be43ea08SBartosz Kaszubowskiimport { TextElement } from '~/ui/components/Text/types';
46299f02f2SBartosz Kaszubowski
47a7112dadSBartosz Kaszubowskiconst isDev = process.env.NODE_ENV === 'development';
48a7112dadSBartosz Kaszubowski
49299f02f2SBartosz Kaszubowskiexport enum TypeDocKind {
506b7802baSBartosz Kaszubowski  Namespace = 4,
51c8c9d6e8SBartosz Kaszubowski  Enum = 8,
52299f02f2SBartosz Kaszubowski  Variable = 32,
53299f02f2SBartosz Kaszubowski  Function = 64,
54299f02f2SBartosz Kaszubowski  Class = 128,
55299f02f2SBartosz Kaszubowski  Interface = 256,
56299f02f2SBartosz Kaszubowski  Property = 1024,
572c8d37c0SBartosz Kaszubowski  Method = 2048,
58a116a546SBartosz Kaszubowski  Parameter = 32768,
596b7802baSBartosz Kaszubowski  Accessor = 262144,
60299f02f2SBartosz Kaszubowski  TypeAlias = 4194304,
61299f02f2SBartosz Kaszubowski}
62299f02f2SBartosz Kaszubowski
6312abeb84SBartosz Kaszubowskiexport type MDComponents = ComponentProps<typeof ReactMarkdown>['components'];
6484745a05SBartosz Kaszubowski
65a7112dadSBartosz Kaszubowskiconst getInvalidLinkMessage = (href: string) =>
66a7112dadSBartosz Kaszubowski  `Using "../" when linking other packages in doc comments produce a broken link! Please use "./" instead. Problematic link:\n\t${href}`;
67a7112dadSBartosz Kaszubowski
68dc379e46SBartosz Kaszubowskiexport const mdComponents: MDComponents = {
69d9bd5b6cSBartosz Kaszubowski  blockquote: ({ children }) => <Callout>{children}</Callout>,
70c8c9d6e8SBartosz Kaszubowski  code: ({ children, className }) =>
7112abeb84SBartosz Kaszubowski    className ? (
7212abeb84SBartosz Kaszubowski      <PrismCodeBlock className={className}>{children}</PrismCodeBlock>
7312abeb84SBartosz Kaszubowski    ) : (
7412abeb84SBartosz Kaszubowski      <CODE css={css({ display: 'inline' })}>{children}</CODE>
7512abeb84SBartosz Kaszubowski    ),
76dc379e46SBartosz Kaszubowski  h1: ({ children }) => <H4>{children}</H4>,
77f4b1168bSBartosz Kaszubowski  ul: ({ children }) => <UL className={ELEMENT_SPACING}>{children}</UL>,
78f4b1168bSBartosz Kaszubowski  ol: ({ children }) => <OL className={ELEMENT_SPACING}>{children}</OL>,
79dc379e46SBartosz Kaszubowski  li: ({ children }) => <LI>{children}</LI>,
80a7112dadSBartosz Kaszubowski  a: ({ href, children }) => {
81a7112dadSBartosz Kaszubowski    if (
82a7112dadSBartosz Kaszubowski      href?.startsWith('../') &&
83a7112dadSBartosz Kaszubowski      !href?.startsWith('../..') &&
84a7112dadSBartosz Kaszubowski      !href?.startsWith('../react-native')
85a7112dadSBartosz Kaszubowski    ) {
86a7112dadSBartosz Kaszubowski      if (isDev) {
87a7112dadSBartosz Kaszubowski        throw new Error(getInvalidLinkMessage(href));
88a7112dadSBartosz Kaszubowski      } else {
89a7112dadSBartosz Kaszubowski        console.warn(getInvalidLinkMessage(href));
90a7112dadSBartosz Kaszubowski      }
91a7112dadSBartosz Kaszubowski    }
923c9a6b96SBartosz Kaszubowski    return <A href={href}>{children}</A>;
93a7112dadSBartosz Kaszubowski  },
94f4b1168bSBartosz Kaszubowski  p: ({ children }) => (children ? <P className={ELEMENT_SPACING}>{children}</P> : null),
953c9a6b96SBartosz Kaszubowski  strong: ({ children }) => <BOLD>{children}</BOLD>,
96dc379e46SBartosz Kaszubowski  span: ({ children }) => (children ? <span>{children}</span> : null),
973e972ef8SBartosz Kaszubowski  table: ({ children }) => <Table>{children}</Table>,
983e972ef8SBartosz Kaszubowski  thead: ({ children }) => <TableHead>{children}</TableHead>,
993e972ef8SBartosz Kaszubowski  tr: ({ children }) => <Row>{children}</Row>,
1003e972ef8SBartosz Kaszubowski  th: ({ children }) => <HeaderCell>{children}</HeaderCell>,
1013e972ef8SBartosz Kaszubowski  td: ({ children }) => <Cell>{children}</Cell>,
102299f02f2SBartosz Kaszubowski};
103299f02f2SBartosz Kaszubowski
104f6311d0dSBartosz Kaszubowskiexport const mdComponentsNoValidation: MDComponents = {
105dc379e46SBartosz Kaszubowski  ...mdComponents,
1063c9a6b96SBartosz Kaszubowski  a: ({ href, children }) => <A href={href}>{children}</A>,
1073f609562SBartosz Kaszubowski};
1083f609562SBartosz Kaszubowski
1091ef472c3SBartosz Kaszubowskiconst nonLinkableTypes = [
110f52aa21eSBartosz Kaszubowski  'ColorValue',
111f31f564bSBartosz Kaszubowski  'Component',
11213032b48SBartosz Kaszubowski  'ComponentClass',
1136d4adf53STomasz Sapeta  'PureComponent',
114c14370d2SBartosz Kaszubowski  'E',
115c14370d2SBartosz Kaszubowski  'EventSubscription',
11635e5274fSBartosz Kaszubowski  'Listener',
117f52aa21eSBartosz Kaszubowski  'NativeSyntheticEvent',
118ad814e56SBartosz Kaszubowski  'ParsedQs',
11942175e80SBartosz Kaszubowski  'ServiceActionResult',
1201ef472c3SBartosz Kaszubowski  'T',
1211ef472c3SBartosz Kaszubowski  'TaskOptions',
1221ef472c3SBartosz Kaszubowski  'Uint8Array',
123ce122823SBartłomiej Bukowski  // React & React Native
124ce122823SBartłomiej Bukowski  'React.FC',
125ce122823SBartłomiej Bukowski  'ForwardRefExoticComponent',
126ce122823SBartłomiej Bukowski  'StyleProp',
127fd27228dSBartosz Kaszubowski  'HTMLInputElement',
128a620d75aSBartosz Kaszubowski  // Cross-package permissions management
129afd08d69SCedric van Putten  'RequestPermissionMethod',
130afd08d69SCedric van Putten  'GetPermissionMethod',
131a620d75aSBartosz Kaszubowski  'Options',
132a620d75aSBartosz Kaszubowski  'PermissionHookBehavior',
1331ef472c3SBartosz Kaszubowski];
1341deaefb9SBartosz Kaszubowski
135ce122823SBartłomiej Bukowski/**
136ce122823SBartłomiej Bukowski * List of type names that should not be visible in the docs.
137ce122823SBartłomiej Bukowski */
138ce122823SBartłomiej Bukowskiconst omittableTypes = [
139ce122823SBartłomiej Bukowski  // Internal React type that adds `ref` prop to the component
140ce122823SBartłomiej Bukowski  'RefAttributes',
141ce122823SBartłomiej Bukowski];
142ce122823SBartłomiej Bukowski
143ce122823SBartłomiej Bukowski/**
144ce122823SBartłomiej Bukowski * Map of internal names/type names that should be replaced with something more developer-friendly.
145ce122823SBartłomiej Bukowski */
146ce122823SBartłomiej Bukowskiconst replaceableTypes: Partial<Record<string, string>> = {
147ce122823SBartłomiej Bukowski  ForwardRefExoticComponent: 'Component',
148*d2435341SAman Mittal  LocationAccuracy: 'Accuracy',
149*d2435341SAman Mittal  LocationGeofencingRegionState: 'GeofencingRegionState',
150*d2435341SAman Mittal  LocationActivityType: 'ActivityType',
151ce122823SBartłomiej Bukowski};
152ce122823SBartłomiej Bukowski
1531cefc4ecSBartosz Kaszubowskiconst hardcodedTypeLinks: Record<string, string> = {
1544c73bbf6SBartosz Kaszubowski  AVPlaybackSource: '/versions/latest/sdk/av/#avplaybacksource',
1554c73bbf6SBartosz Kaszubowski  AVPlaybackStatus: '/versions/latest/sdk/av/#avplaybackstatus',
1564c73bbf6SBartosz Kaszubowski  AVPlaybackStatusToSet: '/versions/latest/sdk/av/#avplaybackstatustoset',
15713032b48SBartosz Kaszubowski  Blob: 'https://developer.mozilla.org/en-US/docs/Web/API/Blob',
1581cefc4ecSBartosz Kaszubowski  Date: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date',
15935e5274fSBartosz Kaszubowski  DeviceSensor: '/versions/latest/sdk/sensors',
160144e76edSBartosz Kaszubowski  Element: 'https://www.typescriptlang.org/docs/handbook/jsx.html#function-component',
1611cefc4ecSBartosz Kaszubowski  Error: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error',
162a116a546SBartosz Kaszubowski  ExpoConfig:
163a116a546SBartosz Kaszubowski    'https://github.com/expo/expo/blob/main/packages/%40expo/config-types/src/ExpoConfig.ts',
164faf3d32fSBartosz Kaszubowski  File: 'https://developer.mozilla.org/en-US/docs/Web/API/File',
165faf3d32fSBartosz Kaszubowski  FileList: 'https://developer.mozilla.org/en-US/docs/Web/API/FileList',
16600b8ce63SBartosz Kaszubowski  Manifest: '/versions/latest/sdk/constants/#manifest',
16753a43234SBartosz Kaszubowski  MediaTrackSettings: 'https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings',
168ad814e56SBartosz Kaszubowski  MessageEvent: 'https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent',
16993e61eefSBartosz Kaszubowski  Omit: 'https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys',
17093e61eefSBartosz Kaszubowski  Pick: 'https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys',
17193e61eefSBartosz Kaszubowski  Partial: 'https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype',
1721cefc4ecSBartosz Kaszubowski  Promise:
1731cefc4ecSBartosz Kaszubowski    'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise',
174be71811dSAman Mittal  SyntheticEvent: 'https://react.dev/reference/react-dom/components/common#react-event-object',
1755990cc31SBartosz Kaszubowski  View: 'https://reactnative.dev/docs/view',
1765990cc31SBartosz Kaszubowski  ViewProps: 'https://reactnative.dev/docs/view#props',
1775990cc31SBartosz Kaszubowski  ViewStyle: 'https://reactnative.dev/docs/view-style-props',
17813032b48SBartosz Kaszubowski  WebGL2RenderingContext: 'https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext',
17913032b48SBartosz Kaszubowski  WebGLFramebuffer: 'https://developer.mozilla.org/en-US/docs/Web/API/WebGLFramebuffer',
1801cefc4ecSBartosz Kaszubowski};
1811cefc4ecSBartosz Kaszubowski
182ce122823SBartłomiej Bukowskiconst renderWithLink = (name: string, type?: string) => {
183ce122823SBartłomiej Bukowski  const replacedName = replaceableTypes[name] ?? name;
184ce122823SBartłomiej Bukowski
1856b7802baSBartosz Kaszubowski  if (name.includes('.')) return name;
1866b7802baSBartosz Kaszubowski
187ce122823SBartłomiej Bukowski  return nonLinkableTypes.includes(replacedName) ? (
188ce122823SBartłomiej Bukowski    replacedName + (type === 'array' ? '[]' : '')
1891cefc4ecSBartosz Kaszubowski  ) : (
1903c9a6b96SBartosz Kaszubowski    <A
191ce122823SBartłomiej Bukowski      href={hardcodedTypeLinks[replacedName] || `#${replacedName.toLowerCase()}`}
19267ef0fb8SBrent Vatne      key={`type-link-${replacedName}`}>
193ce122823SBartłomiej Bukowski      {replacedName}
1941cefc4ecSBartosz Kaszubowski      {type === 'array' && '[]'}
1953c9a6b96SBartosz Kaszubowski    </A>
1961cefc4ecSBartosz Kaszubowski  );
197ce122823SBartłomiej Bukowski};
1981cefc4ecSBartosz Kaszubowski
199abded2bbSBartosz Kaszubowskiconst renderUnion = (types: TypeDefinitionData[]) =>
2004c73bbf6SBartosz Kaszubowski  types
2014c73bbf6SBartosz Kaszubowski    .map(type => resolveTypeName(type))
2024c73bbf6SBartosz Kaszubowski    .map((valueToRender, index) => (
203abded2bbSBartosz Kaszubowski      <span key={`union-type-${index}`}>
204abded2bbSBartosz Kaszubowski        {valueToRender}
205abded2bbSBartosz Kaszubowski        {index + 1 !== types.length && ' | '}
206abded2bbSBartosz Kaszubowski      </span>
207abded2bbSBartosz Kaszubowski    ));
208abded2bbSBartosz Kaszubowski
2094c73bbf6SBartosz Kaszubowskiexport const resolveTypeName = (
2104c73bbf6SBartosz Kaszubowski  typeDefinition: TypeDefinitionData
2114c73bbf6SBartosz Kaszubowski): string | JSX.Element | (string | JSX.Element)[] => {
2124c73bbf6SBartosz Kaszubowski  if (!typeDefinition) {
2134c73bbf6SBartosz Kaszubowski    return 'undefined';
2144c73bbf6SBartosz Kaszubowski  }
2154c73bbf6SBartosz Kaszubowski
2164c73bbf6SBartosz Kaszubowski  const {
217d87a784eSBartosz Kaszubowski    elements,
218299f02f2SBartosz Kaszubowski    elementType,
219299f02f2SBartosz Kaszubowski    name,
220299f02f2SBartosz Kaszubowski    type,
221299f02f2SBartosz Kaszubowski    types,
222299f02f2SBartosz Kaszubowski    typeArguments,
2231b3dce65SBartosz Kaszubowski    declaration,
2248e38d640SBartosz Kaszubowski    value,
2256062847eSBartosz Kaszubowski    queryType,
226e3060685SBartosz Kaszubowski    operator,
2279f72d43bSBartosz Kaszubowski    objectType,
2289f72d43bSBartosz Kaszubowski    indexType,
2294c73bbf6SBartosz Kaszubowski  } = typeDefinition;
2304c73bbf6SBartosz Kaszubowski
231ae6cc736SBartosz Kaszubowski  try {
232299f02f2SBartosz Kaszubowski    if (name) {
233299f02f2SBartosz Kaszubowski      if (type === 'reference') {
234299f02f2SBartosz Kaszubowski        if (typeArguments) {
235d87a784eSBartosz Kaszubowski          if (name === 'Record' || name === 'React.ComponentProps') {
236299f02f2SBartosz Kaszubowski            return (
237d87a784eSBartosz Kaszubowski              <>
2386062847eSBartosz Kaszubowski                {name}&lt;
2396062847eSBartosz Kaszubowski                {typeArguments.map((type, index) => (
2406062847eSBartosz Kaszubowski                  <span key={`record-type-${index}`}>
2416062847eSBartosz Kaszubowski                    {resolveTypeName(type)}
2421ef472c3SBartosz Kaszubowski                    {index !== typeArguments.length - 1 ? ', ' : null}
2436062847eSBartosz Kaszubowski                  </span>
2446062847eSBartosz Kaszubowski                ))}
2456062847eSBartosz Kaszubowski                &gt;
246d87a784eSBartosz Kaszubowski              </>
247299f02f2SBartosz Kaszubowski            );
248299f02f2SBartosz Kaszubowski          } else {
249d87a784eSBartosz Kaszubowski            return (
250d87a784eSBartosz Kaszubowski              <>
2511cefc4ecSBartosz Kaszubowski                {renderWithLink(name)}
252d87a784eSBartosz Kaszubowski                &lt;
253d87a784eSBartosz Kaszubowski                {typeArguments.map((type, index) => (
2541ef472c3SBartosz Kaszubowski                  <span key={`${name}-nested-type-${index}`}>
2551ef472c3SBartosz Kaszubowski                    {resolveTypeName(type)}
2561ef472c3SBartosz Kaszubowski                    {index !== typeArguments.length - 1 ? ', ' : null}
2571ef472c3SBartosz Kaszubowski                  </span>
258d87a784eSBartosz Kaszubowski                ))}
259d87a784eSBartosz Kaszubowski                &gt;
260d87a784eSBartosz Kaszubowski              </>
261d87a784eSBartosz Kaszubowski            );
262299f02f2SBartosz Kaszubowski          }
263299f02f2SBartosz Kaszubowski        } else {
2641cefc4ecSBartosz Kaszubowski          return renderWithLink(name);
265299f02f2SBartosz Kaszubowski        }
266299f02f2SBartosz Kaszubowski      } else {
267299f02f2SBartosz Kaszubowski        return name;
268299f02f2SBartosz Kaszubowski      }
269299f02f2SBartosz Kaszubowski    } else if (elementType?.name) {
270393777a1SBartosz Kaszubowski      if (elementType.type === 'reference') {
2711cefc4ecSBartosz Kaszubowski        return renderWithLink(elementType.name, type);
2721cefc4ecSBartosz Kaszubowski      } else if (type === 'array') {
273299f02f2SBartosz Kaszubowski        return elementType.name + '[]';
274299f02f2SBartosz Kaszubowski      }
275299f02f2SBartosz Kaszubowski      return elementType.name + type;
276abded2bbSBartosz Kaszubowski    } else if (elementType?.declaration) {
277abded2bbSBartosz Kaszubowski      if (type === 'array') {
278abded2bbSBartosz Kaszubowski        const { parameters, type: paramType } = elementType.declaration.indexSignature || {};
279abded2bbSBartosz Kaszubowski        if (parameters && paramType) {
280abded2bbSBartosz Kaszubowski          return `{ [${listParams(parameters)}]: ${resolveTypeName(paramType)} }`;
281abded2bbSBartosz Kaszubowski        }
282abded2bbSBartosz Kaszubowski      }
283abded2bbSBartosz Kaszubowski      return elementType.name + type;
284299f02f2SBartosz Kaszubowski    } else if (type === 'union' && types?.length) {
285abded2bbSBartosz Kaszubowski      return renderUnion(types);
286abded2bbSBartosz Kaszubowski    } else if (elementType && elementType.type === 'union' && elementType?.types?.length) {
287abded2bbSBartosz Kaszubowski      const unionTypes = elementType?.types || [];
288abded2bbSBartosz Kaszubowski      return (
289abded2bbSBartosz Kaszubowski        <>
290abded2bbSBartosz Kaszubowski          ({renderUnion(unionTypes)}){type === 'array' && '[]'}
291abded2bbSBartosz Kaszubowski        </>
292abded2bbSBartosz Kaszubowski      );
2931b3dce65SBartosz Kaszubowski    } else if (declaration?.signatures) {
2940a4e04c3SBartosz Kaszubowski      const baseSignature = declaration.signatures[0];
2950a4e04c3SBartosz Kaszubowski      if (baseSignature?.parameters?.length) {
2960a4e04c3SBartosz Kaszubowski        return (
2970a4e04c3SBartosz Kaszubowski          <>
2980a4e04c3SBartosz Kaszubowski            (
2990a4e04c3SBartosz Kaszubowski            {baseSignature.parameters?.map((param, index) => (
3000a4e04c3SBartosz Kaszubowski              <span key={`param-${index}-${param.name}`}>
3010a4e04c3SBartosz Kaszubowski                {param.name}: {resolveTypeName(param.type)}
302c6a02be9SBartosz Kaszubowski                {index + 1 !== baseSignature.parameters?.length && ', '}
3030a4e04c3SBartosz Kaszubowski              </span>
3040a4e04c3SBartosz Kaszubowski            ))}
3050a4e04c3SBartosz Kaszubowski            ) {'=>'} {resolveTypeName(baseSignature.type)}
3060a4e04c3SBartosz Kaszubowski          </>
3070a4e04c3SBartosz Kaszubowski        );
3080a4e04c3SBartosz Kaszubowski      } else {
309c6a02be9SBartosz Kaszubowski        return (
310c6a02be9SBartosz Kaszubowski          <>
311c6a02be9SBartosz Kaszubowski            {'() =>'} {resolveTypeName(baseSignature.type)}
312c6a02be9SBartosz Kaszubowski          </>
313c6a02be9SBartosz Kaszubowski        );
3140a4e04c3SBartosz Kaszubowski      }
315f52aa21eSBartosz Kaszubowski    } else if (type === 'reflection' && declaration?.children) {
316f52aa21eSBartosz Kaszubowski      return (
317f52aa21eSBartosz Kaszubowski        <>
318f8204ef0SBartosz Kaszubowski          {'{\n'}
319f52aa21eSBartosz Kaszubowski          {declaration?.children.map((child: PropData, i) => (
320f52aa21eSBartosz Kaszubowski            <span key={`reflection-${name}-${i}`}>
321f8204ef0SBartosz Kaszubowski              {'  '}
3224c73bbf6SBartosz Kaszubowski              {child.name + ': '}
3234c73bbf6SBartosz Kaszubowski              {resolveTypeName(child.type)}
324f52aa21eSBartosz Kaszubowski              {i + 1 !== declaration?.children?.length ? ', ' : null}
325f8204ef0SBartosz Kaszubowski              {'\n'}
326f52aa21eSBartosz Kaszubowski            </span>
327f52aa21eSBartosz Kaszubowski          ))}
328f52aa21eSBartosz Kaszubowski          {'}'}
329f52aa21eSBartosz Kaszubowski        </>
330f52aa21eSBartosz Kaszubowski      );
331d87a784eSBartosz Kaszubowski    } else if (type === 'tuple' && elements) {
332d87a784eSBartosz Kaszubowski      return (
333d87a784eSBartosz Kaszubowski        <>
334d87a784eSBartosz Kaszubowski          [
335d87a784eSBartosz Kaszubowski          {elements.map((elem, i) => (
336d87a784eSBartosz Kaszubowski            <span key={`tuple-${name}-${i}`}>
337d87a784eSBartosz Kaszubowski              {resolveTypeName(elem)}
3381ef472c3SBartosz Kaszubowski              {i + 1 !== elements.length ? ', ' : null}
339d87a784eSBartosz Kaszubowski            </span>
340d87a784eSBartosz Kaszubowski          ))}
341d87a784eSBartosz Kaszubowski          ]
342d87a784eSBartosz Kaszubowski        </>
343d87a784eSBartosz Kaszubowski      );
3446062847eSBartosz Kaszubowski    } else if (type === 'query' && queryType) {
3456062847eSBartosz Kaszubowski      return queryType.name;
34642175e80SBartosz Kaszubowski    } else if (type === 'literal' && typeof value === 'boolean') {
34742175e80SBartosz Kaszubowski      return `${value}`;
34802e14744SBartosz Kaszubowski    } else if (type === 'literal' && (value || (typeof value === 'number' && value === 0))) {
3498e38d640SBartosz Kaszubowski      return `'${value}'`;
350ce122823SBartłomiej Bukowski    } else if (type === 'intersection' && types) {
351ce122823SBartłomiej Bukowski      return types
352ce122823SBartłomiej Bukowski        .filter(({ name }) => !omittableTypes.includes(name ?? ''))
353ce122823SBartłomiej Bukowski        .map((value, index, array) => (
354ce122823SBartłomiej Bukowski          <span key={`intersection-${name}-${index}`}>
355ce122823SBartłomiej Bukowski            {resolveTypeName(value)}
356ce122823SBartłomiej Bukowski            {index + 1 !== array.length && ' & '}
357ce122823SBartłomiej Bukowski          </span>
358ce122823SBartłomiej Bukowski        ));
3599f72d43bSBartosz Kaszubowski    } else if (type === 'indexedAccess') {
3609f72d43bSBartosz Kaszubowski      return `${objectType?.name}['${indexType?.value}']`;
361e3060685SBartosz Kaszubowski    } else if (type === 'typeOperator') {
362e3060685SBartosz Kaszubowski      return operator || 'undefined';
3636b7802baSBartosz Kaszubowski    } else if (type === 'intrinsic') {
3646b7802baSBartosz Kaszubowski      return name || 'undefined';
365d87a784eSBartosz Kaszubowski    } else if (value === null) {
366d87a784eSBartosz Kaszubowski      return 'null';
367299f02f2SBartosz Kaszubowski    }
368299f02f2SBartosz Kaszubowski    return 'undefined';
369ae6cc736SBartosz Kaszubowski  } catch (e) {
370ae6cc736SBartosz Kaszubowski    console.warn('Type resolve has failed!', e);
371ae6cc736SBartosz Kaszubowski    return 'undefined';
372ae6cc736SBartosz Kaszubowski  }
373299f02f2SBartosz Kaszubowski};
374299f02f2SBartosz Kaszubowski
375764ac031SBartosz Kaszubowskiexport const parseParamName = (name: string) => (name.startsWith('__') ? name.substr(2) : name);
376764ac031SBartosz Kaszubowski
3777d500c47SBartosz Kaszubowskiexport const renderParamRow = ({
3787d500c47SBartosz Kaszubowski  comment,
3797d500c47SBartosz Kaszubowski  name,
3807d500c47SBartosz Kaszubowski  type,
3817d500c47SBartosz Kaszubowski  flags,
3827d500c47SBartosz Kaszubowski  defaultValue,
3837d500c47SBartosz Kaszubowski}: MethodParamData): JSX.Element => {
3845990cc31SBartosz Kaszubowski  const defaultData = getTagData('default', comment);
3855990cc31SBartosz Kaszubowski  const initValue = parseCommentContent(
3865990cc31SBartosz Kaszubowski    defaultValue || (defaultData ? getCommentContent(defaultData.content) : '')
3875990cc31SBartosz Kaszubowski  );
3887534da61SBartosz Kaszubowski  return (
3897534da61SBartosz Kaszubowski    <Row key={`param-${name}`}>
3907534da61SBartosz Kaszubowski      <Cell>
3913c9a6b96SBartosz Kaszubowski        <BOLD>{parseParamName(name)}</BOLD>
3927d500c47SBartosz Kaszubowski        {renderFlags(flags, initValue)}
3937534da61SBartosz Kaszubowski      </Cell>
3947534da61SBartosz Kaszubowski      <Cell>
395f8204ef0SBartosz Kaszubowski        <APIDataType typeDefinition={type} />
3967534da61SBartosz Kaszubowski      </Cell>
3977534da61SBartosz Kaszubowski      <Cell>
3987534da61SBartosz Kaszubowski        <CommentTextBlock
3997534da61SBartosz Kaszubowski          comment={comment}
4007d500c47SBartosz Kaszubowski          afterContent={renderDefaultValue(initValue)}
4017534da61SBartosz Kaszubowski          emptyCommentFallback="-"
4027534da61SBartosz Kaszubowski        />
4037534da61SBartosz Kaszubowski      </Cell>
4047534da61SBartosz Kaszubowski    </Row>
4057534da61SBartosz Kaszubowski  );
4067534da61SBartosz Kaszubowski};
4077534da61SBartosz Kaszubowski
408a0c5fbc5SBartosz Kaszubowskiexport const ParamsTableHeadRow = () => (
4097534da61SBartosz Kaszubowski  <TableHead>
4107534da61SBartosz Kaszubowski    <Row>
4117534da61SBartosz Kaszubowski      <HeaderCell>Name</HeaderCell>
4127534da61SBartosz Kaszubowski      <HeaderCell>Type</HeaderCell>
4137534da61SBartosz Kaszubowski      <HeaderCell>Description</HeaderCell>
4147534da61SBartosz Kaszubowski    </Row>
4157534da61SBartosz Kaszubowski  </TableHead>
4167534da61SBartosz Kaszubowski);
4177534da61SBartosz Kaszubowski
418be43ea08SBartosz Kaszubowskiconst InheritPermalink = createPermalinkedComponent(
419be43ea08SBartosz Kaszubowski  createTextComponent(
420be43ea08SBartosz Kaszubowski    TextElement.SPAN,
421be43ea08SBartosz Kaszubowski    css({ fontSize: 'inherit', fontWeight: 'inherit', color: 'inherit' })
422be43ea08SBartosz Kaszubowski  ),
423be43ea08SBartosz Kaszubowski  { baseNestingLevel: 2 }
424be43ea08SBartosz Kaszubowski);
425be43ea08SBartosz Kaszubowski
426be43ea08SBartosz Kaszubowskiexport const BoxSectionHeader = ({
427be43ea08SBartosz Kaszubowski  text,
428be43ea08SBartosz Kaszubowski  exposeInSidebar,
429be43ea08SBartosz Kaszubowski}: {
430be43ea08SBartosz Kaszubowski  text: string;
431be43ea08SBartosz Kaszubowski  exposeInSidebar?: boolean;
432be43ea08SBartosz Kaszubowski}) => {
433be43ea08SBartosz Kaszubowski  const TextWrapper = exposeInSidebar ? InheritPermalink : Fragment;
434be43ea08SBartosz Kaszubowski  return (
435be43ea08SBartosz Kaszubowski    <CALLOUT theme="secondary" weight="medium" css={STYLES_NESTED_SECTION_HEADER}>
436be43ea08SBartosz Kaszubowski      <TextWrapper>{text}</TextWrapper>
437be43ea08SBartosz Kaszubowski    </CALLOUT>
438be43ea08SBartosz Kaszubowski  );
439be43ea08SBartosz Kaszubowski};
440be43ea08SBartosz Kaszubowski
4417534da61SBartosz Kaszubowskiexport const renderParams = (parameters: MethodParamData[]) => (
4427534da61SBartosz Kaszubowski  <Table>
443a0c5fbc5SBartosz Kaszubowski    <ParamsTableHeadRow />
4446a5c065cSBartosz Kaszubowski    <tbody>{parameters?.map(renderParamRow)}</tbody>
4457534da61SBartosz Kaszubowski  </Table>
446299f02f2SBartosz Kaszubowski);
447299f02f2SBartosz Kaszubowski
448abded2bbSBartosz Kaszubowskiexport const listParams = (parameters: MethodParamData[]) =>
449abded2bbSBartosz Kaszubowski  parameters ? parameters?.map(param => parseParamName(param.name)).join(', ') : '';
450abded2bbSBartosz Kaszubowski
4517534da61SBartosz Kaszubowskiexport const renderDefaultValue = (defaultValue?: string) =>
4527d500c47SBartosz Kaszubowski  defaultValue && defaultValue !== '...' ? (
4534eaef1b0SBartosz Kaszubowski    <div css={defaultValueContainerStyle}>
454be43ea08SBartosz Kaszubowski      <DEMI>Default:</DEMI> <CODE>{defaultValue}</CODE>
4554eaef1b0SBartosz Kaszubowski    </div>
4567534da61SBartosz Kaszubowski  ) : undefined;
4577534da61SBartosz Kaszubowski
458b15ebaf2SBartosz Kaszubowskiexport const renderTypeOrSignatureType = (
459b15ebaf2SBartosz Kaszubowski  type?: TypeDefinitionData,
4605990cc31SBartosz Kaszubowski  signatures?: MethodSignatureData[] | TypeSignaturesData[],
461f8204ef0SBartosz Kaszubowski  allowBlock: boolean = false
462b15ebaf2SBartosz Kaszubowski) => {
4633e972ef8SBartosz Kaszubowski  if (signatures && signatures.length) {
4643e972ef8SBartosz Kaszubowski    return (
46512abeb84SBartosz Kaszubowski      <CODE key={`signature-type-${signatures[0].name}`}>
4663e972ef8SBartosz Kaszubowski        (
4673e972ef8SBartosz Kaszubowski        {signatures?.map(({ parameters }) =>
4683e972ef8SBartosz Kaszubowski          parameters?.map(param => (
469558a63feSBartosz Kaszubowski            <span key={`signature-param-${param.name}`}>
470b15ebaf2SBartosz Kaszubowski              {param.name}
471b15ebaf2SBartosz Kaszubowski              {param.flags?.isOptional && '?'}: {resolveTypeName(param.type)}
472558a63feSBartosz Kaszubowski            </span>
473b15ebaf2SBartosz Kaszubowski          ))
4743e972ef8SBartosz Kaszubowski        )}
4755990cc31SBartosz Kaszubowski        ) =&gt; {signatures[0].type ? resolveTypeName(signatures[0].type) : 'void'}
47612abeb84SBartosz Kaszubowski      </CODE>
4776a5c065cSBartosz Kaszubowski    );
4783e972ef8SBartosz Kaszubowski  } else if (type) {
479f8204ef0SBartosz Kaszubowski    if (allowBlock) {
480f8204ef0SBartosz Kaszubowski      return <APIDataType typeDefinition={type} />;
481f8204ef0SBartosz Kaszubowski    }
48212abeb84SBartosz Kaszubowski    return <CODE key={`signature-type-${type.name}`}>{resolveTypeName(type)}</CODE>;
483b15ebaf2SBartosz Kaszubowski  }
484b15ebaf2SBartosz Kaszubowski  return undefined;
485b15ebaf2SBartosz Kaszubowski};
486b15ebaf2SBartosz Kaszubowski
4877d500c47SBartosz Kaszubowskiexport const renderFlags = (flags?: TypePropertyDataFlags, defaultValue?: string) =>
488a116a546SBartosz Kaszubowski  (flags?.isOptional || defaultValue) && (
489b15ebaf2SBartosz Kaszubowski    <>
490b15ebaf2SBartosz Kaszubowski      <br />
491b15ebaf2SBartosz Kaszubowski      <span css={STYLES_OPTIONAL}>(optional)</span>
492b15ebaf2SBartosz Kaszubowski    </>
493a116a546SBartosz Kaszubowski  );
494a116a546SBartosz Kaszubowski
495a116a546SBartosz Kaszubowskiexport const renderIndexSignature = (kind: TypeDocKind) =>
496a116a546SBartosz Kaszubowski  kind === TypeDocKind.Parameter && (
497a116a546SBartosz Kaszubowski    <>
498a116a546SBartosz Kaszubowski      <br />
499a116a546SBartosz Kaszubowski      <A
500a116a546SBartosz Kaszubowski        css={STYLES_OPTIONAL}
501a116a546SBartosz Kaszubowski        href="https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures"
502a116a546SBartosz Kaszubowski        openInNewTab
503a116a546SBartosz Kaszubowski        isStyled>
504a116a546SBartosz Kaszubowski        (index signature)
505a116a546SBartosz Kaszubowski      </A>
506a116a546SBartosz Kaszubowski    </>
507a116a546SBartosz Kaszubowski  );
508b15ebaf2SBartosz Kaszubowski
50984745a05SBartosz Kaszubowskiexport type CommentTextBlockProps = {
510299f02f2SBartosz Kaszubowski  comment?: CommentData;
511dc379e46SBartosz Kaszubowski  components?: MDComponents;
5124eaef1b0SBartosz Kaszubowski  beforeContent?: JSX.Element;
5134eaef1b0SBartosz Kaszubowski  afterContent?: JSX.Element;
514d0262524SBartosz Kaszubowski  includePlatforms?: boolean;
515f6311d0dSBartosz Kaszubowski  inlineHeaders?: boolean;
5167534da61SBartosz Kaszubowski  emptyCommentFallback?: string;
517299f02f2SBartosz Kaszubowski};
518299f02f2SBartosz Kaszubowski
519764ac031SBartosz Kaszubowskiexport const parseCommentContent = (content?: string): string =>
5206d6ca9d7SBartosz Kaszubowski  content && content.length ? content.replace(/&ast;/g, '*').replace(/\t/g, '') : '';
521764ac031SBartosz Kaszubowski
522b15ebaf2SBartosz Kaszubowskiexport const getCommentOrSignatureComment = (
523b15ebaf2SBartosz Kaszubowski  comment?: CommentData,
5245990cc31SBartosz Kaszubowski  signatures?: MethodSignatureData[] | TypeSignaturesData[]
525b15ebaf2SBartosz Kaszubowski) => comment || (signatures && signatures[0]?.comment);
526b15ebaf2SBartosz Kaszubowski
527c8c9d6e8SBartosz Kaszubowskiexport const getTagData = (tagName: string, comment?: CommentData) =>
528d0262524SBartosz Kaszubowski  getAllTagData(tagName, comment)?.[0];
529d0262524SBartosz Kaszubowski
530d0262524SBartosz Kaszubowskiexport const getAllTagData = (tagName: string, comment?: CommentData) =>
5315990cc31SBartosz Kaszubowski  comment?.blockTags?.filter(tag => tag.tag.substring(1) === tagName);
532c8c9d6e8SBartosz Kaszubowski
533c4c6b9d1SBartosz Kaszubowskiexport const getTagNamesList = (comment?: CommentData) =>
534c4c6b9d1SBartosz Kaszubowski  comment && [
5355990cc31SBartosz Kaszubowski    ...(getAllTagData('platform', comment)?.map(platformData =>
5365990cc31SBartosz Kaszubowski      getCommentContent(platformData.content)
5375990cc31SBartosz Kaszubowski    ) || []),
538c4c6b9d1SBartosz Kaszubowski    ...(getTagData('deprecated', comment) ? ['deprecated'] : []),
539c4c6b9d1SBartosz Kaszubowski    ...(getTagData('experimental', comment) ? ['experimental'] : []),
540c4c6b9d1SBartosz Kaszubowski  ];
541c4c6b9d1SBartosz Kaszubowski
542adede39aSŁukasz Kosmatyexport const getMethodName = (
543adede39aSŁukasz Kosmaty  method: MethodDefinitionData,
544adede39aSŁukasz Kosmaty  apiName?: string,
545adede39aSŁukasz Kosmaty  name?: string,
546adede39aSŁukasz Kosmaty  parameters?: MethodParamData[]
547adede39aSŁukasz Kosmaty) => {
548adede39aSŁukasz Kosmaty  const isProperty = method.kind === TypeDocKind.Property && !parameters?.length;
549adede39aSŁukasz Kosmaty  const methodName = ((apiName && `${apiName}.`) ?? '') + (method.name || name);
550adede39aSŁukasz Kosmaty  if (!isProperty) {
551adede39aSŁukasz Kosmaty    return `${methodName}(${parameters ? listParams(parameters) : ''})`;
552adede39aSŁukasz Kosmaty  }
553adede39aSŁukasz Kosmaty
554adede39aSŁukasz Kosmaty  return methodName;
555adede39aSŁukasz Kosmaty};
556adede39aSŁukasz Kosmaty
5576a5c065cSBartosz Kaszubowskiexport const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);
558144e76edSBartosz Kaszubowski
559a0c5fbc5SBartosz Kaszubowskiconst PARAM_TAGS_REGEX = /@tag-\S*/g;
560a0c5fbc5SBartosz Kaszubowski
561a0c5fbc5SBartosz Kaszubowskiconst getParamTags = (shortText?: string) => {
562a0c5fbc5SBartosz Kaszubowski  if (!shortText || !shortText.includes('@tag-')) {
563a0c5fbc5SBartosz Kaszubowski    return undefined;
564a0c5fbc5SBartosz Kaszubowski  }
565a0c5fbc5SBartosz Kaszubowski  return Array.from(shortText.matchAll(PARAM_TAGS_REGEX), match => match[0]);
566a0c5fbc5SBartosz Kaszubowski};
567a0c5fbc5SBartosz Kaszubowski
5685990cc31SBartosz Kaszubowskiexport const getCommentContent = (content: CommentContentData[]) => {
5695990cc31SBartosz Kaszubowski  return content
5705990cc31SBartosz Kaszubowski    .map(entry => entry.text)
5715990cc31SBartosz Kaszubowski    .join('')
5725990cc31SBartosz Kaszubowski    .trim();
5735990cc31SBartosz Kaszubowski};
5745990cc31SBartosz Kaszubowski
575558a63feSBartosz Kaszubowskiexport const CommentTextBlock = ({
576299f02f2SBartosz Kaszubowski  comment,
577ffc1cfa8SBartosz Kaszubowski  beforeContent,
578669ac6e6SBartosz Kaszubowski  afterContent,
579d0262524SBartosz Kaszubowski  includePlatforms = true,
580f6311d0dSBartosz Kaszubowski  inlineHeaders = false,
5817534da61SBartosz Kaszubowski  emptyCommentFallback,
582558a63feSBartosz Kaszubowski}: CommentTextBlockProps) => {
5835990cc31SBartosz Kaszubowski  const content = comment && comment.summary ? getCommentContent(comment.summary) : undefined;
584a0c5fbc5SBartosz Kaszubowski
5855990cc31SBartosz Kaszubowski  if (emptyCommentFallback && (!comment || !content || !content.length)) {
5867534da61SBartosz Kaszubowski    return <>{emptyCommentFallback}</>;
5877534da61SBartosz Kaszubowski  }
5887534da61SBartosz Kaszubowski
5895990cc31SBartosz Kaszubowski  const paramTags = content ? getParamTags(content) : undefined;
5905990cc31SBartosz Kaszubowski  const parsedContent = (
591f6311d0dSBartosz Kaszubowski    <ReactMarkdown components={mdComponents} remarkPlugins={[remarkGfm]}>
5925990cc31SBartosz Kaszubowski      {parseCommentContent(paramTags ? content?.replaceAll(PARAM_TAGS_REGEX, '') : content)}
5935990cc31SBartosz Kaszubowski    </ReactMarkdown>
5945990cc31SBartosz Kaszubowski  );
5955990cc31SBartosz Kaszubowski
596fd06ac0fSEvan Bacon  const examples = getAllTagData('example', comment);
597fd06ac0fSEvan Bacon  const exampleText = examples?.map((example, index) => (
59812abeb84SBartosz Kaszubowski    <Fragment key={'example-' + index}>
599f6311d0dSBartosz Kaszubowski      {inlineHeaders ? (
600669ac6e6SBartosz Kaszubowski        <div css={STYLES_EXAMPLE_IN_TABLE}>
6013c9a6b96SBartosz Kaszubowski          <BOLD>Example</BOLD>
602669ac6e6SBartosz Kaszubowski        </div>
603669ac6e6SBartosz Kaszubowski      ) : (
604be43ea08SBartosz Kaszubowski        <BoxSectionHeader text="Example" />
605669ac6e6SBartosz Kaszubowski      )}
606f6311d0dSBartosz Kaszubowski      <ReactMarkdown components={mdComponents}>{getCommentContent(example.content)}</ReactMarkdown>
60712abeb84SBartosz Kaszubowski    </Fragment>
608fd06ac0fSEvan Bacon  ));
609c1e3b3a3SBartosz Kaszubowski
610558a63feSBartosz Kaszubowski  const see = getTagData('see', comment);
611d9bd5b6cSBartosz Kaszubowski  const seeText = see && (
612d9bd5b6cSBartosz Kaszubowski    <Callout>
613f6311d0dSBartosz Kaszubowski      <ReactMarkdown components={mdComponents}>
614f6311d0dSBartosz Kaszubowski        {`**See:** ` + getCommentContent(see.content)}
6155990cc31SBartosz Kaszubowski      </ReactMarkdown>
616d9bd5b6cSBartosz Kaszubowski    </Callout>
617d9bd5b6cSBartosz Kaszubowski  );
618558a63feSBartosz Kaszubowski
6196a5c065cSBartosz Kaszubowski  const hasPlatforms = (getAllTagData('platform', comment)?.length || 0) > 0;
6206a5c065cSBartosz Kaszubowski
621299f02f2SBartosz Kaszubowski  return (
622299f02f2SBartosz Kaszubowski    <>
623f6311d0dSBartosz Kaszubowski      {includePlatforms && hasPlatforms && (
624b3bd70ceSTomasz Sapeta        <APISectionPlatformTags comment={comment} prefix="Only for:" />
6256a5c065cSBartosz Kaszubowski      )}
626a0c5fbc5SBartosz Kaszubowski      {paramTags && (
627a0c5fbc5SBartosz Kaszubowski        <>
6283c9a6b96SBartosz Kaszubowski          <BOLD>Only for:&ensp;</BOLD>
629a0c5fbc5SBartosz Kaszubowski          {paramTags.map(tag => (
630a0c5fbc5SBartosz Kaszubowski            <Tag key={tag} name={tag.split('-')[1]} />
631a0c5fbc5SBartosz Kaszubowski          ))}
632a0c5fbc5SBartosz Kaszubowski        </>
633a0c5fbc5SBartosz Kaszubowski      )}
634ffc1cfa8SBartosz Kaszubowski      {beforeContent}
6355990cc31SBartosz Kaszubowski      {parsedContent}
636669ac6e6SBartosz Kaszubowski      {afterContent}
637558a63feSBartosz Kaszubowski      {seeText}
638c1e3b3a3SBartosz Kaszubowski      {exampleText}
639299f02f2SBartosz Kaszubowski    </>
640299f02f2SBartosz Kaszubowski  );
641299f02f2SBartosz Kaszubowski};
642b671e53fSBartosz Kaszubowski
643a16a3d18SBartosz Kaszubowskiconst getMonospaceHeader = (element: ComponentType<any>) => {
644a16a3d18SBartosz Kaszubowski  const level = parseInt(element?.displayName?.replace(/\D/g, '') ?? '0', 10);
645a16a3d18SBartosz Kaszubowski  return createPermalinkedComponent(element, {
646a16a3d18SBartosz Kaszubowski    baseNestingLevel: level !== 0 ? level : undefined,
647a16a3d18SBartosz Kaszubowski    sidebarType: HeadingType.InlineCode,
648a16a3d18SBartosz Kaszubowski  });
649a16a3d18SBartosz Kaszubowski};
650a16a3d18SBartosz Kaszubowski
651a16a3d18SBartosz Kaszubowskiexport const H3Code = getMonospaceHeader(RawH3);
652a16a3d18SBartosz Kaszubowskiexport const H4Code = getMonospaceHeader(RawH4);
653a16a3d18SBartosz Kaszubowski
6549f72d43bSBartosz Kaszubowskiexport const getComponentName = (name?: string, children: PropData[] = []) => {
6559f72d43bSBartosz Kaszubowski  if (name && name !== 'default') return name;
6569f72d43bSBartosz Kaszubowski  const ctor = children.filter((child: PropData) => child.name === 'constructor')[0];
6579f72d43bSBartosz Kaszubowski  return ctor?.signatures?.[0]?.type?.name ?? 'default';
6589f72d43bSBartosz Kaszubowski};
6599f72d43bSBartosz Kaszubowski
6606a5c065cSBartosz Kaszubowskiexport const STYLES_APIBOX = css({
66114c78e61SJon Samp  borderRadius: borderRadius.md,
6626a5c065cSBartosz Kaszubowski  borderWidth: 1,
6636a5c065cSBartosz Kaszubowski  borderStyle: 'solid',
6646a5c065cSBartosz Kaszubowski  borderColor: theme.border.default,
66512abeb84SBartosz Kaszubowski  padding: spacing[5],
66614c78e61SJon Samp  boxShadow: shadows.xs,
6676a5c065cSBartosz Kaszubowski  marginBottom: spacing[6],
6686a5c065cSBartosz Kaszubowski  overflowX: 'hidden',
66907337117SBartosz Kaszubowski
6706a5c065cSBartosz Kaszubowski  h3: {
6713324c13cSBartosz Kaszubowski    marginBottom: spacing[2.5],
672d9bd5b6cSBartosz Kaszubowski  },
673d9bd5b6cSBartosz Kaszubowski
6745990cc31SBartosz Kaszubowski  'h2, h3, h4': {
675d9bd5b6cSBartosz Kaszubowski    marginTop: 0,
6766a5c065cSBartosz Kaszubowski  },
677d0262524SBartosz Kaszubowski
67825b16883SBartosz Kaszubowski  th: {
67925b16883SBartosz Kaszubowski    color: theme.text.secondary,
68025b16883SBartosz Kaszubowski    padding: `${spacing[3]}px ${spacing[4]}px`,
68125b16883SBartosz Kaszubowski  },
68225b16883SBartosz Kaszubowski
68312abeb84SBartosz Kaszubowski  li: {
68412abeb84SBartosz Kaszubowski    marginBottom: 0,
68512abeb84SBartosz Kaszubowski  },
68612abeb84SBartosz Kaszubowski
6876a5c065cSBartosz Kaszubowski  [`.css-${tableWrapperStyle.name}`]: {
6886a5c065cSBartosz Kaszubowski    boxShadow: 'none',
68912abeb84SBartosz Kaszubowski    marginBottom: 0,
6906a5c065cSBartosz Kaszubowski  },
69140194603SBartosz Kaszubowski
6923f609562SBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.medium + 124}px)`]: {
6933aa00179SAbdullah Mzaien    paddingInline: spacing[4],
6946a5c065cSBartosz Kaszubowski  },
6956a5c065cSBartosz Kaszubowski});
696669ac6e6SBartosz Kaszubowski
6976a5c065cSBartosz Kaszubowskiexport const STYLES_APIBOX_NESTED = css({
6986a5c065cSBartosz Kaszubowski  boxShadow: 'none',
69912abeb84SBartosz Kaszubowski  marginBottom: spacing[4],
700a16a3d18SBartosz Kaszubowski  padding: `${spacing[4]}px ${spacing[5]}px 0`,
701504f93b3SBartosz Kaszubowski
702504f93b3SBartosz Kaszubowski  h4: {
703504f93b3SBartosz Kaszubowski    marginTop: 0,
704504f93b3SBartosz Kaszubowski  },
7056a5c065cSBartosz Kaszubowski});
7066a5c065cSBartosz Kaszubowski
707de0f7b57SBartosz Kaszubowskiexport const STYLES_APIBOX_WRAPPER = css({
708de0f7b57SBartosz Kaszubowski  marginBottom: spacing[4],
709de0f7b57SBartosz Kaszubowski  padding: `${spacing[4]}px ${spacing[5]}px 0`,
710de0f7b57SBartosz Kaszubowski
711de0f7b57SBartosz Kaszubowski  [`.css-${tableWrapperStyle.name}:last-child`]: {
712de0f7b57SBartosz Kaszubowski    marginBottom: spacing[4],
713de0f7b57SBartosz Kaszubowski  },
714de0f7b57SBartosz Kaszubowski});
715de0f7b57SBartosz Kaszubowski
71612abeb84SBartosz Kaszubowskiexport const STYLE_APIBOX_NO_SPACING = css({ marginBottom: -spacing[5] });
71712abeb84SBartosz Kaszubowski
7186a5c065cSBartosz Kaszubowskiexport const STYLES_NESTED_SECTION_HEADER = css({
7196a5c065cSBartosz Kaszubowski  display: 'flex',
7206a5c065cSBartosz Kaszubowski  borderTop: `1px solid ${theme.border.default}`,
7216a5c065cSBartosz Kaszubowski  borderBottom: `1px solid ${theme.border.default}`,
722d9bd5b6cSBartosz Kaszubowski  margin: `${spacing[4]}px -${spacing[5]}px ${spacing[4]}px`,
72314c78e61SJon Samp  padding: `${spacing[2.5]}px ${spacing[5]}px`,
72414c78e61SJon Samp  backgroundColor: theme.background.subtle,
7256a5c065cSBartosz Kaszubowski
7266a5c065cSBartosz Kaszubowski  h4: {
7276a5c065cSBartosz Kaszubowski    ...typography.fontSizes[16],
728db57e342SBartosz Kaszubowski    fontWeight: 600,
7296a5c065cSBartosz Kaszubowski    marginBottom: 0,
73091029aa9SBartosz Kaszubowski    marginTop: 0,
7314c73bbf6SBartosz Kaszubowski    color: theme.text.secondary,
7326a5c065cSBartosz Kaszubowski  },
7336a5c065cSBartosz Kaszubowski});
7346a5c065cSBartosz Kaszubowski
7356a5c065cSBartosz Kaszubowskiexport const STYLES_NOT_EXPOSED_HEADER = css({
736d9bd5b6cSBartosz Kaszubowski  marginBottom: spacing[1],
7376a5c065cSBartosz Kaszubowski  display: 'inline-block',
738d9bd5b6cSBartosz Kaszubowski
739d9bd5b6cSBartosz Kaszubowski  code: {
740d9bd5b6cSBartosz Kaszubowski    marginBottom: 0,
741d9bd5b6cSBartosz Kaszubowski  },
7426a5c065cSBartosz Kaszubowski});
7436a5c065cSBartosz Kaszubowski
7446a5c065cSBartosz Kaszubowskiexport const STYLES_OPTIONAL = css({
7456a5c065cSBartosz Kaszubowski  color: theme.text.secondary,
7466a5c065cSBartosz Kaszubowski  fontSize: '90%',
7476a5c065cSBartosz Kaszubowski  paddingTop: 22,
7486a5c065cSBartosz Kaszubowski});
7496a5c065cSBartosz Kaszubowski
7506a5c065cSBartosz Kaszubowskiexport const STYLES_SECONDARY = css({
7516a5c065cSBartosz Kaszubowski  color: theme.text.secondary,
7526a5c065cSBartosz Kaszubowski  fontSize: '90%',
7536a5c065cSBartosz Kaszubowski  fontWeight: 600,
7546a5c065cSBartosz Kaszubowski});
7556a5c065cSBartosz Kaszubowski
7564eaef1b0SBartosz Kaszubowskiconst defaultValueContainerStyle = css({
7574eaef1b0SBartosz Kaszubowski  marginTop: spacing[2],
758d9bd5b6cSBartosz Kaszubowski  marginBottom: spacing[2],
759d9bd5b6cSBartosz Kaszubowski
760d9bd5b6cSBartosz Kaszubowski  '&:last-child': {
761d9bd5b6cSBartosz Kaszubowski    marginBottom: 0,
762d9bd5b6cSBartosz Kaszubowski  },
7634eaef1b0SBartosz Kaszubowski});
7644eaef1b0SBartosz Kaszubowski
7656a5c065cSBartosz Kaszubowskiconst STYLES_EXAMPLE_IN_TABLE = css({
7666a5c065cSBartosz Kaszubowski  margin: `${spacing[2]}px 0`,
7676a5c065cSBartosz Kaszubowski});
76812abeb84SBartosz Kaszubowski
769f4b1168bSBartosz Kaszubowskiexport const ELEMENT_SPACING = 'mb-4';
770