SearchCtrlK

  • ↑↓navigate
  • ↵open
  • escclose

Can’t find it? Contact us

CaseStudy

A case study as one full-bleed scene.

01 / 03Harbour LineRiver ferries · 2025 · 14 weeks

A ferry that tells you the tram will wait

Problem
Riders changing from ferry to tram missed one connection in five.
What we built
One timetable service behind the pier boards, the rider app and tram dispatch.
Result
−31%missed connections over the first winter
View code
tsx
<CaseStudy
	index="01 / 03"
	client="Harbour Line"
	meta="River ferries · 2025 · 14 weeks"
	title="A ferry that tells you the tram will wait"
	scene={<DeparturesBoard />}
	sceneLabel="The pier 3 board: the 08:22 to Hoboken reads “Tram 4 waits 3 min”"
	plate="#0d1b2e"
	problem="Riders changing from ferry to tram missed one connection in five."
	built="One timetable service behind the pier boards, the rider app and tram dispatch."
	result={{ value: "−31%", label: "missed connections over the first winter" }}
/>

Demo landings

Whole pages built only from @sdxc/ui, each for an invented product with its own palette and type. They open in a new tab.

Every demo, landings and docs sites alike, is listed in the demo gallery.

Installation

An ordinary dependency: install it, import the theme once, and import the component where it is used.

Terminal
npm add @sdxc/ui remix
typescript
import "@sdxc/ui/theme.css";

Usage

typescript
import { CaseStudy } from "@sdxc/ui/landing";

Renders the running head, the edge-to-edge plate and the spread: one column on a phone, then from the lg container twelve, the first three a margin beside the title and the facts. Server markup and CSS alone; --ui-landing-case-figure-size resizes the result's figure.

Props

Read from the component's own types, so every prop, every default and every allowed value is listed.

PropTypeRequiredDescription
indexRemixNodeNoThe project's place in the sequence, such as "01", set first in the running head.
clientRemixNodeYesWho the work was for.
metaRemixNodeNoSector, year or discipline, set after the client in the running head.
titleRemixNodeYesThe spread's headline, at chapter display size through the ambient heading depth.
sceneRemixNodeYesThe scene: inline SVG or drawn UI, stretched to fill the plate.
sceneLabelstringYesWhat the scene shows, read as the plate's accessible name.
platestringNoThe plate's fill behind the scene. Defaults to the tinted neutral.
problemRemixNodeYesWhat stood in the client's way.
builtRemixNodeYesThe work, as delivered.
resultResultYesThe measured outcome.
labelsLabelsNoColumn labels; English by default.

Also accepts everything in Omit<LandingSection.Props, "children" | "title" | "align">.

@sdxc/ui

Can’t find it? Contact us