@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 +30 -2
- package/dist/index.d.ts +51 -4
- package/dist/index.js +7 -6
- package/dist/style.css +124 -46
- package/package.json +9 -3
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
|
|
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 (``) 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").
|
|
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
|
-
|
|
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
|
|
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=``,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
|
|
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
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
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
|
},
|