Accessibility
Accessibility is a release requirement for luxy reward components, not post-release polish.
Shared expectations
- Every interaction must have a non-gesture path.
- Screen-reader users must be able to reveal or spin without physically scratching, dragging, or timing an animation.
- Labels and hints must explain that the UI reveals or spins for a promotional reward.
- Reduced motion must reduce visual intensity without disabling the reward flow or outcome callbacks.
- Host apps should announce final results after
onRevealCompleteoronSpinCompletewhen that is appropriate for the experience.
Scratch card
The scratch card defaults to button-like reveal semantics:
- Label: scratch-card reveal copy.
- Hint: explains that the action reveals the promotional reward.
- Action: tap/double-tap reveal when
screenReaderRevealModeispress. - Reduced motion: static cover plus tap-to-reveal, with shimmer, dust particles, and large reveal motion disabled.
<ScratchCard
outcome={outcome}
accessibility={{
label: "Scratch card. Double tap to reveal your reward.",
hint: "Reveals the promotional coupon.",
screenReaderRevealMode: "press",
}}
renderReveal={renderReward}
/>
Slot machine
The slot machine defaults to spin semantics:
- Label: slot-machine spin copy.
- Hint: explains that the action starts the reward spin.
- Reduced motion: either
short-spinorinstant, depending on app policy. - Final result: the host app decides whether and how to announce prize details.
<SlotMachine
outcome={knownOutcome}
symbols={slotSymbols}
accessibility={{ reducedMotionBehavior: "instant" }}
/>
Release checklist
Before v1 release, test each component with:
- iOS VoiceOver in a release build.
- Android TalkBack in a release build.
- System reduced motion enabled.
- Large text or dynamic type where host layouts support it.
- Pending, success, loss, and resolver error states.