Megatel Design System

Tokens, Components, Handoff — How I built the Megatel design system end-to-end, from token extraction and component inventory to state design and developer handoff.

Role

Sole Designer

Product

Mymegatel App

Tool

Figma + Dev Mode

Megatel Design Systems For Accessibility

01 — The Product

What I was Working With

Mymegatel is a multiservice app combining energy and telco billing for NZ customers. Three core screens drove most of the interaction — the Dashboard, Billing, and Payment screens. Each needed to feel consistent, fast to scan, and easy to maintain as the product evolved.

Mymegatel Dashboard
Dashboard
Mymegatel Billing
Billing
Mymegatel Payments
Make Payment
❌ Before Design System
Every screen was designed in isolation. The "Pay now" button on the Billing screen was a different size than the buttons on other screens. List items had 3 different border-radius values across the app. Developers had to ask for specs on every screen.
✓ After Design System
One ListItem component covers all payment rows and navigation rows. One DashboardCard component handles Billing, Usage, Orders, and Rewards. Tokens ensure every radius, color and spacing is consistent across 40+ screens.

02 — Design Tokens

Extracting the App's Visual DNA

Before building a single component, I audited all three screens and extracted every repeated value into tokens. A token is just a named variable — change one value, everything updates.

Figma design system — Mymegatel light/dark screens and color variables

Figma — Mymegatel design variables and prototype screens (light / dark mode). Color tokens and styles panel on the right.

Brand Color Tokens

Token NameValueWhere Used
color/brand/primary#EB0E69Bottom nav active, CTA buttons, gradient start
color/brand/gradient-end#FF6B35Hero gradient, accent highlights
color/action/pay#22C55EPay now CTA border, Automatic Debit badge
color/text/primary#141414All headings, balance amounts
color/text/secondary#888888Due dates, subtitles
color/bg/surface#FFFFFFAll cards, list items

Spacing & Shape Tokens

TokenValueUsed For
spacing/padding/card20pxAll card inner padding (Billing, Dashboard cards)
spacing/padding/list-item16px × 20pxAll list rows (payment options, navigation rows)
spacing/gap/section12pxGap between list items and cards
radius/card20pxDashboard cards, billing card
radius/list-item14pxPayment options rows, navigation list rows
radius/badge100px (full)NEW badge, CTA buttons, "Pay now" bar

Typography Tokens — Type Scale

Typography tokens define every text style in the app as a named variable. Font size, weight, line height — all stored as tokens so text styles stay consistent across every screen.

type/display32px · Bold 800 · LH 1.1
$439.98
type/heading/lg24px · Bold 800
Mymegatel
type/body/md15px · Regular 400
Credit Card
type/label11px · Bold 700 · Uppercase
DUE DATE · CASHBACK

Why type tokens matter: The balance amount $439.98 uses type/display — 32px, weight 800. If the brand ever updates to a different font family, changing one token updates every balance, amount, and hero number across the entire app instantly.

03 — Components

3 Core Components That Power the App

After auditing the screens, I identified that almost every UI element is a variation of just three components. Build these three right, and you can assemble any screen in minutes.

Component 1 — ListItem Row

Every row in the payment list, the billing navigation rows (Billing History, Set up payment, Invoice delivery), and more are all the same ListItem component with different content slots.

Component Anatomy

Structure (Auto Layout — Horizontal):

[ Icon Slot ] + [ Label ] + [ Arrow Icon ]

Tokens applied: color/bg/surface, spacing/padding/list-item, radius/list-item

Variants: Internal (→) · External (↗) · No icon

States: Default · Hover · Pressed · Disabled

Preview
Credit Card
Online Eftpos
WeChat Pay

Component 2 — DashboardCard

The 2×2 card grid on the home screen — Billing, Usage, Order & Request, Reward Points — are all instances of the same DashboardCard component. Each card has a title, an arrow, and a content slot that accepts any child (text, chart, image).

Component Anatomy

Structure (Auto Layout — Vertical):

[ Header Row: Title + ↗ Arrow ]
[ Content Slot — flexible height ]
[ Footer Slot — optional ]

Content slot variants: Amount text · Chart · Image · Badge

Preview
Billing ↗

Total amount

$158.45

Rewards ↗

Cashback

3,000 pts

Component 3 — BillingCard

The prominent green-bordered card on the Billing screen. It always shows a balance amount, a due date, and a "Pay now" action. This component handles the most critical user action in the app. States: Unpaid · Paid · Overdue · Loading.

Component Anatomy

Structure: [ Header: Title + Status Badge ] → [ Amount Display ] → [ CTA Row: "Pay now" + Payment method ]

CTA row uses dark background for maximum contrast. The green border uses color/action/pay to signal "ready to pay."

Preview
Total Amount to pay
Due date 17.04.2024
$439.98
Pay now⊙ Auto Direct Debit

Supporting Components — Buttons & Badges

Beyond the three main components, the app uses a consistent button and badge system across all CTAs. All buttons use radius/badge (100px) — pill shape is a Mymegatel brand signature.

Primary / Ghost / Disabled

Pay nowBackUnavailable

Status Badges

● NEW● OVERDUECASHBACK

04 — Component Inventory

Every Component in the System

A design system is only "full" when you can answer: what components exist, and where is each one used? Here's the complete inventory — 14 components across 3 categories, covering every screen in the app.

Core Components — the building blocks every screen depends on

BillingCard

Balance display + Pay now CTA. States: Unpaid, Paid, Overdue, Loading.

Core
DashboardCard

2×2 grid tiles. Accepts any content slot: text, chart, image, badge.

Core
ListItem Row

Navigation + payment rows. Variants: internal (›), external (↗), no icon.

Core

Supporting Components — used across multiple screens

Button

Primary, Secondary, Ghost, Destructive. Sizes: sm, md, lg. All states included.

Support
Badge / Tag

Status indicators: NEW, OVERDUE, CASHBACK. Pill shape, 4 color variants.

Support
TopBar

Address selector + notification bell. Gradient background in hero variant.

Support
BottomNav

3-tab navigation. Active state uses brand pink. Icons: More, Home, Chat.

Support
Payment Method Row

ListItem variant with brand logo slot. External link arrow (↗) for 3rd-party.

Support
Usage Chart

Bar chart inside DashboardCard. Pink = energy, green = savings.

Support

Layout Components — structural containers

Screen Template

TopBar + scroll area + BottomNav. Base frame all screens are built on.

Layout
Section Header

Page title + back button row. Used on all sub-screens (Make Payment, etc).

Layout
List Container

Vertical stack of ListItem rows with consistent gap/spacing tokens applied.

Layout

The rule: If a UI element appears on more than one screen, it becomes a component. This inventory means any new screen can be assembled from existing pieces — no new component needed for 90% of new features.

05 — State Design

Every State, Designed Before Dev

A component without its states isn't a component — it's a sketch. Designing every interactive and data state in Figma before development means developers never have to improvise a Disabled style or guess what a Loading screen should look like.

Button — All States

Default, Hover, Pressed, Loading, Disabled, Success CTA. Each state uses a specific token. Developers implement these from a single Figma reference.

Default
Pay now
Hover
Pay now
Disabled
Pay now

BillingCard — Data States

The card looks completely different depending on whether the bill is unpaid, overdue, already paid, or loading — each state communicates urgency differently. Overdue uses the brand primary for the CTA bar so urgency overrides the standard hierarchy.

Unpaid
Total to pay
$439.98
Pay now
Paid
Total paid
$439.98
✓ Payment Complete
Overdue
⚠ Overdue
$439.98
Pay now

06 — Auto Layout

How Auto Layout Makes Handoff Effortless

Auto Layout is the bridge between Figma and CSS Flexbox. When a component is built with Auto Layout, the Dev Mode panel generates correct spacing values automatically — no more guesswork from the developer's side.

1

Design in Figma

ListItem row: Horizontal Auto Layout, padding 16px × 20px, gap 14px, Hug height.

2

Dev Mode reads it

Developer clicks the component in Dev Mode — Figma shows exact CSS: display:flex; padding:16px 20px; gap:14px;

3

Content grows ✓

Longer labels? The row stretches. Shorter? It shrinks. No hardcoded heights to break.

4

Zero back-and-forth

"What's the padding here?" → Nobody needs to ask. The answer is always in Figma.

Real example from this project: The Make Payment screen has 8 list items. With Auto Layout, adding WeChat Pay, Alipay, and Apple Pay was just dragging in 3 more instances. The developer implemented it with FlatList using the same spacing values — no spec sheet needed.

07 — Developer Handoff

What Developers Actually Receive

Handoff isn't throwing a file over the fence. A good handoff means a developer can open Figma and answer every question themselves — without a single Slack message to the designer.

Dev Mode — Automatic Specs

Every component in Dev Mode shows pixel-perfect spacing, font sizes, colors (with token names), border radius. All values link back to the token system.

Component States Pre-built

The BillingCard has Unpaid, Paid, Overdue, and Loading states designed. Developers implement all states from a single reference — no assumptions needed.

Annotations in File

The Billing screen includes annotations explaining the green border logic, the dark CTA row contrast rationale, and how the "Auto Direct Debit" badge appears conditionally.

Token Names = Code Variables

Token names like color/action/pay match the variable names in the React Native codebase. No translation layer needed.

Prototype for Interactions

The payment flow — Billing → Make Payment → Confirmation — is fully prototyped so developers can see transitions and navigation logic before writing a line of code.

Visual QA Process

After development, I review the live app against Figma using an overlay tool. Spacing, radius, and color values are checked screen by screen before release.

Back to all projects