Nº 128 of 520
Mobile inbox list
A phone inbox: large title, search, unread rows, a thread sheet, and a four-item tab bar clear of the home indicator.
Preview
Use it
Free to use · credit appreciated1 Once, in your project
npx skills add SusanAcharya/Design-Lounge 2 Then ask
Using the Design Lounge skill, build "Mobile inbox list" (piece mobile-inbox-list) in my stack. Match its brief; restyle it onto my product's theme.
No skill? Paste the brief instead. It carries the numbers, tokens and behaviour.
<!-- Design Lounge Nº 128 · "Mobile inbox list" · www.designlounge.live -->
# Mobile inbox list
> **Build brief for a coding agent.** Rebuild this piece in the reader's stack. If they haven't said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don't "improve" them. When a kit is locked, map colours onto the kit tokens and use the component field and tab rules. Keep the list, the sheet, and the tab bar.
## What it is
The inbox of a yard operations app on a phone. The Lounge draws the device chrome, so this screen does not draw a status bar. It leaves 54px at the top. A 32px title "Inbox", a 40px search field, then message rows at least 72px tall. Unread rows use `--primary-soft` and an 8px dot. Tapping a row opens a sheet with the sender and the full line, and clears the unread state. A 64px tab bar sits at the bottom with 18px of that reserved above the home indicator. Inbox is current.
## Reference behaviour
1. Initial state: two unread rows (Mira Lama, Yard desk) and two read rows. Inbox tab is `aria-current="page"`.
2. Typing in search filters rows by their visible text, case-insensitive. Non-matches are `display: none`.
3. Tap a row: remove the unread class and hide the dot, show the sheet with that sender as the title and `data-body` as the paragraph.
4. Back hides the sheet and shows the list again. The row stays read.
5. Tab buttons set `aria-current` on the pressed one and clear it on the others. They do not navigate away in the demo. The list stays.
6. Search field height 40px, radius 10px, fill `--surface-2`, no border.
7. Avatar is initials on `#2c241c`, 44px circle. No photos.
8. Do not draw a notch, a clock, or a browser bar.
## Structure
```
390 × 844
padding-top 54
title row, padding 0 20
search, margin 8 20 12, height 40
list flex 1
tab bar 64, padding-bottom 18
sheet covers the list, from top 54 to bottom 64, when open
```
- Rows are `button` elements so they are in the tab order.
- Tabs are a `nav` labelled "Sections".
- The sheet starts hidden.
## Tokens
```css
… 115 more lines. Copy or download for the full brief. Loading the source…Brief
155 linesBuild brief for a coding agent. Rebuild this piece in the reader’s stack. If they haven’t said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don’t “improve” them. When a kit is locked, map colours onto the kit tokens and use the component field and tab rules. Keep the list, the sheet, and the tab bar.
What it is
The inbox of a yard operations app on a phone. The Lounge draws the device chrome, so this screen does not draw a status bar. It leaves 54px at the top. A 32px title “Inbox”, a 40px search field, then message rows at least 72px tall. Unread rows use --primary-soft and an 8px dot. Tapping a row opens a sheet with the sender and the full line, and clears the unread state. A 64px tab bar sits at the bottom with 18px of that reserved above the home indicator. Inbox is current.
Reference behaviour
- Initial state: two unread rows (Mira Lama, Yard desk) and two read rows. Inbox tab is
aria-current="page". - Typing in search filters rows by their visible text, case-insensitive. Non-matches are
display: none. - Tap a row: remove the unread class and hide the dot, show the sheet with that sender as the title and
data-bodyas the paragraph. - Back hides the sheet and shows the list again. The row stays read.
- Tab buttons set
aria-currenton the pressed one and clear it on the others. They do not navigate away in the demo. The list stays. - Search field height 40px, radius 10px, fill
--surface-2, no border. - Avatar is initials on
#2c241c, 44px circle. No photos. - Do not draw a notch, a clock, or a browser bar.
Structure
390 × 844
padding-top 54
title row, padding 0 20
search, margin 8 20 12, height 40
list flex 1
tab bar 64, padding-bottom 18
sheet covers the list, from top 54 to bottom 64, when open
- Rows are
buttonelements so they are in the tab order. - Tabs are a
navlabelled “Sections”. - The sheet starts hidden.
Tokens
:root {
--bg: #f4f1ea;
--surface: #fffdf8;
--surface-2: #efeae0;
--ink: #1b1814;
--ink-2: #5e574e;
--ink-3: #8d857a;
--line: #e3dbcf;
--primary: #8a4b12;
--primary-soft: #f4e4d4;
--focus: #8a4b12;
--font-text: "IBM Plex Sans", system-ui, sans-serif;
--safe-top: 54px;
--tab: 64px;
--row: 72px;
}
Typography
- Title: IBM Plex Sans 600, 32px, tracking -0.03em.
- Name: 15px, weight 600.
- Preview: 13px,
--ink-2, one line, ellipsis. - Time: 12px,
--ink-3. - Tabs: 11px, weight 500. Current tab weight 600, colour
--primary. - Sheet title: 28px, weight 600, tracking -0.03em.
- Back: 15px, weight 600,
--primary, height 40px.
Motion
None in this piece. The sheet appears. Do not add a spring. Reduced motion changes nothing.
States
- Row unread (
--primary-softplus dot) and read (surface, dot hidden). - Search filters the list.
- Sheet open or hidden.
- One tab current.
Accessibility
- Search has the label “Search threads”.
- Rows are buttons. The visible name includes the sender.
- Tab bar is a nav with an accessible name.
- Current tab is
aria-current="page". - Back is a button, not a disguised div.
- Preview ellipsis does not remove the text from the accessibility tree. The sheet shows the full sentence.
- Minimum row height 72px. Tab bar content sits above the 18px home-indicator padding.
--inkon--primary-softstays above 4.5.
Responsive rules
- This is a 390-wide phone screen. At 360, horizontal padding stays 20px and the preview ellipsis tightens. Do not introduce a second column.
- If the same screen is shown at tablet width, cap the list at 480px and center it. Do not stretch rows across 1180px.
- The 54px top pad remains, because the device chrome is drawn outside this document.
Acceptance checklist
- Top padding is 54px. No fake status bar.
- Title is 32px. Search is 40px.
- Two rows start unread with a dot and a soft fill.
- Search hides non-matching rows.
- Opening a row clears unread and shows the full message.
- Back returns to the list.
- Tab bar is 64px with Inbox current.
- Type is IBM Plex Sans only.
- Avatars are initials, 44px.
Implementation notes
The sheet is position: fixed between the top safe area and the tab bar. Do not cover the tab bar. Back must remain reachable.
Mark unread with a class, not by guessing from the dot. Removing the class hides the dot via CSS.
In a product build, the other tabs can change the list. In this demo they only move aria-current, so the inbox remains the specimen.
Rebuild in this order:
- Canvas 390 by 844. Background
#f4f1ea. Padding-top 54. No status bar, no clock, no notch. - Title Inbox, 32px, weight 600, tracking -0.03em, padding 0 20px.
- Search height 40, radius 10, fill
#efeae0, no border, margin 8px 20px 12px. Placeholder “Search threads”. - List background
#fffdf8. - Row min-height 72, padding 12px 20px, grid 44px, fluid, auto, gap 10. Bottom rule
#e3dbcf. - Avatar 44px circle, fill
#2c241c, initials 13px weight 600, colour#f4efe6. - Name 15px weight 600. Preview 13px
#5e574e, one line, ellipsis. - Time 12px
#8d857a. - Unread fill
#f4e4d4. Dot 8px#8a4b12, aligned to the end, margin-top 8. Read rows hide the dot. - Mira Lama and Yard desk start unread. Asha Karki and Rajan Shrestha start read.
- Times: 09:41, 08:12, Yesterday, Mon.
- Sheet is fixed from top 54 to bottom 64, padding 20, background
#f4f1ea. - Back is 40px tall, weight 600, colour
#8a4b12. Sheet title 28px weight 600. - Tab bar height 64, padding-bottom 18, fill
#fffdf8, top rule#e3dbcf, four equal columns. - Tab label 11px. Current is weight 600 colour
#8a4b12. Others weight 500 colour#8d857a. Labels: Inbox, Runs, People, You.
Common mistakes to avoid:
- Drawing a status bar or a home indicator. The Lounge frame does that.
- Covering the tab bar with the sheet.
- Leaving the unread fill on after the sheet opens.
- Using photos for avatars.
- A glass tab bar. This screen’s bar is a solid surface and a 1px rule.
- Swiping to delete. That is a different piece.
- Making search a second screen. It filters in place.
- Animating the sheet up. It appears.
- Shrinking the row under 72px to fit four messages with room to spare. Extra space stays empty below the list.
- Putting the time on the left. Time is in the trailing column.
- Using a serif for the title. The face is IBM Plex Sans.
- Navigating the Runs tab to an empty page in the demo. It only takes aria-current.
- Reducing the top pad below 54px.
- Using a 36px avatar. It is 44px.
Details
- Palette
- Type
- IBM Plex Sans
- Motion
- Static
- Build
- One session
- Tags
On the shelves