Materials
Everything you touch at Alder Row is one of four things: oak, pale concrete, the warehouse's own brick, and linen. Nothing is painted to look like something else.

European oak for the floors, windows, kitchen fronts and stair, oiled rather than lacquered so it darkens slowly with use.
The courtyard wing is cast in a pale, lime-washed concrete with a sanded finish that reads softer than it sounds.
The warehouse walls are cleaned, repointed and left exposed inside the homes on the river side.
Curtains, blinds and headboards in a heavy washed linen chosen by Agnes Obel Interiors, in three undyed tones.
A materials story for a development: eyebrow, heading and lead on the left with a square photograph beside them, then four columns under hairlines, each with a small line-drawn glyph (plank grain, a concrete block, a brick bond, a folded cloth) that draws itself in once scrolled into view, a title and a short note.
A materials story for a development's sales page: eyebrow, heading and lead on the left with a square photograph beside them, then four columns under hairlines. Each column carries a small line-drawn glyph (plank grain, a concrete block, a brick bond, a folded cloth) that draws itself in once the row scrolls into view, a title and a short note on how the material is used.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://beste.dev/r/realestate19?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate19?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate19.tsx plus the badge24 rule eyebrow; it uses no shadcn/ui primitives.
The installed file exports realestate19Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate19, realestate19Demo } from "@/components/beste/block/realestate19";
export default function Page() {
return <Realestate19 {...realestate19Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate19 } from "@/components/beste/block/realestate19";
export default function Page() {
return (
<Realestate19
eyebrow="Materials"
heading="Four materials, used honestly"
description="Everything you touch at Alder Row is one of four things. Nothing is painted to look like something else."
image={{
src: "https://oud.pics/b/realestate/alder-kitchen-detail.webp",
alt: "Oak drawer fronts under a pale stone worktop",
}}
materials={[
{ glyph: "oak", title: "Oak", description: "Floors, windows and kitchen fronts, oiled rather than lacquered." },
{ glyph: "brick", title: "Reclaimed brick", description: "The warehouse walls, cleaned, repointed and left exposed." },
{ glyph: "linen", title: "Linen", description: "Curtains and headboards in a heavy washed linen in three undyed tones." },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, drawn with a rule in front of it. |
heading | string | – | Section heading. |
description | string | – | Lead paragraph under the heading. |
image | { src: string; alt: string } | – | Square photograph beside the header; without it the header spans its own column only. |
materials | Material[] | [] | The columns; four fit on one row on large screens, two per row on tablets. |
className | string | – | Extra classes merged onto the section. |
type GlyphName = "oak" | "concrete" | "brick" | "linen";
type Material = {
glyph: GlyphName;
title: string;
description: string;
};glyph; outlines are 1.5 strokes in the foreground colour, texture lines are 1 strokes in the muted colour. Every path animates its pathLength from zero, outlines first and texture half a second later, offset per column.useInView, once, with a 10% margin), so the drawing is always seen rather than finished off-screen.load event and on being in view: the frame opens from the top over 1.6 seconds while the image settles from a 1.18 to a 1.12 scale, and it drifts from -6% to 6% against the scroll.prefers-reduced-motion every element renders in its final state, glyphs complete, the photograph open and the parallax held still.