@incremark/vue 0.0.5 → 0.1.2

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/index.css CHANGED
@@ -48,6 +48,17 @@
48
48
  monospace;
49
49
  font-size: 0.9em;
50
50
  }
51
+ .incremark-fade-in {
52
+ animation: incremark-fade-in 0.4s ease-out;
53
+ }
54
+ @keyframes incremark-fade-in {
55
+ from {
56
+ opacity: 0;
57
+ }
58
+ to {
59
+ opacity: 1;
60
+ }
61
+ }
51
62
 
52
63
  /* sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0 */
53
64
  .incremark-heading[data-v-56c8779f] {
@@ -1 +1 @@
1
- {"version":3,"sources":["sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=style&index=0"],"sourcesContent":["\n.incremark-math-inline[data-v-6146c361] {\n display: inline;\n}\n.incremark-math-block[data-v-6146c361] {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n.math-source[data-v-6146c361] {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n.math-source-block[data-v-6146c361] {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n.math-source-block code[data-v-6146c361] {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n.math-rendered[data-v-6146c361] .katex {\n font-size: 1.1em;\n}\n.math-rendered[data-v-6146c361] .katex-display {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n","\n.incremark-inline-code {\n padding: 0.2em 0.4em;\n background: rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n font-family: 'Fira Code', 'SF Mono', Consolas, monospace;\n font-size: 0.9em;\n}\n","\n.incremark-heading[data-v-56c8779f] {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\nh1[data-v-56c8779f] { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em;\n}\nh2[data-v-56c8779f] { font-size: 1.5em;\n}\nh3[data-v-56c8779f] { font-size: 1.25em;\n}\nh4[data-v-56c8779f] { font-size: 1em;\n}\nh5[data-v-56c8779f] { font-size: 0.875em;\n}\nh6[data-v-56c8779f] { font-size: 0.85em; color: #666;\n}\n","\n.incremark-paragraph[data-v-6fa83031] {\n margin: 0.75em 0;\n line-height: 1.6;\n}\n","\n/* Mermaid 样式 */\n.incremark-mermaid[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n.mermaid-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #16213e;\n border-bottom: 1px solid #0f3460;\n font-size: 12px;\n}\n.mermaid-actions[data-v-c48b1022] {\n display: flex;\n gap: 8px;\n}\n.view-toggle[data-v-c48b1022] {\n padding: 4px 10px;\n border: 1px solid #0f3460;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.view-toggle[data-v-c48b1022]:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n.view-toggle[data-v-c48b1022]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.mermaid-content[data-v-c48b1022] {\n padding: 16px;\n min-height: 100px;\n}\n.mermaid-loading[data-v-c48b1022] {\n color: #8b949e;\n font-size: 14px;\n}\n.mermaid-source-code[data-v-c48b1022] {\n margin: 0;\n padding: 12px;\n background: #0d1117;\n border-radius: 6px;\n color: #c9d1d9;\n font-family: 'Fira Code', 'SF Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] {\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] svg {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n.code-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #1f2428;\n border-bottom: 1px solid #30363d;\n font-size: 12px;\n}\n.language[data-v-c48b1022] {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n.copy-btn[data-v-c48b1022] {\n padding: 4px 12px;\n border: 1px solid #30363d;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.copy-btn[data-v-c48b1022]:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n.code-content[data-v-c48b1022] {\n overflow-x: auto;\n}\n.code-loading[data-v-c48b1022] {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper[data-v-c48b1022] pre {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n.shiki-wrapper[data-v-c48b1022] code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n}\n\n/* 回退样式 */\n.code-fallback[data-v-c48b1022],\n.code-loading pre[data-v-c48b1022] {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n.code-fallback code[data-v-c48b1022],\n.code-loading code[data-v-c48b1022] {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n","\n.incremark-list[data-v-0778ccea] {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n.incremark-list.task-list[data-v-0778ccea] {\n list-style: none;\n padding-left: 0;\n}\n.incremark-list-item[data-v-0778ccea] {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n.task-item[data-v-0778ccea] {\n list-style: none;\n}\n.task-label[data-v-0778ccea] {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n.checkbox[data-v-0778ccea] {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n.task-content[data-v-0778ccea] {\n flex: 1;\n}\n","\n.incremark-table-wrapper[data-v-7aea7ba6] {\n overflow-x: auto;\n margin: 1em 0;\n}\n.incremark-table[data-v-7aea7ba6] {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n.incremark-table th[data-v-7aea7ba6],\n.incremark-table td[data-v-7aea7ba6] {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n.incremark-table th[data-v-7aea7ba6] {\n background: #f8f9fa;\n font-weight: 600;\n}\n.incremark-table tr[data-v-7aea7ba6]:nth-child(even) {\n background: #fafafa;\n}\n.incremark-table tr[data-v-7aea7ba6]:hover {\n background: #f0f0f0;\n}\n","\n.incremark-blockquote[data-v-67363f13] {\n margin: 1em 0;\n padding: 0.5em 1em;\n border-left: 4px solid #3b82f6;\n background: #f0f7ff;\n border-radius: 0 4px 4px 0;\n}\n.incremark-blockquote[data-v-67363f13] p {\n margin: 0.5em 0;\n}\n.incremark-blockquote[data-v-67363f13] p:first-child {\n margin-top: 0;\n}\n.incremark-blockquote[data-v-67363f13] p:last-child {\n margin-bottom: 0;\n}\n","\n.incremark-hr[data-v-cb316429] {\n margin: 2em 0;\n border: none;\n border-top: 2px solid #e5e5e5;\n}\n","\n.incremark-default[data-v-5542d517] {\n margin: 0.5em 0;\n padding: 10px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n font-size: 12px;\n}\n.type-badge[data-v-5542d517] {\n display: inline-block;\n padding: 2px 8px;\n background: #ffc107;\n border-radius: 4px;\n font-weight: 600;\n margin-bottom: 8px;\n}\npre[data-v-5542d517] {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-size: 11px;\n}\n","\n.incremark-block.incremark-show-status.incremark-pending[data-v-5966b843] {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n.incremark-fade-enter-active[data-v-5966b843] {\n transition: opacity 0.2s ease-out;\n}\n.incremark-fade-enter-from[data-v-5966b843] {\n opacity: 0;\n}\n","\n.auto-scroll-container[data-v-e0d180b8] {\n overflow-y: auto;\n height: 100%;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=style&index=0"],"sourcesContent":["\n.incremark-math-inline[data-v-6146c361] {\n display: inline;\n}\n.incremark-math-block[data-v-6146c361] {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n.math-source[data-v-6146c361] {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n.math-source-block[data-v-6146c361] {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n.math-source-block code[data-v-6146c361] {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n.math-rendered[data-v-6146c361] .katex {\n font-size: 1.1em;\n}\n.math-rendered[data-v-6146c361] .katex-display {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n","\n.incremark-inline-code {\n padding: 0.2em 0.4em;\n background: rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n font-family: 'Fira Code', 'SF Mono', Consolas, monospace;\n font-size: 0.9em;\n}\n\n/* 渐入动画 */\n.incremark-fade-in {\n animation: incremark-fade-in 0.4s ease-out;\n}\n@keyframes incremark-fade-in {\nfrom { \n opacity: 0;\n}\nto { \n opacity: 1;\n}\n}\n","\n.incremark-heading[data-v-56c8779f] {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\nh1[data-v-56c8779f] { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em;\n}\nh2[data-v-56c8779f] { font-size: 1.5em;\n}\nh3[data-v-56c8779f] { font-size: 1.25em;\n}\nh4[data-v-56c8779f] { font-size: 1em;\n}\nh5[data-v-56c8779f] { font-size: 0.875em;\n}\nh6[data-v-56c8779f] { font-size: 0.85em; color: #666;\n}\n","\n.incremark-paragraph[data-v-6fa83031] {\n margin: 0.75em 0;\n line-height: 1.6;\n}\n","\n/* Mermaid 样式 */\n.incremark-mermaid[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n.mermaid-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #16213e;\n border-bottom: 1px solid #0f3460;\n font-size: 12px;\n}\n.mermaid-actions[data-v-c48b1022] {\n display: flex;\n gap: 8px;\n}\n.view-toggle[data-v-c48b1022] {\n padding: 4px 10px;\n border: 1px solid #0f3460;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.view-toggle[data-v-c48b1022]:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n.view-toggle[data-v-c48b1022]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.mermaid-content[data-v-c48b1022] {\n padding: 16px;\n min-height: 100px;\n}\n.mermaid-loading[data-v-c48b1022] {\n color: #8b949e;\n font-size: 14px;\n}\n.mermaid-source-code[data-v-c48b1022] {\n margin: 0;\n padding: 12px;\n background: #0d1117;\n border-radius: 6px;\n color: #c9d1d9;\n font-family: 'Fira Code', 'SF Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] {\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] svg {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n.code-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #1f2428;\n border-bottom: 1px solid #30363d;\n font-size: 12px;\n}\n.language[data-v-c48b1022] {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n.copy-btn[data-v-c48b1022] {\n padding: 4px 12px;\n border: 1px solid #30363d;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.copy-btn[data-v-c48b1022]:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n.code-content[data-v-c48b1022] {\n overflow-x: auto;\n}\n.code-loading[data-v-c48b1022] {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper[data-v-c48b1022] pre {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n.shiki-wrapper[data-v-c48b1022] code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n}\n\n/* 回退样式 */\n.code-fallback[data-v-c48b1022],\n.code-loading pre[data-v-c48b1022] {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n.code-fallback code[data-v-c48b1022],\n.code-loading code[data-v-c48b1022] {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n","\n.incremark-list[data-v-0778ccea] {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n.incremark-list.task-list[data-v-0778ccea] {\n list-style: none;\n padding-left: 0;\n}\n.incremark-list-item[data-v-0778ccea] {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n.task-item[data-v-0778ccea] {\n list-style: none;\n}\n.task-label[data-v-0778ccea] {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n.checkbox[data-v-0778ccea] {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n.task-content[data-v-0778ccea] {\n flex: 1;\n}\n","\n.incremark-table-wrapper[data-v-7aea7ba6] {\n overflow-x: auto;\n margin: 1em 0;\n}\n.incremark-table[data-v-7aea7ba6] {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n.incremark-table th[data-v-7aea7ba6],\n.incremark-table td[data-v-7aea7ba6] {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n.incremark-table th[data-v-7aea7ba6] {\n background: #f8f9fa;\n font-weight: 600;\n}\n.incremark-table tr[data-v-7aea7ba6]:nth-child(even) {\n background: #fafafa;\n}\n.incremark-table tr[data-v-7aea7ba6]:hover {\n background: #f0f0f0;\n}\n","\n.incremark-blockquote[data-v-67363f13] {\n margin: 1em 0;\n padding: 0.5em 1em;\n border-left: 4px solid #3b82f6;\n background: #f0f7ff;\n border-radius: 0 4px 4px 0;\n}\n.incremark-blockquote[data-v-67363f13] p {\n margin: 0.5em 0;\n}\n.incremark-blockquote[data-v-67363f13] p:first-child {\n margin-top: 0;\n}\n.incremark-blockquote[data-v-67363f13] p:last-child {\n margin-bottom: 0;\n}\n","\n.incremark-hr[data-v-cb316429] {\n margin: 2em 0;\n border: none;\n border-top: 2px solid #e5e5e5;\n}\n","\n.incremark-default[data-v-5542d517] {\n margin: 0.5em 0;\n padding: 10px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n font-size: 12px;\n}\n.type-badge[data-v-5542d517] {\n display: inline-block;\n padding: 2px 8px;\n background: #ffc107;\n border-radius: 4px;\n font-weight: 600;\n margin-bottom: 8px;\n}\npre[data-v-5542d517] {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-size: 11px;\n}\n","\n.incremark-block.incremark-show-status.incremark-pending[data-v-5966b843] {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n.incremark-fade-enter-active[data-v-5966b843] {\n transition: opacity 0.2s ease-out;\n}\n.incremark-fade-enter-from[data-v-5966b843] {\n opacity: 0;\n}\n","\n.auto-scroll-container[data-v-e0d180b8] {\n overflow-y: auto;\n height: 100%;\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  // src/composables/useIncremark.ts
2
- import { ref, shallowRef, computed, markRaw } from "vue";
2
+ import { ref, shallowRef, computed, markRaw, watch, onUnmounted } from "vue";
3
3
  import {
4
- createIncremarkParser
4
+ createIncremarkParser,
5
+ createBlockTransformer,
6
+ defaultPlugins
5
7
  } from "@incremark/core";
6
8
  function useIncremark(options = {}) {
7
9
  const parser = createIncremarkParser(options);
@@ -9,6 +11,28 @@ function useIncremark(options = {}) {
9
11
  const pendingBlocks = shallowRef([]);
10
12
  const isLoading = ref(false);
11
13
  const markdown = ref("");
14
+ const typewriterEnabled = ref(options.typewriter?.enabled ?? !!options.typewriter);
15
+ const displayBlocksRef = shallowRef([]);
16
+ const isTypewriterProcessing = ref(false);
17
+ const isTypewriterPaused = ref(false);
18
+ const typewriterEffect = ref(options.typewriter?.effect ?? "none");
19
+ const typewriterCursor = ref(options.typewriter?.cursor ?? "|");
20
+ let transformer = null;
21
+ if (options.typewriter) {
22
+ const twOptions = options.typewriter;
23
+ transformer = createBlockTransformer({
24
+ charsPerTick: twOptions.charsPerTick ?? [1, 3],
25
+ tickInterval: twOptions.tickInterval ?? 30,
26
+ effect: twOptions.effect ?? "none",
27
+ pauseOnHidden: twOptions.pauseOnHidden ?? true,
28
+ plugins: twOptions.plugins ?? defaultPlugins,
29
+ onChange: (blocks2) => {
30
+ displayBlocksRef.value = blocks2;
31
+ isTypewriterProcessing.value = transformer?.isProcessing() ?? false;
32
+ isTypewriterPaused.value = transformer?.isPausedState() ?? false;
33
+ }
34
+ });
35
+ }
12
36
  const ast = computed(() => ({
13
37
  type: "root",
14
38
  children: [
@@ -16,7 +40,55 @@ function useIncremark(options = {}) {
16
40
  ...pendingBlocks.value.map((b) => b.node)
17
41
  ]
18
42
  }));
19
- const blocks = computed(() => {
43
+ const sourceBlocks = computed(() => {
44
+ return completedBlocks.value.map((block) => ({
45
+ id: block.id,
46
+ node: block.node,
47
+ status: block.status
48
+ }));
49
+ });
50
+ if (transformer) {
51
+ watch(
52
+ sourceBlocks,
53
+ (blocks2) => {
54
+ transformer.push(blocks2);
55
+ const currentDisplaying = displayBlocksRef.value.find((b) => !b.isDisplayComplete);
56
+ if (currentDisplaying) {
57
+ const updated = blocks2.find((b) => b.id === currentDisplaying.id);
58
+ if (updated) {
59
+ transformer.update(updated);
60
+ }
61
+ }
62
+ },
63
+ { immediate: true, deep: true }
64
+ );
65
+ }
66
+ function addCursorToNode(node, cursor) {
67
+ const cloned = JSON.parse(JSON.stringify(node));
68
+ function addToLast(n) {
69
+ if (n.children && n.children.length > 0) {
70
+ for (let i = n.children.length - 1; i >= 0; i--) {
71
+ if (addToLast(n.children[i])) {
72
+ return true;
73
+ }
74
+ }
75
+ n.children.push({ type: "text", value: cursor });
76
+ return true;
77
+ }
78
+ if (n.type === "text" && typeof n.value === "string") {
79
+ n.value += cursor;
80
+ return true;
81
+ }
82
+ if (typeof n.value === "string") {
83
+ n.value += cursor;
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ addToLast(cloned);
89
+ return cloned;
90
+ }
91
+ const rawBlocks = computed(() => {
20
92
  const result = [];
21
93
  for (const block of completedBlocks.value) {
22
94
  result.push({ ...block, stableId: block.id });
@@ -29,6 +101,29 @@ function useIncremark(options = {}) {
29
101
  }
30
102
  return result;
31
103
  });
104
+ const blocks = computed(() => {
105
+ if (!typewriterEnabled.value || !transformer) {
106
+ return rawBlocks.value;
107
+ }
108
+ return displayBlocksRef.value.map((db, index) => {
109
+ const isPending = !db.isDisplayComplete;
110
+ const isLastPending = isPending && index === displayBlocksRef.value.length - 1;
111
+ let node = db.displayNode;
112
+ if (typewriterEffect.value === "typing" && isLastPending) {
113
+ node = addCursorToNode(db.displayNode, typewriterCursor.value);
114
+ }
115
+ return {
116
+ id: db.id,
117
+ stableId: db.id,
118
+ status: db.isDisplayComplete ? "completed" : "pending",
119
+ isLastPending,
120
+ node,
121
+ startOffset: 0,
122
+ endOffset: 0,
123
+ rawText: ""
124
+ };
125
+ });
126
+ });
32
127
  function append(chunk) {
33
128
  isLoading.value = true;
34
129
  const update = parser.append(chunk);
@@ -64,6 +159,7 @@ function useIncremark(options = {}) {
64
159
  pendingBlocks.value = [];
65
160
  markdown.value = "";
66
161
  isLoading.value = false;
162
+ transformer?.reset();
67
163
  }
68
164
  function render14(content) {
69
165
  const update = parser.render(content);
@@ -73,6 +169,43 @@ function useIncremark(options = {}) {
73
169
  isLoading.value = false;
74
170
  return update;
75
171
  }
172
+ const typewriter = {
173
+ enabled: typewriterEnabled,
174
+ isProcessing: computed(() => isTypewriterProcessing.value),
175
+ isPaused: computed(() => isTypewriterPaused.value),
176
+ effect: computed(() => typewriterEffect.value),
177
+ skip: () => transformer?.skip(),
178
+ pause: () => {
179
+ transformer?.pause();
180
+ isTypewriterPaused.value = true;
181
+ },
182
+ resume: () => {
183
+ transformer?.resume();
184
+ isTypewriterPaused.value = false;
185
+ },
186
+ setOptions: (opts) => {
187
+ if (opts.enabled !== void 0) {
188
+ typewriterEnabled.value = opts.enabled;
189
+ }
190
+ if (opts.charsPerTick !== void 0 || opts.tickInterval !== void 0 || opts.effect !== void 0 || opts.pauseOnHidden !== void 0) {
191
+ transformer?.setOptions({
192
+ charsPerTick: opts.charsPerTick,
193
+ tickInterval: opts.tickInterval,
194
+ effect: opts.effect,
195
+ pauseOnHidden: opts.pauseOnHidden
196
+ });
197
+ }
198
+ if (opts.effect !== void 0) {
199
+ typewriterEffect.value = opts.effect;
200
+ }
201
+ if (opts.cursor !== void 0) {
202
+ typewriterCursor.value = opts.cursor;
203
+ }
204
+ }
205
+ };
206
+ onUnmounted(() => {
207
+ transformer?.destroy();
208
+ });
76
209
  return {
77
210
  /** 已收集的完整 Markdown 字符串 */
78
211
  markdown,
@@ -82,7 +215,7 @@ function useIncremark(options = {}) {
82
215
  pendingBlocks,
83
216
  /** 当前完整的 AST */
84
217
  ast,
85
- /** 所有块(完成 + 待处理),带稳定 ID */
218
+ /** 用于渲染的 blocks(根据打字机设置自动处理) */
86
219
  blocks,
87
220
  /** 是否正在加载 */
88
221
  isLoading,
@@ -92,12 +225,14 @@ function useIncremark(options = {}) {
92
225
  finalize,
93
226
  /** 强制中断 */
94
227
  abort,
95
- /** 重置解析器 */
228
+ /** 重置解析器和打字机 */
96
229
  reset,
97
230
  /** 一次性渲染(reset + append + finalize) */
98
231
  render: render14,
99
232
  /** 解析器实例 */
100
- parser
233
+ parser,
234
+ /** 打字机控制 */
235
+ typewriter
101
236
  };
102
237
  }
103
238
 
@@ -126,7 +261,7 @@ function useStreamRenderer(options) {
126
261
  }
127
262
 
128
263
  // src/composables/useDevTools.ts
129
- import { onMounted, onUnmounted } from "vue";
264
+ import { onMounted, onUnmounted as onUnmounted2 } from "vue";
130
265
  import { createDevTools } from "@incremark/devtools";
131
266
  function useDevTools(incremark, options = {}) {
132
267
  const devtools = createDevTools(options);
@@ -147,7 +282,7 @@ function useDevTools(incremark, options = {}) {
147
282
  onMounted(() => {
148
283
  devtools.mount();
149
284
  });
150
- onUnmounted(() => {
285
+ onUnmounted2(() => {
151
286
  devtools.unmount();
152
287
  incremark.parser.setOnChange(void 0);
153
288
  });
@@ -155,16 +290,16 @@ function useDevTools(incremark, options = {}) {
155
290
  }
156
291
 
157
292
  // src/composables/useBlockTransformer.ts
158
- import { ref as ref3, watch, computed as computed3, onUnmounted as onUnmounted2 } from "vue";
293
+ import { ref as ref3, watch as watch2, computed as computed3, onUnmounted as onUnmounted3 } from "vue";
159
294
  import {
160
- createBlockTransformer
295
+ createBlockTransformer as createBlockTransformer2
161
296
  } from "@incremark/core";
162
297
  function useBlockTransformer(sourceBlocks, options = {}) {
163
298
  const displayBlocksRef = ref3([]);
164
299
  const isProcessingRef = ref3(false);
165
300
  const isPausedRef = ref3(false);
166
301
  const effectRef = ref3(options.effect ?? "none");
167
- const transformer = createBlockTransformer({
302
+ const transformer = createBlockTransformer2({
168
303
  ...options,
169
304
  onChange: (blocks) => {
170
305
  displayBlocksRef.value = blocks;
@@ -172,7 +307,7 @@ function useBlockTransformer(sourceBlocks, options = {}) {
172
307
  isPausedRef.value = transformer.isPausedState();
173
308
  }
174
309
  });
175
- watch(
310
+ watch2(
176
311
  sourceBlocks,
177
312
  (blocks) => {
178
313
  transformer.push(blocks);
@@ -186,7 +321,7 @@ function useBlockTransformer(sourceBlocks, options = {}) {
186
321
  },
187
322
  { immediate: true, deep: true }
188
323
  );
189
- onUnmounted2(() => {
324
+ onUnmounted3(() => {
190
325
  transformer.destroy();
191
326
  });
192
327
  return {
@@ -227,7 +362,7 @@ import { defineComponent as _defineComponent2 } from "vue";
227
362
 
228
363
  // sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script
229
364
  import { defineComponent as _defineComponent } from "vue";
230
- import { computed as computed4, ref as ref4, watch as watch2, shallowRef as shallowRef2, onUnmounted as onUnmounted3 } from "vue";
365
+ import { computed as computed4, ref as ref4, watch as watch3, shallowRef as shallowRef2, onUnmounted as onUnmounted4 } from "vue";
231
366
  var IncremarkMath_default = /* @__PURE__ */ _defineComponent({
232
367
  __name: "IncremarkMath",
233
368
  props: {
@@ -278,12 +413,12 @@ var IncremarkMath_default = /* @__PURE__ */ _defineComponent({
278
413
  isLoading.value = false;
279
414
  }
280
415
  }
281
- onUnmounted3(() => {
416
+ onUnmounted4(() => {
282
417
  if (renderTimer) {
283
418
  clearTimeout(renderTimer);
284
419
  }
285
420
  });
286
- watch2(formula, scheduleRender, { immediate: true });
421
+ watch3(formula, scheduleRender, { immediate: true });
287
422
  const __returned__ = { props, renderedHtml, renderError, isLoading, katexRef, get renderTimer() {
288
423
  return renderTimer;
289
424
  }, set renderTimer(v) {
@@ -386,10 +521,28 @@ var IncremarkInline_default = /* @__PURE__ */ _defineComponent2({
386
521
  },
387
522
  setup(__props, { expose: __expose }) {
388
523
  __expose();
389
- function escapeHtml(str) {
390
- return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
524
+ function getStableText(node) {
525
+ if (!node.chunks || node.chunks.length === 0) {
526
+ return node.value;
527
+ }
528
+ return node.value.slice(0, node.stableLength ?? 0);
529
+ }
530
+ function hasChunks(node) {
531
+ return node.type === "text" && "chunks" in node && Array.isArray(node.chunks);
532
+ }
533
+ function getChunks(node) {
534
+ if (hasChunks(node)) {
535
+ return node.chunks;
536
+ }
537
+ return void 0;
538
+ }
539
+ function isHtmlNode(node) {
540
+ return node.type === "html";
391
541
  }
392
- const __returned__ = { escapeHtml, IncremarkMath: IncremarkMath_default2 };
542
+ function isInlineMath(node) {
543
+ return node.type === "inlineMath";
544
+ }
545
+ const __returned__ = { getStableText, hasChunks, getChunks, isHtmlNode, isInlineMath, IncremarkMath: IncremarkMath_default2 };
393
546
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
394
547
  return __returned__;
395
548
  }
@@ -411,20 +564,40 @@ function render2(_ctx, _cache, $props, $setup, $data, $options) {
411
564
  _Fragment2,
412
565
  { key: idx },
413
566
  [
414
- _createCommentVNode2(" \u6587\u672C "),
567
+ _createCommentVNode2(" \u6587\u672C\uFF08\u652F\u6301 chunks \u6E10\u5165\u52A8\u753B\uFF09 "),
415
568
  node.type === "text" ? (_openBlock2(), _createElementBlock2(
416
569
  _Fragment2,
417
570
  { key: 0 },
418
571
  [
572
+ _createCommentVNode2(" \u7A33\u5B9A\u6587\u672C\uFF08\u5DF2\u7ECF\u663E\u793A\u8FC7\u7684\u90E8\u5206\uFF0C\u65E0\u52A8\u753B\uFF09 "),
419
573
  _createTextVNode(
420
- _toDisplayString2(node.value),
574
+ " " + _toDisplayString2($setup.getStableText(node)) + " ",
421
575
  1
422
576
  /* TEXT */
423
- )
577
+ ),
578
+ _createCommentVNode2(" \u65B0\u589E\u7684 chunk \u90E8\u5206\uFF08\u5E26\u6E10\u5165\u52A8\u753B\uFF09 "),
579
+ (_openBlock2(true), _createElementBlock2(
580
+ _Fragment2,
581
+ null,
582
+ _renderList($setup.getChunks(node), (chunk) => {
583
+ return _openBlock2(), _createElementBlock2(
584
+ "span",
585
+ {
586
+ key: chunk.createdAt,
587
+ class: "incremark-fade-in"
588
+ },
589
+ _toDisplayString2(chunk.text),
590
+ 1
591
+ /* TEXT */
592
+ );
593
+ }),
594
+ 128
595
+ /* KEYED_FRAGMENT */
596
+ ))
424
597
  ],
425
598
  64
426
599
  /* STABLE_FRAGMENT */
427
- )) : node.type === "inlineMath" ? (_openBlock2(), _createElementBlock2(
600
+ )) : $setup.isInlineMath(node) ? (_openBlock2(), _createElementBlock2(
428
601
  _Fragment2,
429
602
  { key: 1 },
430
603
  [
@@ -534,11 +707,11 @@ function render2(_ctx, _cache, $props, $setup, $data, $options) {
534
707
  ],
535
708
  2112
536
709
  /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
537
- )) : node.type === "html" ? (_openBlock2(), _createElementBlock2(
710
+ )) : $setup.isHtmlNode(node) ? (_openBlock2(), _createElementBlock2(
538
711
  _Fragment2,
539
712
  { key: 9 },
540
713
  [
541
- _createCommentVNode2(" \u539F\u59CB HTML\uFF08\u7528\u4E8E fade-mask \u7B49\u7279\u6B8A\u5143\u7D20\uFF09 "),
714
+ _createCommentVNode2(" \u539F\u59CB HTML "),
542
715
  _createElementVNode2("span", {
543
716
  innerHTML: node.value
544
717
  }, null, 8, _hoisted_42)
@@ -631,7 +804,7 @@ var IncremarkParagraph_default2 = IncremarkParagraph_default;
631
804
 
632
805
  // sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script
633
806
  import { defineComponent as _defineComponent5 } from "vue";
634
- import { computed as computed6, ref as ref5, watch as watch3, shallowRef as shallowRef3, onUnmounted as onUnmounted4 } from "vue";
807
+ import { computed as computed6, ref as ref5, watch as watch4, shallowRef as shallowRef3, onUnmounted as onUnmounted5 } from "vue";
635
808
  var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
636
809
  __name: "IncremarkCode",
637
810
  props: {
@@ -696,7 +869,7 @@ var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
696
869
  mermaidLoading.value = false;
697
870
  }
698
871
  }
699
- onUnmounted4(() => {
872
+ onUnmounted5(() => {
700
873
  if (mermaidTimer) {
701
874
  clearTimeout(mermaidTimer);
702
875
  }
@@ -749,7 +922,7 @@ var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
749
922
  isHighlighting.value = false;
750
923
  }
751
924
  }
752
- watch3([code, () => props.theme, isMermaid], highlight, { immediate: true });
925
+ watch4([code, () => props.theme, isMermaid], highlight, { immediate: true });
753
926
  async function copyCode() {
754
927
  try {
755
928
  await navigator.clipboard.writeText(code.value);
@@ -1408,7 +1581,7 @@ var IncremarkRenderer_default2 = IncremarkRenderer_default;
1408
1581
 
1409
1582
  // sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=script
1410
1583
  import { defineComponent as _defineComponent13 } from "vue";
1411
- import { ref as ref6, onMounted as onMounted2, onUnmounted as onUnmounted5, nextTick } from "vue";
1584
+ import { ref as ref6, onMounted as onMounted2, onUnmounted as onUnmounted6, nextTick } from "vue";
1412
1585
  var AutoScrollContainer_default = /* @__PURE__ */ _defineComponent13({
1413
1586
  __name: "AutoScrollContainer",
1414
1587
  props: {
@@ -1487,7 +1660,7 @@ var AutoScrollContainer_default = /* @__PURE__ */ _defineComponent13({
1487
1660
  characterData: true
1488
1661
  });
1489
1662
  });
1490
- onUnmounted5(() => {
1663
+ onUnmounted6(() => {
1491
1664
  observer?.disconnect();
1492
1665
  });
1493
1666
  __expose({
@@ -1543,7 +1716,7 @@ var AutoScrollContainer_default2 = AutoScrollContainer_default;
1543
1716
  // src/index.ts
1544
1717
  import {
1545
1718
  BlockTransformer as BlockTransformer2,
1546
- createBlockTransformer as createBlockTransformer2,
1719
+ createBlockTransformer as createBlockTransformer3,
1547
1720
  countChars,
1548
1721
  sliceAst,
1549
1722
  cloneNode,
@@ -1552,7 +1725,7 @@ import {
1552
1725
  imagePlugin,
1553
1726
  mathPlugin,
1554
1727
  thematicBreakPlugin,
1555
- defaultPlugins,
1728
+ defaultPlugins as defaultPlugins2,
1556
1729
  allPlugins,
1557
1730
  createPlugin
1558
1731
  } from "@incremark/core";
@@ -1575,9 +1748,9 @@ export {
1575
1748
  cloneNode,
1576
1749
  codeBlockPlugin,
1577
1750
  countChars,
1578
- createBlockTransformer2 as createBlockTransformer,
1751
+ createBlockTransformer3 as createBlockTransformer,
1579
1752
  createPlugin,
1580
- defaultPlugins,
1753
+ defaultPlugins2 as defaultPlugins,
1581
1754
  imagePlugin,
1582
1755
  mathPlugin,
1583
1756
  mermaidPlugin,