@hejiayue/x-markdown-test 0.0.1-beta.112 → 0.0.1-beta.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/style.css +1 -1
- package/dist/x-markdown.cjs.js +1 -1
- package/dist/x-markdown.cjs10.js +2 -0
- package/dist/x-markdown.cjs10.js.map +1 -0
- package/dist/x-markdown.cjs11.js +2 -0
- package/dist/x-markdown.cjs11.js.map +1 -0
- package/dist/x-markdown.cjs13.js +2 -0
- package/dist/x-markdown.cjs13.js.map +1 -0
- package/dist/x-markdown.cjs14.js +2 -0
- package/dist/x-markdown.cjs14.js.map +1 -0
- package/dist/x-markdown.cjs15.js +2 -0
- package/dist/x-markdown.cjs15.js.map +1 -0
- package/dist/x-markdown.cjs16.js +2 -0
- package/dist/x-markdown.cjs16.js.map +1 -0
- package/dist/x-markdown.cjs17.js +2 -0
- package/dist/x-markdown.cjs17.js.map +1 -0
- package/dist/x-markdown.cjs18.js +2 -0
- package/dist/x-markdown.cjs18.js.map +1 -0
- package/dist/x-markdown.cjs19.js +2 -0
- package/dist/x-markdown.cjs19.js.map +1 -0
- package/dist/x-markdown.cjs2.js +2 -0
- package/dist/x-markdown.cjs2.js.map +1 -0
- package/dist/x-markdown.cjs21.js +2 -0
- package/dist/x-markdown.cjs21.js.map +1 -0
- package/dist/x-markdown.cjs22.js +2 -0
- package/dist/x-markdown.cjs22.js.map +1 -0
- package/dist/x-markdown.cjs24.js +2 -0
- package/dist/x-markdown.cjs24.js.map +1 -0
- package/dist/x-markdown.cjs26.js +2 -0
- package/dist/x-markdown.cjs26.js.map +1 -0
- package/dist/x-markdown.cjs27.js +2 -0
- package/dist/x-markdown.cjs27.js.map +1 -0
- package/dist/x-markdown.cjs28.js +2 -0
- package/dist/x-markdown.cjs28.js.map +1 -0
- package/dist/x-markdown.cjs3.js +2 -0
- package/dist/x-markdown.cjs3.js.map +1 -0
- package/dist/x-markdown.cjs30.js +2 -0
- package/dist/x-markdown.cjs30.js.map +1 -0
- package/dist/x-markdown.cjs31.js +2 -0
- package/dist/x-markdown.cjs31.js.map +1 -0
- package/dist/x-markdown.cjs33.js +2 -0
- package/dist/x-markdown.cjs33.js.map +1 -0
- package/dist/x-markdown.cjs4.js +2 -0
- package/dist/x-markdown.cjs4.js.map +1 -0
- package/dist/x-markdown.cjs5.js +2 -0
- package/dist/x-markdown.cjs5.js.map +1 -0
- package/dist/x-markdown.cjs6.js +2 -0
- package/dist/x-markdown.cjs6.js.map +1 -0
- package/dist/x-markdown.cjs7.js +2 -0
- package/dist/x-markdown.cjs7.js.map +1 -0
- package/dist/x-markdown.cjs8.js +2 -0
- package/dist/x-markdown.cjs8.js.map +1 -0
- package/dist/x-markdown.cjs9.js +2 -0
- package/dist/x-markdown.cjs9.js.map +1 -0
- package/dist/x-markdown.es.js +26 -17
- package/dist/x-markdown.es.js.map +1 -1
- package/dist/x-markdown.es10.js +49 -0
- package/dist/x-markdown.es10.js.map +1 -0
- package/dist/x-markdown.es11.js +54 -0
- package/dist/x-markdown.es11.js.map +1 -0
- package/dist/x-markdown.es13.js +89 -0
- package/dist/x-markdown.es13.js.map +1 -0
- package/dist/x-markdown.es14.js +34 -0
- package/dist/x-markdown.es14.js.map +1 -0
- package/dist/x-markdown.es15.js +5 -0
- package/dist/x-markdown.es15.js.map +1 -0
- package/dist/x-markdown.es16.js +6 -0
- package/dist/x-markdown.es16.js.map +1 -0
- package/dist/x-markdown.es17.js +8 -0
- package/dist/x-markdown.es17.js.map +1 -0
- package/dist/x-markdown.es18.js +8 -0
- package/dist/x-markdown.es18.js.map +1 -0
- package/dist/x-markdown.es19.js +207 -0
- package/dist/x-markdown.es19.js.map +1 -0
- package/dist/x-markdown.es2.js +83 -0
- package/dist/x-markdown.es2.js.map +1 -0
- package/dist/x-markdown.es21.js +11 -0
- package/dist/x-markdown.es21.js.map +1 -0
- package/dist/x-markdown.es22.js +75 -0
- package/dist/x-markdown.es22.js.map +1 -0
- package/dist/{index-SElRorTo.js → x-markdown.es24.js} +7 -139
- package/dist/x-markdown.es24.js.map +1 -0
- package/dist/x-markdown.es26.js +160 -0
- package/dist/x-markdown.es26.js.map +1 -0
- package/dist/x-markdown.es27.js +8 -0
- package/dist/x-markdown.es27.js.map +1 -0
- package/dist/x-markdown.es28.js +142 -0
- package/dist/x-markdown.es28.js.map +1 -0
- package/dist/x-markdown.es3.js +94 -0
- package/dist/x-markdown.es3.js.map +1 -0
- package/dist/x-markdown.es30.js +78 -0
- package/dist/x-markdown.es30.js.map +1 -0
- package/dist/x-markdown.es31.js +125 -0
- package/dist/x-markdown.es31.js.map +1 -0
- package/dist/x-markdown.es33.js +6 -0
- package/dist/x-markdown.es33.js.map +1 -0
- package/dist/x-markdown.es4.js +150 -0
- package/dist/x-markdown.es4.js.map +1 -0
- package/dist/x-markdown.es5.js +40 -0
- package/dist/x-markdown.es5.js.map +1 -0
- package/dist/x-markdown.es6.js +24 -0
- package/dist/x-markdown.es6.js.map +1 -0
- package/dist/x-markdown.es7.js +279 -0
- package/dist/x-markdown.es7.js.map +1 -0
- package/dist/x-markdown.es8.js +27 -0
- package/dist/x-markdown.es8.js.map +1 -0
- package/dist/x-markdown.es9.js +409 -0
- package/dist/x-markdown.es9.js.map +1 -0
- package/package.json +84 -84
- package/LICENSE +0 -21
- package/dist/index-D9u8JldH.cjs +0 -2
- package/dist/index-D9u8JldH.cjs.map +0 -1
- package/dist/index-SElRorTo.js.map +0 -1
- package/dist/index-lQ_FQFr2.js +0 -1882
- package/dist/index-lQ_FQFr2.js.map +0 -1
- package/dist/index-nZ5iH1aN.cjs +0 -2
- package/dist/index-nZ5iH1aN.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-markdown.es2.js","sources":["../src/core/components.ts"],"sourcesContent":["import type { Root } from 'hast'\r\nimport type { Options as TRehypeOptions } from 'mdast-util-to-hast'\r\nimport type { PluggableList } from 'unified'\r\nimport type { PropType } from 'vue'\r\n\r\nimport type { CustomAttrs, SanitizeOptions, TVueMarkdown } from './types'\r\nimport { defineComponent, shallowRef, toRefs, watch } from 'vue'\r\n// import { useMarkdownContext } from '../components/MarkdownProvider';\r\nimport { render } from './hast-to-vnode'\r\nimport { useMarkdownProcessor } from './useProcessor'\r\n\r\nexport type { CustomAttrs, SanitizeOptions, TVueMarkdown }\r\n\r\nconst sharedProps = {\r\n markdown: {\r\n type: String as PropType<string>,\r\n default: '',\r\n },\r\n customAttrs: {\r\n type: Object as PropType<CustomAttrs>,\r\n default: () => ({}),\r\n },\r\n remarkPlugins: {\r\n type: Array as PropType<PluggableList>,\r\n default: () => [],\r\n },\r\n rehypePlugins: {\r\n type: Array as PropType<PluggableList>,\r\n default: () => [],\r\n },\r\n rehypeOptions: {\r\n type: Object as PropType<Omit<TRehypeOptions, 'file'>>,\r\n default: () => ({}),\r\n },\r\n sanitize: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n sanitizeOptions: {\r\n type: Object as PropType<SanitizeOptions>,\r\n default: () => ({}),\r\n },\r\n}\r\nconst vueMarkdownImpl = defineComponent({\r\n name: 'VueMarkdown',\r\n props: sharedProps,\r\n setup(props, { slots, attrs }) {\r\n const { markdown, remarkPlugins, rehypePlugins, rehypeOptions, sanitize, sanitizeOptions, customAttrs } =\r\n toRefs(props)\r\n\r\n const { processor } = useMarkdownProcessor({\r\n remarkPlugins,\r\n rehypePlugins,\r\n rehypeOptions,\r\n sanitize,\r\n sanitizeOptions,\r\n })\r\n\r\n return () => {\r\n const mdast = processor.value.parse(markdown.value)\r\n const hast = processor.value.runSync(mdast) as Root\r\n return render(hast, attrs, slots, customAttrs.value)\r\n }\r\n },\r\n})\r\n\r\nconst vueMarkdownAsyncImpl = defineComponent({\r\n name: 'VueMarkdownAsync',\r\n props: sharedProps,\r\n async setup(props, { slots, attrs }) {\r\n const { markdown, remarkPlugins, rehypePlugins, rehypeOptions, sanitize, sanitizeOptions, customAttrs } =\r\n toRefs(props)\r\n const { processor } = useMarkdownProcessor({\r\n remarkPlugins,\r\n rehypePlugins,\r\n rehypeOptions,\r\n sanitize,\r\n sanitizeOptions,\r\n })\r\n\r\n const hast = shallowRef<Root | null>(null)\r\n const process = async (): Promise<void> => {\r\n const mdast = processor.value.parse(markdown.value)\r\n hast.value = (await processor.value.run(mdast)) as Root\r\n }\r\n\r\n watch(() => [markdown.value, processor.value], process, { flush: 'sync' })\r\n\r\n await process()\r\n\r\n return () => {\r\n return hast.value ? render(hast.value, attrs, slots, customAttrs.value) : null\r\n }\r\n },\r\n})\r\n\r\n// export the public type for h/tsx inference\r\n// also to avoid inline import() in generated d.ts files\r\nexport const VueMarkdown: TVueMarkdown = vueMarkdownImpl as any\r\n\r\n// export the public type for h/tsx inference\r\n// also to avoid inline import() in generated d.ts files\r\nexport const VueMarkdownAsync: TVueMarkdown = vueMarkdownAsyncImpl as any\r\n"],"names":[],"mappings":";;;AAaA,MAAM,cAAc;AAAA,EAClB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAAA,EAEX,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAAC;AAAA,EAEnB,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS,MAAM,CAAA;AAAA,EAAC;AAAA,EAElB,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS,MAAM,CAAA;AAAA,EAAC;AAAA,EAElB,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAAC;AAAA,EAEnB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAAA,EAEX,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAAC;AAErB;AACA,MAAM,kBAAkB,gBAAgB;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,OAAO,SAAS;AAC7B,UAAM,EAAE,UAAU,eAAe,eAAe,eAAe,UAAU,iBAAiB,YAAA,IACxF,OAAO,KAAK;AAEd,UAAM,EAAE,UAAA,IAAc,qBAAqB;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,YAAM,QAAQ,UAAU,MAAM,MAAM,SAAS,KAAK;AAClD,YAAM,OAAO,UAAU,MAAM,QAAQ,KAAK;AAC1C,aAAO,OAAO,MAAM,OAAO,OAAO,YAAY,KAAK;AAAA,IACrD;AAAA,EACF;AACF,CAAC;AAED,MAAM,uBAAuB,gBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,MAAM,OAAO,EAAE,OAAO,SAAS;AACnC,UAAM,EAAE,UAAU,eAAe,eAAe,eAAe,UAAU,iBAAiB,YAAA,IACxF,OAAO,KAAK;AACd,UAAM,EAAE,UAAA,IAAc,qBAAqB;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,UAAM,OAAO,WAAwB,IAAI;AACzC,UAAM,UAAU,YAA2B;AACzC,YAAM,QAAQ,UAAU,MAAM,MAAM,SAAS,KAAK;AAClD,WAAK,QAAS,MAAM,UAAU,MAAM,IAAI,KAAK;AAAA,IAC/C;AAEA,UAAM,MAAM,CAAC,SAAS,OAAO,UAAU,KAAK,GAAG,SAAS,EAAE,OAAO,QAAQ;AAEzE,UAAM,QAAA;AAEN,WAAO,MAAM;AACX,aAAO,KAAK,QAAQ,OAAO,KAAK,OAAO,OAAO,OAAO,YAAY,KAAK,IAAI;AAAA,IAC5E;AAAA,EACF;AACF,CAAC;AAIM,MAAM,cAA4B;AAIlC,MAAM,mBAAiC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-markdown.es21.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
export {
|
|
73
|
+
_sfc_main as default
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=x-markdown.es22.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,141 +1,9 @@
|
|
|
1
|
-
import { defineComponent, ref, computed,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
8
|
-
const _hoisted_2$1 = ["innerHTML"];
|
|
9
|
-
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
10
|
-
__name: "SyntaxMermaid",
|
|
11
|
-
props: {
|
|
12
|
-
content: { default: "" },
|
|
13
|
-
id: { default: "mermaid-default" },
|
|
14
|
-
isDark: { type: Boolean, default: false },
|
|
15
|
-
config: { default: () => ({}) }
|
|
16
|
-
},
|
|
17
|
-
emits: ["degraded", "ready"],
|
|
18
|
-
setup(__props, { expose: __expose, emit: __emit }) {
|
|
19
|
-
const props = __props;
|
|
20
|
-
const emit = __emit;
|
|
21
|
-
const renderContainerRef = ref(null);
|
|
22
|
-
const mermaidContent = computed(() => props.content);
|
|
23
|
-
const mermaidOptions = computed(() => ({
|
|
24
|
-
id: props.id,
|
|
25
|
-
theme: props.isDark ? "dark" : "default",
|
|
26
|
-
config: props.config,
|
|
27
|
-
container: renderContainerRef.value
|
|
28
|
-
}));
|
|
29
|
-
const mermaidResult = useMermaid(mermaidContent, mermaidOptions);
|
|
30
|
-
const svg = ref("");
|
|
31
|
-
const isLoading = computed(() => mermaidResult.isLoading.value);
|
|
32
|
-
const error = computed(() => mermaidResult.error.value);
|
|
33
|
-
const containerRef = ref(null);
|
|
34
|
-
const zoomControls = useMermaidZoom({
|
|
35
|
-
container: containerRef
|
|
36
|
-
});
|
|
37
|
-
const debouncedInitialize = debounce(initializeZoom, 500);
|
|
38
|
-
function initializeZoom() {
|
|
39
|
-
nextTick(() => {
|
|
40
|
-
if (containerRef.value) {
|
|
41
|
-
zoomControls.initialize();
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
watch(
|
|
46
|
-
() => mermaidResult.data.value,
|
|
47
|
-
(newSvg, oldSvg) => {
|
|
48
|
-
console.log("[SyntaxMermaid] mermaidResult.data.value changed:", {
|
|
49
|
-
oldSvg,
|
|
50
|
-
newSvg,
|
|
51
|
-
isNewSvg: !!newSvg,
|
|
52
|
-
startsWithSvg: newSvg?.trim().startsWith("<svg"),
|
|
53
|
-
preview: newSvg?.substring(0, 50)
|
|
54
|
-
});
|
|
55
|
-
if (newSvg) {
|
|
56
|
-
svg.value = newSvg;
|
|
57
|
-
debouncedInitialize();
|
|
58
|
-
if (newSvg.trim().startsWith("<svg")) {
|
|
59
|
-
console.log("[SyntaxMermaid] Emitting ready event - Mermaid is available");
|
|
60
|
-
emit("ready");
|
|
61
|
-
} else {
|
|
62
|
-
console.log("[SyntaxMermaid] Emitting degraded event - Mermaid not available");
|
|
63
|
-
emit("degraded");
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{ immediate: true }
|
|
68
|
-
);
|
|
69
|
-
watch(svg, (newSvg) => {
|
|
70
|
-
if (newSvg) {
|
|
71
|
-
debouncedInitialize();
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
function zoomIn() {
|
|
75
|
-
zoomControls?.zoomIn();
|
|
76
|
-
}
|
|
77
|
-
function zoomOut() {
|
|
78
|
-
zoomControls?.zoomOut();
|
|
79
|
-
}
|
|
80
|
-
function reset() {
|
|
81
|
-
zoomControls?.reset();
|
|
82
|
-
}
|
|
83
|
-
function fullscreen() {
|
|
84
|
-
zoomControls?.fullscreen();
|
|
85
|
-
zoomControls?.reset();
|
|
86
|
-
}
|
|
87
|
-
function download() {
|
|
88
|
-
downloadSvgAsPng(svg.value);
|
|
89
|
-
}
|
|
90
|
-
function getSvg() {
|
|
91
|
-
return svg.value;
|
|
92
|
-
}
|
|
93
|
-
function reinitialize() {
|
|
94
|
-
debouncedInitialize();
|
|
95
|
-
}
|
|
96
|
-
onMounted(() => {
|
|
97
|
-
if (svg.value) {
|
|
98
|
-
debouncedInitialize();
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
__expose({
|
|
102
|
-
svg,
|
|
103
|
-
isLoading,
|
|
104
|
-
error,
|
|
105
|
-
containerRef,
|
|
106
|
-
zoomIn,
|
|
107
|
-
zoomOut,
|
|
108
|
-
reset,
|
|
109
|
-
fullscreen,
|
|
110
|
-
download,
|
|
111
|
-
getSvg,
|
|
112
|
-
reinitialize
|
|
113
|
-
});
|
|
114
|
-
return (_ctx, _cache) => {
|
|
115
|
-
return openBlock(), createElementBlock("div", {
|
|
116
|
-
ref_key: "containerRef",
|
|
117
|
-
ref: containerRef,
|
|
118
|
-
class: normalizeClass(["syntax-mermaid", { "syntax-mermaid--dark": props.isDark }])
|
|
119
|
-
}, [
|
|
120
|
-
createElementVNode("div", {
|
|
121
|
-
ref_key: "renderContainerRef",
|
|
122
|
-
ref: renderContainerRef,
|
|
123
|
-
class: "syntax-mermaid__render-container",
|
|
124
|
-
"aria-hidden": "true"
|
|
125
|
-
}, null, 512),
|
|
126
|
-
isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
127
|
-
renderSlot(_ctx.$slots, "loading", {}, () => [
|
|
128
|
-
_cache[0] || (_cache[0] = createElementVNode("span", { class: "syntax-mermaid__loading-text" }, "加载中...", -1))
|
|
129
|
-
])
|
|
130
|
-
])) : (openBlock(), createElementBlock("div", {
|
|
131
|
-
key: 1,
|
|
132
|
-
class: "syntax-mermaid__content",
|
|
133
|
-
innerHTML: svg.value
|
|
134
|
-
}, null, 8, _hoisted_2$1))
|
|
135
|
-
], 2);
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
});
|
|
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.es26.js";
|
|
3
|
+
import { checkMermaidAvailable } from "./x-markdown.es9.js";
|
|
4
|
+
import _sfc_main$1 from "./x-markdown.es28.js";
|
|
5
|
+
/* empty css */
|
|
6
|
+
import CodeBlock from "./x-markdown.es17.js";
|
|
139
7
|
const _hoisted_1 = { class: "toolbar-container" };
|
|
140
8
|
const _hoisted_2 = { class: "mermaid-toolbar" };
|
|
141
9
|
const _hoisted_3 = { class: "toolbar-left" };
|
|
@@ -532,4 +400,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
532
400
|
export {
|
|
533
401
|
_sfc_main as default
|
|
534
402
|
};
|
|
535
|
-
//# sourceMappingURL=
|
|
403
|
+
//# sourceMappingURL=x-markdown.es24.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-markdown.es24.js","sources":["../src/components/Mermaid/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { MdComponent, MermaidExposeProps, MermaidAction, MermaidSlotProps } from './types'\r\nimport type { VNode } from 'vue'\r\nimport { computed, ref, h, onMounted } from 'vue'\r\nimport { useClipboard } from '@vueuse/core'\r\n// 使用运行时检测\r\nimport { checkMermaidAvailable } from '../../hooks/useMermaid'\r\nimport SyntaxMermaid from './SyntaxMermaid.vue'\r\nimport CodeBlock from '../CodeBlock/index.vue'\r\n\r\ninterface MermaidProps extends MdComponent {\r\n isDark?: boolean\r\n shikiTheme?: [string, string]\r\n config?: Record<string, any>\r\n mermaidActions?: MermaidAction[]\r\n}\r\n\r\nconst props = withDefaults(defineProps<MermaidProps>(), {\r\n raw: () => ({}),\r\n isDark: false,\r\n shikiTheme: () => ['vitesse-light', 'vitesse-dark'],\r\n config: () => ({}),\r\n mermaidActions: undefined,\r\n})\r\n\r\nconst syntaxMermaidRef = ref<InstanceType<typeof SyntaxMermaid> | null>(null)\r\nconst showSourceCode = ref(false)\r\n// 运行时检测 mermaid 是否可用\r\nconst isDegraded = ref(false)\r\nconst mermaidContent = computed(() => props.raw?.content || '')\r\nconst mermaidId = computed(() => `mermaid-${props.raw?.key || 'default'}`)\r\nconst isLoading = computed(() => syntaxMermaidRef.value?.isLoading ?? true)\r\nconst svg = computed(() => syntaxMermaidRef.value?.svg ?? '')\r\nconst activeTab = computed(() => (showSourceCode.value ? 'code' : 'diagram'))\r\n\r\nfunction handleZoomIn(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.zoomIn()\r\n }\r\n}\r\n\r\nfunction handleZoomOut(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.zoomOut()\r\n }\r\n}\r\n\r\nfunction handleReset(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.reset()\r\n }\r\n}\r\n\r\nfunction handleFullscreen() {\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.fullscreen()\r\n }\r\n}\r\n\r\nfunction handleToggleCode() {\r\n showSourceCode.value = !showSourceCode.value\r\n}\r\n\r\nconst { copy: copyCode, copied } = useClipboard({ copiedDuring: 1500 })\r\n\r\nfunction handleTabClick(tabName: string) {\r\n if (tabName === 'code' && !showSourceCode.value) {\r\n showSourceCode.value = true\r\n } else if (tabName === 'diagram' && showSourceCode.value) {\r\n showSourceCode.value = false\r\n }\r\n}\r\n\r\nasync function handleCopyCode(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n\r\n if (copied.value) {\r\n return\r\n }\r\n\r\n if (!props.raw.content) {\r\n return\r\n }\r\n await copyCode(props.raw.content)\r\n}\r\n\r\nfunction handleDownload() {\r\n syntaxMermaidRef.value?.download()\r\n}\r\n\r\nconst normalizedActions = computed<MermaidAction[]>(() => {\r\n return props.mermaidActions || []\r\n})\r\n\r\nconst filteredActions = computed<MermaidAction[]>(() => {\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<MermaidSlotProps>(() => ({\r\n showSourceCode: showSourceCode.value,\r\n svg: svg.value,\r\n rawContent: props.raw.content || '',\r\n isLoading: isLoading.value,\r\n copied: copied.value,\r\n zoomIn: handleZoomIn,\r\n zoomOut: handleZoomOut,\r\n reset: handleReset,\r\n fullscreen: handleFullscreen,\r\n toggleCode: handleToggleCode,\r\n copyCode: handleCopyCode,\r\n download: handleDownload,\r\n raw: props.raw,\r\n}))\r\n\r\nfunction renderActionIcon(action: MermaidAction): 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: 'mermaid-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: MermaidSlotProps) => 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 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: MermaidAction) {\r\n if (action.disabled) return\r\n action.onClick?.(slotProps.value)\r\n}\r\n\r\nconst exposedMethods = computed(\r\n () =>\r\n ({\r\n showSourceCode: showSourceCode.value,\r\n svg: svg.value,\r\n rawContent: props.raw.content || '',\r\n isLoading: isLoading.value,\r\n copied: copied.value,\r\n zoomIn: handleZoomIn,\r\n zoomOut: handleZoomOut,\r\n reset: handleReset,\r\n fullscreen: handleFullscreen,\r\n toggleCode: handleToggleCode,\r\n copyCode: handleCopyCode,\r\n download: handleDownload,\r\n raw: props.raw,\r\n }) satisfies MermaidExposeProps,\r\n)\r\n\r\n// 组件挂载时检测 mermaid 是否可用\r\nonMounted(async () => {\r\n const hasMermaid = await checkMermaidAvailable()\r\n isDegraded.value = !hasMermaid\r\n})\r\n</script>\r\n\r\n<template>\r\n <!-- 当 Mermaid 不可用时(降级),渲染 CodeBlock -->\r\n <CodeBlock\r\n v-if=\"isDegraded\"\r\n :code=\"props.raw?.content || ''\"\r\n language=\"mermaid\"\r\n :is-dark=\"props.isDark\"\r\n :light-theme=\"props.shikiTheme[0]\"\r\n :dark-theme=\"props.shikiTheme[1]\"\r\n />\r\n\r\n <!-- 当 Mermaid 可用时,渲染完整的 Mermaid 组件 -->\r\n <div v-else :key=\"props.raw.key\" class=\"markdown-mermaid\" :class=\"{ 'markdown-mermaid--dark': props.isDark }\">\r\n <Transition name=\"toolbar\" appear>\r\n <div class=\"toolbar-container\">\r\n <slot name=\"mermaidHeader\" v-bind=\"exposedMethods\">\r\n <div class=\"mermaid-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <div class=\"segmented-control\">\r\n <div class=\"segmented-slider\" :class=\"{ 'slide-right': activeTab === 'code' }\" />\r\n <div\r\n class=\"segment-item\"\r\n :class=\"{ active: activeTab === 'diagram' }\"\r\n @click=\"handleTabClick('diagram')\"\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M2 17L12 22L22 17\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M2 12L12 17L22 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>预览</span>\r\n </div>\r\n <div class=\"segment-item\" :class=\"{ active: activeTab === 'code' }\" @click=\"handleTabClick('code')\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 18L22 12L16 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M8 6L2 12L8 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>代码</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-right\">\r\n <slot name=\"mermaidActions\" v-bind=\"exposedMethods\">\r\n <div\r\n v-for=\"action in filteredActions\"\r\n :key=\"action.key\"\r\n class=\"toolbar-action-btn\"\r\n :class=\"[action.class, { 'toolbar-action-btn--disabled': action.disabled }]\"\r\n :style=\"action.style\"\r\n :title=\"action.title\"\r\n @click=\"handleActionClick(action)\"\r\n >\r\n <component :is=\"renderActionIcon(action)\" v-if=\"action.icon\" />\r\n </div>\r\n\r\n <template v-if=\"showSourceCode\">\r\n <div\r\n class=\"toolbar-action-btn\"\r\n :class=\"{ 'copy-success': copied }\"\r\n title=\"复制代码\"\r\n @click=\"handleCopyCode($event)\"\r\n >\r\n <svg\r\n v-if=\"copied\"\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 v-else width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\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 </div>\r\n </template>\r\n\r\n <template v-else>\r\n <div class=\"toolbar-action-btn\" title=\"缩小\" @click=\"handleZoomOut($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"放大\" @click=\"handleZoomIn($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"重置\" @click=\"handleReset($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"下载\" @click=\"handleDownload\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z\"\r\n />\r\n </svg>\r\n </div>\r\n </template>\r\n </slot>\r\n </div>\r\n </div>\r\n </slot>\r\n </div>\r\n </Transition>\r\n\r\n <div v-show=\"showSourceCode\" class=\"mermaid-source-code\">\r\n <CodeBlock\r\n :code=\"props.raw?.content || ''\"\r\n language=\"mermaid\"\r\n :is-dark=\"props.isDark\"\r\n :light-theme=\"props.shikiTheme[0]\"\r\n :dark-theme=\"props.shikiTheme[1]\"\r\n :show-code-block-header=\"false\"\r\n :sticky-code-block-header=\"false\"\r\n />\r\n </div>\r\n\r\n <SyntaxMermaid\r\n v-show=\"!showSourceCode\"\r\n ref=\"syntaxMermaidRef\"\r\n :content=\"mermaidContent\"\r\n :id=\"mermaidId\"\r\n :is-dark=\"props.isDark\"\r\n :config=\"props.config\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.markdown-mermaid {\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.markdown-mermaid.markdown-mermaid--dark {\r\n background: rgba(255, 255, 255, 0.13);\r\n}\r\n\r\n.markdown-mermaid .toolbar-container {\r\n position: relative;\r\n z-index: 10;\r\n flex-shrink: 0;\r\n background: rgba(0, 0, 0, 0.05);\r\n color: #333;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .toolbar-container {\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #fff;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 16px;\r\n background: transparent;\r\n color: inherit;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-left {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-control {\r\n display: flex;\r\n align-items: center;\r\n position: relative;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 6px;\r\n padding: 3px;\r\n gap: 2px;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segmented-control {\r\n background: rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-slider {\r\n position: absolute;\r\n top: 3px;\r\n left: 3px;\r\n width: calc(50% - 4px);\r\n height: calc(100% - 6px);\r\n background: #fff;\r\n border-radius: 4px;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n z-index: 0;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segmented-slider {\r\n background: rgba(255, 255, 255, 0.15);\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-slider.slide-right {\r\n transform: translateX(calc(100% + 2px));\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n font-size: 12px;\r\n border: none;\r\n color: inherit;\r\n min-width: 60px;\r\n text-align: center;\r\n box-sizing: border-box;\r\n font-weight: 500;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n padding: 5px 12px;\r\n transition: all 0.2s ease;\r\n background: transparent;\r\n opacity: 0.6;\r\n user-select: none;\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item.active {\r\n opacity: 1;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segment-item.active {\r\n color: #fff;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item:hover {\r\n opacity: 1;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-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 transition: all 0.2s ease;\r\n opacity: 0.7;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn.copy-success {\r\n opacity: 1;\r\n color: #22c55e;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .toolbar-action-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn.toolbar-action-btn--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .mermaid-action-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .mermaid-action-icon :deep(svg) {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.markdown-mermaid .mermaid-source-code {\r\n position: relative;\r\n z-index: 1;\r\n flex: 1;\r\n width: 100%;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n}\r\n\r\n.toolbar-enter-active,\r\n.toolbar-leave-active {\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.toolbar-enter-from,\r\n.toolbar-leave-to {\r\n opacity: 0;\r\n}\r\n</style>\r\n"],"names":["_createBlock","_createElementBlock","_normalizeClass","_createVNode","_Transition","_createElementVNode","_renderSlot","_normalizeProps","_guardReactiveProps","_Fragment","_renderList","_normalizeStyle","_resolveDynamicComponent","_unref","_openBlock","_withDirectives","SyntaxMermaid"],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { useTimeoutFn, isClient, toArray, watchImmediate, createSingletonPromise, isObject } from "./x-markdown.es30.js";
|
|
2
|
+
import { tryOnScopeDispose } from "./x-markdown.es30.js";
|
|
3
|
+
import { computed, shallowRef, toValue, readonly, getCurrentInstance, onMounted, unref, toRaw } from "vue";
|
|
4
|
+
const defaultWindow = isClient ? window : void 0;
|
|
5
|
+
const defaultNavigator = isClient ? window.navigator : void 0;
|
|
6
|
+
function unrefElement(elRef) {
|
|
7
|
+
var _$el;
|
|
8
|
+
const plain = toValue(elRef);
|
|
9
|
+
return (_$el = plain === null || plain === void 0 ? void 0 : plain.$el) !== null && _$el !== void 0 ? _$el : plain;
|
|
10
|
+
}
|
|
11
|
+
function useEventListener(...args) {
|
|
12
|
+
const register = (el, event, listener, options) => {
|
|
13
|
+
el.addEventListener(event, listener, options);
|
|
14
|
+
return () => el.removeEventListener(event, listener, options);
|
|
15
|
+
};
|
|
16
|
+
const firstParamTargets = computed(() => {
|
|
17
|
+
const test = toArray(toValue(args[0])).filter((e) => e != null);
|
|
18
|
+
return test.every((e) => typeof e !== "string") ? test : void 0;
|
|
19
|
+
});
|
|
20
|
+
return watchImmediate(() => {
|
|
21
|
+
var _firstParamTargets$va, _firstParamTargets$va2;
|
|
22
|
+
return [
|
|
23
|
+
(_firstParamTargets$va = (_firstParamTargets$va2 = firstParamTargets.value) === null || _firstParamTargets$va2 === void 0 ? void 0 : _firstParamTargets$va2.map((e) => unrefElement(e))) !== null && _firstParamTargets$va !== void 0 ? _firstParamTargets$va : [defaultWindow].filter((e) => e != null),
|
|
24
|
+
toArray(toValue(firstParamTargets.value ? args[1] : args[0])),
|
|
25
|
+
toArray(unref(firstParamTargets.value ? args[2] : args[1])),
|
|
26
|
+
toValue(firstParamTargets.value ? args[3] : args[2])
|
|
27
|
+
];
|
|
28
|
+
}, ([raw_targets, raw_events, raw_listeners, raw_options], _, onCleanup) => {
|
|
29
|
+
if (!(raw_targets === null || raw_targets === void 0 ? void 0 : raw_targets.length) || !(raw_events === null || raw_events === void 0 ? void 0 : raw_events.length) || !(raw_listeners === null || raw_listeners === void 0 ? void 0 : raw_listeners.length)) return;
|
|
30
|
+
const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;
|
|
31
|
+
const cleanups = raw_targets.flatMap((el) => raw_events.flatMap((event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))));
|
|
32
|
+
onCleanup(() => {
|
|
33
|
+
cleanups.forEach((fn) => fn());
|
|
34
|
+
});
|
|
35
|
+
}, { flush: "post" });
|
|
36
|
+
}
|
|
37
|
+
// @__NO_SIDE_EFFECTS__
|
|
38
|
+
function useMounted() {
|
|
39
|
+
const isMounted = shallowRef(false);
|
|
40
|
+
const instance = getCurrentInstance();
|
|
41
|
+
if (instance) onMounted(() => {
|
|
42
|
+
isMounted.value = true;
|
|
43
|
+
}, instance);
|
|
44
|
+
return isMounted;
|
|
45
|
+
}
|
|
46
|
+
// @__NO_SIDE_EFFECTS__
|
|
47
|
+
function useSupported(callback) {
|
|
48
|
+
const isMounted = /* @__PURE__ */ useMounted();
|
|
49
|
+
return computed(() => {
|
|
50
|
+
isMounted.value;
|
|
51
|
+
return Boolean(callback());
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// @__NO_SIDE_EFFECTS__
|
|
55
|
+
function usePermission(permissionDesc, options = {}) {
|
|
56
|
+
const { controls = false, navigator: navigator$1 = defaultNavigator } = options;
|
|
57
|
+
const isSupported = /* @__PURE__ */ useSupported(() => navigator$1 && "permissions" in navigator$1);
|
|
58
|
+
const permissionStatus = shallowRef();
|
|
59
|
+
const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
|
|
60
|
+
const state = shallowRef();
|
|
61
|
+
const update = () => {
|
|
62
|
+
var _permissionStatus$val, _permissionStatus$val2;
|
|
63
|
+
state.value = (_permissionStatus$val = (_permissionStatus$val2 = permissionStatus.value) === null || _permissionStatus$val2 === void 0 ? void 0 : _permissionStatus$val2.state) !== null && _permissionStatus$val !== void 0 ? _permissionStatus$val : "prompt";
|
|
64
|
+
};
|
|
65
|
+
useEventListener(permissionStatus, "change", update, { passive: true });
|
|
66
|
+
const query = createSingletonPromise(async () => {
|
|
67
|
+
if (!isSupported.value) return;
|
|
68
|
+
if (!permissionStatus.value) try {
|
|
69
|
+
permissionStatus.value = await navigator$1.permissions.query(desc);
|
|
70
|
+
} catch (_unused) {
|
|
71
|
+
permissionStatus.value = void 0;
|
|
72
|
+
} finally {
|
|
73
|
+
update();
|
|
74
|
+
}
|
|
75
|
+
if (controls) return toRaw(permissionStatus.value);
|
|
76
|
+
});
|
|
77
|
+
query();
|
|
78
|
+
if (controls) return {
|
|
79
|
+
state,
|
|
80
|
+
isSupported,
|
|
81
|
+
query
|
|
82
|
+
};
|
|
83
|
+
else return state;
|
|
84
|
+
}
|
|
85
|
+
function useClipboard(options = {}) {
|
|
86
|
+
const { navigator: navigator$1 = defaultNavigator, read = false, source, copiedDuring = 1500, legacy = false } = options;
|
|
87
|
+
const isClipboardApiSupported = /* @__PURE__ */ useSupported(() => navigator$1 && "clipboard" in navigator$1);
|
|
88
|
+
const permissionRead = /* @__PURE__ */ usePermission("clipboard-read");
|
|
89
|
+
const permissionWrite = /* @__PURE__ */ usePermission("clipboard-write");
|
|
90
|
+
const isSupported = computed(() => isClipboardApiSupported.value || legacy);
|
|
91
|
+
const text = shallowRef("");
|
|
92
|
+
const copied = shallowRef(false);
|
|
93
|
+
const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });
|
|
94
|
+
async function updateText() {
|
|
95
|
+
let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));
|
|
96
|
+
if (!useLegacy) try {
|
|
97
|
+
text.value = await navigator$1.clipboard.readText();
|
|
98
|
+
} catch (_unused) {
|
|
99
|
+
useLegacy = true;
|
|
100
|
+
}
|
|
101
|
+
if (useLegacy) text.value = legacyRead();
|
|
102
|
+
}
|
|
103
|
+
if (isSupported.value && read) useEventListener(["copy", "cut"], updateText, { passive: true });
|
|
104
|
+
async function copy(value = toValue(source)) {
|
|
105
|
+
if (isSupported.value && value != null) {
|
|
106
|
+
let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));
|
|
107
|
+
if (!useLegacy) try {
|
|
108
|
+
await navigator$1.clipboard.writeText(value);
|
|
109
|
+
} catch (_unused2) {
|
|
110
|
+
useLegacy = true;
|
|
111
|
+
}
|
|
112
|
+
if (useLegacy) legacyCopy(value);
|
|
113
|
+
text.value = value;
|
|
114
|
+
copied.value = true;
|
|
115
|
+
timeout.start();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function legacyCopy(value) {
|
|
119
|
+
const ta = document.createElement("textarea");
|
|
120
|
+
ta.value = value;
|
|
121
|
+
ta.style.position = "absolute";
|
|
122
|
+
ta.style.opacity = "0";
|
|
123
|
+
ta.setAttribute("readonly", "");
|
|
124
|
+
document.body.appendChild(ta);
|
|
125
|
+
ta.select();
|
|
126
|
+
document.execCommand("copy");
|
|
127
|
+
ta.remove();
|
|
128
|
+
}
|
|
129
|
+
function legacyRead() {
|
|
130
|
+
var _document$getSelectio, _document, _document$getSelectio2;
|
|
131
|
+
return (_document$getSelectio = (_document = document) === null || _document === void 0 || (_document$getSelectio2 = _document.getSelection) === null || _document$getSelectio2 === void 0 || (_document$getSelectio2 = _document$getSelectio2.call(_document)) === null || _document$getSelectio2 === void 0 ? void 0 : _document$getSelectio2.toString()) !== null && _document$getSelectio !== void 0 ? _document$getSelectio : "";
|
|
132
|
+
}
|
|
133
|
+
function isAllowed(status) {
|
|
134
|
+
return status === "granted" || status === "prompt";
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
isSupported,
|
|
138
|
+
text: readonly(text),
|
|
139
|
+
copied: readonly(copied),
|
|
140
|
+
copy
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
createSingletonPromise,
|
|
145
|
+
defaultNavigator,
|
|
146
|
+
defaultWindow,
|
|
147
|
+
isClient,
|
|
148
|
+
isObject,
|
|
149
|
+
toArray,
|
|
150
|
+
tryOnScopeDispose,
|
|
151
|
+
unrefElement,
|
|
152
|
+
useClipboard,
|
|
153
|
+
useEventListener,
|
|
154
|
+
useMounted,
|
|
155
|
+
usePermission,
|
|
156
|
+
useSupported,
|
|
157
|
+
useTimeoutFn,
|
|
158
|
+
watchImmediate
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=x-markdown.es26.js.map
|