* 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 (commits96b255b,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>
7.5 KiB
| 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. |
|
|
|
|
|
|
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
:rootvia thelanguageparameter.
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):
- Identity round — name, mark, tagline, location, edition, language.
- 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 indesign-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
kami-landing— long-form one-pager sister skill.design-systems/kami/DESIGN.md— token spec.open-design-landing-deck— same horizontal swipe nav model, different visual language (Atelier Zero).- Upstream:
tw93/kami— original Claude skill (MIT). Kami's slides.py template documents the macro × 1.6 / micro × 0.6 ratios this skill applies.