{"version":3,"sources":["webpack:///./node_modules/lodash/matchesProperty.js","webpack:///./node_modules/lodash/fp/propEq.js","webpack:///./node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js","webpack:///./node_modules/gatsby-theme-docz/src/hooks/useDbQuery.js","webpack:///./node_modules/gatsby-theme-docz/src/wrapper.js","webpack:///./node_modules/antd/es/_util/throttleByAnimationFrame.js","webpack:///./node_modules/antd/es/affix/utils.js","webpack:///./node_modules/antd/es/affix/index.js","webpack:///./node_modules/antd/es/_util/getScroll.js","webpack:///./node_modules/antd/es/_util/easings.js","webpack:///./node_modules/antd/es/_util/scrollTo.js","webpack:///./node_modules/antd/es/anchor/context.js","webpack:///./node_modules/antd/es/anchor/Anchor.js","webpack:///./node_modules/antd/es/anchor/AnchorLink.js","webpack:///./node_modules/antd/es/anchor/index.js","webpack:///./src/components/AnchorNavigator.tsx","webpack:///./src/components/next.tsx","webpack:///./src/gatsby-theme-docz/index.tsx","webpack:///./node_modules/gatsby-theme-docz/src/base/Seo.js","webpack:///./node_modules/gatsby-theme-docz/src/base/Layout.js","webpack:///./node_modules/lodash/fp/matchesProperty.js","webpack:///./node_modules/rc-resize-observer/es/index.js"],"names":["baseClone","baseMatchesProperty","module","exports","path","srcValue","_defineProperty","obj","key","Object","value","enumerable","configurable","writable","_extends","i","arguments","source","target","ownKeys","object","keys","symbols","_objectSpread2","_objectWithoutProperties","sourceKeys","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","MDXContext","React","withMDXComponents","Component","allComponents","useMDXComponents","props","components","contextComponents","isFunction","MDXProvider","DEFAULTS","inlineCode","wrapper","_ref","children","MDXCreateElement","propComponents","mdxType","originalType","parentName","etc","type","concat","ref","createElement","args","argsLength","createElementArgArray","Array","newProps","hasOwnProperty","useDbQuery","data","useStaticQuery","JSON","console","Wrapper","throttleByAnimationFrameDecorator","descriptor","fn","definingProperty","get","this","prototype","boundFn","requestId","later","apply","throttled","_len","length","_key","cancel","throttleByAnimationFrame","bind","defineProperty","getTargetRect","window","getBoundingClientRect","top","bottom","innerHeight","getFixedTop","placeholderReact","targetRect","offsetTop","undefined","getFixedBottom","offsetBottom","TRIGGER_EVENTS","observerEntities","addObserveTarget","affix","entity","find","item","affixList","push","eventHandlers","forEach","eventName","addEventListener","targetAffix","lazyUpdatePosition","removeObserveTarget","observerEntity","oriObserverEntity","hasAffix","some","filter","handler","remove","AffixStatus","__decorate","decorators","desc","d","c","r","getOwnPropertyDescriptor","Reflect","decorate","getDefaultTarget","_React$Component","Affix","_super","_this","state","status","None","lastAffix","prevTarget","getOffsetTop","getOffsetBottom","savePlaceholderNode","node","placeholderNode","saveFixedNode","fixedNode","measure","_this$state","onChange","targetFunc","getTargetFunc","Prepare","targetNode","newState","fixedTop","fixedBottom","affixStyle","position","width","height","placeholderStyle","setState","prepareMeasure","render","getPrefixCls","context","_this$state2","_this$props","prefixCls","className","onResize","updatePosition","style","getTargetContainer","_this2","timeout","setTimeout","prevProps","newTarget","clearTimeout","contextType","isWindow","getScroll","method","result","Document","documentElement","ownerDocument","easeInOutCubic","t","b","cc","scrollTo","y","options","_options$getContainer","getContainer","callback","_options$duration","duration","container","scrollTop","startTime","Date","now","frameFunc","time","nextScrollTop","pageXOffset","HTMLDocument","constructor","name","getDefaultContainer","element","getClientRects","rect","clientTop","sharpMatcherRegx","Anchor","activeLink","links","registerLink","link","includes","unregisterLink","index","indexOf","splice","handleScrollTo","targetOffset","setCurrentActiveLink","sharpLinkMatch","exec","targetElement","document","getElementById","animating","saveInkNode","inkNode","handleScroll","_this$props2","bounds","currentActiveLink","getCurrentAnchor","updateInk","linkNode","getElementsByClassName","clientHeight","_this$context","direction","_this$props3","customizePrefixCls","_this$props3$classNam","showInkInFixed","inkClass","visible","wrapperClass","anchorClass","fixed","wrapperStyle","maxHeight","anchorContent","Provider","onClick","scrollContainer","scrollEvent","currentContainer","linkSections","toString","maxSection","reduce","prev","curr","defaultProps","AnchorLink","handleClick","e","href","title","renderAnchorLink","active","wrapperClassName","titleClassName","_ref2","prevHref","Link","anchorNavStyle","css","mq","HeaderNav","menus","useMenus","headings","getActiveMenuItem","map","slug","nextButtons","getPreviousAndNextUrls","prevUrl","nextUrl","docLayout","theme","config","useConfig","AnchorNavigator","SEO","description","lang","meta","keywords","initialTitle","db","metaDescription","titleTemplate","htmlAttributes","content","property","Route","entry","isTransclusion","useComponents","NotFound","Layout","doc","ctx","isIndex","eqIndex","filepath","findEntry","entries","includesTransclusion","currentEntry","func","convert","placeholder","enumerableOnly","getOwnPropertySymbols","sym","_objectSpread","getOwnPropertyDescriptors","defineProperties","_createSuper","Derived","hasNativeReflectConstruct","construct","sham","Proxy","call","_isNativeReflectConstruct","Super","NewTarget","ReactResizeObserver","resizeObserver","childNode","currentElement","_target$getBoundingCl","offsetWidth","offsetHeight","fixedWidth","Math","floor","fixedHeight","size","setChildNode","onComponentUpdated","destroyObserver","disabled","observe","disconnect","childNodes","displayName"],"mappings":"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","file":"d2a02eb96fd6e6ba477a053ef6c83ea3a1914b64-19fd85e989a1015b9974.js","sourcesContent":["var baseClone = require('./_baseClone'),\n    baseMatchesProperty = require('./_baseMatchesProperty');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n *   { 'a': 1, 'b': 2, 'c': 3 },\n *   { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n */\nfunction matchesProperty(path, srcValue) {\n  return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n}\n\nmodule.exports = matchesProperty;\n","module.exports = require('./matchesProperty');\n","import React from 'react';\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\nvar isFunction = function isFunction(obj) {\n  return typeof obj === 'function';\n};\n\nvar MDXContext = /*#__PURE__*/React.createContext({});\nvar withMDXComponents = function withMDXComponents(Component) {\n  return function (props) {\n    var allComponents = useMDXComponents(props.components);\n    return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n      components: allComponents\n    }));\n  };\n};\nvar useMDXComponents = function useMDXComponents(components) {\n  var contextComponents = React.useContext(MDXContext);\n  var allComponents = contextComponents;\n\n  if (components) {\n    allComponents = isFunction(components) ? components(contextComponents) : _objectSpread2(_objectSpread2({}, contextComponents), components);\n  }\n\n  return allComponents;\n};\nvar MDXProvider = function MDXProvider(props) {\n  var allComponents = useMDXComponents(props.components);\n  return /*#__PURE__*/React.createElement(MDXContext.Provider, {\n    value: allComponents\n  }, props.children);\n};\n\nvar TYPE_PROP_NAME = 'mdxType';\nvar DEFAULTS = {\n  inlineCode: 'code',\n  wrapper: function wrapper(_ref) {\n    var children = _ref.children;\n    return /*#__PURE__*/React.createElement(React.Fragment, {}, children);\n  }\n};\nvar MDXCreateElement = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var propComponents = props.components,\n      mdxType = props.mdxType,\n      originalType = props.originalType,\n      parentName = props.parentName,\n      etc = _objectWithoutProperties(props, [\"components\", \"mdxType\", \"originalType\", \"parentName\"]);\n\n  var components = useMDXComponents(propComponents);\n  var type = mdxType;\n  var Component = components[\"\".concat(parentName, \".\").concat(type)] || components[type] || DEFAULTS[type] || originalType;\n\n  if (propComponents) {\n    return /*#__PURE__*/React.createElement(Component, _objectSpread2(_objectSpread2({\n      ref: ref\n    }, etc), {}, {\n      components: propComponents\n    }));\n  }\n\n  return /*#__PURE__*/React.createElement(Component, _objectSpread2({\n    ref: ref\n  }, etc));\n});\nMDXCreateElement.displayName = 'MDXCreateElement';\nfunction createElement (type, props) {\n  var args = arguments;\n  var mdxType = props && props.mdxType;\n\n  if (typeof type === 'string' || mdxType) {\n    var argsLength = args.length;\n    var createElementArgArray = new Array(argsLength);\n    createElementArgArray[0] = MDXCreateElement;\n    var newProps = {};\n\n    for (var key in props) {\n      if (hasOwnProperty.call(props, key)) {\n        newProps[key] = props[key];\n      }\n    }\n\n    newProps.originalType = type;\n    newProps[TYPE_PROP_NAME] = typeof type === 'string' ? type : mdxType;\n    createElementArgArray[1] = newProps;\n\n    for (var i = 2; i < argsLength; i++) {\n      createElementArgArray[i] = args[i];\n    }\n\n    return React.createElement.apply(null, createElementArgArray);\n  }\n\n  return React.createElement.apply(null, args);\n}\n\nexport { MDXContext, MDXProvider, createElement as mdx, useMDXComponents, withMDXComponents };\n","import { useStaticQuery, graphql } from 'gatsby'\n\nexport const useDbQuery = () => {\n  try {\n    const data = useStaticQuery(graphql`\n      query {\n        doczDb {\n          id\n          db\n        }\n      }\n    `)\n\n    return JSON.parse(data.doczDb.db)\n  } catch (err) {\n    console.error(err)\n    console.error('Error when parsing docz database')\n    return {}\n  }\n}\n","import * as React from 'react'\n\nconst Wrapper = ({ children }) => <React.Fragment>{children}</React.Fragment>\nexport default Wrapper\n","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport raf from 'raf';\nexport default function throttleByAnimationFrame(fn) {\n  var requestId;\n\n  var later = function later(args) {\n    return function () {\n      requestId = null;\n      fn.apply(void 0, _toConsumableArray(args));\n    };\n  };\n\n  var throttled = function throttled() {\n    if (requestId == null) {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      requestId = raf(later(args));\n    }\n  };\n\n  throttled.cancel = function () {\n    return raf.cancel(requestId);\n  };\n\n  return throttled;\n}\nexport function throttleByAnimationFrameDecorator() {\n  // eslint-disable-next-line func-names\n  return function (target, key, descriptor) {\n    var fn = descriptor.value;\n    var definingProperty = false;\n    return {\n      configurable: true,\n      get: function get() {\n        // eslint-disable-next-line no-prototype-builtins\n        if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {\n          return fn;\n        }\n\n        var boundFn = throttleByAnimationFrame(fn.bind(this));\n        definingProperty = true;\n        Object.defineProperty(this, key, {\n          value: boundFn,\n          configurable: true,\n          writable: true\n        });\n        definingProperty = false;\n        return boundFn;\n      }\n    };\n  };\n}","import addEventListener from \"rc-util/es/Dom/addEventListener\";\nexport function getTargetRect(target) {\n  return target !== window ? target.getBoundingClientRect() : {\n    top: 0,\n    bottom: window.innerHeight\n  };\n}\nexport function getFixedTop(placeholderReact, targetRect, offsetTop) {\n  if (offsetTop !== undefined && targetRect.top > placeholderReact.top - offsetTop) {\n    return offsetTop + targetRect.top;\n  }\n\n  return undefined;\n}\nexport function getFixedBottom(placeholderReact, targetRect, offsetBottom) {\n  if (offsetBottom !== undefined && targetRect.bottom < placeholderReact.bottom + offsetBottom) {\n    var targetBottomOffset = window.innerHeight - targetRect.bottom;\n    return offsetBottom + targetBottomOffset;\n  }\n\n  return undefined;\n} // ======================== Observer ========================\n\nvar TRIGGER_EVENTS = ['resize', 'scroll', 'touchstart', 'touchmove', 'touchend', 'pageshow', 'load'];\nvar observerEntities = [];\nexport function getObserverEntities() {\n  // Only used in test env. Can be removed if refactor.\n  return observerEntities;\n}\nexport function addObserveTarget(target, affix) {\n  if (!target) return;\n  var entity = observerEntities.find(function (item) {\n    return item.target === target;\n  });\n\n  if (entity) {\n    entity.affixList.push(affix);\n  } else {\n    entity = {\n      target: target,\n      affixList: [affix],\n      eventHandlers: {}\n    };\n    observerEntities.push(entity); // Add listener\n\n    TRIGGER_EVENTS.forEach(function (eventName) {\n      entity.eventHandlers[eventName] = addEventListener(target, eventName, function () {\n        entity.affixList.forEach(function (targetAffix) {\n          targetAffix.lazyUpdatePosition();\n        });\n      });\n    });\n  }\n}\nexport function removeObserveTarget(affix) {\n  var observerEntity = observerEntities.find(function (oriObserverEntity) {\n    var hasAffix = oriObserverEntity.affixList.some(function (item) {\n      return item === affix;\n    });\n\n    if (hasAffix) {\n      oriObserverEntity.affixList = oriObserverEntity.affixList.filter(function (item) {\n        return item !== affix;\n      });\n    }\n\n    return hasAffix;\n  });\n\n  if (observerEntity && observerEntity.affixList.length === 0) {\n    observerEntities = observerEntities.filter(function (item) {\n      return item !== observerEntity;\n    }); // Remove listener\n\n    TRIGGER_EVENTS.forEach(function (eventName) {\n      var handler = observerEntity.eventHandlers[eventName];\n\n      if (handler && handler.remove) {\n        handler.remove();\n      }\n    });\n  }\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/createSuper\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\n\nvar __decorate = this && this.__decorate || function (decorators, target, key, desc) {\n  var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n  if ((typeof Reflect === \"undefined\" ? \"undefined\" : _typeof(Reflect)) === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n    if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  }\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport omit from 'omit.js';\nimport ResizeObserver from 'rc-resize-observer';\nimport { ConfigContext } from '../config-provider';\nimport { throttleByAnimationFrameDecorator } from '../_util/throttleByAnimationFrame';\nimport { addObserveTarget, removeObserveTarget, getTargetRect, getFixedTop, getFixedBottom } from './utils';\n\nfunction getDefaultTarget() {\n  return typeof window !== 'undefined' ? window : null;\n}\n\nvar AffixStatus;\n\n(function (AffixStatus) {\n  AffixStatus[AffixStatus[\"None\"] = 0] = \"None\";\n  AffixStatus[AffixStatus[\"Prepare\"] = 1] = \"Prepare\";\n})(AffixStatus || (AffixStatus = {}));\n\nvar Affix = /*#__PURE__*/function (_React$Component) {\n  _inherits(Affix, _React$Component);\n\n  var _super = _createSuper(Affix);\n\n  function Affix() {\n    var _this;\n\n    _classCallCheck(this, Affix);\n\n    _this = _super.apply(this, arguments);\n    _this.state = {\n      status: AffixStatus.None,\n      lastAffix: false,\n      prevTarget: null\n    };\n\n    _this.getOffsetTop = function () {\n      var offsetBottom = _this.props.offsetBottom;\n      var offsetTop = _this.props.offsetTop;\n\n      if (offsetBottom === undefined && offsetTop === undefined) {\n        offsetTop = 0;\n      }\n\n      return offsetTop;\n    };\n\n    _this.getOffsetBottom = function () {\n      return _this.props.offsetBottom;\n    };\n\n    _this.savePlaceholderNode = function (node) {\n      _this.placeholderNode = node;\n    };\n\n    _this.saveFixedNode = function (node) {\n      _this.fixedNode = node;\n    }; // =================== Measure ===================\n\n\n    _this.measure = function () {\n      var _this$state = _this.state,\n          status = _this$state.status,\n          lastAffix = _this$state.lastAffix;\n      var onChange = _this.props.onChange;\n\n      var targetFunc = _this.getTargetFunc();\n\n      if (status !== AffixStatus.Prepare || !_this.fixedNode || !_this.placeholderNode || !targetFunc) {\n        return;\n      }\n\n      var offsetTop = _this.getOffsetTop();\n\n      var offsetBottom = _this.getOffsetBottom();\n\n      var targetNode = targetFunc();\n\n      if (!targetNode) {\n        return;\n      }\n\n      var newState = {\n        status: AffixStatus.None\n      };\n      var targetRect = getTargetRect(targetNode);\n      var placeholderReact = getTargetRect(_this.placeholderNode);\n      var fixedTop = getFixedTop(placeholderReact, targetRect, offsetTop);\n      var fixedBottom = getFixedBottom(placeholderReact, targetRect, offsetBottom);\n\n      if (fixedTop !== undefined) {\n        newState.affixStyle = {\n          position: 'fixed',\n          top: fixedTop,\n          width: placeholderReact.width,\n          height: placeholderReact.height\n        };\n        newState.placeholderStyle = {\n          width: placeholderReact.width,\n          height: placeholderReact.height\n        };\n      } else if (fixedBottom !== undefined) {\n        newState.affixStyle = {\n          position: 'fixed',\n          bottom: fixedBottom,\n          width: placeholderReact.width,\n          height: placeholderReact.height\n        };\n        newState.placeholderStyle = {\n          width: placeholderReact.width,\n          height: placeholderReact.height\n        };\n      }\n\n      newState.lastAffix = !!newState.affixStyle;\n\n      if (onChange && lastAffix !== newState.lastAffix) {\n        onChange(newState.lastAffix);\n      }\n\n      _this.setState(newState);\n    }; // @ts-ignore TS6133\n\n\n    _this.prepareMeasure = function () {\n      // event param is used before. Keep compatible ts define here.\n      _this.setState({\n        status: AffixStatus.Prepare,\n        affixStyle: undefined,\n        placeholderStyle: undefined\n      }); // Test if `updatePosition` called\n\n\n      if (process.env.NODE_ENV === 'test') {\n        var onTestUpdatePosition = _this.props.onTestUpdatePosition;\n\n        if (onTestUpdatePosition) {\n          onTestUpdatePosition();\n        }\n      }\n    }; // =================== Render ===================\n\n\n    _this.render = function () {\n      var getPrefixCls = _this.context.getPrefixCls;\n      var _this$state2 = _this.state,\n          affixStyle = _this$state2.affixStyle,\n          placeholderStyle = _this$state2.placeholderStyle;\n      var _this$props = _this.props,\n          prefixCls = _this$props.prefixCls,\n          children = _this$props.children;\n      var className = classNames(_defineProperty({}, getPrefixCls('affix', prefixCls), affixStyle));\n      var props = omit(_this.props, ['prefixCls', 'offsetTop', 'offsetBottom', 'target', 'onChange']); // Omit this since `onTestUpdatePosition` only works on test.\n\n      if (process.env.NODE_ENV === 'test') {\n        props = omit(props, ['onTestUpdatePosition']);\n      }\n\n      return /*#__PURE__*/React.createElement(ResizeObserver, {\n        onResize: function onResize() {\n          _this.updatePosition();\n        }\n      }, /*#__PURE__*/React.createElement(\"div\", _extends({}, props, {\n        ref: _this.savePlaceholderNode\n      }), affixStyle && /*#__PURE__*/React.createElement(\"div\", {\n        style: placeholderStyle,\n        \"aria-hidden\": \"true\"\n      }), /*#__PURE__*/React.createElement(\"div\", {\n        className: className,\n        ref: _this.saveFixedNode,\n        style: affixStyle\n      }, /*#__PURE__*/React.createElement(ResizeObserver, {\n        onResize: function onResize() {\n          _this.updatePosition();\n        }\n      }, children))));\n    };\n\n    return _this;\n  }\n\n  _createClass(Affix, [{\n    key: \"getTargetFunc\",\n    value: function getTargetFunc() {\n      var getTargetContainer = this.context.getTargetContainer;\n      var target = this.props.target;\n\n      if (target !== undefined) {\n        return target;\n      }\n\n      return getTargetContainer || getDefaultTarget;\n    } // Event handler\n\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var targetFunc = this.getTargetFunc();\n\n      if (targetFunc) {\n        // [Legacy] Wait for parent component ref has its value.\n        // We should use target as directly element instead of function which makes element check hard.\n        this.timeout = setTimeout(function () {\n          addObserveTarget(targetFunc(), _this2); // Mock Event object.\n\n          _this2.updatePosition();\n        });\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps) {\n      var prevTarget = this.state.prevTarget;\n      var targetFunc = this.getTargetFunc();\n      var newTarget = null;\n\n      if (targetFunc) {\n        newTarget = targetFunc() || null;\n      }\n\n      if (prevTarget !== newTarget) {\n        removeObserveTarget(this);\n\n        if (newTarget) {\n          addObserveTarget(newTarget, this); // Mock Event object.\n\n          this.updatePosition();\n        } // eslint-disable-next-line react/no-did-update-set-state\n\n\n        this.setState({\n          prevTarget: newTarget\n        });\n      }\n\n      if (prevProps.offsetTop !== this.props.offsetTop || prevProps.offsetBottom !== this.props.offsetBottom) {\n        this.updatePosition();\n      }\n\n      this.measure();\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      clearTimeout(this.timeout);\n      removeObserveTarget(this);\n      this.updatePosition.cancel(); // https://github.com/ant-design/ant-design/issues/22683\n\n      this.lazyUpdatePosition.cancel();\n    } // Handle realign logic\n\n  }, {\n    key: \"updatePosition\",\n    value: function updatePosition() {\n      this.prepareMeasure();\n    }\n  }, {\n    key: \"lazyUpdatePosition\",\n    value: function lazyUpdatePosition() {\n      var targetFunc = this.getTargetFunc();\n      var affixStyle = this.state.affixStyle; // Check position change before measure to make Safari smooth\n\n      if (targetFunc && affixStyle) {\n        var offsetTop = this.getOffsetTop();\n        var offsetBottom = this.getOffsetBottom();\n        var targetNode = targetFunc();\n\n        if (targetNode && this.placeholderNode) {\n          var targetRect = getTargetRect(targetNode);\n          var placeholderReact = getTargetRect(this.placeholderNode);\n          var fixedTop = getFixedTop(placeholderReact, targetRect, offsetTop);\n          var fixedBottom = getFixedBottom(placeholderReact, targetRect, offsetBottom);\n\n          if (fixedTop !== undefined && affixStyle.top === fixedTop || fixedBottom !== undefined && affixStyle.bottom === fixedBottom) {\n            return;\n          }\n        }\n      } // Directly call prepare measure since it's already throttled.\n\n\n      this.prepareMeasure();\n    }\n  }]);\n\n  return Affix;\n}(React.Component);\n\nAffix.contextType = ConfigContext;\n\n__decorate([throttleByAnimationFrameDecorator()], Affix.prototype, \"updatePosition\", null);\n\n__decorate([throttleByAnimationFrameDecorator()], Affix.prototype, \"lazyUpdatePosition\", null);\n\nexport default Affix;","export function isWindow(obj) {\n  return obj !== null && obj !== undefined && obj === obj.window;\n}\nexport default function getScroll(target, top) {\n  if (typeof window === 'undefined') {\n    return 0;\n  }\n\n  var method = top ? 'scrollTop' : 'scrollLeft';\n  var result = 0;\n\n  if (isWindow(target)) {\n    result = target[top ? 'pageYOffset' : 'pageXOffset'];\n  } else if (target instanceof Document) {\n    result = target.documentElement[method];\n  } else if (target) {\n    result = target[method];\n  }\n\n  if (target && !isWindow(target) && typeof result !== 'number') {\n    result = (target.ownerDocument || target).documentElement[method];\n  }\n\n  return result;\n}","// eslint-disable-next-line import/prefer-default-export\nexport function easeInOutCubic(t, b, c, d) {\n  var cc = c - b;\n  t /= d / 2;\n\n  if (t < 1) {\n    return cc / 2 * t * t * t + b;\n  } // eslint-disable-next-line no-return-assign\n\n\n  return cc / 2 * ((t -= 2) * t * t + 2) + b;\n}","import raf from 'raf';\nimport getScroll, { isWindow } from './getScroll';\nimport { easeInOutCubic } from './easings';\nexport default function scrollTo(y) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _options$getContainer = options.getContainer,\n      getContainer = _options$getContainer === void 0 ? function () {\n    return window;\n  } : _options$getContainer,\n      callback = options.callback,\n      _options$duration = options.duration,\n      duration = _options$duration === void 0 ? 450 : _options$duration;\n  var container = getContainer();\n  var scrollTop = getScroll(container, true);\n  var startTime = Date.now();\n\n  var frameFunc = function frameFunc() {\n    var timestamp = Date.now();\n    var time = timestamp - startTime;\n    var nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y, duration);\n\n    if (isWindow(container)) {\n      container.scrollTo(window.pageXOffset, nextScrollTop);\n    } else if (container instanceof HTMLDocument || container.constructor.name === 'HTMLDocument') {\n      container.documentElement.scrollTop = nextScrollTop;\n    } else {\n      container.scrollTop = nextScrollTop;\n    }\n\n    if (time < duration) {\n      raf(frameFunc);\n    } else if (typeof callback === 'function') {\n      callback();\n    }\n  };\n\n  raf(frameFunc);\n}","import * as React from 'react';\nvar AnchorContext = /*#__PURE__*/React.createContext(null);\nexport default AnchorContext;","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/createSuper\";\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport addEventListener from \"rc-util/es/Dom/addEventListener\";\nimport Affix from '../affix';\nimport { ConfigContext } from '../config-provider';\nimport scrollTo from '../_util/scrollTo';\nimport getScroll from '../_util/getScroll';\nimport AnchorContext from './context';\n\nfunction getDefaultContainer() {\n  return window;\n}\n\nfunction getOffsetTop(element, container) {\n  if (!element.getClientRects().length) {\n    return 0;\n  }\n\n  var rect = element.getBoundingClientRect();\n\n  if (rect.width || rect.height) {\n    if (container === window) {\n      container = element.ownerDocument.documentElement;\n      return rect.top - container.clientTop;\n    }\n\n    return rect.top - container.getBoundingClientRect().top;\n  }\n\n  return rect.top;\n}\n\nvar sharpMatcherRegx = /#(\\S+)$/;\n\nvar Anchor = /*#__PURE__*/function (_React$Component) {\n  _inherits(Anchor, _React$Component);\n\n  var _super = _createSuper(Anchor);\n\n  function Anchor() {\n    var _this;\n\n    _classCallCheck(this, Anchor);\n\n    _this = _super.apply(this, arguments);\n    _this.state = {\n      activeLink: null\n    };\n    _this.links = []; // Context\n\n    _this.registerLink = function (link) {\n      if (!_this.links.includes(link)) {\n        _this.links.push(link);\n      }\n    };\n\n    _this.unregisterLink = function (link) {\n      var index = _this.links.indexOf(link);\n\n      if (index !== -1) {\n        _this.links.splice(index, 1);\n      }\n    };\n\n    _this.getContainer = function () {\n      var getTargetContainer = _this.context.getTargetContainer;\n      var getContainer = _this.props.getContainer;\n      var getFunc = getContainer || getTargetContainer || getDefaultContainer;\n      return getFunc();\n    };\n\n    _this.handleScrollTo = function (link) {\n      var _this$props = _this.props,\n          offsetTop = _this$props.offsetTop,\n          targetOffset = _this$props.targetOffset;\n\n      _this.setCurrentActiveLink(link);\n\n      var container = _this.getContainer();\n\n      var scrollTop = getScroll(container, true);\n      var sharpLinkMatch = sharpMatcherRegx.exec(link);\n\n      if (!sharpLinkMatch) {\n        return;\n      }\n\n      var targetElement = document.getElementById(sharpLinkMatch[1]);\n\n      if (!targetElement) {\n        return;\n      }\n\n      var eleOffsetTop = getOffsetTop(targetElement, container);\n      var y = scrollTop + eleOffsetTop;\n      y -= targetOffset !== undefined ? targetOffset : offsetTop || 0;\n      _this.animating = true;\n      scrollTo(y, {\n        callback: function callback() {\n          _this.animating = false;\n        },\n        getContainer: _this.getContainer\n      });\n    };\n\n    _this.saveInkNode = function (node) {\n      _this.inkNode = node;\n    };\n\n    _this.setCurrentActiveLink = function (link) {\n      var activeLink = _this.state.activeLink;\n      var onChange = _this.props.onChange;\n\n      if (activeLink !== link) {\n        _this.setState({\n          activeLink: link\n        });\n\n        if (onChange) {\n          onChange(link);\n        }\n      }\n    };\n\n    _this.handleScroll = function () {\n      if (_this.animating) {\n        return;\n      }\n\n      var _this$props2 = _this.props,\n          offsetTop = _this$props2.offsetTop,\n          bounds = _this$props2.bounds,\n          targetOffset = _this$props2.targetOffset;\n\n      var currentActiveLink = _this.getCurrentAnchor(targetOffset !== undefined ? targetOffset : offsetTop || 0, bounds);\n\n      _this.setCurrentActiveLink(currentActiveLink);\n    };\n\n    _this.updateInk = function () {\n      var _assertThisInitialize = _assertThisInitialized(_this),\n          prefixCls = _assertThisInitialize.prefixCls;\n\n      var anchorNode = ReactDOM.findDOMNode(_assertThisInitialized(_this));\n      var linkNode = anchorNode.getElementsByClassName(\"\".concat(prefixCls, \"-link-title-active\"))[0];\n\n      if (linkNode) {\n        _this.inkNode.style.top = \"\".concat(linkNode.offsetTop + linkNode.clientHeight / 2 - 4.5, \"px\");\n      }\n    };\n\n    _this.render = function () {\n      var _this$context = _this.context,\n          getPrefixCls = _this$context.getPrefixCls,\n          direction = _this$context.direction;\n      var _this$props3 = _this.props,\n          customizePrefixCls = _this$props3.prefixCls,\n          _this$props3$classNam = _this$props3.className,\n          className = _this$props3$classNam === void 0 ? '' : _this$props3$classNam,\n          style = _this$props3.style,\n          offsetTop = _this$props3.offsetTop,\n          affix = _this$props3.affix,\n          showInkInFixed = _this$props3.showInkInFixed,\n          children = _this$props3.children;\n      var activeLink = _this.state.activeLink;\n      var prefixCls = getPrefixCls('anchor', customizePrefixCls); // To support old version react.\n      // Have to add prefixCls on the instance.\n      // https://github.com/facebook/react/issues/12397\n\n      _this.prefixCls = prefixCls;\n      var inkClass = classNames(\"\".concat(prefixCls, \"-ink-ball\"), {\n        visible: activeLink\n      });\n      var wrapperClass = classNames(className, \"\".concat(prefixCls, \"-wrapper\"), _defineProperty({}, \"\".concat(prefixCls, \"-rtl\"), direction === 'rtl'));\n      var anchorClass = classNames(prefixCls, {\n        fixed: !affix && !showInkInFixed\n      });\n\n      var wrapperStyle = _extends({\n        maxHeight: offsetTop ? \"calc(100vh - \".concat(offsetTop, \"px)\") : '100vh'\n      }, style);\n\n      var anchorContent = /*#__PURE__*/React.createElement(\"div\", {\n        className: wrapperClass,\n        style: wrapperStyle\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: anchorClass\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"\".concat(prefixCls, \"-ink\")\n      }, /*#__PURE__*/React.createElement(\"span\", {\n        className: inkClass,\n        ref: _this.saveInkNode\n      })), children));\n      return /*#__PURE__*/React.createElement(AnchorContext.Provider, {\n        value: {\n          registerLink: _this.registerLink,\n          unregisterLink: _this.unregisterLink,\n          activeLink: _this.state.activeLink,\n          scrollTo: _this.handleScrollTo,\n          onClick: _this.props.onClick\n        }\n      }, !affix ? anchorContent : /*#__PURE__*/React.createElement(Affix, {\n        offsetTop: offsetTop,\n        target: _this.getContainer\n      }, anchorContent));\n    };\n\n    return _this;\n  }\n\n  _createClass(Anchor, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.scrollContainer = this.getContainer();\n      this.scrollEvent = addEventListener(this.scrollContainer, 'scroll', this.handleScroll);\n      this.handleScroll();\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (this.scrollEvent) {\n        var currentContainer = this.getContainer();\n\n        if (this.scrollContainer !== currentContainer) {\n          this.scrollContainer = currentContainer;\n          this.scrollEvent.remove();\n          this.scrollEvent = addEventListener(this.scrollContainer, 'scroll', this.handleScroll);\n          this.handleScroll();\n        }\n      }\n\n      this.updateInk();\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      if (this.scrollEvent) {\n        this.scrollEvent.remove();\n      }\n    }\n  }, {\n    key: \"getCurrentAnchor\",\n    value: function getCurrentAnchor() {\n      var offsetTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      var bounds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n      var getCurrentAnchor = this.props.getCurrentAnchor;\n\n      if (typeof getCurrentAnchor === 'function') {\n        return getCurrentAnchor();\n      }\n\n      var linkSections = [];\n      var container = this.getContainer();\n      this.links.forEach(function (link) {\n        var sharpLinkMatch = sharpMatcherRegx.exec(link.toString());\n\n        if (!sharpLinkMatch) {\n          return;\n        }\n\n        var target = document.getElementById(sharpLinkMatch[1]);\n\n        if (target) {\n          var top = getOffsetTop(target, container);\n\n          if (top < offsetTop + bounds) {\n            linkSections.push({\n              link: link,\n              top: top\n            });\n          }\n        }\n      });\n\n      if (linkSections.length) {\n        var maxSection = linkSections.reduce(function (prev, curr) {\n          return curr.top > prev.top ? curr : prev;\n        });\n        return maxSection.link;\n      }\n\n      return '';\n    }\n  }]);\n\n  return Anchor;\n}(React.Component);\n\nexport { Anchor as default };\nAnchor.defaultProps = {\n  affix: true,\n  showInkInFixed: false\n};\nAnchor.contextType = ConfigContext;","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/createSuper\";\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { ConfigConsumer } from '../config-provider';\nimport AnchorContext from './context';\n\nvar AnchorLink = /*#__PURE__*/function (_React$Component) {\n  _inherits(AnchorLink, _React$Component);\n\n  var _super = _createSuper(AnchorLink);\n\n  function AnchorLink() {\n    var _this;\n\n    _classCallCheck(this, AnchorLink);\n\n    _this = _super.apply(this, arguments);\n\n    _this.handleClick = function (e) {\n      var _this$context = _this.context,\n          scrollTo = _this$context.scrollTo,\n          onClick = _this$context.onClick;\n      var _this$props = _this.props,\n          href = _this$props.href,\n          title = _this$props.title;\n\n      if (onClick) {\n        onClick(e, {\n          title: title,\n          href: href\n        });\n      }\n\n      scrollTo(href);\n    };\n\n    _this.renderAnchorLink = function (_ref) {\n      var getPrefixCls = _ref.getPrefixCls;\n      var _this$props2 = _this.props,\n          customizePrefixCls = _this$props2.prefixCls,\n          href = _this$props2.href,\n          title = _this$props2.title,\n          children = _this$props2.children,\n          className = _this$props2.className,\n          target = _this$props2.target;\n      var prefixCls = getPrefixCls('anchor', customizePrefixCls);\n      var active = _this.context.activeLink === href;\n      var wrapperClassName = classNames(className, \"\".concat(prefixCls, \"-link\"), _defineProperty({}, \"\".concat(prefixCls, \"-link-active\"), active));\n      var titleClassName = classNames(\"\".concat(prefixCls, \"-link-title\"), _defineProperty({}, \"\".concat(prefixCls, \"-link-title-active\"), active));\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: wrapperClassName\n      }, /*#__PURE__*/React.createElement(\"a\", {\n        className: titleClassName,\n        href: href,\n        title: typeof title === 'string' ? title : '',\n        target: target,\n        onClick: _this.handleClick\n      }, title), children);\n    };\n\n    return _this;\n  }\n\n  _createClass(AnchorLink, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.context.registerLink(this.props.href);\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(_ref2) {\n      var prevHref = _ref2.href;\n      var href = this.props.href;\n\n      if (prevHref !== href) {\n        this.context.unregisterLink(prevHref);\n        this.context.registerLink(href);\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.context.unregisterLink(this.props.href);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(ConfigConsumer, null, this.renderAnchorLink);\n    }\n  }]);\n\n  return AnchorLink;\n}(React.Component);\n\nAnchorLink.defaultProps = {\n  href: '#'\n};\nAnchorLink.contextType = AnchorContext;\nexport default AnchorLink;","import Anchor from './Anchor';\nimport AnchorLink from './AnchorLink';\nAnchor.Link = AnchorLink;\nexport default Anchor;","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport React from 'react';\nimport { Anchor } from 'antd';\nimport { useMenus } from 'docz';\nimport { css } from '@emotion/core';\nimport { getActiveMenuItem, mq } from '../utils';\n\nconst { Link } = Anchor;\nconst anchorNavStyle = css`\n\n    ${[mq[3]]} {\n      display: none;\n    }\n    position: fixed;\n    top: 64px;\n    right: 0;\n    width: 250px;\n    padding: 16px;\n    height: 605px;\n    overflow: auto;\n    ul {\n      font-size: 12px;\n      li {\n        height: 25px;\n        line-height: 25px;\n        word-wrap: break-word;\n      }\n    }\n`;\n\nconst HeaderNav = () => {\n  const menus = useMenus();\n  const { headings } = getActiveMenuItem(menus);\n  return (\n    <div css={anchorNavStyle}>\n      <Anchor>\n        {headings.map((e) => (\n          <Link href={`#${e.slug}`} title={e.value} />\n        ))}\n      </Anchor>\n    </div>\n  );\n};\n\nexport default HeaderNav;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport React from 'react';\nimport { useMenus } from 'docz';\nimport { getPreviousAndNextUrls } from '../utils';\n\nconst nextButtons = () => {\n  const menus = useMenus();\n  const [prevUrl, nextUrl] = getPreviousAndNextUrls(menus);\n  return (\n    <>\n      {prevUrl && (\n        <a href={prevUrl} className=\"ant-btn\">\n          Prev\n        </a>\n      )}\n      {nextUrl && (\n        <a href={nextUrl} className=\"ant-btn\">\n          Next\n        </a>\n      )}\n    </>\n  );\n};\n\nexport default nextButtons;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport React from 'react';\nimport { theme, useConfig } from 'docz';\nimport { ThemeProvider } from 'theme-ui';\nimport { css } from '@emotion/core';\nimport SEO from '../components/seo';\nimport Layout from '../components/layout';\nimport AnchorNavigator from '../components/AnchorNavigator';\nimport NextLinks from '../components/next';\n\nimport 'antd/dist/antd.css';\n\ninterface Props {\n  children: React.ReactNode;\n}\n\nconst docLayout = css`\n  display: flex;\n  flex-direction: row;\n`;\n\nconst Theme = ({ children }: Props) => {\n  const config = useConfig();\n  return (\n    <ThemeProvider theme={config}>\n      <Layout>\n        <SEO title=\"Documentation\" />\n        <div css={docLayout}>\n          <div>{children}</div>\n          <AnchorNavigator />\n        </div>\n        <div>\n          <NextLinks />\n        </div>\n      </Layout>\n    </ThemeProvider>\n  );\n};\n\n// @ts-ignore\nexport default theme()(Theme);\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Helmet } from 'react-helmet-async'\n\nimport { useDbQuery } from '../hooks/useDbQuery'\n\nconst SEO = ({ description, lang, meta, keywords, title: initialTitle }) => {\n  const db = useDbQuery()\n  const title = initialTitle || db.config.title\n  const metaDescription = description || db.config.description\n\n  return (\n    <Helmet\n      title={title}\n      titleTemplate={`%s | ${db.config.title}`}\n      htmlAttributes={{ lang }}\n      meta={[\n        {\n          name: `description`,\n          content: metaDescription,\n        },\n        {\n          property: `og:title`,\n          content: title,\n        },\n        {\n          property: `og:description`,\n          content: metaDescription,\n        },\n        {\n          property: `og:type`,\n          content: `website`,\n        },\n        {\n          name: `twitter:card`,\n          content: `summary`,\n        },\n        {\n          name: `twitter:title`,\n          content: title,\n        },\n        {\n          name: `twitter:description`,\n          content: metaDescription,\n        },\n      ]\n        .concat(\n          keywords.length > 0\n            ? {\n                name: `keywords`,\n                content: keywords.join(`, `),\n              }\n            : []\n        )\n        .concat(meta)}\n    />\n  )\n}\n\nSEO.defaultProps = {\n  lang: `en`,\n  meta: [],\n  keywords: [],\n}\n\nSEO.propTypes = {\n  description: PropTypes.string,\n  lang: PropTypes.string,\n  meta: PropTypes.array,\n  keywords: PropTypes.arrayOf(PropTypes.string),\n  title: PropTypes.string.isRequired,\n}\n\nexport default SEO\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { useComponents } from 'docz'\nimport { propEq, get } from 'lodash/fp'\nimport { MDXProvider } from '@mdx-js/react'\n\nimport { useDbQuery } from '../hooks/useDbQuery'\nimport Wrapper from '../wrapper'\nimport Theme from '../index'\nimport SEO from './Seo'\n\nconst Route = ({ children, entry, isTransclusion, ...defaultProps }) => {\n  const components = useComponents()\n  const NotFound = components.notFound\n  const Layout = components.layout\n  const props = { ...defaultProps, doc: entry }\n  if (!entry && !isTransclusion) return <NotFound />\n  return isTransclusion ? (\n    children\n  ) : (\n    <MDXProvider components={components}>\n      <Wrapper>\n        <Layout {...props}>{children}</Layout>\n      </Wrapper>\n    </MDXProvider>\n  )\n}\n\nconst findEntry = (db, ctx) => {\n  const isIndex = ctx && ctx.frontmatter && ctx.frontmatter.route === '/'\n  const eqIndex = propEq('value.route', '/')\n  if (ctx && !ctx.entry && isIndex) return db.entries.find(eqIndex)\n  const filepath = get('entry.filepath', ctx)\n  return db.entries.find(propEq('value.filepath', filepath))\n}\n\nconst includesTransclusion = (db, props) => {\n  const { entries } = db\n  const filepath = get('_frontmatter.__filemeta.filename', props)\n  return (\n    !props.pageContext &&\n    entries.includes(entries.find(propEq('value.filepath', filepath)))\n  )\n}\n\nconst Layout = ({ children, ...defaultProps }) => {\n  const { pageContext: ctx } = defaultProps\n  const db = useDbQuery()\n  const entry = findEntry(db, ctx)\n  const isTransclusion = includesTransclusion(db, defaultProps)\n  return (\n    <Fragment>\n      {entry && <SEO title={entry.value.name} />}\n      <Theme db={db} currentEntry={entry}>\n        <Route {...defaultProps} entry={entry} isTransclusion={isTransclusion}>\n          {children}\n        </Route>\n      </Theme>\n    </Fragment>\n  )\n}\n\nLayout.propTypes = {\n  color: PropTypes.string,\n  children: PropTypes.node.isRequired,\n}\n\nexport default Layout\n","var convert = require('./convert'),\n    func = convert('matchesProperty', require('../matchesProperty'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _possibleConstructorReturn from \"@babel/runtime/helpers/esm/possibleConstructorReturn\";\nimport _getPrototypeOf from \"@babel/runtime/helpers/esm/getPrototypeOf\";\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _createSuper(Derived) {\n  var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n  return function _createSuperInternal() {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nimport * as React from 'react';\nimport findDOMNode from \"rc-util/es/Dom/findDOMNode\";\nimport toArray from \"rc-util/es/Children/toArray\";\nimport warning from \"rc-util/es/warning\";\nimport { composeRef, supportRef } from \"rc-util/es/ref\";\nimport ResizeObserver from 'resize-observer-polyfill';\nvar INTERNAL_PREFIX_KEY = 'rc-observer-key'; // Still need to be compatible with React 15, we use class component here\n\nvar ReactResizeObserver =\n/** @class */\nfunction () {\n  var ReactResizeObserver = /*#__PURE__*/function (_React$Component) {\n    _inherits(ReactResizeObserver, _React$Component);\n\n    var _super = _createSuper(ReactResizeObserver);\n\n    function ReactResizeObserver() {\n      var _this;\n\n      _classCallCheck(this, ReactResizeObserver);\n\n      _this = _super.apply(this, arguments);\n      _this.resizeObserver = null;\n      _this.childNode = null;\n      _this.currentElement = null;\n      _this.state = {\n        width: 0,\n        height: 0\n      };\n\n      _this.onResize = function (entries) {\n        var onResize = _this.props.onResize;\n        var target = entries[0].target;\n\n        var _target$getBoundingCl = target.getBoundingClientRect(),\n            width = _target$getBoundingCl.width,\n            height = _target$getBoundingCl.height;\n\n        var offsetWidth = target.offsetWidth,\n            offsetHeight = target.offsetHeight;\n        /**\n         * Resize observer trigger when content size changed.\n         * In most case we just care about element size,\n         * let's use `boundary` instead of `contentRect` here to avoid shaking.\n         */\n\n        var fixedWidth = Math.floor(width);\n        var fixedHeight = Math.floor(height);\n\n        if (_this.state.width !== fixedWidth || _this.state.height !== fixedHeight) {\n          var size = {\n            width: fixedWidth,\n            height: fixedHeight\n          };\n\n          _this.setState(size);\n\n          if (onResize) {\n            onResize(_objectSpread(_objectSpread({}, size), {}, {\n              offsetWidth: offsetWidth,\n              offsetHeight: offsetHeight\n            }));\n          }\n        }\n      };\n\n      _this.setChildNode = function (node) {\n        _this.childNode = node;\n      };\n\n      return _this;\n    }\n\n    _createClass(ReactResizeObserver, [{\n      key: \"componentDidMount\",\n      value: function componentDidMount() {\n        this.onComponentUpdated();\n      }\n    }, {\n      key: \"componentDidUpdate\",\n      value: function componentDidUpdate() {\n        this.onComponentUpdated();\n      }\n    }, {\n      key: \"componentWillUnmount\",\n      value: function componentWillUnmount() {\n        this.destroyObserver();\n      }\n    }, {\n      key: \"onComponentUpdated\",\n      value: function onComponentUpdated() {\n        var disabled = this.props.disabled; // Unregister if disabled\n\n        if (disabled) {\n          this.destroyObserver();\n          return;\n        } // Unregister if element changed\n\n\n        var element = findDOMNode(this.childNode || this);\n        var elementChanged = element !== this.currentElement;\n\n        if (elementChanged) {\n          this.destroyObserver();\n          this.currentElement = element;\n        }\n\n        if (!this.resizeObserver && element) {\n          this.resizeObserver = new ResizeObserver(this.onResize);\n          this.resizeObserver.observe(element);\n        }\n      }\n    }, {\n      key: \"destroyObserver\",\n      value: function destroyObserver() {\n        if (this.resizeObserver) {\n          this.resizeObserver.disconnect();\n          this.resizeObserver = null;\n        }\n      }\n    }, {\n      key: \"render\",\n      value: function render() {\n        var children = this.props.children;\n        var childNodes = toArray(children);\n\n        if (childNodes.length > 1) {\n          warning(false, 'Find more than one child node with `children` in ResizeObserver. Will only observe first one.');\n        } else if (childNodes.length === 0) {\n          warning(false, '`children` of ResizeObserver is empty. Nothing is in observe.');\n          return null;\n        }\n\n        var childNode = childNodes[0];\n\n        if (React.isValidElement(childNode) && supportRef(childNode)) {\n          var ref = childNode.ref;\n          childNodes[0] = React.cloneElement(childNode, {\n            ref: composeRef(ref, this.setChildNode)\n          });\n        }\n\n        return childNodes.length === 1 ? childNodes[0] : childNodes.map(function (node, index) {\n          if (!React.isValidElement(node) || 'key' in node && node.key !== null) {\n            return node;\n          }\n\n          return React.cloneElement(node, {\n            key: \"\".concat(INTERNAL_PREFIX_KEY, \"-\").concat(index)\n          });\n        });\n      }\n    }]);\n\n    return ReactResizeObserver;\n  }(React.Component);\n\n  ReactResizeObserver.displayName = 'ResizeObserver';\n  return ReactResizeObserver;\n}();\n\nexport default ReactResizeObserver;"],"sourceRoot":""}