@ox-content/vite-plugin 2.81.0 → 2.82.1

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.
Files changed (68) hide show
  1. package/dist/incremental-dom.cjs +3 -2
  2. package/dist/incremental-dom.cjs.map +1 -1
  3. package/dist/incremental-dom.d.cts.map +1 -1
  4. package/dist/incremental-dom.d.mts.map +1 -1
  5. package/dist/incremental-dom.mjs +2 -1
  6. package/dist/incremental-dom.mjs.map +1 -1
  7. package/dist/index.cjs +1486 -99
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +8 -13
  10. package/dist/index.d.cts.map +1 -1
  11. package/dist/index.d.mts +8 -13
  12. package/dist/index.d.mts.map +1 -1
  13. package/dist/index.mjs +1429 -69
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/interop.cjs.map +1 -1
  16. package/dist/interop.mjs.map +1 -1
  17. package/dist/tabs.cjs +3 -4
  18. package/dist/tabs.cjs.map +1 -1
  19. package/dist/tabs.mjs +99 -2
  20. package/dist/tabs.mjs.map +1 -0
  21. package/dist/vitepress-cli.cjs +5 -4
  22. package/dist/vitepress-cli.cjs.map +1 -1
  23. package/dist/vitepress-cli.d.cts +1 -1
  24. package/dist/vitepress-cli.d.mts +1 -1
  25. package/dist/vitepress-cli.mjs +4 -2
  26. package/dist/vitepress-cli.mjs.map +1 -1
  27. package/dist/vitepress.cjs +106 -2
  28. package/dist/vitepress.cjs.map +1 -1
  29. package/dist/vitepress.mjs +32 -2
  30. package/dist/vitepress.mjs.map +1 -1
  31. package/package.json +19 -19
  32. package/dist/chunk.cjs +0 -57
  33. package/dist/github.cjs +0 -690
  34. package/dist/github.cjs.map +0 -1
  35. package/dist/github.mjs +0 -625
  36. package/dist/github.mjs.map +0 -1
  37. package/dist/github2.mjs +0 -2
  38. package/dist/media.cjs +0 -310
  39. package/dist/media.cjs.map +0 -1
  40. package/dist/media.mjs +0 -302
  41. package/dist/media.mjs.map +0 -1
  42. package/dist/media2.mjs +0 -2
  43. package/dist/mermaid.cjs +0 -114
  44. package/dist/mermaid.cjs.map +0 -1
  45. package/dist/mermaid.mjs +0 -2
  46. package/dist/mermaid2.mjs +0 -92
  47. package/dist/mermaid2.mjs.map +0 -1
  48. package/dist/napi.cjs +0 -45
  49. package/dist/napi.cjs.map +0 -1
  50. package/dist/napi.mjs +0 -34
  51. package/dist/napi.mjs.map +0 -1
  52. package/dist/ogp.cjs +0 -341
  53. package/dist/ogp.cjs.map +0 -1
  54. package/dist/ogp.mjs +0 -2
  55. package/dist/ogp2.mjs +0 -302
  56. package/dist/ogp2.mjs.map +0 -1
  57. package/dist/pm.cjs +0 -45
  58. package/dist/pm.cjs.map +0 -1
  59. package/dist/pm.mjs +0 -2
  60. package/dist/pm2.mjs +0 -38
  61. package/dist/pm2.mjs.map +0 -1
  62. package/dist/tabs2.mjs +0 -56
  63. package/dist/tabs2.mjs.map +0 -1
  64. package/dist/youtube.cjs +0 -57
  65. package/dist/youtube.cjs.map +0 -1
  66. package/dist/youtube.mjs +0 -2
  67. package/dist/youtube2.mjs +0 -35
  68. package/dist/youtube2.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./chunk.cjs");
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
- prepareCharacterFade(document, fragment, animation, animation.pending ? commonPrefixLength(previousText, nextText) : Infinity);
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":"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"}
@@ -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,uBAAA;AAAA,cACA,qBAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cACA,kBAAA;AAAA,cAEA,4BAAA;AAAA,iBA2BG,kCAAA,CACd,QAAA,GAAU,QAAA,GACT,gBAAA;;;UCnCc,mCAAA;EACf,SAAA;EACA,aAAA;EACA,WAAA;EACA,IAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;EACA,SAAA;EACA,OAAA;EACA,MAAA;AAAA;AAAA,UAGe,sCAAA;;;;ADVjB;ECeE,IAAA;;;;ADdF;ECmBE,UAAA;;;;ADjBF;ECsBE,SAAA;;;;ADKF;ECAE,SAAA;;;;;EAKA,OAAA;EDHiB;;;;ECQjB,aAAA;EA3Ce;;;;EAgDf,gBAAA;EA9CA;;;;EAmDA,aAAA;AAAA;AAAA,UAGe,6BAAA;EA/Cf;EAiDA,OAAA,EAAS,OAAA;EAhDH;EAkDN,MAAA,GAAS,WAAA;EA/CM;;;;EAoDf,SAAA,aAAsB,sCAAA;EA1CtB;;;;EA+CA,kBAAA;EAtBA;;;;EA2BA,gBAAA;AAAA;AAAA,UAGe,kCAAA;EApBN;EAsBT,KAAA;AAAA;AAAA,UAGe,8BAAA;EAAA,SACN,aAAA,EAAe,WAAA;EAAA,SACf,WAAA,EAAa,WAAA;EACtB,KAAA,CACE,MAAA,EAAQ,mCAAA,EACR,OAAA,GAAU,kCAAA;EAEZ,KAAA;AAAA;;;iBCjFc,oCAAA,CACd,OAAA,EAAS,6BAAA,GACR,8BAAA"}
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,uBAAA;AAAA,cACA,qBAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cACA,kBAAA;AAAA,cAEA,4BAAA;AAAA,iBA2BG,kCAAA,CACd,QAAA,GAAU,QAAA,GACT,gBAAA;;;UCnCc,mCAAA;EACf,SAAA;EACA,aAAA;EACA,WAAA;EACA,IAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;EACA,SAAA;EACA,OAAA;EACA,MAAA;AAAA;AAAA,UAGe,sCAAA;;;;ADVjB;ECeE,IAAA;;;;ADdF;ECmBE,UAAA;;;;ADjBF;ECsBE,SAAA;;;;ADKF;ECAE,SAAA;;;;;EAKA,OAAA;EDHiB;;;;ECQjB,aAAA;EA3Ce;;;;EAgDf,gBAAA;EA9CA;;;;EAmDA,aAAA;AAAA;AAAA,UAGe,6BAAA;EA/Cf;EAiDA,OAAA,EAAS,OAAA;EAhDH;EAkDN,MAAA,GAAS,WAAA;EA/CM;;;;EAoDf,SAAA,aAAsB,sCAAA;EA1CtB;;;;EA+CA,kBAAA;EAtBA;;;;EA2BA,gBAAA;AAAA;AAAA,UAGe,kCAAA;EApBN;EAsBT,KAAA;AAAA;AAAA,UAGe,8BAAA;EAAA,SACN,aAAA,EAAe,WAAA;EAAA,SACf,WAAA,EAAa,WAAA;EACtB,KAAA,CACE,MAAA,EAAQ,mCAAA,EACR,OAAA,GAAU,kCAAA;EAEZ,KAAA;AAAA;;;iBCjFc,oCAAA,CACd,OAAA,EAAS,6BAAA,GACR,8BAAA"}
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"}
@@ -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
- prepareCharacterFade(document, fragment, animation, animation.pending ? commonPrefixLength(previousText, nextText) : Infinity);
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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"}