UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

893 lines (892 loc) 30.5 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.Dummy = void 0; var _push = _interopRequireDefault(require("core-js-pure/stable/instance/push.js")); var _parse = _interopRequireDefault(require("core-js-pure/stable/json/parse.js")); var _react = _interopRequireWildcard(require("react")); var _clsx = _interopRequireDefault(require("clsx")); var _withComponentMarkers = _interopRequireDefault(require("../../shared/helpers/withComponentMarkers.js")); var _Context = _interopRequireDefault(require("../../shared/Context.js")); var _componentHelper = require("../../shared/component-helper.js"); var _extendPropsWithContext = require("../../shared/helpers/extendPropsWithContext.js"); var _SpacingUtils = require("../space/SpacingUtils.js"); var _SkeletonHelper = require("../skeleton/SkeletonHelper.js"); var _Button = _interopRequireDefault(require("../button/Button.js")); var _useId = _interopRequireDefault(require("../../shared/helpers/useId.js")); var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../../shared/helpers/useIsomorphicLayoutEffect.js")); var _useUpdateEffect = _interopRequireDefault(require("../../shared/helpers/useUpdateEffect.js")); var _whatInput = _interopRequireDefault(require("../../shared/helpers/whatInput.js")); var _TabsCustomContent = _interopRequireDefault(require("./TabsCustomContent.js")); var _TabsContentWrapper = _interopRequireDefault(require("./TabsContentWrapper.js")); var _useSharedState = require("../../shared/helpers/useSharedState.js"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const tabsDefaultProps = { data: null, content: null, contentStyle: null, contentInnerSpace: { top: 'large' }, label: null, tabElement: 'button', selectedKey: null, align: 'left', tabsStyle: null, tabsInnerSpace: undefined, noBorder: false, navButtonEdge: false, onOpenTabNavigationFn: null, keepInDOM: false, preventRerender: false, scroll: null, skeleton: null, id: null, className: null, children: null, render: null, onChange: null, onMouseEnter: null, onClick: null, onFocus: null, breakout: true }; function getSelectedKeyOrFallback(selectedKey, data) { let useKey = selectedKey; if (!useKey) { useKey = data.reduce((acc, { selected, key }) => selected ? key : acc, null) || data[0] && data[0].key; } else { const keyExists = data.findIndex(({ key }) => key == selectedKey); if (keyExists === -1) { useKey = data[0] && data[0].key; } } return useKey; } function getData(props) { const addReactElement = (list, reactElem, reactElemIndex) => { if (reactElem && reactElem.type === _TabsCustomContent.default) { const dataProps = props.children && Array.isArray(props.children) && props.children[reactElemIndex] || {}; const componentProps = { ...reactElem.props }; if (componentProps.title === null) { delete componentProps.title; } const { title, key: _key, hash, ...rest } = { ...dataProps, ...componentProps, ...{ children: null } }; (0, _push.default)(list).call(list, { title, key: (!_key && hash ? hash : _key) || (0, _componentHelper.slugify)(title), content: reactElem, ...rest }); } }; let res = []; const data = !props.data && props.children ? props.children : props.data; if (Array.isArray(props.children) && props.children.some(element => typeof element === 'function' || _react.default.isValidElement(element))) { res = props.children.reduce((list, reactElem, i) => { addReactElement(list, reactElem, i); return list; }, []); } if (!Array.isArray(props.children) && (typeof props.children === 'function' || _react.default.isValidElement(props.children))) { addReactElement(res, props.children); } if (!(res && res.length > 0)) { if (props.data && Array.isArray(data)) { res = data; } else if (typeof data === 'string') { res = data[0] === '[' ? (0, _parse.default)(data) : []; } else if (data && typeof data === 'object') { res = Object.entries(data).reduce((acc, [key, obj]) => { if (obj) { (0, _push.default)(acc).call(acc, { key, ...obj }); } return acc; }, []); } } return res || []; } function TabsComponent(ownProps) { const context = (0, _react.useContext)(_Context.default); const props = (0, _extendPropsWithContext.extendPropsWithContext)(ownProps, tabsDefaultProps, { skeleton: context === null || context === void 0 ? void 0 : context.skeleton }); const propsRef = (0, _react.useRef)(props); propsRef.current = props; const tabsRef = (0, _react.useRef)(null); const tablistRef = (0, _react.useRef)(null); const cacheRef = (0, _react.useRef)({}); const listenForPropChangesRef = (0, _react.useRef)(true); const _id = (0, _useId.default)(ownProps.id); const sharedStateRef = (0, _react.useRef)(null); const propChangeRef = (0, _react.useRef)(false); const initialData = (0, _react.useRef)(getData(ownProps)); const [data, setData] = (0, _react.useState)(initialData.current); const [selectedKey, setSelectedKey] = (0, _react.useState)(() => getSelectedKeyOrFallback(ownProps.selectedKey, initialData.current)); const [focusKey, setFocusKey] = (0, _react.useState)(selectedKey); const [hasScrollbar, setHasScrollbar] = (0, _react.useState)(false); const [isFirst, setIsFirst] = (0, _react.useState)(undefined); const [isLast, setIsLast] = (0, _react.useState)(undefined); const [prevDataSource, setPrevDataSource] = (0, _react.useState)(ownProps.data || ownProps.children); const [prevSelectedKey, setPrevSelectedKey] = (0, _react.useState)(ownProps.selectedKey); if (listenForPropChangesRef.current) { const dataSource = ownProps.data || ownProps.children; let currentData = data; if (prevDataSource !== dataSource) { setPrevDataSource(dataSource); const newData = getData(ownProps); setData(newData); currentData = newData; propChangeRef.current = true; } if (ownProps.selectedKey && prevSelectedKey !== ownProps.selectedKey) { setPrevSelectedKey(ownProps.selectedKey); setSelectedKey(getSelectedKeyOrFallback(ownProps.selectedKey, currentData)); propChangeRef.current = true; } } (0, _react.useEffect)(() => { listenForPropChangesRef.current = true; }); const dataRef = (0, _react.useRef)(data); dataRef.current = data; const selectedKeyRef = (0, _react.useRef)(selectedKey); selectedKeyRef.current = selectedKey; const focusKeyRef = (0, _react.useRef)(focusKey); focusKeyRef.current = focusKey; const hasScrollbarRef = (0, _react.useRef)(hasScrollbar); hasScrollbarRef.current = hasScrollbar; const isFirstRef = (0, _react.useRef)(isFirst); isFirstRef.current = isFirst; const isLastRef = (0, _react.useRef)(isLast); isLastRef.current = isLast; const contextRef = (0, _react.useRef)(context); contextRef.current = context; const getLastPosition = () => { if (typeof window !== 'undefined') { try { const pos = parseFloat(window.localStorage.getItem(`tabs-pos-${_id}`)); window.localStorage.removeItem(`tabs-pos-${_id}`); return isNaN(pos) ? -1 : pos; } catch (e) { (0, _componentHelper.warn)(e); } } return -1; }; const hasLastPosition = () => { return lastPositionRef.current > -1; }; const lastPositionRef = (0, _react.useRef)(getLastPosition()); const hasLastUsedTab = () => { if (typeof window !== 'undefined') { try { const key = window.localStorage.getItem(`tabs-last-${_id}`) || null; window.localStorage.removeItem(`tabs-last-${_id}`); return key; } catch (e) { (0, _componentHelper.warn)(e); } } return -1; }; const saveLastUsedTab = () => { if (typeof window !== 'undefined') { try { window.localStorage.setItem(`tabs-last-${_id}`, String(selectedKeyRef.current)); } catch (e) { (0, _componentHelper.warn)(e); } } }; const saveLastPosition = (position = (_tablistRef$current => (_tablistRef$current = tablistRef.current) === null || _tablistRef$current === void 0 ? void 0 : _tablistRef$current.scrollLeft)()) => { if (typeof window !== 'undefined') { try { window.localStorage.setItem(`tabs-pos-${_id}`, String(position)); } catch (e) { (0, _componentHelper.warn)(e); } } }; const checkHasScrollbar = () => { if (!tablistRef.current) { return false; } const tablistElem = tablistRef.current; let tolerance = 1; const lastSnap = tablistElem.querySelector('.dnb-tabs__button__snap:last-of-type'); if (lastSnap) { const lastButton = lastSnap.querySelector('.dnb-tabs__button'); if (lastButton) { const buttonMargin = parseFloat(window.getComputedStyle(lastButton).marginRight) || 0; const snapMargin = parseFloat(window.getComputedStyle(lastSnap).marginRight) || 0; tolerance += Math.max(0, buttonMargin + snapMargin); } } return tablistElem.scrollWidth - tolerance > tablistElem.offsetWidth; }; const setLeftPosition = scrollLeft => { try { tablistRef.current.style.scrollBehavior = 'auto'; tablistRef.current.scrollLeft = scrollLeft; tablistRef.current.style.scrollBehavior = 'smooth'; } catch (e) {} }; const scrollToTab = (0, _react.useCallback)(({ type, behavior = 'smooth' }) => { if (typeof window === 'undefined') { return; } if (window.IS_TEST) { behavior = 'auto'; } const delay = () => { try { if (hasScrollbarRef.current && tablistRef.current) { const first = tablistRef.current.querySelector('.dnb-tabs__button__snap:first-of-type'); const isFirstItem = first.classList.contains(type); const last = tablistRef.current.querySelector('.dnb-tabs__button__snap:last-of-type'); const isLastItem = last.classList.contains(type); const elem = tablistRef.current.querySelector(`.dnb-tabs__button.${type}`); const style = window.getComputedStyle(tabsRef.current); const margin = parseFloat(style.marginLeft); let padding = margin < 0 ? parseFloat(style.paddingLeft) : 0; if (!isFirstItem && !isLastItem && parseFloat(style.paddingLeft) < 16) { const navButton = tabsRef.current.querySelector('.dnb-tabs__scroll-nav-button:first-of-type'); const additionalSpace = parseFloat(window.getComputedStyle(navButton).width) * 1.5; padding += additionalSpace; } const leftPadding = (margin < 0 ? Math.abs(margin) : 0) + padding + parseFloat(window.getComputedStyle(first).paddingLeft); const offsetLeft = elem.offsetLeft; const left = elem && !isFirstItem ? offsetLeft - leftPadding : 0; if (behavior === 'auto') { tablistRef.current.style.scrollBehavior = 'auto'; } tablistRef.current.scrollTo({ left, behavior }); if (behavior === 'auto') { tablistRef.current.style.scrollBehavior = ''; } setIsFirst(isFirstItem); setIsLast(isLastItem); } } catch (e) { (0, _componentHelper.warn)(e); } }; window.requestAnimationFrame(delay); }, []); const handleVerticalScroll = () => { if (propsRef.current.scroll && tablistRef.current && typeof tablistRef.current.scrollIntoView === 'function') { tablistRef.current.scrollIntoView({ block: 'start', behavior: 'smooth' }); } }; const setFocusOnTabButton = (0, _react.useCallback)(() => { try { const elem = tablistRef.current.querySelector('.dnb-tabs__button.focus'); elem.focus({ preventScroll: true }); if (!document.getElementById(`${_id}-content`) && typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') { (0, _componentHelper.warn)(`Could not find the required <Tabs.Content id="${_id}-content" ... /> that provides role="tabpanel"`); } } catch (e) { (0, _componentHelper.warn)(e); } }, [_id]); const getCurrentTitle = key => { const useKey = key !== null && key !== void 0 ? key : selectedKeyRef.current; const current = dataRef.current.filter(({ key: k }) => k == useKey)[0]; return current && current.title || null; }; const getStepKey = (useKey, stateKey) => { const currentData = dataRef.current.filter(({ disabled }) => !disabled); const currentIndex = currentData.reduce((acc, { key }, i) => key == stateKey ? i : acc, -1); let nextIndex = currentIndex + Number(useKey); if (nextIndex < 0) { nextIndex = currentData.length - 1; } if (nextIndex >= currentData.length) { nextIndex = 0; } return currentData.reduce((acc, { key }, i) => i === nextIndex ? key : acc, null); }; const getEventArgs = args => { const key = typeof args.selectedKey !== 'undefined' ? args.selectedKey : selectedKeyRef.current; return { key, selectedKey: selectedKeyRef.current, focusKey: focusKeyRef.current, title: getCurrentTitle(key), ...args }; }; const focusTab = (newFocusKey, event = null, mode = null) => { if (mode === 'step' && parseFloat(String(newFocusKey))) { newFocusKey = getStepKey(newFocusKey, focusKeyRef.current); } listenForPropChangesRef.current = false; setFocusKey(newFocusKey); (0, _componentHelper.dispatchCustomElementEvent)({ props: propsRef.current }, 'onFocus', getEventArgs({ event, focusKey: newFocusKey })); _whatInput.default.specificKeys([9, 37, 39, 33, 34, 35, 36]); }; (0, _useUpdateEffect.default)(() => { setFocusOnTabButton(); }, [focusKey]); const openTab = (newSelectedKey, event = null, mode = null) => { saveLastPosition(); saveLastUsedTab(); _whatInput.default.specificKeys([9]); if (mode === 'step' && parseFloat(String(newSelectedKey))) { newSelectedKey = getStepKey(newSelectedKey, selectedKeyRef.current); } if (typeof newSelectedKey !== 'undefined') { listenForPropChangesRef.current = false; setSelectedKey(newSelectedKey); setFocusKey(newSelectedKey); } (0, _componentHelper.dispatchCustomElementEvent)({ props: propsRef.current }, 'onChange', getEventArgs({ event, selectedKey: newSelectedKey })); if (propsRef.current.onOpenTabNavigationFn && typeof window !== 'undefined') { try { propsRef.current.onOpenTabNavigationFn(newSelectedKey); } catch (e) { (0, _componentHelper.warn)('Tabs Error:', e); } } if (sharedStateRef.current) { sharedStateRef.current.update(getEventArgs({ event, selectedKey: newSelectedKey })); } }; (0, _useUpdateEffect.default)(() => { handleVerticalScroll(); }, [selectedKey]); const onResizeHandler = (0, _react.useCallback)(() => { const scrollbarVisible = checkHasScrollbar(); setHasScrollbar(scrollbarVisible); if (scrollbarVisible) { scrollToTab({ type: 'selected' }); } }, [scrollToTab]); if (ownProps.id && !sharedStateRef.current) { sharedStateRef.current = (0, _useSharedState.createSharedState)(ownProps.id); sharedStateRef.current.set({ key: selectedKey, selectedKey, focusKey, title: getCurrentTitle(selectedKey) }); } (0, _useIsomorphicLayoutEffect.default)(() => { let isMounted = true; const init = () => { if (isMounted && tablistRef.current) { const scrollbarVisible = checkHasScrollbar(); const hasLP = lastPositionRef.current > -1; setHasScrollbar(scrollbarVisible); if (hasLP) { setLeftPosition(lastPositionRef.current); } if (scrollbarVisible) { scrollToTab({ type: 'selected', behavior: hasLP ? 'smooth' : 'auto' }); } if (hasLastUsedTab() !== null) { setFocusOnTabButton(); } } }; if (document.readyState === 'complete') { init(); } else if (typeof window !== 'undefined') { window.addEventListener('load', init); } if (typeof window !== 'undefined') { window.addEventListener('resize', onResizeHandler); } return () => { isMounted = false; _whatInput.default.specificKeys([9]); sharedStateRef.current = null; if (typeof window !== 'undefined') { window.removeEventListener('resize', onResizeHandler); window.removeEventListener('load', init); } }; }, []); (0, _useUpdateEffect.default)(() => { if (sharedStateRef.current && propChangeRef.current) { propChangeRef.current = false; onResizeHandler(); sharedStateRef.current.update(getEventArgs({ selectedKey })); } }, [selectedKey, data]); const focusFirstTab = e => { const key = dataRef.current[0].key; focusTab(key, e, 'step'); scrollToTab({ type: 'focus' }); }; const focusLastTab = e => { const d = dataRef.current; const key = d[d.length - 1].key; focusTab(key, e, 'step'); scrollToTab({ type: 'focus' }); }; const focusPrevTab = e => { focusTab(-1, e, 'step'); scrollToTab({ type: 'focus' }); }; const focusNextTab = e => { focusTab(+1, e, 'step'); scrollToTab({ type: 'focus' }); }; const openPrevTab = e => { openTab(-1, e, 'step'); scrollToTab({ type: 'selected' }); }; const openNextTab = e => { openTab(+1, e, 'step'); scrollToTab({ type: 'selected' }); }; const onTablistKeyDownHandler = e => { switch (e.key) { case 'ArrowUp': case 'PageUp': case 'ArrowLeft': e.preventDefault(); focusPrevTab(e); break; case 'ArrowDown': case 'PageDown': case 'ArrowRight': e.preventDefault(); focusNextTab(e); break; case 'Home': e.preventDefault(); focusFirstTab(e); break; case 'End': e.preventDefault(); focusLastTab(e); break; } }; const getCurrentKey = event => { let currentKey; try { var _elem$dataset; const elem = (0, _componentHelper.getClosestParent)('dnb-tabs__button', event.target); currentKey = elem === null || elem === void 0 || (_elem$dataset = elem.dataset) === null || _elem$dataset === void 0 ? void 0 : _elem$dataset.tabKey; } catch (e) { (0, _componentHelper.warn)('Tabs Error:', e); } return currentKey; }; const onMouseEnterHandler = event => { const key = getCurrentKey(event); if (key) { (0, _componentHelper.dispatchCustomElementEvent)({ props: propsRef.current }, 'onMouseEnter', getEventArgs({ event, selectedKey: key })); } }; const onClickHandler = event => { const key = getCurrentKey(event); if (key) { const ret = (0, _componentHelper.dispatchCustomElementEvent)({ props: propsRef.current }, 'onClick', getEventArgs({ event, selectedKey: key })); if (ret !== false) { openTab(key, event); scrollToTab({ type: 'selected' }); } } }; const onMouseDown = event => { event.preventDefault(); }; const onKeyDownHandler = event => { if (event.key === 'Enter') { try { const elem = document.getElementById(`${_id}-content`); elem.focus({ preventScroll: true }); } catch (e) { (0, _componentHelper.warn)(`Could not find the required <Tabs.Content id="${_id}-content" ... /> that provides role="tabpanel"`); } } }; const getContent = key => { const { children, content: _content } = propsRef.current; const contentToRender = children || _content; let content = null; if (contentToRender) { if (typeof contentToRender === 'object' && contentToRender[key]) { content = contentToRender[key]; } else if (typeof contentToRender === 'function') { content = contentToRender(key); } else if (_react.default.isValidElement(contentToRender)) { content = contentToRender; } } if (!content) { let items = []; if (Array.isArray(dataRef.current)) { items = dataRef.current; } else if (Array.isArray(contentToRender)) { items = contentToRender; } if (items) { content = items.filter(({ key: k }) => k && key && k == key).reduce((acc, { content }) => content || acc, null); } } if (typeof content === 'function') { const Component = content; content = (0, _jsxRuntime.jsx)(Component, {}); } return content; }; const renderWrapperRef = (0, _react.useRef)(null); const renderTabsListRef = (0, _react.useRef)(null); const renderContentRef = (0, _react.useRef)(null); const renderTabsRef = (0, _react.useRef)(null); renderWrapperRef.current = ({ children, ...rest }) => { const { className, class: _className } = ownProps; const { ...attributes } = (0, _componentHelper.filterProps)(ownProps, tabsDefaultProps); const params = (0, _SpacingUtils.applySpacing)(ownProps, { ...attributes, className: (0, _clsx.default)('dnb-tabs', className, _className) }); (0, _componentHelper.validateDOMAttributes)(ownProps, params); delete params.contentInnerSpace; delete params.tabsInnerSpace; return (0, _jsxRuntime.jsx)("div", { ...params, ...rest, children: children }); }; renderTabsListRef.current = ({ children, className: extraClassName, ...rest }) => { const { align, tabsStyle, tabsInnerSpace, noBorder, navButtonEdge, breakout } = propsRef.current; return (0, _jsxRuntime.jsxs)("div", { className: (0, _clsx.default)('dnb-tabs__tabs', extraClassName, align && `dnb-tabs__tabs--${align}`, tabsStyle && `dnb-section dnb-section--${tabsStyle}`, hasScrollbarRef.current && 'dnb-tabs--has-scrollbar', navButtonEdge && 'dnb-tabs--at-edge', noBorder && 'dnb-tabs__tabs--no-border', breakout && 'dnb-tabs__tabs--breakout'), ref: tabsRef, style: tabsInnerSpace ? { paddingTop: `var(--spacing-${tabsInnerSpace === true ? 'large' : tabsInnerSpace})` } : undefined, ...rest, children: [(0, _jsxRuntime.jsx)(ScrollNavButton, { onMouseDown: openPrevTab, icon: "chevron_left", className: (0, _clsx.default)(hasScrollbarRef.current && (typeof isFirstRef.current !== 'undefined' || hasLastPosition()) && 'dnb-tabs__scroll-nav-button--visible', isFirstRef.current && 'dnb-tabs__scroll-nav-button--hide') }), children, (0, _jsxRuntime.jsx)(ScrollNavButton, { onMouseDown: openNextTab, icon: "chevron_right", className: (0, _clsx.default)(hasScrollbarRef.current && (typeof isLastRef.current !== 'undefined' || hasLastPosition()) && 'dnb-tabs__scroll-nav-button--visible', isLastRef.current && 'dnb-tabs__scroll-nav-button--hide') })] }); }; renderContentRef.current = () => { const { preventRerender, keepInDOM } = propsRef.current; const currentSelectedKey = selectedKeyRef.current; const currentData = dataRef.current; let content; if (preventRerender || keepInDOM) { if (keepInDOM) { cacheRef.current = Object.entries(currentData).reduce((acc, [_idx, cur]) => { acc[cur.key] = { ...cur, content: getContent(cur.key) }; return acc; }, {}); } else if (preventRerender) { cacheRef.current = { ...(cacheRef.current || {}), [currentSelectedKey]: { content: getContent(currentSelectedKey) } }; } content = Object.entries(cacheRef.current).map(([key, { content: cachedContent }]) => { const hide = key !== String(currentSelectedKey); return (0, _jsxRuntime.jsx)("div", { "aria-hidden": hide ? true : undefined, className: 'dnb-tabs__cached' + (hide ? " dnb-tabs__cached--hidden" : ""), children: cachedContent }, key); }); } else { content = getContent(currentSelectedKey); } if (!sharedStateRef.current && !content) { (0, _componentHelper.warn)(`No content was given to the Tabs component! Tip: Check out other solutions like <Tabs.Content id="unique">Your content, outside of the Tabs component</Tabs.Content> `); } return (0, _jsxRuntime.jsx)(_TabsContentWrapper.default, { id: _id, selectedKey: currentSelectedKey, contentStyle: propsRef.current.contentStyle, contentInnerSpace: propsRef.current.contentInnerSpace, animate: propsRef.current.keepInDOM, children: content }); }; renderTabsRef.current = (extraProps = {}) => { const mergedProps = propsRef.current; const { label, skeleton, tabElement } = { ...mergedProps, ...extraProps }; const currentData = dataRef.current; const currentFocusKey = focusKeyRef.current; const currentSelectedKey = selectedKeyRef.current; const currentContext = contextRef.current; const TabElement = tabElement || 'button'; const tabs = currentData.map(({ title, key, disabled = false, to, href }) => { const itemParams = { to, href }; const isFocus = currentFocusKey == key; const isSelected = currentSelectedKey == key; if (isSelected) { itemParams['aria-controls'] = `${_id}-content`; } if (disabled) { itemParams.disabled = true; itemParams['aria-disabled'] = true; } if (TabElement === 'button') { itemParams.type = 'button'; } (0, _SkeletonHelper.skeletonDOMAttributes)(itemParams, skeleton, currentContext); return (0, _jsxRuntime.jsx)("div", { className: (0, _clsx.default)('dnb-tabs__button__snap', isFocus && 'focus', isSelected && 'selected'), children: (0, _jsxRuntime.jsxs)(TabElement, { role: "tab", tabIndex: -1, id: `${_id}-tab-${key}`, "aria-selected": isSelected, className: (0, _clsx.default)('dnb-tabs__button', isFocus && 'focus', isSelected && 'selected'), onMouseEnter: onMouseEnterHandler, onClick: onClickHandler, onKeyUp: onKeyDownHandler, onMouseDown: onMouseDown, "data-tab-key": key, ...itemParams, children: [(0, _jsxRuntime.jsx)("span", { className: (0, _clsx.default)('dnb-tabs__button__title', (0, _SkeletonHelper.createSkeletonClass)('font', skeleton, currentContext)), children: title }), (0, _jsxRuntime.jsx)(Dummy, { children: title })] }) }, `tab-${key}`); }); const params = {}; if (label) { params['aria-label'] = label; } if (currentSelectedKey) { params['aria-labelledby'] = (0, _componentHelper.combineLabelledBy)(params, `${_id}-tab-${currentSelectedKey}`); } return (0, _jsxRuntime.jsx)("div", { role: "tablist", className: "dnb-tabs__tabs__tablist", tabIndex: 0, onKeyDown: onTablistKeyDownHandler, ref: tablistRef, ...params, children: tabs }); }; const Wrapper = (0, _react.useMemo)(() => { const C = p => renderWrapperRef.current(p); C.displayName = 'TabsWrapper'; return C; }, []); const TabsList = (0, _react.useMemo)(() => { const C = p => renderTabsListRef.current(p); C.displayName = 'TabsList'; return C; }, []); const Content = (0, _react.useMemo)(() => { const C = () => renderContentRef.current(); C.displayName = 'TabContent'; return C; }, []); const TabItems = (0, _react.useMemo)(() => { const C = p => renderTabsRef.current(p); C.displayName = 'Tabs'; return C; }, []); if (typeof props.render === 'function') { return props.render({ Wrapper, Content, TabsList, Tabs: TabItems }); } return (0, _jsxRuntime.jsxs)(Wrapper, { children: [(0, _jsxRuntime.jsx)(TabsList, { children: (0, _jsxRuntime.jsx)(TabItems, {}) }), (0, _jsxRuntime.jsx)(Content, {})] }); } TabsComponent.displayName = 'Tabs'; const Tabs = Object.assign(_react.default.memo(TabsComponent), { Content: _TabsCustomContent.default, ContentWrapper: _TabsContentWrapper.default }); (0, _withComponentMarkers.default)(Tabs, { _supportsSpacingProps: true }); var _default = exports.default = Tabs; const Dummy = ({ children }) => { return (0, _jsxRuntime.jsx)("span", { "aria-hidden": true, hidden: true, className: "dnb-dummy", children: children }); }; exports.Dummy = Dummy; const ScrollNavButton = props => { return (0, _jsxRuntime.jsx)(_Button.default, { size: "medium", variant: "primary", tabIndex: -1, bounding: true, "aria-hidden": true, ...props, className: (0, _clsx.default)('dnb-tabs__scroll-nav-button', props.className) }); }; //# sourceMappingURL=Tabs.js.map