@incremark/svelte 0.2.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.en.md +274 -0
  2. package/dist/ThemeProvider.svelte +4 -1
  3. package/dist/ThemeProvider.svelte.d.ts.map +1 -1
  4. package/dist/components/AutoScrollContainer.svelte +18 -18
  5. package/dist/components/ConfigProvider.svelte +18 -0
  6. package/dist/components/ConfigProvider.svelte.d.ts +9 -0
  7. package/dist/components/ConfigProvider.svelte.d.ts.map +1 -0
  8. package/dist/components/Incremark.svelte +63 -72
  9. package/dist/components/Incremark.svelte.d.ts +5 -7
  10. package/dist/components/Incremark.svelte.d.ts.map +1 -1
  11. package/dist/components/IncremarkCode.svelte +28 -251
  12. package/dist/components/IncremarkCode.svelte.d.ts +4 -1
  13. package/dist/components/IncremarkCode.svelte.d.ts.map +1 -1
  14. package/dist/components/IncremarkCodeDefault.svelte +115 -0
  15. package/dist/components/IncremarkCodeDefault.svelte.d.ts +18 -0
  16. package/dist/components/IncremarkCodeDefault.svelte.d.ts.map +1 -0
  17. package/dist/components/IncremarkCodeMermaid.svelte +148 -0
  18. package/dist/components/IncremarkCodeMermaid.svelte.d.ts +14 -0
  19. package/dist/components/IncremarkCodeMermaid.svelte.d.ts.map +1 -0
  20. package/dist/components/IncremarkContent.svelte +115 -0
  21. package/dist/components/IncremarkContent.svelte.d.ts +5 -0
  22. package/dist/components/IncremarkContent.svelte.d.ts.map +1 -0
  23. package/dist/components/IncremarkFootnotes.svelte +4 -8
  24. package/dist/components/IncremarkFootnotes.svelte.d.ts.map +1 -1
  25. package/dist/components/IncremarkInline.svelte +3 -3
  26. package/dist/components/IncremarkList.svelte +1 -0
  27. package/dist/components/IncremarkRenderer.svelte +4 -0
  28. package/dist/components/IncremarkRenderer.svelte.d.ts +2 -0
  29. package/dist/components/IncremarkRenderer.svelte.d.ts.map +1 -1
  30. package/dist/components/IncremarkTable.svelte +6 -9
  31. package/dist/components/IncremarkTable.svelte.d.ts.map +1 -1
  32. package/dist/components/SvgIcon.svelte +25 -0
  33. package/dist/components/SvgIcon.svelte.d.ts +12 -0
  34. package/dist/components/SvgIcon.svelte.d.ts.map +1 -0
  35. package/dist/components/index.d.ts +2 -1
  36. package/dist/components/index.d.ts.map +1 -1
  37. package/dist/components/index.js +1 -0
  38. package/dist/components/types.d.ts +29 -3
  39. package/dist/components/types.d.ts.map +1 -1
  40. package/dist/index.d.ts +8 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -2
  43. package/dist/stores/{useDevTools.d.ts → useDevTools.svelte.d.ts} +1 -1
  44. package/dist/stores/useDevTools.svelte.d.ts.map +1 -0
  45. package/dist/stores/{useDevTools.js → useDevTools.svelte.js} +10 -9
  46. package/dist/stores/useIncremark.d.ts +4 -4
  47. package/dist/stores/useIncremark.d.ts.map +1 -1
  48. package/dist/stores/useLocale.svelte.d.ts +29 -0
  49. package/dist/stores/useLocale.svelte.d.ts.map +1 -0
  50. package/dist/stores/useLocale.svelte.js +32 -0
  51. package/dist/stores/useShiki.svelte.d.ts +9 -0
  52. package/dist/stores/useShiki.svelte.d.ts.map +1 -0
  53. package/dist/stores/useShiki.svelte.js +110 -0
  54. package/dist/stores/useTypewriter.d.ts +0 -1
  55. package/dist/stores/useTypewriter.d.ts.map +1 -1
  56. package/dist/stores/useTypewriter.js +1 -3
  57. package/package.json +13 -7
  58. package/dist/stores/useDevTools.d.ts.map +0 -1
@@ -0,0 +1,115 @@
1
+ <!--
2
+ @file IncremarkContent.svelte - 开箱即用的 Markdown 渲染组件
3
+ @description 自动处理流式内容和普通内容的高级组件
4
+ -->
5
+
6
+ <script lang="ts">
7
+ import { useIncremark, type UseIncremarkOptions } from '../stores/useIncremark'
8
+ import type { IncremarkContentProps } from './types'
9
+ import Incremark from './Incremark.svelte'
10
+ import { get } from 'svelte/store'
11
+ import { untrack } from 'svelte'
12
+
13
+ let {
14
+ stream,
15
+ content,
16
+ components = {},
17
+ customContainers = {},
18
+ customCodeBlocks = {},
19
+ codeBlockConfigs = {},
20
+ isFinished = false,
21
+ incremarkOptions,
22
+ pendingClass = 'incremark-pending',
23
+ showBlockStatus = false
24
+ }: IncremarkContentProps = $props()
25
+
26
+ // 创建稳定的 incremark 实例
27
+ // 使用 untrack 读取初始值,因为 useIncremark 只需初始化一次
28
+ // 后续的配置更新通过 typewriter.setOptions 在 $effect 中处理
29
+ const incremarkInstance = untrack(() => useIncremark({
30
+ gfm: incremarkOptions?.gfm ?? true,
31
+ htmlTree: incremarkOptions?.htmlTree ?? true,
32
+ containers: incremarkOptions?.containers ?? true,
33
+ math: incremarkOptions?.math ?? true,
34
+ typewriter: incremarkOptions?.typewriter
35
+ }))
36
+ const { blocks, append, finalize, render, reset, isDisplayComplete, markdown, typewriter } = incremarkInstance
37
+
38
+ // 监听 incremarkOptions 的变化,更新 typewriter 配置
39
+ $effect(() => {
40
+ if (incremarkOptions?.typewriter) {
41
+ typewriter.setOptions(incremarkOptions.typewriter)
42
+ }
43
+ })
44
+
45
+ // 派生状态
46
+ const isStreamMode = $derived(typeof stream === 'function')
47
+
48
+ // 保存前一个 content 值用于增量更新
49
+ let prevContent: string | undefined = $state(undefined)
50
+ let isStreaming = $state(false)
51
+
52
+ async function handleStreamInput() {
53
+ if (!stream || isStreaming) return
54
+
55
+ isStreaming = true
56
+ try {
57
+ const streamGen = stream()
58
+
59
+ for await (const chunk of streamGen) {
60
+ append(chunk)
61
+ }
62
+
63
+ finalize()
64
+ } catch (error) {
65
+ console.error('Stream error: ', error)
66
+ finalize()
67
+ } finally {
68
+ isStreaming = false
69
+ }
70
+ }
71
+
72
+ function handleContentInput(newContent?: string, oldContent?: string) {
73
+ if (!newContent) {
74
+ if (oldContent) {
75
+ reset()
76
+ }
77
+ return
78
+ }
79
+
80
+ if (newContent?.startsWith(oldContent ?? '')) {
81
+ const delta = newContent.slice((oldContent || '').length)
82
+ append(delta)
83
+ } else {
84
+ render(newContent)
85
+ }
86
+ }
87
+
88
+ // 监听 content 变化
89
+ $effect(() => {
90
+ if (isStreamMode) {
91
+ handleStreamInput()
92
+ } else {
93
+ handleContentInput(content, prevContent)
94
+ }
95
+ prevContent = content
96
+ })
97
+
98
+ // 监听 isFinished 变化
99
+ $effect(() => {
100
+ if (isFinished && content === get(markdown)) {
101
+ finalize()
102
+ }
103
+ })
104
+ </script>
105
+
106
+ <Incremark
107
+ blocks={$blocks}
108
+ isDisplayComplete={$isDisplayComplete}
109
+ {pendingClass}
110
+ {showBlockStatus}
111
+ {components}
112
+ {customContainers}
113
+ {customCodeBlocks}
114
+ {codeBlockConfigs}
115
+ />
@@ -0,0 +1,5 @@
1
+ import type { IncremarkContentProps } from './types';
2
+ declare const IncremarkContent: import("svelte").Component<IncremarkContentProps, {}, "">;
3
+ type IncremarkContent = ReturnType<typeof IncremarkContent>;
4
+ export default IncremarkContent;
5
+ //# sourceMappingURL=IncremarkContent.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncremarkContent.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkContent.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AA+GpD,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -4,26 +4,22 @@
4
4
  -->
5
5
 
6
6
  <script lang="ts">
7
- import type { Readable } from 'svelte/store'
8
- import type { FootnoteDefinition, RootContent } from 'mdast'
7
+ import type { RootContent } from 'mdast'
9
8
  import { getDefinitionsContext } from '../context/definitionsContext'
10
9
  import IncremarkRenderer from './IncremarkRenderer.svelte'
11
10
 
12
-
13
11
  const context = getDefinitionsContext()
14
- const footnoteDefinitions = $derived(context?.footnoteDefinitions ?? {});
15
- const footnoteReferenceOrder = $derived(context?.footnoteReferenceOrder ?? []);
12
+ // 解构 store 以便使用 $ 语法订阅
13
+ const { footnoteDefinitions, footnoteReferenceOrder } = context
16
14
 
17
15
  /**
18
16
  * 按引用顺序排列的脚注列表
19
17
  * 只显示已有定义的脚注
20
18
  */
21
19
  const orderedFootnotes = $derived.by(() => {
22
- if (!footnoteReferenceOrder || !footnoteDefinitions) {
23
- return []
24
- }
25
20
  const order = $footnoteReferenceOrder
26
21
  const definitions = $footnoteDefinitions
22
+
27
23
  return order
28
24
  .map(identifier => ({
29
25
  identifier,
@@ -1 +1 @@
1
- {"version":3,"file":"IncremarkFootnotes.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkFootnotes.svelte.ts"],"names":[],"mappings":"AA4EA,QAAA,MAAM,kBAAkB,2DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"IncremarkFootnotes.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkFootnotes.svelte.ts"],"names":[],"mappings":"AAuEA,QAAA,MAAM,kBAAkB,2DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -69,10 +69,10 @@
69
69
  return (node as unknown as MathNode).type === 'inlineMath'
70
70
  }
71
71
 
72
- // 获取 definitions context(可能不存在)
73
- // 使用 $derived 来确保响应式
72
+ // 获取 definitions context
74
73
  const context = getDefinitionsContext()
75
- const definations = $derived(context?.definations ?? {});
74
+ // 解构 store 以便使用 $ 语法订阅
75
+ const { definations } = context
76
76
 
77
77
 
78
78
  /**
@@ -76,6 +76,7 @@
76
76
  this={tag}
77
77
  class="incremark-list"
78
78
  class:task-list={isTaskList}
79
+ start={node.start || undefined}
79
80
  >
80
81
  {#each node.children as item, index (index)}
81
82
  <li
@@ -23,6 +23,8 @@
23
23
  interface Props {
24
24
  /** 要渲染的节点 */
25
25
  node: RootContent | ContainerNode
26
+ /** 自定义组件映射,key 为节点类型 */
27
+ components?: Record<string, any>
26
28
  customContainers?: Record<string, any>
27
29
  customCodeBlocks?: Record<string, any>
28
30
  codeBlockConfigs?: Record<string, { takeOver?: boolean }>
@@ -31,6 +33,7 @@
31
33
 
32
34
  let {
33
35
  node,
36
+ components,
34
37
  customContainers,
35
38
  customCodeBlocks,
36
39
  codeBlockConfigs,
@@ -95,6 +98,7 @@
95
98
  customCodeBlocks={customCodeBlocks}
96
99
  codeBlockConfigs={codeBlockConfigs}
97
100
  blockStatus={blockStatus}
101
+ defaultCodeComponent={components?.['code']}
98
102
  />
99
103
  {:else}
100
104
  <!-- 其他节点:使用对应组件 -->
@@ -6,6 +6,8 @@ import { type ContainerNode } from './IncremarkContainer.svelte';
6
6
  interface Props {
7
7
  /** 要渲染的节点 */
8
8
  node: RootContent | ContainerNode;
9
+ /** 自定义组件映射,key 为节点类型 */
10
+ components?: Record<string, any>;
9
11
  customContainers?: Record<string, any>;
10
12
  customCodeBlocks?: Record<string, any>;
11
13
  codeBlockConfigs?: Record<string, {
@@ -1 +1 @@
1
- {"version":3,"file":"IncremarkRenderer.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,OAAO,CAAA;AAW9C,OAA2B,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGnF;;GAEG;AACH,UAAU,KAAK;IACb,aAAa;IACb,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CACjD;AAwFH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"IncremarkRenderer.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,OAAO,CAAA;AAW9C,OAA2B,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGnF;;GAEG;AACH,UAAU,KAAK;IACb,aAAa;IACb,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;IACjC,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CACjD;AAyFH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -28,15 +28,13 @@
28
28
  }
29
29
 
30
30
  /**
31
- * 获取单元格对齐方式
31
+ * 获取单元格对齐类名
32
32
  *
33
33
  * @param cellIndex - 单元格索引
34
- * @returns 对齐方式样式对象
34
+ * @returns 对齐方式类名
35
35
  */
36
- function getCellAlign(cellIndex: number): { textAlign: string } {
37
- return {
38
- textAlign: node.align?.[cellIndex] || 'left'
39
- }
36
+ function getCellAlignClass(cellIndex: number): string {
37
+ return `incremark-table-align-${node.align?.[cellIndex] || 'left'}`
40
38
  }
41
39
 
42
40
  /**
@@ -56,7 +54,7 @@
56
54
  {#if headerRow}
57
55
  <tr>
58
56
  {#each headerRow.children as cell, cellIndex (cellIndex)}
59
- <th style={getCellAlign(cellIndex)}>
57
+ <th class={getCellAlignClass(cellIndex)}>
60
58
  <IncremarkInline nodes={getCellContent(cell)} />
61
59
  </th>
62
60
  {/each}
@@ -67,7 +65,7 @@
67
65
  {#each bodyRows as row, rowIndex (rowIndex)}
68
66
  <tr>
69
67
  {#each row.children as cell, cellIndex (cellIndex)}
70
- <td style={getCellAlign(cellIndex)}>
68
+ <td class={getCellAlignClass(cellIndex)}>
71
69
  <IncremarkInline nodes={getCellContent(cell)} />
72
70
  </td>
73
71
  {/each}
@@ -76,4 +74,3 @@
76
74
  </tbody>
77
75
  </table>
78
76
  </div>
79
-
@@ -1 +1 @@
1
- {"version":3,"file":"IncremarkTable.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkTable.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,OAAO,CAAA;AAI5D;;GAEG;AACH,UAAU,KAAK;IACb,WAAW;IACX,IAAI,EAAE,KAAK,CAAA;CACZ;AAyEH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"IncremarkTable.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkTable.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,OAAO,CAAA;AAI5D;;GAEG;AACH,UAAU,KAAK;IACb,WAAW;IACX,IAAI,EAAE,KAAK,CAAA;CACZ;AAsEH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,25 @@
1
+ <!--
2
+ SvgIcon 组件
3
+
4
+ 直接渲染 SVG 字符串
5
+ -->
6
+ <script lang="ts">
7
+ interface Props {
8
+ /** SVG 字符串内容 */
9
+ svg: string
10
+ /** 图标大小 class,如 incremark-icon--sm, incremark-icon--md 等 */
11
+ sizeClass?: string
12
+ /** 自定义类名 */
13
+ class?: string
14
+ }
15
+
16
+ let {
17
+ svg,
18
+ sizeClass,
19
+ class: className
20
+ }: Props = $props()
21
+ </script>
22
+
23
+ <span class="incremark-icon {sizeClass || ''} {className || ''}" aria-hidden="true">
24
+ {@html svg}
25
+ </span>
@@ -0,0 +1,12 @@
1
+ interface Props {
2
+ /** SVG 字符串内容 */
3
+ svg: string;
4
+ /** 图标大小 class,如 incremark-icon--sm, incremark-icon--md 等 */
5
+ sizeClass?: string;
6
+ /** 自定义类名 */
7
+ class?: string;
8
+ }
9
+ declare const SvgIcon: import("svelte").Component<Props, {}, "">;
10
+ type SvgIcon = ReturnType<typeof SvgIcon>;
11
+ export default SvgIcon;
12
+ //# sourceMappingURL=SvgIcon.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgIcon.svelte.d.ts","sourceRoot":"","sources":["../../src/components/SvgIcon.svelte.ts"],"names":[],"mappings":"AAGE,UAAU,KAAK;IACb,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAkBH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * @description 导出所有组件
4
4
  */
5
5
  export { default as Incremark } from './Incremark.svelte';
6
+ export { default as IncremarkContent } from './IncremarkContent.svelte';
6
7
  export { default as IncremarkParagraph } from './IncremarkParagraph.svelte';
7
8
  export { default as IncremarkInline } from './IncremarkInline.svelte';
8
9
  export { default as IncremarkHeading } from './IncremarkHeading.svelte';
@@ -17,5 +18,5 @@ export { default as IncremarkFootnotes } from './IncremarkFootnotes.svelte';
17
18
  export { default as IncremarkDefault } from './IncremarkDefault.svelte';
18
19
  export { default as IncremarkRenderer } from './IncremarkRenderer.svelte';
19
20
  export { default as AutoScrollContainer } from './AutoScrollContainer.svelte';
20
- export type { ComponentMap, BlockWithStableId } from './types';
21
+ export type { ComponentMap, RenderableBlock, IncremarkContentProps, CodeBlockConfig } from './types';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAE7E,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAE7E,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA"}
@@ -3,6 +3,7 @@
3
3
  * @description 导出所有组件
4
4
  */
5
5
  export { default as Incremark } from './Incremark.svelte';
6
+ export { default as IncremarkContent } from './IncremarkContent.svelte';
6
7
  export { default as IncremarkParagraph } from './IncremarkParagraph.svelte';
7
8
  export { default as IncremarkInline } from './IncremarkInline.svelte';
8
9
  export { default as IncremarkHeading } from './IncremarkHeading.svelte';
@@ -2,17 +2,43 @@
2
2
  * @file Component Types - 组件类型定义
3
3
  * @description 定义组件相关的类型
4
4
  */
5
+ import type { Component } from 'svelte';
5
6
  import type { ParsedBlock } from '@incremark/core';
7
+ import type { UseIncremarkOptions } from '../stores/useIncremark';
6
8
  /**
7
9
  * 组件映射类型
8
10
  * 使用 any 以支持不同类型的组件
9
11
  */
10
12
  export type ComponentMap = Partial<Record<string, any>>;
11
13
  /**
12
- * 带稳定 ID 的块类型
14
+ * 可渲染的块类型(带 isLastPending 字段用于打字机光标)
13
15
  */
14
- export interface BlockWithStableId extends ParsedBlock {
15
- stableId: string;
16
+ export type RenderableBlock = ParsedBlock & {
16
17
  isLastPending?: boolean;
18
+ };
19
+ /**
20
+ * 代码块配置
21
+ */
22
+ export interface CodeBlockConfig {
23
+ /** 是否从一开始就接管渲染,而不是等到 completed 状态 */
24
+ takeOver?: boolean;
25
+ }
26
+ /**
27
+ * IncremarkContent 组件 Props
28
+ */
29
+ export interface IncremarkContentProps {
30
+ stream?: () => AsyncGenerator<string>;
31
+ content?: string;
32
+ components?: ComponentMap;
33
+ /** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */
34
+ customContainers?: Record<string, Component<any>>;
35
+ /** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */
36
+ customCodeBlocks?: Record<string, Component<any>>;
37
+ /** 代码块配置映射,key 为代码语言名称 */
38
+ codeBlockConfigs?: Record<string, CodeBlockConfig>;
39
+ isFinished?: boolean;
40
+ incremarkOptions?: UseIncremarkOptions;
41
+ pendingClass?: string;
42
+ showBlockStatus?: boolean;
17
43
  }
18
44
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEjE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAEvD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,YAAY,CAAA;IACzB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,0BAA0B;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAClD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B"}
package/dist/index.d.ts CHANGED
@@ -3,13 +3,19 @@
3
3
  * @description Svelte 5 集成库的导出入口
4
4
  */
5
5
  export { useIncremark, type UseIncremarkOptions, type UseIncremarkReturn, type TypewriterOptions, type TypewriterControls } from './stores/useIncremark';
6
- export { useDevTools, type UseDevToolsOptions } from './stores/useDevTools';
6
+ export { useDevTools, type UseDevToolsOptions } from './stores/useDevTools.svelte';
7
7
  export { useBlockTransformer, type UseBlockTransformerOptions, type UseBlockTransformerReturn } from './stores/useBlockTransformer';
8
+ export { useLocale, type UseLocaleReturn } from './stores/useLocale.svelte';
8
9
  export { setDefinitionsContext, getDefinitionsContext, type DefinitionsContextValue } from './context/definitionsContext';
9
- export { Incremark, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer, type ComponentMap, type BlockWithStableId } from './components';
10
+ export { Incremark, IncremarkContent, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer, type ComponentMap, type RenderableBlock, type IncremarkContentProps, type CodeBlockConfig } from './components';
10
11
  export { default as AutoScrollContainer } from './components/AutoScrollContainer.svelte';
11
12
  export { default as ThemeProvider } from './ThemeProvider.svelte';
13
+ export { default as ConfigProvider } from './components/ConfigProvider.svelte';
12
14
  export type { ParsedBlock, IncrementalUpdate, ParserOptions, BlockStatus, Root, RootContent, SourceBlock, DisplayBlock, TransformerPlugin, TransformerOptions, TransformerState, AnimationEffect } from '@incremark/core';
13
15
  export { BlockTransformer, createBlockTransformer, countChars, sliceAst, cloneNode, codeBlockPlugin, mermaidPlugin, imagePlugin, mathPlugin, thematicBreakPlugin, defaultPlugins, allPlugins, createPlugin } from '@incremark/core';
14
16
  export { type DesignTokens, defaultTheme, darkTheme, generateCSSVars, mergeTheme, applyTheme } from '@incremark/theme';
17
+ import { en as enShared, zhCN as zhCNShared } from '@incremark/shared';
18
+ import type { IncremarkLocale } from '@incremark/shared';
19
+ export { enShared as en, zhCNShared as zhCN };
20
+ export type { IncremarkLocale };
15
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACxJ,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGzH,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AACxF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGjE,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,IAAI,EACJ,WAAW,EAEX,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,YAAY,EACb,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,KAAK,YAAY,EACjB,YAAY,EACZ,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACX,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACxJ,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAClF,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGzH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AACxF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAG9E,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,IAAI,EACJ,WAAW,EAEX,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,YAAY,EACb,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,KAAK,YAAY,EACjB,YAAY,EACZ,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACX,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,IAAI,IAAI,EAAE,CAAA;AAC7C,YAAY,EAAE,eAAe,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -4,16 +4,21 @@
4
4
  */
5
5
  // Stores/Utilities
6
6
  export { useIncremark } from './stores/useIncremark';
7
- export { useDevTools } from './stores/useDevTools';
7
+ export { useDevTools } from './stores/useDevTools.svelte';
8
8
  export { useBlockTransformer } from './stores/useBlockTransformer';
9
+ export { useLocale } from './stores/useLocale.svelte';
9
10
  // Context
10
11
  export { setDefinitionsContext, getDefinitionsContext } from './context/definitionsContext';
11
12
  // Components
12
- export { Incremark, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer } from './components';
13
+ export { Incremark, IncremarkContent, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer } from './components';
13
14
  // Additional Components
14
15
  export { default as AutoScrollContainer } from './components/AutoScrollContainer.svelte';
15
16
  export { default as ThemeProvider } from './ThemeProvider.svelte';
17
+ export { default as ConfigProvider } from './components/ConfigProvider.svelte';
16
18
  // Re-export transformer utilities and plugins
17
19
  export { BlockTransformer, createBlockTransformer, countChars, sliceAst, cloneNode, codeBlockPlugin, mermaidPlugin, imagePlugin, mathPlugin, thematicBreakPlugin, defaultPlugins, allPlugins, createPlugin } from '@incremark/core';
18
20
  // Re-export theme utilities
19
21
  export { defaultTheme, darkTheme, generateCSSVars, mergeTheme, applyTheme } from '@incremark/theme';
22
+ // Re-export i18n utilities
23
+ import { en as enShared, zhCN as zhCNShared } from '@incremark/shared';
24
+ export { enShared as en, zhCNShared as zhCN };
@@ -30,4 +30,4 @@ export interface UseDevToolsOptions extends DevToolsOptions {
30
30
  * ```
31
31
  */
32
32
  export declare function useDevTools(incremark: UseIncremarkReturn, options?: UseDevToolsOptions): import("@incremark/devtools").IncremarkDevTools;
33
- //# sourceMappingURL=useDevTools.d.ts.map
33
+ //# sourceMappingURL=useDevTools.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDevTools.svelte.d.ts","sourceRoot":"","sources":["../../src/stores/useDevTools.svelte.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,eAAe;CAAG;AAE9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,kBAAuB,mDAkCjC"}
@@ -2,7 +2,6 @@
2
2
  * @file useDevTools Store - DevTools 集成
3
3
  * @description Svelte 5 DevTools 一行接入
4
4
  */
5
- import { onMount, onDestroy } from 'svelte';
6
5
  import { createDevTools } from '@incremark/devtools';
7
6
  /**
8
7
  * Svelte 5 DevTools 一行接入
@@ -29,8 +28,8 @@ export function useDevTools(incremark, options = {}) {
29
28
  // 设置 parser 的 onChange 回调
30
29
  incremark.parser.setOnChange((state) => {
31
30
  const blocks = [
32
- ...state.completedBlocks.map((b) => ({ ...b, stableId: b.id })),
33
- ...state.pendingBlocks.map((b, i) => ({ ...b, stableId: `pending-${i}` }))
31
+ ...state.completedBlocks,
32
+ ...state.pendingBlocks
34
33
  ];
35
34
  devtools.update({
36
35
  blocks,
@@ -41,13 +40,15 @@ export function useDevTools(incremark, options = {}) {
41
40
  isLoading: state.pendingBlocks.length > 0
42
41
  });
43
42
  });
44
- onMount(() => {
43
+ // 使用 $effect 处理挂载和卸载
44
+ $effect(() => {
45
45
  devtools.mount();
46
- });
47
- onDestroy(() => {
48
- devtools.unmount();
49
- // 清理回调
50
- incremark.parser.setOnChange(undefined);
46
+ // 返回清理函数
47
+ return () => {
48
+ devtools.unmount();
49
+ // 清理回调
50
+ incremark.parser.setOnChange(undefined);
51
+ };
51
52
  });
52
53
  return devtools;
53
54
  }
@@ -30,6 +30,9 @@ export interface UseIncremarkOptions extends ParserOptions {
30
30
  /** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */
31
31
  typewriter?: TypewriterOptions;
32
32
  }
33
+ export type RenderableBlock = ParsedBlock & {
34
+ isLastPending?: boolean;
35
+ };
33
36
  /**
34
37
  * 打字机控制对象
35
38
  */
@@ -66,10 +69,7 @@ export interface UseIncremarkReturn {
66
69
  /** 当前完整的 AST */
67
70
  ast: Readable<Root>;
68
71
  /** 用于渲染的 blocks(根据打字机设置自动处理) */
69
- blocks: Readable<Array<ParsedBlock & {
70
- stableId: string;
71
- isLastPending?: boolean;
72
- }>>;
72
+ blocks: Readable<Array<RenderableBlock>>;
73
73
  /** 是否正在加载 */
74
74
  isLoading: Writable<boolean>;
75
75
  /** 是否已完成(finalize) */
@@ -1 +1 @@
1
- {"version":3,"file":"useIncremark.d.ts","sourceRoot":"","sources":["../../src/stores/useIncremark.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useIncremark.d.ts","sourceRoot":"","sources":["../../src/stores/useIncremark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { IncremarkLocale } from '@incremark/shared';
2
+ /**
3
+ * Locale Context 值类型
4
+ * 使用函数返回 locale,以支持响应式更新
5
+ */
6
+ export interface LocaleContextValue {
7
+ /** 获取当前 locale 的函数(支持响应式) */
8
+ getLocale: () => IncremarkLocale;
9
+ }
10
+ /**
11
+ * Svelte 国际化 Composable
12
+ */
13
+ export interface UseLocaleReturn {
14
+ /** 翻译函数 */
15
+ t: (key: string) => string;
16
+ }
17
+ /**
18
+ * 提供 locale context
19
+ * 必须在组件初始化时同步调用(script 顶层)
20
+ *
21
+ * @param getLocale - 获取 locale 的函数,支持响应式
22
+ */
23
+ export declare function provideLocale(getLocale: () => IncremarkLocale): void;
24
+ /**
25
+ * 使用 locale
26
+ * 在子组件中调用以获取翻译函数
27
+ */
28
+ export declare function useLocale(): UseLocaleReturn;
29
+ //# sourceMappingURL=useLocale.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocale.svelte.d.ts","sourceRoot":"","sources":["../../src/stores/useLocale.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,eAAe,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,eAAe,QAG7D;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,eAAe,CAiB3C"}
@@ -0,0 +1,32 @@
1
+ import { setContext, getContext } from 'svelte';
2
+ import { en } from '../index';
3
+ const LOCALE_KEY = Symbol('incremark-locale');
4
+ /**
5
+ * 提供 locale context
6
+ * 必须在组件初始化时同步调用(script 顶层)
7
+ *
8
+ * @param getLocale - 获取 locale 的函数,支持响应式
9
+ */
10
+ export function provideLocale(getLocale) {
11
+ const contextValue = { getLocale };
12
+ setContext(LOCALE_KEY, contextValue);
13
+ }
14
+ /**
15
+ * 使用 locale
16
+ * 在子组件中调用以获取翻译函数
17
+ */
18
+ export function useLocale() {
19
+ const context = getContext(LOCALE_KEY);
20
+ // 获取当前 locale(支持响应式更新)
21
+ const getLocale = context?.getLocale ?? (() => en);
22
+ const t = (key) => {
23
+ const locale = getLocale();
24
+ const keys = key.split('.');
25
+ let value = locale;
26
+ for (const k of keys) {
27
+ value = value?.[k];
28
+ }
29
+ return value || key;
30
+ };
31
+ return { t };
32
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 使用 Shiki Highlighter
3
+ * @param themeGetter 传入一个返回主题字符串的函数,例如 () => theme
4
+ */
5
+ export declare function useShiki(themeGetter: () => string): {
6
+ readonly isHighlighting: boolean;
7
+ highlight: (code: string, lang: string, fallbackTheme: string) => Promise<string>;
8
+ };
9
+ //# sourceMappingURL=useShiki.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShiki.svelte.d.ts","sourceRoot":"","sources":["../../src/stores/useShiki.svelte.ts"],"names":[],"mappings":"AA+FA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM;;sBAOjB,MAAM,QAAQ,MAAM,iBAAiB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;EAgC7F"}