open-design/skills/kami-deck/SKILL.md
Tom Huang aefba56a3f
feat(skills): open-design-landing rename, kami skills, landing OG (#428)
* feat(skills): open-design-landing rename, kami skills, landing OG

- Rename editorial-collage skills to open-design-landing and -deck; refresh examples and compose script layout
- Add kami-deck and kami-landing skills with HTML examples
- Landing page: og.astro, index wiring, and style tweaks; package.json bump
- Web i18n: German and Russian copy for renamed and new skills
- Daemon test: update skill-asset-rewrite expectations for new paths
- Design systems: README and atelier-zero doc touch-ups
- Cross-skill SKILL.md reference updates

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(landing-page): document version-slot invariant and deprecation timeline

Address P3 review notes on PR #428:
- Note the `data-github-version` wrapper invariant (version string only)
  near the canonical URL block in `app/page.tsx`.
- Expand the `formatVersion` helper comment in `app/pages/index.astro`
  with concrete `release.name` / `tag_name` example shapes for each
  branch of the regex fallback.
- Tighten the `EditorialCollageDeckInputs` deprecation in
  `skills/open-design-landing-deck/schema.ts` to a specific removal
  version (v0.4.0) and add a "Migrating from editorial-collage-deck"
  section to the skill README.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* docs(landing-page, skills): clarify version slot script and rename migrations

- Describe GitHub version slots as driven by the inline enhancement script,
  not React hydration.
- Add editorial-collage → open-design-landing migration notes; fix README
  link copy (Astro static landing app).
- Extend deck README migration table with shared asset path renames.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(daemon): alias deprecated editorial-collage skill ids

The PR renames the editorial-collage / editorial-collage-deck skills
to open-design-landing / open-design-landing-deck, but the daemon
persists exact skill_id strings on projects and resolves them via
listSkills().find((s) => s.id === storedId). After the rename, any
project saved against an old id silently composes without the intended
skill prompt because the listing no longer exposes that id.

Add a SKILL_ID_ALIASES map in skills.ts plus a findSkillById() helper
that rewrites deprecated ids to their current canonical form, then
route every server-side lookup (skill detail, example HTML, asset
proxy, system-prompt composer) through it. Cover the alias map, the
resolver, and end-to-end resolution against a temp skills directory
with a regression test.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* fix(kami-deck): route host od:slide messages through local go()

The host bridge classifies kami-deck as class-driven because go() toggles
.slide.active, but the visible slide is moved by deck.style.transform
which the bridge cannot drive. Listen for od:slide messages and dispatch
them through the local go() so toolbar next/prev and initialSlideIndex
restore actually shift the deck.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* fix(kami-deck): sync deck transform with host-driven .active changes

The previous fix added a local od:slide listener but the host bridge in
apps/web/src/runtime/srcdoc.ts also listens for the same message and
calls setActive() (toggles .slide.active) without driving the deck
transform. Both listeners fired, the bridge re-read the just-toggled
active class, and overshot by one — and the bridge's restoreInitialSlide
path could move .active without a message at all, leaving the deck on
the original transform.

Stop the bridge from double-handling by calling stopImmediatePropagation
in the local listener (registered first because the bridge script is
appended to </body>), and add a MutationObserver that pulls the deck
transform onto whichever slide currently carries .active so the bridge's
direct setActive calls (notably the initial-slide restore) move the deck
too.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* fix(i18n): align French content with renamed/new skills

PR #434 (French localization) merged into main with French copy for the
old editorial-collage / editorial-collage-deck skill ids; this branch
renamed those to open-design-landing / open-design-landing-deck and
added kami-deck and kami-landing. Update content.fr.ts to track the
rename and add French copy for the new kami skills so the
LOCALIZED_CONTENT_IDS coverage test passes once main is merged.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* fix(open-design-landing-deck): sync deck transform with host-driven .active changes

Apply the same fix that landed in skills/kami-deck/example.html
(commits 96b255b, 8cbca30) to the open-design-landing-deck composer
runtime: the host bridge classifies this deck as class-driven because
go() toggles .slide.active, but the visible slide is moved by
deck.style.transform which the bridge can't drive. Add an od:slide
message listener that calls stopImmediatePropagation() and routes nav
through the local go(), plus a MutationObserver that pulls the deck
transform onto whichever slide carries .active so the bridge's direct
setActive calls (notably restoreInitialSlide) move the deck too.

Regenerates example.html via scripts/compose.ts; the regeneration also
picks up upstream nav-cta and brand-meta CSS additions in the sister
open-design-landing styles.css that the example had drifted from.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* docs(open-design-landing): align deploy story with Astro landing app

- Update SKILL contract: apps/landing-page is Astro static; clarify
  nextjs-app output_format as a historical enum label and <out>/nextjs
  as a legacy folder name.
- Replace optional-deploy section with fork + pnpm --filter landing-page build.
- Fix styles.css header and regenerate landing + deck example.html so
  inlined comments match.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(deck-runtime): bypass interaction lock for host/observer slide sync

The slide deck runtimes for kami-deck and open-design-landing-deck
gate go() behind a 700ms `lock` so wheel/key/touch input bursts can't
overshoot the transform transition. But applying the same gate to the
host bridge's od:slide messages and the MutationObserver watching
`.slide.active` creates a startup race: go(0) at the end of init sets
lock=true, and any host-driven `.active` change inside that window
(notably restoreInitialSlide) fires the observer, which calls go(i),
which exits at the lock guard — leaving the visible deck on slide 1
while the host counter advances to N.

Split the actual state update into an unthrottled `applySlide(n)`
helper that updates transform, `.active`, dot nav, and the progress
bar. Keep `lock` only on the user-input path through `go()`. Route
the message listener, the MutationObserver, and the initial render
through `applySlide` directly so host-driven sync always reaches the
deck transform regardless of the throttle state.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-04 19:22:46 +08:00

7.5 KiB
Raw Blame History

name description triggers od inputs parameters outputs capabilities_required example_prompt
kami-deck Produce a print-grade slide deck in the kami (紙 / 纸) design system — warm parchment background (or ink-blue for cover / chapter slides), serif at one weight, ink-blue accent ≤ 5% per slide, no italic. Horizontal magazine swipe pagination (←/→ · wheel · swipe · ESC overview). One self-contained HTML file, zero dependencies beyond Google Fonts.
kami deck
紙 deck
纸 deck
paper slides
white paper deck
editorial deck
print-style slides
kami slides
category surface mode scenario featured audience tone scale preview design_system craft
brand-deck web deck marketing 4 founders, researchers, design studios, conference talks editorial, restrained, print-first 6-15 viewport-locked slides
type entry
html index.html
requires
false
requires
typographic-rhythm
pixel-discipline
id label
brand Brand identity (shared across slides)
id label
deck_title Deck title shown in the per-slide chrome
id label
slides Ordered list of typed slides (cover · chapter · content · stats · quote · cta · end)
id label
language Primary language stack
language
type values default description
enum
en
zh-CN
ja
en Sets `--serif` to Charter / TsangerJinKai02 / YuMincho respectively.
path description
<out>/index.html Self-contained kami deck with horizontal swipe pagination.
file-write
Build me a 9-slide kami-style internal deck for "Hokuto Research" — a Q1 portfolio review. Cover slide on ink-blue with the firm name. Chapter dividers between Macro, Equities, and Outlook. Three content slides with ink-blue numbered headings. One stats slide showing AUM / IRR / fund count. One closing CTA. End card with the firm signature. Japanese language stack.

kami-deck

Sister skill to kami-landing. Produces a single self-contained HTML file: a horizontal magazine-style swipe deck in the kami (紙 / 纸) design system — print rhythm, ink-blue accent, serif at one weight, no italic, no cool grays.

The navigation model is intentionally borrowed from the guizang-ppt skill — ←/→ arrow keys, wheel / swipe, ESC for the overview grid. The aesthetic stays kami: parchment content slides, ink-blue cover and chapter slides, serif everywhere.

Design system source of truth: design-systems/kami/DESIGN.md. Read it before shipping. Tokens, type rules, and forbidden colors all live there. Slide-specific scale ratios (macro × 1.6, letter-spacing × 0.6 vs. print) are documented in §3 "Hierarchy" and §5 "Layout Principles · Slides".

What you get

  • N viewport-sized slides (6-15 is the sweet spot) laid out horizontally on one transformed flex track.
  • Cover and chapter slides flip background to ink-blue (#1B365D) with ivory text — the only place dark theme is used.
  • Content / stats / quote / CTA slides stay on parchment (#f5f4ed) with serif at weight 500.
  • Per-slide chrome strip: brand mark · deck title · live slide counter (01 / 09).
  • Tabular-nums on every counter, metric, page number.
  • Coral-free — kami's accent is ink-blue. Progress bar and dot nav are ink-blue too.
  • Keyboard / wheel / touch nav, ESC overview grid, dot indicator.
  • Multilingual stack — EN / zh-CN / ja, set on :root via the language parameter.

Slide types

Kind Background Use it for
cover ink-blue Title plate at the start. Centered serif title + tagline.
chapter ink-blue Roman/Arabic numeral chapter divider.
content parchment Section number + title + body + optional bullets.
stats parchment 3-4 metric cells (value · label · sub).
quote parchment Pull quote with ink-blue left rule + author signature.
cta parchment Closing pitch + 1-2 buttons.
end ink-blue Mega serif kicker word + colophon footer.

A typical 11-slide deck:

1. cover     — ink-blue title plate
2. chapter   — "01 / Why now"
3. content   — manifesto
4. content   — capabilities + bullets
5. stats     — 4 numbers
6. chapter   — "02 / How it feels"
7. content   — method
8. content   — selected work
9. quote     — testimonial
10. cta      — primary action
11. end      — ink-blue kicker

Workflow

1. Gather the brief

Ask in two rounds (don't dump the whole list at once):

  1. Identity round — name, mark, tagline, location, edition, language.
  2. Content round — for each slide, kind + the typed fields.

2. Pick the language stack

Same as kami-landing: EN → Charter, zh-CN → TsangerJinKai02 / Source Han Serif, ja → YuMincho. JA also overrides --olive to #4d4c48 because YuMincho strokes are thinner.

3. Write index.html

Output a single file with all CSS inline. Mirror the structure of example.html. Use only the tokens from design-systems/kami/DESIGN.md.

The runtime script (keyboard / wheel / touch nav, dot indicator, progress bar, ESC overview) should match the model documented in open-design-landing-deck/scripts/compose.ts. Do not reuse the open-design-landing-deck CSS; the visual language is different.

4. Self-check

  • All cover / chapter / end slides use ink-blue background (#1B365D) with ivory text. All other slides are on parchment.
  • Ink-blue covers ≤ 5% of any parchment slide's surface.
  • Slide titles use serif weight 500 only. No italic.
  • All numeric stacks (counter, metrics, page numbers) carry font-variant-numeric: tabular-nums.
  • Press / Space / scroll. Smoothly slides one viewport to the right; dot nav advances; the ink-blue progress bar ticks forward.
  • Press Esc. Overview grid appears with scaled thumbnails.
  • Resize to 1080px and 640px. Cover / content collapse to a single column; dot nav still works.
  • Lighthouse: contrast AA, font-display swap, no layout shift.

Boundaries

  • Do not introduce a second accent color. Pick ink-blue or pick nothing.
  • Do not use italic anywhere — emphasis swaps to ink-blue.
  • Do not use rgba() for tag fills; pre-blend over parchment and use solid hex from the table in design-systems/kami/DESIGN.md §2.
  • Do not add a router. This is a single-file artifact.
  • Do not reuse Atelier Zero collage imagery (the open-design-landing visual system). Kami is gradient-free, image-light, and hierarchy is carried by type.

See also