Product Spotlight Hero
ComponentsHeroesProduct Spotlight Hero
HeroesNew

Product Spotlight Hero

An image-led product configurator. Change the finish, inspect another view, and compare models with a live price and dimensions.

USE IT FORProduct launchesFurniture and design objectsFinish and model selectionHardware product pages
React + CSS
Explore the full-width experienceOpen preview
MONOSOUND OBJECTS / COLLECTION 01
DESIGNED TO FEEL DIFFERENT

Sound. In its purest form.

One considered object. A quieter presence. Made for the spaces where life happens.

FORM. FUNCTION. NOTHING EXTRA.
MONO 01 speaker in Graphite, shown in a three-quarter view
IN THE DETAILS
Explore the + points for a closer look at the design.
01 — Finish
02 — Model
$390270 × 140 × 130 mm
MONO 01 / Graphite
Explore the object

MONO / A FICTIONAL PRODUCT DESIGN STUDYMONO 01 / Graphite / $390

ANTICRAFT / EXAMPLE JOURNAL
Live component. Go ahead, interact.
01

Installation

Run this in your shadcn-configured React project. The component and stylesheet are added together.

TERMINAL
npx shadcn@latest add http://localhost:5173/r/product-spotlight-hero.json

This command uses the current site address. For localhost, keep this preview running on the same computer. Files follow your configured components alias.

02

Usage

Import the component and make the details your own.

TypeScript
'use client';

import { ProductSpotlightHero } from '@/components/anticraft/ProductSpotlightHero';

export function Example() {
  return (
    <ProductSpotlightHero
      productName="MONO"
      productNumber="01"
      kicker="DESIGNED TO FEEL DIFFERENT"
      note="FORM. FUNCTION. NOTHING EXTRA."
      eyebrow="SOUND OBJECTS / COLLECTION 01"
      title={'Sound.\nIn its purest form.'}
      description="One considered object. A quieter presence. Made for the spaces where life happens."
      image={{ src: '/images/speaker-graphite.webp', alt: 'A graphite speaker in three-quarter view' }}
      variants={[
        { id: 'graphite', label: 'Graphite', color: '#343936', image: { src: '/images/speaker-graphite.webp', alt: 'The speaker in Graphite' }, views: [{ id: 'detail', label: 'Detail', image: { src: '/images/speaker-detail.webp', alt: 'A closer look at the Graphite volume dial' } }] },
        { id: 'chalk', label: 'Chalk', color: '#e8e5dd', image: { src: '/images/speaker-chalk.webp', alt: 'The speaker in Chalk' } },
      ]}
      sizes={[
        { id: 'standard', label: 'MONO 01', dimensions: '270 × 140 × 130 mm', price: '$390' },
        { id: 'plus', label: '01 PLUS', dimensions: '340 × 170 × 150 mm', price: '$540' },
      ]}
      features={[
        { id: 'control', label: 'Tactile control', detail: 'A single top dial keeps volume within easy reach.', x: 0.80, y: 0.20 },
      ]}
      onSelectionChange={({ variant, size, view, image }) => {
        // Connect the selected IDs and price to your own product flow.
        console.log(variant?.id, size?.id, size?.price, view.id, image.src);
      }}
      action={{ label: 'Explore the object', href: '/products/speaker' }}
    />
  );
}
03

Props

PropTypeDefaultDescription
titlestringRequiredThe visible section heading. Newlines preserve intentional line breaks; text can still wrap naturally. Use a suitable heading level for your page hierarchy when adapting the source.
imageProductSpotlightImageRequiredA fallback product image with src and meaningful alt. With no variants it is the main view. Transparent product images work especially well against the stage. Main images preserve their natural aspect ratio so normalized feature points stay aligned. After the image loads, its natural ratio constrains the actual image frame to the available desktop stage height; no letterboxing is added around hotspot coordinates.
featuresProductSpotlightFeature[]RequiredA list with unique id, label, detail, x, and y. Each point opens one compact description, without a repeated accordion. An empty list removes points and the detail strip.
features[].x / ynumberRequiredCoordinates from 0 to 1 measured from the complete main source image’s top-left corner. Values outside the range are clamped; non-finite values fall back to 0.5. Use equivalent compositions across finishes and keep points at least 44px apart at the smallest intended size. Points appear only in the main view.
productNamestring'OBJECT / 01'The compact product wordmark in the masthead. The selected model appears separately in the configuration summary.
productNumberstring'01'A short decorative collection number. It appears in the masthead index and as large background typography, hidden from assistive technology.
variantsProductSpotlightVariant[][]Finish options with unique id, label, CSS color, and image {src,alt}. The first is selected initially. Choosing a finish changes the main image and resets its view to Object. Removing a selected option falls back to the first available option without firing the callback.
variants[].viewsProductSpotlightView[][]Optional additional images of this finish, each with unique id, label, and image {src,alt}. The reserved main ID is automatically supplied for the main image. Only views belonging to the current finish are shown, so a detail never accidentally displays a different finish. Extra images use a 3:2 cover crop; supply suitable detail compositions.
sizesProductSpotlightSize[][]Model options with unique id, label, dimensions, and formatted price including currency. Selection updates the live summary. Dimensions and prices are supplied by you; changing a model does not distort or rescale the product image.
onSelectionChange(selection: ProductSpotlightSelection) => voidundefinedCalled in the finish, model, or view button’s event handler. Receives {variant,size,view,image}: current full option objects, a view with its ID, and the exact displayed image. Variant and size are null when their lists are empty. It never fires on initial mount or prop changes. Use it to connect your own cart, URL, pricing, or product flow.
eyebrowstring'AN OBJECT, CONSIDERED.'Short context in the masthead, such as a product family or collection.
descriptionstringundefinedOptional short introduction below the display heading. Keep it concise so the product stays prominent.
kickerstringundefinedOptional small label above the heading. Omitted entirely when not supplied.
notestringundefinedOptional compact line beneath the introduction. Hidden in compact containers to keep the product prominent.
action{ label: string; href: string }undefinedAn ordinary link to your product page, collection, or story. Selection does not alter its URL or perform a purchase. Connect onSelectionChange to your own application if the destination needs the chosen configuration.
classNamestring''Additional classes. Theme --ac-spotlight-surface, --ac-spotlight-ink, --ac-spotlight-muted, --ac-spotlight-line, and --ac-spotlight-accent on the root. Override --ac-spotlight-stage-height to set the desktop image stage; its wide-desktop default is clamp(480px, 32cqi, 640px), with a smaller height-based stage below 1150px component width. The stage keeps the product large on short desktop windows and may need normal page scrolling. The decorative number is bounded and clipped inside the product visual, above the configuration panel. Compact phone layouts use natural height. The composition is centered up to 1920px wide.
04

Motion & accessibility

Considered by default.

Finish swatches replace the product image. Image thumbnail buttons switch views belonging to that finish; changing finishes resets to the main view. Model buttons update dimensions, formatted price, and model name in a polite live summary. Native buttons support click, touch, Enter, and Space, with aria-pressed selection and visible keyboard focus. Image points expose one concise, politely announced detail; activating the selected point closes it. Feature points are hidden for alternate detail views. Options are stored by ID and derived from current props, so removing or replacing selected data safely falls back to the first option. Configuration callbacks run only in user event handlers. On small containers the product comes directly after the heading and the price/action row moves above the finish and model controls. A brief image fade and tiny vertical entrance disappear for reduced motion. MONO is an original fictional product study; the model dimensions and prices are illustrative, and the action opens a local design story. Supply your own images, product data, and destination.

Use semantic content and meaningful labels in your composition. Check contrast and keyboard behavior with your own styles and content.

05

Inspiration

The large product stage and compact configuration panel draw on Oakâme’s product experience. MONO is Anticraft’s original fictional design study, with its own renders and example product data.

Visit Oakâme product configurator

The component source and demo artwork are original to Anticraft UI. The linked site is the design or content reference.