Docs
Functions
Get translations
Retrieve message from translation map.
Source
@function message($theme, $key) {
$message-key: $theme + ':' + $key;
@if not map-has-key($messages, $message-key) {
@error 'No key `#{$message-key}` found.';
}
@return map-get($messages, $message-key);
}
Parameters
Name |
Description |
Type |
Default value |
$theme |
Either advice , error , warning or obsolete |
String |
— |
$key |
Key to find message for |
String |
— |
Used by
Get theme configuration
Helper function to easily access a theme configuration.
Source
@function theme-conf($theme, $key) {
@return map-get(map-get($themes, $theme), $key);
}
Parameters
Name |
Description |
Type |
Default value |
$theme |
Either advice , error , warning or obsolete |
String |
— |
$key |
Data to get: color , index or background-offset |
String |
— |
Example
Get color from error theme.
.selector {
color: theme-conf('error', 'color');
}
.selector {
color: #911;
}
Used by
Check level to display
Test whether $level
is high enough to be displayed by comparing its index to $minimum-level
's.
Source
@function is-level-enough($level) {
$levels: map-keys($themes);
@return index($levels, $level) <= index($levels, $minimum-level);
}
Parameters
Name |
Description |
Type |
Default value |
$level |
Either advice , error , warning or obsolete |
String |
— |
Used by
Escape attr()
Ensures CSS attr()
function will render the expected value, instead of being output as a string.
Source
@function replace-attr($message) {
$has-attr: str-index($message, 'attr(');
$first-paren: str-index($message, ')');
@if not $has-attr {
@return $message;
}
$first-chunk: str-slice($message, 1, $has-attr - 1);
$last-chunk: str-slice($message, $first-paren + 1);
$result: ();
@if str-length($first-chunk) > 0 {
$result: append($result, $first-chunk);
}
$result: append($result, unquote(str-slice($message, $has-attr, $first-paren)));
@if str-length($last-chunk) > 0 {
$result: append($result, replace-attr($last-chunk));
}
@return $result;
}
Parameters
Name |
Description |
Type |
Default value |
$message |
Message to escape |
String |
— |
Example
.selector {
content: replace-attr("ARIA role attr(role) should be unique, but this one is the second!");
}
.selector {
content: "ARIA role " attr(role) "should be unique, but this one is the second!";
}
Used by
Mixins
Set minimum level
Defines the minimum level used by a11y.css
.
Either:
error
for errors only;
warning
for errors and warnings;
obsolete
for everything but advices;
advice
for everything.
Source
@mixin set-minimum-level($level) {
$level: to-lower-case($level);
$levels: map-keys($themes);
@if not index($levels, $level) {
$default-level: nth($levels, -1);
$level: $default-level;
@warn 'Level `#{$level}` does not exist. '
+ 'Please choose one of `#{inspect($levels)}`. '
+ 'Falling back on `#{$default-level}`';
}
$minimum-level: $level !global;
}
Parameters
Name |
Description |
Type |
Default value |
$level |
Either advice , error , warning or obsolete |
String |
— |
Example
@include set-minimum-level('error');
Get a message
Get a message from the translation map based on the defined language and output it in the content
property.
Source
@mixin message($theme, $key) {
content: replace-attr(quote("#{message($theme, $key)}")) !important;
}
Parameters
Name |
Description |
Type |
Default value |
$theme |
Either advice , error , warning or obsolete |
String |
— |
$key |
Message name. Should match a test identifier. |
String |
— |
Example
.selector {
@include message('advice', 'nav');
}
.selector {
content: 'Did you know the <nav> tag is exclusively restricted to primary and secondary navigation area?';
}
Extends selector with self-closing tags & replaced elements.
Notice the &
before the selector, and $self-closing: true
argument.
Source
@mixin void-tags {
@at-root #{selector-unify($void-tags, &)} {
@content;
}
}
Example
.selector {
@include advice('nav')
@include void-tags {
@include advice('nav', $self-closing: true);
}
}
area .selector, base .selector, br .selector, col .selector, command .selector, embed .selector, hr .selector, img .selector, input .selector, keygen .selector, link .selector, meta .selector, param .selector, source .selector, track .selector, wbr .selector, textarea .selector, select .selector, svg .selector, audio .selector, video .selector, iframe .selector {
content: "Did you know the <nav> tag is exclusively restricted to primary and secondary navigation area?";
}
Set a message
Theme mixin including everything needed for the $theme
, and checking test is not disabled.
Source
@mixin item($theme, $key, $self-closing: false, $head: false) {
$message-key: $theme + ':' + $key;
$is-disabled: index($disabled-tests, $message-key);
@if is-level-enough($theme) and not $is-disabled {
@include a11y($theme, $key, $self-closing, $head);
}
}
Parameters
Name |
Description |
Type |
Default value |
$theme |
Either advice , error , warning or obsolete |
String |
— |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether to use message on self or on next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Define an error
Level related mixins use item()
mixin with a hardcoded theme name.
Source
@mixin error($key, $self-closing: false, $head: false) {
@include item('error', $key, $self-closing, $head);
}
Parameters
Name |
Description |
Type |
Default value |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether to use message on self or on next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Example
.selector {
@include error("no-src");
}
Define a warning
Level related mixins use item()
mixin with a hardcoded theme name.
Source
@mixin warning($key, $self-closing: false, $head: false) {
@include item('warning', $key, $self-closing, $head);
}
Parameters
Name |
Description |
Type |
Default value |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether to use message on self or on next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Example
.selector {
@include warning("abbr");
}
Define an obsolete thing
Level related mixins use item()
mixin with a hardcoded theme name.
Source
@mixin obsolete($key, $self-closing: false, $head: false) {
@include item('obsolete', $key, $self-closing, $head);
}
Parameters
Name |
Description |
Type |
Default value |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether to use message on self or on next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Example
.selector {
@include obsolete("any");
}
Define an advice
Level related mixins use item()
mixin with a hardcoded theme name.
Source
@mixin advice($key, $self-closing: false, $head: false) {
@include item('advice', $key, $self-closing, $head);
}
Parameters
Name |
Description |
Type |
Default value |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether to use message on self or on next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Example
.selector {
@include advice("nav");
}
Disable test(s)
Disable specific tests. Each test key should match an entry in locales $messages
map,
made of a level and a test identifier separated by a double-colon, e.g. error:tab-order
.
Source
@mixin disable-tests($keys...) {
@each $key in $keys {
$disabled-tests: append($disabled-tests, $key) !global;
}
}
Parameters
Name |
Description |
Type |
Default value |
$keys |
Keys of tests to disable. |
List |
— |
Example
@include disable-tests('error:tab-order', 'advice:empty-class');
Display messages in <head>
Display messages on <head>
's tags.
Source
@mixin a11y-head($self-closing: false) {
@extend %a11y-head;
@if $self-closing {
~ link:last-of-type {
@extend %a11y-head;
}
}
}
Parameters
Name |
Description |
Type |
Default value |
$self-closing |
Whether to use message on self or on last <link> . |
Boolean |
false |
Example
.selector {
@include a11y-head();
}
Display counters ::after <body>
Defines body::after
’s content
and background-image
depending on $minimum-level
.
Source
@mixin base-content($minimum-level) {
$background: ();
$content: ();
@each $theme in map-keys($themes) {
@if is-level-enough($theme) {
$background-offset: theme-conf($theme, 'background-offset');
$background-theme:
transparent $background-offset,
theme-conf($theme, 'color') $background-offset,
theme-conf($theme, 'color') ($background-offset + 0.2em),
transparent ($background-offset + 0.2em);
$background: append($background, $background-theme, 'comma');
$content-theme: quote(message('ui', $theme)) ': ' #{counter(unquote($theme))} '\A ';
$content: append($content, $content-theme);
}
}
background-image: linear-gradient(to bottom, transparent, $background, transparent 100%);
content: $content;
}
Parameters
Name |
Description |
Type |
Default value |
$minimum-level |
Inheriting minimum level. |
String |
— |
Example
@include base-content($minimum-level);
Display a message
Main mixin to display a message.
Source
@mixin a11y($theme, $key, $self-closing: false, $head: false) {
@extend %a11y-#{$theme};
$base-selector: '&::after';
@if $self-closing {
$base-selector: '& + ::before';
}
@if $head {
$base-selector: '& ~ link:last-of-type::before';
}
#{$base-selector} {
@extend %a11y-before;
@include message($theme, $key);
background: theme-conf($theme, 'color') !important;
z-index: theme-conf($theme, 'index') !important;
}
}
Parameters
Name |
Description |
Type |
Default value |
$theme |
Inheriting minimum level. |
String |
— |
$key |
Key used to fetch message in $messages map. |
String |
— |
$self-closing |
Whether or not to use message on self or next node. |
Boolean |
false |
$head |
Whether or not a self-closing tag sits in document's head. |
Boolean |
false |
Example
@include a11y($theme, $key, $self-closing, $head);
Placeholders
Messages common styles
Common styles for messages, mostly resetting text styles and preventing layout quirks.
Source
%a11y-before {
border-radius: 0 !important;
color: #fff !important;
contain: content;
display: block !important;
font: 700 normal 14px/1.5 sans-serif !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important;
height: auto !important;
max-width: 100vw !important;
padding: 4px !important;
pointer-events: none !important;
position: absolute !important;
text-decoration: none !important;
text-shadow: none !important;
text-transform: none !important;
transform: none !important;
white-space: pre !important;
width: auto !important;
}
Used by
Level-specific messages styles
Level-specific styles for messages, incrementing counter
and enforcing outline
.
Source
@each $theme in map-keys($themes) {
%a11y-#{$theme} {
counter-increment: unquote($theme) !important;
outline: 4px solid theme-conf($theme, 'color') !important;
outline-offset: -4px !important;
}
}
Used by
Cancel a message
Provides a way to cancel a message by resetting its core properties.
Source
%a11y-reset {
counter-increment: none !important;
outline: 0 !important;
&::after,
& + ::before {
content: '' !important;
display: none !important;
}
}
Used by
Display <head> children
Displays elements in <head>
, to allow their messages to appear.
Source
%a11y-head {
display: block !important;
}
Used by
Variables
Themes
This map holds configuration for all themes. Each theme has an icon, a color and a z-index, and a background offset.
Source
$themes: (
'error': (
'color': #d90b0b,
'index': 2147483647,
'background-offset': 1.4em
),
'warning': (
'color': #f50,
'index': 2147483646,
'background-offset': 2.9em
),
'obsolete': (
'color': royalblue,
'index': 2147483645,
'background-offset': 4.4em
),
'advice': (
'color': green,
'index': 2147483644,
'background-offset': 5.9em
),
);
Map structure
Name |
Description |
Type |
Value |
theme |
— |
Map |
— |
theme.color |
Theme color |
Color |
— |
theme.index |
Theme z-index |
Number |
— |
theme.background-offset |
Theme background-offset |
Length |
— |
Used by
Disabled tests
Map of disabled tests, referred by their key.
Source
Used by
Every HTML tag that do not allow generated content through pseudo-elements.
Source
$void-tags: area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr, textarea, select, svg, audio, video, iframe;
Used by
References
File formats used in a few selectors.
Source
$formats: pdf, doc, png, jpg, gif, ics, mp3, mp4, mov, ogg, xls, txt, zip, rar, docx, webp, apng, svg, svgz;
Used by
Interactive elements
Tags used in some selectors.
Source
$interactive: 'a[href]', 'audio[controls]', 'video[controls]', 'button', 'details', 'embed', 'iframe', 'img[usemap]', 'label', 'select', 'textarea', 'input[type]:not([hidden])';
Used by
References