Consultancy Agency

Measurable Performance for businesses

Marnholt is a consultancy built for teams that need direction, structure, and execution—not vague advice or long decks.

Two people in a meeting, sitting side by side in front of a pale wooden partition.

“Their structured approach cut our operational waste in half.”

Sayyan Head of Product

What is going on up there

Two columns, 1fr and 0.9fr, 100 px apart. On the left, a stack: eyebrow, heading, paragraph, then a row carrying the call to action and the social proof. On the right, a single photograph — its bottom left corner is bevelled in the file itself, not with a clip-path — and a white card pinned 8 px from its bottom right corner, three corners rounded and the fourth square.

The only thing that moves is the button. On hover and on keyboard focus, its label rises out of a one-line window while a copy arrives from below, and its arrow leaves to the right while a copy enters from the left. Both last 350 ms on cubic-bezier(.25,.46,.45,.94): those values were read from the original's animation engine, not estimated.

Tuning it

Everything goes through CSS variables, at the top of testimonial-hero.css. One of them rescales the whole thing: --prh-font-size, which is the body size of the running text. The others are overridden one at a time: --prh-fond, --prh-encre, --prh-bouton-fond, --prh-carte-largeur, --prh-duree, --prh-courbe, and --prh-photo-ratio, which you change at the same time as the photograph.

The narrow breakpoints are written with @container and not with @media: the hero folds when its column is narrow, whatever the window is doing. You can see it below.

The component has no JavaScript. The same page with script-src 'none' shows it: nothing changes.

In a narrow column

The same markup in a 460 px frame, with --prh-font-size: 12px. The window has not moved: it is the container that decides.

Consultancy Agency

Measurable Performance for businesses

Marnholt is a consultancy built for teams that need direction, structure, and execution—not vague advice or long decks.

The same meeting photograph, smaller.

“Their structured approach cut our operational waste in half.”

Sayyan Head of Product

The flaw in the original

In the original the row is over-full: the button and the caption ask for 625.68 px in a column of 612.63 px, so both are squeezed. The button's label then wraps onto two lines and the one-line window cuts it off: you read "START A FREE" instead of "START A FREE MEETING". The same accident doubles the travel of the label's animation, while the arrow only covers one line's worth.

data-prh-original restores that behaviour exactly — it is what the bench compares with the original. Without the attribute the button is no longer squeezed and its label is no longer cut off; the caption absorbs the overflow and wraps onto two lines, exactly as in the original.

Consultancy Agency

Measurable Performance for businesses

Marnholt is a consultancy built for teams that need direction, structure, and execution—not vague advice or long decks.

The same meeting photograph.

“Their structured approach cut our operational waste in half.”

Sayyan Head of Product