`.
+
+Be sure to use headline levels in order (H1 followed by H2, etc) so that assistive technologies can navigate the page. Skipping a headline level causes confusion.
+
+## Examples
+
+### Basic Typography
+
+::preview{file="typography/basic.html" id="example_basic" tall="true"}::
diff --git a/site/examples/alerts/basic.html b/site/examples/alerts/basic.html
new file mode 100644
index 0000000..0f92dc8
--- /dev/null
+++ b/site/examples/alerts/basic.html
@@ -0,0 +1,15 @@
+---
+title: Info, Success, and Error Alerts
+---
+
+
+
We’ve been trying to reach you about your car’s extended warranty.
+
+
+
+
We’ve been trying to reach you about your car’s extended warranty.
+
+
+
+
We’ve been trying to reach you about your car’s extended warranty.
+
diff --git a/site/examples/badges/basic.html b/site/examples/badges/basic.html
new file mode 100644
index 0000000..e4c707a
--- /dev/null
+++ b/site/examples/badges/basic.html
@@ -0,0 +1,96 @@
+---
+title: Various Badges
+---
+
+
Archived
+
+
12 notifications
+
12 notifications
+
+
+ Unread 322
+
+
+
New!
+
+
+
+
+ Tag
+
+
+ Color: red
+
+
+
+
+ Tag
+
+
+ Sleeve-length: long
+
+
+
+
+ Tag
+
+
+ Material: cotton
+
+
+
+
+ Tag
+
+
+ Fit: wide
+
+
diff --git a/site/examples/buttons/basic.html b/site/examples/buttons/basic.html
new file mode 100644
index 0000000..8e73598
--- /dev/null
+++ b/site/examples/buttons/basic.html
@@ -0,0 +1,13 @@
+---
+title: Buttons Example
+---
+
+
A primary button
+
+ A secondary button
+
+
+ A disabled primary button
+
+
A primary button link
+
A secondary button link
diff --git a/site/examples/dialogs/basic.html b/site/examples/dialogs/basic.html
new file mode 100644
index 0000000..cd55cb5
--- /dev/null
+++ b/site/examples/dialogs/basic.html
@@ -0,0 +1,60 @@
+---
+title: Basic Modal
+---
+
+
+ Open a modal
+
+
+
+
+ Close
+
+
+
+ Hello there
+
+
diff --git a/site/examples/dialogs/slide-in.html b/site/examples/dialogs/slide-in.html
new file mode 100644
index 0000000..b49f6d5
--- /dev/null
+++ b/site/examples/dialogs/slide-in.html
@@ -0,0 +1,60 @@
+---
+title: Slide-in Drawer Modal
+---
+
+
+ Open a slide-in modal
+
+
+
+
+ Close
+
+
+
+ Hello there
+
+
diff --git a/site/examples/disclosures/faq.html b/site/examples/disclosures/faq.html
new file mode 100644
index 0000000..882da36
--- /dev/null
+++ b/site/examples/disclosures/faq.html
@@ -0,0 +1,39 @@
+---
+title: FAQ-style Disclosures
+---
+
+
+ What is my tax filing status?
+
+ Head of household
+
+ Choose this option if you are unmarried and pay at least half the cost of
+ housing and support for others.
+
+ Married/domestic partnership
+
+ Choose this option if you are married or in a domestic partnership and
+ have filed separately or jointly.
+
+ Single
+
+ Choose this option if you are unmarried and don't qualify for another
+ filing status.
+
+
+
+
+ When are taxes due?
+
+ Federal income taxes are typically due on April 15th of each year, unless
+ that date falls on a weekend or holiday, in which case the deadline may be
+ extended to the next business day.
+
+
+
+ How should I submit my tax return?
+
+ You can submit your tax return electronically using e-filing services or by
+ mailing a paper return to the appropriate IRS address.
+
+
diff --git a/site/examples/disclosures/single.html b/site/examples/disclosures/single.html
new file mode 100644
index 0000000..0172fc6
--- /dev/null
+++ b/site/examples/disclosures/single.html
@@ -0,0 +1,24 @@
+---
+title: Single Disclosure
+---
+
+
+ What is my tax filing status?
+
+ Head of household
+
+ Choose this option if you are unmarried and pay at least half the cost of
+ housing and support for others.
+
+ Married/domestic partnership
+
+ Choose this option if you are married or in a domestic partnership and
+ have filed separately or jointly.
+
+ Single
+
+ Choose this option if you are unmarried and don't qualify for another
+ filing status.
+
+
+
diff --git a/site/examples/examples.11tydata.js b/site/examples/examples.11tydata.js
new file mode 100644
index 0000000..c727149
--- /dev/null
+++ b/site/examples/examples.11tydata.js
@@ -0,0 +1,4 @@
+export default {
+ layout: "layouts/example.njk",
+ permalink: "{{ page.filePathStem }}.html",
+};
diff --git a/site/examples/forms/basic.html b/site/examples/forms/basic.html
new file mode 100644
index 0000000..eb2ac2e
--- /dev/null
+++ b/site/examples/forms/basic.html
@@ -0,0 +1,150 @@
+---
+title: Basic Form
+---
+
+
diff --git a/site/examples/loading-indicator/basic.html b/site/examples/loading-indicator/basic.html
new file mode 100644
index 0000000..9eeaf64
--- /dev/null
+++ b/site/examples/loading-indicator/basic.html
@@ -0,0 +1,24 @@
+---
+title: Spinning Loading Indicator
+---
+
+
+
+ Loading…
+
+ Loading…
+
+
+
+
+
diff --git a/site/examples/page-footer/nav.html b/site/examples/page-footer/nav.html
new file mode 100644
index 0000000..073019f
--- /dev/null
+++ b/site/examples/page-footer/nav.html
@@ -0,0 +1,26 @@
+---
+title: Page Footer with Navigation
+---
+
+
diff --git a/site/examples/page-header/nav.html b/site/examples/page-header/nav.html
new file mode 100644
index 0000000..9cf69eb
--- /dev/null
+++ b/site/examples/page-header/nav.html
@@ -0,0 +1,101 @@
+---
+title: Page Header with Navigation and Skip Navigation Link
+---
+
+
diff --git a/site/examples/pagination/fancy.html b/site/examples/pagination/fancy.html
new file mode 100644
index 0000000..e67c617
--- /dev/null
+++ b/site/examples/pagination/fancy.html
@@ -0,0 +1,33 @@
+---
+title: Nav with page gaps and metadata
+---
+
+
diff --git a/site/examples/pagination/pagy-series-limited.html b/site/examples/pagination/pagy-series-limited.html
new file mode 100644
index 0000000..a8ad441
--- /dev/null
+++ b/site/examples/pagination/pagy-series-limited.html
@@ -0,0 +1,45 @@
+---
+title: Pagy series nav with limited slots
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/examples/pagination/pagy-series.html b/site/examples/pagination/pagy-series.html
new file mode 100644
index 0000000..8dbd4e9
--- /dev/null
+++ b/site/examples/pagination/pagy-series.html
@@ -0,0 +1,15 @@
+---
+title: Pagy series nav
+---
+
+
+ ←
+ 1
+ 2
+ 3
+ 4
+ 5
+ …
+ 50
+ →
+
diff --git a/site/examples/pagination/simple.html b/site/examples/pagination/simple.html
new file mode 100644
index 0000000..a034877
--- /dev/null
+++ b/site/examples/pagination/simple.html
@@ -0,0 +1,13 @@
+---
+title: Simple nav
+---
+
+
diff --git a/site/examples/quotes/basic.html b/site/examples/quotes/basic.html
new file mode 100644
index 0000000..07ffba5
--- /dev/null
+++ b/site/examples/quotes/basic.html
@@ -0,0 +1,20 @@
+---
+title: Quote with Citation
+---
+
+
+
+
+ Code less, question more. Some of the most experienced developers I know
+ ask a lot of questions before begining to work on a feature. This often
+ leads to a simpler implementation, or sometimes, no implementation at all
+ since the questioning revealed more research was needed.
+
+
+ I find that this “question first” mindset is helpful in other areas of
+ consulting, and life as well. It provides an opportunity for others to
+ share their ideas and feel heard.
+
+
+ — Steve Polito, Senior Developer at thoughtbot
+
diff --git a/site/examples/search/basic.html b/site/examples/search/basic.html
new file mode 100644
index 0000000..7952c24
--- /dev/null
+++ b/site/examples/search/basic.html
@@ -0,0 +1,37 @@
+---
+title: Basic Search
+---
+
+
+
+
+ Search this site
+
+
+
+
+ Search
+
+
+ Search
+
+
+
diff --git a/site/examples/tables/basic.html b/site/examples/tables/basic.html
new file mode 100644
index 0000000..d0d2bef
--- /dev/null
+++ b/site/examples/tables/basic.html
@@ -0,0 +1,35 @@
+---
+title: Basic Table
+---
+
+
+
+ Monthly spending
+
+
+
+ Month
+ Savings
+
+
+
+
+ January
+ $100
+
+
+ February
+ $80
+
+
+ March
+ $30
+
+
+
+
+ Sum
+ $210
+
+
+
diff --git a/site/examples/tables/overflow.html b/site/examples/tables/overflow.html
new file mode 100644
index 0000000..96d81ec
--- /dev/null
+++ b/site/examples/tables/overflow.html
@@ -0,0 +1,61 @@
+---
+title: Overflow Scroll
+---
+
+
+
+
+
+
+ Monthly spending with overflow container for smaller viewports
+
+
+
+ Category
+ Planned
+ Actual
+ Difference
+
+
+
+
+ Rent/Mortgage
+ $1,200
+ $1,200
+ $0
+
+
+ Utilities
+ $150
+ $140
+ -$10
+
+
+ Groceries
+ $400
+ $420
+ +$20
+
+
+ Transportation
+ $100
+ $80
+ -$20
+
+
+ Entertainment
+ $200
+ $220
+ +$20
+
+
+ Miscellaneous
+ $100
+ $90
+ -$10
+
+
+
+
+
+
diff --git a/site/examples/tables/striped.html b/site/examples/tables/striped.html
new file mode 100644
index 0000000..2518c1e
--- /dev/null
+++ b/site/examples/tables/striped.html
@@ -0,0 +1,35 @@
+---
+title: Striped Table
+---
+
+
+
+ Monthly spending
+
+
+
+ Month
+ Savings
+
+
+
+
+ January
+ $100
+
+
+ February
+ $80
+
+
+ March
+ $30
+
+
+
+
+ Sum
+ $210
+
+
+
diff --git a/site/examples/typography/basic.html b/site/examples/typography/basic.html
new file mode 100644
index 0000000..ae00a17
--- /dev/null
+++ b/site/examples/typography/basic.html
@@ -0,0 +1,19 @@
+---
+title: Basic Typography
+---
+
+
First-level heading
+
Second-level heading
+
Third-level heading
+
Fourth-level heading
+
+ A paragraph right here. Lorem ipsum dolor sit amet,
+ consectetur adipiscing elit. Sed lectus nunc,
+ faucibus at tempus in, mattis eu tellus . Quisque non neque vitae arcu aliquam scelerisque vitae id mauris.
+ Suspendisse potenti.
+
+
+
+
+
Small text here that is legalese.
diff --git a/site/favicon-c39babd7aaf33dd9a1cb8bc87fefa0975f8194a799246524bc9295c9c7397527.ico b/site/favicon-c39babd7aaf33dd9a1cb8bc87fefa0975f8194a799246524bc9295c9c7397527.ico
new file mode 100644
index 0000000..d368990
Binary files /dev/null and b/site/favicon-c39babd7aaf33dd9a1cb8bc87fefa0975f8194a799246524bc9295c9c7397527.ico differ
diff --git a/site/favicon.ico b/site/favicon.ico
new file mode 100644
index 0000000..d368990
Binary files /dev/null and b/site/favicon.ico differ
diff --git a/site/favicon.svg b/site/favicon.svg
new file mode 100644
index 0000000..21dd715
--- /dev/null
+++ b/site/favicon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/index.md b/site/index.md
new file mode 100644
index 0000000..6389b72
--- /dev/null
+++ b/site/index.md
@@ -0,0 +1,114 @@
+---
+permalink: /
+layout: layouts/base.njk
+---
+
+# Roux Components
+
+## Extend [Roux CSS](https://github.com/thoughtbot/roux) with ready-to-use components to build your project.
+
+Much like Roux CSS, these components are meant as a baseline for you to build on top of, so feel free to adjust as needed. They're flexible and extendable, but opinionated about what matters.
+
+All components aim to be accessible and semantic by default.
+
+Find the code in [the Roux repo on GitHub](https://github.com/thoughtbot/roux).
+
+## Getting Started
+
+To use Roux Components in your project:
+
+1. **Copy the component CSS** from the Roux GitHub repo
+2. **Copy the component HTML** from the examples on this site
+3. **Customize both** to make them your own
+
+### Example: Using the Page Footer Component
+
+Here's how you might use the [Page Footer component](/component-library/page-footer.html):
+
+#### Step 1: Copy the component CSS
+
+Copy the styles from [`src/css/components/_page-footer.css`](https://github.com/thoughtbot/roux/blob/main/src/css/components/_page-footer.css) into your codebase. Don't forget to import them into your `app.css`:
+
+```diff
+/* app.css */
+
++ @import "components/_page-footer.css";
+```
+
+#### Step 2: Copy the component HTML
+
+Copy the [page footer example](/component-library/page-footer.html#example_nav) into your site's HTML.
+
+#### Step 3: Customize it!
+
+Maybe you don't need a copyright on your site:
+
+```diff
+/* _page-footer.css */
+
+ .page-footer {
+ display: grid;
+ grid-template-areas:
+- "copyright"
+ "nav";
+ grid-template-columns: 1fr;
+ …
+ }
+```
+
+```diff
+
+
+
+```
+
+## Components
+
+
+
+## Contributing
+
+[Bug reports](https://github.com/thoughtbot/roux/issues/new?template=bug_report.md) and [pull requests](https://github.com/thoughtbot/roux/pulls) are welcome on GitHub at https://github.com/thoughtbot/roux.
+
+Please create a [new discussion](https://github.com/thoughtbot/roux/discussions/new?category=ideas) if you want to share ideas for new features.
+
+This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/thoughtbot/roux/blob/main/CODE_OF_CONDUCT.md).
+
+## License
+
+Open source templates are Copyright (c) thoughtbot, inc. It contains free software that may be redistributed under the terms specified in the [LICENSE](https://github.com/thoughtbot/roux/blob/main/LICENSE) file.
+
+## Code of Conduct
+
+Everyone interacting in Roux's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/thoughtbot/roux/blob/main/CODE_OF_CONDUCT.md).
+
+## About thoughtbot
+
+[](https://thoughtbot.com)
+
+This repo is maintained and funded by thoughtbot, inc. The names and logos for thoughtbot are trademarks of thoughtbot, inc.
+
+We love open source software! See [our other projects.](https://thoughtbot.com/community?utm_source=github) We are [available for hire.](https://thoughtbot.com/hire-us?utm_source=github)
diff --git a/site/robots.txt b/site/robots.txt
new file mode 100644
index 0000000..856680b
--- /dev/null
+++ b/site/robots.txt
@@ -0,0 +1,7 @@
+# Robots.txt for Roux Components
+# https://roux.thoughtbot.dev
+
+User-agent: *
+Allow: /
+
+Sitemap: https://roux.thoughtbot.dev/sitemap.xml
diff --git a/site/sitemap.njk b/site/sitemap.njk
new file mode 100644
index 0000000..ad30e69
--- /dev/null
+++ b/site/sitemap.njk
@@ -0,0 +1,17 @@
+---
+permalink: /sitemap.xml
+eleventyExcludeFromCollections: true
+---
+
+
+ {%- for page in collections.all %}
+ {%- if not page.data.eleventyExcludeFromCollections %}
+
+ https://roux.thoughtbot.dev{{ page.url }}
+ {%- if page.date %}
+ {{ page.date.toISOString() }}
+ {%- endif %}
+
+ {%- endif %}
+ {%- endfor %}
+
diff --git a/src/css/app.css b/src/css/app.css
index 93639d4..8c6fb58 100644
--- a/src/css/app.css
+++ b/src/css/app.css
@@ -12,14 +12,25 @@
@import "base/_buttons.css" layer(base);
@import "base/_disclosures.css" layer(base);
@import "base/_forms.css" layer(base);
+@import "base/_layout.css" layer(base);
@import "base/_lists.css" layer(base);
@import "base/_media.css" layer(base);
+@import "base/_modal.css" layer(base);
@import "base/_tables.css" layer(base);
@import "base/_typography.css" layer(base);
/* Components */
/* Import components from the component folder here in ABC order */
/* For example: @import "components/_card.css" layer(components); */
+@import "components/_alert.css" layer(components);
+@import "components/_badge.css" layer(components);
+@import "components/_loading-indicator.css" layer(components);
+@import "components/_page-footer.css" layer(components);
+@import "components/_page-header.css" layer(components);
+@import "components/_page-nav.css" layer(components);
+@import "components/_pagination.css" layer(components);
+@import "components/_search.css" layer(components);
/* Utilities */
@import "utilities/_hide-visually.css" layer(utilities);
+@import "utilities/_sizing.css" layer(utilities);
diff --git a/src/css/base/_animation.css b/src/css/base/_animation.css
index f4ae386..f7b210b 100644
--- a/src/css/base/_animation.css
+++ b/src/css/base/_animation.css
@@ -1,5 +1,5 @@
html {
- @media screen and (prefers-reduced-motion: no-preference) {
+ @media screen and (prefers-reduced-motion: no-preference) {
scroll-behavior: smooth;
}
}
diff --git a/src/css/base/_buttons.css b/src/css/base/_buttons.css
index 09fffec..343d242 100644
--- a/src/css/base/_buttons.css
+++ b/src/css/base/_buttons.css
@@ -16,7 +16,7 @@
transition-duration: var(--transition-duration--base);
transition-property: background-color, color;
transition-timing-function: var(--transition-timing--base);
-
+
&:focus-visible {
outline: var(--border-width--thick) solid var(--color--focus);
outline-offset: 2px;
@@ -46,5 +46,7 @@
}
.button:disabled {
+ background-color: var(--color--disabled);
cursor: not-allowed;
+ color: var(--color--text);
}
diff --git a/src/css/base/_forms.css b/src/css/base/_forms.css
index 199fdc3..01776d2 100644
--- a/src/css/base/_forms.css
+++ b/src/css/base/_forms.css
@@ -8,11 +8,7 @@
cursor: pointer;
}
-:where(
- input,
- label,
- select
-) {
+:where(input, label, select) {
display: block;
}
@@ -29,17 +25,13 @@ form {
}
:where(fieldset > *:not(:last-child)) {
- margin-block-end: var(--space--base);
+ margin-block-end: var(--space--base);
}
-:is(
- input,
- textarea,
- select
-) {
+:is(input, textarea, select) {
accent-color: var(--color--primary-base);
border: var(--border--light);
-
+
&:focus {
outline: var(--border-width--base) solid var(--color--primary-base);
}
@@ -86,24 +78,24 @@ form {
}
label:has(
- input:not([type]),
- select,
- textarea,
- [type="color"],
- [type="date"],
- [type="datetime"],
- [type="datetime-local"],
- [type="email"],
- [type="month"],
- [type="number"],
- [type="password"],
- [type="search"],
- [type="tel"],
- [type="text"],
- [type="time"],
- [type="url"],
- [type="week"]
- ) {
+ input:not([type]),
+ select,
+ textarea,
+ [type="color"],
+ [type="date"],
+ [type="datetime"],
+ [type="datetime-local"],
+ [type="email"],
+ [type="month"],
+ [type="number"],
+ [type="password"],
+ [type="search"],
+ [type="tel"],
+ [type="text"],
+ [type="time"],
+ [type="url"],
+ [type="week"]
+) {
display: flex;
flex-direction: column;
gap: var(--space--x-small);
@@ -117,11 +109,7 @@ label:has([type="radio"], [type="checkbox"]) {
justify-self: start;
}
-label:has(
- input[required],
- select[required],
- textarea[required]
-) > span::after,
+label:has(input[required], select[required], textarea[required]) > span::after,
.fieldset-required > legend::after {
content: "*";
margin-inline-start: var(--space--xx-small);
@@ -192,7 +180,7 @@ label:has(input[type="range"]) {
[type="range"]::-webkit-slider-thumb {
--size: var(--space--large);
-
+
appearance: none;
background-color: var(--color--background-base);
background-image: url('data:image/svg+xml,
');
diff --git a/src/css/base/_media.css b/src/css/base/_media.css
index 4f36685..de09960 100644
--- a/src/css/base/_media.css
+++ b/src/css/base/_media.css
@@ -1,12 +1,4 @@
-:where(
- audio,
- canvas,
- iframe,
- img,
- figure,
- picture,
- video
-) {
+:where(audio, canvas, iframe, img, figure, picture, video) {
display: block;
height: auto;
margin: 0;
diff --git a/src/css/base/_modal.css b/src/css/base/_modal.css
index 94f28c6..cf1fd82 100644
--- a/src/css/base/_modal.css
+++ b/src/css/base/_modal.css
@@ -7,7 +7,7 @@ dialog {
gap: var(--space--base);
max-width: var(--container--base);
width: calc(100% - var(--space--base));
-
+
&[open] {
display: flex;
}
diff --git a/src/css/base/_tables.css b/src/css/base/_tables.css
index 4da6b76..c95c328 100644
--- a/src/css/base/_tables.css
+++ b/src/css/base/_tables.css
@@ -15,7 +15,8 @@ table {
padding-inline: var(--space--small);
}
-:where(tfoot) td, caption {
+:where(tfoot) td,
+caption {
font-weight: var(--font-weight--bold);
padding-block: var(--space--xx-small);
padding-inline: var(--space--small);
diff --git a/src/css/base/_typography.css b/src/css/base/_typography.css
index bebc40a..c2a2e81 100644
--- a/src/css/base/_typography.css
+++ b/src/css/base/_typography.css
@@ -11,13 +11,7 @@ body {
line-height: var(--line-height--base);
}
-:where(
- h1,
- h2,
- h3,
- h4,
- strong
-) {
+:where(h1, h2, h3, h4, strong) {
font-weight: var(--font-weight--bold);
}
@@ -28,8 +22,9 @@ h1 {
a {
color: var(--color--link);
- transition: var(--transition-duration--base) color var(--transition-timing--base);
-
+ transition: var(--transition-duration--base) color
+ var(--transition-timing--base);
+
&:hover {
color: var(--color--link-hover);
}
@@ -55,6 +50,21 @@ hr {
width: 100%;
}
+blockquote {
+ font-style: var(--font-style--italic);
+ display: block;
+ margin-block-start: var(--space--base);
+ margin-block-end: var(--space--base);
+ margin-inline-start: var(--space--large);
+ margin-inline-end: var(--space--large);
+}
+blockquote + figcaption {
+ margin-block-start: var(--space--base);
+ margin-block-end: var(--space--base);
+ margin-inline-start: var(--space--large);
+ margin-inline-end: var(--space--large);
+}
+
table {
font-variant-numeric: tabular-nums lining-nums slashed-zero;
}
diff --git a/src/css/base/_variables.css b/src/css/base/_variables.css
index c675868..b521e0a 100644
--- a/src/css/base/_variables.css
+++ b/src/css/base/_variables.css
@@ -5,59 +5,63 @@
/* Primitive colors */
--color--black-500: #000f08;
-
+
--color--blue-100: #6c9fdf;
--color--blue-500: #253d5b;
--color--blue-900: #15273e;
-
+
--color--gray-50: #f3f6fa;
--color--gray-100: #d9e3ee;
--color--gray-500: #8fa5be;
--color--gray-900: #354457;
-
+
--color--green-100: #dcecdc;
--color--green-500: #b8d5b8;
--color--green-900: #8aa48a;
-
+
--color--purple-100: #f0dff6;
--color--purple-500: #d7c4de;
--color--purple-900: #ae8fba;
-
+ --color--purple-1000: #7c3696;
+
--color--red-100: #ffbec0;
--color--red-500: #e5383e;
--color--red-900: #a61f23;
--color--white-500: #ffffff;
-
+
--color--primary-base: var(--color--blue-500);
--color--primary-dark: var(--color--blue-900);
--color--primary-light: var(--color--blue-100);
-
+
--color--accent-base: var(--color--purple-500);
--color--accent-dark: var(--color--purple-900);
--color--accent-light: var(--color--purple-100);
-
+
+ --color--disabled: var(--color--gray-100);
+
/* Semantic colors */
--color--background-base: var(--color--white-500);
--color--background-light: var(--color--gray-100);
--color--background-x-light: var(--color--gray-50);
--color--background-dark: var(--color--primary-base);
-
+
--color--ui-danger-light: var(--color--red-100);
--color--ui-danger-base: var(--color--red-500);
--color--ui-danger-dark: var(--color--red-900);
--color--ui-success-light: var(--color--green-100);
--color--ui-success-base: var(--color--green-500);
--color--ui-success-dark: var(--color--green-900);
-
+
--color--text: var(--color--black-500);
--color--text-inverse: var(--color--white-500);
--color--focus: var(--color--primary-dark);
--color--link: var(--color--primary-base);
--color--link-hover: var(--color--primary-dark);
-
+ --color--current: var(--color--purple-1000);
+
/* Font & typography */
--font-size--50: 0.875rem;
@@ -66,7 +70,7 @@
--font-size--300: 1.5rem;
--font-size--400: 2.25rem;
--font-size--500: 3.75rem;
-
+
--font-size--body: var(--font-size--100);
--font-size--small: var(--font-size--50);
--font-size--ui: var(--font-size--100);
@@ -74,35 +78,38 @@
--font-size--subheader: var(--font-size--300);
--font-size--header: var(--font-size--400);
--font-size--display: var(--font-size--500);
-
+
--font-weight--normal: 400;
--font-weight--bold: 700;
+ --font-style--normal: normal;
+ --font-style--italic: italic;
+
--font-family--body: system-ui, "Arial", "Helvetica", sans-serif;
-
+
--line-height--base: 1.5;
--line-height--tight: 1.2;
/* Borders */
-
+
--border-radius--small: 0.25rem;
--border-radius--base: 0.5rem;
--border-radius--large: 1.5rem;
--border-radius--pill: 4rem;
--border-radius--circle: 100%;
-
+
--border-width--base: 1px;
--border-width--thick: 4px;
-
+
--border--base: var(--border-width--base) solid var(--color--primary-light);
--border--light: var(--border-width--base) solid var(--color--gray-500);
--border--dark: var(--border-width--base) solid var(--color--primary-base);
-
+
/* Container sizing */
--container--base: 50rem;
--container--large: 85rem;
-
+
/* Spacing */
--space--xx-small: 0.25rem;
@@ -114,17 +121,16 @@
--space--x-large: 3rem;
--space--xx-large: 4rem;
-
/* Spacing - Page margins */
-
+
--space--page-margin-inline: var(--space--base);
--space--page-margin-block: var(--space--large);
-
+
/* Transitions */
--transition-duration--base: 0.2s;
--transition-timing--base: ease-in-out;
-
+
/* Z-index */
--z-index--basement: -999999;
diff --git a/src/css/components/_alert.css b/src/css/components/_alert.css
new file mode 100644
index 0000000..3d4ae32
--- /dev/null
+++ b/src/css/components/_alert.css
@@ -0,0 +1,21 @@
+.alert {
+ background-color: var(--color--background-light);
+ color: var(--color--text);
+ padding: var(--space--small);
+}
+.alert p:first-child {
+ margin-top: 0;
+}
+.alert p:last-child {
+ margin-bottom: 0;
+}
+
+.alert--success {
+ background-color: var(--color--ui-success-light);
+ color: var(--color--text);
+}
+
+.alert--danger {
+ background-color: var(--color--ui-danger-light);
+ color: var(--color--text);
+}
diff --git a/src/css/components/_badge.css b/src/css/components/_badge.css
new file mode 100644
index 0000000..b44fc9a
--- /dev/null
+++ b/src/css/components/_badge.css
@@ -0,0 +1,67 @@
+.badge {
+ --badge-background: var(--color--primary-base);
+ --badge-text: var(--color--text-inverse);
+
+ align-items: center;
+ align-self: start;
+ background-color: var(--badge-background);
+ border-radius: var(--border-radius--pill);
+ color: var(--badge-text);
+ display: inline-flex;
+ gap: var(--space--xx-small);
+ justify-self: start;
+ line-height: var(--line-height--tight);
+ font-size: var(--font-size--small);
+ margin: 0;
+ padding: var(--space--xx-small) var(--space--small);
+}
+
+a.badge {
+ text-decoration: none;
+ &:hover,
+ &:focus {
+ background-color: var(--color--primary-dark);
+ color: var(--badge-text);
+ }
+}
+
+.badge--primary {
+ --badge-background: var(--color--primary-base);
+}
+.badge--accent {
+ --badge-background: var(--color--accent-base);
+ --badge-text: var(--color--text);
+}
+.badge--no-break {
+ white-space: nowrap;
+}
+
+a.badge--accent {
+ &:hover,
+ &:focus {
+ background-color: var(--color--accent-dark);
+ color: var(--badge-text);
+ }
+}
+
+.badge__count {
+ border-radius: var(--border-radius--large);
+ background-color: var(--color--text-inverse);
+ color: var(--color--primary-base);
+ font-weight: bold;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding-left: var(--space--x-small);
+ padding-right: var(--space--x-small);
+}
+
+.badge__icon {
+ height: 20px;
+}
+
+.badge-group {
+ display: flex;
+ gap: var(--space--x-small);
+ flex-wrap: wrap;
+}
diff --git a/src/css/components/_loading-indicator.css b/src/css/components/_loading-indicator.css
new file mode 100644
index 0000000..3f2a31d
--- /dev/null
+++ b/src/css/components/_loading-indicator.css
@@ -0,0 +1,23 @@
+.loading-indicator {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.loading-indicator svg {
+ animation: rotate 0.75s linear infinite;
+ max-width: 3rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .loading-indicator svg {
+ animation: rotate 4s linear infinite;
+ }
+}
+
+@keyframes rotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
diff --git a/src/css/components/_page-footer.css b/src/css/components/_page-footer.css
new file mode 100644
index 0000000..a430814
--- /dev/null
+++ b/src/css/components/_page-footer.css
@@ -0,0 +1,25 @@
+.page-footer {
+ display: grid;
+ grid-template-areas:
+ "copyright"
+ "nav";
+ grid-template-columns: 1fr;
+ align-items: center;
+ gap: var(--space--small) var(--space--medium);
+}
+
+.page-copyright {
+ grid-area: copyright;
+ font-size: var(--font-size--small);
+}
+
+.page-footer .footer-nav {
+ grid-area: nav;
+}
+
+@media (min-width: 600px) {
+ .page-footer {
+ grid-template-areas: "copyright nav";
+ grid-template-columns: 1fr auto;
+ }
+}
diff --git a/src/css/components/_page-header.css b/src/css/components/_page-header.css
new file mode 100644
index 0000000..e090c1c
--- /dev/null
+++ b/src/css/components/_page-header.css
@@ -0,0 +1,60 @@
+.page-header {
+ display: grid;
+ grid-template-areas:
+ "logo"
+ "nav"
+ "actions";
+ grid-template-columns: 1fr;
+ align-items: center;
+ gap: var(--space--small) var(--space--medium);
+}
+
+.page-header .header-nav {
+ grid-area: nav;
+}
+
+.header-logo {
+ grid-area: logo;
+}
+
+.header-logo svg,
+.header-logo img {
+ width: 12rem;
+ height: auto;
+}
+
+.header-actions {
+ display: flex;
+ flex-direction: row;
+ gap: var(--space--medium);
+ align-items: center;
+ grid-area: actions;
+}
+
+@media (min-width: 600px) {
+ .page-header {
+ grid-template-areas:
+ "logo actions"
+ "nav .";
+ grid-template-columns: min-content 1fr;
+ }
+
+ .page-header .header-nav {
+ grid-column: span 2;
+ }
+
+ .header-actions {
+ justify-content: flex-end;
+ }
+}
+
+@media (min-width: 1000px) {
+ .page-header {
+ grid-template-areas: "logo nav actions";
+ grid-template-columns: min-content 1fr 18rem;
+ }
+
+ .page-header .header-nav {
+ grid-column: span 1;
+ }
+}
diff --git a/src/css/components/_page-nav.css b/src/css/components/_page-nav.css
new file mode 100644
index 0000000..51749bb
--- /dev/null
+++ b/src/css/components/_page-nav.css
@@ -0,0 +1,17 @@
+.page-nav {
+ display: flex;
+ flex-direction: row;
+ gap: var(--space--medium);
+}
+
+.page-nav a {
+ text-decoration: none;
+}
+.page-nav a:hover,
+.page-nav a:focus {
+ text-decoration: underline;
+}
+
+.page-nav [aria-current="page"] {
+ color: var(--color--current);
+}
diff --git a/src/css/components/_pagination.css b/src/css/components/_pagination.css
new file mode 100644
index 0000000..e263793
--- /dev/null
+++ b/src/css/components/_pagination.css
@@ -0,0 +1,72 @@
+:where(.pagination) .pagination__page[aria-current="page"] {
+ font-weight: bold;
+}
+
+/* PAGY SERIES NAV */
+
+.pagy.series-nav {
+ display: flex;
+}
+:where(.pagy.series-nav) a {
+ padding: var(--space--xx-small);
+}
+
+:where(.pagy.series-nav) a[aria-current="page"] {
+ font-weight: bold;
+}
+
+/* PAGY INPUT NAV */
+
+.pagy.input-nav {
+ display: flex;
+ gap: var(--space--x-small);
+ align-items: center;
+}
+
+.pagy.input-nav label {
+ display: flex;
+ flex-direction: row;
+ font-weight: normal;
+ align-items: center;
+}
+
+/* FANCY PAGINATION */
+
+.pagination--fancy {
+ display: grid;
+ grid-template-areas:
+ "pagelist"
+ "meta";
+ gap: var(--space--small);
+}
+
+:where(.pagination--fancy) .pagination__meta {
+ grid-area: meta;
+ text-align: center;
+}
+
+:where(.pagination--fancy) .pagination__list {
+ display: flex;
+ list-style: none;
+ padding: 0;
+ grid-area: pagelist;
+ justify-content: center;
+ gap: var(--space--x-small);
+}
+
+:where(.pagination--fancy) .pagination__page a,
+:where(.pagination--fancy) .pagination__space,
+:where(.pagination--fancy) .pagination__control--prev a,
+:where(.pagination--fancy) .pagination__control--next a {
+ padding: var(--space--xx-small);
+ display: block;
+}
+
+:where(.pagination--fancy) .pagination__page a {
+ border: var(--border--base);
+ padding: var(--space--xx-small) var(--space--small);
+}
+
+:where(.pagination--fancy) .pagination__page:has([aria-current="page"]) a {
+ outline: var(--border-width--thick) solid var(--color--primary-light);
+}
diff --git a/src/css/components/_search.css b/src/css/components/_search.css
new file mode 100644
index 0000000..658e000
--- /dev/null
+++ b/src/css/components/_search.css
@@ -0,0 +1,11 @@
+search form {
+ display: flex;
+ flex-direction: row;
+ align-items: flex-end;
+ gap: var(--space--x-small);
+}
+
+/* since search has a single field which is always required, we can omit the required indicator */
+search form label:has([type="search"][required]) > span:after {
+ display: none;
+}
diff --git a/src/css/resets/_normalize.css b/src/css/resets/_normalize.css
index a8a4670..0eae331 100644
--- a/src/css/resets/_normalize.css
+++ b/src/css/resets/_normalize.css
@@ -348,7 +348,6 @@ template {
display: none;
}
-
*,
*::before,
*::after {
diff --git a/src/css/utilities/_sizing.css b/src/css/utilities/_sizing.css
new file mode 100644
index 0000000..edf5c2e
--- /dev/null
+++ b/src/css/utilities/_sizing.css
@@ -0,0 +1,11 @@
+.w-full {
+ width: 100%;
+}
+
+.w-auto {
+ width: auto;
+}
+
+.w-screen {
+ width: 100vw;
+}
diff --git a/tests/a11y/pages.spec.ts b/tests/a11y/pages.spec.ts
new file mode 100644
index 0000000..8e11c99
--- /dev/null
+++ b/tests/a11y/pages.spec.ts
@@ -0,0 +1,32 @@
+import { test, expect } from "@playwright/test";
+import AxeBuilder from "@axe-core/playwright";
+import { componentPages, examplePages } from "./pages.js";
+
+test("homepage a11y", async ({ page }) => {
+ const response = await page.goto("/");
+ expect(response?.status()).toBe(200);
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+});
+
+for (const component of componentPages) {
+ test(`${component} - component docs a11y`, async ({ page }) => {
+ const response = await page.goto(`/component-library/${component}.html`);
+ expect(response?.status()).toBe(200);
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toHaveLength(0);
+ });
+}
+
+for (const example of examplePages) {
+ const name = example.replace("/", "-").replace(".html", "");
+ test(`${name} - component example a11y`, async ({ page }) => {
+ const response = await page.goto(`/examples/${example}`);
+ expect(response?.status()).toBe(200);
+ const results = await new AxeBuilder({ page })
+ // example iframes do not have a heading structure
+ .disableRules(["page-has-heading-one"])
+ .analyze();
+ expect(results.violations).toHaveLength(0);
+ });
+}
diff --git a/tests/a11y/pages.ts b/tests/a11y/pages.ts
new file mode 100644
index 0000000..ba7c322
--- /dev/null
+++ b/tests/a11y/pages.ts
@@ -0,0 +1,25 @@
+import { readdirSync } from "fs";
+import { dirname, join, relative } from "path";
+import { fileURLToPath } from "url";
+
+const rootDir = join(dirname(fileURLToPath(import.meta.url)), "../..");
+
+function findHtmlFiles(dir: string, base: string): string[] {
+ return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
+ const fullPath = join(dir, entry.name);
+ if (entry.isDirectory()) return findHtmlFiles(fullPath, base);
+ if (entry.name.endsWith(".html")) return [relative(base, fullPath)];
+ return [];
+ });
+}
+
+const examplesDir = join(rootDir, "site/examples");
+
+export const componentPages = readdirSync(
+ join(rootDir, "site/component-library"),
+)
+ .filter((f) => f.endsWith(".md"))
+ .map((f) => f.replace(".md", ""))
+ .sort();
+
+export const examplePages = findHtmlFiles(examplesDir, examplesDir).sort();
diff --git a/tests/a11y/snapshots.spec.ts b/tests/a11y/snapshots.spec.ts
new file mode 100644
index 0000000..2b82de3
--- /dev/null
+++ b/tests/a11y/snapshots.spec.ts
@@ -0,0 +1,35 @@
+import { test, expect } from "@playwright/test";
+import { examplePages } from "./pages.js";
+
+for (const example of examplePages) {
+ const name = example.replace("/", "-").replace(".html", "");
+
+ test(`${name} - screenshot`, async ({ page }) => {
+ const response = await page.goto(`/examples/${example}`);
+ expect(response?.status()).toBe(200);
+ await expect(page).toHaveScreenshot(`${name}.png`, { fullPage: true });
+ });
+
+ test(`${name} - aria snapshot`, async ({ page }) => {
+ const response = await page.goto(`/examples/${example}`);
+ expect(response?.status()).toBe(200);
+ await expect(page.locator("body")).toMatchAriaSnapshot({
+ name: `${name}.aria.yml`,
+ });
+ });
+}
+
+test.describe.skip("dark mode snapshots", () => {
+ test.use({ colorScheme: "dark" });
+
+ for (const example of examplePages) {
+ const name = example.replace("/", "-").replace(".html", "");
+ test(`${name} - screenshot`, async ({ page }) => {
+ const response = await page.goto(`/examples/${example}`);
+ expect(response?.status()).toBe(200);
+ await expect(page).toHaveScreenshot(`dark-${name}.png`, {
+ fullPage: true,
+ });
+ });
+ }
+});
diff --git a/tests/snapshots/pages.spec.ts-snapshots/alerts-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/alerts-basic-chromium-darwin.png
new file mode 100644
index 0000000..1d7edba
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/alerts-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/alerts-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/alerts-basic.aria.yml
new file mode 100644
index 0000000..b724ca8
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/alerts-basic.aria.yml
@@ -0,0 +1,7 @@
+- main "Info, Success, and Error Alerts":
+ - status:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
+ - status:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
+ - alert:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
diff --git a/tests/snapshots/pages.spec.ts-snapshots/badges-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/badges-basic-chromium-darwin.png
new file mode 100644
index 0000000..5ecb00a
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/badges-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/badges-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/badges-basic.aria.yml
new file mode 100644
index 0000000..061bad7
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/badges-basic.aria.yml
@@ -0,0 +1,15 @@
+- main "Various Badges":
+ - text: /Archived \d+ notifications/
+ - link /\d+ notifications/:
+ - /url: "#"
+ - text: ""
+ - link "New!":
+ - /url: "#"
+ - img "Tag"
+ - text: ""
+ - img "Tag"
+ - text: "Sleeve-length: long"
+ - img "Tag"
+ - text: "Material: cotton"
+ - img "Tag"
+ - text: ""
diff --git a/tests/snapshots/pages.spec.ts-snapshots/buttons-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/buttons-basic-chromium-darwin.png
new file mode 100644
index 0000000..0b0b6c9
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/buttons-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/buttons-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/buttons-basic.aria.yml
new file mode 100644
index 0000000..0cb29fa
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/buttons-basic.aria.yml
@@ -0,0 +1,8 @@
+- main "Buttons Example":
+ - button "A primary button"
+ - button "A secondary button"
+ - button "A disabled primary button" [disabled]
+ - link "A primary button link":
+ - /url: "#"
+ - link "A secondary button link":
+ - /url: "#"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic-chromium-darwin.png
new file mode 100644
index 0000000..d4291da
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic.aria.yml
new file mode 100644
index 0000000..45762de
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/dialogs-basic.aria.yml
@@ -0,0 +1,2 @@
+- main "Basic Modal":
+ - button "Open a modal"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png
new file mode 100644
index 0000000..111ce3e
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in.aria.yml
new file mode 100644
index 0000000..d093010
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/dialogs-slide-in.aria.yml
@@ -0,0 +1,2 @@
+- main "Slide-in Drawer Modal":
+ - button "Open a slide-in modal"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq-chromium-darwin.png
new file mode 100644
index 0000000..3e6f3b2
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq.aria.yml
new file mode 100644
index 0000000..90caf6a
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/disclosures-faq.aria.yml
@@ -0,0 +1,4 @@
+- main "FAQ-style Disclosures":
+ - group: What is my tax filing status?
+ - group: When are taxes due?
+ - group: How should I submit my tax return?
diff --git a/tests/snapshots/pages.spec.ts-snapshots/disclosures-single-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/disclosures-single-chromium-darwin.png
new file mode 100644
index 0000000..020bcc7
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/disclosures-single-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/disclosures-single.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/disclosures-single.aria.yml
new file mode 100644
index 0000000..84cdef2
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/disclosures-single.aria.yml
@@ -0,0 +1,2 @@
+- main "Single Disclosure":
+ - group: What is my tax filing status?
diff --git a/tests/snapshots/pages.spec.ts-snapshots/forms-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/forms-basic-chromium-darwin.png
new file mode 100644
index 0000000..c9507e2
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/forms-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/forms-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/forms-basic.aria.yml
new file mode 100644
index 0000000..20ac705
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/forms-basic.aria.yml
@@ -0,0 +1,37 @@
+- main "Basic Form":
+ - text: "* asterisks denote required fields"
+ - group "Personal information":
+ - text: Personal information First Name*
+ - textbox "First Name*"
+ - text: ""
+ - textbox "Last Name*"
+ - text: ""
+ - textbox "Your email*"
+ - text: ""
+ - textbox "Your birthday*"
+ - group "Do you like ice cream?*":
+ - text: ""
+ - radio "Yes"
+ - text: ""
+ - radio "No"
+ - text: ""
+ - group "What kinds of ice cream do you like?*":
+ - text: ""
+ - checkbox "Vanilla"
+ - text: ""
+ - checkbox "Chocolate"
+ - text: ""
+ - checkbox "Strawberry"
+ - text: ""
+ - checkbox "Nothing (I don't like ice cream)"
+ - text: ""
+ - checkbox "I accept the Terms of Service"
+ - text: I accept the Terms of Service Explain your answers
+ - textbox "Explain your answers"
+ - text: Favorite color*
+ - combobox "Favorite color*"
+ - text: Your browser
+ - combobox "Your browser"
+ - text: Range Input
+ - slider "Range Input"
+ - button "Submit"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png
new file mode 100644
index 0000000..f35ffaf
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic.aria.yml
new file mode 100644
index 0000000..f244564
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/loading-indicator-basic.aria.yml
@@ -0,0 +1,2 @@
+- main "Spinning Loading Indicator":
+ - alert: Loading…
diff --git a/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav-chromium-darwin.png
new file mode 100644
index 0000000..90490ac
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav.aria.yml
new file mode 100644
index 0000000..37f807a
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/page-footer-nav.aria.yml
@@ -0,0 +1,16 @@
+- main "Page Footer with Navigation":
+ - paragraph: /© \d+ thoughtbot, inc\./
+ - navigation "Footer menu":
+ - list:
+ - listitem:
+ - link "Link 1":
+ - /url: "#"
+ - listitem:
+ - link "Link 2":
+ - /url: "#"
+ - listitem:
+ - link "Link 3":
+ - /url: "#"
+ - listitem:
+ - link "Link 4":
+ - /url: "#"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/page-header-nav-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/page-header-nav-chromium-darwin.png
new file mode 100644
index 0000000..d2cc282
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/page-header-nav-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/page-header-nav.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/page-header-nav.aria.yml
new file mode 100644
index 0000000..775c4a1
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/page-header-nav.aria.yml
@@ -0,0 +1,23 @@
+- main "Page Header with Navigation and Skip Navigation Link":
+ - link "Skip to main content":
+ - /url: "#main"
+ - link "thoughtbot":
+ - /url: /
+ - img "thoughtbot"
+ - navigation "Main menu":
+ - list:
+ - listitem:
+ - link "Link 1":
+ - /url: "#"
+ - listitem:
+ - link "Link 2":
+ - /url: "#"
+ - listitem:
+ - link "Link 3":
+ - /url: "#"
+ - listitem:
+ - link "Link 4":
+ - /url: "#"
+ - button "Sign In"
+ - link "Join":
+ - /url: "#"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy-chromium-darwin.png
new file mode 100644
index 0000000..4b0f8dd
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy.aria.yml
new file mode 100644
index 0000000..824f609
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/pagination-fancy.aria.yml
@@ -0,0 +1,29 @@
+- main "Nav with page gaps and metadata":
+ - navigation "Nav with page gaps and metadata - Pages":
+ - list:
+ - listitem:
+ - link "Previous":
+ - /url: "#"
+ - listitem:
+ - link "1":
+ - /url: "#"
+ - listitem:
+ - separator: …
+ - listitem:
+ - link "7":
+ - /url: "#"
+ - listitem:
+ - link "8":
+ - /url: "#"
+ - listitem:
+ - link "9":
+ - /url: "#"
+ - listitem:
+ - separator: …
+ - listitem:
+ - link /\d+/:
+ - /url: "#"
+ - listitem:
+ - link "Next":
+ - /url: "#"
+ - text: ""
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png
new file mode 100644
index 0000000..e5a18b4
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png
new file mode 100644
index 0000000..17295c0
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml
new file mode 100644
index 0000000..f33996a
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml
@@ -0,0 +1,19 @@
+- main "Pagy series nav with limited slots":
+ - navigation "Pagy series nav with limited slots - Pages":
+ - list:
+ - listitem:
+ - link "Previous":
+ - /url: /path?example=123&page=2
+ - text: ""
+ - listitem:
+ - link "2":
+ - /url: /path?example=123&page=2
+ - listitem:
+ - link "3" [disabled]
+ - listitem:
+ - link "4":
+ - /url: /path?example=123&page=4
+ - listitem:
+ - link "Next":
+ - /url: /path?example=123&page=4
+ - text: ""
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series.aria.yml
new file mode 100644
index 0000000..c89a0e4
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/pagination-pagy-series.aria.yml
@@ -0,0 +1,20 @@
+- main "Pagy series nav":
+ - navigation "Pagy series nav - Pages":
+ - link "Previous":
+ - /url: /path?example=123&page=2
+ - text: ""
+ - link "1":
+ - /url: /path?example=123&page=1
+ - link "2":
+ - /url: /path?example=123&page=2
+ - link "3" [disabled]
+ - link "4":
+ - /url: /path?example=123&page=4
+ - link "5":
+ - /url: /path?example=123&page=5
+ - separator [disabled]: …
+ - link /\d+/:
+ - /url: /path?example=123&page=50
+ - link "Next":
+ - /url: /path?example=123&page=4
+ - text: ""
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-simple-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/pagination-simple-chromium-darwin.png
new file mode 100644
index 0000000..ee6af12
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/pagination-simple-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/pagination-simple.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/pagination-simple.aria.yml
new file mode 100644
index 0000000..5efea9c
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/pagination-simple.aria.yml
@@ -0,0 +1,12 @@
+- main "Simple nav":
+ - navigation "Simple nav - Pages":
+ - link "1":
+ - /url: "#"
+ - link "2":
+ - /url: "#"
+ - link "3":
+ - /url: "#"
+ - link "4":
+ - /url: "#"
+ - link "Next →":
+ - /url: "#"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/quotes-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/quotes-basic-chromium-darwin.png
new file mode 100644
index 0000000..f2a46a0
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/quotes-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/quotes-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/quotes-basic.aria.yml
new file mode 100644
index 0000000..39a4ad7
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/quotes-basic.aria.yml
@@ -0,0 +1,6 @@
+- main "Quote with Citation":
+ - figure "— Steve Polito, Senior Developer at thoughtbot":
+ - blockquote:
+ - paragraph: Code less, question more. Some of the most experienced developers I know ask a lot of questions before begining to work on a feature. This often leads to a simpler implementation, or sometimes, no implementation at all since the questioning revealed more research was needed.
+ - paragraph: I find that this “question first” mindset is helpful in other areas of consulting, and life as well. It provides an opportunity for others to share their ideas and feel heard.
+ - text: ""
diff --git a/tests/snapshots/pages.spec.ts-snapshots/search-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/search-basic-chromium-darwin.png
new file mode 100644
index 0000000..7bb0597
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/search-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/search-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/search-basic.aria.yml
new file mode 100644
index 0000000..41cff16
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/search-basic.aria.yml
@@ -0,0 +1,5 @@
+- main "Basic Search":
+ - search "Site-wide":
+ - text: Search this site
+ - searchbox "Search this site"
+ - button "Search"
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/tables-basic-chromium-darwin.png
new file mode 100644
index 0000000..1897132
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/tables-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/tables-basic.aria.yml
new file mode 100644
index 0000000..a859392
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/tables-basic.aria.yml
@@ -0,0 +1,21 @@
+- main "Basic Table":
+ - table "Monthly spending":
+ - caption: Monthly spending
+ - rowgroup:
+ - row "Month Savings":
+ - columnheader "Month"
+ - columnheader "Savings"
+ - rowgroup:
+ - row /January \$\d+/:
+ - cell "January"
+ - cell /\$\d+/
+ - row /February \$\d+/:
+ - cell "February"
+ - cell /\$\d+/
+ - row /March \$\d+/:
+ - cell "March"
+ - cell /\$\d+/
+ - rowgroup:
+ - row /Sum \$\d+/:
+ - cell "Sum"
+ - cell /\$\d+/
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-overflow-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/tables-overflow-chromium-darwin.png
new file mode 100644
index 0000000..f5e8455
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/tables-overflow-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-overflow.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/tables-overflow.aria.yml
new file mode 100644
index 0000000..82acb44
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/tables-overflow.aria.yml
@@ -0,0 +1,40 @@
+- main "Overflow Scroll":
+ - table "Monthly spending with overflow container for smaller viewports":
+ - caption: Monthly spending with overflow container for smaller viewports
+ - rowgroup:
+ - row "Category Planned Actual Difference":
+ - columnheader "Category"
+ - columnheader "Planned"
+ - columnheader "Actual"
+ - columnheader "Difference"
+ - rowgroup:
+ - row /Rent\/Mortgage \$\d+,\d+ \$\d+,\d+ \$0/:
+ - cell "Rent/Mortgage"
+ - cell /\$\d+,\d+/
+ - cell /\$\d+,\d+/
+ - cell "$0"
+ - row /Utilities \$\d+ \$\d+ -\$\d+/:
+ - cell "Utilities"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
+ - row /Groceries \$\d+ \$\d+ \+\$\d+/:
+ - cell "Groceries"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /\+\$\d+/
+ - row /Transportation \$\d+ \$\d+ -\$\d+/:
+ - cell "Transportation"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
+ - row /Entertainment \$\d+ \$\d+ \+\$\d+/:
+ - cell "Entertainment"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /\+\$\d+/
+ - row /Miscellaneous \$\d+ \$\d+ -\$\d+/:
+ - cell "Miscellaneous"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-striped-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/tables-striped-chromium-darwin.png
new file mode 100644
index 0000000..8537a81
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/tables-striped-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/tables-striped.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/tables-striped.aria.yml
new file mode 100644
index 0000000..718c1f0
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/tables-striped.aria.yml
@@ -0,0 +1,21 @@
+- main "Striped Table":
+ - table "Monthly spending":
+ - caption: Monthly spending
+ - rowgroup:
+ - row "Month Savings":
+ - columnheader "Month"
+ - columnheader "Savings"
+ - rowgroup:
+ - row /January \$\d+/:
+ - cell "January"
+ - cell /\$\d+/
+ - row /February \$\d+/:
+ - cell "February"
+ - cell /\$\d+/
+ - row /March \$\d+/:
+ - cell "March"
+ - cell /\$\d+/
+ - rowgroup:
+ - row /Sum \$\d+/:
+ - cell "Sum"
+ - cell /\$\d+/
diff --git a/tests/snapshots/pages.spec.ts-snapshots/typography-basic-chromium-darwin.png b/tests/snapshots/pages.spec.ts-snapshots/typography-basic-chromium-darwin.png
new file mode 100644
index 0000000..324dd1f
Binary files /dev/null and b/tests/snapshots/pages.spec.ts-snapshots/typography-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/pages.spec.ts-snapshots/typography-basic.aria.yml b/tests/snapshots/pages.spec.ts-snapshots/typography-basic.aria.yml
new file mode 100644
index 0000000..4b0f277
--- /dev/null
+++ b/tests/snapshots/pages.spec.ts-snapshots/typography-basic.aria.yml
@@ -0,0 +1,16 @@
+- main "Basic Typography":
+ - heading "First-level heading" [level=1]
+ - heading "Second-level heading" [level=2]
+ - heading "Third-level heading" [level=3]
+ - heading "Fourth-level heading" [level=4]
+ - paragraph:
+ - text: A paragraph right here. Lorem ipsum dolor sit amet,
+ - strong: consectetur adipiscing elit.
+ - text: Sed lectus nunc,
+ - link "faucibus at tempus in, mattis eu tellus":
+ - /url: "#"
+ - text: ""
+ - emphasis: eu tellus
+ - text: . Quisque non neque vitae arcu aliquam scelerisque vitae id mauris. Suspendisse potenti.
+ - separator
+ - paragraph: Small text here that is legalese.
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic-chromium-darwin.png
new file mode 100644
index 0000000..1d7edba
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic.aria.yml
new file mode 100644
index 0000000..b724ca8
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/alerts-basic.aria.yml
@@ -0,0 +1,7 @@
+- main "Info, Success, and Error Alerts":
+ - status:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
+ - status:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
+ - alert:
+ - paragraph: We’ve been trying to reach you about your car’s extended warranty.
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic-chromium-darwin.png
new file mode 100644
index 0000000..5ecb00a
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic.aria.yml
new file mode 100644
index 0000000..061bad7
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/badges-basic.aria.yml
@@ -0,0 +1,15 @@
+- main "Various Badges":
+ - text: /Archived \d+ notifications/
+ - link /\d+ notifications/:
+ - /url: "#"
+ - text: ""
+ - link "New!":
+ - /url: "#"
+ - img "Tag"
+ - text: ""
+ - img "Tag"
+ - text: "Sleeve-length: long"
+ - img "Tag"
+ - text: "Material: cotton"
+ - img "Tag"
+ - text: ""
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic-chromium-darwin.png
new file mode 100644
index 0000000..0b0b6c9
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic.aria.yml
new file mode 100644
index 0000000..0cb29fa
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/buttons-basic.aria.yml
@@ -0,0 +1,8 @@
+- main "Buttons Example":
+ - button "A primary button"
+ - button "A secondary button"
+ - button "A disabled primary button" [disabled]
+ - link "A primary button link":
+ - /url: "#"
+ - link "A secondary button link":
+ - /url: "#"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic-chromium-darwin.png
new file mode 100644
index 0000000..d4291da
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic.aria.yml
new file mode 100644
index 0000000..45762de
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-basic.aria.yml
@@ -0,0 +1,2 @@
+- main "Basic Modal":
+ - button "Open a modal"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png
new file mode 100644
index 0000000..111ce3e
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in.aria.yml
new file mode 100644
index 0000000..d093010
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/dialogs-slide-in.aria.yml
@@ -0,0 +1,2 @@
+- main "Slide-in Drawer Modal":
+ - button "Open a slide-in modal"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq-chromium-darwin.png
new file mode 100644
index 0000000..3e6f3b2
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq.aria.yml
new file mode 100644
index 0000000..90caf6a
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-faq.aria.yml
@@ -0,0 +1,4 @@
+- main "FAQ-style Disclosures":
+ - group: What is my tax filing status?
+ - group: When are taxes due?
+ - group: How should I submit my tax return?
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single-chromium-darwin.png
new file mode 100644
index 0000000..020bcc7
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single.aria.yml
new file mode 100644
index 0000000..84cdef2
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/disclosures-single.aria.yml
@@ -0,0 +1,2 @@
+- main "Single Disclosure":
+ - group: What is my tax filing status?
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic-chromium-darwin.png
new file mode 100644
index 0000000..359d02c
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic.aria.yml
new file mode 100644
index 0000000..20ac705
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/forms-basic.aria.yml
@@ -0,0 +1,37 @@
+- main "Basic Form":
+ - text: "* asterisks denote required fields"
+ - group "Personal information":
+ - text: Personal information First Name*
+ - textbox "First Name*"
+ - text: ""
+ - textbox "Last Name*"
+ - text: ""
+ - textbox "Your email*"
+ - text: ""
+ - textbox "Your birthday*"
+ - group "Do you like ice cream?*":
+ - text: ""
+ - radio "Yes"
+ - text: ""
+ - radio "No"
+ - text: ""
+ - group "What kinds of ice cream do you like?*":
+ - text: ""
+ - checkbox "Vanilla"
+ - text: ""
+ - checkbox "Chocolate"
+ - text: ""
+ - checkbox "Strawberry"
+ - text: ""
+ - checkbox "Nothing (I don't like ice cream)"
+ - text: ""
+ - checkbox "I accept the Terms of Service"
+ - text: I accept the Terms of Service Explain your answers
+ - textbox "Explain your answers"
+ - text: Favorite color*
+ - combobox "Favorite color*"
+ - text: Your browser
+ - combobox "Your browser"
+ - text: Range Input
+ - slider "Range Input"
+ - button "Submit"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png
new file mode 100644
index 0000000..f35ffaf
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic.aria.yml
new file mode 100644
index 0000000..f244564
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/loading-indicator-basic.aria.yml
@@ -0,0 +1,2 @@
+- main "Spinning Loading Indicator":
+ - alert: Loading…
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav-chromium-darwin.png
new file mode 100644
index 0000000..90490ac
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav.aria.yml
new file mode 100644
index 0000000..37f807a
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/page-footer-nav.aria.yml
@@ -0,0 +1,16 @@
+- main "Page Footer with Navigation":
+ - paragraph: /© \d+ thoughtbot, inc\./
+ - navigation "Footer menu":
+ - list:
+ - listitem:
+ - link "Link 1":
+ - /url: "#"
+ - listitem:
+ - link "Link 2":
+ - /url: "#"
+ - listitem:
+ - link "Link 3":
+ - /url: "#"
+ - listitem:
+ - link "Link 4":
+ - /url: "#"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav-chromium-darwin.png
new file mode 100644
index 0000000..d2cc282
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav.aria.yml
new file mode 100644
index 0000000..775c4a1
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/page-header-nav.aria.yml
@@ -0,0 +1,23 @@
+- main "Page Header with Navigation and Skip Navigation Link":
+ - link "Skip to main content":
+ - /url: "#main"
+ - link "thoughtbot":
+ - /url: /
+ - img "thoughtbot"
+ - navigation "Main menu":
+ - list:
+ - listitem:
+ - link "Link 1":
+ - /url: "#"
+ - listitem:
+ - link "Link 2":
+ - /url: "#"
+ - listitem:
+ - link "Link 3":
+ - /url: "#"
+ - listitem:
+ - link "Link 4":
+ - /url: "#"
+ - button "Sign In"
+ - link "Join":
+ - /url: "#"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy-chromium-darwin.png
new file mode 100644
index 0000000..4b0f8dd
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy.aria.yml
new file mode 100644
index 0000000..824f609
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-fancy.aria.yml
@@ -0,0 +1,29 @@
+- main "Nav with page gaps and metadata":
+ - navigation "Nav with page gaps and metadata - Pages":
+ - list:
+ - listitem:
+ - link "Previous":
+ - /url: "#"
+ - listitem:
+ - link "1":
+ - /url: "#"
+ - listitem:
+ - separator: …
+ - listitem:
+ - link "7":
+ - /url: "#"
+ - listitem:
+ - link "8":
+ - /url: "#"
+ - listitem:
+ - link "9":
+ - /url: "#"
+ - listitem:
+ - separator: …
+ - listitem:
+ - link /\d+/:
+ - /url: "#"
+ - listitem:
+ - link "Next":
+ - /url: "#"
+ - text: ""
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png
new file mode 100644
index 0000000..e5a18b4
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png
new file mode 100644
index 0000000..17295c0
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml
new file mode 100644
index 0000000..f33996a
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series-limited.aria.yml
@@ -0,0 +1,19 @@
+- main "Pagy series nav with limited slots":
+ - navigation "Pagy series nav with limited slots - Pages":
+ - list:
+ - listitem:
+ - link "Previous":
+ - /url: /path?example=123&page=2
+ - text: ""
+ - listitem:
+ - link "2":
+ - /url: /path?example=123&page=2
+ - listitem:
+ - link "3" [disabled]
+ - listitem:
+ - link "4":
+ - /url: /path?example=123&page=4
+ - listitem:
+ - link "Next":
+ - /url: /path?example=123&page=4
+ - text: ""
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series.aria.yml
new file mode 100644
index 0000000..c89a0e4
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-pagy-series.aria.yml
@@ -0,0 +1,20 @@
+- main "Pagy series nav":
+ - navigation "Pagy series nav - Pages":
+ - link "Previous":
+ - /url: /path?example=123&page=2
+ - text: ""
+ - link "1":
+ - /url: /path?example=123&page=1
+ - link "2":
+ - /url: /path?example=123&page=2
+ - link "3" [disabled]
+ - link "4":
+ - /url: /path?example=123&page=4
+ - link "5":
+ - /url: /path?example=123&page=5
+ - separator [disabled]: …
+ - link /\d+/:
+ - /url: /path?example=123&page=50
+ - link "Next":
+ - /url: /path?example=123&page=4
+ - text: ""
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple-chromium-darwin.png
new file mode 100644
index 0000000..ee6af12
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple.aria.yml
new file mode 100644
index 0000000..5efea9c
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/pagination-simple.aria.yml
@@ -0,0 +1,12 @@
+- main "Simple nav":
+ - navigation "Simple nav - Pages":
+ - link "1":
+ - /url: "#"
+ - link "2":
+ - /url: "#"
+ - link "3":
+ - /url: "#"
+ - link "4":
+ - /url: "#"
+ - link "Next →":
+ - /url: "#"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic-chromium-darwin.png
new file mode 100644
index 0000000..f2a46a0
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic.aria.yml
new file mode 100644
index 0000000..39a4ad7
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/quotes-basic.aria.yml
@@ -0,0 +1,6 @@
+- main "Quote with Citation":
+ - figure "— Steve Polito, Senior Developer at thoughtbot":
+ - blockquote:
+ - paragraph: Code less, question more. Some of the most experienced developers I know ask a lot of questions before begining to work on a feature. This often leads to a simpler implementation, or sometimes, no implementation at all since the questioning revealed more research was needed.
+ - paragraph: I find that this “question first” mindset is helpful in other areas of consulting, and life as well. It provides an opportunity for others to share their ideas and feel heard.
+ - text: ""
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/search-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/search-basic-chromium-darwin.png
new file mode 100644
index 0000000..7bb0597
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/search-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/search-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/search-basic.aria.yml
new file mode 100644
index 0000000..41cff16
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/search-basic.aria.yml
@@ -0,0 +1,5 @@
+- main "Basic Search":
+ - search "Site-wide":
+ - text: Search this site
+ - searchbox "Search this site"
+ - button "Search"
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic-chromium-darwin.png
new file mode 100644
index 0000000..1897132
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic.aria.yml
new file mode 100644
index 0000000..a859392
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/tables-basic.aria.yml
@@ -0,0 +1,21 @@
+- main "Basic Table":
+ - table "Monthly spending":
+ - caption: Monthly spending
+ - rowgroup:
+ - row "Month Savings":
+ - columnheader "Month"
+ - columnheader "Savings"
+ - rowgroup:
+ - row /January \$\d+/:
+ - cell "January"
+ - cell /\$\d+/
+ - row /February \$\d+/:
+ - cell "February"
+ - cell /\$\d+/
+ - row /March \$\d+/:
+ - cell "March"
+ - cell /\$\d+/
+ - rowgroup:
+ - row /Sum \$\d+/:
+ - cell "Sum"
+ - cell /\$\d+/
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow-chromium-darwin.png
new file mode 100644
index 0000000..f5e8455
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow.aria.yml
new file mode 100644
index 0000000..82acb44
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/tables-overflow.aria.yml
@@ -0,0 +1,40 @@
+- main "Overflow Scroll":
+ - table "Monthly spending with overflow container for smaller viewports":
+ - caption: Monthly spending with overflow container for smaller viewports
+ - rowgroup:
+ - row "Category Planned Actual Difference":
+ - columnheader "Category"
+ - columnheader "Planned"
+ - columnheader "Actual"
+ - columnheader "Difference"
+ - rowgroup:
+ - row /Rent\/Mortgage \$\d+,\d+ \$\d+,\d+ \$0/:
+ - cell "Rent/Mortgage"
+ - cell /\$\d+,\d+/
+ - cell /\$\d+,\d+/
+ - cell "$0"
+ - row /Utilities \$\d+ \$\d+ -\$\d+/:
+ - cell "Utilities"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
+ - row /Groceries \$\d+ \$\d+ \+\$\d+/:
+ - cell "Groceries"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /\+\$\d+/
+ - row /Transportation \$\d+ \$\d+ -\$\d+/:
+ - cell "Transportation"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
+ - row /Entertainment \$\d+ \$\d+ \+\$\d+/:
+ - cell "Entertainment"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /\+\$\d+/
+ - row /Miscellaneous \$\d+ \$\d+ -\$\d+/:
+ - cell "Miscellaneous"
+ - cell /\$\d+/
+ - cell /\$\d+/
+ - cell /-\$\d+/
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped-chromium-darwin.png
new file mode 100644
index 0000000..8537a81
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped.aria.yml
new file mode 100644
index 0000000..718c1f0
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/tables-striped.aria.yml
@@ -0,0 +1,21 @@
+- main "Striped Table":
+ - table "Monthly spending":
+ - caption: Monthly spending
+ - rowgroup:
+ - row "Month Savings":
+ - columnheader "Month"
+ - columnheader "Savings"
+ - rowgroup:
+ - row /January \$\d+/:
+ - cell "January"
+ - cell /\$\d+/
+ - row /February \$\d+/:
+ - cell "February"
+ - cell /\$\d+/
+ - row /March \$\d+/:
+ - cell "March"
+ - cell /\$\d+/
+ - rowgroup:
+ - row /Sum \$\d+/:
+ - cell "Sum"
+ - cell /\$\d+/
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic-chromium-darwin.png b/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic-chromium-darwin.png
new file mode 100644
index 0000000..324dd1f
Binary files /dev/null and b/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic-chromium-darwin.png differ
diff --git a/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic.aria.yml b/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic.aria.yml
new file mode 100644
index 0000000..4b0f277
--- /dev/null
+++ b/tests/snapshots/snapshots.spec.ts-snapshots/typography-basic.aria.yml
@@ -0,0 +1,16 @@
+- main "Basic Typography":
+ - heading "First-level heading" [level=1]
+ - heading "Second-level heading" [level=2]
+ - heading "Third-level heading" [level=3]
+ - heading "Fourth-level heading" [level=4]
+ - paragraph:
+ - text: A paragraph right here. Lorem ipsum dolor sit amet,
+ - strong: consectetur adipiscing elit.
+ - text: Sed lectus nunc,
+ - link "faucibus at tempus in, mattis eu tellus":
+ - /url: "#"
+ - text: ""
+ - emphasis: eu tellus
+ - text: . Quisque non neque vitae arcu aliquam scelerisque vitae id mauris. Suspendisse potenti.
+ - separator
+ - paragraph: Small text here that is legalese.