@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,573 @@
1
+ /* InlineCode:轻量纸底,避免和 frame 四边框重复。 */
2
+ .scribdown-markdown code {
3
+ font-family: var(--scribdown-font-code);
4
+ font-size: inherit;
5
+ font-weight: 500;
6
+ color: inherit;
7
+ padding: 1px 6px 2px;
8
+ border-radius: 7px 9px 8px 10px;
9
+ background: color-mix(
10
+ in srgb,
11
+ var(--scribdown-color-surface) 82%,
12
+ var(--scribdown-color-mark) 18%
13
+ );
14
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--scribdown-color-border) 46%, transparent);
15
+ -webkit-box-decoration-break: clone;
16
+ box-decoration-break: clone;
17
+ }
18
+
19
+ /* CodeBlock:简单描边 + 顶部 chrome(语言标签 / 复制按钮) + 正文 + 行号。 */
20
+ .scribdown-markdown .scribdown-code-block {
21
+ /* 主紫色:用于代码块边框、标签与按钮描边。 */
22
+ --scribdown-code-ink: var(--scribdown-color-code-ink);
23
+ /* 代码正文文字色跟随当前主题正文颜色。 */
24
+ --scribdown-code-text: var(--scribdown-color-text-primary);
25
+ /* 语言标签边框色 token。 */
26
+ --scribdown-code-block-lang-border-token: var(--scribdown-code-ink);
27
+ /* 语言标签边框填充色。 */
28
+ --scribdown-code-block-lang-border-fill: color-mix(
29
+ in srgb,
30
+ var(--scribdown-code-block-lang-border-token) 72%,
31
+ transparent
32
+ );
33
+ /* 语言标签排线色 token。 */
34
+ --scribdown-code-block-lang-hatch-token: var(--scribdown-color-warning);
35
+ /* 语言标签排线填充色(需与边框色不同)。 */
36
+ --scribdown-code-block-lang-hatch-fill: color-mix(
37
+ in srgb,
38
+ var(--scribdown-code-block-lang-hatch-token) 44%,
39
+ transparent
40
+ );
41
+ /* chrome 内容行高度。 */
42
+ --scribdown-code-chrome-height: 36px;
43
+ /* 行号列宽度。 */
44
+ --scribdown-code-line-number-width: 32px;
45
+ /* 行号与代码正文之间的间距。 */
46
+ --scribdown-code-line-number-gap: 8px;
47
+ /* 行号列总宽(列宽 + 间距),用于正文缩进与分隔线定位。 */
48
+ --scribdown-code-line-gutter-width: calc(
49
+ var(--scribdown-code-line-number-width) + var(--scribdown-code-line-number-gap)
50
+ );
51
+ /* 代码块正文最大高度:取视口 60% 与 32rem 的较小值,避免超长代码块独占屏幕。 */
52
+ --scribdown-code-block-max-height: min(60vh, 32rem);
53
+
54
+ position: relative;
55
+ z-index: 0;
56
+ isolation: isolate;
57
+ margin: 32px 0 36px;
58
+ /* chrome 改为文档流布局后不再需要顶部预留。 */
59
+ padding: 0px 0;
60
+ background: var(--scribdown-color-surface);
61
+ overflow: visible;
62
+ isolation: isolate;
63
+ }
64
+
65
+ /* 关键步骤:和 blockquote::after 一样用横向 / 纵向 SVG 边条平铺,形成可伸缩手绘边框。 */
66
+ .scribdown-markdown .scribdown-code-block::after {
67
+ content: "";
68
+ position: absolute;
69
+ z-index: 3;
70
+ inset: 0;
71
+ pointer-events: none;
72
+ border-radius: inherit;
73
+ background-image:
74
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
75
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
76
+ background-position:
77
+ left top,
78
+ 50% bottom,
79
+ left 40%,
80
+ right top;
81
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
82
+ background-size:
83
+ var(--scribdown-frame-edge-tile-horizontal),
84
+ var(--scribdown-frame-edge-tile-horizontal),
85
+ var(--scribdown-frame-edge-tile-vertical),
86
+ var(--scribdown-frame-edge-tile-vertical);
87
+ }
88
+
89
+ /* 顶部 chrome:使用相对定位并处于文档流内,避免依赖外层预留 padding。 */
90
+ .scribdown-markdown .scribdown-code-block__chrome {
91
+ position: relative;
92
+ z-index: 2;
93
+ isolation: isolate;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: space-between;
97
+ height: var(--scribdown-code-chrome-height);
98
+ margin: 0px 4px 0;
99
+ padding: 0px 4px;
100
+ background: var(--scribdown-color-surface);
101
+ border-radius: 8px 10px 0 0;
102
+ pointer-events: none;
103
+ }
104
+
105
+ /* 关键步骤:chrome 背景纹理改用 rect-shadow.svg。 */
106
+ .scribdown-markdown .scribdown-code-block__chrome::before {
107
+ content: "";
108
+ position: absolute;
109
+ z-index: 0;
110
+ inset: 0;
111
+ border-radius: inherit;
112
+ pointer-events: none;
113
+ background-image: var(--scribdown-code-block-rect-shadow);
114
+ background-position: center;
115
+ background-repeat: repeat-x;
116
+ background-size: auto 100%;
117
+ }
118
+
119
+ /* 关键步骤:保证语言标签和复制按钮位于纹理层之上。 */
120
+ .scribdown-markdown .scribdown-code-block__chrome > * {
121
+ position: relative;
122
+ z-index: 1;
123
+ }
124
+
125
+ /* 关键步骤:chrome 底部增加手绘边线,与代码块外框风格保持一致。 */
126
+ .scribdown-markdown .scribdown-code-block__chrome::after {
127
+ content: "";
128
+ position: absolute;
129
+ z-index: 2;
130
+ left: 0px;
131
+ right: -1px;
132
+ bottom: -1px;
133
+ height: 6px;
134
+ pointer-events: none;
135
+ background-image: var(--scribdown-frame-edge-horizontal);
136
+ background-repeat: repeat-x;
137
+ background-size: var(--scribdown-frame-edge-tile-horizontal);
138
+ background-position: left bottom;
139
+ }
140
+
141
+ @supports ((mask-image: url("")) or (-webkit-mask-image: url(""))) {
142
+ .scribdown-markdown .scribdown-code-block::after {
143
+ /* 关键步骤:用 mask 保留 SVG 形状,描边色由 code-ink 接管,便于主题化。 */
144
+ background-color: var(--scribdown-code-ink);
145
+ background-image: none;
146
+ -webkit-mask-image:
147
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
148
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
149
+ -webkit-mask-position:
150
+ left top,
151
+ 50% bottom,
152
+ left 40%,
153
+ right top;
154
+ -webkit-mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
155
+ -webkit-mask-size:
156
+ var(--scribdown-frame-edge-tile-horizontal),
157
+ var(--scribdown-frame-edge-tile-horizontal),
158
+ var(--scribdown-frame-edge-tile-vertical),
159
+ var(--scribdown-frame-edge-tile-vertical);
160
+ -webkit-mask-mode: alpha, alpha, alpha, alpha;
161
+ mask-image:
162
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
163
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
164
+ mask-position:
165
+ left top,
166
+ 50% bottom,
167
+ left 40%,
168
+ right top;
169
+ mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
170
+ mask-size:
171
+ var(--scribdown-frame-edge-tile-horizontal),
172
+ var(--scribdown-frame-edge-tile-horizontal),
173
+ var(--scribdown-frame-edge-tile-vertical),
174
+ var(--scribdown-frame-edge-tile-vertical);
175
+ mask-mode: alpha, alpha, alpha, alpha;
176
+ }
177
+
178
+ .scribdown-markdown .scribdown-code-block__chrome::before {
179
+ /* 关键步骤:使用 mask 仅保留纹理形状,颜色由 token 统一控制。 */
180
+ background-color: var(--scribdown-code-block-chrome-shadow-fill);
181
+ background-image: none;
182
+ -webkit-mask-image: var(--scribdown-code-block-rect-shadow);
183
+ -webkit-mask-position: center;
184
+ -webkit-mask-repeat: repeat-x;
185
+ -webkit-mask-size: auto 100%;
186
+ -webkit-mask-mode: alpha;
187
+ mask-image: var(--scribdown-code-block-rect-shadow);
188
+ mask-position: center;
189
+ mask-repeat: repeat-x;
190
+ mask-size: auto 100%;
191
+ mask-mode: alpha;
192
+ }
193
+
194
+ .scribdown-markdown .scribdown-code-block__chrome::after {
195
+ background-color: var(--scribdown-code-ink);
196
+ background-image: none;
197
+ -webkit-mask-image: var(--scribdown-frame-edge-horizontal);
198
+ -webkit-mask-repeat: repeat-x;
199
+ -webkit-mask-size: var(--scribdown-frame-edge-tile-horizontal);
200
+ -webkit-mask-position: left bottom;
201
+ -webkit-mask-mode: alpha;
202
+ mask-image: var(--scribdown-frame-edge-horizontal);
203
+ mask-repeat: repeat-x;
204
+ mask-size: var(--scribdown-frame-edge-tile-horizontal);
205
+ mask-position: left bottom;
206
+ mask-mode: alpha;
207
+ }
208
+ }
209
+
210
+ /* 左侧语言标签:叠加 tag.svg 背景,保留手绘质感。 */
211
+ .scribdown-markdown .scribdown-code-block__lang {
212
+ /* 关键步骤:用 inline-flex 让文字在 min-height 内纵向居中。 */
213
+ display: inline-flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ position: relative;
217
+ isolation: isolate;
218
+ box-sizing: border-box;
219
+ flex-shrink: 0;
220
+ min-height: 36px;
221
+ margin-left: 2px;
222
+ /* 关键步骤:::before 向右溢出 16px,左侧 padding 加宽以让文字在可见标签内水平居中。 */
223
+ padding: 6px 10px 6px 26px;
224
+ border-radius: 8px 12px 9px 11px;
225
+ color: var(--scribdown-code-ink);
226
+ font-family: var(--scribdown-font-code);
227
+ font-size: 14px;
228
+ font-weight: 700;
229
+ line-height: 1.15;
230
+ letter-spacing: 0.01em;
231
+ text-align: center;
232
+ white-space: nowrap;
233
+ text-transform: lowercase;
234
+ pointer-events: auto;
235
+ user-select: none;
236
+ }
237
+
238
+ /* 关键步骤:语言标签背景分层,body 可重复,左右边界固定在两侧;边框层与排线层拆开着色以独立配置颜色。 */
239
+ .scribdown-markdown .scribdown-code-block__lang::before {
240
+ content: "";
241
+ position: absolute;
242
+ z-index: -1;
243
+ box-sizing: border-box;
244
+ top: 0px;
245
+ right: -16px;
246
+ bottom: 0px;
247
+ left: 0px;
248
+ padding-right: var(--scribdown-code-block-lang-tag-right-safe-width);
249
+ pointer-events: none;
250
+ background-color: transparent;
251
+ background-image:
252
+ linear-gradient(
253
+ var(--scribdown-code-block-lang-border-fill),
254
+ var(--scribdown-code-block-lang-border-fill)
255
+ ),
256
+ linear-gradient(
257
+ var(--scribdown-code-block-lang-border-fill),
258
+ var(--scribdown-code-block-lang-border-fill)
259
+ ),
260
+ linear-gradient(
261
+ var(--scribdown-code-block-lang-border-fill),
262
+ var(--scribdown-code-block-lang-border-fill)
263
+ ),
264
+ linear-gradient(
265
+ var(--scribdown-code-block-lang-hatch-fill),
266
+ var(--scribdown-code-block-lang-hatch-fill)
267
+ ),
268
+ linear-gradient(
269
+ var(--scribdown-code-block-lang-hatch-fill),
270
+ var(--scribdown-code-block-lang-hatch-fill)
271
+ );
272
+ background-repeat: no-repeat, no-repeat, repeat-x, no-repeat, repeat-x;
273
+ background-position:
274
+ left center,
275
+ right center,
276
+ left center,
277
+ right center,
278
+ left center;
279
+ background-size:
280
+ auto 100%,
281
+ auto 100%,
282
+ auto 100%,
283
+ auto 100%,
284
+ auto 100%;
285
+ background-origin:
286
+ border-box,
287
+ border-box,
288
+ content-box,
289
+ border-box,
290
+ content-box;
291
+ background-clip:
292
+ border-box,
293
+ border-box,
294
+ content-box,
295
+ border-box,
296
+ content-box;
297
+ -webkit-mask-image:
298
+ var(--scribdown-code-block-lang-tag-left-line),
299
+ var(--scribdown-code-block-lang-tag-right-outline),
300
+ var(--scribdown-code-block-lang-tag-body-outline),
301
+ var(--scribdown-code-block-lang-tag-right-hatch),
302
+ var(--scribdown-code-block-lang-tag-body-hatch);
303
+ -webkit-mask-repeat: no-repeat, no-repeat, repeat-x, no-repeat, repeat-x;
304
+ -webkit-mask-position:
305
+ left center,
306
+ right center,
307
+ left center,
308
+ right center,
309
+ left center;
310
+ -webkit-mask-size:
311
+ auto 100%,
312
+ auto 100%,
313
+ auto 100%,
314
+ auto 100%,
315
+ auto 100%;
316
+ -webkit-mask-origin:
317
+ border-box,
318
+ border-box,
319
+ content-box,
320
+ border-box,
321
+ content-box;
322
+ -webkit-mask-clip:
323
+ border-box,
324
+ border-box,
325
+ content-box,
326
+ border-box,
327
+ content-box;
328
+ -webkit-mask-mode: alpha, alpha, alpha, alpha, alpha;
329
+ mask-image:
330
+ var(--scribdown-code-block-lang-tag-left-line),
331
+ var(--scribdown-code-block-lang-tag-right-outline),
332
+ var(--scribdown-code-block-lang-tag-body-outline),
333
+ var(--scribdown-code-block-lang-tag-right-hatch),
334
+ var(--scribdown-code-block-lang-tag-body-hatch);
335
+ mask-repeat: no-repeat, no-repeat, repeat-x, no-repeat, repeat-x;
336
+ mask-position:
337
+ left center,
338
+ right center,
339
+ left center,
340
+ right center,
341
+ left center;
342
+ mask-size:
343
+ auto 100%,
344
+ auto 100%,
345
+ auto 100%,
346
+ auto 100%,
347
+ auto 100%;
348
+ mask-origin:
349
+ border-box,
350
+ border-box,
351
+ content-box,
352
+ border-box,
353
+ content-box;
354
+ mask-clip:
355
+ border-box,
356
+ border-box,
357
+ content-box,
358
+ border-box,
359
+ content-box;
360
+ mask-mode: alpha, alpha, alpha, alpha, alpha;
361
+ }
362
+
363
+ /* 右上角复制按钮:透明背景,SVG 图标,hover/激活态轻染色。 */
364
+ .scribdown-markdown .scribdown-code-block__copy {
365
+ display: inline-flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ width: 32px;
369
+ height: 32px;
370
+ margin: 0;
371
+ padding: 0;
372
+ border: 0;
373
+ border-radius: 8px 9px 7px 10px;
374
+ background: transparent;
375
+ color: var(--scribdown-code-ink);
376
+ cursor: pointer;
377
+ pointer-events: auto;
378
+ transition:
379
+ background var(--scribdown-duration-fast) var(--scribdown-easing-standard),
380
+ transform var(--scribdown-duration-fast) var(--scribdown-easing-standard);
381
+ }
382
+
383
+ .scribdown-markdown .scribdown-code-block__copy:hover {
384
+ background: color-mix(in srgb, var(--scribdown-code-ink) 14%, transparent);
385
+ }
386
+
387
+ .scribdown-markdown .scribdown-code-block__copy:active {
388
+ transform: translateY(1px);
389
+ }
390
+
391
+ .scribdown-markdown .scribdown-code-block__copy:focus-visible {
392
+ outline: 2px solid var(--scribdown-code-ink);
393
+ outline-offset: 2px;
394
+ }
395
+
396
+ .scribdown-markdown .scribdown-code-block__copy-icon {
397
+ width: 18px;
398
+ height: 18px;
399
+ flex: none;
400
+ }
401
+
402
+ /* 复制成功时图标切换为对勾,色调由 accent 接管。 */
403
+ .scribdown-markdown
404
+ .scribdown-code-block__copy[data-scribdown-code-copied="true"]
405
+ .scribdown-code-block__copy-icon--copy {
406
+ display: none;
407
+ }
408
+
409
+ .scribdown-markdown .scribdown-code-block__copy-icon--check {
410
+ display: none;
411
+ }
412
+
413
+ .scribdown-markdown
414
+ .scribdown-code-block__copy[data-scribdown-code-copied="true"]
415
+ .scribdown-code-block__copy-icon--check {
416
+ display: inline-block;
417
+ }
418
+
419
+ /* 正文容器:内部 padding 控制代码与边框的间距,给短代码块也留呼吸空间。 */
420
+ .scribdown-markdown .scribdown-code-block__body {
421
+ position: relative;
422
+ z-index: 1;
423
+ display: grid;
424
+ grid-template-columns: var(--scribdown-code-line-gutter-width) minmax(0, 1fr);
425
+ min-height: 28px;
426
+ /* 关键步骤:body 统一处理横/纵双向滚动条,行号列用 sticky 钉左侧,
427
+ 避免长代码块的横向滚动条被纵向内容挤到视窗外。 */
428
+ max-height: var(--scribdown-code-block-max-height);
429
+ background-color: var(--scribdown-color-surface);
430
+ overflow: auto;
431
+ scrollbar-color: color-mix(in srgb, var(--scribdown-code-ink) 30%, transparent) transparent;
432
+ /* 关键步骤:纵向滚动阴影改用 inset box-shadow + animation-timeline 驱动,
433
+ 由浏览器原生绘制,天然不会画到滚动条凹槽上,无需再硬编码滚动条宽度补偿;
434
+ 横向阴影交给 sticky 的 __gutter 投影承担。
435
+ animation-range 将淡入压缩到前 80px 滚动距离,避免长代码块下阴影迟迟不饱和。 */
436
+ animation: scribdown-code-shadow-y linear both;
437
+ animation-timeline: scroll(self block);
438
+ animation-range: 0 80px;
439
+ }
440
+
441
+ @keyframes scribdown-code-shadow-y {
442
+ from {
443
+ box-shadow: inset 0 18px 18px -8px transparent;
444
+ }
445
+ to {
446
+ box-shadow: inset 0 18px 18px -8px
447
+ color-mix(in srgb, var(--scribdown-code-ink) 35%, transparent);
448
+ }
449
+ }
450
+
451
+ /* 关键步骤:行号列独立成固定宽度网格列,sticky 钉左侧,body 横向滚动时保持不动。 */
452
+ .scribdown-markdown .scribdown-code-block__gutter {
453
+ position: sticky;
454
+ left: 0;
455
+ z-index: 2;
456
+ grid-column: 1;
457
+ box-sizing: border-box;
458
+ width: var(--scribdown-code-line-gutter-width);
459
+ /* 关键步骤:sticky 后必须自带背景,否则横向滚动时代码会从行号下方透出。 */
460
+ background: var(--scribdown-color-surface);
461
+ padding-right: var(--scribdown-code-line-number-gap);
462
+ color: color-mix(in srgb, var(--scribdown-code-ink) 60%, transparent);
463
+ font-family: var(--scribdown-font-code);
464
+ font-size: 14px;
465
+ font-weight: 500;
466
+ font-variant-numeric: tabular-nums;
467
+ line-height: 1.65;
468
+ text-align: right;
469
+ pointer-events: none;
470
+ user-select: none;
471
+ /* 关键步骤:横向滚动阴影由 sticky 行号列的右侧投影呈现,
472
+ animation-timeline 跟随 body 的 inline 滚动进度,
473
+ animation-range 把淡入限制在前 80px,跟纵向阴影保持一致语义。 */
474
+ animation: scribdown-code-shadow-x linear both;
475
+ animation-timeline: scroll(nearest inline);
476
+ animation-range: 0 80px;
477
+ }
478
+
479
+ @keyframes scribdown-code-shadow-x {
480
+ from {
481
+ box-shadow: 6px 0 10px -4px transparent;
482
+ }
483
+ to {
484
+ box-shadow: 6px 0 10px -4px
485
+ color-mix(in srgb, var(--scribdown-code-ink) 35%, transparent);
486
+ }
487
+ }
488
+
489
+ .scribdown-markdown .scribdown-code-block__gutter-line {
490
+ display: block;
491
+ }
492
+
493
+ /* 关键步骤:行号列右侧绘制手绘分隔线,与外层边框风格保持一致。 */
494
+ .scribdown-markdown .scribdown-code-block__gutter::after {
495
+ content: "";
496
+ position: absolute;
497
+ top: 0;
498
+ right: 0;
499
+ bottom: 0;
500
+ width: 6px;
501
+ pointer-events: none;
502
+ background-image: var(--scribdown-rough-line-shadow-vertical);
503
+ background-repeat: repeat-y;
504
+ background-size: var(--scribdown-rough-line-shadow-tile-vertical);
505
+ background-position: right top;
506
+ opacity: 0.3;
507
+ }
508
+
509
+ @supports ((mask-image: url("")) or (-webkit-mask-image: url(""))) {
510
+ .scribdown-markdown .scribdown-code-block__gutter::after {
511
+ background-color: var(--scribdown-code-ink);
512
+ background-image: none;
513
+ -webkit-mask-image: var(--scribdown-rough-line-shadow-vertical);
514
+ -webkit-mask-repeat: repeat-y;
515
+ -webkit-mask-size: var(--scribdown-rough-line-shadow-tile-vertical);
516
+ -webkit-mask-position: right top;
517
+ -webkit-mask-mode: alpha;
518
+ mask-image: var(--scribdown-rough-line-shadow-vertical);
519
+ mask-repeat: repeat-y;
520
+ mask-size: var(--scribdown-rough-line-shadow-tile-vertical);
521
+ mask-position: right top;
522
+ mask-mode: alpha;
523
+ }
524
+ }
525
+
526
+ .scribdown-markdown .scribdown-code-block__body > pre {
527
+ position: relative;
528
+ z-index: 1;
529
+ grid-column: 2;
530
+ min-width: 0;
531
+ margin: 0;
532
+ padding: 0;
533
+ /* 关键步骤:横向滚动已上交 __body 统一处理,pre 不再独立出滚动条。 */
534
+ overflow: visible;
535
+ border: 0;
536
+ border-radius: 0;
537
+ background: transparent;
538
+ box-shadow: none;
539
+ color: var(--scribdown-code-text);
540
+ font-size: 14px;
541
+ font-weight: 500;
542
+ line-height: 1.65;
543
+ }
544
+
545
+ .scribdown-markdown .scribdown-code-block__body > pre::before {
546
+ content: none;
547
+ }
548
+
549
+ .scribdown-markdown .scribdown-code-block__body > pre code {
550
+ position: relative;
551
+ display: block;
552
+ min-width: max-content;
553
+ padding: 0;
554
+ border-radius: 0;
555
+ background: none;
556
+ background-image: none;
557
+ box-shadow: none;
558
+ color: var(--scribdown-code-text);
559
+ font-family: var(--scribdown-font-code);
560
+ font-size: inherit;
561
+ font-weight: inherit;
562
+ }
563
+
564
+ /* 行:仅渲染代码正文,行号由独立 gutter 列渲染。 */
565
+ .scribdown-markdown .scribdown-code-block__line {
566
+ display: block;
567
+ padding-right: 16px;
568
+ padding-left: 0;
569
+ }
570
+
571
+ .scribdown-markdown .scribdown-code-block__line::before {
572
+ content: none;
573
+ }
@@ -0,0 +1,29 @@
1
+ /* 内容折叠块:用户在 Markdown 中手写的原生 <details>,渲染时打标为 .scribdown-details。
2
+ 手绘边框统一由 .scribdown-frame 提供(见 frame.css),此处只负责折叠块自身的盒模型与排版。 */
3
+ .scribdown-markdown .scribdown-details {
4
+ width: fit-content;
5
+ max-width: 100%;
6
+ margin: 0 0 var(--scribdown-space-3);
7
+ padding: 10px 16px;
8
+ background: var(--scribdown-color-surface);
9
+ }
10
+
11
+ .scribdown-markdown .scribdown-details[open] {
12
+ padding-bottom: var(--scribdown-space-4);
13
+ }
14
+
15
+ .scribdown-markdown .scribdown-details > summary {
16
+ cursor: pointer;
17
+ font-family: var(--scribdown-font-heading);
18
+ font-size: 22px;
19
+ font-weight: 700;
20
+ line-height: 1.3;
21
+ }
22
+
23
+ .scribdown-markdown .scribdown-details > summary + * {
24
+ margin-top: var(--scribdown-space-3);
25
+ }
26
+
27
+ .scribdown-markdown .scribdown-details > :last-child {
28
+ margin-bottom: 0;
29
+ }
@@ -0,0 +1,71 @@
1
+ /* 手绘卡片边框:横边撑满容器宽度,竖边按固定笔触平铺。
2
+ 以 .scribdown-frame 作为可复用的「边框」基底,由内容折叠块(.scribdown-details)、
3
+ 目录根(.scribdown-toc)等元素显式 opt-in 引入;blockquote 形态单一、无歧义,
4
+ 直接以元素选择器复用同一圈边,避免重复声明这段 ::after。
5
+ 底色不在此处声明,交由各消费方自行决定(卡片用 surface,引用块用 blockquote-bg)。 */
6
+ .scribdown-markdown .scribdown-frame {
7
+ position: relative;
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .scribdown-markdown .scribdown-frame::after,
12
+ .scribdown-markdown blockquote::after {
13
+ content: "";
14
+ position: absolute;
15
+ inset: 0;
16
+ pointer-events: none;
17
+ border-radius: inherit;
18
+ background-image:
19
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
20
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
21
+ background-position:
22
+ left top,
23
+ 20% bottom,
24
+ left 40%,
25
+ right top;
26
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
27
+ background-size:
28
+ var(--scribdown-frame-edge-tile-horizontal),
29
+ var(--scribdown-frame-edge-tile-horizontal),
30
+ var(--scribdown-frame-edge-tile-vertical),
31
+ var(--scribdown-frame-edge-tile-vertical);
32
+ }
33
+
34
+ @supports ((mask-image: url("")) or (-webkit-mask-image: url(""))) {
35
+ .scribdown-markdown .scribdown-frame::after,
36
+ .scribdown-markdown blockquote::after {
37
+ /* 关键步骤:用 mask 保留 SVG 形状,描边色交给 background-color,便于主题化。 */
38
+ background-color: var(--scribdown-frame-edge-color);
39
+ background-image: none;
40
+ -webkit-mask-image:
41
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
42
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
43
+ -webkit-mask-position:
44
+ left top,
45
+ 20% bottom,
46
+ left 40%,
47
+ right top;
48
+ -webkit-mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
49
+ -webkit-mask-size:
50
+ var(--scribdown-frame-edge-tile-horizontal),
51
+ var(--scribdown-frame-edge-tile-horizontal),
52
+ var(--scribdown-frame-edge-tile-vertical),
53
+ var(--scribdown-frame-edge-tile-vertical);
54
+ -webkit-mask-mode: alpha, alpha, alpha, alpha;
55
+ mask-image:
56
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
57
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
58
+ mask-position:
59
+ left top,
60
+ 20% bottom,
61
+ left 40%,
62
+ right top;
63
+ mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
64
+ mask-size:
65
+ var(--scribdown-frame-edge-tile-horizontal),
66
+ var(--scribdown-frame-edge-tile-horizontal),
67
+ var(--scribdown-frame-edge-tile-vertical),
68
+ var(--scribdown-frame-edge-tile-vertical);
69
+ mask-mode: alpha, alpha, alpha, alpha;
70
+ }
71
+ }