@redocly/portal-legacy-ui
Version:
Library of legacy portal UI components
113 lines • 4.94 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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Dropdown = Dropdown;
const react_1 = __importStar(require("react"));
const styled_components_1 = __importDefault(require("styled-components"));
const react_router_dom_1 = require("react-router-dom");
const Icon = () => (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
react_1.default.createElement("polyline", { points: "6 9 12 15 18 9" })));
const DropDownContainer = styled_components_1.default.div `
position: relative;
padding: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 4);
`;
const DropDownHeader = styled_components_1.default.div `
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 10px;
border-radius: 4px;
border: 1px solid var(--border-color-primary);
font-weight: 600;
color: var(--text-color-primary);
background: var(--bg-color);
`;
const DropDownList = styled_components_1.default.div `
position: absolute;
background: var(--bg-color);
margin: 2px 20px 0 20px;
padding: 0;
border-radius: 4px;
border: 1px solid var(--border-color-primary);
z-index: var(--z-index-popover);
left: 0;
right: 0;
`;
const IconWrapper = styled_components_1.default.span `
transition: transform 0.2s;
display: inline-block;
font-size: 0;
&.active {
transform: rotate(-180deg);
}
`;
const ListItem = styled_components_1.default.div `
background-color: var(--bg-color-raised);
padding: 0.4em 10px;
font-size: 1em;
color: var(--text-color-secondary);
cursor: pointer;
&:hover {
background-color: var(--bg-color-tonal);
}
&.active {
background-color: var(--bg-color-tonal);
}
`;
const DropDownLink = (0, styled_components_1.default)(react_router_dom_1.Link) `
display: block;
text-decoration: none;
color: var(--text-color-secondary);
`;
function Dropdown({ items, activeItem }) {
const ref = (0, react_1.useRef)(null);
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
const toggling = () => setIsOpen(!isOpen);
(0, react_1.useEffect)(() => {
const checkIfClickedOutside = (e) => {
if (!(e.target instanceof HTMLElement)) {
return;
}
if (isOpen && ref.current && !ref.current.contains(e.target)) {
setIsOpen(false);
}
};
document.addEventListener('mousedown', checkIfClickedOutside);
return () => {
document.removeEventListener('mousedown', checkIfClickedOutside);
};
}, [isOpen]);
return (react_1.default.createElement(DropDownContainer, { ref: ref, "data-component-name": "ui/Dropdown" },
react_1.default.createElement(DropDownHeader, { onClick: toggling },
(activeItem === null || activeItem === void 0 ? void 0 : activeItem.label) || activeItem.version,
react_1.default.createElement(IconWrapper, { className: isOpen ? 'active' : '' },
react_1.default.createElement(Icon, null))),
isOpen && (react_1.default.createElement(DropDownList, null, items.map((item) => (react_1.default.createElement(ListItem, { className: activeItem.version === item.version ? 'active' : '', onClick: toggling, key: (item === null || item === void 0 ? void 0 : item.link) + (item === null || item === void 0 ? void 0 : item.version) },
react_1.default.createElement(DropDownLink, { to: (item === null || item === void 0 ? void 0 : item.link) || '#' }, (item === null || item === void 0 ? void 0 : item.label) || item.version))))))));
}
//# sourceMappingURL=Dropdown.js.map