UI Style Change: Unified Prize & Voucher Color Palette Specification
Last Updated: 16/07/2026
Type: UI/UX Design System Specification — Color Palette
Scope: Lucky Spin Wheel Segments & Voucher Card Backgrounds (Mobile App & CMS Admin)
Reference Image:
1. Overview & Rationale
Currently, the prize slices on the Lucky Spin wheel and the voucher card backgrounds lack a unified color coding system.
To improve scannability and build strong category associations (so users instantly recognize what category of prize they won), we define a strict Prize & Voucher Color Palette:
- Points: Single color spectrum (lighter shades for low points, darker/richer shades for high points).
- Healing World Ticket Vouchers: Light Gold.
- Massage Vouchers: Earth Brown.
- Nail Vouchers: Pink Pastel.
- Hair Vouchers: Pastel Pink (vibrant yet soft pink, matching the brand sample).
2. Color Palette Specification (Hex Tokens)
Here are the official hex color tokens to be used across the Mobile App (SVG wheel slices, voucher cards) and CMS Admin (color labels):
| Prize Category | Sub-category / Range | Hex Code | Visual Preview / Description |
|---|---|---|---|
| Point (Light) | Low Points (< 500) | #FFE0B2 | Light Apricot / Creamy Orange |
| Point (Medium) | Med Points (500 - 999) | #FFA726 | Bright Amber Orange |
| Point (Dark) | High Points (≥ 1000) | #E65100 | Rich Deep Burnt Orange |
| Healing World Ticket | All ticket vouchers | #FFF9C4 | Light Gold / Champagne Gold |
| Massage Voucher | Massage services | #8D6E63 | Earth Brown / Warm Clay |
| Nail Voucher | Nail/Manicure services | #F8BBD0 | Soft Pink Pastel |
| Hair Voucher | Hair/Styling services | #FF8A80 | Vibrant Pastel Pink (Brand Specific) |
3. Implementation Spec
3.1 Lucky Spin Wheel Segment Coloring (React Native SVG)
When rendering the segments of the wheel dynamically, map the prize items to their corresponding color tokens based on type and subtype:
// Segment color resolver utility
export const getPrizeColorToken = (prizeType: 'point' | 'voucher', value: number, category?: 'healing_world' | 'massage' | 'nail' | 'hair') => {
if (prizeType === 'point') {
if (value < 500) return '#FFE0B2'; // Low point
if (value < 1000) return '#FFA726'; // Med point
return '#E65100'; // High point
}
if (prizeType === 'voucher') {
switch (category) {
case 'healing_world':
return '#FFF9C4'; // Light Gold
case 'massage':
return '#8D6E63'; // Earth Brown
case 'nail':
return '#F8BBD0'; // Pink Pastel
case 'hair':
return '#FF8A80'; // Vibrant Pastel Pink
default:
return '#FFF9C4'; // Default to Light Gold
}
}
return '#FFFFFF'; // Fallback
};
3.2 Voucher Card Background Mapping
The same coloring rule must be applied to the voucher cards in the "My Vouchers" list to maintain consistent visual language:
// Within VoucherCard.tsx
const cardColor = getPrizeColorToken('voucher', 0, voucher.category);
return (
<View style={[styles.cardContainer, { backgroundColor: cardColor }]}>
<VoucherDetails voucher={voucher} />
</View>
);
Technical Checklist
- Add the color tokens into the global theme style file (
theme.tsorcolors.ts). - Implement the
getPrizeColorTokenhelper function. - Update the Lucky Spin wheel renderer to apply segment backgrounds dynamically based on the prize type/category.
- Update the
VoucherCardbackground color styling to inherit category-specific colors instead of using a single hardcoded color. - Test contrast: verify that text labels (white or dark grey) remain readable on top of all the new background colors (specifically
#FFF9C4Light Gold, which needs dark text contrast). - Run build tests on both iOS and Android to check SVG color rendering.