{"id":13657159,"url":"https://github.com/WebReflection/document-register-element","last_synced_at":"2025-04-24T01:31:17.184Z","repository":{"id":18600158,"uuid":"21805042","full_name":"WebReflection/document-register-element","owner":"WebReflection","description":"A stand-alone working lightweight version of the W3C Custom Elements specification","archived":true,"fork":false,"pushed_at":"2020-10-07T14:38:28.000Z","size":2165,"stargazers_count":1132,"open_issues_count":2,"forks_count":117,"subscribers_count":38,"default_branch":"master","last_synced_at":"2025-04-19T05:14:39.258Z","etag":null,"topics":["custom","customelements","element","polyfill","v0","v1"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WebReflection.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-07-14T02:28:43.000Z","updated_at":"2025-03-31T15:28:59.000Z","dependencies_parsed_at":"2022-09-25T00:50:50.539Z","dependency_job_id":null,"html_url":"https://github.com/WebReflection/document-register-element","commit_stats":null,"previous_names":[],"tags_count":92,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebReflection%2Fdocument-register-element","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebReflection%2Fdocument-register-element/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebReflection%2Fdocument-register-element/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebReflection%2Fdocument-register-element/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WebReflection","download_url":"https://codeload.github.com/WebReflection/document-register-element/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250361330,"owners_count":21417872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["custom","customelements","element","polyfill","v0","v1"],"created_at":"2024-08-02T05:00:37.786Z","updated_at":"2025-04-24T01:31:17.135Z","avatar_url":"https://github.com/WebReflection.png","language":"JavaScript","readme":"# Deprecated\n\nThis polyfill has served the Web well in the last 6 years, but it's time to use the *V1* only polyfill, which includes custom elements builtin extends like this one did before.\n\nSuch polyfill is in *npm* as [@ungap/custom-elements](https://github.com/ungap/custom-elements#readme) and it does all features detections for every browser without any need to worry about anything.\n\n```html\n\u003cscript src=\"//unpkg.com/@ungap/custom-elements\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n// alternatively, if bundlers are around\nimport '@ungap/custom-elements';\n// or\nrequire('@ungap/custom-elements');\n\u003c/script\u003e\n```\n\nHowever, if all you need is custom elements without builtin extends, a module also used by `@ungap/custom-elements` , [@webreflection/custom-elements-no-builtin](https://github.com/WebReflection/custom-elements-no-builtin#readme) is your stop.\n\n\n```html\n\u003cscript\u003e\nif(!self.customElements)\n  document.write('\u003cscript src=\"//unpkg.com/@webreflection/custom-elements-no-builtin\"\u003e\u003c\\x2fscript\u003e');\n\u003c/script\u003e\n```\n\nAlternatively, if it's a **ponyfill** hat you are after, see [@webreflection/custom-elements](https://github.com/WebReflection/custom-elements#how-to-polyfill) instructions, as this module is already exported as *ponyfill*.\n\n- - -\n\n [![build status](https://travis-ci.org/WebReflection/document-register-element.svg)](https://travis-ci.org/WebReflection/document-register-element) [![donate](https://img.shields.io/badge/$-donate-ff69b4.svg?maxAge=2592000\u0026style=flat)](https://github.com/WebReflection/donate) [![Backers on Open Collective](https://opencollective.com/document-register-element/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/document-register-element/sponsors/badge.svg)](#sponsors)\n=========================\n\n### Announcement\n\nPlease use [the modern version of this polyfill](https://github.com/ungap/custom-elements#readme) instead, which includes the following features:\n\n  * no [constructor caveats](https://github.com/WebReflection/document-register-element#v1-caveat), everything works like in Chrome or Firefox\n  * better performance, only defined builtin gets observed, thanks to [qsa-observer](https://github.com/WebReflection/qsa-observer#readme)\n  * better memory handling: no leaks, and less operations\n  * better ShadowDOM integration: builtin extends are observed within ShadowDOM nodes, either opened or closed\n\n- - -\n\nA stand-alone lightweight version of [Custom Elements V1](https://html.spec.whatwg.org/multipage/scripting.html#custom-elements)\nbased on top, and compatible with, the battle-tested [Custom Elements V0](http://w3c.github.io/webcomponents/spec/custom/),\nalready used in production with projects such as [Google AMP HTML ⚡](https://github.com/ampproject/amphtml#amp-html-) and others.\n\n## Important: How To Migrate To Native V1\n\nProjects based on this polyfill should consider migrating to V1 API, which is natively available for Safari, Chrome, Firefox, and soon Edge too.\n\nWhere built in extends are not possible, you can use my latest [built-in-element](https://github.com/ungap/custom-elements-builtin) polyfill instead, which will leave natively working implementations untouched, and will apply the minimal amount of patches to native V1 without built-in elements (only Safari to date).\n\n### How To Polyfill Custom Elements V1\n\nThis is a bullet-proof way to bring in Custom Elements V1 when needed.\n\n```html\n\u003cscript\u003ethis.customElements||document.write('\u003cscript src=\"//unpkg.com/document-register-element\"\u003e\u003c\\x2fscript\u003e');\u003c/script\u003e\n\u003cscript src=\"//unpkg.com/@ungap/custom-elements-builtin\"\u003e\u003c/script\u003e\n```\n\nDon't worry though, only very old browsers will pass through that `document.write`, preserving its _20yo_ tested nature, while no modern browser will ever complain.\n\nStick above **sequence of scripts** on top of any of your pages, and you'll see that only very old browsers will download this polyfill, while others will load **less than 1k**, delivering Custom Elements with 100% native performance.\n\nIf you are bundling instead all the code, consider decoupling _DRE_ bundling a part, or perform the same `customElements` check on the `window` and bring in only the right polyfill.\n\n### What About Shadow DOM ?\n\nThis polyfill, as well as _built-in-element_ one, are about Custom Elements that are a specification a part.\n\nIf you need for some reason Shadow DOM, I suggest you to look at [attach-shadow](https://github.com/WebReflection/attachshadow) \"_poorlyfill_\", which provides most basic/needed mechanism to create sandboxed components.\n\nYou can try other polyfills around the web too but, if I were you, I'll stay away from Shadow DOM where it's not natively supported because other polyfills are heavier, less compatible, and yet not 100% reliable.\n\n\n## Transpilers VS 1.9\n\nThe version 1.9 of this polyfill does **not** patch browsers with full native support for Custom Elements,\nas anyone would expect from a polyfill based on features detection.\n\nHowever, if your transpiler transforms native ES2015 classes into something incompatible, like [TypeScript does in this case](http://www.typescriptlang.org/play/index.html#src=class%20AFailure%20extends%20HTMLElement%20%7B%7D%0D%0AcustomElements.define('a-failure'%2C%20AFailure)%3B%0D%0Aconst%20fail%20%3D%20new%20AFailure%3B), you need to update, change, or better configure your tools to support proper classes.\n\nBabel 7 should've solved this in core, so use Babel 7 if you need transpilers.\n\n\n### How to avoid CE Built In\nSince version `1.6` the **ponyfill** flag can be either a `string`,\nrepresenting the ponyfill `type` such `\"auto\"` or `\"force\"`,\nor an `object`, with the following shape:\n\n```js\ninstallCE(global, {\n  type: 'force' || 'auto' (default),\n  noBuiltIn: true (default undefined / false)\n});\n```\n\nIf you set `noBuiltIn` to true,\nthe `V1` API will be polyfilled where needed.\n\nNo extra checks and patches will be applied\nto make custom elements built-in work.\n\n\n### New Ponyfill in 1.3\nAs discussed in issue #86 there is currently no way to require\ndocument-register-element polyfill without automatic\nfeature detection and possible global context pollution.\n\nSince there could be some very specific case when the browser\nshould be force-patched, the `pony` version of the module\nwill not attempt to feature detect anything and it will only\nenrich the environment once invoked.\n\n```js\nconst installCE = require('document-register-element/pony');\n\n// by default, the second argument is 'auto'\n// but it could be also 'force'\n// which ignores feature detection and force\n// the polyfill version of CustomElements\ninstallCE(global, 'force');\n```\n\n\n# What's new in Custom Elements v1\nThe ability to extend by simply defining classes:\n```js\n// create a class with custom methods\n// overrides, special behavior\nclass MyGreetings extends HTMLElement {\n  show() {\n    alert(this.textContent);\n  }\n}\n\n// define it in the CustomElementRegistry\ncustomElements.define('my-greetings', MyGreetings);\n```\n\nIt is also possible to extend native components, as written in specs.\n```js\n// extends some different native constructor\nclass MyButton extends HTMLButtonElement {}\n\n// define it specifying what's extending\ncustomElements.define('my-button', MyButton, {extends: 'button'});\n\n// \u003cbutton is=\"my-button\"\u003eclick me\u003c/button\u003e\ndocument.body.appendChild(\n  new MyButton\n).textContent = 'click me';\n```\n\nSpecial methods are also slightly different from v0:\n\n  * the `constructor` is invoked instead of the `createdCallback` one\n  * `connectedCallback` is the new `attachedCallback`\n  * `disconnectedCallback` is the new `detachedCallback`\n  * `attributeChangedCallback` is sensitive to the public static list of attributes to be notified about\n\n```js\nclass MyDom extends HTMLElement {\n  static get observedAttributes() {\n    return ['country'];\n  }\n  attributeChangedCallback(name, oldValue, newValue) {\n    // react to changes for name\n    alert(name + ':' + newValue);\n  }\n}\ncustomElements.define('my-dom', MyDom);\nvar md = new MyDom();\nmd.setAttribute('test', 'nope');\nmd.setAttribute('country', 'UK'); // country: UK\n```\n\n\n# V1 Caveat\nThe current standard cannot possibly be polifilled \"*1:1*\" with vanilla JavaScript because procedurally created instances need an upgrade.\nIf the `constructor` is needed to setup nodes, there are two solutions:\n\n### Upgrading the `constructor` context\n```js\nclass MyElement extends HTMLElement {\n  // the self argument might be provided or not\n  // in both cases, the mandatory `super()` call\n  // will return the right context/instance to use\n  // and eventually return\n  constructor(...args) {\n    const self = super(...args);\n    self.addEventListener('click', console.log);\n    // important in case you create instances procedurally:\n    // var me = new MyElement();\n    return self;\n  }\n}\n```\n\n\n### Skipping the caveat through `extends`\n```js\n// base class to extend, same trick as before\nclass HTMLCustomElement extends HTMLElement {\n  constructor(...$) { const _ = super(...$); _.init(); return _; }\n  init() { /* override as you like */ }\n}\n\n// create any other class inheriting HTMLCustomElement\nclass MyElement extends HTMLCustomElement {\n  init() {\n    // just use `this` as regular\n    this.addEventListener('click', console.log);\n    // no need to return it\n  }\n}\n```\n\n\n#### Inherited V0 Caveats\nPlease keep in mind old gotchas with [innerHTML](https://github.com/WebReflection/document-register-element#using-innerhtml) or [other caveats](https://github.com/WebReflection/document-register-element#common-issues--caveat) are still valid.\n\n\n### How\n\n`npm install document-register-element` will put [build/document-register-element.js](build/document-register-element.js) inside `node_modules/document-register-element/` of your project.\n\nIf you're working with a tool like Browserify, Webpack, RequireJS, etc, you can\nimport the script at some point before you need to use the API.\n\n```js\nimport 'document-register-element' // ES2015\n// or\nrequire('document-register-element') // CommonJS\n// or\ndefine(['document-register-element'], function() {}) // AMD\n```\n\nIf you're not using a module system, just place\n`node_modules/document-register-element/build/document-register-element.js`\nsomewhere where it will be served by your server, then put\n\n```html\n\u003cscript src=\"/path/to/document-register-element.js\"\u003e\u003c/script\u003e\n```\n\nin your head element and you should be good to go.\n\n\n#### via CDN\nMany thanks to [cdnjs](http://www.cdnjs.com) for hosting this script. Following an example on how to include it.\n```html\n\u003cscript\n  src=\"//cdnjs.cloudflare.com/ajax/libs/document-register-element/1.13.0/document-register-element.js\"\n\u003e/* W3C Custom Elements */\u003c/script\u003e\n```\n\n\n### Tested On\n\nThe [live test page](http://webreflection.github.io/document-register-element/test/) is here, containing all tests as listed in [the test file](test/document-register-element.js).\n\nThe following list of **desktop** browsers has been successfully tested:\n\n  * Chrome\n  * Firefox\n  * IE 8 or greater (please read [about IE8](https://github.com/WebReflection/document-register-element#about-ie8) caveats)\n  * Safari\n  * Opera\n\nThe following list of **mobile** OS has been successfully tested:\n\n  * iOS 5.1 or greater\n  * Android 2.2 or greater\n  * FirefoxOS 1.1 or greater\n  * KindleFire 3 or greater\n  * Windows Phone 7 or greater\n  * Opera Mobile 12 or greater\n  * Blackberry OS 7* and OS 10\n  * webOS 2 or LG TV\n  * Samsung Bada OS 2 or greater\n  * NOKIA Asha with Express Browser\n\nThe good old [BB OS 7](http://us.blackberry.com/software/smartphones/blackberry-7-os.html) is the only one failing the test with `className` which is not notified as `attributeChanged` when it's changed. This means BB OS 7 will also fail with `id`, however changing `id` at runtime has never been a common or useful pattern.\n\n\n### TL;DR does it work ?\nIf you [see the first clock ticking](http://webreflection.github.io/document-register-element/test/examples/x-clock.html), the TL;DR answer is yes.\n\n\n### V0 Usage Example\n\nA basic HTML example page\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003ctitle\u003etesting my-element\u003c/title\u003e\n  \u003cscript src=\"js/document-register-element.js\"\u003e\u003c/script\u003e\n  \u003cscript src=\"js/my-element.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cmy-element\u003e\n    some content\n  \u003c/my-element\u003e\n\u003c/body\u003e\n```\n\nwith the following `my-element.js` content\n```javascript\nvar MyElement = document.registerElement(\n  'my-element',\n  {\n    prototype: Object.create(\n      HTMLElement.prototype, {\n      createdCallback: {value: function() {\n        console.log('here I am ^_^ ');\n        console.log('with content: ', this.textContent);\n      }},\n      attachedCallback: {value: function() {\n        console.log('live on DOM ;-) ');\n      }},\n      detachedCallback: {value: function() {\n        console.log('leaving the DOM :-( )');\n      }},\n      attributeChangedCallback: {value: function(\n        name, previousValue, value\n      ) {\n        if (previousValue == null) {\n          console.log(\n            'got a new attribute ', name,\n            ' with value ', value\n          );\n        } else if (value == null) {\n          console.log(\n            'somebody removed ', name,\n            ' its value was ', previousValue\n          );\n        } else {\n          console.log(\n            name,\n            ' changed from ', previousValue,\n            ' to ', value\n          );\n        }\n      }}\n    })\n  }\n);\n```\n\n\n### Why\nI wrote a [couple](http://webreflection.blogspot.co.uk/2014/07/a-w3c-custom-elements-alternative.html) of blog [posts](http://webreflection.blogspot.co.uk/2015/03/bringing-custom-elements-to-ie8.html) about this polyfill, and here's the quick summary:\n\n* [document-register-element.js](build/document-register-element.js) is a stand alone polyfill which aims to support as many browsers as possible, without requiring extra dependencies at all, all in about **5KB** minified and gzipped.\n\nAdd if you want the [dom4](https://github.com/WebReflection/dom4#dom4) normalizer, and you'll find yourself in a modern DOM environment that works reliably with today's browsers, with an eye always open on performance.\n### Common Issues + Caveat\nHere a list of gotchas you might encounter when developing *CustomElement* components.\n\n#### HTML{TABLE|ROW|INPUT|SELECT|others...}Element\nAs described in [issue 6](https://github.com/WebReflection/document-register-element/issues/6) it's not possible to fully inherit a table, input, select, or other special element behaviors.\n```js\n// This will NOT work as expected\ndocument.registerElement(\n  'my-input',\n  {\n    prototype: Object.create(\n      HTMLInputElement.prototype\n    )\n  }\n);\n\nvar mi = document.createElement('my-input');\n```\n\nThe correct way to properly implement a custom input that will be also backward compatible is the following one:\n```js\n// This will NOT work as expected\ndocument.registerElement(\n  'my-input',\n  {\n    extends: 'input', // \u003c== IMPORTANT\n    prototype: Object.create(\n      HTMLInputElement.prototype\n    )\n  }\n);\n\n// how to create the input\nvar mi = document.createElement(\n  'input',    // the extend\n  'my-input'  // the enriched custom definition\n);\n```\n\nAnother approach is to use just a basic `HTMLElement` component and initialize its content at runtime.\n```js\ndocument.registerElement(\n  'my-input',\n  {\n    prototype: Object.create(\n      HTMLElement.prototype,\n      {\n        createdCallback: {value: function () {\n          // here the input\n          this.el = this.appendChild(\n            document.createElement('input')\n          );\n        }}\n      }\n    )\n  }\n);\n\nvar mi = document.createElement('my-input');\n```\nIn this case every method that wants to interact with the input will refer `this.el` instead of just `this`.\n\n\n#### Using `innerHTML`\nIn order to avoid huge performance impact, native behavior overwrite problems and incompatibilities, there is now a [helper script](https://github.com/WebReflection/document-register-element/blob/master/build/innerHTML.max.js),\nwhich aim is to make **off-line custom elements creation** possible using template strings instead of needing manual `document.createElement` replacements.\n\nThe helper is a simple `innerHTML` function that returns the given node, after setting `innerHTML` and, in case the polyfill is used, initialize nodes.\n\nThis helper is needed in order to be aligned with native implementations, but please remember that `createdCallback` could be asynchronous, even if triggered ASAP after injecting HTML through this function.\n\n\n#### Changing the `style` property\n\nIf you change the style property via `node.style.cssText` or `node.style.backgroundColor = \"red\"` this change will most likely reflect through `node.getAttribute(\"style\")`.\n\nIn order to prevent footguns inside `attributeChangedCallback` invocations causing potential stack overflows, the `style` property has been filtered starting from version `0.1.1`, also reflecting current native implementation where changing this special property won't invoke the callback.\n\n(yes, even using `node.setAttribute(\"style\", \"value\")` that you shouldn't ... just use `node.style.cssText = \"value\"` instead)\n\n\n#### About IE8\n\nStarting from version `0.2.0` there is an experimental support for IE8.\nThere is a specific file that needs to be loaded in IE8 only upfront, plus a sequence of polyfills\nthat will be simply ignored by every browser but downloaded in IE8.\n\nPlease check [base.html file](examples/base.html) in order to have a basic model to reuse in case you want to support IE8.\n\nAll tests pass and there is a [map component example](http://webreflection.github.io/document-register-element/test/examples/x-map.html) that already works in IE8 too.\n\nRemember there are few things to consider when IE8 is a target but since it didn't cost many bytes\nto have it in, I've decided to merge the logic and maintain only one file that will work in IE8 too.\n\n\n#### IE8 caveats\n\n  * it's IE8\n  * all operations are batched and eventually executed ASAP but asynchronously. This behavior is closer to native Mutation Observers but might have some extra glitch in rendering time\n  * `className` is right now the only special attribute that reacts. Others might be implemented in the [dre-ie8-upfront-fix.js](src/dre-ie8-upfront-fix.js) file.\n  * in order to have node reacting to attributes changes, these must be live on the DOM\n  * if you are using `extends` when create a custom element, remember to minify the production code or wrap such reserved word in quotes\n\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\u003ca href=\"graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/contributors.svg?width=890\" /\u003e\u003c/a\u003e\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/document-register-element#backer)]\n\n\u003ca href=\"https://opencollective.com/document-register-element#backers\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/backers.svg?width=890\"\u003e\u003c/a\u003e\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/document-register-element#sponsor)]\n\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/document-register-element/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/document-register-element/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n\n","funding_links":["https://opencollective.com/document-register-element"],"categories":["JavaScript","Archive"],"sub_categories":["Polyfills"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWebReflection%2Fdocument-register-element","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FWebReflection%2Fdocument-register-element","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWebReflection%2Fdocument-register-element/lists"}