{"version":3,"sources":["jsdelivr-header.js","/npm/react-revise@0.7.0/dist/index.js"],"names":[],"mappings":"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","file":"/npm/react-revise@0.7.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/react-revise@0.7.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nfunction __$styleInject(css, returnValue) {\n  if (typeof document === 'undefined') {\n    return returnValue;\n  }\n  css = css || '';\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n  head.appendChild(style);\n  \n  if (style.styleSheet){\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n  return returnValue;\n}\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar React = require('react');\nvar React__default = _interopDefault(React);\nvar PropTypes = _interopDefault(require('prop-types'));\nvar ReactDOM = _interopDefault(require('react-dom'));\n\n/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar NODE_ENV = process.env.NODE_ENV;\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nvar invariant_1 = invariant;\n\nvar asyncGenerator = function () {\n  function AwaitValue(value) {\n    this.value = value;\n  }\n\n  function AsyncGenerator(gen) {\n    var front, back;\n\n    function send(key, arg) {\n      return new Promise(function (resolve, reject) {\n        var request = {\n          key: key,\n          arg: arg,\n          resolve: resolve,\n          reject: reject,\n          next: null\n        };\n\n        if (back) {\n          back = back.next = request;\n        } else {\n          front = back = request;\n          resume(key, arg);\n        }\n      });\n    }\n\n    function resume(key, arg) {\n      try {\n        var result = gen[key](arg);\n        var value = result.value;\n\n        if (value instanceof AwaitValue) {\n          Promise.resolve(value.value).then(function (arg) {\n            resume(\"next\", arg);\n          }, function (arg) {\n            resume(\"throw\", arg);\n          });\n        } else {\n          settle(result.done ? \"return\" : \"normal\", result.value);\n        }\n      } catch (err) {\n        settle(\"throw\", err);\n      }\n    }\n\n    function settle(type, value) {\n      switch (type) {\n        case \"return\":\n          front.resolve({\n            value: value,\n            done: true\n          });\n          break;\n\n        case \"throw\":\n          front.reject(value);\n          break;\n\n        default:\n          front.resolve({\n            value: value,\n            done: false\n          });\n          break;\n      }\n\n      front = front.next;\n\n      if (front) {\n        resume(front.key, front.arg);\n      } else {\n        back = null;\n      }\n    }\n\n    this._invoke = send;\n\n    if (typeof gen.return !== \"function\") {\n      this.return = undefined;\n    }\n  }\n\n  if (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n    AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n      return this;\n    };\n  }\n\n  AsyncGenerator.prototype.next = function (arg) {\n    return this._invoke(\"next\", arg);\n  };\n\n  AsyncGenerator.prototype.throw = function (arg) {\n    return this._invoke(\"throw\", arg);\n  };\n\n  AsyncGenerator.prototype.return = function (arg) {\n    return this._invoke(\"return\", arg);\n  };\n\n  return {\n    wrap: function (fn) {\n      return function () {\n        return new AsyncGenerator(fn.apply(this, arguments));\n      };\n    },\n    await: function (value) {\n      return new AwaitValue(value);\n    }\n  };\n}();\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n\n\n\n\nvar defineProperty = function (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\nvar _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\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n/**\n * @class EditorHook\n */\n\nvar EditorHook = function (_Component) {\n  inherits(EditorHook, _Component);\n\n  function EditorHook(props) {\n    classCallCheck(this, EditorHook);\n\n    var _this = possibleConstructorReturn(this, (EditorHook.__proto__ || Object.getPrototypeOf(EditorHook)).call(this, props));\n\n    _this.realElement = null;\n    _this.imaginaryElement = null;\n    _this.mutationObserver = null;\n    _this.windowResizeObserver = null;\n\n    _this.setupMutationObserver = function () {\n      _this.mutationObserver = new MutationObserver(function (mutations) {\n        mutations.forEach(function () {\n          _this.recalculatePosition();\n        });\n      });\n\n      _this.mutationObserver.observe(_this.realElement, {\n        attributes: true,\n        subtree: false\n      });\n    };\n\n    _this.setupWindowResizeObserver = function () {\n      _this.windowResizeObserver = window.addEventListener('resize', _this.recalculatePosition);\n    };\n\n    _this.recalculatePosition = function () {\n      // Give the <textarea> an absolute position, pointed to where realElement is\n      var boundingBox = _this.realElement.getBoundingClientRect();\n      _this.imaginaryElement.style.cssText += '' + ('\\n      top: ' + (boundingBox.top + window.scrollY) + 'px;\\n      left: ' + (boundingBox.left + window.scrollX) + 'px;\\n      width: ' + boundingBox.width + 'px;\\n      height: ' + boundingBox.height + 'px;\\n    ');\n    };\n\n    _this.toggleEditible = function (editable) {\n      var childrenArray = React__default.Children.toArray(_this.props.children);\n      var realComponent = childrenArray[0];\n\n      // When in edit mode:\n      // hide real element, show imaginaryElement\n      if (editable) {\n        _this.realElement.style.visibility = 'hidden';\n        _this.imaginaryElement.style.display = _this.state.defaultDisplay;\n\n        // The imaginaryElement's value needs to be set everytime we go into edit mode\n        // TODO: Certify that realComponent has a string as its only child\n        _this.setState({\n          originalValue: realComponent.props.children,\n          value: realComponent.props.children,\n          dirty: false\n        });\n      } else if (!editable && _this.props.editable) {\n        _this.realElement.style.visibility = 'visible';\n        _this.imaginaryElement.style.display = 'none';\n\n        // TODO: Call Webhook to save the changes\n        _this.save();\n      }\n    };\n\n    _this.onEdit = function (event) {\n      _this.setState({\n        value: event.target.value,\n        dirty: event.target.value !== _this.state.originalValue\n      });\n    };\n\n    _this.save = function () {\n      if (!_this.state.dirty) return;\n\n      var hookTokenized = _this.props.hook.split(' ');\n      var verb = hookTokenized[0].toUpperCase();\n      var path = hookTokenized[1];\n\n      console.log('saving ' + _this.props.jsonKey);\n\n      var payload = JSON.stringify(defineProperty({}, _this.props.jsonKey, _this.state.value));\n\n      fetch(path, {\n        method: verb,\n        body: payload\n      });\n    };\n\n    _this.renderChildren = function () {\n      var _this$props = _this.props,\n          children = _this$props.children;\n\n      // Map a ref to the (currently) single child element and discard the previous child\n\n      var child = React__default.Children.only(children);\n      var newChild = React__default.cloneElement(child, { ref: 0, key: 0 });\n\n      // Create the editable child\n      var editableChild = React__default.createElement('textarea', { ref: '1', key: '1', value: _this.state.value, onChange: _this.onEdit });\n\n      return [newChild, editableChild];\n    };\n\n    _this.state = {\n      originalValue: '',\n      value: '',\n      dirty: false,\n      defaultDisplay: ''\n    };\n\n    EditorHook.instances.push(_this);\n    return _this;\n  }\n\n  // Set by StatusPanel\n\n\n  createClass(EditorHook, [{\n    key: 'componentWillMount',\n    value: function componentWillMount() {\n      var children = this.props.children;\n\n\n      invariant_1(children == null || React__default.Children.count(children) === 1, 'An <EditorHook> may have only one child element');\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _props = this.props,\n          children = _props.children,\n          editable = _props.editable;\n\n\n      var childrenArray = React__default.Children.toArray(children);\n      this.realElement = ReactDOM.findDOMNode(this.refs['0']);\n      this.imaginaryElement = ReactDOM.findDOMNode(this.refs['1']);\n\n      // Apply the computed styles to the <textarea>\n      var computedStyle = window.getComputedStyle(this.realElement);\n      var css = '';\n      Object.keys(computedStyle).map(function (key) {\n        // Ignore several positioning keys\n        switch (key) {\n          case 'position':\n          case 'margin':\n          case 'marginLeft':\n          case 'marginRight':\n          case 'marginTop':\n          case 'marginBottom':\n          case 'left':\n          case 'right':\n          case 'top':\n          case 'bottom':\n            return;\n        }\n        // Ignore numerical indexes\n        if (!isNaN(key)) return;\n\n        css += camelCaseToDash(key) + ': ' + computedStyle[key] + ';\\n';\n      });\n      css += 'position: absolute;';\n      this.imaginaryElement.style.cssText += css;\n\n      this.recalculatePosition();\n      this.setupMutationObserver();\n      this.setupWindowResizeObserver();\n\n      this.toggleEditible(editable);\n\n      // Save the default display mode for the realElement, so we can revert to it later (block, span, etc)\n      this.setState({\n        defaultDisplay: computedStyle.display\n      });\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      this.toggleEditible(nextProps.editable);\n    }\n  }, {\n    key: 'componentWillUpdate',\n    value: function componentWillUpdate(nextProps, nextState) {\n      // Let the single StatusPanel instance know that it needs to update iff our dirty field has changed\n      if (this.state.dirty !== nextState.dirty) EditorHook.statusPanel.forceUpdate();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      // We don't want to wrap a div or span around the children, because that could mess up the DOM due to the disparities of display:block and display:inline\n      // So we'll use React 16's feature of rendering multiple children through arrays\n      return this.renderChildren();\n    }\n  }]);\n  return EditorHook;\n}(React.Component);\n\nEditorHook.propTypes = {\n  children: PropTypes.node\n};\nEditorHook.instances = [];\nEditorHook.statusPanel = null;\n\n\nfunction camelCaseToDash(input) {\n  // Replace Capital letter with the letter + a dash: '-', then lowercase everything.\n  return input.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n/**\n * @class StatusPanel\n */\n\nvar StatusPanel = function (_Component) {\n  inherits(StatusPanel, _Component);\n\n  function StatusPanel(props) {\n    classCallCheck(this, StatusPanel);\n\n    // Instantiate the modal root, with which we will render to through the portal below\n    var _this = possibleConstructorReturn(this, (StatusPanel.__proto__ || Object.getPrototypeOf(StatusPanel)).call(this, props));\n\n    _this.saveAll = function () {\n      console.log('saving all...');\n      EditorHook.instances.forEach(function (instance) {\n        return instance.save();\n      });\n    };\n\n    StatusPanel.modalRoot = document.createElement('div');\n    StatusPanel.modalRoot.style.cssText = '\\n      position: fixed;\\n      z-index: 100000;\\n\\n      bottom: 0px;\\n      width: 100vw;\\n      padding: 1rem;\\n      box-sizing: border-box;\\n\\n      text-align: right;\\n    ';\n    return _this;\n  }\n\n  createClass(StatusPanel, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // Let the <EditorHook> instances know about this <StatusPanel> instance\n      EditorHook.statusPanel = this;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var dirtyCount = EditorHook.instances.filter(function (instance) {\n        return instance.state.dirty;\n      }).length;\n      var Button = this.props.saveButton;\n\n      var inlineBlock = {\n        display: 'inline-block',\n        verticalAlign: 'middle'\n      };\n\n      var changes = React__default.createElement(\n        'div',\n        { style: _extends({}, inlineBlock, { fontSize: '1.2rem' }) },\n        dirtyCount,\n        ' ',\n        pluralize('change', dirtyCount)\n      );\n\n      return ReactDOM.createPortal(dirtyCount > 0 ? React__default.createElement(\n        'div',\n        null,\n        changes,\n        React__default.createElement(\n          'div',\n          { style: _extends({}, inlineBlock, { marginLeft: '1rem' }) },\n          React__default.createElement(\n            Button,\n            { onClick: this.saveAll },\n            'save'\n          )\n        )\n      ) : '', document.getElementById('root').parentNode.appendChild(StatusPanel.modalRoot));\n    }\n  }]);\n  return StatusPanel;\n}(React.Component);\n\nStatusPanel.modalRoot = null;\n\n\nfunction pluralize(word, count) {\n  return count === 1 ? word : word + 's';\n}\n\nexports.EditorHook = EditorHook;\nexports.StatusPanel = StatusPanel;\n"]}