@webtides/element-js 1.0.0-alpha.1 → 1.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/docs/README.md +174 -0
  2. package/docs/concepts/classes.md +167 -0
  3. package/docs/concepts/hierarchy.md +61 -0
  4. package/docs/concepts/lifecycle.md +45 -0
  5. package/docs/concepts/reactivity.md +14 -0
  6. package/docs/features/computed-properties.md +28 -0
  7. package/docs/features/dependency-injection-context-protocol.md +132 -0
  8. package/docs/features/events.md +155 -0
  9. package/docs/features/global-styles.md +131 -0
  10. package/docs/features/methods.md +34 -0
  11. package/docs/features/properties.md +56 -0
  12. package/docs/features/refs.md +47 -0
  13. package/docs/features/renderless.md +70 -0
  14. package/docs/features/store.md +143 -0
  15. package/docs/features/styles.md +169 -0
  16. package/docs/features/templates.md +308 -0
  17. package/docs/features/watch.md +54 -0
  18. package/docs/getting-started/upgrade-to-v1.md +243 -0
  19. package/docs/guide/guide.md +112 -0
  20. package/index.js +9 -2
  21. package/package.json +15 -19
  22. package/src/BaseElement.js +206 -42
  23. package/src/StyledElement.js +67 -48
  24. package/src/TemplateElement.js +32 -7
  25. package/src/dom-parts/AttributePart.js +16 -9
  26. package/src/dom-parts/ChildNodePart.js +8 -22
  27. package/src/dom-parts/NodePart.js +1 -0
  28. package/src/dom-parts/TemplatePart.js +19 -25
  29. package/src/dom-parts/TemplateResult.js +46 -35
  30. package/src/dom-parts/directives.js +43 -16
  31. package/src/dom-parts/html.js +1 -1
  32. package/src/dom-parts/render.js +6 -1
  33. package/src/util/AttributeParser.js +54 -21
  34. package/src/util/DOMHelper.js +63 -14
  35. package/src/util/Directive.js +21 -1
  36. package/src/util/GlobalStylesStore.js +66 -0
  37. package/src/util/SerializeStateHelper.js +103 -0
  38. package/src/util/Store.js +111 -15
  39. package/src/util/defineElement.js +2 -2
  40. package/src/util/toString.js +2 -2
  41. package/dist/index.js +0 -1330
  42. package/dist/index.js.map +0 -7
  43. package/src/util/i18n.js +0 -20
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/util/AttributeParser.js", "../src/util/DOMHelper.js", "../src/util/Store.js", "../src/util/defineElement.js", "../src/util/toString.js", "../src/BaseElement.js", "../src/util/i18n.js", "../src/StyledElement.js", "../src/dom-parts/Part.js", "../src/dom-parts/AttributePart.js", "../src/dom-parts/ChildNodePart.js", "../src/dom-parts/NodePart.js", "../src/dom-parts/TemplatePart.js", "../src/dom-parts/TemplateResult.js", "../src/dom-parts/html.js", "../src/dom-parts/render.js", "../src/TemplateElement.js"],
4
- "sourcesContent": ["export function isObjectLike(value) {\n\treturn typeof value == 'object' && value !== null;\n}\n\nexport function isJSON(str) {\n\ttry {\n\t\treturn JSON.parse(str) && !!str;\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n\nexport function isBoolean(value) {\n\treturn value === 'true' || value === 'false';\n}\n\nexport function parseBoolean(value) {\n\treturn value === 'true';\n}\n\nexport function isString(value) {\n\treturn (\n\t\ttypeof value === 'string' ||\n\t\t(!!value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object String]')\n\t);\n}\n\nexport function isNumber(value) {\n\treturn new RegExp('^-?(0|0\\\\.\\\\d+|[1-9]\\\\d*(\\\\.\\\\d+)?)$').test(value);\n}\n\nexport function isNaN(value) {\n\treturn Number.isNaN(value);\n}\n\n/**\n * deep compare two values primitive or complex\n *\n * @param valueA\n * @param valueB\n * @returns {boolean}\n */\n\nexport function deepEquals(valueA, valueB) {\n\treturn JSON.stringify(valueA) === JSON.stringify(valueB);\n}\n\nexport function parseAttribute(value, options = {}) {\n\tif (options.parse === false || !isString(value)) {\n\t\t// no-op\n\t\treturn value;\n\t}\n\tif (typeof options.parse === 'function') {\n\t\t// custom parse fn\n\t\treturn options.parse(value);\n\t}\n\n\t// default parse\n\tlet parsedValue = value;\n\n\tif (isJSON(value)) parsedValue = JSON.parse(value);\n\telse if (isBoolean(value)) parsedValue = parseBoolean(value);\n\telse if (isNumber(value)) parsedValue = parseFloat(value);\n\n\treturn parsedValue;\n}\n\n/**\n * Replaces dashed-expression (i.e. some-value) to a camel-cased expression (i.e. someValue)\n * @returns string\n */\nexport function dashToCamel(string) {\n\tif (string.indexOf('-') === -1) return string;\n\n\treturn string.replace(/-[a-z]/g, (matches) => matches[1].toUpperCase());\n}\n\n/**\n * Replaces camel-cased expression (i.e. someValue) to a dashed-expression (i.e. some-value)\n * @returns string\n */\nexport function camelToDash(string) {\n\treturn string.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n/**\n * Decodes an attribute. Can only be encoded with the `encodeAttribute` method which\n * is exported from this file.\n *\n * @param attribute\n * @returns {string}\n */\nexport function decodeAttribute(attribute) {\n\treturn `${attribute}`\n\t\t.replace(/&lt;/g, '<')\n\t\t.replace(/&gt;/g, '>')\n\t\t.replace(/&quot;/g, '\"')\n\t\t.replace(/&apos;/g, \"'\");\n}\n\n/**\n * Encodes an attribute. Can only be decoded with the `decodeAttribute` method which\n * is exported from this file.\n *\n * This does not use the standard way to encode an attribute, as the dom parser\n * that renders the html would understand and automatically decode it. Which results\n * in non sanitized html output.\n *\n * @param attribute\n * @returns {string}\n */\nexport function encodeAttribute(attribute) {\n\treturn `${attribute}`\n\t\t.replace(/'/g, '&apos;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\\r\\n/g, '\\n')\n\t\t.replace(/[\\r\\n]/g, '\\n');\n}\n", "/* An Element node like <p> or <div> */\nexport const ELEMENT_NODE = 1;\n/* An Attribute of an Element */\nexport const ATTRIBUTE_NODE = 2;\n/* The actual Text inside an Element or Attr */\nexport const TEXT_NODE = 3;\n/* A Comment node, such as <!-- \u2026 --> */\nexport const COMMENT_NODE = 8;\n\n/**\n * Gets list of (childNode) indexes for the given node\n * @param node\n * @return {number[]}\n */\nexport const getNodePath = (node) => {\n\tconst path = [];\n\tlet parentNode = node.parentNode;\n\twhile (parentNode) {\n\t\tpath.push([...parentNode.childNodes].indexOf(node));\n\t\tnode = parentNode;\n\t\tparentNode = node.parentNode;\n\t}\n\treturn path;\n};\n\nexport function getAllParentNodes(domNode) {\n\tlet node = domNode.parentElement;\n\tlet parents = [];\n\twhile (node) {\n\t\tparents.unshift(node); // adds node to the beginning of parents\n\t\tnode = node.parentElement;\n\t}\n\n\treturn parents;\n}\n\n// https://stackoverflow.com/questions/27453617/how-can-i-tell-if-an-element-is-in-a-shadow-dom\nexport function getShadowParentOrBody(element) {\n\tif (element instanceof ShadowRoot) {\n\t\treturn element;\n\t}\n\n\twhile (element.parentNode && (element = element.parentNode)) {\n\t\tif (element instanceof ShadowRoot) {\n\t\t\treturn element;\n\t\t}\n\t}\n\treturn document.body;\n}\n\n// TODO: add function for getClosestParentOfNodeType('custom-element')\n\nexport function getClosestParentCustomElementNode(domNode) {\n\tconst customElementParents = getAllParentNodes(domNode).filter((node) => {\n\t\treturn node.localName && node.localName.indexOf('-') !== -1;\n\t});\n\n\treturn customElementParents.pop();\n}\n\nexport function isOfSameNodeType(nodeA, nodeB) {\n\tif (!nodeA && !nodeA.localName) return false;\n\tif (!nodeB && !nodeB.localName) return false;\n\treturn nodeA.localName === nodeB.localName;\n}\n\nexport const supportsAdoptingStyleSheets = () =>\n\t'adoptedStyleSheets' in Document.prototype && 'replace' in CSSStyleSheet.prototype;\n\n// for IE11 we are using the ShadyDOM Polyfill. With the polyfill we cannot append stylesheets to the shadowRoot\nexport const supportsAppendingStyleSheets = !window.ShadyDOM;\n\n// better hasChildNodes check because the native check will also count for empty whitespace as child nodes... :(\nexport const hasChildNodes = (node) => {\n\tconst childNodesLength = node.childNodes.length;\n\n\tif (childNodesLength === 0) return false;\n\n\tif (childNodesLength === 1 && node.firstChild.nodeType === 3 && node.firstChild.textContent.trim() === '')\n\t\treturn false;\n\n\t// children will not contain text nodes...\n\tif (childNodesLength > 0) return true;\n\n\t// TODO: check if more than 1 child nodes, but all childnodes are whitespace text ndoes?!\n};\n\n/**\n * Parses the given template string and returns a real DOM element.\n * @param {string} template\n * @returns {HTMLElement}\n */\nexport const convertStringToHTML = (template) => {\n\tconst parser = new DOMParser();\n\tconst document = parser.parseFromString(template.toString(), 'text/html');\n\treturn document.body;\n};\n\n/**\n * Parses the given string and returns a DocumentFragment\n * which contains the DOM subtree representing the <template> element's template contents.\n * @param {string} string\n * @return {DocumentFragment}\n */\nexport const convertStringToTemplate = (string) => {\n\tconst template = globalThis.document?.createElement('template');\n\t// TODO: ensure that SSRed and CSRed templates have the same amount of whitespace text nodes\n\ttemplate.innerHTML = string.trimStart().trimEnd();\n\treturn template.content;\n};\n\n/**\n * Diff the attributes for a live DOM element against a template DOM element\n * @param {Element} templateElement The new template\n * @param {Element} domElement The existing DOM node\n */\nexport const diffAttributes = function (templateElement, domElement) {\n\t// remove or update previous attributes\n\tfor (/** @type {Attr} */ const attribute of Array.from(domElement.attributes)) {\n\t\tif (templateElement.hasAttribute(attribute.name)) {\n\t\t\tconst oldValue = attribute.value;\n\t\t\tconst newValue = templateElement.getAttribute(attribute.name) || '';\n\t\t\tif (oldValue !== newValue) {\n\t\t\t\tdomElement.setAttribute(attribute.name, newValue);\n\t\t\t}\n\t\t} else {\n\t\t\tdomElement.removeAttribute(attribute.name);\n\t\t}\n\t}\n\n\t// set newly added attributes\n\tfor (/** @type {Attr} */ const attribute of Array.from(templateElement.attributes)) {\n\t\tif (!domElement.hasAttribute(attribute.name)) {\n\t\t\tdomElement.setAttribute(attribute.name, attribute.value);\n\t\t}\n\t}\n};\n\n/**\n * Diff a live DOM node against a template DOM node\n * @param {Node} templateNode\n * @param {Node} domNode\n * @param {(Node) => Boolean} shouldDiffChildNodes\n */\nexport const diffNodes = function (templateNode, domNode, shouldDiffChildNodes = (templateChildNode) => true) {\n\t// If the DOM node should be empty, remove all child nodes\n\tif (hasChildNodes(domNode) && !hasChildNodes(templateNode)) {\n\t\tdomNode.replaceChildren();\n\t\treturn;\n\t}\n\n\t// If the DOM node is empty, but should have children, add child nodes from the template node\n\tif (!hasChildNodes(domNode) && hasChildNodes(templateNode)) {\n\t\tdomNode.replaceChildren(...templateNode.childNodes);\n\t\treturn;\n\t}\n\n\tconst templateChildNodes = [...templateNode.childNodes];\n\tconst domChildNodes = [...domNode.childNodes];\n\n\t// Diff each node in the child node lists\n\tlet length = Math.max(templateChildNodes.length, domChildNodes.length);\n\tfor (let index = 0; index < length; index++) {\n\t\tconst templateChildNode = templateChildNodes[index];\n\t\tconst domChildNode = domChildNodes[index];\n\n\t\t// If the DOM node doesn't exist, append/copy the template node\n\t\tif (!domChildNode) {\n\t\t\tdomNode.appendChild(templateChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the template node doesn't exist, remove the node in the DOM\n\t\tif (!templateChildNode) {\n\t\t\tdomNode.removeChild(domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If DOM node is equal to the template node, don't do anything\n\t\tif (domChildNode.isEqualNode(templateChildNode)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// the following two checks don't have to be correct, but it could bring as back to the fast path\n\t\t// in the worst case we still have to compare and swap all the elements\n\t\t// but in the best case we find the one element that should actually be inserted or removed\n\t\t// and from there on, every node that comes after should be equal again\n\n\t\t// fast path for removing DOM nodes - we delete the node now instead of at the end\n\t\tif (domNode.childNodes.length > templateNode.childNodes.length) {\n\t\t\tdomChildNodes.splice(index, 1);\n\t\t\tdomNode.removeChild(domChildNode);\n\t\t\t// because domChildNodes will get shorter by splicing it, everything moves up by one\n\t\t\t// so the (actual) next element will have the same index now as we currently have\n\t\t\t// therefore we have to adjust our counters\n\t\t\tlength--;\n\t\t\tindex--;\n\n\t\t\t// we might have corrected everything and the parent nodes could be equal again\n\t\t\t// if so, we can skip the rest of the child node checks\n\t\t\tif (domNode.childNodes.length === templateNode.childNodes.length && domNode.isEqualNode(templateNode)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// fast path for adding DOM nodes - we insert the node now instead of at the end\n\t\t// but NOT if we already are at the end of the list of child nodes\n\t\tif (index !== domNode.childNodes.length - 1 && domNode.childNodes.length < templateNode.childNodes.length) {\n\t\t\tdomChildNodes.splice(index, 0, templateChildNode);\n\t\t\tdomNode.insertBefore(templateChildNode, domChildNode);\n\n\t\t\t// we might have corrected everything and the parent nodes could be equal again\n\t\t\t// if so, we can skip the rest of the child node checks\n\t\t\tif (domNode.childNodes.length === templateNode.childNodes.length && domNode.isEqualNode(templateNode)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If node types are not the same, replace the DOM node with the template node\n\t\tif (templateChildNode.nodeType !== domChildNode.nodeType) {\n\t\t\tdomNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the node is a Text node or a Comment node, update it\n\t\tif (domChildNode.nodeType === TEXT_NODE || domChildNode.nodeType === COMMENT_NODE) {\n\t\t\tdomChildNode.textContent = templateChildNode.textContent;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the element tag names are not the same, replace the DOM node with the template node\n\t\tif (templateChildNode.nodeType === ELEMENT_NODE && templateChildNode.tagName !== domChildNode.tagName) {\n\t\t\tdomNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the node is an SVG element, don't even think about diffing it, just replace it\n\t\tif (templateChildNode.nodeType === ELEMENT_NODE && templateChildNode.tagName === 'SVG') {\n\t\t\tdomNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the node is an Element node, diff the attributes\n\t\tif (templateChildNode.nodeType === ELEMENT_NODE) {\n\t\t\tdiffAttributes(templateChildNode, domChildNode);\n\t\t}\n\n\t\t// If there are child nodes, diff them recursively\n\t\tif (templateChildNode.hasChildNodes()) {\n\t\t\tif (shouldDiffChildNodes(templateChildNode)) {\n\t\t\t\tdiffNodes(templateChildNode, domChildNode);\n\t\t\t}\n\t\t}\n\t}\n};\n", "import { isObjectLike, deepEquals } from './AttributeParser.js';\nimport { BaseElement } from '../BaseElement';\n\nexport class Store {\n\t_observer = new Set();\n\t_singlePropertyMode = false;\n\t_state = {};\n\n\tconstructor(value) {\n\t\t// wrap primitives with a generic \"value\" field to generate getter and setter\n\t\tthis._singlePropertyMode = arguments.length > 0 && !isObjectLike(value);\n\t\tconst specificValues = this._singlePropertyMode ? { value } : value;\n\t\tthis._state = { ...(!this._singlePropertyMode && this.properties()), ...specificValues };\n\n\t\tObject.entries(this._state).map(([key, value]) => {\n\t\t\tObject.defineProperty(this, key, {\n\t\t\t\tget: () => {\n\t\t\t\t\treturn this._state[key];\n\t\t\t\t},\n\t\t\t\tset: (newValue) => {\n\t\t\t\t\tconst oldValue = this._state[key];\n\t\t\t\t\tthis._state[key] = newValue;\n\n\t\t\t\t\tif (!deepEquals(newValue, oldValue)) {\n\t\t\t\t\t\tconst watch = this.watch();\n\t\t\t\t\t\tif (watch.hasOwnProperty(key) && typeof watch[key] === 'function') {\n\t\t\t\t\t\t\twatch[key](newValue, oldValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.requestUpdate();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\tproperties() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * When a property as the key was changed in the store, the callback function defined as value\n\t * will be called with `newValue` and `oldValue`\n\t * eg. { property: (oldValue, newValue) => { console.log('property changed!, oldValue, newValue); } }\n\t * @return {{}}\n\t */\n\twatch() {\n\t\treturn {};\n\t}\n\n\tvalueOf() {\n\t\treturn this._singlePropertyMode ? this._state.value : this._state;\n\t}\n\n\ttoString() {\n\t\treturn `${this._singlePropertyMode ? this._state.value : this._state}`;\n\t}\n\n\t/**\n\t * @param {BaseElement|Function} observer\n\t */\n\tsubscribe(observer) {\n\t\tthis._observer.add(observer);\n\t}\n\t/**\n\t * @param {BaseElement|Function} observer\n\t */\n\tunsubscribe(observer) {\n\t\tthis._observer.delete(observer);\n\t}\n\n\trequestUpdate() {\n\t\tthis._observer.forEach(async (observer) => {\n\t\t\tif (observer instanceof BaseElement) {\n\t\t\t\tawait observer.requestUpdate();\n\t\t\t\t// check if store is watched by an observer\n\t\t\t\tif (Object.keys(observer.watch() ?? {}).length > 0) {\n\t\t\t\t\t// observer actually has watched properties\n\t\t\t\t\tconst properties = observer.properties();\n\t\t\t\t\tObject.keys(observer.watch() ?? {}).forEach((key) => {\n\t\t\t\t\t\tif (observer._state[key] === this) {\n\t\t\t\t\t\t\t// observer is actually watching store changes provide new and old values\n\t\t\t\t\t\t\tobserver.callPropertyWatcher(key, this, this);\n\t\t\t\t\t\t\tobserver.notifyPropertyChange(key, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (typeof observer === 'function') {\n\t\t\t\tobserver();\n\t\t\t} else {\n\t\t\t\tconsole.error('Store: observer type is not supported.', observer);\n\t\t\t}\n\t\t});\n\t}\n}\n", "/**\n * Wrapper for defining custom elements so that registering an element multiple times won't crash\n * @param name for the tag\n * @param constructor for the custom element\n */\nexport function defineElement(name, constructor) {\n\ttry {\n\t\tcustomElements.define(name, constructor);\n\t} catch (e) {\n\t\t// console.log('error defining custom element', e);\n\t}\n}\n", "/**\n * Little wrapper function for JSON.stringify() to easily convert objects and arrays to strings\n * to be able to set them as attributes on custom elements\n * @param value to be stringified\n * @return String of the stringified value\n */\nexport function toString(value) {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch (e) {\n\t\treturn '';\n\t}\n}\n", "import { parseAttribute, isNaN, dashToCamel, camelToDash, isObjectLike } from './util/AttributeParser.js';\nimport { getClosestParentCustomElementNode, isOfSameNodeType } from './util/DOMHelper.js';\nimport { Store } from './util/Store.js';\n\nexport { defineElement } from './util/defineElement.js';\nexport { toString } from './util/toString.js';\n\nclass BaseElement extends HTMLElement {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\tthis.$refs = {};\n\t\tthis._state = {};\n\t\tthis._mutationObserver = null;\n\t\tthis._registeredEvents = [];\n\t\tthis._batchUpdate = null;\n\t\tthis._requestedUpdates = [];\n\t\tthis._options = {\n\t\t\tautoUpdate: true,\n\t\t\tdeferUpdate: true,\n\t\t\tmutationObserverOptions: {\n\t\t\t\tattributes: true,\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: false,\n\t\t\t\t...options.mutationObserverOptions,\n\t\t\t},\n\t\t\tpropertyOptions: {},\n\t\t\t...options,\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\t// define all attributes to \"this\" as properties\n\t\tthis.defineAttributesAsProperties();\n\n\t\t// define all properties to \"this\"\n\t\tthis.defineProperties();\n\n\t\t// define context\n\t\tthis.definePropertyInjection();\n\n\t\t// define everything that should be observed\n\t\tthis.defineObserver();\n\n\t\tif (this.hasAttribute('defer-update') || this._options.deferUpdate) {\n\t\t\t// don't update/render, but register refs and events\n\t\t\tthis.registerEventsAndRefs();\n\n\t\t\tthis.triggerHook('connected');\n\t\t} else {\n\t\t\tthis.requestUpdate({ notify: false }).then(() => {\n\t\t\t\tthis.triggerHook('connected');\n\t\t\t\tthis.triggerHook('afterUpdate');\n\t\t\t});\n\t\t}\n\t}\n\n\tdefineObserver() {\n\t\t// see: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver#Example_usage\n\t\tthis._mutationObserver = new MutationObserver((mutations) => {\n\t\t\tmutations.forEach((mutation) => {\n\t\t\t\tif (\n\t\t\t\t\tmutation.type === 'attributes' &&\n\t\t\t\t\tmutation.target === this &&\n\t\t\t\t\tthis._state.hasOwnProperty(dashToCamel(mutation.attributeName))\n\t\t\t\t) {\n\t\t\t\t\t// update property by invoking the setter\n\t\t\t\t\tthis[dashToCamel(mutation.attributeName)] = parseAttribute(\n\t\t\t\t\t\tthis.getAttribute(mutation.attributeName),\n\t\t\t\t\t\tthis._options.propertyOptions[dashToCamel(mutation.attributeName)],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (mutation.type === 'attributes' && mutation.target !== this) {\n\t\t\t\t\tthis.requestUpdate();\n\t\t\t\t}\n\t\t\t\tif (mutation.type === 'childList') {\n\t\t\t\t\tthis.requestUpdate();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis._mutationObserver.observe(this, {\n\t\t\tattributes: true,\n\t\t\tchildList: true,\n\t\t\tsubtree: false,\n\t\t\t...this._options.mutationObserverOptions,\n\t\t});\n\t}\n\n\tdisconnectedCallback() {\n\t\t// remove events for elements in the component\n\t\tthis.removeEvents();\n\n\t\tif (Object.keys(this.provideProperties()).length > 0) {\n\t\t\tthis.removeEventListener('request-context', this.onRequestContext);\n\t\t}\n\n\t\t// remove observers\n\t\tif (this._mutationObserver) this._mutationObserver.disconnect();\n\n\t\t// unsubscribe from stores\n\t\tObject.values(this.properties()).forEach((property) => {\n\t\t\tif (property instanceof Store) {\n\t\t\t\tproperty.unsubscribe(this);\n\t\t\t}\n\t\t});\n\n\t\tthis.triggerHook('disconnected');\n\t}\n\n\trequestUpdate(options = { notify: true }) {\n\t\tif (options.notify === true) {\n\t\t\tthis.triggerHook('beforeUpdate');\n\t\t}\n\n\t\tif (this._batchUpdate) {\n\t\t\tcancelAnimationFrame(this._batchUpdate);\n\t\t\tthis._batchUpdate = false;\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._requestedUpdates.push({ resolve, reject });\n\t\t\tthis._batchUpdate = requestAnimationFrame(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.update(options);\n\t\t\t\t\tthis._requestedUpdates.forEach(({ resolve, reject }) => resolve());\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// console.error('Update error', e)\n\t\t\t\t\tthis._requestedUpdates.forEach(({ resolve, reject }) => reject(e));\n\t\t\t\t}\n\t\t\t\tthis._requestedUpdates = [];\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * This should be called by the template component AFTER adding the template to\n\t * the DOM.\n\t * Here we will register the events and the refs for the element.\n\t */\n\tupdate(options = { notify: true }) {\n\t\tthis.registerEventsAndRefs();\n\t\tif (options.notify === true) {\n\t\t\tthis.triggerHook('afterUpdate');\n\t\t}\n\t}\n\n\t/**\n\t * Register events and refs for the component\n\t */\n\tregisterEventsAndRefs() {\n\t\t// register events for elements in the component\n\t\tthis.registerEvents();\n\n\t\t// register $refs\n\t\tthis.registerRefs();\n\t}\n\n\t/**\n\t * Defines all attributes assigned in the HTML for the element as properties on the element\n\t * If the value for an attribute can be parsed to an object or array, it will do so\n\t */\n\tdefineAttributesAsProperties() {\n\t\tconst ignoreAttributes = ['class', 'style'];\n\t\tArray.from(this.attributes)\n\t\t\t.filter((attribute) => {\n\t\t\t\treturn !ignoreAttributes.includes(attribute.name);\n\t\t\t})\n\t\t\t.forEach((attribute) => {\n\t\t\t\tconst name = dashToCamel(attribute.name);\n\t\t\t\tconst parseOptions = this._options.propertyOptions[name];\n\t\t\t\tthis.defineProperty(name, parseAttribute(attribute.value, parseOptions), true);\n\t\t\t});\n\t}\n\n\t/**\n\t * Properties to be defined and assigned on the element. Should be overwritten in child components\n\t * Properties defined here will also trigger a update() when changed.\n\t * eg. { stringProperty: 'value', numberProperty: 13, booleanProperty: true } }\n\t * @return {{}}\n\t */\n\tproperties() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * Defines properties on the element based on keys from this.properties()\n\t * Will trigger update() when a property was changed\n\t */\n\tdefineProperties() {\n\t\tObject.keys({ ...this.injectProperties(), ...this.properties() }).forEach((prop) => {\n\t\t\t// when mixing shadow dom elements with light dom elements and nesting custom elements\n\t\t\t// it might occur that properties where set on an element before it was\n\t\t\t// registered or connected. To avoid such timing issues we check\n\t\t\t// if a value was set for that specific property on the\n\t\t\t// prototype before assigning a default value\n\t\t\tconst value = this[prop] || this.properties()[prop];\n\t\t\tthis.defineProperty(prop, value);\n\t\t});\n\t}\n\n\t/**\n\t * Define a property on the element\n\t * Will trigger watch() function when a property was changed\n\t * Will trigger update() when a property was changed\n\t */\n\tdefineProperty(property, value, reflectAttribute = false) {\n\t\tif (value instanceof Store) {\n\t\t\tvalue.subscribe(this);\n\t\t}\n\n\t\tif (this._state.hasOwnProperty(property)) {\n\t\t\t// property has already been defined as an attribute nothing to do here\n\t\t\treturn;\n\t\t}\n\n\t\t// if property did not come from an attribute but has the option to reflect // enabled or custom fn\n\t\tif (!reflectAttribute && this._options.propertyOptions[property]?.reflect) {\n\t\t\tthis.reflectProperty({ property: property, newValue: value });\n\t\t}\n\n\t\t// remove attribute if reflect is set to false explicitly in options\n\t\tif (this._options.propertyOptions[property]?.reflect === false) {\n\t\t\tthis.removeAttribute(camelToDash(property));\n\t\t}\n\n\t\tthis._state[property] = value;\n\n\t\tObject.defineProperty(this, property, {\n\t\t\tget: () => {\n\t\t\t\treturn this._state[property];\n\t\t\t},\n\t\t\tset: (newValue) => {\n\t\t\t\tconst oldValue = this._state[property];\n\t\t\t\tconst newValueString = JSON.stringify(newValue);\n\t\t\t\tif (JSON.stringify(oldValue) !== newValueString) {\n\t\t\t\t\tthis._state[property] = newValue;\n\n\t\t\t\t\tif (newValue instanceof Store) {\n\t\t\t\t\t\tnewValue.subscribe(this);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (reflectAttribute || this._options.propertyOptions[property]?.reflect) {\n\t\t\t\t\t\tthis.reflectProperty({ property, newValue, newValueString });\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._options.autoUpdate) {\n\t\t\t\t\t\tthis.requestUpdate({\n\t\t\t\t\t\t\tnotify: true,\n\t\t\t\t\t\t\tproperty: property,\n\t\t\t\t\t\t\tnewValue: newValue,\n\t\t\t\t\t\t\tnewValueString: newValueString,\n\t\t\t\t\t\t\toldValue: oldValue,\n\t\t\t\t\t\t}).finally(() => {\n\t\t\t\t\t\t\tthis.callPropertyWatcher(property, newValue, oldValue);\n\t\t\t\t\t\t\tthis.notifyPropertyChange(property, newValue);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.callPropertyWatcher(property, newValue, oldValue);\n\t\t\t\t\t\tthis.notifyPropertyChange(property, newValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * call the watch callbacks on property changes\n\t *\n\t * @param context is the elements instance\n\t * @param property property that changes\n\t * @param newValue\n\t * @param oldValue\n\t */\n\tcallPropertyWatcher(property, newValue, oldValue) {\n\t\t// notify watched properties (after update())\n\t\tconst watch = this.watch();\n\t\tif (property in watch) {\n\t\t\twatch[property](newValue, oldValue);\n\t\t}\n\t}\n\t/**\n\t * notify property observer via change event\n\t *\n\t * @param context is the elements instance\n\t * @param property property that changes\n\t * @param newValue\n\t */\n\tnotifyPropertyChange(property, newValue) {\n\t\t// dispatch change event\n\t\tif (\n\t\t\tproperty in this._options['propertyOptions'] &&\n\t\t\tthis._options['propertyOptions'][property]['notify'] === true\n\t\t) {\n\t\t\tthis.dispatch(`${camelToDash(property)}-changed`, newValue, true);\n\t\t}\n\t}\n\n\treflectProperty(options) {\n\t\tconst { property, newValue } = options;\n\t\tconst newValueString = options.newValueString || JSON.stringify(newValue);\n\n\t\tif (newValue === undefined || newValue === null || isNaN(newValue)) {\n\t\t\t// these would be reflected as strings: \"undefined\" || \"null\" || \"NaN\"\n\t\t\t// which is not the desired behaviour. Therefore we reflect them as empty strings\n\t\t\tthis.setAttribute(camelToDash(property), '');\n\t\t} else {\n\t\t\tlet attributeValue = isObjectLike(newValue) ? newValueString : newValue;\n\t\t\tif (typeof this._options.propertyOptions[property]?.reflect === 'function') {\n\t\t\t\tattributeValue = this._options.propertyOptions[property].reflect(newValue);\n\t\t\t}\n\t\t\tthis.setAttribute(camelToDash(property), attributeValue);\n\t\t}\n\t}\n\n\t/**\n\t * Context Properties to issue Context Requests and to pull contextual properties into the elements scope\n\t * @return {{}}\n\t */\n\tinjectProperties() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * Define which properties that can be provided to children\n\t * @return {{}}\n\t */\n\tprovideProperties() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * Defines context on the element based on keys from this.injectProperties()\n\t */\n\tdefinePropertyInjection() {\n\t\tObject.entries(this.injectProperties()).forEach(([key, value]) => {\n\t\t\tthis.requestContext(key, value);\n\t\t});\n\t\t// define context provider\n\t\tif (Object.keys(this.provideProperties()).length > 0) {\n\t\t\tthis.addEventListener('request-context', this.onRequestContext);\n\t\t}\n\t}\n\n\t/**\n\t * Helper Function to initialize the context requests\n\t *\n\t * @param propertyName\n\t * @param valueOrCallback\n\t */\n\trequestContext(propertyName, valueOrCallback) {\n\t\tthis.dispatch('request-context', { [propertyName]: valueOrCallback }, true);\n\t}\n\n\t/**\n\t * Internal Context Request Handler\n\t * This will check if the current/receiving instance actually provides a value under the requested name.\n\t * If there is something to provide it will either assign the value to the requesting element or call the callback.\n\t *\n\t * @param event\n\t */\n\tonRequestContext(event) {\n\t\tconst properties = this.properties();\n\t\tconst provideProperties = this.provideProperties();\n\n\t\tObject.entries(event.detail ?? {}).forEach(([key, valueOrCallback]) => {\n\t\t\tif (key in provideProperties) {\n\t\t\t\t// found it, provide it\n\t\t\t\tconst providedValue = provideProperties[key];\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (typeof valueOrCallback === 'function') {\n\t\t\t\t\t// call function with context value\n\t\t\t\t\tvalueOrCallback(providedValue);\n\t\t\t\t} else {\n\t\t\t\t\t// assign to prop\n\t\t\t\t\tevent.target[key] = providedValue;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Connected lifecycle hook\n\tconnected() {}\n\n\t// BeforeUpdate lifecycle hook\n\tbeforeUpdate() {}\n\n\t// AfterUpdate lifecycle hook\n\tafterUpdate() {}\n\n\t// Disconnected lifecycle hook\n\tdisconnected() {}\n\n\t// Triggers a lifecycle hook based on the name\n\ttriggerHook(name) {\n\t\tif (name in this) {\n\t\t\tthis[name]();\n\t\t}\n\t}\n\n\t/**\n\t * Watched attributes & properties to be notified to the element when changed. Should be overwritten in child components\n\t * When an attribute or property as the key was changed on the element, the callback function defined as value\n\t * will be called with `newValue` and `oldValue`\n\t * eg. { property: (oldValue, newValue) => { console.log('property changed!, oldValue, newValue); } }\n\t * @return {{}}\n\t */\n\twatch() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * Return a map of events that should be registered on the element.\n\t * eg. { '.link': {\n\t * 'click': (e) => {console.log('MyElement.link - clicked', e)},\n\t * 'mouseover': (e) => {console.log('MyElement.link - mouseover()', e)},\n\t * }\n\t * }\n\t */\n\tevents() {\n\t\treturn {};\n\t}\n\n\t/**\n\t * Registers events on the element based on events().\n\t * Removes all previously registered events before adding them.\n\t */\n\tregisterEvents() {\n\t\t// remove all previously registered events to prevent duplicate triggers\n\t\tthis.removeEvents();\n\n\t\t// register events\n\t\tconst eventDefinitions = this.events();\n\t\tObject.keys(eventDefinitions).forEach((elementSelector) => {\n\t\t\tconst events = eventDefinitions[elementSelector];\n\t\t\tconst selectorWhiteList = { window, document, this: this.getRoot() };\n\t\t\tconst whiteListElement = selectorWhiteList[elementSelector];\n\t\t\tconst eventTargets = whiteListElement\n\t\t\t\t? [whiteListElement]\n\t\t\t\t: this.getRoot().querySelectorAll(elementSelector);\n\n\t\t\teventTargets.forEach((eventTarget) => {\n\t\t\t\tObject.keys(events).forEach((eventName) => {\n\t\t\t\t\tconst notation = events[eventName];\n\t\t\t\t\tif (typeof notation === 'function') {\n\t\t\t\t\t\tconst callback = notation.bind(this);\n\t\t\t\t\t\teventTarget.addEventListener(eventName, callback);\n\t\t\t\t\t\tthis._registeredEvents.push({ eventTarget, eventName, callback });\n\t\t\t\t\t} else if (typeof notation === 'object' && typeof notation.listener === 'function') {\n\t\t\t\t\t\tconst callback = notation.listener.bind(this);\n\t\t\t\t\t\teventTarget.addEventListener(eventName, callback, notation.options ?? {});\n\t\t\t\t\t\tthis._registeredEvents.push({ eventTarget, eventName, callback });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes all events from the element that where previously registered from the events() map.\n\t */\n\tremoveEvents() {\n\t\tthis._registeredEvents.forEach(({ eventTarget, eventName, callback }) => {\n\t\t\tif (eventTarget === window || eventTarget === document || this.getRoot().contains(eventTarget)) {\n\t\t\t\teventTarget.removeEventListener(eventName, callback);\n\t\t\t}\n\t\t});\n\t\tthis._registeredEvents = [];\n\t}\n\n\t/**\n\t * Stores an object that references child elements & DOM nodes that have a ref attribute defined.\n\t * References will be accessible on the element under this.$refs\n\t */\n\tregisterRefs() {\n\t\tconst refsNodeList = this.getRoot().querySelectorAll('[ref]');\n\t\tconst refsArray = Array.from(refsNodeList);\n\t\tconst refsMap = {};\n\n\t\trefsArray.forEach((refNode) => {\n\t\t\tconst refKey = refNode.getAttribute('ref');\n\t\t\tconst isListKey = refKey.endsWith('[]');\n\t\t\tconst cleanKey = isListKey ? refKey.slice(0, -2) : refKey;\n\t\t\tconst hasListRef = Array.isArray(refsMap[cleanKey]);\n\n\t\t\tif (isListKey) {\n\t\t\t\tif (!refsMap[cleanKey] || !hasListRef) {\n\t\t\t\t\t// create or overwrite previously registered single ref\n\t\t\t\t\trefsMap[cleanKey] = [];\n\t\t\t\t}\n\t\t\t\trefsMap[cleanKey].push(refNode);\n\t\t\t} else if (!hasListRef) {\n\t\t\t\trefsMap[refKey] = refNode;\n\t\t\t} else {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Did not register singular ref ${refKey}, ${refNode} as a ref list is already registered under the same name.`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tthis.$refs = refsMap;\n\t}\n\n\t// Helper function for dispatching custom events\n\tdispatch(name, data, bubble = false, cancelable = false, composed = false) {\n\t\tconst event = new CustomEvent(name, {\n\t\t\tbubbles: bubble,\n\t\t\tcancelable: cancelable,\n\t\t\tcomposed: composed,\n\t\t\tdetail: data,\n\t\t});\n\t\tthis.dispatchEvent(event);\n\t}\n\n\t// Get the root element\n\tgetRoot() {\n\t\treturn this;\n\t}\n}\n\nexport { BaseElement, getClosestParentCustomElementNode, isOfSameNodeType };\n", "/**\n * Retrieves a translated key from a dictionary on the window object\n * Example: ${i18n('CustomElement.buttonLabel', 'Label')}\n * @param key to be translated\n * @param fallback to be used if key is not defined\n * @return String of the translated key or fallback or original key\n */\nexport function i18n(key, fallback) {\n\ttry {\n\t\tconst translations = window.elementjs.i18n();\n\t\tif (translations[key] === undefined) {\n\t\t\tthrow 'Translation Missing';\n\t\t}\n\n\t\treturn translations[key];\n\t} catch (err) {\n\t\tif (fallback) return fallback;\n\t\telse return key;\n\t}\n}\n", "import { BaseElement } from './BaseElement.js';\nimport { supportsAdoptingStyleSheets, getShadowParentOrBody } from './util/DOMHelper.js';\nexport { i18n } from './util/i18n.js';\n\nclass StyledElement extends BaseElement {\n\tstatic globalStyles = null;\n\n\tstatic updateGlobalStyles() {\n\t\t// this is a runtime dependency so that every shadow dom can make use of global css\n\t\t// we assume these styles to be inlined into the document\n\t\tStyledElement.globalStyles = document.getElementById('globalStyles');\n\n\t\tif (StyledElement.globalStyles && StyledElement['globalStyleSheet']) {\n\t\t\t//updates already adopted global styles\n\t\t\tStyledElement['globalStyleSheet'].replaceSync(StyledElement.globalStyles.textContent);\n\t\t}\n\t}\n\n\tconstructor(options) {\n\t\tsuper({\n\t\t\tdeferUpdate: false,\n\t\t\tshadowRender: false,\n\t\t\tstyles: [],\n\t\t\tadoptGlobalStyles: true,\n\t\t\t...options,\n\t\t});\n\t\tthis._styles = [...this._options.styles, ...this.styles()];\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tif (supportsAdoptingStyleSheets() && this._options.shadowRender) {\n\t\t\t// adopting does only make sense in shadow dom. Fall back to append for light elements\n\t\t\tthis.adoptStyleSheets();\n\t\t}\n\t}\n\n\tstyles() {\n\t\treturn [];\n\t}\n\n\tupdate(options) {\n\t\tif (!supportsAdoptingStyleSheets() || this._options.shadowRender === false) {\n\t\t\t// append stylesheets to template if not already adopted\n\t\t\tconst appendableStyles = [...this._styles];\n\t\t\tif (this._options.shadowRender && this._options.adoptGlobalStyles) {\n\t\t\t\tappendableStyles.unshift(StyledElement.globalStyles?.textContent ?? '');\n\t\t\t}\n\t\t\tthis.appendStyleSheets(appendableStyles);\n\t\t}\n\t\tsuper.update(options);\n\t}\n\n\tadoptStyleSheets() {\n\t\tif (!this.constructor['cssStyleSheets']) {\n\t\t\tthis.constructor['cssStyleSheets'] = this._styles.map((style) => {\n\t\t\t\tconst sheet = new CSSStyleSheet();\n\t\t\t\tif (sheet && sheet.cssRules.length === 0) {\n\t\t\t\t\tsheet.replaceSync(style);\n\t\t\t\t}\n\t\t\t\treturn sheet;\n\t\t\t});\n\t\t}\n\n\t\tif (StyledElement.globalStyles && !StyledElement['globalStyleSheet']) {\n\t\t\tStyledElement['globalStyleSheet'] = new CSSStyleSheet();\n\t\t\tStyledElement['globalStyleSheet'].replaceSync(StyledElement.globalStyles.textContent);\n\t\t}\n\n\t\t// adopt styles\n\t\t// uses proposed solution for constructable stylesheets\n\t\t// see: https://wicg.github.io/construct-stylesheets/#proposed-solution\n\t\tthis.getRoot().adoptedStyleSheets = [\n\t\t\t...(this._options.shadowRender && this._options.adoptGlobalStyles && StyledElement['globalStyleSheet']\n\t\t\t\t? [StyledElement['globalStyleSheet']]\n\t\t\t\t: []),\n\t\t\t...this.constructor['cssStyleSheets'],\n\t\t];\n\t}\n\n\t// custom polyfill for constructable stylesheets by appending styles to the end of an element\n\tappendStyleSheets(styles) {\n\t\tconst parentDocument = getShadowParentOrBody(this.getRoot());\n\t\tstyles.forEach((style, index) => {\n\t\t\tconst identifier = this.tagName + index;\n\n\t\t\t// only append stylesheet if not already appended to shadowRoot or document\n\t\t\tif (!parentDocument.querySelector(`#${identifier}`)) {\n\t\t\t\tconst styleElement = document.createElement('style');\n\t\t\t\tstyleElement.id = identifier;\n\t\t\t\tstyleElement.style.display = 'none';\n\t\t\t\tstyleElement.textContent = style;\n\t\t\t\tparentDocument.appendChild(styleElement);\n\t\t\t}\n\t\t});\n\t}\n}\n\nStyledElement.updateGlobalStyles();\n\nexport { StyledElement };\n", "/**\n * @abstract\n */\nexport class Part {\n\tprocessor = undefined;\n\n\t/**\n\t * @abstract\n\t * @param {TemplateResult | any[] | any} value\n\t */\n\tupdate(value) {}\n}\n", "import { Part } from './Part.js';\n\n/**\n * @param {Element} node\n * @param {String} name\n * @param {Boolean} oldValue\n * @return {(function(*): void)|*}\n */\nconst processBooleanAttribute = (node, name, oldValue) => {\n\t// TODO: It would be better if the ?boolean= attribute would not be there in the first place...\n\tnode.removeAttribute(`?${name}`);\n\treturn (newValue) => {\n\t\tconst value = !!newValue?.valueOf() && newValue !== 'false';\n\t\tif (oldValue !== value) {\n\t\t\tnode.toggleAttribute(name, (oldValue = !!value));\n\t\t}\n\t};\n};\n\n/**\n * @param {Element} node\n * @param {String} name\n * @return {(function(*): void)|*}\n */\nconst processPropertyAttribute = (node, name) => {\n\t// TODO: It would be better if the .property= attribute would not be there in the first place...\n\tnode.removeAttribute(`.${name}`);\n\treturn (value) => {\n\t\tnode[name] = value;\n\t};\n};\n\n/**\n * @param {Element} node\n * @param {String} name\n * @return {(function(*): void)|*}\n */\nconst processEventAttribute = (node, name) => {\n\t// TODO: It would be better if the event attribute would not be there in the first place...\n\tnode.removeAttribute(name);\n\n\tlet oldValue = undefined;\n\tlet type = name.startsWith('@') ? name.slice(1) : name.toLowerCase().slice(2);\n\n\treturn (newValue) => {\n\t\tif (oldValue !== newValue) {\n\t\t\tif (oldValue) node.removeEventListener(type, oldValue);\n\t\t\tif ((oldValue = newValue)) node.addEventListener(type, oldValue);\n\t\t}\n\t};\n};\n\n/**\n * @param {Element} node\n * @param {String} name\n * @return {(function(*): void)|*}\n */\nconst processAttribute = (node, name) => {\n\tlet oldValue,\n\t\torphan = true;\n\tconst attributeNode = globalThis.document?.createAttributeNS(null, name);\n\treturn (newValue) => {\n\t\tconst value = newValue?.valueOf();\n\t\tif (oldValue !== value) {\n\t\t\tif ((oldValue = value) == null) {\n\t\t\t\tif (!orphan) {\n\t\t\t\t\tnode.removeAttributeNode(attributeNode);\n\t\t\t\t\torphan = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tattributeNode.value = value;\n\t\t\t\tif (orphan) {\n\t\t\t\t\tnode.setAttributeNodeNS(attributeNode);\n\t\t\t\t\torphan = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n};\n\n/**\n * @param {Element} node\n * @param {String} name\n * @return {(function(*): void)|*}\n */\nexport const processAttributePart = (node, name) => {\n\t// boolean attribute: ?boolean=${...}\n\tif (name.startsWith('?')) {\n\t\treturn processBooleanAttribute(node, name.slice(1), false);\n\t}\n\n\t// property attribute: .property=${...}\n\tif (name.startsWith('.')) {\n\t\treturn processPropertyAttribute(node, name.slice(1));\n\t}\n\n\t// event attribute: @event=${...} || \"old school\" event attribute: onevent=${...}\n\tif (name.startsWith('@') || name.startsWith('on')) {\n\t\treturn processEventAttribute(node, name);\n\t}\n\n\t// normal \"string\" attribute: attribute=${...}\n\treturn processAttribute(node, name);\n};\n\n/**\n * For updating a single attribute\n */\nexport class AttributePart extends Part {\n\tname = undefined;\n\tinterpolations = 1;\n\tvalues = [];\n\tcurrentValueIndex = 0;\n\tinitialValue = undefined;\n\n\t/**\n\t * @param {Node} node\n\t * @param {String} name\n\t * @param {String} initialValue\n\t */\n\tconstructor(node, name, initialValue) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.initialValue = initialValue;\n\t\tthis.processor = processAttributePart(node.nextElementSibling, this.name);\n\t}\n\n\t/**\n\t * @param {Node} node\n\t */\n\taddNode(node) {\n\t\tthis.interpolations++;\n\t\t// TODO: what about the comment node? It will always be the first for now...\n\t}\n\n\t/**\n\t * @param {string | number | bigint | boolean | undefined | symbol | null} value\n\t */\n\tupdate(value) {\n\t\t// If we only have one sole interpolation, we can just apply the update\n\t\tif (this.initialValue === '\\x03') {\n\t\t\tthis.processor(value);\n\t\t\treturn;\n\t\t}\n\n\t\t// Instead of applying the update immediately, we check if the part has multiple interpolations\n\t\t// and store the values for each interpolation in a list\n\t\tthis.values[this.currentValueIndex++] = value;\n\n\t\t// Only the last call to update (for the last interpolation) will actually trigger the update\n\t\t// on the DOM processor. Here we can reset everything before the next round of updates\n\t\tif (this.interpolations === this.currentValueIndex) {\n\t\t\tthis.currentValueIndex = 0;\n\t\t\tlet replaceIndex = 0;\n\t\t\t// Note: this will coarse the values into strings, but it's probably ok since there can only be multiple values in string attributes?!\n\t\t\tconst parsedValue = this.initialValue.replace(/\\x03/g, () => this.values[replaceIndex++]);\n\t\t\tthis.processor(parsedValue);\n\t\t}\n\t}\n}\n", "import { COMMENT_NODE, ELEMENT_NODE } from '../util/DOMHelper.js';\nimport { Part } from './Part.js';\nimport { TemplateResult } from './TemplateResult.js';\nimport { TemplatePart } from './TemplatePart.js';\n\n/**\n * @param {Node | TemplatePart | any[]} node\n * @return {ChildNode}\n */\nconst removeChildNodes = (node) => {\n\tconst range = globalThis.document?.createRange();\n\tconst firstChild = Array.isArray(node)\n\t\t? node[0]\n\t\t: node instanceof TemplatePart\n\t\t? node.childNodes[0]\n\t\t: node.firstChild;\n\tconst lastChild = Array.isArray(node)\n\t\t? node[node.length - 1]\n\t\t: node instanceof TemplatePart\n\t\t? node.childNodes[node.childNodes.length - 1]\n\t\t: node.lastChild;\n\trange.setStartAfter(firstChild);\n\trange.setEndAfter(lastChild);\n\trange.deleteContents();\n\treturn firstChild;\n};\n\n/**\n * @param {Element} commentNode\n */\nconst removeNodesBetweenComments = (commentNode) => {\n\twhile (commentNode.previousSibling) {\n\t\tif (\n\t\t\tcommentNode.previousSibling.nodeType === COMMENT_NODE &&\n\t\t\tcommentNode.previousSibling.data === commentNode.data.replace('/', '')\n\t\t) {\n\t\t\tbreak;\n\t\t}\n\t\tcommentNode.parentNode.removeChild(commentNode.previousSibling);\n\t}\n};\n\n/**\n * @param {Node} parentNode\n * @param {Node[]} domChildNodes\n * @param {Node[]} templateChildNodes\n * @param {Node} anchorNode\n * @return {Node[]}\n */\nconst diffChildNodes = function (parentNode, domChildNodes, templateChildNodes, anchorNode) {\n\t// Diff each node in the child node lists\n\tlet length = Math.max(templateChildNodes.length, domChildNodes.length);\n\tfor (let index = 0; index < length; index++) {\n\t\tlet domChildNode = domChildNodes[index];\n\t\tlet templateChildNode = templateChildNodes[index];\n\n\t\t// If the DOM node doesn't exist, append/copy the template node\n\t\tif (!domChildNode) {\n\t\t\tif (templateChildNode instanceof TemplatePart) {\n\t\t\t\tanchorNode.before(...templateChildNode.childNodes);\n\t\t\t} else if (typeof templateChildNode === 'object' && 'ELEMENT_NODE' in templateChildNode) {\n\t\t\t\tparentNode.insertBefore(templateChildNode, anchorNode);\n\t\t\t} else {\n\t\t\t\t// TODO: this might not be performant?! Can we maybe handle this in processDomNode?!\n\t\t\t\t// TODO: I think that we need to make ChildNodeParts from all primitive values as well\n\t\t\t\tparentNode.insertBefore(document.createTextNode(templateChildNode), anchorNode);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the template node doesn't exist, remove the node in the DOM\n\t\tif (!templateChildNode) {\n\t\t\tparentNode.removeChild(removeChildNodes(domChildNode));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If DOM node is equal to the template node, don't do anything\n\t\t// if (domChildNode.isEqualNode(templateChildNode)) {\n\t\tif (domChildNode === templateChildNode) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If node types are not the same, replace the DOM node with the template node\n\t\tif (templateChildNode.nodeType !== domChildNode.nodeType) {\n\t\t\tparentNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the element tag names are not the same, replace the DOM node with the template node\n\t\tif (templateChildNode.nodeType === ELEMENT_NODE && templateChildNode.tagName !== domChildNode.tagName) {\n\t\t\tparentNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the node is an SVG element, don't even think about diffing it, just replace it\n\t\tif (templateChildNode.nodeType === ELEMENT_NODE && templateChildNode.tagName === 'SVG') {\n\t\t\tparentNode.replaceChild(templateChildNode, domChildNode);\n\t\t\tcontinue;\n\t\t}\n\t}\n\treturn templateChildNodes;\n};\n\n/**\n * @param {Node} comment\n * @param {TemplatePart | any[] | any} initialValue\n * @return {(function(*): void)|*}\n */\nexport const processNodePart = (comment, initialValue) => {\n\tlet nodes = [];\n\tlet oldValue = initialValue instanceof TemplatePart ? [...initialValue.childNodes] : initialValue;\n\t// this is for string values to be inserted into the DOM. A cached TextNode will be used so that we don't have to constantly create new DOM nodes.\n\tlet cachedTextNode = undefined;\n\n\tconst processNodeValue = (newValue) => {\n\t\tswitch (typeof newValue) {\n\t\t\t// primitives are handled as text content\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\tif (oldValue !== newValue) {\n\t\t\t\t\toldValue = newValue;\n\t\t\t\t\tif (!cachedTextNode) cachedTextNode = globalThis.document?.createTextNode('');\n\t\t\t\t\tcachedTextNode.data = newValue;\n\n\t\t\t\t\tif (comment.previousSibling?.data === comment.data.replace('/', '')) {\n\t\t\t\t\t\t// the part is empty - we haven't rendered it yet\n\t\t\t\t\t\tcomment.parentNode.insertBefore(cachedTextNode, comment);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// the part was already rendered (either server side or on the client)\n\t\t\t\t\t\tcomment.previousSibling.data = newValue;\n\t\t\t\t\t}\n\n\t\t\t\t\tnodes = [cachedTextNode];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t// null (= typeof \"object\") and undefined are used to clean up previous content\n\t\t\tcase 'object':\n\t\t\tcase 'undefined':\n\t\t\t\tif (newValue === null || newValue === undefined) {\n\t\t\t\t\tif (oldValue !== newValue) {\n\t\t\t\t\t\toldValue = newValue;\n\t\t\t\t\t\tremoveNodesBetweenComments(comment);\n\t\t\t\t\t\tnodes = [];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(newValue)) {\n\t\t\t\t\tif (newValue.length === 0) {\n\t\t\t\t\t\tremoveNodesBetweenComments(comment);\n\t\t\t\t\t\tnodes = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnodes = diffChildNodes(comment.parentNode, oldValue || [], newValue, comment);\n\t\t\t\t\t}\n\t\t\t\t\toldValue = newValue;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// if the new value is a node or a fragment, and it's different from the live node, then it's diffed.\n\t\t\t\tif (oldValue !== newValue) {\n\t\t\t\t\tif ('ELEMENT_NODE' in newValue) {\n\t\t\t\t\t\toldValue = newValue;\n\t\t\t\t\t\tnodes = diffChildNodes(comment.parentNode, nodes, [newValue], comment);\n\t\t\t\t\t} else if (newValue instanceof TemplatePart) {\n\t\t\t\t\t\toldValue = newValue;\n\t\t\t\t\t\tnodes = diffChildNodes(comment.parentNode, nodes, [...newValue.childNodes], comment);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('Could not process value', newValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'function':\n\t\t\t\tprocessNodeValue(newValue(comment));\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\treturn processNodeValue;\n};\n\n/**\n * For updating a text node, a sequence of child nodes or an array of `any` values\n */\nexport class ChildNodePart extends Part {\n\t/** @type {Node | undefined} */\n\tstartNode = undefined;\n\n\t/** @type {Node | undefined} */\n\tendNode = undefined;\n\n\t// TODO: this is only for array values\n\t/** @type {Part[]} */\n\tparts = [];\n\n\t// TODO: this is only for TemplatePart values\n\ttemplatePart = undefined;\n\n\t// TODO: maybe we can store a generic vale|parsedValue that can be either parts[] | templatePart | any\n\n\t/** @type {Node[]} */\n\tchildNodes = [];\n\n\t/**\n\t * @param {Node} startNode - the start comment marker node\n\t * @param {any | any[]} value\n\t */\n\tconstructor(startNode, value) {\n\t\tif (startNode && startNode?.nodeType !== COMMENT_NODE) {\n\t\t\tthrow new Error('ChildNodePart: startNode is not a comment node');\n\t\t}\n\n\t\tsuper();\n\n\t\tlet serverSideRendered = false;\n\t\tif (startNode) {\n\t\t\tconst placeholder = startNode.data;\n\t\t\tconst childNodes = [startNode];\n\t\t\tlet childNode = startNode.nextSibling;\n\t\t\twhile (childNode && childNode.data !== `/${placeholder}`) {\n\t\t\t\tchildNodes.push(childNode);\n\t\t\t\tchildNode = childNode.nextSibling;\n\t\t\t}\n\n\t\t\tconst endNode = childNode;\n\t\t\tchildNodes.push(endNode);\n\n\t\t\t// if not SSRed, childNodes will only ever have two comment nodes, the start and the end marker\n\t\t\tif (childNodes.length > 2) {\n\t\t\t\tserverSideRendered = true;\n\t\t\t}\n\n\t\t\tthis.childNodes = childNodes;\n\t\t\tthis.startNode = startNode;\n\t\t\tthis.endNode = endNode;\n\t\t}\n\n\t\t// value can become array | TemplatePart | any\n\t\tconst initialValue = this.parseValue(value);\n\n\t\tif (this.endNode) {\n\t\t\tthis.processor = processNodePart(this.endNode, serverSideRendered ? initialValue : undefined);\n\t\t}\n\n\t\tif (!serverSideRendered) {\n\t\t\tif (value instanceof TemplateResult || Array.isArray(value)) {\n\t\t\t\tthis.updateParts(value);\n\t\t\t}\n\n\t\t\t// We need a childNodes list that is NOT live so that we don't lose elements when they get removed from the dom and we can (re)add them back in later.\n\t\t\tthis.childNodes = [...this.childNodes];\n\t\t\tthis.processor?.(initialValue);\n\t\t}\n\t}\n\n\t/**\n\t * @param {any} value\n\t * @return {*}\n\t */\n\tupdate(value) {\n\t\tconst parsedValue = this.parseValue(value);\n\n\t\tif (value instanceof TemplateResult || Array.isArray(value)) {\n\t\t\tthis.updateParts(value);\n\t\t}\n\n\t\tthis.processor?.(parsedValue);\n\t}\n\n\t/**\n\t * @param {TemplateResult | any[]} value\n\t */\n\tupdateParts(value) {\n\t\tif (value instanceof TemplateResult) {\n\t\t\tthis.templatePart.update(value);\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tthis.parts[index]?.update(value[index]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {TemplateResult | any[] | any} value\n\t * @return {TemplatePart | any[] | any}\n\t */\n\tparseValue(value) {\n\t\tif (value instanceof TemplateResult) {\n\t\t\tif (!this.templatePart) {\n\t\t\t\tconst templatePartCommentNodes = this.childNodes?.filter(\n\t\t\t\t\t(node) => node && node.nodeType === COMMENT_NODE && node.data === 'template-part',\n\t\t\t\t);\n\t\t\t\tconst startNode = templatePartCommentNodes[0];\n\t\t\t\tthis.templatePart = new TemplatePart(startNode, value);\n\t\t\t}\n\t\t\treturn this.templatePart;\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn this.parseArray(value);\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Nested TemplateResults values need to be unrolled in order for update functions to be able to process them\n\t * @param {any[]} values\n\t * @return {any[]}\n\t */\n\tparseArray(values) {\n\t\tconst parsedValues = [];\n\t\tfor (let index = 0; index < values.length; index++) {\n\t\t\tlet value = values[index];\n\n\t\t\tif (value instanceof TemplateResult) {\n\t\t\t\tlet templatePart = this.parts[index];\n\t\t\t\tif (!templatePart) {\n\t\t\t\t\tconst templatePartCommentNodes = this.childNodes?.filter(\n\t\t\t\t\t\t(node) => node && node.nodeType === COMMENT_NODE && node.data === 'template-part',\n\t\t\t\t\t);\n\t\t\t\t\tconst startNode = templatePartCommentNodes[index];\n\t\t\t\t\ttemplatePart = new TemplatePart(startNode, value);\n\t\t\t\t\tthis.parts[index] = templatePart;\n\t\t\t\t}\n\t\t\t\tparsedValues[index] = templatePart;\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tlet childNodePart = this.parts[index];\n\t\t\t\tif (!childNodePart) {\n\t\t\t\t\t// TODO: this seems not correct :(\n\t\t\t\t\tconst templatePartCommentNodes = this.childNodes?.filter(\n\t\t\t\t\t\t(node) => node && node.nodeType === COMMENT_NODE && node.data === 'template-part',\n\t\t\t\t\t);\n\t\t\t\t\tconst startNode = templatePartCommentNodes[index];\n\t\t\t\t\tchildNodePart = new ChildNodePart(startNode, value);\n\t\t\t\t\tthis.parts[index] = childNodePart;\n\t\t\t\t}\n\t\t\t\tparsedValues[index] = childNodePart;\n\t\t\t} else {\n\t\t\t\tparsedValues[index] = typeof value === 'function' ? value() : value;\n\t\t\t}\n\t\t}\n\n\t\treturn parsedValues;\n\t}\n}\n", "import { Part } from './Part.js';\nimport { isObjectLike } from '../util/AttributeParser.js';\n\n/**\n * For updating a directive on a node\n */\nexport class NodePart extends Part {\n\t/** @type {Node} */\n\tnode = undefined;\n\n\t/** @type {Directive} */\n\tdirective = undefined;\n\n\t/**\n\t * @param {Node} node\n\t * @param {() => {}} initialValue\n\t */\n\tconstructor(node, initialValue) {\n\t\tif (!isObjectLike(initialValue) && !initialValue.directiveClass) {\n\t\t\tthrow new Error(\n\t\t\t\t'NodePart: value is not a wrapped directive function. You must wrap you custom directive class with the defineDirective function.',\n\t\t\t);\n\t\t}\n\t\tsuper();\n\t\tthis.node = node.nextElementSibling;\n\t\tconst { directiveClass, values } = initialValue;\n\t\tthis.directive = new directiveClass(node.nextElementSibling);\n\t}\n\n\t/**\n\t * @param {() => {}} value\n\t */\n\tupdate(value) {\n\t\tconst { directiveClass, values } = value;\n\t\tthis.directive.update(...values);\n\t}\n}\n", "import { COMMENT_NODE, convertStringToTemplate } from '../util/DOMHelper.js';\nimport { Part } from './Part.js';\nimport { TemplateResult } from './TemplateResult.js';\nimport { AttributePart } from './AttributePart.js';\nimport { ChildNodePart } from './ChildNodePart.js';\nimport { NodePart } from './NodePart.js';\n\n/** @type {Map<TemplateStringsArray, Part[]>} */\nconst partsCache = new WeakMap();\n\n/** @type {Map<TemplateStringsArray, DocumentFragment>} */\nconst fragmentsCache = new WeakMap();\n\nexport class TemplatePart extends Part {\n\t/** @type {Part[]} */\n\tparts = [];\n\n\t/** @type {TemplateStringsArray} */\n\tstrings = undefined;\n\n\t/** @type {Node[]} */\n\tchildNodes = [];\n\n\t/**\n\t * @param {Node} startNode - the start comment marker node\n\t * @param {TemplateResult} value\n\t */\n\tconstructor(startNode, value) {\n\t\tif (startNode && startNode?.nodeType !== COMMENT_NODE) {\n\t\t\tthrow new Error('TemplatePart: startNode is not a comment node');\n\t\t}\n\n\t\tsuper();\n\n\t\tlet serverSideRendered = false;\n\t\tif (startNode) {\n\t\t\tconst placeholder = startNode.data;\n\t\t\tconst childNodes = [startNode];\n\t\t\tlet childNode = startNode.nextSibling;\n\t\t\twhile (childNode && childNode.data !== `/${placeholder}`) {\n\t\t\t\tchildNodes.push(childNode);\n\t\t\t\tchildNode = childNode.nextSibling;\n\t\t\t}\n\n\t\t\tconst endNode = childNode;\n\t\t\tchildNodes.push(endNode);\n\n\t\t\t// if not SSRed, childNodes will only ever have two comment nodes, the start and the end marker\n\t\t\tif (childNodes.length > 2) {\n\t\t\t\tserverSideRendered = true;\n\t\t\t\tthis.childNodes = childNodes;\n\t\t\t}\n\t\t}\n\n\t\tthis.parseValue(value);\n\n\t\tif (!serverSideRendered) {\n\t\t\tthis.updateParts(value.values);\n\t\t\t// We need a childNodes list that is NOT live so that we don't loose elements when they get removed from the dom and we can (re)add them back in later.\n\t\t\tthis.childNodes = [...this.childNodes];\n\t\t}\n\t}\n\n\t/**\n\t * @param {TemplateResult} value\n\t */\n\tupdate(value) {\n\t\tthis.parseValue(value);\n\t\tthis.updateParts(value.values);\n\t}\n\n\t/**\n\t * @param {any[]} values\n\t */\n\tupdateParts(values) {\n\t\tfor (let index = 0; index < values.length; index++) {\n\t\t\tthis.parts[index]?.update(values[index]);\n\t\t}\n\t}\n\n\t/**\n\t * @param {TemplateResult} templateResult\n\t */\n\tparseValue(templateResult) {\n\t\tif (this.strings !== templateResult.strings) {\n\t\t\tif (this.childNodes.length === 0) {\n\t\t\t\tlet fragment = fragmentsCache.get(templateResult.strings);\n\t\t\t\tif (!fragment) {\n\t\t\t\t\tfragment = this.parseFragment(templateResult);\n\t\t\t\t\tfragmentsCache.set(templateResult.strings, fragment);\n\t\t\t\t}\n\t\t\t\tconst importedFragment = globalThis.document?.importNode(fragment, true);\n\t\t\t\tthis.childNodes = importedFragment.childNodes;\n\t\t\t}\n\n\t\t\tlet parts = partsCache.get(templateResult.strings);\n\t\t\tif (!parts) {\n\t\t\t\tparts = templateResult.parseParts(this.childNodes);\n\t\t\t\tpartsCache.set(templateResult.strings, parts);\n\t\t\t}\n\n\t\t\t/** @type AttributePart */\n\t\t\tlet previousAttributePart = undefined;\n\t\t\tthis.parts = parts.map((part, index) => {\n\t\t\t\t// We currently need the path because the fragment will be cloned via importNode and therefore the node will be a different one\n\t\t\t\tconst node = part.path.reduceRight(({ childNodes }, i) => childNodes[i], this);\n\n\t\t\t\tif (part.type === 'node') {\n\t\t\t\t\treturn new ChildNodePart(node, templateResult.values[index]);\n\t\t\t\t\t// TODO: the nodes in the parts array also have nested parts information... could we start creating the nested parts here as well?\n\t\t\t\t}\n\t\t\t\tif (part.type === 'attribute') {\n\t\t\t\t\t// If we have multiple attribute parts with the same name, it means we have multiple\n\t\t\t\t\t// interpolations inside that attribute. Instead of creating a new part, we will return the same\n\t\t\t\t\t// as before and let it defer the update until the last interpolation gets updated\n\t\t\t\t\tif (previousAttributePart && previousAttributePart.name === part.name) {\n\t\t\t\t\t\tpreviousAttributePart.addNode(node);\n\t\t\t\t\t\treturn previousAttributePart;\n\t\t\t\t\t}\n\t\t\t\t\treturn (previousAttributePart = new AttributePart(node, part.name, part.initialValue));\n\t\t\t\t}\n\t\t\t\tif (part.type === 'directive') {\n\t\t\t\t\treturn new NodePart(node, templateResult.values[index]);\n\t\t\t\t}\n\n\t\t\t\tthrow `cannot map part: ${part}`;\n\t\t\t});\n\t\t\tthis.strings = templateResult.strings;\n\t\t}\n\t}\n\n\t/**\n\t * @param {TemplateResult} templateResult\n\t * @return {DocumentFragment}\n\t */\n\tparseFragment(templateResult) {\n\t\tconst templateString = templateResult.templateString;\n\t\treturn convertStringToTemplate(templateString);\n\t}\n}\n", "import { COMMENT_NODE, getNodePath } from '../util/DOMHelper';\nimport { encodeAttribute, isObjectLike } from '../util/AttributeParser.js';\nimport { TemplatePart } from './TemplatePart.js';\n\nconst voidElements = /^(?:area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr)$/i;\nconst elements = /<([a-z]+[a-z0-9:._-]*)([^>]*?)(\\/?)>/g;\n// TODO: v this will not match any values with escaped quotes like onClick='console.log(\"\\'test\")'\nconst attributes = /([^\\s]*)=((?:\")[^\"]*(?:\")|(?:')[^']*(?:')|[^\\s\\/>]*)|([^\\s\\/>]*)/g;\nconst partPositions = /[\\x01\\x02]/g;\n// \\x01 Node.ELEMENT_NODE\n// \\x02 Node.ATTRIBUTE_NODE\n// \\x03 COMMENT.ATTRIBUTE_TOKEN\n// \\x04 Node.ATTRIBUTE_TOKEN\n\nconst interpolation = new RegExp(`(<!--dom-part-(\\\\d+)--><!--/dom-part-(\\\\d+)-->|(\\\\S\\\\w+)=\"\\x04(\")?|\\x04)`, 'g');\n\n/**\n * Given a template, find part positions as both nodes and attributes and\n * return a string with placeholders as either comment nodes or named attributes.\n * @param {TemplateStringsArray | string[]} templateStrings a template literal tag array\n * @param {string} attributePlaceholders replace placeholders inside attribute values with this value\n * @returns {string} X/HTML with prefixed comments or attributes\n */\nexport const createTemplateString = (templateStrings, attributePlaceholders = '') => {\n\t// TODO: make it easier to identify attribute and node parts for SSR and leave the comments at those positions to be replaced in toString()\n\tlet partIndex = 0;\n\t// join all interpolations (for values) with a special placeholder and remove any whitespace\n\tlet template = templateStrings.join('\\x01').trim();\n\t// find (match) all elements to identify their attributes\n\ttemplate = template.replace(elements, (_, name, attributesString, trailingSlash) => {\n\t\tlet elementTagWithAttributes = name + attributesString.replaceAll('\\x01', attributePlaceholders).trimEnd();\n\t\tif (trailingSlash.length) elementTagWithAttributes += voidElements.test(name) ? ' /' : '></' + name;\n\t\t// collect all attribute parts so that we can place matching comment nodes\n\t\tconst attributeParts = attributesString.replace(attributes, (attribute, name, valueWithQuotes, directive) => {\n\t\t\tif (directive) {\n\t\t\t\treturn `<!--\\x02$-->`;\n\t\t\t}\n\n\t\t\t// remove quotes from attribute value to normalize the value\n\t\t\tconst value =\n\t\t\t\tvalueWithQuotes?.startsWith('\"') || valueWithQuotes?.startsWith(\"'\")\n\t\t\t\t\t? valueWithQuotes.slice(1, -1)\n\t\t\t\t\t: valueWithQuotes;\n\t\t\tconst partsCount = (attribute.match(/\\x01/g) || []).length;\n\t\t\tconst parts = [];\n\t\t\tfor (let index = 0; index < partsCount; index++) {\n\t\t\t\tparts.push(`<!--\\x02:${name}=${value.replaceAll('\\x01', '\\x03')}-->`);\n\t\t\t}\n\t\t\treturn parts.join('');\n\t\t});\n\t\treturn `\n\t\t\t\t${attributesString.includes('\\x01') ? attributeParts : ''}\n\t\t\t\t<${elementTagWithAttributes}>\n\t\t\t`;\n\t});\n\t// replace interpolation placeholders with our indexed markers\n\ttemplate = template.replace(partPositions, (partPosition) => {\n\t\tif (partPosition === '\\x01') {\n\t\t\treturn `<!--dom-part-${partIndex}--><!--/dom-part-${partIndex++}-->`;\n\t\t}\n\t\tif (partPosition === '\\x02') {\n\t\t\treturn `dom-part-${partIndex++}`;\n\t\t}\n\t});\n\treturn `\n\t\t<!--template-part-->\n\t\t${template}\n\t\t<!--/template-part-->\n\t`;\n\t// TODO: ^ this is actually important because of the whitespace\n};\n\n/**\n * @param {String} name\n * @param {any} value\n * @param {Boolean} isSingleValue\n * @return {String}\n */\nconst attribute = (name, value, isSingleValue = true) => {\n\treturn ` ${name}=\"${encodeAttribute(isObjectLike(value) ? JSON.stringify(value) : value)}${\n\t\tisSingleValue ? '\"' : ''\n\t}`;\n};\n\n/**\n * @param {any} value\n * @return {String}\n */\nconst getValue = (value) => {\n\tswitch (typeof value) {\n\t\tcase 'string':\n\t\t\treturn encodeAttribute(value);\n\t\tcase 'boolean':\n\t\tcase 'number':\n\t\t\treturn String(value);\n\t\tcase 'object':\n\t\t\tswitch (true) {\n\t\t\t\tcase Array.isArray(value):\n\t\t\t\t\treturn value.map(getValue).join('');\n\t\t\t\tcase value instanceof TemplateResult:\n\t\t\t\t\treturn value.toString();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'function':\n\t\t\treturn getValue(value());\n\t}\n\treturn value == null ? '' : encodeAttribute(String(value));\n};\n\n/** @type {Map<TemplateStringsArray, *[]>} */\nconst parsedUpdates = new WeakMap();\n\n/** @type {Map<Element, TemplatePart>} */\nconst templateParts = new WeakMap();\n\nexport class TemplateResult {\n\t/**\n\t * @param {TemplateStringsArray} strings\n\t * @param {any[]} values\n\t */\n\tconstructor(strings, ...values) {\n\t\tthis.strings = strings;\n\t\tthis.values = values;\n\t}\n\n\t/**\n\t * @param {Element} domNode\n\t */\n\trenderInto(domNode) {\n\t\tlet serverSideRendered = false;\n\t\tlet templatePart = templateParts.get(domNode);\n\t\tif (!templatePart) {\n\t\t\tconst startNode = Array.from(domNode.childNodes)\n\t\t\t\t.filter((node) => node.nodeType === COMMENT_NODE)\n\t\t\t\t.find((node) => node.data === 'template-part');\n\n\t\t\tserverSideRendered = startNode !== undefined;\n\n\t\t\ttemplatePart = new TemplatePart(startNode, this);\n\t\t\ttemplateParts.set(domNode, templatePart);\n\n\t\t\tif (!serverSideRendered) {\n\t\t\t\tdomNode.replaceChildren(...templatePart.childNodes);\n\t\t\t}\n\t\t} else {\n\t\t\ttemplatePart.update(this);\n\t\t}\n\t}\n\n\t/**\n\t * @param {String[]} strings\n\t * @return {(() => String)[]}\n\t */\n\tparse(strings) {\n\t\tconst html = createTemplateString(strings, '\\x04');\n\t\tconst parts = [];\n\t\tlet i = 0;\n\t\tlet match = null;\n\t\twhile ((match = interpolation.exec(html))) {\n\t\t\tconst pre = html.slice(i, match.index);\n\t\t\ti = match.index + match[0].length;\n\t\t\tif (match[2]) {\n\t\t\t\t// ChildNodePart\n\t\t\t\tconst index = match[2];\n\t\t\t\tparts.push((value) => `${pre}<!--dom-part-${index}-->${getValue(value)}<!--/dom-part-${index}-->`);\n\t\t\t} else if (match[4]) {\n\t\t\t\t// AttributePart with single interpolation or the first interpolation right after the attribute=\n\t\t\t\tconst isSingleValue = match[5] !== undefined;\n\t\t\t\tlet name = match[4];\n\t\t\t\tswitch (true) {\n\t\t\t\t\tcase name[0] === '?':\n\t\t\t\t\t\tconst booleanName = name.slice(1).toLowerCase();\n\t\t\t\t\t\tparts.push((value) => {\n\t\t\t\t\t\t\tif (!value) return '';\n\t\t\t\t\t\t\treturn `${pre} ${booleanName}=\"\"`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase name[0] === '.':\n\t\t\t\t\t\tconst lower = name.slice(1).toLowerCase();\n\t\t\t\t\t\tparts.push((value) => {\n\t\t\t\t\t\t\tlet result = pre;\n\t\t\t\t\t\t\t// null, undefined, and false are not shown at all\n\t\t\t\t\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\t\t\t\t\tresult += attribute(lower, '');\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// in all other cases, just escape it in quotes\n\t\t\t\t\t\t\t\tresult += attribute(lower, value, isSingleValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase name[0] === '@':\n\t\t\t\t\t\tname = 'on' + name.slice(1);\n\t\t\t\t\tcase name[0] === 'o' && name[1] === 'n':\n\t\t\t\t\t\tparts.push((value) => {\n\t\t\t\t\t\t\treturn pre;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparts.push((value) => {\n\t\t\t\t\t\t\tlet result = pre;\n\t\t\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\t\t\tresult += attribute(name, value, isSingleValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// AttributePart in the middle of an attribute value or NodePart\n\t\t\t\tparts.push((value) => {\n\t\t\t\t\tlet result = pre;\n\t\t\t\t\t// TODO: we currently cannot distinguish between NodeParts and AttributeParts before\n\t\t\t\t\tif (isObjectLike(value) && value.directiveClass) {\n\t\t\t\t\t\t// NodePart\n\t\t\t\t\t\t// result += encodeAttribute(isObjectLike(value) ? JSON.stringify(value) : value);\n\t\t\t\t\t} else if (value != null) {\n\t\t\t\t\t\tresult += encodeAttribute(isObjectLike(value) ? JSON.stringify(value) : value);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// We couldn't correctly parse parts from the template\n\t\tif (parts.length !== strings.length - 1) {\n\t\t\tthrow {\n\t\t\t\tname: 'ParseTemplateError',\n\t\t\t\tmessage: 'Could not parse parts from template correctly. Parts length has not the expected length.',\n\t\t\t\tstrings,\n\t\t\t\ttemplateString: html,\n\t\t\t\tparts,\n\t\t\t};\n\t\t}\n\n\t\tif (parts.length) {\n\t\t\tconst last = parts[parts.length - 1];\n\t\t\tconst chunk = html.slice(i);\n\t\t\tparts[parts.length - 1] = (value) => last(value) + chunk;\n\t\t} else {\n\t\t\tparts.push(() => html);\n\t\t}\n\t\treturn parts;\n\t}\n\n\t/**\n\t * @param {Node[]} childNodes\n\t * @return {object[]}\n\t */\n\tparseParts(childNodes) {\n\t\t// we always create a template fragment so that we can start at the root for traversing the node path\n\t\tconst range = globalThis.document?.createRange();\n\t\trange.setStartBefore(childNodes[0]);\n\t\trange.setEndAfter(childNodes[childNodes.length - 1]);\n\t\tconst template = range.cloneContents();\n\n\t\tconst treeWalker = globalThis.document?.createTreeWalker(template, 128);\n\t\tlet node = treeWalker.currentNode;\n\n\t\t// this is kinda freaky because the tree walker is shared throughout the recursion - but YOLO\n\t\tconst getParts = () => {\n\t\t\tconst parts = [];\n\t\t\tlet currentPart = undefined;\n\t\t\t// search for parts through numbered comment nodes with placeholders\n\t\t\twhile ((node = treeWalker.nextNode())) {\n\t\t\t\tif (/^template-part$/.test(node.data) && currentPart) {\n\t\t\t\t\t// start recursion -> add nested parts to previous part\n\t\t\t\t\tcurrentPart.parts = getParts();\n\t\t\t\t}\n\t\t\t\tif (/^\\/template-part$/.test(node.data)) {\n\t\t\t\t\t// end recursion\n\t\t\t\t\treturn parts;\n\t\t\t\t}\n\t\t\t\tif (/^dom-part-\\d+$/.test(node.data)) {\n\t\t\t\t\tparts.push((currentPart = { type: 'node', path: getNodePath(node), parts: [] }));\n\t\t\t\t}\n\t\t\t\tif (/^dom-part-\\d+:/.test(node.data)) {\n\t\t\t\t\tconst [_, attribute] = node.data.split(':');\n\t\t\t\t\tconst [name, initialValue] = attribute.split('=');\n\t\t\t\t\tcurrentPart = undefined;\n\t\t\t\t\tparts.push({ type: 'attribute', path: getNodePath(node), name: name, initialValue });\n\t\t\t\t}\n\t\t\t\tif (/^dom-part-\\d+\\$/.test(node.data)) {\n\t\t\t\t\tcurrentPart = undefined;\n\t\t\t\t\tparts.push({ type: 'directive', path: getNodePath(node) });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parts;\n\t\t};\n\n\t\tconst parts = getParts();\n\n\t\t// We couldn't correctly parse parts from the template\n\t\tif (parts.length !== this.strings.length - 1) {\n\t\t\tthrow {\n\t\t\t\tname: 'ParseTemplateError',\n\t\t\t\tmessage:\n\t\t\t\t\t'Could not parse parts from template correctly. Parts length has not the expected length. -> ' +\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tstrings: this.strings,\n\t\t\t\t\t\ttemplateString: this.templateString,\n\t\t\t\t\t\tchildNodes,\n\t\t\t\t\t\ttemplate,\n\t\t\t\t\t\tparts,\n\t\t\t\t\t}),\n\t\t\t};\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\t/**\n\t * find interpolations in the given template for nodes and attributes and\n\t * return a string with placeholders as either comment nodes or named attributes.\n\t * @returns {string} template with tagged placeholders for values\n\t */\n\tget templateString() {\n\t\treturn createTemplateString(this.strings);\n\t}\n\n\ttoString() {\n\t\tlet updates = parsedUpdates.get(this.strings);\n\n\t\tif (!updates) {\n\t\t\tupdates = this.parse(this.strings);\n\t\t\tparsedUpdates.set(this.strings, updates);\n\t\t}\n\n\t\treturn this.values.length ? this.values.map((value, index) => updates[index](value)).join('') : updates[0]();\n\t}\n}\n", "import { TemplateResult } from './TemplateResult';\n\n/**\n * @param {TemplateStringsArray} strings\n * @param {any[]} values\n * @return {TemplateResult}\n */\nconst html = function (strings, ...values) {\n\treturn new TemplateResult(strings, ...values);\n};\n\nexport { html };\n", "/**\n * Render a template string into the given DOM node\n * @param {TemplateResult | string} template\n * @param {Element} domNode\n */\nconst render = (template, domNode) => {\n\ttemplate.renderInto(domNode);\n};\n\nexport { render };\n", "import { StyledElement } from './StyledElement.js';\nimport { html } from './dom-parts/html.js';\nimport { render } from './dom-parts/render.js';\nexport { i18n } from './util/i18n.js';\n\nclass TemplateElement extends StyledElement {\n\tconstructor(options) {\n\t\tsuper({\n\t\t\tdeferUpdate: false,\n\t\t\tshadowRender: false,\n\t\t\tstyles: [],\n\t\t\tadoptGlobalStyles: true,\n\t\t\tmutationObserverOptions: {\n\t\t\t\tchildList: false,\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\t\tthis._template = this._options.template;\n\n\t\tif (this._options.shadowRender) this.attachShadow({ mode: 'open' });\n\t}\n\n\ttemplate() {\n\t\treturn html``;\n\t}\n\n\tupdate(options) {\n\t\tthis.renderTemplate();\n\t\tsuper.update(options);\n\t}\n\n\trenderTemplate() {\n\t\tconst template = this._template || this.template();\n\t\tif (typeof template === 'string') {\n\t\t\t// just a plain string literal. no lit-html required\n\t\t\tthis.getRoot().innerHTML = `${template}`;\n\t\t} else {\n\t\t\trender(template, this.getRoot());\n\t\t}\n\t}\n\n\tgetRoot() {\n\t\treturn this.shadowRoot !== null ? this.shadowRoot : this;\n\t}\n}\n\nexport { TemplateElement, html, render };\n"],
5
- "mappings": "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",
6
- "names": ["attribute", "value", "resolve", "reject", "attribute", "_a", "attribute", "name", "html", "parts"]
7
- }
package/src/util/i18n.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Retrieves a translated key from a dictionary on the window object
3
- * Example: ${i18n('CustomElement.buttonLabel', 'Label')}
4
- * @param key to be translated
5
- * @param fallback to be used if key is not defined
6
- * @return String of the translated key or fallback or original key
7
- */
8
- export function i18n(key, fallback) {
9
- try {
10
- const translations = window.elementjs.i18n();
11
- if (translations[key] === undefined) {
12
- throw 'Translation Missing';
13
- }
14
-
15
- return translations[key];
16
- } catch (err) {
17
- if (fallback) return fallback;
18
- else return key;
19
- }
20
- }