@incremark/vue 0.0.1 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +132 -0
- package/README.md +12 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/package.json +11 -4
- package/src/composables/useIncremark.ts +19 -0
package/README.en.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# @incremark/vue
|
|
2
|
+
|
|
3
|
+
Vue 3 integration for Incremark.
|
|
4
|
+
|
|
5
|
+
**[🇨🇳 中文](./README.md)** | 🇺🇸 English
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- 📦 **Out of the Box** - Provides `useIncremark` composable and `<Incremark>` component
|
|
10
|
+
- 🎨 **Customizable** - Support for custom render components
|
|
11
|
+
- ⚡ **High Performance** - Optimized with `shallowRef` and `markRaw`
|
|
12
|
+
- 🔧 **DevTools** - Built-in developer tools
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm add @incremark/core @incremark/vue
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
**1. Import Styles**
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import '@incremark/vue/style.css'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**2. Use in Your Component**
|
|
29
|
+
|
|
30
|
+
```vue
|
|
31
|
+
<script setup>
|
|
32
|
+
import { useIncremark, Incremark } from '@incremark/vue'
|
|
33
|
+
import '@incremark/vue/style.css'
|
|
34
|
+
|
|
35
|
+
const { blocks, append, finalize, reset } = useIncremark({ gfm: true })
|
|
36
|
+
|
|
37
|
+
async function handleStream(stream) {
|
|
38
|
+
reset()
|
|
39
|
+
for await (const chunk of stream) {
|
|
40
|
+
append(chunk)
|
|
41
|
+
}
|
|
42
|
+
finalize()
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<template>
|
|
47
|
+
<button @click="handleStream">Start</button>
|
|
48
|
+
<Incremark :blocks="blocks" />
|
|
49
|
+
</template>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## API
|
|
53
|
+
|
|
54
|
+
### useIncremark(options)
|
|
55
|
+
|
|
56
|
+
Core composable.
|
|
57
|
+
|
|
58
|
+
**Returns:**
|
|
59
|
+
|
|
60
|
+
| Property | Type | Description |
|
|
61
|
+
|----------|------|-------------|
|
|
62
|
+
| `markdown` | `Ref<string>` | Complete Markdown |
|
|
63
|
+
| `blocks` | `ComputedRef<Block[]>` | All blocks |
|
|
64
|
+
| `completedBlocks` | `ShallowRef<Block[]>` | Completed blocks |
|
|
65
|
+
| `pendingBlocks` | `ShallowRef<Block[]>` | Pending blocks |
|
|
66
|
+
| `append` | `Function` | Append content |
|
|
67
|
+
| `finalize` | `Function` | Complete parsing |
|
|
68
|
+
| `reset` | `Function` | Reset state |
|
|
69
|
+
| `render` | `Function` | Render once (reset + append + finalize) |
|
|
70
|
+
|
|
71
|
+
### useDevTools(incremark)
|
|
72
|
+
|
|
73
|
+
Enable DevTools.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
const incremark = useIncremark()
|
|
77
|
+
useDevTools(incremark)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### \<Incremark\>
|
|
81
|
+
|
|
82
|
+
Render component.
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<Incremark
|
|
86
|
+
:blocks="blocks"
|
|
87
|
+
:components="{ heading: MyHeading }"
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Custom Components
|
|
92
|
+
|
|
93
|
+
```vue
|
|
94
|
+
<script setup>
|
|
95
|
+
import { useIncremark, Incremark } from '@incremark/vue'
|
|
96
|
+
import MyCode from './MyCode.vue'
|
|
97
|
+
|
|
98
|
+
const { blocks } = useIncremark()
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<template>
|
|
102
|
+
<Incremark
|
|
103
|
+
:blocks="blocks"
|
|
104
|
+
:components="{ code: MyCode }"
|
|
105
|
+
/>
|
|
106
|
+
</template>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Math Formula Support
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pnpm add micromark-extension-math mdast-util-math katex
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```vue
|
|
116
|
+
<script setup>
|
|
117
|
+
import { useIncremark } from '@incremark/vue'
|
|
118
|
+
import { math } from 'micromark-extension-math'
|
|
119
|
+
import { mathFromMarkdown } from 'mdast-util-math'
|
|
120
|
+
import 'katex/dist/katex.min.css'
|
|
121
|
+
|
|
122
|
+
const { blocks } = useIncremark({
|
|
123
|
+
extensions: [math()],
|
|
124
|
+
mdastExtensions: [mathFromMarkdown()]
|
|
125
|
+
})
|
|
126
|
+
</script>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT
|
|
132
|
+
|
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Incremark 的 Vue 3 集成库。
|
|
4
4
|
|
|
5
|
+
🇨🇳 中文 | **[🇺🇸 English](./README.en.md)**
|
|
6
|
+
|
|
5
7
|
## 特性
|
|
6
8
|
|
|
7
9
|
- 📦 **开箱即用** - 提供 `useIncremark` composable 和 `<Incremark>` 组件
|
|
@@ -17,9 +19,18 @@ pnpm add @incremark/core @incremark/vue
|
|
|
17
19
|
|
|
18
20
|
## 快速开始
|
|
19
21
|
|
|
22
|
+
**1. 引入样式**
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import '@incremark/vue/style.css'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**2. 在组件中使用**
|
|
29
|
+
|
|
20
30
|
```vue
|
|
21
31
|
<script setup>
|
|
22
32
|
import { useIncremark, Incremark } from '@incremark/vue'
|
|
33
|
+
import '@incremark/vue/style.css'
|
|
23
34
|
|
|
24
35
|
const { blocks, append, finalize, reset } = useIncremark({ gfm: true })
|
|
25
36
|
|
|
@@ -55,6 +66,7 @@ async function handleStream(stream) {
|
|
|
55
66
|
| `append` | `Function` | 追加内容 |
|
|
56
67
|
| `finalize` | `Function` | 完成解析 |
|
|
57
68
|
| `reset` | `Function` | 重置状态 |
|
|
69
|
+
| `render` | `Function` | 一次性渲染(reset + append + finalize) |
|
|
58
70
|
|
|
59
71
|
### useDevTools(incremark)
|
|
60
72
|
|
package/dist/index.js
CHANGED
|
@@ -65,6 +65,14 @@ function useIncremark(options = {}) {
|
|
|
65
65
|
markdown.value = "";
|
|
66
66
|
isLoading.value = false;
|
|
67
67
|
}
|
|
68
|
+
function render13(content) {
|
|
69
|
+
const update = parser.render(content);
|
|
70
|
+
markdown.value = parser.getBuffer();
|
|
71
|
+
completedBlocks.value = parser.getCompletedBlocks().map((b) => markRaw(b));
|
|
72
|
+
pendingBlocks.value = [];
|
|
73
|
+
isLoading.value = false;
|
|
74
|
+
return update;
|
|
75
|
+
}
|
|
68
76
|
return {
|
|
69
77
|
/** 已收集的完整 Markdown 字符串 */
|
|
70
78
|
markdown,
|
|
@@ -86,6 +94,8 @@ function useIncremark(options = {}) {
|
|
|
86
94
|
abort,
|
|
87
95
|
/** 重置解析器 */
|
|
88
96
|
reset,
|
|
97
|
+
/** 一次性渲染(reset + append + finalize) */
|
|
98
|
+
render: render13,
|
|
89
99
|
/** 解析器实例 */
|
|
90
100
|
parser
|
|
91
101
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useStreamRenderer.ts","../src/composables/useDevTools.ts","src/components/Incremark.vue","src/components/IncremarkHeading.vue","src/components/IncremarkMath.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template","../src/components/IncremarkMath.vue","src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template","../src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template","../src/components/IncremarkHeading.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template","../src/components/IncremarkParagraph.vue","src/components/IncremarkCode.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template","../src/components/IncremarkCode.vue","src/components/IncremarkList.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template","../src/components/IncremarkList.vue","src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template","../src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template","../src/components/IncremarkBlockquote.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template","../src/components/IncremarkThematicBreak.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template","../src/components/IncremarkDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template","../src/components/Incremark.vue","src/components/IncremarkRenderer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template","../src/components/IncremarkRenderer.vue"],"sourcesContent":["import { ref, shallowRef, computed, markRaw } from 'vue'\nimport {\n IncremarkParser,\n createIncremarkParser,\n type ParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root\n} from '@incremark/core'\n\nexport interface UseIncremarkOptions extends ParserOptions {}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * Vue 3 Composable: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark } from '@incremark/vue'\n *\n * const { markdown, blocks, append, finalize } = useIncremark()\n *\n * // 处理 AI 流式输出\n * async function handleStream(stream) {\n * for await (const chunk of stream) {\n * append(chunk)\n * }\n * finalize()\n * }\n * </script>\n *\n * <template>\n * <div>已接收: {{ markdown.length }} 字符</div>\n * </template>\n * ```\n */\nexport function useIncremark(options: UseIncremarkOptions = {}) {\n const parser = createIncremarkParser(options)\n const completedBlocks = shallowRef<ParsedBlock[]>([])\n const pendingBlocks = shallowRef<ParsedBlock[]>([])\n const isLoading = ref(false)\n // 使用 ref 存储 markdown,确保响应式\n const markdown = ref('')\n\n const ast = computed<Root>(() => ({\n type: 'root',\n children: [\n ...completedBlocks.value.map((b) => b.node),\n ...pendingBlocks.value.map((b) => b.node)\n ]\n }))\n\n // 所有块,带稳定 ID(已完成块用真实 ID,待处理块用索引)\n const blocks = computed(() => {\n const result: Array<ParsedBlock & { stableId: string }> = []\n\n for (const block of completedBlocks.value) {\n result.push({ ...block, stableId: block.id })\n }\n\n for (let i = 0; i < pendingBlocks.value.length; i++) {\n result.push({\n ...pendingBlocks.value[i],\n stableId: `pending-${i}`\n })\n }\n\n return result\n })\n\n function append(chunk: string): IncrementalUpdate {\n isLoading.value = true\n const update = parser.append(chunk)\n\n // 更新 markdown ref\n markdown.value = parser.getBuffer()\n\n // 使用 markRaw 避免深层响应式\n if (update.completed.length > 0) {\n completedBlocks.value = [\n ...completedBlocks.value,\n ...update.completed.map((b) => markRaw(b))\n ]\n }\n pendingBlocks.value = update.pending.map((b) => markRaw(b))\n\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n\n // 更新 markdown ref\n markdown.value = parser.getBuffer()\n\n if (update.completed.length > 0) {\n completedBlocks.value = [\n ...completedBlocks.value,\n ...update.completed.map((b) => markRaw(b))\n ]\n }\n pendingBlocks.value = []\n isLoading.value = false\n\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n }\n\n return {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 所有块(完成 + 待处理),带稳定 ID */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器 */\n reset,\n /** 解析器实例 */\n parser\n }\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface BlockWithStableId extends ParsedBlock {\n /** 稳定的渲染 ID(用于 Vue key) */\n stableId: string\n}\n\nexport interface UseStreamRendererOptions {\n /** 已完成的块 */\n completedBlocks: Ref<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseStreamRendererReturn {\n /** 带稳定 ID 的已完成块 */\n stableCompletedBlocks: ComputedRef<BlockWithStableId[]>\n /** 带稳定 ID 的待处理块 */\n stablePendingBlocks: ComputedRef<BlockWithStableId[]>\n /** 所有带稳定 ID 的块 */\n allStableBlocks: ComputedRef<BlockWithStableId[]>\n}\n\n/**\n * Vue 3 Composable: 流式渲染辅助\n *\n * 为块分配稳定的渲染 ID,确保 Vue 的虚拟 DOM 复用\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions): UseStreamRendererReturn {\n const { completedBlocks, pendingBlocks } = options\n\n const stableCompletedBlocks = computed<BlockWithStableId[]>(() =>\n completedBlocks.value.map((block) => ({\n ...block,\n stableId: block.id\n }))\n )\n\n const stablePendingBlocks = computed<BlockWithStableId[]>(() =>\n pendingBlocks.value.map((block, index) => ({\n ...block,\n stableId: `pending-${index}`\n }))\n )\n\n const allStableBlocks = computed(() => [...stableCompletedBlocks.value, ...stablePendingBlocks.value])\n\n return {\n stableCompletedBlocks,\n stablePendingBlocks,\n allStableBlocks\n }\n}\n\n","import { onMounted, onUnmounted } from 'vue'\nimport { createDevTools, type DevToolsOptions } from '@incremark/devtools'\nimport type { UseIncremarkReturn } from './useIncremark'\n\nexport interface UseDevToolsOptions extends DevToolsOptions {}\n\n/**\n * Vue 3 DevTools 一行接入\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useDevTools } from '@incremark/vue'\n *\n * const incremark = useIncremark()\n * useDevTools(incremark) // 就这一行!\n * </script>\n * ```\n */\nexport function useDevTools(\n incremark: UseIncremarkReturn,\n options: UseDevToolsOptions = {}\n) {\n const devtools = createDevTools(options)\n\n // 设置 parser 的 onChange 回调\n incremark.parser.setOnChange((state) => {\n const blocks = [\n ...state.completedBlocks.map((b) => ({ ...b, stableId: b.id })),\n ...state.pendingBlocks.map((b, i) => ({ ...b, stableId: `pending-${i}` }))\n ]\n\n devtools.update({\n blocks,\n completedBlocks: state.completedBlocks,\n pendingBlocks: state.pendingBlocks,\n markdown: state.markdown,\n ast: state.ast,\n isLoading: state.pendingBlocks.length > 0\n })\n })\n\n onMounted(() => {\n devtools.mount()\n })\n\n onUnmounted(() => {\n devtools.unmount()\n // 清理回调\n incremark.parser.setOnChange(undefined)\n })\n\n return devtools\n}\n","<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\n\n// 组件映射类型\nexport type ComponentMap = Partial<Record<string, Component>>\n\n// 带稳定 ID 的块类型\nexport interface BlockWithStableId extends ParsedBlock {\n stableId: string\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks: BlockWithStableId[]\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n }>(),\n {\n components: () => ({}),\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }\n)\n\n// 默认组件映射\nconst defaultComponents: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath\n}\n\n// 合并用户组件和默认组件\nconst mergedComponents = computed(() => ({\n ...defaultComponents,\n ...props.components\n}))\n\nfunction getComponent(type: string): Component {\n return mergedComponents.value[type] || props.components?.default || IncremarkDefault\n}\n</script>\n\n<template>\n <div class=\"incremark\">\n <TransitionGroup name=\"incremark-fade\">\n <div\n v-for=\"block in blocks\"\n :key=\"block.stableId\"\n :class=\"[\n 'incremark-block',\n block.status === 'completed' ? completedClass : pendingClass,\n { 'incremark-show-status': showBlockStatus }\n ]\"\n >\n <component :is=\"getComponent(block.node.type)\" :node=\"block.node\" />\n </div>\n </TransitionGroup>\n </div>\n</template>\n\n<style scoped>\n.incremark-block.incremark-show-status.incremark-pending {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n\n.incremark-fade-enter-active {\n transition: opacity 0.2s ease-out;\n}\n\n.incremark-fade-enter-from {\n opacity: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Heading } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: Heading\n}>()\n\nconst tag = computed(() => `h${props.node.depth}`)\n</script>\n\n<template>\n <component :is=\"tag\" class=\"incremark-heading\">\n <IncremarkInline :nodes=\"node.children\" />\n </component>\n</template>\n\n<style scoped>\n.incremark-heading {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\n\nh1 { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.25em; }\nh4 { font-size: 1em; }\nh5 { font-size: 0.875em; }\nh6 { font-size: 0.85em; color: #666; }\n</style>\n\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\n// Math 节点类型(来自 mdast-util-math)\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nconst props = withDefaults(\n defineProps<{\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n }>(),\n {\n renderDelay: 300\n }\n)\n\nconst renderedHtml = ref('')\nconst renderError = ref('')\nconst isLoading = ref(false)\nconst katexRef = shallowRef<any>(null)\nlet renderTimer: ReturnType<typeof setTimeout> | null = null\n\nconst isInline = computed(() => props.node.type === 'inlineMath')\nconst formula = computed(() => props.node.value)\n\n// 带防抖动的渲染\nfunction scheduleRender() {\n if (!formula.value) {\n renderedHtml.value = ''\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n isLoading.value = true\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay)\n}\n\nasync function doRender() {\n if (!formula.value) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef.value) {\n // @ts-ignore - katex 是可选依赖\n const katexModule = await import('katex')\n katexRef.value = katexModule.default\n }\n\n const katex = katexRef.value\n renderedHtml.value = katex.renderToString(formula.value, {\n displayMode: !isInline.value,\n throwOnError: false,\n strict: false\n })\n renderError.value = ''\n } catch (e: any) {\n // 静默失败,可能是公式不完整\n renderError.value = ''\n renderedHtml.value = ''\n } finally {\n isLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n})\n\nwatch(formula, scheduleRender, { immediate: true })\n</script>\n\n<template>\n <!-- 行内公式 -->\n <span v-if=\"isInline\" class=\"incremark-math-inline\">\n <!-- 渲染成功 -->\n <span v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" />\n <!-- 加载中或未渲染:显示源码 -->\n <code v-else class=\"math-source\">{{ formula }}</code>\n </span>\n <!-- 块级公式 -->\n <div v-else class=\"incremark-math-block\">\n <!-- 渲染成功 -->\n <div v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" class=\"math-rendered\" />\n <!-- 加载中或未渲染:显示源码 -->\n <pre v-else class=\"math-source-block\"><code>{{ formula }}</code></pre>\n </div>\n</template>\n\n<style scoped>\n.incremark-math-inline {\n display: inline;\n}\n\n.incremark-math-block {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n\n.math-source {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n\n.math-source-block {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n\n.math-source-block code {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n\n.math-rendered :deep(.katex) {\n font-size: 1.1em;\n}\n\n.math-rendered :deep(.katex-display) {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-math-inline\"\n}\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = { class: \"math-source\" }\nconst _hoisted_4 = { class: \"incremark-math-block\" }\nconst _hoisted_5 = [\"innerHTML\"]\nconst _hoisted_6 = { class: \"math-source-block\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 行内公式 \"),\n ($setup.isInline)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n innerHTML: $setup.renderedHtml\n }, null, 8 /* PROPS */, _hoisted_2))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"code\", _hoisted_3, _toDisplayString($setup.formula), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 块级公式 \"),\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n innerHTML: $setup.renderedHtml,\n class: \"math-rendered\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_6, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.formula), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkMath.vue\";script.__scopeId = \"data-v-6146c361\";export default script;","<script setup lang=\"ts\">\nimport type { PhrasingContent } from 'mdast'\nimport IncremarkMath from './IncremarkMath.vue'\n\ndefineProps<{\n nodes: PhrasingContent[]\n}>()\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n</script>\n\n<template>\n <template v-for=\"(node, idx) in nodes\" :key=\"idx\">\n <!-- 文本 -->\n <template v-if=\"node.type === 'text'\">{{ node.value }}</template>\n\n <!-- 行内公式 -->\n <IncremarkMath v-else-if=\"(node as any).type === 'inlineMath'\" :node=\"node as any\" />\n\n <!-- 加粗 -->\n <strong v-else-if=\"node.type === 'strong'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </strong>\n\n <!-- 斜体 -->\n <em v-else-if=\"node.type === 'emphasis'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </em>\n\n <!-- 行内代码 -->\n <code v-else-if=\"node.type === 'inlineCode'\" class=\"incremark-inline-code\">{{ node.value }}</code>\n\n <!-- 链接 -->\n <a\n v-else-if=\"node.type === 'link'\"\n :href=\"node.url\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </a>\n\n <!-- 图片 -->\n <img\n v-else-if=\"node.type === 'image'\"\n :src=\"node.url\"\n :alt=\"node.alt || ''\"\n loading=\"lazy\"\n />\n\n <!-- 换行 -->\n <br v-else-if=\"node.type === 'break'\" />\n\n <!-- 删除线 -->\n <del v-else-if=\"node.type === 'delete'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </del>\n </template>\n</template>\n\n<style>\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</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, resolveComponent as _resolveComponent, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-inline-code\" }\nconst _hoisted_2 = [\"href\"]\nconst _hoisted_3 = [\"src\", \"alt\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkInline = _resolveComponent(\"IncremarkInline\", true)\n\n return (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.nodes, (node, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 文本 \"),\n (node.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(_toDisplayString(node.value), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n : ((node as any).type === 'inlineMath')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 行内公式 \"),\n _createVNode($setup[\"IncremarkMath\"], {\n node: node as any\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'strong')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 加粗 \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'emphasis')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 斜体 \"),\n _createElementVNode(\"em\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'inlineCode')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 行内代码 \"),\n _createElementVNode(\"code\", _hoisted_1, _toDisplayString(node.value), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'link')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createCommentVNode(\" 链接 \"),\n _createElementVNode(\"a\", {\n href: node.url,\n target: \"_blank\",\n rel: \"noopener\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_2)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'image')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n _createCommentVNode(\" 图片 \"),\n _createElementVNode(\"img\", {\n src: node.url,\n alt: node.alt || '',\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_3)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'break')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _createCommentVNode(\" 换行 \"),\n _cache[0] || (_cache[0] = _createElementVNode(\"br\", null, null, -1 /* CACHED */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'delete')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 8 }, [\n _createCommentVNode(\" 删除线 \"),\n _createElementVNode(\"del\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkInline.vue\";export default script;","import { createVNode as _createVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), { class: \"incremark-heading\" }, {\n default: _withCtx(() => [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]),\n _: 1 /* STABLE */\n }))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHeading.vue\";script.__scopeId = \"data-v-56c8779f\";export default script;","import { createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-paragraph\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"p\", _hoisted_1, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkParagraph.vue\";script.__scopeId = \"data-v-6fa83031\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n }>(),\n {\n theme: 'github-dark',\n disableHighlight: false,\n mermaidDelay: 500\n }\n)\n\nconst copied = ref(false)\nconst highlightedHtml = ref('')\nconst isHighlighting = ref(false)\nconst highlightError = ref(false)\n\n// Mermaid 支持\nconst mermaidSvg = ref('')\nconst mermaidError = ref('')\nconst mermaidLoading = ref(false)\nconst mermaidRef = shallowRef<any>(null)\nlet mermaidTimer: ReturnType<typeof setTimeout> | null = null\n// 视图模式:'preview' | 'source'\nconst mermaidViewMode = ref<'preview' | 'source'>('preview')\n\nfunction toggleMermaidView() {\n mermaidViewMode.value = mermaidViewMode.value === 'preview' ? 'source' : 'preview'\n}\n\nconst language = computed(() => props.node.lang || 'text')\nconst code = computed(() => props.node.value)\nconst isMermaid = computed(() => language.value === 'mermaid')\n\n// 缓存 highlighter\nconst highlighterRef = shallowRef<any>(null)\nconst loadedLanguages = new Set<string>()\nconst loadedThemes = new Set<string>()\n\n// Mermaid 渲染(带防抖动)\nfunction scheduleRenderMermaid() {\n if (!isMermaid.value || !code.value) return\n\n // 清除之前的定时器\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n\n // 显示加载状态\n mermaidLoading.value = true\n\n // 防抖动延迟渲染\n mermaidTimer = setTimeout(() => {\n doRenderMermaid()\n }, props.mermaidDelay)\n}\n\nasync function doRenderMermaid() {\n if (!code.value) return\n\n mermaidError.value = ''\n\n try {\n // 动态导入 mermaid\n if (!mermaidRef.value) {\n // @ts-ignore - mermaid 是可选依赖\n const mermaidModule = await import('mermaid')\n mermaidRef.value = mermaidModule.default\n mermaidRef.value.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose'\n })\n }\n\n const mermaid = mermaidRef.value\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n const { svg } = await mermaid.render(id, code.value)\n mermaidSvg.value = svg\n } catch (e: any) {\n // 不显示错误,可能是代码还不完整\n mermaidError.value = ''\n mermaidSvg.value = ''\n } finally {\n mermaidLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n})\n\n// 动态加载 shiki 并高亮\nasync function highlight() {\n if (isMermaid.value) {\n scheduleRenderMermaid()\n return\n }\n\n if (!code.value || props.disableHighlight) {\n highlightedHtml.value = ''\n return\n }\n\n isHighlighting.value = true\n highlightError.value = false\n\n try {\n // 动态导入 shiki\n if (!highlighterRef.value) {\n const { createHighlighter } = await import('shiki')\n highlighterRef.value = await createHighlighter({\n themes: [props.theme as any],\n langs: []\n })\n loadedThemes.add(props.theme)\n }\n\n const highlighter = highlighterRef.value\n const lang = language.value\n\n // 按需加载语言\n if (!loadedLanguages.has(lang) && lang !== 'text') {\n try {\n await highlighter.loadLanguage(lang)\n loadedLanguages.add(lang)\n } catch {\n // 语言不支持,标记但不阻止\n }\n }\n\n // 按需加载主题\n if (!loadedThemes.has(props.theme)) {\n try {\n await highlighter.loadTheme(props.theme)\n loadedThemes.add(props.theme)\n } catch {\n // 主题不支持\n }\n }\n\n const html = highlighter.codeToHtml(code.value, {\n lang: loadedLanguages.has(lang) ? lang : 'text',\n theme: loadedThemes.has(props.theme) ? props.theme : 'github-dark'\n })\n highlightedHtml.value = html\n } catch (e) {\n // Shiki 不可用或加载失败\n highlightError.value = true\n highlightedHtml.value = ''\n } finally {\n isHighlighting.value = false\n }\n}\n\n// 监听代码变化,重新高亮/渲染\nwatch([code, () => props.theme, isMermaid], highlight, { immediate: true })\n\nasync function copyCode() {\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <!-- Mermaid 图表 -->\n <div v-if=\"isMermaid\" class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">MERMAID</span>\n <div class=\"mermaid-actions\">\n <button \n class=\"view-toggle\" \n @click=\"toggleMermaidView\" \n type=\"button\"\n :disabled=\"!mermaidSvg\"\n >\n {{ mermaidViewMode === 'preview' ? '源码' : '预览' }}\n </button>\n <button class=\"copy-btn\" @click=\"copyCode\" type=\"button\">\n {{ copied ? '✓ 已复制' : '复制' }}\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n <!-- 加载中 -->\n <div v-if=\"mermaidLoading && !mermaidSvg\" class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n <!-- 源码模式 -->\n <pre v-else-if=\"mermaidViewMode === 'source'\" class=\"mermaid-source-code\">{{ code }}</pre>\n <!-- 预览模式 -->\n <div v-else-if=\"mermaidSvg\" v-html=\"mermaidSvg\" class=\"mermaid-svg\" />\n <!-- 无法渲染时显示源码 -->\n <pre v-else class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n </div>\n\n <!-- 普通代码块 -->\n <div v-else class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{{ language }}</span>\n <button class=\"copy-btn\" @click=\"copyCode\" type=\"button\">\n {{ copied ? '✓ 已复制' : '复制' }}\n </button>\n </div>\n <div class=\"code-content\">\n <!-- 正在加载高亮 -->\n <div v-if=\"isHighlighting && !highlightedHtml\" class=\"code-loading\">\n <pre><code>{{ code }}</code></pre>\n </div>\n <!-- 高亮后的代码 -->\n <div v-else-if=\"highlightedHtml\" v-html=\"highlightedHtml\" class=\"shiki-wrapper\" />\n <!-- 回退:无高亮 -->\n <pre v-else class=\"code-fallback\"><code>{{ code }}</code></pre>\n </div>\n </div>\n</template>\n\n<style scoped>\n/* Mermaid 样式 */\n.incremark-mermaid {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n\n.mermaid-header {\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\n.mermaid-actions {\n display: flex;\n gap: 8px;\n}\n\n.view-toggle {\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\n.view-toggle:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n\n.view-toggle:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mermaid-content {\n padding: 16px;\n min-height: 100px;\n}\n\n.mermaid-loading {\n color: #8b949e;\n font-size: 14px;\n}\n\n.mermaid-source-code {\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\n.mermaid-svg {\n overflow-x: auto;\n}\n\n.mermaid-svg :deep(svg) {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n\n.code-header {\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\n.language {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n\n.copy-btn {\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\n.copy-btn:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n\n.code-content {\n overflow-x: auto;\n}\n\n.code-loading {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n\n.shiki-wrapper :deep(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,\n.code-loading pre {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n\n.code-fallback code,\n.code-loading code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n</style>\n","import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-mermaid\"\n}\nconst _hoisted_2 = { class: \"mermaid-header\" }\nconst _hoisted_3 = { class: \"mermaid-actions\" }\nconst _hoisted_4 = [\"disabled\"]\nconst _hoisted_5 = { class: \"mermaid-content\" }\nconst _hoisted_6 = {\n key: 0,\n class: \"mermaid-loading\"\n}\nconst _hoisted_7 = { class: \"mermaid-source-code\" }\nconst _hoisted_8 = { class: \"mermaid-source-code\" }\nconst _hoisted_9 = [\"innerHTML\"]\nconst _hoisted_10 = { class: \"mermaid-source-code\" }\nconst _hoisted_11 = { class: \"incremark-code\" }\nconst _hoisted_12 = { class: \"code-header\" }\nconst _hoisted_13 = { class: \"language\" }\nconst _hoisted_14 = { class: \"code-content\" }\nconst _hoisted_15 = {\n key: 0,\n class: \"code-loading\"\n}\nconst _hoisted_16 = [\"innerHTML\"]\nconst _hoisted_17 = { class: \"code-fallback\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" Mermaid 图表 \"),\n ($setup.isMermaid)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _cache[0] || (_cache[0] = _createElementVNode(\"span\", { class: \"language\" }, \"MERMAID\", -1 /* CACHED */)),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"button\", {\n class: \"view-toggle\",\n onClick: $setup.toggleMermaidView,\n type: \"button\",\n disabled: !$setup.mermaidSvg\n }, _toDisplayString($setup.mermaidViewMode === 'preview' ? '源码' : '预览'), 9 /* TEXT, PROPS */, _hoisted_4),\n _createElementVNode(\"button\", {\n class: \"copy-btn\",\n onClick: $setup.copyCode,\n type: \"button\"\n }, _toDisplayString($setup.copied ? '✓ 已复制' : '复制'), 1 /* TEXT */)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createCommentVNode(\" 加载中 \"),\n ($setup.mermaidLoading && !$setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n _createElementVNode(\"pre\", _hoisted_7, _toDisplayString($setup.code), 1 /* TEXT */)\n ]))\n : ($setup.mermaidViewMode === 'source')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 源码模式 \"),\n _createElementVNode(\"pre\", _hoisted_8, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 预览模式 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.mermaidSvg,\n class: \"mermaid-svg\"\n }, null, 8 /* PROPS */, _hoisted_9)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 无法渲染时显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_10, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 普通代码块 \"),\n _createElementVNode(\"div\", _hoisted_11, [\n _createElementVNode(\"div\", _hoisted_12, [\n _createElementVNode(\"span\", _hoisted_13, _toDisplayString($setup.language), 1 /* TEXT */),\n _createElementVNode(\"button\", {\n class: \"copy-btn\",\n onClick: $setup.copyCode,\n type: \"button\"\n }, _toDisplayString($setup.copied ? '✓ 已复制' : '复制'), 1 /* TEXT */)\n ]),\n _createElementVNode(\"div\", _hoisted_14, [\n _createCommentVNode(\" 正在加载高亮 \"),\n ($setup.isHighlighting && !$setup.highlightedHtml)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n _createElementVNode(\"pre\", null, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ]))\n : ($setup.highlightedHtml)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 高亮后的代码 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.highlightedHtml,\n class: \"shiki-wrapper\"\n }, null, 8 /* PROPS */, _hoisted_16)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 回退:无高亮 \"),\n _createElementVNode(\"pre\", _hoisted_17, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCode.vue\";script.__scopeId = \"data-v-c48b1022\";export default script;","<script setup lang=\"ts\">\nimport type { List, ListItem, PhrasingContent } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: List\n}>()\n\nconst tag = computed(() => props.node.ordered ? 'ol' : 'ul')\n\nfunction getItemContent(item: ListItem): PhrasingContent[] {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children as PhrasingContent[]\n }\n return []\n}\n</script>\n\n<template>\n <component :is=\"tag\" class=\"incremark-list\" :class=\"{ 'task-list': node.children.some(item => item.checked !== null && item.checked !== undefined) }\">\n <li \n v-for=\"(item, index) in node.children\" \n :key=\"index\" \n class=\"incremark-list-item\"\n :class=\"{ 'task-item': item.checked !== null && item.checked !== undefined }\"\n >\n <label v-if=\"item.checked !== null && item.checked !== undefined\" class=\"task-label\">\n <input \n type=\"checkbox\" \n :checked=\"item.checked\" \n disabled \n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline :nodes=\"getItemContent(item)\" />\n </span>\n </label>\n <template v-else>\n <IncremarkInline :nodes=\"getItemContent(item)\" />\n </template>\n </li>\n </component>\n</template>\n\n<style scoped>\n.incremark-list {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n\n.incremark-list.task-list {\n list-style: none;\n padding-left: 0;\n}\n\n.incremark-list-item {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n\n.task-item {\n list-style: none;\n}\n\n.task-label {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n\n.checkbox {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n\n.task-content {\n flex: 1;\n}\n</style>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"task-label\"\n}\nconst _hoisted_2 = [\"checked\"]\nconst _hoisted_3 = { class: \"task-content\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass([\"incremark-list\", { 'task-list': $props.node.children.some(item => item.checked !== null && item.checked !== undefined) }])\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: _normalizeClass([\"incremark-list-item\", { 'task-item': item.checked !== null && item.checked !== undefined }])\n }, [\n (item.checked !== null && item.checked !== undefined)\n ? (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n _createElementVNode(\"input\", {\n type: \"checkbox\",\n checked: item.checked,\n disabled: \"\",\n class: \"checkbox\"\n }, null, 8 /* PROPS */, _hoisted_2),\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ]))\n : (_openBlock(), _createBlock($setup[\"IncremarkInline\"], {\n key: 1,\n nodes: $setup.getItemContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"]))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkList.vue\";script.__scopeId = \"data-v-0778ccea\";export default script;","<script setup lang=\"ts\">\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\ndefineProps<{\n node: Table\n}>()\n\nfunction getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n}\n</script>\n\n<template>\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <thead>\n <tr v-if=\"node.children[0]\">\n <th \n v-for=\"(cell, cellIndex) in node.children[0].children\" \n :key=\"cellIndex\"\n :style=\"{ textAlign: node.align?.[cellIndex] || 'left' }\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, rowIndex) in node.children.slice(1)\" :key=\"rowIndex\">\n <td \n v-for=\"(cell, cellIndex) in row.children\" \n :key=\"cellIndex\"\n :style=\"{ textAlign: node.align?.[cellIndex] || 'left' }\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<style scoped>\n.incremark-table-wrapper {\n overflow-x: auto;\n margin: 1em 0;\n}\n\n.incremark-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n\n.incremark-table th,\n.incremark-table td {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n\n.incremark-table th {\n background: #f8f9fa;\n font-weight: 600;\n}\n\n.incremark-table tr:nth-child(even) {\n background: #fafafa;\n}\n\n.incremark-table tr:hover {\n background: #f0f0f0;\n}\n</style>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeStyle as _normalizeStyle, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-table-wrapper\" }\nconst _hoisted_2 = { class: \"incremark-table\" }\nconst _hoisted_3 = { key: 0 }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"table\", _hoisted_2, [\n _createElementVNode(\"thead\", null, [\n ($props.node.children[0])\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children[0].children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"th\", {\n key: cellIndex,\n style: _normalizeStyle({ textAlign: $props.node.align?.[cellIndex] || 'left' })\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 4 /* STYLE */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children.slice(1), (row, rowIndex) => {\n return (_openBlock(), _createElementBlock(\"tr\", { key: rowIndex }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"td\", {\n key: cellIndex,\n style: _normalizeStyle({ textAlign: $props.node.align?.[cellIndex] || 'left' })\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 4 /* STYLE */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkTable.vue\";script.__scopeId = \"data-v-7aea7ba6\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-blockquote\" }\nconst _hoisted_2 = {\n key: 1,\n class: \"unknown-child\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"blockquote\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n (child.type === 'paragraph')\n ? (_openBlock(), _createBlock($setup[\"IncremarkParagraph\"], {\n key: 0,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(child.type), 1 /* TEXT */))\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkBlockquote.vue\";script.__scopeId = \"data-v-67363f13\";export default script;","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-hr\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"hr\", _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkThematicBreak.vue\";script.__scopeId = \"data-v-cb316429\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-default\" }\nconst _hoisted_2 = { class: \"type-badge\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.node.type), 1 /* TEXT */),\n _createElementVNode(\"pre\", null, _toDisplayString(JSON.stringify($props.node, null, 2)), 1 /* TEXT */)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkDefault.vue\";script.__scopeId = \"data-v-5542d517\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, normalizeClass as _normalizeClass, TransitionGroup as _TransitionGroup, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_TransitionGroup, { name: \"incremark-fade\" }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.blocks, (block) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n key: block.stableId,\n class: _normalizeClass([\n 'incremark-block',\n block.status === 'completed' ? $props.completedClass : $props.pendingClass,\n { 'incremark-show-status': $props.showBlockStatus }\n ])\n }, [\n (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent(block.node.type)), {\n node: block.node\n }, null, 8 /* PROPS */, [\"node\"]))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n })\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template\"; script.render = render;script.__file = \"src/components/Incremark.vue\";script.__scopeId = \"data-v-5966b843\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent } from 'mdast'\nimport type { Component } from 'vue'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\n\ndefineProps<{\n node: RootContent\n}>()\n\nconst componentMap: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath,\n}\n\nfunction getComponent(type: string): Component {\n return componentMap[type] || IncremarkDefault\n}\n</script>\n\n<template>\n <component :is=\"getComponent(node.type)\" :node=\"node\" />\n</template>\n\n","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent($props.node.type)), { node: $props.node }, null, 8 /* PROPS */, [\"node\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkRenderer.vue\";export default script;"],"mappings":"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","names":["computed","computed","computed","computed","ref","shallowRef","onUnmounted","IncremarkMath_default","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkInline_default","computed","_createVNode","_openBlock","render","render","IncremarkHeading_default","_createVNode","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkParagraph_default","computed","ref","watch","shallowRef","onUnmounted","_createCommentVNode","_createElementVNode","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_12","_hoisted_13","_hoisted_14","render","render","IncremarkCode_default","computed","computed","_renderList","_Fragment","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_createBlock","_resolveDynamicComponent","_withCtx","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkList_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkTable_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_toDisplayString","_hoisted_1","_hoisted_2","render","render","IncremarkBlockquote_default","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkThematicBreak_default","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","render","render","IncremarkDefault_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","computed","IncremarkDefault_default","_renderList","_Fragment","_openBlock","_createElementBlock","_resolveDynamicComponent","_createBlock","_normalizeClass","_withCtx","_createVNode","_hoisted_1","render","render","Incremark_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","IncremarkDefault_default","_resolveDynamicComponent","_openBlock","_createBlock","render","render","IncremarkRenderer_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useStreamRenderer.ts","../src/composables/useDevTools.ts","src/components/Incremark.vue","src/components/IncremarkHeading.vue","src/components/IncremarkMath.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template","../src/components/IncremarkMath.vue","src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template","../src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template","../src/components/IncremarkHeading.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template","../src/components/IncremarkParagraph.vue","src/components/IncremarkCode.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template","../src/components/IncremarkCode.vue","src/components/IncremarkList.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template","../src/components/IncremarkList.vue","src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template","../src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template","../src/components/IncremarkBlockquote.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template","../src/components/IncremarkThematicBreak.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template","../src/components/IncremarkDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template","../src/components/Incremark.vue","src/components/IncremarkRenderer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template","../src/components/IncremarkRenderer.vue"],"sourcesContent":["import { ref, shallowRef, computed, markRaw } from 'vue'\nimport {\n IncremarkParser,\n createIncremarkParser,\n type ParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root\n} from '@incremark/core'\n\nexport interface UseIncremarkOptions extends ParserOptions {}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * Vue 3 Composable: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark } from '@incremark/vue'\n *\n * const { markdown, blocks, append, finalize } = useIncremark()\n *\n * // 处理 AI 流式输出\n * async function handleStream(stream) {\n * for await (const chunk of stream) {\n * append(chunk)\n * }\n * finalize()\n * }\n * </script>\n *\n * <template>\n * <div>已接收: {{ markdown.length }} 字符</div>\n * </template>\n * ```\n */\nexport function useIncremark(options: UseIncremarkOptions = {}) {\n const parser = createIncremarkParser(options)\n const completedBlocks = shallowRef<ParsedBlock[]>([])\n const pendingBlocks = shallowRef<ParsedBlock[]>([])\n const isLoading = ref(false)\n // 使用 ref 存储 markdown,确保响应式\n const markdown = ref('')\n\n const ast = computed<Root>(() => ({\n type: 'root',\n children: [\n ...completedBlocks.value.map((b) => b.node),\n ...pendingBlocks.value.map((b) => b.node)\n ]\n }))\n\n // 所有块,带稳定 ID(已完成块用真实 ID,待处理块用索引)\n const blocks = computed(() => {\n const result: Array<ParsedBlock & { stableId: string }> = []\n\n for (const block of completedBlocks.value) {\n result.push({ ...block, stableId: block.id })\n }\n\n for (let i = 0; i < pendingBlocks.value.length; i++) {\n result.push({\n ...pendingBlocks.value[i],\n stableId: `pending-${i}`\n })\n }\n\n return result\n })\n\n function append(chunk: string): IncrementalUpdate {\n isLoading.value = true\n const update = parser.append(chunk)\n\n // 更新 markdown ref\n markdown.value = parser.getBuffer()\n\n // 使用 markRaw 避免深层响应式\n if (update.completed.length > 0) {\n completedBlocks.value = [\n ...completedBlocks.value,\n ...update.completed.map((b) => markRaw(b))\n ]\n }\n pendingBlocks.value = update.pending.map((b) => markRaw(b))\n\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n\n // 更新 markdown ref\n markdown.value = parser.getBuffer()\n\n if (update.completed.length > 0) {\n completedBlocks.value = [\n ...completedBlocks.value,\n ...update.completed.map((b) => markRaw(b))\n ]\n }\n pendingBlocks.value = []\n isLoading.value = false\n\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n }\n\n /**\n * 一次性渲染完整 Markdown(reset + append + finalize)\n * @param content 完整的 Markdown 内容\n */\n function render(content: string): IncrementalUpdate {\n // 调用 parser 的 render 方法\n const update = parser.render(content)\n\n // 同步状态\n markdown.value = parser.getBuffer()\n completedBlocks.value = parser.getCompletedBlocks().map(b => markRaw(b))\n pendingBlocks.value = []\n isLoading.value = false\n\n return update\n }\n\n return {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 所有块(完成 + 待处理),带稳定 ID */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器 */\n reset,\n /** 一次性渲染(reset + append + finalize) */\n render,\n /** 解析器实例 */\n parser\n }\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface BlockWithStableId extends ParsedBlock {\n /** 稳定的渲染 ID(用于 Vue key) */\n stableId: string\n}\n\nexport interface UseStreamRendererOptions {\n /** 已完成的块 */\n completedBlocks: Ref<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseStreamRendererReturn {\n /** 带稳定 ID 的已完成块 */\n stableCompletedBlocks: ComputedRef<BlockWithStableId[]>\n /** 带稳定 ID 的待处理块 */\n stablePendingBlocks: ComputedRef<BlockWithStableId[]>\n /** 所有带稳定 ID 的块 */\n allStableBlocks: ComputedRef<BlockWithStableId[]>\n}\n\n/**\n * Vue 3 Composable: 流式渲染辅助\n *\n * 为块分配稳定的渲染 ID,确保 Vue 的虚拟 DOM 复用\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions): UseStreamRendererReturn {\n const { completedBlocks, pendingBlocks } = options\n\n const stableCompletedBlocks = computed<BlockWithStableId[]>(() =>\n completedBlocks.value.map((block) => ({\n ...block,\n stableId: block.id\n }))\n )\n\n const stablePendingBlocks = computed<BlockWithStableId[]>(() =>\n pendingBlocks.value.map((block, index) => ({\n ...block,\n stableId: `pending-${index}`\n }))\n )\n\n const allStableBlocks = computed(() => [...stableCompletedBlocks.value, ...stablePendingBlocks.value])\n\n return {\n stableCompletedBlocks,\n stablePendingBlocks,\n allStableBlocks\n }\n}\n\n","import { onMounted, onUnmounted } from 'vue'\nimport { createDevTools, type DevToolsOptions } from '@incremark/devtools'\nimport type { UseIncremarkReturn } from './useIncremark'\n\nexport interface UseDevToolsOptions extends DevToolsOptions {}\n\n/**\n * Vue 3 DevTools 一行接入\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useDevTools } from '@incremark/vue'\n *\n * const incremark = useIncremark()\n * useDevTools(incremark) // 就这一行!\n * </script>\n * ```\n */\nexport function useDevTools(\n incremark: UseIncremarkReturn,\n options: UseDevToolsOptions = {}\n) {\n const devtools = createDevTools(options)\n\n // 设置 parser 的 onChange 回调\n incremark.parser.setOnChange((state) => {\n const blocks = [\n ...state.completedBlocks.map((b) => ({ ...b, stableId: b.id })),\n ...state.pendingBlocks.map((b, i) => ({ ...b, stableId: `pending-${i}` }))\n ]\n\n devtools.update({\n blocks,\n completedBlocks: state.completedBlocks,\n pendingBlocks: state.pendingBlocks,\n markdown: state.markdown,\n ast: state.ast,\n isLoading: state.pendingBlocks.length > 0\n })\n })\n\n onMounted(() => {\n devtools.mount()\n })\n\n onUnmounted(() => {\n devtools.unmount()\n // 清理回调\n incremark.parser.setOnChange(undefined)\n })\n\n return devtools\n}\n","<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\n\n// 组件映射类型\nexport type ComponentMap = Partial<Record<string, Component>>\n\n// 带稳定 ID 的块类型\nexport interface BlockWithStableId extends ParsedBlock {\n stableId: string\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks: BlockWithStableId[]\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n }>(),\n {\n components: () => ({}),\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }\n)\n\n// 默认组件映射\nconst defaultComponents: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath\n}\n\n// 合并用户组件和默认组件\nconst mergedComponents = computed(() => ({\n ...defaultComponents,\n ...props.components\n}))\n\nfunction getComponent(type: string): Component {\n return mergedComponents.value[type] || props.components?.default || IncremarkDefault\n}\n</script>\n\n<template>\n <div class=\"incremark\">\n <TransitionGroup name=\"incremark-fade\">\n <div\n v-for=\"block in blocks\"\n :key=\"block.stableId\"\n :class=\"[\n 'incremark-block',\n block.status === 'completed' ? completedClass : pendingClass,\n { 'incremark-show-status': showBlockStatus }\n ]\"\n >\n <component :is=\"getComponent(block.node.type)\" :node=\"block.node\" />\n </div>\n </TransitionGroup>\n </div>\n</template>\n\n<style scoped>\n.incremark-block.incremark-show-status.incremark-pending {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n\n.incremark-fade-enter-active {\n transition: opacity 0.2s ease-out;\n}\n\n.incremark-fade-enter-from {\n opacity: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Heading } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: Heading\n}>()\n\nconst tag = computed(() => `h${props.node.depth}`)\n</script>\n\n<template>\n <component :is=\"tag\" class=\"incremark-heading\">\n <IncremarkInline :nodes=\"node.children\" />\n </component>\n</template>\n\n<style scoped>\n.incremark-heading {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\n\nh1 { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.25em; }\nh4 { font-size: 1em; }\nh5 { font-size: 0.875em; }\nh6 { font-size: 0.85em; color: #666; }\n</style>\n\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\n// Math 节点类型(来自 mdast-util-math)\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nconst props = withDefaults(\n defineProps<{\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n }>(),\n {\n renderDelay: 300\n }\n)\n\nconst renderedHtml = ref('')\nconst renderError = ref('')\nconst isLoading = ref(false)\nconst katexRef = shallowRef<any>(null)\nlet renderTimer: ReturnType<typeof setTimeout> | null = null\n\nconst isInline = computed(() => props.node.type === 'inlineMath')\nconst formula = computed(() => props.node.value)\n\n// 带防抖动的渲染\nfunction scheduleRender() {\n if (!formula.value) {\n renderedHtml.value = ''\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n isLoading.value = true\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay)\n}\n\nasync function doRender() {\n if (!formula.value) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef.value) {\n // @ts-ignore - katex 是可选依赖\n const katexModule = await import('katex')\n katexRef.value = katexModule.default\n }\n\n const katex = katexRef.value\n renderedHtml.value = katex.renderToString(formula.value, {\n displayMode: !isInline.value,\n throwOnError: false,\n strict: false\n })\n renderError.value = ''\n } catch (e: any) {\n // 静默失败,可能是公式不完整\n renderError.value = ''\n renderedHtml.value = ''\n } finally {\n isLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n})\n\nwatch(formula, scheduleRender, { immediate: true })\n</script>\n\n<template>\n <!-- 行内公式 -->\n <span v-if=\"isInline\" class=\"incremark-math-inline\">\n <!-- 渲染成功 -->\n <span v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" />\n <!-- 加载中或未渲染:显示源码 -->\n <code v-else class=\"math-source\">{{ formula }}</code>\n </span>\n <!-- 块级公式 -->\n <div v-else class=\"incremark-math-block\">\n <!-- 渲染成功 -->\n <div v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" class=\"math-rendered\" />\n <!-- 加载中或未渲染:显示源码 -->\n <pre v-else class=\"math-source-block\"><code>{{ formula }}</code></pre>\n </div>\n</template>\n\n<style scoped>\n.incremark-math-inline {\n display: inline;\n}\n\n.incremark-math-block {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n\n.math-source {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n\n.math-source-block {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n\n.math-source-block code {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n\n.math-rendered :deep(.katex) {\n font-size: 1.1em;\n}\n\n.math-rendered :deep(.katex-display) {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-math-inline\"\n}\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = { class: \"math-source\" }\nconst _hoisted_4 = { class: \"incremark-math-block\" }\nconst _hoisted_5 = [\"innerHTML\"]\nconst _hoisted_6 = { class: \"math-source-block\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 行内公式 \"),\n ($setup.isInline)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n innerHTML: $setup.renderedHtml\n }, null, 8 /* PROPS */, _hoisted_2))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"code\", _hoisted_3, _toDisplayString($setup.formula), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 块级公式 \"),\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n innerHTML: $setup.renderedHtml,\n class: \"math-rendered\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_6, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.formula), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkMath.vue\";script.__scopeId = \"data-v-6146c361\";export default script;","<script setup lang=\"ts\">\nimport type { PhrasingContent } from 'mdast'\nimport IncremarkMath from './IncremarkMath.vue'\n\ndefineProps<{\n nodes: PhrasingContent[]\n}>()\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n</script>\n\n<template>\n <template v-for=\"(node, idx) in nodes\" :key=\"idx\">\n <!-- 文本 -->\n <template v-if=\"node.type === 'text'\">{{ node.value }}</template>\n\n <!-- 行内公式 -->\n <IncremarkMath v-else-if=\"(node as any).type === 'inlineMath'\" :node=\"node as any\" />\n\n <!-- 加粗 -->\n <strong v-else-if=\"node.type === 'strong'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </strong>\n\n <!-- 斜体 -->\n <em v-else-if=\"node.type === 'emphasis'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </em>\n\n <!-- 行内代码 -->\n <code v-else-if=\"node.type === 'inlineCode'\" class=\"incremark-inline-code\">{{ node.value }}</code>\n\n <!-- 链接 -->\n <a\n v-else-if=\"node.type === 'link'\"\n :href=\"node.url\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </a>\n\n <!-- 图片 -->\n <img\n v-else-if=\"node.type === 'image'\"\n :src=\"node.url\"\n :alt=\"node.alt || ''\"\n loading=\"lazy\"\n />\n\n <!-- 换行 -->\n <br v-else-if=\"node.type === 'break'\" />\n\n <!-- 删除线 -->\n <del v-else-if=\"node.type === 'delete'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </del>\n </template>\n</template>\n\n<style>\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</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, resolveComponent as _resolveComponent, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-inline-code\" }\nconst _hoisted_2 = [\"href\"]\nconst _hoisted_3 = [\"src\", \"alt\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkInline = _resolveComponent(\"IncremarkInline\", true)\n\n return (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.nodes, (node, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 文本 \"),\n (node.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(_toDisplayString(node.value), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n : ((node as any).type === 'inlineMath')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 行内公式 \"),\n _createVNode($setup[\"IncremarkMath\"], {\n node: node as any\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'strong')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 加粗 \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'emphasis')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 斜体 \"),\n _createElementVNode(\"em\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'inlineCode')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 行内代码 \"),\n _createElementVNode(\"code\", _hoisted_1, _toDisplayString(node.value), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'link')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createCommentVNode(\" 链接 \"),\n _createElementVNode(\"a\", {\n href: node.url,\n target: \"_blank\",\n rel: \"noopener\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_2)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'image')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n _createCommentVNode(\" 图片 \"),\n _createElementVNode(\"img\", {\n src: node.url,\n alt: node.alt || '',\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_3)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'break')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _createCommentVNode(\" 换行 \"),\n _cache[0] || (_cache[0] = _createElementVNode(\"br\", null, null, -1 /* CACHED */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'delete')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 8 }, [\n _createCommentVNode(\" 删除线 \"),\n _createElementVNode(\"del\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkInline.vue\";export default script;","import { createVNode as _createVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), { class: \"incremark-heading\" }, {\n default: _withCtx(() => [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]),\n _: 1 /* STABLE */\n }))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHeading.vue\";script.__scopeId = \"data-v-56c8779f\";export default script;","import { createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-paragraph\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"p\", _hoisted_1, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkParagraph.vue\";script.__scopeId = \"data-v-6fa83031\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n }>(),\n {\n theme: 'github-dark',\n disableHighlight: false,\n mermaidDelay: 500\n }\n)\n\nconst copied = ref(false)\nconst highlightedHtml = ref('')\nconst isHighlighting = ref(false)\nconst highlightError = ref(false)\n\n// Mermaid 支持\nconst mermaidSvg = ref('')\nconst mermaidError = ref('')\nconst mermaidLoading = ref(false)\nconst mermaidRef = shallowRef<any>(null)\nlet mermaidTimer: ReturnType<typeof setTimeout> | null = null\n// 视图模式:'preview' | 'source'\nconst mermaidViewMode = ref<'preview' | 'source'>('preview')\n\nfunction toggleMermaidView() {\n mermaidViewMode.value = mermaidViewMode.value === 'preview' ? 'source' : 'preview'\n}\n\nconst language = computed(() => props.node.lang || 'text')\nconst code = computed(() => props.node.value)\nconst isMermaid = computed(() => language.value === 'mermaid')\n\n// 缓存 highlighter\nconst highlighterRef = shallowRef<any>(null)\nconst loadedLanguages = new Set<string>()\nconst loadedThemes = new Set<string>()\n\n// Mermaid 渲染(带防抖动)\nfunction scheduleRenderMermaid() {\n if (!isMermaid.value || !code.value) return\n\n // 清除之前的定时器\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n\n // 显示加载状态\n mermaidLoading.value = true\n\n // 防抖动延迟渲染\n mermaidTimer = setTimeout(() => {\n doRenderMermaid()\n }, props.mermaidDelay)\n}\n\nasync function doRenderMermaid() {\n if (!code.value) return\n\n mermaidError.value = ''\n\n try {\n // 动态导入 mermaid\n if (!mermaidRef.value) {\n // @ts-ignore - mermaid 是可选依赖\n const mermaidModule = await import('mermaid')\n mermaidRef.value = mermaidModule.default\n mermaidRef.value.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose'\n })\n }\n\n const mermaid = mermaidRef.value\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n const { svg } = await mermaid.render(id, code.value)\n mermaidSvg.value = svg\n } catch (e: any) {\n // 不显示错误,可能是代码还不完整\n mermaidError.value = ''\n mermaidSvg.value = ''\n } finally {\n mermaidLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n})\n\n// 动态加载 shiki 并高亮\nasync function highlight() {\n if (isMermaid.value) {\n scheduleRenderMermaid()\n return\n }\n\n if (!code.value || props.disableHighlight) {\n highlightedHtml.value = ''\n return\n }\n\n isHighlighting.value = true\n highlightError.value = false\n\n try {\n // 动态导入 shiki\n if (!highlighterRef.value) {\n const { createHighlighter } = await import('shiki')\n highlighterRef.value = await createHighlighter({\n themes: [props.theme as any],\n langs: []\n })\n loadedThemes.add(props.theme)\n }\n\n const highlighter = highlighterRef.value\n const lang = language.value\n\n // 按需加载语言\n if (!loadedLanguages.has(lang) && lang !== 'text') {\n try {\n await highlighter.loadLanguage(lang)\n loadedLanguages.add(lang)\n } catch {\n // 语言不支持,标记但不阻止\n }\n }\n\n // 按需加载主题\n if (!loadedThemes.has(props.theme)) {\n try {\n await highlighter.loadTheme(props.theme)\n loadedThemes.add(props.theme)\n } catch {\n // 主题不支持\n }\n }\n\n const html = highlighter.codeToHtml(code.value, {\n lang: loadedLanguages.has(lang) ? lang : 'text',\n theme: loadedThemes.has(props.theme) ? props.theme : 'github-dark'\n })\n highlightedHtml.value = html\n } catch (e) {\n // Shiki 不可用或加载失败\n highlightError.value = true\n highlightedHtml.value = ''\n } finally {\n isHighlighting.value = false\n }\n}\n\n// 监听代码变化,重新高亮/渲染\nwatch([code, () => props.theme, isMermaid], highlight, { immediate: true })\n\nasync function copyCode() {\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <!-- Mermaid 图表 -->\n <div v-if=\"isMermaid\" class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">MERMAID</span>\n <div class=\"mermaid-actions\">\n <button \n class=\"view-toggle\" \n @click=\"toggleMermaidView\" \n type=\"button\"\n :disabled=\"!mermaidSvg\"\n >\n {{ mermaidViewMode === 'preview' ? '源码' : '预览' }}\n </button>\n <button class=\"copy-btn\" @click=\"copyCode\" type=\"button\">\n {{ copied ? '✓ 已复制' : '复制' }}\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n <!-- 加载中 -->\n <div v-if=\"mermaidLoading && !mermaidSvg\" class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n <!-- 源码模式 -->\n <pre v-else-if=\"mermaidViewMode === 'source'\" class=\"mermaid-source-code\">{{ code }}</pre>\n <!-- 预览模式 -->\n <div v-else-if=\"mermaidSvg\" v-html=\"mermaidSvg\" class=\"mermaid-svg\" />\n <!-- 无法渲染时显示源码 -->\n <pre v-else class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n </div>\n\n <!-- 普通代码块 -->\n <div v-else class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{{ language }}</span>\n <button class=\"copy-btn\" @click=\"copyCode\" type=\"button\">\n {{ copied ? '✓ 已复制' : '复制' }}\n </button>\n </div>\n <div class=\"code-content\">\n <!-- 正在加载高亮 -->\n <div v-if=\"isHighlighting && !highlightedHtml\" class=\"code-loading\">\n <pre><code>{{ code }}</code></pre>\n </div>\n <!-- 高亮后的代码 -->\n <div v-else-if=\"highlightedHtml\" v-html=\"highlightedHtml\" class=\"shiki-wrapper\" />\n <!-- 回退:无高亮 -->\n <pre v-else class=\"code-fallback\"><code>{{ code }}</code></pre>\n </div>\n </div>\n</template>\n\n<style scoped>\n/* Mermaid 样式 */\n.incremark-mermaid {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n\n.mermaid-header {\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\n.mermaid-actions {\n display: flex;\n gap: 8px;\n}\n\n.view-toggle {\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\n.view-toggle:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n\n.view-toggle:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mermaid-content {\n padding: 16px;\n min-height: 100px;\n}\n\n.mermaid-loading {\n color: #8b949e;\n font-size: 14px;\n}\n\n.mermaid-source-code {\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\n.mermaid-svg {\n overflow-x: auto;\n}\n\n.mermaid-svg :deep(svg) {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n\n.code-header {\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\n.language {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n\n.copy-btn {\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\n.copy-btn:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n\n.code-content {\n overflow-x: auto;\n}\n\n.code-loading {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n\n.shiki-wrapper :deep(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,\n.code-loading pre {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n\n.code-fallback code,\n.code-loading code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n</style>\n","import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-mermaid\"\n}\nconst _hoisted_2 = { class: \"mermaid-header\" }\nconst _hoisted_3 = { class: \"mermaid-actions\" }\nconst _hoisted_4 = [\"disabled\"]\nconst _hoisted_5 = { class: \"mermaid-content\" }\nconst _hoisted_6 = {\n key: 0,\n class: \"mermaid-loading\"\n}\nconst _hoisted_7 = { class: \"mermaid-source-code\" }\nconst _hoisted_8 = { class: \"mermaid-source-code\" }\nconst _hoisted_9 = [\"innerHTML\"]\nconst _hoisted_10 = { class: \"mermaid-source-code\" }\nconst _hoisted_11 = { class: \"incremark-code\" }\nconst _hoisted_12 = { class: \"code-header\" }\nconst _hoisted_13 = { class: \"language\" }\nconst _hoisted_14 = { class: \"code-content\" }\nconst _hoisted_15 = {\n key: 0,\n class: \"code-loading\"\n}\nconst _hoisted_16 = [\"innerHTML\"]\nconst _hoisted_17 = { class: \"code-fallback\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" Mermaid 图表 \"),\n ($setup.isMermaid)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _cache[0] || (_cache[0] = _createElementVNode(\"span\", { class: \"language\" }, \"MERMAID\", -1 /* CACHED */)),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"button\", {\n class: \"view-toggle\",\n onClick: $setup.toggleMermaidView,\n type: \"button\",\n disabled: !$setup.mermaidSvg\n }, _toDisplayString($setup.mermaidViewMode === 'preview' ? '源码' : '预览'), 9 /* TEXT, PROPS */, _hoisted_4),\n _createElementVNode(\"button\", {\n class: \"copy-btn\",\n onClick: $setup.copyCode,\n type: \"button\"\n }, _toDisplayString($setup.copied ? '✓ 已复制' : '复制'), 1 /* TEXT */)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createCommentVNode(\" 加载中 \"),\n ($setup.mermaidLoading && !$setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n _createElementVNode(\"pre\", _hoisted_7, _toDisplayString($setup.code), 1 /* TEXT */)\n ]))\n : ($setup.mermaidViewMode === 'source')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 源码模式 \"),\n _createElementVNode(\"pre\", _hoisted_8, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 预览模式 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.mermaidSvg,\n class: \"mermaid-svg\"\n }, null, 8 /* PROPS */, _hoisted_9)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 无法渲染时显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_10, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 普通代码块 \"),\n _createElementVNode(\"div\", _hoisted_11, [\n _createElementVNode(\"div\", _hoisted_12, [\n _createElementVNode(\"span\", _hoisted_13, _toDisplayString($setup.language), 1 /* TEXT */),\n _createElementVNode(\"button\", {\n class: \"copy-btn\",\n onClick: $setup.copyCode,\n type: \"button\"\n }, _toDisplayString($setup.copied ? '✓ 已复制' : '复制'), 1 /* TEXT */)\n ]),\n _createElementVNode(\"div\", _hoisted_14, [\n _createCommentVNode(\" 正在加载高亮 \"),\n ($setup.isHighlighting && !$setup.highlightedHtml)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n _createElementVNode(\"pre\", null, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ]))\n : ($setup.highlightedHtml)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 高亮后的代码 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.highlightedHtml,\n class: \"shiki-wrapper\"\n }, null, 8 /* PROPS */, _hoisted_16)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 回退:无高亮 \"),\n _createElementVNode(\"pre\", _hoisted_17, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCode.vue\";script.__scopeId = \"data-v-c48b1022\";export default script;","<script setup lang=\"ts\">\nimport type { List, ListItem, PhrasingContent } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: List\n}>()\n\nconst tag = computed(() => props.node.ordered ? 'ol' : 'ul')\n\nfunction getItemContent(item: ListItem): PhrasingContent[] {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children as PhrasingContent[]\n }\n return []\n}\n</script>\n\n<template>\n <component :is=\"tag\" class=\"incremark-list\" :class=\"{ 'task-list': node.children.some(item => item.checked !== null && item.checked !== undefined) }\">\n <li \n v-for=\"(item, index) in node.children\" \n :key=\"index\" \n class=\"incremark-list-item\"\n :class=\"{ 'task-item': item.checked !== null && item.checked !== undefined }\"\n >\n <label v-if=\"item.checked !== null && item.checked !== undefined\" class=\"task-label\">\n <input \n type=\"checkbox\" \n :checked=\"item.checked\" \n disabled \n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline :nodes=\"getItemContent(item)\" />\n </span>\n </label>\n <template v-else>\n <IncremarkInline :nodes=\"getItemContent(item)\" />\n </template>\n </li>\n </component>\n</template>\n\n<style scoped>\n.incremark-list {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n\n.incremark-list.task-list {\n list-style: none;\n padding-left: 0;\n}\n\n.incremark-list-item {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n\n.task-item {\n list-style: none;\n}\n\n.task-label {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n\n.checkbox {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n\n.task-content {\n flex: 1;\n}\n</style>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"task-label\"\n}\nconst _hoisted_2 = [\"checked\"]\nconst _hoisted_3 = { class: \"task-content\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass([\"incremark-list\", { 'task-list': $props.node.children.some(item => item.checked !== null && item.checked !== undefined) }])\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: _normalizeClass([\"incremark-list-item\", { 'task-item': item.checked !== null && item.checked !== undefined }])\n }, [\n (item.checked !== null && item.checked !== undefined)\n ? (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n _createElementVNode(\"input\", {\n type: \"checkbox\",\n checked: item.checked,\n disabled: \"\",\n class: \"checkbox\"\n }, null, 8 /* PROPS */, _hoisted_2),\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ]))\n : (_openBlock(), _createBlock($setup[\"IncremarkInline\"], {\n key: 1,\n nodes: $setup.getItemContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"]))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkList.vue\";script.__scopeId = \"data-v-0778ccea\";export default script;","<script setup lang=\"ts\">\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\ndefineProps<{\n node: Table\n}>()\n\nfunction getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n}\n</script>\n\n<template>\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <thead>\n <tr v-if=\"node.children[0]\">\n <th \n v-for=\"(cell, cellIndex) in node.children[0].children\" \n :key=\"cellIndex\"\n :style=\"{ textAlign: node.align?.[cellIndex] || 'left' }\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, rowIndex) in node.children.slice(1)\" :key=\"rowIndex\">\n <td \n v-for=\"(cell, cellIndex) in row.children\" \n :key=\"cellIndex\"\n :style=\"{ textAlign: node.align?.[cellIndex] || 'left' }\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<style scoped>\n.incremark-table-wrapper {\n overflow-x: auto;\n margin: 1em 0;\n}\n\n.incremark-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n\n.incremark-table th,\n.incremark-table td {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n\n.incremark-table th {\n background: #f8f9fa;\n font-weight: 600;\n}\n\n.incremark-table tr:nth-child(even) {\n background: #fafafa;\n}\n\n.incremark-table tr:hover {\n background: #f0f0f0;\n}\n</style>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeStyle as _normalizeStyle, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-table-wrapper\" }\nconst _hoisted_2 = { class: \"incremark-table\" }\nconst _hoisted_3 = { key: 0 }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"table\", _hoisted_2, [\n _createElementVNode(\"thead\", null, [\n ($props.node.children[0])\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children[0].children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"th\", {\n key: cellIndex,\n style: _normalizeStyle({ textAlign: $props.node.align?.[cellIndex] || 'left' })\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 4 /* STYLE */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children.slice(1), (row, rowIndex) => {\n return (_openBlock(), _createElementBlock(\"tr\", { key: rowIndex }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"td\", {\n key: cellIndex,\n style: _normalizeStyle({ textAlign: $props.node.align?.[cellIndex] || 'left' })\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 4 /* STYLE */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkTable.vue\";script.__scopeId = \"data-v-7aea7ba6\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-blockquote\" }\nconst _hoisted_2 = {\n key: 1,\n class: \"unknown-child\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"blockquote\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n (child.type === 'paragraph')\n ? (_openBlock(), _createBlock($setup[\"IncremarkParagraph\"], {\n key: 0,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(child.type), 1 /* TEXT */))\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkBlockquote.vue\";script.__scopeId = \"data-v-67363f13\";export default script;","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-hr\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"hr\", _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkThematicBreak.vue\";script.__scopeId = \"data-v-cb316429\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-default\" }\nconst _hoisted_2 = { class: \"type-badge\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.node.type), 1 /* TEXT */),\n _createElementVNode(\"pre\", null, _toDisplayString(JSON.stringify($props.node, null, 2)), 1 /* TEXT */)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkDefault.vue\";script.__scopeId = \"data-v-5542d517\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, normalizeClass as _normalizeClass, TransitionGroup as _TransitionGroup, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_TransitionGroup, { name: \"incremark-fade\" }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.blocks, (block) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n key: block.stableId,\n class: _normalizeClass([\n 'incremark-block',\n block.status === 'completed' ? $props.completedClass : $props.pendingClass,\n { 'incremark-show-status': $props.showBlockStatus }\n ])\n }, [\n (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent(block.node.type)), {\n node: block.node\n }, null, 8 /* PROPS */, [\"node\"]))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n })\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=script\";import \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template\"; script.render = render;script.__file = \"src/components/Incremark.vue\";script.__scopeId = \"data-v-5966b843\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent } from 'mdast'\nimport type { Component } from 'vue'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\n\ndefineProps<{\n node: RootContent\n}>()\n\nconst componentMap: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath,\n}\n\nfunction getComponent(type: string): Component {\n return componentMap[type] || IncremarkDefault\n}\n</script>\n\n<template>\n <component :is=\"getComponent(node.type)\" :node=\"node\" />\n</template>\n\n","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent($props.node.type)), { node: $props.node }, null, 8 /* PROPS */, [\"node\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkRenderer.vue\";export default script;"],"mappings":"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","names":["render","computed","computed","computed","computed","ref","shallowRef","onUnmounted","IncremarkMath_default","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkInline_default","computed","_createVNode","_openBlock","render","render","IncremarkHeading_default","_createVNode","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkParagraph_default","computed","ref","watch","shallowRef","onUnmounted","_createCommentVNode","_createElementVNode","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_12","_hoisted_13","_hoisted_14","render","render","IncremarkCode_default","computed","computed","_renderList","_Fragment","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_createBlock","_resolveDynamicComponent","_withCtx","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkList_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkTable_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_toDisplayString","_hoisted_1","_hoisted_2","render","render","IncremarkBlockquote_default","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkThematicBreak_default","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","render","render","IncremarkDefault_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","computed","IncremarkDefault_default","_renderList","_Fragment","_openBlock","_createElementBlock","_resolveDynamicComponent","_createBlock","_normalizeClass","_withCtx","_createVNode","_hoisted_1","render","render","Incremark_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","IncremarkDefault_default","_resolveDynamicComponent","_openBlock","_createBlock","render","render","IncremarkRenderer_default"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@incremark/vue",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Incremark Vue 3 集成",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
},
|
|
14
14
|
"./components/*": {
|
|
15
15
|
"import": "./src/components/*.vue"
|
|
16
|
-
}
|
|
16
|
+
},
|
|
17
|
+
"./style.css": "./dist/index.css"
|
|
17
18
|
},
|
|
18
19
|
"files": [
|
|
19
20
|
"dist",
|
|
@@ -21,8 +22,8 @@
|
|
|
21
22
|
],
|
|
22
23
|
"dependencies": {
|
|
23
24
|
"shiki": "^3.20.0",
|
|
24
|
-
"@incremark/core": "0.0.
|
|
25
|
-
"@incremark/devtools": "0.0.
|
|
25
|
+
"@incremark/core": "0.0.4",
|
|
26
|
+
"@incremark/devtools": "0.0.4"
|
|
26
27
|
},
|
|
27
28
|
"peerDependencies": {
|
|
28
29
|
"vue": "^3.3.0",
|
|
@@ -52,6 +53,12 @@
|
|
|
52
53
|
"ai"
|
|
53
54
|
],
|
|
54
55
|
"license": "MIT",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/kingshuaishuai/incremark.git",
|
|
59
|
+
"directory": "packages/vue"
|
|
60
|
+
},
|
|
61
|
+
"homepage": "https://incremark-docs.vercel.app/",
|
|
55
62
|
"scripts": {
|
|
56
63
|
"build": "tsup",
|
|
57
64
|
"dev": "tsup --watch"
|
|
@@ -120,6 +120,23 @@ export function useIncremark(options: UseIncremarkOptions = {}) {
|
|
|
120
120
|
isLoading.value = false
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* 一次性渲染完整 Markdown(reset + append + finalize)
|
|
125
|
+
* @param content 完整的 Markdown 内容
|
|
126
|
+
*/
|
|
127
|
+
function render(content: string): IncrementalUpdate {
|
|
128
|
+
// 调用 parser 的 render 方法
|
|
129
|
+
const update = parser.render(content)
|
|
130
|
+
|
|
131
|
+
// 同步状态
|
|
132
|
+
markdown.value = parser.getBuffer()
|
|
133
|
+
completedBlocks.value = parser.getCompletedBlocks().map(b => markRaw(b))
|
|
134
|
+
pendingBlocks.value = []
|
|
135
|
+
isLoading.value = false
|
|
136
|
+
|
|
137
|
+
return update
|
|
138
|
+
}
|
|
139
|
+
|
|
123
140
|
return {
|
|
124
141
|
/** 已收集的完整 Markdown 字符串 */
|
|
125
142
|
markdown,
|
|
@@ -141,6 +158,8 @@ export function useIncremark(options: UseIncremarkOptions = {}) {
|
|
|
141
158
|
abort,
|
|
142
159
|
/** 重置解析器 */
|
|
143
160
|
reset,
|
|
161
|
+
/** 一次性渲染(reset + append + finalize) */
|
|
162
|
+
render,
|
|
144
163
|
/** 解析器实例 */
|
|
145
164
|
parser
|
|
146
165
|
}
|