open-press

Slides

Slides を作成する

Press marker、直接編集できる slide source、theme CSS、core Object API を使って OpenPress slide workspace を作成します。

OpenPress の slide workspace は、直接編集できる slide source で構成します。各 slide が composition を持ち、再利用する deck UI と theme CSS はその Press 内に置きます。

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: blank slide source を追加する

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

この command は slides/intro/slide.tsx を作成し、Press registration を更新します。最小の placeholder を、実際の slide composition に置き換えてください。

press/slide/
  press.tsx
  theme/default.css
  slides/
    intro/slide.tsx

同じ content-free visual primitive が別の slide にも実在する場合だけ、この Press の ui/ または components/ に置きます。一度しか使わない composition と content は slide source に残します。

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 を参照してください。