13852a5b4STomasz Sapetaimport { css } from '@emotion/react';
2*448dd81eSBartosz Kaszubowskiimport { breakpoints, spacing } from '@expo/styleguide';
33f609562SBartosz Kaszubowskiimport { PropsWithChildren } from 'react';
43852a5b4STomasz Sapeta
5*448dd81eSBartosz Kaszubowskiimport { Snippet } from '~/ui/components/Snippet/Snippet';
6*448dd81eSBartosz Kaszubowskiimport { SnippetContent } from '~/ui/components/Snippet/SnippetContent';
7*448dd81eSBartosz Kaszubowskiimport { SnippetHeader } from '~/ui/components/Snippet/SnippetHeader';
8*448dd81eSBartosz Kaszubowski
93852a5b4STomasz Sapetaconst MDX_CLASS_NAME_TO_TAB_NAME: Record<string, string> = {
103852a5b4STomasz Sapeta  'language-swift': 'Swift',
113852a5b4STomasz Sapeta  'language-kotlin': 'Kotlin',
123852a5b4STomasz Sapeta  'language-javascript': 'JavaScript',
133852a5b4STomasz Sapeta  'language-typescript': 'TypeScript',
143852a5b4STomasz Sapeta  'language-json': 'JSON',
153852a5b4STomasz Sapeta  'language-ruby': 'Ruby',
163852a5b4STomasz Sapeta  'language-groovy': 'Gradle',
173852a5b4STomasz Sapeta};
183852a5b4STomasz Sapeta
193f609562SBartosz Kaszubowskitype Props = PropsWithChildren<{
203852a5b4STomasz Sapeta  tabs?: string[];
21*448dd81eSBartosz Kaszubowski  connected?: boolean;
223f609562SBartosz Kaszubowski}>;
233852a5b4STomasz Sapeta
24*448dd81eSBartosz Kaszubowskiexport function CodeBlocksTable({ children, tabs, connected = true, ...rest }: Props) {
253852a5b4STomasz Sapeta  const childrenArray = Array.isArray(children) ? children : [children];
263852a5b4STomasz Sapeta  const codeBlocks = childrenArray.filter(
273f609562SBartosz Kaszubowski    ({ props }) =>
283f609562SBartosz Kaszubowski      props.children.props.className && props.children.props.className.startsWith('language-')
293852a5b4STomasz Sapeta  );
303852a5b4STomasz Sapeta  const tabNames =
313852a5b4STomasz Sapeta    tabs ||
323852a5b4STomasz Sapeta    codeBlocks.map(child => {
333852a5b4STomasz Sapeta      const className = child.props.children.props.className;
343852a5b4STomasz Sapeta      return MDX_CLASS_NAME_TO_TAB_NAME[className] || className.replace('language-', '');
353852a5b4STomasz Sapeta    });
363852a5b4STomasz Sapeta
373852a5b4STomasz Sapeta  return (
38*448dd81eSBartosz Kaszubowski    <div css={[codeBlocksWrapperStyle, connected && codeBlockConnectedWrapperStyle]} {...rest}>
393852a5b4STomasz Sapeta      {codeBlocks.map((codeBlock, index) => (
40*448dd81eSBartosz Kaszubowski        <Snippet key={index} css={snippetWrapperStyle}>
41*448dd81eSBartosz Kaszubowski          <SnippetHeader title={tabNames[index]} />
42*448dd81eSBartosz Kaszubowski          <SnippetContent skipPadding css={snippetContentStyle}>
43*448dd81eSBartosz Kaszubowski            {codeBlock}
44*448dd81eSBartosz Kaszubowski          </SnippetContent>
45*448dd81eSBartosz Kaszubowski        </Snippet>
463852a5b4STomasz Sapeta      ))}
473852a5b4STomasz Sapeta    </div>
483852a5b4STomasz Sapeta  );
493852a5b4STomasz Sapeta}
50*448dd81eSBartosz Kaszubowski
51*448dd81eSBartosz Kaszubowskiconst codeBlocksWrapperStyle = css({
52*448dd81eSBartosz Kaszubowski  display: 'grid',
53*448dd81eSBartosz Kaszubowski  gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',
54*448dd81eSBartosz Kaszubowski  gap: spacing[4],
55*448dd81eSBartosz Kaszubowski  gridAutoRows: '1fr',
56*448dd81eSBartosz Kaszubowski
57*448dd81eSBartosz Kaszubowski  pre: {
58*448dd81eSBartosz Kaszubowski    border: 0,
59*448dd81eSBartosz Kaszubowski    margin: 0,
60*448dd81eSBartosz Kaszubowski    gridTemplateRows: 'minmax(100px, 1fr)',
61*448dd81eSBartosz Kaszubowski    height: '100%',
62*448dd81eSBartosz Kaszubowski  },
63*448dd81eSBartosz Kaszubowski
64*448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
65*448dd81eSBartosz Kaszubowski    gridTemplateColumns: 'minmax(0, 1fr)',
66*448dd81eSBartosz Kaszubowski    gridAutoRows: 'auto',
67*448dd81eSBartosz Kaszubowski  },
68*448dd81eSBartosz Kaszubowski});
69*448dd81eSBartosz Kaszubowski
70*448dd81eSBartosz Kaszubowskiconst codeBlockConnectedWrapperStyle = css({
71*448dd81eSBartosz Kaszubowski  [`@media screen and (min-width: ${breakpoints.large}px)`]: {
72*448dd81eSBartosz Kaszubowski    gridGap: 0,
73*448dd81eSBartosz Kaszubowski
74*448dd81eSBartosz Kaszubowski    '> div:nth-of-type(odd)': {
75*448dd81eSBartosz Kaszubowski      '> div': {
76*448dd81eSBartosz Kaszubowski        borderRight: 0,
77*448dd81eSBartosz Kaszubowski        borderTopRightRadius: 0,
78*448dd81eSBartosz Kaszubowski        borderBottomRightRadius: 0,
79*448dd81eSBartosz Kaszubowski      },
80*448dd81eSBartosz Kaszubowski    },
81*448dd81eSBartosz Kaszubowski
82*448dd81eSBartosz Kaszubowski    '> div:nth-of-type(even)': {
83*448dd81eSBartosz Kaszubowski      '> div': {
84*448dd81eSBartosz Kaszubowski        borderTopLeftRadius: 0,
85*448dd81eSBartosz Kaszubowski        borderBottomLeftRadius: 0,
86*448dd81eSBartosz Kaszubowski      },
87*448dd81eSBartosz Kaszubowski    },
88*448dd81eSBartosz Kaszubowski  },
89*448dd81eSBartosz Kaszubowski});
90*448dd81eSBartosz Kaszubowski
91*448dd81eSBartosz Kaszubowskiconst snippetWrapperStyle = css({
92*448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
93*448dd81eSBartosz Kaszubowski    marginBottom: 0,
94*448dd81eSBartosz Kaszubowski
95*448dd81eSBartosz Kaszubowski    '&:last-of-type': {
96*448dd81eSBartosz Kaszubowski      marginBottom: spacing[4],
97*448dd81eSBartosz Kaszubowski    },
98*448dd81eSBartosz Kaszubowski  },
99*448dd81eSBartosz Kaszubowski});
100*448dd81eSBartosz Kaszubowski
101*448dd81eSBartosz Kaszubowskiconst snippetContentStyle = css({
102*448dd81eSBartosz Kaszubowski  height: '100%',
103*448dd81eSBartosz Kaszubowski});
104