Focus Showcase
A vertical illustration gallery with a focused image and synchronized titles on either side.
Install the component, then paste your configured usage. Your settings are included in the code below.
Pro source comes with Arclen UI Pro. See plans
| Property | Type | Default |
|---|---|---|
imagesArtwork Bundled illustration-01 through illustration-06 keys or complete HTTPS image URLs. Empty restores the included collection. Minimum 0 itemsMaximum 12 itemsUp to 2048 characters per item | string-list | ["illustration-01","illustration-02","illustration-03","illustration-04","illustration-05","illustration-06"] |
titlesProject titles Minimum 0 itemsMaximum 12 itemsUp to 160 characters per item | string-list | ["Paper Garden","The Sunroom","Blue Days","Terracotta House","Harbour Light","Evening Bloom"] |
captionsProject subtitles Minimum 0 itemsMaximum 12 itemsUp to 160 characters per item | string-list | ["An oversized world in bloom","A quiet corner in colour","A small pause beside the pool","Steps toward a different view","A little room for the horizon","One last flower before night"] |
linksProject link URLs Minimum 0 itemsMaximum 12 itemsUp to 2048 characters per item | string-list | ["https://example.com/paper-garden","https://example.com/the-sunroom","https://example.com/blue-days","https://example.com/terracotta-house","https://example.com/harbour-light","https://example.com/evening-bloom"] |
imageWidthNominal image width 200–440Step 1 | number | 300 |
imageHeightNominal image height 140–320Step 1 | number | 200 |
gapItem gap 20–120Step 1 | number | 50 |
focusScaleFocused scale 1.05–1.5Step 0.05 | number | 1.3 |
inactiveScaleNeighbor scale 0.4–0.95Step 0.05 | number | 0.7 |
inactiveOpacityNeighbor opacity 0.15–0.8Step 0.05 | number | 0.4 |
radiusCorner radius 0–64Step 1 | number | 12 |
heightScroll viewport height 360–900Step 1 | number | 800 |
titleSizeTitle size 24–64Step 1 | number | 40 |
captionSizeSubtitle size 14–36Step 1 | number | 24 |
fontFamilyTitle font Options: component (Component default), system (System sans), serif (System serif) | select | "component" |
backgroundBackground | color | "#ffffff" |
textColorText color | color | "#121210" |
Focus Showcase
A vertical artwork stack with one image in focus. Desktop titles flank the focused image; narrow layouts place the active caption beneath it. Titles, captions and navigation follow the image nearest the center.
React
Copy this complete component directory into your project. React 19 and React DOM 19 are peer requirements. No additional runtime packages are needed. Inter is bundled under the SIL Open Font License 1.1; complete notices are in assets/fonts.
import {FocusShowcase} from './components/focus-showcase/src/react';
export default function Projects() {
return <FocusShowcase
titles={['Paper Garden', 'The Sunroom', 'Blue Days']}
captions={['An oversized world in bloom', 'A quiet corner in colour', 'A small pause beside the pool']}
images={['illustration-01', 'illustration-02', 'illustration-03']}
links={['https://example.com/paper-garden', 'https://example.com/the-sunroom', 'https://example.com/blue-days']}
/>;
}JavaScript
import {mount, defaults} from './components/focus-showcase/src/core';
import './components/focus-showcase/src/styles.css';
const host = document.querySelector<HTMLElement>('#projects')!;
const gallery = mount(host, {radius: 6});
gallery.update({gap: 80, titleSize: 48});
gallery.pause();
gallery.resume();
gallery.update({...defaults});
// Before removing the host:
gallery.destroy();render(settings, id) returns server HTML with the first focused state populated. mount owns its host’s children. Use a unique ID per server-rendered instance; the React adapter handles IDs automatically. update merges partial values, and passing defaults restores all manifest defaults. Invalid types, unknown keys, unsafe URLs and values outside bounds throw TypeError before modifying the instance.
Artwork and layout
Bundled artwork keys are illustration-01 through illustration-06. Custom artwork and destinations must use complete HTTPS URLs without credentials. Lists support twelve items. Empty lists restore local defaults. Short companion lists use the corresponding built-in entries. An empty individual link hides the project link. Replace example.com destinations before publishing.
Below 768px, items shrink to their image’s natural width at the configured height, capped by imageWidth. The active caption can enlarge that item. Each picture is 32px narrower than its item. Wider layouts retain the configured nominal image width. At the defaults, the desktop vertical stride is 250px; focused media is 390 × 260px on a sufficiently wide screen.
The gallery fills a bounded parent. Its first item has a deliberate offset below the scroll viewport midpoint. Desktop captions stay at the midpoint; narrow screens place the active caption below its image. Navigation and a small destination link appear on hover or keyboard focus.
imageWidth and imageHeight are nominal dimensions before scaling. gap separates nominal item boxes. focusScale, inactiveScale and inactiveOpacity control the focused and neighboring states. height sets the scroll viewport with proportional adjustments on narrow layouts. Below 1024px, the inline title and subtitle each display at most two lines, with overflow clipped, so long copy cannot displace the selected project. Full titles remain in the artwork’s accessible name and live announcement; full subtitle text remains in the markup. Edge cropping of neighboring artwork is deliberate.
Navigation and motion
Scroll or swipe over the artwork; mouse dragging also changes the sequence. Previous/next and project selectors navigate to an image. Up/down arrows, Page Up/Page Down and Home/End work while focus is inside the gallery. Destination links retain normal keyboard activation. Navigation stops at the first and last project. A polite live region announces the active title, and keyboard focus is visible.
Image states ease over 400ms and respond to mouse hover at 1.05×. Captions enter over 300ms: desktop text approaches from opposite 20px horizontal offsets, while narrow captions rise 10px. Native animations restart from the visible pose and cancel during updates, pause or destruction.
Motion is manual and event driven, with no autoplay or idle animation loop. One animation-frame callback batches each scroll update. Pause, offscreen observation and reduced motion stop smooth navigation and make subsequent button navigation immediate. Direct manual scrolling remains usable; resume keeps the current position. The React paused prop applies the same policy. Destroy removes owned listeners, observers and pending callbacks. Failed custom images switch once to bundled artwork. Without JavaScript the first image and project link remain available, and native scrolling displays the sequence.
Settings
The settings table is generated from the component manifest.
The preview runs the component’s own JavaScript. It respects reduced motion and pauses when off screen. The HTML bundle includes a poster fallback.
Every setting in this panel comes from the component manifest. Preview size, pause and replay stay in the inspector.