@cimpress/react-components
Version:
React components to support the MCP styleguide
164 lines (162 loc) • 6.21 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TabCard = void 0;
const react_1 = __importStar(require("react"));
const css_1 = require("@emotion/css");
const cvar_1 = __importDefault(require("./theme/cvar"));
const cardTabNavCss = (0, css_1.css) `
// override for docusaurus css
li + li {
margin: 0;
}
border-radius: inherit;
list-style: none;
padding: 0;
display: flex;
justify-content: space-between;
`;
const navLinkCss = (0, css_1.css) `
color: ${(0, cvar_1.default)('color-tabcard-text-selected')};
&:hover {
background: ${(0, cvar_1.default)('color-hover')};
}
`;
const navItemActiveCss = (0, css_1.css) `
background: ${(0, cvar_1.default)('color-background')};
color: ${(0, cvar_1.default)('color-tabcard-text-selected')};
> a {
${navLinkCss}
}
`;
const navItemCss = (0, css_1.css) `
background-color: ${(0, cvar_1.default)('color-nav-item-background')};
border-right: 1px solid ${(0, cvar_1.default)('color-background')};
display: inline-block;
flex-basis: 0;
flex-grow: 1;
text-align: center;
cursor: pointer;
> a {
color: ${(0, cvar_1.default)('color-nav-text')};
position: relative;
display: flex;
flex-direction: column;
flex: 1 1 auto;
padding: ${(0, cvar_1.default)('spacing-8')} ${(0, cvar_1.default)('spacing-16')};
&:hover {
text-decoration: none;
}
}
&.active {
${navItemActiveCss}
}
&:hover {
background-color: ${(0, cvar_1.default)('color-hover')};
color: ${(0, cvar_1.default)('color-text-interactive')};
}
&:first-of-type {
border-top-left-radius: inherit;
}
&:last-of-type {
border-top-right-radius: inherit;
border-right: none;
}
`;
const cardFooterCss = (0, css_1.css) `
padding: ${(0, cvar_1.default)('spacing-8')} ${(0, cvar_1.default)('spacing-16')};
background-color: ${(0, cvar_1.default)('color-background-light')};
border-top: 1px solid ${(0, cvar_1.default)('color-border-light')};
text-align: left;
cursor: default;
`;
const cardBlockCss = (0, css_1.css) `
position: relative;
display: flex;
flex-direction: column;
background-color: ${(0, cvar_1.default)('color-background')};
flex: 1 1 auto;
padding: ${(0, cvar_1.default)('spacing-16')};
text-align: left;
cursor: default;
`;
const tabCardCss = (0, css_1.css) `
border: 1px solid ${(0, cvar_1.default)('color-border-default')};
border-radius: ${(0, cvar_1.default)('spacing-4')};
width: 100%;
`;
/**
* A Component implementing a card with internal tabs in the header
*/
const TabCard = (_a) => {
var { selectedIndex, onSelect = () => { }, tabs = [] } = _a, rest = __rest(_a, ["selectedIndex", "onSelect", "tabs"]);
const initialSelectedIndex = selectedIndex != null && selectedIndex >= 0 ? selectedIndex : 0;
const [localSelectedIndex, setLocalSelectedIndex] = (0, react_1.useState)(initialSelectedIndex);
const onTabSelect = (e, selectedKey) => {
e.preventDefault();
setLocalSelectedIndex(selectedKey);
if (onSelect) {
onSelect(e, selectedKey);
}
};
(0, react_1.useEffect)(() => {
if (selectedIndex != null && selectedIndex >= 0) {
setLocalSelectedIndex(selectedIndex);
}
}, [setLocalSelectedIndex, selectedIndex]);
const renderTab = (tabInfo, tabIndex) => {
var _a;
return (react_1.default.createElement("li", { key: tabIndex, className: (0, css_1.cx)(navItemCss, { active: tabIndex === localSelectedIndex }) },
react_1.default.createElement("a", { href: (_a = tabInfo.href) !== null && _a !== void 0 ? _a : undefined, className: navLinkCss, onClick: e => onTabSelect(e, tabIndex) },
react_1.default.createElement("strong", null, tabInfo.name))));
};
const renderTabNav = () => react_1.default.createElement("ul", { className: cardTabNavCss }, tabs.map(renderTab));
const renderFooter = () => {
if (tabs[localSelectedIndex].footer) {
return react_1.default.createElement("div", { className: cardFooterCss }, tabs[localSelectedIndex].footer);
}
return null;
};
return (react_1.default.createElement("div", Object.assign({ className: (0, css_1.cx)('crc-tab-card', tabCardCss) }, rest),
react_1.default.createElement("div", null, renderTabNav()),
react_1.default.createElement("div", { className: cardBlockCss }, tabs[localSelectedIndex].block),
renderFooter()));
};
exports.TabCard = TabCard;
//# sourceMappingURL=TabCard.js.map