OpenPress

Slides

Slides を作成する

Press marker、template registry、slide source、theme CSS、core Object API を使って、移植しやすい OpenPress slide workspace を作成します。

OpenPress の slide workspace は、大きな layout wrapper で組み立てるものではありません。現在の方向性は、まず再利用可能な template を定義し、CLI または Workbench がその template を新しい slide source folder にコピーする形です。

Template 内部では SlideFrameTextLineMediaObject などの core objects を直接組み合わせます。視覚スタイルは theme CSS に置き、編集可能な文字は Text children に置き、固定配置は box、フロー配置は Frame layout を使います。

Step 1: Workspace を初期化する

npm create @open-press@latest <project-name> -- --type slides

これは 16:9 page geometry の slide Press を作成します。OpenPress の slide coordinates は 1920 x 1080 の base canvas を使います。

Step 2: press.tsx は slide 登録に集中させる

press/<slug>/press.tsx はシンプルに保ちます。Deck の順序を記述し、各 slide の実際の layout は slide 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" />
      <Slide id="statement" />
    </Press>
  );
}

Step 3: Template から slide を作成する

Template は press/<slug>/slide-style/manifest.json に登録します。Slide を追加すると、CLI は slide-style/templates/<template>/ から slides/<id>/ に template をコピーします。

node packages/core/engine/cli.mjs slide . add intro --press slide --template cover

一般的な構造:

press/slide/
  press.tsx
  theme/default.css
  slide-style/
    manifest.json
    theme/default.css
    templates/
      cover/slide.tsx
      agenda/slide.tsx
  slides/
    intro/slide.tsx

slide-style/theme/default.css は template package の元スタイルです。Workspace にコピーまたは同期された後、実際の deck は press/<slug>/theme/default.css を使用します。

Step 4: Core objects で slide source を書く

Slide source は core objects を直接使います。編集可能な内容を抽象 wrapper の props に隠さないでください。

import { Frame, Line, Slide, Text } from "@open-press/core";

export default function CoverSlide() {
  return (
    <Slide id="cover" className="op-source-deck-slide">
      <Frame frameKey="canvas" chrome={false} className="op-source-deck-canvas">
        <Text as="p" label="date" box={{ x: 100, y: 80 }} className="op-source-deck-date">
          26 JUNE 2024
        </Text>
        <Text as="h1" label="title" box={{ x: 100, y: 360, w: 1155 }} className="op-source-deck-title">
          A line is length without breadth.
        </Text>
        <Line label="red-rule" box={{ x: 100, y: 774, w: 270, h: 4 }} className="op-source-deck-red-rule" />
      </Frame>
    </Slide>
  );
}

Step 5: 検証する

npm run build

ローカルで preview する場合:

npm run dev:workspace

Object identity、labelboxFrame layout の規則は Core Object API を参照してください。