@open-press/core
Press
單一份文件。<Press> 宣告其標題、頁面幾何、來源、來源根目錄,以及底下的 Frames + 輔助工具之 React 樹狀結構。遵循資料夾慣例的專案會從 press/<slug>/press.tsx 中匯出單一個 Press。
<Press> 元件定義單一文件之核心設定、內容來源與元件結構。引擎藉由此宣告建立 Workspace 內的隔離文件邊界。
1.0 契約: 系統依賴 press/*/press.tsx 資料夾慣例發現出版物。每個入口檔案必須具有預設匯出,回傳單一 <Press> 實例,且 slug 須與資料夾名稱相符。
設定並封裝單份文件之上下文、佈局與資料來源。渲染時作為 `Frame` 及輔助元件之宿主。
import { Press } from "@open-press/core"; <Press
title="..."
page="a4" | "social-square" | "slide-16-9" | PageGeometry
sources={[ mdxSource({ id, preset, root }) ]}
slug?
theme?
componentsDir?
mediaDir?
>
{/* Frames + 文稿輔助工具 */}
</Press> 文件設定 (Metadata & Routing)
| Name | Type | Default | Description |
|---|---|---|---|
title required | string | 文件全名。自動綁定至 HTML ` | |
slug | string | URL 路由及輸出目錄識別。預設自動推導自外層目錄名稱(如 `press/report` 對應 `report`)。 |
資源註冊 (Resource Registration)
| Name | Type | Default | Description |
|---|---|---|---|
page required | "a4" | "social-square" | "slide-16-9" | PageGeometry | 此 Press 的 page geometry。通用格式可用 preset;專案特定尺寸請傳入 `{ id, label, width, height }` custom object。Exporter 會把 resolved geometry 轉成 `--openpress-page-*` CSS variables。 | |
sources required | SourceRegistration[] | 由 `mdxSource()` 初始化之資料來源清單。其內部定義之 `id` 將供 ` | |
theme | string | 此 Press 的 theme path override。新工作應把 tokens 與 font loading 放在 `press/ | |
componentsDir | string | string[] | MDX 自動載入元件之實體目錄。預設包含 `./components`。目錄內元件免 `import` 即可於 MDX 使用。 | |
mediaDir | string | string[] | 局部媒體檔案目錄。預設包含 `./media`。 | |
children required | ReactNode | 構成文件本體之 `` 及輔助元件(如 ` |
範例:宣告單一文件
import { Press, Frame } from "@open-press/core";
import { mdxSource } from "@open-press/core/mdx";
import { Sections, Toc } from "@open-press/core/manuscript";
export default function ReportPress() {
return (
<Press
title="Transport models in dense networks"
page="a4"
sources={[
mdxSource({ id: "story", preset: "section-folders", root: "report/chapters" }),
]}
>
<Frame frameKey="cover" role="document.cover">
<Cover />
</Frame>
<Toc source="story" maxLevel={2} />
<Sections source="story" />
</Press>
);
}範例:自訂專案尺寸
<Press
slug="campaign"
title="Campaign Card"
page={{ id: "campaign-card", label: "Campaign Card", width: "1080px", height: "1350px" }}
>
<Frame frameKey="cover" role="social.card">
<CampaignCard />
</Frame>
</Press> 執行期契約與約束
引擎於處理 <Press> 時依循下列不變法則:
- 單一根節點法則:文件之全部可視及結構內容必須為單一
<Press>之子代。 - 配置一致性:文件設定全數封裝於 props,不存在平行之前端設定檔。
- 順序約束:樹狀結構之頂層元件順序(如封面、目錄、內文段落)直接對應至輸出分頁順序。
- 無狀態渲染 (Stateless Rendering):渲染階段採多重遍歷(計算空間、安排區塊等),開發者不得於元件樹內部引發副作用(如讀寫網路、隨機數產生或快取操作)。