UNPKG

@vimeo/iris

Version:
98 lines (95 loc) 4.93 kB
import { b as __rest, c as __assign, _ as __read } from '../../tslib.es6-7f0e734f.js'; import React__default, { useRef, useState, useEffect } from 'react'; import { Header, Wrapper, ItemStyled, Toggle, Action, SubMenu } from './Menu.style.esm.js'; import { ChevronDown } from '../../icons/ui/ChevronDown.esm.js'; import { Focus } from '../../utils/css.esm.js'; import 'styled-components'; import 'polished'; import '../../tokens/core.esm.js'; import '../../tokens/color/index.esm.js'; import '../../tokens/color/background/background.esm.js'; import '../../tokens/util/readToken.esm.js'; import '../../color/colors.esm.js'; import '../../tokens/util/clamp.esm.js'; import '../../tokens/color/format/format.esm.js'; import '../../tokens/color/format/primary.esm.js'; import '../../tokens/color/format/secondary.esm.js'; import '../../tokens/color/format/tertiary.esm.js'; import '../../tokens/color/rainbow/rainbow.esm.js'; import '../../tokens/color/rainbow/conic/index.esm.js'; import '../../tokens/color/rainbow/conic/sm.esm.js'; import '../../tokens/color/rainbow/conic/xl.esm.js'; import '../../tokens/color/rainbow/linear/index.esm.js'; import '../../tokens/color/rainbow/linear/sm.esm.js'; import '../../tokens/color/rainbow/linear/xl.esm.js'; import '../../tokens/color/livestream/livestream.esm.js'; import '../../tokens/color/status/status.esm.js'; import '../../tokens/color/status/caution.esm.js'; import '../../tokens/color/status/negative.esm.js'; import '../../tokens/color/status/positive.esm.js'; import '../../tokens/color/stroke/stroke.esm.js'; import '../../tokens/color/surface/surface.esm.js'; import '../../tokens/color/text/text.esm.js'; import '../../tokens/util/round.esm.js'; import '../../tokens/color/upsell/upsell.esm.js'; import '../../tokens/color/upsell/sm.esm.js'; import '../../tokens/color/upsell/xl.esm.js'; import '../../tokens/color/upsell/new.esm.js'; import '../../tokens/edge/edge.esm.js'; import '../../tokens/space/space.esm.js'; import '../../tokens/typography/index.esm.js'; import '../../tokens/typography/size/size.esm.js'; function Section(_a) { var children = _a.children, _b = _a.title, title = _b === void 0 ? null : _b, props = __rest(_a, ["children", "title"]); return (React__default.createElement("div", __assign({}, props), title && React__default.createElement(Header, null, title), children)); } function Item(_a) { var action = _a.action, active = _a.active, children = _a.children, href = _a.href, _b = _a.toggle, toggle = _b === void 0 ? false : _b, icon = _a.icon, /** Function called if item is toggled open */ onOpen = _a.onOpen, /** Function called if item is toggled close */ onClose = _a.onClose, props = __rest(_a, ["action", "active", "children", "href", "toggle", "icon", "onOpen", "onClose"]); var init = useRef(true); var _c = __read(useState(!toggle), 2), open = _c[0], setOpen = _c[1]; useEffect(function () { // Prevent calling onClose on mount if (init.current) { init.current = false; } else if (open) { onOpen === null || onOpen === void 0 ? void 0 : onOpen(); } else { onClose === null || onClose === void 0 ? void 0 : onClose(); } }, [onClose, onOpen, open]); var doToggle = function () { return toggle && setOpen(function (open) { return !open; }); }; var doAction = function (e) { action.onClick && action.onClick(e); }; var simpleKids = typeof children === 'object' && !children.props ? children.flat().filter(function (child) { return typeof child === 'string'; }) : children; var complexKids = typeof children === 'object' && !children.props && children.flat().filter(function (child) { return typeof child !== 'string'; }); if (complexKids.length === 0) complexKids = false; var link = simpleKids && href; var $height = open && complexKids.length; return (React__default.createElement(Wrapper, { active: active, "$height": $height }, React__default.createElement(ItemStyled, __assign({ as: link ? 'a' : 'button', href: href, onClick: doToggle }, props), toggle && (React__default.createElement(Toggle, { open: open }, React__default.createElement(ChevronDown, null), React__default.createElement(Focus, { parent: Toggle, isKeyboardOnly: true }))), action && (React__default.createElement(Action, { onClick: doAction }, action.icon, React__default.createElement(Focus, { parent: Action, isKeyboardOnly: true }))), icon && icon, simpleKids, React__default.createElement(Focus, { parent: ItemStyled, isKeyboardOnly: true })), open && complexKids && (React__default.createElement(SubMenu, { total: complexKids.length }, complexKids)))); } export { Item, Section };