UNPKG

@mantine/code-highlight

Version:

Code highlight with Mantine theme

1 lines 7.18 kB
{"version":3,"file":"CodeHighlightTabs.cjs","names":["UnstyledButton","FileIcon","Box","ScrollArea","CodeHighlight","classes"],"sources":["../../src/CodeHighlightTabs/CodeHighlightTabs.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport {\n Box,\n BoxProps,\n ElementProps,\n factory,\n Factory,\n ScrollArea,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport {\n CodeHighlight,\n CodeHighlightSettings,\n CodeHighlightStylesNames,\n} from '../CodeHighlight/CodeHighlight';\nimport { FileIcon } from './FileIcon';\nimport classes from '../CodeHighlight.module.css';\n\n/** Available shiki languages for default Mantine shiki instance.\n * Should be used only with *.mantine.dev projects */\nexport type CodeHighlightDefaultLanguage = 'tsx' | 'scss' | 'html' | 'bash' | 'json';\n\nexport interface CodeHighlightTabsCode {\n language?: CodeHighlightDefaultLanguage | (string & {});\n code: string;\n fileName?: string;\n icon?: React.ReactNode;\n}\n\nexport type CodeHighlightTabsStylesNames =\n | 'root'\n | 'files'\n | 'file'\n | 'fileIcon'\n | 'filesScrollarea'\n | CodeHighlightStylesNames;\n\nexport interface CodeHighlightTabsProps\n extends\n CodeHighlightSettings,\n BoxProps,\n StylesApiProps<CodeHighlightTabsFactory>,\n ElementProps<'div'> {\n /** Code to highlight with meta data (file name and icon) */\n code: CodeHighlightTabsCode[];\n\n /** Function that returns icon based on file name */\n getFileIcon?: (fileName: string) => React.ReactNode;\n\n /** Default active tab index */\n defaultActiveTab?: number;\n\n /** Index of controlled active tab state */\n activeTab?: number;\n\n /** Called when tab changes */\n onTabChange?: (tab: number) => void;\n}\n\nexport type CodeHighlightTabsFactory = Factory<{\n props: CodeHighlightTabsProps;\n ref: HTMLDivElement;\n stylesNames: CodeHighlightTabsStylesNames;\n}>;\n\nexport const CodeHighlightTabs = factory<CodeHighlightTabsFactory>((_props) => {\n const props = useProps('CodeHighlightTabs', null, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n defaultActiveTab,\n activeTab,\n onTabChange,\n defaultExpanded,\n expanded,\n onExpandedChange,\n code,\n getFileIcon,\n withCopyButton,\n withExpandButton,\n withBorder,\n radius,\n maxCollapsedHeight,\n copyLabel,\n copiedLabel,\n expandCodeLabel,\n collapseCodeLabel,\n background,\n controls,\n codeColorScheme,\n withLineNumbers,\n attributes,\n ...others\n } = props;\n\n const getStyles = useStyles<CodeHighlightTabsFactory>({\n name: 'CodeHighlightTabs',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n const [value, setValue] = useUncontrolled({\n defaultValue: defaultActiveTab,\n value: activeTab,\n finalValue: 0,\n onChange: onTabChange,\n });\n\n const [_expanded, setExpanded] = useUncontrolled({\n defaultValue: defaultExpanded,\n value: expanded,\n finalValue: true,\n onChange: onExpandedChange,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<CodeHighlightTabsFactory>({\n classNames,\n styles,\n props,\n });\n\n useEffect(() => {\n if (value >= code.length) {\n setValue(code.length - 1);\n }\n }, [value, code]);\n\n if (code.length <= 0) {\n return null;\n }\n\n const currentCode = code[value] || { code: '', language: 'tsx', fileName: '' };\n\n const files = code.map((node, index) => (\n <UnstyledButton\n {...getStyles('file')}\n key={node.fileName}\n mod={{ active: index === value }}\n onClick={() => setValue(index)}\n data-color-scheme={codeColorScheme}\n >\n <FileIcon\n fileIcon={node.icon}\n getFileIcon={getFileIcon}\n fileName={node.fileName}\n key=\"file-icon\"\n {...getStyles('fileIcon')}\n />\n <span key=\"file-name\">{node.fileName}</span>\n </UnstyledButton>\n ));\n\n return (\n <Box {...getStyles('root')} {...others}>\n <ScrollArea type=\"never\" dir=\"ltr\" offsetScrollbars={false} {...getStyles('filesScrollarea')}>\n <div {...getStyles('files')}>{files}</div>\n </ScrollArea>\n\n <CodeHighlight\n code={currentCode.code}\n language={currentCode.language}\n expanded={_expanded}\n onExpandedChange={setExpanded}\n withCopyButton={withCopyButton}\n withExpandButton={withExpandButton}\n withBorder={withBorder}\n radius={radius}\n maxCollapsedHeight={maxCollapsedHeight}\n copiedLabel={copiedLabel}\n copyLabel={copyLabel}\n expandCodeLabel={expandCodeLabel}\n collapseCodeLabel={collapseCodeLabel}\n background={background}\n controls={controls}\n codeColorScheme={codeColorScheme}\n withLineNumbers={withLineNumbers}\n __withOffset\n __staticSelector=\"CodeHighlightTabs\"\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n />\n </Box>\n );\n});\n\nCodeHighlightTabs.displayName = '@mantine/code-highlight/CodeHighlightTabs';\nCodeHighlightTabs.classes = classes;\n"],"mappings":";;;;;;;;;AAsEA,MAAa,qBAAA,GAAA,cAAA,UAAuD,WAAW;CAC7E,MAAM,SAAA,GAAA,cAAA,UAAiB,qBAAqB,MAAM,MAAM;CACxD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,kBACA,WACA,aACA,iBACA,UACA,kBACA,MACA,aACA,gBACA,kBACA,YACA,QACA,oBACA,WACA,aACA,iBACA,mBACA,YACA,UACA,iBACA,iBACA,YACA,GAAG,WACD;CAEJ,MAAM,aAAA,GAAA,cAAA,WAAgD;EACpD,MAAM;EACN,SAAA,6BAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,CAAC,OAAO,aAAA,GAAA,eAAA,iBAA4B;EACxC,cAAc;EACd,OAAO;EACP,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,WAAW,gBAAA,GAAA,eAAA,iBAA+B;EAC/C,cAAc;EACd,OAAO;EACP,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAAkE;EAC5F;EACA;EACA;CACF,CAAC;CAED,CAAA,GAAA,MAAA,iBAAgB;EACd,IAAI,SAAS,KAAK,QAChB,SAAS,KAAK,SAAS,CAAC;CAE5B,GAAG,CAAC,OAAO,IAAI,CAAC;CAEhB,IAAI,KAAK,UAAU,GACjB,OAAO;CAGT,MAAM,cAAc,KAAK,UAAU;EAAE,MAAM;EAAI,UAAU;EAAO,UAAU;CAAG;CAE7E,MAAM,QAAQ,KAAK,KAAK,MAAM,UAC5B,iBAAA,GAAA,MAAA,eAACA,cAAAA,gBAAD;EACE,GAAI,UAAU,MAAM;EACpB,KAAK,KAAK;EACV,KAAK,EAAE,QAAQ,UAAU,MAAM;EAC/B,eAAe,SAAS,KAAK;EAC7B,qBAAmB;CAUL,GARd,iBAAA,GAAA,kBAAA,KAACC,iBAAAA,UAAD;EACE,UAAU,KAAK;EACF;EACb,UAAU,KAAK;EAEf,GAAI,UAAU,UAAU;CACzB,GAFK,WAEL,GACD,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAA,UAAuB,KAAK,SAAe,GAAjC,WAAiC,CAC7B,CACjB;CAED,OACE,iBAAA,GAAA,kBAAA,MAACC,cAAAA,KAAD;EAAK,GAAI,UAAU,MAAM;EAAG,GAAI;YAAhC,CACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,YAAD;GAAY,MAAK;GAAQ,KAAI;GAAM,kBAAkB;GAAO,GAAI,UAAU,iBAAiB;aACzF,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,GAAI,UAAU,OAAO;cAAI;GAAW,CAAA;EAC/B,CAAA,GAEZ,iBAAA,GAAA,kBAAA,KAACC,sBAAAA,eAAD;GACE,MAAM,YAAY;GAClB,UAAU,YAAY;GACtB,UAAU;GACV,kBAAkB;GACF;GACE;GACN;GACJ;GACY;GACP;GACF;GACM;GACE;GACP;GACF;GACO;GACA;GACjB,cAAA;GACA,kBAAiB;GACjB,YAAY;GACZ,QAAQ;GACI;EACb,CAAA,CACE;;AAET,CAAC;AAED,kBAAkB,cAAc;AAChC,kBAAkB,UAAUC,6BAAAA"}