// Travel app UI
Trip Planner App UI Design in Expo
This trip planner app UI reads like a travel magazine at night. Serif italics and small monospaced labels turn destination cards and itineraries into something worth browsing.
- Screens
- 3
- Built with
- Expo SDK 58
- Fonts
- Inter, Instrument Serif, JetBrains Mono
- License
- Free (MIT)

Trip Manager app screens

Discover
A serif welcome, AI search, category chips, a large editor's pack card and trending destinations.

Map view
A dark map with photo pins and labels, glass search and filter controls, and a nearby places shelf.

Trip details
A photo strip, trip status and duration, a local tip and a day-by-day trip log.
Copy the Trip Manager 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
# Trip Manager: design artifact
This trip planner app UI reads like a travel magazine at night. Serif italics and small monospaced labels turn destination cards and itineraries into something worth browsing.
- Type: Travel mobile app UI
- Screens: 3
- Artboard: 390 × 844
- Target: Expo SDK 58, Expo Router, TypeScript, expo-blur, expo-image, expo-linear-gradient, react-native-svg
- Live page: https://developermill.com/app-designs/trip-planner-app-ui-design
## Design direction
Blue-black night mode with an electric blue accent, editorial serif italics, monospaced labels and glass controls over photography.
- Search bar with an AI mode button
- Dark map with round photo pins
- Nearby place cards in a bottom shelf
- Trip log with status, tips and timeline
## Foundations
### Colour
| Token | Hex |
| --- | --- |
| Night | `#06070A` |
| Carbon | `#101218` |
| Electric blue | `#3D6BFF` |
| Sky | `#7FA2FF` |
| Fog | `#D5D8DE` |
| Pewter | `#9AA0AB` |
### Typography
- Typefaces: Inter, Instrument Serif, JetBrains Mono
- Common sizes (px): 9, 10, 11, 12, 13, 14, 22, 26
### Shape and depth
- Common corner radii (px): 8, 9, 10, 14, 19, 20
- Shadows: `inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45)`, `0 0 0 2px #3D6BFF, 0 0 0 4px #06070A`, `0 6px 16px rgba(0,0,0,.6)`, `0 0 0 2px #F3F4F6`
## Screens
### 1. Discover
A serif welcome, AI search, category chips, a large editor's pack card and trending destinations.
Preview: https://developermill.com/app-designs/trip-planner-app-ui-design/discover.webp
Copy on this screen:
- My Location
- Munnar, Idukki
- WELCOME BACK
- Where shall we
- wander,
- Aarav?
- AI Mode
- All
- Mountains
- Coastal
- Heritage
- Forest
- EDITOR'S PACK
- FAROE ISLANDS — ATLANTIC
- Saksun Village
- 49.21k
- 3 days
- $ From 1,240
- Trending
- now
- VIEW ALL →
- HERITAGE
- COASTAL
- Discover
### 2. Map view
A dark map with photo pins and labels, glass search and filter controls, and a nearby places shelf.
Preview: https://developermill.com/app-designs/trip-planner-app-ui-design/map.webp
Copy on this screen:
- KYLES ROAD
- Samos
- Naxos
- Paros
- Mykonos
- Rhodes
- Santorini
- Izmir
- Bodrum castle
- Alaçatı Bays
- Çeşme
- AI Mode
- All Places
- Scenic
- Hotels
- Stays
- Nearby
- finds
- 12 PLACES
- CLIFFSIDE
- ★ 4.9
- ◷ 2.4km
- Oia Village
- SUNSET SPOT
- ★ 4.7
- ◷ 6.1km
- Mykonos Town
### 3. Trip details
A photo strip, trip status and duration, a local tip and a day-by-day trip log.
Preview: https://developermill.com/app-designs/trip-planner-app-ui-design/trip.webp
Copy on this screen:
- Greece
- TRIP / AEGEAN COAST
- Map
- 24°C
- Oia Village
- Greece, Santorini
- 26 spots
- 8 types
- Trip Status
- Active
- Duration
- 4 days left
- Accommodation
- [Hotel name]
- More info
- Visit
- Akrotiri
- before 10 AM for a peaceful atmosphere and golden, crowd-free light.
- Trip
- log
- 5 PLACES
- 1
- Blue Dome Church
- 10:30 AM
- DAY 02
- Open Itinerary
- Trip Plan
## Full source
The original artboards as HTML. Image URLs point at the hosted demo assets.
### Discover (Main)
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Discover</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
<style>
body{margin:0;background:#06070A}
a{color:#7FA2FF}a:hover{color:#A9C0FF}
.ph{background-color:#151821;background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.035) 0 10px,transparent 10px 20px);display:flex;align-items:center;justify-content:center;text-align:center}
.phl{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.06em;color:#6B7180;text-transform:uppercase;padding:0 12px;line-height:1.5}
.glass{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12)}
.mono{font-family:'JetBrains Mono',monospace}
.serif{font-family:'Instrument Serif',serif}
button{font:inherit;color:inherit;cursor:pointer}
</style>
</helmet>
<div style="width: 390px; height: 844px; position: relative; overflow: hidden; background: #06070A; color: #F3F4F6; font-family: Inter, system-ui, sans-serif; box-sizing: border-box; padding: 58px 0 0">
<div style="display: flex; align-items: center; justify-content: space-between; padding: 0 22px">
<div style="display: flex; align-items: center; gap: 12px">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/f3e802a37f.jpg" alt="Profile photo" style="width: 46px; height: 46px; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 2px #3D6BFF, 0 0 0 4px #06070A">
<div style="display: flex; flex-direction: column; gap: 3px">
<span style="font-size: 12px; color: #9AA0AB; display: flex; align-items: center; gap: 4px">My Location <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#9AA0AB" stroke-width="2" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg></span>
<span style="font-size: 15px; font-weight: 600; display: flex; align-items: center; gap: 6px"><svg width="14" height="14" viewBox="0 0 24 24" fill="#F3F4F6" aria-hidden="true"><path d="M3 11 21 3l-8 18-2-8z"/></svg>Munnar, Idukki</span>
</div>
</div>
<button class="glass" aria-label="Notifications" style="width: 46px; height: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; padding: 0; position: relative"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="1.8" aria-hidden="true"><path d="M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.9 1.9 0 0 0 3.4 0"/></svg><span style="position: absolute; top: 11px; right: 12px; width: 7px; height: 7px; border-radius: 50%; background: #3D6BFF"></span></button>
</div>
<div style="padding: 26px 22px 0">
<div class="mono" style="font-size: 10px; letter-spacing: .14em; color: #8A909B; display: flex; align-items: center; gap: 8px"><span style="width: 18px; height: 1px; background: #8A909B"></span>WELCOME BACK</div>
<h1 class="serif" style="margin: 8px 0 0; font-weight: 400; font-size: 36px; line-height: 1.08; letter-spacing: -.01em">Where shall we <em style="color: #6F95FF">wander,</em><br>Aarav?</h1>
</div>
<div style="padding: 22px 22px 0">
<label class="glass" style="height: 54px; border-radius: 27px; display: flex; align-items: center; gap: 10px; padding: 0 6px 0 18px; box-sizing: border-box">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#9AA0AB" stroke-width="2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>
<input type="text" placeholder="Search destinations, cities…" aria-label="Search destinations" style="flex: 1; min-width: 0; background: transparent; border: 0; outline: none; color: #F3F4F6; font: 14px Inter, sans-serif">
<button style="height: 42px; padding: 0 14px; border-radius: 21px; background: rgba(61,107,255,.14); border: 1px solid rgba(111,149,255,.55); display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 500"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="1.8" aria-hidden="true"><path d="m4 20 10-10M15 4v3M13.5 5.5h3M19 9v2M18 10h2M9 3v2M8 4h2"/></svg>AI Mode</button>
</label>
</div>
<div style="display: flex; gap: 8px; padding: 18px 22px 0; overflow: hidden">
<button style="height: 38px; padding: 0 20px; border-radius: 19px; background: linear-gradient(180deg, #6E97FF 0%, #3D6BFF 50%, #2449D4 100%); border: 1px solid rgba(160,190,255,.45); box-shadow: inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45); font-size: 14px; font-weight: 600; flex-shrink: 0">All</button>
<button class="glass" style="height: 38px; padding: 0 16px; border-radius: 19px; font-size: 14px; color: #D5D8DE; flex-shrink: 0">Mountains</button>
<button class="glass" style="height: 38px; padding: 0 16px; border-radius: 19px; font-size: 14px; color: #D5D8DE; flex-shrink: 0">Coastal</button>
<button class="glass" style="height: 38px; padding: 0 16px; border-radius: 19px; font-size: 14px; color: #D5D8DE; flex-shrink: 0">Heritage</button>
<button class="glass" style="height: 38px; padding: 0 16px; border-radius: 19px; font-size: 14px; color: #D5D8DE; flex-shrink: 0">Forest</button>
</div>
<div style="display: flex; gap: 10px; padding: 20px 0 0; margin-left: -6px">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/a340ebf012.jpg" alt="" style="width: 22px; height: 278px; border-radius: 0 22px 22px 0; flex-shrink: 0; object-fit: cover; object-position: right">
<div style="width: 334px; height: 278px; border-radius: 26px; position: relative; overflow: hidden; flex-shrink: 0; border: 1px solid rgba(255,255,255,.08)">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/410a453287.jpg" alt="Three friends laughing on a Faroe Islands clifftop" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 70%">
<div style="position: absolute; inset: 0; background: linear-gradient(180deg, rgba(6,7,10,0) 45%, rgba(6,7,10,.85) 100%)"></div>
<span class="mono glass" style="position: absolute; top: 14px; left: 14px; font-size: 10px; letter-spacing: .1em; padding: 7px 10px; border-radius: 9px; background: rgba(20,22,28,.55)">EDITOR'S PACK</span>
<button class="glass" aria-label="Save" style="position: absolute; top: 12px; right: 12px; width: 36px; height: 36px; border-radius: 11px; display: flex; align-items: center; justify-content: center; padding: 0; background: rgba(20,22,28,.55)"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4z"/></svg></button>
<div style="position: absolute; left: 16px; right: 16px; bottom: 16px">
<div class="mono" style="font-size: 10px; letter-spacing: .12em; color: #C9CDD4">FAROE ISLANDS — ATLANTIC</div>
<div class="serif" style="font-style: italic; font-size: 34px; line-height: 1.1; margin-top: 4px">Saksun Village</div>
<div style="display: flex; gap: 6px; margin-top: 10px">
<span class="glass" style="font-size: 12px; padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; background: rgba(20,22,28,.6)"><svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6" aria-hidden="true"><path d="m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9z"/></svg>49.21k</span>
<span class="glass" style="font-size: 12px; padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; background: rgba(20,22,28,.6)"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>3 days</span>
<span class="glass" style="font-size: 12px; padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; background: rgba(20,22,28,.6)">$ From 1,240</span>
</div>
</div>
</div>
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/cfc112b1d2.jpg" alt="" style="width: 40px; height: 278px; border-radius: 22px 0 0 22px; flex-shrink: 0; object-fit: cover; object-position: left">
</div>
<div style="display: flex; align-items: baseline; justify-content: space-between; padding: 26px 22px 0">
<h2 class="serif" style="margin: 0; font-weight: 400; font-size: 26px">Trending <em style="color: #6F95FF">now</em></h2>
<a href="#" class="mono" style="font-size: 11px; letter-spacing: .1em; color: #C9CDD4; text-decoration: none">VIEW ALL →</a>
</div>
<div style="display: flex; gap: 10px; padding: 14px 22px 0">
<div style="width: 150px; height: 190px; border-radius: 20px; position: relative; overflow: hidden; flex-shrink: 0">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/de71224bfc.jpg" alt="Neon-lit Tokyo alley at night" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover">
<span class="mono glass" style="position: absolute; top: 10px; left: 10px; font-size: 9px; letter-spacing: .1em; padding: 6px 8px; border-radius: 8px; background: rgba(20,22,28,.6)">HERITAGE</span>
<button class="glass" aria-label="Like" style="position: absolute; top: 8px; right: 8px; width: 30px; height: 30px; border-radius: 9px; padding: 0; display: flex; align-items: center; justify-content: center; background: rgba(20,22,28,.6)"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"/></svg></button>
</div>
<div style="width: 150px; height: 190px; border-radius: 20px; position: relative; overflow: hidden; flex-shrink: 0">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/fe81a6571b.jpg" alt="Turquoise bay framed by palm leaves" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover">
<span class="mono glass" style="position: absolute; top: 10px; left: 10px; font-size: 9px; letter-spacing: .1em; padding: 6px 8px; border-radius: 8px; background: rgba(20,22,28,.6)">COASTAL</span>
<button class="glass" aria-label="Like" style="position: absolute; top: 8px; right: 8px; width: 30px; height: 30px; border-radius: 9px; padding: 0; display: flex; align-items: center; justify-content: center; background: rgba(20,22,28,.6)"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"/></svg></button>
</div>
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/9d87548880.jpg" alt="" style="width: 60px; height: 190px; border-radius: 20px; flex-shrink: 0; object-fit: cover">
</div>
<nav class="glass" aria-label="Main" style="position: absolute; left: 50%; bottom: 30px; transform: translateX(-50%); display: flex; align-items: center; gap: 4px; padding: 6px; border-radius: 30px; background: rgba(28,30,38,.82); backdrop-filter: blur(16px)">
<a href="#" style="height: 46px; padding: 0 18px 0 8px; border-radius: 23px; background: linear-gradient(180deg, #6E97FF 0%, #3D6BFF 50%, #2449D4 100%); border: 1px solid rgba(160,190,255,.45); box-shadow: inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45); box-sizing: border-box; color: #fff; text-decoration: none; display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600"><span style="width: 30px; height: 30px; border-radius: 50%; background: #fff; display: flex; align-items: center; justify-content: center"><svg width="16" height="16" viewBox="0 0 24 24" fill="#3D6BFF" aria-hidden="true"><path d="M5 18V9a7 7 0 0 1 14 0v9l-2.3-1.6L14.4 18 12 16.4 9.6 18l-2.3-1.6z"/></svg></span>Discover</a>
<a href="Map.dc.html" aria-label="Map" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><path d="M3 11 21 3l-8 18-2-8z"/></svg></a>
<a href="Trip.dc.html" aria-label="Trips" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><rect x="3" y="5" width="18" height="16" rx="3"/><path d="M3 10h18M8 3v4M16 3v4"/></svg></a>
<a href="#" aria-label="Profile" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/></svg></a>
</nav>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
renderVals() { return {}; }
}
</script>
</body>
</html>
```
### Map view (Map)
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Map explore</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
<style>
body{margin:0;background:#06070A}
a{color:#7FA2FF}a:hover{color:#A9C0FF}
.ph{background-color:#1B1F29;background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.04) 0 8px,transparent 8px 16px);display:flex;align-items:center;justify-content:center;text-align:center}
.phl{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.06em;color:#6B7180;text-transform:uppercase;padding:0 12px;line-height:1.5}
.glass{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12)}
.mono{font-family:'JetBrains Mono',monospace}
.serif{font-family:'Instrument Serif',serif}
.pin{position:absolute;width:46px;height:46px;border-radius:50%;border:2px solid rgba(255,255,255,.9);box-shadow:0 6px 16px rgba(0,0,0,.6);box-sizing:border-box}
.lbl{position:absolute;font-family:'JetBrains Mono',monospace;font-size:12px;color:#E6E8EC;background:rgba(22,24,31,.86);border:1px solid rgba(255,255,255,.1);padding:5px 9px;border-radius:9px;white-space:nowrap}
button{font:inherit;color:inherit;cursor:pointer}
</style>
</helmet>
<div style="width: 390px; height: 844px; position: relative; overflow: hidden; background: #0B0C10; color: #F3F4F6; font-family: Inter, system-ui, sans-serif">
<svg width="390" height="844" viewBox="0 0 390 844" fill="none" stroke="#1E212A" aria-hidden="true" style="position: absolute; inset: 0">
<path d="M-10 230 C80 260 140 210 230 250 S360 300 400 280" stroke-width="10"></path>
<path d="M60 -10 C70 120 40 260 90 420 S120 640 80 860" stroke-width="7"></path>
<path d="M240 140 C230 300 300 420 260 560 S300 760 320 860" stroke-width="6"></path>
<path d="M-10 520 C100 500 200 560 400 500" stroke-width="5"></path>
<path d="M140 180 L180 860 M0 380 L390 420 M330 160 L360 860 M0 640 L390 600" stroke-width="2" stroke="#171920"></path>
<path d="M20 300 L120 330 L150 300 M200 460 L330 480 M100 560 L220 620 M260 330 L380 300" stroke-width="2" stroke="#171920"></path>
</svg>
<div class="mono" style="position: absolute; left: 28px; top: 470px; transform: rotate(-80deg); font-size: 9px; color: #3A3F4B; letter-spacing: .1em">KYLES ROAD</div>
<span class="lbl" style="left: 100px; top: 304px">Samos</span>
<span class="lbl" style="left: 178px; top: 304px">Naxos</span>
<span class="lbl" style="left: 262px; top: 286px">Paros</span>
<span class="lbl" style="left: 300px; top: 338px">Mykonos</span>
<span class="lbl" style="left: 190px; top: 380px">Rhodes</span>
<span class="lbl" style="left: 86px; top: 414px">Santorini</span>
<span class="lbl" style="left: 268px; top: 414px">Izmir</span>
<span class="lbl" style="left: 44px; top: 488px">Bodrum castle</span>
<span class="lbl" style="left: 150px; top: 464px">Alaçatı Bays</span>
<span class="lbl" style="left: 268px; top: 506px">Çeşme</span>
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/318b072146.jpg" alt="" style="left: 196px; top: 236px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/cfc112b1d2.jpg" alt="" style="left: 276px; top: 226px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/fe81a6571b.jpg" alt="" style="left: 334px; top: 262px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/26ea7b4816.jpg" alt="" style="left: 130px; top: 344px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/94319b63ac.jpg" alt="" style="left: 206px; top: 334px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/9d87548880.jpg" alt="" style="left: 334px; top: 376px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/3910a9306f.jpg" alt="" style="left: 168px; top: 418px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/80d43b8e3e.jpg" alt="" style="left: 222px; top: 412px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/de71224bfc.jpg" alt="" style="left: 300px; top: 450px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/a340ebf012.jpg" alt="" style="left: 82px; top: 520px; object-fit: cover">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/318b072146.jpg" alt="" style="left: 208px; top: 494px; object-fit: cover; object-position: right">
<img class="pin" src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/80d43b8e3e.jpg" alt="" style="left: 260px; top: 536px; object-fit: cover; object-position: right">
<button class="glass" aria-label="Map layers" style="position: absolute; right: 18px; top: 516px; width: 46px; height: 46px; border-radius: 50%; padding: 0; display: flex; align-items: center; justify-content: center; background: rgba(28,30,38,.9)"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="1.8" aria-hidden="true"><path d="m12 3 9 5-9 5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg></button>
<div class="glass" style="position: absolute; left: 10px; right: 10px; top: 50px; border-radius: 30px; padding: 12px 12px 14px; background: rgba(20,22,28,.88); backdrop-filter: blur(18px)">
<div style="display: flex; gap: 8px; align-items: center">
<a href="Main.dc.html" aria-label="Back" style="width: 50px; height: 50px; border-radius: 50%; flex-shrink: 0; background: radial-gradient(circle at 35% 30%, #3E66E8, #13204F); border: 1px solid rgba(111,149,255,.4); display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M15 4 7 12l8 8-2-8z"></path></svg></a>
<label class="glass" style="flex: 1; min-width: 0; height: 50px; border-radius: 25px; display: flex; align-items: center; gap: 8px; padding: 0 5px 0 14px; box-sizing: border-box">
<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="#9AA0AB" stroke-width="2" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path></svg>
<input type="text" value="Aegean coast" aria-label="Search" style="flex: 1; min-width: 0; background: transparent; border: 0; outline: none; color: #F3F4F6; font: 15px Inter, sans-serif">
<button style="height: 38px; padding: 0 12px; border-radius: 19px; background: rgba(61,107,255,.14); border: 1px solid rgba(111,149,255,.55); display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 500; flex-shrink: 0"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="1.8" aria-hidden="true"><path d="m4 20 10-10M15 4v3M13.5 5.5h3M19 9v2M18 10h2M9 3v2M8 4h2"></path></svg>AI Mode</button>
</label>
</div>
<div style="display: flex; gap: 8px; margin-top: 12px; overflow: hidden">
<button style="height: 38px; padding: 0 14px; border-radius: 19px; background: linear-gradient(180deg, #6E97FF 0%, #3D6BFF 50%, #2449D4 100%); border: 1px solid rgba(160,190,255,.45); box-shadow: inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45); font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 6px; flex-shrink: 0"><svg width="13" height="13" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M3 11 21 3l-8 18-2-8z"></path></svg><span>All Places</span></button>
<button class="glass" style="height: 38px; padding: 0 12px; border-radius: 19px; font-size: 13px; color: #D5D8DE; display: flex; align-items: center; gap: 6px; flex-shrink: 0"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#D5D8DE" stroke-width="1.8" aria-hidden="true"><path d="m2 19 7-11 5 7 3-4 5 8z"></path></svg>Scenic</button>
<button class="glass" style="height: 38px; padding: 0 12px; border-radius: 19px; font-size: 13px; color: #D5D8DE; display: flex; align-items: center; gap: 6px; flex-shrink: 0"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#D5D8DE" stroke-width="1.8" aria-hidden="true"><rect x="5" y="3" width="14" height="18" rx="2"></rect><path d="M9 7h2M13 7h2M9 11h2M13 11h2M10 21v-4h4v4"></path></svg>Hotels</button>
<button class="glass" style="height: 38px; padding: 0 12px; border-radius: 19px; font-size: 13px; color: #D5D8DE; display: flex; align-items: center; gap: 6px; flex-shrink: 0"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#D5D8DE" stroke-width="1.8" aria-hidden="true"><path d="M3 11 12 4l9 7v9H3z"></path></svg>Stays</button>
</div>
</div>
<div style="position: absolute; left: 0; right: 0; bottom: 0; height: 270px; border-radius: 30px 30px 0 0; background: #101218; border-top: 1px solid rgba(255,255,255,.1)">
<button aria-label="Expand list" style="position: absolute; left: 50%; top: -22px; transform: translateX(-50%); width: 44px; height: 44px; border: 0; background: transparent; padding: 0; display: flex; align-items: center; justify-content: center"><svg width="34" height="22" viewBox="0 0 34 22" fill="#3D6BFF" aria-hidden="true"><path d="M17 2 32 20c-5-4-10-6-15-6S7 16 2 20z"></path></svg></button>
<div style="display: flex; align-items: baseline; justify-content: space-between; padding: 24px 22px 0">
<h2 class="serif" style="margin: 0; font-weight: 400; font-size: 24px">Nearby <em style="color: #6F95FF">finds</em></h2>
<span class="mono" style="font-size: 11px; letter-spacing: .1em; color: #9AA0AB">12 PLACES</span>
</div>
<div style="display: flex; gap: 10px; padding: 14px 0 0 16px">
<div style="width: 158px; height: 170px; border-radius: 20px; position: relative; overflow: hidden; flex-shrink: 0; border: 1px solid rgba(255,255,255,.08)">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/cfc112b1d2.jpg" alt="Oia village at sunset" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover">
<div style="position: absolute; inset: 0; background: linear-gradient(180deg, rgba(6,7,10,0) 45%, rgba(6,7,10,.85))"></div>
<span class="mono" style="position: absolute; top: 10px; left: 10px; font-size: 9px; letter-spacing: .1em; padding: 6px 8px; border-radius: 8px; background: rgba(20,22,28,.65); border: 1px solid rgba(255,255,255,.12)">CLIFFSIDE</span>
<button aria-label="Like" style="position: absolute; top: 8px; right: 8px; width: 30px; height: 30px; border-radius: 9px; padding: 0; display: flex; align-items: center; justify-content: center; background: rgba(20,22,28,.65); border: 1px solid rgba(255,255,255,.12)"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"></path></svg></button>
<div style="position: absolute; left: 12px; bottom: 12px">
<div style="display: flex; gap: 10px; font-size: 11px; color: #E6E8EC"><span>★ 4.9</span><span>◷ 2.4km</span></div>
<div class="serif" style="font-style: italic; font-size: 22px; margin-top: 2px">Oia Village</div>
</div>
</div>
<div style="width: 158px; height: 170px; border-radius: 20px; position: relative; overflow: hidden; flex-shrink: 0; border: 1px solid rgba(255,255,255,.08)">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/a340ebf012.jpg" alt="Sunset over Mykonos harbour" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover">
<div style="position: absolute; inset: 0; background: linear-gradient(180deg, rgba(6,7,10,0) 45%, rgba(6,7,10,.85))"></div>
<span class="mono" style="position: absolute; top: 10px; left: 10px; font-size: 9px; letter-spacing: .1em; padding: 6px 8px; border-radius: 8px; background: rgba(20,22,28,.65); border: 1px solid rgba(255,255,255,.12)">SUNSET SPOT</span>
<button aria-label="Like" style="position: absolute; top: 8px; right: 8px; width: 30px; height: 30px; border-radius: 9px; padding: 0; display: flex; align-items: center; justify-content: center; background: rgba(20,22,28,.65); border: 1px solid rgba(255,255,255,.12)"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#F3F4F6" stroke-width="2" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"></path></svg></button>
<div style="position: absolute; left: 12px; bottom: 12px">
<div style="display: flex; gap: 10px; font-size: 11px; color: #E6E8EC"><span>★ 4.7</span><span>◷ 6.1km</span></div>
<div class="serif" style="font-style: italic; font-size: 22px; margin-top: 2px">Mykonos Town</div>
</div>
</div>
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/80d43b8e3e.jpg" alt="" style="width: 60px; height: 170px; border-radius: 20px 0 0 20px; flex-shrink: 0; object-fit: cover">
</div>
</div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
renderVals() { return {}; }
}
</script>
</body>
</html>
```
### Trip details (Trip)
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Trip plan</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
<style>
body{margin:0;background:#06070A}
a{color:#7FA2FF}a:hover{color:#A9C0FF}
.ph{background-color:#171A23;background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.04) 0 8px,transparent 8px 16px);display:flex;align-items:center;justify-content:center;text-align:center}
.phl{font-family:'JetBrains Mono',monospace;font-size:8px;letter-spacing:.06em;color:#6B7180;text-transform:uppercase;padding:0 8px;line-height:1.5}
.glass{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12)}
.mono{font-family:'JetBrains Mono',monospace}
.serif{font-family:'Instrument Serif',serif}
button{font:inherit;color:inherit;cursor:pointer}
</style>
</helmet>
<div style="width: 390px; height: 844px; position: relative; overflow: hidden; background: #06070A; color: #F3F4F6; font-family: Inter, system-ui, sans-serif; box-sizing: border-box; padding: 56px 0 0">
<div style="display: flex; align-items: center; gap: 12px; padding: 0 20px">
<a href="Map.dc.html" aria-label="Back" style="width: 46px; height: 46px; border-radius: 50%; flex-shrink: 0; background: radial-gradient(circle at 35% 30%, #3E66E8, #13204F); border: 1px solid rgba(111,149,255,.4); display: flex; align-items: center; justify-content: center"><svg width="18" height="18" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M15 4 7 12l8 8-2-8z"/></svg></a>
<div style="flex: 1">
<div style="font-size: 19px; font-weight: 600">Greece</div>
<div class="mono" style="font-size: 10px; letter-spacing: .1em; color: #9AA0AB; margin-top: 2px">TRIP / AEGEAN COAST</div>
</div>
<a href="Map.dc.html" class="glass" style="height: 36px; padding: 0 14px; border-radius: 18px; display: flex; align-items: center; gap: 6px; color: #F3F4F6; text-decoration: none; font-size: 13px; font-weight: 500"><svg width="14" height="14" viewBox="0 0 24 24" fill="#F3F4F6" aria-hidden="true"><path d="M3 6l6-3 6 3 6-3v15l-6 3-6-3-6 3z"/></svg>Map</a>
</div>
<div style="display: flex; align-items: center; gap: 8px; padding: 22px 0 0 20px">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/94319b63ac.jpg" alt="Island gift shop" style="width: 62px; height: 72px; border-radius: 14px; flex-shrink: 0; object-fit: cover">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/3910a9306f.jpg" alt="Whitewashed alley" style="width: 62px; height: 72px; border-radius: 14px; flex-shrink: 0; object-fit: cover">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/80d43b8e3e.jpg" alt="Oia with bougainvillea" style="width: 80px; height: 92px; border-radius: 18px; flex-shrink: 0; object-fit: cover; box-shadow: 0 0 0 2px #F3F4F6">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/318b072146.jpg" alt="Taverna terrace at night" style="width: 62px; height: 72px; border-radius: 14px; flex-shrink: 0; object-fit: cover">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/26ea7b4816.jpg" alt="Greek dinner table" style="width: 62px; height: 72px; border-radius: 14px; flex-shrink: 0; object-fit: cover">
</div>
<div style="padding: 18px 20px 0">
<div class="glass" style="border-radius: 22px; padding: 10px; display: flex; gap: 14px; background: rgba(255,255,255,.05)">
<div style="width: 116px; height: 116px; border-radius: 16px; position: relative; flex-shrink: 0; overflow: hidden"><img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/80d43b8e3e.jpg" alt="Oia village with pink bougainvillea" style="position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover"><span class="mono" style="position: absolute; left: 8px; bottom: 8px; font-size: 10px; padding: 4px 7px; border-radius: 7px; background: rgba(20,22,28,.75); color: #F3F4F6">24°C</span></div>
<div style="flex: 1; display: flex; flex-direction: column; padding-top: 4px">
<div style="display: flex; justify-content: space-between; align-items: flex-start">
<div class="serif" style="font-style: italic; font-size: 26px; line-height: 1">Oia Village</div>
<div style="display: flex; margin-top: 2px" aria-label="4 travellers">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/f3e802a37f.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid #101218; object-fit: cover">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/410a453287.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid #101218; margin-left: -7px; object-fit: cover; object-position: 30% 42%">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/410a453287.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid #101218; margin-left: -7px; object-fit: cover; object-position: 45% 66%">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/410a453287.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid #101218; margin-left: -7px; object-fit: cover; object-position: 65% 56%">
</div>
</div>
<div style="font-size: 13px; color: #9AA0AB; margin-top: 6px">Greece, Santorini</div>
<div style="display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin-top: 12px">
<span class="glass" style="font-size: 12px; padding: 5px 10px; border-radius: 9px; display: flex; align-items: center; gap: 6px"><svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6" aria-hidden="true"><path d="M3 11 21 3l-8 18-2-8z"/></svg>26 spots</span>
<span class="glass" style="font-size: 12px; padding: 5px 10px; border-radius: 9px; display: flex; align-items: center; gap: 6px"><svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6" aria-hidden="true"><path d="M3 6h7l2 2h9v12H3z"/></svg>8 types</span>
</div>
</div>
</div>
</div>
<dl style="margin: 18px 20px 0; font-size: 14px">
<div style="display: flex; justify-content: space-between; padding: 11px 0; border-bottom: 1px solid rgba(255,255,255,.08)"><dt style="color: #9AA0AB">Trip Status</dt><dd style="margin: 0; display: flex; align-items: center; gap: 7px; font-weight: 500"><span style="width: 8px; height: 8px; border-radius: 50%; background: #34D17A"></span>Active</dd></div>
<div style="display: flex; justify-content: space-between; padding: 11px 0; border-bottom: 1px solid rgba(255,255,255,.08)"><dt style="color: #9AA0AB">Duration</dt><dd style="margin: 0; font-weight: 500">4 days left</dd></div>
<div style="display: flex; justify-content: space-between; padding: 11px 0"><dt style="color: #9AA0AB">Accommodation</dt><dd style="margin: 0; font-weight: 500">[Hotel name]</dd></div>
</dl>
<button style="display: flex; align-items: center; gap: 4px; margin: 2px auto 0; background: none; border: 0; color: #B7BCC6; font-size: 13px; padding: 6px 10px">More info <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="2" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg></button>
<div style="padding: 10px 20px 0">
<div class="glass" style="border-radius: 16px; padding: 12px 14px; display: flex; gap: 12px; background: rgba(255,255,255,.045)">
<span style="width: 3px; border-radius: 2px; background: #3D6BFF; flex-shrink: 0"></span>
<p class="mono" style="margin: 0; font-size: 11.5px; line-height: 1.6; color: #D5D8DE">Visit <span style="color: #7FA2FF">Akrotiri</span> before 10 AM for a peaceful atmosphere and golden, crowd-free light.</p>
</div>
</div>
<div style="display: flex; align-items: baseline; justify-content: space-between; padding: 22px 20px 0">
<h2 class="serif" style="margin: 0; font-weight: 400; font-size: 26px">Trip <em style="color: #6F95FF">log</em></h2>
<span class="mono" style="font-size: 11px; letter-spacing: .1em; color: #9AA0AB">5 PLACES</span>
</div>
<div style="display: flex; gap: 12px; padding: 14px 20px 0">
<div style="display: flex; flex-direction: column; align-items: center; gap: 6px">
<span class="glass mono" style="width: 34px; height: 34px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 13px">1</span>
<span style="width: 1px; flex: 1; background: rgba(255,255,255,.12)"></span>
</div>
<div class="glass" style="flex: 1; border-radius: 18px; padding: 10px; display: flex; gap: 12px; background: rgba(255,255,255,.045)">
<img src="https://developermill.com/app-designs/trip-planner-app-ui-design/assets/9d87548880.jpg" alt="Blue Dome Church" style="width: 72px; height: 72px; border-radius: 12px; flex-shrink: 0; object-fit: cover">
<div style="flex: 1">
<div class="serif" style="font-style: italic; font-size: 20px">Blue Dome Church</div>
<div style="font-size: 12px; color: #9AA0AB; margin-top: 2px">Greece, Santorini</div>
</div>
<div class="mono" style="text-align: right; font-size: 10px; color: #B7BCC6; align-self: flex-end">10:30 AM<br><span style="color: #7B818D">DAY 02</span></div>
</div>
</div>
<a href="#" style="position: absolute; left: 112px; bottom: 98px; height: 34px; padding: 0 14px; border-radius: 17px; background: rgba(28,30,38,.95); border: 1px solid rgba(255,255,255,.14); color: #F3F4F6; text-decoration: none; font-size: 13px; font-weight: 500; display: flex; align-items: center; gap: 8px; box-shadow: 0 8px 20px rgba(0,0,0,.5)"><span style="width: 8px; height: 8px; border-radius: 50%; background: #34D17A"></span>Open Itinerary</a>
<nav class="glass" aria-label="Main" style="position: absolute; left: 50%; bottom: 30px; transform: translateX(-50%); display: flex; align-items: center; gap: 4px; padding: 6px; border-radius: 30px; background: rgba(28,30,38,.85); backdrop-filter: blur(16px)">
<a href="Main.dc.html" aria-label="Discover" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><path d="M5 18V9a7 7 0 0 1 14 0v9l-2.3-1.6L14.4 18 12 16.4 9.6 18l-2.3-1.6z"/></svg></a>
<a href="Map.dc.html" aria-label="Map" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><path d="M3 11 21 3l-8 18-2-8z"/></svg></a>
<a href="#" style="height: 46px; padding: 0 18px 0 8px; border-radius: 23px; background: linear-gradient(180deg, #6E97FF 0%, #3D6BFF 50%, #2449D4 100%); border: 1px solid rgba(160,190,255,.45); box-shadow: inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45); box-sizing: border-box; color: #fff; text-decoration: none; display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600"><span style="width: 30px; height: 30px; border-radius: 50%; background: #fff; display: flex; align-items: center; justify-content: center"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#3D6BFF" stroke-width="2.2" aria-hidden="true"><rect x="3" y="5" width="18" height="16" rx="3"/><path d="M3 10h18M8 3v4M16 3v4"/></svg></span>Trip Plan</a>
<a href="#" aria-label="Profile" style="width: 46px; height: 46px; display: flex; align-items: center; justify-content: center"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#B7BCC6" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/></svg></a>
</nav>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
renderVals() { return {}; }
}
</script>
</body>
</html>
```SKILL.md
Save as .claude/skills/trip-planner-app-ui/SKILL.md
--- name: trip-planner-app-ui description: Build the Trip Manager mobile app UI in Expo React Native. Use when asked to create a trip planner app UI or a new screen in this visual style. --- # Trip Manager app UI Build this travel app UI in an Expo Router project with TypeScript. Reference: https://developermill.com/app-designs/trip-planner-app-ui-design ## Visual direction Blue-black night mode with an electric blue accent, editorial serif italics, monospaced labels and glass controls over photography. Keep these signature details: - Search bar with an AI mode button - Dark map with round photo pins - Nearby place cards in a bottom shelf - Trip log with status, tips and timeline ## Set up ```bash npx expo install expo-blur expo-image expo-linear-gradient react-native-svg @expo-google-fonts/instrument-serif @expo-google-fonts/inter @expo-google-fonts/jetbrains-mono expo-font ``` ## Tokens | Name | Hex | | --- | --- | | Night | `#06070A` | | Carbon | `#101218` | | Electric blue | `#3D6BFF` | | Sky | `#7FA2FF` | | Fog | `#D5D8DE` | | Pewter | `#9AA0AB` | - Typefaces: Inter, Instrument Serif, JetBrains Mono - Text sizes (px): 9, 10, 11, 12, 13, 14, 22, 26 - Corner radii (px): 8, 9, 10, 14, 19, 20 Define these once and reuse them. Do not add new colours. ## Screens 1. **Discover.** A serif welcome, AI search, category chips, a large editor's pack card and trending destinations. 2. **Map view.** A dark map with photo pins and labels, glass search and filter controls, and a nearby places shelf. 3. **Trip details.** A photo strip, trip status and duration, a local tip and a day-by-day trip log. ## 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 trip-planner-app --template default cd trip-planner-app rm -rf src npx expo install expo-blur expo-image expo-linear-gradient react-native-svg @expo-google-fonts/instrument-serif @expo-google-fonts/inter @expo-google-fonts/jetbrains-mono expo-font
src/app/_layout.tsx
import {
InstrumentSerif_400Regular,
InstrumentSerif_400Regular_Italic,
} from '@expo-google-fonts/instrument-serif';
import { Inter_400Regular, Inter_500Medium, Inter_600SemiBold } from '@expo-google-fonts/inter';
import { JetBrainsMono_400Regular } from '@expo-google-fonts/jetbrains-mono';
import { useFonts } from 'expo-font';
import { Stack } from 'expo-router';
export default function RootLayout() {
const [fontsLoaded] = useFonts({
InstrumentSerif_400Regular,
InstrumentSerif_400Regular_Italic,
Inter_400Regular,
Inter_500Medium,
Inter_600SemiBold,
JetBrainsMono_400Regular,
});
if (!fontsLoaded) return null;
return <Stack screenOptions={{ headerShown: false }} />;
}src/app/index.tsx
import { BlurView } from 'expo-blur';
import { Image } from 'expo-image';
import { LinearGradient } from 'expo-linear-gradient';
import { router } from 'expo-router';
import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
import Svg, { Circle, Path, Rect } from 'react-native-svg';
import { Screen } from '@/components/screen';
import { asset } from '@/lib/assets';
export default function MainScreen() {
return (
<Screen background="#06070A" statusBar="light">
<View style={{ paddingTop: 58, paddingBottom: 0, paddingHorizontal: 0, flex: 1 }}>
<View
style={{
alignItems: 'center',
justifyContent: 'space-between',
paddingVertical: 0,
paddingHorizontal: 22,
flexDirection: 'row',
}}>
<View style={{ alignItems: 'center', gap: 12, flexShrink: 1, flexDirection: 'row' }}>
<Image
source={{ uri: asset('f3e802a37f.jpg') }}
contentFit="cover"
accessibilityLabel="Profile photo"
style={{
width: 46,
height: 46,
borderRadius: '50%',
boxShadow: '0 0 0 2px #3D6BFF, 0 0 0 4px #06070A',
}}
/>
<View style={{ gap: 3, flexShrink: 1 }}>
<View style={{ alignItems: 'center', gap: 4, flexDirection: 'row' }}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#9AA0AB',
flexShrink: 1,
}}>
My Location
</Text>
<Svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="#9AA0AB"
strokeWidth="2">
<Path d="m6 9 6 6 6-6" />
</Svg>
</View>
<View style={{ alignItems: 'center', gap: 6, flexDirection: 'row' }}>
<Svg width="14" height="14" viewBox="0 0 24 24" fill="#F3F4F6">
<Path d="M3 11 21 3l-8 18-2-8z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_600SemiBold',
fontSize: 15,
color: '#F3F4F6',
flexShrink: 1,
}}>
Munnar, Idukki
</Text>
</View>
</View>
</View>
<Pressable
accessibilityRole="button"
accessibilityLabel="Notifications"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
width: 46,
height: 46,
borderRadius: '50%',
alignItems: 'center',
justifyContent: 'center',
padding: 0,
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="1.8">
<Path d="M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9" />
<Path d="M10.3 21a1.9 1.9 0 0 0 3.4 0" />
</Svg>
<View
style={{
position: 'absolute',
top: 11,
right: 12,
width: 7,
height: 7,
borderRadius: '50%',
backgroundColor: '#3D6BFF',
}}
/>
</Pressable>
</View>
<View style={{ paddingTop: 26, paddingBottom: 0, paddingHorizontal: 22 }}>
<View style={{ alignItems: 'center', gap: 8, flexDirection: 'row' }}>
<View style={{ width: 18, height: 1, backgroundColor: '#8A909B' }} />
<Text
style={{
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#8A909B',
letterSpacing: 1.4,
flexShrink: 1,
}}>
WELCOME BACK
</Text>
</View>
<Text
style={{
marginTop: 8,
marginBottom: 0,
marginHorizontal: 0,
fontFamily: 'InstrumentSerif_400Regular',
fontSize: 36,
color: '#F3F4F6',
letterSpacing: -0.36,
lineHeight: 38.88,
}}>
{'Where shall we '}
<Text style={{ fontFamily: 'InstrumentSerif_400Regular_Italic', color: '#6F95FF' }}>
wander,
</Text>
{'\n'}Aarav?
</Text>
</View>
<View style={{ paddingTop: 22, paddingBottom: 0, paddingHorizontal: 22 }}>
<View
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 54,
borderRadius: 27,
alignItems: 'center',
gap: 10,
paddingVertical: 0,
paddingLeft: 18,
paddingRight: 6,
flexDirection: 'row',
}}>
<Svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
stroke="#9AA0AB"
strokeWidth="2">
<Circle cx="11" cy="11" r="7" />
<Path d="m20 20-3.5-3.5" />
</Svg>
<TextInput
placeholder="Search destinations, cities…"
placeholderTextColor="#8A8A8A"
accessibilityLabel="Search destinations"
style={{
flex: 1,
minWidth: 0,
borderWidth: 0,
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#F3F4F6',
}}
/>
<Pressable
accessibilityRole="button"
style={{
height: 42,
paddingVertical: 0,
paddingHorizontal: 14,
borderRadius: 21,
backgroundColor: 'rgba(61,107,255,.14)',
borderWidth: 1,
borderColor: 'rgba(111,149,255,.55)',
alignItems: 'center',
gap: 6,
flexShrink: 1,
flexDirection: 'row',
}}>
<Svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="1.8">
<Path d="m4 20 10-10M15 4v3M13.5 5.5h3M19 9v2M18 10h2M9 3v2M8 4h2" />
</Svg>
<Text
style={{
fontFamily: 'Inter_500Medium',
fontSize: 13,
color: '#F3F4F6',
flexShrink: 1,
}}>
AI Mode
</Text>
</Pressable>
</View>
</View>
<View
style={{
gap: 8,
paddingTop: 18,
paddingBottom: 0,
paddingHorizontal: 22,
overflow: 'hidden',
flexDirection: 'row',
}}>
<Pressable
accessibilityRole="button"
style={{
height: 38,
paddingVertical: 0,
paddingHorizontal: 20,
borderRadius: 19,
borderWidth: 1,
borderColor: 'rgba(160,190,255,.45)',
boxShadow:
'inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45)',
flexShrink: 0,
overflow: 'hidden',
alignItems: 'center',
justifyContent: 'center',
}}>
<LinearGradient
colors={['#6E97FF', '#3D6BFF', '#2449D4']}
locations={[0, 0.5, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
<Text
style={{
fontFamily: 'Inter_600SemiBold',
fontSize: 14,
color: '#F3F4F6',
textAlign: 'center',
}}>
All
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 16,
borderRadius: 19,
flexShrink: 0,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#D5D8DE',
textAlign: 'center',
}}>
Mountains
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 16,
borderRadius: 19,
flexShrink: 0,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#D5D8DE',
textAlign: 'center',
}}>
Coastal
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 16,
borderRadius: 19,
flexShrink: 0,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#D5D8DE',
textAlign: 'center',
}}>
Heritage
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 16,
borderRadius: 19,
flexShrink: 0,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#D5D8DE',
textAlign: 'center',
}}>
Forest
</Text>
</Pressable>
</View>
<View
style={{
gap: 10,
paddingTop: 20,
paddingBottom: 0,
paddingHorizontal: 0,
marginLeft: -6,
flexDirection: 'row',
}}>
<Image
source={{ uri: asset('a340ebf012.jpg') }}
contentFit="cover"
contentPosition="right"
style={{
width: 22,
height: 278,
borderTopLeftRadius: 0,
borderTopRightRadius: 22,
borderBottomRightRadius: 22,
borderBottomLeftRadius: 0,
flexShrink: 0,
}}
/>
<View
style={{
width: 336,
height: 280,
borderRadius: 26,
overflow: 'hidden',
flexShrink: 0,
borderWidth: 1,
borderColor: 'rgba(255,255,255,.08)',
}}>
<Image
source={{ uri: asset('410a453287.jpg') }}
contentFit="cover"
contentPosition={{ left: 'center', top: '70%' }}
accessibilityLabel="Three friends laughing on a Faroe Islands clifftop"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<View style={{ position: 'absolute', top: 0, right: 0, bottom: 0, left: 0 }}>
<LinearGradient
colors={['rgba(6,7,10,0)', 'rgba(6,7,10,.85)']}
locations={[0.45, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
</View>
<Text
style={{
backgroundColor: 'rgba(20,22,28,.55)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 14,
left: 14,
paddingVertical: 7,
paddingHorizontal: 10,
borderRadius: 9,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#F3F4F6',
letterSpacing: 1,
}}>
{"EDITOR'S PACK"}
</Text>
<Pressable
accessibilityRole="button"
accessibilityLabel="Save"
style={{
backgroundColor: 'rgba(20,22,28,.55)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 12,
right: 12,
width: 36,
height: 36,
borderRadius: 11,
alignItems: 'center',
justifyContent: 'center',
padding: 0,
flexDirection: 'row',
}}>
<Svg
width="15"
height="15"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Path d="M6 3h12v18l-6-4-6 4z" />
</Svg>
</Pressable>
<View style={{ position: 'absolute', left: 16, right: 16, bottom: 16 }}>
<Text
style={{
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#C9CDD4',
letterSpacing: 1.2,
}}>
FAROE ISLANDS — ATLANTIC
</Text>
<Text
style={{
marginTop: 4,
fontFamily: 'InstrumentSerif_400Regular_Italic',
fontSize: 34,
color: '#F3F4F6',
lineHeight: 37.4,
}}>
Saksun Village
</Text>
<View style={{ gap: 6, marginTop: 10, flexDirection: 'row' }}>
<View
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
paddingVertical: 6,
paddingHorizontal: 10,
borderRadius: 10,
alignItems: 'center',
gap: 5,
flexShrink: 1,
flexDirection: 'row',
}}>
<Svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6">
<Path d="m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#F3F4F6',
flexShrink: 1,
}}>
49.21k
</Text>
</View>
<View
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
paddingVertical: 6,
paddingHorizontal: 10,
borderRadius: 10,
alignItems: 'center',
gap: 5,
flexShrink: 1,
flexDirection: 'row',
}}>
<Svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Circle cx="12" cy="12" r="9" />
<Path d="M12 7v5l3 2" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#F3F4F6',
flexShrink: 1,
}}>
3 days
</Text>
</View>
<View
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
paddingVertical: 6,
paddingHorizontal: 10,
borderRadius: 10,
alignItems: 'center',
gap: 5,
flexShrink: 1,
flexDirection: 'row',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#F3F4F6',
flexShrink: 1,
}}>
$ From 1,240
</Text>
</View>
</View>
</View>
</View>
<Image
source={{ uri: asset('cfc112b1d2.jpg') }}
contentFit="cover"
contentPosition="left"
style={{
width: 40,
height: 278,
borderTopLeftRadius: 22,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderBottomLeftRadius: 22,
flexShrink: 0,
}}
/>
</View>
<View
style={{
alignItems: 'baseline',
justifyContent: 'space-between',
paddingTop: 26,
paddingBottom: 0,
paddingHorizontal: 22,
flexDirection: 'row',
}}>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'InstrumentSerif_400Regular',
fontSize: 26,
color: '#F3F4F6',
}}>
{'Trending '}
<Text style={{ fontFamily: 'InstrumentSerif_400Regular_Italic', color: '#6F95FF' }}>
now
</Text>
</Text>
<Pressable accessibilityRole="link" style={{ flexShrink: 1 }}>
<Text
style={{
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 11,
color: '#C9CDD4',
letterSpacing: 1.1,
}}>
VIEW ALL →
</Text>
</Pressable>
</View>
<View
style={{
gap: 10,
paddingTop: 14,
paddingBottom: 0,
paddingHorizontal: 22,
flexDirection: 'row',
}}>
<View
style={{
width: 150,
height: 190,
borderRadius: 20,
overflow: 'hidden',
flexShrink: 0,
}}>
<Image
source={{ uri: asset('de71224bfc.jpg') }}
contentFit="cover"
accessibilityLabel="Neon-lit Tokyo alley at night"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<Text
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 10,
left: 10,
paddingVertical: 6,
paddingHorizontal: 8,
borderRadius: 8,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 9,
color: '#F3F4F6',
letterSpacing: 0.9,
}}>
HERITAGE
</Text>
<Pressable
accessibilityRole="button"
accessibilityLabel="Like"
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 8,
right: 8,
width: 30,
height: 30,
borderRadius: 9,
padding: 0,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z" />
</Svg>
</Pressable>
</View>
<View
style={{
width: 150,
height: 190,
borderRadius: 20,
overflow: 'hidden',
flexShrink: 0,
}}>
<Image
source={{ uri: asset('fe81a6571b.jpg') }}
contentFit="cover"
accessibilityLabel="Turquoise bay framed by palm leaves"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<Text
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 10,
left: 10,
paddingVertical: 6,
paddingHorizontal: 8,
borderRadius: 8,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 9,
color: '#F3F4F6',
letterSpacing: 0.9,
}}>
COASTAL
</Text>
<Pressable
accessibilityRole="button"
accessibilityLabel="Like"
style={{
backgroundColor: 'rgba(20,22,28,.6)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
top: 8,
right: 8,
width: 30,
height: 30,
borderRadius: 9,
padding: 0,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z" />
</Svg>
</Pressable>
</View>
<Image
source={{ uri: asset('9d87548880.jpg') }}
contentFit="cover"
style={{ width: 60, height: 190, borderRadius: 20, flexShrink: 0 }}
/>
</View>
<View
style={{
backgroundColor: 'rgba(28,30,38,.82)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
left: '50%',
bottom: 30,
transform: [{ translateX: '-50%' }],
alignItems: 'center',
gap: 4,
padding: 6,
borderRadius: 30,
overflow: 'hidden',
flexDirection: 'row',
}}>
<BlurView intensity={32} tint="dark" style={StyleSheet.absoluteFill} />
<Pressable
accessibilityRole="link"
style={{
height: 46,
paddingVertical: 0,
paddingLeft: 8,
paddingRight: 18,
borderRadius: 23,
borderWidth: 1,
borderColor: 'rgba(160,190,255,.45)',
boxShadow:
'inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45)',
alignItems: 'center',
gap: 8,
flexShrink: 1,
overflow: 'hidden',
flexDirection: 'row',
}}>
<LinearGradient
colors={['#6E97FF', '#3D6BFF', '#2449D4']}
locations={[0, 0.5, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
<View
style={{
width: 30,
height: 30,
borderRadius: '50%',
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg width="16" height="16" viewBox="0 0 24 24" fill="#3D6BFF">
<Path d="M5 18V9a7 7 0 0 1 14 0v9l-2.3-1.6L14.4 18 12 16.4 9.6 18l-2.3-1.6z" />
</Svg>
</View>
<Text
style={{
fontFamily: 'Inter_600SemiBold',
fontSize: 14,
color: '#fff',
flexShrink: 1,
}}>
Discover
</Text>
</Pressable>
<Pressable
accessibilityRole="link"
accessibilityLabel="Map"
onPress={() => router.navigate('/map')}
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Path d="M3 11 21 3l-8 18-2-8z" />
</Svg>
</Pressable>
<Pressable
accessibilityRole="link"
accessibilityLabel="Trips"
onPress={() => router.navigate('/trip')}
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Rect x="3" y="5" width="18" height="16" rx="3" />
<Path d="M3 10h18M8 3v4M16 3v4" />
</Svg>
</Pressable>
<Pressable
accessibilityRole="link"
accessibilityLabel="Profile"
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Circle cx="12" cy="8" r="4" />
<Path d="M4 21a8 8 0 0 1 16 0" />
</Svg>
</Pressable>
</View>
</View>
</Screen>
);
}src/app/map.tsx
import { BlurView } from 'expo-blur';
import { Image } from 'expo-image';
import { LinearGradient } from 'expo-linear-gradient';
import { router } from 'expo-router';
import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
import Svg, { Circle, Defs, Path, RadialGradient, Rect, Stop } from 'react-native-svg';
import { Screen } from '@/components/screen';
import { asset } from '@/lib/assets';
export default function MapScreen() {
return (
<Screen background="#0B0C10" statusBar="light">
<View style={{ flex: 1 }}>
<Svg
width="390"
height="844"
viewBox="0 0 390 844"
fill="none"
stroke="#1E212A"
style={{ position: 'absolute', top: 0, right: 0, bottom: 0, left: 0 }}>
<Path d="M-10 230 C80 260 140 210 230 250 S360 300 400 280" strokeWidth="10" />
<Path d="M60 -10 C70 120 40 260 90 420 S120 640 80 860" strokeWidth="7" />
<Path d="M240 140 C230 300 300 420 260 560 S300 760 320 860" strokeWidth="6" />
<Path d="M-10 520 C100 500 200 560 400 500" strokeWidth="5" />
<Path
d="M140 180 L180 860 M0 380 L390 420 M330 160 L360 860 M0 640 L390 600"
strokeWidth="2"
stroke="#171920"
/>
<Path
d="M20 300 L120 330 L150 300 M200 460 L330 480 M100 560 L220 620 M260 330 L380 300"
strokeWidth="2"
stroke="#171920"
/>
</Svg>
<Text
style={{
position: 'absolute',
left: 28,
top: 470,
transform: [{ rotate: '-80deg' }],
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 9,
color: '#3A3F4B',
letterSpacing: 0.9,
}}>
KYLES ROAD
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 100,
top: 304,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Samos
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 178,
top: 304,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Naxos
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 262,
top: 286,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Paros
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 300,
top: 338,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Mykonos
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 190,
top: 380,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Rhodes
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 86,
top: 414,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Santorini
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 268,
top: 414,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Izmir
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 44,
top: 488,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Bodrum castle
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 150,
top: 464,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Alaçatı Bays
</Text>
<Text
numberOfLines={1}
style={{
position: 'absolute',
backgroundColor: 'rgba(22,24,31,.86)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.1)',
paddingVertical: 5,
paddingHorizontal: 9,
borderRadius: 9,
left: 268,
top: 506,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 12,
color: '#E6E8EC',
}}>
Çeşme
</Text>
<Image
source={{ uri: asset('318b072146.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 196,
top: 236,
}}
/>
<Image
source={{ uri: asset('cfc112b1d2.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 276,
top: 226,
}}
/>
<Image
source={{ uri: asset('fe81a6571b.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 334,
top: 262,
}}
/>
<Image
source={{ uri: asset('26ea7b4816.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 130,
top: 344,
}}
/>
<Image
source={{ uri: asset('94319b63ac.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 206,
top: 334,
}}
/>
<Image
source={{ uri: asset('9d87548880.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 334,
top: 376,
}}
/>
<Image
source={{ uri: asset('3910a9306f.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 168,
top: 418,
}}
/>
<Image
source={{ uri: asset('80d43b8e3e.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 222,
top: 412,
}}
/>
<Image
source={{ uri: asset('de71224bfc.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 300,
top: 450,
}}
/>
<Image
source={{ uri: asset('a340ebf012.jpg') }}
contentFit="cover"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 82,
top: 520,
}}
/>
<Image
source={{ uri: asset('318b072146.jpg') }}
contentFit="cover"
contentPosition="right"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 208,
top: 494,
}}
/>
<Image
source={{ uri: asset('80d43b8e3e.jpg') }}
contentFit="cover"
contentPosition="right"
style={{
position: 'absolute',
width: 46,
height: 46,
borderRadius: '50%',
borderWidth: 2,
borderColor: 'rgba(255,255,255,.9)',
boxShadow: '0 6px 16px rgba(0,0,0,.6)',
left: 260,
top: 536,
}}
/>
<Pressable
accessibilityRole="button"
accessibilityLabel="Map layers"
style={{
backgroundColor: 'rgba(28,30,38,.9)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
right: 18,
top: 516,
width: 46,
height: 46,
borderRadius: '50%',
padding: 0,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="1.8">
<Path d="m12 3 9 5-9 5-9-5z" />
<Path d="m3 13 9 5 9-5" />
</Svg>
</Pressable>
<View
style={{
backgroundColor: 'rgba(20,22,28,.88)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
left: 10,
right: 10,
top: 50,
borderRadius: 30,
paddingTop: 12,
paddingBottom: 14,
paddingHorizontal: 12,
overflow: 'hidden',
}}>
<BlurView intensity={36} tint="dark" style={StyleSheet.absoluteFill} />
<View style={{ gap: 8, alignItems: 'center', flexDirection: 'row' }}>
<Pressable
accessibilityRole="link"
accessibilityLabel="Back"
onPress={() => router.navigate('/')}
style={{
width: 52,
height: 52,
borderRadius: '50%',
flexShrink: 0,
borderWidth: 1,
borderColor: 'rgba(111,149,255,.4)',
alignItems: 'center',
justifyContent: 'center',
overflow: 'hidden',
flexDirection: 'row',
}}>
<Svg style={StyleSheet.absoluteFill} width="100%" height="100%">
<Defs>
<RadialGradient id="glow2" cx="35%" cy="30%" rx="70%" ry="70%" fx="35%" fy="30%">
<Stop offset="0%" stopColor="#3E66E8" />
<Stop offset="100%" stopColor="#13204F" />
</RadialGradient>
</Defs>
<Rect width="100%" height="100%" fill="url(#glow2)" />
</Svg>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="#fff"
style={{ position: 'relative' }}>
<Path d="M15 4 7 12l8 8-2-8z" />
</Svg>
</Pressable>
<View
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
flex: 1,
minWidth: 0,
height: 50,
borderRadius: 25,
alignItems: 'center',
gap: 8,
paddingVertical: 0,
paddingLeft: 14,
paddingRight: 5,
flexDirection: 'row',
}}>
<Svg
width="17"
height="17"
viewBox="0 0 24 24"
fill="none"
stroke="#9AA0AB"
strokeWidth="2">
<Circle cx="11" cy="11" r="7" />
<Path d="m20 20-3.5-3.5" />
</Svg>
<TextInput
defaultValue="Aegean coast"
accessibilityLabel="Search"
style={{
flex: 1,
minWidth: 0,
borderWidth: 0,
fontFamily: 'Inter_400Regular',
fontSize: 15,
color: '#F3F4F6',
}}
/>
<Pressable
accessibilityRole="button"
style={{
height: 38,
paddingVertical: 0,
paddingHorizontal: 12,
borderRadius: 19,
backgroundColor: 'rgba(61,107,255,.14)',
borderWidth: 1,
borderColor: 'rgba(111,149,255,.55)',
alignItems: 'center',
gap: 6,
flexShrink: 0,
flexDirection: 'row',
}}>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="1.8">
<Path d="m4 20 10-10M15 4v3M13.5 5.5h3M19 9v2M18 10h2M9 3v2M8 4h2" />
</Svg>
<Text
style={{
fontFamily: 'Inter_500Medium',
fontSize: 13,
color: '#F3F4F6',
flexShrink: 1,
}}>
AI Mode
</Text>
</Pressable>
</View>
</View>
<View style={{ gap: 8, marginTop: 12, overflow: 'hidden', flexDirection: 'row' }}>
<Pressable
accessibilityRole="button"
style={{
height: 38,
paddingVertical: 0,
paddingHorizontal: 14,
borderRadius: 19,
borderWidth: 1,
borderColor: 'rgba(160,190,255,.45)',
boxShadow:
'inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45)',
alignItems: 'center',
gap: 6,
flexShrink: 0,
overflow: 'hidden',
flexDirection: 'row',
}}>
<LinearGradient
colors={['#6E97FF', '#3D6BFF', '#2449D4']}
locations={[0, 0.5, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="#fff"
style={{ position: 'relative' }}>
<Path d="M3 11 21 3l-8 18-2-8z" />
</Svg>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_600SemiBold',
fontSize: 13,
color: '#F3F4F6',
}}>
All Places
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 12,
borderRadius: 19,
alignItems: 'center',
gap: 6,
flexShrink: 0,
flexDirection: 'row',
}}>
<Svg
width="15"
height="15"
viewBox="0 0 24 24"
fill="none"
stroke="#D5D8DE"
strokeWidth="1.8">
<Path d="m2 19 7-11 5 7 3-4 5 8z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 13,
color: '#D5D8DE',
flexShrink: 1,
}}>
Scenic
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 12,
borderRadius: 19,
alignItems: 'center',
gap: 6,
flexShrink: 0,
flexDirection: 'row',
}}>
<Svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="#D5D8DE"
strokeWidth="1.8">
<Rect x="5" y="3" width="14" height="18" rx="2" />
<Path d="M9 7h2M13 7h2M9 11h2M13 11h2M10 21v-4h4v4" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 13,
color: '#D5D8DE',
flexShrink: 1,
}}>
Hotels
</Text>
</Pressable>
<Pressable
accessibilityRole="button"
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 12,
borderRadius: 19,
alignItems: 'center',
gap: 6,
flexShrink: 0,
flexDirection: 'row',
}}>
<Svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="#D5D8DE"
strokeWidth="1.8">
<Path d="M3 11 12 4l9 7v9H3z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 13,
color: '#D5D8DE',
flexShrink: 1,
}}>
Stays
</Text>
</Pressable>
</View>
</View>
<View
style={{
position: 'absolute',
left: 0,
right: 0,
bottom: 0,
height: 271,
borderTopLeftRadius: 30,
borderTopRightRadius: 30,
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0,
backgroundColor: '#101218',
borderTopWidth: 1,
borderTopColor: 'rgba(255,255,255,.1)',
}}>
<Pressable
accessibilityRole="button"
accessibilityLabel="Expand list"
style={{
position: 'absolute',
left: '50%',
top: -22,
transform: [{ translateX: '-50%' }],
width: 44,
height: 44,
borderWidth: 0,
padding: 0,
alignItems: 'center',
justifyContent: 'center',
zIndex: 1,
flexDirection: 'row',
}}>
<Svg width="34" height="22" viewBox="0 0 34 22" fill="#3D6BFF">
<Path d="M17 2 32 20c-5-4-10-6-15-6S7 16 2 20z" />
</Svg>
</Pressable>
<View
style={{
alignItems: 'baseline',
justifyContent: 'space-between',
paddingTop: 24,
paddingBottom: 0,
paddingHorizontal: 22,
flexDirection: 'row',
}}>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'InstrumentSerif_400Regular',
fontSize: 24,
color: '#F3F4F6',
}}>
{'Nearby '}
<Text style={{ fontFamily: 'InstrumentSerif_400Regular_Italic', color: '#6F95FF' }}>
finds
</Text>
</Text>
<Text
style={{
flexShrink: 1,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 11,
color: '#9AA0AB',
letterSpacing: 1.1,
}}>
12 PLACES
</Text>
</View>
<View
style={{
gap: 10,
paddingTop: 14,
paddingBottom: 0,
paddingLeft: 16,
paddingRight: 0,
flexDirection: 'row',
}}>
<View
style={{
width: 160,
height: 172,
borderRadius: 20,
overflow: 'hidden',
flexShrink: 0,
borderWidth: 1,
borderColor: 'rgba(255,255,255,.08)',
}}>
<Image
source={{ uri: asset('cfc112b1d2.jpg') }}
contentFit="cover"
accessibilityLabel="Oia village at sunset"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<View style={{ position: 'absolute', top: 0, right: 0, bottom: 0, left: 0 }}>
<LinearGradient
colors={['rgba(6,7,10,0)', 'rgba(6,7,10,.85)']}
locations={[0.45, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
</View>
<Text
style={{
position: 'absolute',
top: 10,
left: 10,
paddingVertical: 6,
paddingHorizontal: 8,
borderRadius: 8,
backgroundColor: 'rgba(20,22,28,.65)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 9,
color: '#F3F4F6',
letterSpacing: 0.9,
}}>
CLIFFSIDE
</Text>
<Pressable
accessibilityRole="button"
accessibilityLabel="Like"
style={{
position: 'absolute',
top: 8,
right: 8,
width: 30,
height: 30,
borderRadius: 9,
padding: 0,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'rgba(20,22,28,.65)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
flexDirection: 'row',
}}>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z" />
</Svg>
</Pressable>
<View style={{ position: 'absolute', left: 12, bottom: 12 }}>
<View style={{ gap: 10, flexDirection: 'row' }}>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 11,
color: '#E6E8EC',
}}>
★ 4.9
</Text>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 11,
color: '#E6E8EC',
}}>
◷ 2.4km
</Text>
</View>
<Text
style={{
marginTop: 2,
fontFamily: 'InstrumentSerif_400Regular_Italic',
fontSize: 22,
color: '#F3F4F6',
}}>
Oia Village
</Text>
</View>
</View>
<View
style={{
width: 160,
height: 172,
borderRadius: 20,
overflow: 'hidden',
flexShrink: 0,
borderWidth: 1,
borderColor: 'rgba(255,255,255,.08)',
}}>
<Image
source={{ uri: asset('a340ebf012.jpg') }}
contentFit="cover"
accessibilityLabel="Sunset over Mykonos harbour"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<View style={{ position: 'absolute', top: 0, right: 0, bottom: 0, left: 0 }}>
<LinearGradient
colors={['rgba(6,7,10,0)', 'rgba(6,7,10,.85)']}
locations={[0.45, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
</View>
<Text
style={{
position: 'absolute',
top: 10,
left: 10,
paddingVertical: 6,
paddingHorizontal: 8,
borderRadius: 8,
backgroundColor: 'rgba(20,22,28,.65)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 9,
color: '#F3F4F6',
letterSpacing: 0.9,
}}>
SUNSET SPOT
</Text>
<Pressable
accessibilityRole="button"
accessibilityLabel="Like"
style={{
position: 'absolute',
top: 8,
right: 8,
width: 30,
height: 30,
borderRadius: 9,
padding: 0,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'rgba(20,22,28,.65)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
flexDirection: 'row',
}}>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#F3F4F6"
strokeWidth="2">
<Path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z" />
</Svg>
</Pressable>
<View style={{ position: 'absolute', left: 12, bottom: 12 }}>
<View style={{ gap: 10, flexDirection: 'row' }}>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 11,
color: '#E6E8EC',
}}>
★ 4.7
</Text>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 11,
color: '#E6E8EC',
}}>
◷ 6.1km
</Text>
</View>
<Text
style={{
marginTop: 2,
fontFamily: 'InstrumentSerif_400Regular_Italic',
fontSize: 22,
color: '#F3F4F6',
}}>
Mykonos Town
</Text>
</View>
</View>
<Image
source={{ uri: asset('80d43b8e3e.jpg') }}
contentFit="cover"
style={{
width: 60,
height: 170,
borderTopLeftRadius: 20,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderBottomLeftRadius: 20,
flexShrink: 0,
}}
/>
</View>
</View>
</View>
</Screen>
);
}src/app/trip.tsx
import { BlurView } from 'expo-blur';
import { Image } from 'expo-image';
import { LinearGradient } from 'expo-linear-gradient';
import { router } from 'expo-router';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import Svg, { Circle, Defs, Path, RadialGradient, Rect, Stop } from 'react-native-svg';
import { Screen } from '@/components/screen';
import { asset } from '@/lib/assets';
export default function TripScreen() {
return (
<Screen background="#06070A" statusBar="light">
<View style={{ paddingTop: 56, paddingBottom: 0, paddingHorizontal: 0, flex: 1 }}>
<View
style={{
alignItems: 'center',
gap: 12,
paddingVertical: 0,
paddingHorizontal: 20,
flexDirection: 'row',
}}>
<Pressable
accessibilityRole="link"
accessibilityLabel="Back"
onPress={() => router.navigate('/map')}
style={{
width: 48,
height: 48,
borderRadius: '50%',
flexShrink: 0,
borderWidth: 1,
borderColor: 'rgba(111,149,255,.4)',
alignItems: 'center',
justifyContent: 'center',
overflow: 'hidden',
flexDirection: 'row',
}}>
<Svg style={StyleSheet.absoluteFill} width="100%" height="100%">
<Defs>
<RadialGradient id="glow3" cx="35%" cy="30%" rx="70%" ry="70%" fx="35%" fy="30%">
<Stop offset="0%" stopColor="#3E66E8" />
<Stop offset="100%" stopColor="#13204F" />
</RadialGradient>
</Defs>
<Rect width="100%" height="100%" fill="url(#glow3)" />
</Svg>
<Svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="#fff"
style={{ position: 'relative' }}>
<Path d="M15 4 7 12l8 8-2-8z" />
</Svg>
</Pressable>
<View style={{ flex: 1 }}>
<Text style={{ fontFamily: 'Inter_600SemiBold', fontSize: 19, color: '#F3F4F6' }}>
Greece
</Text>
<Text
style={{
marginTop: 2,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#9AA0AB',
letterSpacing: 1,
}}>
TRIP / AEGEAN COAST
</Text>
</View>
<Pressable
accessibilityRole="link"
onPress={() => router.navigate('/map')}
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
height: 38,
paddingVertical: 0,
paddingHorizontal: 14,
borderRadius: 18,
alignItems: 'center',
gap: 6,
flexShrink: 1,
flexDirection: 'row',
}}>
<Svg width="14" height="14" viewBox="0 0 24 24" fill="#F3F4F6">
<Path d="M3 6l6-3 6 3 6-3v15l-6 3-6-3-6 3z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_500Medium',
fontSize: 13,
color: '#F3F4F6',
flexShrink: 1,
}}>
Map
</Text>
</Pressable>
</View>
<View
style={{
alignItems: 'center',
gap: 8,
paddingTop: 22,
paddingBottom: 0,
paddingLeft: 20,
paddingRight: 0,
flexDirection: 'row',
}}>
<Image
source={{ uri: asset('94319b63ac.jpg') }}
contentFit="cover"
accessibilityLabel="Island gift shop"
style={{ width: 62, height: 72, borderRadius: 14, flexShrink: 0 }}
/>
<Image
source={{ uri: asset('3910a9306f.jpg') }}
contentFit="cover"
accessibilityLabel="Whitewashed alley"
style={{ width: 62, height: 72, borderRadius: 14, flexShrink: 0 }}
/>
<Image
source={{ uri: asset('80d43b8e3e.jpg') }}
contentFit="cover"
accessibilityLabel="Oia with bougainvillea"
style={{
width: 80,
height: 92,
borderRadius: 18,
flexShrink: 0,
boxShadow: '0 0 0 2px #F3F4F6',
}}
/>
<Image
source={{ uri: asset('318b072146.jpg') }}
contentFit="cover"
accessibilityLabel="Taverna terrace at night"
style={{ width: 62, height: 72, borderRadius: 14, flexShrink: 0 }}
/>
<Image
source={{ uri: asset('26ea7b4816.jpg') }}
contentFit="cover"
accessibilityLabel="Greek dinner table"
style={{ width: 62, height: 72, borderRadius: 14, flexShrink: 0 }}
/>
</View>
<View style={{ paddingTop: 18, paddingBottom: 0, paddingHorizontal: 20 }}>
<View
style={{
backgroundColor: 'rgba(255,255,255,.05)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
borderRadius: 22,
padding: 10,
gap: 14,
flexDirection: 'row',
}}>
<View
style={{
width: 116,
height: 116,
borderRadius: 16,
flexShrink: 0,
overflow: 'hidden',
}}>
<Image
source={{ uri: asset('80d43b8e3e.jpg') }}
contentFit="cover"
accessibilityLabel="Oia village with pink bougainvillea"
style={{
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
<Text
style={{
position: 'absolute',
left: 8,
bottom: 8,
paddingVertical: 4,
paddingHorizontal: 7,
borderRadius: 7,
backgroundColor: 'rgba(20,22,28,.75)',
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#F3F4F6',
}}>
24°C
</Text>
</View>
<View style={{ flex: 1, paddingTop: 4 }}>
<View
style={{
justifyContent: 'space-between',
alignItems: 'flex-start',
flexDirection: 'row',
}}>
<Text
style={{
flexShrink: 1,
fontFamily: 'InstrumentSerif_400Regular_Italic',
fontSize: 26,
color: '#F3F4F6',
lineHeight: 26,
}}>
Oia Village
</Text>
<View style={{ marginTop: 2, flexShrink: 1, flexDirection: 'row' }}>
<Image
source={{ uri: asset('f3e802a37f.jpg') }}
contentFit="cover"
style={{
width: 23,
height: 23,
borderRadius: '50%',
borderWidth: 1.5,
borderColor: '#101218',
}}
/>
<Image
source={{ uri: asset('410a453287.jpg') }}
contentFit="cover"
contentPosition={{ left: '30%', top: '42%' }}
style={{
width: 23,
height: 23,
borderRadius: '50%',
borderWidth: 1.5,
borderColor: '#101218',
marginLeft: -7,
}}
/>
<Image
source={{ uri: asset('410a453287.jpg') }}
contentFit="cover"
contentPosition={{ left: '45%', top: '66%' }}
style={{
width: 23,
height: 23,
borderRadius: '50%',
borderWidth: 1.5,
borderColor: '#101218',
marginLeft: -7,
}}
/>
<Image
source={{ uri: asset('410a453287.jpg') }}
contentFit="cover"
contentPosition={{ left: '65%', top: '56%' }}
style={{
width: 23,
height: 23,
borderRadius: '50%',
borderWidth: 1.5,
borderColor: '#101218',
marginLeft: -7,
}}
/>
</View>
</View>
<Text
style={{
marginTop: 6,
fontFamily: 'Inter_400Regular',
fontSize: 13,
color: '#9AA0AB',
}}>
Greece, Santorini
</Text>
<View style={{ alignItems: 'flex-start', gap: 6, marginTop: 12 }}>
<View
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
paddingVertical: 5,
paddingHorizontal: 10,
borderRadius: 9,
alignItems: 'center',
gap: 6,
flexDirection: 'row',
}}>
<Svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6">
<Path d="M3 11 21 3l-8 18-2-8z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#F3F4F6',
flexShrink: 1,
}}>
26 spots
</Text>
</View>
<View
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
paddingVertical: 5,
paddingHorizontal: 10,
borderRadius: 9,
alignItems: 'center',
gap: 6,
flexDirection: 'row',
}}>
<Svg width="12" height="12" viewBox="0 0 24 24" fill="#F3F4F6">
<Path d="M3 6h7l2 2h9v12H3z" />
</Svg>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#F3F4F6',
flexShrink: 1,
}}>
8 types
</Text>
</View>
</View>
</View>
</View>
</View>
<View style={{ marginTop: 18, marginBottom: 0, marginHorizontal: 20 }}>
<View
style={{
justifyContent: 'space-between',
paddingVertical: 11,
paddingHorizontal: 0,
borderBottomWidth: 1,
borderBottomColor: 'rgba(255,255,255,.08)',
flexDirection: 'row',
}}>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#9AA0AB',
}}>
Trip Status
</Text>
<View
style={{
margin: 0,
alignItems: 'center',
gap: 7,
flexShrink: 1,
flexDirection: 'row',
}}>
<View
style={{ width: 8, height: 8, borderRadius: '50%', backgroundColor: '#34D17A' }}
/>
<Text
style={{
fontFamily: 'Inter_500Medium',
fontSize: 14,
color: '#F3F4F6',
flexShrink: 1,
}}>
Active
</Text>
</View>
</View>
<View
style={{
justifyContent: 'space-between',
paddingVertical: 11,
paddingHorizontal: 0,
borderBottomWidth: 1,
borderBottomColor: 'rgba(255,255,255,.08)',
flexDirection: 'row',
}}>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#9AA0AB',
}}>
Duration
</Text>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'Inter_500Medium',
fontSize: 14,
color: '#F3F4F6',
}}>
4 days left
</Text>
</View>
<View
style={{
justifyContent: 'space-between',
paddingVertical: 11,
paddingHorizontal: 0,
flexDirection: 'row',
}}>
<Text
style={{
flexShrink: 1,
fontFamily: 'Inter_400Regular',
fontSize: 14,
color: '#9AA0AB',
}}>
Accommodation
</Text>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'Inter_500Medium',
fontSize: 14,
color: '#F3F4F6',
}}>
[Hotel name]
</Text>
</View>
</View>
<Pressable
accessibilityRole="button"
style={{
alignItems: 'center',
gap: 4,
marginTop: 2,
marginBottom: 0,
marginHorizontal: 'auto',
borderWidth: 0,
paddingVertical: 6,
paddingHorizontal: 10,
flexDirection: 'row',
}}>
<Text
style={{
fontFamily: 'Inter_400Regular',
fontSize: 13,
color: '#B7BCC6',
flexShrink: 1,
}}>
More info
</Text>
<Svg
width="13"
height="13"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="2">
<Path d="m6 9 6 6 6-6" />
</Svg>
</Pressable>
<View style={{ paddingTop: 10, paddingBottom: 0, paddingHorizontal: 20 }}>
<View
style={{
backgroundColor: 'rgba(255,255,255,.045)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
borderRadius: 16,
paddingVertical: 12,
paddingHorizontal: 14,
gap: 12,
flexDirection: 'row',
}}>
<View
style={{ width: 3, borderRadius: 2, backgroundColor: '#3D6BFF', flexShrink: 0 }}
/>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 11.5,
color: '#D5D8DE',
lineHeight: 18.4,
}}>
{'Visit '}
<Text style={{ color: '#7FA2FF' }}>Akrotiri</Text>
{' before 10 AM for a peaceful atmosphere and golden, crowd-free light.'}
</Text>
</View>
</View>
<View
style={{
alignItems: 'baseline',
justifyContent: 'space-between',
paddingTop: 22,
paddingBottom: 0,
paddingHorizontal: 20,
flexDirection: 'row',
}}>
<Text
style={{
margin: 0,
flexShrink: 1,
fontFamily: 'InstrumentSerif_400Regular',
fontSize: 26,
color: '#F3F4F6',
}}>
{'Trip '}
<Text style={{ fontFamily: 'InstrumentSerif_400Regular_Italic', color: '#6F95FF' }}>
log
</Text>
</Text>
<Text
style={{
flexShrink: 1,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 11,
color: '#9AA0AB',
letterSpacing: 1.1,
}}>
5 PLACES
</Text>
</View>
<View
style={{
gap: 12,
paddingTop: 14,
paddingBottom: 0,
paddingHorizontal: 20,
flexDirection: 'row',
}}>
<View style={{ alignItems: 'center', gap: 6, flexShrink: 1 }}>
<View
style={{
backgroundColor: 'rgba(255,255,255,.07)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
width: 36,
height: 36,
borderRadius: 10,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Text
style={{
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 13,
color: '#F3F4F6',
flexShrink: 1,
}}>
1
</Text>
</View>
<View style={{ width: 1, flex: 1, backgroundColor: 'rgba(255,255,255,.12)' }} />
</View>
<View
style={{
backgroundColor: 'rgba(255,255,255,.045)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
flex: 1,
borderRadius: 18,
padding: 10,
gap: 12,
flexDirection: 'row',
}}>
<Image
source={{ uri: asset('9d87548880.jpg') }}
contentFit="cover"
accessibilityLabel="Blue Dome Church"
style={{ width: 72, height: 72, borderRadius: 12, flexShrink: 0 }}
/>
<View style={{ flex: 1 }}>
<Text
style={{
fontFamily: 'InstrumentSerif_400Regular_Italic',
fontSize: 20,
color: '#F3F4F6',
}}>
Blue Dome Church
</Text>
<Text
style={{
marginTop: 2,
fontFamily: 'Inter_400Regular',
fontSize: 12,
color: '#9AA0AB',
}}>
Greece, Santorini
</Text>
</View>
<Text
style={{
alignSelf: 'flex-end',
flexShrink: 1,
fontFamily: 'JetBrainsMono_400Regular',
fontSize: 10,
color: '#B7BCC6',
textAlign: 'right',
}}>
10:30 AM{'\n'}
<Text style={{ color: '#7B818D' }}>DAY 02</Text>
</Text>
</View>
</View>
<Pressable
accessibilityRole="link"
style={{
position: 'absolute',
left: 112,
bottom: 98,
height: 36,
paddingVertical: 0,
paddingHorizontal: 14,
borderRadius: 17,
backgroundColor: 'rgba(28,30,38,.95)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.14)',
alignItems: 'center',
gap: 8,
boxShadow: '0 8px 20px rgba(0,0,0,.5)',
flexDirection: 'row',
}}>
<View style={{ width: 8, height: 8, borderRadius: '50%', backgroundColor: '#34D17A' }} />
<Text
style={{
fontFamily: 'Inter_500Medium',
fontSize: 13,
color: '#F3F4F6',
flexShrink: 1,
}}>
Open Itinerary
</Text>
</Pressable>
<View
style={{
backgroundColor: 'rgba(28,30,38,.85)',
borderWidth: 1,
borderColor: 'rgba(255,255,255,.12)',
position: 'absolute',
left: '50%',
bottom: 30,
transform: [{ translateX: '-50%' }],
alignItems: 'center',
gap: 4,
padding: 6,
borderRadius: 30,
overflow: 'hidden',
flexDirection: 'row',
}}>
<BlurView intensity={32} tint="dark" style={StyleSheet.absoluteFill} />
<Pressable
accessibilityRole="link"
accessibilityLabel="Discover"
onPress={() => router.navigate('/')}
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Path d="M5 18V9a7 7 0 0 1 14 0v9l-2.3-1.6L14.4 18 12 16.4 9.6 18l-2.3-1.6z" />
</Svg>
</Pressable>
<Pressable
accessibilityRole="link"
accessibilityLabel="Map"
onPress={() => router.navigate('/map')}
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Path d="M3 11 21 3l-8 18-2-8z" />
</Svg>
</Pressable>
<Pressable
accessibilityRole="link"
style={{
height: 46,
paddingVertical: 0,
paddingLeft: 8,
paddingRight: 18,
borderRadius: 23,
borderWidth: 1,
borderColor: 'rgba(160,190,255,.45)',
boxShadow:
'inset 0 1px 0 rgba(255,255,255,.45), inset 0 -3px 8px rgba(10,25,90,.35), 0 6px 18px rgba(61,107,255,.45)',
alignItems: 'center',
gap: 8,
flexShrink: 1,
overflow: 'hidden',
flexDirection: 'row',
}}>
<LinearGradient
colors={['#6E97FF', '#3D6BFF', '#2449D4']}
locations={[0, 0.5, 1]}
start={{ x: 0.5, y: 0 }}
end={{ x: 0.5, y: 1 }}
style={StyleSheet.absoluteFill}
/>
<View
style={{
width: 30,
height: 30,
borderRadius: '50%',
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="15"
height="15"
viewBox="0 0 24 24"
fill="none"
stroke="#3D6BFF"
strokeWidth="2.2">
<Rect x="3" y="5" width="18" height="16" rx="3" />
<Path d="M3 10h18M8 3v4M16 3v4" />
</Svg>
</View>
<Text
style={{
fontFamily: 'Inter_600SemiBold',
fontSize: 14,
color: '#fff',
flexShrink: 1,
}}>
Trip Plan
</Text>
</Pressable>
<Pressable
accessibilityRole="link"
accessibilityLabel="Profile"
style={{
width: 46,
height: 46,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
}}>
<Svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="#B7BCC6"
strokeWidth="1.8">
<Circle cx="12" cy="8" r="4" />
<Path d="M4 21a8 8 0 0 1 16 0" />
</Svg>
</Pressable>
</View>
</View>
</Screen>
);
}src/components/screen.tsx
import { StatusBar } from 'expo-status-bar';
import type { ReactNode } from 'react';
import { ScrollView, useWindowDimensions, View } from 'react-native';
// Every screen is drawn on a 390 wide artboard, then scaled to the device width.
const ARTBOARD_WIDTH = 390;
type Props = {
background: string;
statusBar: 'light' | 'dark';
height?: number;
children: ReactNode;
};
export function Screen({ background, statusBar, height: artboardHeight = 844, children }: Props) {
const { width, height } = useWindowDimensions();
const scale = width / ARTBOARD_WIDTH;
return (
<ScrollView
bounces={false}
showsVerticalScrollIndicator={false}
style={{ flex: 1, backgroundColor: background }}
contentContainerStyle={{ height: Math.max(artboardHeight * scale, height) }}>
<StatusBar style={statusBar} />
<View
style={{
width: ARTBOARD_WIDTH,
height: artboardHeight,
overflow: 'hidden',
transformOrigin: 'left top',
transform: [{ scale }],
}}>
{children}
</View>
</ScrollView>
);
}src/lib/assets.ts
// Demo images are hosted by DeveloperMill. Point this at your own CDN, or swap to require().
const ASSET_BASE = 'https://developermill.com/app-designs/trip-planner-app-ui-design/assets';
export const asset = (name: string) => `${ASSET_BASE}/${name}`;About this design
It covers the whole trip: a discover feed with an AI search mode, a dark map with photo pins, and a trip page with status, tips and a day log. It is a strong base for a planner or a travel guide.
Blue-black night mode with an electric blue accent, editorial serif italics, monospaced labels and glass controls over photography.
- Search bar with an AI mode button
- Dark map with round photo pins
- Nearby place cards in a bottom shelf
- Trip log with status, tips and timeline
Colour palette
Night
#06070A
Carbon
#101218
Electric blue
#3D6BFF
Sky
#7FA2FF
Fog
#D5D8DE
Pewter
#9AA0AB
How to use this design
- 01
Pick what to copy
Copy the Trip Manager artifact, skill or code from this page.
- 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.
- 03
Make it yours
Replace the demo images and sample content, then connect your own data.
Frequently asked questions
Is the map a real map?
It is a styled illustration so the design runs anywhere with no API key. Swap it for react-native-maps and reuse the photo pin views as markers.
What does AI Mode do?
It is a UI entry point in the search bar. Connect it to your own assistant or trip planning API.
Why three fonts?
Inter handles interface text, Instrument Serif adds the editorial headlines, and JetBrains Mono sets the small labels. All three load through Expo Google Fonts.
Is the Trip Manager 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.



