Free & open source, built for every frontend stack. Star Exhuma on GitHub
ExhumaBeta
DocsComponentsBlog

Getting Started

  • Introduction
  • Installation
  • Theming & Dark Mode
  • CLI Reference

Architecture

  • Kinetic Methodology
  • Ecosystem Contracts
  • Lifecycle & Memory Safety

Components

  • All Components20
Cards8
  • Stacking Cards
  • Horizontal Scroller
  • Tilt Card
  • Spotlight Card
  • Border Beam
  • Card Swipe Stack
  • Comparison Slider
  • Expandable Card
Layouts6
  • CSS Masonry
  • Row Masonry
  • Auto Grid
  • Infinite Marquee
  • Bento Grid
  • Diamond Grid
Navigation2
  • Morphing Tabs
  • Floating Dock
Primitives4
  • Accordion
  • Number Ticker
  • Magnetic Button
  • Cursor Tooltip
// DOCS·Components·Cards

Horizontal Scroller

Pinned kinetic viewport camera that seamlessly translates horizontal cards in 1:1 synchronization with vertical page scroll (Brix Agency architecture).

Target Environment
+
+
CLI Installation
React
$pnpm dlxexhumaaddhorizontal-scroller--flavor=react
// 01·Workbench

Interactive Specification & Studio

cards
Preset:
Viewport
Fluid 100%
VERTICAL SCROLL → HORIZONTAL RAIL↓
Brix-Engineered Rail

Digital Solutions Suite

120 FPS Pinned Camera
01DESIGN
STAGE // 01

Web Design & UI

High-conversion visual interfaces engineered to command attention.

Explore→
02DEV
STAGE // 02

Kinetic Engineering

120 FPS transitions, zero layout thrashing, and sub-pixel compositing.

Explore→
03BRAND
STAGE // 03

Brand Strategy

Distinct typography and positioning frameworks that scale.

Explore→
04SCALE
STAGE // 04

Conversion Scale

Data-driven landing pages and behavioral experimentation.

Explore→
05AI
STAGE // 05

AI Workflows

Intelligent automation pipelines built for high leverage.

Explore→
0%
Traversal Complete • Normal Scroll Resumed

Next Milestone: Product Delivery & Scale

Once horizontal card translation reaches 100%, the pinned camera seamlessly releases and natural vertical scrolling resumes.

Performance
120 FPS

Zero layout thrashing

Compositor
GPU Rail

Hardware acceleration

Exit Behavior
Seamless

Natural scroll unpin

Parameters
9 Props
// 02·Usage

Quick Start & Consumer Example

Copy-paste ready implementation for React (.tsx). Automatically updates when you modify parameters in the Workbench above.

+
+
App.tsx
React (.tsx)
import React from 'react';
import { HorizontalScroller } from './components/ui/HorizontalScroller';

const SERVICES = [
  { num: '01', category: 'DESIGN', title: 'Web Design & Concept', desc: 'Crafting intuitive digital experiences that convert.', cta: 'Explore web design', badge: 'PROTOTYPING' },
  { num: '02', category: 'ENGINEERING', title: 'Development & Motion', desc: '120 FPS kinetic transitions and zero layout thrash.', cta: 'Explore development', badge: '120 FPS' },
  { num: '03', category: 'IDENTITY', title: 'Brand Strategy', desc: 'Distinct typography and strategic positioning.', cta: 'Explore branding', badge: 'STRATEGY' },
  { num: '04', category: 'GROWTH', title: 'Conversion Optimization', desc: 'Data-driven landing pages and experimentation.', cta: 'Explore growth', badge: 'ANALYTICS' },
];

export default function App() {
  return (
    <div className="min-h-[200vh] bg-background text-foreground py-20">
      <div className="max-w-6xl mx-auto px-6 mb-12">
        <h1 className="text-4xl font-bold">Featured Capabilities</h1>
      </div>

      <HorizontalScroller
        speed={1}
        itemGap={28}
        cardWidth={320}
        showProgress={true}
        showFadeEdges={true}
        fadeWidth={48}
        fadeEdgeColor="#ffffff"
        fadeEdgeColorDark="#09090b"
        mobileMode="scroll"
      >
        {SERVICES.map((s, idx) => (
          <div key={idx} className="flex flex-col md:flex-row h-full rounded-2xl border border-border bg-card p-6 min-h-[360px]">
            <div className="flex-1 flex flex-col justify-between pr-4">
              <div>
                <span className="font-mono text-xs text-emerald-500 font-bold">{s.num} / {s.category}</span>
                <h3 className="text-2xl font-bold mt-2">{s.title}</h3>
                <p className="text-muted-foreground text-sm mt-2">{s.desc}</p>
              </div>
              <span className="text-xs font-semibold mt-4 text-foreground hover:text-emerald-400 cursor-pointer">{s.cta} &rarr;</span>
            </div>
            <div className="w-full md:w-1/2 bg-muted/20 rounded-xl p-4 flex items-center justify-center font-mono text-xs text-muted-foreground">
              {s.badge} // EKM RAIL
            </div>
          </div>
        ))}
      </HorizontalScroller>
    </div>
  );
}
// 03·API Contract

Props & Configuration

Exhaustive parameter contract for Horizontal Scroller. Validated in the live Studio workbench above and statically checked across all 13 ecosystem templates.

PropTypeDefaultDescription
itemGap
number28Spacing in pixels between horizontal cards (default: 28px).
speed
number1Scroll distance multiplier mapping vertical page scroll to horizontal translation distance.
cardWidth
number320Fixed card width in pixels (default: 320px).
showProgress
booleantrueDisplay a kinetic telemetry progress bar indicating track traversal percentage.
showFadeEdges
booleantrueShow subtle gradient mask at horizontal boundaries for graceful card entry and exit.
fadeWidth
number48Width in pixels of the left and right gradient fade masks.
fadeEdgeColor
color#ffffffCustom edge gradient color. When empty, an alpha mask is used.
fadeEdgeColorDark
color#09090bEdge gradient color when dark mode is active. Falls back to fadeEdgeColor.
mobileMode
selectscrollMobile fallback behavior below 768px (scroll = native touch swipe with snap, stack = vertical list, pinned = retain pinned rail).
itemGap
number

Spacing in pixels between horizontal cards (default: 28px).

Default:28
speed
number

Scroll distance multiplier mapping vertical page scroll to horizontal translation distance.

Default:1
cardWidth
number

Fixed card width in pixels (default: 320px).

Default:320
showProgress
boolean

Display a kinetic telemetry progress bar indicating track traversal percentage.

Default:true
showFadeEdges
boolean

Show subtle gradient mask at horizontal boundaries for graceful card entry and exit.

Default:true
fadeWidth
number

Width in pixels of the left and right gradient fade masks.

Default:48
fadeEdgeColor
color

Custom edge gradient color. When empty, an alpha mask is used.

Default:#ffffff
fadeEdgeColorDark
color

Edge gradient color when dark mode is active. Falls back to fadeEdgeColor.

Default:#09090b
mobileMode
select

Mobile fallback behavior below 768px (scroll = native touch swipe with snap, stack = vertical list, pinned = retain pinned rail).

Default:scroll
// 04·Source Code

Component Source

Component source definition for React (.tsx). Toggle between the clean wrapper and the standalone ejected engine micro-kernel.

+
+
HorizontalScroller.tsx
import * as React from 'react';
import * as HorizontalScrollerPrimitive from '@exhuma/core';
import { clsx } from 'clsx';

export interface HorizontalScrollerProps extends React.ComponentPropsWithoutRef<typeof HorizontalScrollerPrimitive.HorizontalScroller> {
  className?: string;
}

export const HorizontalScroller = React.forwardRef<HTMLDivElement, HorizontalScrollerProps>(
  ({ className, children, ...props }, ref) => (
    <HorizontalScrollerPrimitive.HorizontalScroller
      ref={ref}
      className={clsx(
        'relative overflow-hidden w-full py-8',
        className
      )}
      {...props}
    >
      {children}
    </HorizontalScrollerPrimitive.HorizontalScroller>
  )
);
HorizontalScroller.displayName = 'HorizontalScroller';
// 05·Architecture

Lifecycle Safety & Performance

Engineered for high-frequency user interactions with zero memory leaks.

Teardown

Deterministic Cleanup

All pointer event listeners, scroll handlers, and resize observers are cleanly destroyed on component unmount, preventing lingering background processes.
Compositor

GPU Compositor Acceleration

Transform and opacity modifications run directly on the GPU compositor thread using will-change: transform without triggering browser layout recalculations.
// 06·a11y

Accessibility Considerations

Fully compliant with WCAG guidelines and respects user motion preferences.

Motion

prefers-reduced-motion Support

When a user has prefers-reduced-motion: reduce enabled in their operating system, Exhuma components automatically disable 3D gyroscope tilt and spring animations, rendering static accessible content.
Stacking CardsTilt Card