School project · Delayed data · Not financial adviceTerms
Skip to content
SINGULARITYTERMINALOpen the terminal
Self-assessed, and unaudited

Accessibility statement

This product targets WCAG 2.1 Level AA. It has not been audited, no third party has assessed it, and no visual review has happened on any screen in this build — the verification browser pane never composited, so nothing in it has been looked at. What follows separates what was measured from what was not, and the measurements are taken in your browser as this page loads.

The standard this targets

Standard
WCAG 2.1, Level AA, with the WCAG 2.2 target-size criterion (2.5.8) adopted as an additional target.
Conformance claim
None is made. This product targets that standard; it has not been assessed against it end to end, and the known gaps below are the ones that are known — not the ones that exist.
Evidence
Self-assessment, programmatic. The contrast and structural checks on this page are the whole of the automated evidence; everything else on this page is a statement about what was and was not done.
Scope
The standard pages and the terminal application served from this machine. There is no other deployment.
Feedback
There is no support address, because there is no service behind this — you are running the software and you have the source.

Measured contrast, in your browser, just now

not measured

0 of 13 token pairs resolved to an opaque colour and were measured. 0 sit below the floor for their role, and 13 could not be measured at all. Every figure is computed from getComputedStyle on this page, in this theme, at load.

  • --i-ink-1 on --i-voidnot measurednot measurablefloor 4.5:1
    Headings and hero figures on the page background
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-2 on --i-voidnot measurednot measurablefloor 4.5:1
    Body text on the page background
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-3 on --i-voidnot measurednot measurablefloor 4.5:1
    Labels and units on the page background
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-4 on --i-voidnot measurednot measurablefloor 3:1
    Rules and disabled text — non-essential, 3:1 floor
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-2 on --i-surface-1not measurednot measurablefloor 4.5:1
    Body text on a panel
    --i-surface-1 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-3 on --i-surface-1not measurednot measurablefloor 4.5:1
    Labels on a panel
    --i-surface-1 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-3 on --i-surface-2not measurednot measurablefloor 4.5:1
    Labels on a nested surface
    --i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-orchid on --i-voidnot measurednot measurablefloor 4.5:1
    The accent as text on the page background
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-orchid-bright on --i-voidnot measurednot measurablefloor 3:1
    The focus ring against the page background
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-ink-on-accent on --i-orchidnot measurednot measurablefloor 4.5:1
    Text on a filled accent button
    --i-orchid did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-bull on --i-surface-2not measurednot measurablefloor 4.5:1
    A gain, on a table row
    --i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-bear on --i-surface-2not measurednot measurablefloor 4.5:1
    A loss, on a table row
    --i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-amber on --i-voidnot measurednot measurablefloor 4.5:1
    The live / streaming marker
    --i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
  • --i-token-that-does-not-exist on --i-voidnot measurednot measurablefloor 4.5:1
    CONTROL — a token this build does not define. If this row reports a ratio, the instrument is broken and no other row on this table should be believed.
    --i-token-that-does-not-exist did not resolve — the probe inherited the control colour, so this build does not define that token.

The control row is deliberate. It names a token that does not exist, so it must come back unmeasurable; if it ever reports a number, this whole table is withdrawn rather than shown. An instrument with no way to fail is not evidence.

Token reference

Every value below is READ OUT OF THIS PAGE, not copied from a stylesheet. Four sheets redeclare parts of this scale and the last one wins, so a reference built from the source would be a second way to be wrong — that mistake once put a pink price line on the screen the app opens on. Switch theme or accent in Settings and reload: these figures follow.

Ink

Four tiers, brightest first. Anything that must be READ uses 1 to 3; tier 4 is for rules and disabled text and is held to 3:1, not 4.5:1.

TokenResolved hereUsed for
--i-ink-1rgb(244, 240, 233)Headings, hero figures
--i-ink-2rgb(186, 179, 169)Body text
--i-ink-3rgb(156, 150, 142)Labels, units, captions
--i-ink-4rgb(148, 142, 133)Rules, disabled text

Ground

The page, then the surfaces that sit on it. A panel is lighter than the page; nothing is lighter than a raised panel.

TokenResolved hereUsed for
--i-voidrgb(0, 0, 0)The page itself
--i-surface-1rgb(11, 12, 14)A panel
--i-surface-2rgb(16, 17, 20)A raised panel
--i-linergba(255, 255, 255, 0.08)Every hairline and edge

Direction

Bull and bear are perceptually matched in lightness on purpose, so the pair survives being read by someone who cannot tell the hues apart — colour is never the only signal.

TokenResolved hereUsed for
--i-bullrgb(79, 178, 134)Up
--i-bearrgb(220, 106, 98)Down

Type scale

One multiplier, --i-t-scale, drives all of it — that is what makes the text-size setting move labels as well as body copy.

TokenResolved hereUsed for
--i-t-hero34pxThe one figure a screen is about
--i-t-xl22pxSection heading
--i-t-lg17pxPanel heading
--i-t-md14pxSub-heading
--i-t-body12.5pxBody
--i-t-sm11.5pxSecondary
--i-t-xs10.5pxLabel

Accents, measured

Four named accents. Each one is applied to this page, the colour it actually resolves to is read back, and the ratio against each ground it is drawn on is computed with the same function every other figure on this page uses. An accent is decoration rather than text, so 3:1 is the floor that applies — the number is shown either way, because a reader choosing one deserves to know which is faintest.

AccentResolves toOnRatio3:1
Gold (shipped default)rgb(225, 173, 102)the page background10.37:1pass
Gold (shipped default)rgb(225, 173, 102)a panel9.66:1pass
Orchidrgb(208, 91, 165)the page background5.72:1pass
Orchidrgb(208, 91, 165)a panel5.33:1pass
Amberrgb(242, 175, 72)the page background11.00:1pass
Amberrgb(242, 175, 72)a panel10.25:1pass
Violetrgb(185, 140, 224)the page background7.89:1pass
Violetrgb(185, 140, 224)a panel7.35:1pass

What has NOT been verified

6 entries

This is the longer half of the page, and it is meant to be. A statement that lists only what passes is not a statement.

No visual review has happened, on any screen

The verification browser pane used throughout this build has never composited: window.innerWidth reports 0, screenshots time out, and requestAnimationFrame and ResizeObserver callbacks never fire. Nothing in this product has been looked at. Reading order as rendered, focus order as rendered, reflow at 320 px, text spacing, content on hover — all of 1.3.2, 1.4.10, 1.4.12 and 1.4.13 — are unverified, and the programmatic checks on this page cannot stand in for any of them.

No assistive technology has been used to drive this product

There is no record of it having been operated with a screen reader, a switch device, voice control or screen magnification. The measurements here are computed ratios, rendered rectangles and attribute counts. That catches one category of problem and misses another category entirely — a page can pass every check on this page and still be unusable through a screen reader.

There is no third-party audit, no VPAT, and no certification

Nobody outside this build has assessed it. This page is self-assessment, and self-assessment is the weakest form of accessibility evidence there is.

The contrast table covers the pairs it knows about, not every pair on screen

It measures named token pairs. A colour set directly by an older stylesheet layer, or a composite over a semi-transparent surface, is outside what it can see. The semi-transparent cases are reported as unmeasurable above rather than assumed to pass.

The terminal screens are not covered by the checks on this page

The structural checks run against THIS document. The terminal renders into a different document with its own stylesheets and its own components, and none of the results above transfer to it.

There is no designed mobile layout and no print stylesheet

The interface targets a wide screen. On a phone it is a compressed desktop layout, which is a usability failure before it is an accessibility one, and printing renders the interface chrome along with the content.

Settings that change what you get

Theme
Follows your operating system by default, with a manual override that persists. The contrast table above re-measures in whichever theme you choose.
Density
Comfortable, compact or terminal row heights. Comfortable gives the largest targets and the most spacing.
Motion
Follow the system, or force reduced regardless of what the system reports.
Accent
Three hues. Only three are offered because those are the ones whose contrast is measurable from tokens — and you can check the current one in the table above.

Fixing something yourself

There is no issue tracker to file this against

Which is the one genuinely good thing about self-hosted software: an accessibility problem here is a file on your disk. Colour and the density scale live in static/instrument.css, the shared data table in frontend/kit/table.js, and page structure in frontend/page_kit.js. There is no build step between an edit and the running product — change the file, reload, and this page re-measures.

How this is put together

Structural checks, on this page

6 checks

These run against this document only. They are not a statement about the terminal screens, and a check that cannot run says so instead of returning a value.

  • The first focusable element is a skip link, and its target existsbelow the floor
    The first focusable element is "Terms", which does not resolve to an in-page target.
    How: document.querySelector over the focusable selectors, in this document, now.
  • Live regions are present on this pagenot measured
    0 elements on this page carry aria-live, role=status or role=alert. This says nothing about the terminal screens, which are a different document.
    How: querySelectorAll, in this document, now.
  • Exactly one h1, and no heading level is skippedpass
    1 h1 and 18 headings in total.
    How: Reading the heading elements of this document in source order.
  • Interactive targets are at least 24x24 CSS px (WCAG 2.2, 2.5.8)pass
    4 links and buttons measured in the main region of this page; 0 fall below 24 px on one axis.
    How: getBoundingClientRect on every link and button in the main region, now.
  • Reduced motion is honourednot measured
    Your system currently asks for full motion, and this document is set to data-motion="system". Whether every animation in every stylesheet respects that is not something this page can measure — it can only report the two inputs.
    How: matchMedia and the data-motion attribute this page applies.
  • The theme follows the operating systempass
    Your system asks for the dark theme, and the contrast figures above were measured in the theme you are actually looking at rather than in the shipped default.
    How: matchMedia, read at the same moment as the contrast probe.