| OLD | NEW |
| (Empty) |
| 1 # Shadow DOM polyfill | |
| 2 | |
| 3 Shadow DOM is designed to provide encapsulation by hiding DOM subtrees under | |
| 4 shadow roots. It provides a method of establishing and maintaining functional | |
| 5 boundaries between DOM trees and how these trees interact with each other within | |
| 6 a document, thus enabling better functional encapsulation within the DOM. See | |
| 7 the | |
| 8 [W3C specification](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shado
w/index.html) | |
| 9 for details. | |
| 10 | |
| 11 ## Getting started | |
| 12 | |
| 13 Include the polyfill in your HTML `<head>` to enable Shadow DOM: | |
| 14 | |
| 15 ```html | |
| 16 <script src="packages/shadow_dom/shadow_dom.debug.js"></script> | |
| 17 ``` | |
| 18 | |
| 19 You can also use a minified version for deployment: | |
| 20 | |
| 21 ```html | |
| 22 <script src="packages/shadow_dom/shadow_dom.min.js"></script> | |
| 23 ``` | |
| 24 | |
| 25 Because it does extensive DOM patching, it should be included **before** other | |
| 26 script tags. | |
| 27 | |
| 28 ## Useful resources | |
| 29 | |
| 30 - [What the Heck is Shadow DOM?](http://glazkov.com/2011/01/14/what-the-heck-is-
shadow-dom/) | |
| 31 - [Web Components Explained - Shadow DOM](https://dvcs.w3.org/hg/webcomponents/r
aw-file/57f8cfc4a7dc/explainer/index.html#shadow-dom-section) | |
| 32 - [HTML5Rocks - Shadow DOM 101](http://www.html5rocks.com/tutorials/webcomponent
s/shadowdom/) | |
| 33 - [HTML5Rocks - Shadow DOM 201: CSS and Styling](http://www.html5rocks.com/tutor
ials/webcomponents/shadowdom-201/) | |
| 34 - [HTML5Rocks - Shadow DOM 301: Advanced Concepts & DOM APIs](http://www.html5ro
cks.com/tutorials/webcomponents/shadowdom-301/) | |
| 35 | |
| 36 ## Learn the tech | |
| 37 | |
| 38 ### Basic usage | |
| 39 | |
| 40 ```dart | |
| 41 var el = new DivElement(); | |
| 42 var shadow = el.createShadowRoot(); | |
| 43 shadow.innerHtml = '<content select="h1"></content>'; | |
| 44 ``` | |
| 45 | |
| 46 ### Shadow DOM subtrees | |
| 47 | |
| 48 Shadow DOM allows a single node to express three subtrees: _light DOM_, _shadow
DOM_, and _composed DOM_. | |
| 49 | |
| 50 A component user supplies the light DOM; the node has a (hidden) shadow DOM; and
the composed DOM is what is actually rendered in the browser. At render time, t
he light DOM is merged with the shadow DOM to produce the composed DOM. For exam
ple: | |
| 51 | |
| 52 **Light DOM** | |
| 53 | |
| 54 ```html | |
| 55 <my-custom-element> | |
| 56 <!-- everything in here is my-custom-element's light DOM --> | |
| 57 <q>Hello World</q> | |
| 58 </my-custom-element> | |
| 59 ``` | |
| 60 | |
| 61 **Shadow DOM** | |
| 62 | |
| 63 ```html | |
| 64 <!-- shadow-root is attached to my-custom-element, but is not a child --> | |
| 65 <shadow-root> | |
| 66 <!-- everything in here is my-custom-element's shadow DOM --> | |
| 67 <span>People say: <content></content></span> | |
| 68 </shadow-root> | |
| 69 ``` | |
| 70 | |
| 71 **Composed (rendered) DOM** | |
| 72 | |
| 73 ```html | |
| 74 <!-- rendered DOM --> | |
| 75 <my-custom-element> | |
| 76 <span>People say: <q>Hello World</q></span> | |
| 77 </my-custom-element> | |
| 78 ``` | |
| 79 | |
| 80 The following is true about this example: | |
| 81 | |
| 82 * The light DOM that belongs to `<my-custom-element>` is visible to the user as
its normal subtree. It can expressed by `.childNodes`, `.nodes`, `.innerHtml` or
any other property or method that gives you information about a node's subtree. | |
| 83 * Nodes in light DOM or shadow DOM express parent and sibling relationships that
match their respective tree structures; the relationships that exist in the ren
dered tree are not expressed anywhere in DOM. | |
| 84 | |
| 85 So, while in the final rendered tree `<span>` is a child of `<my-custom-element>
` and the parent of `<q>`, interrogating those nodes will tell you that the `<sp
an>` is a child of `<shadow-root>` and `<q>` is a child of `<my-custom-element>`
, and that those two nodes are unrelated. | |
| 86 | |
| 87 In this way, the user can manipulate light DOM or shadow DOM directly as regular
DOM subtrees, and let the system take care of keeping the render tree synchroni
zed. | |
| 88 | |
| 89 ## Polyfill details | |
| 90 | |
| 91 You can read more about how the polyfill is implemented in JavaScript here: | |
| 92 <https://github.com/polymer/ShadowDOM#polyfill-details>. | |
| 93 | |
| 94 ## Getting the source code | |
| 95 | |
| 96 This package is built from: | |
| 97 <https://github.com/dart-lang/ShadowDOM/tree/conditional_shadowdom> | |
| 98 | |
| 99 You'll need [node.js](http://nodejs.org) to rebuild the JS file. Use `npm instal
l` to | |
| 100 get dependencies and `grunt` to build. | |
| OLD | NEW |