13852a5b4STomasz Sapetaimport { css } from '@emotion/react'; 2*f4b1168bSBartosz Kaszubowskiimport { breakpoints, spacing } from '@expo/styleguide-base'; 33f609562SBartosz Kaszubowskiimport { PropsWithChildren } from 'react'; 43852a5b4STomasz Sapeta 5448dd81eSBartosz Kaszubowskiimport { Snippet } from '~/ui/components/Snippet/Snippet'; 6448dd81eSBartosz Kaszubowskiimport { SnippetContent } from '~/ui/components/Snippet/SnippetContent'; 7448dd81eSBartosz Kaszubowskiimport { SnippetHeader } from '~/ui/components/Snippet/SnippetHeader'; 8448dd81eSBartosz 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[]; 21448dd81eSBartosz Kaszubowski connected?: boolean; 223f609562SBartosz Kaszubowski}>; 233852a5b4STomasz Sapeta 24448dd81eSBartosz 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 ( 38448dd81eSBartosz Kaszubowski <div css={[codeBlocksWrapperStyle, connected && codeBlockConnectedWrapperStyle]} {...rest}> 393852a5b4STomasz Sapeta {codeBlocks.map((codeBlock, index) => ( 40448dd81eSBartosz Kaszubowski <Snippet key={index} css={snippetWrapperStyle}> 41448dd81eSBartosz Kaszubowski <SnippetHeader title={tabNames[index]} /> 42448dd81eSBartosz Kaszubowski <SnippetContent skipPadding css={snippetContentStyle}> 43448dd81eSBartosz Kaszubowski {codeBlock} 44448dd81eSBartosz Kaszubowski </SnippetContent> 45448dd81eSBartosz Kaszubowski </Snippet> 463852a5b4STomasz Sapeta ))} 473852a5b4STomasz Sapeta </div> 483852a5b4STomasz Sapeta ); 493852a5b4STomasz Sapeta} 50448dd81eSBartosz Kaszubowski 51448dd81eSBartosz Kaszubowskiconst codeBlocksWrapperStyle = css({ 52448dd81eSBartosz Kaszubowski display: 'grid', 53448dd81eSBartosz Kaszubowski gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', 54448dd81eSBartosz Kaszubowski gap: spacing[4], 55448dd81eSBartosz Kaszubowski gridAutoRows: '1fr', 56448dd81eSBartosz Kaszubowski 57448dd81eSBartosz Kaszubowski pre: { 58448dd81eSBartosz Kaszubowski border: 0, 59448dd81eSBartosz Kaszubowski margin: 0, 60448dd81eSBartosz Kaszubowski gridTemplateRows: 'minmax(100px, 1fr)', 61448dd81eSBartosz Kaszubowski height: '100%', 62448dd81eSBartosz Kaszubowski }, 63448dd81eSBartosz Kaszubowski 64448dd81eSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.large}px)`]: { 65448dd81eSBartosz Kaszubowski gridTemplateColumns: 'minmax(0, 1fr)', 66448dd81eSBartosz Kaszubowski gridAutoRows: 'auto', 67448dd81eSBartosz Kaszubowski }, 68448dd81eSBartosz Kaszubowski}); 69448dd81eSBartosz Kaszubowski 70448dd81eSBartosz Kaszubowskiconst codeBlockConnectedWrapperStyle = css({ 71448dd81eSBartosz Kaszubowski [`@media screen and (min-width: ${breakpoints.large}px)`]: { 72448dd81eSBartosz Kaszubowski gridGap: 0, 73448dd81eSBartosz Kaszubowski 74448dd81eSBartosz Kaszubowski '> div:nth-of-type(odd)': { 75448dd81eSBartosz Kaszubowski '> div': { 76448dd81eSBartosz Kaszubowski borderRight: 0, 77448dd81eSBartosz Kaszubowski borderTopRightRadius: 0, 78448dd81eSBartosz Kaszubowski borderBottomRightRadius: 0, 79448dd81eSBartosz Kaszubowski }, 80448dd81eSBartosz Kaszubowski }, 81448dd81eSBartosz Kaszubowski 82448dd81eSBartosz Kaszubowski '> div:nth-of-type(even)': { 83448dd81eSBartosz Kaszubowski '> div': { 84448dd81eSBartosz Kaszubowski borderTopLeftRadius: 0, 85448dd81eSBartosz Kaszubowski borderBottomLeftRadius: 0, 86448dd81eSBartosz Kaszubowski }, 87448dd81eSBartosz Kaszubowski }, 88448dd81eSBartosz Kaszubowski }, 89448dd81eSBartosz Kaszubowski}); 90448dd81eSBartosz Kaszubowski 91448dd81eSBartosz Kaszubowskiconst snippetWrapperStyle = css({ 92448dd81eSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.large}px)`]: { 93448dd81eSBartosz Kaszubowski marginBottom: 0, 94448dd81eSBartosz Kaszubowski 95448dd81eSBartosz Kaszubowski '&:last-of-type': { 96448dd81eSBartosz Kaszubowski marginBottom: spacing[4], 97448dd81eSBartosz Kaszubowski }, 98448dd81eSBartosz Kaszubowski }, 99448dd81eSBartosz Kaszubowski}); 100448dd81eSBartosz Kaszubowski 101448dd81eSBartosz Kaszubowskiconst snippetContentStyle = css({ 102448dd81eSBartosz Kaszubowski height: '100%', 103448dd81eSBartosz Kaszubowski}); 104