// Transport app UI

Electric Bike App UI Design in Expo

This electric bike app UI lets riders choose, check and ride a bike. Large product cut-outs lead each screen, with battery, usage and distance beside them.

Screens
3
Built with
Expo SDK 58
Fonts
Inter
License
Free (MIT)
Electric bike detail screen with battery level, usage and distance stats

Volta E-Bike app screens

Electric bike detail screen with battery level, usage and distance stats

Bike detail

A large bike photo, battery meter, usage and distance tiles and a swipe to book control.

E-bike app home with category chips and bike cards

Bike list

Rider profile, search, category chips and bike cards with usage, battery and a booking control.

Bike navigation screen with a mountain road and next turn card

Ride navigation

A road photo with a route overlay, a map mode switch and a sheet with the next turn and ride stats.

Copy the Volta E-Bike kit

Use the artifact as a design brief, the skill to generate the UI with an AI agent, or the code to run it right away.

Design artifact

The full design: tokens, screens and source

# Volta E-Bike: design artifact

This electric bike app UI lets riders choose, check and ride a bike. Large product cut-outs lead each screen, with battery, usage and distance beside them.

- Type: Transport mobile app UI
- Screens: 3
- Artboard: 390 × 844
- Target: Expo SDK 58, Expo Router, TypeScript, expo-image, react-native-svg
- Live page: https://developermill.com/app-designs/electric-bike-app-ui-design

## Design direction

Clean white and light grey with a sunny yellow accent, oversized product photos that break the card edges and dark stat tiles.

- Oversized bike photos that overflow their cards
- Vertical battery meter
- Category chips with selected state
- Road view with next turn and ride stats

## Foundations

### Colour

| Token | Hex |
| --- | --- |
| Volta yellow | `#FFC93C` |
| Ink | `#111111` |
| Lime | `#C6F05A` |
| Orange | `#FF8A4C` |
| Fog | `#F2F2F2` |
| Steel | `#6B6B6B` |

### Typography

- Typefaces: Inter
- Common sizes (px): 12, 13, 14, 15, 17, 18, 26, 40

### Shape and depth

- Common corner radii (px): 17, 20, 22, 24, 25, 32
- Shadows: `0 2px 8px rgba(0,0,0,0.06)`

## Screens

### 1. Bike detail

A large bike photo, battery meter, usage and distance tiles and a swipe to book control.

Preview: https://developermill.com/app-designs/electric-bike-app-ui-design/bike.webp

Copy on this screen:

- VOLTA S50
- VOLTA S50 is a sleek, powerful, and versatile electric bike.
- 89%
- Usage Time
- 21h 12m
- Distance
- 165Km
- Swipe To Book
- ›››

### 2. Bike list

Rider profile, search, category chips and bike cards with usage, battery and a booking control.

Preview: https://developermill.com/app-designs/electric-bike-app-ui-design/home.webp

Copy on this screen:

- Max Cole
- Premium
- VOLTA S50
- Usage Time
- 21h 22m
- 89%
- Swipe To Book
- ›››
- VOLTA D50
- 23h 18m
- 79%

### 3. Ride navigation

A road photo with a route overlay, a map mode switch and a sheet with the next turn and ride stats.

Preview: https://developermill.com/app-designs/electric-bike-app-ui-design/navigate.webp

Copy on this screen:

- Rocky Ridge Colorado
- Highway (Route 67)
- In 32m, Turn Left
- Time Left
- 00:19:29
- Calories
- 629 Kcal
- Distance
- 19 Km

## Full source

The original artboards as HTML. Image URLs point at the hosted demo assets.

### Bike detail (Main)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Volta S50 – bike detail</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&amp;display=swap" rel="stylesheet">
<style>
body{margin:0}
a{color:inherit;text-decoration:none}a:hover{color:inherit}
</style>
</helmet>
<div style="width: 390px; height: 844px; box-sizing: border-box; position: relative; overflow: hidden; background: #FFFFFF; font-family: Inter, system-ui, sans-serif; color: #111111; display: flex; flex-direction: column; padding: 58px 22px 30px">
  <div style="display: flex; justify-content: space-between; align-items: center">
    <a href="Home.dc.html" aria-label="Back" style="width: 48px; height: 48px; border-radius: 24px; background: #F2F2F2; display: flex; align-items: center; justify-content: center">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"></path></svg>
    </a>
    <button type="button" aria-label="Settings" style="width: 48px; height: 48px; border-radius: 24px; background: #F2F2F2; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg>
    </button>
  </div>

  <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-top: 22px; gap: 16px">
    <div style="display: flex; flex-direction: column; gap: 10px; max-width: 250px">
      <h1 style="margin: 0; font-size: 40px; font-weight: 400; letter-spacing: -0.5px; line-height: 1.1">VOLTA S50</h1>
      <p style="margin: 0; font-size: 15px; line-height: 1.5; color: #6B6B6B">VOLTA S50 is a sleek, powerful, and versatile electric bike.</p>
    </div>
    <div style="width: 54px; border-radius: 27px; border: 1px solid #ECECEC; background: #FFFFFF; display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 12px 0 12px; flex-shrink: 0">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="#111111" aria-hidden="true"><path d="M13 2L4 14h7l-1 8 9-12h-7l1-8z"></path></svg>
      <div style="width: 34px; height: 92px; border-radius: 17px; background: #F2F2F2; display: flex; align-items: flex-end; overflow: hidden">
        <div style="width: 34px; height: 82px; border-radius: 17px; background: {{accent}}"></div>
      </div>
      <span style="font-size: 13px; font-weight: 600">89%</span>
    </div>
  </div>

  <div style="flex-grow: 1; position: relative">
    <img src="https://developermill.com/app-designs/electric-bike-app-ui-design/assets/71a9755ef5.png" alt="Volta S50 electric bike in sage green" style="position: absolute; left: -150px; top: 4px; width: 530px; height: auto">
  </div>

  <div style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px">
    <div style="background: {{accent}}; border-radius: 22px; padding: 18px 16px; display: flex; flex-direction: column; gap: 14px; height: 116px; box-sizing: border-box">
      <span style="font-size: 14px; font-weight: 500">Usage Time</span>
      <div style="display: flex; justify-content: space-between; align-items: center">
        <span style="font-size: 26px; font-weight: 600; letter-spacing: -0.3px">21h 12m</span>
        <span style="width: 40px; height: 40px; border-radius: 20px; background: #111111; display: flex; align-items: center; justify-content: center">
          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17L17 7M8 7h9v9"></path></svg>
        </span>
      </div>
    </div>
    <div style="background: #111111; color: #FFFFFF; border-radius: 22px; padding: 18px 16px; display: flex; flex-direction: column; gap: 14px; height: 116px; box-sizing: border-box">
      <span style="font-size: 14px; font-weight: 500">Distance</span>
      <div style="display: flex; justify-content: space-between; align-items: center">
        <span style="font-size: 26px; font-weight: 600; letter-spacing: -0.3px">165Km</span>
        <span style="width: 40px; height: 40px; border-radius: 20px; background: #FFFFFF; display: flex; align-items: center; justify-content: center">
          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17L17 7M8 7h9v9"></path></svg>
        </span>
      </div>
    </div>
  </div>

  <a href="Navigate.dc.html" style="margin-top: 12px; height: 64px; border-radius: 32px; background: #F2F2F2; display: flex; align-items: center; padding: 0 8px; gap: 12px">
    <span style="width: 50px; height: 50px; border-radius: 25px; background: #FFFFFF; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(0,0,0,0.06)">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="11" width="14" height="10" rx="2"></rect><path d="M8 11V7a4 4 0 0 1 8 0v4"></path></svg>
    </span>
    <span style="flex-grow: 1; text-align: center; font-size: 15px; color: #6B6B6B">Swipe To Book</span>
    <span style="font-size: 15px; letter-spacing: 2px; color: #9A9A9A; padding-right: 14px">›››</span>
  </a>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#FFC93C","options":["#FFC93C","#C6F05A","#FF8A4C"]},"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
  renderVals() {
    return { accent: this.props.accent ?? '#FFC93C' };
  }
}
</script>
</body>
</html>
```

### Bike list (Home)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Volta – bike list</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&amp;display=swap" rel="stylesheet">
<style>
body{margin:0}
a{color:inherit;text-decoration:none}a:hover{color:inherit}
input::placeholder{color:#8A8A8A}
</style>
</helmet>
<div style="width: 390px; height: 844px; box-sizing: border-box; position: relative; overflow: hidden; background: #F4F4F4; font-family: Inter, system-ui, sans-serif; color: #111111; display: flex; flex-direction: column; gap: 16px; padding: 58px 18px 0">
  <div style="display: flex; justify-content: space-between; align-items: center">
    <button type="button" aria-label="Menu" style="width: 48px; height: 48px; border-radius: 24px; background: #FFFFFF; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"></path></svg>
    </button>
    <div style="display: flex; align-items: center; gap: 10px; background: #FFFFFF; border-radius: 30px; padding: 5px 16px 5px 5px">
      <img src="https://developermill.com/app-designs/electric-bike-app-ui-design/assets/25d2a7a6f3.jpg" alt="Max Cole" style="width: 42px; height: 42px; border-radius: 21px; object-fit: cover">
      <div style="display: flex; flex-direction: column; gap: 1px">
        <span style="font-size: 15px; font-weight: 600">Max Cole</span>
        <span style="font-size: 12px; color: #6B6B6B">Premium</span>
      </div>
    </div>
  </div>

  <label style="height: 50px; border-radius: 25px; background: #FFFFFF; display: flex; align-items: center; gap: 10px; padding: 0 18px">
    <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#6B6B6B" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="M20 20l-3.5-3.5"></path></svg>
    <input type="search" placeholder="Search" aria-label="Search bikes" style="border: none; outline: none; background: transparent; font-family: inherit; font-size: 15px; color: #111111; flex-grow: 1">
  </label>

  <div style="display: flex; gap: 8px; margin-right: -18px; overflow: hidden">
    <sc-for list="{{chips}}" as="chip" hint-placeholder-count="4">
      <button type="button" onClick="{{chip.pick}}" style="{{chip.style}}">{{chip.label}}</button>
    </sc-for>
  </div>

  <a href="Main.dc.html" style="position: relative; height: 330px; border-radius: 28px; background: #FFFFFF; overflow: hidden; flex-shrink: 0; display: block">
    <div style="position: absolute; left: 20px; top: 22px; display: flex; flex-direction: column; gap: 6px">
      <span style="font-size: 26px; font-weight: 500; letter-spacing: -0.3px">VOLTA S50</span>
      <span style="font-size: 13px; color: #6B6B6B; margin-top: 12px">Usage Time</span>
      <span style="font-size: 26px; font-weight: 600; letter-spacing: -0.3px">21h 22m</span>
    </div>
    <div style="position: absolute; right: 16px; top: 22px; display: flex; align-items: center; gap: 6px">
      <span style="width: 34px; height: 34px; border-radius: 17px; background: #111111; display: flex; align-items: center; justify-content: center">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="5.5" cy="16.5" r="3.5"></circle><circle cx="18.5" cy="16.5" r="3.5"></circle><path d="M5.5 16.5L9 9h6l3.5 7.5M9 9l3 7.5h-6.5M15 9l-1-3h-2.5"></path></svg>
      </span>
      <span style="font-size: 14px; font-weight: 600">89%</span>
    </div>
    <img src="https://developermill.com/app-designs/electric-bike-app-ui-design/assets/71a9755ef5.png" alt="Volta S50 electric bike in sage green" style="position: absolute; left: 120px; top: 70px; width: 340px; height: auto">
    <span style="position: absolute; left: 14px; right: 14px; bottom: 14px; height: 58px; border-radius: 29px; background: rgba(240,240,240,0.82); display: flex; align-items: center; gap: 10px; padding: 0 6px">
      <span style="width: 46px; height: 46px; border-radius: 23px; background: #FFFFFF; display: flex; align-items: center; justify-content: center">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="11" width="14" height="10" rx="2"></rect><path d="M8 11V7a4 4 0 0 1 8 0v4"></path></svg>
      </span>
      <span style="flex-grow: 1; text-align: center; font-size: 14px; color: #5E5E5E">Swipe To Book</span>
      <span style="font-size: 14px; letter-spacing: 2px; color: #8A8A8A; padding-right: 12px">›››</span>
    </span>
  </a>

  <div style="position: relative; height: 330px; border-radius: 28px; background: #FFFFFF; overflow: hidden; flex-shrink: 0">
    <div style="position: absolute; left: 20px; top: 22px; display: flex; flex-direction: column; gap: 6px">
      <span style="font-size: 26px; font-weight: 500; letter-spacing: -0.3px">VOLTA D50</span>
      <span style="font-size: 13px; color: #6B6B6B; margin-top: 12px">Usage Time</span>
      <span style="font-size: 26px; font-weight: 600; letter-spacing: -0.3px">23h 18m</span>
    </div>
    <div style="position: absolute; right: 16px; top: 22px; display: flex; align-items: center; gap: 6px">
      <span style="width: 34px; height: 34px; border-radius: 17px; background: #111111; display: flex; align-items: center; justify-content: center">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="5.5" cy="16.5" r="3.5"></circle><circle cx="18.5" cy="16.5" r="3.5"></circle><path d="M5.5 16.5L9 9h6l3.5 7.5M9 9l3 7.5h-6.5M15 9l-1-3h-2.5"></path></svg>
      </span>
      <span style="font-size: 14px; font-weight: 600">79%</span>
    </div>
    <img src="https://developermill.com/app-designs/electric-bike-app-ui-design/assets/ac289eaeaa.png" alt="Volta D50 electric bike in yellow" style="position: absolute; left: 140px; top: 74px; width: 330px; height: auto">
  </div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#FFC93C","options":["#FFC93C","#C6F05A","#FF8A4C"]},"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
  constructor(props) {
    super(props);
    this.state = { picked: 'All' };
  }
  renderVals() {
    const accent = this.props.accent ?? '#FFC93C';
    const base = 'height: 44px; border-radius: 22px; padding: 0 20px; font-family: inherit; font-size: 14px; font-weight: 500; white-space: nowrap; cursor: pointer; flex-shrink: 0; color: #111111; ';
    const chips = ['All', 'Trail Bike', 'Hybrid Bike', 'City Bike'].map((label) => ({
      label,
      style: base + (this.state.picked === label
        ? 'background: ' + accent + '; border: 1px solid ' + accent + ';'
        : 'background: #FFFFFF; border: 1px solid #E4E4E4;'),
      pick: () => this.setState({ picked: label })
    }));
    return { accent, chips };
  }
}
</script>
</body>
</html>
```

### Ride navigation (Navigate)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Volta – ride navigation</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&amp;display=swap" rel="stylesheet">
<style>
body{margin:0}
a{color:inherit;text-decoration:none}a:hover{color:inherit}
</style>
</helmet>
<div style="width: 390px; height: 844px; box-sizing: border-box; position: relative; overflow: hidden; background: #111111; font-family: Inter, system-ui, sans-serif; color: #111111">
  <img src="https://developermill.com/app-designs/electric-bike-app-ui-design/assets/3d91eb8069.jpg" alt="Empty mountain highway with double yellow lines through a pine forest" style="position: absolute; left: 0; top: 0; width: 390px; height: 620px; object-fit: cover; object-position: center 40%">

  <div style="position: absolute; left: 18px; right: 18px; top: 58px; display: flex; justify-content: space-between; align-items: center">
    <a href="Main.dc.html" aria-label="Back" style="width: 48px; height: 48px; border-radius: 24px; background: rgba(255,255,255,0.3); display: flex; align-items: center; justify-content: center">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"></path></svg>
    </a>
    <div role="group" aria-label="Map type" style="display: flex; background: #FFFFFF; border-radius: 24px; padding: 4px; gap: 2px">
      <sc-for list="{{modes}}" as="mode" hint-placeholder-count="2">
        <button type="button" onClick="{{mode.pick}}" aria-pressed="{{mode.on}}" style="{{mode.style}}">{{mode.label}}</button>
      </sc-for>
    </div>
  </div>

  <div style="position: absolute; left: 0; right: 0; bottom: 0; background: #FFFFFF; border-radius: 32px 32px 0 0; padding: 12px 16px 30px; display: flex; flex-direction: column; gap: 12px">
    <div style="width: 40px; height: 4px; border-radius: 2px; background: #DADADA; align-self: center"></div>
    <div style="display: flex; align-items: center; gap: 12px">
      <span style="width: 48px; height: 48px; border-radius: 24px; border: 1px solid #ECECEC; display: flex; align-items: center; justify-content: center; flex-shrink: 0">
        <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="5.5" cy="16.5" r="3.5"></circle><circle cx="18.5" cy="16.5" r="3.5"></circle><path d="M5.5 16.5L9 9h6l3.5 7.5M9 9l3 7.5h-6.5M15 9l-1-3h-2.5"></path></svg>
      </span>
      <div style="display: flex; flex-direction: column; gap: 2px; flex-grow: 1">
        <span style="font-size: 17px; font-weight: 600">Rocky Ridge Colorado</span>
        <span style="font-size: 13px; color: #6B6B6B">Highway (Route 67)</span>
      </div>
      <button type="button" aria-label="Recenter" style="width: 52px; height: 52px; border-radius: 26px; background: #111111; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; flex-shrink: 0">
        <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="6.5"></circle><circle cx="12" cy="12" r="2" fill="#FFFFFF"></circle><path d="M12 2v3M12 19v3M2 12h3M19 12h3"></path></svg>
      </button>
    </div>

    <div style="background: #F4F4F4; border-radius: 24px; padding: 20px 18px 20px 22px; display: flex; align-items: center; justify-content: space-between; gap: 12px">
      <span style="font-size: 26px; font-weight: 500; letter-spacing: -0.3px; line-height: 1.25">In 32m, Turn Left</span>
      <span style="width: 64px; height: 64px; border-radius: 32px; background: {{accent}}; display: flex; align-items: center; justify-content: center; flex-shrink: 0">
        <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6L4 11l5 5"></path><path d="M4 11h9a5 5 0 0 1 5 5v4"></path></svg>
      </span>
    </div>

    <div style="display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; padding: 6px 6px 0">
      <div style="display: flex; flex-direction: column; gap: 4px">
        <span style="font-size: 13px; color: #6B6B6B">Time Left</span>
        <span style="font-size: 18px; font-weight: 600">00:19:29</span>
      </div>
      <div style="display: flex; flex-direction: column; gap: 4px; align-items: center">
        <span style="font-size: 13px; color: #6B6B6B">Calories</span>
        <span style="font-size: 18px; font-weight: 600">629 Kcal</span>
      </div>
      <div style="display: flex; flex-direction: column; gap: 4px; align-items: flex-end">
        <span style="font-size: 13px; color: #6B6B6B">Distance</span>
        <span style="font-size: 18px; font-weight: 600">19 Km</span>
      </div>
    </div>
  </div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#FFC93C","options":["#FFC93C","#C6F05A","#FF8A4C"]},"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
  constructor(props) {
    super(props);
    this.state = { mode: 'Road' };
  }
  renderVals() {
    const base = 'height: 40px; border-radius: 20px; padding: 0 18px; border: none; font-family: inherit; font-size: 14px; font-weight: 500; cursor: pointer; ';
    const modes = ['Road', 'Satellite'].map((label) => {
      const on = this.state.mode === label;
      return {
        label,
        on: on ? 'true' : 'false',
        style: base + (on ? 'background: #111111; color: #FFFFFF;' : 'background: transparent; color: #111111;'),
        pick: () => this.setState({ mode: label })
      };
    });
    return { accent: this.props.accent ?? '#FFC93C', modes };
  }
}
</script>
</body>
</html>
```

SKILL.md

Save as .claude/skills/electric-bike-app-ui/SKILL.md

---
name: electric-bike-app-ui
description: Build the Volta E-Bike mobile app UI in Expo React Native. Use when asked to create a electric bike app UI or a new screen in this visual style.
---

# Volta E-Bike app UI

Build this transport app UI in an Expo Router project with TypeScript.

Reference: https://developermill.com/app-designs/electric-bike-app-ui-design

## Visual direction

Clean white and light grey with a sunny yellow accent, oversized product photos that break the card edges and dark stat tiles.

Keep these signature details:

- Oversized bike photos that overflow their cards
- Vertical battery meter
- Category chips with selected state
- Road view with next turn and ride stats

## Set up

```bash
npx expo install expo-image react-native-svg @expo-google-fonts/inter expo-font
```

## Tokens

| Name | Hex |
| --- | --- |
| Volta yellow | `#FFC93C` |
| Ink | `#111111` |
| Lime | `#C6F05A` |
| Orange | `#FF8A4C` |
| Fog | `#F2F2F2` |
| Steel | `#6B6B6B` |

- Typefaces: Inter
- Text sizes (px): 12, 13, 14, 15, 17, 18, 26, 40
- Corner radii (px): 17, 20, 22, 24, 25, 32

Define these once and reuse them. Do not add new colours.

## Screens

1. **Bike detail.** A large bike photo, battery meter, usage and distance tiles and a swipe to book control.
2. **Bike list.** Rider profile, search, category chips and bike cards with usage, battery and a booking control.
3. **Ride navigation.** A road photo with a route overlay, a map mode switch and a sheet with the next turn and ride stats.

## Build rules

- Draw each screen on a 390 × 844 artboard and scale it to the device width.
- Load each custom font weight by family name with expo-font. Do not set fontWeight with custom fonts.
- Draw icons, charts and illustrations with react-native-svg.
- Use Pressable with an accessibilityLabel for controls, with at least a 44px target.
- Navigate with router.navigate and keep sample data as constants at the top of the file.
- Use expo-image with contentFit for photos.

## Done when

- All routes are linked and reachable.
- Colours, type and radii match the tokens above.
- `npx tsc --noEmit` and `npx expo lint` pass.
- The layout holds up on small and large phones.

Set up the project

npx create-expo-app@latest electric-bike-app --template default
cd electric-bike-app
rm -rf src
npx expo install expo-image react-native-svg @expo-google-fonts/inter expo-font

src/app/_layout.tsx

import { Inter_400Regular, Inter_500Medium, Inter_600SemiBold } from '@expo-google-fonts/inter';
import { useFonts } from 'expo-font';
import { Stack } from 'expo-router';

export default function RootLayout() {
  const [fontsLoaded] = useFonts({ Inter_400Regular, Inter_500Medium, Inter_600SemiBold });

  if (!fontsLoaded) return null;

  return <Stack screenOptions={{ headerShown: false }} />;
}

About this design

A swipe-to-book control sits on each bike card, and the navigation screen pairs a road view with a clear next turn. The layout fits e-bike rentals, scooters and connected vehicle companion apps.

Clean white and light grey with a sunny yellow accent, oversized product photos that break the card edges and dark stat tiles.

  • Oversized bike photos that overflow their cards
  • Vertical battery meter
  • Category chips with selected state
  • Road view with next turn and ride stats

Colour palette

  • Volta yellow

    #FFC93C

  • Ink

    #111111

  • Lime

    #C6F05A

  • Orange

    #FF8A4C

  • Fog

    #F2F2F2

  • Steel

    #6B6B6B

How to use this design

  1. 01

    Pick what to copy

    Copy the Volta E-Bike artifact, skill or code from this page.

  2. 02

    Run it or generate it

    Paste the code into a new Expo app and start it, or give the skill to your AI coding agent.

  3. 03

    Make it yours

    Replace the demo images and sample content, then connect your own data.

Frequently asked questions

Do the chips and map switch work?

Yes. Category chips and the Road and Satellite switch hold selected state. Filter your bike list or map style from those values.

Is the swipe to book control functional?

It is styled as a static control. Add a pan gesture with react-native-gesture-handler to make it slide.

Can it be used for scooters?

Yes. Replace the photos and stats. The list, detail and navigation screens stay the same.

Is the Volta E-Bike design free to use?

Yes. The design, skill and Expo code are free and MIT licensed, including for commercial apps. Replace the demo images and sample content with your own before you ship.

What is the difference between the artifact, skill and code?

The artifact is the full design: tokens, screens and source. The skill is a SKILL.md that teaches an AI coding agent to build the UI. The code is the finished Expo app you can paste in and run.

Which Expo version does the code use?

It targets Expo SDK 58 with Expo Router and TypeScript. It uses packages installed through npx expo install, with no custom native code.

More app UI designs