a46764fb1b
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
refresh-contributors-wall / Refresh contributors wall cache bust (push) Waiting to run
129 lines
3.8 KiB
TypeScript
129 lines
3.8 KiB
TypeScript
/**
|
|
* open-design-landing-deck — input schema.
|
|
*
|
|
* Sister skill to `open-design-landing`. Produces a single-file slide
|
|
* deck (horizontal swipe pagination, magazine-style) in the Atelier
|
|
* Zero visual language, reusing the same `styles.css` + the same
|
|
* 16-slot image library.
|
|
*
|
|
* The schema is intentionally smaller than the landing page schema:
|
|
* a deck is an ordered array of typed slides, each driving one
|
|
* viewport-height/width frame. Brand identity is shared across slides.
|
|
*/
|
|
|
|
import type { MixedText, BrandBlock, ImageryConfig } from '../open-design-landing/schema';
|
|
|
|
export type { MixedText, BrandBlock, ImageryConfig };
|
|
|
|
/* ---------- slide variants ---------- */
|
|
|
|
/** Cover slide — title plate at the start of the deck. */
|
|
export interface CoverSlide {
|
|
kind: 'cover';
|
|
/** Eyebrow above the title — `'Open Design · Vol. 01'`. */
|
|
eyebrow: string;
|
|
/** Display title; encoded as `MixedText` for italic-serif rhythm. */
|
|
title: MixedText;
|
|
/** Optional sub-title under the title. */
|
|
subtitle?: string;
|
|
/** Lead paragraph below the title. */
|
|
lead: string;
|
|
/** Optional image slot id (`hero` | `cta` | …) from `image-manifest.json`. */
|
|
image_slot?: string;
|
|
/** Bottom-left meta line — date / location / coords. */
|
|
meta?: string;
|
|
}
|
|
|
|
/** Section divider — Roman numeral plate between chapters. */
|
|
export interface SectionSlide {
|
|
kind: 'section';
|
|
roman: string;
|
|
/** Section title; rendered huge with italic-serif emphasis. */
|
|
title: MixedText;
|
|
/** Optional one-line description under the title. */
|
|
lead?: string;
|
|
}
|
|
|
|
/** Content slide — eyebrow + title + body (+ optional bullets + image). */
|
|
export interface ContentSlide {
|
|
kind: 'content';
|
|
eyebrow?: string;
|
|
title: MixedText;
|
|
/** Body paragraph; can include `<code>` raw HTML. */
|
|
body?: string;
|
|
/** Optional bullet list. */
|
|
bullets?: string[];
|
|
/** Optional image slot id from `image-manifest.json`. */
|
|
image_slot?: string;
|
|
/** Layout: `left` puts copy left of art, `right` flips it, `full` centers. */
|
|
layout?: 'left' | 'right' | 'full';
|
|
}
|
|
|
|
/** Stats slide — eyebrow + title + 3-4 large stat rings. */
|
|
export interface StatsSlide {
|
|
kind: 'stats';
|
|
eyebrow?: string;
|
|
title: MixedText;
|
|
stats: { value: string; label: string; sub?: string }[];
|
|
/** Caption under the stat row. */
|
|
caption?: string;
|
|
}
|
|
|
|
/** Quote slide — full-bleed pull quote. */
|
|
export interface QuoteSlide {
|
|
kind: 'quote';
|
|
quote: MixedText;
|
|
author: { initial: string; name: string; title: string };
|
|
/** Optional image slot for the right-side portrait. */
|
|
image_slot?: string;
|
|
}
|
|
|
|
/** CTA slide — closing pitch with primary action. */
|
|
export interface CTASlide {
|
|
kind: 'cta';
|
|
eyebrow?: string;
|
|
title: MixedText;
|
|
body?: string;
|
|
primary: { label: string; href: string };
|
|
/** Optional secondary action. */
|
|
secondary?: { label: string; href: string };
|
|
}
|
|
|
|
/** End slide — huge italic kicker word and footer signature. */
|
|
export interface EndSlide {
|
|
kind: 'end';
|
|
/** The huge kicker — `'Open Design.'`. */
|
|
mega: MixedText;
|
|
/** Footer text under the kicker — `'Apache-2.0 · MMXXVI · Berlin'`. */
|
|
footer?: string;
|
|
}
|
|
|
|
export type Slide =
|
|
| CoverSlide
|
|
| SectionSlide
|
|
| ContentSlide
|
|
| StatsSlide
|
|
| QuoteSlide
|
|
| CTASlide
|
|
| EndSlide;
|
|
|
|
/* ---------- top-level ---------- */
|
|
|
|
export interface OpenDesignLandingDeckInputs {
|
|
$schema?: string;
|
|
brand: BrandBlock;
|
|
/** Deck-wide title shown in the HUD — `'Open Design · Vol. 01'`. */
|
|
deck_title: string;
|
|
slides: Slide[];
|
|
imagery: ImageryConfig;
|
|
}
|
|
|
|
/**
|
|
* @deprecated Use `OpenDesignLandingDeckInputs`.
|
|
*
|
|
* Backwards-compat alias kept for the v0.3.x line and removed in the next
|
|
* minor (v0.4.0). Migration steps live in `README.md` under
|
|
* "Migrating from `editorial-collage-deck`".
|
|
*/
|
|
export type EditorialCollageDeckInputs = OpenDesignLandingDeckInputs;
|