{"version":3,"sources":["jsdelivr-header.js","/npm/@twilburn/kudzu@1.0.1/index.js"],"names":[],"mappings":"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","file":"/npm/@twilburn/kudzu@1.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@twilburn/kudzu@1.0.1/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","// utility for deep object references\nvar getPath = function(path, target) {\n  var parts = path.split(\".\");\n  for (var i = 0; i < parts.length; i++) {\n    var part = parts[i];\n    if (!target[part]) return undefined;\n    target = target[part];\n  }\n  return target;\n};\n\nvar setPath = function(path, target, value) {\n  var parts = path.split(\".\");\n  var final = parts.pop();\n  parts.forEach(p => target = target[p] ? target[p] : target[p] = {});\n  target[final] = value;\n};\n\n// utility for iterating over DOM collections\nvar each = function(list, fn) {\n  for (var i = 0; i < list.length; i++) fn(list[i]);\n};\n\n// attribute prefixes\nvar prefix = {\n  attr: /^(attr)?:/,\n  className: /^class:/,\n  event: /^(on:|@)/\n};\n\n// used to bind attributes to camelcase props\n// start with some SVG attributes in place\nvar upcase = {\n  preserveaspectratio: \"preserveAspectRatio\",\n  viewbox: \"viewBox\",\n  textcontent: \"textContent\"\n};\n\n[Element.prototype, HTMLInputElement.prototype, Image.prototype].forEach(function(proto) {\n  var description = Object.getOwnPropertyDescriptors(proto);\n  for (var k in description) {\n    var d = description[k];\n    var type = typeof d.value;\n    if (d.set || (d.writable && type != \"function\")) {\n      var low = k.toLowerCase();\n      if (low != k) upcase[low] = k;\n    }\n  }\n});\n\n// constructors for rendering callbacks\nvar factories = {\n  attr: function(element, attribute) {\n    attribute = upcase[attribute] || attribute;\n    if (typeof element[attribute] != \"undefined\") {\n      return v => element[attribute] = v;\n    } else {\n      return v => element.setAttribute(attribute, v);\n    }\n  },\n  classToggle: function(element, className) {\n    return v => element.classList[v ? \"add\" : \"remove\"](className);\n  }\n}\n\nvar createBinding = function(root, state) {\n  // callbacks are stored under a key specifying the state value lookup path\n  // each is a function expecting a single value, with their context memoized\n  var callbacks = {};\n  \n  // store these so we can destroy them if asked\n  var listeners = [];\n\n  // memoize callbacks so that they don't do unnecessary work\n  // this assumes that all data flows one way - toward the DOM\n  var memoize = function(fn) {\n    var memo;\n    return function(v) {\n      if (v == memo) return;\n      memo = v;\n      fn(v);\n    }\n  };\n\n  var addCallback = function(k, v) {\n    if (!callbacks[k]) callbacks[k] = [];\n    callbacks[k].push(memoize(v));\n  }\n\n  var bind = function(element) {\n    each(element.attributes, function(attr) {\n      if (attr.name.match(prefix.attr)) {\n        var k = attr.name.replace(prefix.attr, \"\");\n        var v = attr.value;\n        addCallback(v, factories.attr(element, k));\n      }\n\n      if (attr.name.match(prefix.className)) {\n        var k = attr.name.replace(prefix.className, \"\");\n        var v = attr.value;\n        addCallback(v, factories.classToggle(element, k));\n      }\n\n      if (attr.name.match(prefix.event)) {\n        var e = attr.name.replace(prefix.event, \"\");\n        var v = attr.value;\n        // wrapper in case the state object changes or is updated\n        var listener = function(event) {\n          if (!state[v]) return;\n          var f = state[v];\n          f.call(element, event);\n        }\n        element.addEventListener(e, listener);\n        listeners.push({ element, listener, event: e });\n      }\n    });\n  };\n\n  // gather all nodes and in the darkness bind them\n  var walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, function(node) {\n    if (node.hasAttribute(\"blackbox\")) return NodeFilter.FILTER_REJECT;\n    return NodeFilter.FILTER_ACCEPT;\n  }, false);\n  do {\n    bind(walker.currentNode);\n  } while (walker.nextNode());\n\n  // render is always delayed until the next tick\n  var scheduled = null;\n  var render = function() {\n    if (scheduled) return;\n    scheduled = requestAnimationFrame(function() {\n      scheduled = null;\n      for (var k in callbacks) {\n        var v = getPath(k, state);\n        callbacks[k].forEach(fn => fn(v));\n      }\n    });\n  };\n\n  // call state.set() with a key/value pair or an object\n  // deep keypaths are supported as keys in order to do narrow replacement\n  Object.defineProperty(state, \"set\", {\n    value: function(key, value) {\n      if (typeof key == \"object\") {\n        return Object.keys(key).forEach(k => state.set(k, key[k]));\n      }\n      setPath(key, state, value);\n      render();\n    }\n  });\n  \n  Object.defineProperty(state, \"destroy\", {\n    value: function() {\n      callbacks = null;\n      listeners.forEach(def => def.element.removeEventListener(def.event, def.listener));\n      if (scheduled) cancelAnimationFrame(scheduled);\n    }\n  });\n\n  render();\n\n  return state;\n};\n\nexport default createBinding;"]}