@pactor-app/markdown 1.20.0 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/index.cjs +39 -2
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +38 -1
- package/package.json +10 -6
- package/styles.css +261 -0
package/README.md
CHANGED
|
@@ -26,7 +26,17 @@ import { MarkdownRenderer } from '@pactor-app/markdown';
|
|
|
26
26
|
<MarkdownRenderer content={'### 标题\n\n- 列表项\n\n| 表 | 格 |\n| - | - |\n| 1 | 2 |'} />;
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
支持:标题 / 段落 / 粗体 / 斜体 / 有序与无序列表 / GFM 表格与删除线 / 围栏代码块(`<pre><code class="language-xxx">`,供后续语法高亮扩展)与行内代码 / 引用 / 链接 / 图片。容器带基础 class
|
|
29
|
+
支持:标题 / 段落 / 粗体 / 斜体 / 有序与无序列表 / GFM 表格与删除线 / 围栏代码块(`<pre><code class="language-xxx">`,供后续语法高亮扩展)与行内代码 / 引用 / 链接 / 图片。容器带基础 class `pactor-markdown`。
|
|
30
|
+
|
|
31
|
+
## 内置样式
|
|
32
|
+
|
|
33
|
+
包内置一套可读性优先的排版样式(标题层级、表格斑马纹、代码块、引用、任务列表、KaTeX 溢出动滚等),引入即可生效:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import '@pactor-app/markdown/styles.css';
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
样式全部作用域在 `.pactor-markdown` 容器内:颜色 / 圆角经 `--pactor-markdown-*` 令牌解析,优先跟随 shadcn 语义令牌(`--foreground` / `--border` / `--primary` 等,暗色主题自动适配),无宿主主题时回退 GitHub 风格配色(跟随系统明暗)。宿主可重定义令牌或以更高优先级规则覆盖(如 `@pactor-app/chat` 的消息流主题)。启用 `math` 时仍需自行引入 `katex/dist/katex.min.css`。
|
|
30
40
|
|
|
31
41
|
## DSL 使用
|
|
32
42
|
|
package/dist/index.cjs
CHANGED
|
@@ -48,6 +48,7 @@ var import_remark_math = __toESM(require("remark-math"), 1);
|
|
|
48
48
|
|
|
49
49
|
// src/code-block.tsx
|
|
50
50
|
var import_react = require("react");
|
|
51
|
+
var import_react2 = require("react");
|
|
51
52
|
var import_react_syntax_highlighter = require("react-syntax-highlighter");
|
|
52
53
|
var import_bash = __toESM(require("react-syntax-highlighter/dist/esm/languages/prism/bash"), 1);
|
|
53
54
|
var import_css = __toESM(require("react-syntax-highlighter/dist/esm/languages/prism/css"), 1);
|
|
@@ -59,6 +60,7 @@ var import_python = __toESM(require("react-syntax-highlighter/dist/esm/languages
|
|
|
59
60
|
var import_tsx = __toESM(require("react-syntax-highlighter/dist/esm/languages/prism/tsx"), 1);
|
|
60
61
|
var import_typescript = __toESM(require("react-syntax-highlighter/dist/esm/languages/prism/typescript"), 1);
|
|
61
62
|
var import_yaml = __toESM(require("react-syntax-highlighter/dist/esm/languages/prism/yaml"), 1);
|
|
63
|
+
var import_one_dark = __toESM(require("react-syntax-highlighter/dist/esm/styles/prism/one-dark"), 1);
|
|
62
64
|
var import_one_light = __toESM(require("react-syntax-highlighter/dist/esm/styles/prism/one-light"), 1);
|
|
63
65
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
64
66
|
var LANGUAGES = {
|
|
@@ -91,12 +93,47 @@ function registerCodeLanguages() {
|
|
|
91
93
|
function isCodeLanguageRegistered(language) {
|
|
92
94
|
return language.toLowerCase() in LANGUAGES;
|
|
93
95
|
}
|
|
96
|
+
function resolveDarkMode() {
|
|
97
|
+
if (typeof document === "undefined") {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const theme = document.documentElement.getAttribute("data-pactor-theme");
|
|
101
|
+
if (theme === "dark") {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (theme === "light") {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
108
|
+
}
|
|
109
|
+
function useDarkMode() {
|
|
110
|
+
const [dark, setDark] = (0, import_react.useState)(resolveDarkMode);
|
|
111
|
+
(0, import_react.useEffect)(() => {
|
|
112
|
+
if (typeof document === "undefined") {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const update = () => setDark(resolveDarkMode());
|
|
116
|
+
const observer = new MutationObserver(update);
|
|
117
|
+
observer.observe(document.documentElement, {
|
|
118
|
+
attributes: true,
|
|
119
|
+
attributeFilter: ["data-pactor-theme"]
|
|
120
|
+
});
|
|
121
|
+
const media = window.matchMedia?.("(prefers-color-scheme: dark)");
|
|
122
|
+
media?.addEventListener?.("change", update);
|
|
123
|
+
return () => {
|
|
124
|
+
observer.disconnect();
|
|
125
|
+
media?.removeEventListener?.("change", update);
|
|
126
|
+
};
|
|
127
|
+
}, []);
|
|
128
|
+
return dark;
|
|
129
|
+
}
|
|
94
130
|
function CodeBlock({ language, children }) {
|
|
131
|
+
const dark = useDarkMode();
|
|
95
132
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
96
133
|
import_react_syntax_highlighter.PrismLight,
|
|
97
134
|
{
|
|
98
135
|
language: language.toLowerCase(),
|
|
99
|
-
style: import_one_light.default,
|
|
136
|
+
style: dark ? import_one_dark.default : import_one_light.default,
|
|
100
137
|
customStyle: { margin: 0, background: "transparent", fontSize: "0.85em" },
|
|
101
138
|
codeTagProps: { className: `language-${language.toLowerCase()}` },
|
|
102
139
|
children: children.replace(/\n$/, "")
|
|
@@ -104,7 +141,7 @@ function CodeBlock({ language, children }) {
|
|
|
104
141
|
);
|
|
105
142
|
}
|
|
106
143
|
function extractFencedCode(preChildren) {
|
|
107
|
-
if (!(0,
|
|
144
|
+
if (!(0, import_react2.isValidElement)(preChildren)) {
|
|
108
145
|
return null;
|
|
109
146
|
}
|
|
110
147
|
const { className, children } = preChildren.props;
|
package/dist/index.d.cts
CHANGED
|
@@ -23,7 +23,9 @@ interface MarkdownRendererProps {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Markdown 渲染器:标题 / 列表 / 表格(GFM)/ 代码块 / 引用 / 链接 / 图片 /
|
|
26
|
-
* 数学公式(KaTeX)。容器带基础 class
|
|
26
|
+
* 数学公式(KaTeX)。容器带基础 class `pactor-markdown`;内置排版样式见
|
|
27
|
+
* 包根 `styles.css`(`import '@pactor-app/markdown/styles.css'`),令牌化
|
|
28
|
+
* 设计可被宿主主题覆盖。
|
|
27
29
|
* 技术选型参考 DeepTutor web:react-markdown + remark-gfm + remark-math +
|
|
28
30
|
* rehype-katex + react-syntax-highlighter(Light 构建)。
|
|
29
31
|
*
|
|
@@ -63,7 +65,7 @@ interface CodeBlockProps {
|
|
|
63
65
|
language: string;
|
|
64
66
|
children: string;
|
|
65
67
|
}
|
|
66
|
-
/** fenced 代码块高亮渲染(Prism Light + one-light
|
|
68
|
+
/** fenced 代码块高亮渲染(Prism Light + one-light / one-dark 随深浅模式切换) */
|
|
67
69
|
declare function CodeBlock({ language, children }: CodeBlockProps): react.JSX.Element;
|
|
68
70
|
|
|
69
71
|
export { CodeBlock, type CodeBlockProps, MARKDOWN_DSL_TYPE, MarkdownDslComponent, type MarkdownDslComponentProps, MarkdownRenderer, type MarkdownRendererProps, isSafeUrl, registerCodeLanguages, registerMarkdownComponents };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,7 +23,9 @@ interface MarkdownRendererProps {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Markdown 渲染器:标题 / 列表 / 表格(GFM)/ 代码块 / 引用 / 链接 / 图片 /
|
|
26
|
-
* 数学公式(KaTeX)。容器带基础 class
|
|
26
|
+
* 数学公式(KaTeX)。容器带基础 class `pactor-markdown`;内置排版样式见
|
|
27
|
+
* 包根 `styles.css`(`import '@pactor-app/markdown/styles.css'`),令牌化
|
|
28
|
+
* 设计可被宿主主题覆盖。
|
|
27
29
|
* 技术选型参考 DeepTutor web:react-markdown + remark-gfm + remark-math +
|
|
28
30
|
* rehype-katex + react-syntax-highlighter(Light 构建)。
|
|
29
31
|
*
|
|
@@ -63,7 +65,7 @@ interface CodeBlockProps {
|
|
|
63
65
|
language: string;
|
|
64
66
|
children: string;
|
|
65
67
|
}
|
|
66
|
-
/** fenced 代码块高亮渲染(Prism Light + one-light
|
|
68
|
+
/** fenced 代码块高亮渲染(Prism Light + one-light / one-dark 随深浅模式切换) */
|
|
67
69
|
declare function CodeBlock({ language, children }: CodeBlockProps): react.JSX.Element;
|
|
68
70
|
|
|
69
71
|
export { CodeBlock, type CodeBlockProps, MARKDOWN_DSL_TYPE, MarkdownDslComponent, type MarkdownDslComponentProps, MarkdownRenderer, type MarkdownRendererProps, isSafeUrl, registerCodeLanguages, registerMarkdownComponents };
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import remarkGfm from "remark-gfm";
|
|
|
5
5
|
import remarkMath from "remark-math";
|
|
6
6
|
|
|
7
7
|
// src/code-block.tsx
|
|
8
|
+
import { useEffect, useState } from "react";
|
|
8
9
|
import { isValidElement } from "react";
|
|
9
10
|
import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";
|
|
10
11
|
import bash from "react-syntax-highlighter/dist/esm/languages/prism/bash";
|
|
@@ -17,6 +18,7 @@ import python from "react-syntax-highlighter/dist/esm/languages/prism/python";
|
|
|
17
18
|
import tsx from "react-syntax-highlighter/dist/esm/languages/prism/tsx";
|
|
18
19
|
import typescript from "react-syntax-highlighter/dist/esm/languages/prism/typescript";
|
|
19
20
|
import yaml from "react-syntax-highlighter/dist/esm/languages/prism/yaml";
|
|
21
|
+
import oneDark from "react-syntax-highlighter/dist/esm/styles/prism/one-dark";
|
|
20
22
|
import oneLight from "react-syntax-highlighter/dist/esm/styles/prism/one-light";
|
|
21
23
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
22
24
|
var LANGUAGES = {
|
|
@@ -49,12 +51,47 @@ function registerCodeLanguages() {
|
|
|
49
51
|
function isCodeLanguageRegistered(language) {
|
|
50
52
|
return language.toLowerCase() in LANGUAGES;
|
|
51
53
|
}
|
|
54
|
+
function resolveDarkMode() {
|
|
55
|
+
if (typeof document === "undefined") {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const theme = document.documentElement.getAttribute("data-pactor-theme");
|
|
59
|
+
if (theme === "dark") {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (theme === "light") {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
66
|
+
}
|
|
67
|
+
function useDarkMode() {
|
|
68
|
+
const [dark, setDark] = useState(resolveDarkMode);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (typeof document === "undefined") {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const update = () => setDark(resolveDarkMode());
|
|
74
|
+
const observer = new MutationObserver(update);
|
|
75
|
+
observer.observe(document.documentElement, {
|
|
76
|
+
attributes: true,
|
|
77
|
+
attributeFilter: ["data-pactor-theme"]
|
|
78
|
+
});
|
|
79
|
+
const media = window.matchMedia?.("(prefers-color-scheme: dark)");
|
|
80
|
+
media?.addEventListener?.("change", update);
|
|
81
|
+
return () => {
|
|
82
|
+
observer.disconnect();
|
|
83
|
+
media?.removeEventListener?.("change", update);
|
|
84
|
+
};
|
|
85
|
+
}, []);
|
|
86
|
+
return dark;
|
|
87
|
+
}
|
|
52
88
|
function CodeBlock({ language, children }) {
|
|
89
|
+
const dark = useDarkMode();
|
|
53
90
|
return /* @__PURE__ */ jsx2(
|
|
54
91
|
SyntaxHighlighter,
|
|
55
92
|
{
|
|
56
93
|
language: language.toLowerCase(),
|
|
57
|
-
style: oneLight,
|
|
94
|
+
style: dark ? oneDark : oneLight,
|
|
58
95
|
customStyle: { margin: 0, background: "transparent", fontSize: "0.85em" },
|
|
59
96
|
codeTagProps: { className: `language-${language.toLowerCase()}` },
|
|
60
97
|
children: children.replace(/\n$/, "")
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pactor-app/markdown",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "Pactor Markdown module: safe Markdown renderer (react-markdown AST, no raw HTML) and DSL Markdown component adapter",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pactor",
|
|
@@ -31,14 +31,18 @@
|
|
|
31
31
|
"types": "./dist/index.d.cts",
|
|
32
32
|
"default": "./dist/index.cjs"
|
|
33
33
|
}
|
|
34
|
-
}
|
|
34
|
+
},
|
|
35
|
+
"./styles.css": "./styles.css"
|
|
35
36
|
},
|
|
36
|
-
"sideEffects":
|
|
37
|
+
"sideEffects": [
|
|
38
|
+
"./styles.css"
|
|
39
|
+
],
|
|
37
40
|
"engines": {
|
|
38
41
|
"node": ">=18"
|
|
39
42
|
},
|
|
40
43
|
"files": [
|
|
41
|
-
"dist"
|
|
44
|
+
"dist",
|
|
45
|
+
"styles.css"
|
|
42
46
|
],
|
|
43
47
|
"publishConfig": {
|
|
44
48
|
"access": "public"
|
|
@@ -50,7 +54,7 @@
|
|
|
50
54
|
"rehype-katex": "^7.0.1",
|
|
51
55
|
"remark-gfm": "^4.0.1",
|
|
52
56
|
"remark-math": "^6.0.0",
|
|
53
|
-
"@pactor-app/core": "1.
|
|
57
|
+
"@pactor-app/core": "1.22.0"
|
|
54
58
|
},
|
|
55
59
|
"peerDependencies": {
|
|
56
60
|
"react": ">=18"
|
|
@@ -64,7 +68,7 @@
|
|
|
64
68
|
"jsdom": "^30.0.1",
|
|
65
69
|
"react": "^19.2.8",
|
|
66
70
|
"react-dom": "^19.2.8",
|
|
67
|
-
"@pactor-app/runtime": "1.
|
|
71
|
+
"@pactor-app/runtime": "1.22.0"
|
|
68
72
|
},
|
|
69
73
|
"scripts": {
|
|
70
74
|
"build": "tsup",
|
package/styles.css
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pactor-app/markdown 内置排版样式:可读性优先的 Markdown 主题。
|
|
3
|
+
*
|
|
4
|
+
* 使用:import '@pactor-app/markdown/styles.css';
|
|
5
|
+
*
|
|
6
|
+
* 主题约定:
|
|
7
|
+
* - 全部规则作用域在 .pactor-markdown 容器内,不污染全局;
|
|
8
|
+
* - 颜色 / 圆角经 --pactor-markdown-* 令牌解析,优先引用 shadcn 语义
|
|
9
|
+
* 令牌(--foreground / --muted-foreground / --border / --muted /
|
|
10
|
+
* --primary / --radius),宿主(如 @pactor-app/ui 主题、暗色
|
|
11
|
+
* [data-pactor-theme='dark'])接入后自动跟随;
|
|
12
|
+
* - 无宿主主题时回退到 GitHub 风格浅色 / 暗色(light-dark() 跟随系统);
|
|
13
|
+
* - 宿主可用更高优先级规则或重定义 --pactor-markdown-* 令牌覆盖
|
|
14
|
+
* (如 @pactor-app/chat 的 .pactor-chat-view .pactor-markdown 主题)。
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
.pactor-markdown {
|
|
18
|
+
--pactor-markdown-fg: var(--foreground, light-dark(#1f2328, #e6edf3));
|
|
19
|
+
--pactor-markdown-muted-fg: var(--muted-foreground, light-dark(#59636e, #9198a1));
|
|
20
|
+
--pactor-markdown-border: var(--border, light-dark(#d1d9e0, #3d444d));
|
|
21
|
+
--pactor-markdown-muted-bg: var(--muted, light-dark(#f6f8fa, #262c36));
|
|
22
|
+
--pactor-markdown-code-bg: var(--muted, light-dark(#eff1f3, #2a3139));
|
|
23
|
+
--pactor-markdown-link: var(--primary, light-dark(#0969da, #4493f8));
|
|
24
|
+
--pactor-markdown-quote-border: var(--border, light-dark(#d1d9e0, #3d444d));
|
|
25
|
+
--pactor-markdown-radius: var(--radius, 6px);
|
|
26
|
+
|
|
27
|
+
color: var(--pactor-markdown-fg);
|
|
28
|
+
line-height: 1.75;
|
|
29
|
+
overflow-wrap: break-word;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* 首尾元素去外边距,便于嵌入气泡 / 卡片等容器 */
|
|
33
|
+
.pactor-markdown > :first-child {
|
|
34
|
+
margin-top: 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.pactor-markdown > :last-child {
|
|
38
|
+
margin-bottom: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* ---------- 标题 ---------- */
|
|
42
|
+
|
|
43
|
+
.pactor-markdown h1,
|
|
44
|
+
.pactor-markdown h2,
|
|
45
|
+
.pactor-markdown h3,
|
|
46
|
+
.pactor-markdown h4,
|
|
47
|
+
.pactor-markdown h5,
|
|
48
|
+
.pactor-markdown h6 {
|
|
49
|
+
margin: 1.4em 0 0.6em;
|
|
50
|
+
font-weight: 600;
|
|
51
|
+
line-height: 1.35;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.pactor-markdown h1 {
|
|
55
|
+
font-size: 1.5em;
|
|
56
|
+
padding-bottom: 0.3em;
|
|
57
|
+
border-bottom: 1px solid var(--pactor-markdown-border);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.pactor-markdown h2 {
|
|
61
|
+
font-size: 1.3em;
|
|
62
|
+
padding-bottom: 0.25em;
|
|
63
|
+
border-bottom: 1px solid var(--pactor-markdown-border);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.pactor-markdown h3 {
|
|
67
|
+
font-size: 1.15em;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.pactor-markdown h4 {
|
|
71
|
+
font-size: 1.05em;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.pactor-markdown h5,
|
|
75
|
+
.pactor-markdown h6 {
|
|
76
|
+
font-size: 1em;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.pactor-markdown h6 {
|
|
80
|
+
color: var(--pactor-markdown-muted-fg);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* ---------- 段落与列表 ---------- */
|
|
84
|
+
|
|
85
|
+
.pactor-markdown p {
|
|
86
|
+
margin: 0.75em 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.pactor-markdown ul,
|
|
90
|
+
.pactor-markdown ol {
|
|
91
|
+
margin: 0.75em 0;
|
|
92
|
+
padding-left: 1.6em;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* 显式声明项目符号:宿主带 Tailwind preflight 等 reset(list-style: none)时
|
|
96
|
+
* 依然保持列表语义可读 */
|
|
97
|
+
.pactor-markdown ul {
|
|
98
|
+
list-style: disc;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.pactor-markdown ul ul {
|
|
102
|
+
list-style: circle;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.pactor-markdown ul ul ul {
|
|
106
|
+
list-style: square;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.pactor-markdown ol {
|
|
110
|
+
list-style: decimal;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.pactor-markdown li::marker {
|
|
114
|
+
color: var(--pactor-markdown-muted-fg);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.pactor-markdown li + li {
|
|
118
|
+
margin-top: 0.3em;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.pactor-markdown li > ul,
|
|
122
|
+
.pactor-markdown li > ol {
|
|
123
|
+
margin: 0.3em 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* GFM 任务列表 */
|
|
127
|
+
.pactor-markdown li input[type='checkbox'] {
|
|
128
|
+
margin: 0 0.45em 0 0;
|
|
129
|
+
vertical-align: -0.1em;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.pactor-markdown li:has(> input[type='checkbox']:first-child) {
|
|
133
|
+
list-style: none;
|
|
134
|
+
margin-left: -1.6em;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* ---------- 引用 / 分割线 ---------- */
|
|
138
|
+
|
|
139
|
+
.pactor-markdown blockquote {
|
|
140
|
+
margin: 0.75em 0;
|
|
141
|
+
padding: 0.4em 1em;
|
|
142
|
+
border-left: 3px solid var(--pactor-markdown-quote-border);
|
|
143
|
+
border-radius: 0 var(--pactor-markdown-radius) var(--pactor-markdown-radius) 0;
|
|
144
|
+
background: var(--pactor-markdown-muted-bg);
|
|
145
|
+
color: var(--pactor-markdown-muted-fg);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.pactor-markdown blockquote > :first-child {
|
|
149
|
+
margin-top: 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.pactor-markdown blockquote > :last-child {
|
|
153
|
+
margin-bottom: 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.pactor-markdown hr {
|
|
157
|
+
margin: 1.5em 0;
|
|
158
|
+
border: 0;
|
|
159
|
+
border-top: 1px solid var(--pactor-markdown-border);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* ---------- 链接 / 强调 ---------- */
|
|
163
|
+
|
|
164
|
+
.pactor-markdown a {
|
|
165
|
+
color: var(--pactor-markdown-link);
|
|
166
|
+
text-decoration: none;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.pactor-markdown a:hover {
|
|
170
|
+
text-decoration: underline;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.pactor-markdown strong {
|
|
174
|
+
font-weight: 600;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.pactor-markdown mark {
|
|
178
|
+
padding: 0 0.2em;
|
|
179
|
+
border-radius: 3px;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* ---------- 代码 ---------- */
|
|
183
|
+
|
|
184
|
+
.pactor-markdown code,
|
|
185
|
+
.pactor-markdown pre {
|
|
186
|
+
font-family: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas,
|
|
187
|
+
'Liberation Mono', monospace;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* 行内代码 */
|
|
191
|
+
.pactor-markdown :not(pre) > code {
|
|
192
|
+
padding: 0.15em 0.4em;
|
|
193
|
+
border-radius: 4px;
|
|
194
|
+
background: var(--pactor-markdown-code-bg);
|
|
195
|
+
font-size: 0.875em;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* 围栏代码块(含高亮后的 pre) */
|
|
199
|
+
.pactor-markdown pre {
|
|
200
|
+
margin: 0.85em 0;
|
|
201
|
+
padding: 12px 14px;
|
|
202
|
+
border: 1px solid var(--pactor-markdown-border);
|
|
203
|
+
border-radius: var(--pactor-markdown-radius);
|
|
204
|
+
background: var(--pactor-markdown-muted-bg);
|
|
205
|
+
font-size: 0.875em;
|
|
206
|
+
line-height: 1.6;
|
|
207
|
+
overflow-x: auto;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.pactor-markdown pre > code {
|
|
211
|
+
padding: 0;
|
|
212
|
+
border: 0;
|
|
213
|
+
background: transparent;
|
|
214
|
+
font-size: inherit;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* ---------- 表格(GFM) ---------- */
|
|
218
|
+
|
|
219
|
+
.pactor-markdown table {
|
|
220
|
+
display: block;
|
|
221
|
+
width: max-content;
|
|
222
|
+
max-width: 100%;
|
|
223
|
+
margin: 0.85em 0;
|
|
224
|
+
border-collapse: collapse;
|
|
225
|
+
overflow-x: auto;
|
|
226
|
+
font-size: 0.925em;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.pactor-markdown th,
|
|
230
|
+
.pactor-markdown td {
|
|
231
|
+
padding: 6px 14px;
|
|
232
|
+
border: 1px solid var(--pactor-markdown-border);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.pactor-markdown th {
|
|
236
|
+
background: var(--pactor-markdown-muted-bg);
|
|
237
|
+
font-weight: 600;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.pactor-markdown tr:nth-child(even) td {
|
|
241
|
+
background: var(--pactor-markdown-muted-bg);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ---------- 图片 / 数学公式 ---------- */
|
|
245
|
+
|
|
246
|
+
.pactor-markdown img {
|
|
247
|
+
max-width: 100%;
|
|
248
|
+
border-radius: var(--pactor-markdown-radius);
|
|
249
|
+
box-sizing: border-box;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.pactor-markdown .katex {
|
|
253
|
+
font-size: 1.05em;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.pactor-markdown .katex-display {
|
|
257
|
+
margin: 0.85em 0;
|
|
258
|
+
padding: 4px 0;
|
|
259
|
+
overflow-x: auto;
|
|
260
|
+
overflow-y: hidden;
|
|
261
|
+
}
|