@scribdown/ui-handdrawn 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +36 -0
  3. package/src/assets/blockquote-bar.svg +68 -0
  4. package/src/assets/delete.svg +64 -0
  5. package/src/assets/heading-mark.svg +60 -0
  6. package/src/assets/rect-shadow.svg +22 -0
  7. package/src/assets/rough-line-dash-horizontal.svg +32 -0
  8. package/src/assets/rough-line-dash-vertical.svg +32 -0
  9. package/src/assets/rough-line-horizontal.svg +6 -0
  10. package/src/assets/rough-line-shadow-horizontal.svg +80 -0
  11. package/src/assets/rough-line-shadow-vertical.svg +83 -0
  12. package/src/assets/rough-line-vertical.svg +6 -0
  13. package/src/assets/tag-body-hatch.svg +51 -0
  14. package/src/assets/tag-body-outline.svg +52 -0
  15. package/src/assets/tag-left-line.svg +50 -0
  16. package/src/assets/tag-right-hatch.svg +51 -0
  17. package/src/assets/tag-right-outline.svg +52 -0
  18. package/src/assets/toc-branch-toggle.svg +54 -0
  19. package/src/assets/underline-stroke.svg +44 -0
  20. package/src/styles/blockquote.css +40 -0
  21. package/src/styles/code.css +573 -0
  22. package/src/styles/details.css +29 -0
  23. package/src/styles/frame.css +71 -0
  24. package/src/styles/host-reset.css +46 -0
  25. package/src/styles/image-viewer.css +213 -0
  26. package/src/styles/image.css +232 -0
  27. package/src/styles/inline.css +101 -0
  28. package/src/styles/lists.css +126 -0
  29. package/src/styles/markdown.css +270 -0
  30. package/src/styles/mermaid.css +405 -0
  31. package/src/styles/shell.css +24 -0
  32. package/src/styles/table.css +252 -0
  33. package/src/styles/toc.css +163 -0
  34. package/src/styles/tokens.css +140 -0
  35. package/src/styles/toolbar.css +491 -0
  36. package/src/styles/video.css +195 -0
  37. package/src/styles.css +59 -0
@@ -0,0 +1,270 @@
1
+ /* ─── Markdown 正文排版 ─────────────────────────────────────────────── */
2
+ /* body-md:18px / 1.75 / 400 */
3
+ .scribdown-markdown {
4
+ /* 关键步骤:列宽由父级 .scribdown-app(即 --scribdown-content-width)控制,本卡片 width:auto
5
+ 填满其内容盒;box-sizing:border-box 让自身 padding 计入宽度。
6
+ max-width 兜底:脱离 .scribdown-app 单独使用(第三方接入 / 预览沙盒)时仍受 --scribdown-content-width 约束,
7
+ margin:auto 在此场景下居中。 */
8
+ box-sizing: border-box;
9
+ width: auto;
10
+ max-width: var(--scribdown-content-width, 840px);
11
+ margin-left: auto;
12
+ margin-right: auto;
13
+ --scribdown-frame-edge-horizontal: url("../assets/rough-line-horizontal.svg");
14
+ --scribdown-frame-edge-vertical: url("../assets/rough-line-vertical.svg");
15
+ /* 手绘边框颜色:通过 mask + background-color 让外部 token 接管描边色。 */
16
+ --scribdown-frame-edge-color: var(--scribdown-color-accent);
17
+ /* 手绘边框 SVG 切片的平铺尺寸:长边 = 单段花纹长度,短边 = 描边粗细。
18
+ 用于 background-size / mask-size,避免在各 CSS 文件里重复硬编码。 */
19
+ --scribdown-frame-edge-tile-horizontal: 200px 6px;
20
+ --scribdown-frame-edge-tile-vertical: 6px 200px;
21
+ /* 代码块行号分隔线(rough-line-shadow-vertical.svg)的平铺尺寸,花纹周期短于通用边框。 */
22
+ --scribdown-rough-line-shadow-tile-vertical: 6px 144px;
23
+ /* 表格外框(共用 rough-line-shadow svg)的平铺尺寸:横向 192×12,纵向 12×144,描边比通用边框略粗。 */
24
+ --scribdown-table-border-tile-horizontal: 192px 12px;
25
+ --scribdown-table-border-tile-vertical: 12px 144px;
26
+ --scribdown-blockquote-bar: url("../assets/blockquote-bar.svg");
27
+ --scribdown-underline-stroke: url("../assets/underline-stroke.svg");
28
+ --scribdown-heading-mark: url("../assets/heading-mark.svg");
29
+ --scribdown-rough-line-dash-horizontal: url("../assets/rough-line-dash-horizontal.svg");
30
+ --scribdown-rough-line-dash-vertical: url("../assets/rough-line-dash-vertical.svg");
31
+ --scribdown-rough-line-shadow-horizontal: url("../assets/rough-line-shadow-horizontal.svg");
32
+ --scribdown-rough-line-shadow-vertical: url("../assets/rough-line-shadow-vertical.svg");
33
+ --scribdown-code-block-rect-shadow: url("../assets/rect-shadow.svg");
34
+ --scribdown-code-block-lang-tag-body-outline: url("../assets/tag-body-outline.svg");
35
+ --scribdown-code-block-lang-tag-body-hatch: url("../assets/tag-body-hatch.svg");
36
+ --scribdown-code-block-lang-tag-left-line: url("../assets/tag-left-line.svg");
37
+ --scribdown-code-block-lang-tag-right-outline: url("../assets/tag-right-outline.svg");
38
+ --scribdown-code-block-lang-tag-right-hatch: url("../assets/tag-right-hatch.svg");
39
+ --scribdown-code-block-lang-tag-right-safe-width: 18px;
40
+ --scribdown-code-block-chrome-shadow-token: var(--scribdown-color-border);
41
+ --scribdown-code-block-chrome-shadow-fill: color-mix(
42
+ in srgb,
43
+ var(--scribdown-code-block-chrome-shadow-token) 40%,
44
+ transparent
45
+ );
46
+
47
+ position: relative;
48
+ background-color: var(--scribdown-color-surface);
49
+ background-image:
50
+ radial-gradient(circle at 24% 14%, var(--scribdown-paper-grain) 0 1px, transparent 1.7px),
51
+ radial-gradient(circle at 72% 58%, var(--scribdown-paper-fiber) 0 1.2px, transparent 1.9px);
52
+ background-size:
53
+ 28px 25px,
54
+ 39px 34px;
55
+ padding: var(--scribdown-space-3);
56
+ font-size: 16px;
57
+ line-height: 1.65;
58
+ font-weight: 400;
59
+ color: var(--scribdown-color-text-primary);
60
+ word-break: break-word;
61
+ }
62
+
63
+ /* 外层边框:复用 blockquote 的 frame-edge SVG,保持视觉语言一致。 */
64
+ .scribdown-markdown::before {
65
+ content: "";
66
+ position: absolute;
67
+ inset: 0;
68
+ pointer-events: none;
69
+ background-image:
70
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
71
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
72
+ background-position:
73
+ left top,
74
+ left bottom,
75
+ left top,
76
+ right top;
77
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
78
+ background-size:
79
+ var(--scribdown-frame-edge-tile-horizontal),
80
+ var(--scribdown-frame-edge-tile-horizontal),
81
+ var(--scribdown-frame-edge-tile-vertical),
82
+ var(--scribdown-frame-edge-tile-vertical);
83
+ }
84
+
85
+ @supports ((mask-image: url("")) or (-webkit-mask-image: url(""))) {
86
+ .scribdown-markdown::before {
87
+ /* 关键步骤:用 mask 保留 SVG 形状,描边色交给 frame-edge-color token,便于主题化。 */
88
+ background-color: var(--scribdown-frame-edge-color);
89
+ background-image: none;
90
+ -webkit-mask-image:
91
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
92
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
93
+ -webkit-mask-position:
94
+ left top,
95
+ left bottom,
96
+ left top,
97
+ right top;
98
+ -webkit-mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
99
+ -webkit-mask-size:
100
+ var(--scribdown-frame-edge-tile-horizontal),
101
+ var(--scribdown-frame-edge-tile-horizontal),
102
+ var(--scribdown-frame-edge-tile-vertical),
103
+ var(--scribdown-frame-edge-tile-vertical);
104
+ -webkit-mask-mode: alpha, alpha, alpha, alpha;
105
+ mask-image:
106
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
107
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
108
+ mask-position:
109
+ left top,
110
+ left bottom,
111
+ left top,
112
+ right top;
113
+ mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
114
+ mask-size:
115
+ var(--scribdown-frame-edge-tile-horizontal),
116
+ var(--scribdown-frame-edge-tile-horizontal),
117
+ var(--scribdown-frame-edge-tile-vertical),
118
+ var(--scribdown-frame-edge-tile-vertical);
119
+ mask-mode: alpha, alpha, alpha, alpha;
120
+ }
121
+ }
122
+
123
+ .scribdown-markdown > :first-child {
124
+ margin-top: 0;
125
+ }
126
+
127
+ .scribdown-markdown > :last-child {
128
+ margin-bottom: 0;
129
+ }
130
+
131
+ /* HeadingRenderer:字体 heading,Typography 规范字号 / 行高 / 字重 */
132
+ .scribdown-markdown h1,
133
+ .scribdown-markdown h2,
134
+ .scribdown-markdown h3,
135
+ .scribdown-markdown h4,
136
+ .scribdown-markdown h5,
137
+ .scribdown-markdown h6 {
138
+ position: relative;
139
+ isolation: isolate;
140
+ font-family: var(--scribdown-font-heading);
141
+ margin-top: var(--scribdown-space-4);
142
+ margin-bottom: var(--scribdown-space-1);
143
+ letter-spacing: 0;
144
+ }
145
+
146
+ .scribdown-markdown h1 {
147
+ --scribdown-heading-mark-fade: 0%;
148
+ --scribdown-heading-mark-height: 0.36em;
149
+
150
+ font-size: 34px;
151
+ line-height: 1.2;
152
+ font-weight: 700;
153
+ text-shadow: 0.9px 0 color-mix(in srgb, var(--scribdown-color-text-primary) 20%, transparent);
154
+ }
155
+
156
+ /* 关键步骤:手绘 SVG 高亮,结合 box-decoration-break 让多行标题逐行复制。 */
157
+ .scribdown-markdown h1 .scribdown-heading-mark,
158
+ .scribdown-markdown h2 .scribdown-heading-mark,
159
+ .scribdown-markdown h3 .scribdown-heading-mark,
160
+ .scribdown-markdown h4 .scribdown-heading-mark,
161
+ .scribdown-markdown h5 .scribdown-heading-mark,
162
+ .scribdown-markdown h6 .scribdown-heading-mark {
163
+ background-image:
164
+ linear-gradient(
165
+ color-mix(
166
+ in srgb,
167
+ var(--scribdown-color-surface) var(--scribdown-heading-mark-fade),
168
+ transparent
169
+ ),
170
+ color-mix(
171
+ in srgb,
172
+ var(--scribdown-color-surface) var(--scribdown-heading-mark-fade),
173
+ transparent
174
+ )
175
+ ),
176
+ var(--scribdown-heading-mark);
177
+ background-position:
178
+ 0 92%,
179
+ 0 92%;
180
+ background-repeat: no-repeat, no-repeat;
181
+ background-size:
182
+ 100% var(--scribdown-heading-mark-height),
183
+ 100% var(--scribdown-heading-mark-height);
184
+ padding: 0 0.08em;
185
+ -webkit-box-decoration-break: clone;
186
+ box-decoration-break: clone;
187
+ }
188
+ .scribdown-markdown h2 {
189
+ --scribdown-heading-mark-fade: 14%;
190
+ --scribdown-heading-mark-height: 0.3em;
191
+
192
+ font-size: 26px;
193
+ line-height: 1.3;
194
+ font-weight: 700;
195
+ }
196
+
197
+ .scribdown-markdown h3 {
198
+ --scribdown-heading-mark-fade: 26%;
199
+ --scribdown-heading-mark-height: 0.24em;
200
+
201
+ font-size: 21px;
202
+ line-height: 1.35;
203
+ font-weight: 600;
204
+ }
205
+
206
+ .scribdown-markdown h4 {
207
+ --scribdown-heading-mark-fade: 38%;
208
+ --scribdown-heading-mark-height: 0.18em;
209
+
210
+ font-size: 18px;
211
+ line-height: 1.4;
212
+ font-weight: 600;
213
+ }
214
+ .scribdown-markdown h5 {
215
+ --scribdown-heading-mark-fade: 50%;
216
+ --scribdown-heading-mark-height: 0.14em;
217
+
218
+ font-size: 16px;
219
+ line-height: 1.5;
220
+ font-weight: 600;
221
+ }
222
+ .scribdown-markdown h6 {
223
+ --scribdown-heading-mark-fade: 60%;
224
+ --scribdown-heading-mark-height: 0.1em;
225
+
226
+ font-size: 14px;
227
+ line-height: 1.5;
228
+ font-weight: 600;
229
+ }
230
+
231
+ /* ParagraphRenderer:段间距 space-3,紧凑版 */
232
+ .scribdown-markdown p {
233
+ margin: 0 0 var(--scribdown-space-3);
234
+ }
235
+
236
+ .scribdown-markdown strong {
237
+ font-weight: 700;
238
+ text-shadow: 0.7px 0 color-mix(in srgb, var(--scribdown-color-text-primary) 24%, transparent);
239
+ }
240
+
241
+ .scribdown-markdown u {
242
+ padding-bottom: 0.1em;
243
+ background-image: var(--scribdown-underline-stroke);
244
+ background-position: 0 96%;
245
+ background-repeat: repeat-x;
246
+ background-size: 96px 0.38em;
247
+ text-decoration: none;
248
+ -webkit-box-decoration-break: clone;
249
+ box-decoration-break: clone;
250
+ }
251
+
252
+ /* HanddrawnDivider:不用直线,上下留白 space-5 */
253
+ .scribdown-markdown hr {
254
+ height: 12px;
255
+ border: none;
256
+ /* 关键步骤:用 mask 保留 SVG 形状,描边色由 color-border token 接管,便于主题化。 */
257
+ background-color: var(--scribdown-color-border);
258
+ -webkit-mask-image: var(--scribdown-frame-edge-horizontal);
259
+ -webkit-mask-position: center;
260
+ -webkit-mask-repeat: no-repeat;
261
+ -webkit-mask-size: 100% 8px;
262
+ -webkit-mask-mode: alpha;
263
+ mask-image: var(--scribdown-frame-edge-horizontal);
264
+ mask-position: center;
265
+ mask-repeat: no-repeat;
266
+ mask-size: 100% 8px;
267
+ mask-mode: alpha;
268
+ margin: var(--scribdown-space-3) 0;
269
+ transform: rotate(-0.3deg);
270
+ }
@@ -0,0 +1,405 @@
1
+ /* MermaidBlock:复用代码块的手绘外框,承载 SVG 图表 + 失败态。 */
2
+ .scribdown-markdown .scribdown-mermaid {
3
+ position: relative;
4
+ margin: 32px auto 36px;
5
+ padding: 0;
6
+ background: var(--scribdown-color-surface);
7
+ border: 1.5px solid color-mix(in srgb, var(--scribdown-color-border) 80%, transparent);
8
+ border-radius: 10px 12px 11px 13px;
9
+ box-shadow: 4px 5px 0 color-mix(in srgb, var(--scribdown-color-border) 28%, transparent);
10
+ transform: rotate(-0.18deg);
11
+ width: min(100%, 720px);
12
+ box-sizing: border-box;
13
+ overflow: hidden;
14
+ }
15
+
16
+ /* 顶部 chrome:仅放置 Mermaid 类型标签,对齐代码块视觉语言。 */
17
+ .scribdown-markdown .scribdown-mermaid__chrome {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: space-between;
21
+ padding: 6px 12px;
22
+ background: color-mix(in srgb, var(--scribdown-color-surface) 90%, var(--scribdown-color-border) 10%);
23
+ border-bottom: 1px dashed color-mix(in srgb, var(--scribdown-color-border) 60%, transparent);
24
+ }
25
+
26
+ .scribdown-markdown .scribdown-mermaid__label {
27
+ font-family: var(--scribdown-font-heading);
28
+ font-size: 13px;
29
+ font-weight: 700;
30
+ letter-spacing: 0.06em;
31
+ color: color-mix(in srgb, var(--scribdown-color-text-primary) 78%, transparent);
32
+ text-transform: uppercase;
33
+ }
34
+
35
+ .scribdown-markdown .scribdown-mermaid__body {
36
+ position: relative;
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ /* 给 body 一个确定高度,使内部 canvas 的 height:100% 能解析,
41
+ 从而让 SVG 的 max-height:100% 触发等比缩放,避免极端长宽比图表被压成一条。 */
42
+ height: clamp(280px, 50vh, 480px);
43
+ padding: 24px;
44
+ box-sizing: border-box;
45
+ background:
46
+ radial-gradient(circle at 18px 20px, var(--scribdown-paper-grain) 0 1px, transparent 1.6px),
47
+ color-mix(in srgb, var(--scribdown-color-surface) 94%, var(--scribdown-color-border) 6%);
48
+ background-size:
49
+ 32px 29px,
50
+ auto;
51
+ }
52
+
53
+ /* 右下角悬浮全屏按钮:默认轻量呈现,hover 后增强对比。 */
54
+ .scribdown-markdown .scribdown-mermaid__fullscreen {
55
+ position: absolute;
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;
75
+ }
76
+
77
+ .scribdown-markdown .scribdown-mermaid__fullscreen:hover {
78
+ opacity: 1;
79
+ transform: translateY(-1px);
80
+ background: color-mix(in srgb, var(--scribdown-color-surface) 80%, var(--scribdown-color-mark) 20%);
81
+ }
82
+
83
+ .scribdown-markdown .scribdown-mermaid__fullscreen:focus-visible {
84
+ outline: 2px solid var(--scribdown-color-accent);
85
+ outline-offset: 2px;
86
+ }
87
+
88
+ .scribdown-markdown .scribdown-mermaid__fullscreen:disabled {
89
+ cursor: default;
90
+ opacity: 0;
91
+ pointer-events: none;
92
+ }
93
+
94
+ .scribdown-markdown .scribdown-mermaid__fullscreen svg {
95
+ display: block;
96
+ }
97
+
98
+ .scribdown-markdown .scribdown-mermaid__canvas {
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ width: 100%;
103
+ height: 100%;
104
+ overflow: hidden;
105
+ }
106
+
107
+ /* SVG 用 max-width/max-height 100% + auto 让浏览器按 viewBox 等比缩放,
108
+ 总有一边贴合 canvas 边缘,保证整图可见;细节由右下角全屏查看器提供。 */
109
+ .scribdown-markdown .scribdown-mermaid__canvas svg {
110
+ display: block;
111
+ width: auto;
112
+ height: auto;
113
+ max-width: 100%;
114
+ max-height: 100%;
115
+ }
116
+
117
+ /* Loading 态:画布尚未填充 SVG 时的占位脉冲。 */
118
+ .scribdown-markdown .scribdown-mermaid--loading .scribdown-mermaid__canvas {
119
+ width: 100%;
120
+ min-height: 180px;
121
+ border-radius: 6px;
122
+ background:
123
+ repeating-linear-gradient(
124
+ 45deg,
125
+ color-mix(in srgb, var(--scribdown-color-border) 22%, transparent),
126
+ color-mix(in srgb, var(--scribdown-color-border) 22%, transparent) 8px,
127
+ transparent 8px,
128
+ transparent 16px
129
+ );
130
+ opacity: 0.6;
131
+ animation: scribdown-mermaid-loading 1.6s linear infinite;
132
+ }
133
+
134
+ @keyframes scribdown-mermaid-loading {
135
+ from {
136
+ background-position: 0 0;
137
+ }
138
+ to {
139
+ background-position: 32px 0;
140
+ }
141
+ }
142
+
143
+ /* 失败态:替换 canvas 为错误说明 + 源码块。 */
144
+ .scribdown-markdown .scribdown-mermaid--failed .scribdown-mermaid__body {
145
+ background:
146
+ radial-gradient(circle at 18px 20px, var(--scribdown-paper-grain) 0 1px, transparent 1.6px),
147
+ color-mix(in srgb, var(--scribdown-color-surface) 88%, transparent);
148
+ }
149
+
150
+ .scribdown-markdown .scribdown-mermaid__fallback {
151
+ display: flex;
152
+ flex-direction: column;
153
+ align-items: center;
154
+ gap: var(--scribdown-space-2);
155
+ max-width: 100%;
156
+ color: var(--scribdown-color-text-primary);
157
+ text-align: center;
158
+ }
159
+
160
+ /* 失败态图标:手绘风方框 + 中心叉号。 */
161
+ .scribdown-markdown .scribdown-mermaid__fallback-icon {
162
+ position: relative;
163
+ display: block;
164
+ box-sizing: border-box;
165
+ width: 52px;
166
+ height: 52px;
167
+ border: 2px solid var(--scribdown-color-text-primary);
168
+ background: color-mix(in srgb, var(--scribdown-color-surface) 80%, var(--scribdown-color-warning) 12%);
169
+ transform: rotate(-2deg);
170
+ }
171
+
172
+ .scribdown-markdown .scribdown-mermaid__fallback-icon::before,
173
+ .scribdown-markdown .scribdown-mermaid__fallback-icon::after {
174
+ content: "";
175
+ position: absolute;
176
+ left: 50%;
177
+ top: 50%;
178
+ width: 30px;
179
+ height: 2.5px;
180
+ background: var(--scribdown-color-text-primary);
181
+ transform-origin: center;
182
+ }
183
+
184
+ .scribdown-markdown .scribdown-mermaid__fallback-icon::before {
185
+ transform: translate(-50%, -50%) rotate(45deg);
186
+ }
187
+
188
+ .scribdown-markdown .scribdown-mermaid__fallback-icon::after {
189
+ transform: translate(-50%, -50%) rotate(-45deg);
190
+ }
191
+
192
+ .scribdown-markdown .scribdown-mermaid__fallback-text {
193
+ margin: 0;
194
+ font-family: var(--scribdown-font-heading);
195
+ font-size: 18px;
196
+ font-weight: 700;
197
+ line-height: 1.3;
198
+ }
199
+
200
+ .scribdown-markdown pre.scribdown-mermaid__fallback-source,
201
+ .scribdown-markdown p.scribdown-mermaid__fallback-source {
202
+ width: 100%;
203
+ max-width: 100%;
204
+ margin: 0;
205
+ padding: 8px 12px;
206
+ background: color-mix(in srgb, var(--scribdown-color-surface) 86%, var(--scribdown-color-border) 14%);
207
+ border-radius: 6px;
208
+ color: var(--scribdown-color-text-secondary);
209
+ font-family: var(--scribdown-font-code);
210
+ font-size: 13px;
211
+ line-height: 1.5;
212
+ text-align: left;
213
+ white-space: pre-wrap;
214
+ overflow-wrap: anywhere;
215
+ }
216
+
217
+ /* MermaidViewer:mermaid 全屏查看器,与图片查看器并列,整体风格保持一致。 */
218
+ .scribdown-mermaid-viewer {
219
+ width: 100vw;
220
+ max-width: none;
221
+ height: 100dvh;
222
+ max-height: none;
223
+ margin: 0;
224
+ padding: 0;
225
+ overflow: hidden;
226
+ border: 0;
227
+ background:
228
+ radial-gradient(
229
+ circle at 16% 18%,
230
+ color-mix(in srgb, var(--scribdown-color-bg) 10%, transparent) 0 1px,
231
+ transparent 1.7px
232
+ ),
233
+ color-mix(in srgb, var(--scribdown-color-text-primary) 84%, transparent);
234
+ color: var(--scribdown-color-text-primary);
235
+ }
236
+
237
+ .scribdown-mermaid-viewer:not([open]) {
238
+ display: none;
239
+ }
240
+
241
+ .scribdown-mermaid-viewer[open] {
242
+ display: grid;
243
+ grid-template-rows: auto minmax(0, 1fr);
244
+ }
245
+
246
+ .scribdown-mermaid-viewer::backdrop {
247
+ background: color-mix(in srgb, var(--scribdown-color-text-primary) 78%, transparent);
248
+ backdrop-filter: blur(2px);
249
+ }
250
+
251
+ .scribdown-mermaid-viewer__chrome {
252
+ position: relative;
253
+ z-index: 2;
254
+ display: grid;
255
+ grid-template-columns: minmax(0, 1fr) auto;
256
+ gap: var(--scribdown-space-3);
257
+ align-items: center;
258
+ padding: var(--scribdown-space-3) var(--scribdown-space-4);
259
+ background:
260
+ radial-gradient(circle at 18px 16px, var(--scribdown-paper-grain) 0 1px, transparent 1.6px),
261
+ color-mix(in srgb, var(--scribdown-color-surface) 94%, transparent);
262
+ background-size:
263
+ 32px 29px,
264
+ auto;
265
+ box-shadow: 0 4px 0 color-mix(in srgb, var(--scribdown-color-text-primary) 14%, transparent);
266
+ }
267
+
268
+ .scribdown-mermaid-viewer__caption {
269
+ min-width: 0;
270
+ margin: 0;
271
+ overflow: hidden;
272
+ color: var(--scribdown-color-text-primary);
273
+ font-family: var(--scribdown-font-heading);
274
+ font-size: 22px;
275
+ font-weight: 700;
276
+ line-height: 1.25;
277
+ text-overflow: ellipsis;
278
+ white-space: nowrap;
279
+ }
280
+
281
+ .scribdown-mermaid-viewer__controls {
282
+ display: inline-flex;
283
+ align-items: center;
284
+ gap: var(--scribdown-space-2);
285
+ }
286
+
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
+ .scribdown-mermaid-viewer__button--close {
330
+ background: color-mix(
331
+ in srgb,
332
+ var(--scribdown-color-surface) 82%,
333
+ var(--scribdown-color-danger) 18%
334
+ );
335
+ }
336
+
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
+ .scribdown-mermaid-viewer__viewport {
351
+ min-width: 0;
352
+ min-height: 0;
353
+ display: flex;
354
+ align-items: safe center;
355
+ justify-content: safe center;
356
+ padding: var(--scribdown-space-5);
357
+ overflow: auto;
358
+ overscroll-behavior: contain;
359
+ touch-action: none;
360
+ }
361
+
362
+ .scribdown-mermaid-viewer--zoomed .scribdown-mermaid-viewer__viewport {
363
+ cursor: grab;
364
+ }
365
+
366
+ .scribdown-mermaid-viewer--zoomed.scribdown-mermaid-viewer--dragging
367
+ .scribdown-mermaid-viewer__viewport {
368
+ cursor: grabbing;
369
+ user-select: none;
370
+ }
371
+
372
+ .scribdown-mermaid-viewer__canvas {
373
+ flex: 0 0 auto;
374
+ display: block;
375
+ background: var(--scribdown-color-surface);
376
+ border-radius: 6px 7px 5px 6px;
377
+ box-shadow: 6px 8px 0 color-mix(in srgb, var(--scribdown-color-text-primary) 26%, transparent);
378
+ user-select: none;
379
+ }
380
+
381
+ .scribdown-mermaid-viewer--dragging .scribdown-mermaid-viewer__canvas {
382
+ pointer-events: none;
383
+ }
384
+
385
+ @media (max-width: 640px) {
386
+ .scribdown-mermaid-viewer__chrome {
387
+ grid-template-columns: 1fr;
388
+ gap: var(--scribdown-space-2);
389
+ padding: var(--scribdown-space-3);
390
+ }
391
+
392
+ .scribdown-mermaid-viewer__controls {
393
+ justify-content: space-between;
394
+ width: 100%;
395
+ }
396
+
397
+ .scribdown-mermaid-viewer__button {
398
+ width: 34px;
399
+ height: 34px;
400
+ }
401
+
402
+ .scribdown-mermaid-viewer__viewport {
403
+ padding: var(--scribdown-space-3);
404
+ }
405
+ }
@@ -0,0 +1,24 @@
1
+ /* ─── Shell Components ──────────────────────────────────────────────── */
2
+ /* DocumentShell:正文列最大宽度 840px,侧边距至少 48px,顶部 64px,底部 96px */
3
+ .scribdown-page {
4
+ margin: 0;
5
+ padding: 0;
6
+ background: var(--scribdown-color-bg);
7
+ min-height: 100vh;
8
+ box-sizing: border-box;
9
+ font-family: var(--scribdown-font-body);
10
+ color: var(--scribdown-color-text-primary);
11
+ }
12
+
13
+ .scribdown-app {
14
+ box-sizing: border-box;
15
+ /* 关键步骤:正文列宽(含页面 padding)由 --scribdown-content-width 控制;box-sizing:border-box
16
+ 让该宽度覆盖 padding 在内的整列外框。固定档(px)下视口更窄也保持该宽度不压缩,由外层
17
+ content-scroll 横向滚动,padding / 背景随列宽完整延伸;100% 档则铺满滚动视口。
18
+ 视口比列宽更宽时 margin:auto 让整列居中。 */
19
+ width: var(--scribdown-content-width, 840px);
20
+ margin-left: auto;
21
+ margin-right: auto;
22
+ /* 关键步骤:wrapper 负责页面 padding,正文卡片(.scribdown-markdown)填满其内容盒。 */
23
+ padding: var(--scribdown-space-6) var(--scribdown-space-5) var(--scribdown-space-7);
24
+ }