<testsuites id="" name="" tests="139" failures="0" skipped="0" errors="0" time="69.059642">
<testsuite name="config.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="29" failures="0" skipped="0" time="28.759" errors="0">
<testcase name="shows a read-only machine summary, with a link to edit it" classname="config.spec.ts" time="2.782">
</testcase>
<testcase name="shows every pile in the bundled chart" classname="config.spec.ts" time="0.488">
</testcase>
<testcase name="each chart card exposes an h3 heading that tracks the pile name" classname="config.spec.ts" time="0.318">
</testcase>
<testcase name="a cited row&apos;s card shows the source as a link, read-only" classname="config.spec.ts" time="0.36">
</testcase>
<testcase name="the default is chart order, not sorted" classname="config.spec.ts" time="0.3">
</testcase>
<testcase name="sorting by pile reorders the cards, and an in-progress edit survives it" classname="config.spec.ts" time="0.575">
</testcase>
<testcase name="sort-by is a real radiogroup: arrow keys move selection via native radio behaviour" classname="config.spec.ts" time="0.443">
</testcase>
<testcase name="the nav reaches the app&apos;s own three pages, each marking only itself active, and Docs starts inactive" classname="config.spec.ts" time="0.942">
</testcase>
<testcase name="the footer&apos;s legal links reach real pages with the site&apos;s own chrome" classname="config.spec.ts" time="0.801">
</testcase>
<testcase name="the footer shows the current version, linked to the site&apos;s own changelog page" classname="config.spec.ts" time="2.895">
</testcase>
<testcase name="a skip-to-content link is the first tab stop on every page, and lands focus on main" classname="config.spec.ts" time="0.834">
</testcase>
<testcase name="the nav doesn&apos;t force horizontal scroll at a 320px viewport" classname="config.spec.ts" time="0.359">
</testcase>
<testcase name="a chart card&apos;s title never crowds into the duration field, even at a narrow viewport (en)" classname="config.spec.ts" time="0.257">
</testcase>
<testcase name="a chart card&apos;s title never crowds into the duration field, even at a narrow viewport (de)" classname="config.spec.ts" time="0.263">
</testcase>
<testcase name="a chart card&apos;s title never crowds into the duration field, even at a narrow viewport (tr)" classname="config.spec.ts" time="0.3">
</testcase>
<testcase name="a chart card&apos;s title never crowds into the duration field, even at a narrow viewport (ar)" classname="config.spec.ts" time="0.271">
</testcase>
<testcase name="a chart card&apos;s title never crowds into the duration field, even at a narrow viewport (zh)" classname="config.spec.ts" time="0.287">
</testcase>
<testcase name="editing a chart field and saving applies it across the site" classname="config.spec.ts" time="0.739">
</testcase>
<testcase name="an invalid edit names the row and column, and isn&apos;t applied" classname="config.spec.ts" time="0.482">
</testcase>
<testcase name="an invalid duration is flagged inline and blocks save" classname="config.spec.ts" time="0.477">
</testcase>
<testcase name="a valid duration round-trips through save and reload, ~ prefix included" classname="config.spec.ts" time="0.689">
</testcase>
<testcase name="chips and pills all apply and download correctly" classname="config.spec.ts" time="0.733">
</testcase>
<testcase name="toggling ironing off hides the iron setting chips and clears the value" classname="config.spec.ts" time="0.499">
</testcase>
<testcase name="an edit survives a reload" classname="config.spec.ts" time="0.778">
</testcase>
<testcase name="downloading the config from the config page reflects an edit" classname="config.spec.ts" time="0.554">
</testcase>
<testcase name="uploading a config, downloading it back out, and clearing it round-trip" classname="config.spec.ts" time="0.581">
</testcase>
<testcase name="an uploaded config with a value the machine doesn&apos;t have names the row and column" classname="config.spec.ts" time="0.382">
</testcase>
<testcase name="the chart cards load in batches behind a keyboard-reachable Show more button (#348)" classname="config.spec.ts" time="9.786">
<properties>
<property name="slow" value="">
</property>
</properties>
</testcase>
<testcase name="sorting keeps the revealed cards, in sorted order (#348)" classname="config.spec.ts" time="0.584">
</testcase>
</testsuite>
<testsuite name="delivery.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="4" failures="0" skipped="0" time="0.076" errors="0">
<testcase name="pages › / revalidates and is compressed" classname="delivery.spec.ts" time="0.03">
</testcase>
<testcase name="pages › /config/ revalidates and is compressed" classname="delivery.spec.ts" time="0.015">
</testcase>
<testcase name="pages › /docs/ revalidates and is compressed" classname="delivery.spec.ts" time="0.01">
</testcase>
<testcase name="fingerprinted assets › are cached for a year and compressed" classname="delivery.spec.ts" time="0.021">
</testcase>
</testsuite>
<testsuite name="docs.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="6" failures="0" skipped="0" time="2.514" errors="0">
<testcase name="the header nav&apos;s Docs link reaches the docs site from the app&apos;s own chrome" classname="docs.spec.ts" time="0.365">
</testcase>
<testcase name="the docs sidebar reaches every page, and the overview page passes an accessibility scan" classname="docs.spec.ts" time="0.704">
</testcase>
<testcase name="a docs page has the same header and footer chrome as the rest of the site" classname="docs.spec.ts" time="0.24">
</testcase>
<testcase name="the header and sidebar scroll away with the page, matching the rest of the site — not pinned like Starlight&apos;s default" classname="docs.spec.ts" time="0.337">
</testcase>
<testcase name="the mobile menu toggle opens the sidebar and reaches another page — without breaking the sibling selector that shows it" classname="docs.spec.ts" time="0.448">
</testcase>
<testcase name="an explicit theme choice made on the main site carries to docs pages, no flash of the other mode" classname="docs.spec.ts" time="0.42">
</testcase>
</testsuite>
<testsuite name="i18n.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="18" failures="0" skipped="0" time="14.085" errors="0">
<testcase name="the language switcher lists every locale, in its own name, and switches the current page" classname="i18n.spec.ts" time="0.355">
</testcase>
<testcase name="the washing-loads and washer/iron editors are translated too, and stay in their own locale across nav" classname="i18n.spec.ts" time="0.706">
</testcase>
<testcase name="the Docs link is locale-aware for every locale, Starlight-routed or not" classname="i18n.spec.ts" time="0.655">
</testcase>
<testcase name="switching language on a translated docs page goes to the same page in that language, jive included" classname="i18n.spec.ts" time="0.477">
</testcase>
<testcase name="jive&apos;s own docs render the site&apos;s chrome, a sidebar, Prev/Next, and pass an accessibility scan" classname="i18n.spec.ts" time="1.091">
</testcase>
<testcase name="linkedin&apos;s own docs render the site&apos;s chrome, a sidebar, Prev/Next, and pass an accessibility scan" classname="i18n.spec.ts" time="1.081">
</testcase>
<testcase name="Arabic renders right-to-left — the app&apos;s own chrome and Starlight&apos;s docs alike" classname="i18n.spec.ts" time="0.88">
</testcase>
<testcase name="Chinese chrome and docs are translated, and the bundled demo data comes out in Chinese too" classname="i18n.spec.ts" time="1.007">
</testcase>
<testcase name="the AI-translation banner only shows on non-English locales, and hreflang alternates cover every locale" classname="i18n.spec.ts" time="0.399">
</testcase>
<testcase name="the banner stays pinned to the top of the viewport while scrolling, instead of scrolling away" classname="i18n.spec.ts" time="0.416">
</testcase>
<testcase name="the banner auto-dismisses after 10 seconds" classname="i18n.spec.ts" time="0.348">
</testcase>
<testcase name="the banner can be dismissed early via its close button" classname="i18n.spec.ts" time="0.365">
</testcase>
<testcase name="the banner can be dismissed early via a click elsewhere on the page" classname="i18n.spec.ts" time="0.337">
</testcase>
<testcase name="the banner shows once per locale, not on every page load — but a different locale still gets its own" classname="i18n.spec.ts" time="0.728">
</testcase>
<testcase name="a translated page with the banner visible passes an accessibility scan" classname="i18n.spec.ts" time="1.386">
</testcase>
<testcase name="docs content is translated too, with Starlight&apos;s own chrome translated alongside it, and cross-links stay in the same locale" classname="i18n.spec.ts" time="1.357">
</testcase>
<testcase name="the bundled example chart and machine are translated too, not just the chrome around them" classname="i18n.spec.ts" time="0.637">
</testcase>
<testcase name="the GitHub ribbon&apos;s translated text never wraps to a second line, in every locale" classname="i18n.spec.ts" time="1.86">
</testcase>
</testsuite>
<testsuite name="keyboard-nav.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="10" failures="0" skipped="0" time="7.149" errors="0">
<testcase name="j scrolls down and k scrolls back up" classname="keyboard-nav.spec.ts" time="0.423">
</testcase>
<testcase name="gg jumps to the top and G jumps to the bottom" classname="keyboard-nav.spec.ts" time="2.632">
</testcase>
<testcase name="two g presses too far apart don&apos;t count as gg" classname="keyboard-nav.spec.ts" time="1.187">
</testcase>
<testcase name="/ focuses the pile search field without typing a slash into it" classname="keyboard-nav.spec.ts" time="0.285">
</testcase>
<testcase name="the bindings do nothing while a text field already has focus" classname="keyboard-nav.spec.ts" time="0.333">
</testcase>
<testcase name="Shift-? opens a help overlay listing every binding, and it passes an accessibility scan" classname="keyboard-nav.spec.ts" time="0.934">
</testcase>
<testcase name="Escape closes the help overlay" classname="keyboard-nav.spec.ts" time="0.285">
</testcase>
<testcase name="clicking outside the help overlay closes it, clicking inside doesn&apos;t" classname="keyboard-nav.spec.ts" time="0.387">
</testcase>
<testcase name="the visible ? button opens the same overlay, for a mouse or screen-reader user" classname="keyboard-nav.spec.ts" time="0.348">
</testcase>
<testcase name="the bindings reach other pages too, not just the front page" classname="keyboard-nav.spec.ts" time="0.335">
</testcase>
</testsuite>
<testsuite name="machine.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="10" failures="0" skipped="0" time="7.866" errors="0">
<testcase name="shows the bundled washer and iron settings, under a heading that says what the page is for" classname="machine.spec.ts" time="1.671">
</testcase>
<testcase name="every washer field and the iron settings table is reachable by heading navigation" classname="machine.spec.ts" time="0.229">
</testcase>
<testcase name="adding, reordering and removing a programme" classname="machine.spec.ts" time="0.37">
</testcase>
<testcase name="an edit that breaks the chart&apos;s validity against the machine is called out" classname="machine.spec.ts" time="0.319">
</testcase>
<testcase name="editing the washer and saving applies across the site" classname="machine.spec.ts" time="0.513">
</testcase>
<testcase name="downloading the config from the washer &amp; iron page reflects a saved edit, not a draft" classname="machine.spec.ts" time="0.379">
</testcase>
<testcase name="resetting to the bundled machine preserves the active chart" classname="machine.spec.ts" time="0.918">
</testcase>
<testcase name="below sm: the iron settings render as cards, not the table, and never force horizontal scroll" classname="machine.spec.ts" time="2.776">
</testcase>
<testcase name="at sm: and above the iron settings render as the table, cards hidden" classname="machine.spec.ts" time="0.231">
</testcase>
<testcase name="editing an iron setting through the mobile card layout behaves identically to the table" classname="machine.spec.ts" time="0.46">
</testcase>
</testsuite>
<testsuite name="mobile-actions.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="4" failures="0" skipped="0" time="4.563" errors="0">
<testcase name="on a phone the download and share actions sit behind one menu button, in one row" classname="mobile-actions.spec.ts" time="0.317">
</testcase>
<testcase name="the menu button opens the three actions and closes them again" classname="mobile-actions.spec.ts" time="1.317">
</testcase>
<testcase name="Escape closes the menu and returns focus to its button" classname="mobile-actions.spec.ts" time="0.351">
</testcase>
<testcase name="a download started from the menu still produces the PDF" classname="mobile-actions.spec.ts" time="2.578">
</testcase>
</testsuite>
<testsuite name="mobile-card.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="5" failures="0" skipped="0" time="2.742" errors="0">
<testcase name="the card leads with programme, temperature and spin, and temperature and spin are its largest text" classname="mobile-card.spec.ts" time="0.305">
</testcase>
<testcase name="the unit is never clipped: the temperature and spin read in full" classname="mobile-card.spec.ts" time="0.332">
</testcase>
<testcase name="a card title wraps to at most two lines" classname="mobile-card.spec.ts" time="0.425">
</testcase>
<testcase name="detergent, drying, ironing and notes are collapsed until asked for" classname="mobile-card.spec.ts" time="1.32">
</testcase>
<testcase name="every control on a card is at least 44x44, details closed and open" classname="mobile-card.spec.ts" time="0.36">
</testcase>
</testsuite>
<testsuite name="mobile-config.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="5" failures="0" skipped="0" time="3.667" errors="0">
<testcase name="an editable card groups programme, temperature and spin, and puts them first (#302)" classname="mobile-config.spec.ts" time="0.389">
</testcase>
<testcase name="every other field stays open and reachable without extra taps (#302)" classname="mobile-config.spec.ts" time="0.342">
</testcase>
<testcase name="every control on a /config card is at least 44x44 at 390px (#302)" classname="mobile-config.spec.ts" time="0.286">
</testcase>
<testcase name="the page never scrolls sideways at 390px" classname="mobile-config.spec.ts" time="0.305">
</testcase>
<testcase name="the axe scan passes on /config at 390px" classname="mobile-config.spec.ts" time="2.345">
</testcase>
</testsuite>
<testsuite name="mobile-filters.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="4" failures="0" skipped="0" time="2.18" errors="0">
<testcase name="on load the filters are a search box, three category pills and one Filters button" classname="mobile-filters.spec.ts" time="0.252">
</testcase>
<testcase name="the Filters button reveals the programme, temperature, spin and detergent filters" classname="mobile-filters.spec.ts" time="0.371">
</testcase>
<testcase name="a category pill picks the cut, is announced as pressed, and lands in the URL" classname="mobile-filters.spec.ts" time="0.28">
</testcase>
<testcase name="every filter control is at least 44x44, panel closed and open" classname="mobile-filters.spec.ts" time="1.277">
</testcase>
</testsuite>
<testsuite name="mobile-header.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="3" failures="0" skipped="0" time="2.048" errors="0">
<testcase name="the phone header shows the brand, a menu button and the theme toggle, nothing else" classname="mobile-header.spec.ts" time="0.329">
</testcase>
<testcase name="the menu button opens the nav, language, upload and GitHub link, and closes again" classname="mobile-header.spec.ts" time="1.414">
</testcase>
<testcase name="every header control is at least 44x44, menu closed and open" classname="mobile-header.spec.ts" time="0.305">
</testcase>
</testsuite>
<testsuite name="mobile-home.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="2" failures="0" skipped="0" time="1.762" errors="0">
<testcase name="a card&apos;s programme, temperature and spin show on the first screen, without scrolling past the filters" classname="mobile-home.spec.ts" time="0.224">
</testcase>
<testcase name="the redesigned home page passes the axe scan" classname="mobile-home.spec.ts" time="1.538">
</testcase>
</testsuite>
<testsuite name="not-found.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="4" failures="0" skipped="0" time="1.315" errors="0">
<testcase name="/nope answers 404 with the site&apos;s own page" classname="not-found.spec.ts" time="0.241">
</testcase>
<testcase name="/docs/nope answers 404 with the site&apos;s own page" classname="not-found.spec.ts" time="0.226">
</testcase>
<testcase name="/de/nope answers 404 with the site&apos;s own page" classname="not-found.spec.ts" time="0.2">
</testcase>
<testcase name="the 404 page has no accessibility violations" classname="not-found.spec.ts" time="0.648">
</testcase>
</testsuite>
<testsuite name="sheet.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="28" failures="0" skipped="0" time="19.354" errors="0">
<testcase name="shows the bundled chart as a real page, not an embedded PDF" classname="sheet.spec.ts" time="1.253">
</testcase>
<testcase name="cut filter switches which sheet renders" classname="sheet.spec.ts" time="0.3">
</testcase>
<testcase name="pile search narrows the cards, and a non-match says so" classname="sheet.spec.ts" time="0.34">
</testcase>
<testcase name="the Filters panel is closed by default and filters combine with pile search as AND" classname="sheet.spec.ts" time="0.625">
</testcase>
<testcase name="picking a Filters option still shows at least one pile" classname="sheet.spec.ts" time="0.383">
</testcase>
<testcase name="a detergent search matching nothing disables every Filters select, and the panel still passes accessibility" classname="sheet.spec.ts" time="0.924">
</testcase>
<testcase name="a filter&apos;s help bubble announces its text without opening the field" classname="sheet.spec.ts" time="0.425">
</testcase>
<testcase name="every help bubble stays inside a 320px viewport when opened" classname="sheet.spec.ts" time="0.71">
</testcase>
<testcase name="the phone download button generates a PDF only when clicked, not before" classname="sheet.spec.ts" time="2.695">
</testcase>
<testcase name="the print download button generates the A4 reference sheet, not the phone one" classname="sheet.spec.ts" time="1.645">
</testcase>
<testcase name="a single card&apos;s download button generates just that card&apos;s PDF" classname="sheet.spec.ts" time="0.685">
</testcase>
<testcase name="a single card&apos;s &quot;Copy link&quot; copies a URL that opens straight to it" classname="sheet.spec.ts" time="0.559">
</testcase>
<testcase name="a failed copy is announced as an alert, not just logged" classname="sheet.spec.ts" time="0.386">
</testcase>
<testcase name="the page&apos;s own Share copies the current URL, filter state included, when there&apos;s no native share sheet" classname="sheet.spec.ts" time="0.425">
</testcase>
<testcase name="the page&apos;s own Share tries the native share sheet first, and never touches the clipboard when it&apos;s used" classname="sheet.spec.ts" time="0.342">
</testcase>
<testcase name="cancelling the native share sheet isn&apos;t treated as a failure" classname="sheet.spec.ts" time="0.322">
</testcase>
<testcase name="Share falls back to the clipboard when the native share sheet itself fails, and alerts only if that fails too" classname="sheet.spec.ts" time="0.336">
</testcase>
<testcase name="with a custom config active, Share carries the whole machine/chart in the link — a fresh browser opening it sees the exact same setup" classname="sheet.spec.ts" time="1.26">
</testcase>
<testcase name="with no custom config active, Share carries only filter state — no #config= hash for the bundled example" classname="sheet.spec.ts" time="0.362">
</testcase>
<testcase name="a corrupted #config= hash is called out and falls back gracefully, without crashing the page" classname="sheet.spec.ts" time="0.3">
</testcase>
<testcase name="an uploaded config (from the config page) shows here too" classname="sheet.spec.ts" time="0.813">
</testcase>
<testcase name="a row&apos;s cited source shows as a link that opens safely, and stays hidden when nothing cites one" classname="sheet.spec.ts" time="0.925">
</testcase>
<testcase name="the header&apos;s upload control works from any page, not just /config" classname="sheet.spec.ts" time="0.68">
</testcase>
<testcase name="the header&apos;s upload control shows an error inline, without navigating away" classname="sheet.spec.ts" time="0.303">
</testcase>
<testcase name="filters and an uploaded config both survive a reload" classname="sheet.spec.ts" time="1.016">
</testcase>
<testcase name="opening a URL with filter state applies it immediately, no click needed" classname="sheet.spec.ts" time="0.302">
</testcase>
<testcase name="changing filters updates the URL, without spamming browser history" classname="sheet.spec.ts" time="0.464">
</testcase>
<testcase name="a URL&apos;s filter state wins over a previous visit&apos;s saved filters" classname="sheet.spec.ts" time="0.574">
</testcase>
</testsuite>
<testsuite name="theme.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="5" failures="0" skipped="0" time="3.311" errors="0">
<testcase name="with no stored preference, the page follows the OS scheme" classname="theme.spec.ts" time="0.298">
</testcase>
<testcase name="clicking the toggle switches modes immediately and persists across a reload" classname="theme.spec.ts" time="0.592">
</testcase>
<testcase name="an explicit choice survives a later OS scheme change, no reload needed" classname="theme.spec.ts" time="0.395">
</testcase>
<testcase name="the toggle is a real button: keyboard-operable, its state announced" classname="theme.spec.ts" time="1.45">
</testcase>
<testcase name="the toggle carries the chosen theme across pages, no per-page reset" classname="theme.spec.ts" time="0.576">
</testcase>
</testsuite>
<testsuite name="webmcp.spec.ts" timestamp="2026-10-28T10:43:51.578Z" hostname="chromium" tests="2" failures="0" skipped="0" time="0.64" errors="0">
<testcase name="registers all five tools, discoverable by name and description" classname="webmcp.spec.ts" time="0.257">
</testcase>
<testcase name="washy_set_chart persists a valid edit through the real document.modelContext round trip" classname="webmcp.spec.ts" time="0.383">
</testcase>
</testsuite>
</testsuites>