@wordpress/components
Version:
UI components for WordPress.
8 lines (7 loc) • 9.48 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/tab-panel/index.tsx"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport * as Ariakit from '@ariakit/react';\nimport clsx from 'clsx';\n/**\n * WordPress dependencies\n */\nimport { forwardRef, useEffect, useLayoutEffect, useCallback } from '@wordpress/element';\nimport { useInstanceId, usePrevious } from '@wordpress/compose';\nimport { isRTL } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\n\nimport Button from '../button';\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n// Separate the actual tab name from the instance ID. This is\n// necessary because Ariakit internally uses the element ID when\n// a new tab is selected, but our implementation looks specifically\n// for the tab name to be passed to the `onSelect` callback.\nconst extractTabName = id => {\n if (typeof id === 'undefined' || id === null) {\n return;\n }\n return id.match(/^tab-panel-[0-9]*-(.*)/)?.[1];\n};\n\n/**\n * TabPanel is an ARIA-compliant tabpanel.\n *\n * TabPanels organize content across different screens, data sets, and interactions.\n * It has two sections: a list of tabs, and the view to show when tabs are chosen.\n *\n * ```jsx\n * import { TabPanel } from '@wordpress/components';\n *\n * const onSelect = ( tabName ) => {\n * console.log( 'Selecting tab', tabName );\n * };\n *\n * const MyTabPanel = () => (\n * <TabPanel\n * className=\"my-tab-panel\"\n * activeClass=\"active-tab\"\n * onSelect={ onSelect }\n * tabs={ [\n * {\n * name: 'tab1',\n * title: 'Tab 1',\n * className: 'tab-one',\n * },\n * {\n * name: 'tab2',\n * title: 'Tab 2',\n * className: 'tab-two',\n * },\n * ] }\n * >\n * { ( tab ) => <p>{ tab.title }</p> }\n * </TabPanel>\n * );\n * ```\n */\nconst UnforwardedTabPanel = ({\n className,\n children,\n tabs,\n selectOnMove = true,\n initialTabName,\n orientation = 'horizontal',\n activeClass = 'is-active',\n onSelect\n}, ref) => {\n const instanceId = useInstanceId(TabPanel, 'tab-panel');\n const prependInstanceId = useCallback(tabName => {\n if (typeof tabName === 'undefined') {\n return;\n }\n return `${instanceId}-${tabName}`;\n }, [instanceId]);\n const tabStore = Ariakit.useTabStore({\n setSelectedId: newTabValue => {\n if (typeof newTabValue === 'undefined' || newTabValue === null) {\n return;\n }\n const newTab = tabs.find(t => prependInstanceId(t.name) === newTabValue);\n if (newTab?.disabled || newTab === selectedTab) {\n return;\n }\n const simplifiedTabName = extractTabName(newTabValue);\n if (typeof simplifiedTabName === 'undefined') {\n return;\n }\n onSelect?.(simplifiedTabName);\n },\n orientation,\n selectOnMove,\n defaultSelectedId: prependInstanceId(initialTabName),\n rtl: isRTL()\n });\n const selectedTabName = extractTabName(Ariakit.useStoreState(tabStore, 'selectedId'));\n const setTabStoreSelectedId = useCallback(tabName => {\n tabStore.setState('selectedId', prependInstanceId(tabName));\n }, [prependInstanceId, tabStore]);\n const selectedTab = tabs.find(({\n name\n }) => name === selectedTabName);\n const previousSelectedTabName = usePrevious(selectedTabName);\n\n // Ensure `onSelect` is called when the initial tab is selected.\n useEffect(() => {\n if (previousSelectedTabName !== selectedTabName && selectedTabName === initialTabName && !!selectedTabName) {\n onSelect?.(selectedTabName);\n }\n }, [selectedTabName, initialTabName, onSelect, previousSelectedTabName]);\n\n // Handle selecting the initial tab.\n useLayoutEffect(() => {\n // If there's a selected tab, don't override it.\n if (selectedTab) {\n return;\n }\n const initialTab = tabs.find(tab => tab.name === initialTabName);\n // Wait for the denoted initial tab to be declared before making a\n // selection. This ensures that if a tab is declared lazily it can\n // still receive initial selection.\n if (initialTabName && !initialTab) {\n return;\n }\n if (initialTab && !initialTab.disabled) {\n // Select the initial tab if it's not disabled.\n setTabStoreSelectedId(initialTab.name);\n } else {\n // Fallback to the first enabled tab when the initial tab is\n // disabled or it can't be found.\n const firstEnabledTab = tabs.find(tab => !tab.disabled);\n if (firstEnabledTab) {\n setTabStoreSelectedId(firstEnabledTab.name);\n }\n }\n }, [tabs, selectedTab, initialTabName, instanceId, setTabStoreSelectedId]);\n\n // Handle the currently selected tab becoming disabled.\n useEffect(() => {\n // This effect only runs when the selected tab is defined and becomes disabled.\n if (!selectedTab?.disabled) {\n return;\n }\n const firstEnabledTab = tabs.find(tab => !tab.disabled);\n // If the currently selected tab becomes disabled, select the first enabled tab.\n // (if there is one).\n if (firstEnabledTab) {\n setTabStoreSelectedId(firstEnabledTab.name);\n }\n }, [tabs, selectedTab?.disabled, setTabStoreSelectedId, instanceId]);\n return /*#__PURE__*/_jsxs(\"div\", {\n className: className,\n ref: ref,\n children: [/*#__PURE__*/_jsx(Ariakit.TabList, {\n store: tabStore,\n className: \"components-tab-panel__tabs\",\n children: tabs.map(tab => {\n return /*#__PURE__*/_jsx(Ariakit.Tab, {\n id: prependInstanceId(tab.name),\n className: clsx('components-tab-panel__tabs-item', tab.className, {\n [activeClass]: tab.name === selectedTabName\n }),\n disabled: tab.disabled,\n \"aria-controls\": `${prependInstanceId(tab.name)}-view`,\n render: /*#__PURE__*/_jsx(Button, {\n __next40pxDefaultSize: true,\n icon: tab.icon,\n label: tab.icon && tab.title,\n showTooltip: !!tab.icon\n }),\n children: !tab.icon && tab.title\n }, tab.name);\n })\n }), selectedTab && /*#__PURE__*/_jsx(Ariakit.TabPanel, {\n id: `${prependInstanceId(selectedTab.name)}-view`,\n store: tabStore,\n tabId: prependInstanceId(selectedTab.name),\n className: \"components-tab-panel__tab-content\",\n children: children(selectedTab)\n })]\n });\n};\nexport const TabPanel = forwardRef(UnforwardedTabPanel);\nTabPanel.displayName = 'TabPanel';\nexport default TabPanel;"],
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,kBAAAA;AAAA,EAAA;AAAA;AAAA;AAGA,cAAyB;AACzB,kBAAiB;AAIjB,qBAAoE;AACpE,qBAA2C;AAC3C,kBAAsB;AAMtB,oBAAmB;AACnB,yBAA2C;AAK3C,IAAM,iBAAiB,QAAM;AAC3B,MAAI,OAAO,OAAO,eAAe,OAAO,MAAM;AAC5C;AAAA,EACF;AACA,SAAO,GAAG,MAAM,wBAAwB,IAAI,CAAC;AAC/C;AAsCA,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AACF,GAAG,QAAQ;AACT,QAAM,iBAAa,8BAAcA,WAAU,WAAW;AACtD,QAAM,wBAAoB,4BAAY,aAAW;AAC/C,QAAI,OAAO,YAAY,aAAa;AAClC;AAAA,IACF;AACA,WAAO,GAAG,UAAU,IAAI,OAAO;AAAA,EACjC,GAAG,CAAC,UAAU,CAAC;AACf,QAAM,WAAmB,oBAAY;AAAA,IACnC,eAAe,iBAAe;AAC5B,UAAI,OAAO,gBAAgB,eAAe,gBAAgB,MAAM;AAC9D;AAAA,MACF;AACA,YAAM,SAAS,KAAK,KAAK,OAAK,kBAAkB,EAAE,IAAI,MAAM,WAAW;AACvE,UAAI,QAAQ,YAAY,WAAW,aAAa;AAC9C;AAAA,MACF;AACA,YAAM,oBAAoB,eAAe,WAAW;AACpD,UAAI,OAAO,sBAAsB,aAAa;AAC5C;AAAA,MACF;AACA,iBAAW,iBAAiB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,kBAAkB,cAAc;AAAA,IACnD,SAAK,mBAAM;AAAA,EACb,CAAC;AACD,QAAM,kBAAkB,eAAuB,sBAAc,UAAU,YAAY,CAAC;AACpF,QAAM,4BAAwB,4BAAY,aAAW;AACnD,aAAS,SAAS,cAAc,kBAAkB,OAAO,CAAC;AAAA,EAC5D,GAAG,CAAC,mBAAmB,QAAQ,CAAC;AAChC,QAAM,cAAc,KAAK,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF,MAAM,SAAS,eAAe;AAC9B,QAAM,8BAA0B,4BAAY,eAAe;AAG3D,gCAAU,MAAM;AACd,QAAI,4BAA4B,mBAAmB,oBAAoB,kBAAkB,CAAC,CAAC,iBAAiB;AAC1G,iBAAW,eAAe;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,iBAAiB,gBAAgB,UAAU,uBAAuB,CAAC;AAGvE,sCAAgB,MAAM;AAEpB,QAAI,aAAa;AACf;AAAA,IACF;AACA,UAAM,aAAa,KAAK,KAAK,SAAO,IAAI,SAAS,cAAc;AAI/D,QAAI,kBAAkB,CAAC,YAAY;AACjC;AAAA,IACF;AACA,QAAI,cAAc,CAAC,WAAW,UAAU;AAEtC,4BAAsB,WAAW,IAAI;AAAA,IACvC,OAAO;AAGL,YAAM,kBAAkB,KAAK,KAAK,SAAO,CAAC,IAAI,QAAQ;AACtD,UAAI,iBAAiB;AACnB,8BAAsB,gBAAgB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,gBAAgB,YAAY,qBAAqB,CAAC;AAGzE,gCAAU,MAAM;AAEd,QAAI,CAAC,aAAa,UAAU;AAC1B;AAAA,IACF;AACA,UAAM,kBAAkB,KAAK,KAAK,SAAO,CAAC,IAAI,QAAQ;AAGtD,QAAI,iBAAiB;AACnB,4BAAsB,gBAAgB,IAAI;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,UAAU,uBAAuB,UAAU,CAAC;AACnE,SAAoB,uCAAAC,MAAM,OAAO;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,UAAU,CAAc,uCAAAC,KAAa,iBAAS;AAAA,MAC5C,OAAO;AAAA,MACP,WAAW;AAAA,MACX,UAAU,KAAK,IAAI,SAAO;AACxB,eAAoB,uCAAAA,KAAa,aAAK;AAAA,UACpC,IAAI,kBAAkB,IAAI,IAAI;AAAA,UAC9B,eAAW,YAAAC,SAAK,mCAAmC,IAAI,WAAW;AAAA,YAChE,CAAC,WAAW,GAAG,IAAI,SAAS;AAAA,UAC9B,CAAC;AAAA,UACD,UAAU,IAAI;AAAA,UACd,iBAAiB,GAAG,kBAAkB,IAAI,IAAI,CAAC;AAAA,UAC/C,QAAqB,uCAAAD,KAAK,cAAAE,SAAQ;AAAA,YAChC,uBAAuB;AAAA,YACvB,MAAM,IAAI;AAAA,YACV,OAAO,IAAI,QAAQ,IAAI;AAAA,YACvB,aAAa,CAAC,CAAC,IAAI;AAAA,UACrB,CAAC;AAAA,UACD,UAAU,CAAC,IAAI,QAAQ,IAAI;AAAA,QAC7B,GAAG,IAAI,IAAI;AAAA,MACb,CAAC;AAAA,IACH,CAAC,GAAG,eAA4B,uCAAAF,KAAa,kBAAU;AAAA,MACrD,IAAI,GAAG,kBAAkB,YAAY,IAAI,CAAC;AAAA,MAC1C,OAAO;AAAA,MACP,OAAO,kBAAkB,YAAY,IAAI;AAAA,MACzC,WAAW;AAAA,MACX,UAAU,SAAS,WAAW;AAAA,IAChC,CAAC,CAAC;AAAA,EACJ,CAAC;AACH;AACO,IAAMF,gBAAW,2BAAW,mBAAmB;AACtDA,UAAS,cAAc;AACvB,IAAO,oBAAQA;",
"names": ["TabPanel", "_jsxs", "_jsx", "clsx", "Button"]
}