{"version":3,"file":"Tabs.mjs","sources":["../../src/tabs/Tabs.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport clamp from 'lodash.clamp';\nimport { Component, createRef } from 'react';\n\nimport { Width, Direction } from '../common';\nimport { DirectionContext } from '../provider/direction';\n\nimport Tab from './Tab';\nimport TabList from './TabList';\nimport TabPanel from './TabPanel';\nimport {\n  getSwipeDifference,\n  swipedLeftToRight,\n  swipedRightToLeft,\n  swipeShouldChangeTab,\n  Swipe,\n} from './utils';\n\nconst MIN_INDEX = 0;\n\nexport interface TabItem {\n  title: string;\n  content: React.ReactNode;\n  disabled: boolean;\n}\n\nexport interface TabsProps {\n  tabs: TabItem[];\n  selected: number;\n  name: string;\n  /** @default true */\n  changeTabOnSwipe?: boolean;\n  className?: string;\n  /** @default 'block' */\n  headerWidth?: `${Width}`;\n  onTabSelect: (index: number) => void;\n}\n\ninterface TabsState {\n  start: Swipe | null;\n  translateLineX: string | null;\n  isSwiping: boolean;\n  isScrolling: boolean;\n  fullWidthTabs: boolean;\n}\n\nexport default class Tabs extends Component<TabsProps, TabsState> {\n  declare props: TabsProps & Required<Pick<TabsProps, keyof typeof Tabs.defaultProps>>;\n\n  static defaultProps = {\n    changeTabOnSwipe: true,\n    headerWidth: Width.BLOCK,\n  } satisfies Partial<TabsProps>;\n\n  containerReference = createRef<HTMLDivElement>();\n\n  constructor(props: Tabs['props']) {\n    super(props);\n    this.state = {\n      start: null,\n      translateLineX: null,\n      isSwiping: false,\n      isScrolling: false,\n      fullWidthTabs: props.headerWidth === Width.BLOCK,\n    };\n  }\n\n  container: HTMLDivElement | null = null;\n\n  containerWidth = 0;\n\n  tabRefs: (HTMLLIElement | null)[] = [];\n\n  get MAX_INDEX() {\n    return this.props.tabs.length - 1;\n  }\n\n  componentDidMount() {\n    const { selected } = this.props;\n\n    this.setTabWidth();\n    this.switchTab(clamp(selected, MIN_INDEX, this.MAX_INDEX));\n    this.animateLine(clamp(selected, MIN_INDEX, this.MAX_INDEX));\n    document.body.addEventListener('touchmove', this.disableScroll, { passive: false });\n    document.body.addEventListener('touchforcechange', this.disableScroll, { passive: false });\n    window.addEventListener('resize', this.handleResize);\n  }\n\n  componentDidUpdate(previousProps: TabsProps) {\n    const currentSelected = this.props.selected;\n    const previousSelected = previousProps.selected;\n    const currentSelectedTab = this.props.tabs[currentSelected];\n    const currentSelectedTabIsDisabled = currentSelectedTab?.disabled;\n    const previousSelectedTab = previousProps.tabs[previousSelected];\n    const previousSelectedTabIsDisabled = previousSelectedTab?.disabled;\n    const currentTabsLength = this.props.tabs.length;\n    const previousTabsLength = previousProps.tabs.length;\n    const currentDisabledTabsLength = this.props.tabs.filter((tab) => !tab.disabled).length;\n    const previousDisabledTabsLength = previousProps.tabs.filter((tab) => !tab.disabled).length;\n    const currentHeaderWidth = this.props.headerWidth;\n    const previousFullHeaderWidth = previousProps.headerWidth;\n\n    if (\n      currentHeaderWidth !== previousFullHeaderWidth ||\n      currentTabsLength !== previousTabsLength\n    ) {\n      this.setTabWidth();\n    }\n\n    if (\n      currentSelected !== previousSelected ||\n      currentDisabledTabsLength !== previousDisabledTabsLength ||\n      currentSelectedTabIsDisabled !== previousSelectedTabIsDisabled\n    ) {\n      this.animateLine(clamp(currentSelected, MIN_INDEX, this.MAX_INDEX));\n    }\n  }\n\n  componentWillUnmount() {\n    document.body.removeEventListener('touchmove', this.disableScroll);\n    document.body.removeEventListener('touchforcechange', this.disableScroll);\n    window.removeEventListener('resize', this.handleResize);\n  }\n\n  handleResize = () => {\n    this.setContainerWidth(this.container);\n  };\n\n  setContainerRefAndWidth = (node: HTMLDivElement | null) => {\n    this.container = node;\n    this.setContainerWidth(node);\n  };\n\n  setContainerWidth = (node: HTMLDivElement | null) => {\n    if (!node) {\n      return;\n    }\n\n    const { width } = node.getBoundingClientRect();\n\n    this.containerWidth = width;\n  };\n\n  isTabDisabled = (index: number) => {\n    const { tabs } = this.props;\n\n    return tabs[index]?.disabled ?? false;\n  };\n\n  getAllTabsWidth = () => {\n    return this.tabRefs\n      .map((reference) => {\n        return reference ? reference.getBoundingClientRect().width : 0;\n      })\n      .reduce((a, b) => a + b, 0);\n  };\n\n  getDistanceToSelectedTab = (selectedTabIndex: number) => {\n    return this.tabRefs\n      .filter((_, idx) => idx < selectedTabIndex)\n      .map((reference) => (reference ? reference.getBoundingClientRect().width : 0))\n      .reduce((a, b) => a + b, 0);\n  };\n\n  setTabWidth = () => {\n    const { fullWidthTabs } = this.state;\n    const { headerWidth, selected } = this.props;\n\n    const allTabsWidth = this.getAllTabsWidth();\n\n    if (!fullWidthTabs && (headerWidth === Width.BLOCK || this.containerWidth < allTabsWidth)) {\n      this.setState({ fullWidthTabs: true, translateLineX: `${selected * 100}%` });\n    }\n    if (fullWidthTabs && headerWidth === Width.AUTO && this.containerWidth >= allTabsWidth) {\n      this.setState({\n        fullWidthTabs: false,\n        translateLineX: `${this.getDistanceToSelectedTab(selected)}px`,\n      });\n    }\n  };\n\n  getTabLineWidth = () => {\n    const { fullWidthTabs } = this.state;\n    const { selected, tabs } = this.props;\n\n    if (fullWidthTabs) {\n      return `${(1 / tabs.length) * 100}%`;\n    }\n\n    const reference = this.tabRefs[selected] || this.tabRefs[this.tabRefs.length - 1];\n    const width = reference ? reference.getBoundingClientRect().width : 0;\n    return `${width}px`;\n  };\n\n  /*\n   * Gets the next tab that should be selected based on the swipe direction\n   * and the current selected tab (is called recursively to account for disabled tabs).\n   */\n  getTabToSelect = (selected: number, start: Swipe, end: Swipe): number => {\n    let nextSelected = selected;\n\n    if (swipedLeftToRight(start, end)) {\n      nextSelected -= 1;\n\n      if (nextSelected > MIN_INDEX && this.isTabDisabled(nextSelected)) {\n        return this.getTabToSelect(nextSelected, start, end);\n      }\n    } else if (swipedRightToLeft(start, end)) {\n      nextSelected += 1;\n\n      if (nextSelected < this.MAX_INDEX && this.isTabDisabled(nextSelected)) {\n        return this.getTabToSelect(nextSelected, start, end);\n      }\n    }\n\n    nextSelected = clamp(\n      nextSelected,\n      Math.max(selected - 1, MIN_INDEX),\n      Math.min(selected + 1, this.MAX_INDEX),\n    );\n\n    if (this.isTabDisabled(nextSelected)) {\n      return selected;\n    }\n\n    return nextSelected;\n  };\n\n  swipedOverHalfOfContainer = (difference: number) => difference / this.containerWidth >= 0.5;\n\n  switchTab = (index: number) => {\n    const { onTabSelect } = this.props;\n    onTabSelect(index);\n  };\n\n  animateLine = (index: number) => {\n    this.setState((previousState) => ({\n      translateLineX: previousState.fullWidthTabs\n        ? `${index * 100}%`\n        : `${this.getDistanceToSelectedTab(index)}px`,\n    }));\n  };\n\n  disableScroll = (event: Event) => {\n    const { isSwiping } = this.state;\n\n    if (isSwiping) {\n      event.preventDefault();\n    }\n  };\n\n  handleTabClick = (index: number) => () => {\n    this.switchTab(index);\n  };\n\n  onKeyDown = (index: number) => (event: React.KeyboardEvent<HTMLLIElement>) => {\n    if (event && event.key === 'Enter') {\n      this.switchTab(index);\n    }\n  };\n\n  handleTouchStart: React.TouchEventHandler<HTMLDivElement> = (event) => {\n    const start = {\n      x: event.nativeEvent.touches[0].clientX,\n      y: event.nativeEvent.touches[0].clientY,\n      time: Date.now(),\n    };\n    this.setState({\n      start,\n    });\n  };\n\n  handleTouchMove: React.TouchEventHandler<HTMLDivElement> = (event) => {\n    const { start } = this.state;\n    if (start == null) {\n      return;\n    }\n\n    const { selected: currentSelectedFromProps } = this.props;\n    const end: Swipe = {\n      x: event.nativeEvent.changedTouches[0].clientX,\n      y: event.nativeEvent.changedTouches[0].clientY,\n      time: Date.now(),\n    };\n    const difference = getSwipeDifference(start, end);\n    const yAxisDifference = getSwipeDifference(start, end, 'y');\n    let { isScrolling, isSwiping } = this.state;\n\n    if (!isScrolling && !isSwiping) {\n      if (difference > yAxisDifference) {\n        isSwiping = true;\n      } else {\n        isScrolling = true;\n      }\n    }\n\n    this.setState({ isScrolling, isSwiping });\n\n    if (isSwiping) {\n      const nextSelected = this.getTabToSelect(currentSelectedFromProps, start, end);\n      this.animateLine(\n        this.swipedOverHalfOfContainer(difference) ? nextSelected : currentSelectedFromProps,\n      );\n    }\n  };\n\n  handleTouchEnd: React.TouchEventHandler<HTMLDivElement> = (event) => {\n    const { start, isSwiping } = this.state;\n    if (start == null) {\n      return;\n    }\n\n    const { selected } = this.props;\n    const end: Swipe = {\n      x: event.nativeEvent.changedTouches[0].clientX,\n      y: event.nativeEvent.changedTouches[0].clientY,\n      time: Date.now(),\n    };\n    const difference = getSwipeDifference(start, end);\n\n    let nextSelected = selected;\n\n    if (isSwiping) {\n      if (swipeShouldChangeTab(start, end) || this.swipedOverHalfOfContainer(difference)) {\n        nextSelected = this.getTabToSelect(nextSelected, start, end);\n      }\n\n      if (nextSelected !== selected) {\n        this.switchTab(nextSelected);\n      } else {\n        this.animateLine(nextSelected);\n      }\n    }\n\n    this.setState({ isSwiping: false, isScrolling: false });\n  };\n\n  render() {\n    const { tabs, changeTabOnSwipe, name, selected, className, headerWidth } = this.props;\n    const { translateLineX, fullWidthTabs } = this.state;\n\n    const selectedTab = tabs[selected];\n\n    return (\n      <DirectionContext.Consumer>\n        {(direction) => {\n          const isRTL = direction === Direction.RTL;\n          return (\n            <div\n              ref={this.containerReference}\n              className={clsx('tabs', className, {\n                'tabs--auto-width': headerWidth === Width.AUTO,\n              })}\n              onTouchStart={changeTabOnSwipe ? this.handleTouchStart : undefined}\n              onTouchEnd={changeTabOnSwipe ? this.handleTouchEnd : undefined}\n              onTouchMove={changeTabOnSwipe ? this.handleTouchMove : undefined}\n            >\n              <TabList>\n                {tabs.map(({ title, disabled }, index) => {\n                  return (\n                    <Tab\n                      key={title}\n                      ref={(node) => {\n                        this.tabRefs[index] = node;\n                      }}\n                      id={`${name}-tab-${index}`}\n                      panelId={`${name}-panel-${index}`}\n                      selected={selected === index}\n                      disabled={disabled}\n                      focusTab={() => {\n                        if (this.containerReference.current?.contains(document.activeElement)) {\n                          this.tabRefs[index]?.focus();\n                        }\n                      }}\n                      onClick={disabled ? undefined : this.handleTabClick(index)}\n                      onKeyDown={this.onKeyDown(index)}\n                      {...(fullWidthTabs\n                        ? { style: { width: `${(1 / tabs.length) * 100}%` } }\n                        : {})}\n                    >\n                      {title}\n                    </Tab>\n                  );\n                })}\n                {translateLineX ? (\n                  <li\n                    role=\"none\"\n                    className=\"tabs__line\"\n                    style={{\n                      width: this.getTabLineWidth(),\n                      transform: isRTL\n                        ? `translateX(-${translateLineX})`\n                        : `translateX(${translateLineX})`,\n                    }}\n                  />\n                ) : null}\n              </TabList>\n              <div ref={this.setContainerRefAndWidth} className=\"tabs__panel-container\">\n                {selectedTab && !selectedTab.disabled ? (\n                  <TabPanel\n                    key={selectedTab.title}\n                    tabId={`${name}-tab-${selected}`}\n                    id={`${name}-panel-${selected}`}\n                    style={{\n                      width: '100%',\n                    }}\n                  >\n                    {selectedTab.content}\n                  </TabPanel>\n                ) : null}\n              </div>\n            </div>\n          );\n        }}\n      </DirectionContext.Consumer>\n    );\n  }\n}\n"],"names":["MIN_INDEX","Tabs","Component","defaultProps","changeTabOnSwipe","headerWidth","Width","BLOCK","containerReference","createRef","constructor","props","state","start","translateLineX","isSwiping","isScrolling","fullWidthTabs","container","containerWidth","tabRefs","MAX_INDEX","tabs","length","componentDidMount","selected","setTabWidth","switchTab","clamp","animateLine","document","body","addEventListener","disableScroll","passive","window","handleResize","componentDidUpdate","previousProps","currentSelected","previousSelected","currentSelectedTab","currentSelectedTabIsDisabled","disabled","previousSelectedTab","previousSelectedTabIsDisabled","currentTabsLength","previousTabsLength","currentDisabledTabsLength","filter","tab","previousDisabledTabsLength","currentHeaderWidth","previousFullHeaderWidth","componentWillUnmount","removeEventListener","setContainerWidth","setContainerRefAndWidth","node","width","getBoundingClientRect","isTabDisabled","index","getAllTabsWidth","map","reference","reduce","a","b","getDistanceToSelectedTab","selectedTabIndex","_","idx","allTabsWidth","setState","AUTO","getTabLineWidth","getTabToSelect","end","nextSelected","swipedLeftToRight","swipedRightToLeft","Math","max","min","swipedOverHalfOfContainer","difference","onTabSelect","previousState","event","preventDefault","handleTabClick","onKeyDown","key","handleTouchStart","x","nativeEvent","touches","clientX","y","clientY","time","Date","now","handleTouchMove","currentSelectedFromProps","changedTouches","getSwipeDifference","yAxisDifference","handleTouchEnd","swipeShouldChangeTab","render","name","className","selectedTab","_jsx","DirectionContext","Consumer","children","direction","isRTL","Direction","RTL","_jsxs","ref","clsx","onTouchStart","undefined","onTouchEnd","onTouchMove","TabList","title","Tab","id","panelId","focusTab","current","contains","activeElement","focus","onClick","style","role","transform","TabPanel","tabId","content"],"mappings":"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"}