Overview
| Product Identity | |
|---|---|
| Name | Retrowave (formerly Poolside.FM) |
| Tagline | Ultra-summer internet radio |
| Creator | Marty Bell / Ultraleisure Ltd |
| URL | |
| Platform | Vue 3 + Tailwind CSS (single-page app) |
| OS Branding | Retrowave OS Version 3.0 — Copyright 1986-2026 |
| Concept | Classic Mac OS 7/8 desktop simulator with draggable, resizable windows |
| Type | Single site — no separate app/portal distinction |
Retrowave recreates the look and feel of a mid-1990s Macintosh desktop environment, complete with nostalgia-art icons, bitmap fonts, draggable windows, a dock, and a menu bar. The warm pastel brushwork evokes poolside summer afternoons. Every interface detail — beveled buttons, 1px black borders, retro date formatting — serves the nostalgic fiction.
Colors
Core Theme Variables
Button Shadow & Focus States
Secondary & Utility
Hard Brushwork
Typography
Retrowave uses a collection of custom bitmap/nostalgia fonts that emulate the Classic Macintosh typographic environment. None are standard web fonts; all are loaded as custom @font-face assets. The stand-in below uses system monospace to approximate the nostalgia aesthetic.
Text Shadow (Embossed Menu Bar Effect)
Applied to menu bar items. Creates a subtle raised/letterpress appearance on the cream background.
Sizing Scale
| Context | Size | Font | Notes |
|---|---|---|---|
| Menu bar items | 11-12px | Pixolde | text-shadow embossed |
| Dock labels | 9-10px | ChiKareGo2 | Below dock icons |
| Window titles | 12-13px | Ishmeria | Uppercase, right-aligned |
| Track title | 13-14px | ChiKareGo2 | Bold, tight tracking |
| Artist name | 11-12px | Everyday | Secondary text style |
| Body text | 12-14px | Px TNR | Newsroom, About content |
| Channel names | 10-11px | ChiKareGo2 | In channel list |
| Timer display | 12px | ChiKareGo2 | Mono-spaced numerals |
Spacing & Layout
| Token | Value | Usage |
|---|---|---|
| Window padding | 6px (p-1.5) | Internal padding of every window component |
| Title bar padding | 6px | Padding around title bar controls and text |
| Content scroll area | 0px inner padding | Scroll containers flush with window edge |
| Dock icon gap | 0px (items handle own padding) | Dock items have 8px paystreamtal padding each |
| Menu bar height | 32px (h-8) | Fixed height, absolute top positioning |
| Control buttons | 18 x 18px | Close, toggle, expand buttons in title bar |
| Dock icons | 32 x 32px | Nostalgia art icons in the dock |
| Palm tree icon | 32 x 32px (aspect-square) | Menu bar left corner, black background |
Window Dimensions (Default Sizes)
| Window | Min Width | Min Height |
|---|---|---|
| FM Player | 607px | 640px |
| Newsroom Item | 900px | 700px |
| Create Account / Vacation | 663px | 416-428px |
| Profile / Settings | 495-663px | 358-404px |
| Newsroom | 524px | 466px |
| Mixtapes | 401px | 462px |
| Guestbook / Instagram | 349px | 500-520px |
| Event Calendar | 328px | 553px |
| Submit Track | 305px | 86px |
| About / Mkindreds | 299-302px | 530-570px |
Shadow System
0px 50px 80px -50px
rgba(0,0,0,0.3)
2px 2px 0 0
rgba(0,0,0,0.2)
5px 5px 0 0
rgba(0,0,0,0.15)
Classic Mac inset
beveled edges
inset 0 1px 2px
rgba(0,0,0,0.1)
Subtle 1px inset
top highlight
Shadow Breakdown
| Name | CSS Value | Usage |
|---|---|---|
| shadow-is-component | 0px 50px 80px -50px rgba(0,0,0,0.3) | All draggable windows — deep, subtle, large blur |
| CD/mixtape cover | 2px 2px 0 0 rgba(0,0,0,0.2) | Album art, mixtape thumbnails |
| Legacy retro offset | 5px 5px 0 0 rgba(0,0,0,0.15) | Decorative retro drop-shadow on certain elements |
| Primary button | inset -1px -1px 0 0 [shadow], inset 1px 1px 0 0 #fff, 1px 1px 0 0 #000 | 3D beveled Classic Mac button look |
| Active/pressed button | inset 1px 1px 0 0 [shadow], inset -1px -1px 0 0 #fff | Inverted shadow = pressed state |
| Input inset | inset 0 1px 2px rgba(0,0,0,0.1) | Text fields — subtle recessed appearance |
Border Radii
Cursor
Retrowave replaces the default cursor with a custom nostalgia-art pointer SVG. Hotspot at (4, 0).
cursor: url("data:image/svg+xml,...") 4 0, auto;
The cursor is a classic Mac-style arrow rendered as an inline SVG data URI. Black fill, white stroke, 1px outline. Applied globally to the body element.
Window Component
Every "app" in Retrowave is a draggable, resizable window using the vue-drag-resize library.
All windows share identical structural CSS with per-window min-width/min-height constraints.
Window Anatomy
| Element | CSS |
|---|---|
| Outer container | border: 1px solid #000; border-radius: 6px; background: var(--secondary); padding: 6px; box-shadow: 0px 50px 80px -50px rgba(0,0,0,0.3); |
| Title bar | display: flex; padding: 6px; margin: -6px -6px 0 -6px; (drag-header class) |
| Close button | 18x18px, rounded-[2px], nostalgia-art X icon (7x7 base64 PNG), active:invert active:bg-white |
| Toggle button | 18x18px, TV icon (11x11 base64 PNG), hidden when not wide, active state inverts |
| Expand button | 18x18px, expand arrow icon (8x8 base64 PNG) |
| Window title | Ishmeria font, uppercase, letter-spacing: 2px, right-aligned (position: absolute; right: 12px) |
| Content area | Scrollable via OverlayScrollbars, border: 1px solid #000 border-b-2, rounded-[4px], bg-white |
Dock Bar
Dock Specifications
| Property | Value |
|---|---|
| Position | Absolute bottom of viewport |
| Background | var(--primary) — cream |
| Border | 1px solid #000, border-radius: 3-4px |
| Icon size | 32 x 32px nostalgia-art (base64 encoded PNGs) |
| Label font | ChiKareGo2 (Chicago homage), 9-10px |
| Layout | Paystreamtal flex, center aligned, each item is a button with title tooltip |
| Interaction | Click opens/focuses corresponding window. Active app may show indicator. |
Dock Apps (9 items)
| # | Label | Opens Window |
|---|---|---|
| 1 | Player | FM Player (main radio interface) |
| 2 | Newsroom | Newsroom (news feed list) |
| 3 | Mixtapes | Mixtapes (curated playlists) |
| 4 | Mkindreds | Mkindred Perks / Create Account |
| 5 | Events | Event Calendar |
| 6 | Instagram feed embed | |
| 7 | Vacation | Vacation, Inc info |
| 8 | Guestbook | Guestbook (user messages) |
| 9 | Settings | Settings (theme, wallpaper) |
Input Fields
Input Specifications
| Property | Value |
|---|---|
| Background | White with textured dot-pattern (CSS repeating-linear-gradient, 2px interval, rgba(0,0,0,0.03)) |
| Border | 1px solid #000 |
| Border radius | 2px |
| Box shadow | inset 0 1px 2px rgba(0,0,0,0.1) — subtle recessed appearance |
| Focus state | 2px outline in var(--button-focus), stronger inset shadow |
| Font | Inherited nostalgia font, 11px |
| Padding | 6px 8px |
Input Background Pattern CSS
Apps / Windows
Retrowave features 14 distinct window types, each a Vue component with shared window chrome styling but unique internal content.
607 x 640 — Main radio
305 x 86 — Track submission
663 x 428 — Signup/login
663 x 416 — Vacation, Inc
299 x 530 — About page
302 x 570 — !bg-[#F9F0E9]
328 x 553 — !bg-[#FAF4C6]
663 x 404 — Account settings
495 x 358 — Theme/wallpaper
349 x 520 — User messages
524 x 466 — News feed list
900 x 700 — Article detail
349 x 500 — IG feed
401 x 462 — Curated playlists
Shared Window Classes (Tailwind)
Animations
Ping (Notification Pulse)
Flashing Dots (Loading Indicator)
dimBackground (Modal Overlay)
Transition Defaults
| Context | Property | Duration | Easing |
|---|---|---|---|
| Fade enter/leave | opacity | 0.2s | ease |
| Slider handle | transform | 0.2s | ease |
| Tooltip position | top, left, bottom, right | 0.3s | ease |
| Select dropdown | opacity | 0.15s | cubic-bezier(1,.5,.8,1) |
CSS Variables (Copy-Paste Block)
Complete theme variables as defined on the <html> element's inline style attribute.
Tailwind Custom Configuration
Tailwind Mapping
The paired JSON export now includes a tailwind section with theme extensions and component recipes. Use these mappings instead of default Tailwind tokens when recreating this system.
// tailwind.config.js
import designSystem from './design-system.json';
export default {
theme: {
extend: designSystem.tailwind.website.theme.extend,
},
};
// Swap to designSystem.tailwind.app.theme.extend for app/portal surfaces.
| Scope | Primary | Body Font | Radius | Shadow | Breakpoint |
|---|---|---|---|---|---|
| Website | — | — | — | — | — |
| Scope | Recipe | Class Pattern | Notes |
|---|---|---|---|
| Website | buttonPrimary | inline-flex items-center justify-center gap-2 rounded-md bg-brand-primary text-text-inverse shadow-sm px-4 py-2 font-semibold transition-colors | Primary action button using exported brand, radius, and shadow tokens. |
| Website | surfaceCard | rounded-md bg-surface-base text-text-primary border border-border-subtle shadow-sm p-6 | Default surface/card treatment for high-visibility content areas. |
| Website | inputField | rounded-md border border-border-subtle bg-surface-base text-text-primary px-3 py-2 focus:outline-none focus:ring-2 focus:ring-focus-ring | Base text input treatment aligned to the exported radius, border, and focus tokens. |