@ox-content/vite-plugin 2.81.0 → 2.82.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/dist/incremental-dom.cjs +3 -2
- package/dist/incremental-dom.cjs.map +1 -1
- package/dist/incremental-dom.d.cts.map +1 -1
- package/dist/incremental-dom.d.mts.map +1 -1
- package/dist/incremental-dom.mjs +2 -1
- package/dist/incremental-dom.mjs.map +1 -1
- package/dist/index.cjs +1486 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -13
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +8 -13
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1429 -69
- package/dist/index.mjs.map +1 -1
- package/dist/interop.cjs.map +1 -1
- package/dist/interop.mjs.map +1 -1
- package/dist/tabs.cjs +3 -4
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.mjs +99 -2
- package/dist/tabs.mjs.map +1 -0
- package/dist/vitepress-cli.cjs +5 -4
- package/dist/vitepress-cli.cjs.map +1 -1
- package/dist/vitepress-cli.d.cts +1 -1
- package/dist/vitepress-cli.d.mts +1 -1
- package/dist/vitepress-cli.mjs +4 -2
- package/dist/vitepress-cli.mjs.map +1 -1
- package/dist/vitepress.cjs +106 -2
- package/dist/vitepress.cjs.map +1 -1
- package/dist/vitepress.mjs +32 -2
- package/dist/vitepress.mjs.map +1 -1
- package/package.json +19 -19
- package/dist/chunk.cjs +0 -57
- package/dist/github.cjs +0 -690
- package/dist/github.cjs.map +0 -1
- package/dist/github.mjs +0 -625
- package/dist/github.mjs.map +0 -1
- package/dist/github2.mjs +0 -2
- package/dist/media.cjs +0 -310
- package/dist/media.cjs.map +0 -1
- package/dist/media.mjs +0 -302
- package/dist/media.mjs.map +0 -1
- package/dist/media2.mjs +0 -2
- package/dist/mermaid.cjs +0 -114
- package/dist/mermaid.cjs.map +0 -1
- package/dist/mermaid.mjs +0 -2
- package/dist/mermaid2.mjs +0 -92
- package/dist/mermaid2.mjs.map +0 -1
- package/dist/napi.cjs +0 -45
- package/dist/napi.cjs.map +0 -1
- package/dist/napi.mjs +0 -34
- package/dist/napi.mjs.map +0 -1
- package/dist/ogp.cjs +0 -341
- package/dist/ogp.cjs.map +0 -1
- package/dist/ogp.mjs +0 -2
- package/dist/ogp2.mjs +0 -302
- package/dist/ogp2.mjs.map +0 -1
- package/dist/pm.cjs +0 -45
- package/dist/pm.cjs.map +0 -1
- package/dist/pm.mjs +0 -2
- package/dist/pm2.mjs +0 -38
- package/dist/pm2.mjs.map +0 -1
- package/dist/tabs2.mjs +0 -56
- package/dist/tabs2.mjs.map +0 -1
- package/dist/youtube.cjs +0 -57
- package/dist/youtube.cjs.map +0 -1
- package/dist/youtube.mjs +0 -2
- package/dist/youtube2.mjs +0 -35
- package/dist/youtube2.mjs.map +0 -1
package/dist/incremental-dom.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("./
|
|
2
|
+
require("./vitepress.cjs");
|
|
3
3
|
//#region src/incremental-dom-styles.ts
|
|
4
4
|
const DEFAULT_COMMITTED_CLASS = "ox-incremental-committed";
|
|
5
5
|
const DEFAULT_PENDING_CLASS = "ox-incremental-pending";
|
|
@@ -145,7 +145,8 @@ function createIncrementalMarkdownDomRenderer(options) {
|
|
|
145
145
|
const previousText = pendingRoot.textContent ?? "";
|
|
146
146
|
const fragment = parseHtml(html);
|
|
147
147
|
const nextText = fragment.textContent ?? "";
|
|
148
|
-
|
|
148
|
+
const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;
|
|
149
|
+
prepareCharacterFade(document, fragment, animation, visiblePrefix);
|
|
149
150
|
pendingRoot.replaceChildren(fragment);
|
|
150
151
|
}
|
|
151
152
|
function parseHtml(html) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-dom.cjs","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-animation.ts","../src/incremental-dom-renderer.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\n\nexport const DEFAULT_COMMITTED_CLASS = \"ox-incremental-committed\";\nexport const DEFAULT_PENDING_CLASS = \"ox-incremental-pending\";\nexport const DEFAULT_CHAR_CLASS = \"ox-incremental-char\";\nexport const DEFAULT_VISIBLE_CLASS = \"ox-incremental-char--visible\";\nexport const DEFAULT_ATOM_CLASS = \"ox-incremental-atom\";\n\nexport const incrementalMarkdownDomStyles = `\n.${DEFAULT_COMMITTED_CLASS},\n.${DEFAULT_PENDING_CLASS} {\n display: contents;\n}\n\n.${DEFAULT_CHAR_CLASS},\n.${DEFAULT_ATOM_CLASS} {\n animation: ox-incremental-char-in var(--ox-incremental-duration, 170ms) ease-out both;\n animation-delay: var(--ox-incremental-delay, 0ms);\n}\n\n.${DEFAULT_VISIBLE_CLASS} {\n animation: none;\n opacity: 1;\n}\n\n@keyframes ox-incremental-char-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`.trim();\n\nexport function injectIncrementalMarkdownDomStyles(\n document: Document = globalThis.document,\n): HTMLStyleElement {\n const existing = document.querySelector<HTMLStyleElement>(\"style[data-ox-incremental-dom]\");\n if (existing) {\n return existing;\n }\n\n const style = document.createElement(\"style\");\n style.dataset.oxIncrementalDom = \"\";\n style.textContent = incrementalMarkdownDomStyles;\n document.head.append(style);\n return style;\n}\n","/// <reference lib=\"dom\" />\n\nimport {\n DEFAULT_ATOM_CLASS,\n DEFAULT_CHAR_CLASS,\n DEFAULT_VISIBLE_CLASS,\n} from \"./incremental-dom-styles\";\nimport type { IncrementalMarkdownDomAnimationOptions } from \"./incremental-dom-types\";\n\nexport interface ResolvedAnimationOptions {\n mode: \"none\" | \"character\";\n durationMs: number;\n staggerMs: number;\n committed: boolean;\n pending: boolean;\n charClassName: string;\n visibleClassName: string;\n atomClassName: string;\n}\n\nexport function resolveAnimationOptions(\n animation: boolean | IncrementalMarkdownDomAnimationOptions | undefined,\n): ResolvedAnimationOptions {\n if (!animation) {\n return {\n mode: \"none\",\n durationMs: 0,\n staggerMs: 0,\n committed: false,\n pending: false,\n charClassName: DEFAULT_CHAR_CLASS,\n visibleClassName: DEFAULT_VISIBLE_CLASS,\n atomClassName: DEFAULT_ATOM_CLASS,\n };\n }\n\n const options = animation === true ? {} : animation;\n return {\n mode: options.mode ?? \"character\",\n durationMs: options.durationMs ?? 170,\n staggerMs: options.staggerMs ?? 2,\n committed: options.committed ?? true,\n pending: options.pending ?? true,\n charClassName: options.charClassName ?? DEFAULT_CHAR_CLASS,\n visibleClassName: options.visibleClassName ?? DEFAULT_VISIBLE_CLASS,\n atomClassName: options.atomClassName ?? DEFAULT_ATOM_CLASS,\n };\n}\n\nexport function prepareCharacterFade(\n document: Document,\n root: ParentNode,\n animation: ResolvedAnimationOptions,\n visibleTextPrefix: number,\n): void {\n if (animation.mode === \"none\") {\n return;\n }\n\n const textNodes = collectTextNodes(document, root);\n let index = 0;\n let textOffset = 0;\n\n for (const textNode of textNodes) {\n const value = textNode.nodeValue ?? \"\";\n const parent = textNode.parentElement;\n const preserveWhitespace = Boolean(parent?.closest(\"pre, code\"));\n\n if (!value || (!preserveWhitespace && !value.trim())) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n for (const char of [...value]) {\n const span = document.createElement(\"span\");\n if (textOffset < visibleTextPrefix) {\n span.className = `${animation.charClassName} ${animation.visibleClassName}`;\n } else {\n span.className = animation.charClassName;\n span.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n span.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n span.textContent = char;\n fragment.append(span);\n textOffset += 1;\n }\n textNode.replaceWith(fragment);\n }\n\n for (const atom of root.querySelectorAll(\"input, img, hr, br, iframe, svg\")) {\n if (textOffset < visibleTextPrefix) {\n continue;\n }\n const element = atom as HTMLElement;\n atom.classList.add(animation.atomClassName);\n element.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n element.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n}\n\nfunction collectTextNodes(document: Document, root: ParentNode): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n return textNodes;\n}\n","/// <reference lib=\"dom\" />\n\nimport { prepareCharacterFade, resolveAnimationOptions } from \"./incremental-dom-animation\";\nimport { DEFAULT_COMMITTED_CLASS, DEFAULT_PENDING_CLASS } from \"./incremental-dom-styles\";\nimport type {\n IncrementalMarkdownDomApplyOptions,\n IncrementalMarkdownDomOptions,\n IncrementalMarkdownDomRenderer,\n IncrementalMarkdownRenderResultLike,\n} from \"./incremental-dom-types\";\n\nexport function createIncrementalMarkdownDomRenderer(\n options: IncrementalMarkdownDomOptions,\n): IncrementalMarkdownDomRenderer {\n const document = options.preview.ownerDocument;\n const animation = resolveAnimationOptions(options.animation);\n const committedRoot = document.createElement(\"div\");\n const pendingRoot = document.createElement(\"div\");\n const committedClassName = options.committedClassName ?? DEFAULT_COMMITTED_CLASS;\n const pendingClassName = options.pendingClassName ?? DEFAULT_PENDING_CLASS;\n let markdown = \"\";\n\n committedRoot.className = committedClassName;\n pendingRoot.className = pendingClassName;\n options.preview.replaceChildren(committedRoot, pendingRoot);\n\n function apply(\n result: IncrementalMarkdownRenderResultLike,\n applyOptions: IncrementalMarkdownDomApplyOptions = {},\n ): void {\n const previousPendingText = pendingRoot.textContent ?? \"\";\n\n if (applyOptions.chunk !== undefined && options.source) {\n markdown += applyOptions.chunk;\n options.source.textContent = markdown;\n }\n\n if (result.deltaHtml) {\n appendCommittedHtml(result.deltaHtml, previousPendingText);\n }\n\n setPendingHtml(result.pendingHtml);\n }\n\n function reset(): void {\n markdown = \"\";\n if (options.source) {\n options.source.textContent = \"\";\n }\n committedRoot.replaceChildren();\n pendingRoot.replaceChildren();\n }\n\n function appendCommittedHtml(html: string, previousPendingText: string): void {\n const fragment = parseHtml(html);\n const committedText = fragment.textContent ?? \"\";\n const visiblePrefix = commonPrefixLength(previousPendingText, committedText);\n prepareCharacterFade(\n document,\n fragment,\n animation,\n animation.committed ? visiblePrefix : Infinity,\n );\n committedRoot.append(fragment);\n }\n\n function setPendingHtml(html: string): void {\n const previousText = pendingRoot.textContent ?? \"\";\n const fragment = parseHtml(html);\n const nextText = fragment.textContent ?? \"\";\n const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;\n prepareCharacterFade(document, fragment, animation, visiblePrefix);\n pendingRoot.replaceChildren(fragment);\n }\n\n function parseHtml(html: string): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n }\n\n return { committedRoot, pendingRoot, apply, reset };\n}\n\nfunction commonPrefixLength(left: string, right: string): number {\n const max = Math.min(left.length, right.length);\n let index = 0;\n\n while (index < max && left[index] === right[index]) {\n index += 1;\n }\n\n return index;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"incremental-dom.cjs","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-animation.ts","../src/incremental-dom-renderer.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\n\nexport const DEFAULT_COMMITTED_CLASS = \"ox-incremental-committed\";\nexport const DEFAULT_PENDING_CLASS = \"ox-incremental-pending\";\nexport const DEFAULT_CHAR_CLASS = \"ox-incremental-char\";\nexport const DEFAULT_VISIBLE_CLASS = \"ox-incremental-char--visible\";\nexport const DEFAULT_ATOM_CLASS = \"ox-incremental-atom\";\n\nexport const incrementalMarkdownDomStyles = `\n.${DEFAULT_COMMITTED_CLASS},\n.${DEFAULT_PENDING_CLASS} {\n display: contents;\n}\n\n.${DEFAULT_CHAR_CLASS},\n.${DEFAULT_ATOM_CLASS} {\n animation: ox-incremental-char-in var(--ox-incremental-duration, 170ms) ease-out both;\n animation-delay: var(--ox-incremental-delay, 0ms);\n}\n\n.${DEFAULT_VISIBLE_CLASS} {\n animation: none;\n opacity: 1;\n}\n\n@keyframes ox-incremental-char-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`.trim();\n\nexport function injectIncrementalMarkdownDomStyles(\n document: Document = globalThis.document,\n): HTMLStyleElement {\n const existing = document.querySelector<HTMLStyleElement>(\"style[data-ox-incremental-dom]\");\n if (existing) {\n return existing;\n }\n\n const style = document.createElement(\"style\");\n style.dataset.oxIncrementalDom = \"\";\n style.textContent = incrementalMarkdownDomStyles;\n document.head.append(style);\n return style;\n}\n","/// <reference lib=\"dom\" />\n\nimport {\n DEFAULT_ATOM_CLASS,\n DEFAULT_CHAR_CLASS,\n DEFAULT_VISIBLE_CLASS,\n} from \"./incremental-dom-styles\";\nimport type { IncrementalMarkdownDomAnimationOptions } from \"./incremental-dom-types\";\n\nexport interface ResolvedAnimationOptions {\n mode: \"none\" | \"character\";\n durationMs: number;\n staggerMs: number;\n committed: boolean;\n pending: boolean;\n charClassName: string;\n visibleClassName: string;\n atomClassName: string;\n}\n\nexport function resolveAnimationOptions(\n animation: boolean | IncrementalMarkdownDomAnimationOptions | undefined,\n): ResolvedAnimationOptions {\n if (!animation) {\n return {\n mode: \"none\",\n durationMs: 0,\n staggerMs: 0,\n committed: false,\n pending: false,\n charClassName: DEFAULT_CHAR_CLASS,\n visibleClassName: DEFAULT_VISIBLE_CLASS,\n atomClassName: DEFAULT_ATOM_CLASS,\n };\n }\n\n const options = animation === true ? {} : animation;\n return {\n mode: options.mode ?? \"character\",\n durationMs: options.durationMs ?? 170,\n staggerMs: options.staggerMs ?? 2,\n committed: options.committed ?? true,\n pending: options.pending ?? true,\n charClassName: options.charClassName ?? DEFAULT_CHAR_CLASS,\n visibleClassName: options.visibleClassName ?? DEFAULT_VISIBLE_CLASS,\n atomClassName: options.atomClassName ?? DEFAULT_ATOM_CLASS,\n };\n}\n\nexport function prepareCharacterFade(\n document: Document,\n root: ParentNode,\n animation: ResolvedAnimationOptions,\n visibleTextPrefix: number,\n): void {\n if (animation.mode === \"none\") {\n return;\n }\n\n const textNodes = collectTextNodes(document, root);\n let index = 0;\n let textOffset = 0;\n\n for (const textNode of textNodes) {\n const value = textNode.nodeValue ?? \"\";\n const parent = textNode.parentElement;\n const preserveWhitespace = Boolean(parent?.closest(\"pre, code\"));\n\n if (!value || (!preserveWhitespace && !value.trim())) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n for (const char of [...value]) {\n const span = document.createElement(\"span\");\n if (textOffset < visibleTextPrefix) {\n span.className = `${animation.charClassName} ${animation.visibleClassName}`;\n } else {\n span.className = animation.charClassName;\n span.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n span.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n span.textContent = char;\n fragment.append(span);\n textOffset += 1;\n }\n textNode.replaceWith(fragment);\n }\n\n for (const atom of root.querySelectorAll(\"input, img, hr, br, iframe, svg\")) {\n if (textOffset < visibleTextPrefix) {\n continue;\n }\n const element = atom as HTMLElement;\n atom.classList.add(animation.atomClassName);\n element.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n element.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n}\n\nfunction collectTextNodes(document: Document, root: ParentNode): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n return textNodes;\n}\n","/// <reference lib=\"dom\" />\n\nimport { prepareCharacterFade, resolveAnimationOptions } from \"./incremental-dom-animation\";\nimport { DEFAULT_COMMITTED_CLASS, DEFAULT_PENDING_CLASS } from \"./incremental-dom-styles\";\nimport type {\n IncrementalMarkdownDomApplyOptions,\n IncrementalMarkdownDomOptions,\n IncrementalMarkdownDomRenderer,\n IncrementalMarkdownRenderResultLike,\n} from \"./incremental-dom-types\";\n\nexport function createIncrementalMarkdownDomRenderer(\n options: IncrementalMarkdownDomOptions,\n): IncrementalMarkdownDomRenderer {\n const document = options.preview.ownerDocument;\n const animation = resolveAnimationOptions(options.animation);\n const committedRoot = document.createElement(\"div\");\n const pendingRoot = document.createElement(\"div\");\n const committedClassName = options.committedClassName ?? DEFAULT_COMMITTED_CLASS;\n const pendingClassName = options.pendingClassName ?? DEFAULT_PENDING_CLASS;\n let markdown = \"\";\n\n committedRoot.className = committedClassName;\n pendingRoot.className = pendingClassName;\n options.preview.replaceChildren(committedRoot, pendingRoot);\n\n function apply(\n result: IncrementalMarkdownRenderResultLike,\n applyOptions: IncrementalMarkdownDomApplyOptions = {},\n ): void {\n const previousPendingText = pendingRoot.textContent ?? \"\";\n\n if (applyOptions.chunk !== undefined && options.source) {\n markdown += applyOptions.chunk;\n options.source.textContent = markdown;\n }\n\n if (result.deltaHtml) {\n appendCommittedHtml(result.deltaHtml, previousPendingText);\n }\n\n setPendingHtml(result.pendingHtml);\n }\n\n function reset(): void {\n markdown = \"\";\n if (options.source) {\n options.source.textContent = \"\";\n }\n committedRoot.replaceChildren();\n pendingRoot.replaceChildren();\n }\n\n function appendCommittedHtml(html: string, previousPendingText: string): void {\n const fragment = parseHtml(html);\n const committedText = fragment.textContent ?? \"\";\n const visiblePrefix = commonPrefixLength(previousPendingText, committedText);\n prepareCharacterFade(\n document,\n fragment,\n animation,\n animation.committed ? visiblePrefix : Infinity,\n );\n committedRoot.append(fragment);\n }\n\n function setPendingHtml(html: string): void {\n const previousText = pendingRoot.textContent ?? \"\";\n const fragment = parseHtml(html);\n const nextText = fragment.textContent ?? \"\";\n const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;\n prepareCharacterFade(document, fragment, animation, visiblePrefix);\n pendingRoot.replaceChildren(fragment);\n }\n\n function parseHtml(html: string): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n }\n\n return { committedRoot, pendingRoot, apply, reset };\n}\n\nfunction commonPrefixLength(left: string, right: string): number {\n const max = Math.min(left.length, right.length);\n let index = 0;\n\n while (index < max && left[index] === right[index]) {\n index += 1;\n }\n\n return index;\n}\n"],"mappings":";;;AAEA,MAAa,0BAA0B;AACvC,MAAa,wBAAwB;AACrC,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,qBAAqB;AAElC,MAAa,+BAA+B;GACzC,wBAAwB;GACxB,sBAAsB;;;;GAItB,mBAAmB;GACnB,mBAAmB;;;;;GAKnB,sBAAsB;;;;;;;;;;;;;EAavB,KAAK;AAEP,SAAgB,mCACd,WAAqB,WAAW,UACd;CAClB,MAAM,WAAW,SAAS,cAAgC,gCAAgC;CAC1F,IAAI,UACF,OAAO;CAGT,MAAM,QAAQ,SAAS,cAAc,OAAO;CAC5C,MAAM,QAAQ,mBAAmB;CACjC,MAAM,cAAc;CACpB,SAAS,KAAK,OAAO,KAAK;CAC1B,OAAO;AACT;;;AC5BA,SAAgB,wBACd,WAC0B;CAC1B,IAAI,CAAC,WACH,OAAO;EACL,MAAM;EACN,YAAY;EACZ,WAAW;EACX,WAAW;EACX,SAAS;EACT,eAAe;EACf,kBAAkB;EAClB,eAAe;CACjB;CAGF,MAAM,UAAU,cAAc,OAAO,CAAC,IAAI;CAC1C,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,YAAY,QAAQ,cAAc;EAClC,WAAW,QAAQ,aAAa;EAChC,WAAW,QAAQ,aAAa;EAChC,SAAS,QAAQ,WAAW;EAC5B,eAAe,QAAQ,iBAAA;EACvB,kBAAkB,QAAQ,oBAAA;EAC1B,eAAe,QAAQ,iBAAA;CACzB;AACF;AAEA,SAAgB,qBACd,UACA,MACA,WACA,mBACM;CACN,IAAI,UAAU,SAAS,QACrB;CAGF,MAAM,YAAY,iBAAiB,UAAU,IAAI;CACjD,IAAI,QAAQ;CACZ,IAAI,aAAa;CAEjB,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,QAAQ,SAAS,aAAa;EACpC,MAAM,SAAS,SAAS;EACxB,MAAM,qBAAqB,QAAQ,QAAQ,QAAQ,WAAW,CAAC;EAE/D,IAAI,CAAC,SAAU,CAAC,sBAAsB,CAAC,MAAM,KAAK,GAChD;EAGF,MAAM,WAAW,SAAS,uBAAuB;EACjD,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK,GAAG;GAC7B,MAAM,OAAO,SAAS,cAAc,MAAM;GAC1C,IAAI,aAAa,mBACf,KAAK,YAAY,GAAG,UAAU,cAAc,GAAG,UAAU;QACpD;IACL,KAAK,YAAY,UAAU;IAC3B,KAAK,MAAM,YAAY,0BAA0B,GAAG,QAAQ,UAAU,UAAU,GAAG;IACnF,KAAK,MAAM,YAAY,6BAA6B,GAAG,UAAU,WAAW,GAAG;IAC/E,SAAS;GACX;GACA,KAAK,cAAc;GACnB,SAAS,OAAO,IAAI;GACpB,cAAc;EAChB;EACA,SAAS,YAAY,QAAQ;CAC/B;CAEA,KAAK,MAAM,QAAQ,KAAK,iBAAiB,iCAAiC,GAAG;EAC3E,IAAI,aAAa,mBACf;EAEF,MAAM,UAAU;EAChB,KAAK,UAAU,IAAI,UAAU,aAAa;EAC1C,QAAQ,MAAM,YAAY,0BAA0B,GAAG,QAAQ,UAAU,UAAU,GAAG;EACtF,QAAQ,MAAM,YAAY,6BAA6B,GAAG,UAAU,WAAW,GAAG;EAClF,SAAS;CACX;AACF;AAEA,SAAS,iBAAiB,UAAoB,MAA0B;CACtE,MAAM,YAAoB,CAAC;CAC3B,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,SAAS;CAEnE,OAAO,OAAO,SAAS,GACrB,UAAU,KAAK,OAAO,WAAmB;CAG3C,OAAO;AACT;;;ACpGA,SAAgB,qCACd,SACgC;CAChC,MAAM,WAAW,QAAQ,QAAQ;CACjC,MAAM,YAAY,wBAAwB,QAAQ,SAAS;CAC3D,MAAM,gBAAgB,SAAS,cAAc,KAAK;CAClD,MAAM,cAAc,SAAS,cAAc,KAAK;CAChD,MAAM,qBAAqB,QAAQ,sBAAA;CACnC,MAAM,mBAAmB,QAAQ,oBAAA;CACjC,IAAI,WAAW;CAEf,cAAc,YAAY;CAC1B,YAAY,YAAY;CACxB,QAAQ,QAAQ,gBAAgB,eAAe,WAAW;CAE1D,SAAS,MACP,QACA,eAAmD,CAAC,GAC9C;EACN,MAAM,sBAAsB,YAAY,eAAe;EAEvD,IAAI,aAAa,UAAU,KAAA,KAAa,QAAQ,QAAQ;GACtD,YAAY,aAAa;GACzB,QAAQ,OAAO,cAAc;EAC/B;EAEA,IAAI,OAAO,WACT,oBAAoB,OAAO,WAAW,mBAAmB;EAG3D,eAAe,OAAO,WAAW;CACnC;CAEA,SAAS,QAAc;EACrB,WAAW;EACX,IAAI,QAAQ,QACV,QAAQ,OAAO,cAAc;EAE/B,cAAc,gBAAgB;EAC9B,YAAY,gBAAgB;CAC9B;CAEA,SAAS,oBAAoB,MAAc,qBAAmC;EAC5E,MAAM,WAAW,UAAU,IAAI;EAE/B,MAAM,gBAAgB,mBAAmB,qBADnB,SAAS,eAAe,EAC6B;EAC3E,qBACE,UACA,UACA,WACA,UAAU,YAAY,gBAAgB,QACxC;EACA,cAAc,OAAO,QAAQ;CAC/B;CAEA,SAAS,eAAe,MAAoB;EAC1C,MAAM,eAAe,YAAY,eAAe;EAChD,MAAM,WAAW,UAAU,IAAI;EAC/B,MAAM,WAAW,SAAS,eAAe;EACzC,MAAM,gBAAgB,UAAU,UAAU,mBAAmB,cAAc,QAAQ,IAAI;EACvF,qBAAqB,UAAU,UAAU,WAAW,aAAa;EACjE,YAAY,gBAAgB,QAAQ;CACtC;CAEA,SAAS,UAAU,MAAgC;EACjD,MAAM,WAAW,SAAS,cAAc,UAAU;EAClD,SAAS,YAAY;EACrB,OAAO,SAAS;CAClB;CAEA,OAAO;EAAE;EAAe;EAAa;EAAO;CAAM;AACpD;AAEA,SAAS,mBAAmB,MAAc,OAAuB;CAC/D,MAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;CAC9C,IAAI,QAAQ;CAEZ,OAAO,QAAQ,OAAO,KAAK,WAAW,MAAM,QAC1C,SAAS;CAGX,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-dom.d.cts","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-types.ts","../src/incremental-dom-renderer.ts"],"mappings":";cAEa
|
|
1
|
+
{"version":3,"file":"incremental-dom.d.cts","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-types.ts","../src/incremental-dom-renderer.ts"],"mappings":";cAEa;cACA;cACA;cACA;cACA;cAEA;iBA2BG,mCACd,WAAU,WACT;;;UCnCc;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;;;;;EAKf;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;UAGe;;EAEf,SAAS;;EAET,SAAS;;;;;EAKT,sBAAsB;;;;;EAKtB;;;;;EAKA;;UAGe;;EAEf;;UAGe;WACN,eAAe;WACf,aAAa;EACtB,MACE,QAAQ,qCACR,UAAU;EAEZ;;;;iBCjFc,qCACd,SAAS,gCACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-dom.d.mts","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-types.ts","../src/incremental-dom-renderer.ts"],"mappings":";cAEa
|
|
1
|
+
{"version":3,"file":"incremental-dom.d.mts","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-types.ts","../src/incremental-dom-renderer.ts"],"mappings":";cAEa;cACA;cACA;cACA;cACA;cAEA;iBA2BG,mCACd,WAAU,WACT;;;UCnCc;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;;;;;EAKf;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;UAGe;;EAEf,SAAS;;EAET,SAAS;;;;;EAKT,sBAAsB;;;;;EAKtB;;;;;EAKA;;UAGe;;EAEf;;UAGe;WACN,eAAe;WACf,aAAa;EACtB,MACE,QAAQ,qCACR,UAAU;EAEZ;;;;iBCjFc,qCACd,SAAS,gCACR"}
|
package/dist/incremental-dom.mjs
CHANGED
|
@@ -143,7 +143,8 @@ function createIncrementalMarkdownDomRenderer(options) {
|
|
|
143
143
|
const previousText = pendingRoot.textContent ?? "";
|
|
144
144
|
const fragment = parseHtml(html);
|
|
145
145
|
const nextText = fragment.textContent ?? "";
|
|
146
|
-
|
|
146
|
+
const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;
|
|
147
|
+
prepareCharacterFade(document, fragment, animation, visiblePrefix);
|
|
147
148
|
pendingRoot.replaceChildren(fragment);
|
|
148
149
|
}
|
|
149
150
|
function parseHtml(html) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-dom.mjs","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-animation.ts","../src/incremental-dom-renderer.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\n\nexport const DEFAULT_COMMITTED_CLASS = \"ox-incremental-committed\";\nexport const DEFAULT_PENDING_CLASS = \"ox-incremental-pending\";\nexport const DEFAULT_CHAR_CLASS = \"ox-incremental-char\";\nexport const DEFAULT_VISIBLE_CLASS = \"ox-incremental-char--visible\";\nexport const DEFAULT_ATOM_CLASS = \"ox-incremental-atom\";\n\nexport const incrementalMarkdownDomStyles = `\n.${DEFAULT_COMMITTED_CLASS},\n.${DEFAULT_PENDING_CLASS} {\n display: contents;\n}\n\n.${DEFAULT_CHAR_CLASS},\n.${DEFAULT_ATOM_CLASS} {\n animation: ox-incremental-char-in var(--ox-incremental-duration, 170ms) ease-out both;\n animation-delay: var(--ox-incremental-delay, 0ms);\n}\n\n.${DEFAULT_VISIBLE_CLASS} {\n animation: none;\n opacity: 1;\n}\n\n@keyframes ox-incremental-char-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`.trim();\n\nexport function injectIncrementalMarkdownDomStyles(\n document: Document = globalThis.document,\n): HTMLStyleElement {\n const existing = document.querySelector<HTMLStyleElement>(\"style[data-ox-incremental-dom]\");\n if (existing) {\n return existing;\n }\n\n const style = document.createElement(\"style\");\n style.dataset.oxIncrementalDom = \"\";\n style.textContent = incrementalMarkdownDomStyles;\n document.head.append(style);\n return style;\n}\n","/// <reference lib=\"dom\" />\n\nimport {\n DEFAULT_ATOM_CLASS,\n DEFAULT_CHAR_CLASS,\n DEFAULT_VISIBLE_CLASS,\n} from \"./incremental-dom-styles\";\nimport type { IncrementalMarkdownDomAnimationOptions } from \"./incremental-dom-types\";\n\nexport interface ResolvedAnimationOptions {\n mode: \"none\" | \"character\";\n durationMs: number;\n staggerMs: number;\n committed: boolean;\n pending: boolean;\n charClassName: string;\n visibleClassName: string;\n atomClassName: string;\n}\n\nexport function resolveAnimationOptions(\n animation: boolean | IncrementalMarkdownDomAnimationOptions | undefined,\n): ResolvedAnimationOptions {\n if (!animation) {\n return {\n mode: \"none\",\n durationMs: 0,\n staggerMs: 0,\n committed: false,\n pending: false,\n charClassName: DEFAULT_CHAR_CLASS,\n visibleClassName: DEFAULT_VISIBLE_CLASS,\n atomClassName: DEFAULT_ATOM_CLASS,\n };\n }\n\n const options = animation === true ? {} : animation;\n return {\n mode: options.mode ?? \"character\",\n durationMs: options.durationMs ?? 170,\n staggerMs: options.staggerMs ?? 2,\n committed: options.committed ?? true,\n pending: options.pending ?? true,\n charClassName: options.charClassName ?? DEFAULT_CHAR_CLASS,\n visibleClassName: options.visibleClassName ?? DEFAULT_VISIBLE_CLASS,\n atomClassName: options.atomClassName ?? DEFAULT_ATOM_CLASS,\n };\n}\n\nexport function prepareCharacterFade(\n document: Document,\n root: ParentNode,\n animation: ResolvedAnimationOptions,\n visibleTextPrefix: number,\n): void {\n if (animation.mode === \"none\") {\n return;\n }\n\n const textNodes = collectTextNodes(document, root);\n let index = 0;\n let textOffset = 0;\n\n for (const textNode of textNodes) {\n const value = textNode.nodeValue ?? \"\";\n const parent = textNode.parentElement;\n const preserveWhitespace = Boolean(parent?.closest(\"pre, code\"));\n\n if (!value || (!preserveWhitespace && !value.trim())) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n for (const char of [...value]) {\n const span = document.createElement(\"span\");\n if (textOffset < visibleTextPrefix) {\n span.className = `${animation.charClassName} ${animation.visibleClassName}`;\n } else {\n span.className = animation.charClassName;\n span.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n span.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n span.textContent = char;\n fragment.append(span);\n textOffset += 1;\n }\n textNode.replaceWith(fragment);\n }\n\n for (const atom of root.querySelectorAll(\"input, img, hr, br, iframe, svg\")) {\n if (textOffset < visibleTextPrefix) {\n continue;\n }\n const element = atom as HTMLElement;\n atom.classList.add(animation.atomClassName);\n element.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n element.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n}\n\nfunction collectTextNodes(document: Document, root: ParentNode): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n return textNodes;\n}\n","/// <reference lib=\"dom\" />\n\nimport { prepareCharacterFade, resolveAnimationOptions } from \"./incremental-dom-animation\";\nimport { DEFAULT_COMMITTED_CLASS, DEFAULT_PENDING_CLASS } from \"./incremental-dom-styles\";\nimport type {\n IncrementalMarkdownDomApplyOptions,\n IncrementalMarkdownDomOptions,\n IncrementalMarkdownDomRenderer,\n IncrementalMarkdownRenderResultLike,\n} from \"./incremental-dom-types\";\n\nexport function createIncrementalMarkdownDomRenderer(\n options: IncrementalMarkdownDomOptions,\n): IncrementalMarkdownDomRenderer {\n const document = options.preview.ownerDocument;\n const animation = resolveAnimationOptions(options.animation);\n const committedRoot = document.createElement(\"div\");\n const pendingRoot = document.createElement(\"div\");\n const committedClassName = options.committedClassName ?? DEFAULT_COMMITTED_CLASS;\n const pendingClassName = options.pendingClassName ?? DEFAULT_PENDING_CLASS;\n let markdown = \"\";\n\n committedRoot.className = committedClassName;\n pendingRoot.className = pendingClassName;\n options.preview.replaceChildren(committedRoot, pendingRoot);\n\n function apply(\n result: IncrementalMarkdownRenderResultLike,\n applyOptions: IncrementalMarkdownDomApplyOptions = {},\n ): void {\n const previousPendingText = pendingRoot.textContent ?? \"\";\n\n if (applyOptions.chunk !== undefined && options.source) {\n markdown += applyOptions.chunk;\n options.source.textContent = markdown;\n }\n\n if (result.deltaHtml) {\n appendCommittedHtml(result.deltaHtml, previousPendingText);\n }\n\n setPendingHtml(result.pendingHtml);\n }\n\n function reset(): void {\n markdown = \"\";\n if (options.source) {\n options.source.textContent = \"\";\n }\n committedRoot.replaceChildren();\n pendingRoot.replaceChildren();\n }\n\n function appendCommittedHtml(html: string, previousPendingText: string): void {\n const fragment = parseHtml(html);\n const committedText = fragment.textContent ?? \"\";\n const visiblePrefix = commonPrefixLength(previousPendingText, committedText);\n prepareCharacterFade(\n document,\n fragment,\n animation,\n animation.committed ? visiblePrefix : Infinity,\n );\n committedRoot.append(fragment);\n }\n\n function setPendingHtml(html: string): void {\n const previousText = pendingRoot.textContent ?? \"\";\n const fragment = parseHtml(html);\n const nextText = fragment.textContent ?? \"\";\n const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;\n prepareCharacterFade(document, fragment, animation, visiblePrefix);\n pendingRoot.replaceChildren(fragment);\n }\n\n function parseHtml(html: string): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n }\n\n return { committedRoot, pendingRoot, apply, reset };\n}\n\nfunction commonPrefixLength(left: string, right: string): number {\n const max = Math.min(left.length, right.length);\n let index = 0;\n\n while (index < max && left[index] === right[index]) {\n index += 1;\n }\n\n return index;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"incremental-dom.mjs","names":[],"sources":["../src/incremental-dom-styles.ts","../src/incremental-dom-animation.ts","../src/incremental-dom-renderer.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\n\nexport const DEFAULT_COMMITTED_CLASS = \"ox-incremental-committed\";\nexport const DEFAULT_PENDING_CLASS = \"ox-incremental-pending\";\nexport const DEFAULT_CHAR_CLASS = \"ox-incremental-char\";\nexport const DEFAULT_VISIBLE_CLASS = \"ox-incremental-char--visible\";\nexport const DEFAULT_ATOM_CLASS = \"ox-incremental-atom\";\n\nexport const incrementalMarkdownDomStyles = `\n.${DEFAULT_COMMITTED_CLASS},\n.${DEFAULT_PENDING_CLASS} {\n display: contents;\n}\n\n.${DEFAULT_CHAR_CLASS},\n.${DEFAULT_ATOM_CLASS} {\n animation: ox-incremental-char-in var(--ox-incremental-duration, 170ms) ease-out both;\n animation-delay: var(--ox-incremental-delay, 0ms);\n}\n\n.${DEFAULT_VISIBLE_CLASS} {\n animation: none;\n opacity: 1;\n}\n\n@keyframes ox-incremental-char-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`.trim();\n\nexport function injectIncrementalMarkdownDomStyles(\n document: Document = globalThis.document,\n): HTMLStyleElement {\n const existing = document.querySelector<HTMLStyleElement>(\"style[data-ox-incremental-dom]\");\n if (existing) {\n return existing;\n }\n\n const style = document.createElement(\"style\");\n style.dataset.oxIncrementalDom = \"\";\n style.textContent = incrementalMarkdownDomStyles;\n document.head.append(style);\n return style;\n}\n","/// <reference lib=\"dom\" />\n\nimport {\n DEFAULT_ATOM_CLASS,\n DEFAULT_CHAR_CLASS,\n DEFAULT_VISIBLE_CLASS,\n} from \"./incremental-dom-styles\";\nimport type { IncrementalMarkdownDomAnimationOptions } from \"./incremental-dom-types\";\n\nexport interface ResolvedAnimationOptions {\n mode: \"none\" | \"character\";\n durationMs: number;\n staggerMs: number;\n committed: boolean;\n pending: boolean;\n charClassName: string;\n visibleClassName: string;\n atomClassName: string;\n}\n\nexport function resolveAnimationOptions(\n animation: boolean | IncrementalMarkdownDomAnimationOptions | undefined,\n): ResolvedAnimationOptions {\n if (!animation) {\n return {\n mode: \"none\",\n durationMs: 0,\n staggerMs: 0,\n committed: false,\n pending: false,\n charClassName: DEFAULT_CHAR_CLASS,\n visibleClassName: DEFAULT_VISIBLE_CLASS,\n atomClassName: DEFAULT_ATOM_CLASS,\n };\n }\n\n const options = animation === true ? {} : animation;\n return {\n mode: options.mode ?? \"character\",\n durationMs: options.durationMs ?? 170,\n staggerMs: options.staggerMs ?? 2,\n committed: options.committed ?? true,\n pending: options.pending ?? true,\n charClassName: options.charClassName ?? DEFAULT_CHAR_CLASS,\n visibleClassName: options.visibleClassName ?? DEFAULT_VISIBLE_CLASS,\n atomClassName: options.atomClassName ?? DEFAULT_ATOM_CLASS,\n };\n}\n\nexport function prepareCharacterFade(\n document: Document,\n root: ParentNode,\n animation: ResolvedAnimationOptions,\n visibleTextPrefix: number,\n): void {\n if (animation.mode === \"none\") {\n return;\n }\n\n const textNodes = collectTextNodes(document, root);\n let index = 0;\n let textOffset = 0;\n\n for (const textNode of textNodes) {\n const value = textNode.nodeValue ?? \"\";\n const parent = textNode.parentElement;\n const preserveWhitespace = Boolean(parent?.closest(\"pre, code\"));\n\n if (!value || (!preserveWhitespace && !value.trim())) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n for (const char of [...value]) {\n const span = document.createElement(\"span\");\n if (textOffset < visibleTextPrefix) {\n span.className = `${animation.charClassName} ${animation.visibleClassName}`;\n } else {\n span.className = animation.charClassName;\n span.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n span.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n span.textContent = char;\n fragment.append(span);\n textOffset += 1;\n }\n textNode.replaceWith(fragment);\n }\n\n for (const atom of root.querySelectorAll(\"input, img, hr, br, iframe, svg\")) {\n if (textOffset < visibleTextPrefix) {\n continue;\n }\n const element = atom as HTMLElement;\n atom.classList.add(animation.atomClassName);\n element.style.setProperty(\"--ox-incremental-delay\", `${index * animation.staggerMs}ms`);\n element.style.setProperty(\"--ox-incremental-duration\", `${animation.durationMs}ms`);\n index += 1;\n }\n}\n\nfunction collectTextNodes(document: Document, root: ParentNode): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n return textNodes;\n}\n","/// <reference lib=\"dom\" />\n\nimport { prepareCharacterFade, resolveAnimationOptions } from \"./incremental-dom-animation\";\nimport { DEFAULT_COMMITTED_CLASS, DEFAULT_PENDING_CLASS } from \"./incremental-dom-styles\";\nimport type {\n IncrementalMarkdownDomApplyOptions,\n IncrementalMarkdownDomOptions,\n IncrementalMarkdownDomRenderer,\n IncrementalMarkdownRenderResultLike,\n} from \"./incremental-dom-types\";\n\nexport function createIncrementalMarkdownDomRenderer(\n options: IncrementalMarkdownDomOptions,\n): IncrementalMarkdownDomRenderer {\n const document = options.preview.ownerDocument;\n const animation = resolveAnimationOptions(options.animation);\n const committedRoot = document.createElement(\"div\");\n const pendingRoot = document.createElement(\"div\");\n const committedClassName = options.committedClassName ?? DEFAULT_COMMITTED_CLASS;\n const pendingClassName = options.pendingClassName ?? DEFAULT_PENDING_CLASS;\n let markdown = \"\";\n\n committedRoot.className = committedClassName;\n pendingRoot.className = pendingClassName;\n options.preview.replaceChildren(committedRoot, pendingRoot);\n\n function apply(\n result: IncrementalMarkdownRenderResultLike,\n applyOptions: IncrementalMarkdownDomApplyOptions = {},\n ): void {\n const previousPendingText = pendingRoot.textContent ?? \"\";\n\n if (applyOptions.chunk !== undefined && options.source) {\n markdown += applyOptions.chunk;\n options.source.textContent = markdown;\n }\n\n if (result.deltaHtml) {\n appendCommittedHtml(result.deltaHtml, previousPendingText);\n }\n\n setPendingHtml(result.pendingHtml);\n }\n\n function reset(): void {\n markdown = \"\";\n if (options.source) {\n options.source.textContent = \"\";\n }\n committedRoot.replaceChildren();\n pendingRoot.replaceChildren();\n }\n\n function appendCommittedHtml(html: string, previousPendingText: string): void {\n const fragment = parseHtml(html);\n const committedText = fragment.textContent ?? \"\";\n const visiblePrefix = commonPrefixLength(previousPendingText, committedText);\n prepareCharacterFade(\n document,\n fragment,\n animation,\n animation.committed ? visiblePrefix : Infinity,\n );\n committedRoot.append(fragment);\n }\n\n function setPendingHtml(html: string): void {\n const previousText = pendingRoot.textContent ?? \"\";\n const fragment = parseHtml(html);\n const nextText = fragment.textContent ?? \"\";\n const visiblePrefix = animation.pending ? commonPrefixLength(previousText, nextText) : Infinity;\n prepareCharacterFade(document, fragment, animation, visiblePrefix);\n pendingRoot.replaceChildren(fragment);\n }\n\n function parseHtml(html: string): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n }\n\n return { committedRoot, pendingRoot, apply, reset };\n}\n\nfunction commonPrefixLength(left: string, right: string): number {\n const max = Math.min(left.length, right.length);\n let index = 0;\n\n while (index < max && left[index] === right[index]) {\n index += 1;\n }\n\n return index;\n}\n"],"mappings":"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"}
|