Evening Hero

Evening sessions now open

Thedayisloud.Thishourisnot.

Altair's evening practice runs from six until nine, for the people whose only free hour comes after everyone else has gone home.

Reserve an evening
Hours
18:00 to 21:00, Monday to Thursday
Where
Rua da Prata 12, or on video
Length
60 or 75 minutes
A rocky Mediterranean shore with hills across the bay
About this block

Evening HeroPRO

A dark ink hero with drifting soft light and film grain: eyebrow, a serif headline settling in word by word, intro, a light sliding-marker pill and a ruled fact sheet on the left, beside a portrait photograph drifting inside its rounded frame.

Hero178: Evening Hero

An evening hero on the ink surface under film grain: the headline settles in word by word above the intro, a pale pill and a ruled fact table, with a portrait photograph drifting inside its frame alongside.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/hero178?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/hero178?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/hero178.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

The installed file exports hero178Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.

tsx
import { Hero178, hero178Demo } from "@/components/beste/block/hero178";

export default function Page() {
  return <Hero178 {...hero178Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Hero178 } from "@/components/beste/block/hero178";

export default function Page() {
  return (
    <Hero178
      eyebrow="Evening sessions now open"
      heading="The day is loud. This hour is not."
      description="Our evening practice runs from six until nine."
      button={{ label: "Reserve an evening", href: "/evenings", tone: "light" }}
      image={{ src: "/photos/dock.jpg", alt: "A wooden dock reaching into a still lake at dusk" }}
      facts={[
        { label: "Hours", value: "18:00 to 21:00, Monday to Thursday" },
        { label: "Length", value: "60 or 75 minutes" },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the headline
headingstringHeadline, rendered as the page h1 through Text1
descriptionstringParagraph under the headline
buttonActionButtonPill action, defaulting to the light tone on this dark surface
image{ src: string; alt: string }Portrait photograph
factsFact[][]Ruled fact rows under the action
classNamestringExtra classes for the outer <section>
ts
type Fact = {
  label: string;
  value: string;
};

type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • button falls back to the light tone rather than primary, which is the correct default on a dark surface: an unspecified button comes out pale instead of taking the brand colour.
  • The photograph sits on a bg-background/10 placeholder rather than bg-muted, because a light muted panel would flash bright against the ink surface while the file loads.
  • Facts are a dl on a three-column grid with the value spanning two, so a long value wraps under itself instead of pushing its label out of alignment; the rules are written against background/20 for the dark surface.
  • The grain filter takes its id from useId, so two grain surfaces on one page cannot collide on a global SVG id.
  • The headline runs with trigger="mount", since a hero is above the fold, and the rest of the column is offset from 0.4 + heading.split(" ").length * 0.07.
  • There is no photograph behind the section itself, only grain, so this is the cheapest of the set's dark heroes to load.
  • The two columns are vertically centred, so a short fact table stays level with the portrait rather than riding at its top.

More Hero blocks

View all Hero
PRO

hero175

Split Portrait Hero

A light split hero: eyebrow, a serif headline settling in word by word, intro, a sliding-marker pill and a text link on the left, and a portrait photograph drifting inside its frame on the right with a frosted avatar proof card overlapping its corner, under a slowly drifting soft light.

PRO

hero185

Logos Hero

A centred hero with an eyebrow, a serif headline that settles in word by word, an intro and a sliding-marker pill, closed by a ruled row where greyscale partner logos drift right to left behind soft edge fades, next to a small-caps label.

PRO

hero176

Unveiling Hero

A centred hero: eyebrow, a serif headline settling in word by word, intro and two sliding-marker pills, then a wide photograph that unveils itself from a smaller inset frame and keeps drifting as the page scrolls, closed by a row of dotted facts.

PRO

hero186

Half Photo Hero

A full-height hero split down the middle: eyebrow, a serif headline that settles in word by word, an intro, two sliding-marker pills on the left, and a photograph filling the right half edge to edge that zooms out on load and drifts slower than the page.

PRO

hero184

Figures Hero

A text hero with an eyebrow and a serif headline that settles in word by word on the left, the intro and two sliding-marker pills on the right, and a ruled row of three serif figures that count up beneath, with no image.

PRO

hero120

Editorial Image Hero

Centered editorial hero with eyebrow, large heading, description, dual dark and outline CTAs, and a wide 16:9 image with a mono caption below.