Style Guide

Pocket Status
Design System

Exhaustive reference for building consistent experiences across web, iOS, Android, and Chrome extension. Covers every color, component, animation, and responsive pattern.

4

Status States

4

Plan Tiers

2

Typefaces

11

Social Platforms

17

Sections

8

Keyframes

Brand Identity

Logo, naming, and the traffic light motif that runs through everything.

Product Name

Pocket StatusCorrect
PocketStatus
pocketstatus
Pocketstatus
pocketStatus

Always two words, both capitalized. URLs like pocketstatus.com and @pocketstatus handles are exceptions.

Logo Variants

Full Logo

Full Mark

/pockedtstatus-logo-full.png

Small Logo

Compact / No BG

/pocketstatus-logo-nobg-small.png

Three-Dot Mark

Inline CSS / SVG

Three-Dot Mark Sizes

Micro (6px)

Footer

Small (8px)

Sidebar nav

Standard (10px)

Desktop header

Medium (12px)

Mobile header

Large (16px)

Style guide hero

XL (20px)

Logo showcase

Color System

Status colors, plan accents, surfaces, and text. Tap any swatch to copy its value.

Status Colors — Primary Brand Palette

Plan Tier Accents

Status Derived Tokens

Each status has muted, glow, and strong variants for layered depth effects.

TokenGREENAMBERREDOFFLINE
color
colorMuted
glowColor
glowStrong

Surface Colors

Text Colors

Typography

Two typefaces from the Geist family. System-native, optimized for UI.

Typefaces

Geist Sans

--font-geist-sans

Primary typeface for all UI text, headings, labels, and body copy. Clean geometric sans with excellent readability at all sizes.

Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 0123456789

Geist Mono

--font-geist-mono

Secondary typeface for code snippets, hex values, technical labels, and data. Pairs seamlessly with Geist Sans.

Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 0123456789

Type Scale

Display

text-5xl / 48px / extrabold / tracking-tight

Hero Heading

text-4xl / 36px / bold / tracking-tight

Section Heading

text-3xl / 30px / bold

Card Heading

text-2xl / 24px / semibold

Subheading

text-xl / 20px / semibold

Lead Text

text-lg / 18px / medium

Body

text-base / 16px / regular

UI Label

text-sm / 14px / medium

Caption

text-xs / 12px / semibold

Overline

10px / bold / uppercase / tracking-widest

Font Weights

AgRegular400
AgMedium500
AgSemibold600
AgBold700
AgExtrabold800

Letter Spacing

Pocket Status-0.04em
Pocket Statustight (-0.02em)
Pocket Statusnormal (0)
Pocket Statuswide (0.025em)
Pocket Statuswider (0.05em)
Pocket Status0.12em

Status System

The core of Pocket Status. Four states, each with a full visual language.

Interactive Status Squircles

The primary status picker. Order follows the traffic light logo: Red, Amber, Green, Offline. Click to select.

Available

GREEN#10b981

Compact Squircles (Header/Menu)

Circular Status Picker (Profile Page)

Owner-only circular variant used on the profile page. Four 3D glass-sphere buttons in a horizontal row — each sits inside a translucent circular housing. Selected state has a colored ring, glow halo, a centered white dot on the sphere, and a bold colored label beneath. Inactive spheres are subtly desaturated. Every sphere has a specular highlight (top-left crescent) for depth.

Available
Away
Busy
Offline

Anatomy — Selected State

Glow halo — radial-gradient, opacity 0.5
Glass housing — 2px border {color}40, tinted bg
Sphere — cfg.color + inset shadows
Specular highlight — top crescent, white 45%
Selected dot — w-2.5, centered, white/90
BusyLabel — bold + {color} when selected
Layoutflex items-center justify-center gap-4 sm:gap-5
Housing Sizew-14 h-14 sm:w-16 sm:h-16
Sphere Sizew-8 h-8 sm:w-9 sm:h-9
Sphere StylebackgroundColor: cfg.color
Speculartop 10%, left/right 18%, h 36%, blur-[0.5px]
Inactive Filtersaturate(0.85) brightness(0.95)
Active Filtersaturate(1.1) brightness(1.05)
Selected Housingradial-gradient(circle, colorMuted 0.2→0.08)
Selected Border2px solid {color}40
Glow Haloradial-gradient(circle, glowColor→transparent 70%)
Glow Shadow0 0 20px glowColor, 0 2px 8px glowColor
Selected Dotw-2.5 h-2.5 rounded-full bg-white/90 shadow-sm
Tap Animationactive:scale-95, 200ms ease
Transitiontransform, background, border-color, opacity — 200–300ms
VisibilityOwner-only

Status Indicator Dot (Header)

Small indicator overlaid on avatar with border matching background.

Available
Away
Busy
Offline

Components

Buttons, cards, inputs, badges, and interactive elements.

Buttons — Primary CTA

Primary CTA Pattern

rounded-full px-8 py-3.5 text-sm font-medium
bg-gradient-to-b from-{color}-500 to-{color}-600
text-white shadow-lg shadow-{color}-900/20
hover:shadow-{color}-900/40 transition-all duration-300

Buttons — Secondary / Ghost

Buttons — Disabled / Current Plan

Current Plan

Cards

Standard Card

Used for pricing tiers, settings panels, and content blocks. Glass morphism with backdrop blur.

Highlighted Card

Accent border + ambient glow behind content. Used for featured pricing tiers (Pro, Team).

Status Panels

Frosted glass cards for displaying a person's status. Used in team boards, widgets (iOS/Android), notification views, and the Chrome extension popup. Each panel shows a status dot, name, message, and status label.

Sarah

Working from home today

Available

Marcus

Back in 30 mins

Away

Jamie

In a meeting until 3pm

Busy

Status Panel Pattern

/* Glass panel — adapts to any background */
<div className="flex items-center gap-4 px-5 py-4
  rounded-2xl border border-white/15
  backdrop-blur-xl"
  style={{ background: "rgba(255,255,255,0.08)" }}
>
  {/* Status dot with glow */}
  <div className="w-3.5 h-3.5 rounded-full"
    style={{
      backgroundColor: statusColor,
      boxShadow: "0 0 8px ${glowColor}, ..."
    }}
  />

  {/* Name + message */}
  <div className="flex-1 min-w-0">
    <p className="text-sm font-semibold text-white">Name</p>
    <p className="text-xs text-white/50 truncate">Message</p>
  </div>

  {/* Status label */}
  <span className="text-xs font-semibold"
    style={{ color: statusColor }}>
    Available
  </span>
</div>
Corner Radiusrounded-2xl (16px)
Paddingpx-5 py-4
Gapgap-4 (16px)
Backgroundrgba(255,255,255,0.08)
Borderborder-white/15
Blurbackdrop-blur-xl (20px)
Status Dotw-3.5 h-3.5 (14px)
Nametext-sm font-semibold text-white
Messagetext-xs text-white/50 truncate
Status Labeltext-xs font-semibold

Variant Notes

Team Board

Stack vertically in a scrollable list. Add avatar between dot and name for multi-user views.

iOS Widget

Use system blur (UIVisualEffectView) with same 8% white tint. Match 16px corner radius.

Android Widget

Use MaterialContainerTransform with translucent surface. Match rounded corners and blur.

Chrome Extension

Render in popup panel (400px wide). Use CSS backdrop-filter. Same border + blur tokens.

Step Cards

Numbered walkthrough cards used in the "How it works" section. Each has a floating step badge, an icon region, title, and description.

1

Set your status

Tap to update. Available, away, or busy — choose what fits.

2

Share your link

Send your unique page to the people you want to stay aligned with.

3

They instantly know

Your status appears on their screen. No ping required.

Gridmd:grid-cols-3 gap-5 sm:gap-8
Card BGbg-white/60 dark:bg-slate-800/60
Borderborder-stone-200/60 dark:border-slate-700/60
Corner Radiusrounded-2xl (16px)
Paddingp-8 (32px)
Step Badgew-8 h-8 rounded-full, absolute -top-3 -left-3
Badge BGbg-stone-700 dark:bg-slate-700
Badge Texttext-sm font-medium text-stone-50
Icon Regionmb-5 (20px bottom margin)
Titletext-lg font-semibold text-stone-700 dark:text-white
Descriptionleading-relaxed text-stone-500 dark:text-slate-400

Benefit Cards

Feature/benefit cards used in the "Why it matters" section. Each has a colored icon square, title, and description. Icons use a per-card accent color.

Fewer interruptions

Stop the 'are you busy?' cycle before it starts.

Quiet reassurance

Know they're okay without needing to ask.

Stay aligned

Across distances, time zones, and busy days.

You control it

Share only what you want, with who you choose.

Gridsm:grid-cols-2 lg:grid-cols-4 gap-6
Card BGbg-white/60 dark:bg-slate-800/70
Borderborder-stone-200/50 dark:border-slate-700/50
Corner Radiusrounded-2xl (16px)
Paddingp-6 (24px)
Icon Squarew-10 h-10 rounded-xl mb-4
Icon Sizew-5 h-5 (20px)
Titlefont-semibold text-stone-700 dark:text-white
Descriptiontext-sm leading-relaxed text-stone-500

Icon Square Color Map

emerald
blue
violet
amber

Form Inputs

@

jane@example.com

Badges & Pills

Most PopularBest ValueSave 20%AvailableBusy

Verified Badge

Blue checkmark shown next to name for Pro+ subscribers. Rendered inline via the VerifiedBadge component.

Name

XS (12px)

Hover cards, feeds

Name

SM (14px)

Profile pill, menus

Name

MD (16px)

Large displays

Background#3b82f6 (blue-500)
IconWhite checkmark path
Conditionplan !== "free"
Accessibilityaria-label="Verified"
PlacementInline after display name
SurfacesProfile pill, header menu, hover cards, search results, hashtag feeds, OG image, badge SVG

Feature Detail Tags

Inline feature descriptors used in pricing cards.

Status + links pageZapier, Make, GitHubColors, emojis, labelsFriends, family, coworkerspocketstatus.app/you

Quick Link Icons

Used in header dropdown and mobile menu grids.

Home
History
Metrics
Theme
How
Why
Pricing
FAQ

Header Layout — Desktop

Fixed three-zone layout: logo left, navigation center (landing only), user avatar right. Transparent over hero, gains backdrop on scroll.

Logo → /{handle} or /
Left: LogoCenter: Nav (landing only)Right: Avatar + status dot
Positionfixed top-0 left-0 right-0 z-50
Visibilityhidden sm:block
Containermax-w-6xl mx-auto px-6 py-4
Layoutflex items-center justify-between

Header Layout — Mobile

Fixed header with two elements: a search icon on the left and the three-dot menu trigger centered in the viewport. When search activates, the dots smoothly glide to the right via a GPU-accelerated transform transition, making room for the expanding search field.

Idle — search icon left, dots centered

Search active — dots shift right with spring animation

Search people & posts...
Positionfixed top-0 left-0 right-0 z-50
Visibilitysm:hidden
Containerrelative flex items-center h-[66px]
Paddingpx-4 (idle) → pr-[100px] (search open)
Dots Positionabsolute left-1/2 top-1/2
Dots (idle)transform: translate(-50%, -50%)
Dots (active)transform: translate(calc(50vw - 100% - 16px), -50%)
Dots Transition350ms cubic-bezier(0.32, 0.72, 0, 1)
CallbackonOpenChange prop from UserSearch

Mobile Search — Inline Expansion

The search icon lives in the mobile header bar (not the overlay menu). Tapping it triggers a fluid expansion into a full search field with auto-focus. The three-dot menu trigger smoothly animates from center to the right edge, remaining accessible at all times.

VariantUserSearch variant="mobile-header"
Idle Sizew-[42px] h-[42px] rounded-full
Idle Stylering-1 ring-stone-300/50 dark:ring-white/10 bg-white/5
IconSearch w-4 h-4
Open Widthflex-1 (fills padded content area)
Open Stylebg-white/80 dark:bg-white/[0.06] backdrop-blur-xl
Open Ringring-1 ring-stone-300/50 dark:ring-white/12
Expansion350ms ease-[cubic-bezier(0.32,0.72,0,1)]
Inputtext-[14px], auto-focused on open
Close IconX w-4 h-4 on left
Close TriggersX button, click outside, Escape key
Resultsfixed left-4 right-4, top: 56px
Results StyleSame as desktop dropdown

Logo Placement & Function

PositionLeft-aligned, first flex child
ElementThree dots: rose-400, amber-400, emerald-400
Dot Sizew-2.5 h-2.5 (10px) with gap-1 (4px)
Link Target/{handle} if logged in, else /
Hovergroup-hover:scale-110, duration-300

Navigation Items

Center-aligned pill navigation. Only visible on landing page variant. Scroll-tracked — the active item updates as the user scrolls through sections.

OverviewHowWhyPricingFAQ
Visibilityhidden md:flex
ItemsOverview, How, Why, Pricing, FAQ
Active DetectionIntersectionObserver-style scroll check
Active Stylebg-white/15 backdrop-blur-md border-white/20
Inactive Styletext-white/70 hover:text-white
Text Shadow0 1px 8px rgba(0,0,0,0.4)
Pill Shaperounded-full px-4 py-1.5 text-sm
Transitionduration-200, all properties
Theme AdaptLight text over hero, theme-aware when scrolled

User Avatar & Status Ring

The avatar is the primary menu trigger. A status indicator dot sits at bottom-right. On hover/open, a colored ring appears matching the user's current status.

Resting
Hover
Open (Green)
Open (Amber)
Open (Red)
Avatar Sizew-9 h-9 (36px)
Container Paddingp-1.5
Status Dotw-2.5 h-2.5 absolute bottom-1 right-1
Dot Borderborder-2 border-white dark:border-slate-900
Ring on OpenboxShadow: 0 0 0 2px {statusColor}
Open BGbg-stone-100 dark:bg-slate-800 ring-2 ring-stone-300
Hover Trigger500ms delay via setTimeout
Close Delay150ms on mouse leave
ClickToggles immediately
FallbackFirst letter of name or User icon

Dropdown Menu — Structure

The dropdown is a layered panel anchored top-right below the avatar. It contains 5 zones stacked vertically, each with distinct functionality.

Available
Away
Busy
Offline

Zone 1: Status Picker (compact squircles)

Adam's Profile

View your status page

Zone 2: Profile link + edit toggle

Zone 3: Inline edit form (expands/collapses)

Home
History
Metrics
Theme

Zone 4: Quick links grid (amber dot = paid)

Sign out

Zone 5: Sign out (border-t separator)

Widthw-80 (320px)
Positionabsolute right-0 top-full mt-2
Originorigin-top-right
Backgroundbg-white/95 dark:bg-slate-900/95 backdrop-blur-xl
Borderrounded-2xl border-stone-200/50 dark:border-slate-700/50
Shadowshadow-2xl shadow-stone-900/10 dark:shadow-black/30
Enteropacity-100 scale-100 translate-y-0
Exitopacity-0 scale-95 -translate-y-2 pointer-events-none

Zone 1 — Status Picker

Component<StatusSquircles compact />
Gridgrid-cols-4 gap-2
OrderRed, Amber, Green, Offline
BehaviorTap to change status → API POST /api/status
CachesessionStorage key 'ps_status'
On SelectUpdates status + closes menu

Zone 2 — Profile Row & Edit Toggle

Tapping the profile row navigates to /{handle}. The pencil icon toggles inline editing. When editing, the pencil cross-fades into Cancel (X) and Save (check) buttons.

Adam's Profile

View your status page

Adam's Profile

View your status page

Avatar RingboxShadow: 0 0 0 3px {statusColor}
Pencil → X/CheckCross-fade: opacity + scale 200ms ease
Check Slidewidth 0→32px, opacity 0→1, translateX 8→0
Check Disabledopacity-30 when handle taken/invalid

Zone 3 — Inline Edit Form

Expands below the profile row using CSS grid animation (gridTemplateRows: 0fr → 1fr). Contains Display Name, Handle with live availability check, and read-only Email.

Expanddisplay: grid; gridTemplateRows: 0fr → 1fr
FieldsDisplay Name, Handle (@), Email (read-only)
Handle Prefix@ symbol, absolute left-3
Handle Check400ms debounce → GET /api/profile/check-handle
Availableborder-emerald-400/60, Check icon
Takenborder-red-400/60, X icon, 'Already taken' text
Invalidborder-red-400/60, X icon, 'Min 3 characters'
CheckingSpinner: border-2 border-t-transparent animate-spin
SavePATCH /api/profile → redirect to new handle if changed

Zone 4 — Quick Links Grid

4-column icon grid. Active items use full opacity, disabled/paid items are dimmed with an amber dot indicator. On landing page mobile menu, a second 4-column row adds section anchors.

Home
History
Metrics
Light
Gridgrid-cols-4 gap-1 px-4 py-3
Icon Containerw-9 h-9 rounded-[0.625rem]
Icon Sizew-4 h-4 (16px)
Active Colortext-stone-600 dark:text-white/60
Disabled Colortext-stone-400 dark:text-white/30
Paid Indicatorw-1.5 h-1.5 bg-amber-400 absolute top-1.5 right-1.5
Labeltext-[10px] font-semibold
HomeLinks to / (landing page)
HistoryPaid feature placeholder
MetricsPaid feature placeholder
ThemeToggles light/dark + closes menu

Zone 5 — Sign Out

Separatorborder-t border-stone-100 dark:border-slate-800
Layoutflex items-center gap-3 px-5 py-3
Icon BGw-9 h-9 rounded-xl bg-stone-100 dark:bg-slate-800
Hoverbg-rose-50 dark:bg-rose-950/30, text-rose-600
Icon Hoverbg-rose-100 dark:bg-rose-950/50
Actionform action={signOutAction}

Landing Page Mobile Menu Extras

On mobile, the landing page adds a second 4-column icon row below the standard quick links. These anchor to landing page sections.

How
Why
Pricing
FAQ
Conditionvariant === 'landing'
HowLightbulb → #how-it-works
WhyHeart → #benefits
PricingTag → #pricing
FAQHelpCircle → #faq

Bottom Navigation Bar — Mobile

Owner-only bottom navigation bar on profile pages (mobile). Four icon tabs: Home, History, Metrics, and Share. Positioned fixed at the bottom of the screen with a frosted glass background.

Home
History
Metrics
Share
Positionfixed bottom-0 left-0 right-0
Visibilitysm:hidden
Backgroundbg-white/80 dark:bg-slate-900/80 backdrop-blur-xl
Borderborder-t border-stone-200/50 dark:border-white/8
Layoutflex items-center justify-around py-3
HomeHome icon → scrolls to top
HistoryClock icon → Timeline tab
MetricsBarChart3 icon → metrics view
ShareShare2 icon → opens ShareModal
Active Colortext-stone-800 dark:text-white
Inactive Colortext-stone-400 dark:text-white/35
Labeltext-[10px] font-semibold
Safe Areapb-safe-area-inset-bottom

Profile Screen

Editable status text, autosave behavior, character limits, identity pill, circular status picker, and atmospheric effects.

Screen Architecture

The profile screen is a scrollable view with a fixed header. Content flows vertically: identity pill, social icons row, circular status picker (owner only), status message text, share button + social sharing bar, then tabbed content (Timeline / Links).

ZONE 1SharedHeader — traffic light dots (fixed)
ZONE 2Identity Pill — avatar + name + badge + stats + time
ZONE 3Social Icons Row — X, GitHub, TikTok, etc.
ZONE 4Status Squircles (owner only, circular)
Status Message Text (gradient, auto-scaling)
Share Button + Social Sharing Bar
ZONE 5Tab Bar — TIMELINE | LINKS
ZONE 6Tab Content — timeline entries or links list
Containermin-h-dvh, scrollable
Background#F5F3EF dark:#080B14
Z-layersatmosphere(0), header(30), content(20)
Owner ViewAdds squircle picker, edit button, bottom nav
Visitor ViewRead-only, no picker, no bottom nav

Atmosphere Effect

Full-screen radial gradients centered near the top of the page, tinting the background with the current status color. Two overlapping ellipses create a soft ambient wash.

Layer 1ellipse 80% 90% at 50% 32%
Layer 2ellipse 70% 80% at 50% 32%
Positionfixed inset-0
Transition500ms
Performancewill-change: auto

Identity Pill

Prominent pill at the top of the profile containing avatar (with status-colored ring glow), name + verified badge, handle, stats row (updates/followers/following), and a time-since indicator badge.

A

Adam Foster

@adam

128 updates0 followers0 following
2h
Shaperounded-full
Backgroundbg-white/60 dark:bg-white/6
Borderborder-stone-200/40 dark:border-white/8
Box ShadowDynamic glow from status color
Paddingpl-[11px] pr-[13px] py-2
Avatar54px, rounded-full
FallbackInitial letter, status-colored bg
Name Rowfont-semibold + VerifiedBadge (14px)
Handletext-xs text-stone-500 dark:text-white/50
Statsupdates / followers / following
Time Badge30px circle, status-colored bg
Time Badge GlowboxShadow: 0 0 12px glowColor

Editable Status Text

Large, fluid status message displayed as a gradient heading. Owner can tap to edit inline. Text auto-scales based on character count.

Font Weightfont-bold
Letter Spacingtracking-[-0.04em]
Gradientbg-linear-to-b + textGradientClass
Font Scalingclamp(1.25rem, 2.5vw, 1.75rem) → clamp(2.75rem, 7.5vw, 5rem)
Algorithmt = min(len/120, 1); lerp across min/vw/max
Empty StateShows status label (Available, Away, etc.)
Max Height30vh with overflow-y: auto

Autosave Behavior

Text changes are debounced and auto-persisted via API. Visual feedback shows saving state.

Debounce Delay1200ms
API EndpointPOST /api/status
Save Statesidle → saving → saved → idle
Saving Display"Saving..." in stone-400
Saved Display"✓ Saved" in emerald-500
Blur BehaviorImmediate save on blur
Enter KeySaves and defocuses
Error RecoveryReverts to last known state

Character Limits

Free users get 140 characters, Pro users get 280. Counter pill appears only during editing.

18/140
125/140
155/140
280 with Pro
Free Limit140 characters
Pro Limit280 characters
Normal Counterbg-white/50 border-stone-200/40 text-stone-400
Warning Statebg-amber-500/10 border-amber-500/30 text-amber-500
Over Limitbg-red-500/10 border-red-500/30 text-red-500
Overflow TextCharacters past limit shown in red-500/80
Upsell"280 with Pro" in amber-500/50
Counter VisibilityOnly during active editing

Overflow Rendering

{message.length > charLimit ? (
  <>
    <span className="status-gradient">{message.slice(0, charLimit)}</span>
    <span className="text-red-500/80">{message.slice(charLimit)}</span>
  </>
) : (
  <span className="status-gradient">{message}</span>
)}

Textarea Overlay Technique

The editable text uses a hidden textarea stacked on top of the visible gradient heading. This preserves the gradient rendering while enabling native text editing.

Visible Layerh1 with gradient text
Edit Layertextarea, absolute inset-0
Caret ColorcaretColor: sc.color
Text Filltransparent / WebkitTextFillColor: transparent
iOS FocusSynchronous focus() in click handler
Resizeresize-none

Mention Autocomplete (@mentions)

Typing @ followed by characters triggers a dark glassmorphic dropdown of matching users. Used inside the status message editor for tagging other users. Results fetched via debounced API call.

A

Alice

@alice

B

Bob

@bob

Trigger@ character + 1–30 alphanumeric chars
Debounce200ms
APIGET /api/users/search?q={query}&limit=5
Container BGrgba(15, 18, 28, 0.92)
Backdropblur(24px) saturate(1.4)
Sizemin-width 240px, max-width 300px
Border{statusColor}15 opacity
Accent Line1px gradient top bar in statusColor
Avatar28px rounded-full
Name12px font-medium, white/70→white/95 active
Handle10px, statusColor/56 active, white/25 idle
Status Dot8px, lighter status colors (red-400, amber-400, emerald-400, slate-500)
Active Row BG{statusColor}10
Keyboard Hint↵ badge on active row
Keyboard NavArrowUp/Down, Enter to select, Escape to close
Positionabsolute left-1/2 -translate-x-1/2, top: 100%
Shadow0 8px 40px rgba(0,0,0,0.5)

Platform Notes — Profile

iOS

Use UITextView with attributedText for gradient. Synchronous becomeFirstResponder(). Safe area for bottom share button.

Android

EditText with ShaderFactory for gradient. Debounce via Handler.postDelayed(1200). WindowInsets for keyboard.

Chrome Extension

Popup shows compact status dot + text. Character limit enforced in content script. Sync via background service worker.

Embed

Read-only view. No edit UI. Shows status dot (small), name, status label, and message. Respects host page theme.

Supported Platforms

Defined in src/lib/social-platforms.tsx. Each platform has a key, label, SVG icon, and URL builder. The “website” platform is excluded from the icon row and shown separately in the Links tab.

X (Twitter)

x

x.com/{handle}

GitHub

github

github.com/{user}

LinkedIn

linkedin

linkedin.com/in/{user}

Instagram

instagram

instagram.com/{user}

YouTube

youtube

youtube.com/@{channel}

TikTok

tiktok

tiktok.com/@{user}

Bluesky

bluesky

bsky.app/profile/{handle}

Threads

threads

threads.net/@{user}

Mastodon

mastodon

Custom full URL

Twitch

twitch

twitch.tv/{user}

Website

website

Auto-prefixed https://

Icon Row Layout

Centered horizontal row displayed on the profile page between the identity pill and the status text. Only visible when the user has at least one social link configured (excluding website).

X
GH
LI
IG
YT
Containerflex justify-center gap-3 py-2
Button Sizew-16 h-16 (64px)
Icon Sizew-[30px] h-[30px] (30px)
Color (idle)text-stone-400 dark:text-white/25
Color (hover)text-stone-600 dark:text-white/50
Bg (hover)bg-stone-200/40 dark:bg-white/6
Transitiontransition-all duration-150
FilterExcludes key === "website"

Edit Mode — Social Links Management

In profile edit mode, social links appear as editable fields. Each field shows the platform icon, label, and an input for the handle/URL. Empty fields show placeholder text. A grid layout arranges platforms two per row on larger screens.

Layoutgrid grid-cols-1 sm:grid-cols-2 gap-3
Field Heighth-11 (44px)
Field Borderborder-stone-200/40 dark:border-white/6
Field Bgbg-white/60 dark:bg-white/[0.04]
Icon PositionLeft of input, 16px
Placeholder@username or full URL
SaveDebounced with profile save

Timeline

Chronological status history with date groupings, gradient text, expandable entries, metadata, and inline action buttons.

Tab Bar

Two-tab bar switching between TIMELINE and LINKS views. Full-width with equal tab distribution and a status-colored underline indicator.

Timeline
Links
Containermax-w-xl mx-auto flex
Tab Paddingpy-3.5
Texttext-[13px] font-semibold uppercase tracking-wider
Active Colortext-stone-800 dark:text-white/90
Inactive Colortext-stone-400 dark:text-white/35
Hover (inactive)text-stone-500 dark:text-white/50
UnderlineGradient with status color, left/right 15% inset
Underline Fadeopacity 300ms

Date Groupings

Status entries are grouped by date. Group headers appear as centered, small-caps labels above each cluster. Relative labels for recent dates, explicit dates for older ones.

TodayYesterdayMon, Jan 15Jan 15, 2024
Texttext-[10px] font-semibold uppercase tracking-widest
Colortext-stone-300 dark:text-white/15
Alignmenttext-center
Spacingpb-3
Today/YesterdayRelative labels
This Year"Mon, Jan 15"
Older"Jan 15, 2024"

Timeline Entry

Each entry shows the status message in gradient text, a relative timestamp, and optional metadata. Entries are tappable to expand and reveal actions and state-change history.

Building the new feature ✨

2h ago

Grabbing coffee ☕

5h ago

Message Fontfont-bold tracking-[-0.03em] leading-tight
Message Sizeclamp(1rem, 2.5vw, 1.5rem)
Text Stylebg-gradient-to-b bg-clip-text text-transparent
Line Clampline-clamp-2 (collapsed)
Timestamptext-[11px] tabular-nums
Time Colortext-stone-300 dark:text-white/20
Privateopacity-0.5 + Lock icon inline
ExpandTap to toggle expanded state

Expanded Entry — Metadata & Actions

When expanded, a timeline entry reveals full metadata (date, location, platform) and an action button row. A state-change history panel may appear on the right with a vertical timeline.

Metadata Rowflex flex-wrap justify-center gap-x-3 gap-y-1
Metadata Texttext-[11px] text-stone-400 dark:text-white/25
Platform IconsSmartphone (iOS/Android), Monitor (Web), Tablet
Full Date"Mon, Jan 15, 10:30 AM"
LocationMapPin icon + name
Action Rowflex items-center justify-center gap-1.5 flex-wrap
RevealgridTemplateRows: 0fr → 1fr
ShareStatusShareBar component
Edit (Pro)Pencil icon + 'Edit'
Visibility (Pro)Eye/Lock toggle + 'Public'/'Private'
DeleteTrash2 icon + 'Delete'

Delete Confirmation

Destructive actions use an inline confirmation pill that replaces the button text. The pill contains a label, confirm (check), and cancel (X) button.

Pill Bgrgba(status-color, 0.12)
Pill Padding3px 4px 3px 10px
Animationscale 0.8 → 1.0
ConfirmCheck icon → execute action
CancelX icon → reset to idle

State Change History

Right-side panel showing status transitions for a given entry. Uses a vertical timeline with colored dots and status labels.

Panel Width0px → 120px
Transition400ms cubic-bezier(0.4, 0, 0.2, 1)
Dotw-2 h-2 rounded-full
Dot Glow0 0 6px {color}60
Labeltext-[11px] font-semibold
Timetext-[10px] tabular-nums
Scroll Masklinear-gradient(transparent → black 10% → black 85% → transparent)

Timeline Empty & Loading States

Empty IconClock w-8 h-8
Empty Text"No status updates yet"
Spinner (initial)w-5 h-5 border-2 animate-spin
Spinner (pagination)w-4 h-4 border-2 animate-spin
Update Counttext-3xl font-bold tabular-nums
Count Label"timeline" — text-[10px] uppercase tracking-[0.2em]

Links Tab

The second tab shows the user's website and custom links. Website link appears first as a prominent card, followed by any custom links. Defined in src/components/custom-links.tsx.

Website

example.com

Links

My Blog

blog.example.com

Containerspace-y-5 px-4 pt-4
Section Headerstext-[11px] font-semibold uppercase tracking-wider text-center
Header Colortext-stone-500 dark:text-white/50
Card Paddingpx-5 py-4
Card Radiusrounded-2xl
Card Bgbg-white/60 dark:bg-white/[0.04]
Card Borderborder-stone-200/40 dark:border-white/6
Website IconGlobe w-4 h-4
Titletext-sm font-semibold text-stone-800 dark:text-white/90
Domaintext-xs text-stone-400 dark:text-white/30 truncate
Hoverhover:bg-white/80 dark:hover:bg-white/[0.06] hover:scale-[1.01]
Activeactive:scale-[0.99]
Empty StateLink2 icon w-8 h-8 + 'No links yet'

Status Share Bar (Inline)

A compact, inline sharing popover used in the profile status area and timeline entry actions. Distinct from the full Share Modal — this is a small pill that expands into a horizontal row of social platform buttons.

X
FB
WA
LI
RD
TriggerShare pill button with status-tinted bg
Trigger (compact)px-2.5 py-1.5, text-[10px]
Trigger (default)px-3.5 py-2, text-[11px]
Trigger Bg{color}08 idle → {color}15 open
Popover (mobile)fixed left-1/2 translateX(-50%)
Popover (desktop)absolute top-full mt-2
Popover Bgbg-white/95 dark:bg-slate-900/95 backdrop-blur-xl
Popover Borderborder-stone-200/50 dark:border-white/8 rounded-2xl
Entry (mobile)opacity 0→1
Entry (desktop)translateY(-6px) scale(0.92) → 0, 1
Platform Buttonsw-10 h-10 rounded-xl
Button Bgbg-stone-100/80 dark:bg-white/6
Button Hoverbg-stone-200 dark:bg-white/12, scale(1.1)
Icon Sizew-[18px] h-[18px]
Stagger Delay60ms base + 35ms per button
Copy LinkCheckmark + emerald bg on success
Morenavigator.share() native sheet
Dividerw-px h-6 bg-stone-200/60 dark:bg-white/8

Hashtag Feed Page

Discovery page for status updates tagged with a specific hashtag. Infinite scroll, staggered entrance animation, atmospheric emerald background.

Page Layout

Full-page feed at /hashtag/[tag]. SharedHeader at top, back link, centered hashtag heading with icon, then a vertical feed of status items with infinite scroll.

Route/hashtag/[tag]
Backgroundbg-[#FAFAF8] dark:bg-[#080B14]
Atmosphereradial-gradient emerald 6% opacity at top center
Max Widthmax-w-2xl mx-auto px-5
HeaderSharedHeader
Back LinkArrowLeft + 'Back' → /

Hashtag Header

Centered icon badge + large heading with the tag name, plus a subtitle line.

#example

Recent status updates

Icon Containerw-14 h-14 rounded-2xl
IconHash, w-7 h-7, text-emerald-500/70
Headingtext-3xl sm:text-4xl font-bold tracking-tight
Subtitletext-sm text-stone-400 dark:text-white/30

Feed Item Anatomy

Each feed item contains a user row (avatar with status ring, name with verified badge, handle, time-ago) and the gradient status message text.

Containerrounded-2xl px-5 py-5
Avatar36px rounded-full
Status Dotw-2.5 h-2.5 rounded-full
Nametext-sm font-semibold text-stone-800 dark:text-white/85
Verified BadgeVerifiedBadge size='xs'
Handletext-xs text-stone-400 dark:text-white/25
Timetext-[11px] tabular-nums text-stone-300 dark:text-white/20
Message Fontclamp(0.95rem, 2vw, 1.3rem)
Message Stylefont-bold tracking-[-0.02em] leading-snug
Separator1px line, stone-200/30 dark:white/3%

Infinite Scroll & Animation

Items load in pages of 20. IntersectionObserver triggers next page fetch. First batch enters with staggered slide-up animation.

Page Size20 items
APIGET /api/hashtag/[tag]?limit=20&cursor=...
Scroll TriggerIntersectionObserver, rootMargin: 200px
Entry AnimationfeedItemIn — translateY(8px)→0, opacity 0→1
Staggeridx * 40ms delay
Loading Spinnerw-4 h-4 rounded-full border-2 animate-spin
End Message"That's everything for #{tag}"
Empty StateHash icon (w-10) + descriptive text

Share Modal

Preview card, QR code, social sharing, clipboard copy, embed codes, and orchestrated entry animation.

Modal Structure

Full-screen overlay with a centered card. Opened via the Share button on the profile page. Lazy-loaded with next/dynamic — only mounted when opened.

“Share Status” Header + Subtitle
Social Preview Card — avatar, name, status badge, message, branding
QR Code
X
FB
WA
LI
RD
Copy Link
Embed
...
Embed Panel (expandable, grid-template-rows animation)
Containermax-w-md, rounded-3xl
Backgroundgradient from-white to-stone-50 dark:from-slate-900 to-slate-950
Borderborder-stone-200/50 dark:border-slate-700/50
Shadow25px blur + status color glow
Inner GlowTop 128px, white/80 → transparent
Max Height85vh with overflow-y: auto
CloseEscape key, backdrop click, X button
Body Lockdocument.body.style.overflow = hidden
Lazy Loadingnext/dynamic, SSR false

Orchestrated Entry Animation

The modal uses a 4-stage animation sequence orchestrated via animationStage state.

Stage 0 → 1Backdrop fades in
Stage 1 → 2Modal scales in
Stage 2 → 3Content reveals
Stage 3 → 4Complete
Backdrop Easingcubic-bezier(0.4, 0, 0.2, 1)
Modal Easingcubic-bezier(0.34, 1.56, 0.64, 1)
Social Iconsscale(0)→scale(1)
ExitReverse to stage 0, unmount after 350ms

Animation Stages

// Open sequence
requestAnimationFrame → setAnimationStage(1)  // Backdrop
setTimeout(180ms)    → setAnimationStage(2)  // Modal
setTimeout(380ms)    → setAnimationStage(3)  // Content
setTimeout(750ms)    → setAnimationStage(4)  // Complete

// Close sequence
setAnimationStage(0)       // Reverse all
setTimeout(350ms) → unmount

Social Preview Card

Shows how the profile will look when shared. Includes avatar with status dot, name, status badge, optional message, and branding footer.

A

Adam

Available

@adam

“Building something great”

pocketstatus.com/adam
Avatar48px, rounded-xl
Status Dot16px, border-2 white
Dot Glowbox-shadow: 0 0 10px color80
BadgeStatus label, rounded-full, white text on status bg
MessageQuoted, text-sm, line-clamp-2
BrandingThree-dot mark + URL
Preview LabelFloating top-left, stone-100/90 bg
Hoverhover:scale-[1.02], 300ms

QR Code

Centered QR code generated from the profile URL. White container with prominent shadow.

Size144px (w-36 h-36)
Generation240px from API
APIapi.qrserver.com
Containerp-3 rounded-2xl bg-white
Shadow (light)0 10px 40px -10px rgba(0,0,0,0.15)
Shadow (dark)0 10px 40px -10px rgba(0,0,0,0.4)
LoadingSpinner (border-2, animate-spin)
Datawindow.location.href (profile URL)

Social Sharing Buttons

Five platform icons in a grid. Each opens a popup window for sharing.

X
FB
WA
LI
RD
Layoutgrid-cols-5 gap-3
Button Sizew-12 h-12 (48px)
PlatformsX, Facebook, WhatsApp, LinkedIn, Reddit
Share URLPlatform-specific intent URL
Share Text"[Name] is [Status]"
Hoverscale(1.1) translateY(-2px)
Entryscale(0)→scale(1)
ColorsNeutral bg, colored on hover (platform color)

Action Row — Copy Link, Embed, More

Three-button row at the bottom of the social section.

Copy Link
Embed
Copy Linkflex-1, copies profile URL
Success Statebg-emerald-500 text-white, ✓ Copied!
Error Statebg-rose-500 text-white, ⚠ Failed
Embedflex-1, toggles embed panel
Morew-11, navigator.share()
Heighth-11 (44px)
All Buttonsrounded-xl, font-medium text-xs

Embed Panel

Expandable panel below the action row. Uses CSS grid gridTemplateRows: 0fr → 1fr for smooth expand/collapse.

Preview

A
AdamAvailable
Badge
Iframe
URL

HTML Badge

Copy
<img src="https://pocketstatus.com/api/badge/{handle}" alt="{handle}'s status" />
Expand Animgrid-template-rows: 0fr → 1fr
Overflowoverflow: hidden on inner div
Badge Tab<img> tag pointing to /api/badge/{handle}
Iframe Tab<iframe> 300×100, /embed/{handle}
URL TabDirect badge image URL
PreviewStatus dot + avatar + name + label
Tab BarSegmented control, rounded-xl
Code BlockPre with mono font, break-all wrap
Copy Feedback✓ Copied in emerald-500

Platform Notes — Share Modal

iOS

Use UIActivityViewController for native share sheet. QR via CoreImage CIFilter. Social intents via URL schemes (x-twitter://, fb://).

Android

Intent.ACTION_SEND for native share. ZXing for QR generation. Package-specific intents for social apps.

Chrome Extension

Simplified share: Copy Link + native navigator.share(). No QR needed. Embed codes accessible from popup options.

Embed Widget

No share modal needed for embeds. The embed itself IS the shared artifact. Self-contained HTML badge or iframe.

Final CTA Upsell

Bottom-of-page conversion section with ambient glow, traffic light motif, and contextual button copy.

Layout & Visual Hierarchy

Centered single-column section positioned after the FAQ. Combines the traffic light motif, a short emotional headline, reassurance copy, and one prominent CTA button.

Ready to simplify?

Replace “are you busy?” with quiet clarity.

Get Pocket Status — it's free

No credit card required. Set up in under a minute.

Section Paddingpy-14 sm:py-24 px-5 sm:px-6
Containermax-w-3xl mx-auto text-center
PositionAfter FAQ, before Footer

Ambient Background Glow

A blurred gradient blob sits behind the text, using all three brand colors. Positioned at absolute center, pushed behind content with -z-10.

ElementAbsolute div, centered
Sizew-96 h-40
Blurblur-3xl
Light Gradientemerald-200/40 → amber-200/30 → rose-200/30
Dark Gradientemerald-500/20 → amber-500/10 → rose-500/15
Z-index-z-10

Ambient Glow

<div className="absolute left-1/2 top-1/2
  -translate-x-1/2 -translate-y-1/2
  w-96 h-40 rounded-full blur-3xl -z-10
  bg-gradient-to-r
    from-emerald-200/40 dark:from-emerald-500/20
    via-amber-200/30  dark:via-amber-500/10
    to-rose-200/30    dark:to-rose-500/15" />

Three-Dot Motif

The traffic light dots appear at 12px (w-3 h-3) above the headline — larger than the footer micro dots, reinforcing brand identity at the conversion moment.

Dot Sizew-3 h-3 (12px)
Gapgap-2 (8px)
OrderGreen, Amber, Rose
Marginmb-6 below dots

Headline & Copy

Headline"Ready to simplify?"
Headline Styletext-3xl sm:text-4xl font-semibold tracking-tight
Headline Colorstone-800 dark:white
Subhead"Replace 'are you busy?' with quiet clarity."
Subhead Styletext-lg, max-w-md mx-auto
Reassurance"No credit card required. Set up in under a minute."
Reassurance Styletext-sm, stone-400 dark:slate-500

CTA Button — Contextual

The button copy and destination change based on authentication state — personalized for returning users vs. new visitors.

Get Pocket Status — it's free
Unauthenticated → /signin
Go to Profile
Authenticated → /{handle}
Unauthed Copy"Get Pocket Status — it's free"
Authed Copy"Go to Profile"
Shaperounded-full
Paddingpx-8 sm:px-10 py-3.5 sm:py-4
Fonttext-base sm:text-lg font-medium
Light BGgradient from-stone-700 to-stone-800
Dark BGgradient from-emerald-500 to-emerald-600
Shadowshadow-lg shadow-stone-900/25 dark:shadow-emerald-900/30
Hovershadow grows, group-hover:scale-[1.02]
Top Edge1px inset gradient white/30

Top Edge Highlight

<span className="absolute inset-x-0 top-0 h-[1px]
  bg-gradient-to-r from-transparent via-white/30 to-transparent" />

Footer Variants

The footer ships as a single SharedFooter component with a variant prop. The landing page uses the full variant; all other pages use the micro variant.

Landing Variant

Full footer with brand column, CTA card, 4-column link grid, social icons, copyright bar, and ambient glow. Used on the homepage.

Micro Variant

Minimal one-line footer with three-dot logo, legal links (Privacy, Terms, GDPR), and copyright. Used on profile, checkout, legal pages.

ComponentSharedFooter
Propvariant: "landing" | "micro"
Landing Usage<SharedFooter variant="landing" />
Micro Usage<SharedFooter />

Landing Footer — Design

Multi-section footer with atmospheric effects, brand storytelling, and conversion opportunity.

ZONE 1Brand + Tagline + Trust Badges
ZONE 2CTA Card — “Built for calm coordination”
Product
Legal
Account
Connect
© 2026Made with ♥ Operational
Background#F5F3EF dark:slate-950
Overflowoverflow-hidden
Top Border1px gradient, transparent→stone-300→transparent
Ambient Glow600×300px emerald blur-[120px]
Content Maxmax-w-6xl mx-auto px-6
Paddingpt-16 pb-8

Landing Footer — Zone 1: Brand Column

Left column of the top grid. Contains the large logo, tagline paragraph, and three trust badges.

Logo Dotsw-4 h-4 (16px)
Dot Shadowsshadow-lg shadow-{color}/30
Brand Nametext-2xl font-semibold tracking-tight
Taglinetext-lg leading-relaxed max-w-md
Tagline Colorstone-500 dark:slate-400
Trust Badges3 inline: Privacy-first, Instant sync, Works everywhere
Badge IconsShield(emerald), Zap(amber), Globe(sky)
Badge Texttext-sm stone-400 dark:slate-500

Landing Footer — Zone 2: CTA Card

Right column of the top grid. A frosted card with headline, body copy, and a “Get started free” button — a second conversion opportunity for users who scrolled past the hero and pricing.

Built for calm coordination

Replace the endless “are you busy?” texts with quiet clarity.

Get started free
Shaperounded-2xl p-8
Light BGgradient from-white to-stone-50
Dark BGgradient from-slate-900 to-slate-800
Borderstone-200/50 dark:slate-700/50
Shadowshadow-xl shadow-stone-200/20 dark:shadow-none
Headlinetext-xl font-semibold
Bodyleading-relaxed
Buttonrounded-full, gradient stone/emerald
Button Hovershadow-lg, -translate-y-0.5
Arrow→ entity, text-lg

Landing Footer — Zone 3: Link Grid

Four-column navigation grid below the brand row. Organized by category with consistent styling.

ColumnLinksDestinations
ProductHow it works, Benefits, Demo, FAQ/#how-it-works, /#benefits, /demo, /#faq
LegalPrivacy Policy, Terms of Service, GDPR Compliance/privacy, /terms, /gdpr
AccountSign in, My Profile/signin, /signin
ConnectTwitter, GitHub, EmailExternal links + mailto
Gridgrid-cols-2 md:grid-cols-4 gap-8
Section Spacingmb-16
Category Titletext-sm font-semibold uppercase tracking-wider
Title Spacingmb-4
Link Styletext-sm, transition-colors
Link Hoverstone-800 dark:white
Link Spacingspace-y-3 within each column
Product LinksAnchor to landing sections
Legal LinksFull page routes

Landing Footer — Zone 4: Social Icons

Three social/contact icons in the Connect column. Rounded square buttons with hover state.

Button Sizew-10 h-10 (40px)
Icon Sizew-4 h-4 (16px)
Light BGbg-stone-100 hover:bg-stone-200
Dark BGbg-slate-800 hover:bg-slate-700
Colorstone-500 → stone-800 hover
Gapgap-3 (12px)
TwitterExternal, target=_blank, rel=noopener
GitHubExternal, target=_blank, rel=noopener
Emailmailto:hello@pocketstatus.com

Landing Footer — Zone 5: Bottom Bar

Three-column bar at the very bottom. Copyright, brand sentiment, and system status indicator.

© 2026 Pocket Status. All rights reserved.

Made with for people who value presence

All systems operational
Separatorpt-8 border-t stone-200/50 dark:slate-800/50
Layoutflex-col md:flex-row, justify-between
Copyrighttext-sm stone-400 dark:slate-500
Sentiment"Made with ❤️ for people who value presence"
Heart IconHeart filled, rose-400
Heart Hoverhover:scale-125, 200ms
Status Dotw-2 h-2 emerald-400 animate-pulse
Status Text"All systems operational" text-xs

Micro Footer — Design

Minimal single-row footer for non-landing pages. Maximum information density with minimum visual weight.

Pocket Status
Privacy·Terms·GDPR

© 2026 Pocket Status

Paddingpy-6 px-6
Borderborder-t stone-200/50 dark:slate-800/50
Background#F5F3EF/50 dark:slate-950/50
Layoutflex-col sm:flex-row, justify-between
Logo Dotsw-1.5 h-1.5 (6px)
Brand Nametext-xs font-medium stone-400
LinksPrivacy · Terms · GDPR
Dot Separator· character, opacity-30
Link Hoverstone-600 dark:slate-300
Copyrighttext-xs stone-400 dark:slate-600

Footer — Design Language Principles

The footer design reflects key PocketStatus principles and should be replicated across all platforms.

Progressive Disclosure

Micro footer shows the minimum. Landing footer progressively reveals brand depth — story, links, social, status. Never overwhelms.

Dual-Theme Commitment

Every element has explicit light AND dark styles. No single-theme fallbacks. The dark footer is moody and atmospheric with emerald ambient glow; the light footer is warm and paper-like.

Brand Reinforcement

Three-dot motif appears in both variants at appropriate scale (6px micro, 16px landing). The trust badges (Privacy-first, Instant sync, Works everywhere) echo the value proposition without hard-selling.

Conversion Without Pressure

The CTA card uses calm language ('Built for calm coordination') and a single green button. No urgency language, no countdown timers, no popups. The footer earns trust, not clicks.

Ambient Atmosphere

The emerald glow blob at the top of the landing footer creates an environmental feel — the footer is part of the page's atmosphere, not a bolted-on afterthought.

Easter Eggs & Delight

The heart icon links to the style guide — a subtle reward for curious users. The 'All systems operational' dot pulses, suggesting a live system. These details communicate craft.

Platform Notes — Footer

iOS

Use micro variant in TabBar apps. Landing footer maps to a scrollable 'About' screen. Trust badges can appear in Settings > About. Social icons use UIApplication.shared.open().

Android

Micro footer in BottomNavigationView pages. Landing footer in a dedicated AboutFragment. Material Design 3 surface tones for card backgrounds. Social intents via Intent.ACTION_VIEW.

Chrome Extension

No footer in popup (too small). Include legal links in extension Options page. Brand three-dot motif in extension icon (16×16, 48×48, 128×128).

Web Embed

No footer in embeds — the badge/iframe is self-contained. Optionally include a tiny 'Powered by Pocket Status' link (10px, subtle) beneath iframe embeds only.

Layout & Spacing

Container widths, grid systems, breakpoints, and spacing scale.

Breakpoints

sm640px
md768px
lg1024px

Container

Max Widthmax-w-6xl (72rem / 1152px)
Padding Xpx-5 sm:px-6 lg:px-8
Alignmentmx-auto

Grid Systems

Pricinggrid-cols-1 sm:grid-cols-2 lg:grid-cols-4
Featuresgrid-cols-1 sm:grid-cols-2 md:grid-cols-3
Quick Linksgrid-cols-4
Status Pickergrid-cols-4
How It Worksgrid-cols-1 sm:grid-cols-3

Spacing Scale

1
1.5
2
2.5
3
4
5
6
8
10
12
16
20
24

1 unit = 4px. Tailwind default scale.

Border Radius

md (6px)Inputs, small
lg (8px)Tags, code
xl (12px)Buttons, panels
2xl (16px)Cards, modals
20pxPricing cards
3xl (24px)Mobile menu items
full (9999px)Pills, avatars, dots

Motion & Animation

Transition durations, easing curves, and keyframe animations.

Transition Durations

150ms
200ms
250ms
300ms
500ms
700ms
2000ms

Easing Curves

Defaultease
Smoothease-in-out
Enterease-out
Bouncycubic-bezier(0.34, 1.56, 0.64, 1)

Keyframe Animations

orbit-spin

Rotate 0 → 360°

Used in: Status editor hint

share-bounce-in

Scale 0 → 1.2 → 1

Used in: Share modal entry

share-shake

Horizontal ±3px

Used in: Confirmation feedback

particle-float

Translate Y -80px, fade

Used in: Checkout success

Interactive Patterns

Hover Scale Uphover:scale-110 or hover:scale-[1.03]
Hover Lifthover:-translate-y-0.5 or -1
Active Pressactive:scale-[0.98] or active:scale-95
Cross-DissolveStacked absolute + opacity toggle

Mobile Patterns

Touch targets, mobile menu, responsive behavior.

Mobile vs Desktop Header

Mobile (sm:hidden)

  • Three-dot brand mark centered
  • Tap opens fullscreen overlay menu
  • Status squircles at top of menu
  • 4-column icon grid for quick links
  • Profile edit inline in menu
  • Backdrop: blur-2xl, 90% opacity
  • 250ms slide + fade animation

Desktop (hidden sm:block)

  • Three-dot logo left, nav center, avatar right
  • Hover-triggered dropdown (500ms delay)
  • Dropdown: 320px wide, top-right anchored
  • Status squircles in dropdown
  • Profile edit inline in dropdown
  • Nav links: pill-style with scroll tracking
  • 200ms ease-out animation

Touch Targets

Minimum44px (w-11 h-11)
Mobile Squircleaspect-square, full grid cell
Mobile Quick Linkw-11 h-11 icon + label below
Mobile Menu Itempy-4 full width
Header Dotspx-4 py-2.5 with ring

Responsive Scaling

Text Scaletext-3xl → sm:text-4xl → lg:text-5xl
Padding Scalepx-5 → sm:px-6 → lg:px-8
Gap Scalegap-4 → sm:gap-5
Status PickerCircular squircles grid
Avatarw-9 (header) → w-12 (menu) → w-48 (profile)
Grid Cols1 → sm:2 → lg:4

Theming

Light/dark mode tokens, glass morphism, and backdrop patterns.

Theme Switching

StoragelocalStorage key 'theme'
CSS Class.dark on <html>
Flash PreventionInline <script> in layout.tsx
Fallbackprefers-color-scheme media query

Surface Treatment — Glass Morphism

Cards and panels use semi-transparent backgrounds with backdrop blur for depth.

Standard Glass Card

bg-white/70 dark:bg-slate-900/70
backdrop-blur-xl
border border-stone-200/50 dark:border-white/6

Header Glass

bg-[#F5F3EF]/80 dark:bg-slate-950/80
backdrop-blur-xl
border-b border-stone-200/50 dark:border-white/6

Dark Mode Color Map

Page BGbg-[#F5F3EF]bg-slate-950 (#020617)
Card BGbg-white/70bg-slate-900/70
Headingtext-stone-800text-white
Bodytext-stone-500text-white/50
Mutedtext-stone-400text-white/30
Borderborder-stone-200/50border-white/6
Input BGbg-stone-100/80bg-white/6
Shadowshadow-black/3shadow-black/20

Assets & Icons

Logo files, icon library, and external dependencies.

Icon Library

LibraryLucide React
Default Sizew-4 h-4 (16px)
Medium Sizew-5 h-5 (20px)
Stroke Width2 (default) or 2.5 (emphasis)
Home
User
Pencil
Check
X
LogOut
Sun
Moon
Clock
BarChart3
Copy
ChevronDown
Mail
Github
Twitter
Shield
Zap
Globe

File Assets

Full Logo/pockedtstatus-logo-full.png
Small Logo/pocketstatus-logo-nobg-small.png
Favicon/favicon.ico

Dependencies

FrameworkNext.js 16 (App Router)
ReactReact 19
StylingTailwind CSS v4 (PostCSS plugin)
Fontsnext/font/google (Geist, Geist Mono)
Iconslucide-react
AuthNextAuth v5 beta (Google OAuth)
ORMDrizzle + Neon Postgres
PaymentsStripe (stripe, @stripe/stripe-js)
Imagesnext/image (optimized)
Pocket Status Design System

Reference for web, iOS, Android, and Chrome extension development. Keep this document updated as the design evolves.