@redocly/theme
Version:
Shared UI components lib
143 lines (138 loc) • 5.48 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CodeBlockTabs = CodeBlockTabs;
const react_1 = __importStar(require("react"));
const styled_components_1 = __importStar(require("styled-components"));
const hooks_1 = require("../../core/hooks");
const Button_1 = require("../../components/Button/Button");
const ChevronLeftIcon_1 = require("../../icons/ChevronLeftIcon/ChevronLeftIcon");
const ChevronRightIcon_1 = require("../../icons/ChevronRightIcon/ChevronRightIcon");
const utils_1 = require("../../core/utils");
function CodeBlockTabs({ tabs }) {
const containerRef = (0, react_1.useRef)(null);
const tabRefs = (0, react_1.useRef)([]);
const { showControls, handlePrevTab, handleNextTab } = (0, hooks_1.useCodeBlockTabsControls)({
tabs,
containerRef,
tabRefs,
});
(0, react_1.useEffect)(() => {
const activeTab = tabRefs.current.find((tab) => (tab === null || tab === void 0 ? void 0 : tab.dataset.id) === tabs.value);
if (activeTab) {
activeTab.scrollIntoView({ block: 'nearest', inline: 'center' });
}
}, [tabs.value]);
return (react_1.default.createElement(CodeBlockTabsWrapper, { ref: containerRef, "data-component-name": "CodeBlock/CodeBlockTabs" },
react_1.default.createElement(ShadowWrapper, null,
react_1.default.createElement(Tabs, null, tabs.items.map((item, i) => {
var _a;
const { name, lang, id } = item;
const ext = (_a = name.match(/\.([^.]+)$/)) === null || _a === void 0 ? void 0 : _a[1];
const fileIcon = lang
? (0, utils_1.getFileIconByLanguage)(lang)
: ext
? (0, utils_1.getFileIconByExt)(ext)
: null;
return (react_1.default.createElement(Tab, { ref: (el) => {
tabRefs.current[i] = el;
}, "data-name": name, active: id === tabs.value, key: id, onClick: () => tabs.onChange(id) },
fileIcon,
name));
}))),
showControls && (react_1.default.createElement(Controls, null,
react_1.default.createElement(ControlButton, { size: "small", onClick: handlePrevTab, "data-testid": "prev-button" },
react_1.default.createElement(ChevronLeftIcon_1.ChevronLeftIcon, null)),
react_1.default.createElement(ControlButton, { size: "small", onClick: handleNextTab, "data-testid": "next-button" },
react_1.default.createElement(ChevronRightIcon_1.ChevronRightIcon, null))))));
}
const CodeBlockTabsWrapper = styled_components_1.default.div `
display: flex;
overflow: hidden;
`;
const Controls = styled_components_1.default.div `
display: flex;
gap: calc(var(--spacing-xxs) / 2);
`;
const ControlButton = (0, styled_components_1.default)(Button_1.Button) `
padding: 0 calc(var(--spacing-xxs) / 2);
& + & {
margin-left: 0;
}
`;
const ShadowWrapper = styled_components_1.default.div `
position: relative;
overflow: hidden;
:after {
position: absolute;
content: '';
width: 16px;
height: 100%;
right: 0;
top: 0;
background: var(--bg-raised-gradient);
}
`;
const Tabs = styled_components_1.default.div `
display: flex;
overflow-x: auto;
padding-right: var(--spacing-base);
&::-webkit-scrollbar {
display: none;
}
`;
const Tab = styled_components_1.default.button `
--icon-size: 18px;
display: inline-flex;
align-items: center;
padding: 0 var(--spacing-sm);
background-color: transparent;
height: 24px;
border-radius: var(--border-radius);
cursor: pointer;
gap: var(--spacing-xs);
color: var(--text-color-secondary);
${({ active }) => active
? (0, styled_components_1.css) `
color: var(--text-color-primary);
background-color: var(--tab-bg-color-filled);
`
: (0, styled_components_1.css) `
&:hover {
color: var(--text-color-primary);
}
`}
`;
//# sourceMappingURL=CodeBlockTabs.js.map