UNPKG

@udecode/plate-heading

Version:

Headings plugin for Plate

1 lines 3.93 kB
{"version":3,"sources":["../src/lib/BaseHeadingPlugin.ts","../src/lib/BaseTocPlugin.ts","../src/lib/transforms/insertToc.ts","../src/lib/utils/isHeading.ts"],"sourcesContent":["import {\n type PluginConfig,\n type SlatePlugin,\n createSlatePlugin,\n createTSlatePlugin,\n KEYS,\n} from '@udecode/plate';\n\nexport type HeadingConfig = PluginConfig<\n 'heading',\n {\n /** Heading levels supported from 1 to `levels` */\n levels?: HeadingLevel | HeadingLevel[];\n }\n>;\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n/** Enables support for headings with configurable levels (from 1 to 6). */\nexport const BaseHeadingPlugin = createTSlatePlugin<HeadingConfig>({\n key: 'heading',\n options: {\n levels: [1, 2, 3, 4, 5, 6],\n },\n}).extend(({ plugin }) => {\n const {\n options: { levels },\n } = plugin;\n\n const plugins: SlatePlugin[] = [];\n\n const headingLevels = Array.isArray(levels)\n ? levels\n : Array.from({ length: levels || 6 }, (_, i) => i + 1);\n\n headingLevels.forEach((level) => {\n const plugin: SlatePlugin = createSlatePlugin({\n key: KEYS.heading[level - 1],\n node: { isElement: true },\n parsers: {\n html: {\n deserializer: {\n rules: [\n {\n validNodeName: `H${level}`,\n },\n ],\n },\n },\n },\n render: { as: `h${level}` as any },\n });\n\n plugins.push(plugin);\n });\n\n return {\n plugins,\n };\n});\n","import {\n type PluginConfig,\n type SlateEditor,\n createTSlatePlugin,\n KEYS,\n} from '@udecode/plate';\n\nimport type { Heading } from './types';\n\nexport type TocConfig = PluginConfig<\n 'toc',\n {\n isScroll: boolean;\n topOffset: number;\n queryHeading?: (editor: SlateEditor) => Heading[];\n }\n>;\n\nexport const BaseTocPlugin = createTSlatePlugin<TocConfig>({\n key: KEYS.toc,\n node: { isElement: true, isVoid: true },\n options: {\n isScroll: true,\n topOffset: 80,\n },\n});\n","import type { InsertNodesOptions, SlateEditor, TElement } from '@udecode/plate';\n\nimport { KEYS } from '@udecode/plate';\n\nexport const insertToc = (\n editor: SlateEditor,\n options?: InsertNodesOptions\n) => {\n editor.tf.insertNodes<TElement>(\n {\n children: [{ text: '' }],\n type: editor.getType(KEYS.toc),\n },\n options as any\n );\n};\n","import { type TNode, KEYS } from '@udecode/plate';\n\nexport const isHeading = (node: TNode) => {\n return node.type && KEYS.heading.includes(node.type as any);\n};\n"],"mappings":";AAAA;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaA,IAAM,oBAAoB,mBAAkC;AAAA,EACjE,KAAK;AAAA,EACL,SAAS;AAAA,IACP,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC3B;AACF,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM;AACxB,QAAM;AAAA,IACJ,SAAS,EAAE,OAAO;AAAA,EACpB,IAAI;AAEJ,QAAM,UAAyB,CAAC;AAEhC,QAAM,gBAAgB,MAAM,QAAQ,MAAM,IACtC,SACA,MAAM,KAAK,EAAE,QAAQ,UAAU,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAEvD,gBAAc,QAAQ,CAAC,UAAU;AAC/B,UAAMA,UAAsB,kBAAkB;AAAA,MAC5C,KAAK,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC3B,MAAM,EAAE,WAAW,KAAK;AAAA,MACxB,SAAS;AAAA,QACP,MAAM;AAAA,UACJ,cAAc;AAAA,YACZ,OAAO;AAAA,cACL;AAAA,gBACE,eAAe,IAAI,KAAK;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,EAAE,IAAI,IAAI,KAAK,GAAU;AAAA,IACnC,CAAC;AAED,YAAQ,KAAKA,OAAM;AAAA,EACrB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,EACF;AACF,CAAC;;;AC3DD;AAAA,EAGE,sBAAAC;AAAA,EACA,QAAAC;AAAA,OACK;AAaA,IAAM,gBAAgBD,oBAA8B;AAAA,EACzD,KAAKC,MAAK;AAAA,EACV,MAAM,EAAE,WAAW,MAAM,QAAQ,KAAK;AAAA,EACtC,SAAS;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF,CAAC;;;ACvBD,SAAS,QAAAC,aAAY;AAEd,IAAM,YAAY,CACvB,QACA,YACG;AACH,SAAO,GAAG;AAAA,IACR;AAAA,MACE,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,MACvB,MAAM,OAAO,QAAQA,MAAK,GAAG;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;;;ACfA,SAAqB,QAAAC,aAAY;AAE1B,IAAM,YAAY,CAAC,SAAgB;AACxC,SAAO,KAAK,QAAQA,MAAK,QAAQ,SAAS,KAAK,IAAW;AAC5D;","names":["plugin","createTSlatePlugin","KEYS","KEYS","KEYS"]}