13852a5b4STomasz Sapetaimport { css } from '@emotion/react'; 2f4b1168bSBartosz Kaszubowskiimport { breakpoints, spacing } from '@expo/styleguide-base'; 3*9311bddcSBartosz Kaszubowskiimport { FileCode01Icon } from '@expo/styleguide-icons'; 43f609562SBartosz Kaszubowskiimport { PropsWithChildren } from 'react'; 53852a5b4STomasz Sapeta 6*9311bddcSBartosz Kaszubowskiimport { cleanCopyValue } from '~/components/base/code'; 7448dd81eSBartosz Kaszubowskiimport { Snippet } from '~/ui/components/Snippet/Snippet'; 8448dd81eSBartosz Kaszubowskiimport { SnippetContent } from '~/ui/components/Snippet/SnippetContent'; 9448dd81eSBartosz Kaszubowskiimport { SnippetHeader } from '~/ui/components/Snippet/SnippetHeader'; 10*9311bddcSBartosz Kaszubowskiimport { CopyAction } from '~/ui/components/Snippet/actions/CopyAction'; 11448dd81eSBartosz Kaszubowski 123852a5b4STomasz Sapetaconst MDX_CLASS_NAME_TO_TAB_NAME: Record<string, string> = { 133852a5b4STomasz Sapeta 'language-swift': 'Swift', 143852a5b4STomasz Sapeta 'language-kotlin': 'Kotlin', 153852a5b4STomasz Sapeta 'language-javascript': 'JavaScript', 163852a5b4STomasz Sapeta 'language-typescript': 'TypeScript', 173852a5b4STomasz Sapeta 'language-json': 'JSON', 183852a5b4STomasz Sapeta 'language-ruby': 'Ruby', 193852a5b4STomasz Sapeta 'language-groovy': 'Gradle', 203852a5b4STomasz Sapeta}; 213852a5b4STomasz Sapeta 223f609562SBartosz Kaszubowskitype Props = PropsWithChildren<{ 233852a5b4STomasz Sapeta tabs?: string[]; 24448dd81eSBartosz Kaszubowski connected?: boolean; 253f609562SBartosz Kaszubowski}>; 263852a5b4STomasz Sapeta 27448dd81eSBartosz Kaszubowskiexport function CodeBlocksTable({ children, tabs, connected = true, ...rest }: Props) { 283852a5b4STomasz Sapeta const childrenArray = Array.isArray(children) ? children : [children]; 293852a5b4STomasz Sapeta const codeBlocks = childrenArray.filter( 303f609562SBartosz Kaszubowski ({ props }) => 313f609562SBartosz Kaszubowski props.children.props.className && props.children.props.className.startsWith('language-') 323852a5b4STomasz Sapeta ); 333852a5b4STomasz Sapeta const tabNames = 343852a5b4STomasz Sapeta tabs || 353852a5b4STomasz Sapeta codeBlocks.map(child => { 363852a5b4STomasz Sapeta const className = child.props.children.props.className; 373852a5b4STomasz Sapeta return MDX_CLASS_NAME_TO_TAB_NAME[className] || className.replace('language-', ''); 383852a5b4STomasz Sapeta }); 393852a5b4STomasz Sapeta 403852a5b4STomasz Sapeta return ( 41448dd81eSBartosz Kaszubowski <div css={[codeBlocksWrapperStyle, connected && codeBlockConnectedWrapperStyle]} {...rest}> 423852a5b4STomasz Sapeta {codeBlocks.map((codeBlock, index) => ( 43448dd81eSBartosz Kaszubowski <Snippet key={index} css={snippetWrapperStyle}> 44*9311bddcSBartosz Kaszubowski <SnippetHeader title={tabNames[index]} Icon={FileCode01Icon}> 45*9311bddcSBartosz Kaszubowski <CopyAction text={cleanCopyValue(codeBlock.props.children.props.children)} /> 46*9311bddcSBartosz Kaszubowski </SnippetHeader> 47*9311bddcSBartosz Kaszubowski <SnippetContent className="p-0 h-full">{codeBlock}</SnippetContent> 48448dd81eSBartosz Kaszubowski </Snippet> 493852a5b4STomasz Sapeta ))} 503852a5b4STomasz Sapeta </div> 513852a5b4STomasz Sapeta ); 523852a5b4STomasz Sapeta} 53448dd81eSBartosz Kaszubowski 54448dd81eSBartosz Kaszubowskiconst codeBlocksWrapperStyle = css({ 55448dd81eSBartosz Kaszubowski display: 'grid', 56448dd81eSBartosz Kaszubowski gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', 57448dd81eSBartosz Kaszubowski gap: spacing[4], 58448dd81eSBartosz Kaszubowski gridAutoRows: '1fr', 59448dd81eSBartosz Kaszubowski 60448dd81eSBartosz Kaszubowski pre: { 61448dd81eSBartosz Kaszubowski border: 0, 62448dd81eSBartosz Kaszubowski margin: 0, 63448dd81eSBartosz Kaszubowski gridTemplateRows: 'minmax(100px, 1fr)', 64448dd81eSBartosz Kaszubowski height: '100%', 65448dd81eSBartosz Kaszubowski }, 66448dd81eSBartosz Kaszubowski 67448dd81eSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.large}px)`]: { 68448dd81eSBartosz Kaszubowski gridTemplateColumns: 'minmax(0, 1fr)', 69448dd81eSBartosz Kaszubowski gridAutoRows: 'auto', 70448dd81eSBartosz Kaszubowski }, 71448dd81eSBartosz Kaszubowski}); 72448dd81eSBartosz Kaszubowski 73448dd81eSBartosz Kaszubowskiconst codeBlockConnectedWrapperStyle = css({ 74448dd81eSBartosz Kaszubowski [`@media screen and (min-width: ${breakpoints.large}px)`]: { 75448dd81eSBartosz Kaszubowski gridGap: 0, 76448dd81eSBartosz Kaszubowski 77448dd81eSBartosz Kaszubowski '> div:nth-of-type(odd)': { 78448dd81eSBartosz Kaszubowski '> div': { 79448dd81eSBartosz Kaszubowski borderRight: 0, 80448dd81eSBartosz Kaszubowski borderTopRightRadius: 0, 81448dd81eSBartosz Kaszubowski borderBottomRightRadius: 0, 82448dd81eSBartosz Kaszubowski }, 83448dd81eSBartosz Kaszubowski }, 84448dd81eSBartosz Kaszubowski 85448dd81eSBartosz Kaszubowski '> div:nth-of-type(even)': { 86448dd81eSBartosz Kaszubowski '> div': { 87448dd81eSBartosz Kaszubowski borderTopLeftRadius: 0, 88448dd81eSBartosz Kaszubowski borderBottomLeftRadius: 0, 89448dd81eSBartosz Kaszubowski }, 90448dd81eSBartosz Kaszubowski }, 91448dd81eSBartosz Kaszubowski }, 92448dd81eSBartosz Kaszubowski}); 93448dd81eSBartosz Kaszubowski 94448dd81eSBartosz Kaszubowskiconst snippetWrapperStyle = css({ 95448dd81eSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.large}px)`]: { 96448dd81eSBartosz Kaszubowski marginBottom: 0, 97448dd81eSBartosz Kaszubowski 98448dd81eSBartosz Kaszubowski '&:last-of-type': { 99448dd81eSBartosz Kaszubowski marginBottom: spacing[4], 100448dd81eSBartosz Kaszubowski }, 101448dd81eSBartosz Kaszubowski }, 102448dd81eSBartosz Kaszubowski}); 103