aqua.css
A CSS library for building interfaces that look like Apple's classic Aqua UI from Mac OS X 10.0 - 10.4 (2001-2005). Featuring glossy buttons, traffic light window controls, and that iconic blue gradient style.
Install: npm install aqua.css or use the CDN:
<link rel="stylesheet" href="https://unpkg.com/aqua.css">
Use the Aqua Era selector in the sidebar to preview palette and texture changes across the 10.0-10.4 releases.
Window
The classic Aqua window with brushed metal title bar and traffic light buttons (close, minimize, maximize/zoom).
Inactive Window
Windows that are not in focus have grayed-out traffic lights.
Brushed Metal
Authentic brushed metal texture from Mac OS X 10.3-10.5 era (2003-2007). Used in iTunes, QuickTime Player, Finder, and Safari.
Note: The authentic brushed metal effect requires canvas-based rendering with p5.js to accurately recreate the horizontal grain striations and Perlin noise texture. CSS gradients can only approximate the effect.
CSS + SVG Filter Implementation
Alternative approach using SVG filters for the brushed texture. This method uses
feTurbulence for procedural noise and doesn't require JavaScript.
Buttons
Show code
<!-- Pre-10.6 era buttons (aqua-button style) -->
<div class="era-pre-10-6">
<div class="label">Standard Buttons</div>
<div class="component-row">
<button class="aqua-button aqua-button--secondary"><span>Cancel</span></button>
<button class="aqua-button default"><span>Default</span></button>
<button class="aqua-button default pulse"><span>Pulsing</span></button>
<button class="aqua-button aqua-button--secondary" disabled><span>Disabled</span></button>
</div>
<div class="label" style="margin-top: 15px;">Button Types</div>
<div class="component-row">
<button class="aqua-button aqua-button--secondary"><span>Regular</span></button>
<button class="aqua-button help" aria-label="Help"><span>?</span></button>
</div>
<div class="label" style="margin-top: 15px;">Size Variants (from Apple HIG)</div>
<div class="component-row">
<div class="component-group">
<button class="aqua-button aqua-button--secondary"><span>Regular</span></button>
<span class="state-label">13px font</span>
</div>
<div class="component-group">
<button class="aqua-button aqua-button--secondary small"><span>Small</span></button>
<span class="state-label">11px font</span>
</div>
<div class="component-group">
<button class="aqua-button aqua-button--secondary mini"><span>Mini</span></button>
<span class="state-label">9px font</span>
</div>
</div>
<div class="label" style="margin-top: 15px;">Pill Buttons (Segmented Control)</div>
<div class="component-row">
<div class="pill-group">
<button class="aqua-button aqua-button--secondary left-pill"><span>Left</span></button>
<button class="aqua-button aqua-button--secondary center-pill"><span>Center</span></button>
<button class="aqua-button aqua-button--secondary right-pill"><span>Right</span></button>
</div>
<div class="segmented-control" style="margin-left: 10px;">
<button class="aqua-button aqua-button--secondary active" aria-pressed="true"><span>Left</span></button>
<button class="aqua-button aqua-button--secondary"><span>Center</span></button>
<button class="aqua-button aqua-button--secondary"><span>Right</span></button>
</div>
</div>
<div class="label" style="margin-top: 15px;">Color Variants</div>
<div class="component-row">
<button class="aqua-button aqua-button--secondary"><span>Cancel</span></button>
<button class="aqua-button default"><span>Default</span></button>
<button class="aqua-button aqua-button--orange"><span>Login</span></button>
<button class="aqua-button default armed"><span>Pressed</span></button>
<button class="aqua-button mini aqua-button--secondary"><span>Mini</span></button>
</div>
<div class="label" style="margin-top: 15px;">Button States</div>
<div class="states-demo">
<div class="state-box">
<button class="aqua-button aqua-button--secondary"><span>Normal</span></button>
<div class="state-label">Normal</div>
</div>
<div class="state-box">
<button class="aqua-button aqua-button--secondary armed"><span>Pressed</span></button>
<div class="state-label">Pressed/Armed</div>
</div>
</div>
</div>
<!-- 10.6+ era buttons (flat style) -->
<div class="era-10-6-plus">
<div class="label">Standard Buttons</div>
<div class="component-row">
<button>Button</button>
<button class="default">Default</button>
<button class="default pulse">Pulsing</button>
<button disabled>Disabled</button>
</div>
<div class="label" style="margin-top: 15px;">Button Types</div>
<div class="component-row">
<button>Regular</button>
<button class="round-rect">Round Rect</button>
<button class="help" aria-label="Help">?</button>
</div>
<div class="label" style="margin-top: 15px;">Size Variants (from Apple HIG)</div>
<div class="component-row">
<div class="component-group">
<button>Regular</button>
<span class="state-label">13px font</span>
</div>
<div class="component-group">
<button class="small">Small</button>
<span class="state-label">11px font</span>
</div>
<div class="component-group">
<button class="mini">Mini</button>
<span class="state-label">9px font</span>
</div>
</div>
<div class="label" style="margin-top: 15px;">Pill Buttons (Segmented Control)</div>
<div class="component-row">
<div class="pill-group">
<button class="left-pill">Left</button>
<button class="center-pill">Center</button>
<button class="right-pill">Right</button>
</div>
<div class="segmented-control" style="margin-left: 10px;">
<button class="active" aria-pressed="true">Left</button>
<button>Center</button>
<button>Right</button>
</div>
</div>
<div class="label" style="margin-top: 15px;">Button States</div>
<div class="states-demo">
<div class="state-box">
<button>Normal</button>
<div class="state-label">Normal</div>
</div>
<div class="state-box">
<button class="armed">Pressed</button>
<div class="state-label">Pressed/Armed</div>
</div>
</div>
</div>
Form Controls
Text Inputs
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: flex-start;">
<div>
<span class="label">Regular (square corners)</span><br>
<input class="aqua-textfield" type="text" placeholder="Enter text...">
</div>
<div>
<span class="label">Search (with icon)</span><br>
<input class="aqua-textfield search" type="text" placeholder="Search...">
</div>
<div>
<span class="label">Round Rect</span><br>
<input class="aqua-textfield round-rect" type="text" placeholder="Round rect...">
</div>
<div>
<span class="label">Disabled</span><br>
<input class="aqua-textfield" type="text" placeholder="Disabled" disabled>
</div>
<div>
<span class="label">Password</span><br>
<input class="aqua-textfield" type="password" value="••••••••">
</div>
</div>
Select Dropdown
Show code
<div class="field-row">
<label for="select">Choose an option:</label>
<div class="select-wrapper">
<select id="select">
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select>
<span class="select-button"></span>
<span class="select-arrows">
<span class="arrow-up">▲</span>
<span class="arrow-down">▼</span>
</span>
</div>
</div>
Combobox
Text input combined with a dropdown button.
Show code
<div class="combobox" style="width: 200px;">
<input type="text" value="Automatic">
</div>
Listbox
Mac OS 10.1 style listbox with wave scrollbar. The scrollbar uses data-scrollbar-for to connect to any scrollable element.
- 640 x 480
- 800 x 600
- 1024 x 768
- 1152 x 864
- 1280 x 720
- 1280 x 768
- 1280 x 960
- 1280 x 1024
- 1360 x 768
- 1440 x 900
- 1600 x 900
- 1680 x 1050
- 1920 x 1080
Show code
<div class="aqua-listbox" style="width: 220px; height: 200px;">
<div class="aqua-listbox-content" id="aqua-listbox-content">
<ul class="aqua-listbox-list" role="listbox" id="aqua-listbox-list">
<li class="aqua-listbox-item" role="option">640 x 480</li>
<li class="aqua-listbox-item" role="option">800 x 600</li>
<li class="aqua-listbox-item selected" role="option" aria-selected="true">1024 x 768</li>
<li class="aqua-listbox-item" role="option">1152 x 864</li>
<li class="aqua-listbox-item" role="option">1280 x 720</li>
<li class="aqua-listbox-item" role="option">1280 x 768</li>
<li class="aqua-listbox-item" role="option">1280 x 960</li>
<li class="aqua-listbox-item" role="option">1280 x 1024</li>
<li class="aqua-listbox-item" role="option">1360 x 768</li>
<li class="aqua-listbox-item" role="option">1440 x 900</li>
<li class="aqua-listbox-item" role="option">1600 x 900</li>
<li class="aqua-listbox-item" role="option">1680 x 1050</li>
<li class="aqua-listbox-item" role="option">1920 x 1080</li>
</ul>
</div>
<div class="scrollbar vertical" data-scrollbar-for="aqua-listbox-content">
<div class="scrollbar-cap aqua-glass-v"></div>
<div class="scrollbar-track">
<div class="scrollbar-thumb-v">
<div class="scrollbar-wave-ink-v">
<div class="scrollbar-wave-shimmer-v"></div>
</div>
</div>
</div>
<div class="scrollbar-buttons aqua-glass-v">
<button type="button" title="Scroll up">▲</button>
<button type="button" title="Scroll down">▼</button>
</div>
</div>
</div>
Native select[multiple] fallback:
Show code
<select multiple style="width: 200px; height: 120px;">
<option>Documents</option>
<option selected>Pictures</option>
<option>Music</option>
<option>Movies</option>
<option>Downloads</option>
</select>
Checkboxes
Show code
<div class="field-row">
<label class="checkbox">
<input type="checkbox" checked>
<span class="box"><span class="mark"></span></span>
<span>Checked checkbox</span>
</label>
</div>
<div class="field-row">
<label class="checkbox">
<input type="checkbox">
<span class="box"><span class="mark"></span></span>
<span>Unchecked checkbox</span>
</label>
</div>
<div class="field-row">
<label class="checkbox">
<input type="checkbox" disabled checked>
<span class="box"><span class="mark"></span></span>
<span>Disabled checked</span>
</label>
</div>
Radio Buttons
Show code
<div class="field-row">
<label class="radio">
<input type="radio" name="radio-class-group" checked>
<span class="circle"><span class="dot"></span></span>
<span>Option A</span>
</label>
</div>
<div class="field-row">
<label class="radio">
<input type="radio" name="radio-class-group">
<span class="circle"><span class="dot"></span></span>
<span>Option B</span>
</label>
</div>
<div class="field-row">
<label class="radio">
<input type="radio" name="radio-class-group">
<span class="circle"><span class="dot"></span></span>
<span>Option C</span>
</label>
</div>
Progress Bar
Show code
<div style="display: grid; gap: 20px;">
<div>
<span class="label">Determinate (60%)</span>
<div class="progress-wave" style="--p: 60; --h: 13px; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
</div>
<div>
<span class="label">Determinate (30%)</span>
<div class="progress-wave" style="--p: 30; --h: 13px; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
</div>
<div>
<span class="label">Complete (100%)</span>
<div class="progress-wave" style="--p: 100; --h: 13px; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
</div>
<div>
<span class="label">Indeterminate</span>
<div class="aqua-progress indeterminate">
<div class="stripes">
<div class="stripes-inner">
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
<div class="stripe"></div>
</div>
</div>
</div>
</div>
<div>
<span class="label">Disabled (50%)</span>
<div class="progress-wave disabled" style="--p: 50; --h: 13px; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
</div>
</div>
Progress Indicator / Spinner / Loader
Animated loading indicators for determinate and indeterminate progress states.
Circular Progress Indicator
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: center;">
<div>
<span class="label">Circular (75%)</span><br>
<div class="aqua-progress-indicator" style="--progress: 75;">
<div class="indicator"></div>
<div class="progress"></div>
<span class="percentage">75%</span>
</div>
</div>
<div>
<span class="label">Circular (25%)</span><br>
<div class="aqua-progress-indicator" style="--progress: 25;">
<div class="indicator"></div>
<div class="progress"></div>
<span class="percentage">25%</span>
</div>
</div>
<div>
<span class="label">Complete</span><br>
<div class="aqua-progress-indicator complete" style="--progress: 100;">
<div class="indicator"></div>
<div class="progress"></div>
<span class="tick" aria-hidden="true"></span>
<span class="percentage">100%</span>
</div>
</div>
</div>
Spinner Indicator
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: center;">
<div>
<span class="label">Spinning (Indeterminate)</span><br>
<div class="aqua-spinner-indicator" aria-label="Loading">
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
</div>
</div>
<div>
<span class="label">Spinner (Large)</span><br>
<div class="aqua-spinner-indicator large" aria-label="Loading">
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
<div class="segment"></div>
</div>
</div>
<div>
<span class="label">Ring Spinner</span><br>
<div class="spinner animate"></div>
</div>
<div>
<span class="label">Ring Spinner (Large)</span><br>
<div class="spinner-large animate"></div>
</div>
</div>
Cursor
Animated cursor indicators.
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: center;">
<div>
<span class="label">Pinwheel</span><br>
<div class="spinner-container">
<div class="static-rainbow-bg bg-smooth-rainbow"></div>
<div class="spinning-pinwheel">
<div class="blade"></div>
<div class="blade"></div>
<div class="blade"></div>
<div class="blade"></div>
<div class="blade"></div>
</div>
</div>
</div>
</div>
Note: The pinwheel requires this SVG in your HTML:
Required SVG
<svg width="0" height="0" style="position:absolute">
<defs>
<clipPath id="spinnerBlade" clipPathUnits="objectBoundingBox">
<path d="M 0.5,0.5 Q 0.6025,0.2720 0.3372,0.0272 A 0.5,0.5 0 0 1 0.6628,0.0272 Q 0.7211,0.3834 0.5,0.5 Z" />
</clipPath>
</defs>
</svg>
Slider
Show code
<div>
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: flex-start;">
<div>
<span class="label">Horizontal</span><br>
<div class="aqua-slider-custom">
<div class="track"></div>
<div class="thumb" style="left: 50%;"><div class="shimmer"></div></div>
</div>
</div>
<div>
<span class="label">Disabled</span><br>
<div class="aqua-slider-custom disabled">
<div class="track"></div>
<div class="thumb" style="left: 50%;"><div class="shimmer"></div></div>
</div>
</div>
<div>
<span class="label">Pointer Thumb</span><br>
<div class="aqua-slider-custom alternative-thumb">
<div class="track"></div>
<div class="thumb" style="left: 50%;"><div class="shimmer"></div></div>
</div>
</div>
<div>
<span class="label">With Tick Marks</span><br>
<div class="aqua-slider-custom alternative-thumb show-ticks">
<div class="track"></div>
<div class="thumb" style="left: 50%;"><div class="shimmer"></div></div>
<div class="ticks">
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
</div>
</div>
</div>
<div>
<span class="label">Discrete (Snaps)</span><br>
<div class="aqua-slider-custom alternative-thumb show-ticks discrete">
<div class="track"></div>
<div class="thumb" style="left: 50%;"><div class="shimmer"></div></div>
<div class="ticks">
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
</div>
</div>
</div>
</div>
<div style="display: flex; gap: 40px; flex-wrap: wrap; align-items: flex-start; margin-top: 30px;">
<div style="height: 180px;">
<span class="label">Vertical</span><br>
<div class="aqua-slider-custom vertical" style="margin-top: 10px;">
<div class="track"></div>
<div class="thumb" style="top: 40%;"><div class="shimmer"></div></div>
</div>
</div>
<div style="height: 180px;">
<span class="label">Vertical Pointer</span><br>
<div class="aqua-slider-custom vertical alternative-thumb" style="margin-top: 10px;">
<div class="track"></div>
<div class="thumb" style="top: 40%;"><div class="shimmer"></div></div>
</div>
</div>
<div style="height: 180px;">
<span class="label">Vertical + Ticks</span><br>
<div class="aqua-slider-custom vertical alternative-thumb show-ticks" style="margin-top: 10px;">
<div class="track"></div>
<div class="thumb" style="top: 50%;"><div class="shimmer"></div></div>
<div class="ticks">
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
</div>
</div>
</div>
<div style="height: 180px;">
<span class="label">Discrete (Snaps)</span><br>
<div class="aqua-slider-custom vertical alternative-thumb show-ticks discrete" style="margin-top: 10px;">
<div class="track"></div>
<div class="thumb" style="top: 50%;"><div class="shimmer"></div></div>
<div class="ticks">
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
<div class="tick"></div>
</div>
</div>
</div>
<div style="height: 180px;">
<span class="label">Disabled</span><br>
<div class="aqua-slider-custom vertical alternative-thumb disabled" style="margin-top: 10px;">
<div class="track"></div>
<div class="thumb" style="top: 50%;"><div class="shimmer"></div></div>
</div>
</div>
</div>
</div>
Search Field
Rounded search input with magnifying glass icon.
Show code
<input type="search" class="search-field" placeholder="Search..." style="width: 200px;">
Stepper
Number input with increment/decrement buttons.
Show code
<div>
<span class="label">Stepper</span><br>
<div class="aqua-spinner">
<input type="number" value="5" min="0" max="100" aria-label="Value">
<div class="aqua-spinner-buttons" aria-hidden="true">
<button type="button">▲</button>
<button type="button">▼</button>
</div>
</div>
</div>
Separator
Show code
<hr class="aqua-separator">
<div style="display: flex; align-items: center;">
<span>Item 1</span>
<div class="aqua-separator vertical"></div>
<span>Item 2</span>
<div class="aqua-separator vertical"></div>
<span>Item 3</span>
</div>
Hyperlink
Matches JavaFX Hyperlink - underlines on hover/focus
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: baseline;">
<div>
<span class="label">Normal</span><br>
<a href="#" class="aqua-hyperlink">Click this hyperlink</a>
</div>
<div>
<span class="label">Visited</span><br>
<a href="#visited-example" class="aqua-hyperlink" id="visited-example">Visited hyperlink</a>
</div>
<div>
<span class="label">Disabled</span><br>
<a href="#" class="aqua-hyperlink disabled">Disabled hyperlink</a>
</div>
<div>
<span class="label">Button as Link</span><br>
<button class="aqua-hyperlink">Button styled as link</button>
</div>
</div>
Tabs
Classic Mac OS X Aqua-style tabs with glossy gradients and liquid blue separator bar. Inactive tabs are slightly pushed down, active tab is flush with the bar.
Pill-Style Tabs (Segmented)
Compact segmented tabs for inline controls and preferences.
General settings content goes here.
Show code
<div class="aqua-tabs-container">
<div class="aqua-tabs">
<button class="aqua-tab active" data-tab="general">General</button>
<button class="aqua-tab" data-tab="security">Security</button>
<button class="aqua-tab" data-tab="privacy">Privacy</button>
</div>
<div class="aqua-tab-content" data-tab-content>
<p>General settings content goes here.</p>
</div>
</div>
Segmented Tabs
Folder-style tabs used for inline controls and preferences in earlier Mac OS X versions.
General settings content goes here.
Fieldset
Show code
<fieldset>
<legend>Settings</legend>
<div class="field-row">
<input type="checkbox" id="fs-check1" checked>
<label for="fs-check1">Option 1</label>
</div>
<div class="field-row">
<input type="checkbox" id="fs-check2">
<label for="fs-check2">Option 2</label>
</div>
</fieldset>
Alert Dialog
Modal alert boxes with different icon types.
Titled Pane / Accordion
Content for advanced options goes here.
Show code
<div class="aqua-titled-pane expanded">
<div class="aqua-titled-pane-header" role="button" tabindex="0">
<span class="aqua-titled-pane-arrow"></span>
<span>General Options</span>
</div>
<div class="aqua-titled-pane-content">
<p style="margin: 5px 0;">Content for general options goes here.</p>
</div>
</div>
<div class="aqua-titled-pane">
<div class="aqua-titled-pane-header" role="button" tabindex="0">
<span class="aqua-titled-pane-arrow"></span>
<span>Advanced Options</span>
</div>
<div class="aqua-titled-pane-content">
<p style="margin: 5px 0;">Content for advanced options goes here.</p>
</div>
</div>
Split Pane
Drag the divider to resize panes
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: flex-start;">
<div>
<span class="label">Horizontal (Left / Right)</span><br>
<div class="aqua-split-pane" style="height: 100px; width: 300px;" id="split-h">
<div style="width: 150px; padding: 10px;">Left pane</div>
<div class="aqua-split-divider" data-split="split-h" aria-label="Resize panes" role="separator" aria-orientation="vertical" tabindex="0">
<div class="aqua-split-grabber"></div>
<div class="aqua-split-grabber"></div>
<div class="aqua-split-grabber"></div>
</div>
<div style="flex: 1; padding: 10px;">Right pane</div>
</div>
</div>
<div>
<span class="label">Vertical (Top / Bottom)</span><br>
<div class="aqua-split-pane vertical" style="height: 150px; width: 200px;" id="split-v">
<div style="height: 75px; padding: 10px;">Top pane</div>
<div class="aqua-split-divider" data-split="split-v" aria-label="Resize panes" role="separator" aria-orientation="horizontal" tabindex="0">
<div class="aqua-split-grabber"></div>
<div class="aqua-split-grabber"></div>
<div class="aqua-split-grabber"></div>
</div>
<div style="flex: 1; padding: 10px;">Bottom pane</div>
</div>
</div>
</div>
Split View
Sidebar and content area layout.
Select a folder to view messages.
Show code
<div class="split-view" style="height: 200px;">
<div class="split-view-sidebar" style="padding: 8px;">
<div style="padding: 4px; background: #2B99FF; color: white; border-radius: 3px;">Inbox</div>
<div style="padding: 4px;">Sent</div>
<div style="padding: 4px;">Drafts</div>
<div style="padding: 4px;">Trash</div>
</div>
<div class="split-view-content">
<p>Select a folder to view messages.</p>
</div>
</div>
Disclosure
Expandable section with disclosure triangle.
Advanced Options
Show code
<details class="disclosure" style="width: 300px;">
<summary>Advanced Options</summary>
<div class="disclosure-content">
<div class="field-row">
<input type="checkbox" id="disc-check1">
<label for="disc-check1">Enable logging</label>
</div>
<div class="field-row">
<input type="checkbox" id="disc-check2">
<label for="disc-check2">Debug mode</label>
</div>
</div>
</details>
Scrollbar
Unified Aqua Scrollbar Components with Wave Thumbs - Available in horizontal and vertical variants with together or split arrow modes.
Overlay Scrollbar
Modern Mac-style overlay scrollbar - hover over the container to see the scrollbar appear
Show code
<div>
<span class="label">Vertical Scroll</span><br>
<div class="scroll-container scroll-demo-vertical">
<div style="padding: 12px;">
<div style="font-weight: bold; margin-bottom: 8px;">Scrollable Content</div>
<div style="margin: 0 0 6px 0;">Line 1 - Hover to see scrollbar</div>
<div style="margin: 0 0 6px 0;">Line 2 - Semi-transparent thumb</div>
<div style="margin: 0 0 6px 0;">Line 3 - Uses CSS variables</div>
<div style="margin: 0 0 6px 0;">Line 4 - 4px border radius</div>
<div style="margin: 0 0 6px 0;">Line 5 - Expands to 6px on hover</div>
<div style="margin: 0 0 6px 0;">Line 6 - Track appears on hover</div>
<div style="margin: 0 0 6px 0;">Line 7 - Light gradient background</div>
<div style="margin: 0 0 6px 0;">Line 8 - No arrow buttons</div>
<div style="margin: 0 0 6px 0;">Line 9 - Modern macOS style</div>
<div style="margin: 0 0 6px 0;">Line 10 - Overlay scrollbar</div>
<div style="margin: 0 0 6px 0;">Line 11 - Doesn't take space</div>
<div style="margin: 0 0 6px 0;">Line 12 - Content flows under</div>
<div style="margin: 0 0 6px 0;">Line 13 - Try scrolling!</div>
<div style="margin: 0 0 6px 0;">Line 14 - Smooth animation</div>
<div style="margin: 0;">Line 15 - End of content</div>
</div>
</div>
</div>
Menu Bar
Classic Mac menu bar with dropdown menus.
Show code
<nav class="menu-bar">
<ul>
<li>
<span class="menu-title">File</span>
<ul class="menu-dropdown">
<li>New <span class="shortcut">Cmd+N</span></li>
<li>Open... <span class="shortcut">Cmd+O</span></li>
<li class="separator"></li>
<li>Save <span class="shortcut">Cmd+S</span></li>
<li class="disabled">Save As...</li>
</ul>
</li>
<li>
<span class="menu-title">Edit</span>
<ul class="menu-dropdown">
<li>Undo <span class="shortcut">Cmd+Z</span></li>
<li>Redo <span class="shortcut">Cmd+Shift+Z</span></li>
<li class="separator"></li>
<li>Cut <span class="shortcut">Cmd+X</span></li>
<li>Copy <span class="shortcut">Cmd+C</span></li>
<li>Paste <span class="shortcut">Cmd+V</span></li>
</ul>
</li>
<li>
<span class="menu-title">View</span>
<ul class="menu-dropdown">
<li>as Icons</li>
<li>as List</li>
<li>as Columns</li>
</ul>
</li>
</ul>
</nav>
Dock
The Mac OS X application dock with icon launcher and running indicators.
Show code
<div class="dock">
<div class="dock-icon running">
<img src="icon/finder.svg" alt="Finder">
<span class="dock-label">Finder</span>
</div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Mail">
<span class="dock-label">Mail</span>
</div>
<div class="dock-icon running">
<img src="icon/finder.svg" alt="Safari">
<span class="dock-label">Safari</span>
</div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="iTunes">
<span class="dock-label">iTunes</span>
</div>
<div class="dock-separator"></div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Downloads">
<span class="dock-label">Downloads</span>
</div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Trash">
<span class="dock-label">Trash</span>
</div>
</div>
Small Dock
Show code
<div class="dock small">
<div class="dock-icon running">
<img src="icon/finder.svg" alt="Finder">
</div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Mail">
</div>
<div class="dock-separator"></div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Trash">
</div>
</div>
Large Dock
Show code
<div class="dock large">
<div class="dock-icon running">
<img src="icon/finder.svg" alt="Finder">
</div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Mail">
</div>
<div class="dock-separator"></div>
<div class="dock-icon">
<img src="icon/finder.svg" alt="Trash">
</div>
</div>
Context Menu
Menu styling for right-click and contextual actions.
Show code
<div class="aqua-menu" style="display: inline-block;">
<div class="aqua-menu-item"><span>Cut</span> <span class="shortcut">⌘X</span></div>
<div class="aqua-menu-item"><span>Copy</span> <span class="shortcut">⌘C</span></div>
<div class="aqua-menu-item"><span>Paste</span> <span class="shortcut">⌘V</span></div>
<div class="aqua-menu-separator"></div>
<div class="aqua-menu-item"><span>Select All</span> <span class="shortcut">⌘A</span></div>
</div>
Toolbar
Icon toolbar for application actions.
Show code
<div class="toolbar">
<button class="toolbar-button">
<span>Back</span>
</button>
<button class="toolbar-button">
<span>Forward</span>
</button>
<div class="toolbar-separator"></div>
<button class="toolbar-button">
<span>Refresh</span>
</button>
<button class="toolbar-button" disabled>
<span>Stop</span>
</button>
</div>
Segmented Control
Button group for switching between views or options.
Show code
<div class="segmented-control">
<button class="active">Icons</button>
<button>List</button>
<button>Columns</button>
</div>
Pagination
Show code
<div class="aqua-pagination">
<button class="aqua-pagination-arrow"><</button>
<button class="aqua-pagination-btn">1</button>
<button class="aqua-pagination-btn active">2</button>
<button class="aqua-pagination-btn">3</button>
<button class="aqua-pagination-btn">4</button>
<button class="aqua-pagination-btn">5</button>
<button class="aqua-pagination-arrow">></button>
</div>
Table View
Alternating row colors: --table-row-odd and --table-row-even
| Name | Date Modified | Size | Kind |
|---|---|---|---|
| Documents | Dec 10, 2024 | -- | Folder |
| report.pdf | Dec 9, 2024 | 2.4 MB | PDF Document |
| image.png | Dec 8, 2024 | 856 KB | PNG Image |
Show code
<table class="aqua-table unified-header" style="width: 100%; max-width: 700px;">
<thead>
<tr>
<th class="active" data-sort-dir="asc" style="width: 200px;">Name <span class="sort-arrow asc"></span></th>
<th>Date Modified</th>
<th>Size</th>
<th>Kind</th>
</tr>
</thead>
<tbody>
<tr>
<td>Documents</td>
<td>Dec 10, 2024</td>
<td>--</td>
<td>Folder</td>
</tr>
<tr>
<td>report.pdf</td>
<td>Dec 9, 2024</td>
<td>2.4 MB</td>
<td>PDF Document</td>
</tr>
<tr>
<td>image.png</td>
<td>Dec 8, 2024</td>
<td>856 KB</td>
<td>PNG Image</td>
</tr>
</tbody>
</table>
| Name | Date Modified | Size | Kind |
|---|---|---|---|
| Documents | Dec 10, 2024 | -- | Folder |
| report.pdf | Dec 9, 2024 | 2.4 MB | PDF Document |
| image.png | Dec 8, 2024 | 856 KB | PNG Image |
Show code
<table class="aqua-table" style="width: 100%; max-width: 600px;">
<thead>
<tr>
<th>Name</th>
<th>Date Modified</th>
<th>Size</th>
<th>Kind</th>
</tr>
</thead>
<tbody>
<tr>
<td>Documents</td>
<td>Dec 10, 2024</td>
<td>--</td>
<td>Folder</td>
</tr>
<tr>
<td>report.pdf</td>
<td>Dec 9, 2024</td>
<td>2.4 MB</td>
<td>PDF Document</td>
</tr>
<tr>
<td>image.png</td>
<td>Dec 8, 2024</td>
<td>856 KB</td>
<td>PNG Image</td>
</tr>
</tbody>
</table>
List View
Selectable list component with focused (blue) and unfocused (gray) selection.
Show code
<div style="display: flex; gap: 30px; flex-wrap: wrap; align-items: flex-start;">
<div>
<span class="label">Vertical (Focused - Blue)</span><br>
<div class="aqua-list focused" tabindex="0" style="width: 150px;">
<div class="aqua-list-item">Document 1</div>
<div class="aqua-list-item selected">Document 2</div>
<div class="aqua-list-item">Document 3</div>
<div class="aqua-list-item">Document 4</div>
<div class="aqua-list-item">Document 5</div>
</div>
</div>
<div>
<span class="label">Vertical (Unfocused - Gray)</span><br>
<div class="aqua-list" style="width: 150px;">
<div class="aqua-list-item">Photo 1</div>
<div class="aqua-list-item selected">Photo 2</div>
<div class="aqua-list-item">Photo 3</div>
<div class="aqua-list-item">Photo 4</div>
<div class="aqua-list-item">Photo 5</div>
</div>
</div>
<div>
<span class="label">Striped Rows</span><br>
<div class="aqua-list striped focused" tabindex="0" style="width: 150px;">
<div class="aqua-list-item">Row 1</div>
<div class="aqua-list-item">Row 2</div>
<div class="aqua-list-item selected">Row 3</div>
<div class="aqua-list-item">Row 4</div>
<div class="aqua-list-item">Row 5</div>
</div>
</div>
<div>
<span class="label">Disabled</span><br>
<div class="aqua-list disabled" style="width: 150px;">
<div class="aqua-list-item">Item A</div>
<div class="aqua-list-item selected">Item B</div>
<div class="aqua-list-item">Item C</div>
</div>
</div>
</div>
<div style="margin-top: 20px;">
<span class="label">Horizontal List</span><br>
<div class="aqua-list horizontal focused" tabindex="0" style="width: 520px;">
<div class="aqua-list-item">January</div>
<div class="aqua-list-item selected">February</div>
<div class="aqua-list-item">March</div>
<div class="aqua-list-item">April</div>
<div class="aqua-list-item">May</div>
<div class="aqua-list-item">June</div>
<div class="aqua-list-item">July</div>
</div>
</div>
Tree View
Expandable hierarchical list.
Show code
<div class="aqua-tree" tabindex="0" style="width: 250px;">
<div class="aqua-tree-item expanded">
<span class="aqua-tree-arrow"></span>
<span>Documents</span>
</div>
<div class="aqua-tree-item" style="padding-left: 20px;">
<span style="width: 8px; display: inline-block;"></span>
<span>report.pdf</span>
</div>
<div class="aqua-tree-item" style="padding-left: 20px;">
<span style="width: 8px; display: inline-block;"></span>
<span>notes.txt</span>
</div>
<div class="aqua-tree-item selected">
<span class="aqua-tree-arrow"></span>
<span>Pictures</span>
</div>
</div>
Tree Table View
Combines tree hierarchy with table columns (click arrows to expand/collapse)
| Name | Date Modified | Size | Kind |
|---|---|---|---|
|
Documents
|
Dec 10, 2024 | -- | Folder |
|
report.pdf
|
Dec 9, 2024 | 2.4 MB | PDF Document |
|
notes.txt
|
Dec 8, 2024 | 12 KB | Text File |
|
Pictures
|
Dec 7, 2024 | -- | Folder |
Show code
<table class="aqua-tree-table unified-header" tabindex="0" id="tree-table-demo" data-tree-table style="width: 100%; max-width: 700px;">
<thead>
<tr>
<th class="active" data-sort-dir="asc" style="width: 200px;">Name <span class="sort-arrow asc"></span></th>
<th>Date Modified</th>
<th>Size</th>
<th>Kind</th>
</tr>
</thead>
<tbody>
<tr class="selected" data-id="documents">
<td>
<div class="aqua-tree-cell">
<span class="aqua-tree-table-arrow expanded" data-toggle="documents" role="button" tabindex="0" aria-label="Toggle Documents"></span>
<span>Documents</span>
</div>
</td>
<td>Dec 10, 2024</td>
<td>--</td>
<td>Folder</td>
</tr>
<tr data-parent="documents">
<td>
<div class="aqua-tree-cell">
<span class="aqua-tree-table-indent"></span>
<span class="aqua-tree-table-arrow leaf"></span>
<span>report.pdf</span>
</div>
</td>
<td>Dec 9, 2024</td>
<td>2.4 MB</td>
<td>PDF Document</td>
</tr>
<tr data-parent="documents">
<td>
<div class="aqua-tree-cell">
<span class="aqua-tree-table-indent"></span>
<span class="aqua-tree-table-arrow leaf"></span>
<span>notes.txt</span>
</div>
</td>
<td>Dec 8, 2024</td>
<td>12 KB</td>
<td>Text File</td>
</tr>
<tr data-id="pictures">
<td>
<div class="aqua-tree-cell">
<span class="aqua-tree-table-arrow" data-toggle="pictures" role="button" tabindex="0" aria-label="Toggle Pictures"></span>
<span>Pictures</span>
</div>
</td>
<td>Dec 7, 2024</td>
<td>--</td>
<td>Folder</td>
</tr>
<tr data-parent="pictures" style="display: none;">
<td>
<div class="aqua-tree-cell">
<span class="aqua-tree-table-indent"></span>
<span class="aqua-tree-table-arrow leaf"></span>
<span>photo.jpg</span>
</div>
</td>
<td>Dec 6, 2024</td>
<td>3.2 MB</td>
<td>JPEG Image</td>
</tr>
</tbody>
</table>
Tooltip
Background: --tooltip-bg
Show code
<div class="aqua-tooltip">
<button>Hover for tooltip</button>
<span class="tooltip-text">This is a tooltip!</span>
</div>
Balloon / Speech Bubble
Tooltip with a speech bubble tail. Use .balloon-bottom, .balloon-right, etc. for positioning.
Show code
<div style="display: flex; gap: 20px; flex-wrap: wrap; padding-top: 20px;">
<div class="balloon" style="max-width: 200px;">
This is a balloon tooltip with the tail pointing up.
</div>
<div class="balloon balloon-bottom" style="max-width: 200px; margin-top: 0; margin-bottom: 20px;">
Tail pointing down.
</div>
</div>
Badge
Show code
<div style="display: flex; gap: 20px; align-items: center; flex-wrap: wrap;">
<span>Messages</span>
<span class="aqua-badge">5</span>
<span style="margin-left: 20px;">Notifications</span>
<span class="aqua-badge">99+</span>
</div>
Color Swatches
Show code
<div style="display: flex; gap: 10px; align-items: center; flex-wrap: wrap;">
<div class="aqua-color-swatch" style="background: #FF5F57;"></div>
<div class="aqua-color-swatch" style="background: #FFBD2E;"></div>
<div class="aqua-color-swatch" style="background: #28CA41;"></div>
<div class="aqua-color-swatch" style="background: #2B99FF;"></div>
<div class="aqua-color-swatch" style="background: #5856D6;"></div>
</div>
Focus Ring (Aqua Blue Glow)
Focus colors: $focus-outer, $focus-inner
Show code
<!-- Pre-10.6 era focus ring -->
<div class="era-pre-10-6">
<div style="display: flex; gap: 30px; align-items: center; flex-wrap: wrap;">
<div>
<span class="label">Button</span><br>
<button class="aqua-button aqua-button--secondary aqua-focus-ring is-focused"><span>Button</span></button>
</div>
<div>
<span class="label">Text field</span><br>
<input class="aqua-textfield aqua-focus-ring is-focused" type="text" value="Focused">
</div>
<div>
<span class="label">Select</span><br>
<select class="aqua-focus-ring is-focused">
<option>Option 1</option>
<option selected>Option 2</option>
<option>Option 3</option>
</select>
</div>
</div>
</div>
<!-- 10.6+ era focus ring -->
<div class="era-10-6-plus">
<div style="display: flex; gap: 30px; align-items: center; flex-wrap: wrap;">
<div>
<span class="label">Button</span><br>
<button class="aqua-focus-ring is-focused">Button</button>
</div>
<div>
<span class="label">Text field</span><br>
<input class="aqua-textfield aqua-focus-ring is-focused" type="text" value="Focused">
</div>
<div>
<span class="label">Select</span><br>
<select class="aqua-focus-ring is-focused">
<option>Option 1</option>
<option selected>Option 2</option>
<option>Option 3</option>
</select>
</div>
</div>
</div>
Stripes & Pinstripes
The horizontal stripes (pinstripes) were a signature visual element of Mac OS X from 10.0 through 10.3. Apple phased them out with Mac OS X 10.4 Tiger, moving toward cleaner, stripe-free interfaces.
Era Availability
| Era | Stripes | Notes |
|---|---|---|
| 10.0-10.1 (Cheetah/Puma) | Yes | Prominent blue-tinted stripes throughout the UI |
| 10.2 (Jaguar) | Yes | Stripes with slightly cooler blue tint |
| 10.3 (Panther) | Yes | Neutral gray stripes, more subtle |
| 10.4 (Tiger) | No | Stripes phased out, cleaner UI |
| 10.6 (Snow Leopard) | No | Continued stripe-free design |
Classic Horizontal Stripes
The signature horizontal stripe pattern used in early Finder windows and dialogs. Use the .aqua-background-striped class or apply --aqua-background-classic directly.
This container uses the classic horizontal stripe pattern from Mac OS X 10.0-10.3.
Show code
<div class="aqua-background-striped" style="padding: 20px; border-radius: 5px; border: 1px solid #ccc;">
<p style="margin: 0;">This container uses the classic horizontal stripe pattern from Mac OS X 10.0-10.3.</p>
</div>
Pinstripe Variants
Two pinstripe patterns are available:
--aqua-window-pinstripe
--aqua-menu-pinstripe
Pinstripes were phased out in 10.4+. Switch to 10.0-10.3 to view the classic patterns. You can still opt in with .aqua-background-striped or --aqua-background-classic.
Color Themes
Add a theme class to your container to change the accent color. Available themes:
theme-graphite- Gray/silver (like macOS Graphite appearance)theme-air- Light/white (subtle, airy look)theme-earth- Green (nature-inspired)theme-fire- Red/orange (bold, fiery)
Theme Selector
Select a theme to preview different color schemes on the components below
Show code
<!-- Pre-10.6 era theme selector -->
<div class="era-pre-10-6">
<div id="theme-preview-pre106">
<div class="field-row" style="margin-bottom: 20px;">
<label for="theme-select-pre106">Theme:</label>
<div class="select-wrapper">
<select id="theme-select-pre106" onchange="setTheme(this.value)">
<option value="">Default (Aqua Blue)</option>
<option value="theme-graphite">Graphite</option>
<option value="theme-air">Air (Light)</option>
<option value="theme-earth">Earth (Green)</option>
<option value="theme-fire">Fire (Red)</option>
<option value="theme-purple">Purple</option>
</select>
<span class="select-button"></span>
<span class="select-arrows">
<span class="arrow-up">▲</span>
<span class="arrow-down">▼</span>
</span>
</div>
</div>
<div class="label">Buttons</div>
<div class="button-row">
<button class="aqua-button aqua-button--secondary"><span>Regular</span></button>
<button class="aqua-button default"><span>Default</span></button>
</div>
<div class="label" style="margin-top: 15px;">Checkboxes & Radio</div>
<div class="field-row">
<input type="checkbox" id="theme-check1-pre106" checked>
<label for="theme-check1-pre106">Checked checkbox</label>
</div>
<div class="field-row">
<input type="radio" id="theme-radio1-pre106" name="theme-radio-pre106" checked>
<label for="theme-radio1-pre106">Selected radio</label>
</div>
<div class="label" style="margin-top: 15px;">Wave Progress Bar</div>
<div class="progress-wave" style="--p: 60; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
<div class="label" style="margin-top: 15px;">Segmented Control</div>
<div class="segmented-control">
<button class="aqua-button aqua-button--secondary active"><span>Selected</span></button>
<button class="aqua-button aqua-button--secondary"><span>Option</span></button>
<button class="aqua-button aqua-button--secondary"><span>Option</span></button>
</div>
<div class="label" style="margin-top: 15px;">List Selection</div>
<div class="aqua-list focused" tabindex="0" style="width: 150px;">
<div class="aqua-list-item">Item 1</div>
<div class="aqua-list-item selected">Item 2</div>
<div class="aqua-list-item">Item 3</div>
</div>
</div>
</div>
<!-- 10.6+ era theme selector -->
<div class="era-10-6-plus">
<div id="theme-preview">
<div class="field-row" style="margin-bottom: 20px;">
<label for="theme-select">Theme:</label>
<div class="select-wrapper">
<select id="theme-select" onchange="setTheme(this.value)">
<option value="">Default (Aqua Blue)</option>
<option value="theme-graphite">Graphite</option>
<option value="theme-air">Air (Light)</option>
<option value="theme-earth">Earth (Green)</option>
<option value="theme-fire">Fire (Red)</option>
<option value="theme-purple">Purple</option>
</select>
<span class="select-button"></span>
<span class="select-arrows">
<span class="arrow-up">▲</span>
<span class="arrow-down">▼</span>
</span>
</div>
</div>
<div class="label">Buttons</div>
<div class="button-row">
<button>Regular</button>
<button class="default">Default</button>
</div>
<div class="label" style="margin-top: 15px;">Checkboxes & Radio</div>
<div class="field-row">
<input type="checkbox" id="theme-check1" checked>
<label for="theme-check1">Checked checkbox</label>
</div>
<div class="field-row">
<input type="radio" id="theme-radio1" name="theme-radio" checked>
<label for="theme-radio1">Selected radio</label>
</div>
<div class="label" style="margin-top: 15px;">Wave Progress Bar</div>
<div class="progress-wave" style="--p: 60; width: 200px;">
<div class="progress-wave__fill">
<div class="progress-wave__ink" aria-hidden="true">
<span class="progress-wave__shimmer"></span>
</div>
</div>
</div>
<div class="label" style="margin-top: 15px;">Segmented Control</div>
<div class="segmented-control">
<button class="active">Selected</button>
<button>Option</button>
<button>Option</button>
</div>
<div class="label" style="margin-top: 15px;">List Selection</div>
<div class="aqua-list focused" tabindex="0" style="width: 150px;">
<div class="aqua-list-item">Item 1</div>
<div class="aqua-list-item selected">Item 2</div>
<div class="aqua-list-item">Item 3</div>
</div>
</div>
</div>
Complete Example
A window demonstrating multiple components together: