The deliverable is a device-framed HTML mockup at the target window size class plus a Compose-ready handoff spec (colors, typography, shapes, spacing, states, tonal elevation). This skill never writes Jetpack Compose code — implementation is left to an Android developer.
Design Android — Mockup and Handoff, Not Code
When
After design-system tokens exist. This skill never writes Jetpack Compose — it produces
a static HTML mockup at exact device dimensions plus a spec an Android developer implements.
Input
design-system.md — OKLCH palette, typography direction, motion personality.
- The screen/flow to mock up and the target window size class.
Steps
- Map tokens to Material 3 type roles.
references/type-scale.md gives the 15-role
baseline scale (displayLarge 57/64sp … labelSmall 11/16sp, Roboto). Material 3
Expressive adds a parallel 15-role Emphasized set on top (30 roles total) for
stronger visual rhythm — use baseline by default, reach for Emphasized when the tone
from design-method calls for it. Source: m3.material.io/styles/typography/type-scale-tokens.
- Map tokens to Material 3 color roles.
references/color-roles.md documents the
core role families (primary/secondary/tertiary + surface/onSurface) derived from a seed
color. Material 3's full role system is larger — 45 color roles, including a
surface-container ramp (lowest → highest: surfaceContainerLowest,
surfaceContainerLow, surfaceContainer, surfaceContainerHigh,
surfaceContainerHighest — 5 levels for layering surfaces without shadow), error/
onError/errorContainer (kept static, never derived from the dynamic seed, so
error states stay legible regardless of theme), and dynamic color: on Android 12+
all roles can be generated tonally from a user's wallpaper/seed, not just the design
seed. Source: m3.material.io/styles/color/roles,
m3.material.io/styles/color/system/how-the-system-works. Gap: color-roles.md
documents the core families, not the full 45-role/surface-container enumeration — use
the fact above until that reference is expanded (out of this pass's exclusive scope).
- Map tokens to shapes.
references/shape-scale.md (never an arbitrary
border-radius). Material 3's full shape scale extends to 32dp, 48dp, and Full
(pill) beyond what's currently listed — Expressive defaults buttons to pill (Full)
shape unless a product reason calls for a smaller radius. Source:
m3.material.io/styles/shape/shape-scale-tokens. Gap: shape-scale.md stops at 28dp
(Extra Large); reconfirm 32/48/Full on the m3.material.io page above until expanded.
- Apply elevation as tokens, not ad-hoc shadow. 6 levels, 0 → 5, mapping to
0 / 1 / 3 / 6 / 8 / 12dp. Elevation is expressed via shadow at each level —
the older
surfaceTint-only approach is deprecated; don't rely on tint alone to
convey elevation. Source: m3.material.io/styles/elevation/overview. Gap: no
references/elevation.md exists yet — these token values are grounded but inlined
here pending a dedicated reference file (out of this pass's exclusive scope).
- Pick the window size class from
references/window-size-classes.md — mock up at
the dp width that matches the target device class (phone/foldable/tablet/desktop).
- Build the HTML mockup: a device-frame
<div> sized in dp-equivalent px, following
the 4dp base / 8dp grid throughout.
- Verify touch targets and spacing: 48×48dp minimum touch target, ≥ 8dp spacing
between adjacent targets — see
references/touch-targets.md.
- FAB: pick one of 3 tiers, sized to the screen's primary-action weight — small FAB
is deprecated in Material 3 Expressive, don't use it. Source:
m3.material.io/components/floating-action-button/overview. Gap: no dedicated FAB
reference file yet; the 3 surviving tiers and their exact dp sizes should be reconfirmed
on the page above before finalizing a mockup.
- Motion: Material 3 Expressive uses spring-physics-based motion (not fixed
duration/easing curves) for its signature feel; the legacy duration/easing-curve tokens
still apply where spring motion isn't specified. Source:
m3.material.io/styles/motion/overview. Gap: no
references/motion.md exists yet —
note spring vs legacy-easing choice explicitly in the handoff spec until one exists.
- Write the handoff spec per
references/handoff-compose.md: colors →
MaterialTheme.colorScheme.*, typography → MaterialTheme.typography.*, shapes →
MaterialTheme.shapes.*, custom spacing scale in dp, explicit sizing, states + tonal
elevation (name the elevation level, 0–5, not just "raised"/"flat"), and
start/end (never left/right) for RTL correctness.
Failure Handling
- Screenshot/preview tooling unavailable → describe the mockup in the handoff spec with
exact dp values instead of blocking on a visual.
- A fact needed isn't in the references below → mark it "to reconfirm on
developer.android.com / m3.material.io" in the output; never invent a number. This
applies especially to the gaps flagged in Steps 2–4, 8, 9 above (full 45-role color
system, 32/48dp/Full shapes, FAB tier dp sizes, motion spring parameters) — the
reference files for these are not yet expanded/created; do not backfill invented
numbers to close that gap silently.
Output
- Device-framed HTML mockup at the target window size class.
handoff.md (or equivalent) with Compose theme mappings, spacing, sizing, states,
tonal elevation (level 0–5) — ready for an Android developer.
Next → design-review (mockup-scoped: screenshot the mockup, verify contrast, no
full site audit loop).
References
| File |
Purpose |
references/type-scale.md |
Canonical Material 3 baseline type scale — verified material-components-android (Expressive Emphasized set: see Step 1 above, not yet a separate file) |
references/shape-scale.md |
Canonical shape/corner-radius scale — verified m3.material.io (stops at 28dp — 32/48/Full gap, see Step 3) |
references/color-roles.md |
Canonical Material 3 core color-role families — verified m3.material.io (45-role/surface-container/dynamic-color gap, see Step 2) |
references/window-size-classes.md |
Canonical window size classes — verified developer.android.com |
references/touch-targets.md |
48×48dp target + 8dp spacing — verified |
references/handoff-compose.md |
Compose-ready handoff spec format |
Gaps (grounded facts, no reference file yet — inlined in Steps above, flagged for future
references/elevation.md, references/motion.md, FAB-tier detail; out of this pass's
exclusive scope to create): elevation tokens 0–5, FAB tiers, spring motion.
1---2name: design-android3description: Use when designing an Android screen or flow — deliverable is a device-framed HTML mockup and developer handoff spec, never Compose code.4---56<objective>7Produces Android mockups and developer handoff specs: mapping design tokens to the Material 3 Expressive type scale (baseline plus the parallel Emphasized set), the full color-role system (45 roles, including the surface-container ramp and dynamic color), elevation tokens, the shape scale, window size classes, and FAB tiers.89The deliverable is a device-framed HTML mockup at the target window size class plus a Compose-ready handoff spec (colors, typography, shapes, spacing, states, tonal elevation). This skill never writes Jetpack Compose code — implementation is left to an Android developer.10</objective>1112## Design Android — Mockup and Handoff, Not Code1314### When15After `design-system` tokens exist. This skill never writes Jetpack Compose — it produces16a static HTML mockup at exact device dimensions plus a spec an Android developer implements.1718### Input19- `design-system.md` — OKLCH palette, typography direction, motion personality.20- The screen/flow to mock up and the target window size class.2122### Steps23241. **Map tokens to Material 3 type roles.** `references/type-scale.md` gives the 15-role25 baseline scale (displayLarge 57/64sp … labelSmall 11/16sp, Roboto). Material 326 Expressive adds a parallel **15-role Emphasized set** on top (30 roles total) for27 stronger visual rhythm — use baseline by default, reach for Emphasized when the tone28 from `design-method` calls for it. Source: m3.material.io/styles/typography/type-scale-tokens.292. **Map tokens to Material 3 color roles.** `references/color-roles.md` documents the30 core role families (primary/secondary/tertiary + surface/onSurface) derived from a seed31 color. Material 3's full role system is larger — **45 color roles**, including a32 **surface-container ramp** (lowest → highest: `surfaceContainerLowest`,33 `surfaceContainerLow`, `surfaceContainer`, `surfaceContainerHigh`,34 `surfaceContainerHighest` — 5 levels for layering surfaces without shadow), `error`/35 `onError`/`errorContainer` (kept **static**, never derived from the dynamic seed, so36 error states stay legible regardless of theme), and **dynamic color**: on Android 12+37 all roles can be generated tonally from a user's wallpaper/seed, not just the design38 seed. Source: m3.material.io/styles/color/roles,39 m3.material.io/styles/color/system/how-the-system-works. **Gap**: `color-roles.md`40 documents the core families, not the full 45-role/surface-container enumeration — use41 the fact above until that reference is expanded (out of this pass's exclusive scope).423. **Map tokens to shapes.** `references/shape-scale.md` (never an arbitrary43 border-radius). Material 3's full shape scale extends to **32dp, 48dp, and Full**44 (pill) beyond what's currently listed — Expressive defaults buttons to **pill (Full)**45 shape unless a product reason calls for a smaller radius. Source:46 m3.material.io/styles/shape/shape-scale-tokens. **Gap**: `shape-scale.md` stops at 28dp47 (Extra Large); reconfirm 32/48/Full on the m3.material.io page above until expanded.484. **Apply elevation as tokens, not ad-hoc shadow.** 6 levels, **0 → 5**, mapping to49 **0 / 1 / 3 / 6 / 8 / 12dp**. Elevation is expressed via **shadow** at each level —50 the older `surfaceTint`-only approach is **deprecated**; don't rely on tint alone to51 convey elevation. Source: m3.material.io/styles/elevation/overview. **Gap**: no52 `references/elevation.md` exists yet — these token values are grounded but inlined53 here pending a dedicated reference file (out of this pass's exclusive scope).545. **Pick the window size class** from `references/window-size-classes.md` — mock up at55 the dp width that matches the target device class (phone/foldable/tablet/desktop).566. **Build the HTML mockup**: a device-frame `<div>` sized in dp-equivalent px, following57 the 4dp base / 8dp grid throughout.587. **Verify touch targets and spacing**: 48×48dp minimum touch target, ≥ 8dp spacing59 between adjacent targets — see `references/touch-targets.md`.608. **FAB: pick one of 3 tiers**, sized to the screen's primary-action weight — small FAB61 is **deprecated** in Material 3 Expressive, don't use it. Source:62 m3.material.io/components/floating-action-button/overview. **Gap**: no dedicated FAB63 reference file yet; the 3 surviving tiers and their exact dp sizes should be reconfirmed64 on the page above before finalizing a mockup.659. **Motion**: Material 3 Expressive uses **spring-physics-based motion** (not fixed66 duration/easing curves) for its signature feel; the legacy duration/easing-curve tokens67 still apply where spring motion isn't specified. Source:68 m3.material.io/styles/motion/overview. **Gap**: no `references/motion.md` exists yet —69 note spring vs legacy-easing choice explicitly in the handoff spec until one exists.7010. **Write the handoff spec** per `references/handoff-compose.md`: colors →71 `MaterialTheme.colorScheme.*`, typography → `MaterialTheme.typography.*`, shapes →72 `MaterialTheme.shapes.*`, custom spacing scale in dp, explicit sizing, states + tonal73 elevation (name the elevation *level*, 0–5, not just "raised"/"flat"), and74 **start/end** (never left/right) for RTL correctness.7576### Failure Handling77- Screenshot/preview tooling unavailable → describe the mockup in the handoff spec with78 exact dp values instead of blocking on a visual.79- A fact needed isn't in the references below → mark it "to reconfirm on80 developer.android.com / m3.material.io" in the output; never invent a number. This81 applies especially to the gaps flagged in Steps 2–4, 8, 9 above (full 45-role color82 system, 32/48dp/Full shapes, FAB tier dp sizes, motion spring parameters) — the83 reference files for these are not yet expanded/created; do not backfill invented84 numbers to close that gap silently.8586### Output87- Device-framed HTML mockup at the target window size class.88- `handoff.md` (or equivalent) with Compose theme mappings, spacing, sizing, states,89 tonal elevation (level 0–5) — ready for an Android developer.9091### Next → `design-review` (mockup-scoped: screenshot the mockup, verify contrast, no92full site audit loop).9394### References95| File | Purpose |96|------|---------|97| `references/type-scale.md` | **Canonical Material 3 baseline type scale — verified material-components-android** (Expressive Emphasized set: see Step 1 above, not yet a separate file) |98| `references/shape-scale.md` | **Canonical shape/corner-radius scale — verified m3.material.io** (stops at 28dp — 32/48/Full gap, see Step 3) |99| `references/color-roles.md` | **Canonical Material 3 core color-role families — verified m3.material.io** (45-role/surface-container/dynamic-color gap, see Step 2) |100| `references/window-size-classes.md` | **Canonical window size classes — verified developer.android.com** |101| `references/touch-targets.md` | 48×48dp target + 8dp spacing — verified |102| `references/handoff-compose.md` | Compose-ready handoff spec format |103104**Gaps (grounded facts, no reference file yet — inlined in Steps above, flagged for future105`references/elevation.md`, `references/motion.md`, FAB-tier detail; out of this pass's106exclusive scope to create)**: elevation tokens 0–5, FAB tiers, spring motion.