@hejiayue/x-markdown-test 0.0.1-beta.121 → 0.0.1-beta.124

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 (85) hide show
  1. package/LICENSE +21 -0
  2. package/dist/x-markdown.cjs10.js +1 -1
  3. package/dist/x-markdown.cjs13.js +1 -1
  4. package/dist/x-markdown.cjs14.js +1 -1
  5. package/dist/x-markdown.cjs14.js.map +1 -1
  6. package/dist/x-markdown.cjs15.js +1 -1
  7. package/dist/x-markdown.cjs15.js.map +1 -1
  8. package/dist/x-markdown.cjs16.js +1 -1
  9. package/dist/x-markdown.cjs17.js +1 -1
  10. package/dist/x-markdown.cjs18.js +1 -1
  11. package/dist/x-markdown.cjs19.js +1 -1
  12. package/dist/x-markdown.cjs19.js.map +1 -1
  13. package/dist/x-markdown.cjs21.js +2 -0
  14. package/dist/x-markdown.cjs21.js.map +1 -0
  15. package/dist/x-markdown.cjs22.js +1 -1
  16. package/dist/x-markdown.cjs22.js.map +1 -1
  17. package/dist/{x-markdown.cjs25.js → x-markdown.cjs24.js} +2 -2
  18. package/dist/{x-markdown.cjs25.js.map → x-markdown.cjs24.js.map} +1 -1
  19. package/dist/x-markdown.cjs26.js +2 -0
  20. package/dist/x-markdown.cjs26.js.map +1 -0
  21. package/dist/x-markdown.cjs27.js +1 -1
  22. package/dist/x-markdown.cjs27.js.map +1 -1
  23. package/dist/x-markdown.cjs28.js +1 -1
  24. package/dist/x-markdown.cjs28.js.map +1 -1
  25. package/dist/x-markdown.cjs30.js +2 -0
  26. package/dist/x-markdown.cjs30.js.map +1 -0
  27. package/dist/x-markdown.cjs31.js +1 -1
  28. package/dist/x-markdown.cjs31.js.map +1 -1
  29. package/dist/{x-markdown.cjs34.js → x-markdown.cjs33.js} +2 -2
  30. package/dist/x-markdown.cjs33.js.map +1 -0
  31. package/dist/x-markdown.cjs7.js +1 -1
  32. package/dist/x-markdown.cjs7.js.map +1 -1
  33. package/dist/x-markdown.es10.js +1 -1
  34. package/dist/x-markdown.es13.js +3 -3
  35. package/dist/x-markdown.es14.js +28 -69
  36. package/dist/x-markdown.es14.js.map +1 -1
  37. package/dist/x-markdown.es15.js +2 -31
  38. package/dist/x-markdown.es15.js.map +1 -1
  39. package/dist/x-markdown.es16.js +2 -1
  40. package/dist/x-markdown.es16.js.map +1 -1
  41. package/dist/x-markdown.es17.js +4 -2
  42. package/dist/x-markdown.es17.js.map +1 -1
  43. package/dist/x-markdown.es18.js +4 -4
  44. package/dist/x-markdown.es19.js +204 -5
  45. package/dist/x-markdown.es19.js.map +1 -1
  46. package/dist/x-markdown.es21.js +11 -0
  47. package/dist/x-markdown.es21.js.map +1 -0
  48. package/dist/x-markdown.es22.js +71 -7
  49. package/dist/x-markdown.es22.js.map +1 -1
  50. package/dist/{x-markdown.es25.js → x-markdown.es24.js} +4 -4
  51. package/dist/{x-markdown.es25.js.map → x-markdown.es24.js.map} +1 -1
  52. package/dist/x-markdown.es26.js +160 -0
  53. package/dist/x-markdown.es26.js.map +1 -0
  54. package/dist/x-markdown.es27.js +5 -157
  55. package/dist/x-markdown.es27.js.map +1 -1
  56. package/dist/x-markdown.es28.js +139 -5
  57. package/dist/x-markdown.es28.js.map +1 -1
  58. package/dist/x-markdown.es30.js +78 -0
  59. package/dist/x-markdown.es30.js.map +1 -0
  60. package/dist/x-markdown.es31.js +121 -74
  61. package/dist/x-markdown.es31.js.map +1 -1
  62. package/dist/x-markdown.es33.js +6 -0
  63. package/dist/x-markdown.es33.js.map +1 -0
  64. package/dist/x-markdown.es7.js +25 -14
  65. package/dist/x-markdown.es7.js.map +1 -1
  66. package/package.json +87 -85
  67. package/dist/x-markdown.cjs20.js +0 -2
  68. package/dist/x-markdown.cjs20.js.map +0 -1
  69. package/dist/x-markdown.cjs23.js +0 -2
  70. package/dist/x-markdown.cjs23.js.map +0 -1
  71. package/dist/x-markdown.cjs29.js +0 -2
  72. package/dist/x-markdown.cjs29.js.map +0 -1
  73. package/dist/x-markdown.cjs32.js +0 -2
  74. package/dist/x-markdown.cjs32.js.map +0 -1
  75. package/dist/x-markdown.cjs34.js.map +0 -1
  76. package/dist/x-markdown.es20.js +0 -207
  77. package/dist/x-markdown.es20.js.map +0 -1
  78. package/dist/x-markdown.es23.js +0 -75
  79. package/dist/x-markdown.es23.js.map +0 -1
  80. package/dist/x-markdown.es29.js +0 -142
  81. package/dist/x-markdown.es29.js.map +0 -1
  82. package/dist/x-markdown.es32.js +0 -125
  83. package/dist/x-markdown.es32.js.map +0 -1
  84. package/dist/x-markdown.es34.js +0 -6
  85. package/dist/x-markdown.es34.js.map +0 -1
@@ -1,75 +1,34 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- class ShikiStreamTokenizer {
5
- constructor(options) {
6
- __publicField(this, "options");
7
- __publicField(this, "tokensStable", []);
8
- __publicField(this, "tokensUnstable", []);
9
- __publicField(this, "lastUnstableCodeChunk", "");
10
- __publicField(this, "lastStableGrammarState");
11
- this.options = options;
12
- }
13
- /**
14
- * Enqueue a chunk of code to the buffer.
15
- */
16
- async enqueue(chunk) {
17
- const chunkLines = (this.lastUnstableCodeChunk + chunk).split("\n");
18
- const stable = [];
19
- let unstable = [];
20
- const recall = this.tokensUnstable.length;
21
- chunkLines.forEach((line, i) => {
22
- const isLastLine = i === chunkLines.length - 1;
23
- const result = this.options.highlighter.codeToTokens(line, {
24
- ...this.options,
25
- grammarState: this.lastStableGrammarState
26
- });
27
- const tokens = result.tokens[0];
28
- if (!isLastLine)
29
- tokens.push({ content: "\n", offset: 0 });
30
- if (!isLastLine) {
31
- this.lastStableGrammarState = result.grammarState;
32
- stable.push(...tokens);
33
- } else {
34
- unstable = tokens;
35
- this.lastUnstableCodeChunk = line;
1
+ import { visit } from "unist-util-visit";
2
+ function rehypeAnimatedPlugin() {
3
+ return (tree) => {
4
+ visit(tree, "element", (node) => {
5
+ if (["p", "h1", "h2", "h3", "h4", "h5", "h6", "li", "strong", "th", "td"].includes(node.tagName) && node.children) {
6
+ const newChildren = [];
7
+ for (const child of node.children) {
8
+ if (child.type === "text") {
9
+ const segmenter = new Intl.Segmenter("zh", { granularity: "word" });
10
+ const segments = segmenter.segment(child.value);
11
+ const words = [...segments].map((segment) => segment.segment).filter(Boolean);
12
+ words.forEach((word) => {
13
+ newChildren.push({
14
+ children: [{ type: "text", value: word }],
15
+ properties: {
16
+ className: "x-md-animated-word"
17
+ },
18
+ tagName: "span",
19
+ type: "element"
20
+ });
21
+ });
22
+ } else {
23
+ newChildren.push(child);
24
+ }
25
+ }
26
+ node.children = newChildren;
36
27
  }
37
28
  });
38
- this.tokensStable.push(...stable);
39
- this.tokensUnstable = unstable;
40
- return {
41
- recall,
42
- stable,
43
- unstable
44
- };
45
- }
46
- close() {
47
- const stable = this.tokensUnstable;
48
- this.tokensUnstable = [];
49
- this.lastUnstableCodeChunk = "";
50
- this.lastStableGrammarState = void 0;
51
- return {
52
- stable
53
- };
54
- }
55
- clear() {
56
- this.tokensStable = [];
57
- this.tokensUnstable = [];
58
- this.lastUnstableCodeChunk = "";
59
- this.lastStableGrammarState = void 0;
60
- }
61
- clone() {
62
- const clone = new ShikiStreamTokenizer(
63
- this.options
64
- );
65
- clone.lastUnstableCodeChunk = this.lastUnstableCodeChunk;
66
- clone.tokensUnstable = this.tokensUnstable;
67
- clone.tokensStable = this.tokensStable;
68
- clone.lastStableGrammarState = this.lastStableGrammarState;
69
- return clone;
70
- }
29
+ };
71
30
  }
72
31
  export {
73
- ShikiStreamTokenizer
32
+ rehypeAnimatedPlugin
74
33
  };
75
34
  //# sourceMappingURL=x-markdown.es14.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es14.js","sources":["../../../../node_modules/.pnpm/shiki-stream@0.1.4_vue@3.5.26_typescript@5.9.3_/node_modules/shiki-stream/dist/index.mjs"],"sourcesContent":["class ShikiStreamTokenizer {\n options;\n tokensStable = [];\n tokensUnstable = [];\n lastUnstableCodeChunk = \"\";\n lastStableGrammarState;\n constructor(options) {\n this.options = options;\n }\n /**\n * Enqueue a chunk of code to the buffer.\n */\n async enqueue(chunk) {\n const chunkLines = (this.lastUnstableCodeChunk + chunk).split(\"\\n\");\n const stable = [];\n let unstable = [];\n const recall = this.tokensUnstable.length;\n chunkLines.forEach((line, i) => {\n const isLastLine = i === chunkLines.length - 1;\n const result = this.options.highlighter.codeToTokens(line, {\n ...this.options,\n grammarState: this.lastStableGrammarState\n });\n const tokens = result.tokens[0];\n if (!isLastLine)\n tokens.push({ content: \"\\n\", offset: 0 });\n if (!isLastLine) {\n this.lastStableGrammarState = result.grammarState;\n stable.push(...tokens);\n } else {\n unstable = tokens;\n this.lastUnstableCodeChunk = line;\n }\n });\n this.tokensStable.push(...stable);\n this.tokensUnstable = unstable;\n return {\n recall,\n stable,\n unstable\n };\n }\n close() {\n const stable = this.tokensUnstable;\n this.tokensUnstable = [];\n this.lastUnstableCodeChunk = \"\";\n this.lastStableGrammarState = void 0;\n return {\n stable\n };\n }\n clear() {\n this.tokensStable = [];\n this.tokensUnstable = [];\n this.lastUnstableCodeChunk = \"\";\n this.lastStableGrammarState = void 0;\n }\n clone() {\n const clone = new ShikiStreamTokenizer(\n this.options\n );\n clone.lastUnstableCodeChunk = this.lastUnstableCodeChunk;\n clone.tokensUnstable = this.tokensUnstable;\n clone.tokensStable = this.tokensStable;\n clone.lastStableGrammarState = this.lastStableGrammarState;\n return clone;\n }\n}\n\nclass CodeToTokenTransformStream extends TransformStream {\n tokenizer;\n options;\n constructor(options) {\n const tokenizer = new ShikiStreamTokenizer(options);\n const {\n allowRecalls = false\n } = options;\n super({\n async transform(chunk, controller) {\n const { stable, unstable: buffer, recall } = await tokenizer.enqueue(chunk);\n if (allowRecalls && recall > 0) {\n controller.enqueue({ recall });\n }\n for (const token of stable) {\n controller.enqueue(token);\n }\n if (allowRecalls) {\n for (const token of buffer) {\n controller.enqueue(token);\n }\n }\n },\n async flush(controller) {\n const { stable } = tokenizer.close();\n if (!allowRecalls) {\n for (const token of stable) {\n controller.enqueue(token);\n }\n }\n }\n });\n this.tokenizer = tokenizer;\n this.options = options;\n }\n}\n\nexport { CodeToTokenTransformStream, ShikiStreamTokenizer };\n"],"names":[],"mappings":";;;AAAA,MAAM,qBAAqB;AAAA,EAMzB,YAAY,SAAS;AALrB;AACA,wCAAe,CAAA;AACf,0CAAiB,CAAA;AACjB,iDAAwB;AACxB;AAEE,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,QAAQ,OAAO;AACnB,UAAM,cAAc,KAAK,wBAAwB,OAAO,MAAM,IAAI;AAClE,UAAM,SAAS,CAAA;AACf,QAAI,WAAW,CAAA;AACf,UAAM,SAAS,KAAK,eAAe;AACnC,eAAW,QAAQ,CAAC,MAAM,MAAM;AAC9B,YAAM,aAAa,MAAM,WAAW,SAAS;AAC7C,YAAM,SAAS,KAAK,QAAQ,YAAY,aAAa,MAAM;AAAA,QACzD,GAAG,KAAK;AAAA,QACR,cAAc,KAAK;AAAA,MAC3B,CAAO;AACD,YAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,UAAI,CAAC;AACH,eAAO,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG;AAC1C,UAAI,CAAC,YAAY;AACf,aAAK,yBAAyB,OAAO;AACrC,eAAO,KAAK,GAAG,MAAM;AAAA,MACvB,OAAO;AACL,mBAAW;AACX,aAAK,wBAAwB;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,SAAK,aAAa,KAAK,GAAG,MAAM;AAChC,SAAK,iBAAiB;AACtB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EACA,QAAQ;AACN,UAAM,SAAS,KAAK;AACpB,SAAK,iBAAiB,CAAA;AACtB,SAAK,wBAAwB;AAC7B,SAAK,yBAAyB;AAC9B,WAAO;AAAA,MACL;AAAA,IACN;AAAA,EACE;AAAA,EACA,QAAQ;AACN,SAAK,eAAe,CAAA;AACpB,SAAK,iBAAiB,CAAA;AACtB,SAAK,wBAAwB;AAC7B,SAAK,yBAAyB;AAAA,EAChC;AAAA,EACA,QAAQ;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,KAAK;AAAA,IACX;AACI,UAAM,wBAAwB,KAAK;AACnC,UAAM,iBAAiB,KAAK;AAC5B,UAAM,eAAe,KAAK;AAC1B,UAAM,yBAAyB,KAAK;AACpC,WAAO;AAAA,EACT;AACF;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"x-markdown.es14.js","sources":["../src/plugins/rehypePlugin.ts"],"sourcesContent":["// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\r\n// SPDX-License-Identifier: MIT\r\nimport type { Element, ElementContent, Root } from 'hast'\r\nimport type { BuildVisitor } from 'unist-util-visit'\r\nimport { visit } from 'unist-util-visit'\r\n\r\nexport function rehypeAnimatedPlugin() {\r\n return (tree: Root) => {\r\n visit(tree, 'element', ((node: Element) => {\r\n if (\r\n ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'strong', 'th', 'td'].includes(node.tagName) &&\r\n node.children\r\n ) {\r\n const newChildren: Array<ElementContent> = []\r\n for (const child of node.children) {\r\n if (child.type === 'text') {\r\n // @ts-expect-error Segmenter is not available in all environments\r\n const segmenter = new Intl.Segmenter('zh', { granularity: 'word' })\r\n const segments = segmenter.segment(child.value)\r\n const words = [...segments].map((segment) => segment.segment).filter(Boolean)\r\n words.forEach((word: string) => {\r\n newChildren.push({\r\n children: [{ type: 'text', value: word }],\r\n properties: {\r\n className: 'x-md-animated-word',\r\n },\r\n tagName: 'span',\r\n type: 'element',\r\n })\r\n })\r\n } else {\r\n newChildren.push(child)\r\n }\r\n }\r\n node.children = newChildren\r\n }\r\n }) as BuildVisitor<Root, 'element'>)\r\n }\r\n}\r\n"],"names":[],"mappings":";AAMO,SAAS,uBAAuB;AACrC,SAAO,CAAC,SAAe;AACrB,UAAM,MAAM,WAAY,CAAC,SAAkB;AACzC,UACE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM,IAAI,EAAE,SAAS,KAAK,OAAO,KAC3F,KAAK,UACL;AACA,cAAM,cAAqC,CAAA;AAC3C,mBAAW,SAAS,KAAK,UAAU;AACjC,cAAI,MAAM,SAAS,QAAQ;AAEzB,kBAAM,YAAY,IAAI,KAAK,UAAU,MAAM,EAAE,aAAa,QAAQ;AAClE,kBAAM,WAAW,UAAU,QAAQ,MAAM,KAAK;AAC9C,kBAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,YAAY,QAAQ,OAAO,EAAE,OAAO,OAAO;AAC5E,kBAAM,QAAQ,CAAC,SAAiB;AAC9B,0BAAY,KAAK;AAAA,gBACf,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM;AAAA,gBACxC,YAAY;AAAA,kBACV,WAAW;AAAA,gBAAA;AAAA,gBAEb,SAAS;AAAA,gBACT,MAAM;AAAA,cAAA,CACP;AAAA,YACH,CAAC;AAAA,UACH,OAAO;AACL,wBAAY,KAAK,KAAK;AAAA,UACxB;AAAA,QACF;AACA,aAAK,WAAW;AAAA,MAClB;AAAA,IACF,CAAmC;AAAA,EACrC;AACF;"}
@@ -1,34 +1,5 @@
1
- import { visit } from "unist-util-visit";
2
- function rehypeAnimatedPlugin() {
3
- return (tree) => {
4
- visit(tree, "element", (node) => {
5
- if (["p", "h1", "h2", "h3", "h4", "h5", "h6", "li", "strong", "th", "td"].includes(node.tagName) && node.children) {
6
- const newChildren = [];
7
- for (const child of node.children) {
8
- if (child.type === "text") {
9
- const segmenter = new Intl.Segmenter("zh", { granularity: "word" });
10
- const segments = segmenter.segment(child.value);
11
- const words = [...segments].map((segment) => segment.segment).filter(Boolean);
12
- words.forEach((word) => {
13
- newChildren.push({
14
- children: [{ type: "text", value: word }],
15
- properties: {
16
- className: "x-md-animated-word"
17
- },
18
- tagName: "span",
19
- type: "element"
20
- });
21
- });
22
- } else {
23
- newChildren.push(child);
24
- }
25
- }
26
- node.children = newChildren;
27
- }
28
- });
29
- };
30
- }
1
+ import _sfc_main from "./x-markdown.es13.js";
31
2
  export {
32
- rehypeAnimatedPlugin
3
+ _sfc_main as default
33
4
  };
34
5
  //# sourceMappingURL=x-markdown.es15.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es15.js","sources":["../src/plugins/rehypePlugin.ts"],"sourcesContent":["// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\r\n// SPDX-License-Identifier: MIT\r\nimport type { Element, ElementContent, Root } from 'hast'\r\nimport type { BuildVisitor } from 'unist-util-visit'\r\nimport { visit } from 'unist-util-visit'\r\n\r\nexport function rehypeAnimatedPlugin() {\r\n return (tree: Root) => {\r\n visit(tree, 'element', ((node: Element) => {\r\n if (\r\n ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'strong', 'th', 'td'].includes(node.tagName) &&\r\n node.children\r\n ) {\r\n const newChildren: Array<ElementContent> = []\r\n for (const child of node.children) {\r\n if (child.type === 'text') {\r\n // @ts-expect-error Segmenter is not available in all environments\r\n const segmenter = new Intl.Segmenter('zh', { granularity: 'word' })\r\n const segments = segmenter.segment(child.value)\r\n const words = [...segments].map((segment) => segment.segment).filter(Boolean)\r\n words.forEach((word: string) => {\r\n newChildren.push({\r\n children: [{ type: 'text', value: word }],\r\n properties: {\r\n className: 'x-md-animated-word',\r\n },\r\n tagName: 'span',\r\n type: 'element',\r\n })\r\n })\r\n } else {\r\n newChildren.push(child)\r\n }\r\n }\r\n node.children = newChildren\r\n }\r\n }) as BuildVisitor<Root, 'element'>)\r\n }\r\n}\r\n"],"names":[],"mappings":";AAMO,SAAS,uBAAuB;AACrC,SAAO,CAAC,SAAe;AACrB,UAAM,MAAM,WAAY,CAAC,SAAkB;AACzC,UACE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM,IAAI,EAAE,SAAS,KAAK,OAAO,KAC3F,KAAK,UACL;AACA,cAAM,cAAqC,CAAA;AAC3C,mBAAW,SAAS,KAAK,UAAU;AACjC,cAAI,MAAM,SAAS,QAAQ;AAEzB,kBAAM,YAAY,IAAI,KAAK,UAAU,MAAM,EAAE,aAAa,QAAQ;AAClE,kBAAM,WAAW,UAAU,QAAQ,MAAM,KAAK;AAC9C,kBAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,YAAY,QAAQ,OAAO,EAAE,OAAO,OAAO;AAC5E,kBAAM,QAAQ,CAAC,SAAiB;AAC9B,0BAAY,KAAK;AAAA,gBACf,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM;AAAA,gBACxC,YAAY;AAAA,kBACV,WAAW;AAAA,gBAAA;AAAA,gBAEb,SAAS;AAAA,gBACT,MAAM;AAAA,cAAA,CACP;AAAA,YACH,CAAC;AAAA,UACH,OAAO;AACL,wBAAY,KAAK,KAAK;AAAA,UACxB;AAAA,QACF;AACA,aAAK,WAAW;AAAA,MAClB;AAAA,IACF,CAAmC;AAAA,EACrC;AACF;"}
1
+ {"version":3,"file":"x-markdown.es15.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,4 +1,5 @@
1
- import _sfc_main from "./x-markdown.es13.js";
1
+ import _sfc_main from "./x-markdown.es24.js";
2
+ /* empty css */
2
3
  export {
3
4
  _sfc_main as default
4
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es16.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"x-markdown.es16.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,6 +1,8 @@
1
- import _sfc_main from "./x-markdown.es25.js";
1
+ import _sfc_main from "./x-markdown.es19.js";
2
2
  /* empty css */
3
+ import _export_sfc from "./x-markdown.es21.js";
4
+ const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8b0fb0b9"]]);
3
5
  export {
4
- _sfc_main as default
6
+ CodeBlock as default
5
7
  };
6
8
  //# sourceMappingURL=x-markdown.es17.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es17.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"x-markdown.es17.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,8 +1,8 @@
1
- import _sfc_main from "./x-markdown.es20.js";
1
+ import _sfc_main from "./x-markdown.es22.js";
2
2
  /* empty css */
3
- import _export_sfc from "./x-markdown.es22.js";
4
- const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8b0fb0b9"]]);
3
+ import _export_sfc from "./x-markdown.es21.js";
4
+ const CodeLine = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-97166d5b"]]);
5
5
  export {
6
- CodeBlock as default
6
+ CodeLine as default
7
7
  };
8
8
  //# sourceMappingURL=x-markdown.es18.js.map
@@ -1,8 +1,207 @@
1
- import _sfc_main from "./x-markdown.es23.js";
2
- /* empty css */
3
- import _export_sfc from "./x-markdown.es22.js";
4
- const CodeLine = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-97166d5b"]]);
1
+ import { defineComponent, ref, computed, createElementBlock, openBlock, normalizeClass, createCommentVNode, createElementVNode, renderSlot, unref, toDisplayString, Fragment, renderList, normalizeStyle, createBlock, resolveDynamicComponent, createVNode, h } from "vue";
2
+ import { useClipboard } from "./x-markdown.es26.js";
3
+ import SyntaxCodeBlock from "./x-markdown.es27.js";
4
+ const _hoisted_1 = { class: "x-md-code-header" };
5
+ const _hoisted_2 = { class: "x-md-code-header__left" };
6
+ const _hoisted_3 = ["title"];
7
+ const _hoisted_4 = { class: "x-md-code-lang" };
8
+ const _hoisted_5 = { class: "x-md-code-header__right" };
9
+ const _hoisted_6 = ["title", "disabled", "onClick"];
10
+ const _hoisted_7 = {
11
+ key: 0,
12
+ class: "x-md-copy-icon",
13
+ width: "16",
14
+ height: "16",
15
+ xmlns: "http://www.w3.org/2000/svg",
16
+ viewBox: "0 0 1024 1024"
17
+ };
18
+ const _hoisted_8 = {
19
+ key: 1,
20
+ class: "x-md-copy-icon",
21
+ width: "16",
22
+ height: "16",
23
+ xmlns: "http://www.w3.org/2000/svg",
24
+ viewBox: "0 0 1024 1024"
25
+ };
26
+ const _sfc_main = /* @__PURE__ */ defineComponent({
27
+ ...{
28
+ name: "CodeBlock"
29
+ },
30
+ __name: "index",
31
+ props: {
32
+ code: {},
33
+ language: {},
34
+ lightTheme: { default: "vitesse-light" },
35
+ darkTheme: { default: "vitesse-dark" },
36
+ isDark: { type: Boolean, default: false },
37
+ colorReplacements: {},
38
+ codeMaxHeight: {},
39
+ showCodeBlockHeader: { type: Boolean, default: true },
40
+ enableAnimate: { type: Boolean, default: false },
41
+ codeBlockActions: { default: void 0 },
42
+ stickyCodeBlockHeader: { type: Boolean, default: true }
43
+ },
44
+ setup(__props, { expose: __expose }) {
45
+ const { copy, copied } = useClipboard({ copiedDuring: 2e3 });
46
+ const collapsed = ref(false);
47
+ const syntaxCodeBlockRef = ref(null);
48
+ const toggleCollapse = () => {
49
+ collapsed.value = !collapsed.value;
50
+ };
51
+ const props = __props;
52
+ const code = computed(() => props.code.trim());
53
+ const language = computed(() => props.language || "text");
54
+ const normalizedActions = computed(() => {
55
+ return props.codeBlockActions || [];
56
+ });
57
+ const filteredActions = computed(() => {
58
+ return normalizedActions.value.filter((action) => {
59
+ if (!action.show) return true;
60
+ return action.show(slotProps.value);
61
+ });
62
+ });
63
+ const slotProps = computed(() => ({
64
+ language: language.value,
65
+ code: code.value,
66
+ copy,
67
+ copied: copied.value,
68
+ collapsed: collapsed.value,
69
+ toggleCollapse
70
+ }));
71
+ function renderActionIcon(action) {
72
+ if (!action.icon) return null;
73
+ if (typeof action.icon === "string") {
74
+ return h("span", {
75
+ class: "x-md-action-icon",
76
+ innerHTML: action.icon
77
+ });
78
+ }
79
+ if (typeof action.icon === "function") {
80
+ try {
81
+ const result = action.icon(slotProps.value);
82
+ if (result && typeof result === "object" && "__v_isVNode" in result) {
83
+ return result;
84
+ }
85
+ } catch {
86
+ }
87
+ return h(action.icon);
88
+ }
89
+ return h(action.icon);
90
+ }
91
+ function handleActionClick(action) {
92
+ if (action.disabled) return;
93
+ action.onClick?.(slotProps.value);
94
+ }
95
+ __expose({
96
+ copy,
97
+ copied,
98
+ collapsed,
99
+ toggleCollapse,
100
+ syntaxCodeBlockRef
101
+ });
102
+ return (_ctx, _cache) => {
103
+ return openBlock(), createElementBlock("div", {
104
+ class: normalizeClass(["x-md-code-block", { "x-md-code-block--dark": props.isDark }])
105
+ }, [
106
+ __props.showCodeBlockHeader ? (openBlock(), createElementBlock("div", {
107
+ key: 0,
108
+ class: normalizeClass(["x-md-code-header-wrapper", [{ "x-md-code-header-wrapper--sticky": props.stickyCodeBlockHeader }, { "x-md-code-header-wrapper--collapsed": collapsed.value }]])
109
+ }, [
110
+ createElementVNode("div", _hoisted_1, [
111
+ renderSlot(_ctx.$slots, "codeHeader", {
112
+ language: language.value,
113
+ code: code.value,
114
+ copy: unref(copy),
115
+ copied: unref(copied),
116
+ collapsed: collapsed.value,
117
+ toggleCollapse
118
+ }, () => [
119
+ createElementVNode("div", _hoisted_2, [
120
+ createElementVNode("button", {
121
+ class: normalizeClass(["x-md-collapse-btn", { "x-md-collapse-btn--collapsed": collapsed.value }]),
122
+ onClick: toggleCollapse,
123
+ title: collapsed.value ? "展开代码" : "折叠代码"
124
+ }, [..._cache[1] || (_cache[1] = [
125
+ createElementVNode("svg", {
126
+ class: "x-md-collapse-icon",
127
+ viewBox: "0 0 24 24",
128
+ width: "14",
129
+ height: "14",
130
+ fill: "none",
131
+ stroke: "currentColor",
132
+ "stroke-width": "2",
133
+ "stroke-linecap": "round",
134
+ "stroke-linejoin": "round"
135
+ }, [
136
+ createElementVNode("polyline", { points: "6 9 12 15 18 9" })
137
+ ], -1)
138
+ ])], 10, _hoisted_3),
139
+ createElementVNode("span", _hoisted_4, toDisplayString(language.value), 1)
140
+ ]),
141
+ createElementVNode("div", _hoisted_5, [
142
+ renderSlot(_ctx.$slots, "codeActions", {
143
+ code: code.value,
144
+ copy: unref(copy),
145
+ copied: unref(copied)
146
+ }, () => [
147
+ (openBlock(true), createElementBlock(Fragment, null, renderList(filteredActions.value, (action) => {
148
+ return openBlock(), createElementBlock("button", {
149
+ key: action.key,
150
+ class: normalizeClass(["x-md-action-btn", [action.class, { "x-md-action-btn--disabled": action.disabled }]]),
151
+ style: normalizeStyle(action.style),
152
+ title: action.title,
153
+ disabled: action.disabled,
154
+ onClick: ($event) => handleActionClick(action)
155
+ }, [
156
+ action.icon ? (openBlock(), createBlock(resolveDynamicComponent(renderActionIcon(action)), { key: 0 })) : createCommentVNode("", true)
157
+ ], 14, _hoisted_6);
158
+ }), 128)),
159
+ createElementVNode("button", {
160
+ class: normalizeClass(["x-md-copy-btn", { "x-md-copy-btn--copied": unref(copied) }]),
161
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(copy)(code.value))
162
+ }, [
163
+ unref(copied) ? (openBlock(), createElementBlock("svg", _hoisted_7, [..._cache[2] || (_cache[2] = [
164
+ createElementVNode("path", {
165
+ fill: "currentColor",
166
+ d: "M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z"
167
+ }, null, -1)
168
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_8, [..._cache[3] || (_cache[3] = [
169
+ createElementVNode("path", {
170
+ fill: "currentColor",
171
+ d: "M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z"
172
+ }, null, -1),
173
+ createElementVNode("path", {
174
+ fill: "currentColor",
175
+ d: "M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64"
176
+ }, null, -1)
177
+ ])]))
178
+ ], 2)
179
+ ], true)
180
+ ])
181
+ ], true)
182
+ ])
183
+ ], 2)) : createCommentVNode("", true),
184
+ createElementVNode("div", {
185
+ class: normalizeClass(["x-md-code-body", { "x-md-code-body--collapsed": collapsed.value }])
186
+ }, [
187
+ createVNode(SyntaxCodeBlock, {
188
+ ref_key: "syntaxCodeBlockRef",
189
+ ref: syntaxCodeBlockRef,
190
+ code: code.value,
191
+ language: language.value,
192
+ "light-theme": props.lightTheme,
193
+ "dark-theme": props.darkTheme,
194
+ "is-dark": props.isDark,
195
+ "color-replacements": props.colorReplacements,
196
+ "code-max-height": props.codeMaxHeight,
197
+ "enable-animate": props.enableAnimate
198
+ }, null, 8, ["code", "language", "light-theme", "dark-theme", "is-dark", "color-replacements", "code-max-height", "enable-animate"])
199
+ ], 2)
200
+ ], 2);
201
+ };
202
+ }
203
+ });
5
204
  export {
6
- CodeLine as default
205
+ _sfc_main as default
7
206
  };
8
207
  //# sourceMappingURL=x-markdown.es19.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es19.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"x-markdown.es19.js","sources":["../src/components/CodeBlock/index.vue"],"sourcesContent":["<template>\r\n <div class=\"x-md-code-block\" :class=\"{ 'x-md-code-block--dark': props.isDark }\">\r\n <!-- 头部区域:支持完全自定义或默认渲染 -->\r\n <div\r\n v-if=\"showCodeBlockHeader\"\r\n class=\"x-md-code-header-wrapper\"\r\n :class=\"[{'x-md-code-header-wrapper--sticky': props.stickyCodeBlockHeader }, { 'x-md-code-header-wrapper--collapsed': collapsed }]\"\r\n >\r\n <div class=\"x-md-code-header\">\r\n <slot\r\n name=\"codeHeader\"\r\n :language=\"language\"\r\n :code=\"code\"\r\n :copy=\"copy\"\r\n :copied=\"copied\"\r\n :collapsed=\"collapsed\"\r\n :toggleCollapse=\"toggleCollapse\"\r\n >\r\n <div class=\"x-md-code-header__left\">\r\n <button\r\n class=\"x-md-collapse-btn\"\r\n :class=\"{ 'x-md-collapse-btn--collapsed': collapsed }\"\r\n @click=\"toggleCollapse\"\r\n :title=\"collapsed ? '展开代码' : '折叠代码'\"\r\n >\r\n <svg\r\n class=\"x-md-collapse-icon\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"x-md-code-lang\">{{ language }}</span>\r\n </div>\r\n <div class=\"x-md-code-header__right\">\r\n <slot name=\"codeActions\" :code=\"code\" :copy=\"copy\" :copied=\"copied\">\r\n <button\r\n v-for=\"action in filteredActions\"\r\n :key=\"action.key\"\r\n class=\"x-md-action-btn\"\r\n :class=\"[action.class, { 'x-md-action-btn--disabled': action.disabled }]\"\r\n :style=\"action.style\"\r\n :title=\"action.title\"\r\n :disabled=\"action.disabled\"\r\n @click=\"handleActionClick(action)\"\r\n >\r\n <component :is=\"renderActionIcon(action)\" v-if=\"action.icon\" />\r\n </button>\r\n <button class=\"x-md-copy-btn\" :class=\"{ 'x-md-copy-btn--copied': copied }\" @click=\"copy(code)\">\r\n <svg\r\n v-if=\"copied\"\r\n class=\"x-md-copy-icon\"\r\n width=\"16\"\r\n height=\"16\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1024 1024\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z\"\r\n />\r\n </svg>\r\n <svg\r\n v-else\r\n class=\"x-md-copy-icon\"\r\n width=\"16\"\r\n height=\"16\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1024 1024\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64\"\r\n />\r\n </svg>\r\n </button>\r\n </slot>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n <div class=\"x-md-code-body\" :class=\"{ 'x-md-code-body--collapsed': collapsed }\">\r\n <SyntaxCodeBlock\r\n ref=\"syntaxCodeBlockRef\"\r\n :code=\"code\"\r\n :language=\"language\"\r\n :light-theme=\"props.lightTheme\"\r\n :dark-theme=\"props.darkTheme\"\r\n :is-dark=\"props.isDark\"\r\n :color-replacements=\"props.colorReplacements\"\r\n :code-max-height=\"props.codeMaxHeight\"\r\n :enable-animate=\"props.enableAnimate\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, h, type VNode } from 'vue'\r\nimport { useClipboard } from '@vueuse/core'\r\nimport type { CodeBlockProps, CodeBlockAction, CodeBlockSlotProps } from './types'\r\nimport SyntaxCodeBlock from './SyntaxCodeBlock.vue'\r\n\r\ndefineOptions({\r\n name: 'CodeBlock',\r\n})\r\n\r\nconst { copy, copied } = useClipboard({ copiedDuring: 2000 })\r\n\r\nconst collapsed = ref(false)\r\n\r\nconst syntaxCodeBlockRef = ref<InstanceType<typeof SyntaxCodeBlock> | null>(null)\r\n\r\nconst toggleCollapse = () => {\r\n collapsed.value = !collapsed.value\r\n}\r\n\r\nconst props = withDefaults(defineProps<CodeBlockProps>(), {\r\n lightTheme: 'vitesse-light',\r\n darkTheme: 'vitesse-dark',\r\n isDark: false,\r\n showCodeBlockHeader: true,\r\n enableAnimate: false,\r\n codeBlockActions: undefined,\r\n stickyCodeBlockHeader: true,\r\n})\r\n\r\nconst code = computed(() => props.code.trim())\r\n\r\nconst language = computed(() => props.language || 'text')\r\n\r\nconst normalizedActions = computed<CodeBlockAction[]>(() => {\r\n return props.codeBlockActions || []\r\n})\r\n\r\nconst filteredActions = computed<CodeBlockAction[]>(() => {\r\n return normalizedActions.value.filter((action) => {\r\n if (!action.show) return true\r\n return action.show(slotProps.value)\r\n })\r\n})\r\n\r\nconst slotProps = computed<CodeBlockSlotProps>(() => ({\r\n language: language.value,\r\n code: code.value,\r\n copy,\r\n copied: copied.value,\r\n collapsed: collapsed.value,\r\n toggleCollapse,\r\n}))\r\n\r\nfunction renderActionIcon(action: CodeBlockAction): VNode | null {\r\n if (!action.icon) return null\r\n\r\n if (typeof action.icon === 'string') {\r\n return h('span', {\r\n class: 'x-md-action-icon',\r\n innerHTML: action.icon,\r\n })\r\n }\r\n\r\n if (typeof action.icon === 'function') {\r\n try {\r\n const result = (action.icon as (props: CodeBlockSlotProps) => VNode)(slotProps.value)\r\n if (result && typeof result === 'object' && '__v_isVNode' in result) {\r\n return result\r\n }\r\n } catch {\r\n }\r\n return h(action.icon as any)\r\n }\r\n\r\n return h(action.icon as any)\r\n}\r\n\r\nfunction handleActionClick(action: CodeBlockAction) {\r\n if (action.disabled) return\r\n action.onClick?.(slotProps.value)\r\n}\r\n\r\ndefineExpose({\r\n copy,\r\n copied,\r\n collapsed,\r\n toggleCollapse,\r\n syntaxCodeBlockRef,\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.x-md-code-block {\r\n border-radius: 8px;\r\n overflow: hidden;\r\n font-size: 0;\r\n background: rgba(0, 0, 0, 0.03);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark {\r\n background: rgba(255, 255, 255, 0.13);\r\n}\r\n\r\n.x-md-code-header-wrapper--sticky {\r\n background: #fff;\r\n position: sticky;\r\n top: 0;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header-wrapper--sticky {\r\n background: #1a1a1a;\r\n}\r\n\r\n.x-md-code-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 16px;\r\n background: rgba(0, 0, 0, 0.05);\r\n color: #333;\r\n}\r\n\r\n.x-md-code-block .x-md-code-header-wrapper--sticky .x-md-code-header{\r\n background: rgba(235, 235, 235);\r\n border-radius: 8px 8px 0 0;\r\n}\r\n\r\n.x-md-code-block:has(.x-md-code-header-wrapper--sticky) {\r\n overflow: visible;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header {\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #fff;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header-wrapper--sticky .x-md-code-header {\r\n background: rgba(44, 44, 44);\r\n}\r\n\r\n.x-md-code-block .x-md-code-header-wrapper--collapsed .x-md-code-header {\r\n border-radius: 8px;\r\n}\r\n\r\n.x-md-code-header__left,\r\n.x-md-code-header__right {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.x-md-code-lang {\r\n font-size: 12px;\r\n font-weight: 500;\r\n opacity: 0.6;\r\n text-transform: lowercase;\r\n}\r\n\r\n.x-md-copy-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.7;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-copy-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-copy-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-copy-btn.x-md-copy-btn--copied {\r\n opacity: 1;\r\n color: #22c55e;\r\n}\r\n\r\n.x-md-copy-icon {\r\n flex-shrink: 0;\r\n}\r\n\r\n.x-md-action-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.7;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-action-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-action-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-action-btn.x-md-action-btn--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n}\r\n\r\n.x-md-action-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.x-md-action-icon :deep(svg) {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.x-md-collapse-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.5;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-collapse-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-collapse-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-collapse-icon {\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.x-md-collapse-btn--collapsed .x-md-collapse-icon {\r\n transform: rotate(-90deg);\r\n}\r\n\r\n.x-md-code-body {\r\n overflow: hidden;\r\n transition:\r\n max-height 0.3s ease,\r\n opacity 0.2s ease;\r\n}\r\n\r\n.x-md-code-body--collapsed {\r\n max-height: 0 !important;\r\n opacity: 0;\r\n}\r\n</style>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_unref","_toDisplayString","_Fragment","_renderList","_normalizeStyle","_createBlock","_resolveDynamicComponent","_openBlock","_createVNode"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ const _export_sfc = (sfc, props) => {
2
+ const target = sfc.__vccOpts || sfc;
3
+ for (const [key, val] of props) {
4
+ target[key] = val;
5
+ }
6
+ return target;
7
+ };
8
+ export {
9
+ _export_sfc as default
10
+ };
11
+ //# sourceMappingURL=x-markdown.es21.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x-markdown.es21.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -1,11 +1,75 @@
1
- const _export_sfc = (sfc, props) => {
2
- const target = sfc.__vccOpts || sfc;
3
- for (const [key, val] of props) {
4
- target[key] = val;
1
+ import { defineComponent, onMounted, computed, createElementBlock, openBlock, normalizeClass, createElementVNode, normalizeStyle, Fragment, createTextVNode, toDisplayString, renderList } from "vue";
2
+ import { useHighlight } from "./x-markdown.es7.js";
3
+ const SHIKI_CORE_PKG = "@shikijs/core";
4
+ const _sfc_main = /* @__PURE__ */ defineComponent({
5
+ __name: "index",
6
+ props: {
7
+ raw: { default: () => ({}) },
8
+ isDark: { type: Boolean, default: false },
9
+ shikiTheme: { default: () => ["vitesse-light", "vitesse-dark"] },
10
+ enableAnimate: { type: Boolean, default: false }
11
+ },
12
+ setup(__props) {
13
+ let getTokenStyleObjectFn = null;
14
+ onMounted(async () => {
15
+ const mod = await Function(`return import('${SHIKI_CORE_PKG}')`)().catch(() => {
16
+ return { getTokenStyleObject: () => ({}) };
17
+ });
18
+ getTokenStyleObjectFn = mod.getTokenStyleObject;
19
+ });
20
+ const props = __props;
21
+ const content = computed(() => props.raw?.content ?? "");
22
+ const language = computed(() => props.raw?.language || "ts");
23
+ const actualTheme = computed(() => props.isDark ? props.shikiTheme[1] : props.shikiTheme[0]);
24
+ const { lines, preStyle } = useHighlight(content, {
25
+ language,
26
+ theme: actualTheme
27
+ });
28
+ const flatTokens = computed(() => lines.value.flat());
29
+ const codeStyle = computed(() => preStyle.value || {});
30
+ const normalizeStyleKeys = (style) => {
31
+ const normalized = {};
32
+ Object.entries(style).forEach(([key, value]) => {
33
+ const camelKey = key.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
34
+ normalized[camelKey] = value;
35
+ });
36
+ return normalized;
37
+ };
38
+ const getTokenStyle = (token) => {
39
+ if (token.htmlStyle) {
40
+ return normalizeStyleKeys(token.htmlStyle);
41
+ }
42
+ if (!getTokenStyleObjectFn) {
43
+ return {};
44
+ }
45
+ const rawStyle = getTokenStyleObjectFn(token);
46
+ return normalizeStyleKeys(rawStyle);
47
+ };
48
+ return (_ctx, _cache) => {
49
+ return openBlock(), createElementBlock("div", {
50
+ class: normalizeClass(["x-md-inline-code", {
51
+ "x-md-inline-code--dark": props.isDark,
52
+ "x-md-animated-word": props.enableAnimate
53
+ }])
54
+ }, [
55
+ createElementVNode("code", {
56
+ style: normalizeStyle(codeStyle.value)
57
+ }, [
58
+ !flatTokens.value.length ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
59
+ createTextVNode(toDisplayString(content.value), 1)
60
+ ], 64)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(flatTokens.value, (token, i) => {
61
+ return openBlock(), createElementBlock("span", {
62
+ key: i,
63
+ style: normalizeStyle(getTokenStyle(token)),
64
+ class: normalizeClass({ "x-md-animated-word": props.enableAnimate })
65
+ }, toDisplayString(token.content), 7);
66
+ }), 128))
67
+ ], 4)
68
+ ], 2);
69
+ };
5
70
  }
6
- return target;
7
- };
71
+ });
8
72
  export {
9
- _export_sfc as default
73
+ _sfc_main as default
10
74
  };
11
75
  //# sourceMappingURL=x-markdown.es22.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-markdown.es22.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"x-markdown.es22.js","sources":["../src/components/CodeLine/index.vue"],"sourcesContent":["<template>\r\n <!-- 行内代码容器 - 支持深浅色主题和语法高亮 -->\r\n <div\r\n class=\"x-md-inline-code\"\r\n :class=\"{\r\n 'x-md-inline-code--dark': props.isDark,\r\n 'x-md-animated-word': props.enableAnimate,\r\n }\"\r\n >\r\n <code :style=\"codeStyle\">\r\n <!-- 无高亮时显示纯文本 -->\r\n <template v-if=\"!flatTokens.length\">{{ content }}</template>\r\n <!-- 有高亮时渲染 token -->\r\n <template v-else>\r\n <span\r\n v-for=\"(token, i) in flatTokens\"\r\n :key=\"i\"\r\n :style=\"getTokenStyle(token)\"\r\n :class=\"{ 'x-md-animated-word': props.enableAnimate }\"\r\n >{{ token.content }}</span\r\n >\r\n </template>\r\n </code>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, onMounted, type CSSProperties } from 'vue'\r\nimport { useHighlight } from '../../hooks/useHighlight'\r\nimport type { CodeLineProps } from './types'\r\n\r\nconst SHIKI_CORE_PKG = '@shikijs/core'\r\n\r\nlet getTokenStyleObjectFn: any = null\r\n\r\nonMounted(async () => {\r\n const mod = await (Function(`return import('${SHIKI_CORE_PKG}')`)())\r\n .catch(() => {\r\n return { getTokenStyleObject: () => ({}) }\r\n })\r\n getTokenStyleObjectFn = mod.getTokenStyleObject\r\n})\r\n\r\nconst props = withDefaults(defineProps<CodeLineProps>(), {\r\n raw: () => ({}),\r\n isDark: false,\r\n shikiTheme: () => ['vitesse-light', 'vitesse-dark'],\r\n enableAnimate: false,\r\n})\r\n\r\nconst content = computed(() => props.raw?.content ?? '')\r\nconst language = computed(() => props.raw?.language || 'ts')\r\nconst actualTheme = computed(() => (props.isDark ? props.shikiTheme[1] : props.shikiTheme[0]))\r\n\r\nconst { lines, preStyle } = useHighlight(content, {\r\n language,\r\n theme: actualTheme,\r\n})\r\n\r\nconst flatTokens = computed(() => lines.value.flat())\r\nconst codeStyle = computed<CSSProperties>(() => preStyle.value || {})\r\n\r\nconst normalizeStyleKeys = (style: Record<string, string | number>): CSSProperties => {\r\n const normalized: CSSProperties = {}\r\n Object.entries(style).forEach(([key, value]) => {\r\n const camelKey = key.replace(/-([a-z])/g, (_, char) => char.toUpperCase())\r\n ;(normalized as Record<string, string | number>)[camelKey] = value\r\n })\r\n return normalized\r\n}\r\n\r\nconst getTokenStyle = (token: ThemedToken): CSSProperties => {\r\n if (token.htmlStyle) {\r\n return normalizeStyleKeys(token.htmlStyle)\r\n }\r\n\r\n if (!getTokenStyleObjectFn) {\r\n return {}\r\n }\r\n\r\n const rawStyle = getTokenStyleObjectFn(token)\r\n return normalizeStyleKeys(rawStyle)\r\n}\r\n</script>\r\n<style scoped>\r\n.x-md-inline-code {\r\n display: inline-block;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n font-size: 14px;\r\n background: rgba(0, 0, 0, 0.03);\r\n vertical-align: sub;\r\n}\r\n\r\n.x-md-inline-code.x-md-inline-code--dark {\r\n background: rgba(255, 255, 255, 0.13);\r\n}\r\n.x-md-inline-code code {\r\n background: transparent !important;\r\n}\r\n</style>\r\n"],"names":["_createElementBlock","_createElementVNode","_Fragment","_openBlock","_renderList","_normalizeStyle","_normalizeClass","_toDisplayString"],"mappings":";;AA+BA,MAAM,iBAAiB;;;;;;;;;;AAEvB,QAAI,wBAA6B;AAEjC,cAAU,YAAY;AACpB,YAAM,MAAM,MAAO,SAAS,kBAAkB,cAAc,IAAI,IAC7D,MAAM,MAAM;AACX,eAAO,EAAE,qBAAqB,OAAO,CAAA,GAAC;AAAA,MACxC,CAAC;AACH,8BAAwB,IAAI;AAAA,IAC9B,CAAC;AAED,UAAM,QAAQ;AAOd,UAAM,UAAU,SAAS,MAAM,MAAM,KAAK,WAAW,EAAE;AACvD,UAAM,WAAW,SAAS,MAAM,MAAM,KAAK,YAAY,IAAI;AAC3D,UAAM,cAAc,SAAS,MAAO,MAAM,SAAS,MAAM,WAAW,CAAC,IAAI,MAAM,WAAW,CAAC,CAAE;AAE7F,UAAM,EAAE,OAAO,aAAa,aAAa,SAAS;AAAA,MAChD;AAAA,MACA,OAAO;AAAA,IAAA,CACR;AAED,UAAM,aAAa,SAAS,MAAM,MAAM,MAAM,MAAM;AACpD,UAAM,YAAY,SAAwB,MAAM,SAAS,SAAS,CAAA,CAAE;AAEpE,UAAM,qBAAqB,CAAC,UAA0D;AACpF,YAAM,aAA4B,CAAA;AAClC,aAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9C,cAAM,WAAW,IAAI,QAAQ,aAAa,CAAC,GAAG,SAAS,KAAK,aAAa;AACvE,mBAA+C,QAAQ,IAAI;AAAA,MAC/D,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,CAAC,UAAsC;AAC3D,UAAI,MAAM,WAAW;AACnB,eAAO,mBAAmB,MAAM,SAAS;AAAA,MAC3C;AAEA,UAAI,CAAC,uBAAuB;AAC1B,eAAO,CAAA;AAAA,MACT;AAEA,YAAM,WAAW,sBAAsB,KAAK;AAC5C,aAAO,mBAAmB,QAAQ;AAAA,IACpC;;0BAhFEA,mBAqBM,OAAA;AAAA,QApBJ,uBAAM,oBAAkB;AAAA,UACmB,0BAAA,MAAM;AAAA,UAAqC,sBAAA,MAAM;AAAA,QAAA;;QAK5FC,mBAaO,QAAA;AAAA,UAbA,sBAAO,UAAA,KAAS;AAAA,QAAA;UAEJ,CAAA,WAAA,MAAW,uBAA5BD,mBAA4DE,UAAA,EAAA,KAAA,KAAA;AAAA,4CAArB,QAAA,KAAO,GAAA,CAAA;AAAA,UAAA,WAG5CC,UAAA,IAAA,GAAAH,mBAKuCE,UAAA,EAAA,KAAA,KAAAE,WAJhB,WAAA,OAAU,CAAvB,OAAO,MAAC;gCADlBJ,mBAKuC,QAAA;AAAA,cAHpC,KAAK;AAAA,cACL,OAAKK,eAAE,cAAc,KAAK,CAAA;AAAA,cAC1B,OAAKC,eAAA,EAAA,sBAA0B,MAAM,eAAa;AAAA,YAAA,GAC/CC,gBAAA,MAAM,OAAO,GAAA,CAAA;AAAA;;;;;;"}
@@ -1,9 +1,9 @@
1
1
  import { defineComponent, ref, computed, onMounted, createBlock, createElementBlock, openBlock, normalizeClass, createVNode, withDirectives, Transition, withCtx, createElementVNode, renderSlot, normalizeProps, guardReactiveProps, Fragment, renderList, normalizeStyle, createCommentVNode, resolveDynamicComponent, unref, vShow, h } from "vue";
2
- import { useClipboard } from "./x-markdown.es27.js";
2
+ import { useClipboard } from "./x-markdown.es26.js";
3
3
  import { checkMermaidAvailable } from "./x-markdown.es9.js";
4
- import _sfc_main$1 from "./x-markdown.es29.js";
4
+ import _sfc_main$1 from "./x-markdown.es28.js";
5
5
  /* empty css */
6
- import CodeBlock from "./x-markdown.es18.js";
6
+ import CodeBlock from "./x-markdown.es17.js";
7
7
  const _hoisted_1 = { class: "toolbar-container" };
8
8
  const _hoisted_2 = { class: "mermaid-toolbar" };
9
9
  const _hoisted_3 = { class: "toolbar-left" };
@@ -400,4 +400,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
400
400
  export {
401
401
  _sfc_main as default
402
402
  };
403
- //# sourceMappingURL=x-markdown.es25.js.map
403
+ //# sourceMappingURL=x-markdown.es24.js.map