Wed, 06 Feb 2013 13:15:40 -0700
[css3-conditional] Tweak formatting of grammar to be consistent with the rest.
1 <!DOCTYPE html public '-//W3C//DTD HTML 4.01//EN'
2 'http://www.w3.org/TR/html4/strict.dtd'>
3 <html lang="en">
4 <head profile="http://www.w3.org/2006/03/hcard">
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6 <title>CSS Conditional Rules Module Level 3</title>
7 <link rel="stylesheet" type="text/css" href="../default.css">
8 <link href="../csslogo.ico" rel="shortcut icon" type="image/x-icon">
9 <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-[STATUS].css">
10 <!--
11 <script src="http://test.csswg.org/harness/annotate.js#CSS3-CONDITIONAL_DEV"
12 type="text/javascript" defer></script
13 -->
14 </head>
16 <div class="head">
17 <!--logo-->
19 <h1>CSS Conditional Rules Module Level 3</h1>
21 <h2 class="no-num no-toc">[LONGSTATUS] [DATE]</h2>
22 <dl>
23 <dt>This version:
24 <dd><a href="[VERSION]">
25 http://www.w3.org/TR/[YEAR]/ED-css3-conditional-[CDATE]/</a>
27 <dt>Latest version:
28 <dd><a href="http://www.w3.org/TR/[SHORTNAME]/">http://www.w3.org/TR/[SHORTNAME]/</a>
30 <dt>Editor's draft:
31 <dd><a href="http://dev.w3.org/csswg/[SHORTNAME]/">http://dev.w3.org/csswg/[SHORTNAME]/</a>
33 <dt>Previous version:
34 <dd><a href="http://www.w3.org/TR/2012/WD-css3-conditional-20120911/">http://www.w3.org/TR/2012/WD-css3-conditional-20120911/</a></dd>
36 <dt>Editors:
37 <dd class=vcard><a class=fn href="http://dbaron.org/">L. David Baron</a>,
38 <a class=org href="http://www.mozilla.org/">Mozilla</a>
40 <dt>Issues list:
41 <dd>Maintained in document (only editor's draft is current)
43 <dt>Feedback:
45 <dd><a
46 href="http://lists.w3.org/Archives/Public/www-style/">www-style@w3.org</a>
47 with subject line “<kbd>[[SHORTNAME]] <var>… message topic
48 …</var></kbd>”
50 <dt>Test suite:
51 <dd><a href="https://test.csswg.org/shepherd/search/spec/css3-conditional/">submitted tests</a>; no built test suite yet
53 </dl>
55 <!--copyright-->
57 <hr title="Separator for header">
58 </div>
60 <h2 class="no-num no-toc" id="abstract">Abstract</h2>
62 <p>CSS is a language for describing the rendering of structured documents
63 (such as HTML and XML) on screen, on paper, in speech, etc. This module
64 contains the features of CSS for conditional processing of parts of
65 style sheets, conditioned on capabilities of the processor or the
66 document the style sheet is being applied to.
67 It includes and extends the functionality of CSS level 2 [[!CSS21]],
68 which builds on CSS level 1 [[CSS1]].
69 The main extensions compared to level 2 are
70 allowing nesting of certain at-rules inside '@media',
71 and the addition of the '@supports'
72 rule for conditional processing.
74 <h2 class="no-num no-toc" id="status">Status of this document</h2>
76 <!--status-->
78 <p>The following features are at risk:
79 <ul>
80 <li>The inclusion of '@font-face' rules and
81 '@keyframes' rules as allowed within all of the @-rules in
82 this specification is at risk, though only because of the relative
83 rates of advancement of specifications. If this specification is able
84 to advance faster than one or both of the specifications defining
85 those rules, then the inclusion of those rules will move from this
86 specification to the specification defining those rules.</li>
88 <li>The addition of support for @-rules inside of conditional grouping
89 rules is at risk; if interoperable implementations are not found, it
90 may be removed to advance the other features in this specification to
91 Proposed Recommendation.</li>
93 <li>The '@supports' rule is at risk; if interoperable
94 implementations are not found, it may be removed to advance the other
95 features in this specification to Proposed Recommendation.</li>
96 </ul>
98 <p>This is a <strong>Last Call Working Draft</strong>.
99 The deadline for comments is <strong>10 January 2013</strong>.
101 <!--
103 Things to go in level 4:
105 * Create some way to put these new conditional things on an @import.
106 * The @document rule (commented out, down below).
108 -->
110 <h2 class="no-num no-toc" id="contents">Table of contents</h2>
112 <!--toc-->
114 <h2 id="introduction">Introduction</h2>
116 <h3 id="context">Background</h3>
118 <p><em>This section is not normative.</em>
120 <p>[[!CSS21]] defines one type of conditional group rule, the
121 '@media' rule, and allows only rulesets (not other @-rules)
122 inside of it. The '@media' rule provides the ability to
123 have media-specific style sheets, which is also provided by style
124 sheet linking features such as '@import' and
125 <code class="html"><link></code>. The restrictions on the contents of
126 '@media' rules made them less useful; they have forced authors
127 using CSS features involving @-rules in media-specific style sheets to
128 use separate style sheets for each medium.</p>
130 <p>This specification extends the rules for the contents of
131 conditional group rules to allow other @-rules, which enables authors
132 to combine CSS features involving @-rules with media specific style
133 sheets within a single style sheet.</p>
135 <p>This specification also defines an additional type of conditional
136 group rule, '@supports', to
137 address author and user requirements.</p>
139 <p>The '@supports' rule allows CSS to be conditioned on
140 implementation support for CSS properties and values. This rule makes
141 it much easier for authors to use new CSS features and provide good
142 fallback for implementations that do not support those features. This
143 is particularly important for CSS features that provide new layout
144 mechanisms, and for other cases where a set of related styles needs to
145 be conditioned on property support.</p>
147 <h3 id="placement">Module Interactions</h3>
149 <p>This module replaces and extends the '@media' rule
150 feature defined in [[!CSS21]] section <var>7.2.1</var> and
151 incorporates the modifications previously made non-normatively by
152 [[!MEDIAQ]] section <var>1</var>.</p>
154 <p>Its current definition depends on @-rules defined in [[!CSS3-FONTS]]
155 and [[!CSS3-ANIMATIONS]], but that dependency is only on the
156 assumption that those modules will advance ahead of this one. If this
157 module advances faster, then the dependency will be reversed.</p>
159 <h3 id="conventions">Document Conventions</h3>
161 <p>Conformance requirements are expressed with a combination of
162 descriptive assertions and RFC 2119 terminology. The key words “MUST”,
163 “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
164 “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this
165 document are to be interpreted as described in RFC 2119.
166 However, for readability, these words do not appear in all uppercase
167 letters in this specification.
169 <p>All of the text of this specification is normative except sections
170 explicitly marked as non-normative, examples, and notes. [[!RFC2119]]</p>
172 <p>Examples in this specification are introduced with the words “for example”
173 or are set apart from the normative text with
174 <code class="html">class="example"</code>, like this:
176 <div class="example">
177 <p>This is an example of an informative example.</p>
178 </div>
180 <p>Informative notes begin with the word “Note” and are set apart from the
181 normative text with <code class="html">class="note"</code>, like this:
183 <p class="note">Note, this is an informative note.</p>
185 <h2 id="processing">Processing of conditional group rules</h2>
187 <p>This specification defines some CSS @-rules, called <dfn>conditional
188 group rules</dfn>, that associate a condition with a group of other
189 CSS rules. These different rules allow testing different types of
190 conditions, but share common behavior for how their contents are used
191 when the condition is true and when the condition is false.</p>
193 <div class="example">
194 <p>For example, this rule:</p>
195 <pre>@media print {
196 #navigation { display: none }
197 }</pre>
198 <p>causes a particular CSS rule (making elements with ID "navigation" be
199 display:none) apply only when the style sheet is used for a print
200 medium.
201 </div>
203 <p>Each conditional group rule has a condition, which at any time
204 evaluates to true or false. When the condition is true, CSS processors
205 <strong>must</strong> apply the rules inside the group rule as though
206 they were at the group rule's location; when the condition is false, CSS
207 processors <strong>must not</strong> apply any of rules inside the group
208 rule. The current state of the condition does not affect the CSS object
209 model, in which the contents of the group rule always remain within the
210 group rule.</p>
212 <p>This means that when multiple conditional group rules are nested,
213 a rule inside of both of them applies only when all of the rules'
214 conditions are true.</p>
216 <div class="example">For example, with this set of nested rules:
217 <pre>@media print { // rule (1)
218 #navigation { display: none }
219 @media (max-width: 12cm) { // rule (2)
220 .note { float: none }
221 }
222 }</pre>
223 the condition of the rule marked (1) is true for print media, and the
224 condition of the rule marked (2) is true when the width of the display
225 area (which for print media is the page box) is less than or equal to
226 12cm. Thus the rule ''#navigation { display: none }'' applies
227 whenever this style sheet is applied to print media, and the rule
228 ''.note { float: none }'' is applied only when the style sheet
229 is applied to print media <em>and</em> the width of the page box is less
230 than or equal to 12 centimeters.</div>
232 <p>When the condition for a conditional group rule changes, CSS
233 processors <strong>must</strong> reflect that the rules now apply or no
234 longer apply, except for properties whose definitions define effects of
235 computed values that persist past the lifetime of that value (such as
236 for some properties in [[CSS3-TRANSITIONS]] and
237 [[!CSS3-ANIMATIONS]]).</p>
239 <h2 id="contents-of">Contents of conditional group rules</h2>
241 <p>The syntax of each conditional group rule consists of some syntax
242 specific to the type of rule followed by a <dfn>group rule body</dfn>,
243 which is a block (pair of braces) containing a sequence of rules.</p>
245 <p>A group rule body is allowed to contain rulesets and any @-rules that
246 are allowed at the top level of a style sheet before and after a
247 ruleset. This means that @-rules that must occur at the beginning of
248 the style sheet (such as '@charset', '@import',
249 and '@namespace' rules) are not allowed inside of conditional group
250 rules. Conditional group rules can be nested.</p>
252 <p>In terms of the grammar, this specification defines the following
253 productions for use in the grammar of conditional group rules:</p>
255 <pre><dfn>nested_statement</dfn>
256 : ruleset | <i>media</i> | page | font_face_rule | keyframes_rule |
257 <i>supports_rule</i>
258 ;
260 <dfn>group_rule_body</dfn>
261 : '{' S* <i>nested_statement</i>* '}' S*
262 ;</pre>
263 <p>
264 in which all the productions are defined in that grammar with the
265 exception of <code>font_face_rule</code>
266 defined in [[!CSS3-FONTS]], <code>keyframes_rule</code> defined in
267 [[!CSS3-ANIMATIONS]], and <code>media</code> and <code>supports_rule</code>
268 defined in this specification.</p>
270 <p>In general, future CSS specifications that add new @-rules that are
271 not forbidden to occur after some other types of rules should modify
272 this <code>nested_statement</code> production to keep the grammar
273 accurate.</p>
275 <p>Style sheets <strong>must not</strong> use rules other than the allowed ones inside
276 conditional group rules.</p>
278 <p>CSS processors <strong>must</strong> ignore rules that are not
279 allowed within a group rule, and <strong>must</strong> handle invalid
280 rules inside of group rules as described in <a
281 href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors">section
282 4.2 (Rules for handling parsing errors)</a>, <a
283 href="http://www.w3.org/TR/CSS21/syndata.html#at-rules">section 4.1.5
284 (At-rules)</a>, and <a
285 href="http://www.w3.org/TR/CSS21/syndata.html#rule-sets">section 4.1.7
286 (Rule sets, declaration blocks, and selectors)</a> of [[!CSS21]].</p>
288 <h2 id="use">Placement of conditional group rules</h2>
290 <p>Conditional group rules are allowed at the top-level of a style
291 sheet, and inside other conditional group rules. CSS processors
292 <strong>must</strong> process such rules as <a
293 href="#processing">described above</a>.</p>
295 <p>Any rules that are not allowed after a ruleset (e.g., ''@charset'',
296 ''@import'', or ''@namespace'' rules) are also not allowed after a
297 conditional group rule. Therefore, style sheets <strong>must
298 not</strong> place such rules after a conditional group rules, and CSS
299 processors <strong>must</strong> ignore such rules.</p>
301 <h2 id="at-media">Media-specific style sheets: the '@media' rule</h2>
303 <p>The <dfn>'@media' rule</dfn> is a conditional group rule whose
304 condition is a media query. It consists of the at-keyword
305 '@media' followed by a (possibly empty) media query list (as
306 defined in [[!MEDIAQ]]), followed by a group rule body. The condition
307 of the rule is the result of the media query.</p>
309 <div class="example">
310 <p>This '@media' rule:</p>
311 <pre>@media print, (max-width: 600px) {
312 #extra_navigation { display: none }
313 }</pre>
314 <p>has the condition ''print, (max-width: 600px)'', which is
315 true for print media and for devices whose width is at most 600px. When
316 either of these is true, the condition of the rule is true, and the rule
317 ''#extra_navigation { display: none }'' is applied.
318 </div>
320 <p>In terms of the grammar, this specification extends the
321 <code>media</code> production in the
322 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
323 ([[!CSS21]], Appendix G) into:
324 <pre><dfn>media</dfn>
325 : MEDIA_SYM S* media_query_list <i>group_rule_body</i>
326 ;</pre>
327 <p>where the <code>group_rule_body</code> production is defined in this
328 specification, the <code>media_query_list</code> production is defined
329 in [[!MEDIAQ]], and the others are defined in the <a
330 href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
331 ([[!CSS21]], Appendix G).
333 <h2 id="at-supports">Feature queries: the '@supports' rule</h2>
335 <p>The <dfn>'@supports' rule</dfn> is a conditional group
336 rule whose condition tests whether the user agent supports CSS
337 property:value pairs. Authors can use it to write style sheets that use
338 new features when available but degrade gracefully when those features
339 are not supported. CSS has existing mechanisms for graceful
340 degradation, such as ignoring unsupported properties or values, but
341 these are not always sufficient when large groups of styles need to be
342 tied to the support for certain features, as is the case for use of new
343 layout system features.</p>
345 <p>The syntax of the condition in the '@supports' rule is
346 slightly more complicated than for the other conditional group rules
347 (though has some similarities to media queries) since:</p>
348 <ul>
349 <li>negation is needed so that the new-feature styles and the fallback
350 styles can be separated (within the forward-compatible grammar's rules
351 for the syntax of @-rules), and not required to override each other</li>
352 <li>conjunction (and) is needed so that multiple required features can
353 be tested</li>
354 <li>disjunction (or) is needed when there are multiple alternative
355 features for a set of styles, particularly when some of those
356 alternatives are vendor-prefixed properties or values</li>
357 </ul>
359 <p>Therefore, the syntax of the '@supports' rule allows
360 testing for property:value pairs, and arbitrary conjunctions (and),
361 disjunctions (or), and negations (not) of them.</p>
363 <p>This extends the lexical scanner in the
364 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
365 ([[!CSS21]], Appendix G) by adding:
366 <pre>
367 @{S}{U}{P}{P}{O}{R}{T}{S} {return SUPPORTS_SYM;}
368 {O}{R} {return OR;}
369 </pre>
371 <p>and the grammar by adding</p>
373 <pre><dfn>supports_rule</dfn>
374 : SUPPORTS_SYM S* <i>supports_condition</i> <i>group_rule_body</i>
375 ;
377 <dfn>supports_condition</dfn>
378 : <i>supports_negation</i> | <i>supports_conjunction</i> | <i>supports_disjunction</i> |
379 <i>supports_condition_in_parens</i>
380 ;
382 <dfn>supports_condition_in_parens</dfn>
383 : ( '(' S* <i>supports_condition</i> ')' S* ) | <i>supports_declaration_condition</i> |
384 <i>general_enclosed</i>
385 ;
387 <dfn>supports_negation</dfn>
388 : NOT S* <i>supports_condition_in_parens</i>
389 ;
391 <dfn>supports_conjunction</dfn>
392 : <i>supports_condition_in_parens</i> ( AND S* <i>supports_condition_in_parens</i> )+
393 ;
395 <dfn>supports_disjunction</dfn>
396 : <i>supports_condition_in_parens</i> ( OR S* <i>supports_condition_in_parens</i> )+
397 ;
399 <dfn>supports_declaration_condition</dfn>
400 : '(' S* declaration ')' S*
401 ;
403 <dfn>general_enclosed</dfn>
404 : ( FUNCTION | '(' ) ( any | unused )* ')' S*
405 ;
406 </pre>
408 <p>in which <code>declaration</code>, <code>any</code>, and
409 <code>unused</code> are the productions in the core syntax of CSS
410 defined in <a
411 href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">section
412 4.1.1 (Tokenization)</a> of [[!CSS21]],
413 and the <code>AND</code> and <code>NOT</code> tokens are defined in
414 the Media Queries specification [[!MEDIAQ]].</p>
416 <p>
417 Implementations <strong>must</strong> parse ''@supports'' rules
418 based on the above grammar,
419 and when interpreting the above grammar,
420 <strong>must</strong> match the production before an <code>|</code> operator
421 in preference to the one after it.
422 </p>
424 <p>
425 The above grammar is purposely very loose for forwards-compatibility reasons,
426 since the <code>general_enclosed</code> production
427 allows for substantial future extensibility.
428 Any ''@supports'' rule that does not parse according to the grammar above
429 (that is, a rule that does not match this loose grammar
430 which includes the general_enclosed production)
431 is invalid.
432 Style sheets <strong>must not</strong> use such a rule and
433 processors <strong>must</strong> ignore such a rule (including all of its contents).
435 <p>Each of these grammar terms is associated with a boolean result, as
436 follows:</p>
437 <dl>
438 <dt>supports_condition</dt>
439 <dd>
440 The result is the result of the single child term.
441 </dd>
443 <dt>supports_condition_in_parens</dt>
444 <dd>
445 The result is the result of the single <code>supports_condition</code>
446 or <code>supports_declaration_condition</code> child term.
447 </dd>
449 <dt>supports_negation</dt>
450 <dd>
451 The result is the <em>negation</em> of the result of the
452 <code>supports_condition_in_parens</code> child term.
453 </dd>
455 <dt>supports_conjunction</dt>
456 <dd>
457 The result is true if the result of <em>all</em> of the
458 <code>supports_condition_in_parens</code> child terms is true;
459 otherwise it is false.
460 </dd>
462 <dt>supports_disjunction</dt>
463 <dd>
464 The result is true if the result of <em>any</em> of the
465 <code>supports_condition_in_parens</code> child terms is true;
466 otherwise it is false.
467 </dd>
469 <dt>supports_declaration_condition</dt>
470 <dd>
471 The result is whether the CSS processor <a href="#support-definition">supports</a> the declaration
472 within the parentheses.
473 </dd>
475 <dt>general_enclosed</dt>
476 <dd>
477 The result is always false.
478 Additionally, style sheets <strong>must not</strong>
479 write ''@supports'' rules
480 that match this grammar production.
481 (In other words, this production exists only for future extensibility,
482 and is not part of the description of a valid style sheet
483 in this level of the specification.)
484 <span class="note">Note that future levels may define functions
485 or other parenthesized expressions that can evaluate to true.</span>
486 </dd>
487 </dl>
489 <p>The condition of the '@supports' rule is the result of the
490 <code>supports_condition</code> term that is a child of the
491 <code>supports_rule</code> term.</p>
493 <div class="example">
494 <p>For example, the following rule</p>
495 <pre>@supports ( display: flexbox ) {
496 body, #navigation, #content { display: flexbox; }
497 #navigation { background: blue; color: white; }
498 #article { background: white; color: black; }
499 }</pre>
500 <p>applies the rules inside the '@supports' rule only when
501 ''display: flexbox'' is supported.</p>
502 </div>
504 <div class="example">
505 <p>The following example shows an additional '@supports' rule that can
506 be used to provide an alternative for when ''display: flexbox'' is not
507 supported:</p>
508 <pre>@supports not ( display: flexbox ) {
509 body { width: 100%; height: 100%; background: white; color: black; }
510 #navigation { width: 25%; }
511 #article { width: 75%; }
512 }</pre>
513 <p>Note that the 'width' declarations may be harmful to the
514 flexbox-based layout, so it is important that they be present only in
515 the non-flexbox styles.</p>
516 </div>
518 <div class="example">
519 <p>The following example checks for support for the 'box-shadow'
520 property, including checking for support for vendor-prefixed versions of
521 it. When the support is present, it specifies both 'box-shadow' (with
522 the prefixed versions) and 'color' in a way what would cause the text to
523 become invisible were 'box-shadow' not supported.</p>
524 <pre>@supports ( box-shadow: 2px 2px 2px black ) or
525 ( -moz-box-shadow: 2px 2px 2px black ) or
526 ( -webkit-box-shadow: 2px 2px 2px black ) or
527 ( -o-box-shadow: 2px 2px 2px black ) {
528 .outline {
529 color: white;
530 -moz-box-shadow: 2px 2px 2px black;
531 -webkit-box-shadow: 2px 2px 2px black;
532 -o-box-shadow: 2px 2px 2px black;
533 box-shadow: 2px 2px 2px black; /* unprefixed last */
534 }
535 }</pre></div>
537 <p>To avoid confusion between ''and'' and ''or'', the syntax requires
538 that both ''and'' and ''or'' be specified explicitly (rather than, say,
539 using commas or spaces for one of them). Likewise, to avoid confusion
540 caused by precedence rules, the syntax does not allow ''and'', ''or'',
541 and ''not'' operators to be mixed without a layer of parentheses.</p>
543 <div class="example">
544 <p>For example, the following rule is not valid:
545 <pre class="illegal">@supports (transition-property: color) or
546 (animation-name: foo) and
547 (transform: rotate(10deg)) {
548 // ...
549 }</pre>
550 <p>Instead, authors must write one of the following:</p>
551 <pre>@supports ((transition-property: color) or
552 (animation-name: foo)) and
553 (transform: rotate(10deg)) {
554 // ...
555 }</pre>
556 <pre>@supports (transition-property: color) or
557 ((animation-name: foo) and
558 (transform: rotate(10deg))) {
559 // ...
560 }</pre>
561 </div>
563 <p>The declaration being tested must always occur within parentheses,
564 when it is the only thing in the expression.<p>
566 <div class="example">
567 <p>For example, the following rule is not valid:
568 <pre class="illegal">@supports display: flexbox {
569 // ...
570 }</pre>
571 <p>Instead, authors must write:</p>
572 <pre>@supports (display: flexbox) {
573 // ...
574 }</pre>
575 </div>
577 <p>The syntax allows extra parentheses when they are not needed. This
578 flexibility is sometimes useful for authors (for example, when
579 commenting out parts of an expression) and may also be useful for
580 authoring tools.</p>
582 <div class="example">
583 <p>For example, authors may write:</p>
584 <pre>@supports ((display: flexbox)) {
585 // ...
586 }</pre>
587 </div>
589 <p>A trailing ''!important'' on a declaration being tested is allowed,
590 though it won't change the validity of the declaration.
592 <div class="example">
593 <p>For example, the following rule is valid:
594 <pre>@supports (display: flexbox !important) {
595 // ...
596 }</pre>
597 </div>
599 <h3 id="support-definition">Definition of support</h3>
601 <p>For forward-compatibility,
602 <a href="http://www.w3.org/TR/CSS21/syndata.html#declaration">section 4.1.8
603 (Declarations and properties)</a> of [[!CSS21]]
604 defines rules for handling invalid properties and values.
605 CSS processors that
606 do not implement or partially implement a specification
607 <strong>must</strong> treat any part of a value that they
608 do not implement, or
609 do not have a usable level of support for,
610 as invalid according to this rule
611 for handling invalid properties and values,
612 and therefore <strong>must</strong> discard the declaration as a parse error.</p>
614 <p>A CSS processor is considered to <dfn id="dfn-support">support</dfn>
615 a declaration (consisting of a property and value) if it accepts that
616 declaration (rather than discarding it as a parse error).
617 If a processor does not implement, with a usable level of support,
618 the value given,
619 then it <strong>must not</strong>
620 accept the declaration or claim support for it.</p>
622 <p>These rules (and the equivalence between them) allow
623 authors to use fallback (either in the [[CSS1]] sense of declarations
624 that are overridden by later declarations or with the new capabilities
625 provided by the ''@supports'' rule in this specification) that works
626 correctly for the features implemented. This applies especially to
627 compound values; implementations must implement all parts of the value
628 in order to consider the declaration supported, either inside a ruleset
629 or in the declaration condition of an ''@supports'' rule.</p>
631 <!--
632 <h2 id="at-document">Document queries: the '@document' rule</h2>
634 <p>The <dfn>'@document' rule</dfn> is a conditional group
635 rule whose condition depends on the
636 <a href="#url-of-doc">URL of the document being styled</a>.
637 This allows style sheets, particularly user style sheets, to have styles
638 that only apply to a set of pages rather than to all pages using the
639 style sheet.</p>
641 <p class="issue">Given that this @-rule is intended primarily for user
642 style sheets, what should this specification say about its use in author
643 style sheets? Should it be forbidden? Should use instead be
644 discouraged? Or should this specification remain neutral on the
645 topic, since there are valid uses in author style sheets?</p>
647 <p id="url-of-doc">The <dfn>URL of the document being styled</dfn> is
648 the URI at which the document is located, excluding any fragment
649 identifiers. (This means, for example, that HTTP redirects have been
650 followed.) If the styles are being applied inside a complete document
651 embedded into the presentation of another (e.g., [[HTML5]]'s <code
652 class="html">iframe</code>, <code class="html">object</code>, or <code
653 class="html">img</code> elements), the relevant URI is that of the
654 frame, not of its container. However, if content from other documents
655 is mixed in via mechanisms that mix content from one document into
656 another (e.g., [[SVG11]]'s <code>use</code> element), then the
657 address of the container document is used.</p>
659 <p class="note">Note: In [[HTML5]], this is the
660 <a href="http://dev.w3.org/html5/spec/dom.html#documents">document's address</a>
661 of a document in a
662 <a href="http://dev.w3.org/html5/spec/browsers.html#browsing-context">browsing context</a>.</p>
664 <div class="issue">What form of normalization is done on URLs and domains
665 before matching? In particular, this specification needs to describe:
666 <ul>
667 <li>what form is used for the <a href="#url-of-doc">URL of the document
668 being styled</a> (and what has been normalized in that form)</li>
669 <li>what normalization (if any) happens to the argument of each of the match
670 functions before the comparison that they describe and</li>
671 <li>whether the
672 comparison algorithm used is string comparison or some other URL
673 comparison algorithm.</li></ul></div>
675 <p>The '@document' rule's condition is written as a
676 comma-separated list of <dfn>URL matching functions</dfn>, and the
677 condition evaluates to true whenever any one of those functions
678 evaluates to true. The following URL matching functions are
679 permitted:</p>
681 <dl>
682 <dt><dfn id="url-exact" title="url()|URL matching functions::exact"><url></dfn></dt>
684 <dd>
685 <p>The 'url()' function is the <dfn>exact url matching
686 function</dfn>. It evaluates to true whenever the <a
687 href="#url-of-doc">URL of the document being styled</a> is exactly
688 the URL given.</p>
690 <p class="Note">The 'url()' function, since it is a core syntax
691 element in CSS, is allowed (subject to different character
692 limitations and thus escaping requirements) to contain an unquoted
693 value (in addition to the string values that are allowed as
694 arguments for all four functions).</p>
696 <div class="example">
697 <p>For example, this rule:</p>
698 <pre>@document url("http://www.w3.org/Style/CSS/") {
699 #summary { background: yellow; color: black}
700 }</pre>
701 <p>styles the <code class="html">summary</code> element on the page
702 <code>http://www.w3.org/Style/CSS/</code>, but not on any other
703 pages.</p>
704 </div>
705 </dd>
707 <dt><dfn id="url-prefix" title="url-prefix()|URL matching functions::prefix">url-prefix(<string>)</dfn></dt>
709 <dd>
710 <p>The 'url-prefix()' function is the <dfn>url prefix
711 matching function</dfn>. It evaluates to true whenever the
712 <a href="#url-of-doc">URL of the document being styled</a>
713 has the argument to the function as an
714 initial substring (which is true when the two strings are equal).
715 When the argument is the empty string, it evaluates to true for all
716 documents.</p>
717 <div class="example">
718 <p>For example, this rule:</p>
719 <pre>@document url-prefix("http://www.w3.org/Style/CSS/") {
720 #summary { background: yellow; color: black}
721 }</pre>
722 <p>styles the <code class="html">summary</code> element on the page
723 <code>http://www.w3.org/Style/CSS/</code> and on the page
724 <code>http://www.w3.org/Style/CSS/Test</code>, but it does not
725 affect the page <code>http://www.w3.org/</code> or the page
726 <code>http://www.example.com/Style/CSS/</code>.</p>
727 </div>
728 </dd>
730 <dt><dfn id="url-domain" title="domain()|URL matching functions::domain">domain(<string>)</dfn></dt>
732 <dd>
733 <p>The 'domain()' function is the <dfn>domain
734 matching function</dfn>. It evaluates to true whenever
735 the <a href="#url-of-doc">URL of the document being styled</a>
736 has a host subcomponent (as defined in [[!URI]])
737 and that host subcomponent is exactly the argument to the
738 'domain()' function or a final substring of the host
739 component is a period (U+002E) immediately followed by the argument
740 to the 'domain()' function.</p>
741 <div class="example">
742 <p>For example, this rule:</p>
743 <pre>@document domain("w3.org") {
744 body { font-size: 16px ! important }
745 }</pre>
746 <p>changes the font size of the body element for pages such as
747 <code>http://www.w3.org/Style/CSS/</code> and
748 <code>http://w3.org/Style/CSS/</code> and
749 <code>http://lists.w3.org/Archives/Public/www-style/</code>
750 but it does not affect the page
751 <code>http://www.example.com/Style/CSS/</code>.</p>
752 </div>
753 </dd>
755 <dt><dfn id="url-regexp" title="regexp()|URL matching functions::regular expression">regexp(<string>)</dfn></dt>
757 <dd>
758 <p>The contents of the <string> argument <strong>must</strong>
759 match the JavaScript <code>Pattern</code> production
760 ([[!ECMA-262-5.1]], section 15.10.1). However,
761 failing to do so is not a CSS syntax error and does not trigger any
762 error handling for CSS syntax errors.</p>
764 <p>The ''regexp()'' function evaluates to true whenever the string
765 argument compiled as a JavaScript regular expression with the
766 <code>global</code>, <code>ignoreCase</code> and
767 <code>multiline</code> flags <em>disabled</em>
768 (see [[!ECMA-262-5.1]], sections 15.10.7.2 through 15.10.7.4)
769 compiles successfully and the resulting regular expression matches
770 the entirety of the
771 <a href="#url-of-doc">URL of the document being styled</a>.</p>
773 <p class="note">Note that regular expression must match the entire
774 URL, not just a part of it.</p>
776 <p class="note">Note that this definition intentionally matches the
777 behavior of the <a
778 href="http://dev.w3.org/html5/spec/common-input-element-attributes.html#attr-input-pattern"><code class="html">pattern</code>
779 attribute</a> on the <code class="html">input</code> element
780 in [[HTML5]].</p>
782 <div class="example">
783 <p>For example, this rule:</p>
784 <pre>@document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {
785 body { font-size: 20px ! important }
786 }</pre>
787 <p>changes the font size of the body element for pages such as
788 <code>http://www.w3.org/TR/2011/PR-CSS2-20110412/</code>.</p>
789 <p class="note">Note that the backslashes in the regular
790 expression require CSS escaping as ''\\''.</p>
791 </div>
792 </dd>
794 </dl>
796 <p>Implementations <strong>must</strong> treat any unknown URL matching
797 functions as a syntax error, and thus ignore the '@document' rule.
798 <span class="issue">Should we instead have more complicated error
799 handling rules to make forward-compatibility work differently, or is
800 this rule the best solution for such future expansion anyway?</span></p>
802 <div class="issue">This syntax doesn't offer any ability to do negations,
803 which has been requested in <a
804 href="https://bugzilla.mozilla.org/show_bug.cgi?id=349813">Mozilla bug
805 349813</a>. Use cases that people have wanted negations for
806 include:
807 <ul>
808 <li>User style sheets that want a particular rule in general, but know
809 that that rule does more harm than good on specific sites.</li>
810 <li>Authors who have a rule that they want to apply to most of their
811 pages, but wish to make a few exceptions for.</li>
812 </ul>
813 </div>
815 <p>This extends the lexical scanner in the
816 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
817 ([[!CSS21]], Appendix G) by adding:
818 <pre>@{D}{O}{C}{U}{M}{E}{N}{T} {return DOCUMENT_SYM;}</pre>
819 <p>and the grammar by adding</p>
820 <pre><dfn>document_rule</dfn>
821 : DOCUMENT_SYM S+ <i>url_match_fn</i> ( "," S* <i>url_match_fn</i> )* <i>group_rule_body</i>
822 ;
824 <dfn>url_match_fn</dfn>
825 : (URI | FUNCTION S* STRING S* ')' ) S*
826 ;</pre>
827 -->
830 <h2 id="apis">APIs</h2>
832 <h3 id='extentions-to-cssrule-interface'>
833 Extensions to the <code>CSSRule</code> interface</h3>
835 <p>The <code>CSSRule</code> interface is extended as follows:
837 <pre class='idl'>partial interface CSSRule {
838 const unsigned short SUPPORTS_RULE = 12;
839 <!--
840 const unsigned short DOCUMENT_RULE = 13;
841 -->
842 }</pre>
845 <h3 id='the-cssgroupingrule-interface'>
846 The <code>CSSGroupingRule</code> interface</h3>
848 <p>The <dfn><code>CSSGroupingRule</code></dfn> interface represents an at-rule that contains other rules nested inside itself.
850 <pre class='idl'>interface CSSGroupingRule : CSSRule {
851 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a> cssRules;
852 unsigned long insertRule (DOMString rule, unsigned long index);
853 void deleteRule (unsigned long index);
854 }</pre>
856 <dl class='idl-attributes'>
857 <dt><code>cssRules</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a></code>, readonly
858 <dd>The <code>cssRules</code> attribute must return a <code>CSSRuleList</code>
859 object for the list of CSS rules nested inside the grouping rule.
860 </dl>
862 <dl class='idl-methods'>
863 <dt><code>insertRule(DOMString rule, unsigned long index)</code>, returns
864 <code>unsigned long</code>
865 <dd>
866 The <code>insertRule</code> operation must
867 insert a CSS rule <var>rule</var>
868 into the CSS rule list returned by <code>cssRules</code>,
869 such that the inserted rule will be at position <var>index</var>,
870 and any rules previously at <var>index</var> or higher
871 will increase their index by one.
872 It must throw INDEX_SIZE_ERR
873 if index is greater than <code>cssRules.length</code>.
874 It must throw SYNTAX_ERR
875 if the rule has a syntax error and is unparseable;
876 this does not include syntax errors handled by error handling rules
877 for constructs inside of the rule.
878 It must throw HIERARCHY_REQUEST_ERR
879 if the rule cannot be inserted at the location specified,
880 for example, if an ''@import'' rule is inserted inside a group rule.
882 <span class="issue">This needs to specify what to do
883 if <code>rule</code> is the empty string,
884 if it contains more than one CSS rule,
885 or if it contains garbage after a valid rule.</span>
887 <dt><code>deleteRule (unsigned long index)</code>, return <code>void</code>
888 <dd>
889 The <code>deleteRule</code> operation must
890 remove a CSS rule from
891 the CSS rule list returned by <code>cssRules</code> at <var>index</var>.
892 It must throw INDEX_SIZE_ERR
893 if index is greater than or equal to <code>cssRules.length</code>.
894 </dl>
897 <h3 id="the-cssconditionrule-interface">
898 The <code>CSSConditionRule</code> interface</h3>
900 <p>The <dfn><code>CSSConditionRule</code></dfn> interface represents all the "conditional" at-rules,
901 which consist of a condition and a statement block.
903 <pre class='idl'>interface CSSConditionRule : CSSGroupingRule {
904 attribute DOMString conditionText;
905 }</pre>
907 <dl class='idl-attributes'>
909 <dt><code>conditionText</code> of type <code>DOMString</code>
910 <dd>
911 <p>The <code>conditionText</code> attribute represents
912 the condition of the rule.
913 Since what this condition does
914 varies between the derived interfaces of <code>CSSConditionRule</code>,
915 those derived interfaces
916 may specify different behavior for this attribute
917 (see, for example, <code>CSSMediaRule</code> below).
918 In the absence of such rule-specific behavior,
919 the following rules apply:</p>
921 <p>The <code>conditionText</code> attribute, on getting, must return
922 the result of serializing the associated condition.
924 <p>On setting the <code>conditionText</code> attribute these steps
925 must be run:
927 <ol>
928 <li>Trim the given value of white space.
929 <li>If the given value matches the grammar of the
930 appropriate condition production for the given rule,
931 replace the associated CSS condition with the given value.
932 <li>Otherwise, do nothing.
933 </ol>
934 </dl>
937 <h3 id="the-cssmediarule-interface">
938 The <code>CSSMediaRule</code> interface</h3>
940 <p>The <dfn><code>CSSMediaRule</code></dfn> interface represents a ''@media'' rule:
942 <pre class='idl'>interface CSSMediaRule : CSSConditionRule {
943 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a> media;
944 }</pre>
946 <dl class='idl-attributes'>
947 <dt><code>media</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a></code>, readonly
948 <dd>The <code>media</code> attribute must return a <code>MediaList</code> object
949 for the list of media queries specified with the ''@media'' rule.
951 <dt><code>conditionText</code> of type <code>DOMString</code>
952 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
953 on getting, must return the value of <code>media.mediaText</code> on the rule.
955 <p>Setting the <code>conditionText</code> attribute
956 must set the <code>media.mediaText</code> attribute on the rule.
957 </dl>
960 <h3 id="the-csssupportsrule-interface">
961 The <code>CSSSupportsRule</code> interface</h3>
963 <p>The <dfn><code>CSSSupportsRule</code></dfn> interface represents a ''@supports'' rule.</p>
965 <pre class='idl'>interface CSSSupportsRule : CSSConditionRule {
966 }</pre>
968 <!--
969 <h3 id="the-cssdocumentrule-interface">
970 The <code>CSSDocumentRule</code> interface</h3>
972 <p>The <dfn><code>CSSDocumentRule</code></dfn> interface represents a ''@document'' rule.</p>
974 <pre class='idl'>interface CSSDocumentRule : CSSConditionRule {
975 }</pre>
976 -->
979 <h3 id='the-css-interface'>
980 The <code>CSS</code> interface, and the <code title=''>supports()</code> function</h3>
982 <p>The <dfn id='CSS-interface'><code>CSS</code></dfn> interface holds useful CSS-related functions that do not belong elsewhere.
984 <pre class='idl'>interface CSS {
985 static boolean supports(DOMString property, DOMString value);
986 static boolean supports(DOMString conditionText);
987 }</pre>
989 <dl class='idl-methods'>
990 <dt><code>supports(DOMString property, DOMString value)</code>,
991 returns <code>boolean</code>
992 <dt><code>supports(DOMString conditionText)</code>,
993 returns <code>boolean</code>
994 <dd>
995 When the <code title=''>supports()</code> method is invoked with two arguments <var>property</var> and <var>value</var>,
996 it must return <code>true</code> if <var>property</var> is a literal match for the name of a CSS property that the UA supports,
997 and <var>value</var> would be successfully parsed as a supported value for that property.
998 Otherwise, it must return <code>false</code>.
1000 <p>
1001 When invoked with a single <var>conditionText</var> argument,
1002 it must return <code>true</code> if <var>conditionText</var>,
1003 when parsed and evaluated as a <code>supports_condition</code>,
1004 would return true.
1005 Otherwise, it must return <code>false</code>.
1006 </dl>
1009 <h2 class=no-num id="grammar">Grammar</h2>
1011 <p>In order to allow these new @-rules in CSS style sheets, this
1012 specification modifies the <code>stylesheet</code> production in the <a
1013 href="http://www.w3.org/TR/CSS21/grammar.html">Appendix G</a> grammar of
1014 [[!CSS21]] by replacing the <code>media</code> production defined in
1015 [[!CSS21]] with the <code>media</code> production defined in this one,
1016 and additionally inserting <code>| supports_rule</code>
1017 alongside <code>ruleset | media | page</code>.</p>
1020 <h2 id="conformance">Conformance</h2>
1022 <h3 id="base-modules">Base Modules</h3>
1024 <p>This specification defines conformance in terms of base modules,
1025 which are modules that this specification builds on top of. The base
1026 modules of this module are:</p>
1028 <ul>
1029 <li>[[!CSS21]]</li>
1030 </ul>
1032 <p>All of the conformance requirements of all base modules are
1033 incorporated as conformance requirements of this module, except where
1034 overridden by this module.</p>
1036 <p>Additionally, all conformance requirements related to validity of
1037 syntax in this module and all of its base modules are to be interpreted
1038 as though all syntax in all of those modules is valid.</p>
1040 <div class="example"><p>For example, this means that grammar presented
1041 in modules other than [[!CSS21]] must obey the requirements that
1042 [[!CSS21]] defines for the parsing of properties, and that requirements
1043 for handling invalid syntax in [[!CSS21]] do not treat syntax added by
1044 other modules as invalid.</p></div>
1046 <p>Additionally, the set of valid syntax can be increased by the
1047 conformance of a style sheet or processor to additional modules; use of
1048 such syntax does not make a style sheet nonconformant and failure to
1049 treat such syntax as invalid does not make a processor
1050 nonconformant.</p>
1052 <h3 id="conformance-classes">Conformance Classes</h3>
1054 <p>Conformance to the CSS Conditional Rules Module is defined for three
1055 conformance classes:
1056 <dl>
1057 <dt><dfn title="conformance::style sheet" id="conform-style-sheet">style sheet</dfn>
1058 <dd>A <a href="http://www.w3.org/TR/CSS21/conform.html#style-sheet">CSS
1059 style sheet</a>.</dd>
1060 <dt><dfn title="conformance::processor" id="conform-processor">processor</dfn></dt>
1061 <dd>A tool that reads CSS style sheets: it may be a renderer or
1062 <a
1063 href="http://www.w3.org/TR/CSS21/conform.html#user-agent">user-agent</a>
1064 that interprets the semantics of a style sheet and renders
1065 documents that use style sheets, or it may be a validator that
1066 checks style sheets.</dd>
1067 <dt><dfn title="conformance::authoring tool" id="conform-authoring-tool">authoring tool</dfn></dt>
1068 <dd>A tool that writes a style sheet.</dd>
1069 </dl>
1071 <p>A style sheet is conformant to the CSS Conditional Rules Module
1072 if it meets all of the conformance requirements in the module that are
1073 described as requirements of style sheets.</p>
1075 <p>A processor is conformant to the CSS Conditional Rules Module if it
1076 meets all applicable conformance requirements in the module that are
1077 described as requirements of processors. In general, all requirements
1078 are applicable to renderers. Requirements concerning a part of CSS
1079 not performed by a processor are not applicable, e.g., requirements
1080 related to rendering are not applicable to a validator. The inability
1081 of a processor to correctly render a document due to limitations of
1082 the device does not make it non-conformant. (For example, a renderer
1083 is not required to render color on a monochrome monitor.)</p>
1085 <p>An authoring tool is conformant to the CSS Conditional Rules Module
1086 if it writes style sheets that conform to the module and (if it reads
1087 CSS) it is a conformant processor.</p>
1089 <h3 id="partial">
1090 Partial Implementations</h3>
1092 <p>So that authors can exploit the forward-compatible parsing rules to
1093 assign fallback values, CSS renderers <strong>must</strong>
1094 treat as invalid (and <a href="http://www.w3.org/TR/CSS21/conform.html#ignore">ignore
1095 as appropriate</a>) any at-rules, properties, property values, keywords,
1096 and other syntactic constructs for which they have no usable level of
1097 support. In particular, user agents <strong>must not</strong> selectively
1098 ignore unsupported component values and honor supported values in a single
1099 multi-value property declaration: if any value is considered invalid
1100 (as unsupported values must be), CSS requires that the entire declaration
1101 be ignored.</p>
1103 <h3 id="experimental">Experimental Implementations</h3>
1105 <p>To avoid clashes with future CSS features, the CSS specifications
1106 reserve a <a href="http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords">prefixed
1107 syntax</a> for proprietary property and value extensions to CSS. The CSS
1108 Working Group recommends that experimental implementations of features in
1109 CSS Working Drafts also use vendor-prefixed property or value names. This
1110 avoids any incompatibilities with future changes in the draft. Once a
1111 specification reaches the Candidate Recommendation stage, implementors
1112 should implement the non-prefixed syntax for any feature they consider to
1113 be correctly implemented according to spec.</p>
1115 <h3 id="cr-exit-criteria">CR Exit Criteria</h3>
1117 <p>For this specification to be advanced to Proposed Recommendation,
1118 there must be at least two independent, interoperable implementations
1119 of each feature. Each feature may be implemented by a different set of
1120 products, there is no requirement that all features be implemented by
1121 a single product. For the purposes of this criterion, we define the
1122 following terms:
1124 <dl>
1125 <dt>independent <dd>each implementation must be developed by a
1126 different party and cannot share, reuse, or derive from code
1127 used by another qualifying implementation. Sections of code that
1128 have no bearing on the implementation of this specification are
1129 exempt from this requirement.
1131 <dt>interoperable <dd>passing the respective test case(s) in the
1132 official CSS test suite, or, if the implementation is not a Web
1133 browser, an equivalent test. Every relevant test in the test
1134 suite should have an equivalent test created if such a user
1135 agent (UA) is to be used to claim interoperability. In addition
1136 if such a UA is to be used to claim interoperability, then there
1137 must one or more additional UAs which can also pass those
1138 equivalent tests in the same way for the purpose of
1139 interoperability. The equivalent tests must be made publicly
1140 available for the purposes of peer review.
1142 <dt>implementation <dd>a user agent which:
1144 <ol class=inline>
1145 <li>implements the specification.
1147 <li>is available to the general public. The implementation may
1148 be a shipping product or other publicly available version
1149 (i.e., beta version, preview release, or “nightly build”).
1150 Non-shipping product releases must have implemented the
1151 feature(s) for a period of at least one month in order to
1152 demonstrate stability.
1154 <li>is not experimental (i.e., a version specifically designed
1155 to pass the test suite and is not intended for normal usage
1156 going forward).
1157 </ol>
1158 </dl>
1160 <p>The specification will remain Candidate Recommendation for at least
1161 six months.
1163 <h2 id="changes">
1164 Changes</h2>
1166 <p>The following (non-editorial) changes were made to this specification since the
1167 <a href="http://www.w3.org/TR/2012/WD-css3-conditional-20120911/">11 September 2012 Working Draft</a>:
1169 <ul>
1170 <li>Removed ''@document'' rule; it has been deferred to Level 4.
1171 <li>Allow functional notation in ''@supports'' queries to be valid (to allow for future extensions),
1172 but treat such notations as always being false.
1173 <li>Corrected the grammar as follows:
1174 <pre>
1175 - : SUPPORTS_SYM S+ supports_condition group_rule_body
1176 + : SUPPORTS_SYM S* supports_condition group_rule_body
1177 </pre>
1178 <pre>
1179 - : (URI | FUNCTION) S*
1180 + : (URI | FUNCTION S* STRING S* ')' ) S*
1181 </pre>
1182 <li>Switched "and", "or", and "not" keywords to use appropriate productions rather than literals.
1183 <li>Clarified definition of support used for interpreting ''@support'' rules
1184 and its relationship to CSS forwards-compatible parsing rules.
1185 </ul>
1187 <h2 class=no-num id="acknowledgments">Acknowledgments</h2>
1189 <p>
1190 Thanks to the ideas and feedback from
1191 Tab Atkins,
1192 <span lang="tr">Tantek Çelik</span>,
1193 Alex Danilo,
1194 Elika Etemad,
1195 Pascal Germroth,
1196 <span lang="de">Björn Höhrmann</span>,
1197 Paul Irish,
1198 <span lang="nl">Anne van Kesteren</span>,
1199 Vitor Menezes,
1200 Alex Mogilevsky,
1201 Chris Moschini,
1202 Simon Sapin,
1203 Ben Ward,
1204 Zack Weinberg,
1205 Estelle Weyl,
1206 Boris Zbarsky,
1207 and all the rest of the <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.
1209 </p>
1211 <h2 class=no-num id="references">References</h2>
1214 <h3 class="no-num" id="normative-references">Normative references</h3>
1215 <!--normative-->
1217 <h3 class="no-num" id="other-references">Other references</h3>
1218 <!--informative-->
1220 <h2 class="no-num" id="index">Index</h2>
1221 <!--index-->
1223 </body>
1224 </html>
1225 <!-- Keep this comment at the end of the file
1226 Local variables:
1227 mode: sgml
1228 sgml-declaration:"~/SGML/HTML4.decl"
1229 sgml-default-doctype-name:"html"
1230 sgml-minimize-attributes:t
1231 sgml-nofill-elements:("pre" "style" "br")
1232 sgml-live-element-indicator:t
1233 sgml-omittag:nil
1234 sgml-shorttag:nil
1235 sgml-namecase-general:t
1236 sgml-general-insert-case:lower
1237 sgml-always-quote-attributes:t
1238 sgml-indent-step:nil
1239 sgml-indent-data:t
1240 sgml-parent-document:nil
1241 sgml-exposed-tags:nil
1242 sgml-local-catalogs:nil
1243 sgml-local-ecat-files:nil
1244 End:
1245 -->