UNPKG

react95

Version:

Refreshed Windows95 UI components for modern web apps - React95

82 lines (74 loc) 2.69 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var styled = require('styled-components'); var index = require('../common/utils/index.js'); var Tab = require('./Tab.js'); var TabBody = require('./TabBody.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled); const StyledTabs = styled__default["default"].div` position: relative; ${({ isMultiRow, theme }) => isMultiRow && ` button { flex-grow: 1; } button:last-child:before { border-right: 2px solid ${theme.borderDark}; } `} `; const Row = styled__default["default"].div.attrs(() => ({ "data-testid": "tab-row" }))` position: relative; display: flex; flex-wrap: no-wrap; text-align: left; left: 8px; width: calc(100% - 8px); &:not(:first-child):before { content: ''; position: absolute; right: 0; left: 0; height: 100%; border-right: 2px solid ${({ theme }) => theme.borderDarkest}; border-left: 2px solid ${({ theme }) => theme.borderLightest}; } `; function splitToChunks(array, parts) { const result = []; for (let i = parts; i > 0; i -= 1) { result.push(array.splice(0, Math.ceil(array.length / i))); } return result; } const Tabs = React.forwardRef(({ value, onChange = index.noOp, children, rows = 1, ...otherProps }, ref) => { const tabRowsToRender = React.useMemo(() => { var _a; const childrenWithProps = (_a = React__default["default"].Children.map(children, (child) => { if (!React__default["default"].isValidElement(child)) { return null; } const tabProps = { selected: child.props.value === value, onClick: onChange }; return React__default["default"].cloneElement(child, tabProps); })) !== null && _a !== void 0 ? _a : []; const tabRows = splitToChunks(childrenWithProps, rows).map((tabs, i) => ({ key: i, tabs })); const currentlySelectedRowIndex = tabRows.findIndex((tabRow) => tabRow.tabs.some((tab) => tab.props.selected)); tabRows.push(tabRows.splice(currentlySelectedRowIndex, 1)[0]); return tabRows; }, [children, onChange, rows, value]); return React__default["default"].createElement(StyledTabs, { ...otherProps, isMultiRow: rows > 1, role: "tablist", ref }, tabRowsToRender.map((row) => React__default["default"].createElement(Row, { key: row.key }, row.tabs))); }); Tabs.displayName = "Tabs"; exports.Tab = Tab.Tab; exports.TabBody = TabBody.TabBody; exports.Tabs = Tabs;