├── .hgtags ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── assets ├── docs │ └── spec-assist.html ├── images │ ├── angular-poster-frame.png │ ├── composed-tree.svg │ ├── distribution.svg │ ├── ember-poster-frame.png │ ├── event-path-component-trees.svg │ ├── event-path-flat-tree.svg │ ├── example-basic-carousel.png │ ├── example-basic-list-box.png │ ├── example-basic-sequence.png │ ├── example-calendar.png │ ├── example-composed-tree.svg │ ├── example-flat-tree.svg │ ├── example-slotting.svg │ ├── flat-tree-desc.html │ ├── flat-tree.svg │ ├── import-style-document-order.png │ ├── react-poster-frame.png │ └── shadow-dom.graffle ├── scripts │ ├── autolink.js │ ├── bug-assist.js │ ├── prettify.js │ ├── spec-assist.js │ └── spec-assist_unittests.js └── styles │ ├── main.css │ ├── prettify.css │ └── spec.css ├── explainer ├── bug-assist.js └── index.html ├── index.html ├── proposals ├── Constructor-Dmitry.md ├── Cross-Origin-Custom-Elements-Concept-and-Proposal.md ├── Custom-Pseudo-Elements.md ├── DOM-Parts-Declarative-Template.md ├── DOM-Parts-Imperative.md ├── DOM-Parts.md ├── Declarative-Custom-Elements-Strawman.md ├── Declarative-Shadow-DOM.md ├── Default-Stylesheets-Concept-and-Proposal.md ├── Distribution-Timing-Experiment.md ├── HTML-Imports-and-ES-Modules.md ├── HTML-Modules-Demo │ ├── HTML5-Element.html │ └── Main.html ├── Imperative-API-for-Node-Distribution-in-Shadow-DOM.md ├── Imperative-Shadow-DOM-Distribution-API.md ├── Isolated-Imports-Proposal.md ├── Limiting-the-superpowers-of-the-Shadow-DOM-piercing-cominator.md ├── Multiple-Shadow-Roots-as-a-Shadow-Root-hosts-another-Shadow-Root.md ├── Optional-Upgrades-Optional-Constructors.md ├── Parser-Created-Constructors.md ├── Partial-Redistributions-Analysis.md ├── Proposal-for-changes-to-manage-Shadow-DOM-content-distribution.md ├── Scoped-Custom-Element-Registries.md ├── Shadow-DOM-Cascade-Order-in-v1.md ├── Shadow-DOM-Cascade-Order.md ├── ShadowRoot-delegatesFocus-Proposal.md ├── Slots-Proposal.md ├── Template-Instantiation.md ├── Type-Extensions.md ├── Why-Upgrades.md ├── css-modules-v1-explainer.md ├── custom-element-default-focus.md ├── custom-states-and-state-pseudo-class.md ├── html-module-spec-changes.md ├── html-modules-explainer.md ├── html-modules-proposal.md ├── reference-target-explainer.md └── shadow-dom-v1-in-blink.md ├── publish ├── custom │ ├── LCWD-custom-elements-20131024 │ │ ├── custom-elements-whole-world.svg │ │ ├── index.html │ │ ├── prettify.css │ │ └── spec.css │ ├── WD-custom-elements-20130514 │ │ ├── index.html │ │ ├── prettify.css │ │ └── spec.css │ └── WD-custom-elements-20141218 │ │ ├── custom-elements-whole-world.svg │ │ ├── index.html │ │ ├── prettify.css │ │ └── spec.css ├── explainer │ ├── WD-components-intro-20130606 │ │ ├── event-handler-registration.png │ │ ├── event-routing-retargeting.png │ │ ├── index.html │ │ ├── prettify.css │ │ ├── shadow-rendering.svg │ │ ├── shadow-trees.svg │ │ └── spec.css │ ├── event-handler-registration.png │ ├── event-routing-retargeting.png │ ├── index.html │ ├── prettify.css │ ├── shadow-dom-subtrees.svg │ ├── shadow-rendering.svg │ ├── shadow-stack.svg │ └── spec.css ├── imports │ ├── WD-html-imports-20130514 │ │ ├── index.html │ │ ├── prettify.css │ │ └── spec.css │ ├── WD-html-imports-20140306 │ │ ├── import-link-list.png │ │ ├── index.html │ │ ├── prettify.css │ │ └── spec.css │ └── WD-html-imports-20160225 │ │ ├── import-link-list.png │ │ ├── index.html │ │ └── respec-complement.css ├── shadow │ ├── WD-shadow-dom-20120522 │ │ ├── functional-encapsulation-example.svg │ │ ├── index.html │ │ ├── insertion-points.svg │ │ ├── prettify.css │ │ ├── shadow-dom-subtrees.svg │ │ ├── shadow-rendering.svg │ │ └── spec.css │ ├── WD-shadow-dom-20121016 │ │ ├── functional-encapsulation-example.svg │ │ ├── index.html │ │ ├── insertion-points.svg │ │ ├── prettify.css │ │ ├── shadow-dom-subtrees.svg │ │ ├── shadow-rendering.svg │ │ └── spec.css │ ├── WD-shadow-dom-20130514 │ │ ├── common.svg │ │ ├── functional-encapsulation-example.svg │ │ ├── index.html │ │ ├── insertion-points.svg │ │ ├── prettify.css │ │ ├── shadow-rendering.svg │ │ ├── shadow-root-and-shadow-host.svg │ │ ├── shadow-stack.svg │ │ ├── shadow-trees.svg │ │ └── spec.css │ ├── WD-shadow-dom-20140612 │ │ ├── composed-tree.svg │ │ ├── distributions.svg │ │ ├── event-path-and-composed-tree.svg │ │ ├── event-path-node-trees.svg │ │ ├── event-path-tree-of-trees.svg │ │ ├── index.html │ │ ├── re-distributions.svg │ │ ├── respec-complement.css │ │ ├── tree-of-trees.svg │ │ └── working-draft.css │ ├── WD-shadow-dom-20140619 │ │ ├── composed-tree.svg │ │ ├── distributions.svg │ │ ├── event-path-and-composed-tree.svg │ │ ├── event-path-node-trees.svg │ │ ├── event-path-tree-of-trees.svg │ │ ├── index.html │ │ ├── re-distributions.svg │ │ ├── respec-complement.css │ │ ├── tree-of-trees.svg │ │ ├── working-draft.css │ │ └── working-draft.js │ ├── WD-shadow-dom-20151006 │ │ ├── composed-tree.svg │ │ ├── composition-composed-tree.svg │ │ ├── composition-slotting.svg │ │ ├── composition-tree-of-trees.svg │ │ ├── distributions.svg │ │ ├── event-path-composed-tree.svg │ │ ├── event-path-trees.svg │ │ ├── index.html │ │ ├── respec-complement.css │ │ ├── tree-of-trees.svg │ │ ├── working-draft.css │ │ └── working-draft.js │ └── WD-shadow-dom-20151008 │ │ ├── composed-tree.svg │ │ ├── composition-composed-tree.svg │ │ ├── composition-slotting.svg │ │ ├── composition-tree-of-trees.svg │ │ ├── distributions.svg │ │ ├── event-path-composed-tree.svg │ │ ├── event-path-trees.svg │ │ ├── index.html │ │ ├── respec-complement.css │ │ ├── tree-of-trees.svg │ │ ├── working-draft.css │ │ └── working-draft.js └── template │ ├── WD-html-templates-20130214 │ ├── index.html │ ├── prettify.css │ └── spec.css │ └── WD-html-templates-20130328 │ ├── index.html │ ├── prettify.css │ └── spec.css ├── samples ├── contacts-widget.html ├── entry-helper.html ├── index.html ├── replay-extension.html ├── table-chart.html ├── timezone-map-custom-element.html ├── timezone-map-decorator.html └── widget-theming.html ├── spec ├── custom │ └── index.html ├── imports │ ├── W3CTRMANIFEST │ ├── import-link-list.png │ └── index.html └── shadow │ └── index.html └── w3c.json /.hgtags: -------------------------------------------------------------------------------- 1 | 8511d6775adc4189f7f0cf31db104b697e0726ce draft-1 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | branches: 4 | only: 5 | - gh-pages 6 | env: 7 | global: 8 | - URL="" 9 | - DECISION="https://lists.w3.org/Archives/Public/public-webapps/2014JulSep/0627.html" 10 | - secure: "IOj5spID70zoohkd8SpllAaZUtquHV2gnlhSxpBJWfKhuB17KaUAMB4gD7RBn/jn4jv1iHUg6h27gVn5YSOTzaLcFDZpRcbrdj5Jeq9syBYZzGsyno3vkjxB8wsbFuKOpJjRBRyANlqeyONxpy4q7/PGQzm3Xb9WARr/Tp8BU4c=" 11 | - secure: "DJQLaedMUu+DxMZiQ0YXJilXvio9SwXJt3Jq32nIwn9dVZuPb7g4Rv71AdgB71jJBU7T+AhXGJTen0hTBMDMkYevfP0ZQue8gV4DYMJH/Np5qGTq3nqfVcP33gZyGzbU3fbcA3K7qIVFvXDKXzDpZ/wB2XwHijx/6N+UrajR9yA=" 12 | - secure: "YGJ8zZNLJVpklZBTxJvW+/6L6yX8WePuOET/RgOx4R4uH6pV/wwfkcExB491z0uAB3ZlJbTiPwAfS/WgvfzwmXqkP51+Apm6Jt7esyEMumOUgY+vqq3p4nulc7qWcgo6mdy/KUOg95WvjMaN7FBcD9sQEklyOYk8X40opdGsqyY=" 13 | script: 14 | - echo "ok" 15 | after_success: 16 | - SPECS=`git diff-tree --no-commit-id --name-only -r ${TRAVIS_COMMIT} | grep '^spec' | cut -d'/' -f 2 | sort | uniq | xargs` 17 | - test $TRAVIS_PULL_REQUEST = false && test "${SPECS#*custom}" != "$SPECS" && curl "https://labs.w3.org/echidna/api/request" --data "url=http://w3c.github.io/webcomponents/spec/custom/W3CTRMANIFEST" --data "decision=$DECISION" --data "token=$TOKEN_CUSTOM" 18 | - test $TRAVIS_PULL_REQUEST = false && test "${SPECS#*shadow}" != "$SPECS" && curl "https://labs.w3.org/echidna/api/request" --data "url=http://w3c.github.io/webcomponents/spec/shadow/W3CTRMANIFEST" --data "decision=$DECISION" --data "token=$TOKEN_SHADOW" 19 | - test $TRAVIS_PULL_REQUEST = false && test "${SPECS#*imports}" != "$SPECS" && curl "https://labs.w3.org/echidna/api/request" --data "url=http://w3c.github.io/webcomponents/spec/imports/W3CTRMANIFEST" --data "decision=$DECISION" --data "token=$TOKEN_IMPORTS" 20 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | All documentation, code and communication under this repository are covered by the [W3C Code of Ethics and Professional Conduct](https://www.w3.org/Consortium/cepc/). 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Web Platform Working Group 2 | 3 | Contributions to this repository are intended to become part of Recommendation-track documents governed by the 4 | [W3C Patent Policy](http://www.w3.org/Consortium/Patent-Policy-20040205/) and 5 | [Software and Document License](http://www.w3.org/Consortium/Legal/copyright-software). To make substantive contributions to specifications, you must either participate 6 | in the relevant W3C Working Group or make a non-member patent licensing commitment. 7 | 8 | If you are not the sole contributor to a contribution (pull request), please identify all 9 | contributors in the pull request comment. 10 | 11 | To add a contributor (other than yourself, that's automatic), mark them one per line as follows: 12 | 13 | ``` 14 | +@github_username 15 | ``` 16 | 17 | If you added a contributor by mistake, you can remove them in a comment with: 18 | 19 | ``` 20 | -@github_username 21 | ``` 22 | 23 | If you are making a pull request on behalf of someone else but you had no part in designing the 24 | feature, you can remove yourself with the above syntax. 25 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | All documents in this Repository are licensed by contributors 2 | under the 3 | [W3C Software and Document License](http://www.w3.org/Consortium/Legal/copyright-software). -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web Components 2 | 3 | Web Components are a new browser feature that provides a standard component model for the Web, consisting of several pieces maintained in different places: 4 | 5 | - Shadow DOM 6 | - Most of the parts are now maintained in [DOM Standard](https://dom.spec.whatwg.org/), called shadow trees. 7 | Some of the parts are still remained in this repository. See [Issue #661](https://github.com/w3c/webcomponents/issues/661) for the progress of upstreaming those parts from the partially out-of-date [Shadow DOM](https://w3c.github.io/webcomponents/spec/shadow/) document. 8 | - [Issues against the DOM and HTML Standard](https://github.com/search?q=org%3Awhatwg+label%3A%22topic%3A+shadow%22+is%3Aopen). 9 | - [Issues raised in this repository](https://github.com/w3c/webcomponents/labels/shadow-dom). 10 | - [The old issue tracker](https://www.w3.org/Bugs/Public/showdependencytree.cgi?id=14978) on W3C bugzilla, which is no longer used. 11 | - Custom Elements 12 | - Custom elements were upstreamed into the [HTML Standard](https://html.spec.whatwg.org/multipage/scripting.html#custom-elements) (and bits in the DOM Standard) and are maintained there. 13 | - [Issues against the DOM and HTML Standard](https://github.com/search?q=org%3Awhatwg+label%3A%22topic%3A+custom%20elements%22+is%3Aopen). 14 | - [Issues raised in this repository](https://github.com/w3c/webcomponents/labels/custom-elements). 15 | - [The old issue tracker](https://www.w3.org/Bugs/Public/showdependencytree.cgi?id=14968) on W3C bugzilla, which is no longer used. 16 | - HTML Templates 17 | - HTML Templates were upstreamed into the [HTML Standard](https://html.spec.whatwg.org/multipage/scripting.html#the-template-element) and are fully maintained there. 18 | - CSS changes 19 | - The CSS WG works on [CSS Scoping](https://drafts.csswg.org/css-scoping/) and [CSS Shadow Parts](https://drafts.csswg.org/css-shadow-parts/), which help dealing with shadow trees with various selectors. Various other parts of CSS and its object model are also impacted by shadow trees and directly worked on in the various CSS specificaions. 20 | - [Issues against the CSS WG repository](https://github.com/w3c/csswg-drafts/labels/topic%3A%20shadow). 21 | - JSON, [CSS](proposals/css-modules-v1-explainer.md), [HTML](proposals/html-modules-explainer.md) Modules 22 | - Successor to the abandoned *[HTML Imports](https://w3c.github.io/webcomponents/spec/imports/)*, allows JSON, CSS, and HTML markup to be requested by a component. HTML Modules Spec work is being incubated upstream in whatwg/html (see [PR](https://github.com/whatwg/html/pull/4505)). For new issues, please file against whatwg/html or here in w3c/webcomponents. See also the [HTML Modules explainer](proposals/html-modules-explainer.md), [initial proposal](proposals/html-modules-proposal.md), and [earlier design ideas](proposals/HTML-Imports-and-ES-Modules.md). 23 | - [Issues raised in HTML Standard](https://github.com/whatwg/html/labels/topic%3A%20html%20modules) 24 | - [Issues raised in this repository](https://github.com/w3c/webcomponents/labels/modules). Includes related issues for other potential module-types, such as CSS and JSON. 25 | - [Old issue tracker](https://github.com/MicrosoftEdge/MSEdgeExplainers/issues?q=is%3Aissue+label%3A%22HTML+Modules%22) includes a few issues filed when the feature was first proposed. Please avoid filing new issues there. 26 | 27 | ## Issues 28 | 29 | Please file issues in the most specific repository possible, per the above issue pointers. (It's often not this repository.) 30 | 31 | ## Abandoned features: 32 | 33 | - [HTML Imports](https://w3c.github.io/webcomponents/spec/imports/) 34 | - [The current issue tracker](https://github.com/w3c/webcomponents/labels/html-imports). 35 | - [The old issue tracker](https://www.w3.org/Bugs/Public/showdependencytree.cgi?id=20683) on W3C bugzilla, which is no longer used. 36 | - Note: *HTML Modules* are intended to replace *HTML Imports* (see above). 37 | -------------------------------------------------------------------------------- /assets/docs/spec-assist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Spec Assist 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

Spec Assist

18 |

Utilities For Spec Writers

19 |
20 |
Revision history
21 |
https://dvcs.w3.org/hg/webcomponents/log/tip/assets/docs/spec-assist.html
22 |
23 | 24 |
25 |

Table of Contents

26 |
    27 |
  1. What is Spec Assist?
  2. 28 |
  3. Last Updated Date Fetcher 29 |
  4. Table of Contents Enumerator
  5. 30 |
  6. Definitions Cross-linker
  7. 31 |
  8. Tests
  9. 32 |
33 |
34 | 35 |

What is Spec Assist?

36 | 37 |

Spec Assist is a simple tool that was made specifically for easing the pain of writing Web Components specs in plain HTML. It is an assortment of independent utilities, each fixing its own bit of tediousness. All these utilities are completely client-side, require little configuration, and stay out of the way.

38 | 39 |

When you need to publish the spec, just serialize the DOM tree and save it as new file. A simple way to do this is to open DevTools in Chrome, right-click on the html element, and select "Copy as HTML".

40 | 41 |

You will still need to tweak the contents of the new file before publishing, like changing the stylesheet to Working Draft, etc.

42 | 43 |

Last Updated Date Fetcher

44 | 45 |

The Last Updated Date Fetcher appends the date on which the current spec was last updated to the end of the main title, like the PubRules require.

46 | 47 |

To start using Last Updated Date Fetcher, you need two hints in your spec markup:

48 | 49 |
    50 |
  1. An element that matches h2#editors-draft, which is where the date will be appended
  2. 51 |
  3. An hyperlink that matches a#log, which must contain the URL of the Mercurial commit log.
  4. 52 |
53 | 54 |

The utility assumes that you are loading the spec from the Mercurial repository, and will attempt to fetch the ATOM feed of the commits, grab the last one and its date. If it fails at doing any of this, the utility will use today's date.

55 | 56 |

Table of Contents Enumerator

57 | 58 |

The Table of Contents Enumerator creates sequentially-running numbers for each item in the specification's table of contents, and prefixes all corresponding titles with this number.

59 | 60 |

To activate Table of Contents Enumerator, make sure that you wrap the table of contents in a section.toc element.

61 | 62 |

If you want to skip the section from becoming numbered, give its a element a no-number class.

63 | 64 |

Definitions Cross-linker

65 | 66 |

The Definitions Cross-linker cross-links all definitions and places where they are used. When the user clicks on the definition, a pop-up menu shows all the links to exact places where the definition is used. You don't need to do anything special to make it work.

67 | 68 |

To help you troubleshoot mis-typed ids and unused defnitions, the Definitions Cross-Linker will give the definitions that have no references a red tint.

69 | 70 |

If you know that the definition is not used in your spec and are okay with it, add a no-backreference class to your definition to get rid of red tint

71 | 72 |

Tests

73 | 74 |

Eventually, there will be tests :)

75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /assets/images/angular-poster-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/angular-poster-frame.png -------------------------------------------------------------------------------- /assets/images/ember-poster-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/ember-poster-frame.png -------------------------------------------------------------------------------- /assets/images/example-basic-carousel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/example-basic-carousel.png -------------------------------------------------------------------------------- /assets/images/example-basic-list-box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/example-basic-list-box.png -------------------------------------------------------------------------------- /assets/images/example-basic-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/example-basic-sequence.png -------------------------------------------------------------------------------- /assets/images/example-calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/example-calendar.png -------------------------------------------------------------------------------- /assets/images/flat-tree-desc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | flat-tree.svg description 4 | 5 |

Composed-Tree.svg

6 |

A graphical tree, representing some nodes in an HTML document's object model.

7 |

The document root node - level 1 - is linked to two second level nodes:

8 |

54 |

The root node is a blue circle labelled "document" in white, the rest are green, either labelled "shadow host" in white or unlabelled". The links to lower levels flow downwards, all the nodes at a given level are in a horizontal line.

55 | 56 | 57 | -------------------------------------------------------------------------------- /assets/images/import-style-document-order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/import-style-document-order.png -------------------------------------------------------------------------------- /assets/images/react-poster-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WICG/webcomponents/cb5c48dfd0e74e9420161ad39c5fca71d0ee90ba/assets/images/react-poster-frame.png -------------------------------------------------------------------------------- /assets/scripts/autolink.js: -------------------------------------------------------------------------------- 1 | 2 | function resolveAutolink() { 3 | if (!autolinkConfig) 4 | return; 5 | var definitionMap = {}; 6 | for (var urlPrefix in autolinkConfig) { 7 | var titleToLink = autolinkConfig[urlPrefix]; 8 | for (var title in titleToLink) { 9 | if (definitionMap[title.toLowerCase()]) { 10 | console.warn(title + ' is defined twice in autolinkConfig.'); 11 | } else { 12 | definitionMap[title.toLowerCase()] = urlPrefix + titleToLink[title]; 13 | } 14 | } 15 | } 16 | Array.prototype.slice.call(document.querySelectorAll("a:not([href])")).forEach(function (e) { 17 | if (e.classList.contains("internalDFN")) 18 | return; 19 | var linkText = e.getAttribute("data-lt") || e.textContent; 20 | if (!linkText) return; 21 | linkText = linkText.toLowerCase().replace(/^\s+/, "").replace(/\s+$/, "").split(/\s+/).join(" "); 22 | if (definitionMap[linkText]) { 23 | e.setAttribute("href", definitionMap[linkText]); 24 | e.classList.add("externalDFN"); 25 | } else if (linkText.endsWith("s")) { 26 | var sub = linkText.substring(0, linkText.length - 1); 27 | if (definitionMap[sub]) { 28 | e.setAttribute("href", definitionMap[sub]); 29 | e.classList.add("externalDFN"); 30 | } 31 | } 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /assets/scripts/bug-assist.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Simple Bug File Assistant. 4 | Find bugs? File a bug, blocking https://www.w3.org/Bugs/Public/show_bug.cgi?id=15013. 5 | To configure, use meta tags as follows: 6 | 7 | * The content of each meta tag whose name starts with "bug." becomes a form parameter for Bugzilla new bug submission. 8 | * The name "bug.blocked" is special. If present, the assistant add a link to the dependency tree of this bug. 9 | * The name "bug.comment" is overriden if the user selects text. 10 | 11 | Sample use and configuration: 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | */ 20 | 21 | document.addEventListener('DOMContentLoaded', function() { 22 | var inputs = { comment: '' }; 23 | if (window.bugAssistConfig) { 24 | for (var name in window.bugAssistConfig) { 25 | inputs[name] = window.bugAssistConfig[name]; 26 | } 27 | } 28 | var BUGS_PREFIX = 'bug.'; 29 | [].forEach.call(document.querySelectorAll('meta'), function(meta) { 30 | if (meta.name.indexOf(BUGS_PREFIX) == 0) 31 | inputs[meta.name.substr(BUGS_PREFIX.length)] = meta.content; 32 | }); 33 | 34 | var blocked = inputs.blocked; 35 | 36 | var form = document.body.appendChild(document.createElement('form')); 37 | form.id = "bug-assist-form"; 38 | form.action = '//www.w3.org/Bugs/Public/enter_bug.cgi'; 39 | form.target = '_blank'; 40 | form.textContent = 'See a problem? Select text and '; 41 | 42 | var submit = form.appendChild(document.createElement('input')); 43 | submit.type = 'submit'; 44 | submit.accessKey = 'f'; 45 | submit.style.cssText = 'font-family:Tahoma,sans-serif;font-size:10px'; 46 | var label = 'file a bug'; 47 | if (submit.accessKeyLabel) 48 | label += ' (' + submit.accessKeyLabel + ')'; 49 | submit.value = label; 50 | 51 | Object.keys(inputs).forEach(function(name) { 52 | var input = form.appendChild(document.createElement('input')); 53 | input.type = 'hidden'; 54 | input.name = name; 55 | input.value = inputs[name]; 56 | inputs[name] = input; 57 | }); 58 | 59 | if (blocked) { 60 | form.appendChild(document.createTextNode(' or ')); 61 | var a = form.appendChild(document.createElement('a')); 62 | a.textContent = 'view bugs filed'; 63 | a.href = '//www.w3.org/Bugs/Public/showdependencytree.cgi?id=' + blocked; 64 | a.target = '_blank'; 65 | } 66 | form.appendChild(document.createTextNode('.')); 67 | 68 | form.addEventListener('submit', function() { 69 | var selectedText = window.getSelection().toString(); 70 | if (selectedText) 71 | inputs.comment.value = '"' + selectedText + '"'; 72 | }, false); 73 | 74 | }, false); 75 | -------------------------------------------------------------------------------- /assets/scripts/spec-assist.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | function TableOfContentsEnumerator() 4 | { 5 | } 6 | 7 | TableOfContentsEnumerator.prototype.initialize = function() 8 | { 9 | var top = document.querySelector('section.toc'); 10 | if (!top) 11 | return; 12 | 13 | this.prefix = []; 14 | this.enumerateList(top); 15 | } 16 | 17 | TableOfContentsEnumerator.prototype.enumerateList = function(top) 18 | { 19 | var list = top.querySelector('ol,ul'); 20 | if (!list) 21 | return; 22 | 23 | this.prefix.push(1); 24 | [].forEach.call(list.children, this.processListItem, this); 25 | this.prefix.pop(); 26 | } 27 | 28 | TableOfContentsEnumerator.prototype.processListItem = function(item) 29 | { 30 | if (!(item instanceof HTMLLIElement)) 31 | return; 32 | 33 | var indexText = this.prefix.join('.') + " "; 34 | var a = item.querySelector('a'); 35 | var href = a.getAttribute('href'); 36 | var target = href && document.querySelector(href); 37 | if (!target || a.classList.contains('no-number')) 38 | return; 39 | 40 | a.insertBefore(document.createTextNode(indexText), a.firstChild); 41 | target.insertBefore(document.createTextNode(indexText), target.firstChild); 42 | 43 | this.enumerateList(item); 44 | 45 | this.prefix[this.prefix.length - 1]++; 46 | } 47 | 48 | function LastUpdatedDateFetcher() {} 49 | 50 | LastUpdatedDateFetcher.prototype.initialize = function() 51 | { 52 | this.title = document.querySelector('h2#editors-draft'); 53 | if (!this.title) 54 | return; 55 | 56 | this.fetchLastUpdated(this.appendDate.bind(this)); 57 | } 58 | 59 | LastUpdatedDateFetcher.prototype.appendDate = function(date) 60 | { 61 | var prettyDate = this.prettyDate(date); 62 | this.title.appendChild(document.createTextNode(prettyDate)); 63 | } 64 | 65 | LastUpdatedDateFetcher.prototype.fetchLastUpdated = function(callback) 66 | { 67 | var lastUpdated = new Date(); 68 | var logAnchorNode = document.querySelector('a#log'); 69 | if (!logAnchorNode) 70 | return callback(lastUpdated); 71 | 72 | var logURL = logAnchorNode.href.replace("/log", "/atom-log"); 73 | if (!logURL) 74 | return callback(lastUpdated); 75 | 76 | var xhr = new XMLHttpRequest(); 77 | xhr.onload = function() { 78 | var doc = this.responseXML; 79 | if (!doc) 80 | return callback(lastUpdated); 81 | var updatedNode = doc.querySelector('feed>updated'); 82 | if (!updatedNode) 83 | return callback(lastUpdated); 84 | callback(new Date(updatedNode.textContent)); 85 | } 86 | xhr.onerror = function() { 87 | callback(lastUpdated); 88 | } 89 | xhr.open('GET', logURL); 90 | xhr.send(); 91 | } 92 | 93 | LastUpdatedDateFetcher.prototype.prettyDate = function(date) 94 | { 95 | return ' ' + date.getDate() + ' ' + ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][date.getMonth()] + ' ' + date.getFullYear(); 96 | } 97 | 98 | function DefinitionsCrossLinker() {} 99 | 100 | DefinitionsCrossLinker.prototype.initialize = function() 101 | { 102 | document.addEventListener('click', this.onClick.bind(this)); 103 | this.hovercard = document.createElement('b'); 104 | this.hovercard.className = 'hovercard'; 105 | [].forEach.call(document.querySelectorAll('dfn[id]'), this.createCrossLinks, this); 106 | } 107 | 108 | DefinitionsCrossLinker.prototype.onClick = function(event) 109 | { 110 | var element = event.target; 111 | if (element.tagName != 'DFN' || element.contains(this.hovercard)) { 112 | this.closeHovercard(); 113 | return; 114 | } 115 | 116 | this.openHovercard(element); 117 | } 118 | 119 | DefinitionsCrossLinker.prototype.openHovercard = function(dfn) 120 | { 121 | this.hovercard.innerHTML = dfn.crossLinkContent; 122 | dfn.appendChild(this.hovercard); 123 | } 124 | 125 | DefinitionsCrossLinker.prototype.closeHovercard = function(dfn) 126 | { 127 | if (!this.hovercard.parentElement) 128 | return; 129 | 130 | this.hovercard.parentElement.removeChild(this.hovercard); 131 | } 132 | 133 | DefinitionsCrossLinker.prototype.findCrossLinkHeading = function(a) 134 | { 135 | var element = a; 136 | while(element = element.previousSibling || element.parentElement) { 137 | if (element.id && (element instanceof HTMLHeadingElement || element.tagName == "SECTION")) 138 | break; 139 | } 140 | return element; 141 | } 142 | 143 | DefinitionsCrossLinker.prototype.createCrossLink = function(backId, title) 144 | { 145 | return '' + title + ' '; 146 | } 147 | 148 | DefinitionsCrossLinker.prototype.createCrossLinks = function(dfn) 149 | { 150 | var id = dfn.id; 151 | var links = ['No references.']; 152 | 153 | if (!dfn.classList.contains('no-backreference')) { 154 | var headings = {}; 155 | [].forEach.call(document.querySelectorAll('a[href="#' + id + '"]'), function(a, i) { 156 | var backId; 157 | if (a.id) { 158 | backId = a.id; 159 | } else { 160 | backId = 'back-' + id + '-' + i; 161 | a.id = backId; 162 | } 163 | var heading = this.findCrossLinkHeading(a); 164 | var titles = headings[heading.id]; 165 | if (titles){ 166 | titles.push(this.createCrossLink(backId, '(' + (titles.length + 1) + ')')); 167 | } else { 168 | var title; 169 | if (heading.tagName == "SECTION" && heading.id) 170 | title = heading.id; 171 | else 172 | title = heading.textContent; 173 | titles = headings[heading.id] = [ this.createCrossLink(backId, title) ]; 174 | } 175 | }, this); 176 | 177 | var keys = Object.keys(headings); 178 | if (!keys.length) { 179 | dfn.classList.add('no-references'); 180 | } else { 181 | links = keys.map(function(key) { 182 | return '
  • ' + headings[key].join('') + '
  • '; 183 | }); 184 | } 185 | } 186 | dfn.crossLinkContent = '
    #' + id + '
      ' + links.join('') + '
    '; 187 | } 188 | 189 | var assistants = [ new LastUpdatedDateFetcher(), new TableOfContentsEnumerator(), new DefinitionsCrossLinker() ]; 190 | 191 | document.addEventListener('DOMContentLoaded', function() { 192 | assistants.forEach(function(assistant) { 193 | assistant.initialize(); 194 | }); 195 | }); 196 | 197 | }()); 198 | -------------------------------------------------------------------------------- /assets/scripts/spec-assist_unittests.js: -------------------------------------------------------------------------------- 1 | /* Unit tests for spec-assist wil go here */ 2 | -------------------------------------------------------------------------------- /assets/styles/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0 auto; 3 | padding: 0; 4 | line-height: 1.4em; 5 | font-family: 'Ovo', serif; 6 | width: 60em; 7 | } 8 | 9 | figure { 10 | width: 600px; 11 | margin: 0 auto; 12 | display: block; 13 | } 14 | 15 | figcaption { 16 | font-size: 0.8em; 17 | } 18 | 19 | h1, h2, h3, h4 { 20 | font-family: 'Open Sans', sans-serif; 21 | color: #333; 22 | padding: 0; 23 | } 24 | 25 | h1 { 26 | font-size: 3em; 27 | line-height: 1em; 28 | margin: 1em 0; 29 | } 30 | 31 | h2, h3 { 32 | margin: 1.5em 0 0.3em 0; 33 | } 34 | 35 | h1, h2, h3, h4 { 36 | color: #005A9C; 37 | } 38 | 39 | a { 40 | color: Black; 41 | } 42 | 43 | code { 44 | background-color: #eee; 45 | font-family: 'Droid Sans Mono', monospace; 46 | font-size: 0.8em; 47 | } 48 | 49 | body>pre.prettyprint, body>section pre { 50 | background-color: #eee; 51 | padding: 0 2em 1em 2em; 52 | margin: 0; 53 | border: none; 54 | } 55 | 56 | address { 57 | font-style: normal; 58 | } 59 | 60 | object { 61 | margin: 0 auto; 62 | display: block; 63 | } 64 | 65 | header>ul { 66 | font-family: 'Open Sans', sans-serif; 67 | font-size: 0.8em; 68 | list-style: none; 69 | margin: 0 -1em; 70 | padding: 0.3em 0; 71 | background-color: #eee; 72 | } 73 | 74 | header>ul>li { 75 | display: inline; 76 | margin: 0 0 0 1em; 77 | } 78 | 79 | header>ul>li:nth-of-type(3) { 80 | display: inline; 81 | margin: 0 0 0 5em; 82 | } 83 | 84 | 85 | header>ul a { 86 | color: #666; 87 | } 88 | 89 | header>ul a:hover { 90 | color: #000; 91 | } 92 | 93 | code>ins { 94 | background-color: #BBFFDF; 95 | text-decoration: none; 96 | } 97 | 98 | code>del { 99 | background-color: #FF979D; 100 | } 101 | 102 | -------------------------------------------------------------------------------- /assets/styles/prettify.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} -------------------------------------------------------------------------------- /assets/styles/spec.css: -------------------------------------------------------------------------------- 1 | body { 2 | line-height: 1.4em; 3 | } 4 | 5 | code { 6 | background-color: #eee; 7 | font-family: 'Droid Sans Mono', monospace; 8 | } 9 | 10 | body>pre.prettyprint, body>section pre { 11 | background-color: #eee; 12 | padding: 0 2em 1em 2em; 13 | margin: 0; 14 | border: none; 15 | } 16 | 17 | object { 18 | margin: 0 auto; 19 | display: block; 20 | } 21 | 22 | section.toc ol { 23 | list-style: none; 24 | } 25 | 26 | span.shadow-boundary { 27 | color: Gray; 28 | } 29 | 30 | span.event-ancestor, span.first-divergent-boundary { 31 | color: DarkRed; 32 | } 33 | 34 | span.event-ancestor > em { 35 | background-color: DarkRed; 36 | color: White; 37 | font-style: normal; 38 | border-radius: 1em; 39 | padding: 0 0.35em; 40 | } 41 | 42 | span.lowest-common-boundary { 43 | color: Green; 44 | } 45 | 46 | 47 | .fixme { 48 | display: block; 49 | padding: 10px 0 0 20px; 50 | border-left: 5px solid #E05252; 51 | } 52 | 53 | 54 | .fixme:before { 55 | content: 'To be addressed'; 56 | float: right; 57 | display: block; 58 | padding: 2px 10px; 59 | background-image: -webkit-linear-gradient(top left, #FFFFFF 0%, #FBE9E9 100%); 60 | background-image: linear-gradient(to bottom right, #FFFFFF 0%, #FBE9E9 100%); 61 | font-size: 0.9em; 62 | } 63 | 64 | .note { 65 | color: green; 66 | font-weight: bold; 67 | font-style: italic; 68 | padding-left: 2em; 69 | } 70 | 71 | .note:before { 72 | content: "Note: "; 73 | } 74 | 75 | .warning:before { 76 | content: "WARNING: "; 77 | font-weight: bold; 78 | } 79 | 80 | .warning { 81 | padding: 10px 10px; 82 | width: 100%; 83 | background: #fffaba; 84 | box-sizing: border-box; 85 | } 86 | 87 | dfn { 88 | font-style: normal; 89 | font-weight: bold; 90 | background-color: #f9f9f9; 91 | padding: 0 2px; 92 | border: 1px solid #eee; 93 | } 94 | 95 | dfn.no-references { 96 | background-color: #ffefef; 97 | } 98 | 99 | dfn:target, a:target { 100 | background-color: #FFFF91; 101 | } 102 | 103 | a { 104 | text-decoration: none; 105 | border-bottom: 1px solid #666; 106 | } 107 | 108 | a[href*=dfn-] { 109 | border-bottom: 1px dotted #ccc; 110 | } 111 | 112 | div.logo>a { 113 | border-bottom: none; 114 | } 115 | 116 | var { 117 | font-size: 0.8em; 118 | color: #005A9C; 119 | font-style: normal; 120 | } 121 | 122 | table { 123 | border: 1px solid #ccc; 124 | } 125 | 126 | table code { 127 | background-color: transparent; 128 | } 129 | 130 | td, th { 131 | padding: 0.5em; 132 | vertical-align: top; 133 | } 134 | 135 | td { 136 | border-bottom: 1px solid #ddd; 137 | } 138 | 139 | tr:last-of-type td { 140 | border-bottom: none; 141 | } 142 | 143 | th { 144 | text-align: left; 145 | background-color: #eee; 146 | } 147 | 148 | dt { 149 | font-weight: bold; 150 | } 151 | 152 | dd { 153 | padding-bottom: 7px; 154 | } 155 | 156 | div.algorithm { 157 | padding: 0 0 0 20px; 158 | border-left: 5px solid #EAF7F9; 159 | } 160 | 161 | div.informative:before { 162 | content: 'Informative'; 163 | float: right; 164 | display: block; 165 | padding: 2px 10px; 166 | background-image: -webkit-linear-gradient(top left, #FFFFFF 0%, #D3EEDF 100%); 167 | background-image: linear-gradient(to bottom right, #FFFFFF 0%, #D3EEDF 100%); 168 | font-size: 0.9em; 169 | } 170 | 171 | div.informative { 172 | padding: 10px 0 0 20px; 173 | border-left: 5px solid #D3EEDF; 174 | } 175 | 176 | div.monkeypatch:before { 177 | content: 'Monkeypatch'; 178 | float: right; 179 | display: block; 180 | padding: 2px 10px; 181 | background-image: -webkit-linear-gradient(top left, #FFFFFF 0%, #D3EEDF 100%); 182 | background-image: linear-gradient(to bottom right, #FFFFFF 0%, #D3EEDF 100%); 183 | font-size: 0.9em; 184 | } 185 | 186 | div.monkeypatch { 187 | padding: 10px 0 0 20px; 188 | border-left: 5px solid #EEE5D3; 189 | } 190 | 191 | div.deprecated:before { 192 | content: 'Deprecated parts'; 193 | float: right; 194 | display: block; 195 | padding: 2px 10px; 196 | background-image: -webkit-linear-gradient(top left, #FFFFFF 0%, #fffaba 100%); 197 | background-image: linear-gradient(to bottom right, #FFFFFF 0%, #fffaba 100%); 198 | font-size: 0.9em; 199 | } 200 | 201 | div.deprecated { 202 | opacity: 0.6; 203 | } 204 | 205 | b.hovercard { 206 | position: absolute; 207 | font-size: 12px; 208 | width: 200px; 209 | background-color: white; 210 | border: 1px #ddd solid; 211 | width: auto; 212 | height: auto; 213 | cursor: pointer; 214 | -webkit-box-shadow: 2px 2px 5px 2px #eee; 215 | } 216 | 217 | b.hovercard>div.title { 218 | padding: 5px 10px 2px 5px; 219 | background-color: #fcfcfc; 220 | border-bottom: 1px #ddd solid; 221 | } 222 | 223 | b.hovercard>ol { 224 | list-style: none; 225 | margin: 0; 226 | padding: 5px 10px 10px 15px; 227 | } 228 | 229 | b.hovercard li { 230 | padding: 0 5px 0 0; 231 | } 232 | 233 | b.hovercard a { 234 | border-bottom: none; 235 | color: black; 236 | } 237 | 238 | text { 239 | font-size: 12px; 240 | } 241 | 242 | #bug-assist-form { 243 | position: fixed; 244 | width: 10em; 245 | top: 1em; 246 | right: 1em; 247 | font-family: Tahoma,sans-serif; 248 | font-size: 11px; 249 | opacity:0.8; 250 | text-align:right; 251 | } 252 | .example { 253 | background: none repeat scroll 0 0 #fcfcfc; 254 | border-color: #c0c0c0; 255 | border-left: 0.25em solid #c0c0c0; 256 | color: #222222; 257 | display: block; 258 | margin-left: 1em; 259 | padding-bottom: 0.5em; 260 | padding-left: 1em; 261 | } 262 | 263 | div.example:before { 264 | content: "Code Example: "; 265 | font-weight: bolder; 266 | } 267 | 268 | p.note { 269 | background: none repeat scroll 0 0 #e9fbe9; 270 | border-color: #52e052; 271 | border-left: 0.25em solid #52e052; 272 | font-style:normal; 273 | font-weight:normal; 274 | font-size:medium; 275 | color: #000000; 276 | 277 | 278 | } 279 | p.note:before {font-weight:bold;} -------------------------------------------------------------------------------- /explainer/bug-assist.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Simple Bug File Assistant. 4 | Find bugs? File a bug. 5 | To configure, use data-* attributes on as follows: 6 | 7 | * Are taken into account all attributes starting with data-bug-*, what follows that is the name 8 | of the Bugzilla form parameter. 9 | * The name "data-bug-blocked" is special. If present, the assistant adds a link to the dependency 10 | tree of this bug. 11 | * The name "data-bug-comment" is overriden if the user selects text. 12 | 13 | Sample use and configuration: 14 | 15 | 17 | 18 | ... 19 | */ 20 | 21 | document.addEventListener('DOMContentLoaded', function() { 22 | var BUGS_PREFIX = "data-bug-"; 23 | 24 | var inputs = { comment: "" }; 25 | 26 | [].forEach.call(document.documentElement.attributes, function (attr) { 27 | if (attr.name.indexOf(BUGS_PREFIX) === 0) 28 | inputs[attr.name.substr(BUGS_PREFIX.length)] = attr.value; 29 | }); 30 | 31 | var blocked = inputs.blocked; 32 | 33 | var form = document.body.appendChild(document.createElement('form')); 34 | form.style.cssText = 'position:fixed;padding:5px;top:1em;right:2em;font-family:sans-serif;font-size:0.8em;background-color:#ffffff;border: 1px solid #f00;'; 35 | form.action = 'http://www.w3.org/Bugs/Public/enter_bug.cgi'; 36 | form.target = '_blank'; 37 | form.textContent = 'Select text and '; 38 | 39 | var submit = form.appendChild(document.createElement('input')); 40 | submit.type = 'submit'; 41 | submit.accessKey = 'f'; 42 | submit.style.cssText = 'display: block;'; 43 | var label = 'file a bug'; 44 | if (submit.accessKeyLabel) 45 | label += ' (' + submit.accessKeyLabel + ')'; 46 | submit.value = label; 47 | 48 | Object.keys(inputs).forEach(function(name) { 49 | var input = form.appendChild(document.createElement('input')); 50 | input.type = 'hidden'; 51 | input.name = name; 52 | input.value = inputs[name]; 53 | inputs[name] = input; 54 | }); 55 | 56 | if (blocked) { 57 | form.appendChild(document.createTextNode(' or ')); 58 | var a = form.appendChild(document.createElement('a')); 59 | a.textContent = 'view bugs filed'; 60 | a.href = 'http://www.w3.org/Bugs/Public/showdependencytree.cgi?id=' + blocked; 61 | a.target = '_blank'; 62 | } 63 | //form.appendChild(document.createTextNode('.')); 64 | 65 | form.addEventListener('submit', function() { 66 | var selectedText = window.getSelection().toString(); 67 | if (selectedText) 68 | inputs.comment.value = '"' + selectedText + '"'; 69 | }, false); 70 | 71 | }, false); 72 | -------------------------------------------------------------------------------- /explainer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Introduction to Web Components 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 | 12 | 15 | 16 |

    Introduction to Web Components

    17 |

    W3C Working Group Note 24 July 2014

    18 |
    19 |
    This version
    20 |
    http://www.w3.org/TR/2014/NOTE-components-intro-20140724/
    21 |
    Latest version
    22 |
    http://www.w3.org/TR/components-intro/
    23 |
    Latest editor's draft
    24 |
    http://w3c.github.io/webcomponents/explainer/
    25 |
    Previous version
    26 |
    http://www.w3.org/TR/2013/WD-components-intro-20130606/
    27 |
    Revision history
    28 |
    https://github.com/w3c/webcomponents/commits/gh-pages/explainer/
    29 |
    Participate
    30 |
    Discuss on public-webapps@w3.org (Web Applications Working Group)
    31 |
    File bugs (w3.org's Bugzilla)
    32 |
    Editors
    33 |
    Dimitri Glazkov, Google, <>
    34 |
    Hayato Ito, Google, <>
    35 |
    Authors
    36 |
    Dominic Cooney, Google, <>
    37 |
    38 | 39 | 40 | 41 |
    42 | 43 |

    Abstract

    44 | 45 |

    This document is a non-normative reference, which provides an overview of Web Components. It summarizes the normative information in the respective specifications in easy-to-digest prose with illustrations.

    46 | 47 |

    Status of This Document

    48 | 49 |

    This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

    50 | 51 |

    Work on this document has been discontinued and it should not be referenced. Numerous online resources about Web Components are available, including the Web Components wiki. 52 |

    53 | 54 |

    This document was published by the Web Applications Working Group as a Working Group Note. If you wish to make comments regarding this document, please send them to public-webapps@w3.org (subscribe, archives). All feedback is welcome.

    Publication as a Working Group Note does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

    55 | 56 |

    This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

    57 | 58 |
    59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Web Components Specifications 5 | 6 | 7 |

    Web Components Specifications

    8 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /proposals/Custom-Pseudo-Elements.md: -------------------------------------------------------------------------------- 1 | # Custom Pseudo-elements 2 | 3 | **by Philip Walton** 4 | 5 | ## Motivation 6 | 7 | The current, recommended method for exposing parts of a Web Component for styling by third-party users is to define [CSS custom properties](https://drafts.csswg.org/css-variables/) in the element's shadow root, so those properties can be defined by third-party users and the styles inherited by the custom element. 8 | 9 | This is an effective method for many use-cases, but it has the significant limitation of not easily allowing conditional styling based on CSS pseudo-classes. 10 | 11 | Perhaps the most common use-case for pseudo-class styling is custom elements that use `` or `