@scribdown/ui-handdrawn 0.2.2 → 0.3.1
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/package.json +5 -1
- package/src/styles/copy-control.css +51 -0
- package/src/styles/fonts.css +3 -0
- package/src/styles/image-viewer.css +9 -58
- package/src/styles/lists.css +1 -2
- package/src/styles/mermaid.css +84 -124
- package/src/styles/table.css +69 -12
- package/src/styles/tokens.css +166 -79
- package/src/styles/toolbar.css +73 -7
- package/src/styles/viewer-controls.css +96 -0
- package/src/styles.css +9 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scribdown/ui-handdrawn",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Scribdown 手绘风格视觉组件:设计 Token、样式与 SVG 资产。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
"typescript": "^5.8.3",
|
|
28
28
|
"vitest": "^3.2.4"
|
|
29
29
|
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@fontsource-variable/noto-serif-sc": "5.3.0",
|
|
32
|
+
"lxgw-wenkai-screen-webfont": "1.7.0"
|
|
33
|
+
},
|
|
30
34
|
"scripts": {
|
|
31
35
|
"test": "vitest run --passWithNoTests",
|
|
32
36
|
"lint": "eslint .",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* Markdown 通用复制按钮:Mermaid 与表格复用同一图标和成功反馈。 */
|
|
2
|
+
.scribdown-copy-button {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
width: 32px;
|
|
7
|
+
height: 32px;
|
|
8
|
+
margin: 0;
|
|
9
|
+
padding: 0;
|
|
10
|
+
border: 0;
|
|
11
|
+
border-radius: 8px 9px 7px 10px;
|
|
12
|
+
background: transparent;
|
|
13
|
+
color: var(--scribdown-color-text-primary);
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
pointer-events: auto;
|
|
16
|
+
transition:
|
|
17
|
+
background var(--scribdown-duration-fast) var(--scribdown-easing-standard),
|
|
18
|
+
transform var(--scribdown-duration-fast) var(--scribdown-easing-standard);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.scribdown-copy-button:hover {
|
|
22
|
+
background: color-mix(in srgb, currentColor 14%, transparent);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.scribdown-copy-button:active {
|
|
26
|
+
transform: translateY(1px);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.scribdown-copy-button:focus-visible {
|
|
30
|
+
outline: 2px solid var(--scribdown-color-accent);
|
|
31
|
+
outline-offset: 2px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.scribdown-copy-button__icon {
|
|
35
|
+
width: 18px;
|
|
36
|
+
height: 18px;
|
|
37
|
+
flex: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.scribdown-copy-button[data-scribdown-copied="true"] .scribdown-copy-button__icon--copy {
|
|
41
|
+
display: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.scribdown-copy-button__icon--check {
|
|
45
|
+
display: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.scribdown-copy-button[data-scribdown-copied="true"] .scribdown-copy-button__icon--check {
|
|
49
|
+
display: inline-block;
|
|
50
|
+
color: var(--scribdown-color-accent);
|
|
51
|
+
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/* ImageViewer:运行时注入的全图查看层,支持按钮和快捷键缩放。 */
|
|
2
2
|
.scribdown-image-viewer {
|
|
3
|
+
/* 与 Mermaid 共用控件样式,仅由宿主决定全屏按钮尺寸。 */
|
|
4
|
+
--scribdown-viewer-control-size: 36px;
|
|
5
|
+
--scribdown-viewer-control-font-size: 16px;
|
|
6
|
+
--scribdown-viewer-zoom-value-min-width: 56px;
|
|
7
|
+
--scribdown-viewer-zoom-value-font-size: 14px;
|
|
8
|
+
|
|
3
9
|
width: 100vw;
|
|
4
10
|
max-width: none;
|
|
5
11
|
height: 100dvh;
|
|
@@ -84,48 +90,6 @@
|
|
|
84
90
|
gap: var(--scribdown-space-2);
|
|
85
91
|
}
|
|
86
92
|
|
|
87
|
-
.scribdown-image-viewer__button {
|
|
88
|
-
display: inline-flex;
|
|
89
|
-
align-items: center;
|
|
90
|
-
justify-content: center;
|
|
91
|
-
width: 36px;
|
|
92
|
-
height: 36px;
|
|
93
|
-
padding: 0;
|
|
94
|
-
border: 1px solid color-mix(in srgb, var(--scribdown-color-border) 72%, transparent);
|
|
95
|
-
border-radius: 8px 10px 9px 11px;
|
|
96
|
-
background: color-mix(
|
|
97
|
-
in srgb,
|
|
98
|
-
var(--scribdown-color-surface) 88%,
|
|
99
|
-
var(--scribdown-color-mark) 12%
|
|
100
|
-
);
|
|
101
|
-
box-shadow: var(--scribdown-shadow-sm);
|
|
102
|
-
color: var(--scribdown-color-text-primary);
|
|
103
|
-
cursor: pointer;
|
|
104
|
-
font-family: var(--scribdown-font-code);
|
|
105
|
-
font-size: 16px;
|
|
106
|
-
font-weight: 700;
|
|
107
|
-
line-height: 1;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.scribdown-image-viewer__button:hover {
|
|
111
|
-
background: color-mix(
|
|
112
|
-
in srgb,
|
|
113
|
-
var(--scribdown-color-surface) 78%,
|
|
114
|
-
var(--scribdown-color-mark) 22%
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.scribdown-image-viewer__button:focus-visible {
|
|
119
|
-
outline: 2px solid var(--scribdown-color-accent);
|
|
120
|
-
outline-offset: 3px;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.scribdown-image-viewer__button:disabled {
|
|
124
|
-
box-shadow: none;
|
|
125
|
-
cursor: default;
|
|
126
|
-
opacity: 0.46;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
93
|
.scribdown-image-viewer__button--close {
|
|
130
94
|
background: color-mix(
|
|
131
95
|
in srgb,
|
|
@@ -134,19 +98,6 @@
|
|
|
134
98
|
);
|
|
135
99
|
}
|
|
136
100
|
|
|
137
|
-
.scribdown-image-viewer__zoom-value {
|
|
138
|
-
display: inline-flex;
|
|
139
|
-
align-items: center;
|
|
140
|
-
justify-content: center;
|
|
141
|
-
min-width: 56px;
|
|
142
|
-
height: 36px;
|
|
143
|
-
color: var(--scribdown-color-text-primary);
|
|
144
|
-
font-family: var(--scribdown-font-code);
|
|
145
|
-
font-size: 14px;
|
|
146
|
-
font-weight: 700;
|
|
147
|
-
line-height: 1;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
101
|
.scribdown-image-viewer__viewport {
|
|
151
102
|
min-width: 0;
|
|
152
103
|
min-height: 0;
|
|
@@ -157,6 +108,7 @@
|
|
|
157
108
|
padding: var(--scribdown-space-5);
|
|
158
109
|
overflow: auto;
|
|
159
110
|
overscroll-behavior: contain;
|
|
111
|
+
scrollbar-gutter: stable both-edges;
|
|
160
112
|
touch-action: none;
|
|
161
113
|
}
|
|
162
114
|
|
|
@@ -197,9 +149,8 @@
|
|
|
197
149
|
width: 100%;
|
|
198
150
|
}
|
|
199
151
|
|
|
200
|
-
.scribdown-image-
|
|
201
|
-
|
|
202
|
-
height: 34px;
|
|
152
|
+
.scribdown-image-viewer {
|
|
153
|
+
--scribdown-viewer-control-size: 34px;
|
|
203
154
|
}
|
|
204
155
|
|
|
205
156
|
.scribdown-image-viewer__hint {
|
package/src/styles/lists.css
CHANGED
|
@@ -39,8 +39,7 @@
|
|
|
39
39
|
left: 0;
|
|
40
40
|
min-width: 26px;
|
|
41
41
|
color: var(--scribdown-color-warning);
|
|
42
|
-
font-family:
|
|
43
|
-
var(--scribdown-font-heading);
|
|
42
|
+
font-family: var(--scribdown-font-heading);
|
|
44
43
|
font-size: 22px;
|
|
45
44
|
font-style: normal;
|
|
46
45
|
font-weight: 700;
|
package/src/styles/mermaid.css
CHANGED
|
@@ -18,8 +18,13 @@
|
|
|
18
18
|
display: flex;
|
|
19
19
|
align-items: center;
|
|
20
20
|
justify-content: space-between;
|
|
21
|
+
gap: var(--scribdown-space-2);
|
|
21
22
|
padding: 6px 12px;
|
|
22
|
-
background: color-mix(
|
|
23
|
+
background: color-mix(
|
|
24
|
+
in srgb,
|
|
25
|
+
var(--scribdown-color-surface) 90%,
|
|
26
|
+
var(--scribdown-color-border) 10%
|
|
27
|
+
);
|
|
23
28
|
border-bottom: 1px dashed color-mix(in srgb, var(--scribdown-color-border) 60%, transparent);
|
|
24
29
|
}
|
|
25
30
|
|
|
@@ -32,11 +37,25 @@
|
|
|
32
37
|
text-transform: uppercase;
|
|
33
38
|
}
|
|
34
39
|
|
|
40
|
+
.scribdown-markdown .scribdown-mermaid__controls {
|
|
41
|
+
display: inline-flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: flex-end;
|
|
44
|
+
gap: 4px;
|
|
45
|
+
min-width: 0;
|
|
46
|
+
overflow-x: auto;
|
|
47
|
+
scrollbar-width: none;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.scribdown-markdown .scribdown-mermaid__controls::-webkit-scrollbar {
|
|
51
|
+
display: none;
|
|
52
|
+
}
|
|
53
|
+
|
|
35
54
|
.scribdown-markdown .scribdown-mermaid__body {
|
|
36
55
|
position: relative;
|
|
37
56
|
display: flex;
|
|
38
|
-
align-items: center;
|
|
39
|
-
justify-content: center;
|
|
57
|
+
align-items: safe center;
|
|
58
|
+
justify-content: safe center;
|
|
40
59
|
/* 给 body 一个确定高度,使内部 canvas 的 height:100% 能解析,
|
|
41
60
|
从而让 SVG 的 max-height:100% 触发等比缩放,避免极端长宽比图表被压成一条。 */
|
|
42
61
|
height: clamp(280px, 50vh, 480px);
|
|
@@ -48,70 +67,48 @@
|
|
|
48
67
|
background-size:
|
|
49
68
|
32px 29px,
|
|
50
69
|
auto;
|
|
70
|
+
overflow: auto;
|
|
71
|
+
/* 图表无可滚动空间或已经到达边界时,继续把滚轮交给外层正文滚动容器。 */
|
|
72
|
+
overscroll-behavior: auto;
|
|
73
|
+
scrollbar-gutter: stable both-edges;
|
|
51
74
|
}
|
|
52
75
|
|
|
53
|
-
/*
|
|
76
|
+
/* 全屏按钮沿用工具按钮尺寸,图标跟随 currentColor。 */
|
|
54
77
|
.scribdown-markdown .scribdown-mermaid__fullscreen {
|
|
55
|
-
|
|
56
|
-
right: 12px;
|
|
57
|
-
bottom: 12px;
|
|
58
|
-
z-index: 3;
|
|
59
|
-
display: inline-flex;
|
|
60
|
-
align-items: center;
|
|
61
|
-
justify-content: center;
|
|
62
|
-
width: 32px;
|
|
63
|
-
height: 32px;
|
|
64
|
-
padding: 0;
|
|
65
|
-
border: 1px solid color-mix(in srgb, var(--scribdown-color-border) 70%, transparent);
|
|
66
|
-
border-radius: 8px 10px 9px 11px;
|
|
67
|
-
background: color-mix(in srgb, var(--scribdown-color-surface) 92%, transparent);
|
|
68
|
-
color: var(--scribdown-color-text-primary);
|
|
69
|
-
cursor: pointer;
|
|
70
|
-
box-shadow: 0 2px 0 color-mix(in srgb, var(--scribdown-color-border) 40%, transparent);
|
|
71
|
-
opacity: 0.75;
|
|
72
|
-
transition:
|
|
73
|
-
opacity 120ms ease,
|
|
74
|
-
transform 120ms ease;
|
|
78
|
+
opacity: 0.82;
|
|
75
79
|
}
|
|
76
80
|
|
|
77
|
-
.scribdown-markdown .scribdown-mermaid__fullscreen
|
|
78
|
-
|
|
79
|
-
transform: translateY(-1px);
|
|
80
|
-
background: color-mix(in srgb, var(--scribdown-color-surface) 80%, var(--scribdown-color-mark) 20%);
|
|
81
|
+
.scribdown-markdown .scribdown-mermaid__fullscreen svg {
|
|
82
|
+
display: block;
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
.scribdown-markdown .scribdown-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
.scribdown-markdown .scribdown-mermaid__canvas {
|
|
86
|
+
display: block;
|
|
87
|
+
flex: 0 0 auto;
|
|
88
|
+
user-select: text;
|
|
86
89
|
}
|
|
87
90
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
/* SVG 尺寸由运行时 canvas 统一控制,选择模式下保留文本选择能力。 */
|
|
92
|
+
.scribdown-markdown .scribdown-mermaid__canvas svg {
|
|
93
|
+
display: block;
|
|
94
|
+
width: 100%;
|
|
95
|
+
height: 100%;
|
|
96
|
+
max-width: none;
|
|
97
|
+
max-height: none;
|
|
92
98
|
}
|
|
93
99
|
|
|
94
|
-
.scribdown-markdown .scribdown-
|
|
95
|
-
|
|
100
|
+
.scribdown-markdown .scribdown-mermaid--drag-mode .scribdown-mermaid__body {
|
|
101
|
+
cursor: grab;
|
|
102
|
+
touch-action: none;
|
|
103
|
+
user-select: none;
|
|
96
104
|
}
|
|
97
105
|
|
|
98
|
-
.scribdown-markdown .scribdown-
|
|
99
|
-
|
|
100
|
-
align-items: center;
|
|
101
|
-
justify-content: center;
|
|
102
|
-
width: 100%;
|
|
103
|
-
height: 100%;
|
|
104
|
-
overflow: hidden;
|
|
106
|
+
.scribdown-markdown .scribdown-mermaid--dragging .scribdown-mermaid__body {
|
|
107
|
+
cursor: grabbing;
|
|
105
108
|
}
|
|
106
109
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
.scribdown-markdown .scribdown-mermaid__canvas svg {
|
|
110
|
-
display: block;
|
|
111
|
-
width: auto;
|
|
112
|
-
height: auto;
|
|
113
|
-
max-width: 100%;
|
|
114
|
-
max-height: 100%;
|
|
110
|
+
.scribdown-markdown .scribdown-mermaid--dragging .scribdown-mermaid__canvas {
|
|
111
|
+
pointer-events: none;
|
|
115
112
|
}
|
|
116
113
|
|
|
117
114
|
/* Loading 态:画布尚未填充 SVG 时的占位脉冲。 */
|
|
@@ -119,14 +116,13 @@
|
|
|
119
116
|
width: 100%;
|
|
120
117
|
min-height: 180px;
|
|
121
118
|
border-radius: 6px;
|
|
122
|
-
background:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
);
|
|
119
|
+
background: repeating-linear-gradient(
|
|
120
|
+
45deg,
|
|
121
|
+
color-mix(in srgb, var(--scribdown-color-border) 22%, transparent),
|
|
122
|
+
color-mix(in srgb, var(--scribdown-color-border) 22%, transparent) 8px,
|
|
123
|
+
transparent 8px,
|
|
124
|
+
transparent 16px
|
|
125
|
+
);
|
|
130
126
|
opacity: 0.6;
|
|
131
127
|
animation: scribdown-mermaid-loading 1.6s linear infinite;
|
|
132
128
|
}
|
|
@@ -165,7 +161,11 @@
|
|
|
165
161
|
width: 52px;
|
|
166
162
|
height: 52px;
|
|
167
163
|
border: 2px solid var(--scribdown-color-text-primary);
|
|
168
|
-
background: color-mix(
|
|
164
|
+
background: color-mix(
|
|
165
|
+
in srgb,
|
|
166
|
+
var(--scribdown-color-surface) 80%,
|
|
167
|
+
var(--scribdown-color-warning) 12%
|
|
168
|
+
);
|
|
169
169
|
transform: rotate(-2deg);
|
|
170
170
|
}
|
|
171
171
|
|
|
@@ -203,7 +203,11 @@
|
|
|
203
203
|
max-width: 100%;
|
|
204
204
|
margin: 0;
|
|
205
205
|
padding: 8px 12px;
|
|
206
|
-
background: color-mix(
|
|
206
|
+
background: color-mix(
|
|
207
|
+
in srgb,
|
|
208
|
+
var(--scribdown-color-surface) 86%,
|
|
209
|
+
var(--scribdown-color-border) 14%
|
|
210
|
+
);
|
|
207
211
|
border-radius: 6px;
|
|
208
212
|
color: var(--scribdown-color-text-secondary);
|
|
209
213
|
font-family: var(--scribdown-font-code);
|
|
@@ -216,6 +220,12 @@
|
|
|
216
220
|
|
|
217
221
|
/* MermaidViewer:mermaid 全屏查看器,与图片查看器并列,整体风格保持一致。 */
|
|
218
222
|
.scribdown-mermaid-viewer {
|
|
223
|
+
/* 与行内 Mermaid 共用控件样式,仅通过变量放大全屏触控尺寸。 */
|
|
224
|
+
--scribdown-viewer-control-size: 36px;
|
|
225
|
+
--scribdown-viewer-control-font-size: 16px;
|
|
226
|
+
--scribdown-viewer-zoom-value-min-width: 56px;
|
|
227
|
+
--scribdown-viewer-zoom-value-font-size: 14px;
|
|
228
|
+
|
|
219
229
|
width: 100vw;
|
|
220
230
|
max-width: none;
|
|
221
231
|
height: 100dvh;
|
|
@@ -284,48 +294,6 @@
|
|
|
284
294
|
gap: var(--scribdown-space-2);
|
|
285
295
|
}
|
|
286
296
|
|
|
287
|
-
.scribdown-mermaid-viewer__button {
|
|
288
|
-
display: inline-flex;
|
|
289
|
-
align-items: center;
|
|
290
|
-
justify-content: center;
|
|
291
|
-
width: 36px;
|
|
292
|
-
height: 36px;
|
|
293
|
-
padding: 0;
|
|
294
|
-
border: 1px solid color-mix(in srgb, var(--scribdown-color-border) 72%, transparent);
|
|
295
|
-
border-radius: 8px 10px 9px 11px;
|
|
296
|
-
background: color-mix(
|
|
297
|
-
in srgb,
|
|
298
|
-
var(--scribdown-color-surface) 88%,
|
|
299
|
-
var(--scribdown-color-mark) 12%
|
|
300
|
-
);
|
|
301
|
-
box-shadow: var(--scribdown-shadow-sm);
|
|
302
|
-
color: var(--scribdown-color-text-primary);
|
|
303
|
-
cursor: pointer;
|
|
304
|
-
font-family: var(--scribdown-font-code);
|
|
305
|
-
font-size: 16px;
|
|
306
|
-
font-weight: 700;
|
|
307
|
-
line-height: 1;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
.scribdown-mermaid-viewer__button:hover {
|
|
311
|
-
background: color-mix(
|
|
312
|
-
in srgb,
|
|
313
|
-
var(--scribdown-color-surface) 78%,
|
|
314
|
-
var(--scribdown-color-mark) 22%
|
|
315
|
-
);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
.scribdown-mermaid-viewer__button:focus-visible {
|
|
319
|
-
outline: 2px solid var(--scribdown-color-accent);
|
|
320
|
-
outline-offset: 3px;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
.scribdown-mermaid-viewer__button:disabled {
|
|
324
|
-
box-shadow: none;
|
|
325
|
-
cursor: default;
|
|
326
|
-
opacity: 0.46;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
297
|
.scribdown-mermaid-viewer__button--close {
|
|
330
298
|
background: color-mix(
|
|
331
299
|
in srgb,
|
|
@@ -334,19 +302,6 @@
|
|
|
334
302
|
);
|
|
335
303
|
}
|
|
336
304
|
|
|
337
|
-
.scribdown-mermaid-viewer__zoom-value {
|
|
338
|
-
display: inline-flex;
|
|
339
|
-
align-items: center;
|
|
340
|
-
justify-content: center;
|
|
341
|
-
min-width: 56px;
|
|
342
|
-
height: 36px;
|
|
343
|
-
color: var(--scribdown-color-text-primary);
|
|
344
|
-
font-family: var(--scribdown-font-code);
|
|
345
|
-
font-size: 14px;
|
|
346
|
-
font-weight: 700;
|
|
347
|
-
line-height: 1;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
305
|
.scribdown-mermaid-viewer__viewport {
|
|
351
306
|
min-width: 0;
|
|
352
307
|
min-height: 0;
|
|
@@ -356,17 +311,19 @@
|
|
|
356
311
|
padding: var(--scribdown-space-5);
|
|
357
312
|
overflow: auto;
|
|
358
313
|
overscroll-behavior: contain;
|
|
359
|
-
|
|
314
|
+
scrollbar-gutter: stable both-edges;
|
|
315
|
+
touch-action: auto;
|
|
360
316
|
}
|
|
361
317
|
|
|
362
|
-
.scribdown-mermaid-viewer--
|
|
318
|
+
.scribdown-mermaid-viewer--drag-mode .scribdown-mermaid-viewer__viewport {
|
|
363
319
|
cursor: grab;
|
|
320
|
+
touch-action: none;
|
|
321
|
+
user-select: none;
|
|
364
322
|
}
|
|
365
323
|
|
|
366
|
-
.scribdown-mermaid-viewer--
|
|
324
|
+
.scribdown-mermaid-viewer--drag-mode.scribdown-mermaid-viewer--dragging
|
|
367
325
|
.scribdown-mermaid-viewer__viewport {
|
|
368
326
|
cursor: grabbing;
|
|
369
|
-
user-select: none;
|
|
370
327
|
}
|
|
371
328
|
|
|
372
329
|
.scribdown-mermaid-viewer__canvas {
|
|
@@ -375,6 +332,10 @@
|
|
|
375
332
|
background: var(--scribdown-color-surface);
|
|
376
333
|
border-radius: 6px 7px 5px 6px;
|
|
377
334
|
box-shadow: 6px 8px 0 color-mix(in srgb, var(--scribdown-color-text-primary) 26%, transparent);
|
|
335
|
+
user-select: text;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.scribdown-mermaid-viewer--drag-mode .scribdown-mermaid-viewer__canvas {
|
|
378
339
|
user-select: none;
|
|
379
340
|
}
|
|
380
341
|
|
|
@@ -394,9 +355,8 @@
|
|
|
394
355
|
width: 100%;
|
|
395
356
|
}
|
|
396
357
|
|
|
397
|
-
.scribdown-mermaid-
|
|
398
|
-
|
|
399
|
-
height: 34px;
|
|
358
|
+
.scribdown-mermaid-viewer {
|
|
359
|
+
--scribdown-viewer-control-size: 34px;
|
|
400
360
|
}
|
|
401
361
|
|
|
402
362
|
.scribdown-mermaid-viewer__viewport {
|
package/src/styles/table.css
CHANGED
|
@@ -54,6 +54,69 @@
|
|
|
54
54
|
box-shadow: none;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
/* 表格交互壳层:复制按钮固定在右上角,不随表格横向滚动。 */
|
|
58
|
+
.scribdown-markdown .scribdown-table {
|
|
59
|
+
--scribdown-table-ink-token: var(--scribdown-color-accent);
|
|
60
|
+
position: relative;
|
|
61
|
+
width: max-content;
|
|
62
|
+
max-width: 100%;
|
|
63
|
+
margin: 0 0 var(--scribdown-space-3);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.scribdown-markdown .scribdown-table > table {
|
|
67
|
+
margin: 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* 为右上角复制按钮预留首行末列空间,避免遮住表头内容。 */
|
|
71
|
+
.scribdown-markdown
|
|
72
|
+
.scribdown-table
|
|
73
|
+
> table
|
|
74
|
+
> :is(thead, tbody, tfoot)
|
|
75
|
+
> tr:first-child
|
|
76
|
+
> *:last-child,
|
|
77
|
+
.scribdown-markdown .scribdown-table > table > tr:first-child > *:last-child {
|
|
78
|
+
padding-right: 52px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.scribdown-markdown .scribdown-table__copy {
|
|
82
|
+
position: absolute;
|
|
83
|
+
z-index: 4;
|
|
84
|
+
top: 7px;
|
|
85
|
+
right: 8px;
|
|
86
|
+
opacity: 0;
|
|
87
|
+
background: color-mix(in srgb, var(--scribdown-color-surface) 88%, transparent);
|
|
88
|
+
box-shadow: 0 1px 0 color-mix(in srgb, var(--scribdown-table-ink-token) 34%, transparent);
|
|
89
|
+
color: var(--scribdown-table-ink-token);
|
|
90
|
+
pointer-events: none;
|
|
91
|
+
transition:
|
|
92
|
+
opacity var(--scribdown-duration-fast) var(--scribdown-easing-standard),
|
|
93
|
+
background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* 鼠标进入表格或键盘焦点进入壳层时展示;复制反馈期间保持可见。 */
|
|
97
|
+
.scribdown-markdown .scribdown-table:hover > .scribdown-table__copy,
|
|
98
|
+
.scribdown-markdown .scribdown-table:focus-within > .scribdown-table__copy,
|
|
99
|
+
.scribdown-markdown .scribdown-table > .scribdown-table__copy[data-scribdown-copied="true"] {
|
|
100
|
+
opacity: 1;
|
|
101
|
+
pointer-events: auto;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.scribdown-markdown .scribdown-table__copy:hover {
|
|
105
|
+
background: color-mix(
|
|
106
|
+
in srgb,
|
|
107
|
+
var(--scribdown-color-surface) 72%,
|
|
108
|
+
var(--scribdown-table-ink-token) 16%
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* 无 hover 能力的触屏设备始终展示入口,避免复制能力不可发现。 */
|
|
113
|
+
@media (hover: none) {
|
|
114
|
+
.scribdown-markdown .scribdown-table__copy {
|
|
115
|
+
opacity: 1;
|
|
116
|
+
pointer-events: auto;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
57
120
|
/* 关键步骤:表格外框复用代码块同款边条结构。 */
|
|
58
121
|
.scribdown-markdown table::after {
|
|
59
122
|
content: "";
|
|
@@ -72,10 +135,8 @@
|
|
|
72
135
|
right -1px top 0px;
|
|
73
136
|
background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
|
|
74
137
|
background-size:
|
|
75
|
-
var(--scribdown-table-border-tile-horizontal),
|
|
76
|
-
var(--scribdown-table-border-tile-
|
|
77
|
-
var(--scribdown-table-border-tile-vertical),
|
|
78
|
-
var(--scribdown-table-border-tile-vertical);
|
|
138
|
+
var(--scribdown-table-border-tile-horizontal), var(--scribdown-table-border-tile-horizontal),
|
|
139
|
+
var(--scribdown-table-border-tile-vertical), var(--scribdown-table-border-tile-vertical);
|
|
79
140
|
}
|
|
80
141
|
|
|
81
142
|
.scribdown-markdown th,
|
|
@@ -228,10 +289,8 @@
|
|
|
228
289
|
right top;
|
|
229
290
|
-webkit-mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
|
|
230
291
|
-webkit-mask-size:
|
|
231
|
-
var(--scribdown-table-border-tile-horizontal),
|
|
232
|
-
var(--scribdown-table-border-tile-
|
|
233
|
-
var(--scribdown-table-border-tile-vertical),
|
|
234
|
-
var(--scribdown-table-border-tile-vertical);
|
|
292
|
+
var(--scribdown-table-border-tile-horizontal), var(--scribdown-table-border-tile-horizontal),
|
|
293
|
+
var(--scribdown-table-border-tile-vertical), var(--scribdown-table-border-tile-vertical);
|
|
235
294
|
-webkit-mask-mode: alpha, alpha, alpha, alpha;
|
|
236
295
|
mask-image:
|
|
237
296
|
var(--scribdown-rough-line-shadow-horizontal), var(--scribdown-rough-line-shadow-horizontal),
|
|
@@ -243,10 +302,8 @@
|
|
|
243
302
|
right -1px top 0px;
|
|
244
303
|
mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
|
|
245
304
|
mask-size:
|
|
246
|
-
var(--scribdown-table-border-tile-horizontal),
|
|
247
|
-
var(--scribdown-table-border-tile-
|
|
248
|
-
var(--scribdown-table-border-tile-vertical),
|
|
249
|
-
var(--scribdown-table-border-tile-vertical);
|
|
305
|
+
var(--scribdown-table-border-tile-horizontal), var(--scribdown-table-border-tile-horizontal),
|
|
306
|
+
var(--scribdown-table-border-tile-vertical), var(--scribdown-table-border-tile-vertical);
|
|
250
307
|
mask-mode: alpha, alpha, alpha, alpha;
|
|
251
308
|
}
|
|
252
309
|
}
|
package/src/styles/tokens.css
CHANGED
|
@@ -1,62 +1,128 @@
|
|
|
1
|
-
/* ───
|
|
2
|
-
|
|
1
|
+
/* ─── 调色板原始值 ─────────────────────────────────────────────────
|
|
2
|
+
浅色与暗色两套色值在此各定义一次,下方的「语义 Token」只做 var() 映射。
|
|
3
|
+
宿主切换主题时不会出现色值副本,改一处即两套主题同步生效。
|
|
4
|
+
|
|
5
|
+
浅色主题:参考素描本米白纸张与水彩颜料色相。
|
|
3
6
|
长时间阅读偏好:暖色偏移降低蓝光眩光、文字采用深沉柏木色而非纯黑、
|
|
4
|
-
重点色保持低饱和的"褪色颜料"质感、纸面与卡面亮度差拉开以便内容浮起。
|
|
7
|
+
重点色保持低饱和的"褪色颜料"质感、纸面与卡面亮度差拉开以便内容浮起。
|
|
8
|
+
|
|
9
|
+
暗色主题:"夜读台灯下的旧纸册":
|
|
10
|
+
纸面为接近黑的暖褐底,墨色反相为米白;颜料色以"粉笔/水彩"的提亮版本出现,
|
|
11
|
+
保持与浅色主题一致的色相与语义。
|
|
12
|
+
|
|
13
|
+
注:blockquote 系列是从其他 Token 派生的 color-mix 结果,两套主题的配比不同,
|
|
14
|
+
故同样分别定义;它们在被引用的那个映射块里求值,取到的必然是同主题的基准色。 */
|
|
5
15
|
:root {
|
|
6
16
|
/* 暖米纸:略冷于旧版的牛皮黄,减轻长时间阅读的"陈旧报纸"感。 */
|
|
7
|
-
--scribdown-
|
|
17
|
+
--scribdown-palette-light-bg: #ebe1c8;
|
|
8
18
|
/* 内容纸面:进一步提亮但保持暖调,与底色形成清晰层次。 */
|
|
9
|
-
--scribdown-
|
|
19
|
+
--scribdown-palette-light-surface: #f8f0db;
|
|
10
20
|
/* 主文字:深胡桃色沉淀墨,对比 surface ≈12:1,足够锐利又不刺眼。 */
|
|
11
|
-
--scribdown-
|
|
21
|
+
--scribdown-palette-light-text-primary: #2f2620;
|
|
12
22
|
/* 次文字:泛黄旧墨色。 */
|
|
13
|
-
--scribdown-
|
|
23
|
+
--scribdown-palette-light-text-secondary: #786758;
|
|
14
24
|
/* 主题色:松林青苔——明度居中、与文字蓝相区分。 */
|
|
15
|
-
--scribdown-
|
|
25
|
+
--scribdown-palette-light-accent: #436b5b;
|
|
16
26
|
/* 链接色:靛青水墨蓝,去掉过往略带紫感的偏色。 */
|
|
17
|
-
--scribdown-
|
|
27
|
+
--scribdown-palette-light-link: #355a7d;
|
|
18
28
|
/* 已访问链接:晾干后的紫罗兰,色相比未访问偏暖。 */
|
|
19
|
-
--scribdown-
|
|
29
|
+
--scribdown-palette-light-link-visited: #6a527b;
|
|
20
30
|
/* 高亮笔色:姜黄荧光,保留涂抹的颜料质地。 */
|
|
21
|
-
--scribdown-
|
|
31
|
+
--scribdown-palette-light-mark: #d7ab48;
|
|
22
32
|
/* 边线:铅笔石墨与纸张混合后的暖灰。 */
|
|
23
|
-
--scribdown-
|
|
33
|
+
--scribdown-palette-light-border: #c5ad8a;
|
|
24
34
|
/* 危险色:陶土红,去除生硬的猩红,落在书法朱砂。 */
|
|
25
|
-
--scribdown-
|
|
35
|
+
--scribdown-palette-light-danger: #a8504a;
|
|
26
36
|
/* 警告色:烧赭石。 */
|
|
27
|
-
--scribdown-
|
|
37
|
+
--scribdown-palette-light-warning: #8d6432;
|
|
28
38
|
/* 代码块墨色:板岩紫,与正文棕色明显区分但不抢眼。 */
|
|
29
|
-
--scribdown-
|
|
30
|
-
--scribdown-
|
|
39
|
+
--scribdown-palette-light-code-ink: #5e5483;
|
|
40
|
+
--scribdown-palette-light-blockquote-bg: color-mix(
|
|
31
41
|
in srgb,
|
|
32
42
|
var(--scribdown-color-border) 18%,
|
|
33
43
|
var(--scribdown-color-surface)
|
|
34
44
|
);
|
|
35
|
-
--scribdown-
|
|
45
|
+
--scribdown-palette-light-blockquote-text: color-mix(
|
|
36
46
|
in srgb,
|
|
37
47
|
var(--scribdown-color-text-secondary) 88%,
|
|
38
48
|
var(--scribdown-color-surface)
|
|
39
49
|
);
|
|
40
|
-
--scribdown-
|
|
50
|
+
--scribdown-palette-light-blockquote-link: color-mix(
|
|
41
51
|
in srgb,
|
|
42
52
|
var(--scribdown-color-link) 86%,
|
|
43
53
|
var(--scribdown-color-text-primary)
|
|
44
54
|
);
|
|
45
|
-
--scribdown-
|
|
55
|
+
--scribdown-palette-light-blockquote-link-visited: color-mix(
|
|
46
56
|
in srgb,
|
|
47
57
|
var(--scribdown-color-link-visited) 86%,
|
|
48
58
|
var(--scribdown-color-text-primary)
|
|
49
59
|
);
|
|
50
60
|
/* 纸面颗粒:低饱和的褐色噪点,呼应"米黄毛边纸"。 */
|
|
51
|
-
--scribdown-paper-grain: rgba(132, 96, 44, 0.10);
|
|
61
|
+
--scribdown-palette-light-paper-grain: rgba(132, 96, 44, 0.10);
|
|
52
62
|
/* 纸面纤维:浅青苔色丝纹,与 accent 同源。 */
|
|
53
|
-
--scribdown-paper-fiber: rgba(67, 107, 91, 0.06);
|
|
63
|
+
--scribdown-palette-light-paper-fiber: rgba(67, 107, 91, 0.06);
|
|
54
64
|
/* 偏移阴影:保留手绘的"墨晕"感,避免过黑。 */
|
|
55
|
-
--scribdown-shadow-sm: 2px 3px 0 rgba(47, 38, 32, 0.13);
|
|
56
|
-
--scribdown-shadow-md: 4px 6px 0 rgba(47, 38, 32, 0.18);
|
|
65
|
+
--scribdown-palette-light-shadow-sm: 2px 3px 0 rgba(47, 38, 32, 0.13);
|
|
66
|
+
--scribdown-palette-light-shadow-md: 4px 6px 0 rgba(47, 38, 32, 0.18);
|
|
57
67
|
|
|
58
|
-
|
|
59
|
-
--scribdown-
|
|
68
|
+
/* 夜间纸面底:暖褐近黑,避免冷调灰带来的"屏幕感"。 */
|
|
69
|
+
--scribdown-palette-dark-bg: #1e1915;
|
|
70
|
+
/* 卡面:底色之上 +6% 明度,让代码块/引用清晰浮起。 */
|
|
71
|
+
--scribdown-palette-dark-surface: #2a241f;
|
|
72
|
+
/* 主文字:温润米白粉笔。 */
|
|
73
|
+
--scribdown-palette-dark-text-primary: #ebdfcc;
|
|
74
|
+
/* 次文字:旧字迹褪色。 */
|
|
75
|
+
--scribdown-palette-dark-text-secondary: #ae9b85;
|
|
76
|
+
/* 主题色:粉笔薄荷青,亮度提到暗底易读区间。 */
|
|
77
|
+
--scribdown-palette-dark-accent: #7ebbab;
|
|
78
|
+
/* 链接色:粉笔水蓝。 */
|
|
79
|
+
--scribdown-palette-dark-link: #94b8de;
|
|
80
|
+
/* 已访问链接:粉笔薰衣草。 */
|
|
81
|
+
--scribdown-palette-dark-link-visited: #b39bcd;
|
|
82
|
+
/* 高亮色:暖琥珀粉笔。 */
|
|
83
|
+
--scribdown-palette-dark-mark: #d3aa57;
|
|
84
|
+
/* 边线:暗青铜,与底色同色相一脉。 */
|
|
85
|
+
--scribdown-palette-dark-border: #5a4a39;
|
|
86
|
+
/* 危险色:暗红粉笔。 */
|
|
87
|
+
--scribdown-palette-dark-danger: #db847a;
|
|
88
|
+
/* 警告色:黄铜粉笔。 */
|
|
89
|
+
--scribdown-palette-dark-warning: #d3a45f;
|
|
90
|
+
/* 代码块墨色:紫罗兰粉笔。 */
|
|
91
|
+
--scribdown-palette-dark-code-ink: #beacdc;
|
|
92
|
+
--scribdown-palette-dark-blockquote-bg: color-mix(
|
|
93
|
+
in srgb,
|
|
94
|
+
var(--scribdown-color-border) 28%,
|
|
95
|
+
var(--scribdown-color-surface)
|
|
96
|
+
);
|
|
97
|
+
--scribdown-palette-dark-blockquote-text: color-mix(
|
|
98
|
+
in srgb,
|
|
99
|
+
var(--scribdown-color-text-secondary) 90%,
|
|
100
|
+
var(--scribdown-color-bg)
|
|
101
|
+
);
|
|
102
|
+
--scribdown-palette-dark-blockquote-link: color-mix(
|
|
103
|
+
in srgb,
|
|
104
|
+
var(--scribdown-color-link) 88%,
|
|
105
|
+
var(--scribdown-color-text-primary)
|
|
106
|
+
);
|
|
107
|
+
--scribdown-palette-dark-blockquote-link-visited: color-mix(
|
|
108
|
+
in srgb,
|
|
109
|
+
var(--scribdown-color-link-visited) 88%,
|
|
110
|
+
var(--scribdown-color-text-primary)
|
|
111
|
+
);
|
|
112
|
+
/* 夜间纸面颗粒:暖琥珀微噪。 */
|
|
113
|
+
--scribdown-palette-dark-paper-grain: rgba(211, 170, 87, 0.10);
|
|
114
|
+
/* 夜间纸面纤维:薄荷青丝纹。 */
|
|
115
|
+
--scribdown-palette-dark-paper-fiber: rgba(126, 187, 171, 0.07);
|
|
116
|
+
/* 阴影更深以拉开层次。 */
|
|
117
|
+
--scribdown-palette-dark-shadow-sm: 2px 3px 0 rgba(0, 0, 0, 0.36);
|
|
118
|
+
--scribdown-palette-dark-shadow-md: 4px 6px 0 rgba(0, 0, 0, 0.48);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* ─── 与主题无关的 Token ──────────────────────────────────────────── */
|
|
122
|
+
:root {
|
|
123
|
+
/* 字体由 styles.css 本地加载;同一字体覆盖中英文,避免逐字符回退造成视觉基线错位。 */
|
|
124
|
+
--scribdown-font-body: "Noto Serif SC Variable", "Songti SC", serif;
|
|
125
|
+
--scribdown-font-heading: "LXGW WenKai Screen", "Kaiti SC", serif;
|
|
60
126
|
--scribdown-font-code: "JetBrains Mono", "Fira Code", monospace;
|
|
61
127
|
|
|
62
128
|
/* 四角独立写法,呼应手绘感 */
|
|
@@ -80,61 +146,82 @@
|
|
|
80
146
|
--scribdown-toc-toggle-icon: url("../assets/toc-branch-toggle.svg");
|
|
81
147
|
}
|
|
82
148
|
|
|
83
|
-
/*
|
|
84
|
-
|
|
85
|
-
|
|
149
|
+
/* ─── 语义 Token ← 浅色 ────────────────────────────────────────────
|
|
150
|
+
默认主题。宿主给根元素显式加 .scribdown-theme-light 时,
|
|
151
|
+
该选择器的更高优先级会盖过下方「跟随系统」的暗色映射,实现强制浅色。 */
|
|
152
|
+
:root,
|
|
153
|
+
:root.scribdown-theme-light {
|
|
154
|
+
--scribdown-color-bg: var(--scribdown-palette-light-bg);
|
|
155
|
+
--scribdown-color-surface: var(--scribdown-palette-light-surface);
|
|
156
|
+
--scribdown-color-text-primary: var(--scribdown-palette-light-text-primary);
|
|
157
|
+
--scribdown-color-text-secondary: var(--scribdown-palette-light-text-secondary);
|
|
158
|
+
--scribdown-color-accent: var(--scribdown-palette-light-accent);
|
|
159
|
+
--scribdown-color-link: var(--scribdown-palette-light-link);
|
|
160
|
+
--scribdown-color-link-visited: var(--scribdown-palette-light-link-visited);
|
|
161
|
+
--scribdown-color-mark: var(--scribdown-palette-light-mark);
|
|
162
|
+
--scribdown-color-border: var(--scribdown-palette-light-border);
|
|
163
|
+
--scribdown-color-danger: var(--scribdown-palette-light-danger);
|
|
164
|
+
--scribdown-color-warning: var(--scribdown-palette-light-warning);
|
|
165
|
+
--scribdown-color-code-ink: var(--scribdown-palette-light-code-ink);
|
|
166
|
+
--scribdown-color-blockquote-bg: var(--scribdown-palette-light-blockquote-bg);
|
|
167
|
+
--scribdown-color-blockquote-text: var(--scribdown-palette-light-blockquote-text);
|
|
168
|
+
--scribdown-color-blockquote-link: var(--scribdown-palette-light-blockquote-link);
|
|
169
|
+
--scribdown-color-blockquote-link-visited: var(--scribdown-palette-light-blockquote-link-visited);
|
|
170
|
+
--scribdown-paper-grain: var(--scribdown-palette-light-paper-grain);
|
|
171
|
+
--scribdown-paper-fiber: var(--scribdown-palette-light-paper-fiber);
|
|
172
|
+
--scribdown-shadow-sm: var(--scribdown-palette-light-shadow-sm);
|
|
173
|
+
--scribdown-shadow-md: var(--scribdown-palette-light-shadow-md);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* ─── 语义 Token ← 暗色(跟随系统偏好)───────────────────────────── */
|
|
86
177
|
@media (prefers-color-scheme: dark) {
|
|
87
178
|
:root {
|
|
88
|
-
|
|
89
|
-
--scribdown-color-
|
|
90
|
-
|
|
91
|
-
--scribdown-color-
|
|
92
|
-
|
|
93
|
-
--scribdown-color-
|
|
94
|
-
|
|
95
|
-
--scribdown-color-
|
|
96
|
-
|
|
97
|
-
--scribdown-color-
|
|
98
|
-
|
|
99
|
-
--scribdown-color-
|
|
100
|
-
|
|
101
|
-
--scribdown-color-
|
|
102
|
-
|
|
103
|
-
--scribdown-color-
|
|
104
|
-
|
|
105
|
-
--scribdown-
|
|
106
|
-
|
|
107
|
-
--scribdown-
|
|
108
|
-
/* 警告色:黄铜粉笔。 */
|
|
109
|
-
--scribdown-color-warning: #d3a45f;
|
|
110
|
-
/* 代码块墨色:紫罗兰粉笔。 */
|
|
111
|
-
--scribdown-color-code-ink: #beacdc;
|
|
112
|
-
--scribdown-color-blockquote-bg: color-mix(
|
|
113
|
-
in srgb,
|
|
114
|
-
var(--scribdown-color-border) 28%,
|
|
115
|
-
var(--scribdown-color-surface)
|
|
116
|
-
);
|
|
117
|
-
--scribdown-color-blockquote-text: color-mix(
|
|
118
|
-
in srgb,
|
|
119
|
-
var(--scribdown-color-text-secondary) 90%,
|
|
120
|
-
var(--scribdown-color-bg)
|
|
121
|
-
);
|
|
122
|
-
--scribdown-color-blockquote-link: color-mix(
|
|
123
|
-
in srgb,
|
|
124
|
-
var(--scribdown-color-link) 88%,
|
|
125
|
-
var(--scribdown-color-text-primary)
|
|
126
|
-
);
|
|
127
|
-
--scribdown-color-blockquote-link-visited: color-mix(
|
|
128
|
-
in srgb,
|
|
129
|
-
var(--scribdown-color-link-visited) 88%,
|
|
130
|
-
var(--scribdown-color-text-primary)
|
|
131
|
-
);
|
|
132
|
-
/* 夜间纸面颗粒:暖琥珀微噪。 */
|
|
133
|
-
--scribdown-paper-grain: rgba(211, 170, 87, 0.10);
|
|
134
|
-
/* 夜间纸面纤维:薄荷青丝纹。 */
|
|
135
|
-
--scribdown-paper-fiber: rgba(126, 187, 171, 0.07);
|
|
136
|
-
/* 阴影更深以拉开层次。 */
|
|
137
|
-
--scribdown-shadow-sm: 2px 3px 0 rgba(0, 0, 0, 0.36);
|
|
138
|
-
--scribdown-shadow-md: 4px 6px 0 rgba(0, 0, 0, 0.48);
|
|
179
|
+
--scribdown-color-bg: var(--scribdown-palette-dark-bg);
|
|
180
|
+
--scribdown-color-surface: var(--scribdown-palette-dark-surface);
|
|
181
|
+
--scribdown-color-text-primary: var(--scribdown-palette-dark-text-primary);
|
|
182
|
+
--scribdown-color-text-secondary: var(--scribdown-palette-dark-text-secondary);
|
|
183
|
+
--scribdown-color-accent: var(--scribdown-palette-dark-accent);
|
|
184
|
+
--scribdown-color-link: var(--scribdown-palette-dark-link);
|
|
185
|
+
--scribdown-color-link-visited: var(--scribdown-palette-dark-link-visited);
|
|
186
|
+
--scribdown-color-mark: var(--scribdown-palette-dark-mark);
|
|
187
|
+
--scribdown-color-border: var(--scribdown-palette-dark-border);
|
|
188
|
+
--scribdown-color-danger: var(--scribdown-palette-dark-danger);
|
|
189
|
+
--scribdown-color-warning: var(--scribdown-palette-dark-warning);
|
|
190
|
+
--scribdown-color-code-ink: var(--scribdown-palette-dark-code-ink);
|
|
191
|
+
--scribdown-color-blockquote-bg: var(--scribdown-palette-dark-blockquote-bg);
|
|
192
|
+
--scribdown-color-blockquote-text: var(--scribdown-palette-dark-blockquote-text);
|
|
193
|
+
--scribdown-color-blockquote-link: var(--scribdown-palette-dark-blockquote-link);
|
|
194
|
+
--scribdown-color-blockquote-link-visited: var(--scribdown-palette-dark-blockquote-link-visited);
|
|
195
|
+
--scribdown-paper-grain: var(--scribdown-palette-dark-paper-grain);
|
|
196
|
+
--scribdown-paper-fiber: var(--scribdown-palette-dark-paper-fiber);
|
|
197
|
+
--scribdown-shadow-sm: var(--scribdown-palette-dark-shadow-sm);
|
|
198
|
+
--scribdown-shadow-md: var(--scribdown-palette-dark-shadow-md);
|
|
139
199
|
}
|
|
140
200
|
}
|
|
201
|
+
|
|
202
|
+
/* ─── 语义 Token ← 暗色(宿主显式指定)─────────────────────────────
|
|
203
|
+
宿主自带主题开关(如文档站的明暗切换、VS Code 主题)时,把 .scribdown-theme-dark
|
|
204
|
+
加到根元素上即可强制暗色;优先级高于上面的系统偏好映射,不受 OS 设置影响。
|
|
205
|
+
与「跟随系统」共用同一套调色板变量,色值仍只有一份。 */
|
|
206
|
+
:root.scribdown-theme-dark {
|
|
207
|
+
--scribdown-color-bg: var(--scribdown-palette-dark-bg);
|
|
208
|
+
--scribdown-color-surface: var(--scribdown-palette-dark-surface);
|
|
209
|
+
--scribdown-color-text-primary: var(--scribdown-palette-dark-text-primary);
|
|
210
|
+
--scribdown-color-text-secondary: var(--scribdown-palette-dark-text-secondary);
|
|
211
|
+
--scribdown-color-accent: var(--scribdown-palette-dark-accent);
|
|
212
|
+
--scribdown-color-link: var(--scribdown-palette-dark-link);
|
|
213
|
+
--scribdown-color-link-visited: var(--scribdown-palette-dark-link-visited);
|
|
214
|
+
--scribdown-color-mark: var(--scribdown-palette-dark-mark);
|
|
215
|
+
--scribdown-color-border: var(--scribdown-palette-dark-border);
|
|
216
|
+
--scribdown-color-danger: var(--scribdown-palette-dark-danger);
|
|
217
|
+
--scribdown-color-warning: var(--scribdown-palette-dark-warning);
|
|
218
|
+
--scribdown-color-code-ink: var(--scribdown-palette-dark-code-ink);
|
|
219
|
+
--scribdown-color-blockquote-bg: var(--scribdown-palette-dark-blockquote-bg);
|
|
220
|
+
--scribdown-color-blockquote-text: var(--scribdown-palette-dark-blockquote-text);
|
|
221
|
+
--scribdown-color-blockquote-link: var(--scribdown-palette-dark-blockquote-link);
|
|
222
|
+
--scribdown-color-blockquote-link-visited: var(--scribdown-palette-dark-blockquote-link-visited);
|
|
223
|
+
--scribdown-paper-grain: var(--scribdown-palette-dark-paper-grain);
|
|
224
|
+
--scribdown-paper-fiber: var(--scribdown-palette-dark-paper-fiber);
|
|
225
|
+
--scribdown-shadow-sm: var(--scribdown-palette-dark-shadow-sm);
|
|
226
|
+
--scribdown-shadow-md: var(--scribdown-palette-dark-shadow-md);
|
|
227
|
+
}
|
package/src/styles/toolbar.css
CHANGED
|
@@ -144,12 +144,26 @@
|
|
|
144
144
|
opacity: 1;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
/*
|
|
148
|
-
|
|
147
|
+
/* 工具栏按钮展开态(目录侧栏 / 更多菜单共用):底色加深 + 强调色,
|
|
148
|
+
与 hover 态区分开,让「当前已展开」在按钮上可见。 */
|
|
149
|
+
.scribdown-toolbar-btn[aria-expanded="true"] {
|
|
149
150
|
background: color-mix(in srgb, var(--scribdown-color-bg) 90%, transparent);
|
|
150
151
|
color: var(--scribdown-color-accent);
|
|
151
152
|
}
|
|
152
153
|
|
|
154
|
+
/* 关键步骤:展开态下方一小段强调色下划线,作为颜色之外的第二重状态提示(色觉障碍友好)。 */
|
|
155
|
+
.scribdown-toolbar-btn[aria-expanded="true"]::before {
|
|
156
|
+
content: "";
|
|
157
|
+
position: absolute;
|
|
158
|
+
bottom: 2px;
|
|
159
|
+
left: 50%;
|
|
160
|
+
width: 12px;
|
|
161
|
+
height: 2px;
|
|
162
|
+
transform: translateX(-50%);
|
|
163
|
+
background: var(--scribdown-color-accent);
|
|
164
|
+
border-radius: 999px;
|
|
165
|
+
}
|
|
166
|
+
|
|
153
167
|
/* ─── 更多下拉菜单 ──────────────────────────────────────────────── */
|
|
154
168
|
/* 关键步骤:菜单挂在 .scribdown-toolbar 内部,绝对定位到工具栏右下方。 */
|
|
155
169
|
.scribdown-toolbar-menu {
|
|
@@ -392,7 +406,8 @@
|
|
|
392
406
|
.scribdown-toc-host {
|
|
393
407
|
display: flex;
|
|
394
408
|
align-items: stretch;
|
|
395
|
-
/* TOC 宽度提到容器层,供 TOC 自身定宽 /
|
|
409
|
+
/* TOC 宽度提到容器层,供 TOC 自身定宽 / 折叠位移共用;
|
|
410
|
+
用户拖拽调宽后由 toolbar.ts 以内联样式覆盖本默认值。 */
|
|
396
411
|
--scribdown-toc-width: min(280px, 70vw);
|
|
397
412
|
/* 关键步骤:定高铺满视口;overflow:hidden 让整页不滚动,
|
|
398
413
|
折叠态 TOC(负 margin)也被裁切,滚动全部下沉到 content-scroll。 */
|
|
@@ -424,12 +439,18 @@
|
|
|
424
439
|
overflow: auto;
|
|
425
440
|
}
|
|
426
441
|
|
|
427
|
-
/*
|
|
442
|
+
/* 拖拽调宽期间:屏蔽正文文本选中并全局统一光标,避免拖动时误选内容 / 光标闪烁。 */
|
|
443
|
+
.scribdown-toc-host.is-toc-resizing {
|
|
444
|
+
cursor: col-resize;
|
|
445
|
+
user-select: none;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* 目录侧栏:flex item 贴最左,固定宽度;默认 margin-left 负值收进容器左外,is-open 归零滑入。
|
|
449
|
+
宽度变量由 .scribdown-toc-host 提供(用户拖拽后为内联覆盖值),此处仅做 fallback 兜底。 */
|
|
428
450
|
.scribdown-toolbar-toc-panel {
|
|
429
|
-
--scribdown-toc-width: min(280px, 70vw);
|
|
430
451
|
flex-shrink: 0;
|
|
431
452
|
box-sizing: border-box;
|
|
432
|
-
width: var(--scribdown-toc-width);
|
|
453
|
+
width: var(--scribdown-toc-width, min(280px, 70vw));
|
|
433
454
|
/* 关键步骤:填满外层容器高度(flex stretch 对齐 + 显式 100% 兜底),
|
|
434
455
|
内部支持横向 + 纵向滚动,超长 / 超宽目录条目在面板内自滚。 */
|
|
435
456
|
height: 100%;
|
|
@@ -444,7 +465,7 @@
|
|
|
444
465
|
padding: var(--scribdown-space-4);
|
|
445
466
|
/* 关键步骤:margin-left 负值占据负向布局空间收起,正文 flex:1 自然占满全宽;
|
|
446
467
|
切到 0 时正文让出 var(--scribdown-toc-width),整体平滑过渡。 */
|
|
447
|
-
margin-left: calc(-1 * var(--scribdown-toc-width));
|
|
468
|
+
margin-left: calc(-1 * var(--scribdown-toc-width, min(280px, 70vw)));
|
|
448
469
|
transition: margin-left var(--scribdown-duration-base) var(--scribdown-easing-standard);
|
|
449
470
|
z-index: 9001;
|
|
450
471
|
}
|
|
@@ -453,6 +474,51 @@
|
|
|
453
474
|
margin-left: 0;
|
|
454
475
|
}
|
|
455
476
|
|
|
477
|
+
/* ─── 目录调宽手柄 ─────────────────────────────────────────────
|
|
478
|
+
夹在目录侧栏与正文之间的 flex item:收起态宽度为 0(随侧栏一起塌陷,正文不留空条),
|
|
479
|
+
展开态占 6px 命中区,内部 ::after 画一条居中细线,hover / 拖拽时点亮为主题强调色。 */
|
|
480
|
+
.scribdown-toc-resizer {
|
|
481
|
+
position: relative;
|
|
482
|
+
flex: 0 0 auto;
|
|
483
|
+
width: 0;
|
|
484
|
+
/* 关键步骤:与侧栏 margin-left 同一时长的过渡,开合时手柄与侧栏同步进出。 */
|
|
485
|
+
transition: width var(--scribdown-duration-base) var(--scribdown-easing-standard);
|
|
486
|
+
overflow: hidden;
|
|
487
|
+
cursor: col-resize;
|
|
488
|
+
/* 收起态不可交互 / 不可聚焦命中,展开时再恢复。 */
|
|
489
|
+
pointer-events: none;
|
|
490
|
+
/* 关键步骤:拖拽为横向手势,禁用触摸端的默认横向平移,避免与页面滚动争抢。 */
|
|
491
|
+
touch-action: none;
|
|
492
|
+
z-index: 9001;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.scribdown-toc-resizer.is-open {
|
|
496
|
+
width: 6px;
|
|
497
|
+
pointer-events: auto;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.scribdown-toc-resizer::after {
|
|
501
|
+
content: "";
|
|
502
|
+
position: absolute;
|
|
503
|
+
top: 0;
|
|
504
|
+
bottom: 0;
|
|
505
|
+
left: 50%;
|
|
506
|
+
width: 2px;
|
|
507
|
+
transform: translateX(-50%);
|
|
508
|
+
background: transparent;
|
|
509
|
+
transition: background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.scribdown-toc-resizer:hover::after,
|
|
513
|
+
.scribdown-toc-resizer:focus-visible::after,
|
|
514
|
+
.scribdown-toc-resizer.is-dragging::after {
|
|
515
|
+
background: var(--scribdown-color-accent);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
.scribdown-toc-resizer:focus-visible {
|
|
519
|
+
outline: none;
|
|
520
|
+
}
|
|
521
|
+
|
|
456
522
|
/* ─── 通用细滚动条(主题色,opt-in)────────────────────────────────
|
|
457
523
|
目录侧栏(.scribdown-toolbar-toc-panel)与正文滚动层(.scribdown-content-scroll)共用:
|
|
458
524
|
挂载时显式给滚动容器加 .scribdown-scrollbar-thin 引入,不在此罗列各容器选择器。
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* 图片 / Mermaid 查看器共用的顶部按钮与缩放按钮组。 */
|
|
2
|
+
.scribdown-viewer-control-button {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
flex: none;
|
|
5
|
+
align-items: center;
|
|
6
|
+
justify-content: center;
|
|
7
|
+
width: var(--scribdown-viewer-control-size, 28px);
|
|
8
|
+
height: var(--scribdown-viewer-control-size, 28px);
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
border: 1px solid color-mix(in srgb, var(--scribdown-color-border) 58%, transparent);
|
|
12
|
+
border-radius: 7px 9px 8px 10px;
|
|
13
|
+
background: color-mix(in srgb, var(--scribdown-color-surface) 88%, transparent);
|
|
14
|
+
box-shadow: 0 1px 0 color-mix(in srgb, var(--scribdown-color-border) 32%, transparent);
|
|
15
|
+
color: var(--scribdown-color-text-primary);
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
font-family: var(--scribdown-font-code);
|
|
18
|
+
font-size: var(--scribdown-viewer-control-font-size, 13px);
|
|
19
|
+
font-weight: 700;
|
|
20
|
+
line-height: 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.scribdown-viewer-control-button svg {
|
|
24
|
+
pointer-events: none;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.scribdown-viewer-control-button:hover {
|
|
28
|
+
background: color-mix(
|
|
29
|
+
in srgb,
|
|
30
|
+
var(--scribdown-color-surface) 76%,
|
|
31
|
+
var(--scribdown-color-mark) 24%
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.scribdown-viewer-control-button:focus-visible {
|
|
36
|
+
outline: 2px solid var(--scribdown-color-accent);
|
|
37
|
+
outline-offset: 2px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.scribdown-viewer-control-button:disabled {
|
|
41
|
+
box-shadow: none;
|
|
42
|
+
cursor: default;
|
|
43
|
+
opacity: 0.42;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.scribdown-viewer-zoom-group {
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
flex: none;
|
|
49
|
+
align-items: center;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
border: 1px solid color-mix(in srgb, var(--scribdown-color-border) 64%, transparent);
|
|
52
|
+
border-radius: 8px 10px 9px 11px;
|
|
53
|
+
background: color-mix(in srgb, var(--scribdown-color-surface) 88%, transparent);
|
|
54
|
+
box-shadow: 0 1px 0 color-mix(in srgb, var(--scribdown-color-border) 32%, transparent);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.scribdown-viewer-zoom-group .scribdown-viewer-control-button {
|
|
58
|
+
border: 0;
|
|
59
|
+
border-radius: 0;
|
|
60
|
+
background: transparent;
|
|
61
|
+
box-shadow: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.scribdown-viewer-zoom-group .scribdown-viewer-control-button:hover {
|
|
65
|
+
background: color-mix(
|
|
66
|
+
in srgb,
|
|
67
|
+
var(--scribdown-color-surface) 76%,
|
|
68
|
+
var(--scribdown-color-mark) 24%
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.scribdown-viewer-zoom-group .scribdown-viewer-control-button:focus-visible {
|
|
73
|
+
position: relative;
|
|
74
|
+
z-index: 1;
|
|
75
|
+
outline-offset: -2px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.scribdown-viewer-zoom-value {
|
|
79
|
+
display: inline-flex;
|
|
80
|
+
flex: none;
|
|
81
|
+
align-items: center;
|
|
82
|
+
justify-content: center;
|
|
83
|
+
min-width: var(--scribdown-viewer-zoom-value-min-width, 42px);
|
|
84
|
+
height: var(--scribdown-viewer-control-size, 28px);
|
|
85
|
+
border-right: 1px solid color-mix(in srgb, var(--scribdown-color-border) 48%, transparent);
|
|
86
|
+
border-left: 1px solid color-mix(in srgb, var(--scribdown-color-border) 48%, transparent);
|
|
87
|
+
background: color-mix(
|
|
88
|
+
in srgb,
|
|
89
|
+
var(--scribdown-color-surface) 94%,
|
|
90
|
+
var(--scribdown-color-border) 6%
|
|
91
|
+
);
|
|
92
|
+
color: color-mix(in srgb, var(--scribdown-color-text-primary) 78%, transparent);
|
|
93
|
+
font-family: var(--scribdown-font-code);
|
|
94
|
+
font-size: var(--scribdown-viewer-zoom-value-font-size, 12px);
|
|
95
|
+
font-weight: 700;
|
|
96
|
+
}
|
package/src/styles.css
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* 调整顺序或新增模块时,仅需修改本文件。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
/* 0. 字体资产:随宿主本地打包,保证浏览器插件、文档站与 VS Code Webview 字形一致。 */
|
|
11
|
+
@import "./styles/fonts.css";
|
|
12
|
+
|
|
10
13
|
/* 1. 设计 token:浅色 + 暗色主题变量 */
|
|
11
14
|
@import "./styles/tokens.css";
|
|
12
15
|
|
|
@@ -37,6 +40,12 @@
|
|
|
37
40
|
/* 8. 代码:inline code + 代码块 + 语言标签 + 复制按钮 */
|
|
38
41
|
@import "./styles/code.css";
|
|
39
42
|
|
|
43
|
+
/* 8.0.1 Mermaid / 表格共用复制按钮 */
|
|
44
|
+
@import "./styles/copy-control.css";
|
|
45
|
+
|
|
46
|
+
/* 8.0.2 图片 / Mermaid 查看器共用顶部控件 */
|
|
47
|
+
@import "./styles/viewer-controls.css";
|
|
48
|
+
|
|
40
49
|
/* 8.1 Mermaid 图表块 */
|
|
41
50
|
@import "./styles/mermaid.css";
|
|
42
51
|
|