Auto-off
Markup where the component goes, CSS in your stylesheet, script before </body>. In Vue, Svelte or Angular, call initToggleAutoOff(el) on the mounted element instead.
Paste into Claude, ChatGPT or Cursor after filling in {{USER_STACK}}, {{USER_STYLING}} and {{USER_CONSTRAINTS}}. Neutral keeps the greys you see here; Match my project asks the model to map them onto your own colour tokens.
Install with shadcn
Needs a free account token. Get a token
npx shadcn@latest add @movin/toggle-auto-offAbout this component
A switch that turns itself off, like a stairwell light: on, the track's own outline drains away as a countdown, with the time left under the label. Hovering or focusing it pauses the timer.
- Dependencies
- None
- Difficulty
- Intermediate
- Reduced motion
- Respected
- Theme
- Light and dark
- Follows page color-scheme
Triggers3
- Click
- State change
- Draw
Techniques3
- requestAnimationFrame
- stroke-dashoffset
- SVG stroke
Accessibility
Keyboard and screen readers
A native checkbox with role="switch" inside a <label>, so Space toggles it and the visible text names it; :focus-visible on the input outlines the track, which is aria-hidden. The time left sits outside the label, linked with aria-describedby; it is not a live region, so it does not announce every second. Hover or focus pauses the countdown, so nobody is timed out while deciding.
Reduced motion
The thumb jumps; the outline still shows the time left.
Use it in anything you build, commercial and client work included. Licence