UI Design System
Overview
This document defines the visual design system for Talbino's reverse marketplace across all platforms: iOS (Swift/SwiftUI), Android (Kotlin/Compose), Flutter (Seller app), and Next.js web.
Design Philosophy: Clean, modern, trustworthy, and optimized for Arabic/English with full RTL support.
Design Principles
1. Trust-First
- Clear visual hierarchy emphasizing seller ratings and verification
- Transparent pricing and offer details
- Professional, credible aesthetic
2. Speed & Clarity
- Minimal steps to complete actions
- Clear CTAs with high contrast
- Instant visual feedback
3. Bilingual Excellence
- Seamless Arabic ↔ English switching
- Perfect RTL/LTR layout mirroring
- Culturally appropriate imagery and icons
4. Mobile-First
- Touch-friendly targets (min 44x44pt)
- Thumb-zone optimization
- Gesture-based navigation
Color Palette
Primary Colors
/* Brand Primary - Vibrant Teal */
--primary-50: #E0F7F7;
--primary-100: #B3ECEC;
--primary-200: #80E0E0;
--primary-300: #4DD4D4;
--primary-400: #26CACA;
--primary-500: #00C0C0; /* Main brand color */
--primary-600: #00B0B0;
--primary-700: #009D9D;
--primary-800: #008B8B;
--primary-900: #006A6A;
/* Brand Secondary - Warm Orange */
--secondary-50: #FFF3E0;
--secondary-100: #FFE0B2;
--secondary-200: #FFCC80;
--secondary-300: #FFB74D;
--secondary-400: #FFA726;
--secondary-500: #FF9800; /* Accent for CTAs */
--secondary-600: #FB8C00;
--secondary-700: #F57C00;
--secondary-800: #EF6C00;
--secondary-900: #E65100;
Semantic Colors
/* Success - Green */
--success-light: #D4EDDA;
--success-main: #28A745;
--success-dark: #1E7E34;
/* Warning - Yellow */
--warning-light: #FFF3CD;
--warning-main: #FFC107;
--warning-dark: #FF8B00;
/* Error - Red */
--error-light: #F8D7DA;
--error-main: #DC3545;
--error-dark: #BD2130;
/* Info - Blue */
--info-light: #D1ECF1;
--info-main: #17A2B8;
--info-dark: #117A8B;
Neutral Colors
/* Grayscale */
--gray-50: #F9FAFB;
--gray-100: #F3F4F6;
--gray-200: #E5E7EB;
--gray-300: #D1D5DB;
--gray-400: #9CA3AF;
--gray-500: #6B7280;
--gray-600: #4B5563;
--gray-700: #374151;
--gray-800: #1F2937;
--gray-900: #111827;
/* Background */
--bg-primary: #FFFFFF;
--bg-secondary: #F9FAFB;
--bg-tertiary: #F3F4F6;
/* Text */
--text-primary: #111827;
--text-secondary: #6B7280;
--text-tertiary: #9CA3AF;
--text-inverse: #FFFFFF;
Usage Guidelines
- Primary (Teal): Main actions, active states, brand elements
- Secondary (Orange): CTAs, highlights, important actions
- Success: Completed deals, approvals, positive feedback
- Warning: Pending states, cautions
- Error: Rejections, errors, destructive actions
- Neutral: Text, borders, backgrounds
Typography
Font Families
/* Arabic */
--font-arabic: 'Cairo', 'Tajawal', -apple-system, BlinkMacSystemFont, sans-serif;
/* English/Latin */
--font-latin: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
/* Monospace (prices, numbers) */
--font-mono: 'SF Mono', 'Roboto Mono', 'Courier New', monospace;
Type Scale
/* Display - Hero sections */
--text-display: 48px / 56px; /* size / line-height */
--text-display-weight: 700;
/* Headings */
--text-h1: 32px / 40px;
--text-h1-weight: 700;
--text-h2: 24px / 32px;
--text-h2-weight: 600;
--text-h3: 20px / 28px;
--text-h3-weight: 600;
--text-h4: 18px / 24px;
--text-h4-weight: 600;
/* Body */
--text-body-lg: 18px / 28px;
--text-body-lg-weight: 400;
--text-body: 16px / 24px;
--text-body-weight: 400;
--text-body-sm: 14px / 20px;
--text-body-sm-weight: 400;
/* Captions & Labels */
--text-caption: 12px / 16px;
--text-caption-weight: 400;
--text-overline: 11px / 16px;
--text-overline-weight: 600;
--text-overline-transform: uppercase;
--text-overline-spacing: 0.5px;
Font Weights
- Regular: 400 (body text)
- Medium: 500 (emphasis)
- Semibold: 600 (headings, labels)
- Bold: 700 (display, strong emphasis)
RTL Considerations
- Use
text-align: startinstead ofleft - Mirror directional icons (arrows, chevrons)
- Flip padding/margin order in RTL
- Test with long Arabic text (tends to be longer than English)
Spacing System
Base Unit: 4px
--space-0: 0px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-10: 40px;
--space-12: 48px;
--space-16: 64px;
--space-20: 80px;
--space-24: 96px;
Usage
- Component padding: 16px (space-4)
- Card padding: 16-24px (space-4 to space-6)
- Section spacing: 32-48px (space-8 to space-12)
- Screen margins: 16-20px (space-4 to space-5)
- Element gaps: 8-12px (space-2 to space-3)
Border Radius
--radius-none: 0px;
--radius-sm: 4px; /* Small elements, tags */
--radius-md: 8px; /* Buttons, inputs */
--radius-lg: 12px; /* Cards, modals */
--radius-xl: 16px; /* Large cards */
--radius-2xl: 24px; /* Bottom sheets */
--radius-full: 9999px; /* Pills, avatars */
Shadows & Elevation
/* Elevation levels */
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.05);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
--shadow-2xl: 0 25px 50px rgba(0, 0, 0, 0.15);
/* Usage */
- Cards: shadow-sm
- Floating buttons: shadow-md
- Modals/sheets: shadow-xl
- Dropdowns: shadow-lg
Components
Buttons
Primary Button
Background: primary-500
Text: white
Height: 48px (mobile), 44px (web)
Padding: 16px 24px
Border radius: radius-md
Font: body-weight: 600
States:
- Hover: primary-600
- Active: primary-700
- Disabled: gray-300, text: gray-500
Secondary Button
Background: transparent
Border: 2px solid primary-500
Text: primary-500
Height: 48px (mobile), 44px (web)
Padding: 16px 24px
Border radius: radius-md
States:
- Hover: bg: primary-50
- Active: bg: primary-100
- Disabled: border: gray-300, text: gray-400
Destructive Button
Background: error-main
Text: white
(Same dimensions as primary)
Text Button
Background: transparent
Text: primary-500
Padding: 8px 16px
Font weight: 600
States:
- Hover: bg: primary-50
- Active: bg: primary-100
Input Fields
Height: 48px
Padding: 12px 16px
Border: 1px solid gray-300
Border radius: radius-md
Font: body
States:
- Focus: border: primary-500, shadow: 0 0 0 3px primary-100
- Error: border: error-main, shadow: 0 0 0 3px error-light
- Disabled: bg: gray-100, text: gray-500
Label:
- Font: body-sm-weight: 600
- Color: text-primary
- Margin bottom: space-2
Cards
Request Card
Background: white
Padding: 16px
Border radius: radius-lg
Shadow: shadow-sm
Border: 1px solid gray-200
Layout:
- Product title (h4)
- Budget range (body, primary-600)
- Location + time (caption, text-secondary)
- Offer count badge (if > 0)
Offer Card
Background: white
Padding: 16px
Border radius: radius-lg
Border: 2px solid gray-200
Highlight accepted offer:
- Border: 2px solid success-main
- Background: success-light
Layout:
- Seller name + rating (body-weight: 600)
- Price (h3, primary-600)
- Availability + condition (body-sm)
- CTA buttons
Badges
Padding: 4px 12px
Border radius: radius-full
Font: caption-weight: 600
Variants:
- Active: bg: success-light, text: success-dark
- Pending: bg: warning-light, text: warning-dark
- Closed: bg: gray-200, text: gray-700
- Rejected: bg: error-light, text: error-dark
Rating Stars
Size: 16px (inline), 24px (prominent)
Color: secondary-500 (filled), gray-300 (empty)
Spacing: 2px between stars
Display format:
★★★★☆ 4.5 (23 reviews)
Avatar
Sizes:
- xs: 24px
- sm: 32px
- md: 40px
- lg: 56px
- xl: 80px
Border radius: radius-full
Border: 2px solid white (when overlapping)
Fallback: Initials on primary-500 background
Bottom Sheet (Mobile)
Background: white
Border radius: radius-2xl (top corners only)
Shadow: shadow-2xl
Max height: 90vh
Padding: 24px
Handle:
- Width: 40px
- Height: 4px
- Background: gray-300
- Border radius: radius-full
- Centered at top
Modal (Web)
Background: white
Border radius: radius-xl
Shadow: shadow-2xl
Max width: 600px
Padding: 32px
Overlay:
- Background: rgba(0, 0, 0, 0.5)
- Backdrop blur: 4px
Screen Layouts
Mobile App Structure
┌─────────────────────┐
│ Status Bar │
├─────────────────────┤
│ Navigation Bar │ 56px
│ [Title] [Actions] │
├─────────────────────┤
│ │
│ Content Area │
│ (Scrollable) │
│ │
│ │
├─────────────────────┤
│ Bottom Nav/CTA │ 80px (nav), 72px (CTA)
└─────────────────────┘
Key Screens
1. Home Screen (Buyer)
- Header: "Talbino" logo + profile avatar
- Hero CTA: "Post a Request" (large, prominent)
- Tabs: "Active Requests" | "My Deals"
- Request cards list (infinite scroll)
- Floating action button (FAB) for quick post
2. Request Detail
- Back button + share
- Product info card
- Budget range (highlighted)
- Location + time posted
- Offer count badge
- "View Offers" CTA (if offers > 0)
- "Close Request" button (destructive)
3. Offers List
- Header: "X Offers"
- Sort/filter chips
- Offer cards (sorted by price/rating)
- Each card: Seller info, price, details, "Chat" + "Accept" buttons
4. Chat Screen
- Header: Other party name + avatar + rating
- Message list (reverse chronological)
- Input bar (fixed bottom)
- Send button (primary color)
5. Post Request Form
- Progress indicator (steps)
- Form fields (one section at a time)
- "Next" / "Submit" CTA (bottom)
- "Save Draft" option
Web App Structure
┌────────────────────────────────────┐
│ Top Navigation Bar │ 64px
│ [Logo] [Nav Links] [Profile] │
├────────────────────────────────────┤
│ │
│ Main Content Area │
│ (Max width: 1200px, centered) │
│ │
│ [Sidebar] [Content] [Aside] │
│ (Optional) │
│ │
└────────────────────────────────────┘
Icons
Icon Library
- iOS: SF Symbols
- Android: Material Icons
- Flutter: Material Icons / Custom SVG
- Web: Heroicons / Lucide Icons
Common Icons
- Home: house
- Requests: clipboard-list
- Offers: tag
- Deals: handshake
- Chat: message-circle
- Profile: user
- Search: magnifying-glass
- Filter: funnel
- Sort: arrows-up-down
- Close: x-mark
- Back: chevron-left (RTL: chevron-right)
- Forward: chevron-right (RTL: chevron-left)
- Star (filled): star-fill
- Star (empty): star
- Location: map-pin
- Time: clock
- Phone: phone
- Camera: camera
- Send: paper-airplane
- More: ellipsis-horizontal
Icon Sizes
- xs: 16px
- sm: 20px
- md: 24px
- lg: 32px
- xl: 48px
Animations & Transitions
Timing Functions
--ease-in: cubic-bezier(0.4, 0, 1, 1);
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
Durations
--duration-fast: 150ms;
--duration-normal: 250ms;
--duration-slow: 350ms;
Common Animations
Button Press
Scale: 0.98
Duration: 100ms
Easing: ease-in-out
Card Tap
Scale: 0.97
Shadow: increase
Duration: 150ms
Page Transition
Slide: translateX(100%) → 0
Fade: opacity 0 → 1
Duration: 300ms
Easing: ease-out
Bottom Sheet
Slide up: translateY(100%) → 0
Duration: 350ms
Easing: ease-spring
Loading Spinner
Rotation: 360deg continuous
Duration: 1000ms
Easing: linear
Accessibility
Touch Targets
- Minimum: 44x44pt (iOS), 48x48dp (Android)
- Spacing between targets: 8px minimum
Color Contrast
- Text on background: 4.5:1 minimum (WCAG AA)
- Large text (18pt+): 3:1 minimum
- Interactive elements: 3:1 minimum
Focus States
- Visible focus indicator (3px outline)
- Color: primary-500
- Offset: 2px
Screen Reader Support
- Semantic HTML (web)
- Accessibility labels (mobile)
- Announce dynamic content changes
- Logical tab order
RTL Support Checklist
- Mirror all directional layouts
- Flip icons (arrows, chevrons)
- Test with Arabic content
- Verify number formatting (Arabic numerals vs. Western)
- Check date/time formatting
Platform-Specific Guidelines
iOS (SwiftUI)
// Color
Color("Primary500") // Use asset catalog
// Typography
.font(.system(size: 16, weight: .regular))
// Spacing
.padding(.horizontal, 16)
// Shadows
.shadow(color: .black.opacity(0.1), radius: 4, x: 0, y: 2)
// Animations
.animation(.spring(response: 0.3, dampingFraction: 0.7), value: isExpanded)
Android (Jetpack Compose)
// Color
MaterialTheme.colorScheme.primary
// Typography
MaterialTheme.typography.bodyLarge
// Spacing
Modifier.padding(horizontal = 16.dp)
// Shadows
Modifier.shadow(elevation = 4.dp, shape = RoundedCornerShape(8.dp))
// Animations
animateFloatAsState(
targetValue = if (expanded) 1f else 0f,
animationSpec = spring(dampingRatio = 0.7f)
)
Flutter (Seller App)
// Color
Theme.of(context).colorScheme.primary
// Typography
Theme.of(context).textTheme.bodyLarge
// Spacing
EdgeInsets.symmetric(horizontal: 16)
// Shadows
BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 4,
offset: Offset(0, 2),
)
]
)
// Animations
AnimatedContainer(
duration: Duration(milliseconds: 250),
curve: Curves.easeOut,
)
Next.js (Web)
// Tailwind CSS classes
className="bg-primary-500 text-white px-6 py-3 rounded-lg shadow-md"
// CSS Modules
import styles from './Button.module.css'
// Framer Motion animations
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.3 }}
>
Design Resources
Recommended Tools
-
Figma (Primary design tool)
- Component library
- Design system documentation
- Prototyping
- Developer handoff
-
Sketch (Alternative)
- iOS-focused design
- Symbol libraries
-
Adobe XD (Alternative)
- Cross-platform design
- Auto-animate
Free UI Kits & Inspiration
-
Mobile UI Kits
- iOS 17 UI Kit (Figma)
- Material Design 3 Kit (Figma)
- Ant Design Mobile
-
Marketplace Inspiration
- OfferUp: Clean card-based layout
- Mercari: Trust indicators, ratings
- Carousell: Chat integration
- Dubizzle: Arabic/English, MENA market
- OLX: Category browsing
-
Component Libraries
- shadcn/ui (Web - already in stack)
- React Native Paper (If using RN)
- Flutter Material 3 (Seller app)
Design System Examples
Implementation Checklist
Phase 1: Foundation
- Set up design tokens (colors, typography, spacing)
- Create component library in Figma
- Define icon set
- Establish grid system
Phase 2: Core Components
- Buttons (all variants)
- Input fields
- Cards (request, offer, deal)
- Navigation (bottom nav, top bar)
- Modals/sheets
Phase 3: Screens
- Authentication (OTP)
- Home/Browse
- Post Request form
- Request detail
- Offers list
- Chat
- Profile
Phase 4: Polish
- Animations & transitions
- Loading states
- Empty states
- Error states
- Success confirmations
Phase 5: Localization
- Arabic translations
- RTL layout testing
- Cultural adaptations
- Number/date formatting
Quick Start Guide
For Designers
- Download Figma Template (create from this spec)
- Set up design tokens as Figma variables
- Create component library with variants
- Design key screens (5-7 screens for MVP)
- Prototype user flows (request → offer → deal)
- Share with developers via Figma Dev Mode
For Developers
- iOS: Create
DesignSystem.swiftwith colors, fonts, spacing - Android: Define
Theme.ktandres/values/colors.xml - Flutter: Create
app_theme.dartwith ThemeData - Web: Configure Tailwind with custom colors in
tailwind.config.ts - Build reusable components matching design specs
- Test RTL layouts with Arabic locale
Maintenance
Design System Updates
- Version control: Semantic versioning (1.0.0)
- Changelog: Document all changes
- Communication: Announce updates to team
- Migration guides: For breaking changes
Regular Reviews
- Quarterly: Review component usage, identify gaps
- Bi-annually: Audit accessibility compliance
- Annually: Major design refresh (if needed)
Resources & Links
Fonts
- Cairo: Google Fonts
- Inter: Google Fonts
Color Tools
Icons
Prototyping
- Figma: figma.com
- Framer: framer.com
Contact & Support
For design system questions or contributions:
- Slack: #design-system
- Email: design@talbino.com
- Figma: [Link to shared library]
Version: 1.0.0
Last Updated: February 2026
Maintained by: Talbino Design Team