A comprehensive visual language reference for a glassmorphism-based time tracking application built with React. Dark teal palette, layered transparency, and monospace precision.
A deep oceanic palette grounded in dark teals and cyans. The system uses CSS custom properties for theming consistency. The intentional low-saturation backgrounds let the accent teal glow stand out — creating visual depth without overwhelming the user.
Two fonts with distinct roles: DM Sans for readability in UI text, JetBrains Mono for numerical precision and technical labels. The pairing creates a clear split between "human" and "data" layers.
Every interactive element extracted and documented. Components use consistent border-radius, shadow depth, and glass layering across all states.
:focus-visible for keyboard navigation.
The combo approach: color-matched glow ring + subtle scale pulse. Tab through the buttons below to see it live.
A container-based layout at 1400px max-width with 2rem body padding. Spacing uses rem-based values for scalability. The grid system is flexible — auto-fill with 400px minimum card width.
Observations and actionable suggestions to elevate the interface. Ordered by impact — from accessibility essentials to polish details.
#037F8C (3.8:1) to #049DA5 (5.5:1) — comfortably above WCAG AA's 4.5:1 threshold while maintaining clear visual separation from accent-primary (#03A6A6, 6.0:1). The hue shift is minimal, preserving the original teal character.
:focus-visible to all interactive elements with a combo approach: teal glow ring (consistent with input focus) plus a subtle scale pulse animation (1.03x over 0.3s). Destructive buttons (delete, stop, clear) use color-matched red/amber rings instead. Uses :focus-visible over :focus to avoid showing outlines on mouse clicks.
#ffa502) yielded ~1.5:1 contrast — deeply failing WCAG. Changed to color: var(--bg-primary) (#011826), matching the same dark-on-light logic already used on the Start button. Consistent pattern: light backgrounds always get dark text.
text-shadow from timer digits — the 30px+60px blur was visually slurring ticking seconds and creating eye fatigue. Moved the ambient glow to the timer container (box-shadow on .preview-timer.active) to keep the "active energy" feel without compromising digit legibility. The pulsing top bar remains as the primary activity indicator.
.btn-sm (0.5rem 1rem), .btn-md (0.9rem 1.75rem — default), .btn-lg (1.1rem 2.25rem). Delete uses sm, primary actions use md, prominent CTAs (Add Project) use lg. Sizes are now intentional, not arbitrary.
window.confirm() — a jarring browser dialog that breaks the glass aesthetic. Replace with an inline confirmation pattern: first click changes the button to "Confirm? / Cancel" state within the same card. This keeps the user in context and matches the visual language.