@accessible/tabs
Version:
🅰 An accessible and versatile tabs component for React with keyboard navigation and labeling features taught in w3.org's WAI-ARIA tabs example
1 lines • 19.9 kB
Source Map (JSON)
{"version":3,"file":"index.dev.mjs","sources":["../../src/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport {Button} from '@accessible/button'\nimport useKey from '@accessible/use-key'\nimport useConditionalFocus from '@accessible/use-conditional-focus'\nimport useId from '@accessible/use-id'\nimport useMergedRef from '@react-hook/merged-ref'\nimport useLayoutEffect from '@react-hook/passive-layout-effect'\nimport useChange from '@react-hook/change'\nimport clsx from 'clsx'\n\n// An optimized function for adding an `index` prop to elements of a Tab or\n// Panel type. All tabs must be on the same child depth level as other tabs,\n// same with panels. Once one tab or panel is found, it will not traverse\n// deeper into the tree. Using this in favor of something more generalized\n// in order to not hurt render performance on large trees.\nconst cloneChildrenWithIndex = (\n elements: React.ReactNode | React.ReactNode[],\n type: typeof Panel | typeof Tab\n): React.ReactNode[] | React.ReactNode => {\n let index = 0\n let didUpdate = false\n const children = React.Children.map(elements, (child) => {\n // bails out if not an element object\n if (!React.isValidElement(child)) return child\n // bails out if certainly the wrong type\n if (\n (type === Panel && (child.type === TabList || child.type === Tab)) ||\n (type === Tab && child.type === Panel)\n )\n return child\n // found a match\n if (child.type === type) {\n // bail out if the indexes are user-provided\n if (child.props.index !== void 0) {\n index = child.props.index + 1\n return child\n } else {\n didUpdate = true\n return React.cloneElement(child, {index: index++})\n }\n }\n // only checks the children if we're not on a depth with tabs/panels\n if (index === 0) {\n const nextChildren = cloneChildrenWithIndex(child.props.children, type)\n if (nextChildren === child.props.children) return child\n else {\n didUpdate = true\n return React.cloneElement(child, void 0, nextChildren)\n }\n }\n\n return child\n })\n\n return !didUpdate ? elements : children?.length === 1 ? children[0] : children\n}\n\nexport interface TabsContextValue {\n tabs: TabState[]\n registerTab: (\n index: number,\n element: HTMLElement,\n id?: string,\n disabled?: boolean\n ) => () => void\n active: number | undefined\n activate: (index: number | undefined) => void\n manualActivation: boolean\n preventScroll: boolean\n}\n\nfunction noop() {}\n\nexport const TabsContext = React.createContext<TabsContextValue>({\n tabs: [],\n registerTab: () => noop,\n active: void 0,\n activate: noop,\n manualActivation: false,\n preventScroll: false,\n }),\n {Consumer: TabsConsumer} = TabsContext,\n useTabs = () => React.useContext<TabsContextValue>(TabsContext)\n\nexport interface TabsProps {\n active?: number\n defaultActive?: number\n manualActivation?: boolean\n preventScroll?: boolean\n onChange?: (active: number | undefined) => void\n children: React.ReactNode | React.ReactNode[] | JSX.Element | JSX.Element[]\n}\n\nexport type TabState =\n | {\n element?: HTMLElement\n id?: string\n disabled?: boolean\n }\n | undefined\n\ntype TabAction =\n | {\n type: 'register'\n index: number\n element: HTMLElement\n id?: string\n disabled?: boolean\n }\n | {\n type: 'unregister'\n index: number\n }\n\nexport function Tabs({\n active,\n defaultActive = 0,\n manualActivation = false,\n preventScroll = false,\n onChange = noop,\n children,\n}: TabsProps) {\n const [tabs, dispatchTabs] = React.useReducer(\n (state: TabState[], action: TabAction) => {\n const {index} = action\n\n if (action.type === 'register') {\n state = state.slice(0)\n state[index] = {\n element: action.element,\n id: action.id,\n disabled: action.disabled,\n }\n } else if (action.type === 'unregister') {\n state = state.slice(0)\n state[index] = void 0\n }\n\n return state\n },\n []\n )\n const [userActive, setActive] = React.useState<number | undefined>(\n defaultActive\n )\n useChange(userActive, onChange)\n const nextActive = active ?? userActive\n\n const context = React.useMemo<TabsContextValue>(\n () => ({\n tabs,\n registerTab: (\n index: number,\n element: HTMLElement,\n id?: string,\n disabled?: boolean\n ) => {\n dispatchTabs({type: 'register', index, element, id, disabled})\n return () => dispatchTabs({type: 'unregister', index})\n },\n active: nextActive,\n activate: (index) => {\n if (tabs[index || -1]?.disabled) return\n setActive(index)\n },\n preventScroll,\n manualActivation,\n }),\n [tabs, nextActive, manualActivation, preventScroll]\n )\n\n return (\n <TabsContext.Provider value={context}>\n {cloneChildrenWithIndex(cloneChildrenWithIndex(children, Tab), Panel)}\n </TabsContext.Provider>\n )\n}\n\nexport interface TabControls {\n activate: () => void\n}\n\ninterface TabContextValue {\n id?: string\n tabRef?: HTMLElement\n index: number\n activate: () => void\n isActive: boolean\n disabled: boolean\n}\n\nexport function useTab(index: number): TabContextValue {\n const {tabs, activate, active} = React.useContext(TabsContext)\n return React.useMemo(\n () => ({\n id: tabs[index]?.id,\n tabRef: tabs[index]?.element,\n index: index as number,\n activate: () => !tabs[index]?.disabled && activate(index),\n isActive: index === active,\n disabled: tabs[index]?.disabled || false,\n }),\n [tabs, index, active, activate]\n )\n}\n\nexport interface TabProps {\n id?: string\n index?: number\n disabled?: boolean\n activeClass?: string\n inactiveClass?: string\n activeStyle?: React.CSSProperties\n inactiveStyle?: React.CSSProperties\n onDelete?: (event: KeyboardEvent) => void\n children: React.ReactElement | JSX.Element\n}\n\nexport function Tab({\n id,\n index,\n disabled = false,\n activeClass,\n inactiveClass,\n activeStyle,\n inactiveStyle,\n onDelete = noop,\n children,\n}: TabProps) {\n id = useId(id)\n const {registerTab} = useTabs()\n const triggerRef = React.useRef<HTMLElement>(null)\n const {tabs, manualActivation} = useTabs()\n const {isActive, activate} = useTab(index as number)\n const ref = useMergedRef(\n // @ts-ignore\n children.ref,\n triggerRef\n )\n\n useKey(triggerRef, {\n // right arrow\n ArrowRight: () => focusNext(tabs, index as number),\n // left arrow\n ArrowLeft: () => focusPrev(tabs, index as number),\n // home\n Home: () => tabs[0]?.element?.focus(),\n // end\n End: () => tabs[tabs.length - 1]?.element?.focus(),\n // delete\n Delete: onDelete,\n })\n\n React.useEffect(\n () =>\n registerTab(\n index as number,\n triggerRef.current as HTMLElement,\n id,\n disabled\n ),\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [id, disabled, index]\n )\n\n return (\n <Button>\n {React.cloneElement(children, {\n 'aria-controls': id,\n 'aria-selected': '' + isActive,\n 'aria-disabled': '' + (isActive || disabled),\n role: 'tab',\n className:\n clsx(\n children.props.className,\n isActive ? activeClass : inactiveClass\n ) || void 0,\n style: Object.assign(\n {},\n children.props.style,\n isActive ? activeStyle : inactiveStyle\n ),\n tabIndex: children.props.hasOwnProperty('tabIndex')\n ? children.props.tabIndex\n : isActive\n ? 0\n : -1,\n onFocus: (e: React.MouseEvent<HTMLElement>) => {\n if (!manualActivation) activate()\n children.props.onFocus?.(e)\n },\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n activate()\n children.props.onClick?.(e)\n },\n ref,\n })}\n </Button>\n )\n}\n\nfunction focusNext(tabs: TabState[], currentIndex: number) {\n if (currentIndex === tabs.length - 1) tabs[0]?.element?.focus()\n else tabs[currentIndex + 1]?.element?.focus()\n}\n\nfunction focusPrev(tabs: TabState[], currentIndex: number) {\n if (currentIndex === 0) tabs[tabs.length - 1]?.element?.focus()\n else tabs[currentIndex - 1]?.element?.focus()\n}\n\nexport interface TabListProps {\n children: React.ReactElement | JSX.Element\n}\n\nexport function TabList({children}: TabListProps) {\n return React.cloneElement(children, {\n role: 'tablist',\n })\n}\n\nexport interface PanelProps {\n index?: number\n activeClass?: string\n inactiveClass?: string\n activeStyle?: React.CSSProperties\n inactiveStyle?: React.CSSProperties\n children: React.ReactElement | JSX.Element\n}\n\nexport function Panel({\n index,\n activeClass,\n inactiveClass,\n activeStyle,\n inactiveStyle,\n children,\n}: PanelProps) {\n const {isActive, id} = useTab(index as number)\n const {manualActivation, preventScroll} = useTabs()\n const prevActive = React.useRef<boolean>(isActive)\n const panelRef = React.useRef<HTMLElement>(null)\n const ref = useMergedRef(\n // @ts-ignore\n children.ref,\n panelRef\n )\n\n useConditionalFocus(\n panelRef,\n manualActivation && !prevActive.current && isActive,\n {\n includeRoot: true,\n preventScroll,\n }\n )\n\n // ensures the tab panel won't be granted the window's focus\n // by default, but receives focus when the visual state changes to\n // active\n useLayoutEffect(() => {\n prevActive.current = isActive\n }, [isActive, index])\n\n return React.cloneElement(children, {\n 'aria-hidden': `${!isActive}`,\n id,\n className:\n clsx(children.props.className, isActive ? activeClass : inactiveClass) ||\n void 0,\n style: Object.assign(\n {visibility: isActive ? 'visible' : 'hidden'},\n children.props.style,\n isActive ? activeStyle : inactiveStyle\n ),\n tabIndex: children.props.hasOwnProperty('tabIndex')\n ? children.props.tabIndex\n : isActive\n ? 0\n : -1,\n ref,\n })\n}\n\n/* istanbul ignore next */\nif (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {\n Tabs.displayName = 'Tabs'\n TabList.displayName = 'TabList'\n Tab.displayName = 'Tab'\n Panel.displayName = 'Panel'\n}\n"],"names":["cloneChildrenWithIndex","elements","type","index","didUpdate","children","React","map","child","Panel","TabList","Tab","props","nextChildren","length","noop","TabsContext","tabs","registerTab","active","activate","manualActivation","preventScroll","Consumer","TabsConsumer","useTabs","state","action","slice","element","id","disabled","Tabs","defaultActive","onChange","dispatchTabs","userActive","setActive","useChange","nextActive","context","useTab","tabRef","isActive","activeClass","inactiveClass","activeStyle","inactiveStyle","onDelete","useId","triggerRef","ref","useMergedRef","useKey","ArrowRight","focusNext","ArrowLeft","focusPrev","Home","focus","End","Delete","current","role","className","clsx","style","Object","assign","tabIndex","hasOwnProperty","onFocus","e","onClick","currentIndex","prevActive","panelRef","useConditionalFocus","includeRoot","useLayoutEffect","visibility","process","displayName"],"mappings":"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"}