By Chen Hui Jing / @hj_chen
<symbol> ::= __expression__
The stuff on the left can be replaced by the stuff on the right.
A sandwich consists of a lower slice of bread, mustard or mayonnaise; optional lettuce, an optional slice of tomato; two to four slices of either bologna, salami, or ham (in any combination); one or more slices of cheese, and a top slice of bread.
sandwich ::= lower_slice [ mustard | mayonnaise ] lettuce? tomato? [ bologna | salami | ham ]{2,4} cheese+ top_slice
Analogy from How to Read W3C Specs.
Value type | Description | Example |
---|---|---|
Keyword values | Actual value used; No quotation marks or angle brackets | auto or none |
Basic data types | To be replaced with actual values; Angle brackets | <length> or <percentage> |
Property data type | Uses same set of values as defined property, usually used for shorthand property definitions; Quotation marks within angle brackets | <'grid-template-rows'> or <'flex-basis'> |
Non-property data type | Set of values is defined somewhere else in the specification, usually near its first appearance; Angle brackets only | <line-names> or <track-repeat> |
All values must occur in specified order
<'property-name'> = value1 value2 value3
↓
.selector { property: value1 value2 value3; }
All values must occur, order doesn't matter
<'property-name'> = value1 && value2
↓
.selector { property: value1 value2; }
.selector { property: value2 value1; }
Only 1 value must occur
<'property-name'> = value1 | value2 | value3
↓
.selector { property: value1; }
.selector { property: value2; }
.selector { property: value3; }
1 or more values must occur, order doesn't matter
<'property-name'> = value1 || value2 || value3
↓
.selector { property: value3; }
.selector { property: value2 value3; }
.selector { property: value1 value2 value3; }
and so on...
Components belong to a single grouping
<'property-name'> = [ value1 | value2 ] value3
↓
.selector { property: value1 value3; }
.selector { property: value2 value3; }
Optional value, can occur 0 or 1 time
<'property-name'> = value1 [, value2 ]?
↓
.selector { property: value1; }
.selector { property: value1, value2; }
Optional value, can occur 0 or many times, multiple values are comma-separated
<'property-name'> = value1 [, <value2>]*
↓
.selector { property: value1; }
.selector { property: value1, <value2>; }
.selector { property: value1, <value2>, <value2>, <value2>; }
and so on...
Can occur 1 or many times, multiple values are space-separated
<'property-name'> = <value>+
↓
.selector { property: <value>; }
.selector { property: <value> <value>; }
.selector { property: <value> <value> <value> <value>; }
and so on...
Value occurs 𝓍 times, multiple values are space-separated
<'property-name'> = <value>{2}
↓
.selector { property: <value> <value>; }
Value occurs at least 𝓍 times, at most 𝓎 times, multiple values are space-separated
<'property-name'> = <value>{1,3}
↓
.selector { property: <value>; }
.selector { property: <value> <value>; }
.selector { property: <value> <value> <value>; }
Value occurs at least 𝓍 times, no maximum limit, multiple values are space-separated
<'property-name'> = <value>{1,}
↓
.selector { property: <value>; }
.selector { property: <value> <value> <value>; }
and so on...
Value occurs 1 or many times, multiple values are comma-separated
<'property-name'> = <value>#
↓
.selector { property: <value>; }
.selector { property: <value>, <value>; }
.selector { property: <value>, <value>, <value>, <value>; }
and so on...
Values in grouping are required, at least 1 value must occur
<'property-name'> = <value1> [ <value2> | <value3> ]!
↓
.selector { property: <value1> <value2>; }
.selector { property: <value1> <value3>; }
none | <shadow>#
where
<shadow> = inset? && <length>{2,4} && <color>?
<bg-layer># , <final-bg-layer>
where
<bg-layer> = <bg-image> || <position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>
<final-bg-layer> = <'background-color'> || <bg-image> || <position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>
none | <track-list> | <auto-track-list>
where
<track-list> = [ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?
<auto-track-list> = [ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat>
[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?
<explicit-track-list> = [ <line-names>? <track-size> ]+ <line-names>?
<track-size> = <track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( <length-percentage> )
<fixed-size> = <fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )
<track-breadth> = <length-percentage> | <flex> | min-content | max-content | auto
<inflexible-breadth> = <length-percentage> | min-content | max-content | auto
<fixed-breadth> = <length-percentage>
<line-names> = '[' <custom-ident>* ']'
🤷 I is troll 😈