原稿の主張と図の役割を頁ごとに整理し、選んだ書式を全頁へ引き継ぐ画像スライドと話者ノートを作る。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Creates and modifies evolving-scene browser presentations. Use when the user asks to "create a presentation", "build a talk", "add steps", "modify a presentation", "update/resync the scene kit", or scaffold presentation infrastructure. Gathers requirements interactively, bootstraps missing scaffolding (monorepo-aware), registers presentations at their own routes, resyncs a project's vendored scene kit with the latest snapshot, and self-verifies build + render before reporting done.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Build evolving-scene presentations: one shared diagrammatic canvas where
entities morph across steps while captions and navigation guide the audience.
Each presentation is a self-contained folder under src/presentations/<slug>/
that composes the reusable scene kit at src/presentation-kit/.
src/presentation-kit/ has fallen behind the skill (see
Updating the vendored kit)Work through these phases in order. Do not skip self-verify.
Ask one question at a time. Cover:
Rules:
Before creating or modifying a presentation, ensure three contract anchors exist. Detection is contract-level (presence of the anchor, not byte-identical files). Cosmetic differences do not trigger re-scaffolding.
| Anchor | What to look for |
|---|---|
| Build setup | vite.config.ts, package.json with a build script |
| Scene kit | src/presentation-kit/types.ts, Presentation.tsx, Stage.tsx |
| Presentation index | src/presentations/index.ts exporting a presentations registry |
Target resolution:
| Context | Scaffold location |
|---|---|
Empty directory, or an existing standalone JS app (a package.json at the root, non-monorepo) | Repository root (.) |
Monorepo (workspaces in package.json, pnpm-workspace.yaml, or packages/ / apps/ layout) | Self-contained app under presentations/ |
Non-empty repo that is not a JS app (no root package.json — e.g. a Python/Go/Rust project) | Self-contained app under presentation/ |
| Anchors already present | Use existing app; scaffold only missing anchors |
Monorepo detection signals: package.json workspaces, pnpm-workspace.yaml,
or files under packages/ or apps/.
Why non-JS repos nest: the bootstrap is a full Vite + React app. Dropping its
package.json, vite.config.ts, and src/ at the root of a Python/Go/Rust repo
would collide with the existing project, so the scaffold lands in a dedicated
presentation/ subfolder instead. Only a truly empty directory or a repo that is
already a JS app gets scaffolded in place at the root.
Scaffolding steps:
templates/bootstrap/ in this skill directory.
Template paths are relative to this SKILL.md file, not necessarily to the
user's current working directory.
The bootstrap package.json ships a neutral presentation-app name —
rename it to suit the target project (e.g. the repo or monorepo package
name) before installing.react, react-dom, motion, lucide-reactvite, @vitejs/plugin-react, typescript,
@types/react, @types/react-dom, @types/node, the eslint stack
(@eslint/js, eslint, eslint-plugin-react-hooks,
eslint-plugin-react-refresh, globals, typescript-eslint), and
playwright (for render checks)npm install in the resolved target directoryNon-empty project without scaffolding: state the resolved target location
(e.g. "I will scaffold into presentations/") and proceed only after the user
confirms.
Already scaffolded: skip scaffolding and go directly to generate/modify.
Utility helpers in scaffold.ts (alongside this file) implement anchor
detection, monorepo heuristics, and target resolution for automated checks.
how-to-use-this-skill)src/presentations/<slug>/ from templates/presentation/:
entities.ts — stable layoutId namespace for every morphing entitysteps/*.tsx — one file per step; each exports a Step objectTalk.tsx — imports all steps, renders <Presentation steps={STEPS} />src/presentations/index.ts:{
slug: '<slug>',
title: '<Human title>',
load: () => import('./<slug>/Talk'),
},
src/presentations/index.ts and asks which to modifyentities.ts, steps/*, or Talk.tsxBefore reporting success:
npm run build in the presentation app directory — must complete with no
type errorsnpm run verify when
available (full multi-step check), or start npm run preview and open the
route in a browser / Playwrightnpm run inspect -- <slug> when available; it
writes project-local screenshots under artifacts/presentation-inspection/
so Playwright resolves from the project's installed dependencies. The helper
waits for morph/fade animations to settle before each screenshot and prints
advisory warnings for text/chrome collisions, visually identical active
navigation states, and unpolished attribution. Check the screenshots and
warnings for accidental overlap, clipped/off-canvas content, unreadable
stacking, missing active TOC/progress styling, and collisions with chrome
such as captions, progress dots, table of contents, or navigation buttons.
npm run verify catches crashes and console errors; it does not prove the
scene is visually correct.If Chromium is missing, run npx playwright install chromium. Do not run
--with-deps unless the environment has OS package privileges and actually
needs browser system dependencies.
Report completion in this structure:
/<slug>)npm run build, render check), visual
composition check performed, and their resultThe scene kit is vendored (shadcn-style): every project owns a copy at
src/presentation-kit/ rather than depending on a package. That copy does not
update itself when the skill does — there is no version to bump. When the skill
ships a kit fix (a new prop, a bug fix), a project's copy must be resynced.
The source of truth is the snapshot this skill ships at
templates/bootstrap/src/presentation-kit/, refreshed whenever the plugin is
updated (claude plugin update). The sync-kit.mjs script (alongside this file)
diffs that snapshot against a project's vendored copy and rewrites it on demand.
When to resync: the user reports the kit is out of date, asks to pull kit updates, or a kit fix shipped in the skill needs to reach an existing project.
Steps (run from the consuming project root):
Report drift — diff the project's copy against the snapshot:
node <skill-dir>/sync-kit.mjs
Exit 0 = in sync; exit 1 = files differ (the diff is printed). Local edits
to the vendored copy show up as drift too — that is expected, like
shadcn diff.
Apply — rewrite the project's copy to match the snapshot:
node <skill-dir>/sync-kit.mjs --apply
Added and changed files are written; target-only files are left untouched (the script never deletes), so local-only additions survive. Pass an explicit path as the last argument to target a non-default kit location.
Re-apply local theming, then verify — if the project had local edits the
snapshot overwrote, review with git diff and re-apply them. Then run
npm run build and a render check (per Self-verify) before
reporting done.
Resyncing the kit does not touch a project's presentations or its host
config (the <Presentation> props it passes) — only the kit files. If a kit
update adds a capability the host should opt into (e.g. a new slot), call that
out so the user can wire it up in their Talk.tsx.
Presentations import from src/presentation-kit/. Each presentation supplies
only its own entities and step scenes.
interface Step<P extends Record<string, unknown> = Record<string, unknown>> {
id: string // stable key for AnimatePresence
era: string // table-of-contents section label
title: string // presenter-mode one-liner
caption: string // browse-mode paragraph
groupKey?: string // consecutive steps with same groupKey are not remounted
payload?: P
Scene: ComponentType<{ step: Step<P> }>
}
For strongly typed grouped scenes, define a payload type and use Step<Payload>
for the steps, scene props, and <Presentation steps={STEPS} /> boundary
instead of casting each payload.
type PhasePayload = { active: 'idea' | 'system'; count: number }
function GroupedScene({ step }: { step: Step<PhasePayload> }) {
const payload = step.payload
return <SceneLayer>{/* render from payload */}</SceneLayer>
}
const STEPS: Step<PhasePayload>[] = [
{
id: 'idea',
era: 'shape',
title: 'The idea appears',
caption: 'A first shape lands.',
groupKey: 'main-scene',
payload: { active: 'idea', count: 1 },
Scene: GroupedScene,
},
]
export default function Talk() {
return <Presentation steps={STEPS} title="Example" initialMode="browse" />
}
layoutId)Define stable ids in entities.ts. Any node that should morph across steps
must use the same layoutId:
export const ENTITIES = { hero: 'hero', flow: 'flow' } as const
The original reference implementation relies on authoring discipline as much as kit code. Follow these rules when generating or modifying step scenes:
groupKey and step.payload for
consecutive beats that represent one evolving diagram. Do not split a single
evolving picture into many unrelated Scene components unless the whole
composition should intentionally remount.layoutIds only on the entity that should morph. A new visual
object gets a new id; the same conceptual object keeps the same id.layoutId (scale, rotate, opacity, or Tailwind equivalents such as
scale-*, rotate-*, opacity-*). Motion uses transforms and opacity during
layout projection; combine those on a child or wrapper only when it is not the
shared layout entity.position: relative plus position: absolute through mixed classes. For
relative offsets, use relative positioning and offsets without adding
absolute positioning; for true absolute placement, put the absolute
positioning on a non-layoutId wrapper and verify the layout still matches
the intended design.Appear only for newcomers. Continuing entities with a shared layoutId
should persist and morph; they should not fade out and back in.layoutId, those re-alignments
animate for free. Achieve it by keeping the composition content-sized and
centered (natural widths, justify-content/align-items: center,
align-self: stretch to match a sibling's width), and let flow do the
positioning. Do not freeze positions with fixed pixel/ch widths, fixed
stage widths, reserved empty slots, or align-items: flex-start pinning —
those hold entities still across steps and kill the re-centering, which is the
most striking thing the framework does. If two entities must share an edge
(e.g. a header row framing a panel below it), give them a shared width by
construction (align-self: stretch against a common parent, or one CSS var
both consume) rather than hardcoding a number. When you need to stop a
transient overshoot during a swap (an exiting element and an entering one
briefly widening a row), stack them in one grid cell — do not solve it by
fixing the whole row's width.data-allow-overlap.Compose steps from kit primitives (all accept layoutId):
| Primitive | Use for |
|---|---|
Box | Unstyled entity wrapper with optional Lucide icon, label, subtitle |
Label | Unstyled annotation |
Arrow | Unstyled connector (default →) |
Frame | Unstyled grouped region with optional frame label |
Emphasis | Unstyled callout wrapper |
SymbolChip | Unstyled icon+label entity with symbol or chip variant hooks |
Appear | Fade-in for newcomers after persisting entities settle |
SceneLayer | Absolutely-positioned diagram layer (prevents reflow between steps) |
The kit is intentionally unstyled. It supplies motion behavior, stable DOM
hooks (data-node, data-node-part, data-accent, data-variant, and
data-presentation-* chrome hooks), fixed-canvas layout plumbing, active-state
semantics (aria-current="step" plus data-active="true"), and a bottom-right
attribution link (made by and-scene) to the GitHub repository. It must not
impose a palette, font, border treatment, glow, card style, button treatment, or
Tailwind dependency. Every presentation owns its visual system, including chrome
polish.
Kit primitives accept className and style so presentations can use either
CSS classes or explicit coordinates. For complex diagrams with literal per-step
pixel coordinates, use primitive style props or raw motion.div elements with
the same layoutId discipline.
import { Box, SceneLayer, Arrow } from '../../presentation-kit'
import { ENTITIES } from '../entities'
function MyScene() {
return (
<SceneLayer>
<div className="flow">
<Box layoutId={ENTITIES.hero} label="Idea" accent="cyan" />
<Arrow layoutId={ENTITIES.flow} />
<Box layoutId={ENTITIES.result} label="Outcome" accent="green" />
</div>
</SceneLayer>
)
}
Position entities with the presentation's own classes or styles inside
SceneLayer. The kit scales a fixed design canvas (880×380) to fit between
header and footer.
Plain CSS example:
.my-talk .flow {
display: flex;
align-items: center;
gap: 2rem;
}
.my-talk [data-node='box'] {
border: 2px solid currentColor;
padding: 1rem 1.5rem;
}
.my-talk [data-accent='cyan'] {
color: #0f766e;
}
.my-talk [data-presentation-progress-dot][data-active='true'] {
background: #0f766e;
}
.my-talk [data-presentation-toc-item][data-active='true'] {
color: #0f766e;
}
.my-talk [data-presentation-attribution] {
color: #475569;
font-size: 0.75rem;
text-decoration: none;
}
Optional Tailwind example (only after the project has chosen and installed Tailwind):
<SceneLayer>
<div className="flex items-center gap-8">
<Box layoutId={ENTITIES.hero} label="Idea" accent="cyan" className="border-2 px-6 py-4" />
<Arrow layoutId={ENTITIES.flow} className="text-3xl" />
<Box layoutId={ENTITIES.result} label="Outcome" accent="green" className="border-2 px-6 py-4" />
</div>
</SceneLayer>
For ad hoc visual checks, put Playwright/screenshot helper scripts under the
project root (for example scripts/) rather than a temp scratchpad outside the
project, so imports such as playwright resolve from local dependencies. Prefer
the scaffolded npm run inspect -- <slug> helper before writing a custom script.
Use --settle-ms <ms> only when a presentation deliberately uses longer custom
animations than the default settle wait.
Copy templates/single-step/step.tsx into steps/, customize metadata and
layout, then append to the STEPS array in Talk.tsx.
The kit provides browse/present modes, captions per step, table of contents,
progress dots, and prev/next controls. Active TOC and progress items expose
aria-current="step" and data-active="true", but the presentation must make
that current state visibly distinct in its own CSS. The attribution link also
needs presentation-owned styling so it is legible and intentional rather than a
raw browser-default anchor. Users navigate with →/Space/PageDown (next),
←/PageUp (prev), P (toggle mode), or horizontal swipe.
This skill does not:
Redirect those requests to the appropriate skill or tool.
Every generated presentation must:
npm run build — no type errorsmade by and-scene attribution must be legible and styled
by the presentation or host app| Path | Purpose |
|---|---|
templates/bootstrap/ | Full app snapshot for bootstrapping fresh/empty projects |
templates/presentation/ | New presentation folder (entities.ts, steps/, Talk.tsx) |
templates/single-step/step.tsx | Template for adding one step |
Replace {{PLACEHOLDER}} tokens in templates with gathered content.
| Path | Purpose |
|---|---|
sync-kit.mjs | Diff/resync a project's vendored src/presentation-kit/ against the shipped snapshot (see Updating the vendored kit) |
templates/bootstrap/scripts/verify.mjs | Build + render verifier used by scaffolded projects |
templates/bootstrap/scripts/inspect-presentation.mjs | Project-local screenshot helper for visual composition checks |
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
原稿の主張と図の役割を頁ごとに整理し、選んだ書式を全頁へ引き継ぐ画像スライドと話者ノートを作る。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Convert literature reviews, paper folders, thesis drafts, journal-style reports, or research outlines into rigorous academic slide decks and review artifacts. Use when Codex must create, rebuild, or polish PPTX presentations from scholarly sources while preserving academic logic, citation-aware image/formula handling, editable layouts, figure explanations, template fidelity, and export-based visual QA.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
既存PPTXの書式・配置を抽出し、planとnative編集操作からPowerPointを生成・検査する。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
読者と目的から構成・版式を決め、確認を挟みながら、編集できる図形と文字のPPTXにする。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
全流程AI制作PPT演示文稿技能,克制专业、风格可选 A/B/C 三档(Aham UI v6.1 · Office 轨 · PPT)。 当用户说"帮我做PPT""做演示文稿""做一个汇报""根据这份资料做PPT" "做客户方案PPT""制作幻灯片"时立即触发。即使只有一句话需求也触发。 八阶段模块化流程:规范加载→材料解析→论点提炼→叙事骨架→大纲版式→样稿确认→逐页设计→质检交付。 内置能力自适应教练机制,无论用户专业水平高低,均引导至及格以上输出。 注意:本技能用于 PowerPoint / pptx 输出;SVG/HTML 版本见 ppt-svg 技能。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
原典のReact scene kitを実scaffoldし、安定layoutIdの共通canvasでentityが移動・morphする日本語ブラウザ資料を作る。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.