// Travel app UI

Travel Scrapbook Collage App UI Design in Expo

This travel collage app UI turns a trip into a scrapbook. A tall neon cover introduces the journey, then the collage board scatters photos, notes and stickers across a plum background.

Screens
2
Built with
Expo SDK 58
Fonts
Inter, Playfair Display
License
Free (MIT)
Travel app trip cover with a neon Tokyo street photo

Japan Trip Collage app screens

Travel app trip cover with a neon Tokyo street photo

Trip cover

A greeting, a serif trip title with dates and friend matches, and a tall neon photo in a peeking carousel.

Travel scrapbook collage screen with tilted Japan photos and stickers

Collage board

Rotated photos, handwritten style captions and small stickers scattered across a dark scrapbook page.

Copy the Japan Trip Collage 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

# Japan Trip Collage: design artifact

This travel collage app UI turns a trip into a scrapbook. A tall neon cover introduces the journey, then the collage board scatters photos, notes and stickers across a plum background.

- Type: Travel mobile app UI
- Screens: 2
- Artboard: 390 × 844
- Target: Expo SDK 58, Expo Router, TypeScript, expo-image, expo-linear-gradient, react-native-svg
- Live page: https://developermill.com/app-designs/travel-collage-app-ui-design

## Design direction

Plum night tones with pink and sky accents, a neon street cover and tilted photos scattered like a kawaii scrapbook.

- Peeking cover carousel for each trip
- Tilted photo cards with handwritten style notes
- Japanese labels and small sticker details
- Trip stats for days, highlights and friends

## Foundations

### Colour

| Token | Hex |
| --- | --- |
| Aubergine | `#1D1219` |
| Plum | `#2A1B23` |
| Mauve | `#5A3A4C` |
| Sakura | `#FF9EC4` |
| Sky | `#9ED8FF` |
| Lime | `#D8F36A` |

### Typography

- Typefaces: Inter, Playfair Display
- Common sizes (px): 7, 8, 9, 10, 11, 12, 13, 15

### Shape and depth

- Common corner radii (px): 1, 3, 5, 7, 8, 32
- Shadows: `0 10px 24px rgba(0,0,0,0.45)`, `0 10px 24px rgba(0,0,0,0.5)`, `0 28px 56px rgba(10,4,8,0.5)`, `0 12px 28px rgba(0,0,0,0.45)`

## Screens

### 1. Trip cover

A greeting, a serif trip title with dates and friend matches, and a tall neon photo in a peeking carousel.

Preview: https://developermill.com/app-designs/travel-collage-app-ui-design/cover.webp

Copy on this screen:

- Hello, Mariana
- Japan
- Jan 14 — Jan 22 · 24 highlights
- 35 friend match

### 2. Collage board

Rotated photos, handwritten style captions and small stickers scattered across a dark scrapbook page.

Preview: https://developermill.com/app-designs/travel-collage-app-ui-design/collage.webp

Copy on this screen:

- Japan
- 32.5k likes · 24 highlights
- ラーメン横丁 東京・新宿 夜の一杯
- slurpy ramen
- Nara 奈良
- 抹茶 京都の朝
- Tea time
- 24°
- Fuji 富士
- 10:26
- ⁺ ˚ ✦ · ✧ ˚
- kawaii neko
- 伏見 稲荷

## Full source

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

### Trip cover (Main)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Home — Japan trip</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;family=Playfair+Display:wght@700&amp;display=swap" rel="stylesheet">
<style>
body{margin:0}
a{color:#f3e9ef}a:hover{color:#ffffff}
</style>
</helmet>
<div style="width: 390px; height: 844px; position: relative; overflow: hidden; box-sizing: border-box; font-family: Inter, system-ui, sans-serif; color: #ffffff; background: radial-gradient(120% 60% at 50% 0%, #5a3a4c 0%, #3e2833 45%, #2a1b23 100%)">

  <div style="height: 50px; padding: 0 30px; display: flex; align-items: center; justify-content: space-between; font-size: 15px; font-weight: 600">
    <span>9:41</span>
    <div style="display: flex; align-items: center; gap: 6px">
      <svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true"><rect x="0" y="8" width="3" height="4" rx="1" fill="#fff"></rect><rect x="5" y="5.5" width="3" height="6.5" rx="1" fill="#fff"></rect><rect x="10" y="3" width="3" height="9" rx="1" fill="#fff"></rect><rect x="15" y="0" width="3" height="12" rx="1" fill="#fff"></rect></svg>
      <svg width="16" height="12" viewBox="0 0 16 12" aria-hidden="true"><path d="M8 11.5 5.6 9a3.4 3.4 0 0 1 4.8 0L8 11.5Z" fill="#fff"></path><path d="M3.4 6.8a6.5 6.5 0 0 1 9.2 0" stroke="#fff" stroke-width="1.6" fill="none" stroke-linecap="round"></path><path d="M1 4.4a9.9 9.9 0 0 1 14 0" stroke="#fff" stroke-width="1.6" fill="none" stroke-linecap="round"></path></svg>
      <svg width="26" height="12" viewBox="0 0 26 12" aria-hidden="true"><rect x="0.5" y="0.5" width="22" height="11" rx="3.5" stroke="#fff" stroke-opacity="0.45" fill="none"></rect><rect x="2" y="2" width="19" height="8" rx="2" fill="#fff"></rect><rect x="24" y="4" width="1.5" height="4" rx="0.75" fill="#fff" fill-opacity="0.45"></rect></svg>
    </div>
  </div>

  <div style="padding: 24px 20px 0; display: flex; align-items: center; justify-content: space-between">
    <div style="display: flex; align-items: center; gap: 10px">
      <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/a77a77d7e2.jpg" alt="Mariana" style="width: 40px; height: 40px; border-radius: 50%; object-fit: cover; border: 2px solid rgba(255,255,255,0.55); box-sizing: border-box">
      <span style="font-size: 15px; font-weight: 500; color: #f3e9ef">Hello, Mariana</span>
    </div>
    <div style="display: flex; gap: 10px">
      <button aria-label="Notifications" style="width: 44px; height: 44px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.07); display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9"></path><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"></path></svg>
      </button>
      <button aria-label="Messages" style="width: 44px; height: 44px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.07); display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 9a2 2 0 0 1-2 2H6l-4 4V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z"></path><path d="M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1"></path></svg>
      </button>
    </div>
  </div>

  <div style="margin-top: 46px; display: flex; flex-direction: column; align-items: center; gap: 8px">
    <h1 style="margin: 0; font-family: 'Playfair Display', Georgia, serif; font-weight: 700; font-size: 34px; letter-spacing: 0.3px; color: #ffffff">Japan</h1>
    <p style="margin: 0; font-size: 13px; color: rgba(255,255,255,0.72)">Jan 14 — Jan 22 · 24 highlights</p>
    <div style="display: flex; align-items: center; gap: 8px">
      <div style="display: flex">
        <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/8ddbafb926.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover; border: 1.5px solid #3e2833">
        <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/b8dc454dc4.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover; border: 1.5px solid #3e2833; margin-left: -7px">
        <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/2a5c783113.jpg" alt="" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover; border: 1.5px solid #3e2833; margin-left: -7px">
      </div>
      <span style="font-size: 13px; color: rgba(255,255,255,0.8)">35 friend match</span>
    </div>
  </div>

  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/7750c39e71.jpg" alt="" style="position: absolute; left: -240px; top: 292px; width: 262px; height: 392px; object-fit: cover; border-radius: 32px">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/01951ba61b.jpg" alt="" style="position: absolute; left: 368px; top: 292px; width: 262px; height: 392px; object-fit: cover; border-radius: 32px">

  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/aa0ed97e21.jpg" alt="Neon street in Shibuya at night" style="position: absolute; left: 60px; top: 278px; width: 270px; height: 420px; object-fit: cover; border-radius: 46px; border: 1px solid rgba(255,255,255,0.14); box-sizing: border-box; box-shadow: 0 28px 56px rgba(10,4,8,0.5)">

  <nav style="position: absolute; left: 20px; right: 20px; bottom: 34px; display: flex; align-items: center; justify-content: space-between">
    <div style="display: flex; align-items: center; gap: 4px; padding: 6px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.16); background: rgba(255,255,255,0.07)">
      <button aria-label="Home" style="width: 46px; height: 46px; border-radius: 50%; border: none; background: transparent; display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5V20a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z"></path></svg>
      </button>
      <button aria-label="Trips, selected" style="width: 46px; height: 46px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.22); background: rgba(255,255,255,0.16); display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="7" y="3" width="10" height="18" rx="2.5"></rect><path d="M3 6v12"></path><path d="M21 6v12"></path></svg>
      </button>
      <button aria-label="Favorites" style="width: 46px; height: 46px; border-radius: 50%; border: none; background: transparent; display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M19 14c1.5-1.5 3-3.2 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.8 0-3 .5-4.5 2-1.5-1.5-2.7-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4 3 5.5l7 7z"></path></svg>
      </button>
    </div>
    <button aria-label="Add highlight" style="width: 58px; height: 58px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.16); background: rgba(255,255,255,0.07); display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
      <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="{{accent}}" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14"></path><path d="M5 12h14"></path></svg>
    </button>
  </nav>

  <div style="position: absolute; left: 50%; bottom: 8px; transform: translateX(-50%); width: 134px; height: 5px; border-radius: 3px; background: rgba(255,255,255,0.85)"></div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#D8F36A","options":["#D8F36A","#FF9EC4","#9ED8FF"]},"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
  renderVals() {
    return { accent: this.props.accent ?? '#D8F36A' };
  }
}
</script>
</body>
</html>
```

### Collage board (Collage)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Trip collage — Japan</title>
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap" rel="stylesheet">
<style>
body{margin:0}
a{color:#f3e9ef}a:hover{color:#ffffff}
</style>
</helmet>
<div style="width: 390px; height: 844px; position: relative; overflow: hidden; box-sizing: border-box; font-family: Inter, system-ui, sans-serif; color: #ffffff; background: #1d1219">

  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/aa0ed97e21.jpg" alt="" style="position: absolute; left: -80px; top: -80px; width: 550px; height: 1004px; object-fit: cover; filter: blur(48px) saturate(0.9) brightness(0.58)">
  <div style="position: absolute; inset: 0; background: linear-gradient(90deg, rgba(22,12,18,0.55) 0%, rgba(22,12,18,0) 40%, rgba(22,12,18,0) 60%, rgba(22,12,18,0.55) 100%), linear-gradient(180deg, rgba(30,16,24,0.5) 0%, rgba(30,16,24,0.1) 45%, rgba(20,12,18,0.55) 100%)"></div>

  <div style="position: relative; height: 50px; padding: 0 30px; display: flex; align-items: center; justify-content: space-between; font-size: 15px; font-weight: 600">
    <span>9:41</span>
    <div style="display: flex; align-items: center; gap: 6px">
      <svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true"><rect x="0" y="8" width="3" height="4" rx="1" fill="#fff"></rect><rect x="5" y="5.5" width="3" height="6.5" rx="1" fill="#fff"></rect><rect x="10" y="3" width="3" height="9" rx="1" fill="#fff"></rect><rect x="15" y="0" width="3" height="12" rx="1" fill="#fff"></rect></svg>
      <svg width="16" height="12" viewBox="0 0 16 12" aria-hidden="true"><path d="M8 11.5 5.6 9a3.4 3.4 0 0 1 4.8 0L8 11.5Z" fill="#fff"></path><path d="M3.4 6.8a6.5 6.5 0 0 1 9.2 0" stroke="#fff" stroke-width="1.6" fill="none" stroke-linecap="round"></path><path d="M1 4.4a9.9 9.9 0 0 1 14 0" stroke="#fff" stroke-width="1.6" fill="none" stroke-linecap="round"></path></svg>
      <svg width="26" height="12" viewBox="0 0 26 12" aria-hidden="true"><rect x="0.5" y="0.5" width="22" height="11" rx="3.5" stroke="#fff" stroke-opacity="0.45" fill="none"></rect><rect x="2" y="2" width="19" height="8" rx="2" fill="#fff"></rect><rect x="24" y="4" width="1.5" height="4" rx="0.75" fill="#fff" fill-opacity="0.45"></rect></svg>
    </div>
  </div>

  <header style="position: relative; padding: 12px 20px 0; display: flex; align-items: center; justify-content: space-between">
    <a href="Main.dc.html" aria-label="Back" style="width: 44px; height: 44px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.07); display: flex; align-items: center; justify-content: center; box-sizing: border-box">
      <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"></path></svg>
    </a>
    <div style="display: flex; flex-direction: column; align-items: center; gap: 3px">
      <h1 style="margin: 0; font-size: 17px; font-weight: 600; color: #ffffff">Japan</h1>
      <p style="margin: 0; font-size: 12px; color: rgba(255,255,255,0.72)">32.5k likes · 24 highlights</p>
    </div>
    <button aria-label="Add to collage" style="width: 44px; height: 44px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.07); display: flex; align-items: center; justify-content: center; padding: 0; cursor: pointer">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="{{accent}}" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14"></path><path d="M5 12h14"></path></svg>
    </button>
  </header>

  <!-- Ramen cluster -->
  <p style="position: absolute; left: 58px; top: 186px; margin: 0; font-size: 7px; line-height: 1.5; color: rgba(255,255,255,0.55); white-space: pre-line">ラーメン横丁
東京・新宿
夜の一杯</p>
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/a507517a89.jpg" alt="Ramen shop with red lanterns" style="position: absolute; left: 98px; top: 172px; width: 82px; height: 132px; object-fit: cover; border-radius: 7px; transform: rotate(2deg); box-shadow: 0 10px 24px rgba(0,0,0,0.45)">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/6a186a953e.jpg" alt="Bowl of tonkotsu ramen" style="position: absolute; left: 32px; top: 252px; width: 108px; height: 78px; object-fit: cover; border-radius: 7px; transform: rotate(-5deg); box-shadow: 0 10px 24px rgba(0,0,0,0.5)">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/518ee1004b.png" alt="" style="position: absolute; left: 160px; top: 232px; width: 40px; transform: rotate(14deg)">
  <span style="position: absolute; left: 86px; top: 320px; display: flex; align-items: center; gap: 4px; padding: 3px 9px 3px 4px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.2); font-size: 10px; color: #ffffff">
    <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/6a186a953e.jpg" alt="" style="width: 14px; height: 14px; border-radius: 50%; object-fit: cover">slurpy ramen</span>

  <!-- Nara cluster -->
  <div style="position: absolute; left: 290px; top: 214px; width: 26px; height: 9px; background: rgba(150,190,255,0.75); transform: rotate(-38deg); border-radius: 1px"></div>
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/529b57b3ec.jpg" alt="Feeding a deer in Nara Park" style="position: absolute; left: 318px; top: 176px; width: 66px; height: 104px; object-fit: cover; border-radius: 7px; transform: rotate(3deg); box-shadow: 0 10px 24px rgba(0,0,0,0.45)">
  <span style="position: absolute; left: 316px; top: 272px; padding: 2px 7px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.2); font-size: 8px; color: #ffffff">Nara 奈良</span>

  <!-- Tea cluster -->
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/069948b159.jpg" alt="Tatami tea room with matcha" style="position: absolute; left: 16px; top: 430px; width: 60px; height: 58px; object-fit: cover; border-radius: 7px; transform: rotate(-3deg); box-shadow: 0 10px 24px rgba(0,0,0,0.45)">
  <p style="position: absolute; left: 84px; top: 436px; margin: 0; font-size: 7px; line-height: 1.5; color: rgba(255,255,255,0.5); white-space: pre-line">抹茶
京都の朝</p>
  <span style="position: absolute; left: 50px; top: 488px; padding: 2px 8px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.2); font-size: 9px; color: #ffffff">Tea time</span>

  <!-- Fuji cluster -->
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/2b453d8083.jpg" alt="Torii gate in Lake Ashi with Mount Fuji" style="position: absolute; left: 226px; top: 382px; width: 112px; height: 148px; object-fit: cover; border-radius: 8px; box-shadow: 0 12px 28px rgba(0,0,0,0.45)">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/54c0ac64c9.jpg" alt="Woman in red kimono" style="position: absolute; left: 330px; top: 374px; width: 32px; height: 52px; object-fit: cover; border-radius: 5px; transform: rotate(4deg); box-shadow: 0 6px 14px rgba(0,0,0,0.45)">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/c9c36ea091.png" alt="" style="position: absolute; left: 340px; top: 426px; width: 26px">
  <span style="position: absolute; left: 190px; top: 424px; display: flex; align-items: center; gap: 3px; padding: 2px 7px 2px 5px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.2); font-size: 8px; color: #ffffff">
    <svg width="9" height="9" viewBox="0 0 24 24" fill="none" stroke="#FFD66B" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"></path></svg>24°</span>
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/839d30c1a0.jpg" alt="Snow-capped Mount Fuji" style="position: absolute; left: 178px; top: 474px; width: 86px; height: 64px; object-fit: cover; border-radius: 7px; transform: rotate(-4deg); box-shadow: 0 10px 24px rgba(0,0,0,0.5)">
  <span style="position: absolute; left: 252px; top: 526px; padding: 3px 10px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.22); font-size: 11px; font-weight: 500; color: #ffffff">Fuji 富士</span>

  <!-- Neko cluster -->
  <span style="position: absolute; left: 40px; top: 646px; padding: 2px 6px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.2); font-size: 8px; color: #ffffff">10:26</span>
  <p style="position: absolute; left: 176px; top: 622px; margin: 0; font-size: 10px; letter-spacing: 2px; color: rgba(255,255,255,0.75)">⁺ ˚ ✦ · ✧ ˚</p>
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/bd270f828d.jpg" alt="3D cat billboard in Shinjuku" style="position: absolute; left: 76px; top: 620px; width: 116px; height: 138px; object-fit: cover; border-radius: 7px; transform: rotate(-2deg); box-shadow: 0 12px 26px rgba(0,0,0,0.5)">
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/5531c740a7.png" alt="" style="position: absolute; left: 56px; top: 716px; width: 36px; transform: rotate(-18deg)">
  <span style="position: absolute; left: 116px; top: 748px; padding: 3px 10px; border-radius: 999px; background: rgba(28,16,24,0.72); border: 1px solid rgba(255,255,255,0.22); font-size: 11px; font-weight: 500; color: #ffffff">kawaii neko</span>

  <!-- Kimono cluster -->
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/54c0ac64c9.jpg" alt="Kimono at Fushimi Inari" style="position: absolute; left: 290px; top: 648px; width: 78px; height: 84px; object-fit: cover; object-position: 50% 30%; border-radius: 7px; transform: rotate(3deg); box-shadow: 0 10px 24px rgba(0,0,0,0.5)">
  <p style="position: absolute; left: 372px; top: 656px; margin: 0; font-size: 7px; line-height: 1.5; color: rgba(255,255,255,0.5); white-space: pre-line">伏見
稲荷</p>
  <img src="https://developermill.com/app-designs/travel-collage-app-ui-design/assets/6bcac6fd8a.png" alt="" style="position: absolute; left: 338px; top: 708px; width: 32px; transform: rotate(10deg)">

  <div style="position: absolute; left: 50%; bottom: 8px; transform: translateX(-50%); width: 134px; height: 5px; border-radius: 3px; background: rgba(255,255,255,0.85)"></div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#D8F36A","options":["#D8F36A","#FF9EC4","#9ED8FF"]},"$preview":{"width":390,"height":844}}'>
class Component extends DCLogic {
  renderVals() {
    return { accent: this.props.accent ?? '#D8F36A' };
  }
}
</script>
</body>
</html>
```

SKILL.md

Save as .claude/skills/travel-collage-app-ui/SKILL.md

---
name: travel-collage-app-ui
description: Build the Japan Trip Collage mobile app UI in Expo React Native. Use when asked to create a travel journal app UI or a new screen in this visual style.
---

# Japan Trip Collage app UI

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

Reference: https://developermill.com/app-designs/travel-collage-app-ui-design

## Visual direction

Plum night tones with pink and sky accents, a neon street cover and tilted photos scattered like a kawaii scrapbook.

Keep these signature details:

- Peeking cover carousel for each trip
- Tilted photo cards with handwritten style notes
- Japanese labels and small sticker details
- Trip stats for days, highlights and friends

## Set up

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

## Tokens

| Name | Hex |
| --- | --- |
| Aubergine | `#1D1219` |
| Plum | `#2A1B23` |
| Mauve | `#5A3A4C` |
| Sakura | `#FF9EC4` |
| Sky | `#9ED8FF` |
| Lime | `#D8F36A` |

- Typefaces: Inter, Playfair Display
- Text sizes (px): 7, 8, 9, 10, 11, 12, 13, 15
- Corner radii (px): 1, 3, 5, 7, 8, 32

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

## Screens

1. **Trip cover.** A greeting, a serif trip title with dates and friend matches, and a tall neon photo in a peeking carousel.
2. **Collage board.** Rotated photos, handwritten style captions and small stickers scattered across a dark scrapbook page.

## 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 travel-collage-app --template default
cd travel-collage-app
rm -rf src
npx expo install expo-image expo-linear-gradient react-native-svg @expo-google-fonts/inter @expo-google-fonts/playfair-display expo-font

src/app/_layout.tsx

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

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

  if (!fontsLoaded) return null;

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

About this design

Absolute positioning and slight rotations give the board its handmade feel. The pattern works for travel journals, memory apps and shared albums, where a plain photo grid would feel too flat.

Plum night tones with pink and sky accents, a neon street cover and tilted photos scattered like a kawaii scrapbook.

  • Peeking cover carousel for each trip
  • Tilted photo cards with handwritten style notes
  • Japanese labels and small sticker details
  • Trip stats for days, highlights and friends

Colour palette

  • Aubergine

    #1D1219

  • Plum

    #2A1B23

  • Mauve

    #5A3A4C

  • Sakura

    #FF9EC4

  • Sky

    #9ED8FF

  • Lime

    #D8F36A

How to use this design

  1. 01

    Pick what to copy

    Copy the Japan Trip Collage artifact, skill or code from this page.

  2. 02

    Run it or generate it

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

  3. 03

    Make it yours

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

Frequently asked questions

How is the collage positioned?

Each item has an absolute position and a small rotation on a fixed artboard, so the composition stays the same on every phone width.

Can users drag the photos?

Not in this version. The board is a fixed layout. You can add dragging with react-native-gesture-handler and Reanimated.

Can I change the destination?

Yes. Replace the images and captions in the screen data. Nothing in the layout is tied to Japan.

Is the Japan Trip Collage design free to use?

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

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

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

Which Expo version does the code use?

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

More app UI designs