react-responsive-menu-hook
Version:
Responsive menu using react hooks
1 lines • 11.7 kB
Source Map (JSON)
{"version":3,"file":"react-responsive-menu-hook.min.mjs","sources":["../node_modules/classnames/index.js","../node_modules/warning/warning.js","../src/index.js"],"sourcesContent":["/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n","import React from 'react'\r\nimport classnames from 'classnames'\r\nimport warning from 'warning'\r\n\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\n\r\nconst REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb\r\n\r\nconst isFragment = object => object.type === REACT_FRAGMENT_TYPE\r\n\r\nconst styles = {\r\n menuWrapper: {\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n}\r\n\r\nconst ReactResponsiveMenu = ({ children }) => {\r\n const navRef = React.useRef(null)\r\n\r\n const [menuItems, setMenuItems] = React.useState({})\r\n const [open, setOpen] = React.useState(false)\r\n\r\n const toggle = React.useCallback(value => setOpen(value), [setOpen])\r\n\r\n const observe = React.useCallback(\r\n elements => {\r\n const updatedEntries = {}\r\n elements.forEach(element => {\r\n const targetid = element.target.dataset.targetid\r\n if (element.isIntersecting) {\r\n updatedEntries[targetid] = true\r\n } else {\r\n updatedEntries[targetid] = false\r\n }\r\n })\r\n setMenuItems(prev => ({\r\n ...prev,\r\n ...updatedEntries,\r\n }))\r\n },\r\n [setMenuItems]\r\n )\r\n\r\n const attachObserver = React.useCallback(() => {\r\n const observer = new IntersectionObserver(observe, {\r\n root: navRef.current,\r\n threshold: 1,\r\n })\r\n\r\n Array.from(navRef.current.children).forEach(\r\n item => item.dataset.targetid && observer.observe(item)\r\n )\r\n return observer\r\n }, [])\r\n\r\n const handleClickOutside = React.useCallback(\r\n ({ target }) =>\r\n navRef &&\r\n navRef.current &&\r\n !navRef.current.contains(target) &&\r\n toggle(false),\r\n [toggle]\r\n )\r\n\r\n const showEllipsis = React.useMemo(\r\n () => Object.values(menuItems).some(v => v === false),\r\n [menuItems]\r\n )\r\n\r\n const overFlowMenu = child => {\r\n if (\r\n !child ||\r\n !child.props['data-targetid'] ||\r\n menuItems[child.props['data-targetid']]\r\n )\r\n return null\r\n return (\r\n <React.Fragment key={child}>\r\n {React.cloneElement(child, {\r\n onClick: () => toggle(false),\r\n })}\r\n </React.Fragment>\r\n )\r\n }\r\n\r\n const getMenuProps = menuType => ({ id, ...props } = {}) => ({\r\n 'data-targetid': id,\r\n className: classnames({\r\n visible:\r\n (menuType === 'menu' && !!menuItems[id]) ||\r\n (menuType === 'overflowMenu' && !menuItems[id]),\r\n inVisible:\r\n (menuType === 'menu' && !menuItems[id]) ||\r\n (menuType === 'overflowMenu' && !!menuItems[id]),\r\n }),\r\n onClick: () => menuType === 'overflowMenu' && toggle(false),\r\n ...props,\r\n })\r\n\r\n const flattenChildren = React.useCallback(\r\n children =>\r\n isFragment(children)\r\n ? children.props.children.filter(\r\n child => child && child.props['data-targetid']\r\n )\r\n : children,\r\n []\r\n )\r\n\r\n const childProps = {\r\n getMenuProps: getMenuProps('menu'),\r\n showEllipsis,\r\n children: React.Children.map(\r\n flattenChildren(\r\n children({\r\n getMenuProps: getMenuProps('overflowMenu'),\r\n })\r\n ),\r\n overFlowMenu\r\n ),\r\n open,\r\n toggle,\r\n }\r\n\r\n React.useEffect(() => {\r\n const observer = attachObserver()\r\n document.addEventListener('click', handleClickOutside)\r\n return () => {\r\n observer.disconnect()\r\n document.removeEventListener('click', handleClickOutside)\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n warning(\r\n isFragment(children(childProps)),\r\n `Menu should wrapped inside fragment`\r\n )\r\n }, [])\r\n\r\n return (\r\n <div ref={navRef} style={styles.menuWrapper}>\r\n {children(childProps)}\r\n </div>\r\n )\r\n}\r\n\r\nexport default React.memo(ReactResponsiveMenu)\r\n"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","key","call","join","module","exports","default","window","warning","process","env","NODE_ENV","printWarning","format","args","len","argIndex","message","replace","console","error","Error","x","condition","undefined","concat","REACT_FRAGMENT_TYPE","Symbol","for","isFragment","object","type","styles","menuWrapper","display","overflow","ReactResponsiveMenu","children","navRef","React","useRef","useState","menuItems","setMenuItems","open","setOpen","toggle","useCallback","value","observe","elements","updatedEntries","forEach","element","targetid","target","dataset","isIntersecting","prev","attachObserver","observer","IntersectionObserver","root","current","threshold","from","item","handleClickOutside","contains","showEllipsis","useMemo","values","some","v","getMenuProps","menuType","id","props","className","classnames","visible","inVisible","onClick","flattenChildren","filter","child","childProps","Children","map","Fragment","cloneElement","useEffect","document","addEventListener","disconnect","removeEventListener","ref","style","memo"],"mappings":"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"}