{"version":3,"file":"CodeHighlightTabs.mjs","sources":["../../src/CodeHighlightTabs/CodeHighlightTabs.tsx"],"sourcesContent":["import { createEffect, JSX, splitProps } from 'solid-js';\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 '@empoleon/core';\nimport { useUncontrolled } from '@empoleon/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 Empoleon shiki instance.\n *  Should be used only with *.empoleon.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?: JSX.Element;\n}\n\nexport type CodeHighlightTabsStylesNames =\n  | 'root'\n  | 'files'\n  | 'file'\n  | 'fileIcon'\n  | 'filesScrollarea'\n  | CodeHighlightStylesNames;\n\nexport interface CodeHighlightTabsProps\n  extends 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) => JSX.Element;\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\nconst defaultProps: Partial<CodeHighlightTabsProps> = {};\n\nexport const CodeHighlightTabs = factory<CodeHighlightTabsFactory>(_props => {\n  const props = useProps('CodeHighlightTabs', defaultProps, _props);\n  const [local, others] = splitProps(props, [\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    'ref'\n  ]);\n\n  const getStyles = useStyles<CodeHighlightTabsFactory>({\n    name: 'CodeHighlightTabs',\n    classes,\n    props,\n    className: local.className,\n    style: local.style,\n    classNames: local.classNames,\n    styles: local.styles,\n    unstyled: local.unstyled,\n    vars: local.vars,\n  });\n\n  const [value, setValue] = useUncontrolled({\n    value: () => local.activeTab,\n    defaultValue: local.defaultActiveTab!,\n    finalValue: 0,\n    onChange: local.onTabChange,\n  });\n\n  const [_expanded, setExpanded] = useUncontrolled({\n    value: () => local.expanded,\n    defaultValue: local.defaultExpanded!,\n    finalValue: true,\n    onChange: local.onExpandedChange,\n  });\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<CodeHighlightTabsFactory>({\n    classNames: local.classNames,\n    styles: local.styles,\n    props,\n  });\n\n  createEffect(() => {\n    if (value() >= local.code.length) {\n      setValue(local.code.length - 1);\n    }\n  });\n\n  if (local.code.length <= 0) {\n    return null;\n  }\n\n  const currentCode = local.code[value()] || { code: '', language: 'tsx', fileName: '' };\n\n  const files = local.code.map((node, index) => (\n    <UnstyledButton\n      {...getStyles('file')}\n      mod={{ active: index === value() }}\n      onClick={() => setValue(index)}\n      data-color-scheme={local.codeColorScheme}\n    >\n      <FileIcon\n        fileIcon={node.icon}\n        getFileIcon={local.getFileIcon}\n        fileName={node.fileName}\n        {...getStyles('fileIcon')}\n      />\n      <span>{node.fileName}</span>\n    </UnstyledButton>\n  ));\n\n  return (\n    <Box ref={local.ref} {...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={local.withCopyButton}\n        withExpandButton={local.withExpandButton}\n        withBorder={local.withBorder}\n        radius={local.radius}\n        maxCollapsedHeight={local.maxCollapsedHeight}\n        copiedLabel={local.copiedLabel}\n        copyLabel={local.copyLabel}\n        expandCodeLabel={local.expandCodeLabel}\n        collapseCodeLabel={local.collapseCodeLabel}\n        background={local.background}\n        controls={local.controls}\n        codeColorScheme={local.codeColorScheme}\n        __withOffset\n        __staticSelector=\"CodeHighlightTabs\"\n        classNames={resolvedClassNames}\n        styles={resolvedStyles}\n      />\n    </Box>\n  );\n});\n\nCodeHighlightTabs.displayName = '@empoleon/code-highlight/CodeHighlightTabs';\nCodeHighlightTabs.classes = classes;\n"],"names":["defaultProps","CodeHighlightTabs","factory","_props","props","useProps","local","others","splitProps","getStyles","useStyles","name","classes","className","style","classNames","styles","unstyled","vars","value","setValue","useUncontrolled","activeTab","defaultValue","defaultActiveTab","finalValue","onChange","onTabChange","_expanded","setExpanded","expanded","defaultExpanded","onExpandedChange","resolvedClassNames","resolvedStyles","useResolvedStylesApi","createEffect","code","length","currentCode","language","files","map","node","index","UnstyledButton","_$mergeProps","mod","active","onClick","data-color-scheme","codeColorScheme","children","_$createComponent","FileIcon","fileIcon","icon","getFileIcon","fileName","_el$","_tmpl$","_$insert","Box","ref","ScrollArea","type","dir","offsetScrollbars","_el$2","_tmpl$2","_$spread","CodeHighlight","withCopyButton","withExpandButton","withBorder","radius","maxCollapsedHeight","copiedLabel","copyLabel","expandCodeLabel","collapseCodeLabel","background","controls","__withOffset","__staticSelector","displayName"],"mappings":"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"}