Social proof has looked many ways across the history of the web. In the early 2000s, it looked like a row of 88×31 pixel badges — those tiny graphical buttons that every site collected like trading cards. The Testimonials component pays homage to that tradition: six badge-sized buttons, one for each endorser, that reveal a hover-triggered quote tooltip when you mouse over them. The result is a page that is equal parts portfolio evidence and gentle self-parody. It renders at theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/webmaster/llms.txt
Use this file to discover all available pages before exploring further.
/testimonials route.
What It Looks Like
At rest, the page shows abevel-container silver panel titled “Cool People Who Like Me” containing six <Button88x31> badges arranged in a centered wrapping flex row. Each badge shows the endorser’s name and a ♥ icon against their personal color. A bouncing 👍 emoji anchors the bottom-left corner and a delayed-bounce ⭐ sits in the bottom-right.
On hover, the hovered badge scales up (scale-110) and a yellow tooltip card descends from below it with a CSS triangle pointer at the top, showing the full quote and attribution.
Testimonials Data Array
The six testimonials are hardcoded in thepe array inside assets/main.js. Each entry has an id, a name (used as the badge label and tooltip attribution), a quote, and a hex color that drives the badge’s background:
Props
The Testimonials component is an inline page-level function (be()) in assets/main.js. It is not exported as a standalone importable component with a public prop API.
No props are accepted. All testimonial data is sourced from the hardcoded
pe array in assets/main.js. To add, remove, or edit quotes, modify that array directly.Interaction: Hover State
The component uses a single piece of React state to track which badge is currently hovered:onMouseEnter and onMouseLeave to set or clear the active ID:
Tooltip Anatomy
The tooltip is an absolutely-positioned card that drops below the hovered badge. It has no enter/exit animation — it appears and disappears instantly on mouse events.Positioning
absolute z-50 top-full left-1/2 -translate-x-1/2 mt-4 — centered horizontally below the badge with 4px of gap. z-50 keeps it above all other page content.Card Styling
w-64 bg-yellow-100 border-2 border-black p-4 with shadow-[4px_4px_0_rgba(0,0,0,0.5)] — a chunky 4px offset drop shadow, the retro hard-shadow style used throughout the site.CSS Triangle
Two stacked zero-dimension
divs using the CSS border-trick produce the triangle pointer at the top of the card. The outer triangle is border-b-black; the inner is border-b-yellow-100, creating a two-pixel outline effect.Quote Typography
Quote text in
font-comic text-lg italic text-gray-800. Attribution in font-bold text-right text-sm, right-aligned with an em-dash prefix.CSS Triangle Reference
The double-div triangle technique works by exploiting how CSS renders zero-width/zero-height elements with large borders:left-1/2 -translate-x-1/2 — horizontally centered on the badge, so the arrow always points back at the name.
The <Button88x31> Integration
Each testimonial renders as a <Button88x31> component — the site’s reusable 88×31 pixel button primitive — passed three values from the testimonial entry:
icon="♥" prop is hardcoded identically for every testimonial badge, giving the row visual consistency while the color prop differentiates each person.
Decorative Corner Elements
Two absolutely-positioned emoji anchors sit inside the silver container, decorating the bottom corners:Page Title Styling
#00CED1 (the site’s turquoise) — double the size of the standard 4px shadow used on other elements, making it the visual anchor of the page.
Route Registration
The Testimonials component is the full page content for/testimonials, registered in the router inside assets/main.js:
Like the Skills Scoreboard, this is a page-level component — it is not intended to be embedded inside other components. It fills the complete
<main> content area of the layout shell.Customizing Testimonials
To add a new quote, append an entry to thepe array in assets/main.js: