W3C

CSS Lists and Counters Module Level 3

Editor's Draft 2 May 2011

This version:
http://dev.w3.org/csswg/css3-lists/
Latest version:
http://www.w3.org/TR/css3-lists/
Previous version:
http://www.w3.org/TR/2002/WD-css3-lists-20021107/
Editor:
Tab Atkins Jr., Google Inc.
Previous Editors:
Ian Hickson, ian@hixie.ch
Tantek Çelı̇k, Microsoft Corporation, tantekc@microsoft.com
Contributors:
Simon Montagu, AOL-TW/Netscape, smontagu@netscape.com
Daniel Yacob, yacob@geez.org
Christopher Hoess, choess@stwing.upenn.edu
Daniel Glazman, AOL-TW/Netscape, glazman@netscape.com

Abstract

CSS is a language for describing the rendering of structured documents (such as HTML and XML) on screen, on paper, in speech, etc. This draft contains the features of CSS level 3 relating to list styling. It includes and extends the functionality of CSS level 2 [CSS21], which builds on CSS level 1 [CSS1]. The main extensions compared to level 2 are a pseudo-element representing the list marker, a new ‘hanging’ value for ‘list-style-position’, and a method for authors to define their own list-styles.

Status of this document

This is a public copy of the editors' draft. It is provided for discussion only and may change at any moment. Its publication here does not imply endorsement of its contents by W3C. Don't cite this document other than as work in progress.

The (archived) public mailing list www-style@w3.org (see instructions) is preferred for discussion of this specification. When sending e-mail, please put the text “css3-lists” in the subject, preferably like this: “[css3-lists] …summary of comment…

This document was produced by the CSS Working Group (part of the Style Activity).

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.

Table of contents


1. Introduction

The list model in this module differs in some important ways from the list model in CSS2, specifically in its handling of markers. Implementation experience suggested the CSS2 model overloaded the ::before and ::after pseudo-elements with too much behavior, while at the same time introducing new properties when existing properties were sufficient.

Most block-level elements in CSS generate one principal block box. In this module, we discuss two CSS mechanisms that cause an element to have an associated marker: one method associates one principal block box (for the element's content) with a separate marker box (for decoration such as a bullet, image, or number), and the other inserts a marker box into the principal box. Unlike :before and :after content, the marker box cannot affect the position of the principal box, whatever the positioning scheme.

For instance, the following example illustrates how markers may be used to add parentheses around each numbered list item. This HTML application and style sheet:

<!doctype html>
<html>
 <head>
  <title>Creating a list with markers</title>
  <style>
   li::marker { content: "(" counter(list-item, lower-roman) ")"; }
   li { display: list-item; }
  </style>
 </head>
 <body>
  <ol>
   <li>This is the first item.</li>
   <li>This is the second item.</li>
   <li>This is the third item.</li>
  </ol>
 </body>
</html>
		

should produce something like this:

  (i) This is the first item.
 (ii) This is the second item.
(iii) This is the third item.

With descendant selectors and child selectors, it's possible to specify different marker types depending on the depth of embedded lists.

A future release of this module will probably include ways to render tree lists.

2. Declaring a List Item

To declare a list item, the ‘display’ property should be set to ‘list-item’. This, in addition to generating a ‘::marker’ pseudo-element and enabling the properties described below for that element, causes that element to increment the list item counter ‘list-item’. (This does not affect the specified or computed values of the counter properties.)

The ‘list-item’ counter is a real counter, and can be directly affected using the ‘counter-increment’ and ‘counter-reset’ properties. It can also be used in the ‘counter()’ and ‘counters()’ functions.

The CSS3 box module may define other ‘display’ values which generate a list marker. These should also affect the ‘list-item’ counter.

Note that this new model makes the ‘marker’ display type redundant. That display type is therefore obsolete in the CSS3 Lists model.

3. Marker Content: The ‘list-style-type’ and ‘list-style-image’ properties

Name: list-style-type
Value: <string> | <counter-style> | inline | none
Initial: disc
Applies To: all elements with ‘display: list-item
Inherited: yes
Media: visual
Computed Value: specified value

When the ‘list-style-image’ property is ‘none’ or not a valid image, the ‘list-style-type’ property is instead used to construct the default contents of a list item's marker.

<string>
The ‘::marker’ pseudoelement must use the provided string as its default contents.
<counter-style>

The ‘::marker’ pseudoelement's default contents must be the value of the ‘list-item’ counter, formatted according to the given counter style. Algorithms for formatting a value according to a counter style are given later in this spec.

This specification defines a method for authors to create their own counter styles which may be used here. Additionally, many useful counter styles are predefined in the sections on Predefined Counter Styles and Additional Predefined Counter Styles.

inline
The ‘::marker’ pseudoelement's default contents must be the textual contents of the list item's first child that is an inline marker candidate, if one exists.
none
The ‘::marker’ pseudoelement must have no default contents. This will suppress the creation of a marker unless the ‘::marker’ has its contents specified directly through the ‘content’ property.
Name: list-style-image
Value: <image> | none
Initial none
Applies To: all elements with ‘display: list-item
Inherited: yes
Media: visual
Computed Value: specified value

This property sets the image that will be used as the list item marker. When the <image> resolves to a valid image, it is used as the default contents of ‘::marker’ instead of the value specified by ‘list-style-type’.

If the value ‘none’ is provided, or the <image> doesn't resolve to a valid image, then the default contents are given by ‘list-style-type’ instead.

The following example sets the marker at the beginning of each list item to be the image "ellipse.png".

LI { list-style-image: url("http://www.example.com/ellipse.png") }

4. Marker Position: The ‘list-style-position’ property

Name: list-style-position
Value: inside | hanging | outside
Initial: outside
Applies To: all elements with ‘display: list-item
Inherited: yes
Media: visual
Computed Value: specified value

This property specifies the position of the ‘::marker’ pseudo-element's box in the list item. Values have the following meanings:

inside
The ‘::marker’ pseudo-element is an inline-block element placed immediately before the ‘::before’ pseudo-element in the list item's principle box, after which the element's content flows. Note that if there is no inline content, this will create a line box, just as content in an inline ‘::before’ pseudo-element would. Also note that all the properties that apply to inline elements apply to the ‘::marker’ pseudo-element in this state, and this ‘::marker’ box participates in the inline box model in the normal manner.

Inline markers have some special behavior wrt white-space collapsing at the beginning of the list-item. I need to figure this out and spec it. (Since I have hanging and outside markers be abspos, it doesn't apply to them.)

hanging
As ‘inside’, except the marker is absolutely positioned. The marker's static position is such that its baseline is aligned with the baseline of the first line box in the list item, and its "end" edge is flush with the "start" edge of the first line box in the list item. Note that, per the Positioned Layout spec, absolutely positioned boxes leave behind a ‘placeholder’ in their original position in the box tree, which may have an effect on line-box generation.
outside
As ‘inside’, except the marker is absolutely positioned and has the same directionality as the list item's parent box. The marker's static position is such that its "over" edge is flush with the edge of the list item corresponding with the "over" edge of the list item's parent box, and it's "end" edge is flush with the edge fo the list item corresponding to the "start" edge of the list item's parent box.

Are the positioning rules for ‘hanging’ and ‘outside’ good?

Note that a marker is only generated if the computed value of the ‘content’ property for the element's ‘::marker’ pseudo-element is not ‘none’.

For example:

<!doctype html>
<html>
 <head>
  <title>Comparison of inside/outside position</title>
  <style>
   ul         { list-style: outside; }
   ul.compact { list-style: inside; }
  </style>
 </head>
 <body>
  <ul>
   <li>first list item comes first</li>
   <li>second list item comes second</li>
  </ul>
  <ul class=compact>
   <li>first list item comes first</li>
   <li>second list item comes second</li>
  </ul>
 </body>
</html>
		

The above example may be formatted as:

list with bullets to the left of it and list with bullets
     inside

In right-to-left text, the markers would have been on the right side of the box.

5. The ‘list-style’ shorthand property

Name: list-style
Value: <‘list-style-type’> || <‘list-style-position’> || <‘list-style-image’>
Initial: N/A (shorthand property)
Applies To: all elements with ‘display: list-item
Media: visual
Computed Value; N/A (shorthand property)

The ‘list-style’ property is a shorthand notation for setting the three properties ‘list-style-type’, ‘list-style-image’, and ‘list-style-position’ at the same place in the style sheet.

For example:

UL { list-style: upper-roman inside }  /* Any UL */
UL > UL { list-style: circle outside } /* Any UL child of a UL */
		

Using a value of ‘none’ in the shorthand is potentially ambiguous, as ‘none’ is a valid value for both ‘list-style-image’ and ‘list-style-type’; to resolve this ambiguity, a value of ‘none’ in the shorthand must be applied to whichever of the two properties aren't otherwise set by the shorthand.

list-style: none disc;
/* Sets the image to ''none'' and the type to ''disc''. */

list-style: none url(bullet.png);
/* Sets the image to ''url(bullet.png)'' and the type to ''none''. */

list-style: none;
/* Sets both image and type to ''none''. */

list-style: none disc url(bullet.png);
/* Syntax error */
	

Although authors may specify ‘list-style’ information directly on list item elements (e.g., LI in HTML), they should do so with care. The following rules look similar, but the first declares a descendant selector and the second a (more specific) child selector.

	OL.alpha LI   { list-style: lower-alpha } /* Any LI descendant of an OL */
	OL.alpha > LI { list-style: lower-alpha } /* Any LI child of an OL */
		

Authors who use only the descendant selector may not achieve the results they expect. Consider the following rules:

<!doctype html>
<html>
 <head>
  <title>WARNING: Unexpected results due to cascade</title>
  <style>
    ol.alpha li { list-style: lower-alpha; }
    ul li       { list-style: disc; }
  </style>
 </head>
 <body>
  <ol class=alpha>
   <li>level 1
    <ul>
     <li>level 2</li>
    </ul>
   </li>
  </ol>
 </body>
</html>
	

The desired rendering would have level 1 list items with ‘lower-alpha’ labels and level 2 items with ‘disc’ labels. However, the cascading order will cause the first style rule (which includes specific class information) to mask the second. The following rules solve the problem by employing a child selector instead:

OL.alpha > LI   { list-style: lower-alpha }
UL LI           { list-style: disc }

Another solution would be to specify ‘list-style’ information only on the list type elements:

OL.alpha   { list-style: lower-alpha }
UL         { list-style: disc }

Inheritance will transfer the ‘list-style’ values from OL and UL elements to LI elements. This is the recommended way to specify list style information.

6. Markers: The ‘::marker’ pseudo-element

Markers are created by setting an element's ‘display’ property to ‘list-item’. The ‘list-item’ display type is, in every other respect, identical to the ‘block’ display type. The marker box is only created if the computed value of the ‘content’ property for the pseudo-element is not ‘none’.

Just like other generated content, markers generate a box when they're created, which has margins, border, padding, and everything else a box normally has. Markers are placed at the beginning of their superior parent's content, immediately before a ‘::before’ pseudo-element on the same superior parent. Marker boxes are inline-block by default, and so a value of ‘auto’ for ‘width’ resolves to the width of the marker's content. The value of ‘list-style-position’ on the marker's superior parent can vary the marker's directionality and the initial value of its ‘position’ property.

In the following example, the content is centered within a marker box of a fixed width. This document:

<!doctype html>
<html>
 <head>
  <title>Content alignment in the marker box</title>
  <style>
   LI::marker { 
     content: "(" counter(counter) ")";
     width: 6em;
     text-align: center;
   }
   LI {
     display: list-item;
     counter-increment: counter;
   }
  </style>
 </head>
 <body>
  <ol>
   <li>This is the first item.</li>
   <li>This is the second item.</li>
   <li>This is the third item.</li>
  </ol>
 </body>
</html>
		

should render something like this:

  (1)    This is the 
         first item.
  (2)    This is the 
         second item.
  (3)    This is the 
         third item.
		

The next example uses markers to number notes (paragraphs).

The following document:

<!doctype html>
<html>
 <head>
  <title>Markers to create numbered notes</title>
  <style>
   P { margin-left: 12 em; }
   P.Note::marker { 
      content: url("note.gif") "Note " counter(note-counter) ":";
      text-align: left;
      width: 10em;
   }
   P.Note {
     display: list-item;
     counter-increment: note-counter;
   }
  </style>
 </head>
 <body>
  <p>This is the first paragraph in this document.</p>
  <p class="Note">This is a very short document.</p>
  <p>This is the end.</p>
 </body>
</html>
		

should render something like this:

            This is the first paragraph 
            in this document.

  Note 1:   This is a very short 
            document.
           
            This is the end.

The following example illustrates how markers may be offset from their element. This HTML application and style sheet:

<!doctype html>
<html>
 <head>
  <title>Marker example</title>
  <style>
   P { margin-left: 8em } /* Make space for counters */
   LI::marker { margin: 0 3em 0 0; content: counter(list-item, lower-roman) "."; }
   LI { display: list-item }
  </style>
 </head>
 <body>
  <p>This is a long preceding paragraph ...</p>
  <ol>
   <li>This is the first item.</li>
   <li>This is the second item.</li>
   <li>This is the third item.</li>
  </ol>
  <p>This is a long following paragraph ...</p>
 </body>
</html>
		

should render something like this:

        This is a long preceding
        paragraph ...
      
   i.   This is the first item.
  ii.   This is the second item.
 iii.   This is the third item.

        This is a long following
        paragraph ...

(Note the use of the implicit counter increment.)

6.1. Generating the computed value of the ‘content’ property

If a ‘::marker’ pseudo-element has its ‘content’ property set to ‘normal’, the computed value of the marker's ‘content’ property must be constructed according to the following algorithm:

  1. If the computed value of ‘list-style-image’ is a valid image, then the computed value of the ‘content’ property is the value of the ‘list-style-image’ property.
  2. Otherwise, if the computed value of ‘list-style-type’ is a string, then the computed value of the ‘content’ property is that string.
  3. Otherwise, if the computed value of ‘list-style-type’ is the keyword ‘inline’, and the list item has a child element which is an inline marker candidate, the computed value of the ‘content’ property is the textual contents of the list item's first inline marker candidate child.
  4. Otherwise, if the computed value of ‘list-style-type’ is the name of a counter style, then the computed value of the ‘content’ property is ‘counter(list-item, <counter-style>)’, where <counter-style> is the computed value of the ‘list-style-type’ property, followed by a string that is the suffix for the counter style in question (which may be empty). Fix this.
  5. Otherwise the computed value is ‘none’.

Given the following style sheet:

li { display: list-item; list-style-type: decimal /* initial value */; }
li::marker { content: normal /* initial value */; }
		

And the following document fragment:

<li>List Item</li>
		

The computed value of the ‘content’ property on the ‘::marker’ pseudo-element of the list item element is:

counter(list-item, decimal) "."

7. Using Content as Markers: the ‘marker’ value for ‘display

In some situations, such as legal proceedings or official minutes, the precise form that the list marker takes is a vital part of the content. It's not acceptable for the marker to change just because the UA is not rendering CSS, or some server error is temporarily preventing the CSS file from being loaded, as the precise marker name is used to officially refer to that segment. The only way to guarantee that the marker will be rendered correctly, regardless of whether CSS is applied, is to specify the marker outside of CSS, directly in the document's markup. However, the page author may still want to style the marker in many of the ways that are available to them when using ordinary CSS-generated markers. To accomodate this, a new value for the ‘display’ property is defined.

Name: display
New Value: marker
Applies to: Children elements of display:list-item elements

The ‘marker’ value for ‘display’ indicates that an element is a candidate for having its contents used as a list marker. If the element is a child of a list item with ‘list-style-type:inline’, and none of the element's previous siblings are candidates, the textual content of the element (such as what would be returned by the .textContent property on the element in HTML) must be used as the default contents of the ::marker pseudoelement on the element's parent. Otherwise, this value must be treated identically to ‘inline-block’.

8. Predefined Counter Styles

While authors may define their own counter styles using the ‘@counter-style’ rule defined in this spec, there are many counter styles that CSS already defined in previous levels, and many more that can be usefully predefined. Appendix A contains a required UA stylesheet which defines a large number of counter styles using the ‘@counter-style’ rule. A few styles require special handling beyond what can be expressed in a stylesheet, though. Those counter styles are described in this section.

8.1. Glyphs

CSS 2.1 defined three single-glyph counter styles (‘circle’, ‘disc’, and ‘square’), but didn't define precisely how to render them, instead opting to describe generally how they should look and leaving it up to the UA to decide how to render the markers.

Appendix A gives normative definitions for these styles, but UAs may instead default to rendering these styles using a browser-generated image matching the description below. This only describes the rendering of the default counter styles associated with these names - if an author or user creates their own counter style with one of these names (overriding the UA-default version), they must be honored as normal.

If the UA chooses to use an image for the default rendering of these counter styles, the image must be scalable and designed to attractively fill a box 1em wide and 1em tall.

circle
A hollow circle, similar to ◦ U+25E6 WHITE BULLET.
disc
A filled circle, similar to • U+2022 BULLET.
square
A filled square, similar to ■ U+25A0 BLACK SQUARE.

8.2. Complex counter styles

Nearly all counter styles can be described using the small set of algorithms described by the ‘type’ descriptor. A small handful, though, require more complex handling which is too specialized to warrant crafting a generalized algorithm to use in ‘type’. Instead, their algorithms are described here. Just like a counter style defined with the @counter-style rule, these counter styles can be overridden by creating another @counter-style rule with the same name, or can be used in the ‘override’ type to alter their descriptors while keeping the algorithms described here.

8.2.1. The ‘ethiopic-numeric’ counter style

The Ethiopian numbering system is defined for all positive non-zero numbers. The following algorithm converts decimal digits to ethiopic numbers.

  1. Split the number into groups of two digits, starting with the least significant decimal digit.
  2. Index each group sequentially, starting from the least significant as group number zero.
  3. If the group has an odd index (as given in the previous step) and has the value 1, or if the group is the most significant one and has the value 1, or if the group has the value zero, then remove the digit (but leave the group, so it still has a separator appended below).
  4. For each remaining digit, substitute the relevant ethiopic character from the list below.
    Ethiopic numbering system
    Tens Units
    Values Codepoints Values Codepoints
    10 U+1372 1 U+1369
    20 U+1373 2 U+136A
    30 U+1374 3 U+136B
    40 U+1375 4 U+136C
    50 U+1376 5 U+136D
    60 U+1377 6 U+136E
    70 U+1378 7 U+136F
    80 U+1379 8 U+1370
    90 U+137A 9 U+1371
  5. For each group with an odd index (as given in the second step) that did not have its digits removed in the third step, append ፻ U+137B.
  6. For each group with an even index (as given in the second step), except the group with number 0, append ፼ U+137C.
  7. Concatenate the groups into one string.

For this system, the name is "ethiopian-numeric", the lower range bound descriptor is 1, the upper range bound descriptor is infinity, and the rest of the descriptors have their initial value.

Is there a better suffix to use than the initial (".")? The alphabetic ethiopic systems use a different suffix.

The decimal number 100, in ethiopic, is ፻ U+137B

The decimal number 78010092, in ethiopic, is ፸፰፻፩፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137A U+136A.

The decimal number 780000001092, in ethiopic, is ፸፰፻፩፼፻፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137C U+137B U+137A U+136A.

8.2.2. The Chinese longhand counter styles

Chinese, Japanese, and Korean have longhand counter styles, which have a structure similar to "one hundred thirteen thousand and twenty-three" in English. Each has both formal and informal variants. The formal styles are typically used in financial and legal documents, as their characters are more difficult to alter.

The following counter styles are defined in this section:

simp-chinese-informal
The simplified Chinese informal style.
simp-chinese-formal
The simplified Chinese formal style
trad-chinese-informal
The traditional Chinese informal style
trad-chinese-formal
The traditional Chinese formal style
cjk-ideographic
For legacy reasons, this counter-style must be treated as an alias for ‘trad-chinese-informal’.

Add an example to each of the above types.

The Japanese and Korean longhand counter styles are expressed using the ‘additive’ counter algorithm, in the Additional Predefined Counter Styles section.

The Chinese longhand styles are defined over the range -9999 to 9999. For numbers outside this range, the ‘cjk-decimal’ style is used. All of the styles are defined by almost identical algorithms (specified as a single algorithm here, with the differences called out when relevant), but use different sets of characters. The list following the algorithm gives the name of each counter style using this algorithm, and the individual character sets used by each style.

  1. If the counter value is 0, the representation is the character for 0 specified for the given counter style. Skip the rest of this algorithm.
  2. If the counter value is negative, run the rest of this algorithm with the absolute value of the counter value instead.
  3. Initially represent the counter value as a decimal number. For each digit that is not 0, append the appropriate digit marker to the digit. The ones digit has no marker.
  4. For the informal styles, if the counter value is between ten and nineteen, remove the tens digit (leave the digit marker).
  5. Drop any trailing zeros and collapse any remaining zeros into a single zero digit.
  6. For the Korean styles, insert a space (" " U+0020) between each group.
  7. If the negative flag was set to true earlier in the algorithm, prepend the appropriate negative sign for the given counter style to the string.
  8. Replace the digits 0-9 with the appropriate character for the given counter style. Return the resultant string as the representation of the counter value.

For all of these counter styles, the suffix descriptor is "、" U+3001, the fallback descriptor is ‘cjk-decimal’, the lower range bound descriptor is -9999, and the upper range bound descriptor is 9999.

The following tables define the characters used in these styles:

simp-chinese-informal
Values Codepoints
Digit 0 零 U+96F6
Digit 1 一 U+4E00
Digit 2 二 U+4E8C
Digit 3 三 U+4E09
Digit 4 四 U+56DB
Digit 5 五 U+4E94
Digit 6 六 U+516D
Digit 7 七 U+4E03
Digit 8 八 U+516B
Digit 9 九 U+4E5D
Tens Digit Marker 十 U+5341
Hundreds Digit Marker 百 U+767E
Thousands Digit Marker 千 U+5343
Negative Sign 负 U+8D1F
simp-chinese-formal
Values Codepoints
Digit 0 零 U+96F6
Digit 1 壹 U+58F9
Digit 2 贰 U+8D30
Digit 3 叁 U+53C1
Digit 4 肆 U+8086
Digit 5 伍 U+4F0D
Digit 6 陆 U+9646
Digit 7 柒 U+67D2
Digit 8 捌 U+634C
Digit 9 玖 U+7396
Tens Digit Marker 拾 U+62FE
Hundreds Digit Marker 佰 U+4F70
Thousands Digit Marker 仟 U+4EDF
Negative Sign 負 U+8D1F
trad-chinese-informal
Values Codepoints
Digit 0 零 U+96F6
Digit 1 一 U+4E00
Digit 2 二 U+4E8C
Digit 3 三 U+4E09
Digit 4 四 U+56DB
Digit 5 五 U+4E94
Digit 6 六 U+516D
Digit 7 七 U+4E03
Digit 8 八 U+516B
Digit 9 九 U+4E5D
Tens Digit Marker 十 U+5341
Hundreds Digit Marker 百 U+767E
Thousands Digit Marker 千 U+5343
Negative Sign 負 U+8CA0
trad-chinese-formal
Values Codepoints
Digit 0 零 U+96F6
Digit 1 壹 U+58F9
Digit 2 貳 U+8CB3
Digit 3 參 U+53C3
Digit 4 肆 U+8086
Digit 5 伍 U+4F0D
Digit 6 陸 U+9678
Digit 7 柒 U+67D2
Digit 8 捌 U+634C
Digit 9 玖 U+7396
Tens Digit Marker 拾 U+62FE
Hundreds Digit Marker 佰 U+4F70
Thousands Digit Marker 仟 U+4EDF
Negative Sign 負 U+8CA0

Note: Chinese, Japanese, and Korean longhand numbering is actually defined up to 1072. In practice, lists are rarely, if ever, numbered above ten thousand, so these styles have been limited to their first "group".

9. Defining Custom Counter Styles: the ‘@counter-style’ rule

CSS 2.1 defined a handful of useful counter styles based on the styles that HTML traditionally allowed on ordered and unordered lists. This tiny set, though, is quite inadequate for modern web pages; displaying an ordered list with markers based on the latin alphabet while the content is Arabic seems quite incongruous!

Unfortunately, the set of potentially useful list styles is too large to specify ahead of time - the world contains thousands of languages and hundreds of scripts, not to mention the near-infinite stylistic variations found on the web that go beyond mere languaged-based variation. The ‘@counter-style’ rule allows CSS to address this in an open-ended manner, by allowing the author to define their own counter styles. These styles can then be used in the ‘list-style-type’ property or in the ‘counter()’ and ‘counters()’ functions, exactly like the predefined counter styles in CSS.

A counter style defines how to construct the representation of a counter value. Counter styles are composed of:

The algorithm is usually specified implicitly by a combination of the ‘type’, ‘glyphs’, and ‘additive-glyphs’ properties, but some counter styles instead have their algorithm explicitly defined.

The general form of an ‘@counter-style’ rule is:

@counter-style <counter-style-name> {
	[ descriptor: value; ]+
}
	

Each @counter-style rule specifies a value for every counter-style descriptor, either implicitly or explicitly. Those not given explicit value in the rule take the initial value listed with each descriptor in this specification. These descriptors apply solely within the ontext of the @counter-style rule in which they are defined, and do not apply to document language elements. There is no notion of which elements the descriptors apply to or whether the values are inherited by child elements. When a given descriptor occurs multiple times in a given @counter-style rule, only the last specified value is used; all prior values for that descriptor are ignored.

User agents which do not understand the @counter-style rule encounter the opening curly bracket and ignore forward until the closing curly bracket. This at-rule conforms with the forward-compatible parsing requirement of CSS; parsers may ignore these rules without error. Any descriptors that are not recognized or implemented by a given user agent must be ignored. @counter-style rules require a ‘type’ descriptor; if this is missing the @counter-style is invalid and must be ignored. The <counter-style-name> must be be a valid identifier and must not be "decimal", "default", "hanging", "inherit", "initial", "inline", "inside", "none", or "outside"; otherwise the @counter-style is invalid and must be ignored.

9.1. Counter algorithms: the ‘type’ descriptor

Name: type
Value: repeating | numeric | alphabetic | symbolic | additive | [non-repeating <integer?] | [ override <counter-style-name> ]
Initial: N/A

The ‘type’ descriptor specifies which algorithm will be used to construct the counter's representation based on the counter value. For example, ‘repeating’ type counter styles just cycle through their glyphs repeatedly, while ‘numeric’ type counter styles interpret their glyphs as digits and build their representation accordingly. The types are defined as follows:

9.1.1. repeating

If the type is ‘repeating’, the ‘glyphs’ descriptor must contain at least one counter glyph. This type is defined over all counter values.

The ‘repeating’ counter type cycles repeatedly through its provided glyphs, looping back to the beginning when it reaches the end of the list, similar to the default ‘disc’ counter style. It can be used for simple bullets (just provide a single counter glyph), or for cycling through multiple bullets. The first counter glyph is used as the representation of the value 1, the second counter glyph (if it exists) is used as the representation of the value 2, etc.

In general, if there are N counter glyphs and a representation is being constructed for the value I, the representation is the counter glyph at index (I mod N) of the list of counter glyphs (0-indexed).

A "triangle bullet" counter style can be defined as:

@counter-style triangle {
	type: repeating;
	glyphs: '▶';
	suffix: '';
}
		

It will then produce lists that look like:

▶  One
▶  Two
▶  Three
		

9.1.2. numeric

If the type is ‘numeric’, the ‘glyphs’ descriptor must contain at least two counter glyphs. This type is defined over all counter values.

The ‘numeric’ counter type cycles interprets the list of counter glyphs as digits to a number system, similar to the default ‘decimal’ counter style. The first counter glyph in the list is interpreted as the digit 0, the second as the digit 1, and so on. If there are N counter glyphs, the representation is a base N number using the counter glyphs as digits.

To construct the representation, run the following algorithm. Let N be the length of the list of counter glyphs, I initially be the counter value, S initially be the empty string, negative be a boolean flag that is initially false, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed).

  1. If I is 0, append glyph(0) to S and return S.
  2. If I is negative, set negative to true and I to its absolute value.
  3. While I is not equal to 0:
    1. Prepend glyph( I mod N ) to S.
    2. Set I to floor( I / N ).
  4. If negative is true, alter S according to the counter style's defined negative sign.
  5. Return S.

A "trinary" counter style can be defined as:

@counter-style trinary {
	type: numeric;
	glyphs: '0' '1' '2';
}
		

It will then produce lists that look like:

1.   One
2.   Two
10.  Three
11.  Four
12.  Five
20.  Six
		

9.1.3. alphabetic

If the type is ‘alphabetic’, the ‘glyphs’ descriptor must contain at least two counter glyphs. This type is defined only over positive counter values.

The ‘alphabetic’ counter type interprets the list of counter glyphs as digits to an alphabetic numbering system, similar to the default ‘lower-alpha’ counter style. Alphabetic numbering systems are commonly used for lists, and also appear in many spreadsheet programs to number columns. The first counter glyph in the list is interpreted as the digit 1, the second as the digit 2, and so on. If there are N counter glyphs, the representation is a base N alphabetic number using the counter glyphs as digits. Alphabetic numbering systems do not contain a digit representing 0.

To construct the representation, run the following algorithm. Let N be the length of the list of counter glyphs, I initially be the counter value, S initially be the empty string, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed).

While I is not equal to 0:

  1. Set I to I - 1.
  2. Prepend glyph( I mod N ) to S.
  3. Set I to floor( I / N ).

Finally, return S.

A counter style using go stones can be defined as:

@counter-style go {
	type: alphabetic;
	glyphs: url(white.svg) url(black.svg);
	suffix: '';
}
		

It will then produce lists that look like:

One
Two
Three
Four
Five
Six
Seven

This example requires support for SVG images to display correctly.

Alphabetic styles may also be used to simulate a fixed-width numeric style:

@counter-style fixed-decimal {
	type: alphabetic;
	glyphs: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
}

ol { 
	list-style: fixed-decimal;
	counter-reset: list-item 1111; 
}
		

This will produce lists that look like:

0001.  One
0002.  Two
0003.  Three
0004.  Four
0005.  Five
0006.  Six
		

Two-digit numbers start at value 11, three-digit numbers start at value 111, etc..

Should I instead explicitly provide a fixed-width numeric counter type? I'd like to see if this sort of numbering is used in the wild first.

9.1.4. symbolic

If the type is ‘symbolic’, the ‘glyphs’ descriptor must contain at least one counter glyph. This type is defined only over positive counter values.

The ‘symbolic’ counter type cycles repeatedly through its provided glyphs, doubling, tripling, etc. the glyphs on each successive pass through the list. It can be used for footnote-style markers, and is also sometimes used for alphabetic-style lists for a slightly different presentation than what the ‘alphabetic’ type presents.

To construct the representation, let N be the length of the list of counter glyphs, I initially be the counter value, S initially be the empty string, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed). Append glyph( I mod N ) to S floor( (I - 1) / N ) times, then return S.

An "unary" counter style can be defined as:

@counter-style unary {
	type: symbolic;
	glyphs: '|';
}
		

It will then produce lists that look like:

|.      One
||.     Two
|||.    Three
||||.   Five
|||||.  Six
		

The ‘symbolic’ type will produce representations with sizes that are linear in the magnitude of the counter value. This can potentially be abused to generate excessively large representations and consume undue amounts of the user's memory or even hang their browser. User agents must support representations at least 20 characters long, but they may choose to instead use the fallback style for representations that would be longer than 20 characters.

9.1.5. non-repeating

If the type is ‘non-repeating’, the ‘glyphs’ descriptor must contain at least one counter glyph. This type is defined over counter values in a finite range, starting with the first glyph value and having a length equal to the length of the list of counter glyphs.

The ‘non-repeating’ counter type is for representing counter styles that only have a finite number of representations. For example, Unicode defines several limited-length runs of special characters meant for lists, such as circled digits.

When this type is specified, it may optionally have an integer provided after it, which sets the first glyph value. If it is omitted, the first glyph value is 1.

The first counter glyph is the representation for the first glyph value, and subsequent counter values are represented by subsequent counter glyphs. Once the list of counter glyphs is exhausted, further values cannot be represented by this type, and must instead be represented by the fallback counter style.

A "box-corner" counter style can be defined as:

@counter-style box-corner {
	type: non-repeating;
	glyphs: '◰' '◳' '◲' '◱';
	suffix: ':';
}
		

It will then produce lists that look like:

◰:  One
◳:  Two
◲:  Three
◱:  Four
5:  Five
6:  Six
		

9.1.6. additive

If the type is ‘additive’, the ‘additive-glyphs’ descriptor must contain at least one additive tuple. This type is nominally defined over all positive counter values (see algorithm, below, for exact details)

The ‘additive’ counter type takes as many of the largest glyphs that it can, then as many of the next largest glyph, etc. until the sum of all the glyphs equals the counter value. It can be used to implement roman numerals, and additionally is used to represent the numbering system of several languages which use different characters for the digits in differnt positions.

To construct the representation, run this algorithm. let I initially be the counter value, S initially be the empty string, and glyph list initially be the list of additive tuples.

If I is initially 0, and there is an additive tuple with a weight of 0, append that tuple's counter glyph to S and return S.

Otherwise, while I is greater than 0 and there are elements left in the glyph list:

  1. Pop the first additive tuple from the glyph list. This is the current tuple.
  2. Append the current tuples counter glyph to S floor( I / current tuple’s weight ) times (this may be 0).

If the loop ended because I is 0, return S. Otherwise, the given counter value cannot be represented by this counter style, and must instead be represented by the fallback counter style.

A "dice" counter style can be defined as:

@counter-style dice {
	type: additive;
	additive-glyphs: 6 '⚅', 5 '⚄', 4 '⚃', 3 '⚂', 2 '⚁', 1 '⚀';
	suffix: '';
}
		

It will then produce lists that look like:

⚀    One
⚁    Two
⚂    Three
...
⚅⚄   Eleven
⚅⚅   Twelve
⚅⚅⚀  Thirteen
		

The ‘additive’ type will produce representations with sizes that are linear in the magnitude of the counter value. This can potentially be abused to generate excessively large representations and consume undue amounts of the user's memory or even hang their browser. User agents must support representations at least 20 characters long, but they may choose to instead use the fallback style for representations that would be longer than 20 characters.

9.1.7. override

The ‘override’ type allows an author to use the representation-construction algorithm of another counter style, but alter other aspects, such as the negative sign or the suffix. If a counter style uses the ‘override’ type, any unspecified descriptors are taken from the specified counter style, rather than taking their initial values.

If a @counter-style uses the ‘override’ type, it must not contain a ‘glyphs’ or ‘additive-glyphs’ descriptor; otherwise it is invalid and must be ignored. If the specified counter style name isn't the name of any currently-defined counter style, it must be treated as if it was overriding the ‘decimal’ counter style.

9.2. Formatting negative values: the ‘negative’ descriptor

Name: negative
Value: <string> <string>?
Initial: "\2D" ("-" hyphen-minus)

The ‘negative’ descriptor defines how to alter the representation when the counter value is negative. Not all counter types can render negative numbers.

The first string in the value is prepended to the representation when the counter value is negative. The second string, if specified, is appended to the representation when the counter value is negative.

For example, specifying ‘negative: "(" ")";’ will make negative values be wrapped in parentheses, which is sometimes used in financial contexts, like "(2) (1) 0 1 2 3...".

9.3. Symbols before the marker: the ‘prefix’ descriptor

Name: prefix
Value: <string>
Initial: "" (the empty string)

The ‘prefix’ descripter specifies a string that is prepended to the marker representation. Prefixes are only added by the algorithm for constructing the default contents of the ::marker pseudo-element; the prefix is not added automatically when the counter() or counters() functions are used. Prefixes are added to the representation after negative signs.

9.4. Symbols after the marker: the ‘suffix’ descriptor

Name: suffix
Value: <string>
Initial: "\2E" ("." full stop)

The ‘suffix’ descripter specifies a string that is appended to the marker representation. Suffixes are only added by the algorithm for constructing the default contents of the ::marker pseudo-element; the suffix is not added automatically when the counter() or counters() functions are used. Suffixes are added to the representation after negative signs.

9.5. Limiting the counter scope: the ‘range’ descriptor

Name: range
Value: [ <integer> | infinite ]{2}
Initial: infinite infinite

The ‘range’ descriptor defines the range over which the counter style is defined. If a counter style is used to represent a counter value outside of its range, the counter style instead drops down to its fallback counter style.

The first value represents the lower bound of the range (with ‘infinite’ representing negative infinity), and the second value represents the upper bound of the range (with ‘infinite’ representing positive infinity). This is an inclusive range - it includes both the lower and upper bound numbers. If the lower bound is higher than the higher bound, the descriptor is invalid and must be ignored.

Some counter style types have their own implicit ranges, specified above in the individual descriptions for each type. The explicit range given by the ‘range’ descriptor applies at the same time as the implicit range given by the ‘type’ descriptor - if the counter value is less than either lower bound, or greater than either upper bound, the fallback style must instead be used to generate the representation.

There's also an implicit range coming from implementation limits. Should we require UAs to support all values in a signed 2-byte int, or a signed 4-byte int?

9.6. Defining fallback: the ‘fallback’ descriptor

Name: fallback
Value: <counter-style-name>
Initial: decimal

The ‘fallback’ descriptor specifies a fallback counter style to be used when the current counter style can't create a representation for a given counter value. For example, if a counter style defined with a range of 1-10 is asked to represent a counter value of 11, the counter value's representation is instead constructed with the fallback counter style (or possibly the fallback style's fallback style, if the fallback style can't represent that value, etc.).

If the value of the ‘fallback’ descriptor isn't the name of any currently-defined counter style, the used value of the ‘fallback’ descriptor is ‘decimal’ instead. Similarly, while following fallbacks to find a counter style that can render the given counter value, if a loop in the specified fallbacks is detected, the ‘decimal’ style must be used instead.

Note that it is not necessarily an error to specify fallback loops. For example, if an author desires a counter style with significantly different representations for even and odd counter values, they may find it easiest to define one style that can only represent odd values and one that can only represent even values, and specify each as the fallback for the other one. Though the fallback graph is circular, at no point do you encounter a loop while following these fallbacks - every counter value is represented by one or the other counter style. Is it useful to allow this case? If it would be significantly easier for implementations to just detect and reject circular fallback graphs, that would probably be acceptable.

9.7. Marker characters: the ‘glyphs’ and ‘additive-glyphs’ descriptors

Name: glyphs
Value: [ <string> | <image> ]+
Initial: N/A
Name: additive-glyphs
Value: [ <integer> && [ <string> | <image> ] ]+
Initial: N/A

The ‘glyphs’ and ‘additive-glyphs’ descriptors specify the characters used by the marker-construction algorithm specified by the ‘type’ descriptor. The ‘glyphs’ descriptor must be specified if the counter type is ‘repeating’, ‘numeric’, ‘alphabetic’, ‘symbolic’, or ‘non-repeating’, and the ‘additive-glyphs’ descriptor must be specified if the counter type is ‘additive’; otherwise, the @counter-style is invalid and must be ignored.

Some counter styles specify that the ‘glyphs’ descriptor must have at least two entries. If the counter's style is such a type, and the ‘glyphs’ descriptor has only a single entry, the counter style is invalid and must be ignored.

Each entry in the ‘glyphs’ descriptor's value defines a counter glyph, which is interpreted differently based on the counter style's type. Each entry in the ‘additive-glyphs’ descriptor's value defines an additive tuple, which consists of a counter glyph and a non-negative integer weight. Each weight must be a non-negative integer, and the additive tuples must be specified in order of descending weight; otherwise, the @counter-style is invalid and must be ignored.

Counter glyphs may be strings or images, and the two types can be mixed in a single descriptor. Counter representations are constructed by concatenating counter glyphs together. Image counter glyphs are rendered as inline replaced elements. The default object size of an image counter glyph is a 1em by 1em square.

10. Sample style sheet for HTML

This section is informative, nor normative. HTML itself defines the actual default properties that apply to HTML lists.

/* Set up list items */
li { 
	display: list-item; 
	/* counter-increment: list-item; (implied by display: list-item) */ 
}

/* Set up ol and ul so that they reset the list-item counter */
ol, ul { 
	counter-reset: list-item; 
}

/* Default list style types for ordered lists */
ol { 
	list-style-type: decimal; 
}

/* Default list style types for unordered lists up to 3 deep */
ul { list-style-type: disc; }
ul ul { list-style-type: square; }
ul ul ul { list-style-type: circle; }

/* The type attribute on ol and ul elements */
ul[type="disc"] { list-style-type: disc; }
ul[type="circle"] { list-style-type: circle; }
ul[type="square"] { list-style-type: square; }
ol[type="1"] { list-style-type: decimal; }
ol[type="a"] { list-style-type: lower-alpha; }
ol[type="A"] { list-style-type: upper-alpha; }
ol[type="i"] { list-style-type: lower-roman; }
ol[type="I"] { list-style-type: upper-roman; }

/* The start attribute on ol elements */
ol[start] { 
	counter-reset: list-item attr(start, integer, 1); 
	counter-increment: list-item -1; 
}

/* The value attribute on li elements */
li[value] { 
	counter-reset: list-item attr(value, integer, 1); 
	counter-increment: none; 
}

/* Box Model Rules */
ol, ul { 
	display: block; 
	margin: 1em 0; 
	padding-left: 40px; 
}
 
ol ol, ol ul, ul ul, ul ol { 
	margin-top: 0; 
	margin-bottom: 0; 
}

li {
	text-align: match-parent;
}
 
li::marker { 
	display: inline-block;
	margin-right: 1em;
	text-align: end;
	/* 'position' implied by list-style-position */
}
	

11. Appendix A: Additional Predefined Counter Styles

While this specification defines a mechanism to allow authors to define almost any counter style they would want, forcing authors to redefine common styles every time they are used would be unnecessarily onerous. To aid in this regard, this specification predefines a large set of counter styles. User agents must include the following stylesheet as a user-agent stylesheet, so authors can depend on these styles being present.

As with any ‘@counter-style’ rule, the counter style definitions given here can be overridden by the author if they desire to attach a different style to a counter style name defined in this stylesheet.


/* Glyph-based  */

@counter-style box {
	type: repeating;
	glyphs: '\25A0';
	/* '■' */
	suffix: '';
}

@counter-style check {
	type: repeating;
	glyphs: '\2713';
	/* '✓' */
	suffix: '';
}

@counter-style circle {
	type: repeating;
	glyphs: '\25E6';
	/* '◦' */
	suffix: '';
}

@counter-style diamond {
	type: repeating;
	glyphs: '\25C6';
	/* '◆' */
	suffix: '';
}

@counter-style disc {
	type: repeating;
	glyphs: '\2022';
	/* '•' */
	suffix: '';
}

@counter-style dash {
	type: repeating;
	glyphs: '\2014';
	/* '—' */
	suffix: '';
}

@counter-style square {
	type: repeating;
	glyphs: '\25A0';
	/* '■' */
	suffix: '';
}

/* Numeric  */

@counter-style arabic-indic {
	type: numeric;
	glyphs: '\660' '\661' '\662' '\663' '\664' '\665' '\666' '\667' '\668' '\669';
	/* '٠' '١' '٢' '٣' '٤' '٥' '٦' '٧' '٨' '٩' */
}

@counter-style bengali {
	type: numeric;
	glyphs: '\9E6' '\9E7' '\9E8' '\9E9' '\9EA' '\9EB' '\9EC' '\9ED' '\9EE' '\9EF';
	/* '০' '১' '২' '৩' '৪' '৫' '৬' '৭' '৮' '৯' */
}

@counter-style binary {
	type: numeric;
	glyphs: '\30' '\31';
	/* '0' '1' */
}

@counter-style burmese {
	type: numeric;
	glyphs: '\1040' '\1041' '\1042' '\1043' '\1044' '\1045' '\1046' '\1047' '\1048' '\1049';
	/* '၀' '၁' '၂' '၃' '၄' '၅' '၆' '၇' '၈' '၉' */
}

@counter-style cambodian {
	type: numeric;
	glyphs: '\17E0' '\17E1' '\17E2' '\17E3' '\17E4' '\17E5' '\17E6' '\17E7' '\17E8' '\17E9';
	/* '០' '១' '២' '៣' '៤' '៥' '៦' '៧' '៨' '៩' */
}

@counter-style cjk-decimal {
	type: numeric;
	glyphs: '\3007' '\4E00' '\4E8C' '\4E09' '\56DB' '\4E94' '\516D' '\4E03' '\516B' '\4E5D';
	/* '〇' '一' '二' '三' '四' '五' '六' '七' '八' '九' */
}

@counter-style decimal {
	type: numeric;
	glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39';
	/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' */
}

@counter-style devanagari {
	type: numeric;
	glyphs: '\966' '\967' '\968' '\969' '\96A' '\96B' '\96C' '\96D' '\96E' '\96F';
	/* '०' '१' '२' '३' '४' '५' '६' '७' '८' '९' */
}

@counter-style eastern-nagari {
	type: numeric;
	glyphs: '\9E6' '\9E7' '\9E8' '\9E9' '\9EA' '\9EB' '\9EC' '\9ED' '\9EE' '\9EF';
	/* '০' '১' '২' '৩' '৪' '৫' '৬' '৭' '৮' '৯' */
}

@counter-style fullwidth-decimal {
	type: numeric;
	glyphs: '\FF10' '\FF11' '\FF12' '\FF13' '\FF14' '\FF15' '\FF16' '\FF17' '\FF18' '\FF19';
	/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' */
}

@counter-style gujarati {
	type: numeric;
	glyphs: '\AE6' '\AE7' '\AE8' '\AE9' '\AEA' '\AEB' '\AEC' '\AED' '\AEE' '\AEF';
	/* '૦' '૧' '૨' '૩' '૪' '૫' '૬' '૭' '૮' '૯' */
}

@counter-style gurmukhi {
	type: numeric;
	glyphs: '\A66' '\A67' '\A68' '\A69' '\A6A' '\A6B' '\A6C' '\A6D' '\A6E' '\A6F';
	/* '੦' '੧' '੨' '੩' '੪' '੫' '੬' '੭' '੮' '੯' */
}

@counter-style kannada {
	type: numeric;
	glyphs: '\CE6' '\CE7' '\CE8' '\CE9' '\CEA' '\CEB' '\CEC' '\CED' '\CEE' '\CEF';
	/* '೦' '೧' '೨' '೩' '೪' '೫' '೬' '೭' '೮' '೯' */
}

@counter-style khmer {
	type: numeric;
	glyphs: '\17E0' '\17E1' '\17E2' '\17E3' '\17E4' '\17E5' '\17E6' '\17E7' '\17E8' '\17E9';
	/* '០' '១' '២' '៣' '៤' '៥' '៦' '៧' '៨' '៩' */
}

@counter-style lower-hexadecimal {
	type: numeric;
	glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\61' '\62' '\63' '\64' '\65' '\66';
	/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' */
}

@counter-style lao {
	type: numeric;
	glyphs: '\ED0' '\ED1' '\ED2' '\ED3' '\ED4' '\ED5' '\ED6' '\ED7' '\ED8' '\ED9';
	/* '໐' '໑' '໒' '໓' '໔' '໕' '໖' '໗' '໘' '໙' */
}

@counter-style lepcha {
	type: numeric;
	glyphs: '\1C40' '\1C41' '\1C42' '\1C43' '\1C44' '\1C45' '\1C46' '\1C47' '\1C48' '\1C49';
	/* '᱀' '᱁' '᱂' '᱃' '᱄' '᱅' '᱆' '᱇' '᱈' '᱉' */
}

@counter-style malayalam {
	type: numeric;
	glyphs: '\D66' '\D67' '\D68' '\D69' '\D6A' '\D6B' '\D6C' '\D6D' '\D6E' '\D6F';
	/* '൦' '൧' '൨' '൩' '൪' '൫' '൬' '൭' '൮' '൯' */
}

@counter-style marathi {
	type: numeric;
	glyphs: '\966' '\967' '\968' '\969' '\96A' '\96B' '\96C' '\96D' '\96E' '\96F';
	/* '०' '१' '२' '३' '४' '५' '६' '७' '८' '९' */
}

@counter-style mongolian {
	type: numeric;
	glyphs: '\1810' '\1811' '\1812' '\1813' '\1814' '\1815' '\1816' '\1817' '\1818' '\1819';
	/* '᠐' '᠑' '᠒' '᠓' '᠔' '᠕' '᠖' '᠗' '᠘' '᠙' */
}

@counter-style myanmar {
	type: numeric;
	glyphs: '\1040' '\1041' '\1042' '\1043' '\1044' '\1045' '\1046' '\1047' '\1048' '\1049';
	/* '၀' '၁' '၂' '၃' '၄' '၅' '၆' '၇' '၈' '၉' */
}

@counter-style new-base-60 {
	type: numeric;
	glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\4A' '\4B' '\4C' '\4D' '\4E' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A' '\5F' '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
	/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'J' 'K' 'L' 'M' 'N' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '_' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}

@counter-style octal {
	type: numeric;
	glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37';
	/* '0' '1' '2' '3' '4' '5' '6' '7' */
}

@counter-style oriya {
	type: numeric;
	glyphs: '\B66' '\B67' '\B68' '\B69' '\B6A' '\B6B' '\B6C' '\B6D' '\B6E' '\B6F';
	/* '୦' '୧' '୨' '୩' '୪' '୫' '୬' '୭' '୮' '୯' */
}

@counter-style persian {
	type: numeric;
	glyphs: '\6F0' '\6F1' '\6F2' '\6F3' '\6F4' '\6F5' '\6F6' '\6F7' '\6F8' '\6F9';
	/* '۰' '۱' '۲' '۳' '۴' '۵' '۶' '۷' '۸' '۹' */
}

@counter-style super-decimal {
	type: numeric;
	glyphs: '\2070' '\B9' '\B2' '\B3' '\2074' '\2075' '\2076' '\2077' '\2078' '\2079';
	/* '⁰' '¹' '²' '³' '⁴' '⁵' '⁶' '⁷' '⁸' '⁹' */
}

@counter-style tamil {
	type: numeric;
	glyphs: '\BE6' '\BE7' '\BE8' '\BE9' '\BEA' '\BEB' '\BEC' '\BED' '\BEE' '\BEF';
	/* '௦' '௧' '௨' '௩' '௪' '௫' '௬' '௭' '௮' '௯' */
}

@counter-style telugu {
	type: numeric;
	glyphs: '\C66' '\C67' '\C68' '\C69' '\C6A' '\C6B' '\C6C' '\C6D' '\C6E' '\C6F';
	/* '౦' '౧' '౨' '౩' '౪' '౫' '౬' '౭' '౮' '౯' */
}

@counter-style tibetan {
	type: numeric;
	glyphs: '\F20' '\F21' '\F22' '\F23' '\F24' '\F25' '\F26' '\F27' '\F28' '\F29';
	/* '༠' '༡' '༢' '༣' '༤' '༥' '༦' '༧' '༨' '༩' */
}

@counter-style thai {
	type: numeric;
	glyphs: '\E50' '\E51' '\E52' '\E53' '\E54' '\E55' '\E56' '\E57' '\E58' '\E59';
	/* '๐' '๑' '๒' '๓' '๔' '๕' '๖' '๗' '๘' '๙' */
}

@counter-style upper-hexadecimal {
	type: numeric;
	glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\41' '\42' '\43' '\44' '\45' '\46';
	/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' */
}

/* Alphabetic  */

@counter-style afar {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1260' '\1270' '\1290' '\12A0' '\12A8' '\12C8' '\12D0' '\12E8' '\12F0' '\12F8' '\1308' '\1338' '\1348';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'በ' 'ተ' 'ነ' 'አ' 'ከ' 'ወ' 'ዐ' 'የ' 'ደ' 'ዸ' 'ገ' 'ጸ' 'ፈ' */
	suffix: '/';
}

@counter-style agaw {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1250' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1318' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'ቐ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style ari {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1260' '\1268' '\1270' '\1278' '\1290' '\1300' '\1308' '\1328' '\1340' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጨ' 'ፀ' 'ፐ' */
	suffix: '/';
}

@counter-style blin {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1230' '\1238' '\1228' '\1240' '\1250' '\1260' '\1270' '\1290' '\1300' '\1308' '\1318' '\1320' '\1328' '\1348' '\1278' '\1298' '\1338' '\1330' '\1350';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ሰ' 'ሸ' 'ረ' 'ቀ' 'ቐ' 'በ' 'ተ' 'ነ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ፈ' 'ቸ' 'ኘ' 'ጸ' 'ጰ' 'ፐ' */
	suffix: '/';
}

@counter-style cjk-earthly-branch {
	type: alphabetic;
	glyphs: '\5B50' '\4E11' '\5BC5' '\536F' '\8FB0' '\5DF3' '\5348' '\672A' '\7533' '\9149' '\620C' '\4EA5';
	/* '子' '丑' '寅' '卯' '辰' '巳' '午' '未' '申' '酉' '戌' '亥' */
	suffix: '、';
}

@counter-style cjk-heavenly-stem {
	type: alphabetic;
	glyphs: '\7532' '\4E59' '\4E19' '\4E01' '\620A' '\5DF1' '\5E9A' '\8F9B' '\58EC' '\7678';
	/* '甲' '乙' '丙' '丁' '戊' '己' '庚' '辛' '壬' '癸' */
	suffix: '、';
}

@counter-style dizi {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1338' '\1340' '\1348';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጸ' 'ፀ' 'ፈ' */
	suffix: '/';
}

@counter-style fullwidth-lower-alpha {
	type: alphabetic;
	glyphs: '\FF41' '\FF42' '\FF43' '\FF44' '\FF45' '\FF46' '\FF47' '\FF48' '\FF49' '\FF4A' '\FF4B' '\FF4C' '\FF4D' '\FF4E' '\FF4F' '\FF50' '\FF51' '\FF52' '\FF53' '\FF54' '\FF55' '\FF56' '\FF57' '\FF58' '\FF59' '\FF5A';
	/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
	suffix: '.';
}

@counter-style fullwidth-upper-alpha {
	type: alphabetic;
	glyphs: '\FF21' '\FF22' '\FF23' '\FF24' '\FF25' '\FF26' '\FF27' '\FF28' '\FF29' '\FF2A' '\FF2B' '\FF2C' '\FF2D' '\FF2E' '\FF2F' '\FF30' '\FF31' '\FF32' '\FF33' '\FF34' '\FF35' '\FF36' '\FF37' '\FF38' '\FF39' '\FF3A';
	/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
	suffix: '.';
}

@counter-style gedeo {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style gumuz {
	type: alphabetic;
	glyphs: '\1200' '\1210' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1308' '\1328' '\1330' '\1340' '\1350';
	/* 'ሀ' 'ሐ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ገ' 'ጨ' 'ጰ' 'ፀ' 'ፐ' */
	suffix: '/';
}

@counter-style hadiyya {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style harari {
	type: alphabetic;
	glyphs: '\1210' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1348';
	/* 'ሐ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ፈ' */
	suffix: '/';
}

@counter-style hindi {
	type: alphabetic;
	glyphs: '\915' '\916' '\917' '\918' '\919' '\91A' '\91B' '\91C' '\91D' '\91E' '\91F' '\920' '\921' '\922' '\923' '\924' '\925' '\926' '\927' '\928' '\92A' '\92B' '\92C' '\92D' '\92E' '\92F' '\930' '\932' '\935' '\936' '\937' '\938' '\939';
	/* 'क' 'ख' 'ग' 'घ' 'ङ' 'च' 'छ' 'ज' 'झ' 'ञ' 'ट' 'ठ' 'ड' 'ढ' 'ण' 'त' 'थ' 'द' 'ध' 'न' 'प' 'फ' 'ब' 'भ' 'म' 'य' 'र' 'ल' 'व' 'श' 'ष' 'स' 'ह' */
}

@counter-style hiragana-iroha {
	type: alphabetic;
	glyphs: '\3044' '\308D' '\306F' '\306B' '\307B' '\3078' '\3068' '\3061' '\308A' '\306C' '\308B' '\3092' '\308F' '\304B' '\3088' '\305F' '\308C' '\305D' '\3064' '\306D' '\306A' '\3089' '\3080' '\3046' '\3090' '\306E' '\304A' '\304F' '\3084' '\307E' '\3051' '\3075' '\3053' '\3048' '\3066' '\3042' '\3055' '\304D' '\3086' '\3081' '\307F' '\3057' '\3091' '\3072' '\3082' '\305B' '\3059' '\3093';
	/* 'い' 'ろ' 'は' 'に' 'ほ' 'へ' 'と' 'ち' 'り' 'ぬ' 'る' 'を' 'わ' 'か' 'よ' 'た' 'れ' 'そ' 'つ' 'ね' 'な' 'ら' 'む' 'う' 'ゐ' 'の' 'お' 'く' 'や' 'ま' 'け' 'ふ' 'こ' 'え' 'て' 'あ' 'さ' 'き' 'ゆ' 'め' 'み' 'し' 'ゑ' 'ひ' 'も' 'せ' 'す' 'ん' */
	suffix: '、';
}

@counter-style hiragana {
	type: alphabetic;
	glyphs: '\3042' '\3044' '\3046' '\3048' '\304A' '\304B' '\304D' '\304F' '\3051' '\3053' '\3055' '\3057' '\3059' '\305B' '\305D' '\305F' '\3061' '\3064' '\3066' '\3068' '\306A' '\306B' '\306C' '\306D' '\306E' '\306F' '\3072' '\3075' '\3078' '\307B' '\307E' '\307F' '\3080' '\3081' '\3082' '\3084' '\3086' '\3088' '\3089' '\308A' '\308B' '\308C' '\308D' '\308F' '\3092' '\3093';
	/* 'あ' 'い' 'う' 'え' 'お' 'か' 'き' 'く' 'け' 'こ' 'さ' 'し' 'す' 'せ' 'そ' 'た' 'ち' 'つ' 'て' 'と' 'な' 'に' 'ぬ' 'ね' 'の' 'は' 'ひ' 'ふ' 'へ' 'ほ' 'ま' 'み' 'む' 'め' 'も' 'や' 'ゆ' 'よ' 'ら' 'り' 'る' 'れ' 'ろ' 'わ' 'を' 'ん' */
	suffix: '、';
}

@counter-style kaffa {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1220' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1280' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ሠ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ኀ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style katakana-iroha {
	type: alphabetic;
	glyphs: '\30A4' '\30ED' '\30CF' '\30CB' '\30DB' '\30D8' '\30C8' '\30C1' '\30EA' '\30CC' '\30EB' '\30F2' '\30EF' '\30AB' '\30E8' '\30BF' '\30EC' '\30BD' '\30C4' '\30CD' '\30CA' '\30E9' '\30E0' '\30A6' '\30F0' '\30CE' '\30AA' '\30AF' '\30E4' '\30DE' '\30B1' '\30D5' '\30B3' '\30A8' '\30C6' '\30A2' '\30B5' '\30AD' '\30E6' '\30E1' '\30DF' '\30B7' '\30F1' '\30D2' '\30E2' '\30BB' '\30B9' '\30F3';
	/* 'イ' 'ロ' 'ハ' 'ニ' 'ホ' 'ヘ' 'ト' 'チ' 'リ' 'ヌ' 'ル' 'ヲ' 'ワ' 'カ' 'ヨ' 'タ' 'レ' 'ソ' 'ツ' 'ネ' 'ナ' 'ラ' 'ム' 'ウ' 'ヰ' 'ノ' 'オ' 'ク' 'ヤ' 'マ' 'ケ' 'フ' 'コ' 'エ' 'テ' 'ア' 'サ' 'キ' 'ユ' 'メ' 'ミ' 'シ' 'ヱ' 'ヒ' 'モ' 'セ' 'ス' 'ン' */
	suffix: '、';
}

@counter-style katakana {
	type: alphabetic;
	glyphs: '\30A2' '\30A4' '\30A6' '\30A8' '\30AA' '\30AB' '\30AD' '\30AF' '\30B1' '\30B3' '\30B5' '\30B7' '\30B9' '\30BB' '\30BD' '\30BF' '\30C1' '\30C4' '\30C6' '\30C8' '\30CA' '\30CB' '\30CC' '\30CD' '\30CE' '\30CF' '\30D2' '\30D5' '\30D8' '\30DB' '\30DE' '\30DF' '\30E0' '\30E1' '\30E2' '\30E4' '\30E6' '\30E8' '\30E9' '\30EA' '\30EB' '\30EC' '\30ED' '\30EF' '\30F2' '\30F3';
	/* 'ア' 'イ' 'ウ' 'エ' 'オ' 'カ' 'キ' 'ク' 'ケ' 'コ' 'サ' 'シ' 'ス' 'セ' 'ソ' 'タ' 'チ' 'ツ' 'テ' 'ト' 'ナ' 'ニ' 'ヌ' 'ネ' 'ノ' 'ハ' 'ヒ' 'フ' 'ヘ' 'ホ' 'マ' 'ミ' 'ム' 'メ' 'モ' 'ヤ' 'ユ' 'ヨ' 'ラ' 'リ' 'ル' 'レ' 'ロ' 'ワ' 'ヲ' 'ン' */
	suffix: '、';
}

@counter-style kebena {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style kembata {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' */
	suffix: '/';
}

@counter-style konso {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style korean-consonant {
	type: alphabetic;
	glyphs: '\3131' '\3134' '\3137' '\3139' '\3141' '\3142' '\3145' '\3147' '\3148' '\314A' '\314B' '\314C' '\314D' '\314E';
	/* 'ㄱ' 'ㄴ' 'ㄷ' 'ㄹ' 'ㅁ' 'ㅂ' 'ㅅ' 'ㅇ' 'ㅈ' 'ㅊ' 'ㅋ' 'ㅌ' 'ㅍ' 'ㅎ' */
}

@counter-style korean-syllable {
	type: alphabetic;
	glyphs: '\AC00' '\B098' '\B2E4' '\B77C' '\B9C8' '\BC14' '\C0AC' '\C544' '\C790' '\CC28' '\CE74' '\D0C0' '\D30C' '\D558';
	/* '가' '나' '다' '라' '마' '바' '사' '아' '자' '차' '카' '타' '파' '하' */
}

@counter-style kunama {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' */
	suffix: '/';
}

@counter-style lower-alpha {
	type: alphabetic;
	glyphs: '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
	/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}

@counter-style lower-belorussian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\451' '\436' '\437' '\456' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\45E' '\444' '\445' '\446' '\447' '\448' '\44B' '\44C' '\44D' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'д' 'е' 'ё' 'ж' 'з' 'і' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ў' 'ф' 'х' 'ц' 'ч' 'ш' 'ы' 'ь' 'э' 'ю' 'я' */
	suffix: ')';
}

@counter-style lower-bulgarian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\436' '\437' '\438' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44A' '\44C' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'д' 'е' 'ж' 'з' 'и' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ъ' 'ь' 'ю' 'я' */
	suffix: ')';
}

@counter-style lower-greek {
	type: alphabetic;
	glyphs: '\3B1' '\3B2' '\3B3' '\3B4' '\3B5' '\3B6' '\3B7' '\3B8' '\3B9' '\3BA' '\3BB' '\3BC' '\3BD' '\3BE' '\3BF' '\3C0' '\3C1' '\3C3' '\3C4' '\3C5' '\3C6' '\3C7' '\3C8' '\3C9';
	/* 'α' 'β' 'γ' 'δ' 'ε' 'ζ' 'η' 'θ' 'ι' 'κ' 'λ' 'μ' 'ν' 'ξ' 'ο' 'π' 'ρ' 'σ' 'τ' 'υ' 'φ' 'χ' 'ψ' 'ω' */
}

@counter-style lower-macedonian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\453' '\435' '\436' '\437' '\455' '\438' '\458' '\43A' '\43B' '\459' '\43C' '\43D' '\45A' '\43E' '\43F' '\440' '\441' '\442' '\45C' '\443' '\444' '\445' '\446' '\447' '\45F' '\448';
	/* 'а' 'б' 'в' 'г' 'д' 'ѓ' 'е' 'ж' 'з' 'ѕ' 'и' 'ј' 'к' 'л' 'љ' 'м' 'н' 'њ' 'о' 'п' 'р' 'с' 'т' 'ќ' 'у' 'ф' 'х' 'ц' 'ч' 'џ' 'ш' */
	suffix: ')';
}

@counter-style lower-oromo-qubee {
	type: alphabetic;
	glyphs: '\61' '\61\61' '\62' '\63' '\64' '\65' '\65\65' '\66' '\67' '\68' '\69' '\69\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\6F\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\75\75' '\76' '\77' '\78' '\79' '\7A' '\63\68' '\64\68' '\6B\68' '\6E\79' '\70\68' '\73\68';
	/* 'a' 'aa' 'b' 'c' 'd' 'e' 'ee' 'f' 'g' 'h' 'i' 'ii' 'j' 'k' 'l' 'm' 'n' 'o' 'oo' 'p' 'q' 'r' 's' 't' 'u' 'uu' 'v' 'w' 'x' 'y' 'z' 'ch' 'dh' 'kh' 'ny' 'ph' 'sh' */
}

@counter-style lower-russian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\436' '\437' '\438' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44D' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'д' 'е' 'ж' 'з' 'и' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'э' 'ю' 'я' */
	suffix: ')';
}

@counter-style lower-russian-full {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\451' '\436' '\437' '\438' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44A' '\44B' '\44C' '\44D' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'д' 'е' 'ё' 'ж' 'з' 'и' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ъ' 'ы' 'ь' 'э' 'ю' 'я' */
	suffix: ')';
}

@counter-style lower-serbo-croatian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\452' '\435' '\436' '\437' '\438' '\458' '\43A' '\43B' '\459' '\43C' '\43D' '\45A' '\43E' '\43F' '\440' '\441' '\442' '\45B' '\443' '\444' '\445' '\446' '\447' '\45F' '\448';
	/* 'а' 'б' 'в' 'г' 'д' 'ђ' 'е' 'ж' 'з' 'и' 'ј' 'к' 'л' 'љ' 'м' 'н' 'њ' 'о' 'п' 'р' 'с' 'т' 'ћ' 'у' 'ф' 'х' 'ц' 'ч' 'џ' 'ш' */
	suffix: ')';
}

@counter-style lower-ukrainian {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\454' '\436' '\437' '\438' '\456' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'д' 'е' 'є' 'ж' 'з' 'и' 'і' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'ю' 'я' */
	suffix: ')';
}

@counter-style lower-ukrainian-full {
	type: alphabetic;
	glyphs: '\430' '\431' '\432' '\433' '\491' '\434' '\435' '\454' '\436' '\437' '\438' '\456' '\457' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44C' '\44E' '\44F';
	/* 'а' 'б' 'в' 'г' 'ґ' 'д' 'е' 'є' 'ж' 'з' 'и' 'і' 'ї' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ь' 'ю' 'я' */
	suffix: ')';
}

@counter-style meen {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1280' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1330' '\1350' '\1340';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ኀ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፐ' 'ፀ' */
	suffix: '/';
}

@counter-style oromo {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\12A0' '\12A8' '\12C8' '\12E8' '\12F0' '\12F8' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'አ' 'ከ' 'ወ' 'የ' 'ደ' 'ዸ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
	suffix: '/';
}

@counter-style saho {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1240' '\1260' '\1270' '\1290' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ቀ' 'በ' 'ተ' 'ነ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
	suffix: '/';
}

@counter-style sidama {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\12A0' '\12A8' '\12C8' '\12E8' '\12F0' '\12F8' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'አ' 'ከ' 'ወ' 'የ' 'ደ' 'ዸ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
	suffix: '/';
}

@counter-style silti {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' */
	suffix: '/';
}

@counter-style thai-alphabetic {
	type: alphabetic;
	glyphs: '\E01' '\E02' '\E04' '\E07' '\E08' '\E09' '\E0A' '\E0B' '\E0C' '\E0D' '\E0E' '\E0F' '\E10' '\E11' '\E12' '\E13' '\E14' '\E15' '\E16' '\E17' '\E18' '\E19' '\E1A' '\E1B' '\E1C' '\E1D' '\E1E' '\E1F' '\E20' '\E21' '\E22' '\E23' '\E25' '\E27' '\E28' '\E29' '\E2A' '\E2B' '\E2C' '\E2D' '\E2E';
	/* 'ก' 'ข' 'ค' 'ง' 'จ' 'ฉ' 'ช' 'ซ' 'ฌ' 'ญ' 'ฎ' 'ฏ' 'ฐ' 'ฑ' 'ฒ' 'ณ' 'ด' 'ต' 'ถ' 'ท' 'ธ' 'น' 'บ' 'ป' 'ผ' 'ฝ' 'พ' 'ฟ' 'ภ' 'ม' 'ย' 'ร' 'ล' 'ว' 'ศ' 'ษ' 'ส' 'ห' 'ฬ' 'อ' 'ฮ' */
}

@counter-style tigre {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\12A0' '\12A8' '\12C8' '\12D0' '\12D8' '\12E8' '\12F0' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'አ' 'ከ' 'ወ' 'ዐ' 'ዘ' 'የ' 'ደ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style upper-alpha {
	type: alphabetic;
	glyphs: '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A';
	/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
}

@counter-style upper-belorussian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\401' '\416' '\417' '\406' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\40E' '\424' '\425' '\426' '\427' '\428' '\42B' '\42C' '\42D' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ё' 'Ж' 'З' 'І' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ў' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Ы' 'Ь' 'Э' 'Ю' 'Я' */
}

@counter-style upper-bulgarian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\416' '\417' '\418' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42A' '\42C' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ж' 'З' 'И' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ъ' 'Ь' 'Ю' 'Я' */
}

@counter-style upper-greek {
	type: alphabetic;
	glyphs: '\391' '\392' '\393' '\394' '\395' '\396' '\397' '\398' '\399' '\39A' '\39B' '\39C' '\39D' '\39E' '\39F' '\3A0' '\3A1' '\3A3' '\3A4' '\3A5' '\3A6' '\3A7' '\3A8' '\3A9';
	/* 'Α' 'Β' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Μ' 'Ν' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Υ' 'Φ' 'Χ' 'Ψ' 'Ω' */
}

@counter-style upper-macedonian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\403' '\415' '\416' '\417' '\405' '\418' '\408' '\41A' '\41B' '\409' '\41C' '\41D' '\40A' '\41E' '\41F' '\420' '\421' '\422' '\40C' '\423' '\424' '\425' '\426' '\427' '\40F' '\428';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Ѓ' 'Е' 'Ж' 'З' 'Ѕ' 'И' 'Ј' 'К' 'Л' 'Љ' 'М' 'Н' 'Њ' 'О' 'П' 'Р' 'С' 'Т' 'Ќ' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Џ' 'Ш' */
}

@counter-style upper-oromo-qubee {
	type: alphabetic;
	glyphs: '\41' '\41\41' '\42' '\43' '\44' '\45' '\45\45' '\46' '\47' '\48' '\49' '\49\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\4F\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\55\55' '\56' '\57' '\58' '\59' '\5A' '\43\48' '\44\48' '\4B\48' '\4E\59' '\50\48' '\53\48';
	/* 'A' 'AA' 'B' 'C' 'D' 'E' 'EE' 'F' 'G' 'H' 'I' 'II' 'J' 'K' 'L' 'M' 'N' 'O' 'OO' 'P' 'Q' 'R' 'S' 'T' 'U' 'UU' 'V' 'W' 'X' 'Y' 'Z' 'CH' 'DH' 'KH' 'NY' 'PH' 'SH' */
}

@counter-style upper-russian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\416' '\417' '\418' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42D' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ж' 'З' 'И' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Э' 'Ю' 'Я' */
}

@counter-style upper-russian-full {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\401' '\416' '\417' '\418' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42A' '\42B' '\42C' '\42D' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ё' 'Ж' 'З' 'И' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ъ' 'Ы' 'Ь' 'Э' 'Ю' 'Я' */
}

@counter-style upper-serbo-croatian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\402' '\415' '\416' '\417' '\418' '\408' '\41A' '\41B' '\409' '\41C' '\41D' '\40A' '\41E' '\41F' '\420' '\421' '\422' '\40B' '\423' '\424' '\425' '\426' '\427' '\40F' '\428';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Ђ' 'Е' 'Ж' 'З' 'И' 'Ј' 'К' 'Л' 'Љ' 'М' 'Н' 'Њ' 'О' 'П' 'Р' 'С' 'Т' 'Ћ' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Џ' 'Ш' */
}

@counter-style upper-ukrainian {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\404' '\416' '\417' '\418' '\406' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Є' 'Ж' 'З' 'И' 'І' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Ю' 'Я' */
}

@counter-style upper-ukrainian-full {
	type: alphabetic;
	glyphs: '\410' '\411' '\412' '\413' '\490' '\414' '\415' '\404' '\416' '\417' '\418' '\406' '\407' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42C' '\42E' '\42F';
	/* 'А' 'Б' 'В' 'Г' 'Ґ' 'Д' 'Е' 'Є' 'Ж' 'З' 'И' 'І' 'Ї' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ь' 'Ю' 'Я' */
}

@counter-style wolaita {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1230' '\1308' '\1320' '\1328' '\1330' '\1338' '\1340' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ሰ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፀ' 'ፈ' 'ፐ' */
	suffix: '/';
}

@counter-style yemsa {
	type: alphabetic;
	glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1318' '\1320' '\1328' '\1330' '\1348' '\1350';
	/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
	suffix: '/';
}

/* Symbolic  */

@counter-style asterisks {
	type: symbolic;
	glyphs: '\2A';
	/* '*' */
	suffix: '';
}

@counter-style footnotes {
	type: symbolic;
	glyphs: '\2A' '\2051' '\2020' '\2021';
	/* '*' '⁑' '†' '‡' */
	suffix: '';
}

@counter-style lower-alpha-symbolic {
	type: symbolic;
	glyphs: '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
	/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}

@counter-style upper-alpha-symbolic {
	type: symbolic;
	glyphs: '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A';
	/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
}

/* Non-repeating  */

@counter-style circled-decimal {
	type: non-repeating 0;
	glyphs: '\24EA' '\2460' '\2461' '\2462' '\2463' '\2464' '\2465' '\2466' '\2467' '\2468' '\2469' '\246A' '\246B' '\246C' '\246D' '\246E' '\246F' '\2470' '\2471' '\2472' '\2473' '\3251' '\3252' '\3253' '\3254' '\3255' '\3256' '\3257' '\3258' '\3259' '\325a' '\325b' '\325c' '\325d' '\325e' '\325f' '\32b1' '\32b2' '\32b3' '\32b4' '\32b5' '\32b6' '\32b7' '\32b8' '\32b9' '\32ba' '\32bb' '\32bc' '\32bd' '\32be' '\32bf';
	/* '⓪' '①' '②' '③' '④' '⑤' '⑥' '⑦' '⑧' '⑨' '⑩' '⑪' '⑫' '⑬' '⑭' '⑮' '⑯' '⑰' '⑱' '⑲' '⑳' '㉑' '㉒' '㉓' '㉔' '㉕' '㉖' '㉗' '㉘' '㉙' '㉚' '㉛' '㉜' '㉝' '㉞' '㉟' '㊱' '㊲' '㊳' '㊴' '㊵' '㊶' '㊷' '㊸' '㊹' '㊺' '㊻' '㊼' '㊽' '㊾' '㊿' */
	suffix: '';
}

@counter-style circled-lower-latin {
	type: non-repeating;
	glyphs: '\24D0' '\24D1' '\24D2' '\24D3' '\24D4' '\24D5' '\24D6' '\24D7' '\24D8' '\24D9' '\24DA' '\24DB' '\24DC' '\24DD' '\24DE' '\24DF' '\24E0' '\24E1' '\24E2' '\24E3' '\24E4' '\24E5' '\24E6' '\24E7' '\24E8' '\24E9';
	/* 'ⓐ' 'ⓑ' 'ⓒ' 'ⓓ' 'ⓔ' 'ⓕ' 'ⓖ' 'ⓗ' 'ⓘ' 'ⓙ' 'ⓚ' 'ⓛ' 'ⓜ' 'ⓝ' 'ⓞ' 'ⓟ' 'ⓠ' 'ⓡ' 'ⓢ' 'ⓣ' 'ⓤ' 'ⓥ' 'ⓦ' 'ⓧ' 'ⓨ' 'ⓩ' */
	suffix: '';
}

@counter-style circled-upper-latin {
	type: non-repeating;
	glyphs: '\24B6' '\24B7' '\24B8' '\24B9' '\24BA' '\24BB' '\24BC' '\24BD' '\24BE' '\24BF' '\24C0' '\24C1' '\24C2' '\24C3' '\24C4' '\24C5' '\24C6' '\24C7' '\24C8' '\24C9' '\24CA' '\24CB' '\24CC' '\24CD' '\24CE' '\24CF';
	/* 'Ⓐ' 'Ⓑ' 'Ⓒ' 'Ⓓ' 'Ⓔ' 'Ⓕ' 'Ⓖ' 'Ⓗ' 'Ⓘ' 'Ⓙ' 'Ⓚ' 'Ⓛ' 'Ⓜ' 'Ⓝ' 'Ⓞ' 'Ⓟ' 'Ⓠ' 'Ⓡ' 'Ⓢ' 'Ⓣ' 'Ⓤ' 'Ⓥ' 'Ⓦ' 'Ⓧ' 'Ⓨ' 'Ⓩ' */
	suffix: '';
}

@counter-style circled-korean-consonants {
	type: non-repeating;
	glyphs: '\3260' '\3261' '\3262' '\3263' '\3264' '\3265' '\3266' '\3267' '\3268' '\3269' '\326A' '\326B' '\326C' '\326D';
	/* '㉠' '㉡' '㉢' '㉣' '㉤' '㉥' '㉦' '㉧' '㉨' '㉩' '㉪' '㉫' '㉬' '㉭' */
	suffix: '';
}

@counter-style circled-korean-syllables {
	type: non-repeating;
	glyphs: '\326E' '\326F' '\3270' '\3271' '\3272' '\3273' '\3274' '\3275' '\3276' '\3277' '\3278' '\3279' '\327A' '\327B';
	/* '㉮' '㉯' '㉰' '㉱' '㉲' '㉳' '㉴' '㉵' '㉶' '㉷' '㉸' '㉹' '㉺' '㉻' */
	suffix: '';
}

@counter-style decimal-leading-zero {
	type: non-repeating -9;
	glyphs: '\2D\30\39' '\2D\30\38' '\2D\30\37' '\2D\30\36' '\2D\30\35' '\2D\30\34' '\2D\30\33' '\2D\30\32' '\2D\30\31' '\30\30' '\30\31' '\30\32' '\30\33' '\30\34' '\30\35' '\30\36' '\30\37' '\30\38' '\30\39';
	/* '-09' '-08' '-07' '-06' '-05' '-04' '-03' '-02' '-01' '00' '01' '02' '03' '04' '05' '06' '07' '08' '09' */
}

@counter-style dotted-decimal {
	type: non-repeating;
	glyphs: '\2488' '\2489' '\248A' '\248B' '\248C' '\248D' '\248E' '\248F' '\2490' '\2491' '\2492' '\2493' '\2494' '\2495' '\2496' '\2497' '\2498' '\2499' '\249A' '\249B';
	/* '⒈' '⒉' '⒊' '⒋' '⒌' '⒍' '⒎' '⒏' '⒐' '⒑' '⒒' '⒓' '⒔' '⒕' '⒖' '⒗' '⒘' '⒙' '⒚' '⒛' */
	suffix: '';
}

@counter-style double-circled-decimal {
	type: non-repeating;
	glyphs: '\24F5' '\24F6' '\24F7' '\24F8' '\24F9' '\24FA' '\24FB' '\24FC' '\24FD' '\24FE';
	/* '⓵' '⓶' '⓷' '⓸' '⓹' '⓺' '⓻' '⓼' '⓽' '⓾' */
	suffix: '';
}

@counter-style filled-circled-decimal {
	type: non-repeating;
	glyphs: '\2776' '\2777' '\2778' '\2779' '\277a' '\277b' '\277c' '\277d' '\277e' '\277f' '\24EB' '\24EC' '\24ED' '\24EE' '\24EF' '\24F0' '\24F1' '\24F2' '\24F3' '\24F4';
	/* '❶' '❷' '❸' '❹' '❺' '❻' '❼' '❽' '❾' '❿' '⓫' '⓬' '⓭' '⓮' '⓯' '⓰' '⓱' '⓲' '⓳' '⓴' */
	suffix: '';
}

@counter-style fullwidth-upper-roman {
	type: non-repeating;
	glyphs: '\2160' '\2161' '\2162' '\2163' '\2164' '\2165' '\2166' '\2167' '\2168' '\2169' '\216A' '\216B';
	/* 'Ⅰ' 'Ⅱ' 'Ⅲ' 'Ⅳ' 'Ⅴ' 'Ⅵ' 'Ⅶ' 'Ⅷ' 'Ⅸ' 'Ⅹ' 'Ⅺ' 'Ⅻ' */
	suffix: '';
}

@counter-style fullwidth-lower-roman {
	type: non-repeating;
	glyphs: '\2170' '\2171' '\2172' '\2173' '\2174' '\2175' '\2176' '\2177' '\2178' '\2179' '\217A' '\217B';
	/* 'ⅰ' 'ⅱ' 'ⅲ' 'ⅳ' 'ⅴ' 'ⅵ' 'ⅶ' 'ⅷ' 'ⅸ' 'ⅹ' 'ⅺ' 'ⅻ' */
	suffix: '';
}

@counter-style parenthesized-decimal {
	type: non-repeating;
	glyphs: '\2474' '\2475' '\2476' '\2477' '\2478' '\2479' '\247A' '\247B' '\247C' '\247D' '\247E' '\247F' '\2480' '\2481' '\2482' '\2483' '\2484' '\2485' '\2486' '\2487';
	/* '⑴' '⑵' '⑶' '⑷' '⑸' '⑹' '⑺' '⑻' '⑼' '⑽' '⑾' '⑿' '⒀' '⒁' '⒂' '⒃' '⒄' '⒅' '⒆' '⒇' */
	suffix: '';
}

@counter-style parenthesized-lower-latin {
	type: non-repeating;
	glyphs: '\249C' '\249D' '\249E' '\249F' '\24A0' '\24A1' '\24A2' '\24A3' '\24A4' '\24A5' '\24A6' '\24A7' '\24A8' '\24A9' '\24AA' '\24AB' '\24AC' '\24AD' '\24AE' '\24AF' '\24B0' '\24B1' '\24B2' '\24B3' '\24B4' '\24B5';
	/* '⒜' '⒝' '⒞' '⒟' '⒠' '⒡' '⒢' '⒣' '⒤' '⒥' '⒦' '⒧' '⒨' '⒩' '⒪' '⒫' '⒬' '⒭' '⒮' '⒯' '⒰' '⒱' '⒲' '⒳' '⒴' '⒵' */
	suffix: '';
}

@counter-style parenthesized-hangul-consonants {
	type: non-repeating;
	glyphs: '\3200' '\3201' '\3202' '\3203' '\3204' '\3205' '\3206' '\3207' '\3208' '\3209' '\320A' '\320B' '\320C' '\320D';
	/* '㈀' '㈁' '㈂' '㈃' '㈄' '㈅' '㈆' '㈇' '㈈' '㈉' '㈊' '㈋' '㈌' '㈍' */
	suffix: '';
}

@counter-style parenthesized-hangul-syllable {
	type: non-repeating;
	glyphs: '\320E' '\320F' '\3210' '\3211' '\3212' '\3213' '\3214' '\3215' '\3216' '\3217' '\3218' '\3219' '\321A';
	/* '㈎' '㈏' '㈐' '㈑' '㈒' '㈓' '㈔' '㈕' '㈖' '㈗' '㈘' '㈙' '㈚' */
	suffix: '';
}

@counter-style persian-abjad {
	type: non-repeating;
	glyphs: '\627' '\628' '\62C' '\62F' '\647\200D' '\648' '\632' '\62D' '\637' '\6CC' '\6A9' '\644' '\645' '\646' '\633' '\639' '\641' '\635' '\642' '\631' '\634' '\62A' '\62B' '\62E' '\630' '\636' '\638' '\63A';
	/* 'ا' 'ب' 'ج' 'د' 'ه‍' 'و' 'ز' 'ح' 'ط' 'ی' 'ک' 'ل' 'م' 'ن' 'س' 'ع' 'ف' 'ص' 'ق' 'ر' 'ش' 'ت' 'ث' 'خ' 'ذ' 'ض' 'ظ' 'غ' */
}

@counter-style persian-alphabetic {
	type: non-repeating;
	glyphs: '\627' '\628' '\67E' '\62A' '\62B' '\62C' '\686' '\62D' '\62E' '\62F' '\630' '\631' '\632' '\698' '\633' '\634' '\635' '\636' '\637' '\638' '\639' '\63A' '\641' '\642' '\6A9' '\6AF' '\644' '\645' '\646' '\648' '\647\200D' '\6CC';
	/* 'ا' 'ب' 'پ' 'ت' 'ث' 'ج' 'چ' 'ح' 'خ' 'د' 'ذ' 'ر' 'ز' 'ژ' 'س' 'ش' 'ص' 'ض' 'ط' 'ظ' 'ع' 'غ' 'ف' 'ق' 'ک' 'گ' 'ل' 'م' 'ن' 'و' 'ه‍' 'ی' */
}

/* Additive  */

@counter-style hebrew {
	type: additive;
	range: 1 infinite;
	additive-glyphs: 400 '\5EA', 300 '\5E9', 200 '\5E8', 100 '\5E7', 90 '\5E6', 80 '\5E4', 70 '\5E2', 60 '\5E1', 50 '\5E0', 40 '\5DE', 30 '\5DC', 20 '\5DB', 19 '\5D9\5D8', 18 '\5D9\5D7', 17 '\5D9\5D6', 16 '\5D8\5D6', 15 '\5D8\5D5', 10 '\5D9', 9 '\5D8', 8 '\5D7', 7 '\5D6', 6 '\5D5', 5 '\5D4', 4 '\5D3', 3 '\5D2', 2 '\5D1', 1 '\5D0';
	/* 400 'ת', 300 'ש', 200 'ר', 100 'ק', 90 'צ', 80 'פ', 70 'ע', 60 'ס', 50 'נ', 40 'מ', 30 'ל', 20 'כ', 10 'י', 9 'ט', 8 'ח', 7 'ז', 6 'ו', 5 'ה', 4 'ד', 3 'ג', 2 'ב', 1 'א' */
	/* This system manually specifies the values for 19-15 to force the correct display of 15 and 16, which are commonly
	rewritten to avoid a close resemblance to the Tetragrammaton. */
}

@counter-style simple-upper-roman {
	type: additive;
	range: 1 4999;
	additive-glyphs: 1000 '\4D', 500 '\44', 100 '\43', 50 '\4C', 10 '\58', 5 '\56', 1 '\49';
	/* 1000 'M', 500 'D', 100 'C', 50 'L', 10 'X', 5 'V', 1 'I' */
}

@counter-style simple-lower-roman {
	type: additive;
	range: 1 4999;
	additive-glyphs: 1000 '\6D', 500 '\64', 100 '\63', 50 '\6C', 10 '\78', 5 '\76', 1 '\69';
	/* 1000 'm', 500 'd', 100 'c', 50 'l', 10 'x', 5 'v', 1 'i' */
}

@counter-style upper-roman {
	type: additive;
	range: 1 4999;
	additive-glyphs: 1000 '\4D', 900 '\43\4D', 500 '\44', 400 '\43\44', 100 '\43', 90 '\58\43', 50 '\4C', 40 '\58\4C', 10 '\58', 9 '\49\58', 5 '\56', 4 '\49\56', 1 '\49';
	/* 1000 'M', 900 'CM', 500 'D', 400 'CD', 100 'C', 90 'XC', 50 'L', 40 'XL', 10 'X', 9 'IX', 5 'V', 4 'IV', 1 'I' */
}

@counter-style lower-roman {
	type: additive;
	range: 1 4999;
	additive-glyphs: 1000 '\6D', 900 '\63\6D', 500 '\64', 400 '\63\64', 100 '\63', 90 '\78\63', 50 '\6C', 40 '\78\6C', 10 '\78', 9 '\69\78', 5 '\76', 4 '\69\76', 1 '\69';
	/* 1000 'm', 900 'cm', 500 'd', 400 'cd', 100 'c', 90 'xc', 50 'l', 40 'xl', 10 'x', 9 'ix', 5 'v', 4 'iv', 1 'i' */
}

@counter-style lower-armenian {
	type: additive;
	range: 1 9999;
	additive-glyphs: 9000 '\584', 8000 '\583', 7000 '\582', 6000 '\581', 5000 '\580', 4000 '\57F', 3000 '\57E', 2000 '\57D', 1000 '\57C', 900 '\57B', 800 '\57A', 700 '\579', 600 '\578', 500 '\577', 400 '\576', 300 '\575', 200 '\574', 100 '\573', 90 '\572', 80 '\571', 70 '\570', 60 '\56F', 50 '\56E', 40 '\56D', 30 '\56C', 20 '\56B', 10 '\56A', 9 '\569', 8 '\568', 7 '\567', 6 '\566', 5 '\565', 4 '\564', 3 '\563', 2 '\562', 1 '\561';
	/* 9000 'ք', 8000 'փ', 7000 'ւ', 6000 'ց', 5000 'ր', 4000 'տ', 3000 'վ', 2000 'ս', 1000 'ռ', 900 'ջ', 800 'պ', 700 'չ', 600 'ո', 500 'շ', 400 'ն', 300 'յ', 200 'մ', 100 'ճ', 90 'ղ', 80 'ձ', 70 'հ', 60 'կ', 50 'ծ', 40 'խ', 30 'լ', 20 'ի', 10 'ժ', 9 'թ', 8 'ը', 7 'է', 6 'զ', 5 'ե', 4 'դ', 3 'գ', 2 'բ', 1 'ա' */
}

@counter-style upper-armenian {
	type: additive;
	range: 1 9999;
	additive-glyphs: 9000 '\554', 8000 '\553', 7000 '\552', 6000 '\551', 5000 '\550', 4000 '\54F', 3000 '\54E', 2000 '\54D', 1000 '\54C', 900 '\54B', 800 '\54A', 700 '\549', 600 '\548', 500 '\547', 400 '\546', 300 '\545', 200 '\544', 100 '\543', 90 '\542', 80 '\541', 70 '\540', 60 '\53F', 50 '\53E', 40 '\53D', 30 '\53C', 20 '\53B', 10 '\53A', 9 '\539', 8 '\538', 7 '\537', 6 '\536', 5 '\535', 4 '\534', 3 '\533', 2 '\532', 1 '\531';
	/* 9000 'Ք', 8000 'Փ', 7000 'Ւ', 6000 'Ց', 5000 'Ր', 4000 'Տ', 3000 'Վ', 2000 'Ս', 1000 'Ռ', 900 'Ջ', 800 'Պ', 700 'Չ', 600 'Ո', 500 'Շ', 400 'Ն', 300 'Յ', 200 'Մ', 100 'Ճ', 90 'Ղ', 80 'Ձ', 70 'Հ', 60 'Կ', 50 'Ծ', 40 'Խ', 30 'Լ', 20 'Ի', 10 'Ժ', 9 'Թ', 8 'Ը', 7 'Է', 6 'Զ', 5 'Ե', 4 'Դ', 3 'Գ', 2 'Բ', 1 'Ա' */
}

@counter-style armenian {
	type: additive;
	range: 1 9999;
	additive-glyphs: 9000 '\554', 8000 '\553', 7000 '\552', 6000 '\551', 5000 '\550', 4000 '\54F', 3000 '\54E', 2000 '\54D', 1000 '\54C', 900 '\54B', 800 '\54A', 700 '\549', 600 '\548', 500 '\547', 400 '\546', 300 '\545', 200 '\544', 100 '\543', 90 '\542', 80 '\541', 70 '\540', 60 '\53F', 50 '\53E', 40 '\53D', 30 '\53C', 20 '\53B', 10 '\53A', 9 '\539', 8 '\538', 7 '\537', 6 '\536', 5 '\535', 4 '\534', 3 '\533', 2 '\532', 1 '\531';
	/* 9000 'Ք', 8000 'Փ', 7000 'Ւ', 6000 'Ց', 5000 'Ր', 4000 'Տ', 3000 'Վ', 2000 'Ս', 1000 'Ռ', 900 'Ջ', 800 'Պ', 700 'Չ', 600 'Ո', 500 'Շ', 400 'Ն', 300 'Յ', 200 'Մ', 100 'Ճ', 90 'Ղ', 80 'Ձ', 70 'Հ', 60 'Կ', 50 'Ծ', 40 'Խ', 30 'Լ', 20 'Ի', 10 'Ժ', 9 'Թ', 8 'Ը', 7 'Է', 6 'Զ', 5 'Ե', 4 'Դ', 3 'Գ', 2 'Բ', 1 'Ա' */
}

@counter-style georgian {
	type: additive;
	range: 1 19999;
	additive-glyphs: 10000 '\10F5', 9000 '\10F0', 8000 '\10EF', 7000 '\10F4', 6000 '\10EE', 5000 '\10ED', 4000 '\10EC', 3000 '\10EB', 2000 '\10EA', 1000 '\10E9', 900 '\10E8', 800 '\10E7', 700 '\10E6', 600 '\10E5', 500 '\10E4', 400 '\10F3', 300 '\10E2', 200 '\10E1', 100 '\10E0', 90 '\10DF', 80 '\10DE', 70 '\10DD', 60 '\10F2', 50 '\10DC', 40 '\10DB', 30 '\10DA', 20 '\10D9', 10 '\10D8', 9 '\10D7', 8 '\10F1', 7 '\10D6', 6 '\10D5', 5 '\10D4', 4 '\10D3', 3 '\10D2', 2 '\10D1', 1 '\10D0';
	/* 10000 'ჵ', 9000 'ჰ', 8000 'ჯ', 7000 'ჴ', 6000 'ხ', 5000 'ჭ', 4000 'წ', 3000 'ძ', 2000 'ც', 1000 'ჩ', 900 'შ', 800 'ყ', 700 'ღ', 600 'ქ', 500 'ფ', 400 'ჳ', 300 'ტ', 200 'ს', 100 'რ', 90 'ჟ', 80 'პ', 70 'ო', 60 'ჲ', 50 'ნ', 40 'მ', 30 'ლ', 20 'კ', 10 'ი', 9 'თ', 8 'ჱ', 7 'ზ', 6 'ვ', 5 'ე', 4 'დ', 3 'გ', 2 'ბ', 1 'ა' */
}

@counter-style ancient-tamil {
	type: additive;
	range: 1 9999;
	additive-glyphs: 9000 '\BEF\BF2', 8000 '\BEE\BF2', 7000 '\BED\BF2', 6000 '\BEC\BF2', 5000 '\BEB\BF2', 4000 '\BEA\BF2', 3000 '\BE9\BF2', 2000 '\BE8\BF2', 1000 '\BF2', 900 '\BEF\BF1', 800 '\BEE\BF1', 700 '\BED\BF1', 600 '\BEC\BF1', 500 '\BEB\BF1', 400 '\BEA\BF1', 300 '\BE9\BF1', 200 '\BE8\BF1', 100 '\BF1', 90 '\BEF\BF0', 80 '\BEE\BF0', 70 '\BED\BF0', 60 '\BEC\BF0', 50 '\BEB\BF0', 40 '\BEA\BF0', 30 '\BE9\BF0', 20 '\BE8\BF0', 10 '\BF0', 9 '\BEF', 8 '\BEE', 7 '\BED', 6 '\BEC', 5 '\BEB', 4 '\BEA', 3 '\BE9', 2 '\BE8', 1 '\BE7';
	/* 9000 '௯௲', 8000 '௮௲', 7000 '௭௲', 6000 '௬௲', 5000 '௫௲', 4000 '௪௲', 3000 '௩௲', 2000 '௨௲', 1000 '௲', 900 '௯௱', 800 '௮௱', 700 '௭௱', 600 '௬௱', 500 '௫௱', 400 '௪௱', 300 '௩௱', 200 '௨௱', 100 '௱', 90 '௯௰', 80 '௮௰', 70 '௭௰', 60 '௬௰', 50 '௫௰', 40 '௪௰', 30 '௩௰', 20 '௨௰', 10 '௰', 9 '௯', 8 '௮', 7 '௭', 6 '௬', 5 '௫', 4 '௪', 3 '௩', 2 '௨', 1 '௧' */
}

@counter-style japanese-informal {
	type: additive;
	range: 0 9999;
	additive-glyphs: 9000 '\4E5D\5343', 8000 '\516B\5343', 7000 '\4E03\5343', 6000 '\516D\5343', 5000 '\4E94\5343', 4000 '\56DB\5343', 3000 '\4E09\5343', 2000 '\4E8C\5343', 1000 '\5343', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\4E09\767E', 200 '\4E8C\767E', 100 '\767E', 90 '\4E5D\5341', 80 '\516B\5341', 70 '\4E03\5341', 60 '\516D\5341', 50 '\4E94\5341', 40 '\56DB\5341', 30 '\4E09\5341', 20 '\4E8C\5341', 10 '\5341', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\4E09', 2 '\4E8C', 1 '\4E00', 0 '\3007';
	/* 9000 '九千', 8000 '八千', 7000 '七千', 6000 '六千', 5000 '五千', 4000 '四千', 3000 '三千', 2000 '二千', 1000 '千', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '三百', 200 '二百', 100 '百', 90 '九十', 80 '八十', 70 '七十', 60 '六十', 50 '五十', 40 '四十', 30 '三十', 20 '二十', 10 '十', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '三', 2 '二', 1 '一', 0 '〇' */
	suffix: '\3001';
	/* '、' */
	fallback: cjk-decimal;
}

@counter-style japanese-formal {
	type: additive;
	range: 0 9999;
	additive-glyphs: 9000 '\4E5D\9621', 8000 '\516B\9621', 7000 '\4E03\9621', 6000 '\516D\9621', 5000 '\4F0D\9621', 4000 '\56DB\9621', 3000 '\53C2\9621', 2000 '\5F10\9621', 1000 '\58F1\9621', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4F0D\767E', 400 '\56DB\767E', 300 '\53C2\767E', 200 '\5F10\767E', 100 '\58F1\767E', 90 '\4E5D\62FE', 80 '\516B\62FE', 70 '\4E03\62FE', 60 '\516D\62FE', 50 '\4F0D\62FE', 40 '\56DB\62FE', 30 '\53C2\62FE', 20 '\5F10\62FE', 10 '\58F1\62FE', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4F0D', 4 '\56DB', 3 '\53C2', 2 '\5F10', 1 '\58F1', 0 '\96F6';
	/* 9000 '九阡', 8000 '八阡', 7000 '七阡', 6000 '六阡', 5000 '伍阡', 4000 '四阡', 3000 '参阡', 2000 '弐阡', 1000 '壱阡', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '伍百', 400 '四百', 300 '参百', 200 '弐百', 100 '壱百', 90 '九拾', 80 '八拾', 70 '七拾', 60 '六拾', 50 '伍拾', 40 '四拾', 30 '参拾', 20 '弐拾', 10 '壱拾', 9 '九', 8 '八', 7 '七', 6 '六', 5 '伍', 4 '四', 3 '参', 2 '弐', 1 '壱', 0 '零' */
	suffix: '\3001';
	/* '、' */
	fallback: cjk-decimal;
}

@counter-style korean-hangul-formal {
	type: additive;
	range: 0 9999;
	additive-glyphs: 9000 '\AD6C\CC9C', 8000 '\D314\CC9C', 7000 '\CE60\CC9C', 6000 '\C721\CC9C', 5000 '\C624\CC9C', 4000 '\C0AC\CC9C', 3000 '\C0BC\CC9C', 2000 '\C774\CC9C', 1000 '\C77C\CC9C', 900 '\AD6C\BC31', 800 '\D314\BC31', 700 '\CE60\BC31', 600 '\C721\BC31', 500 '\C624\BC31', 400 '\C0AC\BC31', 300 '\C0BC\BC31', 200 '\C774\BC31', 100 '\C77C\BC31', 90 '\AD6C\C2ED', 80 '\D314\C2ED', 70 '\CE60\C2ED', 60 '\C721\C2ED', 50 '\C624\C2ED', 40 '\C0AC\C2ED', 30 '\C0BC\C2ED', 20 '\C774\C2ED', 10 '\C77C\C2ED', 9 '\AD6C', 8 '\D314', 7 '\CE60', 6 '\C721', 5 '\C624', 4 '\C0AC', 3 '\C0BC', 2 '\C774', 1 '\C77C', 0 '\C601';
	/* 9000 '구천', 8000 '팔천', 7000 '칠천', 6000 '육천', 5000 '오천', 4000 '사천', 3000 '삼천', 2000 '이천', 1000 '일천', 900 '구백', 800 '팔백', 700 '칠백', 600 '육백', 500 '오백', 400 '사백', 300 '삼백', 200 '이백', 100 '일백', 90 '구십', 80 '팔십', 70 '칠십', 60 '육십', 50 '오십', 40 '사십', 30 '삼십', 20 '이십', 10 '일십', 9 '구', 8 '팔', 7 '칠', 6 '육', 5 '오', 4 '사', 3 '삼', 2 '이', 1 '일', 0 '영' */
	suffix: '\3001';
	/* '、' */
}

@counter-style korean-hanja-informal {
	type: additive;
	range: 0 9999;
	additive-glyphs: 9000 '\4E5D\5343', 8000 '\516B\5343', 7000 '\4E03\5343', 6000 '\516D\5343', 5000 '\4E94\5343', 4000 '\56DB\5343', 3000 '\4E09\5343', 2000 '\4E8C\5343', 1000 '\5343', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\4E09\767E', 200 '\4E8C\767E', 100 '\767E', 90 '\4E5D\5341', 80 '\516B\5341', 70 '\4E03\5341', 60 '\516D\5341', 50 '\4E94\5341', 40 '\56DB\5341', 30 '\4E09\5341', 20 '\4E8C\5341', 10 '\5341', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\4E09', 2 '\4E8C', 1 '\4E00', 0 '\96F6';
	/* 9000 '九千', 8000 '八千', 7000 '七千', 6000 '六千', 5000 '五千', 4000 '四千', 3000 '三千', 2000 '二千', 1000 '千', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '三百', 200 '二百', 100 '百', 90 '九十', 80 '八十', 70 '七十', 60 '六十', 50 '五十', 40 '四十', 30 '三十', 20 '二十', 10 '十', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '三', 2 '二', 1 '一', 0 '零' */
	suffix: '\3001';
	/* '、' */
}

@counter-style korean-hanja-formal {
	type: additive;
	range: 0 9999;
	additive-glyphs: 9000 '\4E5D\4EDF', 8000 '\516B\4EDF', 7000 '\4E03\4EDF', 6000 '\516D\4EDF', 5000 '\4E94\4EDF', 4000 '\56DB\4EDF', 3000 '\53C3\4EDF', 2000 '\8CB3\4EDF', 1000 '\58F9\4EDF', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\53C3\767E', 200 '\8CB3\767E', 100 '\58F9\767E', 90 '\4E5D\62FE', 80 '\516B\62FE', 70 '\4E03\62FE', 60 '\516D\62FE', 50 '\4E94\62FE', 40 '\56DB\62FE', 30 '\53C3\62FE', 20 '\8CB3\62FE', 10 '\58F9\62FE', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\53C3', 2 '\8CB3', 1 '\58F9', 0 '\96F6';
	/* 9000 '九仟', 8000 '八仟', 7000 '七仟', 6000 '六仟', 5000 '五仟', 4000 '四仟', 3000 '參仟', 2000 '貳仟', 1000 '壹仟', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '參百', 200 '貳百', 100 '壹百', 90 '九拾', 80 '八拾', 70 '七拾', 60 '六拾', 50 '五拾', 40 '四拾', 30 '參拾', 20 '貳拾', 10 '壹拾', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '參', 2 '貳', 1 '壹', 0 '零' */
	suffix: '\3001';
	/* '、' */
}
	

Per http://www.ethiopic.org/w3c/css/WD-css3-lists-20020220-comments.html#armenianlists, we should have upper-coptic, lower-coptic, and coptic-numeric styles. The Coptic script was split out in Unicode 4.1 to occupy the block from U+2C80 to U+2CFF. Which characters should I use for each?

Per http://www.ethiopic.org/w3c/css/WD-css3-lists-20020220-comments.html#armenianlists, putting the circumflex above a digit in armenian numbering multiplies the digit by 1000. The draft currently states a 10,000 multiplier. Which is correct? (Having the multiplier be 1000 means that you can potentially write the thousands digit two ways, using either the set of thousands digits or the set of ones digits with a circumflex. The examples given in the note appear to use the former.)

Profiles

This module has two profiles: CSS Level 1 and Full. There is no CSS2 profile because this module is incompatible with the CSS2 list model.

The CSS Level 1 module consists of ‘list-style’, ‘list-style-position’, ‘list-style-image’, and ‘list-style-type’ (but only the following values: ‘disc’, ‘circle, square’, ‘decimal’, ‘lower-roman’, ‘upper-roman’, ‘lower-alpha’, ‘upper-alpha’, ‘none’). It does not include the ::marker pseudo element.

The Full profile contains everything.

Acknowledgments

The following people and documentation they wrote were very useful for defining the numbering systems: Alexander Savenkov, Aryeh Gregor, Frank Tang, Jonathan Rosenne, Karl Ove Hufthammer, Musheg Arakelyan, Nariné Renard Karapetyan, Randall Bart, Richard Ishida Simon Montagu

Changes From CSS2

As described in the introduction section, there are significant changes in this module when compared to CSS2.

  1. display:marker’ has been replaced with ‘::marker
  2. It is no longer possible to make end markers.
  3. The ‘marker-offset’ property is obsoleted.
  4. Markers are now aligned relative to the line box edge, rather than the border edge.
  5. Markers now have margins.
  6. The introduction of many new list style types as well as explicit algorithms for all list style types.
  7. Error handling rules for unknown list style types were changed to be consistent with the normal parsing error handling rules.
  8. The list-item predefined counter identifier has been introduced.

References

Normative references

[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 23 April 2009. W3C Candidate Recommendation. (Work in progress.) URL: http://www.w3.org/TR/2009/CR-CSS2-20090423

Other references

[CSS1]
Håkon Wium Lie; Bert Bos. Cascading Style Sheets (CSS1) Level 1 Specification. 11 April 2008. W3C Recommendation. URL: http://www.w3.org/TR/2008/REC-CSS1-20080411

Property index

Property Values Initial Applies to Inh. Percentages Media
additive-glyphs [ <integer> && [ <string> | <image> ] ]+ N/A
display marker Children elements of display:list-item elements
fallback <counter-style-name> decimal
glyphs [ <string> | <image> ]+ N/A
list-style <‘list-style-type’> || <‘list-style-position’> || <‘list-style-image’> N/A (shorthand property) all elements with ‘display: list-item’ visual N/A (shorthand property)
list-style-image <image> | none none all elements with ‘display: list-item’ yes visual specified value
list-style-position inside | hanging | outside outside all elements with ‘display: list-item’ yes visual specified value
list-style-type <string> | <counter-style> | inline | none disc all elements with ‘display: list-item’ yes visual specified value
negative <string> <string>? "\2D" ("-" hyphen-minus)
prefix <string> "" (the empty string)
range [ <integer> | infinite ]{2} infinite infinite
suffix <string> "\2E" ("." full stop)
type repeating | numeric | alphabetic | symbolic | additive | [non-repeating <integer?] | [ override <counter-style-name> ] N/A

Index