@meowdown/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,23 @@ The editor extension binds inline-format toggles (`Mod` = Cmd on macOS, Ctrl els
13
13
  | `Mod-E` | `editor.commands.toggleCode()` | `` `code` `` |
14
14
  | `Mod-Shift-X` | `editor.commands.toggleDel()` | `~~strikethrough~~` |
15
15
 
16
+ Heading shortcuts toggle the current block to a heading of that level (or back to a paragraph):
17
+
18
+ | Key | Action |
19
+ | --------------------- | --------- |
20
+ | `Mod-1` / `Mod-Alt-1` | Heading 1 |
21
+ | `Mod-2` / `Mod-Alt-2` | Heading 2 |
22
+ | `Mod-3` / `Mod-Alt-3` | Heading 3 |
23
+ | `Mod-4` / `Mod-Alt-4` | Heading 4 |
24
+ | `Mod-5` / `Mod-Alt-5` | Heading 5 |
25
+ | `Mod-6` / `Mod-Alt-6` | Heading 6 |
26
+
27
+ `EDITOR_KEY_BINDINGS` exports a `Record<string, string>` mapping every key above to its description, for host settings UIs and keybinding-collision checks.
28
+
29
+ ## Round-trip fidelity
30
+
31
+ `checkRoundTrip(markdown)` reports how faithfully markdown survives a parse-then-serialize round trip: `'exact'` (byte-identical modulo the trailing newline), `'normalizing'` (same non-blank lines, only blank-line layout differs), or `'lossy'` (a non-blank line changed, e.g. setext headings or raw HTML blocks). Hosts that keep markdown on disk can gate saves on it, opening lossy files read-only so a save never rewrites content.
32
+
16
33
  ## Styling
17
34
 
18
35
  `@meowdown/core/style.css` ships a default editor theme. Colors use `light-dark()`, so they follow the page's `color-scheme` (set `color-scheme: light dark` on `:root` for automatic dark mode). Customize by overriding these variables on `:root` or any ancestor:
@@ -22,14 +39,25 @@ The editor extension binds inline-format toggles (`Mod` = Cmd on macOS, Ctrl els
22
39
  - `--meowdown-muted`: secondary text (blockquotes).
23
40
  - `--meowdown-accent`: links, wikilinks, caret, inline code, tags.
24
41
  - `--meowdown-mark`: Markdown syntax characters.
25
- - `--meowdown-border`: horizontal rules.
42
+ - `--meowdown-border`: horizontal rules and table borders.
26
43
  - `--meowdown-code-bg`: code block background.
44
+ - `--meowdown-table-header-bg`: table header row background.
45
+ - `--meowdown-image-max-height`: max height of rendered inline images.
46
+ - `--meowdown-image-radius`: corner radius of rendered inline images.
47
+ - `--meowdown-placeholder`: placeholder text color (defaults to `--meowdown-muted`).
27
48
  - `--meowdown-font-mono`: monospace font stack.
28
49
  - `--meowdown-gutter`: horizontal editor padding. Floating UI such as the block handle (in `@meowdown/react`) lives inside it; keep it at least `3.5rem`.
50
+ - `--meowdown-selection`: text `::selection` background.
51
+ - `--meowdown-node-outline`: outline of a selected node; border color of selected tables and cells.
52
+ - `--meowdown-node-selection`: background wash of a selected node or selected cells.
53
+
54
+ Selection colors are standalone variables, not derived from `--meowdown-accent`, so selection can be restyled independently.
29
55
 
30
56
  Tags (`#tag`) render as pills via the `.md-tag` class, tinted from `--meowdown-accent`.
31
57
 
32
- Wikilinks (`[[target]]`) render with a dashed underline via the `.md-wikilink` class, colored by `--meowdown-accent`. Their `[[` `]]` brackets behave like other syntax characters: dimmed in show mode, hidden in hide and focus modes.
58
+ Wikilinks (`[[target]]`) render with a dashed underline via the `.md-wikilink` class, colored by `--meowdown-accent`, with a pointer cursor. Their `[[` `]]` brackets behave like other syntax characters: dimmed in show mode, hidden in hide and focus modes. Wire click navigation with `defineWikilinkClickHandler(({ target, event }) => ...)` (or `@meowdown/react`'s `onWikilinkClick` prop).
59
+
60
+ Inline images (`![alt](src)`) stay literal text and render beneath their line as a widget decoration when a host resolves the `src` to a URL. Add it with `defineImages({ resolveImageUrl, onImagePaste })` (or `@meowdown/react`'s image props).
33
61
 
34
62
  ## License
35
63
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import { Editor, PlainExtension } from "@prosekit/core";
2
+ import { CodeBlockAttrs } from "@prosekit/extensions/code-block";
2
3
  import { ProseMirrorNode } from "@prosekit/pm/model";
4
+ import { PlaceholderOptions, definePlaceholder } from "@prosekit/extensions/placeholder";
5
+ import { defineReadonly } from "@prosekit/extensions/readonly";
3
6
 
4
7
  //#region src/extensions/extension.d.ts
5
- declare function defineEditorExtensionImpl(): import("@prosekit/core").Union<readonly [import("@prosekit/extensions/paragraph").ParagraphExtension, import("@prosekit/extensions/doc").DocExtension, import("@prosekit/extensions/text").TextExtension, import("@prosekit/extensions/blockquote").BlockquoteExtension, import("@prosekit/extensions/list").ListExtension, import("@prosekit/extensions/heading").HeadingExtension, import("@prosekit/extensions/table").TableExtension, import("@prosekit/extensions/code-block").CodeBlockExtension, import("@prosekit/extensions/horizontal-rule").HorizontalRuleExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
8
+ declare function defineEditorExtensionImpl(): import("@prosekit/core").Union<readonly [import("@prosekit/extensions/paragraph").ParagraphExtension, import("@prosekit/extensions/doc").DocExtension, import("@prosekit/extensions/text").TextExtension, import("@prosekit/extensions/blockquote").BlockquoteExtension, import("@prosekit/extensions/list").ListExtension, import("@prosekit/extensions/heading").HeadingExtension, import("@prosekit/core").Union<readonly [import("@prosekit/extensions/table").TableSpecExtension, import("@prosekit/extensions/table").TableRowSpecExtension, import("@prosekit/extensions/table").TableCellSpecExtension, import("@prosekit/extensions/table").TableHeaderCellSpecExtension, import("@prosekit/core").PlainExtension, import("@prosekit/extensions/table").TableCommandsExtension, import("@prosekit/core").PlainExtension]>, import("@prosekit/extensions/code-block").CodeBlockExtension, import("@prosekit/extensions/horizontal-rule").HorizontalRuleExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
6
9
  Marks: {
7
10
  mdMark: import("@prosekit/pm/model").Attrs;
8
11
  };
@@ -40,14 +43,14 @@ declare function defineEditorExtensionImpl(): import("@prosekit/core").Union<rea
40
43
  Marks: {
41
44
  mdWikilink: import("@prosekit/pm/model").Attrs;
42
45
  };
43
- }>]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
46
+ }>]>, import("@prosekit/core").Extension<import("@prosekit/core").ExtensionTyping<any, any, any>>, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
44
47
  Commands: {
45
48
  toggleEm: [];
46
49
  toggleStrong: [];
47
50
  toggleCode: [];
48
51
  toggleDel: [];
49
52
  };
50
- }>, import("@prosekit/core").PlainExtension]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").BaseCommandsExtension, import("@prosekit/core").HistoryExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension]>;
53
+ }>, import("@prosekit/core").PlainExtension]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").BaseCommandsExtension, import("@prosekit/core").HistoryExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension]>;
51
54
  type EditorExtension = ReturnType<typeof defineEditorExtensionImpl>;
52
55
  declare function defineEditorExtension(): EditorExtension;
53
56
  type TypedEditor = Editor<EditorExtension>;
@@ -64,6 +67,39 @@ type TypedEditor = Editor<EditorExtension>;
64
67
  type MarkMode = 'hide' | 'focus' | 'show';
65
68
  declare function defineMarkMode(mode: MarkMode): PlainExtension;
66
69
  //#endregion
70
+ //#region src/extensions/wikilink-click.d.ts
71
+ interface WikilinkClickPayload {
72
+ target: string;
73
+ event: MouseEvent;
74
+ }
75
+ type WikilinkClickHandler = (payload: WikilinkClickPayload) => void;
76
+ declare function defineWikilinkClickHandler(onClick: WikilinkClickHandler): PlainExtension;
77
+ //#endregion
78
+ //#region src/extensions/images.d.ts
79
+ interface ImageOptions {
80
+ /** Map a markdown `src` to a displayable URL, or `undefined` to skip rendering. */
81
+ resolveImageUrl: (src: string) => string | undefined;
82
+ /** Persist a pasted/dropped image file and return its markdown `src`, or `undefined` to decline. */
83
+ onImagePaste?: (file: File) => Promise<string | undefined>;
84
+ /** Called when persisting a pasted/dropped image throws. Defaults to `console.error`. */
85
+ onImageSaveError?: (error: Error, file: File) => void;
86
+ }
87
+ /** Inline image rendering (widget decorations) plus paste/drop persistence. */
88
+ declare function defineImages(options: ImageOptions): PlainExtension;
89
+ //#endregion
90
+ //#region src/extensions/key-bindings.d.ts
91
+ /** Human-readable descriptions of the editor's formatting and heading shortcuts. */
92
+ declare const EDITOR_KEY_BINDINGS: Record<string, string>;
93
+ //#endregion
94
+ //#region src/extensions/code-block-languages.d.ts
95
+ /**
96
+ * A list of languages for code block syntax-highlight.
97
+ */
98
+ declare const codeBlockLanguages: ReadonlyArray<{
99
+ label: string;
100
+ value: string;
101
+ }>;
102
+ //#endregion
67
103
  //#region src/converters/pm-to-md.d.ts
68
104
  /**
69
105
  * Convert a ProseMirror document into a Markdown string.
@@ -95,4 +131,15 @@ declare function docToMarkdown(node: ProseMirrorNode): string;
95
131
  */
96
132
  declare function markdownToDoc(editor: TypedEditor, markdown: string): ProseMirrorNode;
97
133
  //#endregion
98
- export { type EditorExtension, type MarkMode, type TypedEditor, defineEditorExtension, defineMarkMode, docToMarkdown, markdownToDoc };
134
+ //#region src/converters/check-roundtrip.d.ts
135
+ /**
136
+ * How faithfully markdown survives a parse-then-serialize round trip:
137
+ * - `exact`: byte-identical (modulo the trailing newline).
138
+ * - `normalizing`: same non-blank lines, only blank-line layout differs.
139
+ * - `lossy`: a non-blank line changed, so content would be lost or altered.
140
+ */
141
+ type RoundTripFidelity = 'exact' | 'normalizing' | 'lossy';
142
+ /** Classify how `markdown` survives the editor's parse-then-serialize round trip. */
143
+ declare function checkRoundTrip(markdown: string): RoundTripFidelity;
144
+ //#endregion
145
+ export { type CodeBlockAttrs, EDITOR_KEY_BINDINGS, type EditorExtension, type ImageOptions, type MarkMode, type PlaceholderOptions, type RoundTripFidelity, type TypedEditor, type WikilinkClickHandler, type WikilinkClickPayload, checkRoundTrip, codeBlockLanguages, defineEditorExtension, defineImages, defineMarkMode, definePlaceholder, defineReadonly, defineWikilinkClickHandler, docToMarkdown, markdownToDoc };
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
- import{defineBaseCommands as e,defineBaseKeymap as t,defineCommands as n,defineHistory as r,defineKeymap as i,defineMarkSpec as a,definePlugin as o,union as s}from"@prosekit/core";import{defineBlockquote as c}from"@prosekit/extensions/blockquote";import{defineCodeBlock as l}from"@prosekit/extensions/code-block";import{defineDoc as u}from"@prosekit/extensions/doc";import{defineGapCursor as d}from"@prosekit/extensions/gap-cursor";import{defineHeading as ee}from"@prosekit/extensions/heading";import{defineHorizontalRule as te}from"@prosekit/extensions/horizontal-rule";import{defineList as ne}from"@prosekit/extensions/list";import{defineModClickPrevention as re}from"@prosekit/extensions/mod-click-prevention";import{defineParagraph as ie}from"@prosekit/extensions/paragraph";import{defineTable as ae}from"@prosekit/extensions/table";import{defineText as oe}from"@prosekit/extensions/text";import{defineVirtualSelection as se}from"@prosekit/extensions/virtual-selection";import{Plugin as f,PluginKey as p,TextSelection as m}from"@prosekit/pm/state";import{ReplaceStep as ce,Step as h,StepResult as g,Transform as _}from"@prosekit/pm/transform";import{Mark as le}from"@prosekit/pm/model";import{GFM as v,parser as ue}from"@lezer/markdown";import{Decoration as de,DecorationSet as y}from"@prosekit/pm/view";function fe(e){let[t,n,r]=e;return[t,n,r.map(e=>e.toJSON())]}function pe(e,t){let[n,r,i]=t;return[n,r,i.map(t=>le.fromJSON(e,t))]}var b=class e extends h{constructor(e){super(),this.chunks=e}apply(e){if(this.chunks.length===0)return g.ok(e);let t=e.content.size,n;for(let[r,i,a]of this.chunks){if(r>=i)continue;let o=Math.max(0,Math.min(r,t)),s=Math.max(o,Math.min(i,t));o>=s||e.nodesBetween(o,s,(t,r)=>{if(!t.isText)return!0;let i=Math.max(o,r),c=Math.min(s,r+t.nodeSize);if(i>=c)return!1;let l=t.marks;for(let t of l)t.isInSet(a)||(n??=new _(e),n.removeMark(i,c,t));for(let t of a)t.isInSet(l)||(n??=new _(e),n.addMark(i,c,t));return!1})}return g.ok(n?n.doc:e)}invert(e){if(this.chunks.length===0)return me;let t=this.chunks[0][0],n=this.chunks[0][1];for(let[,e]of this.chunks)e>n&&(n=e);let r=e.content.size,i=Math.max(0,Math.min(t,r)),a=Math.max(i,Math.min(n,r));return new ce(i,a,e.slice(i,a),!1)}map(e){return null}toJSON(){return{stepType:`batchSetMark`,chunks:this.chunks.map(fe)}}static fromJSON(t,n){let r=n.chunks;return new e(r.map(e=>pe(t,e)))}};h.jsonID(`batchSetMark`,b);const me=new b([]);function he(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===45||e===95||e>127&&/[\p{L}\p{N}]/u.test(String.fromCharCode(e))}function ge(e){return e>=65&&e<=90||e>=97&&e<=122||e>127&&/\p{L}/u.test(String.fromCharCode(e))}const _e={defineNodes:[{name:`Hashtag`}],parseInline:[{name:`Hashtag`,parse(e,t,n){if(t!==35||!/\s|^$/.test(e.slice(n-1,n)))return-1;let r=n+1,i=!1;for(;r<e.end;){let t=e.char(r);if(!he(t))break;i||=ge(t),r++}return i?e.addElement(e.elt(`Hashtag`,n,r)):-1}}]},ve={defineNodes:[{name:`Wikilink`},{name:`WikilinkMark`}],parseInline:[{name:`Wikilink`,before:`Link`,parse(e,t,n){if(t!==91||e.char(n+1)!==91)return-1;let r=!1;for(let t=n+2;t<e.end-1;t++){let i=e.char(t);if(i===93){if(e.char(t+1)!==93||!r)return-1;let i=t+2;return e.addElement(e.elt(`Wikilink`,n,i,[e.elt(`WikilinkMark`,n,n+2),e.elt(`WikilinkMark`,t,i)]))}if(i===91||i===10)return-1;i!==32&&i!==9&&(r=!0)}return-1}}]};function ye(e){return e.end}const x=ue.configure([v,_e,ve]),be=x.configure({parseInline:[{name:`SkipInline`,before:`Escape`,parse:ye}]});function S(e){return x.parseInline(e,0)}function C(e,t,n=[]){for(let r of e)t(r)&&n.push(r),C(r.children,t,n);return n}function xe(e){let t={};for(let n of e.nodeSet.types)t[n.name]=n.id;return t}const w=xe(x);function Se(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!e[n].eq(t[n]))return!1;return!0}const T=new Map([[w.Emphasis,`mdEm`],[w.StrongEmphasis,`mdStrong`],[w.InlineCode,`mdCode`],[w.Strikethrough,`mdDel`],[w.EmphasisMark,`mdMark`],[w.CodeMark,`mdMark`],[w.LinkMark,`mdMark`],[w.StrikethroughMark,`mdMark`],[w.URL,`mdLinkUri`],[w.Hashtag,`mdTag`],[w.Wikilink,`mdWikilink`],[w.WikilinkMark,`mdMark`]]);function Ce(e,t){let n=S(t),r=[];return E(n,[],0,t.length,t,e,r),r}function E(e,t,n,r,i,a,o){let s=n;for(let n of e){if(n.from>s&&D(o,s,n.from,t),n.type===w.Link||n.type===w.Image)we(n,t,i,a,o);else{let e=T.get(n.type),r=e?[...t,a.marks[e].create()]:t;n.children.length===0?D(o,n.from,n.to,r):E(n.children,r,n.from,n.to,i,a,o)}s=n.to}s<r&&D(o,s,r,t)}function we(e,t,n,r,i){let a=-1,o=null,s=0;for(let t of e.children)t.type===w.LinkMark?(s++,s===2&&(a=t.from)):t.type===w.URL&&o===null&&(o=t);let c=o?n.slice(o.from,o.to):``,l=c&&r.marks.mdLinkText?r.marks.mdLinkText.create({href:c}):null,u=e=>a>=0&&e<a&&l!==null,d=e.from;for(let a of e.children){if(a.from>d){let e=u(d)?[...t,l]:t;D(i,d,a.from,e)}let e=u(a.from)?[...t,l]:t,o=T.get(a.type),s=o?[...e,r.marks[o].create()]:e;a.children.length===0?D(i,a.from,a.to,s):E(a.children,s,a.from,a.to,n,r,i),d=a.to}d<e.to&&D(i,d,e.to,t)}function D(e,t,n,r){if(t>=n)return;let i=e.at(-1);if(i&&i[1]===t&&Se(i[2],r)){e[e.length-1]=[i[0],n,i[2]];return}e.push([t,n,r])}const O=`inline-marks-applied`,k=new WeakMap;let Te=0,Ee=0;function De(e,t,n){let r=k.get(e);if(r?Ee++:(Te++,r=Ce(n,e.textContent),k.set(e,r)),t===0)return r;let i=[];for(let[e,n,a]of r)i.push([e+t,n+t,a]);return i}function Oe(e,t){let n=1/0,r=-1/0;for(let t of e)for(let e of t.mapping.maps)e.forEach((e,t,i,a)=>{i<n&&(n=i),a>r&&(r=a)});let i=t.doc.content.size;return n>r?{from:0,to:i}:{from:Math.max(0,n),to:Math.min(i,r)}}function ke(e,t){let n=[];return e.doc.nodesBetween(t.from,t.to,(t,r)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;if(t.childCount===0)return!1;let i=De(t,r+1,e.schema);return i.length>0&&n.push(...i),!1}),n}function Ae(){return new f({key:new p(`inline-mark`),appendTransaction(e,t,n){for(let t of e)if(t.getMeta(O))return null;let r=ke(n,Oe(e,n));if(r.length===0)return null;let i=n.tr.step(new b(r));return i.setMeta(O,!0),i.setMeta(`addToHistory`,!1),i},view(e){return e.dispatch(je(e.state)),{}}})}function je(e){return e.tr.setMeta(`inline-marks-trigger`,!0)}function Me(){return o(Ae())}function Ne(){return a({name:`mdMark`,inclusive:!1,toDOM:()=>[`span`,{class:`md-mark`},0],parseDOM:[{tag:`span.md-mark`}]})}function Pe(){return a({name:`mdEm`,toDOM:()=>[`em`,0],parseDOM:[{tag:`em`}]})}function Fe(){return a({name:`mdStrong`,toDOM:()=>[`strong`,0],parseDOM:[{tag:`strong`}]})}function Ie(){return a({name:`mdCode`,toDOM:()=>[`code`,0],parseDOM:[{tag:`code`}]})}function Le(){return a({name:`mdLinkText`,inclusive:!1,attrs:{href:{default:``}},toDOM:e=>[`a`,{href:e.attrs.href},0],parseDOM:[{tag:`a`,getAttrs:e=>({href:e.getAttribute(`href`)??``})}]})}function Re(){return a({name:`mdLinkUri`,inclusive:!1,toDOM:()=>[`span`,{class:`md-link-uri`},0],parseDOM:[{tag:`span.md-link-uri`}]})}function ze(){return a({name:`mdDel`,toDOM:()=>[`del`,0],parseDOM:[{tag:`del`}]})}function Be(){return a({name:`mdTag`,toDOM:()=>[`span`,{class:`md-tag`},0],parseDOM:[{tag:`span.md-tag`}]})}function Ve(){return a({name:`mdWikilink`,inclusive:!1,toDOM:()=>[`span`,{class:`md-wikilink`},0],parseDOM:[{tag:`span.md-wikilink`}]})}function He(){return s(Ne(),Pe(),Fe(),Ie(),Le(),Re(),ze(),Be(),Ve())}function A(e,t=0){let n=t,r=0;for(let t=0;t<e.length;t++)e.charCodeAt(t)===96?(r++,r>n&&(n=r)):r=0;return n}const j={em:{node:w.Emphasis,delim:`*`},strong:{node:w.StrongEmphasis,delim:`**`},code:{node:w.InlineCode,delim:"`"},del:{node:w.Strikethrough,delim:`~~`}},Ue=new Set([w.EmphasisMark,w.CodeMark,w.LinkMark,w.StrikethroughMark]);function M(e){return[e.children[0],e.children.at(-1)]}function N(e){let{type:t,children:n}=e;if(t===w.Emphasis||t===w.StrongEmphasis||t===w.Strikethrough)return[n[0].to,n.at(-1).from];if(t===w.Link||t===w.Image){let e=n.find((e,t)=>t>0&&e.type===w.LinkMark);return e?[n[0].to,e.from]:null}return null}function P(e,t,n){for(let r of e){if(r.to<=t||r.from>=n||t<=r.from&&r.to<=n)continue;let i=N(r);return i&&i[0]<=t&&n<=i[1]?P(r.children,t,n):P(e,Math.min(t,r.from),Math.max(n,r.to))}return[t,n]}function F(e,t,n){for(let r of e)if(!(r.to<=t||r.from>=n)&&(t>r.from||r.to>n))return F(e,Math.min(t,r.from),Math.max(n,r.to));return[t,n]}const I=e=>e===` `||e===` `;function We(e,t,n){for(;t<n&&I(e[t]);)t++;for(;n>t&&I(e[n-1]);)n--;return[t,n]}function Ge(e,t,n,r){let i=C(S(e),e=>e.type===r.node||Ue.has(e.type));for(let r=t;r<n;r++)if(!I(e[r])&&!i.some(e=>e.from<=r&&r<e.to))return!1;return!0}function Ke(e,t,n,r,i){let a=S(e),o=C(a,e=>e.type===r.node);return i?Ye(e,o,t,n):qe(e,a,o,t,n,r)}function qe(e,t,n,r,i,a){for(let e=0;e!==i-r;){e=i-r,[r,i]=P(t,r,i);for(let e of n)e.to===r&&(r=e.from),e.from===i&&(i=e.to)}let o=[];for(let e of n)if(r<=e.from&&e.to<=i){let[t,n]=M(e);o.push({from:t.from,to:t.to,insert:``}),o.push({from:n.from,to:n.to,insert:``})}let[s,c]=Je(e,r,i,o,a);return o.push({from:r,to:r,insert:s},{from:i,to:i,insert:c}),o}function Je(e,t,n,r,i){if(i.node!==w.InlineCode)return[i.delim,i.delim];let a=e.slice(t,n);for(let e of[...r].sort((e,t)=>t.from-e.from))a=a.slice(0,e.from-t)+a.slice(e.to-t);let o="`".repeat(A(a)+1),s=a.startsWith("`")||a.endsWith("`")?` `:``;return[o+s,s+o]}function Ye(e,t,n,r){let i=[];for(let a of t){if(a.to<=n||a.from>=r)continue;let[t,o]=M(a),s=Math.max(n,t.to),c=Math.min(r,o.from);for(s>=c&&([s,c]=[t.to,o.from]),[s,c]=F(a.children.slice(1,-1),s,c);s>t.to&&I(e[s-1]);)s--;for(;c<o.from&&I(e[c]);)c++;s>t.to?i.push({from:s,to:s,insert:e.slice(o.from,o.to)}):i.push({from:t.from,to:t.to,insert:``}),c<o.from?i.push({from:c,to:c,insert:e.slice(t.from,t.to)}):i.push({from:o.from,to:o.to,insert:``})}return i}function Xe(e,t,n){let{delim:r}=n,i=r.length;if(e.slice(t-i,t)===r&&e.startsWith(r,t)&&e[t-i-1]!==r[0]&&e[t+i]!==r[0])return{kind:`unwrap`,from:t-i,to:t+i};let a=S(e),o=C(a,e=>e.type===n.node).findLast(e=>e.from<=t&&t<=e.to);if(o){let[e,n]=M(o);return{kind:`move`,pos:t===o.from?e.to:t===o.to?n.from:o.to}}return L(a,t)||e[t-1]===r[0]||e[t]===r[0]?null:{kind:`insert`,pos:t}}function L(e,t){for(let n of e)if(n.from<t&&t<n.to){let e=N(n);return!e||t<e[0]||t>e[1]?!0:L(n.children,t)}return!1}function R(e){return(t,n)=>{if(t.selection.empty)return Ze(e,t,n);let{from:r,to:i,anchor:a,head:o}=t.selection,s=[];t.doc.nodesBetween(r,i,(t,n)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;let a=t.textContent,o=n+1,[c,l]=We(a,Math.max(r-o,0),Math.min(i-o,a.length));return c<l&&s.push({text:a,base:o,from:c,to:l,active:Ge(a,c,l,e)}),!1});let c=s.length>0&&s.every(e=>e.active),l=s.filter(e=>c||!e.active).flatMap(t=>Ke(t.text,t.from,t.to,e,c).map(e=>({from:e.from+t.base,to:e.to+t.base,insert:e.insert})));if(l.length===0)return!1;if(n){let e=t.tr;l.sort((e,t)=>t.from-e.from||t.to-e.to);for(let t of l)t.insert?e.insertText(t.insert,t.from,t.to):e.delete(t.from,t.to);e.setSelection(m.create(e.doc,e.mapping.map(a,a<=o?1:-1),e.mapping.map(o,o<a?1:-1))),n(e.scrollIntoView())}return!0}}function Ze(e,t,n){let{$from:r}=t.selection,i=r.parent;if(!i.isTextblock||i.type.spec.code)return!1;let a=Xe(i.textContent,r.parentOffset,e);if(!a)return!1;if(n){let i=r.start(),o=t.tr;a.kind===`unwrap`&&o.delete(i+a.from,i+a.to),a.kind===`move`&&o.setSelection(m.create(o.doc,i+a.pos)),a.kind===`insert`&&(o.insertText(e.delim+e.delim,i+a.pos),o.setSelection(m.create(o.doc,i+a.pos+e.delim.length))),n(o.scrollIntoView())}return!0}function Qe(){return s(n({toggleEm:()=>R(j.em),toggleStrong:()=>R(j.strong),toggleCode:()=>R(j.code),toggleDel:()=>R(j.del)}),i({"Mod-b":R(j.strong),"Mod-i":R(j.em),"Mod-e":R(j.code),"Mod-Shift-x":R(j.del)}))}function $e(){return s(ie(),u(),oe(),c(),ne(),ee(),ae(),l(),te(),He(),Me(),Qe(),t(),e(),r(),d(),se(),re())}function et(){return $e()}const tt=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdLinkText`,`mdLinkUri`,`mdWikilink`]),nt=new Set([`mdMark`,`mdLinkUri`]),rt=new Set([`mdMark`,`mdLinkUri`]),z=new Set([`mdLinkText`,`mdLinkUri`]),it=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdWikilink`]);function at(e){return new f({key:new p(`mark-mode`),props:{attributes:{"data-mark-mode":e},decorations:e===`focus`?e=>ct(e):void 0,clipboardTextSerializer:e===`show`?void 0:st}})}function ot(e){return o(at(e))}function st(e){let t=[];return e.content.forEach(e=>{let n=[];e.descendants(e=>!e.isText||!e.text?!0:(e.marks.some(e=>rt.has(e.type.name))||n.push(e.text),!1)),t.push(n.join(``))}),t.join(`
2
- `)}function ct(e){let{$anchor:t,empty:n}=e.selection;if(!n)return y.empty;let r=t.parent;if(!r.isTextblock)return null;let i=t.start(),a=t.parentOffset,o=lt(r,a);if(o.size===0)return y.empty;let s=[],c=new Set,l=!1;for(let e of o)if(z.has(e)){if(l)continue;l=!0,dt(r,i,a,s,c)}else ut(r,i,e,a,s,c);let u=s.map(([e,t])=>de.inline(e,t,{class:`show`}));return y.create(e.doc,u)}function lt(e,t){let n=new Set,r=0;return e.forEach(e=>{let i=r+e.nodeSize;if(t>=r&&t<=i)for(let t of e.marks){let e=t.type.name;tt.has(e)&&n.add(e)}r=i}),n}function ut(e,t,n,r,i,a){let o=t,s=0,c=-1,l=-1;e.forEach(u=>{let d=u.marks.some(e=>e.type.name===n);d&&c===-1&&(c=o,l=s),!d&&c!==-1&&(r>=l&&r<=s&&V(e,t,c,o,i,a),c=-1,l=-1),o+=u.nodeSize,s+=u.nodeSize}),c!==-1&&r>=l&&r<=s&&V(e,t,c,o,i,a)}function dt(e,t,n,r,i){let a=e.childCount;if(a===0)return;let o=-1,s=0;for(let t=0;t<a;t++){let r=e.child(t),i=s+r.nodeSize;if(n>=s&&n<=i&&r.marks.some(e=>z.has(e.type.name))){o=t;break}s=i}if(o===-1)return;let c=o;for(;c>0&&B(e.child(c-1));)c--;let l=o;for(;l<a-1&&B(e.child(l+1));)l++;let u=t;for(let t=0;t<c;t++)u+=e.child(t).nodeSize;let d=u;for(let t=c;t<=l;t++)d+=e.child(t).nodeSize;V(e,t,u,d,r,i)}function B(e){let t=!1,n=!1,r=!1;for(let i of e.marks){let e=i.type.name;e===`mdMark`?t=!0:z.has(e)?n=!0:it.has(e)&&(r=!0)}return!!(n||t&&!r)}function V(e,t,n,r,i,a){let o=t;e.forEach(e=>{let t=o,s=o+e.nodeSize;if(t>=n&&s<=r)for(let n of e.marks){let e=n.type.name;if(nt.has(e)){let e=`${t}_${s}`;a.has(e)||(a.add(e),i.push([t,s]));break}}o=s})}function ft(e){let t=new mt;return H(e,t),t.finish()}const pt=[``,`# `,`## `,`### `,`#### `,`##### `,`###### `];var mt=class{constructor(){this.parts=[],this.linePrefix=``,this.pendingFirst=null,this.atLineStart=!0,this.deferredBlankPrefix=null}write(e){if(e===``)return;if(this.emitDeferredBlankLine(),this.atLineStart&&=(this.parts.push(this.pendingFirst??this.linePrefix),this.pendingFirst=null,!1),!e.includes(`
1
+ import{createEditor as e,defineBaseCommands as t,defineBaseKeymap as n,defineCommands as r,defineHistory as i,defineKeymap as a,defineMarkSpec as o,definePlugin as s,getMarkType as c,isApple as l,toggleNode as u,union as d,withSkipCodeBlock as ee}from"@prosekit/core";import{defineBlockquote as te}from"@prosekit/extensions/blockquote";import{defineCodeBlock as ne,defineCodeBlockHighlight as re}from"@prosekit/extensions/code-block";import{defineDoc as ie}from"@prosekit/extensions/doc";import{defineGapCursor as ae}from"@prosekit/extensions/gap-cursor";import{defineHeading as oe}from"@prosekit/extensions/heading";import{defineHorizontalRule as se}from"@prosekit/extensions/horizontal-rule";import{defineList as ce}from"@prosekit/extensions/list";import{defineModClickPrevention as le}from"@prosekit/extensions/mod-click-prevention";import{defineParagraph as ue}from"@prosekit/extensions/paragraph";import{defineText as de}from"@prosekit/extensions/text";import{defineVirtualSelection as fe}from"@prosekit/extensions/virtual-selection";import{LanguageDescription as pe}from"@codemirror/language";import{languages as f}from"@codemirror/language-data";import{classHighlighter as me}from"@lezer/highlight";import{createParser as he}from"prosemirror-highlight/lezer";import{Plugin as p,PluginKey as m,TextSelection as h}from"@prosekit/pm/state";import{ReplaceStep as ge,Step as g,StepResult as _,Transform as _e}from"@prosekit/pm/transform";import{Mark as ve}from"@prosekit/pm/model";import{GFM as ye,parser as be}from"@lezer/markdown";import{defineTableCellSpec as xe,defineTableCommands as Se,defineTableDropIndicator as Ce,defineTableHeaderCellSpec as we,defineTableRowSpec as Te,defineTableSpec as Ee}from"@prosekit/extensions/table";import{tableEditing as De}from"prosemirror-tables";import{Decoration as Oe,DecorationSet as v}from"@prosekit/pm/view";import{definePlaceholder as ke}from"@prosekit/extensions/placeholder";import{defineReadonly as Ae}from"@prosekit/extensions/readonly";const y=new Map;async function je(e){let t=pe.matchLanguageName(f,e,!0);if(!t){y.set(e,null);return}let n=t.support;if(!n)try{n=await t.load()}catch(t){console.error(`[meowdown] Failed to load language "${e}":`,t),y.set(e,null)}if(y.has(e))return;if(!n){y.set(e,null);return}let r=he({parse:e=>n.language.parser.parse(e.content),highlighter:me});y.set(e,r)}const Me=e=>{let t=e.language?.trim();if(!t)return[];let n=y.get(t);return n?n(e):n===null?[]:je(t)};function Ne(){return re({parser:Me,nodeTypes:[`codeBlock`]})}const b=[1,2,3,4,5,6];function Pe(){return a(Object.fromEntries(b.map(e=>[`Mod-${e}`,ee(u({type:`heading`,attrs:{level:e}}))])))}function Fe(e){let[t,n,r]=e;return[t,n,r.map(e=>e.toJSON())]}function Ie(e,t){let[n,r,i]=t;return[n,r,i.map(t=>ve.fromJSON(e,t))]}var x=class e extends g{constructor(e){super(),this.chunks=e}apply(e){if(this.chunks.length===0)return _.ok(e);let t=e.content.size,n;for(let[r,i,a]of this.chunks){if(r>=i)continue;let o=Math.max(0,Math.min(r,t)),s=Math.max(o,Math.min(i,t));o>=s||e.nodesBetween(o,s,(t,r)=>{if(!t.isText)return!0;let i=Math.max(o,r),c=Math.min(s,r+t.nodeSize);if(i>=c)return!1;let l=t.marks;for(let t of l)t.isInSet(a)||(n??=new _e(e),n.removeMark(i,c,t));for(let t of a)t.isInSet(l)||(n??=new _e(e),n.addMark(i,c,t));return!1})}return _.ok(n?n.doc:e)}invert(e){if(this.chunks.length===0)return Le;let t=this.chunks[0][0],n=this.chunks[0][1];for(let[,e]of this.chunks)e>n&&(n=e);let r=e.content.size,i=Math.max(0,Math.min(t,r)),a=Math.max(i,Math.min(n,r));return new ge(i,a,e.slice(i,a),!1)}map(e){return null}toJSON(){return{stepType:`batchSetMark`,chunks:this.chunks.map(Fe)}}static fromJSON(t,n){let r=n.chunks;return new e(r.map(e=>Ie(t,e)))}};g.jsonID(`batchSetMark`,x);const Le=new x([]);function Re(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===45||e===95||e>127&&/[\p{L}\p{N}]/u.test(String.fromCharCode(e))}function ze(e){return e>=65&&e<=90||e>=97&&e<=122||e>127&&/\p{L}/u.test(String.fromCharCode(e))}const Be={defineNodes:[{name:`Hashtag`}],parseInline:[{name:`Hashtag`,parse(e,t,n){if(t!==35||!/\s|^$/.test(e.slice(n-1,n)))return-1;let r=n+1,i=!1;for(;r<e.end;){let t=e.char(r);if(!Re(t))break;i||=ze(t),r++}return i?e.addElement(e.elt(`Hashtag`,n,r)):-1}}]},Ve={defineNodes:[{name:`Wikilink`},{name:`WikilinkMark`}],parseInline:[{name:`Wikilink`,before:`Link`,parse(e,t,n){if(t!==91||e.char(n+1)!==91)return-1;let r=!1;for(let t=n+2;t<e.end-1;t++){let i=e.char(t);if(i===93){if(e.char(t+1)!==93||!r)return-1;let i=t+2;return e.addElement(e.elt(`Wikilink`,n,i,[e.elt(`WikilinkMark`,n,n+2),e.elt(`WikilinkMark`,t,i)]))}if(i===91||i===10)return-1;i!==32&&i!==9&&(r=!0)}return-1}}]};function He(e){return e.end}const S=be.configure([ye,Be,Ve]),Ue=S.configure({parseInline:[{name:`SkipInline`,before:`Escape`,parse:He}]});function C(e){return S.parseInline(e,0)}function w(e,t,n=[]){for(let r of e)t(r)&&n.push(r),w(r.children,t,n);return n}function We(e){let t={};for(let n of e.nodeSet.types)t[n.name]=n.id;return t}const T=We(S);function Ge(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!e[n].eq(t[n]))return!1;return!0}const E=new Map([[T.Emphasis,`mdEm`],[T.StrongEmphasis,`mdStrong`],[T.InlineCode,`mdCode`],[T.Strikethrough,`mdDel`],[T.EmphasisMark,`mdMark`],[T.CodeMark,`mdMark`],[T.LinkMark,`mdMark`],[T.StrikethroughMark,`mdMark`],[T.URL,`mdLinkUri`],[T.Hashtag,`mdTag`],[T.Wikilink,`mdWikilink`],[T.WikilinkMark,`mdMark`]]);function Ke(e,t){let n=C(t),r=[];return D(n,[],0,t.length,t,e,r),r}function D(e,t,n,r,i,a,o){let s=n;for(let n of e){if(n.from>s&&O(o,s,n.from,t),n.type===T.Link||n.type===T.Image)qe(n,t,i,a,o);else{let e=E.get(n.type),r=e?[...t,a.marks[e].create()]:t;n.children.length===0?O(o,n.from,n.to,r):D(n.children,r,n.from,n.to,i,a,o)}s=n.to}s<r&&O(o,s,r,t)}function qe(e,t,n,r,i){let a=-1,o=null,s=0;for(let t of e.children)t.type===T.LinkMark?(s++,s===2&&(a=t.from)):t.type===T.URL&&o===null&&(o=t);let c=o?n.slice(o.from,o.to):``,l=c&&r.marks.mdLinkText?r.marks.mdLinkText.create({href:c}):null,u=e=>a>=0&&e<a&&l!==null,d=e.from;for(let a of e.children){if(a.from>d){let e=u(d)?[...t,l]:t;O(i,d,a.from,e)}let e=u(a.from)?[...t,l]:t,o=E.get(a.type),s=o?[...e,r.marks[o].create()]:e;a.children.length===0?O(i,a.from,a.to,s):D(a.children,s,a.from,a.to,n,r,i),d=a.to}d<e.to&&O(i,d,e.to,t)}function O(e,t,n,r){if(t>=n)return;let i=e.at(-1);if(i&&i[1]===t&&Ge(i[2],r)){e[e.length-1]=[i[0],n,i[2]];return}e.push([t,n,r])}const k=`inline-marks-applied`,Je=new WeakMap;let Ye=0,Xe=0;function Ze(e,t,n){let r=Je.get(e);if(r?Xe++:(Ye++,r=Ke(n,e.textContent),Je.set(e,r)),t===0)return r;let i=[];for(let[e,n,a]of r)i.push([e+t,n+t,a]);return i}function Qe(e,t){let n=1/0,r=-1/0;for(let t of e)for(let e of t.mapping.maps)e.forEach((e,t,i,a)=>{i<n&&(n=i),a>r&&(r=a)});let i=t.doc.content.size;return n>r?{from:0,to:i}:{from:Math.max(0,n),to:Math.min(i,r)}}function $e(e,t){let n=[];return e.doc.nodesBetween(t.from,t.to,(t,r)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;if(t.childCount===0)return!1;let i=Ze(t,r+1,e.schema);return i.length>0&&n.push(...i),!1}),n}function et(){return new p({key:new m(`inline-mark`),appendTransaction(e,t,n){for(let t of e)if(t.getMeta(k))return null;let r=$e(n,Qe(e,n));if(r.length===0)return null;let i=n.tr.step(new x(r));return i.setMeta(k,!0),i.setMeta(`addToHistory`,!1),i},view(e){return e.dispatch(tt(e.state)),{}}})}function tt(e){return e.tr.setMeta(`inline-marks-trigger`,!0)}function nt(){return s(et())}function rt(){return o({name:`mdMark`,inclusive:!1,toDOM:()=>[`span`,{class:`md-mark`},0],parseDOM:[{tag:`span.md-mark`}]})}function it(){return o({name:`mdEm`,toDOM:()=>[`em`,0],parseDOM:[{tag:`em`}]})}function at(){return o({name:`mdStrong`,toDOM:()=>[`strong`,0],parseDOM:[{tag:`strong`}]})}function ot(){return o({name:`mdCode`,toDOM:()=>[`code`,0],parseDOM:[{tag:`code`}]})}function st(){return o({name:`mdLinkText`,inclusive:!1,attrs:{href:{default:``}},toDOM:e=>[`a`,{href:e.attrs.href},0],parseDOM:[{tag:`a`,getAttrs:e=>({href:e.getAttribute(`href`)??``})}]})}function ct(){return o({name:`mdLinkUri`,inclusive:!1,toDOM:()=>[`span`,{class:`md-link-uri`},0],parseDOM:[{tag:`span.md-link-uri`}]})}function lt(){return o({name:`mdDel`,toDOM:()=>[`del`,0],parseDOM:[{tag:`del`}]})}function ut(){return o({name:`mdTag`,toDOM:()=>[`span`,{class:`md-tag`},0],parseDOM:[{tag:`span.md-tag`}]})}function dt(){return o({name:`mdWikilink`,inclusive:!1,toDOM:()=>[`span`,{class:`md-wikilink`},0],parseDOM:[{tag:`span.md-wikilink`}]})}function ft(){return d(rt(),it(),at(),ot(),st(),ct(),lt(),ut(),dt())}function pt(e,t=0){let n=t,r=0;for(let t=0;t<e.length;t++)e.charCodeAt(t)===96?(r++,r>n&&(n=r)):r=0;return n}const A={em:{node:T.Emphasis,delim:`*`},strong:{node:T.StrongEmphasis,delim:`**`},code:{node:T.InlineCode,delim:"`"},del:{node:T.Strikethrough,delim:`~~`}},mt=new Set([T.EmphasisMark,T.CodeMark,T.LinkMark,T.StrikethroughMark]);function j(e){return[e.children[0],e.children.at(-1)]}function M(e){let{type:t,children:n}=e;if(t===T.Emphasis||t===T.StrongEmphasis||t===T.Strikethrough)return[n[0].to,n.at(-1).from];if(t===T.Link||t===T.Image){let e=n.find((e,t)=>t>0&&e.type===T.LinkMark);return e?[n[0].to,e.from]:null}return null}function N(e,t,n){for(let r of e){if(r.to<=t||r.from>=n||t<=r.from&&r.to<=n)continue;let i=M(r);return i&&i[0]<=t&&n<=i[1]?N(r.children,t,n):N(e,Math.min(t,r.from),Math.max(n,r.to))}return[t,n]}function P(e,t,n){for(let r of e)if(!(r.to<=t||r.from>=n)&&(t>r.from||r.to>n))return P(e,Math.min(t,r.from),Math.max(n,r.to));return[t,n]}const F=e=>e===` `||e===` `;function ht(e,t,n){for(;t<n&&F(e[t]);)t++;for(;n>t&&F(e[n-1]);)n--;return[t,n]}function gt(e,t,n,r){let i=w(C(e),e=>e.type===r.node||mt.has(e.type));for(let r=t;r<n;r++)if(!F(e[r])&&!i.some(e=>e.from<=r&&r<e.to))return!1;return!0}function _t(e,t,n,r,i){let a=C(e),o=w(a,e=>e.type===r.node);return i?bt(e,o,t,n):vt(e,a,o,t,n,r)}function vt(e,t,n,r,i,a){for(let e=0;e!==i-r;){e=i-r,[r,i]=N(t,r,i);for(let e of n)e.to===r&&(r=e.from),e.from===i&&(i=e.to)}let o=[];for(let e of n)if(r<=e.from&&e.to<=i){let[t,n]=j(e);o.push({from:t.from,to:t.to,insert:``}),o.push({from:n.from,to:n.to,insert:``})}let[s,c]=yt(e,r,i,o,a);return o.push({from:r,to:r,insert:s},{from:i,to:i,insert:c}),o}function yt(e,t,n,r,i){if(i.node!==T.InlineCode)return[i.delim,i.delim];let a=e.slice(t,n);for(let e of[...r].sort((e,t)=>t.from-e.from))a=a.slice(0,e.from-t)+a.slice(e.to-t);let o="`".repeat(pt(a)+1),s=a.startsWith("`")||a.endsWith("`")?` `:``;return[o+s,s+o]}function bt(e,t,n,r){let i=[];for(let a of t){if(a.to<=n||a.from>=r)continue;let[t,o]=j(a),s=Math.max(n,t.to),c=Math.min(r,o.from);for(s>=c&&([s,c]=[t.to,o.from]),[s,c]=P(a.children.slice(1,-1),s,c);s>t.to&&F(e[s-1]);)s--;for(;c<o.from&&F(e[c]);)c++;s>t.to?i.push({from:s,to:s,insert:e.slice(o.from,o.to)}):i.push({from:t.from,to:t.to,insert:``}),c<o.from?i.push({from:c,to:c,insert:e.slice(t.from,t.to)}):i.push({from:o.from,to:o.to,insert:``})}return i}function xt(e,t,n){let{delim:r}=n,i=r.length;if(e.slice(t-i,t)===r&&e.startsWith(r,t)&&e[t-i-1]!==r[0]&&e[t+i]!==r[0])return{kind:`unwrap`,from:t-i,to:t+i};let a=C(e),o=w(a,e=>e.type===n.node).findLast(e=>e.from<=t&&t<=e.to);if(o){let[e,n]=j(o);return{kind:`move`,pos:t===o.from?e.to:t===o.to?n.from:o.to}}return I(a,t)||e[t-1]===r[0]||e[t]===r[0]?null:{kind:`insert`,pos:t}}function I(e,t){for(let n of e)if(n.from<t&&t<n.to){let e=M(n);return!e||t<e[0]||t>e[1]?!0:I(n.children,t)}return!1}function L(e){return(t,n)=>{if(t.selection.empty)return St(e,t,n);let{from:r,to:i,anchor:a,head:o}=t.selection,s=[];t.doc.nodesBetween(r,i,(t,n)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;let a=t.textContent,o=n+1,[c,l]=ht(a,Math.max(r-o,0),Math.min(i-o,a.length));return c<l&&s.push({text:a,base:o,from:c,to:l,active:gt(a,c,l,e)}),!1});let c=s.length>0&&s.every(e=>e.active),l=s.filter(e=>c||!e.active).flatMap(t=>_t(t.text,t.from,t.to,e,c).map(e=>({from:e.from+t.base,to:e.to+t.base,insert:e.insert})));if(l.length===0)return!1;if(n){let e=t.tr;l.sort((e,t)=>t.from-e.from||t.to-e.to);for(let t of l)t.insert?e.insertText(t.insert,t.from,t.to):e.delete(t.from,t.to);e.setSelection(h.create(e.doc,e.mapping.map(a,a<=o?1:-1),e.mapping.map(o,o<a?1:-1))),n(e.scrollIntoView())}return!0}}function St(e,t,n){let{$from:r}=t.selection,i=r.parent;if(!i.isTextblock||i.type.spec.code)return!1;let a=xt(i.textContent,r.parentOffset,e);if(!a)return!1;if(n){let i=r.start(),o=t.tr;a.kind===`unwrap`&&o.delete(i+a.from,i+a.to),a.kind===`move`&&o.setSelection(h.create(o.doc,i+a.pos)),a.kind===`insert`&&(o.insertText(e.delim+e.delim,i+a.pos),o.setSelection(h.create(o.doc,i+a.pos+e.delim.length))),n(o.scrollIntoView())}return!0}function Ct(){return d(r({toggleEm:()=>L(A.em),toggleStrong:()=>L(A.strong),toggleCode:()=>L(A.code),toggleDel:()=>L(A.del)}),a({"Mod-b":L(A.strong),"Mod-i":L(A.em),"Mod-e":L(A.code),"Mod-Shift-x":L(A.del)}))}function wt(){return d(Ee(),Te(),xe(),we(),s(De()),Se(),Ce())}function Tt(){return d(ue(),ie(),de(),te(),ce(),oe(),wt(),ne(),se(),ft(),Ne(),nt(),Ct(),Pe(),n(),t(),i(),ae(),fe(),le())}function R(){return Tt()}const Et=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdLinkText`,`mdLinkUri`,`mdWikilink`]),Dt=new Set([`mdMark`,`mdLinkUri`]),Ot=new Set([`mdMark`,`mdLinkUri`]),z=new Set([`mdLinkText`,`mdLinkUri`]),kt=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdWikilink`]);function At(e){return new p({key:new m(`mark-mode`),props:{attributes:{"data-mark-mode":e},decorations:e===`focus`?e=>Nt(e):void 0,clipboardTextSerializer:e===`show`?void 0:Mt}})}function jt(e){return s(At(e))}function Mt(e){let t=[];return e.content.forEach(e=>{let n=[];e.descendants(e=>!e.isText||!e.text?!0:(e.marks.some(e=>Ot.has(e.type.name))||n.push(e.text),!1)),t.push(n.join(``))}),t.join(`
2
+ `)}function Nt(e){let{$anchor:t,empty:n}=e.selection;if(!n)return v.empty;let r=t.parent;if(!r.isTextblock)return null;let i=t.start(),a=t.parentOffset,o=Pt(r,a);if(o.size===0)return v.empty;let s=[],c=new Set,l=!1;for(let e of o)if(z.has(e)){if(l)continue;l=!0,It(r,i,a,s,c)}else Ft(r,i,e,a,s,c);let u=s.map(([e,t])=>Oe.inline(e,t,{class:`show`}));return v.create(e.doc,u)}function Pt(e,t){let n=new Set,r=0;return e.forEach(e=>{let i=r+e.nodeSize;if(t>=r&&t<=i)for(let t of e.marks){let e=t.type.name;Et.has(e)&&n.add(e)}r=i}),n}function Ft(e,t,n,r,i,a){let o=t,s=0,c=-1,l=-1;e.forEach(u=>{let d=u.marks.some(e=>e.type.name===n);d&&c===-1&&(c=o,l=s),!d&&c!==-1&&(r>=l&&r<=s&&V(e,t,c,o,i,a),c=-1,l=-1),o+=u.nodeSize,s+=u.nodeSize}),c!==-1&&r>=l&&r<=s&&V(e,t,c,o,i,a)}function It(e,t,n,r,i){let a=e.childCount;if(a===0)return;let o=-1,s=0;for(let t=0;t<a;t++){let r=e.child(t),i=s+r.nodeSize;if(n>=s&&n<=i&&r.marks.some(e=>z.has(e.type.name))){o=t;break}s=i}if(o===-1)return;let c=o;for(;c>0&&B(e.child(c-1));)c--;let l=o;for(;l<a-1&&B(e.child(l+1));)l++;let u=t;for(let t=0;t<c;t++)u+=e.child(t).nodeSize;let d=u;for(let t=c;t<=l;t++)d+=e.child(t).nodeSize;V(e,t,u,d,r,i)}function B(e){let t=!1,n=!1,r=!1;for(let i of e.marks){let e=i.type.name;e===`mdMark`?t=!0:z.has(e)?n=!0:kt.has(e)&&(r=!0)}return!!(n||t&&!r)}function V(e,t,n,r,i,a){let o=t;e.forEach(e=>{let t=o,s=o+e.nodeSize;if(t>=n&&s<=r)for(let n of e.marks){let e=n.type.name;if(Dt.has(e)){let e=`${t}_${s}`;a.has(e)||(a.add(e),i.push([t,s]));break}}o=s})}const Lt=new m(`meowdown-wikilink-click`);function Rt(e,t){let n=c(e.schema,`mdWikilink`),r=e.doc.resolve(t),i=r.parent;if(!i.isTextblock||i.type.spec.code)return;let a=r.start(),o=-1,s=-1,l,u=0;if(i.forEach(e=>{let r=a+u;u+=e.nodeSize;let i=a+u;n.isInSet(e.marks)?(o<0&&(o=r),s=i):(o>=0&&o<=t&&t<=s&&(l={from:o,to:s}),o=-1)}),o>=0&&o<=t&&t<=s&&(l={from:o,to:s}),l)return{from:l.from,to:l.to,target:zt(e.doc.textBetween(l.from,l.to))}}function zt(e){let t=e.replace(/^\[\[/u,``).replace(/\]\]$/u,``),n=t.indexOf(`|`);return(n>=0?t.slice(0,n):t).trim()}function Bt(e){let t;return s(new p({key:Lt,props:{handleDOMEvents:{mousedown:e=>{let{from:n,to:r,empty:i}=e.state.selection;return t={from:n,to:r,empty:i},!1}},handleClick:(n,r,i)=>{if(!i.target?.closest?.(`.md-wikilink`))return!1;let a=Rt(n.state,r);return!a||!(l?i.metaKey:i.ctrlKey)&&t?.empty&&t.from>=a.from&&t.to<=a.to?!1:(e({target:a.target,event:i}),!0)}}}))}function Vt(e){let t=[],n=w(C(e),e=>e.type===T.Image);for(let r of n){let n=r.children.find(e=>e.type===T.URL),i=r.children.filter(e=>e.type===T.LinkMark);!n||i.length<2||t.push({from:r.from,to:r.to,alt:e.slice(i[0].to,i[1].from),src:e.slice(n.from,n.to)})}return t}const H=new m(`meowdown-images`);function Ht(e){let t=[];return e.doc.descendants((e,n)=>{if(e.type.spec.code)return!1;if(!e.isTextblock)return!0;if(e.childCount===0)return!1;let r=!0;if(e.forEach(e=>{e.isText||(r=!1)}),!r)return!1;for(let r of Vt(e.textContent))t.push({widgetAt:n+e.nodeSize-1,alt:r.alt,src:r.src});return!1}),t}function U(e,t){let n=[];for(let r of Ht(e)){let e=t.resolveImageUrl(r.src);e&&n.push(Oe.widget(r.widgetAt,()=>{let t=document.createElement(`div`);t.className=`md-image`,t.contentEditable=`false`;let n=document.createElement(`img`);return n.src=e,n.alt=r.alt,n.draggable=!1,t.appendChild(n),t},{key:`md-image:${e}`,side:1}))}return v.create(e.doc,n)}function Ut(e){return new p({key:H,state:{init:(t,n)=>U(n,e),apply:(t,n,r,i)=>t.docChanged?U(i,e):n},props:{decorations:e=>H.getState(e)}})}function W(e){return e?Array.from(e.files).filter(e=>e.type.startsWith(`image/`)):[]}function Wt(e,t,n){e.onImageSaveError?e.onImageSaveError(t,n):console.error(`[meowdown] failed to save pasted image:`,t)}async function G(e,t,n,r){let i=r;for(let r of t){let t;try{t=await n.onImagePaste(r)}catch(e){Wt(n,e,r);continue}if(!t||e.isDestroyed)continue;let a=`![](${t})`,o=i==null?e.state.tr.insertText(a):e.state.tr.insertText(a,i);e.dispatch(o),i!=null&&(i+=a.length)}}function Gt(e){return new p({props:{handlePaste:(t,n)=>{let r=W(n.clipboardData),i=e.onImagePaste;return r.length===0||!i?!1:(G(t,r,{...e,onImagePaste:i}),!0)},handleDrop:(t,n)=>{let r=W(n.dataTransfer),i=e.onImagePaste;if(r.length===0||!i)return!1;let a=t.posAtCoords({left:n.clientX,top:n.clientY});return G(t,r,{...e,onImagePaste:i},a?.pos),!0}}})}function Kt(e){return d(s(Ut(e)),s(Gt(e)))}const qt={"Mod-b":`Bold`,"Mod-i":`Italic`,"Mod-e":`Inline code`,"Mod-Shift-x":`Strikethrough`,...Object.fromEntries(b.flatMap(e=>[[`Mod-${e}`,`Heading ${e}`],[`Mod-Alt-${e}`,`Heading ${e}`]]))},Jt=new Set([`MscGen`,`Xù`,`MsGenny`,`Angular Template`]),Yt=f.map(e=>e.name).filter(e=>!Jt.has(e)).map(e=>({label:e,value:e.toLowerCase()})).concat({label:`Plain text`,value:``}).sort((e,t)=>e.label.localeCompare(t.label));function K(e){let t=new Zt;return q(e,t),t.finish()}const Xt=[``,`# `,`## `,`### `,`#### `,`##### `,`###### `];var Zt=class{constructor(){this.parts=[],this.linePrefix=``,this.pendingFirst=null,this.atLineStart=!0,this.deferredBlankPrefix=null}write(e){if(e===``)return;if(this.emitDeferredBlankLine(),this.atLineStart&&=(this.parts.push(this.pendingFirst??this.linePrefix),this.pendingFirst=null,!1),!e.includes(`
3
3
  `)){this.parts.push(e);return}let t=e.split(`
4
4
  `);for(let e=0;e<t.length;e++)e>0&&this.parts.push(`
5
5
  `,this.linePrefix),t[e]!==``&&this.parts.push(t[e])}closeBlock(){this.atLineStart||this.parts.push(`
6
6
  `),this.atLineStart=!0,this.deferredBlankPrefix=this.linePrefix}suppressBlank(){this.deferredBlankPrefix=null}withPrefix(e,t,n){let r=this.linePrefix,i=this.pendingFirst;if(this.linePrefix=r+e,t!==null){let e=i??r;this.pendingFirst=e+t}n(),this.linePrefix=r,this.pendingFirst=i}finish(){return this.parts.join(``).replace(/\s+$/,``)+`
7
7
  `}emitDeferredBlankLine(){let e=this.deferredBlankPrefix;e!==null&&(this.parts.push(e.trimEnd(),`
8
- `),this.deferredBlankPrefix=null)}};function H(e,t){switch(e.type.name){case`doc`:U(e,t);return;case`paragraph`:G(e,t),t.closeBlock();return;case`heading`:{let n=e.attrs.level;t.write(pt[n]??`# `),G(e,t),t.closeBlock();return}case`blockquote`:t.withPrefix(`> `,`> `,()=>U(e,t)),t.closeBlock();return;case`list`:K(e,t,W(e));return;case`codeBlock`:gt(e,t);return;case`horizontalRule`:t.write(`---`),t.closeBlock();return;case`table`:_t(e,t);return;case`text`:e.text&&t.write(e.text);return}}function U(e,t,n=!1){let r=e.childCount,i=0;for(;i<r;){let a=e.child(i);if(a.type.name!==`list`){n&&i>0&&t.suppressBlank(),H(a,t),i++;continue}let o=i+1;for(;o<r&&e.child(o).type.name===`list`;)o++;let s=ht(e,i,o);for(let r=i;r<o;r++)(r===i?n&&i>0:s)&&t.suppressBlank(),K(e.child(r),t,s);i=o}}function ht(e,t,n){for(let r=t;r<n;r++)if(!W(e.child(r)))return!1;return!0}function W(e){let t=e.childCount;for(let n=0;n<t;n++){let t=e.child(n);if(t.type.name!==`list`&&!(t.type.name===`paragraph`&&n===0))return!1}return!0}function G(e,t){let n=e.childCount;for(let r=0;r<n;r++){let n=e.child(r);n.isText&&n.text&&t.write(n.text)}}function K(e,t,n){let r=e.attrs,i=r.kind===`ordered`?`${r.order??1}. `:r.kind===`task`?r.checked?`- [x] `:`- [ ] `:`- `,a=` `.repeat(r.kind===`task`?2:i.length);t.withPrefix(a,i,()=>U(e,t,n)),t.closeBlock()}function gt(e,t){let n=e.attrs.language??``,r=e.textContent,i="`".repeat(A(r,2)+1);t.write(i),n&&t.write(n),t.write(`
8
+ `),this.deferredBlankPrefix=null)}};function q(e,t){switch(e.type.name){case`doc`:J(e,t);return;case`paragraph`:X(e,t),t.closeBlock();return;case`heading`:{let n=e.attrs.level;t.write(Xt[n]??`# `),X(e,t),t.closeBlock();return}case`blockquote`:t.withPrefix(`> `,`> `,()=>J(e,t)),t.closeBlock();return;case`list`:$t(e,t,Y(e));return;case`codeBlock`:en(e,t);return;case`horizontalRule`:t.write(`---`),t.closeBlock();return;case`table`:tn(e,t);return;case`text`:e.text&&t.write(e.text);return}}function J(e,t,n=!1){let r=e.childCount,i=0;for(;i<r;){let a=e.child(i);if(a.type.name!==`list`){n&&i>0&&t.suppressBlank(),q(a,t),i++;continue}let o=i+1;for(;o<r&&e.child(o).type.name===`list`;)o++;let s=Qt(e,i,o);for(let r=i;r<o;r++)(r===i?n&&i>0:s)&&t.suppressBlank(),$t(e.child(r),t,s);i=o}}function Qt(e,t,n){for(let r=t;r<n;r++)if(!Y(e.child(r)))return!1;return!0}function Y(e){let t=e.childCount;for(let n=0;n<t;n++){let t=e.child(n);if(t.type.name!==`list`&&!(t.type.name===`paragraph`&&n===0))return!1}return!0}function X(e,t){let n=e.childCount;for(let r=0;r<n;r++){let n=e.child(r);n.isText&&n.text&&t.write(n.text)}}function $t(e,t,n){let r=e.attrs,i=r.kind===`ordered`?`${r.order??1}. `:r.kind===`task`?r.checked?`- [x] `:`- [ ] `:`- `,a=` `.repeat(r.kind===`task`?2:i.length);t.withPrefix(a,i,()=>J(e,t,n)),t.closeBlock()}function en(e,t){let n=e.attrs.language??``,r=e.textContent,i="`".repeat(pt(r,2)+1);t.write(i),n&&t.write(n),t.write(`
9
9
  `),t.write(r),t.write(`
10
- `),t.write(i),t.closeBlock()}function _t(e,t){let n=e.childCount;if(n===0)return;let r=[],i=0,a=-1;for(let t=0;t<n;t++){let n=e.child(t),o=[],s=!1;for(let e=0;e<n.childCount;e++){let t=n.child(e);t.type.name===`tableHeaderCell`&&(s=!0),o.push(vt(t))}s&&a<0&&(a=t),o.length>i&&(i=o.length),r.push(o)}if(i===0)return;let o=`| `+Array(i).fill(`---`).join(` | `)+` |`,s=a>=0?r[a]:Array(i).fill(``);t.write(q(s,i)),t.write(`
10
+ `),t.write(i),t.closeBlock()}function tn(e,t){let n=e.childCount;if(n===0)return;let r=[],i=0,a=-1;for(let t=0;t<n;t++){let n=e.child(t),o=[],s=!1;for(let e=0;e<n.childCount;e++){let t=n.child(e);t.type.name===`tableHeaderCell`&&(s=!0),o.push(rn(t))}s&&a<0&&(a=t),o.length>i&&(i=o.length),r.push(o)}if(i===0)return;let o=`| `+Array(i).fill(`---`).join(` | `)+` |`,s=a>=0?r[a]:Array(i).fill(``);t.write(nn(s,i)),t.write(`
11
11
  `),t.write(o);for(let e=0;e<n;e++)e!==a&&(t.write(`
12
- `),t.write(q(r[e],i)));t.closeBlock()}function q(e,t){let n=`|`;for(let r=0;r<t;r++)n+=` `+(e[r]??``)+` |`;return n}function vt(e){let t=e.textContent.trim();return!t.includes(`|`)&&!t.includes(`
12
+ `),t.write(nn(r[e],i)));t.closeBlock()}function nn(e,t){let n=`|`;for(let r=0;r<t;r++)n+=` `+(e[r]??``)+` |`;return n}function rn(e){let t=e.textContent.trim();return!t.includes(`|`)&&!t.includes(`
13
13
  `)?t:t.replaceAll(`|`,String.raw`\|`).replaceAll(`
14
- `,` `)}function yt(e,t){let n=bt(e,be.parse(t).cursor(),t);return e.nodes.doc(n)}function bt(e,t,n){let r=[];if(!t.firstChild())return r;do r.push(...J(e,t,n));while(t.nextSibling());return t.parent(),r}function J(e,t,n){switch(t.type.id){case w.ATXHeading1:return[Y(e,t,n,1)];case w.ATXHeading2:return[Y(e,t,n,2)];case w.ATXHeading3:return[Y(e,t,n,3)];case w.ATXHeading4:return[Y(e,t,n,4)];case w.ATXHeading5:return[Y(e,t,n,5)];case w.ATXHeading6:return[Y(e,t,n,6)];case w.SetextHeading1:return[Y(e,t,n,1)];case w.SetextHeading2:return[Y(e,t,n,2)];case w.Paragraph:return[X(e,t,n)];case w.Blockquote:return[Z(e,t,n)];case w.BulletList:return Q(e,t,n,`bullet`,1);case w.OrderedList:return xt(e,t,n);case w.FencedCode:case w.CodeBlock:return[wt(e,t,n)];case w.HorizontalRule:return[e.nodes.horizontalRule()];case w.Table:return[Tt(e,t,n)];case w.Task:return[X(e,t,n)];default:return[]}}function Y(e,t,n,r){let i=t.from,a=t.to;if(t.firstChild()){t.type.id===w.HeaderMark&&(i=t.to);let e=-1,n=-1;do e=t.type.id,n=t.from;while(t.nextSibling());e===w.HeaderMark&&n>i&&(a=n),t.parent()}let o=n.slice(i,a).trim();return e.nodes.heading({level:r},o)}function X(e,t,n){let r=n.slice(t.from,t.to);return e.nodes.paragraph(r)}function Z(e,t,n){let r=[];if(t.firstChild()){do{if(t.type.id===w.QuoteMark)continue;r.push(...J(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.blockquote(r)}function Q(e,t,n,r,i){let a=[];if(t.firstChild()){do t.type.id===w.ListItem&&a.push(St(e,t,n,r,i));while(t.nextSibling());t.parent()}return a}function xt(e,t,n){let r=1;if(t.firstChild()){if(t.type.id===w.ListItem&&t.firstChild()){if(t.type.id===w.ListMark){let e=n.slice(t.from,t.to),i=Number.parseInt(e,10);Number.isFinite(i)&&(r=i)}t.parent()}t.parent()}return Q(e,t,n,`ordered`,r)}function St(e,t,n,r,i){let a=[],o=null;if(t.firstChild()){do{if(t.type.id===w.ListMark)continue;if(r===`bullet`&&t.type.id===w.Task){let r=Ct(e,t,n);o=r.checked,a.push(r.paragraph);continue}a.push(...J(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.list({kind:o===null?r:`task`,order:r===`ordered`?i:null,checked:o??!1,collapsed:!1},a)}function Ct(e,t,n){let r=!1,i=t.from,a=t.to;t.firstChild()&&(t.type.id===w.TaskMarker&&(r=n.slice(t.from,t.to).toLowerCase().includes(`x`),i=t.to),t.parent());let o=n.slice(i,a);return o.startsWith(` `)&&(o=o.slice(1)),{checked:r,paragraph:o===``?e.nodes.paragraph():e.nodes.paragraph(o)}}function wt(e,t,n){let r=``,i=``;if(t.firstChild()){do switch(t.type.id){case w.CodeInfo:r=n.slice(t.from,t.to);break;case w.CodeText:i=n.slice(t.from,t.to);break}while(t.nextSibling());t.parent()}return e.nodes.codeBlock({language:r},i)}function Tt(e,t,n){let r=[];if(t.firstChild()){do{let i=t.type.id;i===w.TableHeader?r.push($(e,t,n,!0)):i===w.TableRow&&r.push($(e,t,n,!1))}while(t.nextSibling());t.parent()}return e.nodes.table(r)}function $(e,t,n,r){let i=[];if(t.firstChild()){do if(t.type.id===w.TableCell){let a=n.slice(t.from,t.to).trim(),o=e.nodes.paragraph(a);i.push(r?e.nodes.tableHeaderCell(o):e.nodes.tableCell(o))}while(t.nextSibling());t.parent()}return e.nodes.tableRow(i)}export{et as defineEditorExtension,ot as defineMarkMode,ft as docToMarkdown,yt as markdownToDoc};
14
+ `,` `)}function an(e,t){let n=on(e,Ue.parse(t).cursor(),t);return e.nodes.doc(n)}function on(e,t,n){let r=[];if(!t.firstChild())return r;do r.push(...Z(e,t,n));while(t.nextSibling());return t.parent(),r}function Z(e,t,n){switch(t.type.id){case T.ATXHeading1:return[Q(e,t,n,1)];case T.ATXHeading2:return[Q(e,t,n,2)];case T.ATXHeading3:return[Q(e,t,n,3)];case T.ATXHeading4:return[Q(e,t,n,4)];case T.ATXHeading5:return[Q(e,t,n,5)];case T.ATXHeading6:return[Q(e,t,n,6)];case T.SetextHeading1:return[Q(e,t,n,1)];case T.SetextHeading2:return[Q(e,t,n,2)];case T.Paragraph:return[sn(e,t,n)];case T.Blockquote:return[cn(e,t,n)];case T.BulletList:return ln(e,t,n,`bullet`,1);case T.OrderedList:return un(e,t,n);case T.FencedCode:case T.CodeBlock:return[pn(e,t,n)];case T.HorizontalRule:return[e.nodes.horizontalRule()];case T.Table:return[mn(e,t,n)];case T.Task:return[sn(e,t,n)];default:return[]}}function Q(e,t,n,r){let i=t.from,a=t.to;if(t.firstChild()){t.type.id===T.HeaderMark&&(i=t.to);let e=-1,n=-1;do e=t.type.id,n=t.from;while(t.nextSibling());e===T.HeaderMark&&n>i&&(a=n),t.parent()}let o=n.slice(i,a).trim();return e.nodes.heading({level:r},o)}function sn(e,t,n){let r=n.slice(t.from,t.to);return e.nodes.paragraph(r)}function cn(e,t,n){let r=[];if(t.firstChild()){do{if(t.type.id===T.QuoteMark)continue;r.push(...Z(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.blockquote(r)}function ln(e,t,n,r,i){let a=[];if(t.firstChild()){do t.type.id===T.ListItem&&a.push(dn(e,t,n,r,i));while(t.nextSibling());t.parent()}return a}function un(e,t,n){let r=1;if(t.firstChild()){if(t.type.id===T.ListItem&&t.firstChild()){if(t.type.id===T.ListMark){let e=n.slice(t.from,t.to),i=Number.parseInt(e,10);Number.isFinite(i)&&(r=i)}t.parent()}t.parent()}return ln(e,t,n,`ordered`,r)}function dn(e,t,n,r,i){let a=[],o=null;if(t.firstChild()){do{if(t.type.id===T.ListMark)continue;if(r===`bullet`&&t.type.id===T.Task){let r=fn(e,t,n);o=r.checked,a.push(r.paragraph);continue}a.push(...Z(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.list({kind:o===null?r:`task`,order:r===`ordered`?i:null,checked:o??!1,collapsed:!1},a)}function fn(e,t,n){let r=!1,i=t.from,a=t.to;t.firstChild()&&(t.type.id===T.TaskMarker&&(r=n.slice(t.from,t.to).toLowerCase().includes(`x`),i=t.to),t.parent());let o=n.slice(i,a);return o.startsWith(` `)&&(o=o.slice(1)),{checked:r,paragraph:o===``?e.nodes.paragraph():e.nodes.paragraph(o)}}function pn(e,t,n){let r=``,i=``;if(t.firstChild()){do switch(t.type.id){case T.CodeInfo:r=n.slice(t.from,t.to);break;case T.CodeText:i=n.slice(t.from,t.to);break}while(t.nextSibling());t.parent()}return e.nodes.codeBlock({language:r},i)}function mn(e,t,n){let r=[];if(t.firstChild()){do{let i=t.type.id;i===T.TableHeader?r.push(hn(e,t,n,!0)):i===T.TableRow&&r.push(hn(e,t,n,!1))}while(t.nextSibling());t.parent()}return e.nodes.table(r)}function hn(e,t,n,r){let i=[];if(t.firstChild()){do if(t.type.id===T.TableCell){let a=n.slice(t.from,t.to).trim(),o=e.nodes.paragraph(a);i.push(r?e.nodes.tableHeaderCell(o):e.nodes.tableCell(o))}while(t.nextSibling());t.parent()}return e.nodes.tableRow(i)}let $;function gn(){return $??=e({extension:R()}),$}function _n(e){return e.replace(/\n+$/u,``)}function vn(e){return e.split(`
15
+ `).filter(e=>e.trim()!==``)}function yn(e){let t=K(an(gn(),e));if(_n(t)===_n(e))return`exact`;let n=vn(e),r=vn(t);return n.length===r.length&&n.every((e,t)=>e===r[t])?`normalizing`:`lossy`}export{qt as EDITOR_KEY_BINDINGS,yn as checkRoundTrip,Yt as codeBlockLanguages,R as defineEditorExtension,Kt as defineImages,jt as defineMarkMode,ke as definePlaceholder,Ae as defineReadonly,Bt as defineWikilinkClickHandler,K as docToMarkdown,an as markdownToDoc};
package/dist/style.css CHANGED
@@ -147,52 +147,6 @@ img.ProseMirror-separator {
147
147
  display: none;
148
148
  }
149
149
 
150
- .ProseMirror .tableWrapper {
151
- overflow-x: auto;
152
- }
153
-
154
- .ProseMirror table {
155
- border-collapse: collapse;
156
- table-layout: fixed;
157
- width: 100%;
158
- overflow: hidden;
159
- }
160
-
161
- .ProseMirror td, .ProseMirror th {
162
- box-sizing: border-box;
163
- vertical-align: top;
164
- border-width: 1px;
165
- padding-left: .75rem;
166
- padding-right: .75rem;
167
- position: relative;
168
- }
169
-
170
- prosekit-table-handle-drop-indicator {
171
- background-color: highlighttext;
172
- }
173
-
174
- .ProseMirror .column-resize-handle {
175
- z-index: 20;
176
- pointer-events: none;
177
- background-color: highlighttext;
178
- width: 4px;
179
- position: absolute;
180
- top: 0;
181
- bottom: 0;
182
- right: -2px;
183
- }
184
-
185
- .ProseMirror.resize-cursor {
186
- cursor: ew-resize;
187
- cursor: col-resize;
188
- }
189
-
190
- .ProseMirror .selectedCell {
191
- --color: 210, 100%, 56%;
192
- border: 1px double hsl(var(--color));
193
- background-color: hsla(var(--color), 20%);
194
- }
195
-
196
150
  :root {
197
151
  --meowdown-text: light-dark(#3f3f46, #d4d4d8);
198
152
  --meowdown-heading: light-dark(#18181b, #fafafa);
@@ -201,7 +155,11 @@ prosekit-table-handle-drop-indicator {
201
155
  --meowdown-mark: light-dark(#a78bfa, #8b5cf6);
202
156
  --meowdown-border: light-dark(#e4e4e7, #3f3f46);
203
157
  --meowdown-code-bg: light-dark(#f4f4f5, #18181b);
158
+ --meowdown-table-header-bg: light-dark(#fafafa, #27272a);
204
159
  --meowdown-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
160
+ --meowdown-node-outline: light-dark(#53f, #8870ff);
161
+ --meowdown-node-selection: light-dark(#5533ff1a, #8870ff1f);
162
+ --meowdown-selection: light-dark(#5533ff38, #8870ff4d);
205
163
  --meowdown-gutter: 3.5rem;
206
164
  }
207
165
 
@@ -306,12 +264,113 @@ prosekit-table-handle-drop-indicator {
306
264
  padding: 0;
307
265
  }
308
266
 
267
+ .ProseMirror pre code .tok-keyword {
268
+ color: light-dark(#cf222e, #ff7b72);
269
+ }
270
+
271
+ .ProseMirror pre code .tok-comment {
272
+ color: light-dark(#6e7781, #8b949e);
273
+ font-style: italic;
274
+ }
275
+
276
+ .ProseMirror pre code .tok-string, .ProseMirror pre code .tok-url {
277
+ color: light-dark(#0a3069, #a5d6ff);
278
+ }
279
+
280
+ .ProseMirror pre code .tok-number, .ProseMirror pre code .tok-bool, .ProseMirror pre code .tok-atom, .ProseMirror pre code .tok-literal {
281
+ color: light-dark(#0550ae, #79c0ff);
282
+ }
283
+
284
+ .ProseMirror pre code .tok-className, .ProseMirror pre code .tok-typeName, .ProseMirror pre code .tok-namespace {
285
+ color: light-dark(#953800, #ffa657);
286
+ }
287
+
288
+ .ProseMirror pre code .tok-definition {
289
+ color: light-dark(#8250df, #d2a8ff);
290
+ }
291
+
292
+ .ProseMirror pre code .tok-macroName, .ProseMirror pre code .tok-meta, .ProseMirror pre code .tok-inserted {
293
+ color: light-dark(#116329, #7ee787);
294
+ }
295
+
296
+ .ProseMirror pre code .tok-invalid, .ProseMirror pre code .tok-deleted {
297
+ color: light-dark(#82071e, #ffa198);
298
+ }
299
+
300
+ .ProseMirror pre code .tok-heading {
301
+ color: light-dark(#0550ae, #79c0ff);
302
+ font-weight: 600;
303
+ }
304
+
305
+ .ProseMirror pre code .tok-strong {
306
+ font-weight: 600;
307
+ }
308
+
309
+ .ProseMirror pre code .tok-emphasis {
310
+ font-style: italic;
311
+ }
312
+
313
+ .ProseMirror pre code .tok-link {
314
+ text-decoration: underline;
315
+ }
316
+
309
317
  .ProseMirror hr {
310
318
  border: none;
311
319
  border-top: 1px solid var(--meowdown-border);
312
320
  margin: 1.5em 0;
313
321
  }
314
322
 
323
+ .ProseMirror table {
324
+ border-collapse: collapse;
325
+ table-layout: fixed;
326
+ width: 100%;
327
+ overflow: hidden;
328
+ }
329
+
330
+ .ProseMirror td, .ProseMirror th {
331
+ box-sizing: border-box;
332
+ border: 1px solid var(--meowdown-border);
333
+ vertical-align: top;
334
+ text-align: left;
335
+ padding: .4rem .75rem;
336
+ }
337
+
338
+ .ProseMirror th {
339
+ color: var(--meowdown-heading);
340
+ background: var(--meowdown-table-header-bg);
341
+ font-weight: 600;
342
+ }
343
+
344
+ .ProseMirror table.ProseMirror-selectednode td, .ProseMirror table.ProseMirror-selectednode th {
345
+ border-color: var(--meowdown-node-outline);
346
+ }
347
+
348
+ .ProseMirror .selectedCell {
349
+ border: 1px double var(--meowdown-node-outline);
350
+ background: var(--meowdown-node-selection);
351
+ --meowdown-selection: transparent;
352
+ caret-color: #0000;
353
+ }
354
+
355
+ .ProseMirror ::selection {
356
+ background: var(--meowdown-selection);
357
+ }
358
+
359
+ .ProseMirror .ProseMirror-selectednode {
360
+ --meowdown-selection: transparent;
361
+ outline: 1px solid var(--meowdown-node-outline);
362
+ background: var(--meowdown-node-selection);
363
+ border-radius: 2px;
364
+ }
365
+
366
+ .ProseMirror pre.ProseMirror-selectednode {
367
+ border-radius: .6rem;
368
+ }
369
+
370
+ .ProseMirror.prosekit-dragging {
371
+ --meowdown-node-selection: transparent;
372
+ }
373
+
315
374
  .ProseMirror .md-tag {
316
375
  background: color-mix(in oklab, var(--meowdown-accent) 10%, transparent);
317
376
  color: color-mix(in oklab, var(--meowdown-accent) 80%, var(--meowdown-heading));
@@ -322,9 +381,28 @@ prosekit-table-handle-drop-indicator {
322
381
  .ProseMirror .md-wikilink {
323
382
  color: var(--meowdown-accent);
324
383
  text-underline-offset: 2px;
384
+ cursor: pointer;
325
385
  text-decoration: underline 1px dashed;
326
386
  }
327
387
 
388
+ .ProseMirror .md-image {
389
+ display: block;
390
+ }
391
+
392
+ .ProseMirror .md-image img {
393
+ max-height: var(--meowdown-image-max-height, 24rem);
394
+ border-radius: var(--meowdown-image-radius, .5rem);
395
+ max-width: 100%;
396
+ }
397
+
398
+ .ProseMirror .prosekit-placeholder:before {
399
+ content: attr(data-placeholder);
400
+ float: left;
401
+ pointer-events: none;
402
+ height: 0;
403
+ color: var(--meowdown-placeholder, var(--meowdown-muted));
404
+ }
405
+
328
406
  .ProseMirror .md-mark, .ProseMirror .md-link-uri {
329
407
  color: var(--meowdown-mark);
330
408
  opacity: .7;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meowdown/core",
3
3
  "type": "module",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -17,16 +17,22 @@
17
17
  "./dist/**/*.css"
18
18
  ],
19
19
  "dependencies": {
20
+ "@codemirror/language": "^6.12.3",
21
+ "@codemirror/language-data": "^6.5.2",
20
22
  "@lezer/common": "^1.5.2",
23
+ "@lezer/highlight": "^1.2.3",
21
24
  "@lezer/markdown": "^1.6.4",
22
25
  "@prosekit/core": "^0.12.3",
23
- "@prosekit/extensions": "^0.17.4",
24
- "@prosekit/pm": "^0.1.18"
26
+ "@prosekit/extensions": "^0.17.5-beta.0",
27
+ "@prosekit/pm": "^0.1.18",
28
+ "prosemirror-highlight": "^0.15.2",
29
+ "prosemirror-tables": "^1.8.5"
25
30
  },
26
31
  "devDependencies": {
27
32
  "@ocavue/tsconfig": "^0.7.1",
28
33
  "@tsdown/css": "^0.22.2",
29
34
  "@vitest/browser-playwright": "^4.1.8",
35
+ "diffable-html-snapshot": "^0.2.0",
30
36
  "tsdown": "^0.22.2",
31
37
  "vitest": "^4.1.8"
32
38
  },