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 Mark
/pockedtstatus-logo-full.png
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.
Token
GREEN
AMBER
RED
OFFLINE
color
#10b981
#f59e0b
#ef4444
#94a3b8
colorMuted
rgba(16, 185, 129, 0.08)
rgba(245, 158, 11, 0.08)
rgba(239, 68, 68, 0.08)
rgba(148, 163, 184, 0.08)
glowColor
rgba(16, 185, 129, 0.35)
rgba(245, 158, 11, 0.35)
rgba(239, 68, 68, 0.35)
rgba(148, 163, 184, 0.2)
glowStrong
rgba(16, 185, 129, 0.6)
rgba(245, 158, 11, 0.6)
rgba(239, 68, 68, 0.6)
rgba(148, 163, 184, 0.35)
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.04emDisplay text
Pocket Statustight (-0.02em)Headings
Pocket Statusnormal (0)Body copy
Pocket Statuswide (0.025em)Squircle labels
Pocket Statuswider (0.05em)Uppercase labels
Pocket Status0.12emBadges & pills
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.
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.
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
CallbackonOpenChange prop from UserSearchDrives dot position state
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"Dedicated mobile mode
Text Shadow0 1px 8px rgba(0,0,0,0.4)Readability halo
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)next/image rounded-full
Container Paddingp-1.5Clickable area larger than visual
Status Dotw-2.5 h-2.5 absolute bottom-1 right-110px with 2px border
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}3px colored ring
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.
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.
Hoverbg-rose-50 dark:bg-rose-950/30, text-rose-600Red tint on hover
Icon Hoverbg-rose-100 dark:bg-rose-950/50Icon BG goes red too
Actionform action={signOutAction}Server action
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'Landing page only
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-0Owner-only, mobile
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, scrollableVertical flow with tab content
Visitor ViewRead-only, no picker, no bottom navShare bar visible
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%glowColor, opacity 0.55
Layer 2ellipse 70% 80% at 50% 32%colorMuted, opacity 0.6
Positionfixed inset-0Behind all content
Transition500msSmooth color cross-fade
Performancewill-change: autoNo forced compositing
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-fullPill
Backgroundbg-white/60 dark:bg-white/6Frosted
Borderborder-stone-200/40 dark:border-white/8
Box ShadowDynamic glow from status color0 0 20px, 0 0 50px layers
Paddingpl-[11px] pr-[13px] py-2Asymmetric for visual balance
Avatar54px, rounded-fullStatus-colored ring glow (3px + 20px blur)
FallbackInitial letter, status-colored bgWhen no image
Name Rowfont-semibold + VerifiedBadge (14px)flex items-center gap-1
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 textDecorative display
Text Filltransparent / WebkitTextFillColor: transparentHidden text
iOS FocusSynchronous focus() in click handlerRequired for Safari keyboard
Resizeresize-noneDisabled
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 charsRegex: /(?:^|[^a-zA-Z0-9_])@([a-zA-Z0-9_]{1,30})$/
Debounce200msAfter last keystroke
APIGET /api/users/search?q={query}&limit=5AbortController for in-flight
Container BGrgba(15, 18, 28, 0.92)Dark glass, always dark mode
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.
Social Links
Horizontal icon row for social platforms, displayed below the identity pill. Supports 11 platforms with consistent circular buttons.
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).
FilterExcludes key === "website"Website shown in Links tab
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.
UnderlineGradient with status color, left/right 15% inseth-px
Underline Fadeopacity 300msSmooth tab switch
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.
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.
Text Stylebg-gradient-to-b bg-clip-text text-transparentStatus-colored gradient
Line Clampline-clamp-2 (collapsed)Full height on expand
Timestamptext-[11px] tabular-numsRelative time
Time Colortext-stone-300 dark:text-white/20
Privateopacity-0.5 + Lock icon inlineLock w-3 h-3
ExpandTap to toggle expanded stateReveals actions + metadata
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.
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.
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 bgCompact or default size
Stagger Delay60ms base + 35ms per buttonSequential reveal
Copy LinkCheckmark + emerald bg on success1500ms feedback
Morenavigator.share() native sheet
Dividerw-px h-6 bg-stone-200/60 dark:bg-white/8Between platforms and utils
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]Dynamic segment
Backgroundbg-[#FAFAF8] dark:bg-[#080B14]Slightly warmer than profile
Atmosphereradial-gradient emerald 6% opacity at top centerMuted discovery glow
Max Widthmax-w-2xl mx-auto px-5Narrower reading column
HeaderSharedHeaderStandard site header
Back LinkArrowLeft + 'Back' → /text-xs font-medium, stone-400
Hashtag Header
Centered icon badge + large heading with the tag name, plus a subtitle line.
PreviewStatus dot + avatar + name + labelAlways visible when open
Tab BarSegmented control, rounded-xlActive: white bg + shadow
Code BlockPre with mono font, break-all wrapCopy button top-right
Copy Feedback✓ Copied in emerald-5002s then reset
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.
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)Medium variant
Gapgap-2 (8px)
OrderGreen, Amber, RoseLeft to right
Marginmb-6 below dotsSpace before headline
Headline & Copy
Headline"Ready to simplify?"Emotional, question format
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.
ComponentSharedFootershared-footer.tsx
Propvariant: "landing" | "micro"Default: "micro"
Landing Usage<SharedFooter variant="landing" />Homepage only
Micro Usage<SharedFooter />All other pages
Landing Footer — Design
Multi-section footer with atmospheric effects, brand storytelling, and conversion opportunity.
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.
Link Hoverstone-600 dark:slate-300Brightens on hover
Copyrighttext-xs stone-400 dark:slate-600Dimmer on dark
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.
Social Links
Horizontal icon row for social platforms, displayed below the identity pill. Supports 11 platforms with consistent circular buttons.