first-commit
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
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
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* 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;
|
||||
Reference in New Issue
Block a user