A demo landing page, built to break things

This page exists only to exercise every feature of the Krispy Widget: the accessibility panel and the cookie consent manager. Nothing here is a real business.

Brand inheritance and contrast guard test: this page sets --brand: #f2e34a (a pale yellow) at :root, and the widget script tag below has no data-accent of its own. Expect: the widget should pick up that pale yellow automatically, then, because pale yellow text on a white or near white panel fails the 4.5:1 minimum, the panel text and focus outline should show a corrected, darker variant of the same hue instead of the raw color. Buttons and the floating trigger should still use the raw pale yellow as a fill, with a readable near black label on top of it. Open the panel to check, then reload with ?kwdebug=1 added to the URL and check the console for the exact adjustment that was made.

Services

Three things we made up

Reef Consulting

A card on a light section. Try High contrast and Grayscale here first, this card should flip to a dark background with white text, not just the page body.

Get a quote

Tide Table Design

Another card, same test. See the gallery to check underline and highlight links.

Salt Air Branding

Grayscale should remove color from this whole section, but never from the floating accessibility button or panel.

Old page section, sized in pixels on purpose

This block uses px font-sizes instead of rem, the way a lot of older client sites do. It is here to test the text-size fallback: the stepper should still visibly enlarge the page text, even though this particular paragraph and heading were hard-coded in px.

Turn the text size stepper up to 150% and compare this block to the rem-based headline above.

Reviews

What people are (not really) saying

"This is placeholder review copy for a fictional demo business, used only to test the widget."
A. Visitor

Location

Contact

Send a message

A plain form, to prove the widget does not interfere with normal input focus, tabbing, or the labels themselves.

Audit fixtures

Deliberate accessibility failures

Everything in this section is broken on purpose, for window.KrispyWidget.audit() (or this page loaded with ?kwaudit=1) to catch. Do not "fix" these, that would defeat the point of the fixture. Each one is labeled below in the visible text and again in an HTML comment in the source.

Image with no alt attribute (1.1.1)

Input with no label, aria-label, or aria-labelledby (3.3.2, 4.1.2)

Icon only button with no accessible name (4.1.2, 2.4.4)

Heading level skip (1.3.1, 2.4.6)

This jumps from h2 straight to h4, skipping h3

Low contrast text (1.4.3)

This pale gray paragraph on a white background fails the contrast minimum on purpose.

New window link with no warning (3.2.5)

Example dot com

Touch targets under 24 by 24 CSS pixels, crammed together (2.5.8)

xx

Iframe with no title attribute (4.1.2)

Test checklist

Things to try on this page

Accessibility panel (bottom right button):

  1. Open the panel with a mouse click, then again with keyboard only (Tab to the button, Enter or Space to open).
  2. Press Tab repeatedly inside the open panel. Focus should cycle inside the panel and never escape to the page behind it.
  3. Press Escape. The panel should close and focus should return to the trigger button.
  4. Try each quick profile (Low vision, Dyslexia friendly, Motor, Seizure safe). Press the same one again, it should turn everything in that bundle back off.
  5. Use the text size stepper up to 150%. Check both the rem-based hero headline and the px-based legacy block above.
  6. Turn on High contrast. Every section on this page should go dark, including the navy and blue sections and every card, not just the plain body text.
  7. Turn on Grayscale. The page should lose all color, but the accessibility button and panel should not.
  8. Turn on Hide images. The gallery photos should disappear, but their layout space should not collapse to nothing.
  9. Turn on Pause animations. The hero gradient, the scrolling ticker, and the looping video above should all freeze or pause.
  10. Turn on Big cursor and Reading guide, then move your pointer around the page.
  11. On a touch device or phone-sized window, confirm the panel becomes a full-width bottom sheet, and the reading guide follows a finger drag.
  12. Turn off your OS "reduce motion" setting versus on, reload the page without any saved widget settings, and confirm Pause animations follows it automatically.

Cookie consent (bottom banner, on first visit):

  1. Clear this site's local storage, then reload. The banner should appear at the bottom without blocking the page underneath it.
  2. Click "Cookie settings" in the banner. A dialog should open with a full keyboard focus trap, Escape should close it.
  3. Reject non-essential cookies. The map above should show a locked placeholder with an "Enable and view" button instead of loading.
  4. Click that "Enable and view" button, it should reopen the cookie settings dialog.
  5. Accept all cookies. The map should load immediately, since it is gated on the "analytics" category.
  6. Use the footer's "Cookie preferences" link below to reopen your saved choices at any time.

Brand inheritance (see the note in the hero above):

  1. Open the accessibility panel. The accent should be a corrected, readable variant of the page's pale yellow --brand, not the raw color used as text.
  2. Reload with ?kwdebug=1 in the URL and check the browser console for a logged explanation of the adjustment.
  3. Compare against demo/brand-dark.html, a dark themed page with its own --brand, to confirm both the accent and the light/dark scheme detection follow the page.

WCAG audit mode (developer tool, not part of the visitor facing widget):

  1. Open the browser console, then run window.KrispyWidget.audit(), or reload this page with ?kwaudit=1 in the URL.
  2. The console should print a grouped report, errors first, and a small overlay with numbered badges should appear over each fixture in the "Audit fixtures" section above.
  3. Click a few badges. Each should scroll its element into view and briefly highlight it, without trapping keyboard focus.
  4. Check window.__krispyAudit in the console for the machine readable result.