編輯器

Editor Indent

toolbar 縮排按鈕;段落、標題、清單層級。

安裝

Terminal
pnpm dlx shadcn-vue add @admin/editor-indent
import { createIndentHandlers, Indent } from '@/registry/admin/ui/editor-indent'

list 縮排可用 Tab / Shift-Tab(StarterKit)。本包補段落縮排:Indent extension 為 paragraph / heading 加上 data-indent;createIndentHandlers 含 indent/outdent handler,list 內走 sinkListItem/liftListItem,段落走 data-indent。

用法

<script setup lang="ts">import type { JSONContent } from '@tiptap/core'import type { EditorToolbarItem } from '@/components/admin/editor-toolbar'import { IconIndentDecrease, IconIndentIncrease } from '@tabler/icons-vue'import { ref } from 'vue'import { cn } from '@/lib/utils'import { baseProseClass } from '@/components/admin/editor'import { createIndentHandlers, editorIndentClass, Indent } from '@/components/admin/editor-indent'import { AdminEditorToolbar, defaultEditorItems } from '@/components/admin/editor-toolbar'import { AdminRichEditor, starterKitProseClass } from '@/components/admin/rich-editor'​const value = ref<JSONContent | string>(  '<h2>段落縮排</h2><p>選取這段,點 toolbar 的增加縮排鈕。</p><p>list 縮排仍可直接用 Tab / Shift-Tab。</p><ul><li>清單項目(Tab 縮排)</li></ul>')​// opt-in:注入 Indent extension + 注入成對的 indent/outdent handler(dual-mode)const extensions = [Indent]const handlers = createIndentHandlers()​// 預設 toolbar(無縮排鈕)後面 append indent/outdentconst items: EditorToolbarItem[][] = [  ...defaultEditorItems,  [    { kind: 'outdent', icon: IconIndentDecrease, label: '減少縮排', tooltip: { text: '減少縮排' } },    { kind: 'indent', icon: IconIndentIncrease, label: '增加縮排', tooltip: { text: '增加縮排' } }  ]]</script>​<template>  <admin-rich-editor    v-slot="{ editor, handlers: mergedHandlers }"    v-model="value"    :extensions="extensions"    :handlers="handlers"    :ui="{ base: cn(baseProseClass, starterKitProseClass, editorIndentClass) }"  >    <admin-editor-toolbar :editor :handlers="mergedHandlers" :items="items" />  </admin-rich-editor></template>
<script setup lang="ts">import type { EditorToolbarItem } from '@/registry/admin/ui/editor-toolbar'import { IconIndentDecrease, IconIndentIncrease } from '@tabler/icons-vue'import { ref } from 'vue'import { createIndentHandlers, Indent } from '@/registry/admin/ui/editor-indent'import { AdminEditorToolbar, defaultEditorItems } from '@/registry/admin/ui/editor-toolbar'import { AdminRichEditor } from '@/registry/admin/ui/rich-editor'​const value = ref('<p>段落內容</p>')​const extensions = [Indent]const handlers = createIndentHandlers()const items: EditorToolbarItem[][] = [  ...defaultEditorItems,  [    { kind: 'outdent', icon: IconIndentDecrease, label: '減少縮排', tooltip: { text: '減少縮排' } },    { kind: 'indent', icon: IconIndentIncrease, label: '增加縮排', tooltip: { text: '增加縮排' } }  ]]</script>​<template>  <admin-rich-editor v-model="value" :extensions="extensions" :handlers="handlers">    <admin-editor-toolbar :items="items" />  </admin-rich-editor></template>

啟用後:

  • paragraph / heading 縮排寫成 data-indent="<n>"(0–7,0 時省略 attribute)
  • 同一顆 indent / outdent 按鈕,在 list 內縮排 list item、在段落調整 data-indent
  • 縮到頂(7)或底(0)時按鈕自動 disabled
  • 段落縮排不綁 Tab(避免劫持鍵盤焦點切換);list 的 Tab / Shift-Tab 仍由 StarterKit 處理

樣式自套

data-indent 的視覺(左邊距)不內含於 registry,由使用者依需求自套 content class:

const indentContentClass = `  [&_[data-indent='1']]:ml-[2rem] [&_[data-indent='2']]:ml-[4rem]  /* …依級距 3–7 類推 */`

API 參考

  • Indent:tiptap extension,為 paragraph / heading 補 indent(0–7)attribute(序列化為 data-indent),並提供段落的 indent / outdent command
  • createIndentHandlers(): { indent, outdent }:成對的 indent / outdent handler,經 <AdminRichEditor :handlers> 注入