Client Logo Grid
Static bordered-cell grid of client logos. Each cell reveals a brief role summary — a popover on hover for pointer devices, a panel below the grid on touch.
Live Preview
Proven design experience with brands of all sizes
View Full Version
Layout
Desktop (lg+)
Single row of five bordered cells
Mobile / tablet
Two columns, 2–2–1, with the fifth cell spanning full width
Cell borders
Each cell draws its own dividers so borders reveal with the staggered entrance instead of flashing as a solid frame
Interaction
Pointer devices
Hover (or keyboard focus) opens a popover above the cell with the role, period and a one-line summary. A 120ms close delay prevents flicker when skimming across cells; Escape closes.
Touch devices
Tapping a cell expands a full-width detail panel below the grid. Tapping the same cell closes it, another cell swaps content, and a tap outside the section dismisses it.
Detection
(hover: hover) and (pointer: fine)Animation Details
Entrance
FadeInStagger / FadeInStaggerItem — cells rise in on scroll with the house spring (stiffness 50, damping 20), 0.08s apart
Popover
spring — stiffness 300, damping 25Matches the hero menu and link previews — every popover on the site shares the .popover-surface glass style and this spring.
Reduced motion
Entrance opts out via FadeIn; popover and panel fall back to opacity only
Current Clients
- RewardPay — Freelance Product Designer
- Monaco Lawyers — Freelance Product Designer
- CommBank — Specialist UI Designer, 2022–2025
- Humm Group — Digital Designer, 2020–2022
- UNSW — Digital Designer & eDM Developer, 2017–2019
Logos and copy live in the clients array in the component. SVGs are stored in /public/images/.
Logo Styling
full opacity — source SVGs are already #9A9A9A on the dark canvasopen / hover: brightness-150 + bg-surface cell highlightpopover: .popover-surface (translucent + backdrop blur, subtle border)per-logo heightClass normalizes optical letterform sizeUsage
import { ClientLogoGrid } from '@/components/sections/ClientLogoGrid'
// Default usage — data is hardcoded in the component
<ClientLogoGrid />Import
import { ClientLogoGrid } from '@/components/sections/ClientLogoGrid'