@meowdown/core 0.29.1 → 0.30.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 +14 -20
- package/dist/index.js +1 -1
- package/dist/style.css +554 -535
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -75,29 +75,23 @@ const markdown = docToMarkdown(editor.state.doc)
|
|
|
75
75
|
|
|
76
76
|
## Styling
|
|
77
77
|
|
|
78
|
-
`@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).
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
- `--meowdown-
|
|
91
|
-
- `--meowdown-gutter`: horizontal editor padding. Applied to the editable root's `.meowdown-content` class (set by `@meowdown/react`), not `.ProseMirror`, so the block handle's drag preview stays unpadded. Floating UI such as the block handle lives inside it; keep it at least `3.5rem`.
|
|
92
|
-
- `--meowdown-selection`: text `::selection` background.
|
|
93
|
-
- `--meowdown-node-outline`: outline of a selected node; border color of selected tables and cells.
|
|
94
|
-
- `--meowdown-node-selection`: background wash of a selected node or selected cells.
|
|
95
|
-
|
|
96
|
-
Selection colors are standalone variables, not derived from `--meowdown-accent`, so selection can be restyled independently.
|
|
78
|
+
`@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). Theme it by overriding the `--meowdown-*` variables on `:root` or any ancestor. The full list, with a one-line description and default for each, lives in the commented `:root` block at the top of [`style.css`](./src/style.css), which is the single source of truth.
|
|
79
|
+
|
|
80
|
+
meowdown's CSS is wrapped in a cascade layer, `@layer meowdown` (with sub-layers `meowdown.base` for the bundled ProseMirror / prosekit base styles, `meowdown.theme` for the variables, and `meowdown.editor` for the editor rules). Because an un-layered rule always beats a layered one, **any plain rule you write overrides meowdown with no `!important` and no specificity hacks** (e.g. `.ProseMirror h1 { font-size: 2rem }` wins over meowdown's layered heading rule). Put your overrides outside any `@layer`, or in a layer you declare after `meowdown`.
|
|
81
|
+
|
|
82
|
+
**With Tailwind CSS v4**, import `@meowdown/core/style.css` _after_ `@import 'tailwindcss'` so the `meowdown` layer sorts after Tailwind's `theme` / `base` / `components` / `utilities`. That keeps meowdown's editor styles from being reset by Tailwind's `base` (Preflight) while your own un-layered rules still win. One caveat: with that order the `meowdown` layer also sorts after `utilities`, so a Tailwind utility _class_ placed directly on an editor element will not beat meowdown. If you need utilities to win (while meowdown still beats Preflight), declare the layer order yourself with `utilities` last, referencing the umbrella `meowdown` layer (not its sub-layers). Doing this at the top of your CSS also pins the order even when meowdown's stylesheet is code-split / lazy-loaded:
|
|
83
|
+
|
|
84
|
+
```css
|
|
85
|
+
@layer theme, base, components, meowdown, utilities;
|
|
86
|
+
@import 'tailwindcss';
|
|
87
|
+
@import '@meowdown/core/style.css';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Two things the variable list cannot show: `--meowdown-gutter` is the horizontal editor padding, applied to the editable root's `.meowdown-content` class (set by `@meowdown/react`), not `.ProseMirror`, so the block handle's drag preview stays unpadded; floating UI such as the block handle lives inside it, so keep it at least `3.5rem`. The selection variables (`--meowdown-selection`, `--meowdown-node-outline`, `--meowdown-node-selection`) are standalone, not derived from `--meowdown-accent`, so selection can be restyled independently.
|
|
97
91
|
|
|
98
92
|
Tags (`#tag`) render as pills via the `.md-tag` class, tinted from `--meowdown-accent`. Wire click handling with `defineTagClickHandler(({ tag, event }) => ...)` (or `@meowdown/react`'s `onTagClick` prop); `tag` is read from the rendered text without the leading `#`.
|
|
99
93
|
|
|
100
|
-
Wikilinks (`[[target]]`/`[[target|alias]]`) render in place via a mark view as an immutable label (the alias, or the target when there is no alias), with the raw source hidden in hide and focus modes and shown dimmed in show mode. The label uses the `.md-wikilink-label` class
|
|
94
|
+
Wikilinks (`[[target]]`/`[[target|alias]]`) render in place via a mark view as an immutable label (the alias, or the target when there is no alias), with the raw source hidden in hide and focus modes and shown dimmed in show mode. The label uses the `.md-wikilink-view-label` class, dashed-underlined and colored by `--meowdown-accent`. In every mark mode the link is a single immutable caret stop: arrowing onto it selects the whole source (ringed with `--meowdown-node-outline` in hide and focus, the native selection over the visible source in show), and Backspace/Delete remove it as a unit. Wire click navigation with `defineWikilinkClickHandler(({ target, event }) => ...)` (or `@meowdown/react`'s `onWikilinkClick` prop).
|
|
101
95
|
|
|
102
96
|
Markdown links (`[text](url)`) render the label as an `<a href>` with the `.md-link` class, colored by `--meowdown-accent`; the `[`, `]`, and `(url)` syntax dims in show mode and hides in hide and focus modes. Wire click handling with `defineLinkClickHandler(({ href, event }) => ...)` (or `@meowdown/react`'s `onLinkClick` prop).
|
|
103
97
|
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,6 @@ import{Priority as e,Priority as t,createMarkBuilders as n,createNodeBuilders as
|
|
|
20
20
|
`)?t:t.replaceAll(`|`,String.raw`\|`).replaceAll(`
|
|
21
21
|
`,` `)}function Wi(e){return e.replace(/\n+$/u,``)}function Gi(e){return/^[\s>]*$/u.test(e)}function Ki(e){return e.split(`
|
|
22
22
|
`).filter(e=>!Gi(e))}function qi(e){return e.trim().replaceAll(/\s+/gu,` `)}function Ji(e,t={}){let n=ki(J(e,{frontmatter:t.frontmatter}),{frontmatter:t.frontmatter});if(Wi(n)===Wi(e))return`exact`;let r=Ki(e),i=Ki(n);return r.length===i.length&&r.every((e,t)=>qi(e)===qi(i[t]))?`normalizing`:`lossy`}const Yi=(e,t)=>{let{$from:n,empty:r}=e.selection;if(!r||n.depth!==1||n.index(0)!==0||n.parent.type.name!==`heading`||n.parentOffset!==n.parent.content.size)return!1;if(t){let r=te(e.schema,`list`),i=te(e.schema,`paragraph`),a=r.create({kind:`bullet`},i.create()),o=n.after(),s=e.tr.insert(o,a);s.setSelection(S.create(s.doc,o+2)),t(s.scrollIntoView())}return!0};function Xi(){return v(l({Enter:Yi}),t.high)}const Zi=new Set([`MscGen`,`Xù`,`MsGenny`,`Angular Template`,`Brainfuck`,`Esper`,`Oz`,`Factor`,`Squirrel`,`Yacas`,`mIRC`,`FCL`,`ECL`,`MUMPS`,`Pig`,`Asterisk`,`Z80`]),Qi=xe.map(e=>e.name).filter(e=>!Zi.has(e)).map(e=>({label:e,value:e.toLowerCase()})).concat({label:`Plain text`,value:``}).sort((e,t)=>e.label.localeCompare(t.label));function $i(){return typeof window>`u`?!1:window.matchMedia(`(prefers-color-scheme: dark)`).matches}const ea=/^(?:www\.|mobile\.)?(?:twitter\.com|x\.com)$/i,ta=/\/status(?:es)?\/(\d+)/;function na(e){let t;try{t=new URL(e)}catch{return}if(ea.test(t.hostname))return ta.exec(t.pathname)?.[1]}const ra=e=>{let t=na(e);if(!t)return;let n=$i()?`dark`:`light`;return{kind:`tweet`,key:`tweet:${t}`,src:`https://platform.twitter.com/embed/Tweet.html?id=${t}&theme=${n}&dnt=true`,title:`Tweet`,className:`md-embed md-embed-tweet`,testid:`tweet-embed`}};function ia(e){let t=t=>{if(t.source===e.contentWindow)try{let n=t.data?.[`twttr.embed`]?.params?.[0]?.height;typeof n==`number`&&(e.style.height=`${n}px`)}catch(e){console.warn(`[meowdown] failed to parse tweet resize message:`,e)}};window.addEventListener(`message`,t);let n=!1,r=()=>{n||(n=!0,window.removeEventListener(`message`,t),i.disconnect())},i=new MutationObserver(()=>{e.isConnected||r()});return i.observe(document.body,{childList:!0,subtree:!0}),r}const aa=/^(?:www\.|m\.)?(?:youtube\.com|youtube-nocookie\.com)$/i,oa=/^(?:www\.)?youtu\.be$/i,sa=/^[\w-]{11}$/;function ca(e){let t;try{t=new URL(e)}catch{return}let n=null;if(oa.test(t.hostname))n=t.pathname.slice(1);else if(aa.test(t.hostname)){let[,e,r]=t.pathname.split(`/`);t.pathname===`/watch`?n=t.searchParams.get(`v`):(e===`shorts`||e===`embed`||e===`live`)&&(n=r??null)}if(!n||!sa.test(n))return;let r=t.searchParams.get(`start`)??t.searchParams.get(`t`),i=r?la(r):void 0;return{videoId:n,startSeconds:i}}function la(e){if(/^\d+$/.test(e))return Number(e);let t=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(e);if(!(!t||!t[1]&&!t[2]&&!t[3]))return Number(t[1]??0)*3600+Number(t[2]??0)*60+Number(t[3]??0)}const ua=[e=>{let t=ca(e);if(!t)return;let n=t.startSeconds?`?start=${t.startSeconds}`:``;return{kind:`youtube`,key:`youtube:${t.videoId}:${t.startSeconds??0}`,src:`https://www.youtube-nocookie.com/embed/${t.videoId}${n}`,title:`YouTube video`,className:`md-embed md-embed-youtube`,testid:`youtube-embed`,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen`,allowFullscreen:!0}},ra];function da(e){for(let t of ua){let n=t(e);if(n)return n}}const fa=new x(`meowdown-embed-paste`);function pa(e){let t=e.trim();if(!(!t||/\s/.test(t)))return da(t)?t:void 0}function ma(e,t){return e.clipboardData?.getData(`text/plain`)||t.content.textBetween(0,t.content.size,`
|
|
23
|
-
`)}function ha(e,t){let{from:n,to:r}=e.state.selection;e.dispatch(at(e.state.tr.insertText(t,n,r)));let i=e.state.tr.insertText(``,n,n+t.length);e.dispatch(at(i))}function ga(){return m(new b({key:fa,props:{handlePaste:(e,t,n)=>{let r=e.state.selection.$from.parent;if(!r.inlineContent||r.type.spec.code)return!1;let i=ma(t,n);if(!i)return!1;let a=pa(i);return a?(ha(e,a),!0):!1}}}))}const _a=new x(`meowdown-exit-boundary`);function va(e,t){let{$anchor:n,$head:r}=e.selection,i=t>0?n.max(r):n.min(r),a=i.parent.inlineContent?i.depth?e.doc.resolve(t>0?i.after():i.before()):void 0:i;return!!(a&&ye.findFrom(a,t))}function ya(e,t){let{state:n}=e,{selection:r}=n;return g(r)&&!r.empty||ne(r)||r.$from.parent.inlineContent&&!e.endOfTextblock(t<0?`up`:`down`)?!0:va(n,t)}function ba(e){return new b({key:_a,props:{handleKeyDown:(t,n)=>{if(n.shiftKey||n.altKey||n.ctrlKey||n.metaKey)return!1;let r=n.key===`ArrowUp`?-1:n.key===`ArrowDown`?1:void 0;return!(!r||ya(t,r)||e({direction:r<0?`up`:`down`,event:n})===!1)}}})}function xa(e){return v(m(ba(e)),t.low)}const Sa=(e,t)=>{let n={type:`highlight`,children:e.all(t)};return e.patch(t,n),n},Ca=(e,t,n,r)=>{let i=e,a=n.createTracker(r),o=a.move(`==`);return o+=a.move(n.containerPhrasing(i,{...a.current(),before:o,after:`=`})),o+=a.move(`==`),o};function wa(){return ut().use(ot).use(st,{handlers:{mark:Sa}}).use(ct).use(lt,{bullet:`-`,emphasis:`*`,strong:`*`,fence:"`",fences:!0,rule:`-`,ruleRepetition:3,listItemIndent:`one`,handlers:{highlight:Ca}}).freeze()}const Ta=y(wa);function Ea(e){return String(Ta().processSync(e))}const Da=new x(`meowdown-html-paste`);function Oa(){return m(new b({key:Da,props:{transformPastedHTML:(e,t)=>{if(e.includes(`data-pm-slice`))return e;let n=t.state.selection.$from.parent;if(!n.inlineContent||n.type.spec.code)return e;let r=Ea(e);if(!r.trim())return e;let i=J(r,{nodes:pi(t.state.schema)}),a=Ne.fromSchema(t.state.schema),o=document.createElement(`div`);return o.append(a.serializeFragment(i.content)),o.innerHTML}}}))}const ka=new x(`meowdown-image-click`);function Aa(e,t){let n=D(e,t,`mdImage`);if(!n)return;let{src:r,alt:i}=n.mark.attrs;return{from:n.from,to:n.to,src:r,alt:i}}function ja(e){return m(new b({key:ka,props:{handleClick:(t,n,r)=>{let i=r.target?.closest?.(`.md-image-view-preview`);if(!i)return!1;let a=i.closest(`.md-image-view`)?.querySelector(`.md-image-view-content`);if(!a)return!1;let o=Aa(t.state,t.posAtDOM(a,0));return o?(e({src:o.src,alt:o.alt,event:r}),!0):!1}}}))}function Ma(e){return/^https?:\/\//i.test(e)?e:void 0}function Na(e){let t=document.createElement(`iframe`);return t.src=e.src,t.title=e.title,t.className=e.className,t.dataset.testid=e.testid,t.loading=`lazy`,t.referrerPolicy=`strict-origin-when-cross-origin`,t.setAttribute(`frameborder`,`0`),e.allow&&(t.allow=e.allow),e.allowFullscreen&&(t.allowFullscreen=!0),e.kind===`tweet`&&ia(t),t}function Pa(e,t,n,r,i,a,o){let s=da(e);if(s){let e=document.createElement(`span`);return e.className=`md-image-view-preview md-atom-view-preview`,e.appendChild(Na(s)),e}let c=(i.resolveImageUrl??Ma)(e);if(!c)return;let l=document.createElement(`span`);return l.className=`md-image-view-preview md-atom-view-preview`,l.dataset.testid=`image-preview`,l.appendChild(Fa(c,t,n,r,a,o)),l}function Fa(e,t,n,r,i,a){ft(),dt();let o=document.createElement(`prosekit-resizable-root`);o.className=`md-image-resizable`,o.dataset.testid=`image-resizable`,n!=null&&o.setAttribute(`data-width`,String(n)),r!=null&&o.setAttribute(`data-height`,String(r));let s=document.createElement(`img`);s.src=e,s.alt=t,s.draggable=!1,s.addEventListener(`load`,()=>{let{naturalWidth:e,naturalHeight:t}=s,i=e/t;if(!Number.isFinite(i)||i<=0||(o.setAttribute(`data-aspect-ratio`,String(i)),n!=null&&r!=null))return;let a=n==null?Math.min(t,500):n/i,c=n??a*i;o.setAttribute(`data-width`,String(Math.round(c))),o.setAttribute(`data-height`,String(Math.round(a)))}),o.appendChild(s);let c=document.createElement(`prosekit-resizable-handle`);return c.className=`md-image-resize-handle`,c.setAttribute(`position`,`bottom-right`),c.addEventListener(`click`,e=>e.stopPropagation()),o.appendChild(c),o.addEventListener(`resizeEnd`,e=>{let{width:t,height:n}=e.detail;Ia(i,a,t,n)}),o}function Ia(e,t,n,r){let i=e.posAtDOM(t,0),a=D(e.state,i,`mdImage`);if(!a)return;let o=e.state.doc.textBetween(a.from,a.to),s=Tn(o),c=a.from+s.length,l=o.slice(s.length),u=wn({...Sn(l)??{},width:Math.round(n),height:Math.round(r)});u!==l&&e.dispatch(e.state.tr.insertText(u,c,a.to))}function La(e){return(t,n)=>{let{src:r,alt:i,width:a,height:o}=t.attrs,s=document.createElement(`span`);s.className=`md-image-view md-atom-view`;let c=document.createElement(`span`);c.className=`md-image-view-content md-atom-view-content`;let l=Pa(r,i,a,o,e,n,c);return l&&(l.contentEditable=`false`,s.appendChild(l)),s.appendChild(c),{dom:s,contentDOM:c,ignoreMutation:e=>!c.contains(e.target)}}}function Ra(e){return e?Array.from(e.files).filter(e=>e.type.startsWith(`image/`)):[]}const za=e=>{console.error(`[meowdown] failed to save pasted image:`,e)};async function Ba(e,t,n,r=za,i){let a=i;for(let i of t){let t;try{t=await n(i)}catch(e){r(e,i);continue}if(!t||e.isDestroyed)continue;let o=``,s=a==null?e.state.tr.insertText(o):e.state.tr.insertText(o,a);e.dispatch(s),a!=null&&(a+=o.length)}}function Va(e){return new b({key:new x(`image-input`),props:{handlePaste:(t,n)=>{let r=Ra(n.clipboardData),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(Ba(t,r,i,a),!0)},handleDrop:(t,n)=>{let r=Ra(n.dataTransfer),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(Ba(t,r,i,a,t.posAtCoords({left:n.clientX,top:n.clientY})?.pos),!0)}}})}function Ha(e={}){return _(d({name:`mdImage`,constructor:La(e)}),v(m(Va(e)),t.high))}const Ua={"Mod-b":`Bold`,"Mod-i":`Italic`,"Mod-e":`Inline code`,"Mod-Shift-x":`Strikethrough`,"Mod-Shift-h":`Highlight`,"Mod-k":`Link`,"Mod-1":`Heading 1`,"Mod-2":`Heading 2`,"Mod-3":`Heading 3`,"Mod-4":`Heading 4`,"Mod-5":`Heading 5`,"Mod-6":`Heading 6`,"Mod-.":`Fold or unfold a bullet`};function Wa(e){return m(new b({key:e.key,props:{handleClick:(t,n,r)=>{if(!r.target?.closest?.(e.selector))return!1;let i=e.findPayloadAt(t.state,n);return i==null?!1:(e.preventDefault&&r.preventDefault(),e.onClick(i,r),!0)}}}))}const Ga=new x(`meowdown-link-click`);function Ka(e){return Wa({key:Ga,selector:`.md-link`,preventDefault:!0,findPayloadAt:(e,t)=>K(e,t)?.href,onClick:(t,n)=>e({href:t,event:n})})}function qa(e){let t,n=(n,r)=>{let i=r.target;if(!i||!ue(i))return;let a=i.closest(e.selector);if(!a||a===t)return;let o=n.posAtDOM(a,0),s=e.findPayloadAt(n.state,o);s!=null&&(t=a,e.onHoverChange({payload:s,element:a}))},r=n=>{if(!t)return;let r=n.relatedTarget;r&&t.contains(r)||(t=void 0,e.onHoverChange(void 0))};return _(s(`mouseover`,(e,t)=>n(e,t)),s(`mouseout`,(e,t)=>r(t)))}function Ja(e){return qa({selector:`.md-link`,findPayloadAt:(e,t)=>K(e,t),onHoverChange:e})}const Ya=new x(`meowdown-markdown-copy`);function Xa(){return m(new b({key:Ya,props:{clipboardTextSerializer:(e,t)=>{let n=e.content,r;try{r=t.state.schema.topNodeType.createAndFill(void 0,n)??void 0}catch{r=void 0}return r?ki(r).replace(/\n+$/,``):n.textBetween(0,n.size,`
|
|
23
|
+
`)}function ha(e,t){let{from:n,to:r}=e.state.selection;e.dispatch(at(e.state.tr.insertText(t,n,r)));let i=e.state.tr.insertText(``,n,n+t.length);e.dispatch(at(i))}function ga(){return m(new b({key:fa,props:{handlePaste:(e,t,n)=>{let r=e.state.selection.$from.parent;if(!r.inlineContent||r.type.spec.code)return!1;let i=ma(t,n);if(!i)return!1;let a=pa(i);return a?(ha(e,a),!0):!1}}}))}const _a=new x(`meowdown-exit-boundary`);function va(e,t){let{$anchor:n,$head:r}=e.selection,i=t>0?n.max(r):n.min(r),a=i.parent.inlineContent?i.depth?e.doc.resolve(t>0?i.after():i.before()):void 0:i;return!!(a&&ye.findFrom(a,t))}function ya(e,t){let{state:n}=e,{selection:r}=n;return g(r)&&!r.empty||ne(r)||r.$from.parent.inlineContent&&!e.endOfTextblock(t<0?`up`:`down`)?!0:va(n,t)}function ba(e){return new b({key:_a,props:{handleKeyDown:(t,n)=>{if(n.shiftKey||n.altKey||n.ctrlKey||n.metaKey)return!1;let r=n.key===`ArrowUp`?-1:n.key===`ArrowDown`?1:void 0;return!(!r||ya(t,r)||e({direction:r<0?`up`:`down`,event:n})===!1)}}})}function xa(e){return v(m(ba(e)),t.low)}const Sa=(e,t)=>{let n={type:`highlight`,children:e.all(t)};return e.patch(t,n),n},Ca=(e,t,n,r)=>{let i=e,a=n.createTracker(r),o=a.move(`==`);return o+=a.move(n.containerPhrasing(i,{...a.current(),before:o,after:`=`})),o+=a.move(`==`),o};function wa(){return ut().use(ot).use(st,{handlers:{mark:Sa}}).use(ct).use(lt,{bullet:`-`,emphasis:`*`,strong:`*`,fence:"`",fences:!0,rule:`-`,ruleRepetition:3,listItemIndent:`one`,handlers:{highlight:Ca}}).freeze()}const Ta=y(wa);function Ea(e){return String(Ta().processSync(e))}const Da=new x(`meowdown-html-paste`);function Oa(){return m(new b({key:Da,props:{transformPastedHTML:(e,t)=>{if(e.includes(`data-pm-slice`))return e;let n=t.state.selection.$from.parent;if(!n.inlineContent||n.type.spec.code)return e;let r=Ea(e);if(!r.trim())return e;let i=J(r,{nodes:pi(t.state.schema)}),a=Ne.fromSchema(t.state.schema),o=document.createElement(`div`);return o.append(a.serializeFragment(i.content)),o.innerHTML}}}))}const ka=new x(`meowdown-image-click`);function Aa(e,t){let n=D(e,t,`mdImage`);if(!n)return;let{src:r,alt:i}=n.mark.attrs;return{from:n.from,to:n.to,src:r,alt:i}}function ja(e){return m(new b({key:ka,props:{handleClick:(t,n,r)=>{let i=r.target?.closest?.(`.md-image-view-preview`);if(!i)return!1;let a=i.closest(`.md-image-view`)?.querySelector(`.md-image-view-content`);if(!a)return!1;let o=Aa(t.state,t.posAtDOM(a,0));return o?(e({src:o.src,alt:o.alt,event:r}),!0):!1}}}))}function Ma(e){return/^https?:\/\//i.test(e)?e:void 0}function Na(e){let t=document.createElement(`iframe`);return t.src=e.src,t.title=e.title,t.className=e.className,t.dataset.testid=e.testid,t.loading=`lazy`,t.referrerPolicy=`strict-origin-when-cross-origin`,t.setAttribute(`frameborder`,`0`),e.allow&&(t.allow=e.allow),e.allowFullscreen&&(t.allowFullscreen=!0),e.kind===`tweet`&&ia(t),t}function Pa(e,t,n,r,i,a,o){let s=da(e);if(s){let e=document.createElement(`span`);return e.className=`md-image-view-preview md-atom-view-preview`,e.appendChild(Na(s)),e}let c=(i.resolveImageUrl??Ma)(e);if(!c)return;let l=document.createElement(`span`);return l.className=`md-image-view-preview md-atom-view-preview`,l.dataset.testid=`image-preview`,l.appendChild(Fa(c,t,n,r,a,o)),l}function Fa(e,t,n,r,i,a){ft(),dt();let o=document.createElement(`prosekit-resizable-root`);o.className=`md-image-resizable`,o.dataset.testid=`image-resizable`,o.setAttribute(`data-loading`,``),n!=null&&o.setAttribute(`data-width`,String(n)),r!=null&&o.setAttribute(`data-height`,String(r));let s=document.createElement(`img`);s.src=e,s.alt=t,s.draggable=!1,s.addEventListener(`load`,()=>{o.removeAttribute(`data-loading`);let{naturalWidth:e,naturalHeight:t}=s,i=e/t;if(!Number.isFinite(i)||i<=0||(o.setAttribute(`data-aspect-ratio`,String(i)),n!=null&&r!=null))return;let a=n==null?Math.min(t,500):n/i,c=n??a*i;o.setAttribute(`data-width`,String(Math.round(c))),o.setAttribute(`data-height`,String(Math.round(a)))}),s.addEventListener(`error`,()=>{o.removeAttribute(`data-loading`)}),o.appendChild(s);let c=document.createElement(`prosekit-resizable-handle`);return c.className=`md-image-resize-handle`,c.setAttribute(`position`,`bottom-right`),c.addEventListener(`click`,e=>e.stopPropagation()),o.appendChild(c),o.addEventListener(`resizeEnd`,e=>{let{width:t,height:n}=e.detail;Ia(i,a,t,n)}),o}function Ia(e,t,n,r){let i=e.posAtDOM(t,0),a=D(e.state,i,`mdImage`);if(!a)return;let o=e.state.doc.textBetween(a.from,a.to),s=Tn(o),c=a.from+s.length,l=o.slice(s.length),u=wn({...Sn(l)??{},width:Math.round(n),height:Math.round(r)});u!==l&&e.dispatch(e.state.tr.insertText(u,c,a.to))}function La(e){return(t,n)=>{let{src:r,alt:i,width:a,height:o}=t.attrs,s=document.createElement(`span`);s.className=`md-image-view md-atom-view`;let c=document.createElement(`span`);c.className=`md-image-view-content md-atom-view-content`;let l=Pa(r,i,a,o,e,n,c);return l&&(l.contentEditable=`false`,s.appendChild(l)),s.appendChild(c),{dom:s,contentDOM:c,ignoreMutation:e=>!c.contains(e.target)}}}function Ra(e){return e?Array.from(e.files).filter(e=>e.type.startsWith(`image/`)):[]}const za=e=>{console.error(`[meowdown] failed to save pasted image:`,e)};async function Ba(e,t,n,r=za,i){let a=i;for(let i of t){let t;try{t=await n(i)}catch(e){r(e,i);continue}if(!t||e.isDestroyed)continue;let o=``,s=a==null?e.state.tr.insertText(o):e.state.tr.insertText(o,a);e.dispatch(s),a!=null&&(a+=o.length)}}function Va(e){return new b({key:new x(`image-input`),props:{handlePaste:(t,n)=>{let r=Ra(n.clipboardData),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(Ba(t,r,i,a),!0)},handleDrop:(t,n)=>{let r=Ra(n.dataTransfer),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(Ba(t,r,i,a,t.posAtCoords({left:n.clientX,top:n.clientY})?.pos),!0)}}})}function Ha(e={}){return _(d({name:`mdImage`,constructor:La(e)}),v(m(Va(e)),t.high))}const Ua={"Mod-b":`Bold`,"Mod-i":`Italic`,"Mod-e":`Inline code`,"Mod-Shift-x":`Strikethrough`,"Mod-Shift-h":`Highlight`,"Mod-k":`Link`,"Mod-1":`Heading 1`,"Mod-2":`Heading 2`,"Mod-3":`Heading 3`,"Mod-4":`Heading 4`,"Mod-5":`Heading 5`,"Mod-6":`Heading 6`,"Mod-.":`Fold or unfold a bullet`};function Wa(e){return m(new b({key:e.key,props:{handleClick:(t,n,r)=>{if(!r.target?.closest?.(e.selector))return!1;let i=e.findPayloadAt(t.state,n);return i==null?!1:(e.preventDefault&&r.preventDefault(),e.onClick(i,r),!0)}}}))}const Ga=new x(`meowdown-link-click`);function Ka(e){return Wa({key:Ga,selector:`.md-link`,preventDefault:!0,findPayloadAt:(e,t)=>K(e,t)?.href,onClick:(t,n)=>e({href:t,event:n})})}function qa(e){let t,n=(n,r)=>{let i=r.target;if(!i||!ue(i))return;let a=i.closest(e.selector);if(!a||a===t)return;let o=n.posAtDOM(a,0),s=e.findPayloadAt(n.state,o);s!=null&&(t=a,e.onHoverChange({payload:s,element:a}))},r=n=>{if(!t)return;let r=n.relatedTarget;r&&t.contains(r)||(t=void 0,e.onHoverChange(void 0))};return _(s(`mouseover`,(e,t)=>n(e,t)),s(`mouseout`,(e,t)=>r(t)))}function Ja(e){return qa({selector:`.md-link`,findPayloadAt:(e,t)=>K(e,t),onHoverChange:e})}const Ya=new x(`meowdown-markdown-copy`);function Xa(){return m(new b({key:Ya,props:{clipboardTextSerializer:(e,t)=>{let n=e.content,r;try{r=t.state.schema.topNodeType.createAndFill(void 0,n)??void 0}catch{r=void 0}return r?ki(r).replace(/\n+$/,``):n.textBetween(0,n.size,`
|
|
24
24
|
`,`
|
|
25
25
|
`)}}}))}const Za=new x(`meowdown-tag-click`);function Qa(e,t){let n=D(e,t,`mdTag`);if(!n)return;let r=e.doc.textBetween(n.from,n.to),i=r.startsWith(`#`)?r.slice(1):r;return{from:n.from,to:n.to,tag:i}}function $a(e){return Wa({key:Za,selector:`.md-tag`,preventDefault:!1,findPayloadAt:(e,t)=>Qa(e,t)?.tag,onClick:(t,n)=>e({tag:t,event:n})})}const eo=new x(`meowdown-wikilink-click`);function to(e,t){let n=D(e,t,`mdWikilink`);if(!n)return;let{target:r}=n.mark.attrs;return{from:n.from,to:n.to,target:r}}function no(e){return Wa({key:eo,selector:`.md-wikilink-view-preview`,preventDefault:!1,findPayloadAt:(e,t)=>to(e,t)?.target,onClick:(t,n)=>e({target:t,event:n})})}const ro=(e,t)=>{let{selection:n}=e;if(!n.empty&&!n.$head.sameParent(n.$anchor))return!1;let r=e.doc.textBetween(n.from,n.to);if(r.startsWith(`[[`))return!1;r.startsWith(`[`)&&(r=r.slice(1));let i=`[[`+r;if(t){let r=e.tr.insertText(i,n.from,n.to);r.setSelection(S.create(r.doc,n.from+i.length)),pt(r),t(r.scrollIntoView())}return!0};function io(){return l({"Mod-Shift-k":ro})}function ao(e,t){let n=()=>{let n=e.coordsAtPos(t.from),r=e.coordsAtPos(t.to),i=Math.min(n.left,r.left),a=Math.max(n.right,r.right),o=Math.min(n.top,r.top),s=Math.max(n.bottom,r.bottom);return new DOMRect(i,o,a-i,s-o)};return{getBoundingClientRect:n,getClientRects:()=>[n()]}}export{Ua as EDITOR_KEY_BINDINGS,e as Priority,Ji as checkRoundTrip,Qi as codeBlockLanguages,Ma as defaultResolveImageUrl,Xi as defineBulletAfterHeading,Pt as defineCodeBlockSyntaxHighlight,oi as defineEditorExtension,ga as defineEmbedPaste,xa as defineExitBoundaryHandler,Yt as defineHTMLComment,Oa as defineHTMLPaste,Ha as defineImage,ja as defineImageClickHandler,Ka as defineLinkClickHandler,jr as defineLinkCommands,Nr as defineLinkEditKeymap,Ja as defineLinkHoverHandler,_t as defineMarkMode,Xa as defineMarkdownCopy,ce as definePlaceholder,le as defineReadonly,$a as defineTagClickHandler,no as defineWikilinkClickHandler,io as defineWikilinkTrigger,ki as docToMarkdown,It as getCodeTokens,K as getLinkUnitAt,li as getMarkBuilders,ao as getVirtualElementFromRange,jn as inlineTextToMarkChunks,Or as insertLink,$r as isSelectionInTableCell,ia as listenForTweetHeight,J as markdownToDoc,da as matchEmbed,Ar as removeLink,kr as updateLink,oe as withPriority};
|