表 ​

ツールバーで行と列を選んで表を作成します。セルには複数の段落、画像、リスト、引用、コード、折りたたみ、動画を入れられます。セルにカーソルを置くと、下部のプロパティツールで行・列、結合、見出しセル、背景色を編集できます。

下の例でセル内の段落やリストを編集し、複数のセルをドラッグして背景色をまとめて変えてみてください。プロパティツールの 表全体を選択 を押すと、メインツールバーから表自体の配置を変えられます。

ウィング
既定の書体高さ
HTMLエディタを読み込んでいます…
JSONnabi-treeエディタを読み込んでいます…
インストール
npm install nabi-note
コード
import {
  createLocale, createNabiWith, mountSurface, mountToolbar,
  mountContextToolbar, mountHints, watchSettle, boldWing, linkWing,
  headingWing, alignWing, dropCapWing, bulletListWing, orderedListWing,
  taskListWing, quoteWing, detailsWing, codeWing, dividerWing,
  tableWings, imageWing, youtubeWing, uploadWing, mountUpload,
  mountUploadView, mountViewTools,
} from 'nabi-note'

const selected = [
  boldWing,
  linkWing,
  headingWing,
  alignWing,
  dropCapWing,
  bulletListWing,
  orderedListWing,
  taskListWing,
  quoteWing,
  detailsWing,
  codeWing,
  dividerWing,
  ...tableWings,
  imageWing,
  youtubeWing,
  uploadWing,
]
const locale = createLocale('ja')
const { nabi, registry } = createNabiWith(selected, { locale })

// Bring your own highlighter (Prism, highlight.js, Shiki, …) — the wing stays as it is
// and only the attach is swapped (`makeCodeAttach` ships from the same door)
// { ...codeWing, attach: makeCodeAttach({ highlight: (source, lang) => [{ text: source }] }) }

const root = document.querySelector('.nabi')!
const content = document.querySelector('.nabi-content')!

const view = mountUploadView({ nabi, surface: content, locale })
const upload = mountUpload({
  nabi, root: content, locale,
  // your upload goes here — report progress with task.onProgress(0–100)
  uploader: async (task) => ({ uri: 'https://cdn.example/uploaded' }),
  extensions: ['png', 'jpg', 'pdf'], maxFileSize: 10 * 1024 * 1024,
  onStart: (tasks) => view.start(tasks),
  onProgress: (id, percent) => view.progress(id, percent),
  onSettle: () => view.settle(),
  onDone: () => view.done(),
})

// The locale also sets the direction — Arabic and Urdu run right to left
mountSurface({ nabi, registry, root: content, locale, fileSink: upload.take })

const settle = watchSettle(document, { surface: content })
const shared = { nabi, registry, surface: content, settle, locale }
const toolbar = mountToolbar({ ...shared, root: document.querySelector('#toolbar')!, onFiles: upload.take })
const context = mountContextToolbar({ ...shared, root: document.querySelector('#context')! })
mountHints({ toolbar, context, root, surface: content })
// The preview and fullscreen buttons — they stand their own box at the end of the row
mountViewTools({ ...shared, root, container: document.querySelector('#toolbar')! })

// on every change — hook up your own code here
// nabi.onChange(() => user_callback(nabi.getHtml()))

// Call from your language selector. Content and editing history stay intact.
// locale.setLocale('ko')
ts
const selected = wings().use('table').build()

セル内で使うウィングも一緒に登録してください。基本ウィングをすべて使うエディターなら、wings().allBasic() で構成できます。

セル内での入力 ​

入力動作
通常の段落で Enter同じセル内に新しい段落を作成します。
Shift+Enter現在の段落またはリスト項目内で改行します。
通常の段落で Tab / Shift+Tab次 / 前のセルへ移動します。
リスト・コードで Tab / Shift+Tabそのブロックのインデント・インデント解除を使います。

リストやコード内の Enter は、それぞれのブロックの入力ルールに従います。コードのインデントをそれ以上減らせない場合も、Shift+Tab で前のセルには移動しません。セルの先頭や末尾で Backspace・Delete を押しても、隣のセルや表の外の段落と結合されません。

貼り付けや画像・ブロックの挿入は、操作を始めたセル内に収まります。セルの境界をまたぐ選択には、ブロックの挿入や貼り付けを適用できません。セル内に表や フロート領域 は入れ子にできず、そのような構造を読み込んだり貼り付けたりすると、中身が順番に展開されます。

通常のセルには見出しを使えますが、見出しセルには見出し書式を適用しません。見出しセルに切り替えると、内部の見出しは通常の段落になり、文字とその他の書式は保たれます。

セルの背景色 ​

背景色は、1つのセルまたはドラッグで選択した長方形の範囲に適用されます。文字の一部だけを選んでも、その文字を含むセル全体の背景が変わります。淡い色はライト・ダークテーマに合わせて表示され、複数のセルの色が異なる場合は、特定の色が選択済みとして表示されません。

現在のセル選択を保ったまま、コマンドでも変更できます。

ts
nabi.applyCommand('setCellColor', { bg: 'cyan' })

指定できる値は yellow、green、cyan、pink、purple、orange です。既定の背景に戻すには、プロパティツールの 既定 を選ぶか、空の文字列を渡します。

ts
nabi.applyCommand('setCellColor', { bg: '' })

内容の削除、切り取り、書式のクリアでは、セルの背景色は消えません。結合時は左上のセルの色を使い、分割時は新しくできるセルにも同じ色を適用します。追加した行・列は既定の背景で始まります。背景色の変更は、元に戻す・やり直すに対応しています。

セル内の配置と表の配置 ​

セルにカーソルがあるとき、配置は内部の段落や画像に適用されます。複数のセルを選ぶと、その中の配置可能な段落とオブジェクトにまとめて適用され、コードは除外されます。見出し・配置・ドロップキャップのツールバー状態も、実際に選択した内部段落に従います。選択した段落の値が混在する場合は、1つの値として表示しません。

表自体の配置を変えるには、プロパティツールの 表全体を選択 を押してから、メインツールバーの配置ボタンを使います。表を包む段落の前後にカーソルを置き、点線の枠が表示されている場合も同じ配置を使えます。この枠は対象を示すだけで、カーソルを表全体の選択に切り替えるものではありません。

ts
nabi.applyCommand('selectTable')
nabi.applyCommand('setAlign', { value: 'c' })

行・列の追加と削除、結合と分割は、選択したセルを基準に動作します。結合すると各セルのブロックが行順に残り、分割すると内容は元のセルに残って他のセルは空になります。

コピーと保存 ​

複数のセルを選んでコピーすると、画面に表示された長方形の範囲を最後のセルまでコピーします。HTML と内部クリップボード形式は、空のセル、結合、ブロック、文字書式、背景色を保持します。プレーンテキストではセルをタブと改行で区切り、セル内のブロック間の改行と画像・動画の URL を保持します。切り取りは選択したセルの内容だけを空にし、1回の「元に戻す」で復元できます。

表の前後にカーソルを置いて点線の枠が表示されている場合、コピー・切り取りは表を包む段落全体に適用されます。切り取りはクリップボードへの書き込みが成功してから、段落と表を一緒に削除します。フロート領域内の表を切り取ったり削除したりしても、外側のフロート領域は残ります。

JSON と HTML での保存は、セル内のブロックと背景色を保持します。単純な表は Markdown の表として書き出し、複数のブロックや背景色がある表は HTML として残して内容を保ちます。HTML では、セルの色名を td または th の data-nabi-cell-color 属性に保存します。外部 HTML の任意の背景色スタイルは、セルの背景色として取り込みません。

公開画面で列の並べ替えを使うには、表を並べ替え可能として保存し、nabi-note/viewer の attachViewer() を接続します。結合セルを含む表は、列の並べ替えの対象外です。

CSS スタイル ​

表は .nabi-content table、セルは .nabi-content :is(th, td) で装飾します。指定した背景色を上書きしないよう、縞模様と見出しセルの背景は、色がないセルにだけ適用します。

css
.article-body table { inline-size: 100%; border-collapse: collapse; }
.article-body :is(th, td) { padding: .6rem .75rem; border: 1px solid var(--nabi-line); }
.article-body th { font-weight: 700; }
.article-body th:not([data-nabi-cell-color]) { background: var(--nabi-soft); }
.article-body tr:nth-child(even) td:not([data-nabi-cell-color]) {
  background: color-mix(in srgb, var(--nabi-soft) 45%, transparent);
}

セルの背景色そのものは、--nabi-cell-yellow のような色名付き CSS 変数で変更します。以下の CSS をパッケージの CSS の後に読み込み、table-note クラスと現在のテーマの data-nabi-theme 値を、エディターの .nabi または公開画面の .nabi-content 要素に直接指定します。

css
.table-note:is(.nabi, .nabi-content)[data-nabi-theme="light"] {
  --nabi-cell-cyan: #e2f4f7;
}
.table-note:is(.nabi, .nabi-content)[data-nabi-theme="dark"] {
  --nabi-cell-cyan: #183b43;
}

viewer を接続している場合は、.nabi-sort ボタンを残してください。セルの position や右側の padding を強制的に上書きすると、並べ替えボタンと重なることがあります。