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

This commit is contained in:
Zakaria
2026-05-04 14:58:14 -04:00
commit a46764fb1b
1210 changed files with 233231 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
# open-design-landing-deck
Sister skill to [`open-design-landing`](../open-design-landing/).
Produces a single-file slide deck in the **Atelier Zero** design
language — warm-paper background, italic-serif emphasis, coral
terminating dots, surreal collage plates — paginated as a horizontal
magazine swipe deck (←/→ · wheel · touch · ESC overview), the same
nav model as [`guizang-ppt`](../guizang-ppt/).
> **Read first** — agent contract, schema, and self-check live in
> [`SKILL.md`](./SKILL.md). This README is the human quick-start.
## 30-second tour
```bash
# 1. Compose the worked example.
npx tsx scripts/compose.ts inputs.example.json example.html
# 2. Open it.
open example.html
```
The deck assumes 16 collage assets at `../open-design-landing/assets/`
(the sister skill ships them). Use ←/→ · Space · PageUp/PageDown ·
Home/End to navigate, ESC for the overview grid.
## What you get
- N viewport-sized slides (the worked example has 11) laid out
horizontally on a `transform: translateX(...)` flex track.
- Per-slide chrome strip (top + bottom): brand mark · deck title ·
location · live `NN / TT` counter.
- Coral progress bar at the bottom that fills as you advance.
- Dot indicator near the bottom (click to jump).
- ESC overview grid with scaled thumbnails.
- 7 slide kinds: `cover`, `section`, `content`, `stats`, `quote`,
`cta`, `end`. Mix freely.
- Same 16-slot image library as the landing-page sister skill —
no extra prompting or rendering.
## Files
```text
skills/open-design-landing-deck/
├── SKILL.md # ← agent contract (read this first)
├── README.md # ← you are here
├── schema.ts # typed slide variants + brand block (re-exports from sister)
├── inputs.example.json # Open Design 11-slide pitch deck
├── example.html # canonical rendering
└── scripts/
└── compose.ts # inputs.json + sister styles.css → index.html
```
## Authoring a deck
1. Copy `inputs.example.json` to your project as `inputs.json`.
2. Edit `brand` (or copy from a sister-skill `inputs.json` you already have).
3. Set `deck_title` (the kicker shown in the chrome strip).
4. Build the `slides` array. Each entry is one of seven kinds — see
[`schema.ts`](./schema.ts) for the full type. A typical pitch:
```text
1. cover — title plate
2. section — chapter divider
3-5. content — manifesto, capabilities, method
6. stats — the numbers
7. section — chapter divider
8. content — selected work
9. quote — customer testimonial
10. cta — primary action
11. end — kicker word
```
5. Run the composer:
```bash
npx tsx scripts/compose.ts inputs.json out/index.html
```
## Image strategy
The deck inherits the sister skill's 16-slot image library. Set
`inputs.imagery.assets_path` to wherever those PNGs live; the example
uses `'../open-design-landing/assets/'`.
To regenerate or stub:
```bash
# Generate via gpt-image-2 (fal.ai)
FAL_KEY=fal-... npx tsx ../open-design-landing/scripts/imagegen.ts \
../open-design-landing/inputs.example.json \
--out=../open-design-landing/assets/
# Or paper-textured SVG placeholders
npx tsx ../open-design-landing/scripts/placeholder.ts ../open-design-landing/assets/
```
## Migrating from `editorial-collage-deck`
This skill replaces the older `editorial-collage-deck` skill. The renames
are mechanical:
| Old | New |
| --- | --- |
| skill folder `editorial-collage-deck/` | `open-design-landing-deck/` |
| shared assets `../editorial-collage/assets/` | `../open-design-landing/assets/` |
| TS type `EditorialCollageDeckInputs` | `OpenDesignLandingDeckInputs` |
The `EditorialCollageDeckInputs` alias re-exported from
[`schema.ts`](./schema.ts) is a temporary bridge: it is kept for the
**v0.3.x** line and removed in the next minor release (**v0.4.0**).
Update imports before then.
## See also
- [`open-design-landing`](../open-design-landing/) — landing page sister skill.
- [`guizang-ppt`](../guizang-ppt/) — the magazine-deck navigation pattern this skill borrows.
- [`design-systems/atelier-zero/DESIGN.md`](../../design-systems/atelier-zero/DESIGN.md) — design tokens.
+222
View File
@@ -0,0 +1,222 @@
---
name: open-design-landing-deck
description: >
Produce a single-file slide deck in the Atelier Zero visual language
(warm-paper background, italic-serif emphasis spans, coral terminating
dots, surreal collage plates) — Open Design's brand deck recipe.
The deck uses **horizontal magazine-style swipe pagination** (←/→,
wheel, swipe), a per-slide chrome strip with brand mark and slide
counter, an ESC overview grid, a coral progress bar, and inherits
the canonical stylesheet + 16-slot image library from the sister
`open-design-landing` skill.
triggers:
- slide deck
- 演示文稿
- pitch deck
- keynote
- editorial slides
- atelier zero deck
- open design deck
- open design landing deck
od:
category: brand-deck
surface: web
mode: deck
scenario: marketing
featured: 2
audience: founders pitching, conference talks, internal reviews
tone: editorial, restrained, premium
scale: 6-15 viewport-locked slides
preview:
type: html
entry: index.html
craft:
requires:
- typographic-rhythm
- pixel-discipline
inputs:
- id: brand
label: Brand identity (shared across slides)
schema_path: ./schema.ts#BrandBlock
- id: deck_title
label: Kicker shown in the per-slide top chrome
description: e.g. `'Open Design · Vol. 01 / Issue Nº 26'`.
- id: slides
label: Ordered list of typed slides
description: >
Each entry is one of seven slide kinds. Mix and match freely; the
composer routes each by `kind`.
schema_path: ./schema.ts#Slide
- id: imagery
label: Image library (defaults to sister skill's assets)
schema_path: ../open-design-landing/schema.ts#ImageryConfig
parameters:
slides_recommended_count:
type: number
default: 11
description: 8-15 is the sweet spot. Below 6 the deck feels thin; above 18 attendees lose the thread.
outputs:
- path: <out>/index.html
description: Self-contained HTML deck — Atelier Zero CSS inlined, runtime script inline, images relative.
capabilities_required:
- file-write
- node-runtime
example_prompt: |
Build me an 11-slide pitch deck for "Lumen Field", a focus-soundscape
studio. Cover with hero plate, two section dividers, two product
content slides with bullets, a stats slide showing 12 soundscapes / 4
presets / 1 daily ritual, a customer quote, a closing CTA, and an end
card. Reuse the open-design-landing image library.
---
# open-design-landing-deck
Sister skill to [`open-design-landing`](../open-design-landing/). Same
Atelier Zero visual system (warm paper, Inter Tight + Playfair Display,
italic-serif emphasis, coral dots), but paginated as a **horizontal
magazine-style swipe deck** instead of a long scrolling page.
The navigation model is intentionally borrowed from the
[`guizang-ppt`](../guizang-ppt/) skill — `←/→` arrow keys, wheel /
swipe, ESC for the overview grid — so it feels like a print magazine
flipping page by page rather than a web slide deck scrolling.
```text
inputs.json + ../open-design-landing/styles.css
└──────────► scripts/compose.ts
<out>/index.html
(one viewport per slide, horizontal swipe)
```
## What you get
- A single self-contained HTML file with N viewport-sized slides laid
out horizontally on one transformed flex track.
- **Keyboard navigation**: `←/→` · `↑/↓` · PageUp/PageDown · Space ·
Home/End.
- **Wheel + touch swipe** (with momentum guard so a single trackpad
flick doesn't overshoot).
- **Per-slide chrome strip**: brand mark, deck title, location,
Roman-numeral year, live slide counter (`01 / 11`).
- **Coral progress bar** at the bottom that fills as you advance.
- **Dot indicator** strip near the bottom; click any dot to jump.
- **ESC overview grid** — scaled thumbnails of every slide, click to
jump. Mirrors `guizang-ppt`'s overview UX.
- Reuses the **same 16-slot image library** as the sister skill — no
duplicate assets.
## Slide types
| Kind | Use it for |
| :---------- | :------------------------------------------------------------ |
| `cover` | Title plate at the start. 2-column copy + collage art. |
| `section` | Roman-numeral divider between chapters. Centered, full-bleed. |
| `content` | Eyebrow + title + body + bullets + optional collage art. |
| `stats` | Up to 4 large stat cells (value · label · sub-label). |
| `quote` | Pull quote + author. Optional portrait collage on the right. |
| `cta` | Closing pitch + 1-2 buttons. |
| `end` | Mega italic-serif kicker word + signature footer. |
A typical 11-slide pitch:
```
1. cover — title plate, hero collage
2. section — "I. The problem"
3. content — about / manifesto, bullets
4. content — capabilities, bullets
5. stats — 4 numbers
6. section — "II. How it feels"
7. content — method, bullets
8. content — selected work
9. quote — customer testimonial
10. cta — primary + secondary action
11. end — mega kicker + signature
```
## Workflow
### 1. Author `inputs.json`
Start from [`inputs.example.json`](./inputs.example.json) (the Open
Design pitch deck). The brand block, image strategy, and assets path
mirror the sister skill — if you already filled out an
`open-design-landing` brief, copy `brand` and `imagery` over verbatim.
For each slide, pick a `kind` and fill the typed fields from
[`schema.ts`](./schema.ts). `MixedText` (sans-serif baseline +
italic-serif emphasis spans + coral terminating dot) is the same
encoding used by the sister skill — see its `inputs.example.json`.
### 2. (Optional) generate or stub imagery
This skill does **not** ship its own image generator or placeholder
script — it shares the 16-slot library from `open-design-landing`. To
regenerate or stub:
```bash
# generate via gpt-image-2 (fal.ai)
FAL_KEY=... npx tsx ../open-design-landing/scripts/imagegen.ts ../open-design-landing/inputs.example.json --out=../open-design-landing/assets/
# or paper-textured SVG placeholders
npx tsx ../open-design-landing/scripts/placeholder.ts ../open-design-landing/assets/
```
Set your deck's `inputs.imagery.assets_path` to wherever those PNGs
live (default in the example: `../open-design-landing/assets/`).
### 3. Compose the deck
```bash
npx tsx scripts/compose.ts inputs.json out/index.html
```
The composer reads `inputs.json`, loads the canonical Atelier Zero
stylesheet from `../open-design-landing/styles.css`, layers
deck-specific rules on top (horizontal flex track, slide layouts,
HUD, dot nav, ESC overview, keyboard / wheel / touch handlers), and
writes one self-contained HTML file.
### 4. Self-check
- [ ] Open the HTML in a fresh browser tab; slide 1 (cover) shows
with chrome strip top-right showing `01 / N`.
- [ ] Press `→` (or Space, or scroll-down). Smoothly slides one
viewport to the right; dot nav advances; the coral progress bar
ticks forward.
- [ ] Press `End`. Jumps to the final slide.
- [ ] Press `Home`. Returns to slide 1.
- [ ] Press `Esc`. Overview grid appears with scaled thumbnails;
click any tile to jump and dismiss the overview.
- [ ] Resize to 1080px and 640px. Cover / content slides collapse to
a single column; dot nav still works; chrome strips shrink.
- [ ] `prefers-reduced-motion: reduce` (DevTools → Rendering): page
transitions stay snappy and don't induce motion sickness.
- [ ] Lighthouse: contrast AA, font-display swap, no layout shift.
## Boundaries
- **Reuse the sister skill's stylesheet.** The composer reads
`../open-design-landing/styles.css` at compile time. Do not
maintain a duplicate copy here; if Atelier Zero tokens evolve, edit
them once in the sister skill.
- **Reuse the sister skill's image library.** No need to re-prompt or
re-render — the same 16 plates work for both surfaces.
- **Keep slides single-viewport.** If a slide's content does not fit
100vh × 100vw at 1280×800 it will overflow and feel cramped. Trim
copy or split into two slides.
- **Do not switch to vertical scroll-snap.** The horizontal swipe
posture is what makes this skill feel like a magazine spread; a
vertical scroller would just be a long landing page.
- **Do not add a router.** This is a single-file artifact. Multi-page
decks are out of scope; for a multi-deck experience, render each
deck separately and link from a parent index.
## See also
- [`open-design-landing`](../open-design-landing/) — landing page sister skill.
- [`guizang-ppt`](../guizang-ppt/) — the magazine-deck navigation
pattern this skill borrows.
- [`design-systems/atelier-zero/DESIGN.md`](../../design-systems/atelier-zero/DESIGN.md) — token spec.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,210 @@
{
"$schema": "./schema.ts",
"_doc": "Worked example — Open Design pitch deck. 11 slides covering cover, two sections, four content slides, one stats, one quote, one CTA, one end. Reuses brand identity and assets from the sister open-design-landing skill. Run `npx tsx scripts/compose.ts inputs.example.json example.html` to build.",
"brand": {
"name": "Open Design",
"mark": "Ø",
"meta": { "title": "Studio Nº 01", "subtitle": "Berlin / Open / Earth" },
"filed_under": "Design · Intelligence",
"tagline": "Designing intelligence with skills, taste, and your own agent.",
"description": "Open Design pitch deck — Vol. 01.",
"locale": "en",
"edition": "Vol. 01 / Issue Nº 26",
"version": "v0.3.0",
"license": "Apache-2.0",
"primary_url": "https://github.com/nexu-io/open-design",
"primary_url_label": "Star · 0K",
"contact_email": "https://github.com/nexu-io/open-design/issues",
"location": "Berlin / Open / Earth",
"coordinates": "52.5200° N · 13.4050° E",
"year": "2026",
"year_roman": "MMXXVI",
"founded": "Est. MMXXVI",
"rails": { "right": "", "left": "" },
"languages": ["EN"],
"status": "Live · v0.3.0"
},
"deck_title": "Open Design · Vol. 01 / Issue Nº 26",
"slides": [
{
"kind": "cover",
"eyebrow": "Open-source design studio · Nº 01",
"title": [
{ "text": "Designing " },
{ "text": "intelligence", "em": true },
{ "text": " with skills, " },
{ "text": "taste,", "em": true },
{ "text": " and " },
{ "text": "code", "em": true },
{ "text": ".", "dot": true }
],
"subtitle": "The open-source alternative to Anthropic's Claude Design.",
"lead": "12 coding agents drive 31 composable skills and 72 brand-grade design systems. Local-first, web-deployable, BYOK at every layer.",
"image_slot": "hero",
"meta": "Berlin · MMXXVI · 52.5200° N · 13.4050° E"
},
{
"kind": "section",
"roman": "I.",
"title": [
{ "text": "Why " },
{ "text": "another", "em": true },
{ "text": " design tool" },
{ "text": "?", "dot": true }
],
"lead": "Because the strongest agents already live on your laptop — and they deserve a real workflow."
},
{
"kind": "content",
"layout": "right",
"eyebrow": "About the studio · Nº 02",
"title": [
{ "text": "We treat " },
{ "text": "your agent", "em": true },
{ "text": " as a creative " },
{ "text": "collaborator", "em": true },
{ "text": ".", "dot": true }
],
"body": "We don't ship one — we wire whichever you trust into a skill-driven design workflow that runs locally with <code>pnpm tools-dev</code>, deploys to Vercel, and stays BYOK at every layer.",
"bullets": [
"Files, not opaque prompts — every skill is a folder of Markdown.",
"Deterministic visual directions, not random generation.",
"Sandboxed iframe preview, real cwd, exportable artifacts."
],
"image_slot": "about"
},
{
"kind": "content",
"layout": "left",
"eyebrow": "Capabilities · Nº 03",
"title": [
{ "text": "Skills, systems, surfaces — " },
{ "text": "for creative", "em": true },
{ "text": " intelligence" },
{ "text": ".", "dot": true }
],
"body": "Four composable surfaces, one feedback loop. Skills supply behavior. Systems supply taste. Adapters bridge agents. BYOK respects your wallet.",
"bullets": [
"31 file-based SKILL.md bundles — drop in, restart, appears.",
"72 portable DESIGN.md systems — Linear, Vercel, Stripe, Apple…",
"12 agent adapters — Claude · Codex · Gemini · Cursor · …",
"OpenAI-compatible proxy — paste a baseUrl + key, ship."
],
"image_slot": "capabilities"
},
{
"kind": "stats",
"eyebrow": "By the numbers · Nº 04",
"title": [
{ "text": "Composable, " },
{ "text": "shippable,", "em": true },
{ "text": " portable" },
{ "text": ".", "dot": true }
],
"stats": [
{ "value": "31", "label": "Skills", "sub": "file-based, shippable today" },
{ "value": "72", "label": "Systems", "sub": "design tokens you already trust" },
{ "value": "12", "label": "Agents", "sub": "auto-detected on your $PATH" },
{ "value": "3", "label": "Commands","sub": "from clone to first artifact" }
],
"caption": "Open Design v0.3.0 · Apache-2.0 · MMXXVI"
},
{
"kind": "section",
"roman": "II.",
"title": [
{ "text": "How it " },
{ "text": "feels", "em": true },
{ "text": " to use it" },
{ "text": ".", "dot": true }
]
},
{
"kind": "content",
"layout": "right",
"eyebrow": "Method · Nº 05",
"title": [
{ "text": "From " },
{ "text": "signals", "em": true },
{ "text": " to systems" },
{ "text": ".", "dot": true }
],
"body": "Every project moves through four iterative stages. The agent picks each stage's tools deterministically; you stay in control.",
"bullets": [
"01 · Detect — daemon scans $PATH, auto-loads skills + systems.",
"02 · Discover — 30s question form locks brand · audience · scale.",
"03 · Direct — pick one of 5 visual directions in OKLch + type stack.",
"04 · Deliver — write to disk, preview in sandbox, export anywhere."
],
"image_slot": "method-1"
},
{
"kind": "content",
"layout": "left",
"eyebrow": "Selected work · Nº 06",
"title": [
{ "text": "Skills that turn briefs into " },
{ "text": "memorable", "em": true },
{ "text": " artifacts" },
{ "text": ".", "dot": true }
],
"body": "From editorial decks to consumer dashboards — the same loop, different surface. Every output is a real file you can hand to a client tomorrow.",
"image_slot": "work-1"
},
{
"kind": "quote",
"quote": [
{ "text": "Open Design helped us turn vague " },
{ "text": "AI ideas", "em": true },
{ "text": " into a visual system that felt " },
{ "text": "sharp, believable,", "em": true },
{ "text": " and genuinely new." }
],
"author": { "initial": "m", "name": "Mina Kovac", "title": "Creative Director · North Form" },
"image_slot": "testimonial"
},
{
"kind": "cta",
"eyebrow": "Start a conversation · Nº 07",
"title": [
{ "text": "Let's build something " },
{ "text": "open", "em": true },
{ "text": " and " },
{ "text": "visually", "em": true },
{ "text": " unforgettable" },
{ "text": ".", "dot": true }
],
"body": "Star us on GitHub, drop into the issues, or run pnpm tools-dev tonight. Three commands and the loop is yours.",
"primary": { "label": "Star on GitHub", "href": "https://github.com/nexu-io/open-design" },
"secondary": { "label": "Open an issue", "href": "https://github.com/nexu-io/open-design/issues" }
},
{
"kind": "end",
"mega": [
{ "text": "Open " },
{ "text": "Design", "em": true },
{ "text": "." }
],
"footer": "Apache-2.0 · MMXXVI · Berlin · 52.5200° N · 13.4050° E"
}
],
"imagery": {
"strategy": "bring-your-own",
"assets_path": "../open-design-landing/assets/",
"provider": "fal"
}
}
+128
View File
@@ -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;
File diff suppressed because it is too large Load Diff