UI/UX Specification: Service-Specific Voucher Theme Designs & CMS Color Mappings
Last Updated: 16/07/2026
Type: UI/UX Layout & Visual Theme Specification
System: Mobile App (Voucher Cards) & CMS Admin (Branch Color Configuration)
Severity: 🔴 High — Upgrades the default voucher layout to feature service-specific themes, custom badges, and dynamic branch logo/thumbnails
Reference Images:
- Before: Default cyan voucher card using generic leaf icons and no source indicators
- After: Redesigned high-fidelity cards featuring specific Jjim Jil Bang, Massage, Nail, and Hair themes
1. Core Visual Enhancements
To establish a premium feel, the voucher card design must keep the existing layout structure but apply service-specific color themes, dynamic brand logos, branch thumbnails, and source badges.
1.1 Branch Thumbnail replacing Leaf Icon
- ❌ Old Design: Used a generic circular green leaf icon.
- ✅ New Design: Replace the leaf icon with the Branch Thumbnail Image (Ảnh đại diện chi nhánh) inside the right-hand preview frame. This immediately tells the customer which branch/outlet the voucher is bound to. The code label (SKU/Code) sits directly underneath this thumbnail.
1.2 Acquisition Source Badge (Badge nguồn nhận)
- A rounded capsule badge (containing an icon + label text) must sit under the voucher description.
- This displays the voucher origin: e.g., "Trúng từ vòng quay may mắn" (Won from lucky spin), "Tri ân khách hàng thân thiết" (Loyal customer reward), or "Voucher chúc mừng sinh nhật" (Birthday gift).
1.3 CMS-Managed Color Codes
- To make formatting dynamic, the CMS Admin page for Branch Configuration must expose a Color Picker field (
branchColorThemeHex). - Saving a hex color here dynamically sets:
- The background color of all voucher cards generated for this branch.
- The corresponding prize segment color on the Lucky Spin Wheel (see prize-voucher-color-palette.md).
2. Service-Specific Theme Color Tokens
Mobile app developers must apply the following specific color mappings when rendering vouchers belonging to the 4 main service categories:
2.1 Voucher Jjim Jil Bang (Xông hơi)
- Background:
#A77D58(Warm Taupe) - Primary Text:
#FFFFFF - Logo/Icon Tint:
#FFF6EA(Creamy White) - Source Badge Styling:
- Background:
rgba(120, 74, 34, 0.35)(Semi-transparent dark brown) - Text Color:
#FFF6EA
- Background:
- Example Content:
🎁 Trúng từ vòng quay may mắn
2.2 Voucher Massage
- Background:
#5C3C24(Deep Earth Brown) - Primary Text:
#FFFFFF - Logo/Icon Tint:
#F6D7A7(Soft Champagne) - Source Badge Styling:
- Background:
#F6D7A7 - Text Color:
#5C3C24
- Background:
- Example Content:
🌿 Tri ân khách hàng thân thiết
2.3 Voucher Nail
- Background:
#FCD3DE(Pastel Pink) - Primary Text:
#5C1D2E(Deep Rosewood) - Logo/Icon Tint:
#8D2342(Ruby Red) - Source Badge Styling:
- Background:
#F8AFC5(Soft Rose) - Text Color:
#5C1D2E
- Background:
- Example Content:
🎂 Voucher chúc mừng sinh nhật
2.4 Voucher Hair
- Background:
#FFA07A(Light Salmon/Coral) - Primary Text:
#4A1502(Dark Mahogany) - Logo/Icon Tint:
#4A1502 - Source Badge Styling:
- Background:
#FF8F6E(Warm Coral) - Text Color:
#4A1502
- Background:
- Example Content:
👤 Tri ân khách hàng thân thiết
3. Component Hierarchy Spec (React Native)
// VoucherCard.tsx
import React from 'react';
import { View, Text, Image, StyleSheet } from 'react-native';
const VoucherCard = ({ voucher }) => {
const theme = getThemeColors(voucher.category); // Jjim Jil Bang, Massage, Nail, Hair
return (
<View style={[styles.card, { backgroundColor: theme.background }]}>
{/* Top Section */}
<View style={styles.topSection}>
<View style={styles.leftContent}>
{/* Logo and Brand Name */}
<View style={styles.brandRow}>
<Image
source={require('../assets/brand-logo.png')}
style={[styles.logo, { tintColor: theme.logoTint }]}
/>
<View>
<Text style={[styles.brandTitle, { color: theme.text }]}>Golden Lotus</Text>
<Text style={[styles.branchSubtitle, { color: theme.text, opacity: 0.8 }]}>
{voucher.branchName}
</Text>
</View>
</View>
{/* Heading */}
<Text style={[styles.headingText, { color: theme.text }]}>
{voucher.title}
</Text>
{/* Source Badge */}
<View style={[styles.badge, { backgroundColor: theme.badgeBg }]}>
<Text style={[styles.badgeText, { color: theme.badgeText }]}>
{voucher.sourceIcon} {voucher.sourceLabel}
</Text>
</View>
</View>
{/* Right Section: Branch Thumbnail + Code */}
<View style={styles.rightContent}>
<Image source={{ uri: voucher.branchThumbnail }} style={styles.thumbnail} />
<View style={styles.codeContainer}>
<Text style={styles.codeText}>{voucher.codeLine1}</Text>
<Text style={styles.codeText}>{voucher.codeLine2}</Text>
</View>
</View>
</View>
{/* Dotted Divider line */}
<View style={styles.dottedDivider} />
{/* Bottom Section (HSD) */}
<View style={styles.bottomSection}>
<Text style={[styles.expiryText, { color: theme.text, opacity: 0.9 }]}>
HSD: {voucher.expiryDate}
</Text>
<Image
source={require('../assets/arrow-right.png')}
style={[styles.arrowIcon, { tintColor: theme.text }]}
/>
</View>
</View>
);
};
Technical Checklist
- Add the
branchColorThemeHexfield to the Branch DB Model and CMS edit screens. - Create the theme resolution utility class returning theme objects based on voucher category.
- Update
VoucherCard.tsxlayout structure:- Replace the vector leaf icon with the dynamic
voucher.branchThumbnailimage. - Crop thumbnail to fit a rounded-corner frame
64x64px. - Append the rounded acquisition source badge beneath the heading.
- Replace the vector leaf icon with the dynamic
- Check color contrasts: Verify readability of white text on
#A77D58(Jjim Jil Bang) and#5C3C24(Massage), and dark text on#FCD3DE(Nail) and#FFA07A(Hair). - Render a dotted divider utilizing
borderStyle: 'dashed'or an SVG dashed line. - Verify implementation on both iOS and Android platforms to ensure image cropping and layout spacing match the redesigned cards.