Concierge Requests Hover List

About this block

Concierge Requests Hover ListPRO

A ruled list of things a small hotel will arrange, set in large serif lines with a short note and how much notice each needs: hovering a row dims the others and a tilted photograph follows the pointer across the list, swapping to match the request. Phones get a small thumbnail on every row instead.

Hotel28: Concierge Requests Hover List

A ruled list of concierge requests in large serif lines, each with a note and how much notice it needs: hovering a row dims the others while a tilted photograph trails the pointer across the list and swaps to match the request.

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://beste.dev/r/hotel28?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/hotel28.tsx plus the button22 sliding-marker pill for the closing button and the text1 word stagger for the heading.

Quick start

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

tsx
import { Hotel28, hotel28Demo } from "@/components/beste/block/hotel28";

export default function Page() {
  return <Hotel28 {...hotel28Demo} />;
}

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

tsx
import { Hotel28 } from "@/components/beste/block/hotel28";

export default function Page() {
  return (
    <Hotel28
      eyebrow="Just ask"
      heading="Things we are happy to arrange."
      description="Most of these can happen by tomorrow, a few by this afternoon."
      requests={[
        {
          title: "A day on the caique",
          note: "Three coves, a local skipper, lunch on board",
          lead: "A day ahead",
          href: "/concierge/boat",
          image: { src: "https://oud.pics/b/hotel/ostria-boat-cove.webp", alt: "A wooden boat in a turquoise cove" },
        },
        {
          title: "A massage on your terrace",
          note: "Island oils and the sound of the sea",
          lead: "Same day",
          href: "/concierge/massage",
          image: { src: "https://oud.pics/b/hotel/ostria-treatment-room.webp", alt: "A linen massage table beside a bright window" },
        },
      ]}
      button={{ label: "Write to the concierge", href: "mailto:[email protected]", tone: "dark" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small uppercase line above the heading
headingstring–Serif <h2>, staggered word by word through Text1
descriptionstring–Paragraph at the right of the header
requestsConciergeRequest[][]The list rows, each a link
buttonActionButton–Pill action under the list, dark tone when none is set
classNamestring–Extra classes for the outer <section>
ts
type ConciergeRequest = {
  title: string;
  note: string;
  lead: string;
  href: string;
  image: { src: string; alt: string };
};

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

Behavior notes

  • From the medium breakpoint a 4:5 photo frame follows the pointer through a spring, centered roughly on the cursor; it scales and tilts in when a row is hovered, crossfades its image when the row changes, and tilts out when the pointer leaves the list.
  • Hovering or focusing a row dims every other row's title and note; the hovered title also nudges right.
  • Below the medium breakpoint the floating photo is hidden and each row shows a small square thumbnail on the left instead. The lead text is hidden below the small breakpoint, leaving only the arrow.
  • The floating photo and the row thumbnails are decorative (empty alt, aria-hidden), so image.alt is not read out in this block.
  • Rows fade up 0.08s apart and their top rules, plus a closing bottom rule, draw in from the left once the list is in view.
  • With reduced motion the entrance fades and rule draws are skipped.

More Hotel blocks

View all Hotel
PRO

hotel3

Room Collection List

PRO

hotel45

Gift a Stay List

PRO

hotel44

Good to Know Questions

Get Pro