{"version":3,"file":"index.cjs","sources":["../../../../src/components/FileTabs/FileTabs.tsx"],"sourcesContent":["import {\n  HTMLAttributes,\n  createContext,\n  useContext,\n  Children,\n  useState,\n  MouseEvent,\n  useEffect,\n  ReactNode,\n  WheelEvent,\n  useRef,\n  CSSProperties,\n} from 'react';\nimport { cn, cva } from '@/lib/cva';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport type { IconName } from '@/components/Icon/Icon.types';\nimport type { FileTabProps, FileTabsProps } from './FileTabs.types';\nimport styles from './FileTabs.module.css';\n\n// TODO: Check if react-sortablejs has ESM version\nimport ReactSortableModule from 'react-sortablejs/dist/index.js';\nimport type { ItemInterface } from 'react-sortablejs';\nconst { ReactSortable } = ReactSortableModule;\n\ninterface ContextProps {\n  selectedIndex?: number;\n  onClose: (index: number) => void;\n}\n\nexport const TabContext = createContext<ContextProps>({\n  selectedIndex: undefined,\n  onClose: () => null,\n});\n\nconst useSelect = () => {\n  const result = useContext(TabContext);\n  if (!result) {\n    throw new Error('Context used outside of its Provider!');\n  }\n  return result;\n};\n\nexport const FileTabs = ({\n  selectedIndex,\n  children,\n  onReorderTab,\n  onClose: onCloseProp,\n  onSelect: onSelectProp,\n  list: listProp,\n  setList: setListProp,\n  onEnd,\n  direction,\n  group,\n  className,\n  ...props\n}: FileTabsProps) => {\n  const ref = useRef<HTMLDivElement>(null);\n  const [list, setList] = useState<ItemInterface[]>(\n    Children.map(children, (_, index) => ({\n      id: `tab-element-${index}`,\n    }))\n  );\n  useEffect(() => {\n    setList(\n      Children.map(children, (_, index) => ({\n        id: `tab-element-${index}`,\n      }))\n    );\n  }, [children]);\n\n  const onClose = (index: number) => {\n    onCloseProp(index);\n    setList(list => {\n      list.splice(index, 1);\n      return [...list];\n    });\n  };\n\n  const onSelect = (index: number) => () => {\n    onSelectProp(index);\n  };\n\n  const value = {\n    selectedIndex,\n    onClose,\n  };\n\n  const onWheel = (evt: WheelEvent<HTMLDivElement>) => {\n    if (ref.current) {\n      ref.current.scrollLeft += evt.deltaY;\n    }\n  };\n  return (\n    <TabContext.Provider value={value}>\n      <div\n        ref={ref}\n        onWheel={onWheel}\n        role=\"tablist\"\n        onScroll={e => {\n          e.preventDefault();\n          e.stopPropagation();\n        }}\n        className={styles.tabs}\n        style={\n          {\n            '--file-tabs-count-width': `${(listProp ?? list).length * 200}px`,\n          } as CSSProperties\n        }\n      >\n        <ReactSortable\n          direction={direction ?? 'horizontal'}\n          group={group ?? 'tabbar'}\n          list={listProp ?? list}\n          setList={setListProp ?? setList}\n          onEnd={(evt, sortable, store) => {\n            const { newDraggableIndex, oldDraggableIndex } = evt;\n            if (\n              typeof newDraggableIndex === 'number' &&\n              typeof oldDraggableIndex === 'number' &&\n              oldDraggableIndex !== newDraggableIndex\n            ) {\n              onReorderTab(oldDraggableIndex, newDraggableIndex);\n            }\n            if (typeof onEnd === 'function') {\n              onEnd(evt, sortable, store);\n            }\n          }}\n          revertOnSpill\n          {...props}\n          className={cn(styles['tabs-sortable'], className)}\n        >\n          {Children.map(children, (child, index) => (\n            <div\n              tabIndex={index + 1}\n              role=\"tab\"\n              onClick={onSelect(index)}\n              key={`tab-element-${index}`}\n            >\n              {child}\n            </div>\n          ))}\n        </ReactSortable>\n      </div>\n    </TabContext.Provider>\n  );\n};\n\nconst tabVariants = cva(styles.tab, {\n  variants: {\n    active: {\n      true: styles.tab_active,\n      false: styles.tab_inactive,\n    },\n    fixed: {\n      true: styles.tab_fixed,\n      false: styles['tab_full-width'],\n    },\n    preview: {\n      true: styles.tab_preview,\n      false: '',\n    },\n    dismissable: {\n      true: styles.tab_dismissable,\n      false: '',\n    },\n  },\n  defaultVariants: {\n    fixed: false,\n    preview: false,\n    dismissable: false,\n  },\n});\n\nconst Tab = ({\n  text,\n  index,\n  icon,\n  onMouseDown: onMouseDownProp,\n  status = 'default',\n  testId,\n  preview,\n  className,\n  ...props\n}: FileTabProps) => {\n  const { selectedIndex, onClose: onCloseProp } = useSelect();\n  const onMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n    e.currentTarget.scrollIntoView({\n      behavior: 'smooth',\n      block: 'nearest',\n      inline: 'center',\n    });\n    if (typeof onMouseDownProp === 'function') {\n      onMouseDownProp(e);\n    }\n  };\n\n  const onClose = (e: MouseEvent<HTMLButtonElement>): void => {\n    e.preventDefault();\n    e.stopPropagation();\n    onCloseProp(index);\n  };\n\n  return (\n    <div\n      onMouseDown={onMouseDown}\n      data-testid={testId ? `${testId}-${index}` : undefined}\n      {...props}\n      className={cn(\n        tabVariants({\n          active: selectedIndex === index,\n          preview,\n          dismissable: true,\n        }),\n        className\n      )}\n    >\n      <div className={styles['tab-content']}>\n        {typeof icon === 'string' ? <Icon name={icon as IconName} /> : icon}\n        <span className={styles['tab-content-text']}>{text}</span>\n      </div>\n      <IconButton\n        className={styles['empty-button']}\n        htmlType=\"button\"\n        icon=\"cross\"\n        onClick={onClose}\n        data-type=\"close\"\n        data-testid={testId ? `${testId}-${index}-close` : undefined}\n      />\n      <div\n        className={styles.indicator}\n        data-indicator={status}\n        data-testid={testId ? `${testId}-${index}-status` : undefined}\n      />\n    </div>\n  );\n};\n\nTab.displayName = 'FileTab';\n\nFileTabs.Tab = Tab;\n\ninterface FileTabElementProps extends HTMLAttributes<HTMLDivElement> {\n  icon?: IconName | ReactNode;\n  active?: boolean;\n  preview?: boolean;\n}\nexport const FileTabElement = ({\n  icon,\n  children,\n  active = false,\n  preview,\n  className,\n  ...props\n}: FileTabElementProps) => {\n  return (\n    <div\n      {...props}\n      className={cn(tabVariants({ active, preview, fixed: true }), className)}\n    >\n      {typeof icon === 'string' ? <Icon name={icon as IconName} /> : icon}\n      {children && <span className={styles['tab-content-text']}>{children}</span>}\n    </div>\n  );\n};\n"],"names":["ReactSortableModule","createContext","useContext","useRef","useState","Children","useEffect","list","jsx","styles","cn","cva","jsxs","Icon","IconButton"],"mappings":"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"}