Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/apursley2012/spooky/llms.txt

Use this file to discover all available pages before exploring further.

Spooky is a visually rich theme with animated components throughout: a custom cursor, flickering lights, a swinging lantern, a floating ghost mascot, cobweb corner decorations, and an optional jump-scare spider. Before publishing a personalized version, several accessibility areas need attention. This page covers the key areas to test and the adjustments to make.
The README’s accessibility and browser compatibility checklist is a useful companion reference when testing your personalized build. See the Accessibility and Browser Compatibility section in the README.

Reduced motion

Visitors who have enabled the reduce motion preference in their operating system should not be subjected to continuous looping animations. Apply the prefers-reduced-motion media query in assets/main.css to disable CSS-driven animations:
@media (prefers-reduced-motion: reduce) {
  .animate-flicker { animation: none; }
  .animate-float   { animation: none; }
}
For Framer Motion animations in Layout.js and CandleCursor.js, use the useReducedMotion() hook to conditionally disable or simplify transitions:
import { useReducedMotion } from 'framer-motion';

const prefersReduced = useReducedMotion();

// Then conditionally apply animations:
const transitionProps = prefersReduced
  ? {}
  : { duration: 0.5, ease: 'easeInOut' };
Framer Motion’s useReducedMotion() reads the prefers-reduced-motion media query reactively and returns true when the user has requested reduced motion.

Jump-scare spider

The JumpScareToggle button gives users direct control over the spider animation. To ensure this control is accessible:
  • Confirm the toggle button is keyboard-focusable and operable with the Enter and Space keys.
  • Verify the button’s aria-label updates correctly — it should read "Disable jump scares" when active and "Enable jump scares" when inactive. This is already implemented in the source, but confirm it is preserved in your build.
  • Consider defaulting scaresEnabled to false in JumpScareContext.js if your audience is likely to include users who are sensitive to sudden animations.

Custom cursor

CandleCursor completely replaces the system cursor with an animated candle flame. Be aware of the following implications:
  • Test that all interactive elements (links, buttons, form inputs) are still visually distinguishable when the custom cursor is active. CandleCursor scales slightly on hover over clickable elements as a visual cue.
  • Screen reader users are entirely unaffected by the cursor change — screen readers do not rely on cursor position.
  • Keyboard-only users are also unaffected — the custom cursor only responds to mousemove events and has no impact on keyboard focus or tab order.
  • On touch devices, CandleCursor returns null (no mousemove events are fired on touchscreens), so mobile visitors see the native touch indicator.

Keyboard navigation

Test the following keyboard scenarios before publishing:
  1. All navigation links are reachable by pressing Tab from the top of the page.
  2. The hamburger button opens the navigation drawer when activated with Enter or Space.
  3. Once the drawer is open, focus moves into the drawer and all links are reachable by Tab.
  4. The drawer close button (X) is keyboard-operable and closes the drawer.
  5. When the drawer closes, focus returns to the hamburger button that opened it, rather than being lost or jumping to the top of the page.
  6. There are no focus traps outside the open navigation drawer (i.e., focus should not get stuck inside a decoration component).

Color contrast

The pumpkin orange (#FF7518) used for accents and active labels on the charcoal background (#1A1A1D) may not meet the WCAG AA contrast ratio requirement of 4.5:1 for small body text. Recommendations:
  • Use ghost white (#F5F5F5) for all body and paragraph text — it provides strong contrast against charcoal.
  • Reserve pumpkin orange for decorative purposes and large display text (headings, labels, icons), where the WCAG AA large-text threshold of 3:1 is easier to meet.
  • Test specific color pairings with a tool such as the WebAIM Contrast Checker.

Decorative elements

Several visual components exist purely for atmosphere and carry no informational content. Ensure they are hidden from assistive technologies:
  • CobwebCorner SVG elements should have aria-hidden="true".
  • GhostMascot should have aria-hidden="true" (or a descriptive aria-label if it is interactive).
  • SwingingLantern should have aria-hidden="true".
  • FlickeringLights overlay elements should have aria-hidden="true".

Image alt text

After replacing screenshots in images/screenshots/ with your own preview images, ensure every <img> element in the HTML pages has a meaningful alt attribute describing the image content. Empty alt="" is appropriate only for purely decorative images.

Accessibility checklist

Before publishing, work through this list:
  • Test keyboard navigation throughout all pages
  • Check that link and button focus states are clearly visible
  • Verify the mobile layout at various screen widths
  • Add descriptive alt text to all images
  • Test the heading hierarchy (h1 → h2 → h3 with no skipped levels)
  • Check color contrast ratios for all text/background combinations
  • Test with the operating system’s reduced-motion preference enabled
  • Verify all decorative elements have aria-hidden="true"

Build docs developers (and LLMs) love