Component Showcase

Layer Progress Indicator

A fixed left-side navigation component that tracks scroll position across all 12 MatterLayer product layers. The vertical track fills with colour as you scroll — spring-physics animated, colour-matched to the active layer.

Scroll to see it live

Anatomy

Five elements. One component.

Every part of the indicator is intentional. At rest it is invisible except for the dots. On hover it opens up to reveal the full navigation system.

12 layers
Matter
Capture
Billing
Document
Workflow
Email
People
Client
Compliance
Knowledge
Intake
Reporting

Behaviour

Specification

Every interaction, transition, and state is precisely specified. Nothing is left to chance.

VisibilityShown only while the #features section is in the viewport (IntersectionObserver, threshold 0.02)
Active detectionClosest layer midpoint to viewport 45% — updated on every scroll frame via requestAnimationFrame
Fill calculationscrollY mapped linearly from first-layer-top to last-layer-bottom, clamped 0–100%
Fill animationSpring physics — stiffness 120, damping 28, mass 0.6. Feels weighted, not mechanical.
Colour transitionActive layer colour transitions over 400ms ease-out. Gradient: activeColor 80% → 40% opacity.
Dot sizeInactive: 7px. Active: 11px. Transition: 250ms cubic-bezier(0.22, 1, 0.36, 1).
Dot glowActive: box-shadow 8px + 3px at 50% / 38% opacity. Hover: 6px at 31% opacity.
LabelsHidden at rest. Slide in (x: -6→0, opacity: 0→1) on parent hover with 18ms stagger per item.
Scroll targetClicking a dot smooth-scrolls to that layer's section with a 100px top offset.
ResponsiveHidden on screens below lg (1024px) — too narrow for a fixed left-side element.

Implementation

Key code

The fill logic and spring animation in ~30 lines. The rest is standard Framer Motion.

LayerProgressIndicator.tsx
// Fill percentage — maps scroll position to 0–100
const computeFill = useCallback(() => {
  const firstEl = document.getElementById(LAYERS[0].id);
  const lastEl  = document.getElementById(LAYERS[LAYERS.length - 1].id);
  if (!firstEl || !lastEl) return;

  const mid   = window.innerHeight * 0.45;
  const start = firstEl.getBoundingClientRect().top  + scrollY - mid;
  const end   = lastEl.getBoundingClientRect().bottom + scrollY - mid;

  const raw = (scrollY - start) / (end - start);
  setFillPct(Math.min(100, Math.max(0, raw * 100)));
}, []);

// Animated fill — spring-physics scaleY
<motion.div
  className="absolute top-0 left-0 right-0 rounded-full origin-top"
  animate={{
    scaleY: fillPct / 100,
    background: `linear-gradient(to bottom, ${activeColor}cc, ${activeColor}66)`,
  }}
  transition={{
    scaleY: { type: "spring", stiffness: 120, damping: 28, mass: 0.6 },
    background: { duration: 0.4, ease: "easeOut" },
  }}
  style={{ height: "100%" }}
/>

Live Demo

Scroll through all 12 layers

The indicator on the left is live. Watch the track fill as you scroll. Hover it to reveal layer names. Click any dot to jump directly to that layer.

01

Matter

Continuous risk scoring across every open matter. Surfaces anomalies before they become problems.

Layer 1 of 12
02

Capture

Automatic time capture from emails, documents, calls, and calendar events. Nothing falls through the cracks.

Layer 2 of 12
03

Billing

Smart billing recommendations, WIP analysis, and invoice drafting. Revenue leakage detected and closed.

Layer 3 of 12
04

Document

Document intelligence across every file in your DMS. Clauses extracted, obligations tracked, versions compared.

Layer 4 of 12
05

Workflow

Automated task sequences triggered by matter events. Deadlines calculated, reminders sent, blockers surfaced.

Layer 5 of 12
06

Email

Email triage, thread summarisation, and draft generation. Responses prepared, follow-ups scheduled.

Layer 6 of 12
07

People

Relationship intelligence across clients, counterparties, and referrers. Opportunities identified, conflicts flagged.

Layer 7 of 12
08

Client

Client portal updates, satisfaction signals, and communication logs. Every client relationship visible at a glance.

Layer 8 of 12
09

Compliance

Regulatory deadline tracking, trust accounting alerts, and CPD monitoring. Nothing missed, nothing late.

Layer 9 of 12
10

Knowledge

Precedent retrieval, know-how surfacing, and expertise mapping. The firm's collective knowledge, always accessible.

Layer 10 of 12
11

Intake

New matter intake, conflict checking, and engagement letter generation. From enquiry to open matter in minutes.

Layer 11 of 12
12

Reporting

Real-time dashboards, partner reports, and board packs. Every metric current, every trend visible.

Layer 12 of 12

See it in context

The layer progress indicator lives on the MatterLayer homepage, guiding visitors through the full product story as they scroll.