UNPKG

@redocly/theme

Version:

Shared UI components lib

163 lines (161 loc) 7.9 kB
"use strict"; 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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodePanelHeader = CodePanelHeader; const react_1 = __importStar(require("react")); const styled_components_1 = __importStar(require("styled-components")); const hooks_1 = require("../../../core/hooks"); const OverflowMenuVerticalIcon_1 = require("../../../icons/OverflowMenuVerticalIcon/OverflowMenuVerticalIcon"); const Dropdown_1 = require("../../../components/Dropdown/Dropdown"); const DropdownMenu_1 = require("../../../components/Dropdown/DropdownMenu"); const DropdownMenuItem_1 = require("../../../components/Dropdown/DropdownMenuItem"); const DownloadIcon_1 = require("../../../icons/DownloadIcon/DownloadIcon"); const Button_1 = require("../../../components/Button/Button"); function CodePanelHeader({ files, handleTabSwitch, activeTabName, onDownloadCode, }) { const renderableFiles = (0, hooks_1.useRenderableFiles)(files); const { useTranslate } = (0, hooks_1.useThemeHooks)(); const { translate } = useTranslate(); const tabRefs = (0, react_1.useRef)([]); const tabsWrapperRef = (0, react_1.useRef)(null); const [hiddenFiles, setHiddenFiles] = (0, react_1.useState)([]); (0, react_1.useEffect)(() => { const activeTab = tabRefs.current.find((tab) => (tab === null || tab === void 0 ? void 0 : tab.dataset.name) === activeTabName); const tabsWrapper = tabsWrapperRef.current; if (activeTab && tabsWrapper) { const { left: wrapperLeft, right: wrapperRight } = tabsWrapper.getBoundingClientRect(); const { left: tabLeft, right: tabRight } = activeTab.getBoundingClientRect(); const tabHidden = tabLeft < wrapperLeft || tabRight > wrapperRight; if (tabHidden) { activeTab.scrollIntoView({ block: 'nearest', inline: 'nearest' }); } } const calculateHiddenFiles = () => { if (!tabsWrapperRef.current) return; const { left: wrapperLeft, right: wrapperRight } = tabsWrapperRef.current.getBoundingClientRect(); const hidden = []; for (let i = 0; i < renderableFiles.length; i++) { const tab = tabRefs.current[i]; if (!tab) continue; const { left: tabLeft, right: tabRight } = tab.getBoundingClientRect(); const visible = tabLeft >= wrapperLeft && tabRight <= wrapperRight; if (!visible) { hidden.push(renderableFiles[i]); } } setHiddenFiles(hidden); }; calculateHiddenFiles(); window.addEventListener('resize', calculateHiddenFiles); return () => window.removeEventListener('resize', calculateHiddenFiles); }, [activeTabName, files, renderableFiles]); return (react_1.default.createElement(CodePanelHeaderWrapper, { "data-component-name": "Markdoc/CodeWalkthrough/CodePanelHeader" }, react_1.default.createElement(TabsWrapper, { ref: tabsWrapperRef }, react_1.default.createElement(Tabs, null, renderableFiles.map(({ path, basename, FileIcon, parentFolder, isNameDuplicate, inRootDir }, i) => { return (react_1.default.createElement(Tab, { ref: (el) => { tabRefs.current[i] = el; }, "data-name": path, active: path === activeTabName, key: i, onClick: () => handleTabSwitch(path) }, react_1.default.createElement(FileIcon, null), basename, isNameDuplicate && !inRootDir ? react_1.default.createElement(Dirname, null, parentFolder) : null)); })), react_1.default.createElement(Gradient, null)), react_1.default.createElement(ActionBar, null, hiddenFiles.length ? (react_1.default.createElement(Dropdown_1.Dropdown, { trigger: react_1.default.createElement(StyledOverflowMenuVerticalIcon, { size: "14px" }), alignment: "end" }, react_1.default.createElement(StyledDropdownMenu, null, hiddenFiles.map(({ path, basename, FileIcon, isNameDuplicate, inRootDir, parentFolder }, i) => { return (react_1.default.createElement(DropdownMenuItem_1.DropdownMenuItem, { active: path === activeTabName, key: i, onAction: () => handleTabSwitch(path), prefix: react_1.default.createElement(FileIcon, null), content: isNameDuplicate && !inRootDir ? `${parentFolder}/${basename}` : basename })); })))) : null, react_1.default.createElement(Button_1.Button, { variant: "text", icon: react_1.default.createElement(DownloadIcon_1.DownloadIcon, null), onClick: onDownloadCode, size: "small" }, translate('codeWalkthrough.download', 'Download'))))); } const CodePanelHeaderWrapper = styled_components_1.default.div ` display: flex; align-items: center; justify-content: space-between; padding: var(--spacing-xs) var(--spacing-xs) var(--spacing-xs) var(--spacing-sm); max-width: 100%; `; const TabsWrapper = styled_components_1.default.div ` display: flex; position: relative; min-width: 0; `; const Gradient = styled_components_1.default.div ` position: absolute; right: 0; width: var(--spacing-base); height: var(--code-panel-header-height); background: var(--bg-raised-gradient); `; const Tabs = styled_components_1.default.div ` display: flex; overflow-x: hidden; padding-right: var(--spacing-base); &::-webkit-scrollbar { display: none; } `; const Dirname = styled_components_1.default.span ` font-size: var(--font-size-sm); color: var(--text-color-description); `; const ActionBar = styled_components_1.default.div ` display: flex; `; const Tab = styled_components_1.default.button ` display: inline-flex; align-items: center; padding: 0 var(--spacing-sm); background-color: transparent; height: var(--code-panel-header-height); border-radius: var(--border-radius); cursor: pointer; gap: var(--spacing-xs); color: var(--text-color-secondary); white-space: nowrap; scroll-margin-right: var(--spacing-base); ${({ 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); } `} `; // code-walk-todo: figure it our why we could not do it differently const StyledDropdownMenu = (0, styled_components_1.default)(DropdownMenu_1.DropdownMenu) ` --md-list-left-padding: var(--dropdown-menu-padding); `; const StyledOverflowMenuVerticalIcon = (0, styled_components_1.default)(OverflowMenuVerticalIcon_1.OverflowMenuVerticalIcon) ` && { outline: none; box-sizing: content-box; padding: 5px; } `; //# sourceMappingURL=CodePanelHeader.js.map