@incremark/solid 0.3.4 → 0.3.6

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.
@@ -14,4 +14,8 @@ export declare function useTheme(): {
14
14
  theme: Accessor<Theme>;
15
15
  setTheme: (theme: Theme) => void;
16
16
  };
17
+ export declare function useThemeContext(): {
18
+ theme: Accessor<Theme>;
19
+ isDark: boolean;
20
+ };
17
21
  //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAuD,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAGpD,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAE9D,eAAO,MAAM,YAAY;WAChB,QAAQ,CAAC,KAAK,CAAC;cACZ,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;cAC9B,CAAA;AAEJ,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,kBAAkB,CAoBvD,CAAA;AAED,wBAAgB,QAAQ;WA/Bf,QAAQ,CAAC,KAAK,CAAC;cACZ,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;EAoCjC"}
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAuD,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAGpD,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAE9D,eAAO,MAAM,YAAY;WAChB,QAAQ,CAAC,KAAK,CAAC;cACZ,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;cAC9B,CAAA;AAEJ,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,kBAAkB,CAoBvD,CAAA;AAED,wBAAgB,QAAQ;WA/Bf,QAAQ,CAAC,KAAK,CAAC;cACZ,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;EAoCjC;AAGD,wBAAgB,eAAe;;;EAiB9B"}
@@ -0,0 +1,12 @@
1
+ import type { DesignTokens } from '@incremark/theme';
2
+ type ThemeValue = 'default' | 'dark' | DesignTokens | Partial<DesignTokens>;
3
+ export declare function provideTheme(theme: ThemeValue): {
4
+ ThemeContext: import("solid-js").Context<ThemeValue>;
5
+ theme: ThemeValue;
6
+ };
7
+ export declare function useThemeContext(): {
8
+ theme: ThemeValue;
9
+ isDark: boolean;
10
+ };
11
+ export {};
12
+ //# sourceMappingURL=useThemeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThemeContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useThemeContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,KAAK,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAI3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU;;;EAE7C;AAED,wBAAgB,eAAe;;;EAiB9B"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useProvideDefinations.tsx","../src/composables/useTypewriter.ts","../src/utils/cursor.ts","../src/utils/animatedChunks.ts","../src/composables/useShiki.ts","../src/components/ConfigProvider.tsx","../src/composables/useDefinationsContext.ts","../src/composables/useStreamRenderer.ts","../src/composables/useBlockTransformer.ts","../src/components/Incremark.tsx","../src/components/IncremarkRenderer.tsx","../src/components/IncremarkHeading.tsx","../src/components/IncremarkInline.tsx","../src/components/IncremarkMath.tsx","../src/components/IncremarkHtmlElement.tsx","../src/components/IncremarkParagraph.tsx","../src/components/IncremarkCode.tsx","../src/components/IncremarkCodeMermaid.tsx","../src/components/SvgIcon.tsx","../src/components/IncremarkCodeDefault.tsx","../src/components/CachedCodeRenderer.tsx","../src/components/IncremarkList.tsx","../src/components/IncremarkTable.tsx","../src/components/IncremarkBlockquote.tsx","../src/components/IncremarkThematicBreak.tsx","../src/components/IncremarkContainer.tsx","../src/components/IncremarkDefault.tsx","../src/components/IncremarkFootnotes.tsx","../src/components/IncremarkContent.tsx","../src/components/AutoScrollContainer.tsx","../src/components/ThemeProvider.tsx","../src/index.ts"],"sourcesContent":["import {\n createSignal,\n createComputed,\n createEffect,\n onCleanup,\n type Accessor,\n type Setter\n} from 'solid-js'\nimport {\n createIncremarkParser,\n type IncremarkParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root,\n type TransformerPlugin,\n type AnimationEffect\n} from '@incremark/core'\nimport { useProvideDefinations } from './useProvideDefinations'\nimport { useTypewriter } from './useTypewriter'\nimport { clearAnimatedChunks } from '../utils/animatedChunks'\n\n/** 打字机效果配置 */\nexport interface TypewriterOptions {\n /** 是否启用打字机效果(可响应式切换) */\n enabled?: boolean\n /** 每次显示的字符数,可以是固定值或范围 [min, max] */\n charsPerTick?: number | [number, number]\n /** 更新间隔 (ms) */\n tickInterval?: number\n /** 动画效果: 'none' | 'fade-in' | 'typing' */\n effect?: AnimationEffect\n /** 光标字符(仅 typing 效果使用) */\n cursor?: string\n /** 页面不可见时暂停 */\n pauseOnHidden?: boolean\n /** 自定义插件 */\n plugins?: TransformerPlugin[]\n}\n\nexport interface UseIncremarkOptions extends IncremarkParserOptions {\n /** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */\n typewriter?: TypewriterOptions\n}\n\n/** 打字机控制对象 */\nexport interface TypewriterControls {\n /** 是否启用(只读) */\n enabled: Accessor<boolean>\n /** 设置是否启用 */\n setEnabled: (enabled: boolean) => void\n /** 是否正在处理中 */\n isProcessing: Accessor<boolean>\n /** 是否已暂停 */\n isPaused: Accessor<boolean>\n /** 当前动画效果 */\n effect: Accessor<AnimationEffect>\n /** 跳过动画,直接显示全部 */\n skip: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<TypewriterOptions>) => void\n}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * SolidJS Hook: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```tsx\n * import { useIncremark, Incremark } from '@incremark/solid'\n *\n * function App() {\n * // 基础用法\n * const { blocks, append, finalize } = useIncremark()\n *\n * // 启用打字机效果\n * const { blocks, append, finalize, typewriter } = useIncremark({\n * typewriter: {\n * enabled: true, // 可响应式切换\n * charsPerTick: [1, 3],\n * tickInterval: 30,\n * effect: 'typing',\n * cursor: '|'\n * }\n * })\n *\n * // 动态切换打字机效果\n * typewriter.setEnabled(false)\n *\n * return (\n * <>\n * <Incremark blocks={blocks} />\n * <Show when={typewriter.isProcessing()}>\n * <button onClick={typewriter.skip}>跳过</button>\n * </Show>\n * </>\n * )\n * }\n * ```\n */\nexport function useIncremark(optionsInput: () => UseIncremarkOptions = () => ({})) {\n // 内部自动提供 definitions context\n const { setDefinations, setFootnoteDefinitions, footnoteReferenceOrder, setFootnoteReferenceOrder, contextValue, DefinationsProvider } = useProvideDefinations()\n\n // 创建解析器的工厂函数\n function createParser(options: UseIncremarkOptions) {\n return createIncremarkParser({\n ...options,\n onChange: (state) => {\n setDefinations(state.definitions)\n setFootnoteDefinitions(state.footnoteDefinitions)\n options.onChange?.(state)\n }\n })\n }\n\n // 解析器\n let parser = createParser(optionsInput())\n\n const [completedBlocks, setCompletedBlocks] = createSignal<ParsedBlock[]>([])\n const [pendingBlocks, setPendingBlocks] = createSignal<ParsedBlock[]>([])\n const [isLoading, setIsLoading] = createSignal(false)\n const [markdown, setMarkdown] = createSignal('')\n const [isFinalized, setIsFinalized] = createSignal(false)\n\n // 使用 useTypewriter composable 管理打字机效果\n // 传入响应式的 typewriter 配置,让 useTypewriter 内部监听变化\n const { blocks, typewriter, transformer, isAnimationComplete, displayedFootnoteReferenceOrder } = useTypewriter({\n typewriter: () => optionsInput().typewriter,\n completedBlocks,\n pendingBlocks\n })\n\n // 内容是否完全显示完成\n // 如果没有配置打字机或未启用打字机:解析完成即显示完成\n // 如果启用打字机:解析完成 + 动画完成\n const isDisplayComplete = () => {\n // 没有配置打字机,或者打字机未启用:只需判断是否 finalized\n if (!optionsInput().typewriter || !typewriter.enabled()) {\n return isFinalized()\n }\n // 启用了打字机:需要 finalize + 动画完成\n return isFinalized() && isAnimationComplete()\n }\n\n // AST\n const [ast, setAst] = createSignal<Root>({\n type: 'root',\n children: []\n })\n\n /**\n * 处理解析器更新结果(统一 append 和 finalize 的更新逻辑)\n */\n function handleUpdate(update: IncrementalUpdate, isFinalize: boolean = false): void {\n setMarkdown(parser.getBuffer())\n\n // 处理被更新的 blocks(需要移除的旧 blocks)\n if (update.updated.length > 0) {\n const idsToRemove = new Set(update.updated.map(b => b.id))\n setCompletedBlocks(prev => prev.filter(b => !idsToRemove.has(b.id)))\n }\n\n if (update.completed.length > 0) {\n setCompletedBlocks(prev => [...prev, ...update.completed])\n }\n setPendingBlocks(update.pending)\n\n if (isFinalize) {\n // 如果还有 pending blocks,则将它们添加到 completed blocks 中\n if (update.pending.length > 0) {\n setCompletedBlocks(prev => [...prev, ...update.pending])\n setPendingBlocks([])\n }\n setIsLoading(false)\n setIsFinalized(true)\n } else {\n setIsLoading(true)\n }\n\n // 更新脚注引用顺序(解析器的完整顺序)\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n // 注意:这里不再直接调用 setFootnoteReferenceOrder\n // 脚注显示顺序由下面的 createEffect 根据打字机状态来控制\n }\n\n function append(chunk: string): IncrementalUpdate {\n const update = parser.append(chunk)\n setAst(update.ast)\n handleUpdate(update, false)\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n handleUpdate(update, true)\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n setCompletedBlocks([])\n setPendingBlocks([])\n setMarkdown('')\n setIsLoading(false)\n setIsFinalized(false)\n setFootnoteReferenceOrder([])\n\n // 重置 transformer\n transformer?.reset()\n\n // 清空已动画的 chunk 记录,让新内容可以播放动画\n clearAnimatedChunks()\n }\n\n // 监听 parser 相关 options 变化,动态更新配置(排除 typewriter 配置)\n // 使用 JSON.stringify 比较,避免 deep watch 对新对象的误触发\n // 注意:astBuilder 是类,需要单独处理\n let lastOptionsStr = ''\n createEffect(() => {\n const opts = optionsInput()\n const { typewriter: _, astBuilder, ...parserOptions } = opts\n // astBuilder 用名称标识,因为它是类不能 JSON.stringify\n const optionsStr = JSON.stringify(parserOptions) + '|' + (astBuilder?.name ?? 'default')\n\n if (optionsStr !== lastOptionsStr) {\n lastOptionsStr = optionsStr\n // 使用 updateOptions 动态更新配置(包括引擎切换),不需要重建 parser\n const { typewriter: _, ...parserOptions } = opts\n parser.updateOptions(parserOptions)\n // 同步 Solid 状态\n setCompletedBlocks([])\n setPendingBlocks([])\n setMarkdown('')\n setIsLoading(false)\n setIsFinalized(false)\n setFootnoteReferenceOrder([])\n transformer?.reset()\n }\n })\n\n // 监听打字机的 displayedFootnoteReferenceOrder 变化,更新脚注显示\n // 这确保脚注只在引用所在的 block 动画完成后才显示\n createEffect(() => {\n const newOrder = displayedFootnoteReferenceOrder()\n setFootnoteReferenceOrder(newOrder)\n })\n\n function render(content: string): IncrementalUpdate {\n const update = parser.render(content)\n\n setMarkdown(parser.getBuffer())\n setCompletedBlocks(parser.getCompletedBlocks())\n setPendingBlocks([])\n setIsLoading(false)\n setIsFinalized(true)\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n // render 是一次性渲染,不经过打字机,直接设置脚注顺序\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n\n return update\n }\n\n const result = {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 用于渲染的 blocks(根据打字机设置自动处理) */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 是否已完成(finalize) */\n isFinalized,\n /**\n * 内容是否完全显示完成\n * - 无打字机:等于 isFinalized\n * - 有打字机:isFinalized + 动画播放完成\n * 适用于控制 footnote 等需要在内容完全显示后才出现的元素\n */\n isDisplayComplete,\n /** 脚注引用的出现顺序 */\n footnoteReferenceOrder,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器和打字机 */\n reset,\n /** 一次性渲染(reset + append + finalize) */\n render,\n /** 解析器实例 */\n parser,\n /** 打字机控制 */\n typewriter,\n /** Context value for DefinationsProvider */\n contextValue,\n /** DefinationsProvider component */\n DefinationsProvider\n }\n\n return result as any\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Accessor, createSignal, type Setter } from 'solid-js'\nimport { createContext } from 'solid-js'\nimport type { Definition, FootnoteDefinition } from 'mdast'\n\nexport interface DefinationsContextValue {\n definations: Accessor<Record<string, Definition>>\n setDefinations: Setter<Record<string, Definition>>\n footnoteDefinitions: Accessor<Record<string, FootnoteDefinition>>\n setFootnoteDefinitions: Setter<Record<string, FootnoteDefinition>>\n footnoteReferenceOrder: Accessor<string[]>\n setFootnoteReferenceOrder: Setter<string[]>\n clearAllDefinations: () => void\n}\n\nexport const DefinationsContext = createContext<DefinationsContextValue>()\n\nexport interface DefinationsProviderProps {\n children?: any\n value: DefinationsContextValue\n}\n\nexport function DefinationsProvider(props: DefinationsProviderProps) {\n return (\n <DefinationsContext.Provider value={props.value}>\n {props.children}\n </DefinationsContext.Provider>\n )\n}\n\n/**\n * Provides definitions state management\n * Call this in a composable to get setter functions\n */\nexport function useProvideDefinations() {\n const [definations, setDefinations] = createSignal<Record<string, Definition>>({})\n const [footnoteDefinitions, setFootnoteDefinitions] = createSignal<Record<string, FootnoteDefinition>>({})\n const [footnoteReferenceOrder, setFootnoteReferenceOrder] = createSignal<string[]>([])\n\n function clearDefinations() {\n setDefinations({})\n }\n\n function clearFootnoteDefinitions() {\n setFootnoteDefinitions({})\n }\n\n function clearFootnoteReferenceOrder() {\n setFootnoteReferenceOrder([])\n }\n\n function clearAllDefinations() {\n clearDefinations()\n clearFootnoteDefinitions()\n clearFootnoteReferenceOrder()\n }\n\n const contextValue: DefinationsContextValue = {\n definations,\n setDefinations,\n footnoteDefinitions,\n setFootnoteDefinitions,\n footnoteReferenceOrder,\n setFootnoteReferenceOrder,\n clearAllDefinations\n }\n\n return {\n definations,\n setDefinations,\n footnoteDefinitions,\n setFootnoteDefinitions,\n footnoteReferenceOrder,\n setFootnoteReferenceOrder,\n clearDefinations,\n clearFootnoteDefinitions,\n clearFootnoteReferenceOrder,\n clearAllDefinations,\n DefinationsProvider,\n contextValue\n }\n}\n","/**\n * @file useTypewriter Composable - 打字机效果管理\n *\n * @description\n * 管理打字机效果的状态和控制逻辑。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport {\n createSignal,\n createEffect,\n onCleanup,\n type Accessor\n} from 'solid-js'\nimport { createStore, reconcile } from 'solid-js/store'\nimport {\n createBlockTransformer,\n defaultPlugins,\n mathPlugin,\n collectFootnoteReferences,\n type RootContent,\n type ParsedBlock,\n type DisplayBlock,\n type AnimationEffect,\n type BlockTransformer\n} from '@incremark/core'\nimport type { TypewriterOptions, TypewriterControls } from './useIncremark'\nimport { addCursorToNode } from '../utils/cursor'\n\nexport interface UseTypewriterOptions {\n typewriter: () => TypewriterOptions | undefined\n completedBlocks: Accessor<ParsedBlock[]>\n pendingBlocks: Accessor<ParsedBlock[]>\n}\n\n/** 用于渲染的 block 类型 */\nexport type RenderBlock = ParsedBlock & { isLastPending?: boolean }\n\nexport interface UseTypewriterReturn {\n /** 用于渲染的 blocks(经过打字机处理或原始blocks) */\n blocks: RenderBlock[]\n /** 打字机控制对象 */\n typewriter: TypewriterControls\n /** transformer 实例 */\n transformer: BlockTransformer<RootContent> | null\n /** 所有动画是否已完成(队列为空且没有正在处理的 block) */\n isAnimationComplete: Accessor<boolean>\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n * 动画进行中时返回空数组\n */\n displayedFootnoteReferenceOrder: Accessor<string[]>\n}\n\n/**\n * useTypewriter Composable\n *\n * @description\n * 管理打字机效果的所有状态和逻辑。\n *\n * @param options - 打字机配置和数据\n * @returns 打字机状态和控制对象\n */\nexport function useTypewriter(options: UseTypewriterOptions): UseTypewriterReturn {\n const { typewriter: typewriterInput, completedBlocks, pendingBlocks } = options\n\n // 获取初始配置\n const initialConfig = typewriterInput()\n\n // 打字机状态\n const [typewriterEnabled, setTypewriterEnabled] = createSignal(initialConfig?.enabled ?? !!initialConfig)\n const [isTypewriterProcessing, setIsTypewriterProcessing] = createSignal(false)\n const [isTypewriterPaused, setIsTypewriterPaused] = createSignal(false)\n const [typewriterEffect, setTypewriterEffect] = createSignal<AnimationEffect>(initialConfig?.effect ?? 'none')\n const [typewriterCursor, setTypewriterCursor] = createSignal(initialConfig?.cursor ?? '|')\n const [isAnimationComplete, setIsAnimationComplete] = createSignal(true) // 初始为 true(没有动画时视为完成)\n\n // 使用 store 来存储 blocks,利用 reconcile 进行细粒度更新\n // 这样只有真正变化的 block 才会触发重新渲染\n const [blocksStore, setBlocksStore] = createStore<{ items: RenderBlock[] }>({ items: [] })\n\n // 创建 transformer(如果有 typewriter 配置)\n let transformer: BlockTransformer<RootContent> | null = null\n\n // 用于存储 displayBlocks 的原始数据(用于脚注计算等)\n let displayBlocksCache: DisplayBlock<RootContent>[] = []\n\n /**\n * 将 DisplayBlock 转换为 RenderBlock\n * 抽取为函数以便复用\n */\n function convertToRenderBlocks(displayBlocks: DisplayBlock<RootContent>[]): RenderBlock[] {\n return displayBlocks.map((db, index) => {\n const isPending = !db.isDisplayComplete\n const isLastPending = isPending && index === displayBlocks.length - 1\n\n // typing 效果时添加光标\n let node = db.displayNode\n if (typewriterEffect() === 'typing' && isLastPending) {\n node = addCursorToNode(db.displayNode, typewriterCursor())\n }\n\n return {\n id: db.id,\n status: db.status,\n node,\n startOffset: 0,\n endOffset: 0,\n rawText: '',\n isLastPending\n }\n })\n }\n\n if (initialConfig) {\n transformer = createBlockTransformer<RootContent>({\n charsPerTick: initialConfig.charsPerTick ?? [1, 3],\n tickInterval: initialConfig.tickInterval ?? 30,\n effect: initialConfig.effect ?? 'none',\n pauseOnHidden: initialConfig.pauseOnHidden ?? true,\n // 默认插件 + 数学公式插件(数学公式应该整体显示,不参与打字机逐字符效果)\n plugins: initialConfig.plugins ?? [...defaultPlugins, mathPlugin],\n onChange: (blocks) => {\n displayBlocksCache = blocks as DisplayBlock<RootContent>[]\n // 使用 reconcile 进行细粒度更新,按 id 匹配\n // 这样只有真正变化的 block 才会触发重新渲染\n const newRenderBlocks = convertToRenderBlocks(displayBlocksCache)\n setBlocksStore('items', reconcile(newRenderBlocks, { key: 'id', merge: true }))\n setIsTypewriterProcessing(transformer?.isProcessing() ?? false)\n setIsTypewriterPaused(transformer?.isPausedState() ?? false)\n // 当还有 block 在处理中时,动画未完成\n if (transformer?.isProcessing() ?? false) {\n setIsAnimationComplete(false)\n }\n },\n onAllComplete: () => {\n // 所有动画完成\n setIsAnimationComplete(true)\n }\n })\n }\n\n // 监听配置变化,更新 transformer\n createEffect(() => {\n const newConfig = typewriterInput()\n if (!newConfig) return\n\n // 更新本地状态\n if (newConfig.enabled !== undefined) {\n setTypewriterEnabled(newConfig.enabled)\n }\n if (newConfig.effect !== undefined) {\n setTypewriterEffect(newConfig.effect)\n }\n if (newConfig.cursor !== undefined) {\n setTypewriterCursor(newConfig.cursor)\n }\n\n // 更新 transformer 配置\n transformer?.setOptions({\n charsPerTick: newConfig.charsPerTick,\n tickInterval: newConfig.tickInterval,\n effect: newConfig.effect,\n pauseOnHidden: newConfig.pauseOnHidden\n })\n\n // 当禁用打字机时,重置 transformer 状态,避免残留数据\n if (newConfig.enabled === false && transformer) {\n transformer.reset()\n }\n })\n\n // 监听 blocks 变化,推送给 transformer\n // transformer.push() 会自动检测并更新已存在 blocks 的内容变化\n // 只有当打字机启用时才推送给 transformer\n if (transformer) {\n createEffect(() => {\n // 只有启用打字机时才推送给 transformer\n if (!typewriterEnabled()) return\n\n // 直接传递原始 block 引用\n // ParsedBlock 的结构(id, node, status)已经兼容 SourceBlock\n const allBlocks = [...completedBlocks(), ...pendingBlocks()] as any\n transformer!.push(allBlocks)\n })\n }\n\n // 原始 blocks(不经过打字机)\n const rawBlocks = () => [...completedBlocks(), ...pendingBlocks()]\n\n // 监听非打字机模式下的 blocks 变化,同步到 store\n // 这个 effect 在以下情况触发:\n // 1. typewriterEnabled 从 true 变为 false\n // 2. completedBlocks 或 pendingBlocks 变化时(如果 typewriter 禁用)\n createEffect(() => {\n const enabled = typewriterEnabled()\n const blocks = rawBlocks() // 读取依赖\n\n if (!enabled || !transformer) {\n // 未启用打字机时,直接使用原始 blocks\n setBlocksStore('items', reconcile(blocks, { key: 'id', merge: true }))\n }\n })\n\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n */\n const displayedFootnoteReferenceOrder = () => {\n // 未启用打字机:返回所有脚注引用(从原始 blocks 中提取)\n if (!typewriterEnabled() || !transformer) {\n const references: string[] = []\n const seen = new Set<string>()\n for (const block of rawBlocks()) {\n const blockRefs = collectFootnoteReferences(block.node)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 启用打字机:只有所有动画完成后才返回脚注引用\n // 如果还有动画在进行中,返回空数组\n if (!isAnimationComplete()) {\n return []\n }\n\n // 所有动画完成,返回全部脚注引用(从 displayBlocksCache)\n const references: string[] = []\n const seen = new Set<string>()\n for (const db of displayBlocksCache) {\n const blockRefs = collectFootnoteReferences(db.displayNode)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 打字机控制对象\n const typewriterControls: TypewriterControls = {\n enabled: () => typewriterEnabled(),\n setEnabled: (value: boolean) => {\n setTypewriterEnabled(value)\n },\n isProcessing: () => isTypewriterProcessing(),\n isPaused: () => isTypewriterPaused(),\n effect: () => typewriterEffect(),\n skip: () => transformer?.skip(),\n pause: () => {\n transformer?.pause()\n setIsTypewriterPaused(true)\n },\n resume: () => {\n transformer?.resume()\n setIsTypewriterPaused(false)\n },\n setOptions: (opts) => {\n if (opts.enabled !== undefined) {\n setTypewriterEnabled(opts.enabled)\n }\n if (opts.charsPerTick !== undefined || opts.tickInterval !== undefined || opts.effect !== undefined || opts.pauseOnHidden !== undefined) {\n transformer?.setOptions({\n charsPerTick: opts.charsPerTick,\n tickInterval: opts.tickInterval,\n effect: opts.effect,\n pauseOnHidden: opts.pauseOnHidden\n })\n }\n if (opts.effect !== undefined) {\n setTypewriterEffect(opts.effect)\n }\n if (opts.cursor !== undefined) {\n setTypewriterCursor(opts.cursor)\n }\n }\n }\n\n // 清理\n onCleanup(() => {\n transformer?.destroy()\n })\n\n return {\n blocks: blocksStore.items,\n typewriter: typewriterControls,\n transformer,\n isAnimationComplete: () => isAnimationComplete(),\n displayedFootnoteReferenceOrder: () => displayedFootnoteReferenceOrder()\n }\n}\n","import type { RootContent } from 'mdast'\n\n/**\n * 为节点添加打字机光标\n * @param node 要添加光标的节点\n * @param cursor 光标字符\n * @returns 添加了光标的新节点\n */\nexport function addCursorToNode(node: RootContent, cursor: string): RootContent {\n // 代码块不应该添加光标(会破坏代码高亮)\n if (node.type === 'code') {\n return node\n }\n\n const cloned = JSON.parse(JSON.stringify(node))\n\n function addToLast(n: { children?: unknown[]; type?: string; value?: string }): boolean {\n // 跳过代码块\n if (n.type === 'code') {\n return false\n }\n\n if (n.children && n.children.length > 0) {\n for (let i = n.children.length - 1; i >= 0; i--) {\n if (addToLast(n.children[i] as { children?: unknown[]; type?: string; value?: string })) {\n return true\n }\n }\n n.children.push({ type: 'text', value: cursor })\n return true\n }\n if (n.type === 'text' && typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n if (typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n return false\n }\n\n addToLast(cloned)\n return cloned as RootContent\n}\n","/**\n * @file Animated Chunks Tracker\n *\n * @description\n * 跟踪已播放过动画的 chunk,避免重复播放动画导致闪烁\n *\n * @author Incremark Team\n * @license MIT\n */\n\n/**\n * 已播放过动画的 chunk 的 createdAt 时间戳集合\n * 使用全局 Set 来跟踪,这样即使组件重新渲染,也能知道哪些 chunk 已经播放过动画\n */\nconst animatedChunks = new Set<number>()\n\n/**\n * 判断 chunk 是否应该播放动画\n * 只有首次出现的 chunk 才播放动画,之后重新渲染时不再播放\n */\nexport function shouldAnimateChunk(createdAt: number): boolean {\n if (animatedChunks.has(createdAt)) {\n return false\n }\n // 标记为已播放动画\n animatedChunks.add(createdAt)\n return true\n}\n\n/**\n * 清空已动画的 chunk 记录\n * 在 reset 时调用,让新的内容可以重新播放动画\n */\nexport function clearAnimatedChunks(): void {\n animatedChunks.clear()\n}\n","/**\n * Shiki Highlighter 单例管理器\n *\n * 避免重复创建 Shiki 实例,所有组件共享同一个 highlighter\n */\n\nimport { type Accessor, createSignal } from 'solid-js'\nimport type { HighlighterGeneric, BundledLanguage, BundledTheme } from 'shiki'\n\n// ============ 类型定义 ============\n\ninterface HighlighterInfo {\n highlighter: HighlighterGeneric<BundledLanguage, BundledTheme>\n loadedLanguages: Set<BundledLanguage>\n loadedThemes: Set<BundledTheme>\n}\n\n// ============ 单例管理器 ============\n\n/** Shiki highlighter 单例管理器 */\nclass ShikiManager {\n private static instance: ShikiManager | null = null\n\n /** 存储 highlighter 实例,key 为主题名称 */\n private highlighters = new Map<string, HighlighterInfo>()\n\n private constructor() {}\n\n static getInstance(): ShikiManager {\n if (!ShikiManager.instance) {\n ShikiManager.instance = new ShikiManager()\n }\n return ShikiManager.instance\n }\n\n /**\n * 获取或创建 highlighter\n * @param theme 主题名称\n * @returns highlighter 实例\n */\n async getHighlighter(theme: BundledTheme): Promise<HighlighterInfo> {\n // 如果已存在对应主题的 highlighter,直接返回\n if (this.highlighters.has(theme)) {\n return this.highlighters.get(theme)!\n }\n\n // 创建新的 highlighter\n const { createHighlighter } = await import('shiki')\n const highlighter = await createHighlighter({\n themes: [theme],\n langs: []\n })\n\n const info: HighlighterInfo = {\n highlighter,\n loadedLanguages: new Set<BundledLanguage>(),\n loadedThemes: new Set<BundledTheme>([theme])\n }\n\n this.highlighters.set(theme, info)\n return info\n }\n\n /**\n * 加载语言(按需)\n * @param theme 主题名称\n * @param lang 语言名称\n */\n async loadLanguage(theme: BundledTheme, lang: BundledLanguage): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedLanguages.has(lang)) return\n\n try {\n await info.highlighter.loadLanguage(lang)\n info.loadedLanguages.add(lang)\n } catch {\n // 语言不支持,静默处理\n }\n }\n\n /**\n * 加载主题(按需)\n * @param theme 主题名称\n */\n async loadTheme(theme: BundledTheme): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedThemes.has(theme)) return\n\n try {\n await info.highlighter.loadTheme(theme)\n info.loadedThemes.add(theme)\n } catch {\n // 主题不支持,静默处理\n }\n }\n\n /**\n * 高亮代码\n * @param theme 主题名称\n * @param code 代码内容\n * @param lang 语言名称\n * @param fallbackTheme 回退主题\n * @returns 高亮后的 HTML\n */\n async codeToHtml(\n theme: BundledTheme,\n code: string,\n lang: BundledLanguage,\n fallbackTheme: BundledTheme\n ): Promise<string> {\n const info = this.highlighters.get(theme)\n if (!info) throw new Error('Highlighter not found')\n\n const actualLang = info.loadedLanguages.has(lang) ? lang : 'text'\n const actualTheme = info.loadedThemes.has(theme) ? theme : fallbackTheme\n\n return info.highlighter.codeToHtml(code, {\n lang: actualLang,\n theme: actualTheme\n })\n }\n\n /**\n * 清理所有 highlighter(应用退出或需要重置时调用)\n */\n disposeAll() {\n for (const [, info] of this.highlighters) {\n if (info.highlighter?.dispose) {\n info.highlighter.dispose()\n }\n }\n this.highlighters.clear()\n }\n}\n\n// ============ 延迟初始化单例 ============\n\nlet shikiManagerInstance: ShikiManager | null = null\n\n/**\n * 获取 ShikiManager 单例(延迟初始化)\n * 避免模块加载时立即创建实例,支持 SSR\n */\nfunction getShikiManager(): ShikiManager {\n if (!shikiManagerInstance) {\n shikiManagerInstance = ShikiManager.getInstance()\n }\n return shikiManagerInstance\n}\n\nexport { getShikiManager, ShikiManager }\n\n// ============ Solid 组合式函数 ============\n\nexport interface UseShikiReturn {\n highlighterInfo: Accessor<HighlighterInfo | null>\n isHighlighting: Accessor<boolean>\n isReady: Accessor<boolean>\n initHighlighter: () => Promise<void>\n highlight: (code: string, lang: string, fallbackTheme: string) => Promise<string>\n}\n\n/**\n * 使用 Shiki Highlighter(组合式函数)\n *\n * @param theme 主题名称\n * @returns Shiki 相关的响应式状态和方法\n */\nexport function useShiki(theme: string): UseShikiReturn {\n const [highlighterInfo, setHighlighterInfo] = createSignal<HighlighterInfo | null>(null)\n const [isHighlighting, setIsHighlighting] = createSignal(false)\n const [isReady, setIsReady] = createSignal(false)\n\n /**\n * 初始化 highlighter(预加载)\n */\n async function initHighlighter(): Promise<void> {\n if (isReady()) return\n\n try {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n setHighlighterInfo(info)\n setIsReady(true)\n } catch (e) {\n console.warn('Failed to initialize Shiki highlighter:', e)\n throw e\n }\n }\n\n /**\n * 获取 highlighter\n */\n async function getHighlighter(): Promise<HighlighterInfo> {\n if (!highlighterInfo()) {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n setHighlighterInfo(info)\n setIsReady(true)\n return info\n }\n return highlighterInfo()!\n }\n\n /**\n * 高亮代码\n */\n async function highlight(code: string, lang: string, fallbackTheme: string): Promise<string> {\n setIsHighlighting(true)\n\n try {\n const info = await getHighlighter()\n const manager = getShikiManager()\n\n // 按需加载语言\n if (!info.loadedLanguages.has(lang as BundledLanguage) && lang !== 'text') {\n await manager.loadLanguage(theme as BundledTheme, lang as BundledLanguage)\n }\n\n // 按需加载主题\n if (!info.loadedThemes.has(theme as BundledTheme)) {\n await manager.loadTheme(theme as BundledTheme)\n }\n\n return await manager.codeToHtml(\n theme as BundledTheme,\n code,\n lang as BundledLanguage,\n fallbackTheme as BundledTheme\n )\n } catch (e) {\n throw e\n } finally {\n setIsHighlighting(false)\n }\n }\n\n return {\n highlighterInfo,\n isHighlighting,\n isReady,\n initHighlighter,\n highlight\n }\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Component, type JSX, createContext, useContext, createSignal, createMemo, type Accessor } from 'solid-js'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\n\nexport const LocaleContext = createContext<{\n locale: Accessor<IncremarkLocale>\n}>()\n\nexport interface ConfigProviderProps {\n /** locale 对象 */\n locale?: IncremarkLocale\n children?: JSX.Element\n}\n\nexport const ConfigProvider: Component<ConfigProviderProps> = (props) => {\n const [locale, setLocale] = createSignal<IncremarkLocale>(props.locale || zhCN)\n\n // 监听 props.locale 变化\n createMemo(() => {\n setLocale(props.locale || zhCN)\n })\n\n return (\n <LocaleContext.Provider value={{ locale }}>\n {props.children}\n </LocaleContext.Provider>\n )\n}\n\n/**\n * 翻译函数类型\n */\nexport type TranslatorFn = (key: string) => string\n\nexport function useLocale(): TranslatorFn {\n const context = useContext(LocaleContext)\n const locale = context?.locale || (() => zhCN)\n\n // 返回翻译函数,跟 Vue 的 API 对齐\n return (key: string) => {\n const keys = key.split('.')\n let value: any = locale()\n for (const k of keys) {\n value = value?.[k]\n }\n return value || key\n }\n}\n","import { useContext } from 'solid-js'\nimport { DefinationsContext, type DefinationsContextValue } from './useProvideDefinations'\n\n/**\n * Support definations and footnoteDefinitions\n * @returns DefinationsContextValue\n */\nexport function useDefinationsContext(): DefinationsContextValue {\n const context = useContext(DefinationsContext)\n\n if (!context) {\n throw new Error('DefinationsContext not found. Make sure you are using this within a component that provides DefinationsContext.')\n }\n\n return context\n}\n","import { createSignal, type Accessor } from 'solid-js'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface UseStreamRendererOptions {\n /** 初始块列表 */\n initialBlocks?: ParsedBlock[]\n}\n\nexport interface UseStreamRendererReturn {\n /** 块列表 */\n blocks: Accessor<ParsedBlock[]>\n /** 设置块列表 */\n setBlocks: (blocks: ParsedBlock[]) => void\n /** 添加块 */\n addBlocks: (blocks: ParsedBlock[]) => void\n /** 清空块列表 */\n clearBlocks: () => void\n /** 块数量 */\n blockCount: Accessor<number>\n}\n\n/**\n * SolidJS 流式渲染 Hook\n *\n * 用于管理流式渲染的块列表状态\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions = {}): UseStreamRendererReturn {\n const [blocks, setBlocks] = createSignal<ParsedBlock[]>(options.initialBlocks ?? [])\n\n function addBlocks(newBlocks: ParsedBlock[]) {\n setBlocks(prev => [...prev, ...newBlocks])\n }\n\n function clearBlocks() {\n setBlocks([])\n }\n\n const blockCount = () => blocks().length\n\n return {\n blocks,\n setBlocks,\n addBlocks,\n clearBlocks,\n blockCount\n }\n}\n","import { createSignal, createEffect, type Accessor } from 'solid-js'\nimport {\n createBlockTransformer,\n type RootContent,\n type DisplayBlock,\n type TransformerOptions,\n type TransformerPlugin\n} from '@incremark/core'\n\nexport interface UseBlockTransformerOptions extends Omit<TransformerOptions, 'onChange'> {}\n\nexport interface UseBlockTransformerReturn {\n /** 转换后的块列表 */\n displayBlocks: Accessor<DisplayBlock<RootContent>[]>\n /** 是否正在处理 */\n isProcessing: Accessor<boolean>\n /** 是否已暂停 */\n isPaused: Accessor<boolean>\n /** 推送新的块进行转换 */\n push: (blocks: any[]) => void\n /** 跳过动画 */\n skip: () => void\n /** 暂停 */\n pause: () => void\n /** 恢复 */\n resume: () => void\n /** 重置 */\n reset: () => void\n /** 销毁 */\n destroy: () => void\n /** 更新配置 */\n setOptions: (options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) => void\n}\n\n/**\n * SolidJS 块转换器 Hook\n *\n * 用于管理增量内容的动画效果和转换逻辑\n */\nexport function useBlockTransformer(options: UseBlockTransformerOptions = {}): UseBlockTransformerReturn {\n const [displayBlocks, setDisplayBlocks] = createSignal<DisplayBlock<RootContent>[]>([])\n const [isProcessing, setIsProcessing] = createSignal(false)\n const [isPaused, setIsPaused] = createSignal(false)\n\n const transformer = createBlockTransformer<RootContent>({\n charsPerTick: options.charsPerTick ?? [1, 3],\n tickInterval: options.tickInterval ?? 30,\n effect: options.effect ?? 'none',\n pauseOnHidden: options.pauseOnHidden ?? true,\n plugins: options.plugins,\n onChange: (blocks) => {\n setDisplayBlocks(blocks as DisplayBlock<RootContent>[])\n setIsProcessing(transformer?.isProcessing() ?? false)\n setIsPaused(transformer?.isPausedState() ?? false)\n }\n })\n\n function push(blocks: any[]) {\n transformer.push(blocks)\n }\n\n function skip() {\n transformer.skip()\n }\n\n function pause() {\n transformer.pause()\n }\n\n function resume() {\n transformer.resume()\n }\n\n function reset() {\n transformer.reset()\n }\n\n function destroy() {\n transformer.destroy()\n }\n\n function setOptions(opts: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) {\n transformer.setOptions(opts)\n }\n\n return {\n displayBlocks,\n isProcessing,\n isPaused,\n push,\n skip,\n pause,\n resume,\n reset,\n destroy,\n setOptions\n }\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Component, JSX } from 'solid-js'\nimport type { ParsedBlock } from '@incremark/core'\nimport { For, Show, mergeProps } from 'solid-js'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport type { UseIncremarkReturn } from '../composables/useIncremark'\nimport type { ComponentMap, CodeBlockConfig } from '../types'\nimport IncremarkRenderer from './IncremarkRenderer'\nimport { IncremarkFootnotes } from './IncremarkFootnotes'\n\nexport interface IncremarkProps {\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks?: ParsedBlock[] | (() => ParsedBlock[])\n /** 内容是否完全显示完成(用于控制脚注等需要在内容完全显示后才出现的元素)\n * 如果传入了 incremark,则会自动使用 incremark.isDisplayComplete,此 prop 被忽略 */\n isDisplayComplete?: boolean | (() => boolean)\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */\n customContainers?: Record<string, Component<any>>\n /** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */\n customCodeBlocks?: Record<string, Component<any>>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n /** 可选:useIncremark 返回的对象(用于自动注入数据) */\n incremark?: UseIncremarkReturn\n}\n\n/**\n * Incremark 主组件(内部渲染逻辑)\n */\nfunction IncremarkInner(props: IncremarkProps) {\n const mergedProps = mergeProps({\n isDisplayComplete: false,\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }, props)\n\n const components = () => mergedProps.components || {}\n const customContainers = () => mergedProps.customContainers || {}\n const customCodeBlocks = () => mergedProps.customCodeBlocks || {}\n const codeBlockConfigs = () => mergedProps.codeBlockConfigs || {}\n\n const {\n footnoteReferenceOrder\n } = useDefinationsContext()\n\n // 计算实际使用的 blocks 和 isDisplayComplete\n const actualBlocks = () => {\n if (mergedProps.incremark) {\n // blocks 现在是 store 数组,不是函数\n return mergedProps.incremark.blocks\n }\n return typeof mergedProps.blocks === 'function' ? mergedProps.blocks() : mergedProps.blocks\n }\n\n const actualIsDisplayComplete = () => {\n // 优先使用 incremark 提供的 isDisplayComplete(已考虑打字机等状态)\n if (mergedProps.incremark) {\n return mergedProps.incremark.isDisplayComplete()\n }\n // 否则使用用户传入的 isDisplayComplete\n return typeof mergedProps.isDisplayComplete === 'function' ? mergedProps.isDisplayComplete() : mergedProps.isDisplayComplete\n }\n\n return (\n <div class=\"incremark\">\n {/* 主要内容块 */}\n <For each={actualBlocks()}>\n {(block) => (\n <Show\n when={block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition'}\n >\n <div\n class={\n `incremark-block ${\n block.status === 'completed' ? mergedProps.completedClass : mergedProps.pendingClass\n }${\n mergedProps.showBlockStatus ? ' incremark-show-status' : ''\n }${\n (block as any).isLastPending ? ' incremark-last-pending' : ''\n }`\n }\n >\n <IncremarkRenderer\n node={block.node}\n customContainers={customContainers()}\n customCodeBlocks={customCodeBlocks()}\n codeBlockConfigs={codeBlockConfigs()}\n components={components()}\n blockStatus={block.status}\n />\n </div>\n </Show>\n )}\n </For>\n\n {/* 脚注列表(仅在内容完全显示后显示) */}\n <Show when={actualIsDisplayComplete() && footnoteReferenceOrder().length > 0}>\n <IncremarkFootnotes />\n </Show>\n </div>\n )\n}\n\n/**\n * Incremark 主组件\n *\n * 渲染增量解析的 Markdown 块列表\n */\nexport const Incremark: Component<IncremarkProps> = (props) => {\n return <IncremarkInner {...props} />\n}\n\nexport default Incremark\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent, HTML, Code } from 'mdast'\nimport { Component, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport type { ComponentMap, CodeBlockConfig } from '../types'\nimport type { ContainerNode } from './IncremarkContainer'\nimport { IncremarkHeading } from './IncremarkHeading'\nimport { IncremarkParagraph } from './IncremarkParagraph'\nimport IncremarkCode from './IncremarkCode'\nimport { IncremarkList } from './IncremarkList'\nimport { IncremarkTable } from './IncremarkTable'\nimport { IncremarkBlockquote } from './IncremarkBlockquote'\nimport { IncremarkThematicBreak } from './IncremarkThematicBreak'\nimport { IncremarkMath } from './IncremarkMath'\nimport { IncremarkHtmlElement } from './IncremarkHtmlElement'\nimport { IncremarkContainer } from './IncremarkContainer'\nimport { IncremarkDefault } from './IncremarkDefault'\n\ntype ExtendedRootContent = RootContent | ContainerNode\n\nexport interface IncremarkRendererProps {\n node: ExtendedRootContent\n customContainers?: Record<string, Component<any>>\n customCodeBlocks?: Record<string, Component<any>>\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n blockStatus?: 'pending' | 'stable' | 'completed'\n components?: ComponentMap\n}\n\n// 默认组件映射\nconst defaultComponentMap: Record<string, Component<any>> = {\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 htmlElement: IncremarkHtmlElement,\n containerDirective: IncremarkContainer,\n leafDirective: IncremarkContainer,\n textDirective: IncremarkContainer,\n}\n\nfunction getComponent(type: string, customComponents?: ComponentMap): Component<any> {\n const map = { ...defaultComponentMap, ...customComponents }\n return map[type] || IncremarkDefault\n}\n\n/**\n * 类型守卫:检查是否是容器节点\n */\nfunction isContainerNode(node: ExtendedRootContent): node is ContainerNode {\n const type = (node as any).type\n return type === 'containerDirective' ||\n type === 'leafDirective' ||\n type === 'textDirective'\n}\n\n/**\n * 类型守卫:检查是否是 html 节点\n */\nfunction isHtmlNode(node: ExtendedRootContent): node is HTML {\n return node.type === 'html'\n}\n\n/**\n * IncremarkRenderer 组件\n * 路由不同节点类型到适当的组件\n */\nexport const IncremarkRenderer: Component<IncremarkRendererProps> = (props) => {\n return (\n <>\n {/* HTML 节点:渲染为代码块显示源代码 */}\n <Show when={isHtmlNode(props.node)}>\n <pre class=\"incremark-html-code\"><code>{(props.node as HTML).value}</code></pre>\n </Show>\n\n {/* 容器节点:使用容器组件,传递 customContainers */}\n <Show when={isContainerNode(props.node) && !isHtmlNode(props.node)}>\n <IncremarkContainer\n node={props.node as ContainerNode}\n customContainers={props.customContainers}\n />\n </Show>\n\n {/* 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus */}\n <Show\n when={(props.node as RootContent).type === 'code' && !isHtmlNode(props.node) && !isContainerNode(props.node)}\n >\n <IncremarkCode\n node={props.node as Code}\n customCodeBlocks={props.customCodeBlocks}\n codeBlockConfigs={props.codeBlockConfigs}\n blockStatus={props.blockStatus}\n defaultCodeComponent={props.components?.['code']}\n />\n </Show>\n\n {/* 其他节点:使用对应组件 */}\n <Show\n when={\n (props.node as RootContent).type !== 'code' &&\n !isHtmlNode(props.node) &&\n !isContainerNode(props.node)\n }\n >\n <Dynamic\n component={getComponent((props.node as RootContent).type, props.components)}\n node={props.node as RootContent}\n />\n </Show>\n </>\n )\n}\n\nexport default IncremarkRenderer\n","/* @jsxImportSource solid-js */\n\nimport type { Heading } from 'mdast'\nimport { Component } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkHeadingProps {\n node: Heading\n}\n\nexport const IncremarkHeading: Component<IncremarkHeadingProps> = (props) => {\n const tag = () => `h${props.node.depth}`\n\n return (\n <Dynamic component={tag()} class={`incremark-heading h${props.node.depth}`}>\n <IncremarkInline nodes={props.node.children} />\n </Dynamic>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { PhrasingContent, RootContent, ImageReference, LinkReference } from 'mdast'\nimport { type TextChunk, type TextNodeWithChunks, hasChunks, getStableText, isHtmlNode } from '@incremark/shared'\nimport { Component, For, Index, Show } from 'solid-js'\nimport { IncremarkMath } from './IncremarkMath'\nimport { IncremarkHtmlElement } from './IncremarkHtmlElement'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\n\n// Math 节点类型\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n}\n\n// HtmlElement 节点类型\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n}\n\n/**\n * 类型守卫:检查是否是 htmlElement 节点\n */\nfunction isHtmlElementNode(node: PhrasingContent): node is PhrasingContent & HtmlElementNode {\n return (node as unknown as HtmlElementNode).type === 'htmlElement'\n}\n\n/**\n * 类型守卫:检查是否是 imageReference 节点\n */\nfunction isImageReference(node: PhrasingContent): node is ImageReference {\n return node.type === 'imageReference'\n}\n\n/**\n * 类型守卫:检查是否是 linkReference 节点\n */\nfunction isLinkReference(node: PhrasingContent): node is LinkReference {\n return node.type === 'linkReference'\n}\n\nexport interface IncremarkInlineProps {\n nodes: PhrasingContent[]\n}\n\nexport const IncremarkInline: Component<IncremarkInlineProps> = (props) => {\n const { definations, footnoteDefinitions } = useDefinationsContext()\n\n /**\n * 获取节点的 chunks(类型安全)\n */\n function getChunks(node: PhrasingContent): TextChunk[] | undefined {\n if (hasChunks(node)) {\n return (node as TextNodeWithChunks).chunks\n }\n return undefined\n }\n\n /**\n * 类型守卫:检查是否是 inlineMath 节点\n */\n function isInlineMath(node: PhrasingContent): node is PhrasingContent & MathNode {\n return (node as unknown as MathNode).type === 'inlineMath'\n }\n\n return (\n <>\n <For each={props.nodes}>\n {(node, idx) => (\n <>\n {/* 文本(支持 chunks 渐入动画) */}\n <Show when={node.type === 'text'}>\n {/* 稳定文本(已经显示过的部分,无动画) */}\n {getStableText(node as TextNodeWithChunks)}\n {/* 新增的 chunk 部分(带渐入动画) */}\n {/* 使用 Index 而不是 For,因为 Index 按索引跟踪元素,不会因为对象引用变化而重新创建 DOM 元素 */}\n {/* 这样 CSS 动画只在元素首次创建时播放,后续更新不会重新触发动画 */}\n <Index each={getChunks(node) || []}>\n {(chunk, idx) => (\n <span\n class=\"incremark-fade-in\"\n data-chunk-key={chunk().createdAt}\n >\n {chunk().text}\n </span>\n )}\n </Index>\n </Show>\n\n {/* 行内公式 */}\n <Show when={isInlineMath(node)}>\n <IncremarkMath node={node as unknown as MathNode} />\n </Show>\n\n {/* htmlElement 节点(结构化的 HTML 元素) */}\n <Show when={isHtmlElementNode(node)}>\n <IncremarkHtmlElement node={node as unknown as HtmlElementNode} />\n </Show>\n\n {/* HTML 节点(原始 HTML,如未启用 htmlTree 选项) */}\n <Show when={isHtmlNode(node)}>\n <span class=\"incremark-inline-html\" innerHTML={(node as any).value} />\n </Show>\n\n {/* 加粗 */}\n <Show when={node.type === 'strong'}>\n <strong>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </strong>\n </Show>\n\n {/* 斜体 */}\n <Show when={node.type === 'emphasis'}>\n <em>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </em>\n </Show>\n\n {/* 行内代码 */}\n <Show when={node.type === 'inlineCode'}>\n <code class=\"incremark-inline-code\">{(node as any).value}</code>\n </Show>\n\n {/* 链接 */}\n <Show when={node.type === 'link'}>\n <a\n class=\"incremark-link\"\n href={(node as any).url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </a>\n </Show>\n\n {/* 图片 */}\n <Show when={node.type === 'image'}>\n <img\n class=\"incremark-image\"\n src={(node as any).url}\n alt={(node as any).alt || ''}\n title={(node as any).title || undefined}\n loading=\"lazy\"\n />\n </Show>\n\n {/* 引用式图片(imageReference) */}\n <Show when={isImageReference(node)}>\n <Show\n when={definations()[(node as ImageReference).identifier]}\n fallback={\n <span class=\"incremark-image-ref-missing\">\n ![{(node as ImageReference).alt}][{(node as ImageReference).identifier || (node as ImageReference).label}]\n </span>\n }\n >\n <img\n class=\"incremark-image incremark-reference-image\"\n src={definations()[(node as ImageReference).identifier].url}\n alt={(node as ImageReference).alt || ''}\n title={definations()[(node as ImageReference).identifier].title || undefined}\n loading=\"lazy\"\n />\n </Show>\n </Show>\n\n {/* 引用式链接(linkReference) */}\n <Show when={isLinkReference(node)}>\n <Show\n when={definations()[(node as LinkReference).identifier]}\n fallback={\n <span class=\"incremark-link-ref-missing\">\n [{((node as LinkReference).children as any[]).map((c: any) => c.value).join('')}][{(node as LinkReference).identifier || (node as LinkReference).label}]\n </span>\n }\n >\n <a\n class=\"incremark-link incremark-reference-link\"\n href={definations()[(node as LinkReference).identifier].url}\n title={definations()[(node as LinkReference).identifier].title || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline nodes={((node as LinkReference).children as PhrasingContent[])} />\n </a>\n </Show>\n </Show>\n\n {/* 脚注引用(footnoteReference) */}\n <Show when={node.type === 'footnoteReference'}>\n <sup class=\"incremark-footnote-ref\">\n <a href={`#fn-${(node as any).identifier}`} id={`fnref-${(node as any).identifier}`}>\n [{(node as any).identifier}]\n </a>\n </sup>\n </Show>\n\n {/* 换行 */}\n <Show when={node.type === 'break'}>\n <br />\n </Show>\n\n {/* 删除线 */}\n <Show when={node.type === 'delete'}>\n <del>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </del>\n </Show>\n </>\n )}\n </For>\n </>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { Component, createSignal, createEffect, onCleanup, Show } from 'solid-js'\nimport type { JSX } from 'solid-js'\n\n// Math 节点类型(来自 mdast-util-math)\nexport interface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nexport interface IncremarkMathProps {\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n}\n\nexport const IncremarkMath: Component<IncremarkMathProps> = (props) => {\n const [renderedHtml, setRenderedHtml] = createSignal('')\n const [isLoading, setIsLoading] = createSignal(false)\n\n const isInline = () => props.node.type === 'inlineMath'\n const formula = () => props.node.value\n\n let renderTimer: ReturnType<typeof setTimeout> | null = null\n let katexRef: any = null\n\n // 带防抖动的渲染\n function scheduleRender() {\n if (!formula()) {\n setRenderedHtml('')\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n setIsLoading(true)\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay ?? 0)\n }\n\n async function doRender() {\n if (!formula()) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef) {\n const katexModule = await import('katex')\n katexRef = katexModule.default\n }\n\n const katex = katexRef\n setRenderedHtml(katex.renderToString(formula(), {\n displayMode: !isInline(),\n throwOnError: false,\n strict: false\n }))\n } catch {\n // 静默失败,可能是公式不完整\n setRenderedHtml('')\n } finally {\n setIsLoading(false)\n }\n }\n\n createEffect(() => {\n scheduleRender()\n })\n\n onCleanup(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n })\n\n // 行内公式\n if (isInline()) {\n return (\n <span class=\"incremark-math-inline\">\n <Show when={renderedHtml() && !isLoading()}>\n <span innerHTML={renderedHtml()} />\n </Show>\n <Show when={!renderedHtml() || isLoading()}>\n <code class=\"math-source\">{formula()}</code>\n </Show>\n </span>\n )\n }\n\n // 块级公式\n return (\n <div class=\"incremark-math-block\">\n <Show when={renderedHtml() && !isLoading()}>\n <div innerHTML={renderedHtml()} class=\"math-rendered\" />\n </Show>\n <Show when={!renderedHtml() || isLoading()}>\n <pre class=\"math-source-block\"><code>{formula()}</code></pre>\n </Show>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent, PhrasingContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport type { JSX } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { IncremarkInline } from './IncremarkInline'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\n/**\n * HtmlElementNode 类型定义(与 @incremark/core 中的定义一致)\n */\nexport interface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n data?: {\n rawHtml?: string\n parsed?: boolean\n originalType?: string\n }\n}\n\nexport interface IncremarkHtmlElementProps {\n node: HtmlElementNode\n}\n\n/**\n * 行内元素列表\n */\nconst INLINE_ELEMENTS = [\n 'a', 'abbr', 'acronym', 'b', 'bdo', 'big', 'br', 'button', 'cite',\n 'code', 'dfn', 'em', 'i', 'img', 'input', 'kbd', 'label', 'map',\n 'object', 'output', 'q', 'samp', 'script', 'select', 'small',\n 'span', 'strong', 'sub', 'sup', 'textarea', 'time', 'tt', 'var'\n]\n\n/**\n * 自闭合元素列表\n */\nconst VOID_ELEMENTS = [\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]\n\n/**\n * 判断是否是行内元素\n */\nfunction isInlineElement(tagName: string): boolean {\n return INLINE_ELEMENTS.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断是否是自闭合元素\n */\nfunction isVoidElement(tagName: string): boolean {\n return VOID_ELEMENTS.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断子节点是否都是行内内容\n */\nfunction hasOnlyInlineChildren(children: RootContent[]): boolean {\n if (!children || children.length === 0) return true\n\n return children.every(child => {\n const type = child.type\n const inlineTypes = ['text', 'strong', 'emphasis', 'inlineCode', 'link', 'image', 'break', 'html', 'htmlElement']\n if (inlineTypes.includes(type)) {\n if (type === 'htmlElement') {\n return isInlineElement((child as unknown as HtmlElementNode).tagName)\n }\n return true\n }\n return false\n })\n}\n\n/**\n * 渲染子节点\n */\nfunction renderChildren(children: RootContent[]): JSX.Element {\n if (!children || children.length === 0) return null as unknown as JSX.Element\n\n // 如果子节点都是行内内容,使用 IncremarkInline\n if (hasOnlyInlineChildren(children)) {\n return <IncremarkInline nodes={children as PhrasingContent[]} />\n }\n\n // 否则递归渲染每个子节点\n return (\n <For each={children}>\n {(child, idx) => {\n // htmlElement 类型\n if (child.type === 'htmlElement') {\n return <IncremarkHtmlElement node={child as unknown as HtmlElementNode} />\n }\n\n // 文本节点\n if (child.type === 'text') {\n return <>{(child as { value: string }).value}</>\n }\n\n // 常见行内类型\n if (['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type)) {\n return <IncremarkInline nodes={[child as PhrasingContent]} />\n }\n\n // 段落\n if (child.type === 'paragraph') {\n return (\n <p>\n <IncremarkInline nodes={(child as { children: PhrasingContent[] }).children} />\n </p>\n )\n }\n\n // 其他类型使用 IncremarkRenderer\n return <IncremarkRenderer node={child} />\n }}\n </For>\n )\n}\n\n/**\n * IncremarkHtmlElement 组件\n *\n * 渲染结构化的 HTML 元素节点,使用 Dynamic 组件支持动态标签名\n */\nexport const IncremarkHtmlElement: Component<IncremarkHtmlElementProps> = (props) => {\n const tagName = () => props.node.tagName\n const attrs = () => props.node.attrs || {}\n const children = () => props.node.children || []\n\n // 自闭合元素没有子节点\n const isVoid = () => isVoidElement(tagName())\n\n return (\n <Dynamic\n component={tagName() as keyof JSX.IntrinsicElements}\n {...attrs()}\n class={`incremark-html-element incremark-${tagName()}`}\n >\n <Show when={!isVoid()}>\n {renderChildren(children())}\n </Show>\n </Dynamic>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Paragraph } from 'mdast'\nimport { Component } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkParagraphProps {\n node: Paragraph\n}\n\nexport const IncremarkParagraph: Component<IncremarkParagraphProps> = (props) => {\n return (\n <p class=\"incremark-paragraph\">\n <IncremarkInline nodes={props.node.children} />\n </p>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createMemo, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport type { CodeBlockConfig } from '../types'\nimport { IncremarkCodeMermaid } from './IncremarkCodeMermaid'\nimport { IncremarkCodeDefault, type IncremarkCodeDefaultProps } from './IncremarkCodeDefault'\n\nexport interface IncremarkCodeProps {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n /** 自定义代码块组件映射,key 为代码语言名称 */\n customCodeBlocks?: Record<string, Component<any>>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 块状态,用于判断是否使用自定义组件 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n /** 默认代码块渲染组件(当不是 mermaid 且没有自定义组件时使用) */\n defaultCodeComponent?: Component<IncremarkCodeDefaultProps>\n}\n\nexport const IncremarkCode: Component<IncremarkCodeProps> = (props) => {\n const language = () => props.node.lang || 'text'\n\n // 检查是否有自定义代码块组件\n const CustomCodeBlock = () => props.customCodeBlocks?.[language()]\n\n // 检查该语言的配置\n const shouldUseCustomCodeBlock = () => {\n const component = props.customCodeBlocks?.[language()]\n if (!component) return false\n\n // 检查该语言的配置\n const config = props.codeBlockConfigs?.[language()]\n\n // 如果配置了 takeOver 为 true,则从一开始就使用\n if (config?.takeOver) {\n return true\n }\n\n // 否则,默认行为:只在 completed 状态使用\n return props.blockStatus === 'completed'\n }\n\n // 判断是否为 mermaid\n const isMermaid = () => language() === 'mermaid'\n\n const DefaultCodeComponent = () => props.defaultCodeComponent ?? IncremarkCodeDefault\n\n // Get custom component props\n const customProps = () => ({\n codeStr: props.node.value,\n lang: language(),\n completed: props.blockStatus === 'completed',\n takeOver: props.codeBlockConfigs?.[language()]?.takeOver\n })\n\n // Get default component props\n const defaultProps = () => ({\n node: props.node,\n theme: props.theme,\n fallbackTheme: props.fallbackTheme,\n disableHighlight: props.disableHighlight,\n blockStatus: props.blockStatus\n })\n\n // Get mermaid props\n const mermaidProps = () => ({\n node: props.node,\n mermaidDelay: props.mermaidDelay\n })\n\n return (\n <>\n {/* 自定义代码块组件 */}\n <Show when={CustomCodeBlock() && shouldUseCustomCodeBlock()}>\n <Dynamic\n component={CustomCodeBlock()!}\n {...customProps()}\n />\n </Show>\n\n {/* Mermaid 图表 */}\n <Show when={isMermaid() && !shouldUseCustomCodeBlock()}>\n <IncremarkCodeMermaid\n node={props.node}\n mermaidDelay={props.mermaidDelay}\n />\n </Show>\n\n {/* 默认代码块渲染(支持用户自定义,使用 stream 高亮) */}\n <Show when={!isMermaid() && !shouldUseCustomCodeBlock()}>\n <Dynamic\n component={DefaultCodeComponent()}\n {...defaultProps()}\n />\n </Show>\n </>\n )\n}\n\nexport default IncremarkCode\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createEffect, createSignal, onCleanup, onMount, Show } from 'solid-js'\nimport type { Mermaid } from 'mermaid'\nimport { GravityMermaid, LucideCode, LucideEye, LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport { useLocale } from '../composables/useLocale'\nimport { SvgIcon } from './SvgIcon'\n\nexport interface IncremarkCodeMermaidProps {\n node: Code\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n}\n\n/**\n * Mermaid 图表渲染组件\n *\n * 支持 Mermaid 图表的流式渲染和防抖更新\n */\nexport const IncremarkCodeMermaid: Component<IncremarkCodeMermaidProps> = (props) => {\n const [mermaidSvg, setMermaidSvg] = createSignal('')\n const [mermaidError, setMermaidError] = createSignal('')\n const [mermaidLoading, setMermaidLoading] = createSignal(false)\n const [copied, setCopied] = createSignal(false)\n\n // 视图模式:'preview' | 'source'\n const [mermaidViewMode, setMermaidViewMode] = createSignal<'preview' | 'source'>('preview')\n\n let mermaidInstance: Mermaid | null = null\n let renderTimer: ReturnType<typeof setTimeout> | null = null\n let copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n let chartId = `mermaid-${Math.random().toString(36).substr(2, 9)}`\n\n const code = () => props.node.value\n\n // 使用 i18n\n const t = useLocale()\n\n function toggleMermaidView() {\n setMermaidViewMode(prev => prev === 'preview' ? 'source' : 'preview')\n }\n\n // 初始化 Mermaid\n onMount(async () => {\n try {\n // 动态导入 mermaid\n const mermaidModule = await import('mermaid')\n const mermaid = mermaidModule.default\n\n // 初始化 mermaid\n mermaid.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose',\n suppressErrorRendering: true\n })\n\n mermaidInstance = mermaid\n } catch (e) {\n console.warn('Failed to initialize Mermaid:', e)\n setMermaidError('Failed to initialize')\n }\n })\n\n // 带防抖动的渲染\n function scheduleRender() {\n if (!code()) {\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n setMermaidLoading(true)\n setMermaidError('')\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.mermaidDelay ?? 500)\n }\n\n async function doRender() {\n if (!code() || !mermaidInstance) return\n\n try {\n const { svg } = await mermaidInstance.render(chartId, code())\n setMermaidSvg(svg)\n setMermaidError('')\n } catch (e) {\n // 图表不完整或其他错误,静默处理\n setMermaidError('')\n setMermaidSvg('')\n } finally {\n setMermaidLoading(false)\n }\n }\n\n // 监听代码变化,重新渲染\n createEffect(() => {\n scheduleRender()\n })\n\n onCleanup(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n })\n\n async function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code())\n setCopied(true)\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n setCopied(false)\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n }\n\n return (\n <div class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">\n <SvgIcon svg={GravityMermaid} sizeClass=\"language-icon\" />\n MERMAID\n </span>\n <div class=\"mermaid-actions\">\n <button\n class=\"code-btn\"\n onClick={toggleMermaidView}\n type=\"button\"\n disabled={!mermaidSvg()}\n aria-label={mermaidViewMode() === 'preview' ? t('mermaid.viewSource') : t('mermaid.preview')}\n title={mermaidViewMode() === 'preview' ? 'View Source' : 'Preview'}\n >\n <SvgIcon svg={mermaidViewMode() === 'preview' ? LucideCode : LucideEye} />\n </button>\n <button\n class=\"code-btn\"\n onClick={copyCode}\n type=\"button\"\n aria-label={copied() ? t('mermaid.copied') : t('mermaid.copy')}\n title={copied() ? 'Copied!' : 'Copy'}\n >\n <SvgIcon svg={copied() ? LucideCopyCheck : LucideCopy} />\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n {/* 加载中 */}\n <Show when={mermaidLoading() && !mermaidSvg()}>\n <div class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </div>\n </Show>\n {/* 源码模式 */}\n <Show when={mermaidViewMode() === 'source' && !mermaidLoading()}>\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </Show>\n {/* 预览模式 */}\n <Show when={mermaidViewMode() === 'preview' && mermaidSvg() && !mermaidLoading()}>\n <div innerHTML={mermaidSvg()} class=\"mermaid-svg\" />\n </Show>\n {/* 无法渲染时显示源码 */}\n <Show when={!mermaidSvg() && !mermaidLoading() && mermaidViewMode() === 'preview'}>\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </Show>\n </div>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Component } from 'solid-js'\n\nexport interface SvgIconProps {\n /** SVG 字符串内容 */\n svg: string\n /** 图标大小 class,如 incremark-icon--sm, incremark-icon--md 等 */\n sizeClass?: string\n}\n\n/**\n * SvgIcon 组件\n *\n * 直接渲染 SVG 字符串\n */\nexport const SvgIcon: Component<SvgIconProps> = (props) => {\n return (\n <span\n classList={{\n 'incremark-icon': true,\n [props.sizeClass || '']: !!props.sizeClass\n }}\n innerHTML={props.svg}\n aria-hidden=\"true\"\n />\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createEffect, createSignal, onCleanup, Show } from 'solid-js'\nimport { LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport { useShiki } from '../composables/useShiki'\nimport { useLocale } from '../composables/useLocale'\nimport { CachedCodeRenderer } from './CachedCodeRenderer'\nimport { SvgIcon } from './SvgIcon'\n\nexport interface IncremarkCodeDefaultProps {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** block 状态 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n}\n\nexport const IncremarkCodeDefault: Component<IncremarkCodeDefaultProps> = (props) => {\n const [copied, setCopied] = createSignal(false)\n\n const language = () => props.node.lang || 'text'\n const code = () => props.node.value\n\n // 使用 i18n\n const t = useLocale()\n\n // 使用 Shiki 单例管理器\n const { highlighterInfo, initHighlighter } = useShiki(props.theme ?? 'github-dark')\n\n // 语言是否已加载完成\n const [isLanguageLoaded, setIsLanguageLoaded] = createSignal(false)\n\n // 是否应该启用高亮(需要有代码内容才开始高亮逻辑)\n const shouldEnableHighlight = () => {\n return !props.disableHighlight && code() && code().length > 0\n }\n\n // 初始化 highlighter 并加载语言\n // 只有当存在代码内容时才开始加载语言,避免流式渲染时语言标识不完整导致的错误\n createEffect(async () => {\n const info = highlighterInfo()\n const lang = language()\n const shouldHighlight = shouldEnableHighlight()\n\n // 如果不需要高亮,直接返回\n if (!shouldHighlight) {\n return\n }\n\n if (!info) {\n await initHighlighter()\n } else if (lang && lang !== 'text') {\n // 检查语言是否已加载\n if (!info.loadedLanguages.has(lang as any)) {\n try {\n setIsLanguageLoaded(false)\n // 检查语言是否被 shiki 支持\n const supportedLangs = info.highlighter.getLoadedLanguages()\n const bundledLangs = await import('shiki').then(m => Object.keys(m.bundledLanguages || {}))\n const isSupported = supportedLangs.includes(lang) || bundledLangs.includes(lang)\n\n if (isSupported) {\n await info.highlighter.loadLanguage(lang as any)\n info.loadedLanguages.add(lang as any)\n }\n // 无论是否支持,都标记为已加载(不支持的语言会 fallback 到纯文本显示)\n setIsLanguageLoaded(true)\n } catch {\n // 语言加载失败,标记为已加载(回退到无高亮)\n setIsLanguageLoaded(true)\n }\n } else {\n setIsLanguageLoaded(true)\n }\n } else {\n // text 语言不需要加载\n setIsLanguageLoaded(true)\n }\n })\n\n let copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\n onCleanup(() => {\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n })\n\n async function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code())\n setCopied(true)\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n setCopied(false)\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n }\n\n return (\n <div class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{language()}</span>\n <button\n class=\"code-btn\"\n onClick={copyCode}\n type=\"button\"\n aria-label={copied() ? t('code.copied') : t('code.copy')}\n title={copied() ? 'Copied!' : 'Copy'}\n >\n <SvgIcon svg={copied() ? LucideCopyCheck : LucideCopy} />\n </button>\n </div>\n <div class=\"code-content\">\n <div class=\"shiki-wrapper\">\n {/* Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) */}\n <Show\n when={shouldEnableHighlight() && highlighterInfo() && isLanguageLoaded()}\n fallback={\n // 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示)\n <pre class=\"code-fallback\"><code>{code()}</code></pre>\n }\n >\n <CachedCodeRenderer\n code={code()}\n lang={language()}\n theme={props.theme ?? 'github-dark'}\n highlighter={highlighterInfo()!.highlighter}\n />\n </Show>\n </div>\n </div>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\n/**\n * CachedCodeRenderer - 使用 shiki-stream 实现流式代码高亮\n *\n * 基于 shiki-stream 的 SolidJS 实现,参考 Vue/React 版本\n *\n * 与 Vue/React 版本保持一致:\n * - 在组件初始化时创建 stream(不在 onMount 中)\n * - 直接消费 stream,不使用单独的 Renderer 组件\n * - hasStreamError 状态和错误处理\n * - class: 'shiki incremark-code-stream'\n */\nimport type { ThemedToken } from '@shikijs/core'\nimport { CodeToTokenTransformStream } from 'shiki-stream'\nimport { getTokenStyleObject } from '@shikijs/core'\nimport { createEffect, createSignal, on, onCleanup, onMount, For, Show } from 'solid-js'\nimport { batch } from 'solid-js'\nimport { Component } from 'solid-js'\n\nexport interface CachedCodeRendererProps {\n code: string\n lang: string\n theme: string\n highlighter: any\n onStreamStart?: () => void\n onStreamEnd?: () => void\n onStreamError?: () => void\n}\n\n// SSR 检测:Web Streams API 只在浏览器中可用\nconst isBrowser = typeof window !== 'undefined'\n\nexport const CachedCodeRenderer: Component<CachedCodeRendererProps> = (props) => {\n // Stream 错误状态\n const [hasStreamError, setHasStreamError] = createSignal(false)\n\n // Tokens 数组 - 使用 reactive 模式(与 Vue 一致)\n const [tokens, setTokens] = createSignal<ThemedToken[]>([])\n\n // Stream 相关状态(只在浏览器中初始化)\n const [index, setIndex] = createSignal(0)\n let controller: ReadableStreamController<string> | null = null\n let abortController: AbortController | null = null\n\n // 只在浏览器环境中创建 stream(在 onMount 中,确保只执行一次)\n // 这是与 Vue 版本的关键区别:Vue 的 setup 只执行一次,SolidJS 组件函数可能执行多次\n // 所以使用 onMount 来确保 stream 只创建一次\n onMount(() => {\n if (!isBrowser) return\n\n const textStream = new ReadableStream<string>({\n start(_controller) {\n controller = _controller\n },\n })\n\n try {\n const tokenStream = textStream.pipeThrough(\n new CodeToTokenTransformStream({\n highlighter: props.highlighter,\n lang: props.lang,\n theme: props.theme,\n allowRecalls: true,\n })\n )\n\n // 消费 stream(与 Vue 版本对齐,直接消费)\n let started = false\n\n abortController = new AbortController()\n\n tokenStream.pipeTo(new WritableStream({\n write(token) {\n if (abortController?.signal.aborted) return\n\n if (!started) {\n started = true\n props.onStreamStart?.()\n }\n\n batch(() => {\n if ('recall' in token) {\n // 处理 recall:删除最后 N 个 tokens\n setTokens(ts => ts.slice(0, -token.recall))\n } else {\n // 添加新 token\n setTokens(ts => [...ts, token])\n }\n })\n },\n close: () => {\n if (!abortController?.signal.aborted) {\n props.onStreamEnd?.()\n }\n },\n abort: () => {\n if (!abortController?.signal.aborted) {\n props.onStreamEnd?.()\n }\n },\n }), { signal: abortController.signal }).catch((error) => {\n // Ignore abort errors (normal cleanup)\n if (error instanceof Error && error.name === 'AbortError') {\n return\n }\n // 静默处理不支持的语言错误(不打印到 console)\n if (error instanceof Error && error.message.includes('not found')) {\n setHasStreamError(true)\n return\n }\n console.error('Stream error:', error)\n setHasStreamError(true)\n })\n } catch (error) {\n // 静默处理不支持的语言错误(不打印到 console)\n if (error instanceof Error && error.message.includes('not found')) {\n setHasStreamError(true)\n return\n }\n console.error('Failed to create token stream:', error)\n setHasStreamError(true)\n }\n })\n\n // 监听 code 变化,增量推送到流中(使用 on 进行精确追踪)\n createEffect(on(\n () => props.code,\n (newCode) => {\n if (!isBrowser || !controller || abortController?.signal.aborted) return\n\n // 只处理增量更新:传入新增的部分\n const currentIndex = index()\n if (newCode.length > currentIndex && !hasStreamError()) {\n const incremental = newCode.slice(currentIndex)\n controller.enqueue(incremental as any)\n setIndex(newCode.length)\n }\n },\n ))\n\n // 组件卸载时清理\n onCleanup(() => {\n abortController?.abort()\n controller = null\n setHasStreamError(false)\n setTokens([])\n setIndex(0)\n })\n\n // 渲染(与 Vue/React 版本对齐)\n return (\n <Show\n when={!(hasStreamError() || !isBrowser || tokens().length === 0)}\n fallback={\n // SSR 或错误时渲染原始代码\n <pre class=\"shiki incremark-code-stream\">\n <code>{props.code}</code>\n </pre>\n }\n >\n {/* 正常渲染高亮代码 */}\n <pre class=\"shiki incremark-code-stream\">\n <code>\n <For each={tokens()}>\n {(token) => (\n <span style={token.htmlStyle ?? getTokenStyleObject(token)}>\n {token.content}\n </span>\n )}\n </For>\n </code>\n </pre>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { List, ListItem, RootContent } from 'mdast'\nimport { Component, For, Show, Index } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\nexport interface IncremarkListProps {\n node: List\n}\n\nexport const IncremarkList: Component<IncremarkListProps> = (props) => {\n const ordered = () => props.node.ordered\n const start = () => props.node.start || undefined\n\n /**\n * 获取列表项的内联内容(来自第一个 paragraph)\n */\n function getItemInlineContent(item: ListItem) {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children\n }\n return []\n }\n\n /**\n * 获取列表项的块级子节点(嵌套列表、代码块等)\n * 排除第一个 paragraph,因为它已经被 getItemInlineContent 处理\n */\n function getItemBlockChildren(item: ListItem): RootContent[] {\n return item.children.filter((child, index) => {\n // 第一个 paragraph 已经被处理为内联内容\n if (index === 0 && child.type === 'paragraph') {\n return false\n }\n return true\n })\n }\n\n /**\n * 检查列表项是否有块级子节点(嵌套列表等)\n */\n function hasBlockChildren(item: ListItem): boolean {\n return getItemBlockChildren(item).length > 0\n }\n\n const hasTaskList = () => props.node.children.some(item => item.checked !== null && item.checked !== undefined)\n\n return (\n <Show\n when={ordered()}\n fallback={\n <ul\n class={`incremark-list${hasTaskList() ? ' task-list' : ''}`}\n >\n <Index each={props.node.children}>\n {(item, index) => {\n const itemData = item()\n const isTaskItem = itemData.checked !== null && itemData.checked !== undefined\n\n return (\n <li\n class={`incremark-list-item${isTaskItem ? ' task-item' : ''}`}\n >\n <Show when={isTaskItem}>\n <label class=\"task-label\">\n <input\n type=\"checkbox\"\n checked={itemData.checked ?? false}\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n </span>\n </label>\n </Show>\n <Show when={!isTaskItem}>\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n {/* 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) */}\n <Show when={hasBlockChildren(itemData)}>\n <Index each={getItemBlockChildren(itemData)}>\n {(child) => (\n <IncremarkRenderer node={child()} />\n )}\n </Index>\n </Show>\n </Show>\n </li>\n )\n }}\n </Index>\n </ul>\n }\n >\n <ol\n class={`incremark-list${hasTaskList() ? ' task-list' : ''}`}\n start={start()}\n >\n <Index each={props.node.children}>\n {(item, index) => {\n const itemData = item()\n const isTaskItem = itemData.checked !== null && itemData.checked !== undefined\n\n return (\n <li\n class={`incremark-list-item${isTaskItem ? ' task-item' : ''}`}\n >\n <Show when={isTaskItem}>\n <label class=\"task-label\">\n <input\n type=\"checkbox\"\n checked={itemData.checked ?? false}\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n </span>\n </label>\n </Show>\n <Show when={!isTaskItem}>\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n {/* 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) */}\n <Show when={hasBlockChildren(itemData)}>\n <Index each={getItemBlockChildren(itemData)}>\n {(child) => (\n <IncremarkRenderer node={child()} />\n )}\n </Index>\n </Show>\n </Show>\n </li>\n )\n }}\n </Index>\n </ol>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkTableProps {\n node: Table\n}\n\nexport const IncremarkTable: Component<IncremarkTableProps> = (props) => {\n function getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n }\n\n const firstRow = () => props.node.children[0]\n const remainingRows = () => props.node.children.slice(1)\n\n const getAlignClass = (cellIndex: number) => {\n return `incremark-table-align-${props.node.align?.[cellIndex] || 'left'}`\n }\n\n return (\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <Show when={firstRow()}>\n <thead>\n <tr>\n <For each={firstRow()!.children}>\n {(cell, cellIndex) => (\n <th class={getAlignClass(cellIndex())}>\n <IncremarkInline nodes={getCellContent(cell)} />\n </th>\n )}\n </For>\n </tr>\n </thead>\n </Show>\n <tbody>\n <For each={remainingRows()}>\n {(row) => (\n <tr>\n <For each={row.children}>\n {(cell, cellIndex) => (\n <td class={getAlignClass(cellIndex())}>\n <IncremarkInline nodes={getCellContent(cell)} />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Blockquote } from 'mdast'\nimport { Component, For } from 'solid-js'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\nexport interface IncremarkBlockquoteProps {\n node: Blockquote\n}\n\nexport const IncremarkBlockquote: Component<IncremarkBlockquoteProps> = (props) => {\n return (\n <blockquote class=\"incremark-blockquote\">\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </blockquote>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { ThematicBreak } from 'mdast'\nimport { Component } from 'solid-js'\n\nexport interface IncremarkThematicBreakProps {\n node: ThematicBreak\n}\n\nexport const IncremarkThematicBreak: Component<IncremarkThematicBreakProps> = () => {\n return <hr class=\"incremark-thematic-break\" />\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\n/**\n * 容器节点类型定义\n * 根据 directive 解析后的结构\n */\nexport interface ContainerNode {\n type: 'containerDirective' | 'leafDirective' | 'textDirective'\n name: string\n attributes?: Record<string, string>\n children?: RootContent[]\n}\n\nexport interface IncremarkContainerProps {\n node: ContainerNode\n customContainers?: Record<string, Component<any>>\n}\n\n/**\n * 解析 attributes 字符串为对象\n * directive 的 attributes 可能是字符串格式,需要解析\n */\nfunction parseOptions(attributes?: Record<string, string>): Record<string, any> {\n if (!attributes) return {}\n\n const options: Record<string, any> = {}\n for (const [key, value] of Object.entries(attributes)) {\n // 尝试解析 JSON 值\n try {\n options[key] = JSON.parse(value)\n } catch {\n // 如果不是 JSON,直接使用字符串值\n options[key] = value\n }\n }\n return options\n}\n\n/**\n * 容器组件\n * 渲染自定义容器(如 warning, info, tip)或默认容器\n */\nexport const IncremarkContainer: Component<IncremarkContainerProps> = (props) => {\n const containerName = () => props.node.name\n const options = () => parseOptions(props.node.attributes)\n const CustomContainer = () => props.customContainers?.[containerName()]\n\n // 如果没有自定义容器组件,使用默认渲染\n const hasCustomContainer = () => !!props.customContainers?.[containerName()]\n\n return (\n <Show\n when={hasCustomContainer()}\n fallback={\n <div class={`incremark-container incremark-container-${containerName()}`}>\n <Show when={props.node.children && props.node.children.length > 0}>\n <div class=\"incremark-container-content\">\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </div>\n </Show>\n </div>\n }\n >\n {/* 使用 Dynamic 组件来渲染自定义容器 */}\n <Dynamic\n component={CustomContainer()!}\n name={containerName()}\n options={options()}\n >\n {/* 将容器内容作为 children 传递 */}\n <Show when={props.node.children && props.node.children.length > 0}>\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </Show>\n </Dynamic>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent } from 'mdast'\nimport { Component } from 'solid-js'\n\nexport interface IncremarkDefaultProps {\n node: RootContent\n}\n\n/**\n * 默认渲染组件\n * 用于未知类型的节点,显示调试信息\n */\nexport const IncremarkDefault: Component<IncremarkDefaultProps> = (props) => {\n return (\n <pre class=\"incremark-debug\">\n <code>{JSON.stringify(props.node, null, 2)}</code>\n </pre>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { FootnoteDefinition, RootContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport IncremarkRenderer from './IncremarkRenderer'\n\nexport interface IncremarkFootnotesProps {}\n\n/**\n * 脚注列表组件\n *\n * 在文档底部渲染所有脚注定义,按引用出现的顺序排列\n */\nexport const IncremarkFootnotes: Component<IncremarkFootnotesProps> = () => {\n const { footnoteDefinitions, footnoteReferenceOrder } = useDefinationsContext()\n\n /**\n * 按引用顺序排列的脚注列表\n * 只显示已有定义的脚注\n */\n const orderedFootnotes = () => {\n return footnoteReferenceOrder()\n .map(identifier => ({\n identifier,\n definition: footnoteDefinitions()[identifier]\n }))\n .filter(item => item.definition !== undefined)\n }\n\n /**\n * 是否有脚注需要显示\n */\n const hasFootnotes = () => orderedFootnotes().length > 0\n\n return (\n <Show when={hasFootnotes()}>\n <section class=\"incremark-footnotes\">\n <hr class=\"incremark-footnotes-divider\" />\n <ol class=\"incremark-footnotes-list\">\n <For each={orderedFootnotes()}>\n {(item, index) => (\n <li\n id={`fn-${item.identifier}`}\n class=\"incremark-footnote-item\"\n >\n <div class=\"incremark-footnote-content\">\n {/* 脚注序号 */}\n <span class=\"incremark-footnote-number\">{index() + 1}.</span>\n\n {/* 脚注内容 */}\n <div class=\"incremark-footnote-body\">\n <For each={item.definition.children}>\n {(child) => (\n <IncremarkRenderer\n node={(child as RootContent)}\n />\n )}\n </For>\n </div>\n </div>\n\n {/* 返回链接 */}\n <a\n href={`#fnref-${item.identifier}`}\n class=\"incremark-footnote-backref\"\n aria-label=\"返回引用位置\"\n >\n ↩\n </a>\n </li>\n )}\n </For>\n </ol>\n </section>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { Component, createEffect, createMemo, onMount, onCleanup } from 'solid-js'\nimport type { JSX } from 'solid-js'\nimport { useIncremark } from '../composables/useIncremark'\nimport type { IncremarkContentProps } from '../types'\nimport Incremark from './Incremark'\nimport { generateParserId } from '@incremark/shared'\n\n/**\n * IncremarkContent 组件\n *\n * 全合一组件,自动处理流式和内容模式\n */\nexport const IncremarkContent: Component<IncremarkContentProps> = (props) => {\n const incremarkOptions = () => ({\n gfm: true,\n htmlTree: true,\n containers: true,\n math: true,\n ...props.incremarkOptions\n })\n\n const incremark = useIncremark(incremarkOptions)\n const { blocks, append, finalize, render, reset, isDisplayComplete, markdown, contextValue, DefinationsProvider, parser } = incremark\n\n // DevTools 集成\n const parserId = props.devtoolsId || generateParserId()\n\n onMount(() => {\n if (props.devtools) {\n props.devtools.register(parser, {\n id: parserId,\n label: props.devtoolsLabel || parserId\n })\n }\n })\n\n onCleanup(() => {\n if (props.devtools) {\n props.devtools.unregister(parserId)\n }\n })\n\n const isStreamMode = () => typeof props.stream === 'function'\n\n async function handleStreamInput() {\n if (!props.stream) return\n\n try {\n const stream = props.stream()\n\n for await (const chunk of stream) {\n append(chunk)\n }\n\n finalize()\n } catch (error) {\n console.error('Stream error: ', error)\n finalize()\n }\n }\n\n function handleContentInput(newContent?: string, oldContent?: string) {\n if (!newContent) {\n if (oldContent) {\n reset()\n }\n return\n }\n\n if (newContent?.startsWith(oldContent ?? '')) {\n const delta = newContent.slice((oldContent || '').length)\n append(delta)\n } else {\n render(newContent)\n }\n }\n\n // 监听 content 变化\n createEffect(() => {\n const newContent = props.content\n\n if (isStreamMode()) {\n handleStreamInput()\n } else {\n handleContentInput(newContent, markdown())\n }\n })\n\n // 监听 isFinished 变化\n createEffect(() => {\n const newIsFinished = props.isFinished\n if (newIsFinished && props.content === markdown()) {\n finalize()\n }\n })\n\n return (\n <DefinationsProvider value={contextValue}>\n <Incremark\n blocks={blocks}\n pendingClass={props.pendingClass}\n isDisplayComplete={isDisplayComplete()}\n showBlockStatus={props.showBlockStatus}\n components={props.components}\n customContainers={props.customContainers}\n customCodeBlocks={props.customCodeBlocks}\n codeBlockConfigs={props.codeBlockConfigs}\n />\n </DefinationsProvider>\n )\n}\n\nexport default IncremarkContent\n","/* @jsxImportSource solid-js */\n\nimport { Component, createEffect, createSignal, onCleanup, onMount, JSX } from 'solid-js'\nimport type { Accessor } from 'solid-js'\n\nexport interface AutoScrollContainerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /** 是否启用自动滚动 */\n enabled?: Accessor<boolean> | boolean\n /** 触发自动滚动的底部阈值(像素) */\n threshold?: number\n /** 滚动行为 */\n behavior?: ScrollBehavior\n}\n\n/**\n * 自动滚动容器组件\n *\n * 当内容更新时自动滚动到底部,除非用户手动向上滚动\n */\nexport const AutoScrollContainer: Component<AutoScrollContainerProps> = (props) => {\n let containerRef: HTMLDivElement | undefined\n\n const [isUserScrolledUp, setIsUserScrolledUp] = createSignal(false)\n\n // 记录上一次滚动位置,用于判断滚动方向\n let lastScrollTop = 0\n let lastScrollHeight = 0\n\n const enabled = () => typeof props.enabled === 'function' ? props.enabled() : props.enabled ?? true\n const threshold = () => props.threshold ?? 50\n const scrollBehavior = () => props.behavior ?? 'instant'\n\n /**\n * 检查是否在底部附近\n */\n function isNearBottom(): boolean {\n if (!containerRef) return true\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef\n return scrollHeight - scrollTop - clientHeight <= threshold()\n }\n\n /**\n * 滚动到底部\n */\n function scrollToBottom(force = false): void {\n if (!containerRef) return\n\n // 如果用户手动向上滚动了,且不是强制滚动,则不自动滚动\n if (isUserScrolledUp() && !force) return\n\n containerRef.scrollTo({\n top: containerRef.scrollHeight,\n behavior: scrollBehavior()\n })\n }\n\n /**\n * 检查是否有滚动条\n */\n function hasScrollbar(): boolean {\n if (!containerRef) return false\n return containerRef.scrollHeight > containerRef.clientHeight\n }\n\n /**\n * 处理滚动事件\n */\n function handleScroll(): void {\n if (!containerRef) return\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef\n\n // 如果没有滚动条,恢复自动滚动\n if (scrollHeight <= clientHeight) {\n setIsUserScrolledUp(false)\n lastScrollTop = 0\n lastScrollHeight = scrollHeight\n return\n }\n\n // 检查用户是否滚动到底部附近\n if (isNearBottom()) {\n // 用户滚动到底部,恢复自动滚动\n setIsUserScrolledUp(false)\n } else {\n // 判断是否是用户主动向上滚动\n // 条件:scrollTop 减少(向上滚动)且 scrollHeight 没有变化(不是因为内容增加)\n const isScrollingUp = scrollTop < lastScrollTop\n const isContentUnchanged = scrollHeight === lastScrollHeight\n\n if (isScrollingUp && isContentUnchanged) {\n // 用户主动向上滚动,暂停自动滚动\n setIsUserScrolledUp(true)\n }\n }\n\n // 更新记录\n lastScrollTop = scrollTop\n lastScrollHeight = scrollHeight\n }\n\n // 监听内容变化(使用 MutationObserver)\n let observer: MutationObserver | null = null\n\n onMount(() => {\n if (!containerRef) return\n\n // 初始化滚动位置记录\n lastScrollTop = containerRef.scrollTop\n lastScrollHeight = containerRef.scrollHeight\n\n observer = new MutationObserver(() => {\n // 使用 requestAnimationFrame 避免 layout thrashing\n requestAnimationFrame(() => {\n if (!containerRef) return\n\n // 如果没有滚动条,重置状态\n if (!hasScrollbar()) {\n setIsUserScrolledUp(false)\n }\n\n // 更新 scrollHeight 记录(内容变化后)\n lastScrollHeight = containerRef.scrollHeight\n\n // 自动滚动\n if (enabled() && !isUserScrolledUp()) {\n scrollToBottom()\n }\n })\n })\n\n observer.observe(containerRef, {\n childList: true,\n subtree: true,\n characterData: true\n })\n })\n\n onCleanup(() => {\n observer?.disconnect()\n })\n\n return (\n <div\n ref={containerRef}\n class=\"auto-scroll-container\"\n onScroll={handleScroll}\n >\n {props.children}\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Component, type JSX, createContext, useContext, createMemo, createSignal, type Accessor } from 'solid-js'\nimport type { DesignTokens } from '@incremark/theme'\nimport { applyTheme } from '@incremark/theme'\n\nexport type Theme = 'default' | 'dark' | Partial<DesignTokens>\n\nexport const ThemeContext = createContext<{\n theme: Accessor<Theme>\n setTheme: (theme: Theme) => void\n}>()\n\nexport interface ThemeProviderProps {\n theme?: Theme\n children?: JSX.Element\n}\n\nexport const ThemeProvider: Component<ThemeProviderProps> = (props) => {\n let containerRef: HTMLDivElement | undefined\n const [theme, setTheme] = createSignal<Theme>(props.theme || 'default')\n\n // 应用主题到 DOM - 监听 props.theme 变化\n createMemo(() => {\n const currentTheme = props.theme || 'default'\n setTheme(currentTheme)\n if (typeof document !== 'undefined' && containerRef) {\n applyTheme(containerRef, currentTheme)\n }\n })\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme }}>\n <div ref={containerRef} class=\"incremark-theme-provider\">\n {props.children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n","// Composables\nexport { useIncremark, useStreamRenderer, useBlockTransformer, useLocale } from './composables'\nexport { useProvideDefinations } from './composables/useProvideDefinations'\nexport { useDefinationsContext } from './composables/useDefinationsContext'\nexport type {\n UseIncremarkOptions,\n TypewriterOptions,\n TypewriterControls,\n UseStreamRendererOptions,\n UseStreamRendererReturn,\n UseBlockTransformerOptions,\n UseBlockTransformerReturn\n} from './composables'\n\n// Components\nexport * from './components';\n\n// Utilities\nexport { clearAnimatedChunks, shouldAnimateChunk } from './utils/animatedChunks'\n\nexport { ThemeProvider as ThemeProviderExport, useTheme } from './components/ThemeProvider'\nexport { ConfigProvider as ConfigProviderExport } from './components/ConfigProvider'\n\n// Re-export core types\nexport type {\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n Root,\n RootContent,\n // Transformer types\n SourceBlock,\n DisplayBlock,\n TransformerPlugin,\n TransformerOptions,\n TransformerState,\n AnimationEffect\n} from '@incremark/core'\n\n// Re-export mdast types\nexport type {\n Root as MdastRoot,\n Parent,\n // Nodes\n Heading,\n Paragraph,\n Code,\n Blockquote,\n List,\n ListItem,\n Table,\n TableCell,\n ThematicBreak,\n // Inline\n Text,\n PhrasingContent,\n InlineCode,\n Link,\n LinkReference,\n Image,\n ImageReference,\n // HTML\n HTML,\n // Definitions\n Definition,\n FootnoteDefinition\n} from 'mdast'\n\n// Re-export transformer utilities and plugins\nexport {\n BlockTransformer,\n createBlockTransformer,\n countChars,\n sliceAst,\n cloneNode,\n codeBlockPlugin,\n mermaidPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin,\n defaultPlugins,\n allPlugins,\n createPlugin\n} from '@incremark/core'\n\n// Re-export theme utilities\nexport {\n type DesignTokens,\n defaultTheme,\n darkTheme,\n generateCSSVars,\n mergeTheme,\n applyTheme\n} from '@incremark/theme'\n\n// Re-export i18n utilities\nimport { en as enShared, zhCN as zhCNShared } from '@incremark/shared'\nimport type { IncremarkLocale } from '@incremark/shared'\n\nexport { enShared as en, zhCNShared as zhCN }\nexport type { IncremarkLocale }\n"],"mappings":";AAAA;AAAA,EACE,gBAAAA;AAAA,EAEA,gBAAAC;AAAA,OAIK;AACP;AAAA,EACE;AAAA,OAOK;;;ACdP,SAAwB,oBAAiC;AACzD,SAAS,qBAAqB;AAsB1B;AATG,IAAM,qBAAqB,cAAuC;AAOlE,SAAS,oBAAoB,OAAiC;AACnE,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAAO,MAAM,OACvC,gBAAM,UACT;AAEJ;AAMO,SAAS,wBAAwB;AACtC,QAAM,CAAC,aAAa,cAAc,IAAI,aAAyC,CAAC,CAAC;AACjF,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,aAAiD,CAAC,CAAC;AACzG,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,aAAuB,CAAC,CAAC;AAErF,WAAS,mBAAmB;AAC1B,mBAAe,CAAC,CAAC;AAAA,EACnB;AAEA,WAAS,2BAA2B;AAClC,2BAAuB,CAAC,CAAC;AAAA,EAC3B;AAEA,WAAS,8BAA8B;AACrC,8BAA0B,CAAC,CAAC;AAAA,EAC9B;AAEA,WAAS,sBAAsB;AAC7B,qBAAiB;AACjB,6BAAyB;AACzB,gCAA4B;AAAA,EAC9B;AAEA,QAAM,eAAwC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxEA;AAAA,EACE,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,aAAa,iBAAiB;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;;;ACnBA,SAAS,gBAAgB,MAAmB,QAA6B;AAE9E,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAE9C,WAAS,UAAU,GAAqE;AAEtF,QAAI,EAAE,SAAS,QAAQ;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,EAAE,YAAY,EAAE,SAAS,SAAS,GAAG;AACvC,eAAS,IAAI,EAAE,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,YAAI,UAAU,EAAE,SAAS,CAAC,CAA4D,GAAG;AACvF,iBAAO;AAAA,QACT;AAAA,MACF;AACA,QAAE,SAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,OAAO,CAAC;AAC/C,aAAO;AAAA,IACT;AACA,QAAI,EAAE,SAAS,UAAU,OAAO,EAAE,UAAU,UAAU;AACpD,QAAE,SAAS;AACX,aAAO;AAAA,IACT;AACA,QAAI,OAAO,EAAE,UAAU,UAAU;AAC/B,QAAE,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,YAAU,MAAM;AAChB,SAAO;AACT;;;ADsBO,SAAS,cAAc,SAAoD;AAChF,QAAM,EAAE,YAAY,iBAAiB,iBAAiB,cAAc,IAAI;AAGxE,QAAM,gBAAgB,gBAAgB;AAGtC,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,cAAa,eAAe,WAAW,CAAC,CAAC,aAAa;AACxG,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,cAAa,KAAK;AAC9E,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,cAAa,KAAK;AACtE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,cAA8B,eAAe,UAAU,MAAM;AAC7G,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,cAAa,eAAe,UAAU,GAAG;AACzF,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,cAAa,IAAI;AAIvE,QAAM,CAAC,aAAa,cAAc,IAAI,YAAsC,EAAE,OAAO,CAAC,EAAE,CAAC;AAGzF,MAAI,cAAoD;AAGxD,MAAI,qBAAkD,CAAC;AAMvD,WAAS,sBAAsB,eAA2D;AACxF,WAAO,cAAc,IAAI,CAAC,IAAI,UAAU;AACtC,YAAM,YAAY,CAAC,GAAG;AACtB,YAAM,gBAAgB,aAAa,UAAU,cAAc,SAAS;AAGpE,UAAI,OAAO,GAAG;AACd,UAAI,iBAAiB,MAAM,YAAY,eAAe;AACpD,eAAO,gBAAgB,GAAG,aAAa,iBAAiB,CAAC;AAAA,MAC3D;AAEA,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,QAAQ,GAAG;AAAA,QACX;AAAA,QACA,aAAa;AAAA,QACb,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,eAAe;AACjB,kBAAc,uBAAoC;AAAA,MAChD,cAAc,cAAc,gBAAgB,CAAC,GAAG,CAAC;AAAA,MACjD,cAAc,cAAc,gBAAgB;AAAA,MAC5C,QAAQ,cAAc,UAAU;AAAA,MAChC,eAAe,cAAc,iBAAiB;AAAA;AAAA,MAE9C,SAAS,cAAc,WAAW,CAAC,GAAG,gBAAgB,UAAU;AAAA,MAChE,UAAU,CAAC,WAAW;AACpB,6BAAqB;AAGrB,cAAM,kBAAkB,sBAAsB,kBAAkB;AAChE,uBAAe,SAAS,UAAU,iBAAiB,EAAE,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAC9E,kCAA0B,aAAa,aAAa,KAAK,KAAK;AAC9D,8BAAsB,aAAa,cAAc,KAAK,KAAK;AAE3D,YAAI,aAAa,aAAa,KAAK,OAAO;AACxC,iCAAuB,KAAK;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,eAAe,MAAM;AAEnB,+BAAuB,IAAI;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAGA,eAAa,MAAM;AACjB,UAAM,YAAY,gBAAgB;AAClC,QAAI,CAAC,UAAW;AAGhB,QAAI,UAAU,YAAY,QAAW;AACnC,2BAAqB,UAAU,OAAO;AAAA,IACxC;AACA,QAAI,UAAU,WAAW,QAAW;AAClC,0BAAoB,UAAU,MAAM;AAAA,IACtC;AACA,QAAI,UAAU,WAAW,QAAW;AAClC,0BAAoB,UAAU,MAAM;AAAA,IACtC;AAGA,iBAAa,WAAW;AAAA,MACtB,cAAc,UAAU;AAAA,MACxB,cAAc,UAAU;AAAA,MACxB,QAAQ,UAAU;AAAA,MAClB,eAAe,UAAU;AAAA,IAC3B,CAAC;AAGD,QAAI,UAAU,YAAY,SAAS,aAAa;AAC9C,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF,CAAC;AAKD,MAAI,aAAa;AACf,iBAAa,MAAM;AAEjB,UAAI,CAAC,kBAAkB,EAAG;AAI1B,YAAM,YAAY,CAAC,GAAG,gBAAgB,GAAG,GAAG,cAAc,CAAC;AAC3D,kBAAa,KAAK,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,MAAM,CAAC,GAAG,gBAAgB,GAAG,GAAG,cAAc,CAAC;AAMjE,eAAa,MAAM;AACjB,UAAM,UAAU,kBAAkB;AAClC,UAAM,SAAS,UAAU;AAEzB,QAAI,CAAC,WAAW,CAAC,aAAa;AAE5B,qBAAe,SAAS,UAAU,QAAQ,EAAE,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACvE;AAAA,EACF,CAAC;AAMD,QAAM,kCAAkC,MAAM;AAE5C,QAAI,CAAC,kBAAkB,KAAK,CAAC,aAAa;AACxC,YAAMC,cAAuB,CAAC;AAC9B,YAAMC,QAAO,oBAAI,IAAY;AAC7B,iBAAW,SAAS,UAAU,GAAG;AAC/B,cAAM,YAAY,0BAA0B,MAAM,IAAI;AACtD,mBAAW,OAAO,WAAW;AAC3B,cAAI,CAACA,MAAK,IAAI,GAAG,GAAG;AAClB,YAAAA,MAAK,IAAI,GAAG;AACZ,YAAAD,YAAW,KAAK,GAAG;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAIA,QAAI,CAAC,oBAAoB,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,aAAuB,CAAC;AAC9B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,MAAM,oBAAoB;AACnC,YAAM,YAAY,0BAA0B,GAAG,WAAW;AAC1D,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,eAAK,IAAI,GAAG;AACZ,qBAAW,KAAK,GAAG;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,qBAAyC;AAAA,IAC7C,SAAS,MAAM,kBAAkB;AAAA,IACjC,YAAY,CAAC,UAAmB;AAC9B,2BAAqB,KAAK;AAAA,IAC5B;AAAA,IACA,cAAc,MAAM,uBAAuB;AAAA,IAC3C,UAAU,MAAM,mBAAmB;AAAA,IACnC,QAAQ,MAAM,iBAAiB;AAAA,IAC/B,MAAM,MAAM,aAAa,KAAK;AAAA,IAC9B,OAAO,MAAM;AACX,mBAAa,MAAM;AACnB,4BAAsB,IAAI;AAAA,IAC5B;AAAA,IACA,QAAQ,MAAM;AACZ,mBAAa,OAAO;AACpB,4BAAsB,KAAK;AAAA,IAC7B;AAAA,IACA,YAAY,CAAC,SAAS;AACpB,UAAI,KAAK,YAAY,QAAW;AAC9B,6BAAqB,KAAK,OAAO;AAAA,MACnC;AACA,UAAI,KAAK,iBAAiB,UAAa,KAAK,iBAAiB,UAAa,KAAK,WAAW,UAAa,KAAK,kBAAkB,QAAW;AACvI,qBAAa,WAAW;AAAA,UACtB,cAAc,KAAK;AAAA,UACnB,cAAc,KAAK;AAAA,UACnB,QAAQ,KAAK;AAAA,UACb,eAAe,KAAK;AAAA,QACtB,CAAC;AAAA,MACH;AACA,UAAI,KAAK,WAAW,QAAW;AAC7B,4BAAoB,KAAK,MAAM;AAAA,MACjC;AACA,UAAI,KAAK,WAAW,QAAW;AAC7B,4BAAoB,KAAK,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAGA,YAAU,MAAM;AACd,iBAAa,QAAQ;AAAA,EACvB,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,YAAY;AAAA,IACpB,YAAY;AAAA,IACZ;AAAA,IACA,qBAAqB,MAAM,oBAAoB;AAAA,IAC/C,iCAAiC,MAAM,gCAAgC;AAAA,EACzE;AACF;;;AE9RA,IAAM,iBAAiB,oBAAI,IAAY;AAMhC,SAAS,mBAAmB,WAA4B;AAC7D,MAAI,eAAe,IAAI,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,iBAAe,IAAI,SAAS;AAC5B,SAAO;AACT;AAMO,SAAS,sBAA4B;AAC1C,iBAAe,MAAM;AACvB;;;AJsEO,SAAS,aAAa,eAA0C,OAAO,CAAC,IAAI;AAEjF,QAAM,EAAE,gBAAgB,wBAAwB,wBAAwB,2BAA2B,cAAc,qBAAAE,qBAAoB,IAAI,sBAAsB;AAG/J,WAAS,aAAa,SAA8B;AAClD,WAAO,sBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH,UAAU,CAAC,UAAU;AACnB,uBAAe,MAAM,WAAW;AAChC,+BAAuB,MAAM,mBAAmB;AAChD,gBAAQ,WAAW,KAAK;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,aAAa,aAAa,CAAC;AAExC,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,cAA4B,CAAC,CAAC;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAIA,cAA4B,CAAC,CAAC;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIA,cAAa,KAAK;AACpD,QAAM,CAAC,UAAU,WAAW,IAAIA,cAAa,EAAE;AAC/C,QAAM,CAAC,aAAa,cAAc,IAAIA,cAAa,KAAK;AAIxD,QAAM,EAAE,QAAQ,YAAY,aAAa,qBAAqB,gCAAgC,IAAI,cAAc;AAAA,IAC9G,YAAY,MAAM,aAAa,EAAE;AAAA,IACjC;AAAA,IACA;AAAA,EACF,CAAC;AAKD,QAAM,oBAAoB,MAAM;AAE9B,QAAI,CAAC,aAAa,EAAE,cAAc,CAAC,WAAW,QAAQ,GAAG;AACvD,aAAO,YAAY;AAAA,IACrB;AAEA,WAAO,YAAY,KAAK,oBAAoB;AAAA,EAC9C;AAGA,QAAM,CAAC,KAAK,MAAM,IAAIA,cAAmB;AAAA,IACvC,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,EACb,CAAC;AAKD,WAAS,aAAa,QAA2B,aAAsB,OAAa;AAClF,gBAAY,OAAO,UAAU,CAAC;AAG9B,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAM,cAAc,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAK,EAAE,EAAE,CAAC;AACzD,yBAAmB,UAAQ,KAAK,OAAO,OAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC;AAAA,IACrE;AAEA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,yBAAmB,UAAQ,CAAC,GAAG,MAAM,GAAG,OAAO,SAAS,CAAC;AAAA,IAC3D;AACA,qBAAiB,OAAO,OAAO;AAE/B,QAAI,YAAY;AAEd,UAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,2BAAmB,UAAQ,CAAC,GAAG,MAAM,GAAG,OAAO,OAAO,CAAC;AACvD,yBAAiB,CAAC,CAAC;AAAA,MACrB;AACA,mBAAa,KAAK;AAClB,qBAAe,IAAI;AAAA,IACrB,OAAO;AACL,mBAAa,IAAI;AAAA,IACnB;AAGA,8BAA0B,OAAO,sBAAsB;AAAA,EAGzD;AAEA,WAAS,OAAO,OAAkC;AAChD,UAAM,SAAS,OAAO,OAAO,KAAK;AAClC,WAAO,OAAO,GAAG;AACjB,iBAAa,QAAQ,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,WAAS,WAA8B;AACrC,UAAM,SAAS,OAAO,SAAS;AAC/B,iBAAa,QAAQ,IAAI;AACzB,WAAO;AAAA,EACT;AAEA,WAAS,QAA2B;AAClC,WAAO,SAAS;AAAA,EAClB;AAEA,WAAS,QAAc;AACrB,WAAO,MAAM;AACb,uBAAmB,CAAC,CAAC;AACrB,qBAAiB,CAAC,CAAC;AACnB,gBAAY,EAAE;AACd,iBAAa,KAAK;AAClB,mBAAe,KAAK;AACpB,8BAA0B,CAAC,CAAC;AAG5B,iBAAa,MAAM;AAGnB,wBAAoB;AAAA,EACtB;AAKA,MAAI,iBAAiB;AACrB,EAAAC,cAAa,MAAM;AACjB,UAAM,OAAO,aAAa;AAC1B,UAAM,EAAE,YAAY,GAAG,YAAY,GAAG,cAAc,IAAI;AAExD,UAAM,aAAa,KAAK,UAAU,aAAa,IAAI,OAAO,YAAY,QAAQ;AAE9E,QAAI,eAAe,gBAAgB;AACjC,uBAAiB;AAEjB,YAAM,EAAE,YAAYC,IAAG,GAAGC,eAAc,IAAI;AAC5C,aAAO,cAAcA,cAAa;AAElC,yBAAmB,CAAC,CAAC;AACrB,uBAAiB,CAAC,CAAC;AACnB,kBAAY,EAAE;AACd,mBAAa,KAAK;AAClB,qBAAe,KAAK;AACpB,gCAA0B,CAAC,CAAC;AAC5B,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF,CAAC;AAID,EAAAF,cAAa,MAAM;AACjB,UAAM,WAAW,gCAAgC;AACjD,8BAA0B,QAAQ;AAAA,EACpC,CAAC;AAED,WAAS,OAAO,SAAoC;AAClD,UAAM,SAAS,OAAO,OAAO,OAAO;AAEpC,gBAAY,OAAO,UAAU,CAAC;AAC9B,uBAAmB,OAAO,mBAAmB,CAAC;AAC9C,qBAAiB,CAAC,CAAC;AACnB,iBAAa,KAAK;AAClB,mBAAe,IAAI;AACnB,8BAA0B,OAAO,sBAAsB;AAEvD,8BAA0B,OAAO,sBAAsB;AAEvD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAAA;AAAA,IAEb;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA,qBAAAF;AAAA,EACF;AAEA,SAAO;AACT;;;AKvTA,SAAwB,gBAAAK,qBAAoB;AAc5C,IAAM,gBAAN,MAAM,cAAa;AAAA,EAMT,cAAc;AAFtB;AAAA,SAAQ,eAAe,oBAAI,IAA6B;AAAA,EAEjC;AAAA,EAEvB,OAAO,cAA4B;AACjC,QAAI,CAAC,cAAa,UAAU;AAC1B,oBAAa,WAAW,IAAI,cAAa;AAAA,IAC3C;AACA,WAAO,cAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,OAA+C;AAElE,QAAI,KAAK,aAAa,IAAI,KAAK,GAAG;AAChC,aAAO,KAAK,aAAa,IAAI,KAAK;AAAA,IACpC;AAGA,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,OAAO;AAClD,UAAM,cAAc,MAAM,kBAAkB;AAAA,MAC1C,QAAQ,CAAC,KAAK;AAAA,MACd,OAAO,CAAC;AAAA,IACV,CAAC;AAED,UAAM,OAAwB;AAAA,MAC5B;AAAA,MACA,iBAAiB,oBAAI,IAAqB;AAAA,MAC1C,cAAc,oBAAI,IAAkB,CAAC,KAAK,CAAC;AAAA,IAC7C;AAEA,SAAK,aAAa,IAAI,OAAO,IAAI;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,OAAqB,MAAsC;AAC5E,UAAM,OAAO,KAAK,aAAa,IAAI,KAAK;AACxC,QAAI,CAAC,QAAQ,KAAK,gBAAgB,IAAI,IAAI,EAAG;AAE7C,QAAI;AACF,YAAM,KAAK,YAAY,aAAa,IAAI;AACxC,WAAK,gBAAgB,IAAI,IAAI;AAAA,IAC/B,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,OAAoC;AAClD,UAAM,OAAO,KAAK,aAAa,IAAI,KAAK;AACxC,QAAI,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,EAAG;AAE3C,QAAI;AACF,YAAM,KAAK,YAAY,UAAU,KAAK;AACtC,WAAK,aAAa,IAAI,KAAK;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WACJ,OACA,MACA,MACA,eACiB;AACjB,UAAM,OAAO,KAAK,aAAa,IAAI,KAAK;AACxC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAElD,UAAM,aAAa,KAAK,gBAAgB,IAAI,IAAI,IAAI,OAAO;AAC3D,UAAM,cAAc,KAAK,aAAa,IAAI,KAAK,IAAI,QAAQ;AAE3D,WAAO,KAAK,YAAY,WAAW,MAAM;AAAA,MACvC,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACX,eAAW,CAAC,EAAE,IAAI,KAAK,KAAK,cAAc;AACxC,UAAI,KAAK,aAAa,SAAS;AAC7B,aAAK,YAAY,QAAQ;AAAA,MAC3B;AAAA,IACF;AACA,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;AAjHM,cACW,WAAgC;AADjD,IAAM,eAAN;AAqHA,IAAI,uBAA4C;AAMhD,SAAS,kBAAgC;AACvC,MAAI,CAAC,sBAAsB;AACzB,2BAAuB,aAAa,YAAY;AAAA,EAClD;AACA,SAAO;AACT;AAoBO,SAAS,SAAS,OAA+B;AACtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,cAAqC,IAAI;AACvF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,cAAa,KAAK;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAIA,cAAa,KAAK;AAKhD,iBAAe,kBAAiC;AAC9C,QAAI,QAAQ,EAAG;AAEf,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,EAAE,eAAe,KAAqB;AACzE,yBAAmB,IAAI;AACvB,iBAAW,IAAI;AAAA,IACjB,SAAS,GAAG;AACV,cAAQ,KAAK,2CAA2C,CAAC;AACzD,YAAM;AAAA,IACR;AAAA,EACF;AAKA,iBAAe,iBAA2C;AACxD,QAAI,CAAC,gBAAgB,GAAG;AACtB,YAAM,OAAO,MAAM,gBAAgB,EAAE,eAAe,KAAqB;AACzE,yBAAmB,IAAI;AACvB,iBAAW,IAAI;AACf,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB;AAAA,EACzB;AAKA,iBAAe,UAAU,MAAc,MAAc,eAAwC;AAC3F,sBAAkB,IAAI;AAEtB,QAAI;AACF,YAAM,OAAO,MAAM,eAAe;AAClC,YAAM,UAAU,gBAAgB;AAGhC,UAAI,CAAC,KAAK,gBAAgB,IAAI,IAAuB,KAAK,SAAS,QAAQ;AACzE,cAAM,QAAQ,aAAa,OAAuB,IAAuB;AAAA,MAC3E;AAGA,UAAI,CAAC,KAAK,aAAa,IAAI,KAAqB,GAAG;AACjD,cAAM,QAAQ,UAAU,KAAqB;AAAA,MAC/C;AAEA,aAAO,MAAM,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,YAAM;AAAA,IACR,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChPA,SAAmC,iBAAAC,gBAAe,YAAY,gBAAAC,eAAc,kBAAiC;AAE7G,SAAS,YAAY;AAqBjB,gBAAAC,YAAA;AAnBG,IAAM,gBAAgBF,eAE1B;AAQI,IAAM,iBAAiD,CAAC,UAAU;AACvE,QAAM,CAAC,QAAQ,SAAS,IAAIC,cAA8B,MAAM,UAAU,IAAI;AAG9E,aAAW,MAAM;AACf,cAAU,MAAM,UAAU,IAAI;AAAA,EAChC,CAAC;AAED,SACE,gBAAAC,KAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,OAAO,GACrC,gBAAM,UACT;AAEJ;AAOO,SAAS,YAA0B;AACxC,QAAM,UAAU,WAAW,aAAa;AACxC,QAAM,SAAS,SAAS,WAAW,MAAM;AAGzC,SAAO,CAAC,QAAgB;AACtB,UAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,QAAI,QAAa,OAAO;AACxB,eAAW,KAAK,MAAM;AACpB,cAAQ,QAAQ,CAAC;AAAA,IACnB;AACA,WAAO,SAAS;AAAA,EAClB;AACF;;;ACjDA,SAAS,cAAAC,mBAAkB;AAOpB,SAAS,wBAAiD;AAC/D,QAAM,UAAUC,YAAW,kBAAkB;AAE7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iHAAiH;AAAA,EACnI;AAEA,SAAO;AACT;;;ACfA,SAAS,gBAAAC,qBAAmC;AA0BrC,SAAS,kBAAkB,UAAoC,CAAC,GAA4B;AACjG,QAAM,CAAC,QAAQ,SAAS,IAAIA,cAA4B,QAAQ,iBAAiB,CAAC,CAAC;AAEnF,WAAS,UAAU,WAA0B;AAC3C,cAAU,UAAQ,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;AAAA,EAC3C;AAEA,WAAS,cAAc;AACrB,cAAU,CAAC,CAAC;AAAA,EACd;AAEA,QAAM,aAAa,MAAM,OAAO,EAAE;AAElC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9CA,SAAS,gBAAAC,qBAAiD;AAC1D;AAAA,EACE,0BAAAC;AAAA,OAKK;AAgCA,SAAS,oBAAoB,UAAsC,CAAC,GAA8B;AACvG,QAAM,CAAC,eAAe,gBAAgB,IAAID,cAA0C,CAAC,CAAC;AACtF,QAAM,CAAC,cAAc,eAAe,IAAIA,cAAa,KAAK;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAIA,cAAa,KAAK;AAElD,QAAM,cAAcC,wBAAoC;AAAA,IACtD,cAAc,QAAQ,gBAAgB,CAAC,GAAG,CAAC;AAAA,IAC3C,cAAc,QAAQ,gBAAgB;AAAA,IACtC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,eAAe,QAAQ,iBAAiB;AAAA,IACxC,SAAS,QAAQ;AAAA,IACjB,UAAU,CAAC,WAAW;AACpB,uBAAiB,MAAqC;AACtD,sBAAgB,aAAa,aAAa,KAAK,KAAK;AACpD,kBAAY,aAAa,cAAc,KAAK,KAAK;AAAA,IACnD;AAAA,EACF,CAAC;AAED,WAAS,KAAK,QAAe;AAC3B,gBAAY,KAAK,MAAM;AAAA,EACzB;AAEA,WAAS,OAAO;AACd,gBAAY,KAAK;AAAA,EACnB;AAEA,WAAS,QAAQ;AACf,gBAAY,MAAM;AAAA,EACpB;AAEA,WAAS,SAAS;AAChB,gBAAY,OAAO;AAAA,EACrB;AAEA,WAAS,QAAQ;AACf,gBAAY,MAAM;AAAA,EACpB;AAEA,WAAS,UAAU;AACjB,gBAAY,QAAQ;AAAA,EACtB;AAEA,WAAS,WAAW,MAAuG;AACzH,gBAAY,WAAW,IAAI;AAAA,EAC7B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7FA,SAAS,OAAAC,MAAK,QAAAC,QAAM,kBAAkB;;;ACDtC,SAAoB,QAAAC,cAAY;AAChC,SAAS,WAAAC,gBAAe;;;ACAxB,SAAS,WAAAC,gBAAe;;;ACDxB,SAAkD,WAAW,eAAe,kBAAkB;AAC9F,SAAoB,OAAAC,MAAK,OAAO,QAAAC,aAAY;;;ACF5C,SAAoB,gBAAAC,eAAc,gBAAAC,eAAc,aAAAC,YAAW,YAAY;AAsFjE,SAEI,OAAAC,MAFJ;AAnEC,IAAM,gBAA+C,CAAC,UAAU;AACrE,QAAM,CAAC,cAAc,eAAe,IAAIH,cAAa,EAAE;AACvD,QAAM,CAAC,WAAW,YAAY,IAAIA,cAAa,KAAK;AAEpD,QAAM,WAAW,MAAM,MAAM,KAAK,SAAS;AAC3C,QAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,MAAI,cAAoD;AACxD,MAAI,WAAgB;AAGpB,WAAS,iBAAiB;AACxB,QAAI,CAAC,QAAQ,GAAG;AACd,sBAAgB,EAAE;AAClB;AAAA,IACF;AAGA,QAAI,aAAa;AACf,mBAAa,WAAW;AAAA,IAC1B;AAEA,iBAAa,IAAI;AAGjB,kBAAc,WAAW,MAAM;AAC7B,eAAS;AAAA,IACX,GAAG,MAAM,eAAe,CAAC;AAAA,EAC3B;AAEA,iBAAe,WAAW;AACxB,QAAI,CAAC,QAAQ,EAAG;AAEhB,QAAI;AAEF,UAAI,CAAC,UAAU;AACb,cAAM,cAAc,MAAM,OAAO,OAAO;AACxC,mBAAW,YAAY;AAAA,MACzB;AAEA,YAAM,QAAQ;AACd,sBAAgB,MAAM,eAAe,QAAQ,GAAG;AAAA,QAC9C,aAAa,CAAC,SAAS;AAAA,QACvB,cAAc;AAAA,QACd,QAAQ;AAAA,MACV,CAAC,CAAC;AAAA,IACJ,QAAQ;AAEN,sBAAgB,EAAE;AAAA,IACpB,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,EAAAC,cAAa,MAAM;AACjB,mBAAe;AAAA,EACjB,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,aAAa;AACf,mBAAa,WAAW;AAAA,IAC1B;AAAA,EACF,CAAC;AAGD,MAAI,SAAS,GAAG;AACd,WACE,qBAAC,UAAK,OAAM,yBACV;AAAA,sBAAAC,KAAC,QAAK,MAAM,aAAa,KAAK,CAAC,UAAU,GACvC,0BAAAA,KAAC,UAAK,WAAW,aAAa,GAAG,GACnC;AAAA,MACA,gBAAAA,KAAC,QAAK,MAAM,CAAC,aAAa,KAAK,UAAU,GACvC,0BAAAA,KAAC,UAAK,OAAM,eAAe,kBAAQ,GAAE,GACvC;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,qBAAC,SAAI,OAAM,wBACT;AAAA,oBAAAA,KAAC,QAAK,MAAM,aAAa,KAAK,CAAC,UAAU,GACvC,0BAAAA,KAAC,SAAI,WAAW,aAAa,GAAG,OAAM,iBAAgB,GACxD;AAAA,IACA,gBAAAA,KAAC,QAAK,MAAM,CAAC,aAAa,KAAK,UAAU,GACvC,0BAAAA,KAAC,SAAI,OAAM,qBAAoB,0BAAAA,KAAC,UAAM,kBAAQ,GAAE,GAAO,GACzD;AAAA,KACF;AAEJ;;;AC3GA,SAAoB,KAAK,QAAAC,aAAY;AAErC,SAAS,eAAe;AAkFb,SAcM,UAdN,OAAAC,YAAA;AAxDX,IAAM,kBAAkB;AAAA,EACtB;AAAA,EAAK;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAK;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAU;AAAA,EAC3D;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAM;AAAA,EAAK;AAAA,EAAO;AAAA,EAAS;AAAA,EAAO;AAAA,EAAS;AAAA,EAC1D;AAAA,EAAU;AAAA,EAAU;AAAA,EAAK;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAU;AAAA,EACrD;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAO;AAAA,EAAO;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAM;AAC5D;AAKA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAO;AAAA,EAAS;AAAA,EAAM;AAAA,EAAO;AAAA,EACnD;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAC9C;AAKA,SAAS,gBAAgB,SAA0B;AACjD,SAAO,gBAAgB,SAAS,QAAQ,YAAY,CAAC;AACvD;AAKA,SAAS,cAAc,SAA0B;AAC/C,SAAO,cAAc,SAAS,QAAQ,YAAY,CAAC;AACrD;AAKA,SAAS,sBAAsB,UAAkC;AAC/D,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAE/C,SAAO,SAAS,MAAM,WAAS;AAC7B,UAAM,OAAO,MAAM;AACnB,UAAM,cAAc,CAAC,QAAQ,UAAU,YAAY,cAAc,QAAQ,SAAS,SAAS,QAAQ,aAAa;AAChH,QAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,UAAI,SAAS,eAAe;AAC1B,eAAO,gBAAiB,MAAqC,OAAO;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAKA,SAAS,eAAe,UAAsC;AAC5D,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAG/C,MAAI,sBAAsB,QAAQ,GAAG;AACnC,WAAO,gBAAAA,KAAC,mBAAgB,OAAO,UAA+B;AAAA,EAChE;AAGA,SACE,gBAAAA,KAAC,OAAI,MAAM,UACR,WAAC,OAAO,QAAQ;AAEf,QAAI,MAAM,SAAS,eAAe;AAChC,aAAO,gBAAAA,KAAC,wBAAqB,MAAM,OAAqC;AAAA,IAC1E;AAGA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,gBAAAA,KAAA,YAAI,gBAA4B,OAAM;AAAA,IAC/C;AAGA,QAAI,CAAC,UAAU,YAAY,cAAc,QAAQ,SAAS,OAAO,EAAE,SAAS,MAAM,IAAI,GAAG;AACvF,aAAO,gBAAAA,KAAC,mBAAgB,OAAO,CAAC,KAAwB,GAAG;AAAA,IAC7D;AAGA,QAAI,MAAM,SAAS,aAAa;AAC9B,aACE,gBAAAA,KAAC,OACC,0BAAAA,KAAC,mBAAgB,OAAQ,MAA0C,UAAU,GAC/E;AAAA,IAEJ;AAGA,WAAO,gBAAAA,KAAC,qBAAkB,MAAM,OAAO;AAAA,EACzC,GACF;AAEJ;AAOO,IAAM,uBAA6D,CAAC,UAAU;AACnF,QAAM,UAAU,MAAM,MAAM,KAAK;AACjC,QAAM,QAAQ,MAAM,MAAM,KAAK,SAAS,CAAC;AACzC,QAAM,WAAW,MAAM,MAAM,KAAK,YAAY,CAAC;AAG/C,QAAM,SAAS,MAAM,cAAc,QAAQ,CAAC;AAE5C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,QAAQ;AAAA,MAClB,GAAG,MAAM;AAAA,MACV,OAAO,oCAAoC,QAAQ,CAAC;AAAA,MAEpD,0BAAAA,KAACC,OAAA,EAAK,MAAM,CAAC,OAAO,GACjB,yBAAe,SAAS,CAAC,GAC5B;AAAA;AAAA,EACF;AAEJ;;;AF7EU,qBAAAC,WAUQ,OAAAC,MARN,QAAAC,aAFF;AA9CV,SAAS,kBAAkB,MAAkE;AAC3F,SAAQ,KAAoC,SAAS;AACvD;AAKA,SAAS,iBAAiB,MAA+C;AACvE,SAAO,KAAK,SAAS;AACvB;AAKA,SAAS,gBAAgB,MAA8C;AACrE,SAAO,KAAK,SAAS;AACvB;AAMO,IAAM,kBAAmD,CAAC,UAAU;AACzE,QAAM,EAAE,aAAa,oBAAoB,IAAI,sBAAsB;AAKnE,WAAS,UAAU,MAAgD;AACjE,QAAI,UAAU,IAAI,GAAG;AACnB,aAAQ,KAA4B;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAKA,WAAS,aAAa,MAA2D;AAC/E,WAAQ,KAA6B,SAAS;AAAA,EAChD;AAEA,SACE,gBAAAD,KAAAD,WAAA,EACE,0BAAAC,KAACE,MAAA,EAAI,MAAM,MAAM,OACd,WAAC,MAAM,QACN,gBAAAD,MAAAF,WAAA,EAEE;AAAA,oBAAAE,MAACE,OAAA,EAAK,MAAM,KAAK,SAAS,QAEvB;AAAA,oBAAc,IAA0B;AAAA,MAIzC,gBAAAH,KAAC,SAAM,MAAM,UAAU,IAAI,KAAK,CAAC,GAC9B,WAAC,OAAOI,SACP,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,kBAAgB,MAAM,EAAE;AAAA,UAEvB,gBAAM,EAAE;AAAA;AAAA,MACX,GAEJ;AAAA,OACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,aAAa,IAAI,GAC3B,0BAAAH,KAAC,iBAAc,MAAmC,GACpD;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,kBAAkB,IAAI,GAChC,0BAAAH,KAAC,wBAAqB,MAA0C,GAClE;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,WAAW,IAAI,GACzB,0BAAAH,KAAC,UAAK,OAAM,yBAAwB,WAAY,KAAa,OAAO,GACtE;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,UACxB,0BAAAH,KAAC,YACC,0BAAAA,KAAC,mBAAgB,OAAS,KAAa,UAAgC,GACzE,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,YACxB,0BAAAH,KAAC,QACC,0BAAAA,KAAC,mBAAgB,OAAS,KAAa,UAAgC,GACzE,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,cACxB,0BAAAH,KAAC,UAAK,OAAM,yBAA0B,eAAa,OAAM,GAC3D;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,QACxB,0BAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAO,KAAa;AAAA,QACpB,QAAO;AAAA,QACP,KAAI;AAAA,QAEJ,0BAAAA,KAAC,mBAAgB,OAAS,KAAa,UAAgC;AAAA;AAAA,IACzE,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,SACxB,0BAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,KAAM,KAAa;AAAA,QACnB,KAAM,KAAa,OAAO;AAAA,QAC1B,OAAQ,KAAa,SAAS;AAAA,QAC9B,SAAQ;AAAA;AAAA,IACV,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,iBAAiB,IAAI,GAC/B,0BAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,EAAG,KAAwB,UAAU;AAAA,QACvD,UACE,gBAAAF,MAAC,UAAK,OAAM,+BAA8B;AAAA;AAAA,UACpC,KAAwB;AAAA,UAAI;AAAA,UAAI,KAAwB,cAAe,KAAwB;AAAA,UAAM;AAAA,WAC3G;AAAA,QAGF,0BAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,KAAK,YAAY,EAAG,KAAwB,UAAU,EAAE;AAAA,YACxD,KAAM,KAAwB,OAAO;AAAA,YACrC,OAAO,YAAY,EAAG,KAAwB,UAAU,EAAE,SAAS;AAAA,YACnE,SAAQ;AAAA;AAAA,QACV;AAAA;AAAA,IACF,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,gBAAgB,IAAI,GAC9B,0BAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,EAAG,KAAuB,UAAU;AAAA,QACtD,UACE,gBAAAF,MAAC,UAAK,OAAM,8BAA6B;AAAA;AAAA,UACnC,KAAuB,SAAmB,IAAI,CAAC,MAAW,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,UAAE;AAAA,UAAI,KAAuB,cAAe,KAAuB;AAAA,UAAM;AAAA,WACzJ;AAAA,QAGF,0BAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAM,YAAY,EAAG,KAAuB,UAAU,EAAE;AAAA,YACxD,OAAO,YAAY,EAAG,KAAuB,UAAU,EAAE,SAAS;AAAA,YAClE,QAAO;AAAA,YACP,KAAI;AAAA,YAEJ,0BAAAA,KAAC,mBAAgB,OAAS,KAAuB,UAAgC;AAAA;AAAA,QACnF;AAAA;AAAA,IACF,GACF;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,qBACxB,0BAAAH,KAAC,SAAI,OAAM,0BACT,0BAAAC,MAAC,OAAE,MAAM,OAAQ,KAAa,UAAU,IAAI,IAAI,SAAU,KAAa,UAAU,IAAI;AAAA;AAAA,MAChF,KAAa;AAAA,MAAW;AAAA,OAC7B,GACF,GACF;AAAA,IAGA,gBAAAD,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,SACxB,0BAAAH,KAAC,QAAG,GACN;AAAA,IAGA,gBAAAA,KAACG,OAAA,EAAK,MAAM,KAAK,SAAS,UACxB,0BAAAH,KAAC,SACC,0BAAAA,KAAC,mBAAgB,OAAS,KAAa,UAAgC,GACzE,GACF;AAAA,KACF,GAEJ,GACF;AAEJ;;;ADxMM,gBAAAK,YAAA;AALC,IAAM,mBAAqD,CAAC,UAAU;AAC3E,QAAM,MAAM,MAAM,IAAI,MAAM,KAAK,KAAK;AAEtC,SACE,gBAAAA,KAACC,UAAA,EAAQ,WAAW,IAAI,GAAG,OAAO,sBAAsB,MAAM,KAAK,KAAK,IACtE,0BAAAD,KAAC,mBAAgB,OAAO,MAAM,KAAK,UAAU,GAC/C;AAEJ;;;AINM,gBAAAE,YAAA;AAHC,IAAM,qBAAyD,CAAC,UAAU;AAC/E,SACE,gBAAAA,KAAC,OAAE,OAAM,uBACP,0BAAAA,KAAC,mBAAgB,OAAO,MAAM,KAAK,UAAU,GAC/C;AAEJ;;;ACbA,SAAgC,QAAAC,aAAY;AAC5C,SAAS,WAAAC,gBAAe;;;ACDxB,SAAoB,gBAAAC,eAAc,gBAAAC,eAAc,aAAAC,YAAW,SAAS,QAAAC,aAAY;AAEhF,SAAS,gBAAgB,YAAY,WAAW,YAAY,uBAAuB;AACnF,SAAS,4BAA4B;;;ACYjC,gBAAAC,YAAA;AAFG,IAAM,UAAmC,CAAC,UAAU;AACzD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,kBAAkB;AAAA,QAClB,CAAC,MAAM,aAAa,EAAE,GAAG,CAAC,CAAC,MAAM;AAAA,MACnC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,eAAY;AAAA;AAAA,EACd;AAEJ;;;ADgHQ,SACE,OAAAC,MADF,QAAAC,aAAA;AAtHD,IAAM,uBAA6D,CAAC,UAAU;AACnF,QAAM,CAAC,YAAY,aAAa,IAAIC,cAAa,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAIA,cAAa,EAAE;AACvD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,cAAa,KAAK;AAC9D,QAAM,CAAC,QAAQ,SAAS,IAAIA,cAAa,KAAK;AAG9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,cAAmC,SAAS;AAE1F,MAAI,kBAAkC;AACtC,MAAI,cAAoD;AACxD,MAAI,gBAAsD;AAC1D,MAAI,UAAU,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAEhE,QAAM,OAAO,MAAM,MAAM,KAAK;AAG9B,QAAM,IAAI,UAAU;AAEpB,WAAS,oBAAoB;AAC3B,uBAAmB,UAAQ,SAAS,YAAY,WAAW,SAAS;AAAA,EACtE;AAGA,UAAQ,YAAY;AAClB,QAAI;AAEF,YAAM,gBAAgB,MAAM,OAAO,SAAS;AAC5C,YAAM,UAAU,cAAc;AAG9B,cAAQ,WAAW;AAAA,QACjB,aAAa;AAAA,QACb,OAAO;AAAA,QACP,eAAe;AAAA,QACf,wBAAwB;AAAA,MAC1B,CAAC;AAED,wBAAkB;AAAA,IACpB,SAAS,GAAG;AACV,cAAQ,KAAK,iCAAiC,CAAC;AAC/C,sBAAgB,sBAAsB;AAAA,IACxC;AAAA,EACF,CAAC;AAGD,WAAS,iBAAiB;AACxB,QAAI,CAAC,KAAK,GAAG;AACX;AAAA,IACF;AAGA,QAAI,aAAa;AACf,mBAAa,WAAW;AAAA,IAC1B;AAEA,sBAAkB,IAAI;AACtB,oBAAgB,EAAE;AAGlB,kBAAc,WAAW,MAAM;AAC7B,eAAS;AAAA,IACX,GAAG,MAAM,gBAAgB,GAAG;AAAA,EAC9B;AAEA,iBAAe,WAAW;AACxB,QAAI,CAAC,KAAK,KAAK,CAAC,gBAAiB;AAEjC,QAAI;AACF,YAAM,EAAE,IAAI,IAAI,MAAM,gBAAgB,OAAO,SAAS,KAAK,CAAC;AAC5D,oBAAc,GAAG;AACjB,sBAAgB,EAAE;AAAA,IACpB,SAAS,GAAG;AAEV,sBAAgB,EAAE;AAClB,oBAAc,EAAE;AAAA,IAClB,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAGA,EAAAC,cAAa,MAAM;AACjB,mBAAe;AAAA,EACjB,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,aAAa;AACf,mBAAa,WAAW;AAAA,IAC1B;AACA,QAAI,eAAe;AACjB,mBAAa,aAAa;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,iBAAe,WAAW;AACxB,QAAI,CAAC,qBAAqB,EAAG;AAE7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK,CAAC;AAC1C,gBAAU,IAAI;AAGd,UAAI,eAAe;AACjB,qBAAa,aAAa;AAAA,MAC5B;AAEA,sBAAgB,WAAW,MAAM;AAC/B,kBAAU,KAAK;AAAA,MACjB,GAAG,GAAI;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SACE,gBAAAH,MAAC,SAAI,OAAM,qBACT;AAAA,oBAAAA,MAAC,SAAI,OAAM,kBACT;AAAA,sBAAAA,MAAC,UAAK,OAAM,YACV;AAAA,wBAAAD,KAAC,WAAQ,KAAK,gBAAgB,WAAU,iBAAgB;AAAA,QAAE;AAAA,SAE5D;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAM,mBACT;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAK;AAAA,YACL,UAAU,CAAC,WAAW;AAAA,YACtB,cAAY,gBAAgB,MAAM,YAAY,EAAE,oBAAoB,IAAI,EAAE,iBAAiB;AAAA,YAC3F,OAAO,gBAAgB,MAAM,YAAY,gBAAgB;AAAA,YAEzD,0BAAAA,KAAC,WAAQ,KAAK,gBAAgB,MAAM,YAAY,aAAa,WAAW;AAAA;AAAA,QAC1E;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAK;AAAA,YACL,cAAY,OAAO,IAAI,EAAE,gBAAgB,IAAI,EAAE,cAAc;AAAA,YAC7D,OAAO,OAAO,IAAI,YAAY;AAAA,YAE9B,0BAAAA,KAAC,WAAQ,KAAK,OAAO,IAAI,kBAAkB,YAAY;AAAA;AAAA,QACzD;AAAA,SACF;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,SAAI,OAAM,mBAET;AAAA,sBAAAD,KAACK,OAAA,EAAK,MAAM,eAAe,KAAK,CAAC,WAAW,GAC1C,0BAAAL,KAAC,SAAI,OAAM,mBACT,0BAAAA,KAAC,SAAI,OAAM,uBAAuB,eAAK,GAAE,GAC3C,GACF;AAAA,MAEA,gBAAAA,KAACK,OAAA,EAAK,MAAM,gBAAgB,MAAM,YAAY,CAAC,eAAe,GAC5D,0BAAAL,KAAC,SAAI,OAAM,uBAAuB,eAAK,GAAE,GAC3C;AAAA,MAEA,gBAAAA,KAACK,OAAA,EAAK,MAAM,gBAAgB,MAAM,aAAa,WAAW,KAAK,CAAC,eAAe,GAC7E,0BAAAL,KAAC,SAAI,WAAW,WAAW,GAAG,OAAM,eAAc,GACpD;AAAA,MAEA,gBAAAA,KAACK,OAAA,EAAK,MAAM,CAAC,WAAW,KAAK,CAAC,eAAe,KAAK,gBAAgB,MAAM,WACtE,0BAAAL,KAAC,SAAI,OAAM,uBAAuB,eAAK,GAAE,GAC3C;AAAA,OACF;AAAA,KACF;AAEJ;;;AExLA,SAAoB,gBAAAM,eAAc,gBAAAC,gBAAc,aAAAC,YAAW,QAAAC,aAAY;AACvE,SAAS,cAAAC,aAAY,mBAAAC,wBAAuB;AAC5C,SAAS,wBAAAC,6BAA4B;;;ACSrC,SAAS,kCAAkC;AAC3C,SAAS,2BAA2B;AACpC,SAAS,gBAAAC,eAAc,gBAAAC,gBAAc,IAAI,aAAAC,YAAW,WAAAC,UAAS,OAAAC,MAAK,QAAAC,aAAY;AAC9E,SAAS,aAAa;AA4IZ,gBAAAC,aAAA;AA9HV,IAAM,YAAY,OAAO,WAAW;AAE7B,IAAM,qBAAyD,CAAC,UAAU;AAE/E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIL,eAAa,KAAK;AAG9D,QAAM,CAAC,QAAQ,SAAS,IAAIA,eAA4B,CAAC,CAAC;AAG1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,eAAa,CAAC;AACxC,MAAI,aAAsD;AAC1D,MAAI,kBAA0C;AAK9C,EAAAE,SAAQ,MAAM;AACZ,QAAI,CAAC,UAAW;AAEhB,UAAM,aAAa,IAAI,eAAuB;AAAA,MAC5C,MAAM,aAAa;AACjB,qBAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,cAAc,WAAW;AAAA,QAC7B,IAAI,2BAA2B;AAAA,UAC7B,aAAa,MAAM;AAAA,UACnB,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAGA,UAAI,UAAU;AAEd,wBAAkB,IAAI,gBAAgB;AAEtC,kBAAY,OAAO,IAAI,eAAe;AAAA,QACpC,MAAM,OAAO;AACX,cAAI,iBAAiB,OAAO,QAAS;AAErC,cAAI,CAAC,SAAS;AACZ,sBAAU;AACV,kBAAM,gBAAgB;AAAA,UACxB;AAEA,gBAAM,MAAM;AACV,gBAAI,YAAY,OAAO;AAErB,wBAAU,QAAM,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,YAC5C,OAAO;AAEL,wBAAU,QAAM,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,YAChC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,OAAO,MAAM;AACX,cAAI,CAAC,iBAAiB,OAAO,SAAS;AACpC,kBAAM,cAAc;AAAA,UACtB;AAAA,QACF;AAAA,QACA,OAAO,MAAM;AACX,cAAI,CAAC,iBAAiB,OAAO,SAAS;AACpC,kBAAM,cAAc;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAC,GAAG,EAAE,QAAQ,gBAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU;AAEvD,YAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD;AAAA,QACF;AAEA,YAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,WAAW,GAAG;AACjE,4BAAkB,IAAI;AACtB;AAAA,QACF;AACA,gBAAQ,MAAM,iBAAiB,KAAK;AACpC,0BAAkB,IAAI;AAAA,MACxB,CAAC;AAAA,IACH,SAAS,OAAO;AAEd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,WAAW,GAAG;AACjE,0BAAkB,IAAI;AACtB;AAAA,MACF;AACA,cAAQ,MAAM,kCAAkC,KAAK;AACrD,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,EAAAH,cAAa;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,CAAC,YAAY;AACX,UAAI,CAAC,aAAa,CAAC,cAAc,iBAAiB,OAAO,QAAS;AAGlE,YAAM,eAAe,MAAM;AAC3B,UAAI,QAAQ,SAAS,gBAAgB,CAAC,eAAe,GAAG;AACtD,cAAM,cAAc,QAAQ,MAAM,YAAY;AAC9C,mBAAW,QAAQ,WAAkB;AACrC,iBAAS,QAAQ,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAE,WAAU,MAAM;AACd,qBAAiB,MAAM;AACvB,iBAAa;AACb,sBAAkB,KAAK;AACvB,cAAU,CAAC,CAAC;AACZ,aAAS,CAAC;AAAA,EACZ,CAAC;AAGD,SACE,gBAAAI;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,MAAM,EAAE,eAAe,KAAK,CAAC,aAAa,OAAO,EAAE,WAAW;AAAA,MAC9D;AAAA;AAAA,QAEE,gBAAAC,MAAC,SAAI,OAAM,+BACT,0BAAAA,MAAC,UAAM,gBAAM,MAAK,GACpB;AAAA;AAAA,MAIF,0BAAAA,MAAC,SAAI,OAAM,+BACT,0BAAAA,MAAC,UACC,0BAAAA,MAACF,MAAA,EAAI,MAAM,OAAO,GACf,WAAC,UACA,gBAAAE,MAAC,UAAK,OAAO,MAAM,aAAa,oBAAoB,KAAK,GACtD,gBAAM,SACT,GAEJ,GACF,GACF;AAAA;AAAA,EACF;AAEJ;;;AD3DM,SACE,OAAAC,OADF,QAAAC,aAAA;AA7FC,IAAM,uBAA6D,CAAC,UAAU;AACnF,QAAM,CAAC,QAAQ,SAAS,IAAIC,eAAa,KAAK;AAE9C,QAAM,WAAW,MAAM,MAAM,KAAK,QAAQ;AAC1C,QAAM,OAAO,MAAM,MAAM,KAAK;AAG9B,QAAM,IAAI,UAAU;AAGpB,QAAM,EAAE,iBAAiB,gBAAgB,IAAI,SAAS,MAAM,SAAS,aAAa;AAGlF,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,eAAa,KAAK;AAGlE,QAAM,wBAAwB,MAAM;AAClC,WAAO,CAAC,MAAM,oBAAoB,KAAK,KAAK,KAAK,EAAE,SAAS;AAAA,EAC9D;AAIA,EAAAC,cAAa,YAAY;AACvB,UAAM,OAAO,gBAAgB;AAC7B,UAAM,OAAO,SAAS;AACtB,UAAM,kBAAkB,sBAAsB;AAG9C,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,gBAAgB;AAAA,IACxB,WAAW,QAAQ,SAAS,QAAQ;AAElC,UAAI,CAAC,KAAK,gBAAgB,IAAI,IAAW,GAAG;AAC1C,YAAI;AACF,8BAAoB,KAAK;AAEzB,gBAAM,iBAAiB,KAAK,YAAY,mBAAmB;AAC3D,gBAAM,eAAe,MAAM,OAAO,OAAO,EAAE,KAAK,OAAK,OAAO,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAC1F,gBAAM,cAAc,eAAe,SAAS,IAAI,KAAK,aAAa,SAAS,IAAI;AAE/E,cAAI,aAAa;AACf,kBAAM,KAAK,YAAY,aAAa,IAAW;AAC/C,iBAAK,gBAAgB,IAAI,IAAW;AAAA,UACtC;AAEA,8BAAoB,IAAI;AAAA,QAC1B,QAAQ;AAEN,8BAAoB,IAAI;AAAA,QAC1B;AAAA,MACF,OAAO;AACL,4BAAoB,IAAI;AAAA,MAC1B;AAAA,IACF,OAAO;AAEL,0BAAoB,IAAI;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,MAAI,gBAAsD;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,eAAe;AACjB,mBAAa,aAAa;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,iBAAe,WAAW;AACxB,QAAI,CAACC,sBAAqB,EAAG;AAE7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK,CAAC;AAC1C,gBAAU,IAAI;AAGd,UAAI,eAAe;AACjB,qBAAa,aAAa;AAAA,MAC5B;AAEA,sBAAgB,WAAW,MAAM;AAC/B,kBAAU,KAAK;AAAA,MACjB,GAAG,GAAI;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SACE,gBAAAJ,MAAC,SAAI,OAAM,kBACT;AAAA,oBAAAA,MAAC,SAAI,OAAM,eACT;AAAA,sBAAAD,MAAC,UAAK,OAAM,YAAY,mBAAS,GAAE;AAAA,MACnC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAK;AAAA,UACL,cAAY,OAAO,IAAI,EAAE,aAAa,IAAI,EAAE,WAAW;AAAA,UACvD,OAAO,OAAO,IAAI,YAAY;AAAA,UAE9B,0BAAAA,MAAC,WAAQ,KAAK,OAAO,IAAIM,mBAAkBC,aAAY;AAAA;AAAA,MACzD;AAAA,OACF;AAAA,IACA,gBAAAP,MAAC,SAAI,OAAM,gBACT,0BAAAA,MAAC,SAAI,OAAM,iBAET,0BAAAA;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,MAAM,sBAAsB,KAAK,gBAAgB,KAAK,iBAAiB;AAAA,QACvE;AAAA;AAAA,UAEE,gBAAAR,MAAC,SAAI,OAAM,iBAAgB,0BAAAA,MAAC,UAAM,eAAK,GAAE,GAAO;AAAA;AAAA,QAGlD,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,MAAM,SAAS;AAAA,YACf,OAAO,MAAM,SAAS;AAAA,YACtB,aAAa,gBAAgB,EAAG;AAAA;AAAA,QAClC;AAAA;AAAA,IACF,GACF,GACF;AAAA,KACF;AAEJ;;;AHnEI,qBAAAS,WAGI,OAAAC,OAHJ,QAAAC,aAAA;AApDG,IAAM,gBAA+C,CAAC,UAAU;AACrE,QAAM,WAAW,MAAM,MAAM,KAAK,QAAQ;AAG1C,QAAM,kBAAkB,MAAM,MAAM,mBAAmB,SAAS,CAAC;AAGjE,QAAM,2BAA2B,MAAM;AACrC,UAAM,YAAY,MAAM,mBAAmB,SAAS,CAAC;AACrD,QAAI,CAAC,UAAW,QAAO;AAGvB,UAAM,SAAS,MAAM,mBAAmB,SAAS,CAAC;AAGlD,QAAI,QAAQ,UAAU;AACpB,aAAO;AAAA,IACT;AAGA,WAAO,MAAM,gBAAgB;AAAA,EAC/B;AAGA,QAAM,YAAY,MAAM,SAAS,MAAM;AAEvC,QAAM,uBAAuB,MAAM,MAAM,wBAAwB;AAGjE,QAAM,cAAc,OAAO;AAAA,IACzB,SAAS,MAAM,KAAK;AAAA,IACpB,MAAM,SAAS;AAAA,IACf,WAAW,MAAM,gBAAgB;AAAA,IACjC,UAAU,MAAM,mBAAmB,SAAS,CAAC,GAAG;AAAA,EAClD;AAGA,QAAM,eAAe,OAAO;AAAA,IAC1B,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,eAAe,MAAM;AAAA,IACrB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EACrB;AAGA,QAAM,eAAe,OAAO;AAAA,IAC1B,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM;AAAA,EACtB;AAEA,SACE,gBAAAA,MAAAF,WAAA,EAEE;AAAA,oBAAAC,MAACE,OAAA,EAAK,MAAM,gBAAgB,KAAK,yBAAyB,GACxD,0BAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,WAAW,gBAAgB;AAAA,QAC1B,GAAG,YAAY;AAAA;AAAA,IAClB,GACF;AAAA,IAGA,gBAAAH,MAACE,OAAA,EAAK,MAAM,UAAU,KAAK,CAAC,yBAAyB,GACnD,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM;AAAA,QACZ,cAAc,MAAM;AAAA;AAAA,IACtB,GACF;AAAA,IAGA,gBAAAA,MAACE,OAAA,EAAK,MAAM,CAAC,UAAU,KAAK,CAAC,yBAAyB,GACpD,0BAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,WAAW,qBAAqB;AAAA,QAC/B,GAAG,aAAa;AAAA;AAAA,IACnB,GACF;AAAA,KACF;AAEJ;AAEA,IAAO,wBAAQ;;;AK3Gf,SAAyB,QAAAC,OAAM,SAAAC,cAAa;AA+DxB,SACE,OAAAC,OADF,QAAAC,aAAA;AAvDb,IAAM,gBAA+C,CAAC,UAAU;AACrE,QAAM,UAAU,MAAM,MAAM,KAAK;AACjC,QAAM,QAAQ,MAAM,MAAM,KAAK,SAAS;AAKxC,WAAS,qBAAqB,MAAgB;AAC5C,UAAM,aAAa,KAAK,SAAS,CAAC;AAClC,QAAI,YAAY,SAAS,aAAa;AACpC,aAAO,WAAW;AAAA,IACpB;AACA,WAAO,CAAC;AAAA,EACV;AAMA,WAAS,qBAAqB,MAA+B;AAC3D,WAAO,KAAK,SAAS,OAAO,CAAC,OAAO,UAAU;AAE5C,UAAI,UAAU,KAAK,MAAM,SAAS,aAAa;AAC7C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAKA,WAAS,iBAAiB,MAAyB;AACjD,WAAO,qBAAqB,IAAI,EAAE,SAAS;AAAA,EAC7C;AAEA,QAAM,cAAc,MAAM,MAAM,KAAK,SAAS,KAAK,UAAQ,KAAK,YAAY,QAAQ,KAAK,YAAY,MAAS;AAE9G,SACE,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,MAAM,QAAQ;AAAA,MACd,UACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,iBAAiB,YAAY,IAAI,eAAe,EAAE;AAAA,UAEzD,0BAAAA,MAACG,QAAA,EAAM,MAAM,MAAM,KAAK,UACrB,WAAC,MAAM,UAAU;AAChB,kBAAM,WAAW,KAAK;AACtB,kBAAM,aAAa,SAAS,YAAY,QAAQ,SAAS,YAAY;AAErE,mBACE,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,sBAAsB,aAAa,eAAe,EAAE;AAAA,gBAE3D;AAAA,kCAAAD,MAACE,OAAA,EAAK,MAAM,YACV,0BAAAD,MAAC,WAAM,OAAM,cACX;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,SAAS,WAAW;AAAA,wBAC7B,UAAQ;AAAA,wBACR,OAAM;AAAA;AAAA,oBACR;AAAA,oBACA,gBAAAA,MAAC,UAAK,OAAM,gBACV,0BAAAA,MAAC,mBAAgB,OAAO,qBAAqB,QAAQ,GAAG,GAC1D;AAAA,qBACF,GACF;AAAA,kBACA,gBAAAC,MAACC,OAAA,EAAK,MAAM,CAAC,YACX;AAAA,oCAAAF,MAAC,mBAAgB,OAAO,qBAAqB,QAAQ,GAAG;AAAA,oBAExD,gBAAAA,MAACE,OAAA,EAAK,MAAM,iBAAiB,QAAQ,GACnC,0BAAAF,MAACG,QAAA,EAAM,MAAM,qBAAqB,QAAQ,GACvC,WAAC,UACA,gBAAAH,MAAC,qBAAkB,MAAM,MAAM,GAAG,GAEtC,GACF;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA,UAEJ,GACF;AAAA;AAAA,MACF;AAAA,MAGF,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,iBAAiB,YAAY,IAAI,eAAe,EAAE;AAAA,UACzD,OAAO,MAAM;AAAA,UAEb,0BAAAA,MAACG,QAAA,EAAM,MAAM,MAAM,KAAK,UACrB,WAAC,MAAM,UAAU;AAChB,kBAAM,WAAW,KAAK;AACtB,kBAAM,aAAa,SAAS,YAAY,QAAQ,SAAS,YAAY;AAErE,mBACE,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,sBAAsB,aAAa,eAAe,EAAE;AAAA,gBAE3D;AAAA,kCAAAD,MAACE,OAAA,EAAK,MAAM,YACV,0BAAAD,MAAC,WAAM,OAAM,cACX;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,SAAS,WAAW;AAAA,wBAC7B,UAAQ;AAAA,wBACR,OAAM;AAAA;AAAA,oBACR;AAAA,oBACA,gBAAAA,MAAC,UAAK,OAAM,gBACV,0BAAAA,MAAC,mBAAgB,OAAO,qBAAqB,QAAQ,GAAG,GAC1D;AAAA,qBACF,GACF;AAAA,kBACA,gBAAAC,MAACC,OAAA,EAAK,MAAM,CAAC,YACX;AAAA,oCAAAF,MAAC,mBAAgB,OAAO,qBAAqB,QAAQ,GAAG;AAAA,oBAExD,gBAAAA,MAACE,OAAA,EAAK,MAAM,iBAAiB,QAAQ,GACnC,0BAAAF,MAACG,QAAA,EAAM,MAAM,qBAAqB,QAAQ,GACvC,WAAC,UACA,gBAAAH,MAAC,qBAAkB,MAAM,MAAM,GAAG,GAEtC,GACF;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA,UAEJ,GACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACzIA,SAAoB,OAAAI,MAAK,QAAAC,aAAY;AAqB/B,SAOc,OAAAC,OAPd,QAAAC,aAAA;AAdC,IAAM,iBAAiD,CAAC,UAAU;AACvE,WAAS,eAAe,MAAoC;AAC1D,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK,SAAS,CAAC;AAC5C,QAAM,gBAAgB,MAAM,MAAM,KAAK,SAAS,MAAM,CAAC;AAEvD,QAAM,gBAAgB,CAAC,cAAsB;AAC3C,WAAO,yBAAyB,MAAM,KAAK,QAAQ,SAAS,KAAK,MAAM;AAAA,EACzE;AAEA,SACE,gBAAAD,MAAC,SAAI,OAAM,2BACT,0BAAAC,MAAC,WAAM,OAAM,mBACX;AAAA,oBAAAD,MAACE,OAAA,EAAK,MAAM,SAAS,GACnB,0BAAAF,MAAC,WACC,0BAAAA,MAAC,QACC,0BAAAA,MAACG,MAAA,EAAI,MAAM,SAAS,EAAG,UACpB,WAAC,MAAM,cACN,gBAAAH,MAAC,QAAG,OAAO,cAAc,UAAU,CAAC,GAClC,0BAAAA,MAAC,mBAAgB,OAAO,eAAe,IAAI,GAAG,GAChD,GAEJ,GACF,GACF,GACF;AAAA,IACA,gBAAAA,MAAC,WACC,0BAAAA,MAACG,MAAA,EAAI,MAAM,cAAc,GACtB,WAAC,QACA,gBAAAH,MAAC,QACC,0BAAAA,MAACG,MAAA,EAAI,MAAM,IAAI,UACZ,WAAC,MAAM,cACN,gBAAAH,MAAC,QAAG,OAAO,cAAc,UAAU,CAAC,GAClC,0BAAAA,MAAC,mBAAgB,OAAO,eAAe,IAAI,GAAG,GAChD,GAEJ,GACF,GAEJ,GACF;AAAA,KACF,GACF;AAEJ;;;ACrDA,SAAoB,OAAAI,YAAW;AAYrB,gBAAAC,aAAA;AALH,IAAM,sBAA2D,CAAC,UAAU;AACjF,SACE,gBAAAA,MAAC,gBAAW,OAAM,wBAChB,0BAAAA,MAACC,MAAA,EAAI,MAAM,MAAM,KAAK,UACnB,WAAC,UACA,gBAAAD,MAAC,qBAAkB,MAAM,OAAO,GAEpC,GACF;AAEJ;;;ACVS,gBAAAE,aAAA;AADF,IAAM,yBAAiE,MAAM;AAClF,SAAO,gBAAAA,MAAC,QAAG,OAAM,4BAA2B;AAC9C;;;ACRA,SAAoB,OAAAC,MAAK,QAAAC,cAAY;AACrC,SAAS,WAAAC,gBAAe;AA6DN,gBAAAC,aAAA;AArClB,SAAS,aAAa,YAA0D;AAC9E,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAM,UAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAErD,QAAI;AACF,cAAQ,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA,IACjC,QAAQ;AAEN,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAMO,IAAM,qBAAyD,CAAC,UAAU;AAC/E,QAAM,gBAAgB,MAAM,MAAM,KAAK;AACvC,QAAM,UAAU,MAAM,aAAa,MAAM,KAAK,UAAU;AACxD,QAAM,kBAAkB,MAAM,MAAM,mBAAmB,cAAc,CAAC;AAGtE,QAAM,qBAAqB,MAAM,CAAC,CAAC,MAAM,mBAAmB,cAAc,CAAC;AAE3E,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAM,mBAAmB;AAAA,MACzB,UACE,gBAAAD,MAAC,SAAI,OAAO,2CAA2C,cAAc,CAAC,IACpE,0BAAAA,MAACC,QAAA,EAAK,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,SAAS,SAAS,GAC9D,0BAAAD,MAAC,SAAI,OAAM,+BACT,0BAAAA,MAACE,MAAA,EAAI,MAAM,MAAM,KAAK,UACnB,WAAC,UACA,gBAAAF,MAAC,qBAAkB,MAAM,OAAO,GAEpC,GACF,GACF,GACF;AAAA,MAIF,0BAAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAW,gBAAgB;AAAA,UAC3B,MAAM,cAAc;AAAA,UACpB,SAAS,QAAQ;AAAA,UAGjB,0BAAAH,MAACC,QAAA,EAAK,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,SAAS,SAAS,GAC9D,0BAAAD,MAACE,MAAA,EAAI,MAAM,MAAM,KAAK,UACnB,WAAC,UACA,gBAAAF,MAAC,qBAAkB,MAAM,OAAO,GAEpC,GACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AC1EM,gBAAAI,aAAA;AAHC,IAAM,mBAAqD,CAAC,UAAU;AAC3E,SACE,gBAAAA,MAAC,SAAI,OAAM,mBACT,0BAAAA,MAAC,UAAM,eAAK,UAAU,MAAM,MAAM,MAAM,CAAC,GAAE,GAC7C;AAEJ;;;AhByDI,qBAAAC,WAGqC,OAAAC,OAHrC,QAAAC,aAAA;AA5CJ,IAAM,sBAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AACjB;AAEA,SAAS,aAAa,MAAc,kBAAiD;AACnF,QAAM,MAAM,EAAE,GAAG,qBAAqB,GAAG,iBAAiB;AAC1D,SAAO,IAAI,IAAI,KAAK;AACtB;AAKA,SAAS,gBAAgB,MAAkD;AACzE,QAAM,OAAQ,KAAa;AAC3B,SAAO,SAAS,wBACT,SAAS,mBACT,SAAS;AAClB;AAKA,SAASC,YAAW,MAAyC;AAC3D,SAAO,KAAK,SAAS;AACvB;AAMO,IAAM,oBAAuD,CAAC,UAAU;AAC7E,SACE,gBAAAD,MAAAF,WAAA,EAEE;AAAA,oBAAAC,MAACG,QAAA,EAAK,MAAMD,YAAW,MAAM,IAAI,GAC/B,0BAAAF,MAAC,SAAI,OAAM,uBAAsB,0BAAAA,MAAC,UAAO,gBAAM,KAAc,OAAM,GAAO,GAC5E;AAAA,IAGA,gBAAAA,MAACG,QAAA,EAAK,MAAM,gBAAgB,MAAM,IAAI,KAAK,CAACD,YAAW,MAAM,IAAI,GAC/D,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM;AAAA,QACZ,kBAAkB,MAAM;AAAA;AAAA,IAC1B,GACF;AAAA,IAGA,gBAAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAO,MAAM,KAAqB,SAAS,UAAU,CAACD,YAAW,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,IAAI;AAAA,QAE3G,0BAAAF;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,MAAM;AAAA,YACZ,kBAAkB,MAAM;AAAA,YACxB,kBAAkB,MAAM;AAAA,YACxB,aAAa,MAAM;AAAA,YACnB,sBAAsB,MAAM,aAAa,MAAM;AAAA;AAAA,QACjD;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MACG,MAAM,KAAqB,SAAS,UACrC,CAACD,YAAW,MAAM,IAAI,KACtB,CAAC,gBAAgB,MAAM,IAAI;AAAA,QAG7B,0BAAAF;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,WAAW,aAAc,MAAM,KAAqB,MAAM,MAAM,UAAU;AAAA,YAC1E,MAAM,MAAM;AAAA;AAAA,QACd;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,IAAO,4BAAQ;;;AiBrHf,SAAoB,OAAAC,MAAK,QAAAC,cAAY;AAmC7B,gBAAAC,OAUU,QAAAC,aAVV;AAxBD,IAAM,qBAAyD,MAAM;AAC1E,QAAM,EAAE,qBAAqB,uBAAuB,IAAI,sBAAsB;AAM9E,QAAM,mBAAmB,MAAM;AAC7B,WAAO,uBAAuB,EAC3B,IAAI,iBAAe;AAAA,MAClB;AAAA,MACA,YAAY,oBAAoB,EAAE,UAAU;AAAA,IAC9C,EAAE,EACD,OAAO,UAAQ,KAAK,eAAe,MAAS;AAAA,EACjD;AAKA,QAAM,eAAe,MAAM,iBAAiB,EAAE,SAAS;AAEvD,SACE,gBAAAD,MAACE,QAAA,EAAK,MAAM,aAAa,GACvB,0BAAAD,MAAC,aAAQ,OAAM,uBACb;AAAA,oBAAAD,MAAC,QAAG,OAAM,+BAA8B;AAAA,IACxC,gBAAAA,MAAC,QAAG,OAAM,4BACR,0BAAAA,MAACG,MAAA,EAAI,MAAM,iBAAiB,GACzB,WAAC,MAAM,UACN,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,MAAM,KAAK,UAAU;AAAA,QACzB,OAAM;AAAA,QAEN;AAAA,0BAAAA,MAAC,SAAI,OAAM,8BAET;AAAA,4BAAAA,MAAC,UAAK,OAAM,6BAA6B;AAAA,oBAAM,IAAI;AAAA,cAAE;AAAA,eAAC;AAAA,YAGtD,gBAAAD,MAAC,SAAI,OAAM,2BACT,0BAAAA,MAACG,MAAA,EAAI,MAAM,KAAK,WAAW,UACxB,WAAC,UACA,gBAAAH;AAAA,cAAC;AAAA;AAAA,gBACC,MAAO;AAAA;AAAA,YACT,GAEJ,GACF;AAAA,aACF;AAAA,UAGA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,UAAU,KAAK,UAAU;AAAA,cAC/B,OAAM;AAAA,cACN,cAAW;AAAA,cACZ;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACF,GAEJ,GACF;AAAA,KACF,GACF;AAEJ;;;AlBHI,SAkBU,OAAAI,OAlBV,QAAAC,cAAA;AApCJ,SAAS,eAAe,OAAuB;AAC7C,QAAM,cAAc,WAAW;AAAA,IAC7B,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,GAAG,KAAK;AAER,QAAM,aAAa,MAAM,YAAY,cAAc,CAAC;AACpD,QAAM,mBAAmB,MAAM,YAAY,oBAAoB,CAAC;AAChE,QAAM,mBAAmB,MAAM,YAAY,oBAAoB,CAAC;AAChE,QAAM,mBAAmB,MAAM,YAAY,oBAAoB,CAAC;AAEhE,QAAM;AAAA,IACJ;AAAA,EACF,IAAI,sBAAsB;AAG1B,QAAM,eAAe,MAAM;AACzB,QAAI,YAAY,WAAW;AAEzB,aAAO,YAAY,UAAU;AAAA,IAC/B;AACA,WAAO,OAAO,YAAY,WAAW,aAAa,YAAY,OAAO,IAAI,YAAY;AAAA,EACvF;AAEA,QAAM,0BAA0B,MAAM;AAEpC,QAAI,YAAY,WAAW;AACzB,aAAO,YAAY,UAAU,kBAAkB;AAAA,IACjD;AAEA,WAAO,OAAO,YAAY,sBAAsB,aAAa,YAAY,kBAAkB,IAAI,YAAY;AAAA,EAC7G;AAEA,SACE,gBAAAA,OAAC,SAAI,OAAM,aAET;AAAA,oBAAAD,MAACE,MAAA,EAAI,MAAM,aAAa,GACrB,WAAC,UACA,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAM,MAAM,KAAK,SAAS,gBAAgB,MAAM,KAAK,SAAS;AAAA,QAE9D,0BAAAH;AAAA,UAAC;AAAA;AAAA,YACC,OACE,mBACE,MAAM,WAAW,cAAc,YAAY,iBAAiB,YAAY,YAC1E,GACE,YAAY,kBAAkB,2BAA2B,EAC3D,GACG,MAAc,gBAAgB,4BAA4B,EAC7D;AAAA,YAGF,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,MAAM;AAAA,gBACZ,kBAAkB,iBAAiB;AAAA,gBACnC,kBAAkB,iBAAiB;AAAA,gBACnC,kBAAkB,iBAAiB;AAAA,gBACnC,YAAY,WAAW;AAAA,gBACvB,aAAa,MAAM;AAAA;AAAA,YACrB;AAAA;AAAA,QACF;AAAA;AAAA,IACF,GAEJ;AAAA,IAGA,gBAAAA,MAACG,QAAA,EAAK,MAAM,wBAAwB,KAAK,uBAAuB,EAAE,SAAS,GACzE,0BAAAH,MAAC,sBAAmB,GACtB;AAAA,KACF;AAEJ;AAOO,IAAM,YAAuC,CAAC,UAAU;AAC7D,SAAO,gBAAAA,MAAC,kBAAgB,GAAG,OAAO;AACpC;AAEA,IAAO,oBAAQ;;;AmBxHf,SAAoB,gBAAAI,eAA0B,WAAAC,UAAS,aAAAC,kBAAiB;AAKxE,SAAS,wBAAwB;AA6F3B,gBAAAC,aAAA;AAtFC,IAAM,mBAAqD,CAAC,UAAU;AAC3E,QAAM,mBAAmB,OAAO;AAAA,IAC9B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,GAAG,MAAM;AAAA,EACX;AAEA,QAAM,YAAY,aAAa,gBAAgB;AAC/C,QAAM,EAAE,QAAQ,QAAQ,UAAU,QAAQ,OAAO,mBAAmB,UAAU,cAAc,qBAAAC,sBAAqB,OAAO,IAAI;AAG5H,QAAM,WAAW,MAAM,cAAc,iBAAiB;AAEtD,EAAAC,SAAQ,MAAM;AACZ,QAAI,MAAM,UAAU;AAClB,YAAM,SAAS,SAAS,QAAQ;AAAA,QAC9B,IAAI;AAAA,QACJ,OAAO,MAAM,iBAAiB;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM,UAAU;AAClB,YAAM,SAAS,WAAW,QAAQ;AAAA,IACpC;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,OAAO,MAAM,WAAW;AAEnD,iBAAe,oBAAoB;AACjC,QAAI,CAAC,MAAM,OAAQ;AAEnB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO;AAE5B,uBAAiB,SAAS,QAAQ;AAChC,eAAO,KAAK;AAAA,MACd;AAEA,eAAS;AAAA,IACX,SAAS,OAAO;AACd,cAAQ,MAAM,kBAAkB,KAAK;AACrC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,WAAS,mBAAmB,YAAqB,YAAqB;AACpE,QAAI,CAAC,YAAY;AACf,UAAI,YAAY;AACd,cAAM;AAAA,MACR;AACA;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,cAAc,EAAE,GAAG;AAC5C,YAAM,QAAQ,WAAW,OAAO,cAAc,IAAI,MAAM;AACxD,aAAO,KAAK;AAAA,IACd,OAAO;AACL,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AAGA,EAAAC,cAAa,MAAM;AACjB,UAAM,aAAa,MAAM;AAEzB,QAAI,aAAa,GAAG;AAClB,wBAAkB;AAAA,IACpB,OAAO;AACL,yBAAmB,YAAY,SAAS,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AAGD,EAAAA,cAAa,MAAM;AACjB,UAAM,gBAAgB,MAAM;AAC5B,QAAI,iBAAiB,MAAM,YAAY,SAAS,GAAG;AACjD,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE,gBAAAJ,MAACC,sBAAA,EAAoB,OAAO,cAC1B,0BAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,mBAAmB,kBAAkB;AAAA,MACrC,iBAAiB,MAAM;AAAA,MACvB,YAAY,MAAM;AAAA,MAClB,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,MAAM;AAAA;AAAA,EAC1B,GACF;AAEJ;;;AC9GA,SAAkC,gBAAAK,gBAAc,aAAAC,YAAW,WAAAC,gBAAoB;AA8I3E,gBAAAC,aAAA;AA7HG,IAAM,sBAA2D,CAAC,UAAU;AACjF,MAAI;AAEJ,QAAM,CAAC,kBAAkB,mBAAmB,IAAIH,eAAa,KAAK;AAGlE,MAAI,gBAAgB;AACpB,MAAI,mBAAmB;AAEvB,QAAM,UAAU,MAAM,OAAO,MAAM,YAAY,aAAa,MAAM,QAAQ,IAAI,MAAM,WAAW;AAC/F,QAAM,YAAY,MAAM,MAAM,aAAa;AAC3C,QAAM,iBAAiB,MAAM,MAAM,YAAY;AAK/C,WAAS,eAAwB;AAC/B,QAAI,CAAC,aAAc,QAAO;AAE1B,UAAM,EAAE,WAAW,cAAc,aAAa,IAAI;AAClD,WAAO,eAAe,YAAY,gBAAgB,UAAU;AAAA,EAC9D;AAKA,WAAS,eAAe,QAAQ,OAAa;AAC3C,QAAI,CAAC,aAAc;AAGnB,QAAI,iBAAiB,KAAK,CAAC,MAAO;AAElC,iBAAa,SAAS;AAAA,MACpB,KAAK,aAAa;AAAA,MAClB,UAAU,eAAe;AAAA,IAC3B,CAAC;AAAA,EACH;AAKA,WAAS,eAAwB;AAC/B,QAAI,CAAC,aAAc,QAAO;AAC1B,WAAO,aAAa,eAAe,aAAa;AAAA,EAClD;AAKA,WAAS,eAAqB;AAC5B,QAAI,CAAC,aAAc;AAEnB,UAAM,EAAE,WAAW,cAAc,aAAa,IAAI;AAGlD,QAAI,gBAAgB,cAAc;AAChC,0BAAoB,KAAK;AACzB,sBAAgB;AAChB,yBAAmB;AACnB;AAAA,IACF;AAGA,QAAI,aAAa,GAAG;AAElB,0BAAoB,KAAK;AAAA,IAC3B,OAAO;AAGL,YAAM,gBAAgB,YAAY;AAClC,YAAM,qBAAqB,iBAAiB;AAE5C,UAAI,iBAAiB,oBAAoB;AAEvC,4BAAoB,IAAI;AAAA,MAC1B;AAAA,IACF;AAGA,oBAAgB;AAChB,uBAAmB;AAAA,EACrB;AAGA,MAAI,WAAoC;AAExC,EAAAE,SAAQ,MAAM;AACZ,QAAI,CAAC,aAAc;AAGnB,oBAAgB,aAAa;AAC7B,uBAAmB,aAAa;AAEhC,eAAW,IAAI,iBAAiB,MAAM;AAEpC,4BAAsB,MAAM;AAC1B,YAAI,CAAC,aAAc;AAGnB,YAAI,CAAC,aAAa,GAAG;AACnB,8BAAoB,KAAK;AAAA,QAC3B;AAGA,2BAAmB,aAAa;AAGhC,YAAI,QAAQ,KAAK,CAAC,iBAAiB,GAAG;AACpC,yBAAe;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,aAAS,QAAQ,cAAc;AAAA,MAC7B,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAED,EAAAD,WAAU,MAAM;AACd,cAAU,WAAW;AAAA,EACvB,CAAC;AAED,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAM;AAAA,MACN,UAAU;AAAA,MAET,gBAAM;AAAA;AAAA,EACT;AAEJ;;;ACtJA,SAAmC,iBAAAC,gBAAe,cAAAC,aAAY,cAAAC,aAAY,gBAAAC,sBAAmC;AAE7G,SAAS,kBAAkB;AA6BrB,gBAAAC,aAAA;AAzBC,IAAM,eAAeJ,eAGzB;AAOI,IAAM,gBAA+C,CAAC,UAAU;AACrE,MAAI;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAIG,eAAoB,MAAM,SAAS,SAAS;AAGtE,EAAAD,YAAW,MAAM;AACf,UAAM,eAAe,MAAM,SAAS;AACpC,aAAS,YAAY;AACrB,QAAI,OAAO,aAAa,eAAe,cAAc;AACnD,iBAAW,cAAc,YAAY;AAAA,IACvC;AAAA,EACF,CAAC;AAED,SACE,gBAAAE,MAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,OAAO,SAAS,GAC9C,0BAAAA,MAAC,SAAI,KAAK,cAAc,OAAM,4BAC3B,gBAAM,UACT,GACF;AAEJ;AAEO,SAAS,WAAW;AACzB,QAAM,UAAUH,YAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO;AACT;;;ACwBA;AAAA,EACE;AAAA,EACA,0BAAAI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,OACK;AAGP,SAAS,MAAM,UAAU,QAAQ,kBAAkB;","names":["createSignal","createEffect","createSignal","createSignal","references","seen","DefinationsProvider","createSignal","createEffect","_","parserOptions","createSignal","createSignal","createContext","createSignal","jsx","useContext","useContext","createSignal","createSignal","createBlockTransformer","For","Show","Show","Dynamic","Dynamic","For","Show","createSignal","createEffect","onCleanup","jsx","Show","jsx","Show","Fragment","jsx","jsxs","For","Show","idx","jsx","Dynamic","jsx","Show","Dynamic","createEffect","createSignal","onCleanup","Show","jsx","jsx","jsxs","createSignal","createEffect","onCleanup","Show","createEffect","createSignal","onCleanup","Show","LucideCopy","LucideCopyCheck","isClipboardAvailable","createEffect","createSignal","onCleanup","onMount","For","Show","jsx","jsx","jsxs","createSignal","createEffect","onCleanup","isClipboardAvailable","LucideCopyCheck","LucideCopy","Show","Fragment","jsx","jsxs","Show","Dynamic","Show","Index","jsx","jsxs","Show","Index","For","Show","jsx","jsxs","Show","For","For","jsx","For","jsx","For","Show","Dynamic","jsx","Show","For","Dynamic","jsx","Fragment","jsx","jsxs","isHtmlNode","Show","Dynamic","For","Show","jsx","jsxs","Show","For","jsx","jsxs","For","Show","createEffect","onMount","onCleanup","jsx","DefinationsProvider","onMount","onCleanup","createEffect","createSignal","onCleanup","onMount","jsx","createContext","useContext","createMemo","createSignal","jsx","createBlockTransformer","mathPlugin","defaultPlugins","applyTheme"]}
1
+ {"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useProvideDefinations.tsx","../src/composables/useTypewriter.ts","../src/utils/cursor.ts","../src/utils/animatedChunks.ts","../src/composables/useShiki.ts","../src/components/ConfigProvider.tsx","../src/composables/useDefinationsContext.ts","../src/composables/useStreamRenderer.ts","../src/composables/useBlockTransformer.ts","../src/components/Incremark.tsx","../src/components/IncremarkRenderer.tsx","../src/components/IncremarkHeading.tsx","../src/components/IncremarkInline.tsx","../src/components/IncremarkMath.tsx","../src/components/IncremarkHtmlElement.tsx","../src/components/IncremarkParagraph.tsx","../src/components/IncremarkCode.tsx","../src/components/IncremarkCodeMermaid.tsx","../src/components/SvgIcon.tsx","../src/components/IncremarkCodeDefault.tsx","../src/components/CachedCodeRenderer.tsx","../src/components/IncremarkList.tsx","../src/components/IncremarkTable.tsx","../src/components/IncremarkBlockquote.tsx","../src/components/IncremarkThematicBreak.tsx","../src/components/IncremarkContainer.tsx","../src/components/IncremarkDefault.tsx","../src/components/IncremarkFootnotes.tsx","../src/components/IncremarkContent.tsx","../src/components/AutoScrollContainer.tsx","../src/components/ThemeProvider.tsx","../src/index.ts"],"sourcesContent":["import {\n createSignal,\n createComputed,\n createEffect,\n onCleanup,\n type Accessor,\n type Setter\n} from 'solid-js'\nimport {\n createIncremarkParser,\n type IncremarkParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root,\n type TransformerPlugin,\n type AnimationEffect\n} from '@incremark/core'\nimport { useProvideDefinations } from './useProvideDefinations'\nimport { useTypewriter } from './useTypewriter'\nimport { clearAnimatedChunks } from '../utils/animatedChunks'\n\n/** 打字机效果配置 */\nexport interface TypewriterOptions {\n /** 是否启用打字机效果(可响应式切换) */\n enabled?: boolean\n /** 每次显示的字符数,可以是固定值或范围 [min, max] */\n charsPerTick?: number | [number, number]\n /** 更新间隔 (ms) */\n tickInterval?: number\n /** 动画效果: 'none' | 'fade-in' | 'typing' */\n effect?: AnimationEffect\n /** 光标字符(仅 typing 效果使用) */\n cursor?: string\n /** 页面不可见时暂停 */\n pauseOnHidden?: boolean\n /** 自定义插件 */\n plugins?: TransformerPlugin[]\n}\n\nexport interface UseIncremarkOptions extends IncremarkParserOptions {\n /** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */\n typewriter?: TypewriterOptions\n}\n\n/** 打字机控制对象 */\nexport interface TypewriterControls {\n /** 是否启用(只读) */\n enabled: Accessor<boolean>\n /** 设置是否启用 */\n setEnabled: (enabled: boolean) => void\n /** 是否正在处理中 */\n isProcessing: Accessor<boolean>\n /** 是否已暂停 */\n isPaused: Accessor<boolean>\n /** 当前动画效果 */\n effect: Accessor<AnimationEffect>\n /** 跳过动画,直接显示全部 */\n skip: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<TypewriterOptions>) => void\n}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * SolidJS Hook: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```tsx\n * import { useIncremark, Incremark } from '@incremark/solid'\n *\n * function App() {\n * // 基础用法\n * const { blocks, append, finalize } = useIncremark()\n *\n * // 启用打字机效果\n * const { blocks, append, finalize, typewriter } = useIncremark({\n * typewriter: {\n * enabled: true, // 可响应式切换\n * charsPerTick: [1, 3],\n * tickInterval: 30,\n * effect: 'typing',\n * cursor: '|'\n * }\n * })\n *\n * // 动态切换打字机效果\n * typewriter.setEnabled(false)\n *\n * return (\n * <>\n * <Incremark blocks={blocks} />\n * <Show when={typewriter.isProcessing()}>\n * <button onClick={typewriter.skip}>跳过</button>\n * </Show>\n * </>\n * )\n * }\n * ```\n */\nexport function useIncremark(optionsInput: () => UseIncremarkOptions = () => ({})) {\n // 内部自动提供 definitions context\n const { setDefinations, setFootnoteDefinitions, footnoteReferenceOrder, setFootnoteReferenceOrder, contextValue, DefinationsProvider } = useProvideDefinations()\n\n // 创建解析器的工厂函数\n function createParser(options: UseIncremarkOptions) {\n return createIncremarkParser({\n ...options,\n onChange: (state) => {\n setDefinations(state.definitions)\n setFootnoteDefinitions(state.footnoteDefinitions)\n options.onChange?.(state)\n }\n })\n }\n\n // 解析器\n let parser = createParser(optionsInput())\n\n const [completedBlocks, setCompletedBlocks] = createSignal<ParsedBlock[]>([])\n const [pendingBlocks, setPendingBlocks] = createSignal<ParsedBlock[]>([])\n const [isLoading, setIsLoading] = createSignal(false)\n const [markdown, setMarkdown] = createSignal('')\n const [isFinalized, setIsFinalized] = createSignal(false)\n\n // 使用 useTypewriter composable 管理打字机效果\n // 传入响应式的 typewriter 配置,让 useTypewriter 内部监听变化\n const { blocks, typewriter, transformer, isAnimationComplete, displayedFootnoteReferenceOrder } = useTypewriter({\n typewriter: () => optionsInput().typewriter,\n completedBlocks,\n pendingBlocks\n })\n\n // 内容是否完全显示完成\n // 如果没有配置打字机或未启用打字机:解析完成即显示完成\n // 如果启用打字机:解析完成 + 动画完成\n const isDisplayComplete = () => {\n // 没有配置打字机,或者打字机未启用:只需判断是否 finalized\n if (!optionsInput().typewriter || !typewriter.enabled()) {\n return isFinalized()\n }\n // 启用了打字机:需要 finalize + 动画完成\n return isFinalized() && isAnimationComplete()\n }\n\n // AST\n const [ast, setAst] = createSignal<Root>({\n type: 'root',\n children: []\n })\n\n /**\n * 处理解析器更新结果(统一 append 和 finalize 的更新逻辑)\n */\n function handleUpdate(update: IncrementalUpdate, isFinalize: boolean = false): void {\n setMarkdown(parser.getBuffer())\n\n // 处理被更新的 blocks(需要移除的旧 blocks)\n if (update.updated.length > 0) {\n const idsToRemove = new Set(update.updated.map(b => b.id))\n setCompletedBlocks(prev => prev.filter(b => !idsToRemove.has(b.id)))\n }\n\n if (update.completed.length > 0) {\n setCompletedBlocks(prev => [...prev, ...update.completed])\n }\n setPendingBlocks(update.pending)\n\n if (isFinalize) {\n // 如果还有 pending blocks,则将它们添加到 completed blocks 中\n if (update.pending.length > 0) {\n setCompletedBlocks(prev => [...prev, ...update.pending])\n setPendingBlocks([])\n }\n setIsLoading(false)\n setIsFinalized(true)\n } else {\n setIsLoading(true)\n }\n\n // 更新脚注引用顺序(解析器的完整顺序)\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n // 注意:这里不再直接调用 setFootnoteReferenceOrder\n // 脚注显示顺序由下面的 createEffect 根据打字机状态来控制\n }\n\n function append(chunk: string): IncrementalUpdate {\n const update = parser.append(chunk)\n setAst(update.ast)\n handleUpdate(update, false)\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n handleUpdate(update, true)\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n setCompletedBlocks([])\n setPendingBlocks([])\n setMarkdown('')\n setIsLoading(false)\n setIsFinalized(false)\n setFootnoteReferenceOrder([])\n\n // 重置 transformer\n transformer?.reset()\n\n // 清空已动画的 chunk 记录,让新内容可以播放动画\n clearAnimatedChunks()\n }\n\n // 监听 parser 相关 options 变化,动态更新配置(排除 typewriter 配置)\n // 使用 JSON.stringify 比较,避免 deep watch 对新对象的误触发\n // 注意:astBuilder 是类,需要单独处理\n let lastOptionsStr = ''\n createEffect(() => {\n const opts = optionsInput()\n const { typewriter: _, astBuilder, ...parserOptions } = opts\n // astBuilder 用名称标识,因为它是类不能 JSON.stringify\n const optionsStr = JSON.stringify(parserOptions) + '|' + (astBuilder?.name ?? 'default')\n\n if (optionsStr !== lastOptionsStr) {\n lastOptionsStr = optionsStr\n // 使用 updateOptions 动态更新配置(包括引擎切换),不需要重建 parser\n const { typewriter: _, ...parserOptions } = opts\n parser.updateOptions(parserOptions)\n // 同步 Solid 状态\n setCompletedBlocks([])\n setPendingBlocks([])\n setMarkdown('')\n setIsLoading(false)\n setIsFinalized(false)\n setFootnoteReferenceOrder([])\n transformer?.reset()\n }\n })\n\n // 监听打字机的 displayedFootnoteReferenceOrder 变化,更新脚注显示\n // 这确保脚注只在引用所在的 block 动画完成后才显示\n createEffect(() => {\n const newOrder = displayedFootnoteReferenceOrder()\n setFootnoteReferenceOrder(newOrder)\n })\n\n function render(content: string): IncrementalUpdate {\n const update = parser.render(content)\n\n setMarkdown(parser.getBuffer())\n setCompletedBlocks(parser.getCompletedBlocks())\n setPendingBlocks([])\n setIsLoading(false)\n setIsFinalized(true)\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n // render 是一次性渲染,不经过打字机,直接设置脚注顺序\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n\n return update\n }\n\n const result = {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 用于渲染的 blocks(根据打字机设置自动处理) */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 是否已完成(finalize) */\n isFinalized,\n /**\n * 内容是否完全显示完成\n * - 无打字机:等于 isFinalized\n * - 有打字机:isFinalized + 动画播放完成\n * 适用于控制 footnote 等需要在内容完全显示后才出现的元素\n */\n isDisplayComplete,\n /** 脚注引用的出现顺序 */\n footnoteReferenceOrder,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器和打字机 */\n reset,\n /** 一次性渲染(reset + append + finalize) */\n render,\n /** 解析器实例 */\n parser,\n /** 打字机控制 */\n typewriter,\n /** Context value for DefinationsProvider */\n contextValue,\n /** DefinationsProvider component */\n DefinationsProvider\n }\n\n return result as any\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Accessor, createSignal, type Setter } from 'solid-js'\nimport { createContext } from 'solid-js'\nimport type { Definition, FootnoteDefinition } from 'mdast'\n\nexport interface DefinationsContextValue {\n definations: Accessor<Record<string, Definition>>\n setDefinations: Setter<Record<string, Definition>>\n footnoteDefinitions: Accessor<Record<string, FootnoteDefinition>>\n setFootnoteDefinitions: Setter<Record<string, FootnoteDefinition>>\n footnoteReferenceOrder: Accessor<string[]>\n setFootnoteReferenceOrder: Setter<string[]>\n clearAllDefinations: () => void\n}\n\nexport const DefinationsContext = createContext<DefinationsContextValue>()\n\nexport interface DefinationsProviderProps {\n children?: any\n value: DefinationsContextValue\n}\n\nexport function DefinationsProvider(props: DefinationsProviderProps) {\n return (\n <DefinationsContext.Provider value={props.value}>\n {props.children}\n </DefinationsContext.Provider>\n )\n}\n\n/**\n * Provides definitions state management\n * Call this in a composable to get setter functions\n */\nexport function useProvideDefinations() {\n const [definations, setDefinations] = createSignal<Record<string, Definition>>({})\n const [footnoteDefinitions, setFootnoteDefinitions] = createSignal<Record<string, FootnoteDefinition>>({})\n const [footnoteReferenceOrder, setFootnoteReferenceOrder] = createSignal<string[]>([])\n\n function clearDefinations() {\n setDefinations({})\n }\n\n function clearFootnoteDefinitions() {\n setFootnoteDefinitions({})\n }\n\n function clearFootnoteReferenceOrder() {\n setFootnoteReferenceOrder([])\n }\n\n function clearAllDefinations() {\n clearDefinations()\n clearFootnoteDefinitions()\n clearFootnoteReferenceOrder()\n }\n\n const contextValue: DefinationsContextValue = {\n definations,\n setDefinations,\n footnoteDefinitions,\n setFootnoteDefinitions,\n footnoteReferenceOrder,\n setFootnoteReferenceOrder,\n clearAllDefinations\n }\n\n return {\n definations,\n setDefinations,\n footnoteDefinitions,\n setFootnoteDefinitions,\n footnoteReferenceOrder,\n setFootnoteReferenceOrder,\n clearDefinations,\n clearFootnoteDefinitions,\n clearFootnoteReferenceOrder,\n clearAllDefinations,\n DefinationsProvider,\n contextValue\n }\n}\n","/**\n * @file useTypewriter Composable - 打字机效果管理\n *\n * @description\n * 管理打字机效果的状态和控制逻辑。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport {\n createSignal,\n createEffect,\n onCleanup,\n type Accessor\n} from 'solid-js'\nimport { createStore, reconcile } from 'solid-js/store'\nimport {\n createBlockTransformer,\n defaultPlugins,\n mathPlugin,\n collectFootnoteReferences,\n type RootContent,\n type ParsedBlock,\n type DisplayBlock,\n type AnimationEffect,\n type BlockTransformer\n} from '@incremark/core'\nimport type { TypewriterOptions, TypewriterControls } from './useIncremark'\nimport { addCursorToNode } from '../utils/cursor'\n\nexport interface UseTypewriterOptions {\n typewriter: () => TypewriterOptions | undefined\n completedBlocks: Accessor<ParsedBlock[]>\n pendingBlocks: Accessor<ParsedBlock[]>\n}\n\n/** 用于渲染的 block 类型 */\nexport type RenderBlock = ParsedBlock & { isLastPending?: boolean }\n\nexport interface UseTypewriterReturn {\n /** 用于渲染的 blocks(经过打字机处理或原始blocks) */\n blocks: RenderBlock[]\n /** 打字机控制对象 */\n typewriter: TypewriterControls\n /** transformer 实例 */\n transformer: BlockTransformer<RootContent> | null\n /** 所有动画是否已完成(队列为空且没有正在处理的 block) */\n isAnimationComplete: Accessor<boolean>\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n * 动画进行中时返回空数组\n */\n displayedFootnoteReferenceOrder: Accessor<string[]>\n}\n\n/**\n * useTypewriter Composable\n *\n * @description\n * 管理打字机效果的所有状态和逻辑。\n *\n * @param options - 打字机配置和数据\n * @returns 打字机状态和控制对象\n */\nexport function useTypewriter(options: UseTypewriterOptions): UseTypewriterReturn {\n const { typewriter: typewriterInput, completedBlocks, pendingBlocks } = options\n\n // 获取初始配置\n const initialConfig = typewriterInput()\n\n // 打字机状态\n const [typewriterEnabled, setTypewriterEnabled] = createSignal(initialConfig?.enabled ?? !!initialConfig)\n const [isTypewriterProcessing, setIsTypewriterProcessing] = createSignal(false)\n const [isTypewriterPaused, setIsTypewriterPaused] = createSignal(false)\n const [typewriterEffect, setTypewriterEffect] = createSignal<AnimationEffect>(initialConfig?.effect ?? 'none')\n const [typewriterCursor, setTypewriterCursor] = createSignal(initialConfig?.cursor ?? '|')\n const [isAnimationComplete, setIsAnimationComplete] = createSignal(true) // 初始为 true(没有动画时视为完成)\n\n // 使用 store 来存储 blocks,利用 reconcile 进行细粒度更新\n // 这样只有真正变化的 block 才会触发重新渲染\n const [blocksStore, setBlocksStore] = createStore<{ items: RenderBlock[] }>({ items: [] })\n\n // 创建 transformer(如果有 typewriter 配置)\n let transformer: BlockTransformer<RootContent> | null = null\n\n // 用于存储 displayBlocks 的原始数据(用于脚注计算等)\n let displayBlocksCache: DisplayBlock<RootContent>[] = []\n\n /**\n * 将 DisplayBlock 转换为 RenderBlock\n * 抽取为函数以便复用\n */\n function convertToRenderBlocks(displayBlocks: DisplayBlock<RootContent>[]): RenderBlock[] {\n return displayBlocks.map((db, index) => {\n const isPending = !db.isDisplayComplete\n const isLastPending = isPending && index === displayBlocks.length - 1\n\n // typing 效果时添加光标\n let node = db.displayNode\n if (typewriterEffect() === 'typing' && isLastPending) {\n node = addCursorToNode(db.displayNode, typewriterCursor())\n }\n\n return {\n id: db.id,\n status: db.status,\n node,\n startOffset: 0,\n endOffset: 0,\n rawText: '',\n isLastPending\n }\n })\n }\n\n if (initialConfig) {\n transformer = createBlockTransformer<RootContent>({\n charsPerTick: initialConfig.charsPerTick ?? [1, 3],\n tickInterval: initialConfig.tickInterval ?? 30,\n effect: initialConfig.effect ?? 'none',\n pauseOnHidden: initialConfig.pauseOnHidden ?? true,\n // 默认插件 + 数学公式插件(数学公式应该整体显示,不参与打字机逐字符效果)\n plugins: initialConfig.plugins ?? [...defaultPlugins, mathPlugin],\n onChange: (blocks) => {\n displayBlocksCache = blocks as DisplayBlock<RootContent>[]\n // 使用 reconcile 进行细粒度更新,按 id 匹配\n // 这样只有真正变化的 block 才会触发重新渲染\n const newRenderBlocks = convertToRenderBlocks(displayBlocksCache)\n setBlocksStore('items', reconcile(newRenderBlocks, { key: 'id', merge: true }))\n setIsTypewriterProcessing(transformer?.isProcessing() ?? false)\n setIsTypewriterPaused(transformer?.isPausedState() ?? false)\n // 当还有 block 在处理中时,动画未完成\n if (transformer?.isProcessing() ?? false) {\n setIsAnimationComplete(false)\n }\n },\n onAllComplete: () => {\n // 所有动画完成\n setIsAnimationComplete(true)\n }\n })\n }\n\n // 监听配置变化,更新 transformer\n createEffect(() => {\n const newConfig = typewriterInput()\n if (!newConfig) return\n\n // 更新本地状态\n if (newConfig.enabled !== undefined) {\n setTypewriterEnabled(newConfig.enabled)\n }\n if (newConfig.effect !== undefined) {\n setTypewriterEffect(newConfig.effect)\n }\n if (newConfig.cursor !== undefined) {\n setTypewriterCursor(newConfig.cursor)\n }\n\n // 更新 transformer 配置\n transformer?.setOptions({\n charsPerTick: newConfig.charsPerTick,\n tickInterval: newConfig.tickInterval,\n effect: newConfig.effect,\n pauseOnHidden: newConfig.pauseOnHidden\n })\n\n // 当禁用打字机时,重置 transformer 状态,避免残留数据\n if (newConfig.enabled === false && transformer) {\n transformer.reset()\n }\n })\n\n // 监听 blocks 变化,推送给 transformer\n // transformer.push() 会自动检测并更新已存在 blocks 的内容变化\n // 只有当打字机启用时才推送给 transformer\n if (transformer) {\n createEffect(() => {\n // 只有启用打字机时才推送给 transformer\n if (!typewriterEnabled()) return\n\n // 直接传递原始 block 引用\n // ParsedBlock 的结构(id, node, status)已经兼容 SourceBlock\n const allBlocks = [...completedBlocks(), ...pendingBlocks()] as any\n transformer!.push(allBlocks)\n })\n }\n\n // 原始 blocks(不经过打字机)\n const rawBlocks = () => [...completedBlocks(), ...pendingBlocks()]\n\n // 监听非打字机模式下的 blocks 变化,同步到 store\n // 这个 effect 在以下情况触发:\n // 1. typewriterEnabled 从 true 变为 false\n // 2. completedBlocks 或 pendingBlocks 变化时(如果 typewriter 禁用)\n createEffect(() => {\n const enabled = typewriterEnabled()\n const blocks = rawBlocks() // 读取依赖\n\n if (!enabled || !transformer) {\n // 未启用打字机时,直接使用原始 blocks\n setBlocksStore('items', reconcile(blocks, { key: 'id', merge: true }))\n }\n })\n\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n */\n const displayedFootnoteReferenceOrder = () => {\n // 未启用打字机:返回所有脚注引用(从原始 blocks 中提取)\n if (!typewriterEnabled() || !transformer) {\n const references: string[] = []\n const seen = new Set<string>()\n for (const block of rawBlocks()) {\n const blockRefs = collectFootnoteReferences(block.node)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 启用打字机:只有所有动画完成后才返回脚注引用\n // 如果还有动画在进行中,返回空数组\n if (!isAnimationComplete()) {\n return []\n }\n\n // 所有动画完成,返回全部脚注引用(从 displayBlocksCache)\n const references: string[] = []\n const seen = new Set<string>()\n for (const db of displayBlocksCache) {\n const blockRefs = collectFootnoteReferences(db.displayNode)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 打字机控制对象\n const typewriterControls: TypewriterControls = {\n enabled: () => typewriterEnabled(),\n setEnabled: (value: boolean) => {\n setTypewriterEnabled(value)\n },\n isProcessing: () => isTypewriterProcessing(),\n isPaused: () => isTypewriterPaused(),\n effect: () => typewriterEffect(),\n skip: () => transformer?.skip(),\n pause: () => {\n transformer?.pause()\n setIsTypewriterPaused(true)\n },\n resume: () => {\n transformer?.resume()\n setIsTypewriterPaused(false)\n },\n setOptions: (opts) => {\n if (opts.enabled !== undefined) {\n setTypewriterEnabled(opts.enabled)\n }\n if (opts.charsPerTick !== undefined || opts.tickInterval !== undefined || opts.effect !== undefined || opts.pauseOnHidden !== undefined) {\n transformer?.setOptions({\n charsPerTick: opts.charsPerTick,\n tickInterval: opts.tickInterval,\n effect: opts.effect,\n pauseOnHidden: opts.pauseOnHidden\n })\n }\n if (opts.effect !== undefined) {\n setTypewriterEffect(opts.effect)\n }\n if (opts.cursor !== undefined) {\n setTypewriterCursor(opts.cursor)\n }\n }\n }\n\n // 清理\n onCleanup(() => {\n transformer?.destroy()\n })\n\n return {\n blocks: blocksStore.items,\n typewriter: typewriterControls,\n transformer,\n isAnimationComplete: () => isAnimationComplete(),\n displayedFootnoteReferenceOrder: () => displayedFootnoteReferenceOrder()\n }\n}\n","import type { RootContent } from 'mdast'\n\n/**\n * 为节点添加打字机光标\n * @param node 要添加光标的节点\n * @param cursor 光标字符\n * @returns 添加了光标的新节点\n */\nexport function addCursorToNode(node: RootContent, cursor: string): RootContent {\n // 代码块不应该添加光标(会破坏代码高亮)\n if (node.type === 'code') {\n return node\n }\n\n const cloned = JSON.parse(JSON.stringify(node))\n\n function addToLast(n: { children?: unknown[]; type?: string; value?: string }): boolean {\n // 跳过代码块\n if (n.type === 'code') {\n return false\n }\n\n if (n.children && n.children.length > 0) {\n for (let i = n.children.length - 1; i >= 0; i--) {\n if (addToLast(n.children[i] as { children?: unknown[]; type?: string; value?: string })) {\n return true\n }\n }\n n.children.push({ type: 'text', value: cursor })\n return true\n }\n if (n.type === 'text' && typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n if (typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n return false\n }\n\n addToLast(cloned)\n return cloned as RootContent\n}\n","/**\n * @file Animated Chunks Tracker\n *\n * @description\n * 跟踪已播放过动画的 chunk,避免重复播放动画导致闪烁\n *\n * @author Incremark Team\n * @license MIT\n */\n\n/**\n * 已播放过动画的 chunk 的 createdAt 时间戳集合\n * 使用全局 Set 来跟踪,这样即使组件重新渲染,也能知道哪些 chunk 已经播放过动画\n */\nconst animatedChunks = new Set<number>()\n\n/**\n * 判断 chunk 是否应该播放动画\n * 只有首次出现的 chunk 才播放动画,之后重新渲染时不再播放\n */\nexport function shouldAnimateChunk(createdAt: number): boolean {\n if (animatedChunks.has(createdAt)) {\n return false\n }\n // 标记为已播放动画\n animatedChunks.add(createdAt)\n return true\n}\n\n/**\n * 清空已动画的 chunk 记录\n * 在 reset 时调用,让新的内容可以重新播放动画\n */\nexport function clearAnimatedChunks(): void {\n animatedChunks.clear()\n}\n","/**\n * Shiki Highlighter 单例管理器\n *\n * 避免重复创建 Shiki 实例,所有组件共享同一个 highlighter\n */\n\nimport { type Accessor, createSignal } from 'solid-js'\nimport type { HighlighterGeneric, BundledLanguage, BundledTheme } from 'shiki'\n\n// ============ 类型定义 ============\n\ninterface HighlighterInfo {\n highlighter: HighlighterGeneric<BundledLanguage, BundledTheme>\n loadedLanguages: Set<BundledLanguage>\n loadedThemes: Set<BundledTheme>\n}\n\n// ============ 单例管理器 ============\n\n/** Shiki highlighter 单例管理器 */\nclass ShikiManager {\n private static instance: ShikiManager | null = null\n\n /** 存储 highlighter 实例,key 为主题名称 */\n private highlighters = new Map<string, HighlighterInfo>()\n\n private constructor() {}\n\n static getInstance(): ShikiManager {\n if (!ShikiManager.instance) {\n ShikiManager.instance = new ShikiManager()\n }\n return ShikiManager.instance\n }\n\n /**\n * 获取或创建 highlighter\n * @param theme 主题名称\n * @returns highlighter 实例\n */\n async getHighlighter(theme: BundledTheme): Promise<HighlighterInfo> {\n // 如果已存在对应主题的 highlighter,直接返回\n if (this.highlighters.has(theme)) {\n return this.highlighters.get(theme)!\n }\n\n // 创建新的 highlighter\n const { createHighlighter } = await import('shiki')\n const highlighter = await createHighlighter({\n themes: [theme],\n langs: []\n })\n\n const info: HighlighterInfo = {\n highlighter,\n loadedLanguages: new Set<BundledLanguage>(),\n loadedThemes: new Set<BundledTheme>([theme])\n }\n\n this.highlighters.set(theme, info)\n return info\n }\n\n /**\n * 加载语言(按需)\n * @param theme 主题名称\n * @param lang 语言名称\n */\n async loadLanguage(theme: BundledTheme, lang: BundledLanguage): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedLanguages.has(lang)) return\n\n try {\n await info.highlighter.loadLanguage(lang)\n info.loadedLanguages.add(lang)\n } catch {\n // 语言不支持,静默处理\n }\n }\n\n /**\n * 加载主题(按需)\n * @param theme 主题名称\n */\n async loadTheme(theme: BundledTheme): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedThemes.has(theme)) return\n\n try {\n await info.highlighter.loadTheme(theme)\n info.loadedThemes.add(theme)\n } catch {\n // 主题不支持,静默处理\n }\n }\n\n /**\n * 高亮代码\n * @param theme 主题名称\n * @param code 代码内容\n * @param lang 语言名称\n * @param fallbackTheme 回退主题\n * @returns 高亮后的 HTML\n */\n async codeToHtml(\n theme: BundledTheme,\n code: string,\n lang: BundledLanguage,\n fallbackTheme: BundledTheme\n ): Promise<string> {\n const info = this.highlighters.get(theme)\n if (!info) throw new Error('Highlighter not found')\n\n const actualLang = info.loadedLanguages.has(lang) ? lang : 'text'\n const actualTheme = info.loadedThemes.has(theme) ? theme : fallbackTheme\n\n return info.highlighter.codeToHtml(code, {\n lang: actualLang,\n theme: actualTheme\n })\n }\n\n /**\n * 清理所有 highlighter(应用退出或需要重置时调用)\n */\n disposeAll() {\n for (const [, info] of this.highlighters) {\n if (info.highlighter?.dispose) {\n info.highlighter.dispose()\n }\n }\n this.highlighters.clear()\n }\n}\n\n// ============ 延迟初始化单例 ============\n\nlet shikiManagerInstance: ShikiManager | null = null\n\n/**\n * 获取 ShikiManager 单例(延迟初始化)\n * 避免模块加载时立即创建实例,支持 SSR\n */\nfunction getShikiManager(): ShikiManager {\n if (!shikiManagerInstance) {\n shikiManagerInstance = ShikiManager.getInstance()\n }\n return shikiManagerInstance\n}\n\nexport { getShikiManager, ShikiManager }\n\n// ============ Solid 组合式函数 ============\n\nexport interface UseShikiReturn {\n highlighterInfo: Accessor<HighlighterInfo | null>\n isHighlighting: Accessor<boolean>\n isReady: Accessor<boolean>\n initHighlighter: () => Promise<void>\n highlight: (code: string, lang: string, fallbackTheme: string) => Promise<string>\n}\n\n/**\n * 使用 Shiki Highlighter(组合式函数)\n *\n * @param theme 主题名称\n * @returns Shiki 相关的响应式状态和方法\n */\nexport function useShiki(theme: string): UseShikiReturn {\n const [highlighterInfo, setHighlighterInfo] = createSignal<HighlighterInfo | null>(null)\n const [isHighlighting, setIsHighlighting] = createSignal(false)\n const [isReady, setIsReady] = createSignal(false)\n\n /**\n * 初始化 highlighter(预加载)\n */\n async function initHighlighter(): Promise<void> {\n if (isReady()) return\n\n try {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n setHighlighterInfo(info)\n setIsReady(true)\n } catch (e) {\n console.warn('Failed to initialize Shiki highlighter:', e)\n throw e\n }\n }\n\n /**\n * 获取 highlighter\n */\n async function getHighlighter(): Promise<HighlighterInfo> {\n if (!highlighterInfo()) {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n setHighlighterInfo(info)\n setIsReady(true)\n return info\n }\n return highlighterInfo()!\n }\n\n /**\n * 高亮代码\n */\n async function highlight(code: string, lang: string, fallbackTheme: string): Promise<string> {\n setIsHighlighting(true)\n\n try {\n const info = await getHighlighter()\n const manager = getShikiManager()\n\n // 按需加载语言\n if (!info.loadedLanguages.has(lang as BundledLanguage) && lang !== 'text') {\n await manager.loadLanguage(theme as BundledTheme, lang as BundledLanguage)\n }\n\n // 按需加载主题\n if (!info.loadedThemes.has(theme as BundledTheme)) {\n await manager.loadTheme(theme as BundledTheme)\n }\n\n return await manager.codeToHtml(\n theme as BundledTheme,\n code,\n lang as BundledLanguage,\n fallbackTheme as BundledTheme\n )\n } catch (e) {\n throw e\n } finally {\n setIsHighlighting(false)\n }\n }\n\n return {\n highlighterInfo,\n isHighlighting,\n isReady,\n initHighlighter,\n highlight\n }\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Component, type JSX, createContext, useContext, createSignal, createMemo, type Accessor } from 'solid-js'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\n\nexport const LocaleContext = createContext<{\n locale: Accessor<IncremarkLocale>\n}>()\n\nexport interface ConfigProviderProps {\n /** locale 对象 */\n locale?: IncremarkLocale\n children?: JSX.Element\n}\n\nexport const ConfigProvider: Component<ConfigProviderProps> = (props) => {\n const [locale, setLocale] = createSignal<IncremarkLocale>(props.locale || zhCN)\n\n // 监听 props.locale 变化\n createMemo(() => {\n setLocale(props.locale || zhCN)\n })\n\n return (\n <LocaleContext.Provider value={{ locale }}>\n {props.children}\n </LocaleContext.Provider>\n )\n}\n\n/**\n * 翻译函数类型\n */\nexport type TranslatorFn = (key: string) => string\n\nexport function useLocale(): TranslatorFn {\n const context = useContext(LocaleContext)\n const locale = context?.locale || (() => zhCN)\n\n // 返回翻译函数,跟 Vue 的 API 对齐\n return (key: string) => {\n const keys = key.split('.')\n let value: any = locale()\n for (const k of keys) {\n value = value?.[k]\n }\n return value || key\n }\n}\n","import { useContext } from 'solid-js'\nimport { DefinationsContext, type DefinationsContextValue } from './useProvideDefinations'\n\n/**\n * Support definations and footnoteDefinitions\n * @returns DefinationsContextValue\n */\nexport function useDefinationsContext(): DefinationsContextValue {\n const context = useContext(DefinationsContext)\n\n if (!context) {\n throw new Error('DefinationsContext not found. Make sure you are using this within a component that provides DefinationsContext.')\n }\n\n return context\n}\n","import { createSignal, type Accessor } from 'solid-js'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface UseStreamRendererOptions {\n /** 初始块列表 */\n initialBlocks?: ParsedBlock[]\n}\n\nexport interface UseStreamRendererReturn {\n /** 块列表 */\n blocks: Accessor<ParsedBlock[]>\n /** 设置块列表 */\n setBlocks: (blocks: ParsedBlock[]) => void\n /** 添加块 */\n addBlocks: (blocks: ParsedBlock[]) => void\n /** 清空块列表 */\n clearBlocks: () => void\n /** 块数量 */\n blockCount: Accessor<number>\n}\n\n/**\n * SolidJS 流式渲染 Hook\n *\n * 用于管理流式渲染的块列表状态\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions = {}): UseStreamRendererReturn {\n const [blocks, setBlocks] = createSignal<ParsedBlock[]>(options.initialBlocks ?? [])\n\n function addBlocks(newBlocks: ParsedBlock[]) {\n setBlocks(prev => [...prev, ...newBlocks])\n }\n\n function clearBlocks() {\n setBlocks([])\n }\n\n const blockCount = () => blocks().length\n\n return {\n blocks,\n setBlocks,\n addBlocks,\n clearBlocks,\n blockCount\n }\n}\n","import { createSignal, createEffect, type Accessor } from 'solid-js'\nimport {\n createBlockTransformer,\n type RootContent,\n type DisplayBlock,\n type TransformerOptions,\n type TransformerPlugin\n} from '@incremark/core'\n\nexport interface UseBlockTransformerOptions extends Omit<TransformerOptions, 'onChange'> {}\n\nexport interface UseBlockTransformerReturn {\n /** 转换后的块列表 */\n displayBlocks: Accessor<DisplayBlock<RootContent>[]>\n /** 是否正在处理 */\n isProcessing: Accessor<boolean>\n /** 是否已暂停 */\n isPaused: Accessor<boolean>\n /** 推送新的块进行转换 */\n push: (blocks: any[]) => void\n /** 跳过动画 */\n skip: () => void\n /** 暂停 */\n pause: () => void\n /** 恢复 */\n resume: () => void\n /** 重置 */\n reset: () => void\n /** 销毁 */\n destroy: () => void\n /** 更新配置 */\n setOptions: (options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) => void\n}\n\n/**\n * SolidJS 块转换器 Hook\n *\n * 用于管理增量内容的动画效果和转换逻辑\n */\nexport function useBlockTransformer(options: UseBlockTransformerOptions = {}): UseBlockTransformerReturn {\n const [displayBlocks, setDisplayBlocks] = createSignal<DisplayBlock<RootContent>[]>([])\n const [isProcessing, setIsProcessing] = createSignal(false)\n const [isPaused, setIsPaused] = createSignal(false)\n\n const transformer = createBlockTransformer<RootContent>({\n charsPerTick: options.charsPerTick ?? [1, 3],\n tickInterval: options.tickInterval ?? 30,\n effect: options.effect ?? 'none',\n pauseOnHidden: options.pauseOnHidden ?? true,\n plugins: options.plugins,\n onChange: (blocks) => {\n setDisplayBlocks(blocks as DisplayBlock<RootContent>[])\n setIsProcessing(transformer?.isProcessing() ?? false)\n setIsPaused(transformer?.isPausedState() ?? false)\n }\n })\n\n function push(blocks: any[]) {\n transformer.push(blocks)\n }\n\n function skip() {\n transformer.skip()\n }\n\n function pause() {\n transformer.pause()\n }\n\n function resume() {\n transformer.resume()\n }\n\n function reset() {\n transformer.reset()\n }\n\n function destroy() {\n transformer.destroy()\n }\n\n function setOptions(opts: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) {\n transformer.setOptions(opts)\n }\n\n return {\n displayBlocks,\n isProcessing,\n isPaused,\n push,\n skip,\n pause,\n resume,\n reset,\n destroy,\n setOptions\n }\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Component, JSX } from 'solid-js'\nimport type { ParsedBlock } from '@incremark/core'\nimport { For, Show, mergeProps } from 'solid-js'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport type { UseIncremarkReturn } from '../composables/useIncremark'\nimport type { ComponentMap, CodeBlockConfig } from '../types'\nimport IncremarkRenderer from './IncremarkRenderer'\nimport { IncremarkFootnotes } from './IncremarkFootnotes'\n\nexport interface IncremarkProps {\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks?: ParsedBlock[] | (() => ParsedBlock[])\n /** 内容是否完全显示完成(用于控制脚注等需要在内容完全显示后才出现的元素)\n * 如果传入了 incremark,则会自动使用 incremark.isDisplayComplete,此 prop 被忽略 */\n isDisplayComplete?: boolean | (() => boolean)\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */\n customContainers?: Record<string, Component<any>>\n /** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */\n customCodeBlocks?: Record<string, Component<any>>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n /** 可选:useIncremark 返回的对象(用于自动注入数据) */\n incremark?: UseIncremarkReturn\n}\n\n/**\n * Incremark 主组件(内部渲染逻辑)\n */\nfunction IncremarkInner(props: IncremarkProps) {\n const mergedProps = mergeProps({\n isDisplayComplete: false,\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }, props)\n\n const components = () => mergedProps.components || {}\n const customContainers = () => mergedProps.customContainers || {}\n const customCodeBlocks = () => mergedProps.customCodeBlocks || {}\n const codeBlockConfigs = () => mergedProps.codeBlockConfigs || {}\n\n const {\n footnoteReferenceOrder\n } = useDefinationsContext()\n\n // 计算实际使用的 blocks 和 isDisplayComplete\n const actualBlocks = () => {\n if (mergedProps.incremark) {\n // blocks 现在是 store 数组,不是函数\n return mergedProps.incremark.blocks\n }\n return typeof mergedProps.blocks === 'function' ? mergedProps.blocks() : mergedProps.blocks\n }\n\n const actualIsDisplayComplete = () => {\n // 优先使用 incremark 提供的 isDisplayComplete(已考虑打字机等状态)\n if (mergedProps.incremark) {\n return mergedProps.incremark.isDisplayComplete()\n }\n // 否则使用用户传入的 isDisplayComplete\n return typeof mergedProps.isDisplayComplete === 'function' ? mergedProps.isDisplayComplete() : mergedProps.isDisplayComplete\n }\n\n return (\n <div class=\"incremark\">\n {/* 主要内容块 */}\n <For each={actualBlocks()}>\n {(block) => (\n <Show\n when={block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition'}\n >\n <div\n class={\n `incremark-block ${\n block.status === 'completed' ? mergedProps.completedClass : mergedProps.pendingClass\n }${\n mergedProps.showBlockStatus ? ' incremark-show-status' : ''\n }${\n (block as any).isLastPending ? ' incremark-last-pending' : ''\n }`\n }\n >\n <IncremarkRenderer\n node={block.node}\n customContainers={customContainers()}\n customCodeBlocks={customCodeBlocks()}\n codeBlockConfigs={codeBlockConfigs()}\n components={components()}\n blockStatus={block.status}\n />\n </div>\n </Show>\n )}\n </For>\n\n {/* 脚注列表(仅在内容完全显示后显示) */}\n <Show when={actualIsDisplayComplete() && footnoteReferenceOrder().length > 0}>\n <IncremarkFootnotes />\n </Show>\n </div>\n )\n}\n\n/**\n * Incremark 主组件\n *\n * 渲染增量解析的 Markdown 块列表\n */\nexport const Incremark: Component<IncremarkProps> = (props) => {\n return <IncremarkInner {...props} />\n}\n\nexport default Incremark\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent, HTML, Code } from 'mdast'\nimport { Component, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport type { ComponentMap, CodeBlockConfig } from '../types'\nimport type { ContainerNode } from './IncremarkContainer'\nimport { IncremarkHeading } from './IncremarkHeading'\nimport { IncremarkParagraph } from './IncremarkParagraph'\nimport IncremarkCode from './IncremarkCode'\nimport { IncremarkList } from './IncremarkList'\nimport { IncremarkTable } from './IncremarkTable'\nimport { IncremarkBlockquote } from './IncremarkBlockquote'\nimport { IncremarkThematicBreak } from './IncremarkThematicBreak'\nimport { IncremarkMath } from './IncremarkMath'\nimport { IncremarkHtmlElement } from './IncremarkHtmlElement'\nimport { IncremarkContainer } from './IncremarkContainer'\nimport { IncremarkDefault } from './IncremarkDefault'\n\ntype ExtendedRootContent = RootContent | ContainerNode\n\nexport interface IncremarkRendererProps {\n node: ExtendedRootContent\n customContainers?: Record<string, Component<any>>\n customCodeBlocks?: Record<string, Component<any>>\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n blockStatus?: 'pending' | 'stable' | 'completed'\n components?: ComponentMap\n}\n\n// 默认组件映射\nconst defaultComponentMap: Record<string, Component<any>> = {\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 htmlElement: IncremarkHtmlElement,\n containerDirective: IncremarkContainer,\n leafDirective: IncremarkContainer,\n textDirective: IncremarkContainer,\n}\n\nfunction getComponent(type: string, customComponents?: ComponentMap): Component<any> {\n const map = { ...defaultComponentMap, ...customComponents }\n return map[type] || IncremarkDefault\n}\n\n/**\n * 类型守卫:检查是否是容器节点\n */\nfunction isContainerNode(node: ExtendedRootContent): node is ContainerNode {\n const type = (node as any).type\n return type === 'containerDirective' ||\n type === 'leafDirective' ||\n type === 'textDirective'\n}\n\n/**\n * 类型守卫:检查是否是 html 节点\n */\nfunction isHtmlNode(node: ExtendedRootContent): node is HTML {\n return node.type === 'html'\n}\n\n/**\n * IncremarkRenderer 组件\n * 路由不同节点类型到适当的组件\n */\nexport const IncremarkRenderer: Component<IncremarkRendererProps> = (props) => {\n return (\n <>\n {/* HTML 节点:渲染为代码块显示源代码 */}\n <Show when={isHtmlNode(props.node)}>\n <pre class=\"incremark-html-code\"><code>{(props.node as HTML).value}</code></pre>\n </Show>\n\n {/* 容器节点:使用容器组件,传递 customContainers */}\n <Show when={isContainerNode(props.node) && !isHtmlNode(props.node)}>\n <IncremarkContainer\n node={props.node as ContainerNode}\n customContainers={props.customContainers}\n />\n </Show>\n\n {/* 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus */}\n <Show\n when={(props.node as RootContent).type === 'code' && !isHtmlNode(props.node) && !isContainerNode(props.node)}\n >\n <IncremarkCode\n node={props.node as Code}\n customCodeBlocks={props.customCodeBlocks}\n codeBlockConfigs={props.codeBlockConfigs}\n blockStatus={props.blockStatus}\n defaultCodeComponent={props.components?.['code']}\n />\n </Show>\n\n {/* 其他节点:使用对应组件 */}\n <Show\n when={\n (props.node as RootContent).type !== 'code' &&\n !isHtmlNode(props.node) &&\n !isContainerNode(props.node)\n }\n >\n <Dynamic\n component={getComponent((props.node as RootContent).type, props.components)}\n node={props.node as RootContent}\n />\n </Show>\n </>\n )\n}\n\nexport default IncremarkRenderer\n","/* @jsxImportSource solid-js */\n\nimport type { Heading } from 'mdast'\nimport { Component } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkHeadingProps {\n node: Heading\n}\n\nexport const IncremarkHeading: Component<IncremarkHeadingProps> = (props) => {\n const tag = () => `h${props.node.depth}`\n\n return (\n <Dynamic component={tag()} class={`incremark-heading h${props.node.depth}`}>\n <IncremarkInline nodes={props.node.children} />\n </Dynamic>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { PhrasingContent, RootContent, ImageReference, LinkReference } from 'mdast'\nimport { type TextChunk, type TextNodeWithChunks, hasChunks, getStableText, isHtmlNode } from '@incremark/shared'\nimport { Component, For, Index, Show } from 'solid-js'\nimport { IncremarkMath } from './IncremarkMath'\nimport { IncremarkHtmlElement } from './IncremarkHtmlElement'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\n\n// Math 节点类型\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n}\n\n// HtmlElement 节点类型\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n}\n\n/**\n * 类型守卫:检查是否是 htmlElement 节点\n */\nfunction isHtmlElementNode(node: PhrasingContent): node is PhrasingContent & HtmlElementNode {\n return (node as unknown as HtmlElementNode).type === 'htmlElement'\n}\n\n/**\n * 类型守卫:检查是否是 imageReference 节点\n */\nfunction isImageReference(node: PhrasingContent): node is ImageReference {\n return node.type === 'imageReference'\n}\n\n/**\n * 类型守卫:检查是否是 linkReference 节点\n */\nfunction isLinkReference(node: PhrasingContent): node is LinkReference {\n return node.type === 'linkReference'\n}\n\nexport interface IncremarkInlineProps {\n nodes: PhrasingContent[]\n}\n\nexport const IncremarkInline: Component<IncremarkInlineProps> = (props) => {\n const { definations, footnoteDefinitions } = useDefinationsContext()\n\n /**\n * 获取节点的 chunks(类型安全)\n */\n function getChunks(node: PhrasingContent): TextChunk[] | undefined {\n if (hasChunks(node)) {\n return (node as TextNodeWithChunks).chunks\n }\n return undefined\n }\n\n /**\n * 类型守卫:检查是否是 inlineMath 节点\n */\n function isInlineMath(node: PhrasingContent): node is PhrasingContent & MathNode {\n return (node as unknown as MathNode).type === 'inlineMath'\n }\n\n return (\n <>\n <For each={props.nodes}>\n {(node, idx) => (\n <>\n {/* 文本(支持 chunks 渐入动画) */}\n <Show when={node.type === 'text'}>\n {/* 稳定文本(已经显示过的部分,无动画) */}\n {getStableText(node as TextNodeWithChunks)}\n {/* 新增的 chunk 部分(带渐入动画) */}\n {/* 使用 Index 而不是 For,因为 Index 按索引跟踪元素,不会因为对象引用变化而重新创建 DOM 元素 */}\n {/* 这样 CSS 动画只在元素首次创建时播放,后续更新不会重新触发动画 */}\n <Index each={getChunks(node) || []}>\n {(chunk, idx) => (\n <span\n class=\"incremark-fade-in\"\n data-chunk-key={chunk().createdAt}\n >\n {chunk().text}\n </span>\n )}\n </Index>\n </Show>\n\n {/* 行内公式 */}\n <Show when={isInlineMath(node)}>\n <IncremarkMath node={node as unknown as MathNode} />\n </Show>\n\n {/* htmlElement 节点(结构化的 HTML 元素) */}\n <Show when={isHtmlElementNode(node)}>\n <IncremarkHtmlElement node={node as unknown as HtmlElementNode} />\n </Show>\n\n {/* HTML 节点(原始 HTML,如未启用 htmlTree 选项) */}\n <Show when={isHtmlNode(node)}>\n <span class=\"incremark-inline-html\" innerHTML={(node as any).value} />\n </Show>\n\n {/* 加粗 */}\n <Show when={node.type === 'strong'}>\n <strong>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </strong>\n </Show>\n\n {/* 斜体 */}\n <Show when={node.type === 'emphasis'}>\n <em>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </em>\n </Show>\n\n {/* 行内代码 */}\n <Show when={node.type === 'inlineCode'}>\n <code class=\"incremark-inline-code\">{(node as any).value}</code>\n </Show>\n\n {/* 链接 */}\n <Show when={node.type === 'link'}>\n <a\n class=\"incremark-link\"\n href={(node as any).url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </a>\n </Show>\n\n {/* 图片 */}\n <Show when={node.type === 'image'}>\n <img\n class=\"incremark-image\"\n src={(node as any).url}\n alt={(node as any).alt || ''}\n title={(node as any).title || undefined}\n loading=\"lazy\"\n />\n </Show>\n\n {/* 引用式图片(imageReference) */}\n <Show when={isImageReference(node)}>\n <Show\n when={definations()[(node as ImageReference).identifier]}\n fallback={\n <span class=\"incremark-image-ref-missing\">\n ![{(node as ImageReference).alt}][{(node as ImageReference).identifier || (node as ImageReference).label}]\n </span>\n }\n >\n <img\n class=\"incremark-image incremark-reference-image\"\n src={definations()[(node as ImageReference).identifier].url}\n alt={(node as ImageReference).alt || ''}\n title={definations()[(node as ImageReference).identifier].title || undefined}\n loading=\"lazy\"\n />\n </Show>\n </Show>\n\n {/* 引用式链接(linkReference) */}\n <Show when={isLinkReference(node)}>\n <Show\n when={definations()[(node as LinkReference).identifier]}\n fallback={\n <span class=\"incremark-link-ref-missing\">\n [{((node as LinkReference).children as any[]).map((c: any) => c.value).join('')}][{(node as LinkReference).identifier || (node as LinkReference).label}]\n </span>\n }\n >\n <a\n class=\"incremark-link incremark-reference-link\"\n href={definations()[(node as LinkReference).identifier].url}\n title={definations()[(node as LinkReference).identifier].title || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline nodes={((node as LinkReference).children as PhrasingContent[])} />\n </a>\n </Show>\n </Show>\n\n {/* 脚注引用(footnoteReference) */}\n <Show when={node.type === 'footnoteReference'}>\n <sup class=\"incremark-footnote-ref\">\n <a href={`#fn-${(node as any).identifier}`} id={`fnref-${(node as any).identifier}`}>\n [{(node as any).identifier}]\n </a>\n </sup>\n </Show>\n\n {/* 换行 */}\n <Show when={node.type === 'break'}>\n <br />\n </Show>\n\n {/* 删除线 */}\n <Show when={node.type === 'delete'}>\n <del>\n <IncremarkInline nodes={((node as any).children as PhrasingContent[])} />\n </del>\n </Show>\n </>\n )}\n </For>\n </>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { Component, createSignal, createEffect, onCleanup, Show } from 'solid-js'\nimport type { JSX } from 'solid-js'\n\n// Math 节点类型(来自 mdast-util-math)\nexport interface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nexport interface IncremarkMathProps {\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n}\n\nexport const IncremarkMath: Component<IncremarkMathProps> = (props) => {\n const [renderedHtml, setRenderedHtml] = createSignal('')\n const [isLoading, setIsLoading] = createSignal(false)\n\n const isInline = () => props.node.type === 'inlineMath'\n const formula = () => props.node.value\n\n let renderTimer: ReturnType<typeof setTimeout> | null = null\n let katexRef: any = null\n\n // 带防抖动的渲染\n function scheduleRender() {\n if (!formula()) {\n setRenderedHtml('')\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n setIsLoading(true)\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay ?? 0)\n }\n\n async function doRender() {\n if (!formula()) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef) {\n const katexModule = await import('katex')\n katexRef = katexModule.default\n }\n\n const katex = katexRef\n setRenderedHtml(katex.renderToString(formula(), {\n displayMode: !isInline(),\n throwOnError: false,\n strict: false\n }))\n } catch {\n // 静默失败,可能是公式不完整\n setRenderedHtml('')\n } finally {\n setIsLoading(false)\n }\n }\n\n createEffect(() => {\n scheduleRender()\n })\n\n onCleanup(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n })\n\n // 行内公式\n if (isInline()) {\n return (\n <span class=\"incremark-math-inline\">\n <Show when={renderedHtml() && !isLoading()}>\n <span innerHTML={renderedHtml()} />\n </Show>\n <Show when={!renderedHtml() || isLoading()}>\n <code class=\"math-source\">{formula()}</code>\n </Show>\n </span>\n )\n }\n\n // 块级公式\n return (\n <div class=\"incremark-math-block\">\n <Show when={renderedHtml() && !isLoading()}>\n <div innerHTML={renderedHtml()} class=\"math-rendered\" />\n </Show>\n <Show when={!renderedHtml() || isLoading()}>\n <pre class=\"math-source-block\"><code>{formula()}</code></pre>\n </Show>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent, PhrasingContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport type { JSX } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { IncremarkInline } from './IncremarkInline'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\n/**\n * HtmlElementNode 类型定义(与 @incremark/core 中的定义一致)\n */\nexport interface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n data?: {\n rawHtml?: string\n parsed?: boolean\n originalType?: string\n }\n}\n\nexport interface IncremarkHtmlElementProps {\n node: HtmlElementNode\n}\n\n/**\n * 行内元素列表\n */\nconst INLINE_ELEMENTS = [\n 'a', 'abbr', 'acronym', 'b', 'bdo', 'big', 'br', 'button', 'cite',\n 'code', 'dfn', 'em', 'i', 'img', 'input', 'kbd', 'label', 'map',\n 'object', 'output', 'q', 'samp', 'script', 'select', 'small',\n 'span', 'strong', 'sub', 'sup', 'textarea', 'time', 'tt', 'var'\n]\n\n/**\n * 自闭合元素列表\n */\nconst VOID_ELEMENTS = [\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]\n\n/**\n * 判断是否是行内元素\n */\nfunction isInlineElement(tagName: string): boolean {\n return INLINE_ELEMENTS.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断是否是自闭合元素\n */\nfunction isVoidElement(tagName: string): boolean {\n return VOID_ELEMENTS.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断子节点是否都是行内内容\n */\nfunction hasOnlyInlineChildren(children: RootContent[]): boolean {\n if (!children || children.length === 0) return true\n\n return children.every(child => {\n const type = child.type\n const inlineTypes = ['text', 'strong', 'emphasis', 'inlineCode', 'link', 'image', 'break', 'html', 'htmlElement']\n if (inlineTypes.includes(type)) {\n if (type === 'htmlElement') {\n return isInlineElement((child as unknown as HtmlElementNode).tagName)\n }\n return true\n }\n return false\n })\n}\n\n/**\n * 渲染子节点\n */\nfunction renderChildren(children: RootContent[]): JSX.Element {\n if (!children || children.length === 0) return null as unknown as JSX.Element\n\n // 如果子节点都是行内内容,使用 IncremarkInline\n if (hasOnlyInlineChildren(children)) {\n return <IncremarkInline nodes={children as PhrasingContent[]} />\n }\n\n // 否则递归渲染每个子节点\n return (\n <For each={children}>\n {(child, idx) => {\n // htmlElement 类型\n if (child.type === 'htmlElement') {\n return <IncremarkHtmlElement node={child as unknown as HtmlElementNode} />\n }\n\n // 文本节点\n if (child.type === 'text') {\n return <>{(child as { value: string }).value}</>\n }\n\n // 常见行内类型\n if (['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type)) {\n return <IncremarkInline nodes={[child as PhrasingContent]} />\n }\n\n // 段落\n if (child.type === 'paragraph') {\n return (\n <p>\n <IncremarkInline nodes={(child as { children: PhrasingContent[] }).children} />\n </p>\n )\n }\n\n // 其他类型使用 IncremarkRenderer\n return <IncremarkRenderer node={child} />\n }}\n </For>\n )\n}\n\n/**\n * IncremarkHtmlElement 组件\n *\n * 渲染结构化的 HTML 元素节点,使用 Dynamic 组件支持动态标签名\n */\nexport const IncremarkHtmlElement: Component<IncremarkHtmlElementProps> = (props) => {\n const tagName = () => props.node.tagName\n const attrs = () => props.node.attrs || {}\n const children = () => props.node.children || []\n\n // 自闭合元素没有子节点\n const isVoid = () => isVoidElement(tagName())\n\n return (\n <Dynamic\n component={tagName() as keyof JSX.IntrinsicElements}\n {...attrs()}\n class={`incremark-html-element incremark-${tagName()}`}\n >\n <Show when={!isVoid()}>\n {renderChildren(children())}\n </Show>\n </Dynamic>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Paragraph } from 'mdast'\nimport { Component } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkParagraphProps {\n node: Paragraph\n}\n\nexport const IncremarkParagraph: Component<IncremarkParagraphProps> = (props) => {\n return (\n <p class=\"incremark-paragraph\">\n <IncremarkInline nodes={props.node.children} />\n </p>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createMemo, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport type { CodeBlockConfig } from '../types'\nimport { IncremarkCodeMermaid } from './IncremarkCodeMermaid'\nimport { IncremarkCodeDefault, type IncremarkCodeDefaultProps } from './IncremarkCodeDefault'\n\nexport interface IncremarkCodeProps {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n /** 自定义代码块组件映射,key 为代码语言名称 */\n customCodeBlocks?: Record<string, Component<any>>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 块状态,用于判断是否使用自定义组件 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n /** 默认代码块渲染组件(当不是 mermaid 且没有自定义组件时使用) */\n defaultCodeComponent?: Component<IncremarkCodeDefaultProps>\n}\n\nexport const IncremarkCode: Component<IncremarkCodeProps> = (props) => {\n const language = () => props.node.lang || 'text'\n\n // 检查是否有自定义代码块组件\n const CustomCodeBlock = () => props.customCodeBlocks?.[language()]\n\n // 检查该语言的配置\n const shouldUseCustomCodeBlock = () => {\n const component = props.customCodeBlocks?.[language()]\n if (!component) return false\n\n // 检查该语言的配置\n const config = props.codeBlockConfigs?.[language()]\n\n // 如果配置了 takeOver 为 true,则从一开始就使用\n if (config?.takeOver) {\n return true\n }\n\n // 否则,默认行为:只在 completed 状态使用\n return props.blockStatus === 'completed'\n }\n\n // 判断是否为 mermaid\n const isMermaid = () => language() === 'mermaid'\n\n const DefaultCodeComponent = () => props.defaultCodeComponent ?? IncremarkCodeDefault\n\n // Get custom component props\n const customProps = () => ({\n codeStr: props.node.value,\n lang: language(),\n completed: props.blockStatus === 'completed',\n takeOver: props.codeBlockConfigs?.[language()]?.takeOver\n })\n\n // Get default component props\n const defaultProps = () => ({\n node: props.node,\n theme: props.theme,\n fallbackTheme: props.fallbackTheme,\n disableHighlight: props.disableHighlight,\n blockStatus: props.blockStatus\n })\n\n // Get mermaid props\n const mermaidProps = () => ({\n node: props.node,\n mermaidDelay: props.mermaidDelay\n })\n\n return (\n <>\n {/* 自定义代码块组件 */}\n <Show when={CustomCodeBlock() && shouldUseCustomCodeBlock()}>\n <Dynamic\n component={CustomCodeBlock()!}\n {...customProps()}\n />\n </Show>\n\n {/* Mermaid 图表 */}\n <Show when={isMermaid() && !shouldUseCustomCodeBlock()}>\n <IncremarkCodeMermaid\n node={props.node}\n mermaidDelay={props.mermaidDelay}\n />\n </Show>\n\n {/* 默认代码块渲染(支持用户自定义,使用 stream 高亮) */}\n <Show when={!isMermaid() && !shouldUseCustomCodeBlock()}>\n <Dynamic\n component={DefaultCodeComponent()}\n {...defaultProps()}\n />\n </Show>\n </>\n )\n}\n\nexport default IncremarkCode\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createEffect, createSignal, onCleanup, onMount, Show } from 'solid-js'\nimport type { Mermaid } from 'mermaid'\nimport { GravityMermaid, LucideCode, LucideEye, LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport { useLocale } from '../composables/useLocale'\nimport { SvgIcon } from './SvgIcon'\n\nexport interface IncremarkCodeMermaidProps {\n node: Code\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n}\n\n/**\n * Mermaid 图表渲染组件\n *\n * 支持 Mermaid 图表的流式渲染和防抖更新\n */\nexport const IncremarkCodeMermaid: Component<IncremarkCodeMermaidProps> = (props) => {\n const [mermaidSvg, setMermaidSvg] = createSignal('')\n const [mermaidError, setMermaidError] = createSignal('')\n const [mermaidLoading, setMermaidLoading] = createSignal(false)\n const [copied, setCopied] = createSignal(false)\n\n // 视图模式:'preview' | 'source'\n const [mermaidViewMode, setMermaidViewMode] = createSignal<'preview' | 'source'>('preview')\n\n let mermaidInstance: Mermaid | null = null\n let renderTimer: ReturnType<typeof setTimeout> | null = null\n let copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n let chartId = `mermaid-${Math.random().toString(36).substr(2, 9)}`\n\n const code = () => props.node.value\n\n // 使用 i18n\n const t = useLocale()\n\n function toggleMermaidView() {\n setMermaidViewMode(prev => prev === 'preview' ? 'source' : 'preview')\n }\n\n // 初始化 Mermaid\n onMount(async () => {\n try {\n // 动态导入 mermaid\n const mermaidModule = await import('mermaid')\n const mermaid = mermaidModule.default\n\n // 初始化 mermaid\n mermaid.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose',\n suppressErrorRendering: true\n })\n\n mermaidInstance = mermaid\n } catch (e) {\n console.warn('Failed to initialize Mermaid:', e)\n setMermaidError('Failed to initialize')\n }\n })\n\n // 带防抖动的渲染\n function scheduleRender() {\n if (!code()) {\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n setMermaidLoading(true)\n setMermaidError('')\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.mermaidDelay ?? 500)\n }\n\n async function doRender() {\n if (!code() || !mermaidInstance) return\n\n try {\n const { svg } = await mermaidInstance.render(chartId, code())\n setMermaidSvg(svg)\n setMermaidError('')\n } catch (e) {\n // 图表不完整或其他错误,静默处理\n setMermaidError('')\n setMermaidSvg('')\n } finally {\n setMermaidLoading(false)\n }\n }\n\n // 监听代码变化,重新渲染\n createEffect(() => {\n scheduleRender()\n })\n\n onCleanup(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n })\n\n async function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code())\n setCopied(true)\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n setCopied(false)\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n }\n\n return (\n <div class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">\n <SvgIcon svg={GravityMermaid} sizeClass=\"language-icon\" />\n MERMAID\n </span>\n <div class=\"mermaid-actions\">\n <button\n class=\"code-btn\"\n onClick={toggleMermaidView}\n type=\"button\"\n disabled={!mermaidSvg()}\n aria-label={mermaidViewMode() === 'preview' ? t('mermaid.viewSource') : t('mermaid.preview')}\n title={mermaidViewMode() === 'preview' ? 'View Source' : 'Preview'}\n >\n <SvgIcon svg={mermaidViewMode() === 'preview' ? LucideCode : LucideEye} />\n </button>\n <button\n class=\"code-btn\"\n onClick={copyCode}\n type=\"button\"\n aria-label={copied() ? t('mermaid.copied') : t('mermaid.copy')}\n title={copied() ? 'Copied!' : 'Copy'}\n >\n <SvgIcon svg={copied() ? LucideCopyCheck : LucideCopy} />\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n {/* 加载中 */}\n <Show when={mermaidLoading() && !mermaidSvg()}>\n <div class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </div>\n </Show>\n {/* 源码模式 */}\n <Show when={mermaidViewMode() === 'source' && !mermaidLoading()}>\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </Show>\n {/* 预览模式 */}\n <Show when={mermaidViewMode() === 'preview' && mermaidSvg() && !mermaidLoading()}>\n <div innerHTML={mermaidSvg()} class=\"mermaid-svg\" />\n </Show>\n {/* 无法渲染时显示源码 */}\n <Show when={!mermaidSvg() && !mermaidLoading() && mermaidViewMode() === 'preview'}>\n <pre class=\"mermaid-source-code\">{code()}</pre>\n </Show>\n </div>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Component } from 'solid-js'\n\nexport interface SvgIconProps {\n /** SVG 字符串内容 */\n svg: string\n /** 图标大小 class,如 incremark-icon--sm, incremark-icon--md 等 */\n sizeClass?: string\n}\n\n/**\n * SvgIcon 组件\n *\n * 直接渲染 SVG 字符串\n */\nexport const SvgIcon: Component<SvgIconProps> = (props) => {\n return (\n <span\n classList={{\n 'incremark-icon': true,\n [props.sizeClass || '']: !!props.sizeClass\n }}\n innerHTML={props.svg}\n aria-hidden=\"true\"\n />\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Code } from 'mdast'\nimport { Component, createEffect, createSignal, onCleanup, Show } from 'solid-js'\nimport { LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport { useShiki } from '../composables/useShiki'\nimport { useLocale } from '../composables/useLocale'\nimport { CachedCodeRenderer } from './CachedCodeRenderer'\nimport { SvgIcon } from './SvgIcon'\n\nexport interface IncremarkCodeDefaultProps {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** block 状态 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n}\n\nexport const IncremarkCodeDefault: Component<IncremarkCodeDefaultProps> = (props) => {\n const [copied, setCopied] = createSignal(false)\n\n const language = () => props.node.lang || 'text'\n const code = () => props.node.value\n\n // 使用 i18n\n const t = useLocale()\n\n // 使用 Shiki 单例管理器\n const { highlighterInfo, initHighlighter } = useShiki(props.theme ?? 'github-dark')\n\n // 语言是否已加载完成\n const [isLanguageLoaded, setIsLanguageLoaded] = createSignal(false)\n\n // 是否应该启用高亮(需要有代码内容才开始高亮逻辑)\n const shouldEnableHighlight = () => {\n return !props.disableHighlight && code() && code().length > 0\n }\n\n // 初始化 highlighter 并加载语言\n // 只有当存在代码内容时才开始加载语言,避免流式渲染时语言标识不完整导致的错误\n createEffect(async () => {\n const info = highlighterInfo()\n const lang = language()\n const shouldHighlight = shouldEnableHighlight()\n\n // 如果不需要高亮,直接返回\n if (!shouldHighlight) {\n return\n }\n\n if (!info) {\n await initHighlighter()\n } else if (lang && lang !== 'text') {\n // 检查语言是否已加载\n if (!info.loadedLanguages.has(lang as any)) {\n try {\n setIsLanguageLoaded(false)\n // 检查语言是否被 shiki 支持\n const supportedLangs = info.highlighter.getLoadedLanguages()\n const bundledLangs = await import('shiki').then(m => Object.keys(m.bundledLanguages || {}))\n const isSupported = supportedLangs.includes(lang) || bundledLangs.includes(lang)\n\n if (isSupported) {\n await info.highlighter.loadLanguage(lang as any)\n info.loadedLanguages.add(lang as any)\n }\n // 无论是否支持,都标记为已加载(不支持的语言会 fallback 到纯文本显示)\n setIsLanguageLoaded(true)\n } catch {\n // 语言加载失败,标记为已加载(回退到无高亮)\n setIsLanguageLoaded(true)\n }\n } else {\n setIsLanguageLoaded(true)\n }\n } else {\n // text 语言不需要加载\n setIsLanguageLoaded(true)\n }\n })\n\n let copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\n onCleanup(() => {\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n })\n\n async function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code())\n setCopied(true)\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n setCopied(false)\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n }\n\n return (\n <div class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{language()}</span>\n <button\n class=\"code-btn\"\n onClick={copyCode}\n type=\"button\"\n aria-label={copied() ? t('code.copied') : t('code.copy')}\n title={copied() ? 'Copied!' : 'Copy'}\n >\n <SvgIcon svg={copied() ? LucideCopyCheck : LucideCopy} />\n </button>\n </div>\n <div class=\"code-content\">\n <div class=\"shiki-wrapper\">\n {/* Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) */}\n <Show\n when={shouldEnableHighlight() && highlighterInfo() && isLanguageLoaded()}\n fallback={\n // 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示)\n <pre class=\"code-fallback\"><code>{code()}</code></pre>\n }\n >\n <CachedCodeRenderer\n code={code()}\n lang={language()}\n theme={props.theme ?? 'github-dark'}\n highlighter={highlighterInfo()!.highlighter}\n />\n </Show>\n </div>\n </div>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\n/**\n * CachedCodeRenderer - 使用 shiki-stream 实现流式代码高亮\n *\n * 基于 shiki-stream 的 SolidJS 实现,参考 Vue/React 版本\n *\n * 与 Vue/React 版本保持一致:\n * - 在组件初始化时创建 stream(不在 onMount 中)\n * - 直接消费 stream,不使用单独的 Renderer 组件\n * - hasStreamError 状态和错误处理\n * - class: 'shiki incremark-code-stream'\n */\nimport type { ThemedToken } from '@shikijs/core'\nimport { CodeToTokenTransformStream } from 'shiki-stream'\nimport { getTokenStyleObject } from '@shikijs/core'\nimport { createEffect, createSignal, on, onCleanup, onMount, For, Show } from 'solid-js'\nimport { batch } from 'solid-js'\nimport { Component } from 'solid-js'\n\nexport interface CachedCodeRendererProps {\n code: string\n lang: string\n theme: string\n highlighter: any\n onStreamStart?: () => void\n onStreamEnd?: () => void\n onStreamError?: () => void\n}\n\n// SSR 检测:Web Streams API 只在浏览器中可用\nconst isBrowser = typeof window !== 'undefined'\n\nexport const CachedCodeRenderer: Component<CachedCodeRendererProps> = (props) => {\n // Stream 错误状态\n const [hasStreamError, setHasStreamError] = createSignal(false)\n\n // Tokens 数组 - 使用 reactive 模式(与 Vue 一致)\n const [tokens, setTokens] = createSignal<ThemedToken[]>([])\n\n // Stream 相关状态(只在浏览器中初始化)\n const [index, setIndex] = createSignal(0)\n let controller: ReadableStreamController<string> | null = null\n let abortController: AbortController | null = null\n\n // 只在浏览器环境中创建 stream(在 onMount 中,确保只执行一次)\n // 这是与 Vue 版本的关键区别:Vue 的 setup 只执行一次,SolidJS 组件函数可能执行多次\n // 所以使用 onMount 来确保 stream 只创建一次\n onMount(() => {\n if (!isBrowser) return\n\n const textStream = new ReadableStream<string>({\n start(_controller) {\n controller = _controller\n },\n })\n\n try {\n const tokenStream = textStream.pipeThrough(\n new CodeToTokenTransformStream({\n highlighter: props.highlighter,\n lang: props.lang,\n theme: props.theme,\n allowRecalls: true,\n })\n )\n\n // 消费 stream(与 Vue 版本对齐,直接消费)\n let started = false\n\n abortController = new AbortController()\n\n tokenStream.pipeTo(new WritableStream({\n write(token) {\n if (abortController?.signal.aborted) return\n\n if (!started) {\n started = true\n props.onStreamStart?.()\n }\n\n batch(() => {\n if ('recall' in token) {\n // 处理 recall:删除最后 N 个 tokens\n setTokens(ts => ts.slice(0, -token.recall))\n } else {\n // 添加新 token\n setTokens(ts => [...ts, token])\n }\n })\n },\n close: () => {\n if (!abortController?.signal.aborted) {\n props.onStreamEnd?.()\n }\n },\n abort: () => {\n if (!abortController?.signal.aborted) {\n props.onStreamEnd?.()\n }\n },\n }), { signal: abortController.signal }).catch((error) => {\n // Ignore abort errors (normal cleanup)\n if (error instanceof Error && error.name === 'AbortError') {\n return\n }\n // 静默处理不支持的语言错误(不打印到 console)\n if (error instanceof Error && error.message.includes('not found')) {\n setHasStreamError(true)\n return\n }\n console.error('Stream error:', error)\n setHasStreamError(true)\n })\n } catch (error) {\n // 静默处理不支持的语言错误(不打印到 console)\n if (error instanceof Error && error.message.includes('not found')) {\n setHasStreamError(true)\n return\n }\n console.error('Failed to create token stream:', error)\n setHasStreamError(true)\n }\n })\n\n // 监听 code 变化,增量推送到流中(使用 on 进行精确追踪)\n createEffect(on(\n () => props.code,\n (newCode) => {\n if (!isBrowser || !controller || abortController?.signal.aborted) return\n\n // 只处理增量更新:传入新增的部分\n const currentIndex = index()\n if (newCode.length > currentIndex && !hasStreamError()) {\n const incremental = newCode.slice(currentIndex)\n controller.enqueue(incremental as any)\n setIndex(newCode.length)\n }\n },\n ))\n\n // 组件卸载时清理\n onCleanup(() => {\n abortController?.abort()\n controller = null\n setHasStreamError(false)\n setTokens([])\n setIndex(0)\n })\n\n // 渲染(与 Vue/React 版本对齐)\n return (\n <Show\n when={!(hasStreamError() || !isBrowser || tokens().length === 0)}\n fallback={\n // SSR 或错误时渲染原始代码\n <pre class=\"shiki incremark-code-stream\">\n <code>{props.code}</code>\n </pre>\n }\n >\n {/* 正常渲染高亮代码 */}\n <pre class=\"shiki incremark-code-stream\">\n <code>\n <For each={tokens()}>\n {(token) => (\n <span style={token.htmlStyle ?? getTokenStyleObject(token)}>\n {token.content}\n </span>\n )}\n </For>\n </code>\n </pre>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { List, ListItem, RootContent } from 'mdast'\nimport { Component, For, Show, Index } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\nexport interface IncremarkListProps {\n node: List\n}\n\nexport const IncremarkList: Component<IncremarkListProps> = (props) => {\n const ordered = () => props.node.ordered\n const start = () => props.node.start || undefined\n\n /**\n * 获取列表项的内联内容(来自第一个 paragraph)\n */\n function getItemInlineContent(item: ListItem) {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children\n }\n return []\n }\n\n /**\n * 获取列表项的块级子节点(嵌套列表、代码块等)\n * 排除第一个 paragraph,因为它已经被 getItemInlineContent 处理\n */\n function getItemBlockChildren(item: ListItem): RootContent[] {\n return item.children.filter((child, index) => {\n // 第一个 paragraph 已经被处理为内联内容\n if (index === 0 && child.type === 'paragraph') {\n return false\n }\n return true\n })\n }\n\n /**\n * 检查列表项是否有块级子节点(嵌套列表等)\n */\n function hasBlockChildren(item: ListItem): boolean {\n return getItemBlockChildren(item).length > 0\n }\n\n const hasTaskList = () => props.node.children.some(item => item.checked !== null && item.checked !== undefined)\n\n return (\n <Show\n when={ordered()}\n fallback={\n <ul\n class={`incremark-list${hasTaskList() ? ' task-list' : ''}`}\n >\n <Index each={props.node.children}>\n {(item, index) => {\n const itemData = item()\n const isTaskItem = itemData.checked !== null && itemData.checked !== undefined\n\n return (\n <li\n class={`incremark-list-item${isTaskItem ? ' task-item' : ''}`}\n >\n <Show when={isTaskItem}>\n <label class=\"task-label\">\n <input\n type=\"checkbox\"\n checked={itemData.checked ?? false}\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n </span>\n </label>\n </Show>\n <Show when={!isTaskItem}>\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n {/* 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) */}\n <Show when={hasBlockChildren(itemData)}>\n <Index each={getItemBlockChildren(itemData)}>\n {(child) => (\n <IncremarkRenderer node={child()} />\n )}\n </Index>\n </Show>\n </Show>\n </li>\n )\n }}\n </Index>\n </ul>\n }\n >\n <ol\n class={`incremark-list${hasTaskList() ? ' task-list' : ''}`}\n start={start()}\n >\n <Index each={props.node.children}>\n {(item, index) => {\n const itemData = item()\n const isTaskItem = itemData.checked !== null && itemData.checked !== undefined\n\n return (\n <li\n class={`incremark-list-item${isTaskItem ? ' task-item' : ''}`}\n >\n <Show when={isTaskItem}>\n <label class=\"task-label\">\n <input\n type=\"checkbox\"\n checked={itemData.checked ?? false}\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n </span>\n </label>\n </Show>\n <Show when={!isTaskItem}>\n <IncremarkInline nodes={getItemInlineContent(itemData)} />\n {/* 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) */}\n <Show when={hasBlockChildren(itemData)}>\n <Index each={getItemBlockChildren(itemData)}>\n {(child) => (\n <IncremarkRenderer node={child()} />\n )}\n </Index>\n </Show>\n </Show>\n </li>\n )\n }}\n </Index>\n </ol>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { IncremarkInline } from './IncremarkInline'\n\nexport interface IncremarkTableProps {\n node: Table\n}\n\nexport const IncremarkTable: Component<IncremarkTableProps> = (props) => {\n function getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n }\n\n const firstRow = () => props.node.children[0]\n const remainingRows = () => props.node.children.slice(1)\n\n const getAlignClass = (cellIndex: number) => {\n return `incremark-table-align-${props.node.align?.[cellIndex] || 'left'}`\n }\n\n return (\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <Show when={firstRow()}>\n <thead>\n <tr>\n <For each={firstRow()!.children}>\n {(cell, cellIndex) => (\n <th class={getAlignClass(cellIndex())}>\n <IncremarkInline nodes={getCellContent(cell)} />\n </th>\n )}\n </For>\n </tr>\n </thead>\n </Show>\n <tbody>\n <For each={remainingRows()}>\n {(row) => (\n <tr>\n <For each={row.children}>\n {(cell, cellIndex) => (\n <td class={getAlignClass(cellIndex())}>\n <IncremarkInline nodes={getCellContent(cell)} />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { Blockquote } from 'mdast'\nimport { Component, For } from 'solid-js'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\nexport interface IncremarkBlockquoteProps {\n node: Blockquote\n}\n\nexport const IncremarkBlockquote: Component<IncremarkBlockquoteProps> = (props) => {\n return (\n <blockquote class=\"incremark-blockquote\">\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </blockquote>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { ThematicBreak } from 'mdast'\nimport { Component } from 'solid-js'\n\nexport interface IncremarkThematicBreakProps {\n node: ThematicBreak\n}\n\nexport const IncremarkThematicBreak: Component<IncremarkThematicBreakProps> = () => {\n return <hr class=\"incremark-thematic-break\" />\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport type { JSX } from 'solid-js'\nimport { IncremarkRenderer } from './IncremarkRenderer'\n\n/**\n * 容器节点类型定义\n * 根据 directive 解析后的结构\n */\nexport interface ContainerNode {\n type: 'containerDirective' | 'leafDirective' | 'textDirective'\n name: string\n attributes?: Record<string, string>\n children?: RootContent[]\n}\n\nexport interface IncremarkContainerProps {\n node: ContainerNode\n customContainers?: Record<string, Component<any>>\n}\n\n/**\n * 解析 attributes 字符串为对象\n * directive 的 attributes 可能是字符串格式,需要解析\n */\nfunction parseOptions(attributes?: Record<string, string>): Record<string, any> {\n if (!attributes) return {}\n\n const options: Record<string, any> = {}\n for (const [key, value] of Object.entries(attributes)) {\n // 尝试解析 JSON 值\n try {\n options[key] = JSON.parse(value)\n } catch {\n // 如果不是 JSON,直接使用字符串值\n options[key] = value\n }\n }\n return options\n}\n\n/**\n * 容器组件\n * 渲染自定义容器(如 warning, info, tip)或默认容器\n */\nexport const IncremarkContainer: Component<IncremarkContainerProps> = (props) => {\n const containerName = () => props.node.name\n const options = () => parseOptions(props.node.attributes)\n const CustomContainer = () => props.customContainers?.[containerName()]\n\n // 如果没有自定义容器组件,使用默认渲染\n const hasCustomContainer = () => !!props.customContainers?.[containerName()]\n\n return (\n <Show\n when={hasCustomContainer()}\n fallback={\n <div class={`incremark-container incremark-container-${containerName()}`}>\n <Show when={props.node.children && props.node.children.length > 0}>\n <div class=\"incremark-container-content\">\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </div>\n </Show>\n </div>\n }\n >\n {/* 使用 Dynamic 组件来渲染自定义容器 */}\n <Dynamic\n component={CustomContainer()!}\n name={containerName()}\n options={options()}\n >\n {/* 将容器内容作为 children 传递 */}\n <Show when={props.node.children && props.node.children.length > 0}>\n <For each={props.node.children}>\n {(child) => (\n <IncremarkRenderer node={child} />\n )}\n </For>\n </Show>\n </Dynamic>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { RootContent } from 'mdast'\nimport { Component } from 'solid-js'\n\nexport interface IncremarkDefaultProps {\n node: RootContent\n}\n\n/**\n * 默认渲染组件\n * 用于未知类型的节点,显示调试信息\n */\nexport const IncremarkDefault: Component<IncremarkDefaultProps> = (props) => {\n return (\n <pre class=\"incremark-debug\">\n <code>{JSON.stringify(props.node, null, 2)}</code>\n </pre>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport type { FootnoteDefinition, RootContent } from 'mdast'\nimport { Component, For, Show } from 'solid-js'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport IncremarkRenderer from './IncremarkRenderer'\n\nexport interface IncremarkFootnotesProps {}\n\n/**\n * 脚注列表组件\n *\n * 在文档底部渲染所有脚注定义,按引用出现的顺序排列\n */\nexport const IncremarkFootnotes: Component<IncremarkFootnotesProps> = () => {\n const { footnoteDefinitions, footnoteReferenceOrder } = useDefinationsContext()\n\n /**\n * 按引用顺序排列的脚注列表\n * 只显示已有定义的脚注\n */\n const orderedFootnotes = () => {\n return footnoteReferenceOrder()\n .map(identifier => ({\n identifier,\n definition: footnoteDefinitions()[identifier]\n }))\n .filter(item => item.definition !== undefined)\n }\n\n /**\n * 是否有脚注需要显示\n */\n const hasFootnotes = () => orderedFootnotes().length > 0\n\n return (\n <Show when={hasFootnotes()}>\n <section class=\"incremark-footnotes\">\n <hr class=\"incremark-footnotes-divider\" />\n <ol class=\"incremark-footnotes-list\">\n <For each={orderedFootnotes()}>\n {(item, index) => (\n <li\n id={`fn-${item.identifier}`}\n class=\"incremark-footnote-item\"\n >\n <div class=\"incremark-footnote-content\">\n {/* 脚注序号 */}\n <span class=\"incremark-footnote-number\">{index() + 1}.</span>\n\n {/* 脚注内容 */}\n <div class=\"incremark-footnote-body\">\n <For each={item.definition.children}>\n {(child) => (\n <IncremarkRenderer\n node={(child as RootContent)}\n />\n )}\n </For>\n </div>\n </div>\n\n {/* 返回链接 */}\n <a\n href={`#fnref-${item.identifier}`}\n class=\"incremark-footnote-backref\"\n aria-label=\"返回引用位置\"\n >\n ↩\n </a>\n </li>\n )}\n </For>\n </ol>\n </section>\n </Show>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { Component, createEffect, createMemo, onMount, onCleanup } from 'solid-js'\nimport type { JSX } from 'solid-js'\nimport { useIncremark } from '../composables/useIncremark'\nimport type { IncremarkContentProps } from '../types'\nimport Incremark from './Incremark'\nimport { generateParserId } from '@incremark/shared'\n\n/**\n * IncremarkContent 组件\n *\n * 全合一组件,自动处理流式和内容模式\n */\nexport const IncremarkContent: Component<IncremarkContentProps> = (props) => {\n const incremarkOptions = () => ({\n gfm: true,\n htmlTree: true,\n containers: true,\n math: true,\n ...props.incremarkOptions\n })\n\n const incremark = useIncremark(incremarkOptions)\n const { blocks, append, finalize, render, reset, isDisplayComplete, markdown, contextValue, DefinationsProvider, parser } = incremark\n\n // DevTools 集成\n const parserId = props.devtoolsId || generateParserId()\n\n onMount(() => {\n if (props.devtools) {\n props.devtools.register(parser, {\n id: parserId,\n label: props.devtoolsLabel || parserId\n })\n }\n })\n\n onCleanup(() => {\n if (props.devtools) {\n props.devtools.unregister(parserId)\n }\n })\n\n const isStreamMode = () => typeof props.stream === 'function'\n\n async function handleStreamInput() {\n if (!props.stream) return\n\n try {\n const stream = props.stream()\n\n for await (const chunk of stream) {\n append(chunk)\n }\n\n finalize()\n } catch (error) {\n console.error('Stream error: ', error)\n finalize()\n }\n }\n\n function handleContentInput(newContent?: string, oldContent?: string) {\n if (!newContent) {\n if (oldContent) {\n reset()\n }\n return\n }\n\n if (newContent?.startsWith(oldContent ?? '')) {\n const delta = newContent.slice((oldContent || '').length)\n append(delta)\n } else {\n render(newContent)\n }\n }\n\n // 监听 content 变化\n createEffect(() => {\n const newContent = props.content\n\n if (isStreamMode()) {\n handleStreamInput()\n } else {\n handleContentInput(newContent, markdown())\n }\n })\n\n // 监听 isFinished 变化\n createEffect(() => {\n const newIsFinished = props.isFinished\n if (newIsFinished && props.content === markdown()) {\n finalize()\n }\n })\n\n return (\n <DefinationsProvider value={contextValue}>\n <Incremark\n blocks={blocks}\n pendingClass={props.pendingClass}\n isDisplayComplete={isDisplayComplete()}\n showBlockStatus={props.showBlockStatus}\n components={props.components}\n customContainers={props.customContainers}\n customCodeBlocks={props.customCodeBlocks}\n codeBlockConfigs={props.codeBlockConfigs}\n />\n </DefinationsProvider>\n )\n}\n\nexport default IncremarkContent\n","/* @jsxImportSource solid-js */\n\nimport { Component, createEffect, createSignal, onCleanup, onMount, JSX } from 'solid-js'\nimport type { Accessor } from 'solid-js'\n\nexport interface AutoScrollContainerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /** 是否启用自动滚动 */\n enabled?: Accessor<boolean> | boolean\n /** 触发自动滚动的底部阈值(像素) */\n threshold?: number\n /** 滚动行为 */\n behavior?: ScrollBehavior\n}\n\n/**\n * 自动滚动容器组件\n *\n * 当内容更新时自动滚动到底部,除非用户手动向上滚动\n */\nexport const AutoScrollContainer: Component<AutoScrollContainerProps> = (props) => {\n let containerRef: HTMLDivElement | undefined\n\n const [isUserScrolledUp, setIsUserScrolledUp] = createSignal(false)\n\n // 记录上一次滚动位置,用于判断滚动方向\n let lastScrollTop = 0\n let lastScrollHeight = 0\n\n const enabled = () => typeof props.enabled === 'function' ? props.enabled() : props.enabled ?? true\n const threshold = () => props.threshold ?? 50\n const scrollBehavior = () => props.behavior ?? 'instant'\n\n /**\n * 检查是否在底部附近\n */\n function isNearBottom(): boolean {\n if (!containerRef) return true\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef\n return scrollHeight - scrollTop - clientHeight <= threshold()\n }\n\n /**\n * 滚动到底部\n */\n function scrollToBottom(force = false): void {\n if (!containerRef) return\n\n // 如果用户手动向上滚动了,且不是强制滚动,则不自动滚动\n if (isUserScrolledUp() && !force) return\n\n containerRef.scrollTo({\n top: containerRef.scrollHeight,\n behavior: scrollBehavior()\n })\n }\n\n /**\n * 检查是否有滚动条\n */\n function hasScrollbar(): boolean {\n if (!containerRef) return false\n return containerRef.scrollHeight > containerRef.clientHeight\n }\n\n /**\n * 处理滚动事件\n */\n function handleScroll(): void {\n if (!containerRef) return\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef\n\n // 如果没有滚动条,恢复自动滚动\n if (scrollHeight <= clientHeight) {\n setIsUserScrolledUp(false)\n lastScrollTop = 0\n lastScrollHeight = scrollHeight\n return\n }\n\n // 检查用户是否滚动到底部附近\n if (isNearBottom()) {\n // 用户滚动到底部,恢复自动滚动\n setIsUserScrolledUp(false)\n } else {\n // 判断是否是用户主动向上滚动\n // 条件:scrollTop 减少(向上滚动)且 scrollHeight 没有变化(不是因为内容增加)\n const isScrollingUp = scrollTop < lastScrollTop\n const isContentUnchanged = scrollHeight === lastScrollHeight\n\n if (isScrollingUp && isContentUnchanged) {\n // 用户主动向上滚动,暂停自动滚动\n setIsUserScrolledUp(true)\n }\n }\n\n // 更新记录\n lastScrollTop = scrollTop\n lastScrollHeight = scrollHeight\n }\n\n // 监听内容变化(使用 MutationObserver)\n let observer: MutationObserver | null = null\n\n onMount(() => {\n if (!containerRef) return\n\n // 初始化滚动位置记录\n lastScrollTop = containerRef.scrollTop\n lastScrollHeight = containerRef.scrollHeight\n\n observer = new MutationObserver(() => {\n // 使用 requestAnimationFrame 避免 layout thrashing\n requestAnimationFrame(() => {\n if (!containerRef) return\n\n // 如果没有滚动条,重置状态\n if (!hasScrollbar()) {\n setIsUserScrolledUp(false)\n }\n\n // 更新 scrollHeight 记录(内容变化后)\n lastScrollHeight = containerRef.scrollHeight\n\n // 自动滚动\n if (enabled() && !isUserScrolledUp()) {\n scrollToBottom()\n }\n })\n })\n\n observer.observe(containerRef, {\n childList: true,\n subtree: true,\n characterData: true\n })\n })\n\n onCleanup(() => {\n observer?.disconnect()\n })\n\n return (\n <div\n ref={containerRef}\n class=\"auto-scroll-container\"\n onScroll={handleScroll}\n >\n {props.children}\n </div>\n )\n}\n","/* @jsxImportSource solid-js */\n\nimport { type Component, type JSX, createContext, useContext, createMemo, createSignal, type Accessor } from 'solid-js'\nimport type { DesignTokens } from '@incremark/theme'\nimport { applyTheme } from '@incremark/theme'\n\nexport type Theme = 'default' | 'dark' | Partial<DesignTokens>\n\nexport const ThemeContext = createContext<{\n theme: Accessor<Theme>\n setTheme: (theme: Theme) => void\n}>()\n\nexport interface ThemeProviderProps {\n theme?: Theme\n children?: JSX.Element\n}\n\nexport const ThemeProvider: Component<ThemeProviderProps> = (props) => {\n let containerRef: HTMLDivElement | undefined\n const [theme, setTheme] = createSignal<Theme>(props.theme || 'default')\n\n // 应用主题到 DOM - 监听 props.theme 变化\n createMemo(() => {\n const currentTheme = props.theme || 'default'\n setTheme(currentTheme)\n if (typeof document !== 'undefined' && containerRef) {\n applyTheme(containerRef, currentTheme)\n }\n })\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme }}>\n <div ref={containerRef} class=\"incremark-theme-provider\">\n {props.children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\n// 兼容其他框架的 useThemeContext API\nexport function useThemeContext() {\n const context = useTheme()\n\n // 判断是否为暗色主题\n const isDark = () => {\n const themeValue = context.theme()\n if (typeof themeValue === 'string') {\n return themeValue === 'dark'\n }\n // 如果是 DesignTokens 对象,通过判断颜色来决定\n return false\n }\n\n return {\n theme: context.theme,\n isDark: isDark()\n }\n}\n","// Composables\nexport { useIncremark, useStreamRenderer, useBlockTransformer, useLocale } from './composables'\nexport { useProvideDefinations } from './composables/useProvideDefinations'\nexport { useDefinationsContext } from './composables/useDefinationsContext'\nexport type {\n UseIncremarkOptions,\n TypewriterOptions,\n TypewriterControls,\n UseStreamRendererOptions,\n UseStreamRendererReturn,\n UseBlockTransformerOptions,\n UseBlockTransformerReturn\n} from './composables'\n\n// Components\nexport * from './components';\n\n// Utilities\nexport { clearAnimatedChunks, shouldAnimateChunk } from './utils/animatedChunks'\n\nexport { ThemeProvider as ThemeProviderExport, useTheme } from './components/ThemeProvider'\nexport { ConfigProvider as ConfigProviderExport } from './components/ConfigProvider'\n\n// Re-export core types\nexport type {\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n Root,\n RootContent,\n // Transformer types\n SourceBlock,\n DisplayBlock,\n TransformerPlugin,\n TransformerOptions,\n TransformerState,\n AnimationEffect\n} from '@incremark/core'\n\n// Re-export mdast types\nexport type {\n Root as MdastRoot,\n Parent,\n // Nodes\n Heading,\n Paragraph,\n Code,\n Blockquote,\n List,\n ListItem,\n Table,\n TableCell,\n ThematicBreak,\n // Inline\n Text,\n PhrasingContent,\n InlineCode,\n Link,\n LinkReference,\n Image,\n ImageReference,\n // HTML\n HTML,\n // Definitions\n Definition,\n FootnoteDefinition\n} from 'mdast'\n\n// Re-export transformer utilities and plugins\nexport {\n BlockTransformer,\n createBlockTransformer,\n countChars,\n sliceAst,\n cloneNode,\n codeBlockPlugin,\n mermaidPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin,\n defaultPlugins,\n allPlugins,\n createPlugin\n} from '@incremark/core'\n\n// Re-export theme utilities\nexport {\n type DesignTokens,\n defaultTheme,\n darkTheme,\n generateCSSVars,\n mergeTheme,\n applyTheme\n} from '@incremark/theme'\n\n// Re-export i18n utilities\nimport { en as enShared, zhCN as zhCNShared } from '@incremark/shared'\nimport type { IncremarkLocale } from '@incremark/shared'\n\nexport { enShared as en, zhCNShared as zhCN }\nexport type { IncremarkLocale }\n"],"mappings":"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","names":["createSignal","createEffect","createSignal","createSignal","references","seen","DefinationsProvider","createSignal","createEffect","_","parserOptions","createSignal","createSignal","createContext","createSignal","jsx","useContext","useContext","createSignal","createSignal","createBlockTransformer","For","Show","Show","Dynamic","Dynamic","For","Show","createSignal","createEffect","onCleanup","jsx","Show","jsx","Show","Fragment","jsx","jsxs","For","Show","idx","jsx","Dynamic","jsx","Show","Dynamic","createEffect","createSignal","onCleanup","Show","jsx","jsx","jsxs","createSignal","createEffect","onCleanup","Show","createEffect","createSignal","onCleanup","Show","LucideCopy","LucideCopyCheck","isClipboardAvailable","createEffect","createSignal","onCleanup","onMount","For","Show","jsx","jsx","jsxs","createSignal","createEffect","onCleanup","isClipboardAvailable","LucideCopyCheck","LucideCopy","Show","Fragment","jsx","jsxs","Show","Dynamic","Show","Index","jsx","jsxs","Show","Index","For","Show","jsx","jsxs","Show","For","For","jsx","For","jsx","For","Show","Dynamic","jsx","Show","For","Dynamic","jsx","Fragment","jsx","jsxs","isHtmlNode","Show","Dynamic","For","Show","jsx","jsxs","Show","For","jsx","jsxs","For","Show","createEffect","onMount","onCleanup","jsx","DefinationsProvider","onMount","onCleanup","createEffect","createSignal","onCleanup","onMount","jsx","createContext","useContext","createMemo","createSignal","jsx","createBlockTransformer","mathPlugin","defaultPlugins","applyTheme"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@incremark/solid",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "High-performance streaming markdown renderer for SolidJS ecosystem.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -20,11 +20,11 @@
20
20
  "@antfu/utils": "^9.3.0",
21
21
  "shiki": "^3.20.0",
22
22
  "shiki-stream": "^0.1.4",
23
- "@incremark/core": "0.3.4",
24
- "@incremark/theme": "0.3.4",
25
- "@incremark/shared": "0.3.4",
26
- "@incremark/devtools": "0.3.4",
27
- "@incremark/icons": "0.3.4"
23
+ "@incremark/core": "0.3.6",
24
+ "@incremark/shared": "0.3.6",
25
+ "@incremark/devtools": "0.3.6",
26
+ "@incremark/icons": "0.3.6",
27
+ "@incremark/theme": "0.3.6"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "katex": "^0.16.0",
@@ -44,7 +44,7 @@
44
44
  "@types/lodash-es": "^4.17.12",
45
45
  "@types/mdast": "^4.0.0",
46
46
  "tsup": "^8.0.0",
47
- "typescript": "^5.3.0",
47
+ "typescript": "^5.9.3",
48
48
  "solid-js": "^1.9.0"
49
49
  },
50
50
  "keywords": [