GithubXDiscord

block-types > ブロックタイプガイドの紹介

ブロックタイプガイドの紹介

ノーションプレッソは、ノーションの様々なブロックタイプをサポートし、各ブロックタイプに対してノーションと可能な限り類似したスタイルのコンポーネントを提供します。このガイドでは、現在サポートされているブロックタイプ、各ブロックタイプのProps、カスタマイズ方法、そして内部動作原理について説明します。

サポートされているブロックタイプ

ノーションプレッソで現在サポートされているブロックタイプと、サポート予定のブロックタイプの一覧です:

ブロックタイプサポート状況ブロックタイプEnum
Paragraph✅ Yesparagraph
Heading 1✅ Yesheading_1
Heading 2✅ Yesheading_2
Heading 3✅ Yesheading_3
Bulleted List Item✅ Yesbulleted_list_item
Numbered List Item✅ Yesnumbered_list_item
To-do❌ Noto_do
Toggle✅ Yestoggle
Quote✅ Yesquote
Callout✅ Yescallout
Equation❌ Noequation
Code❌ Nocode
Image❌ Noimage
Video❌ Novideo
Bookmark❌ Nobookmark
Divider✅ Yesdivider
Table❌ Notable
Table Row❌ Notable_row
Column❌ Nocolumn
Column List❌ Nocolumn_list
Audio❌ Noaudio
Synced Block❌ Nosynced_block
Table Of Contents❌ Notable_of_contents
Embed❌ Noembed
Figma❌ Nofigma
Google Maps❌ Nomaps
Google Drive❌ Nodrive
Tweet❌ Notweet
PDF❌ Nopdf
File❌ Nofile
Link❌ Notext (inline)
Page Link❌ Nopage
External Page Link❌ Notext (inline)
Collections❌ No-
Collection View❌ Nocollection_view
Collection View Table❌ Nocollection_view
Collection View Gallery❌ Nocollection_view
Collection View Board❌ Nocollection_view
Collection View List❌ Nocollection_view
Collection View Calendar❌ Nocollection_view
Collection View Page❌ Nocollection_view_page

このリストは継続的に更新される予定で、今後さらに多くのブロックタイプをサポートする計画です。

Propsの使用方法

ノーションプレッソは、各ブロックタイプに対するPropsタイプを提供します。これらのPropsタイプはライブラリから直接インポートして使用できます。

例えば、Paragraphコンポーネントのpropsは以下のようにインポートして使用できます:

import { ParagraphProps } from "@notionpresso/react";

// ParagraphPropsの構造
interface ParagraphProps {
  type: "paragraph";
  paragraph: {
    rich_text: Array<RichTextItemResponse>;
    color: string;
  };
  id: string;
  has_children?: boolean;
}

// 使用例
const MyParagraph: React.FC<ParagraphProps> = (props) => {
  // カスタマイズ実装
};

各ブロックタイプのPropsの詳細な構造は、該当するブロックタイプのドキュメントで確認できます。

カスタマイズされたコンポーネントの適用

ノーションプレッソの大きな利点の一つは、各ブロックタイプに対して完全にカスタマイズされたコンポーネントを適用できることです。カスタマイズされたコンポーネントを適用する方法は以下のようになります:

import { Notion } from "@notionpresso/react";
import CustomParagraph from "./CustomParagraph";
import CustomHeading from "./CustomHeading";

const customComponents = {
  paragraph: CustomParagraph,
  heading_1: CustomHeading,
  heading_2: CustomHeading,
  heading_3: CustomHeading,
  // ... 他のブロックタイプに対するカスタマイズされたコンポーネント
};

function MyNotionPage({ blocks }) {
  return (
    <Notion custom={customComponents}>
      <Notion.Blocks blocks={blocks} />
    </Notion>
  );
}

Notionコンポーネントに注入されるcomponentsの型は以下のようになります:

type NotionComponents = Record<string, React.ComponentType<any>>;

ここで、keyはNotionのブロックタイプ(例:'paragraph', 'heading_1'など)であり、valueは該当するブロックタイプをレンダリングするReactコンポーネントです。

データの前処理プロセス

ノーションプレッソは、Notion APIから取得したブロックデータをUIレンダリングに最適化された形式に変換します。このプロセスでは、ContextedBlockという新しい型を定義して使用します。

+----------------------+
|    Notion API        |
|    Block Data        |
| +------------------+ |
| | Block            | |
| | - id             | |
| | - type           | |
| | - has_children   | |
| | - [type_specific]| |
| +------------------+ |
+----------------------+
           |
           | (Input)
           v
+---------------------------+
| resolveToContextedBlocks  |
| +-------------------------+
| | For each block:         |
| | +---------------------+ |
| | |resolveToContextedBlo| |
| | |ck (recursive)       | |
| | +---------------------+ |
| |   |                     |
| |   v                     |
| | Map parent-child        |
| | relationships           |
| +-------------------------+
|   |
|   v
| Map sibling relationships |
+---------------------------+
           |
           | (Output)
           v
+---------------------------+
|     ContextedBlocks       |
| +-------------------------+
| | ContextedBlock          |
| | - ...Block properties   |
| | - context:              |
| |   - previous (sibling)  |
| |   - next (sibling)      |
| |   - parent              |
| | - blocks (children)     |
| +-------------------------+
+---------------------------+
           |
           | (Used by)
           v
    +----------------+
    | Notion.Blocks  |
    | Component      |
    +----------------+

ContextedBlockは、従来のBlock型を拡張して、以下の追加情報を含むようになります:

  • 前のブロック(兄弟関係)
  • 次のブロック(兄弟関係)
  • 親ブロック

これらの追加情報は、特定のブロックコンポーネントで便利に使用できます。

レンダリングプロセス

ノーションプレッソのレンダリングプロセスは以下のようになります:

+-------------------+      +------------------+
|   Custom          |      |   Default        |
|   Components      |      |   Components     |
+-------------------+      +------------------+
          |                         |
          |   +-----------------+   |
          +-->|     Notion      |<--+
              |    Component    |
              |(React.Provider) |
              +-----------------+
                    |     |
         +----------+     +------------+
         |                             |
+----------------+             +----------------+
| Notion.Cover   |             | Notion.Body    |
+----------------+             +----------------+
                                       |
                               +----------------+
                               | Notion.Title   |
                               +----------------+
                                       |
                               +----------------+
                               | Notion.Blocks  |
                               +----------------+
                                       |
                                       v
                               +----------------+
                               | Rendered       |
                               | Notion Page    |
                               +----------------+

このプロセスにより、カスタマイズされたコンポーネントとデフォルトのコンポーネントが連携してNotionページをレンダリングします。

スタイリング

現在提供されているNotionコンポーネントは、Notionのスタイルを可能な限り類似した形式で実装しています。各コンポーネントは、notion-という接頭辞を持つCSSクラスを使用してスタイリングされています。

今後の計画

  • さらに多くのブロックタイプのサポート追加
  • テーマに適用されたコンポーネントセットの開発
  • 高度なカスタマイズオプションの拡張

これらのページでは、各ブロックタイプについての詳細な説明、Propsの構造、使用例、そしてカスタマイズオプションを確認できます。