@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,491 @@
1
+ /* ─── Floating Toolbar ──────────────────────────────────────────────── */
2
+ /* 完全贴右上角,横向排列「目录」+「更多」两个入口,卡片手绘风。 */
3
+ .scribdown-toolbar {
4
+ position: fixed;
5
+ top: 0;
6
+ right: 0;
7
+ z-index: 9000;
8
+ display: flex;
9
+ flex-direction: row;
10
+ align-items: center;
11
+ gap: 2px;
12
+ padding: 2px;
13
+ background: var(--scribdown-color-surface);
14
+ border: 1.5px solid var(--scribdown-color-border);
15
+ /* 关键步骤:顶/右两边贴屏,仅左下角需要圆角收口。
16
+ radius token 是四值手绘简写,无法塞进单角,故先整体套用再把贴屏的三角抹平。 */
17
+ border-radius: var(--scribdown-radius-md);
18
+ border-top-left-radius: 0;
19
+ border-top-right-radius: 0;
20
+ border-bottom-right-radius: 0;
21
+ box-shadow: var(--scribdown-shadow-md);
22
+ }
23
+
24
+ .scribdown-toolbar-btn {
25
+ position: relative;
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ width: 28px;
30
+ height: 28px;
31
+ padding: 0;
32
+ background: transparent;
33
+ border: 0;
34
+ border-radius: 999px;
35
+ color: var(--scribdown-color-text-secondary);
36
+ cursor: pointer;
37
+ transition:
38
+ color var(--scribdown-duration-fast) var(--scribdown-easing-standard),
39
+ background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
40
+ -webkit-font-smoothing: antialiased;
41
+ }
42
+
43
+ .scribdown-toolbar-btn:hover {
44
+ background: color-mix(in srgb, var(--scribdown-color-bg) 70%, transparent);
45
+ color: var(--scribdown-color-accent);
46
+ }
47
+
48
+ .scribdown-toolbar-btn:active {
49
+ background: color-mix(in srgb, var(--scribdown-color-bg) 90%, transparent);
50
+ }
51
+
52
+ .scribdown-toolbar-btn svg {
53
+ display: block;
54
+ flex-shrink: 0;
55
+ }
56
+
57
+ /* 按钮 tooltip(aria-label),hover 时显示在按钮下方。 */
58
+ .scribdown-toolbar-btn::after {
59
+ content: attr(aria-label);
60
+ position: absolute;
61
+ top: calc(100% + 6px);
62
+ left: 50%;
63
+ transform: translateX(-50%);
64
+ padding: 4px 8px;
65
+ background: var(--scribdown-color-text-primary);
66
+ border-radius: 6px;
67
+ color: var(--scribdown-color-surface);
68
+ font-family: var(--scribdown-font-body);
69
+ font-size: 12px;
70
+ line-height: 1.4;
71
+ white-space: nowrap;
72
+ pointer-events: none;
73
+ opacity: 0;
74
+ transition: opacity var(--scribdown-duration-fast) var(--scribdown-easing-standard);
75
+ }
76
+
77
+ .scribdown-toolbar-btn:hover::after {
78
+ opacity: 1;
79
+ }
80
+
81
+ /* ─── 当前章节指示器 ────────────────────────────────────── */
82
+ /* 工具栏最左侧窄条:随滚动展示当前可视区所属标题,最宽 30px,超出省略号。 */
83
+ .scribdown-toolbar-current {
84
+ position: relative;
85
+ display: flex;
86
+ align-items: center;
87
+ /* 关键步骤:撑满工具栏高度,使右侧分隔线为整条高度,划开「文字区 / 按钮区」。 */
88
+ align-self: stretch;
89
+ margin-right: 2px;
90
+ padding: 0 6px 0 4px;
91
+ border-right: 1px solid
92
+ color-mix(in srgb, var(--scribdown-color-border) 70%, transparent);
93
+ /* 关键步骤:可点击跳转到当前章节标题。 */
94
+ cursor: pointer;
95
+ }
96
+
97
+ .scribdown-toolbar-current:focus-visible {
98
+ outline: 2px solid var(--scribdown-color-accent);
99
+ outline-offset: -2px;
100
+ }
101
+
102
+ .scribdown-toolbar-current-text {
103
+ /* 关键步骤:标题内容最宽 120px,溢出以省略号收尾。 */
104
+ max-width: 120px;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ white-space: nowrap;
108
+ font-family: var(--scribdown-font-body);
109
+ font-size: 12px;
110
+ line-height: 1.2;
111
+ color: var(--scribdown-color-text-secondary);
112
+ transition: color var(--scribdown-duration-fast) var(--scribdown-easing-standard);
113
+ }
114
+
115
+ .scribdown-toolbar-current:hover .scribdown-toolbar-current-text {
116
+ color: var(--scribdown-color-accent);
117
+ }
118
+
119
+ /* hover tip:复用工具栏按钮 tip 的视觉语言,展示完整标题。
120
+ 关键步骤:工具栏贴右上角,tip 以指示器右边为锚点向左生长,避免溢出屏幕右侧。 */
121
+ .scribdown-toolbar-current::after {
122
+ content: attr(aria-label);
123
+ position: absolute;
124
+ top: calc(100% + 6px);
125
+ right: 0;
126
+ width: max-content;
127
+ max-width: min(280px, 70vw);
128
+ padding: 4px 8px;
129
+ background: var(--scribdown-color-text-primary);
130
+ border-radius: 6px;
131
+ color: var(--scribdown-color-surface);
132
+ font-family: var(--scribdown-font-body);
133
+ font-size: 12px;
134
+ line-height: 1.4;
135
+ text-align: left;
136
+ white-space: normal;
137
+ word-break: break-word;
138
+ pointer-events: none;
139
+ opacity: 0;
140
+ transition: opacity var(--scribdown-duration-fast) var(--scribdown-easing-standard);
141
+ }
142
+
143
+ /* 无内容(aria-label 为空)时不显示 tip。 */
144
+ .scribdown-toolbar-current:not([aria-label=""]):hover::after {
145
+ opacity: 1;
146
+ }
147
+
148
+ /* 「更多」按钮展开态:保持轻量描边,避免被 hover 态覆盖。 */
149
+ .scribdown-toolbar-btn--more[aria-expanded="true"] {
150
+ background: color-mix(in srgb, var(--scribdown-color-bg) 90%, transparent);
151
+ color: var(--scribdown-color-accent);
152
+ }
153
+
154
+ /* ─── 更多下拉菜单 ──────────────────────────────────────────────── */
155
+ /* 关键步骤:菜单挂在 .scribdown-toolbar 内部,绝对定位到工具栏右下方。 */
156
+ .scribdown-toolbar-menu {
157
+ position: absolute;
158
+ top: calc(100% + 6px);
159
+ right: 0;
160
+ min-width: 200px;
161
+ padding: var(--scribdown-space-1);
162
+ background: var(--scribdown-color-surface);
163
+ border: 1.5px solid var(--scribdown-color-border);
164
+ border-radius: var(--scribdown-radius-md);
165
+ box-shadow: var(--scribdown-shadow-md);
166
+ /* 关键步骤:菜单默认隐藏并保留过渡,open 后再淡入。 */
167
+ opacity: 0;
168
+ transform: translateY(-4px);
169
+ pointer-events: none;
170
+ visibility: hidden;
171
+ transition:
172
+ opacity var(--scribdown-duration-fast) var(--scribdown-easing-standard),
173
+ transform var(--scribdown-duration-fast) var(--scribdown-easing-standard),
174
+ visibility var(--scribdown-duration-fast) var(--scribdown-easing-standard);
175
+ }
176
+
177
+ .scribdown-toolbar-menu.is-open {
178
+ opacity: 1;
179
+ transform: translateY(0);
180
+ pointer-events: auto;
181
+ visibility: visible;
182
+ }
183
+
184
+ /* 单个菜单项:横向 icon + 文本。 */
185
+ .scribdown-toolbar-menu-item {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: var(--scribdown-space-2);
189
+ width: 100%;
190
+ padding: 8px 10px;
191
+ background: transparent;
192
+ border: 0;
193
+ border-radius: var(--scribdown-radius-sm);
194
+ color: var(--scribdown-color-text-primary);
195
+ font-family: var(--scribdown-font-body);
196
+ font-size: 14px;
197
+ text-align: left;
198
+ cursor: pointer;
199
+ transition:
200
+ color var(--scribdown-duration-fast) var(--scribdown-easing-standard),
201
+ background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
202
+ }
203
+
204
+ .scribdown-toolbar-menu-item:hover {
205
+ background: color-mix(in srgb, var(--scribdown-color-bg) 70%, transparent);
206
+ color: var(--scribdown-color-accent);
207
+ }
208
+
209
+ .scribdown-toolbar-menu-item svg {
210
+ flex-shrink: 0;
211
+ color: var(--scribdown-color-text-secondary);
212
+ }
213
+
214
+ .scribdown-toolbar-menu-item:hover svg {
215
+ color: var(--scribdown-color-accent);
216
+ }
217
+
218
+ /* 下拉选择分组:触发行 + 可折叠的档位列表。 */
219
+ .scribdown-toolbar-menu-group {
220
+ display: flex;
221
+ flex-direction: column;
222
+ /* 关键步骤:和上方菜单项之间用一条柔和分隔线划开层级。 */
223
+ margin-top: 4px;
224
+ padding-top: 4px;
225
+ border-top: 1px solid
226
+ color-mix(in srgb, var(--scribdown-color-border) 70%, transparent);
227
+ }
228
+
229
+ /* 触发行:复用 .scribdown-toolbar-menu-item 样式,右侧追加当前值 + chevron。 */
230
+ .scribdown-toolbar-menu-item--select {
231
+ justify-content: flex-start;
232
+ }
233
+
234
+ .scribdown-toolbar-menu-select-label {
235
+ flex: 1;
236
+ }
237
+
238
+ .scribdown-toolbar-menu-select-value {
239
+ font-family: var(--scribdown-font-code);
240
+ font-size: 12px;
241
+ color: var(--scribdown-color-text-secondary);
242
+ }
243
+
244
+ .scribdown-toolbar-menu-item--select:hover .scribdown-toolbar-menu-select-value {
245
+ color: var(--scribdown-color-accent);
246
+ }
247
+
248
+ .scribdown-toolbar-menu-select-chevron {
249
+ flex-shrink: 0;
250
+ color: var(--scribdown-color-text-secondary);
251
+ transition: transform var(--scribdown-duration-fast) var(--scribdown-easing-standard);
252
+ }
253
+
254
+ .scribdown-toolbar-menu-group.is-open .scribdown-toolbar-menu-select-chevron {
255
+ transform: rotate(180deg);
256
+ color: var(--scribdown-color-accent);
257
+ }
258
+
259
+ /* 档位列表:默认折叠,is-open 时用 max-height + padding 平滑展开。 */
260
+ .scribdown-toolbar-menu-group-choices {
261
+ display: flex;
262
+ flex-direction: column;
263
+ gap: 2px;
264
+ /* 关键步骤:与触发行文字左对齐(icon 16 + gap 8 = 24,再多 4 给视觉缩进)。 */
265
+ padding: 0 4px 0 28px;
266
+ max-height: 0;
267
+ overflow: hidden;
268
+ transition:
269
+ max-height var(--scribdown-duration-base) var(--scribdown-easing-standard),
270
+ padding var(--scribdown-duration-base) var(--scribdown-easing-standard);
271
+ }
272
+
273
+ .scribdown-toolbar-menu-group.is-open .scribdown-toolbar-menu-group-choices {
274
+ /* 关键步骤:固定档位最多 4 档 × 30px ≈ 160px,给点冗余兜底字体加大。 */
275
+ max-height: 200px;
276
+ padding: 4px 4px 4px 28px;
277
+ }
278
+
279
+ /* 档位选项:垂直列表项,左侧勾选位预留固定宽度,避免选中切换时文本抖动。 */
280
+ .scribdown-toolbar-menu-sub-item {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 6px;
284
+ width: 100%;
285
+ padding: 6px 8px;
286
+ background: transparent;
287
+ border: 0;
288
+ border-radius: var(--scribdown-radius-sm);
289
+ color: var(--scribdown-color-text-secondary);
290
+ font-family: var(--scribdown-font-code);
291
+ font-size: 12px;
292
+ line-height: 1.2;
293
+ text-align: left;
294
+ cursor: pointer;
295
+ transition:
296
+ color var(--scribdown-duration-fast) var(--scribdown-easing-standard),
297
+ background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
298
+ }
299
+
300
+ .scribdown-toolbar-menu-sub-item-mark {
301
+ display: inline-flex;
302
+ align-items: center;
303
+ justify-content: center;
304
+ width: 12px;
305
+ height: 12px;
306
+ flex-shrink: 0;
307
+ color: var(--scribdown-color-accent);
308
+ /* 关键步骤:未选中时仅隐藏视觉,保留布局占位。 */
309
+ visibility: hidden;
310
+ }
311
+
312
+ .scribdown-toolbar-menu-sub-item-mark svg {
313
+ display: block;
314
+ }
315
+
316
+ .scribdown-toolbar-menu-sub-item[aria-selected="true"] .scribdown-toolbar-menu-sub-item-mark {
317
+ visibility: visible;
318
+ }
319
+
320
+ .scribdown-toolbar-menu-sub-item:hover {
321
+ background: color-mix(in srgb, var(--scribdown-color-bg) 70%, transparent);
322
+ color: var(--scribdown-color-accent);
323
+ }
324
+
325
+ .scribdown-toolbar-menu-sub-item[aria-selected="true"] {
326
+ color: var(--scribdown-color-accent);
327
+ }
328
+
329
+ /* ─── 目录侧栏 + 正文布局 ────────────────────────────────────── */
330
+ /* 关键步骤:mountMarkdownToolbar 时给 container(即 .scribdown-page 渲染根)加 .scribdown-toc-host,
331
+ 并把已有内容包进 .scribdown-content-area > .scribdown-content-scroll:
332
+ - 渲染根:flex 横向布局,TOC 与正文并排;定高 + overflow:hidden,整页(window)不滚动。
333
+ - content-area:flex item,占满 TOC 之外的剩余宽度,仅作定位上下文(自身不滚动)。
334
+ - content-scroll:absolute + inset:0 铺满 content-area,正文的横向 + 纵向滚动都发生在此层。
335
+ 这样 TOC 开合时正文自然让位,滚动收敛在内部、外层稳定不动。 */
336
+ .scribdown-toc-host {
337
+ display: flex;
338
+ align-items: stretch;
339
+ /* TOC 宽度提到容器层,供 TOC 自身定宽 / 折叠位移共用。 */
340
+ --scribdown-toc-width: min(280px, 70vw);
341
+ /* 关键步骤:定高铺满视口;overflow:hidden 让整页不滚动,
342
+ 折叠态 TOC(负 margin)也被裁切,滚动全部下沉到 content-scroll。 */
343
+ height: 100vh;
344
+ overflow: hidden;
345
+ }
346
+
347
+ /* 关键步骤:当 flex 布局根挂在 .scribdown-page 内层的满宽外壳上时(推荐结构,避免把 body 变成 flex 根),
348
+ body 自身仍是普通块流。此时把 body 也裁掉:整页滚动收敛在 content-scroll,且第三方漏到 body 的
349
+ 绝对定位浮层(如 mermaid 渲染时留下的 .mermaidTooltip)不会撑出多余的整页滚动条。
350
+ 仅在外壳确实成为 toc-host(工具栏已挂载)时生效,不影响「未挂工具栏 / 渲染期」的正常整页滚动。 */
351
+ .scribdown-page:has(> .scribdown-toc-host) {
352
+ overflow: hidden;
353
+ }
354
+
355
+ .scribdown-content-area {
356
+ /* 占满 TOC 之外的剩余宽度;min-width:0 解除 flex item 默认最小尺寸,允许收窄交给内部滚动。 */
357
+ flex: 1 1 0;
358
+ min-width: 0;
359
+ /* 关键步骤:作为内部滚动层与光标高亮等绝对定位浮层的定位上下文(自身不滚动)。 */
360
+ position: relative;
361
+ }
362
+
363
+ .scribdown-content-scroll {
364
+ /* 关键步骤:脱离 flex 尺寸链,以 absolute + inset:0 精确铺满 content-area,
365
+ 正文超宽(表格 / 代码块)走横向滚动、超高走纵向滚动,都收敛在本层内部。 */
366
+ position: absolute;
367
+ inset: 0;
368
+ overflow: auto;
369
+ }
370
+
371
+ /* 目录侧栏:flex item 贴最左,固定宽度;默认 margin-left 负值收进容器左外,is-open 归零滑入。 */
372
+ .scribdown-toolbar-toc-panel {
373
+ --scribdown-toc-width: min(280px, 70vw);
374
+ flex-shrink: 0;
375
+ box-sizing: border-box;
376
+ width: var(--scribdown-toc-width);
377
+ /* 关键步骤:填满外层容器高度(flex stretch 对齐 + 显式 100% 兜底),
378
+ 内部支持横向 + 纵向滚动,超长 / 超宽目录条目在面板内自滚。 */
379
+ height: 100%;
380
+ /* 关键步骤:overlay 让滚动条悬浮在内容之上、不预留宽度,目录条目不被挤窄;
381
+ overflow:auto 作为不支持 overlay 时的兜底(仍可滚动,仅会预留滚动条宽度)。
382
+ 滚动条的粗细 / 配色由 .scribdown-scrollbar-thin 统一提供(挂载时一并加到本元素上)。 */
383
+ overflow: auto;
384
+ overflow: overlay;
385
+ background: var(--scribdown-color-surface);
386
+ border-right: 1.5px solid var(--scribdown-color-border);
387
+ box-shadow: var(--scribdown-shadow-md);
388
+ padding: var(--scribdown-space-4);
389
+ /* 关键步骤:margin-left 负值占据负向布局空间收起,正文 flex:1 自然占满全宽;
390
+ 切到 0 时正文让出 var(--scribdown-toc-width),整体平滑过渡。 */
391
+ margin-left: calc(-1 * var(--scribdown-toc-width));
392
+ transition: margin-left var(--scribdown-duration-base) var(--scribdown-easing-standard);
393
+ z-index: 9001;
394
+ }
395
+
396
+ .scribdown-toolbar-toc-panel.is-open {
397
+ margin-left: 0;
398
+ }
399
+
400
+ /* ─── 通用细滚动条(主题色,opt-in)────────────────────────────────
401
+ 目录侧栏(.scribdown-toolbar-toc-panel)与正文滚动层(.scribdown-content-scroll)共用:
402
+ 挂载时显式给滚动容器加 .scribdown-scrollbar-thin 引入,不在此罗列各容器选择器。
403
+ - 标准 scrollbar-width / scrollbar-color:新版 Chromium / Firefox / VS Code Webview 生效;
404
+ VS Code Webview 会在根元素注入并向下继承 scrollbar-color,显式声明可覆盖宿主值。
405
+ - ::-webkit-scrollbar:仅作不支持标准属性的旧引擎兜底(标准属性一旦生效会停用 webkit 伪元素)。 */
406
+ .scribdown-scrollbar-thin {
407
+ scrollbar-width: thin;
408
+ scrollbar-color: color-mix(in srgb, var(--scribdown-color-accent) 60%, transparent) transparent;
409
+ }
410
+
411
+ .scribdown-scrollbar-thin::-webkit-scrollbar {
412
+ width: 8px;
413
+ height: 8px;
414
+ }
415
+
416
+ .scribdown-scrollbar-thin::-webkit-scrollbar-track {
417
+ background: transparent;
418
+ }
419
+
420
+ .scribdown-scrollbar-thin::-webkit-scrollbar-thumb {
421
+ /* border + background-clip:content-box 让拇指四周留白、悬浮感更强;2px 边框后可见拇指仅 4px。
422
+ 颜色取主题强调色(accent)的半透明,与目录链接同色系。 */
423
+ background-color: color-mix(in srgb, var(--scribdown-color-accent) 55%, transparent);
424
+ background-clip: content-box;
425
+ border: 2px solid transparent;
426
+ border-radius: 999px;
427
+ }
428
+
429
+ .scribdown-scrollbar-thin::-webkit-scrollbar-thumb:hover {
430
+ background-color: color-mix(in srgb, var(--scribdown-color-accent) 80%, transparent);
431
+ }
432
+
433
+ .scribdown-toolbar-toc-panel-title {
434
+ display: flex;
435
+ align-items: center;
436
+ justify-content: space-between;
437
+ gap: var(--scribdown-space-2);
438
+ font-family: var(--scribdown-font-heading);
439
+ font-size: 16px;
440
+ font-weight: 700;
441
+ color: var(--scribdown-color-accent);
442
+ margin: 0 0 var(--scribdown-space-2);
443
+ padding-bottom: var(--scribdown-space-2);
444
+ border-bottom: 1px solid var(--scribdown-color-border);
445
+ }
446
+
447
+ /* 抽屉关闭按钮:右上角 × 图标,hover 时点亮。 */
448
+ .scribdown-toolbar-toc-panel-close {
449
+ display: inline-flex;
450
+ align-items: center;
451
+ justify-content: center;
452
+ width: 28px;
453
+ height: 28px;
454
+ padding: 0;
455
+ background: transparent;
456
+ border: 0;
457
+ border-radius: 999px;
458
+ color: var(--scribdown-color-text-secondary);
459
+ cursor: pointer;
460
+ transition:
461
+ color var(--scribdown-duration-fast) var(--scribdown-easing-standard),
462
+ background var(--scribdown-duration-fast) var(--scribdown-easing-standard);
463
+ }
464
+
465
+ .scribdown-toolbar-toc-panel-close:hover {
466
+ background: color-mix(in srgb, var(--scribdown-color-bg) 70%, transparent);
467
+ color: var(--scribdown-color-accent);
468
+ }
469
+
470
+ .scribdown-toolbar-toc-panel-close svg {
471
+ display: block;
472
+ flex-shrink: 0;
473
+ }
474
+
475
+ /* 抽屉内目录条目复用 .scribdown-toc-* 样式(见 toc.css),
476
+ 这里仅做抽屉环境下的字号微调与空态文案样式。 */
477
+ .scribdown-toolbar-toc-panel .scribdown-toc-nav {
478
+ margin-top: 0;
479
+ }
480
+
481
+ .scribdown-toolbar-toc-panel .scribdown-toc-nav a {
482
+ font-family: var(--scribdown-font-body);
483
+ font-size: 13px;
484
+ line-height: 1.5;
485
+ }
486
+
487
+ .scribdown-toolbar-toc-panel-empty {
488
+ margin: 0;
489
+ font-size: 13px;
490
+ color: var(--scribdown-color-text-secondary);
491
+ }
@@ -0,0 +1,195 @@
1
+ /* VideoRenderer:块级 video 转换为 figure,边框沿用 image-frame 同源 SVG 平铺。 */
2
+ .scribdown-markdown .scribdown-video-figure {
3
+ width: min(100%, 720px);
4
+ margin: 0 auto var(--scribdown-space-3);
5
+ }
6
+
7
+ .scribdown-markdown .scribdown-video-frame {
8
+ position: relative;
9
+ isolation: isolate;
10
+ display: block;
11
+ box-sizing: border-box;
12
+ width: 100%;
13
+ padding: 6px;
14
+ overflow: visible;
15
+ background:
16
+ radial-gradient(circle at 18px 20px, var(--scribdown-paper-grain) 0 1px, transparent 1.6px),
17
+ color-mix(in srgb, var(--scribdown-color-surface) 92%, var(--scribdown-color-border) 8%);
18
+ background-size:
19
+ 32px 29px,
20
+ auto;
21
+ border-radius: 0;
22
+ box-shadow: none;
23
+ }
24
+
25
+ /* 关键步骤:复用 blockquote 的 frame-edge SVG 平铺,与图片 frame 视觉对齐。 */
26
+ .scribdown-markdown .scribdown-video-frame::after {
27
+ content: "";
28
+ position: absolute;
29
+ z-index: 2;
30
+ inset: 0;
31
+ pointer-events: none;
32
+ background-image:
33
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
34
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
35
+ background-position:
36
+ left top,
37
+ left bottom,
38
+ left top,
39
+ right top;
40
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
41
+ background-size:
42
+ var(--scribdown-frame-edge-tile-horizontal),
43
+ var(--scribdown-frame-edge-tile-horizontal),
44
+ var(--scribdown-frame-edge-tile-vertical),
45
+ var(--scribdown-frame-edge-tile-vertical);
46
+ }
47
+
48
+ @supports ((mask-image: url("")) or (-webkit-mask-image: url(""))) {
49
+ .scribdown-markdown .scribdown-video-frame::after {
50
+ /* 关键步骤:用 mask 保留 SVG 形状,描边色交给 frame-edge-color token,便于主题化。 */
51
+ background-color: var(--scribdown-frame-edge-color);
52
+ background-image: none;
53
+ -webkit-mask-image:
54
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
55
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
56
+ -webkit-mask-position:
57
+ left top,
58
+ left bottom,
59
+ left top,
60
+ right top;
61
+ -webkit-mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
62
+ -webkit-mask-size:
63
+ var(--scribdown-frame-edge-tile-horizontal),
64
+ var(--scribdown-frame-edge-tile-horizontal),
65
+ var(--scribdown-frame-edge-tile-vertical),
66
+ var(--scribdown-frame-edge-tile-vertical);
67
+ -webkit-mask-mode: alpha, alpha, alpha, alpha;
68
+ mask-image:
69
+ var(--scribdown-frame-edge-horizontal), var(--scribdown-frame-edge-horizontal),
70
+ var(--scribdown-frame-edge-vertical), var(--scribdown-frame-edge-vertical);
71
+ mask-position:
72
+ left top,
73
+ left bottom,
74
+ left top,
75
+ right top;
76
+ mask-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
77
+ mask-size:
78
+ var(--scribdown-frame-edge-tile-horizontal),
79
+ var(--scribdown-frame-edge-tile-horizontal),
80
+ var(--scribdown-frame-edge-tile-vertical),
81
+ var(--scribdown-frame-edge-tile-vertical);
82
+ mask-mode: alpha, alpha, alpha, alpha;
83
+ }
84
+ }
85
+
86
+ .scribdown-markdown .scribdown-video {
87
+ display: block;
88
+ width: 100%;
89
+ max-width: 100%;
90
+ height: auto;
91
+ background: #000;
92
+ border: 0;
93
+ border-radius: 6px 7px 5px 6px;
94
+ box-shadow: none;
95
+ }
96
+
97
+ .scribdown-markdown .scribdown-video:focus-visible {
98
+ outline: 3px solid color-mix(in srgb, var(--scribdown-color-accent) 72%, transparent);
99
+ outline-offset: 4px;
100
+ }
101
+
102
+ .scribdown-markdown .scribdown-video-fallback {
103
+ display: none;
104
+ }
105
+
106
+ .scribdown-markdown .scribdown-video-frame--failed {
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ min-height: 180px;
111
+ padding: var(--scribdown-space-4);
112
+ background:
113
+ radial-gradient(circle at 18px 20px, var(--scribdown-paper-grain) 0 1px, transparent 1.6px),
114
+ color-mix(in srgb, var(--scribdown-color-surface) 88%, transparent);
115
+ }
116
+
117
+ .scribdown-markdown .scribdown-video-frame--failed::after {
118
+ background-image:
119
+ var(--scribdown-rough-line-dash-horizontal),
120
+ var(--scribdown-rough-line-dash-horizontal),
121
+ var(--scribdown-rough-line-dash-vertical), var(--scribdown-rough-line-dash-vertical);
122
+ background-size:
123
+ 64px 8px,
124
+ 64px 8px,
125
+ 8px 64px,
126
+ 8px 64px;
127
+ }
128
+
129
+ .scribdown-markdown .scribdown-video-frame--failed .scribdown-video {
130
+ display: none;
131
+ }
132
+
133
+ .scribdown-markdown .scribdown-video-frame--failed .scribdown-video-fallback {
134
+ position: relative;
135
+ z-index: 1;
136
+ display: flex;
137
+ flex-direction: column;
138
+ align-items: center;
139
+ max-width: 100%;
140
+ color: var(--scribdown-color-text-primary);
141
+ text-align: center;
142
+ }
143
+
144
+ /* 失败态图标:手绘风方框 + 居中三角形播放符号,区别于图片裂痕图标。 */
145
+ .scribdown-markdown .scribdown-video-fallback-icon {
146
+ position: relative;
147
+ display: block;
148
+ box-sizing: border-box;
149
+ width: 58px;
150
+ height: 46px;
151
+ margin-bottom: var(--scribdown-space-3);
152
+ border: 2px solid var(--scribdown-color-text-primary);
153
+ background: color-mix(in srgb, var(--scribdown-color-surface) 78%, var(--scribdown-color-accent) 8%);
154
+ transform: rotate(-1.5deg);
155
+ }
156
+
157
+ .scribdown-markdown .scribdown-video-fallback-icon::before {
158
+ content: "";
159
+ position: absolute;
160
+ left: 50%;
161
+ top: 50%;
162
+ width: 0;
163
+ height: 0;
164
+ border-style: solid;
165
+ border-width: 9px 0 9px 14px;
166
+ border-color: transparent transparent transparent var(--scribdown-color-accent);
167
+ transform: translate(-40%, -50%);
168
+ }
169
+
170
+ .scribdown-markdown .scribdown-video-fallback-text {
171
+ font-family: var(--scribdown-font-heading);
172
+ font-size: 20px;
173
+ font-weight: 700;
174
+ line-height: 1.25;
175
+ }
176
+
177
+ .scribdown-markdown .scribdown-video-fallback-source {
178
+ max-width: 100%;
179
+ margin-top: 4px;
180
+ overflow-wrap: anywhere;
181
+ color: var(--scribdown-color-text-secondary);
182
+ font-family: var(--scribdown-font-code);
183
+ font-size: 13px;
184
+ line-height: 1.4;
185
+ }
186
+
187
+ .scribdown-markdown :not(.scribdown-video-frame) > video {
188
+ display: block;
189
+ width: 100%;
190
+ max-width: 720px;
191
+ height: auto;
192
+ margin: 0 auto var(--scribdown-space-3);
193
+ background: #000;
194
+ border-radius: var(--scribdown-radius-md);
195
+ }