OpenPress

Runtime

Slides アーキテクチャ

Slide Press の構造:Press marker、folder-per-slide source、template registry、core objects、安定した object identity。

OpenPress は、deck の順序、各 slide の source、再利用可能な template、theme CSS を分離します。この分離により slide style を package として移植しやすくなり、Agent は巨大な deck file ではなく単一 slide に集中できます。

press.tsx は順序を記述する

press/<slug>/press.tsx は deck の index です。<Slide id="..." /> で再生順序を登録し、各 slide の実際の layout は別の source file に置きます。

import { Press, Slide } from "@open-press/core";

export default function SlidePress() {
  return (
    <Press slug="slide" title="Deck Title" type="slides" page="slide-16-9">
      <Slide id="cover" />
      <Slide id="agenda" />
    </Press>
  );
}

各 slide は独立した source file を持つ

各 slide は press/<slug>/slides/<id>/slide.tsx にあります。この file が実際の visual source で、通常は SlideFrameTextLineMediaObject などの core objects を組み合わせます。

Folder-per-slide は次の点で有効です:

  1. Agent は deck 全体を理解せずに 1 枚の slide を編集できます。
  2. Git diff と履歴が読みやすくなります。
  3. Workbench の add、delete、skip が明確な source folder に対応します。

Template registry が移植境界になる

press/<slug>/slide-style/manifest.json は利用可能な template を登録します。Slide を追加すると、CLI または Workbench は slide-style/templates/<template>/ から新しい slides/<id>/ folder に template をコピーします。

この境界が重要です。Style package は templates と theme CSS を持ち運び、deck は生成された slide source を保存します。

Object identity は primitives で表現する

編集可能 object を大きな compound wrapper の props に隠さないでください。Template は core objects を直接使います:

  • Frame の identity には frameKey を使います。
  • TextLineMediaObject は template 内で安定した label を指定します。
  • 固定配置には box を使います。16:9 slide の base canvas は 1920 x 1080 です。
  • フロー配置には Frame layout を使います。
  • Typography、color、spacing、visual effects は theme CSS に置きます。

Engine はこれらの primitives から Workbench の inline editing、comments、thumbnails、preview のための locator を生成します。作者と Agent の責任は、安定した local ID と明確な source structure を提供することです。

詳細は Core Object API を参照してください。