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