Lucentive Labs
Lucentive Labs Docs
Core concepts

Specimens

The five tile kinds — imageCrop, palette, type, motion, layoutMock — each with a live rendered example.

A specimen is what an option looks like. It is the rendered content of a tile. There are exactly five kinds, and a Specimen is a discriminated union on kind, so the type system knows which fields each one needs.

Every example on this page is a real <Loupe /> rendering the specimen kind it documents. Lock a tile to see it flow into the composed preview.

imageCrop

A real <img> of a declared asset, framed to a normalized crop rectangle. This is the specimen for photographic and moodboard art direction — choosing which part of a board is the hero.

{
  kind: "imageCrop",
  asset: "board",                       // a key in config.assets
  crop: { x: 0, y: 0, w: 0.34, h: 1 },  // normalized 0..1 of the intrinsic image
  alt: "The left ridge of the valley",  // required — every crop is labelled
}

The asset must be declared in config.assets with its intrinsic pixel dimensions, because the crop engine needs them to fill the tile at any aspect ratio without letterboxing. The four crop numbers are fractions of that intrinsic image, top-left origin.

Live · imageCropSwitch the framing
The crop model
1 of 1 locked
01
Framing
Same source image, four normalized {x,y,w,h} rects. The chosen rect always fills the tile.

Build brief

The deterministic handoff for the next build pass. Stays in sync with your locked tiles.

The crop math is exact, not a CSS background-position approximation. It earns its own page: the crop model.

palette

A set of colors, rendered as swatches. Use it to decide a color system — which palette carries the brand, how restrained the accent is.

{
  kind: "palette",
  colors: ["#0c1a1c", "#11272b", "#8499ab", "#2fd4c4"],  // 1..8 colors
  over: "primary",  // optional: a backdrop asset the swatches sit over
}

With no over asset, the swatches render as a clean full-tile grid. With one, they sit as a row over a crop of that asset.

Live · paletteLock a palette
Palette specimen
1 of 1 locked
01
Palette
Each tile is a color set; the preview band shows the swatches.

Build brief

The deterministic handoff for the next build pass. Stays in sync with your locked tiles.

type

A real type specimen — an actual font family at an actual weight, rendering a sample string. Use it to decide a headline voice or a system's type personality.

{
  kind: "type",
  family: "Bricolage Grotesque, system-ui, sans-serif",  // any CSS font-family
  weight: 600,            // optional, 100..900
  sample: "Lucid futures, built.",
  kicker: "Display / Sans",  // optional small label above the sample
}

The family is rendered literally, so load the font in your app (or the artifact) for an exact specimen. The type group also supplies the composed preview's headline by default.

Live · typeLock a voice
Type specimen
1 of 1 locked
01
Type
Each tile renders a real family / weight / sample.

Build brief

The deterministic handoff for the next build pass. Stays in sync with your locked tiles.

motion

A motion feel, chosen from a fixed, safe preset enum — breathe, pan, or field. The presets are deliberately a closed set: an agent-authored config can pick a feel but cannot inject arbitrary CSS or scripts.

{
  kind: "motion",
  preset: "breathe",  // "breathe" | "pan" | "field"
  asset: "board",     // optional image the motion plays over
  crop: { x: 0, y: 0, w: 1, h: 1 },
  asset2: "board2",   // optional second image (used by "pan")
  crop2: { x: 0.1, y: 0, w: 0.9, h: 1 },
}

Asset-free, the presets render as motion-framed placeholders — the feel, not a photo. All presets honor prefers-reduced-motion.

Live · motionLock a feel (animations respect reduced-motion)
Motion specimen
1 of 1 locked
01
Motion
Presets are a fixed safe enum. Asset-free here, so they show the feel.

Build brief

The deterministic handoff for the next build pass. Stays in sync with your locked tiles.

layoutMock

A clean wireframe diagram of a layout rhythm, chosen from a plan enum — portrait, threshold, sparse, chapters, belowfold, stack. Use it to decide structure before any imagery exists: how the first screen opens, how a run is drawn, how dense a surface is.

{
  kind: "layoutMock",
  plan: "portrait",   // one of the six plans
  asset: "board",     // optional: fill a region of the mock with a real crop
  crop: { x: 0, y: 0, w: 0.31, h: 0.66 },
  asset2: "board2",   // optional second region (threshold / stack)
  crop2: { x: 0.25, y: 0.78, w: 0.38, h: 0.22 },
}

With no asset, the mock is a pure wireframe — perfect for locking layout rhythm with zero commitment to art. With assets, regions of the mock fill with real crops.

Live · layoutMockLock a layout
Layout-mock specimen
1 of 1 locked
01
Layout mock
Each plan renders a clean wireframe of a layout rhythm.

Build brief

The deterministic handoff for the next build pass. Stays in sync with your locked tiles.

At a glance

KindDecidesNeeds an asset?Key fields
imageCropwhich part of an image is the heroyesasset, crop, alt
palettethe color systemno (optional over)colors[]
typethe type voicenofamily, sample
motionthe motion feelno (optional)preset
layoutMockthe layout rhythmno (optional)plan

motion presets and layoutMock plans are fixed safe enums; the renderer never evaluates author-supplied CSS or scripts. All author and agent text is HTML-escaped, and image URLs pass a safeUrl allowlist (http(s) and relative only). See loupe-core.