wendang-react 0.6.3 → 0.6.5

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 (120) hide show
  1. package/NOTICE.md +1 -1
  2. package/README.md +133 -1
  3. package/dist/bindings/yjs.js +1 -5
  4. package/dist/chunks/AnchoredPanel-C7jMoPze.js +1 -0
  5. package/dist/chunks/DocumentExportMenu-CUMsgq3w.js +2 -0
  6. package/dist/chunks/Dropdown-D98tXfe0.js +3 -0
  7. package/dist/chunks/MindMapCanvas-C46Q5JBU.js +163 -0
  8. package/dist/chunks/MindMapViewer-C9zxZIW8.js +13 -0
  9. package/dist/chunks/SpreadsheetViewer-CoQ4VIgj.js +23 -0
  10. package/dist/chunks/code-highlight-BmaqTe1m.js +1 -30
  11. package/dist/chunks/code-highlight-engine-BFDzDPzy.js +1 -40
  12. package/dist/chunks/comment-hint-BhUxKjKK.js +14 -0
  13. package/dist/chunks/composition-state-Bl-U1R_2.js +1 -40
  14. package/dist/chunks/extensions-BefQ1tDm.js +14 -0
  15. package/dist/chunks/fuzzy-match-DYQR-4w2.js +1 -89
  16. package/dist/chunks/hooks-C53Dp0pr.js +1 -35
  17. package/dist/chunks/i18n-B0kCsIjc.js +2 -0
  18. package/dist/chunks/index-COeA2QcQ.js +15 -0
  19. package/dist/chunks/katex-WjrodtTU.js +1 -71
  20. package/dist/chunks/locale-DWpIJ_9X.js +1 -0
  21. package/dist/chunks/mind-map-controller-Ce76mETT.js +1 -0
  22. package/dist/chunks/mind-map-delete-CVsxdXfs.js +1 -31
  23. package/dist/chunks/mind-map-input-CEWRz_t6.js +1 -43
  24. package/dist/chunks/mind-topic-text-BHXkxexr.js +30 -0
  25. package/dist/chunks/popover-placement-D3xVYdkt.js +1 -47
  26. package/dist/chunks/worksheet-engine-c84sdD4N.js +1 -0
  27. package/dist/chunks/worksheet-preview-DsDVWxIM.js +1 -129
  28. package/dist/document/viewer.js +30 -289
  29. package/dist/document.js +120 -3811
  30. package/dist/export/json.js +1 -5
  31. package/dist/export/markdown.js +1 -2
  32. package/dist/export/mindmap.js +1 -2
  33. package/dist/export/pdf.js +1 -6
  34. package/dist/export/word.js +1 -2
  35. package/dist/export.js +1 -2
  36. package/dist/i18n.js +1 -0
  37. package/dist/index.js +1 -8
  38. package/dist/locales/en-US.js +1 -0
  39. package/dist/locales/es-ES.js +1 -0
  40. package/dist/locales/ja-JP.js +1 -0
  41. package/dist/locales/ko-KR.js +1 -0
  42. package/dist/locales/zh-CN.js +1 -0
  43. package/dist/locales/zh-TW.js +1 -0
  44. package/dist/mindmap/viewer.js +1 -6
  45. package/dist/mindmap.js +3 -123
  46. package/dist/shared.js +1 -52
  47. package/dist/spreadsheet/viewer.js +1 -5
  48. package/dist/spreadsheet/xlsx.js +1 -299
  49. package/dist/spreadsheet.js +2 -120
  50. package/dist/styles/callout.css +1 -34
  51. package/dist/styles/code-block.css +1 -58
  52. package/dist/styles/content-style.css +1 -619
  53. package/dist/styles/content-tokens.css +1 -29
  54. package/dist/styles/editor-interaction.css +1 -621
  55. package/dist/styles/file-video.css +1 -12
  56. package/dist/styles/image-preview.css +1 -103
  57. package/dist/styles/mind-map-block.css +1 -14
  58. package/dist/styles/mind-map-canvas.css +1 -80
  59. package/dist/styles/mind-map-comments.css +1 -93
  60. package/dist/styles/mind-map-details.css +1 -7
  61. package/dist/styles/mind-map-preview.css +1 -7
  62. package/dist/styles/mind-map-topic.css +1 -112
  63. package/dist/styles/page-picker.css +1 -47
  64. package/dist/styles/renderer.css +1 -45
  65. package/dist/styles/spreadsheet-editor.css +1 -3
  66. package/dist/styles/tokens.css +1 -142
  67. package/dist/styles/video-dialog.css +1 -41
  68. package/dist/styles/video-embed.css +1 -35
  69. package/dist/styles.css +1 -2655
  70. package/dist/types/editor/BlockAffordance.d.ts +5 -2
  71. package/dist/types/editor/CalloutView.d.ts +2 -1
  72. package/dist/types/editor/ImagePreview.d.ts +1 -1
  73. package/dist/types/editor/PagePicker.d.ts +1 -1
  74. package/dist/types/editor/extensions.d.ts +4 -1
  75. package/dist/types/engine/editor/block-commands.d.ts +1 -1
  76. package/dist/types/engine/editor/block-menu-hover.d.ts +16 -0
  77. package/dist/types/engine/editor/extensions/locale.d.ts +3 -0
  78. package/dist/types/engine/editor/nodes/image-nodeview.d.ts +1 -1
  79. package/dist/types/engine/editor/video-block-controls.d.ts +13 -0
  80. package/dist/types/engine/host.d.ts +60 -2
  81. package/dist/types/engine/renderer/attachments.d.ts +3 -3
  82. package/dist/types/engine/shared/video-feedback.d.ts +1 -1
  83. package/dist/types/engine/worksheets/worksheet-engine.d.ts +1 -0
  84. package/dist/types/engine/worksheets/worksheet-xlsx.d.ts +6 -1
  85. package/dist/types/host-types.d.ts +2 -60
  86. package/dist/types/host.d.ts +8 -1
  87. package/dist/types/i18n.d.ts +3 -0
  88. package/dist/types/index.d.ts +2 -0
  89. package/dist/types/locales/en-US.d.ts +1 -0
  90. package/dist/types/locales/es-ES.d.ts +1 -0
  91. package/dist/types/locales/ja-JP.d.ts +1 -0
  92. package/dist/types/locales/ko-KR.d.ts +1 -0
  93. package/dist/types/locales/zh-CN.d.ts +1 -0
  94. package/dist/types/locales/zh-TW.d.ts +1 -0
  95. package/dist/types/renderer/media.d.ts +2 -1
  96. package/dist/types/spreadsheet/xlsx.d.ts +1 -1
  97. package/dist/types/wui/Dropdown.d.ts +2 -1
  98. package/dist/types/wui/index.d.ts +2 -1
  99. package/integrity.json +3140 -0
  100. package/package.json +15 -5
  101. package/verify-integrity.mjs +138 -0
  102. package/dist/chunks/AnchoredPanel-Cv4RURwF.js +0 -68
  103. package/dist/chunks/DocumentExportMenu-BrGipZ59.js +0 -75
  104. package/dist/chunks/MindMapCanvas-tkFBBs4g.js +0 -2090
  105. package/dist/chunks/MindMapViewer-DJrryb2Y.js +0 -180
  106. package/dist/chunks/SpreadsheetViewer-DxCxIUx_.js +0 -163
  107. package/dist/chunks/comment-hint-B9qcrqvn.js +0 -296
  108. package/dist/chunks/extensions-ByORRoRa.js +0 -4210
  109. package/dist/chunks/host-C-V688Rq.js +0 -197
  110. package/dist/chunks/index-DdfMnva8.js +0 -726
  111. package/dist/chunks/mind-map-controller-B6SxK3GZ.js +0 -479
  112. package/dist/chunks/mind-topic-text-DSyb95vL.js +0 -446
  113. package/dist/chunks/nodes-iKqTGr_N.js +0 -291
  114. package/dist/chunks/worksheet-engine-TJ54m0KC.js +0 -125
  115. package/third-party-notices/wendang-export@0.6.0-NOTICE.md.txt +0 -51
  116. package/third-party-notices/wendang-export@0.6.1-LICENSE.txt +0 -21
  117. package/third-party-notices/wendang-export@0.6.2-LICENSE.txt +0 -21
  118. package/third-party-notices/wendang-export@0.6.2-NOTICE.md.txt +0 -70
  119. /package/third-party-notices/{wendang-export@0.6.0-LICENSE.txt → wendang-export@0.6.4-LICENSE.txt} +0 -0
  120. /package/third-party-notices/{wendang-export@0.6.1-NOTICE.md.txt → wendang-export@0.6.4-NOTICE.md.txt} +0 -0
package/dist/styles.css CHANGED
@@ -1,2655 +1 @@
1
- /* Generated from wendang/shared CONTENT_PRESENTATION. */
2
- .wendang {
3
- --content-font-size: 16px;
4
- --content-line-height: 1.75;
5
- --content-text-color: var(--color-text);
6
- --content-heading-color: #101828;
7
- --content-table-header-bg: #edf3fc;
8
- --content-table-grid-color: #d5dfed;
9
- --content-table-font-size: calc(var(--content-font-size) * 13 / 14);
10
- --content-table-line-height: 1.5;
11
- --content-table-radius: 6px;
12
- --content-table-padding-x: 8px;
13
- --content-table-padding-y: 6px;
14
- --content-media-radius: 8px;
15
- --content-gallery-gap: 12px;
16
- --content-callout-radius: 9px;
17
- --content-callout-padding-x: 18px;
18
- --content-callout-padding-y: 16px;
19
- --content-callout-icon-width: 30px;
20
- --content-callout-icon-size: 22px;
21
- --content-callout-gap: 12px;
22
- --space-block: calc(var(--content-font-size) * 5 / 7);
23
- --space-module: calc(var(--content-font-size) * 9 / 7);
24
- --space-heading-top: calc(var(--content-font-size) * 2);
25
- --space-heading-bottom: calc(var(--content-font-size) * 5 / 7);
26
- --space-list-item: calc(var(--content-font-size) * 0.25);
27
- --space-list-block: calc(var(--content-font-size) * 0.5);
28
- --space-divider: calc(var(--content-font-size) * 2);
29
- }
30
-
31
- .wendang {
32
- --color-bg: #f6f8fc; --color-surface: #fff; --color-surface-subtle: #f5f7fa;
33
- --color-text: #1f2937; --color-text-muted: #667085; --color-text-faint: #7c8798;
34
- --color-border: #dce2eb; --color-border-strong: #b9c3d2;
35
- --color-accent: var(--wendang-accent, #2f6feb); --color-accent-soft: #eaf1ff;
36
- --color-danger: #cf3d48; --color-success: #21814b; --color-warning: #ad6b12;
37
- /*
38
- * 行内评论标记色:**同一黄色系的三档**,不引入第二种色相。
39
- *
40
- * 早先"有回复"的评论用蓝色区分,用户反馈蓝色与黄色差别太大、容易误读成
41
- * 两类不同的东西("可以搞多色,但是不要影响用户心智")。现在三档都在黄色
42
- * 家族里,靠**深浅**表达强弱:
43
- * - 普通评论:亮黄底 + 深琥珀下划线;
44
- * - 有回复:底色加深一档(表示这里更"热");
45
- * - 当前激活:再深一档。
46
- * 下划线取深琥珀(#d48806)而不是亮黄:底色变亮后,浅色下划线在浅蓝/白
47
- * 背景上都看不清(用户反馈"这个看不清,底部和背景色")。
48
- */
49
- --comment-mark-bg: #ffe58f; --comment-mark-line: #d48806;
50
- --comment-mark-bg-reply: #ffd66688; --comment-mark-line-reply: #ff9900;
51
- --comment-mark-bg-active: #ffc53d; --comment-mark-line-active: #ad6800;
52
- --content-width: 100%; --shadow-pop: 0 10px 32px #14284a20;
53
- /*
54
- * 内容排版 token(表格、标题、间距、媒体)。
55
- *
56
- * 这些变量原先只存在于 YWiki 的 web/src/styles/global.css,抽成 SDK 时
57
- * 消费方(shared/content-style.css)留下了、定义方漏掉了。CSS 变量取到
58
- * 无效值会让整条声明在计算值阶段失效,于是表格边框变成 none、表头背景
59
- * 变透明、段落与标题的间距塌成 0。颜色用绝对值,间距跟随 --content-font-size。
60
- */
61
- --content-scroll-offset: 80px;
62
- /**
63
- * 块间距(段落之间)。
64
- *
65
- * 从 `3/7`(16px 字号下 6.86px)调到 `5/7`(11.43px)。原因有两个:
66
- * 1. 6.86px 对中文正文偏紧,段与段之间读起来粘连(用户反馈"行间距处理下");
67
- * 2. 块选中时会沿块上下各外扩一段做高亮带,而外扩必须给相邻块之间保留
68
- * 可见的白缝——间距太小时这段预算不够,两个块的底色会糊成一整块
69
- * (用户实测:"带了选中背景后上下间距没了")。
70
- */
71
- --color-code-bg: #f1f5fa;
72
- color: var(--color-text); background: var(--color-surface);
73
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", sans-serif;
74
- min-width: 0; min-height: 0;
75
- }
76
- .wendang[data-wendang-theme="dark"] {
77
- --color-bg: #17191e; --color-surface: #202329; --color-surface-subtle: #292d35;
78
- --color-text: #e5e9f0; --color-text-muted: #b2bdcd; --color-text-faint: #8f9cb0;
79
- --color-border: #3b4350; --color-border-strong: #606c7e; --color-accent-soft: #243653;
80
- --content-text-color: #e8e8ec;
81
- --content-heading-color: #f0f0f3;
82
- --content-table-header-bg: #2a2e38;
83
- --content-table-grid-color: #424753;
84
- --color-code-bg: #20242c;
85
- /* 深色底上用低明度琥珀底 + 高明度下划线,保持同一黄色系的三档深浅 */
86
- --comment-mark-bg: #4a3a12; --comment-mark-line: #e8b923;
87
- --comment-mark-bg-reply: #5c4813; --comment-mark-line-reply: #ffc53d;
88
- --comment-mark-bg-active: #6b5416; --comment-mark-line-active: #ffc53d;
89
- }
90
- .wendang-root { min-height: 0; min-width: 0; height: 100%; }
91
- /**
92
- * 浮层挂载根。必须建层叠上下文:正文 `.tiptap` 自己是 `position: relative`,
93
- * 若 portal 没有 z-index,它会被正文里的图片等元素盖住——实测拖拽插入线
94
- * 就因此完全看不见(mouse 命中的是图片)。
95
- */
96
- .wendang-portal {
97
- position: relative;
98
- z-index: 1000;
99
- }
100
- /*
101
- * 基础元素样式同时作用于 `.wendang` 正文与 `.wendang-popup-scope` 弹层内容。
102
- *
103
- * 弹层(对话框、右键菜单)teleport 到 body 后不在 `.wendang` 内,只带了一份
104
- * token 副本;如果这些规则只写在 `.wendang` 下,弹层里的 input 会退回浏览器
105
- * 默认样式、`.muted`/`.small`/`.error-banner` 全部失效。用 `:is()` 让两处共用
106
- * 同一组声明,避免再复制一遍。
107
- */
108
- /* Inline topic editors own their font metrics and appearance in both canvas hosts. */
109
- :is(.wendang, .wendang-popup-scope) :where(button, input, textarea):not(:where(.mind-topic-input)) { font: inherit; box-sizing: border-box; }
110
- :is(.wendang, .wendang-popup-scope) :where(a) { color: var(--color-accent); }
111
- :is(.wendang, .wendang-popup-scope) :where(button) { cursor: pointer; }
112
- :is(.wendang, .wendang-popup-scope) .muted { color: var(--color-text-muted); }
113
- :is(.wendang, .wendang-popup-scope) .small { font-size: 12px; }
114
- :is(.wendang, .wendang-popup-scope) :where(input:not([type=checkbox]):not([type=radio]), textarea):not(.worksheet-grid *):not(:where(.mind-topic-input)) {
115
- background: var(--color-surface); color: var(--color-text); border: 1px solid var(--color-border);
116
- border-radius: 6px; padding: 6px 8px;
117
- }
118
- :is(.wendang, .wendang-popup-scope) :where(.error-banner, .error) { color: var(--color-danger); }
119
- :is(.wendang, .wendang-popup-scope) :where(.notice) { color: var(--color-text-muted); }
120
-
121
- /* 文档调色板:与存储值分开,切换主题不会改写正文或触发保存。 */
122
- .wendang {
123
- --doc-text-gray: #646a73;
124
- --doc-text-red: #d92c2c;
125
- --doc-text-orange: #b95d0b;
126
- --doc-text-yellow: #8a6c0a;
127
- --doc-text-green: #237b35;
128
- --doc-text-blue: #1971c2;
129
- --doc-text-purple: #7048e8;
130
- --doc-highlight-gray-soft: #f1f3f5;
131
- --doc-highlight-red: #ffe3e3;
132
- --doc-highlight-orange: #fff0db;
133
- --doc-highlight-yellow: #fff3bf;
134
- --doc-highlight-green: #d3f9d8;
135
- --doc-highlight-blue: #d0ebff;
136
- --doc-highlight-purple: #e5dbff;
137
- --doc-highlight-gray: #dee2e6;
138
- --doc-highlight-gray-strong: #ced4da;
139
- --doc-highlight-red-strong: #ffc9c9;
140
- --doc-highlight-orange-strong: #ffd8a8;
141
- --doc-highlight-yellow-strong: #ffec99;
142
- --doc-highlight-green-strong: #b2f2bb;
143
- --doc-highlight-blue-strong: #a5d8ff;
144
- --doc-highlight-purple-strong: #d0bfff;
145
- }
146
-
147
- .wendang[data-wendang-theme='dark'] {
148
- --doc-text-gray: #b8beca;
149
- --doc-text-red: #ff9b9b;
150
- --doc-text-orange: #ffc078;
151
- --doc-text-yellow: #f6d37a;
152
- --doc-text-green: #8ce99a;
153
- --doc-text-blue: #91caff;
154
- --doc-text-purple: #d0bfff;
155
- --doc-highlight-gray-soft: #32353d;
156
- --doc-highlight-red: #563138;
157
- --doc-highlight-orange: #523a2a;
158
- --doc-highlight-yellow: #4a4226;
159
- --doc-highlight-green: #294737;
160
- --doc-highlight-blue: #293f5b;
161
- --doc-highlight-purple: #42335b;
162
- --doc-highlight-gray: #424650;
163
- --doc-highlight-gray-strong: #555b66;
164
- --doc-highlight-red-strong: #713f47;
165
- --doc-highlight-orange-strong: #6a4b31;
166
- --doc-highlight-yellow-strong: #635732;
167
- --doc-highlight-green-strong: #355c44;
168
- --doc-highlight-blue-strong: #355476;
169
- --doc-highlight-purple-strong: #554273;
170
- }
171
- /**
172
- * 只读渲染器**专属**样式。
173
- *
174
- * 说明:内容排版(标题/列表/表格/代码/引用/高亮块/行内元素……)已收敛到
175
- * `@/shared/content-style.css` 的单一真源,编辑端与只读端共用;本文件只保留
176
- * **只有只读端才有**的东西:图片懒加载占位、公式占位/错误、附件卡片。
177
- *
178
- * 历史教训:曾因渲染器从 .vue 迁为 .ts 而丢失整个样式文件,排版静默退回浏览器
179
- * 默认——结构正常、观感没生效,是很容易漏掉的回归。因此这里显式 import。
180
- */
181
- /* One shell for the editor node view and the read-only renderer. */
182
- .ywiki-content .ywiki-code-panel {
183
- --code-bg:#ffffff;--code-header:#f7f8fa;--code-border:#e2e5e9;--code-text:#303640;--code-muted:#8a9099;
184
- --code-keyword:#d13b52;--code-string:#2e8764;--code-number:#a66e12;--code-title:#8250b5;--code-property:#476f9c;--code-comment:#8a9099;--code-tag:#bf3c51;
185
- position:relative;min-width:0;max-width:100%;border:1px solid var(--code-border);border-radius:7px;
186
- background:var(--code-bg);color:var(--code-text);isolation:isolate;
187
- }
188
- .ywiki-content .ywiki-code-panel.code-theme-soft {
189
- --code-bg:#f5f8fc;--code-header:#edf2f8;--code-border:#dce4ef;--code-text:#34445b;--code-muted:#8492a7;
190
- --code-keyword:#3478bd;--code-string:#318b6d;--code-number:#9b7a1e;--code-title:#9851c4;--code-property:#516c9f;--code-comment:#8492a7;--code-tag:#b14c6c;
191
- }
192
- [data-wendang-theme='dark'] .ywiki-content .ywiki-code-panel.code-theme-auto,
193
- .ywiki-content .ywiki-code-panel.code-theme-night {
194
- --code-bg:#20242c;--code-header:#272c35;--code-border:#373e49;--code-text:#d7dde7;--code-muted:#929cac;
195
- --code-keyword:#f58196;--code-string:#a5cf8b;--code-number:#efbc82;--code-title:#c6a0ee;--code-property:#89b9ee;--code-comment:#919cab;--code-tag:#f08a9d;
196
- }
197
- .code-toolbar {display:flex;align-items:center;gap:7px;min-height:38px;padding:4px 9px;background:var(--code-header);border-bottom:1px solid var(--code-border);border-radius:6px 6px 0 0;font:12px/1.5 var(--font-sans,system-ui,sans-serif);color:var(--code-muted);user-select:none;}
198
- .code-toolbar-host {position:relative;z-index:2;}
199
- .code-toolbar-actions {display:flex;align-items:center;gap:7px;margin-left:auto;min-width:0;}
200
- .code-toolbar-summary {font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap;}
201
- /*
202
- * 语言选择器在代码块的深色标题栏里,必须把 wui 的语义变量改指向代码块色板,
203
- * 否则会是一块白底控件。面板本身渲染在 portal 根(正文之外),不继承这些
204
- * 变量,因此下拉列表仍是普通的浅色菜单 —— 与其它菜单一致。
205
- */
206
- .code-language-select {width:146px;font-size:12px;--w-surface:var(--code-header);--w-text:var(--code-text);--w-text-faint:var(--code-muted);--w-border-strong:var(--code-border);--w-border:var(--code-border);--w-surface-subtle:color-mix(in srgb,var(--code-text) 10%,transparent);}
207
- .code-language-label {max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;}
208
- .code-toolbar-divider {height:15px;border-left:1px solid var(--code-border);margin:0 2px;}
209
- .code-toolbar .code-copy-button,.code-toolbar .code-settings-button,.code-toolbar .code-fold-button {color:var(--code-muted);background:transparent;}
210
- .code-toolbar .code-copy-button {min-width:86px;}
211
- .code-toolbar .code-copy-button:hover,.code-toolbar .code-settings-button:hover,.code-toolbar .code-fold-button:hover {color:var(--code-text);background:color-mix(in srgb,var(--code-text) 6%,transparent);}
212
- .code-copy-button svg {vertical-align:middle;}
213
- .code-copy-announcement {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);}
214
- .code-option-check {float:right;margin-left:24px;}
215
- .code-theme-swatch {display:inline-block;width:13px;height:13px;vertical-align:-2px;margin-right:8px;border:1px solid #c7ccd4;border-radius:3px;background:#fff;}
216
- .code-theme-swatch[data-code-swatch='auto'] {background:linear-gradient(90deg,#fff 50%,#303743 50%);}
217
- .code-theme-swatch[data-code-swatch='soft'] {background:#e6effa;}
218
- .code-theme-swatch[data-code-swatch='night'] {background:#272c35;}
219
- .ywiki-content .ywiki-code-panel .code-scroll {display:flex;align-items:stretch;position:relative;overflow:auto;max-height:464px;border-radius:0 0 6px 6px;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--code-muted) 45%,transparent) transparent;background:var(--code-bg);}
220
- .ywiki-content .ywiki-code-panel .code-scroll[hidden] {display:none;}
221
- .ywiki-content .ywiki-code-panel.is-unlimited .code-scroll {max-height:none;}
222
- .ywiki-content .ywiki-code-panel .code-line-numbers,
223
- .ywiki-content .ywiki-code-panel pre.doc-code {font:13px/22px ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-variant-ligatures:none;tab-size:2;white-space:pre;}
224
- .ywiki-content .ywiki-code-panel .code-line-numbers {position:sticky;left:0;z-index:1;align-self:stretch;flex:0 0 auto;min-width:42px;box-sizing:border-box;padding:12px 10px 12px 12px;text-align:right;color:var(--code-muted);background:var(--code-bg);border-right:1px solid color-mix(in srgb,var(--code-border) 65%,transparent);user-select:none;pointer-events:none;}
225
- .ywiki-content .ywiki-code-panel pre.doc-code {flex:1 0 auto;min-width:0;max-width:none;margin:0!important;padding:12px 16px;border:0;border-radius:0;background:var(--code-bg);color:var(--code-text);overflow:visible;}
226
- .ywiki-content .ywiki-code-panel pre.doc-code code {display:block;margin:0;padding:0;border:0;background:none;color:var(--code-text);font:inherit;white-space:inherit;tab-size:inherit;border-radius:0;}
227
- .ywiki-content .ywiki-code-panel.is-collapsed .code-toolbar {border-bottom:0;border-radius:6px;}
228
- .ywiki-content .ywiki-code-panel:focus-within {border-color:color-mix(in srgb,var(--color-accent) 45%,var(--code-border));}
229
- .ywiki-content .ywiki-code-panel .code-scroll:focus-visible {outline:2px solid var(--color-accent);outline-offset:-2px;}
230
- .ywiki-content .ywiki-code-panel :where(.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-meta) {color:var(--code-keyword);}
231
- .ywiki-content .ywiki-code-panel :where(.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute) {color:var(--code-string);}
232
- .ywiki-content .ywiki-code-panel :where(.hljs-number,.hljs-symbol,.hljs-bullet,.hljs-variable,.hljs-template-variable) {color:var(--code-number);}
233
- .ywiki-content .ywiki-code-panel :where(.hljs-title,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-type) {color:var(--code-title);}
234
- .ywiki-content .ywiki-code-panel :where(.hljs-built_in,.hljs-attr,.hljs-property) {color:var(--code-property);}
235
- .ywiki-content .ywiki-code-panel :where(.hljs-comment,.hljs-quote) {color:var(--code-comment);font-style:normal;}
236
- .ywiki-content .ywiki-code-panel :where(.hljs-tag,.hljs-name,.hljs-deletion) {color:var(--code-tag);}
237
- @media(max-width:600px){.code-toolbar{gap:4px;padding-inline:6px}.code-toolbar-actions{gap:4px}.code-language-select{width:108px}.code-toolbar-summary{display:none}.code-toolbar-divider{margin:0}.code-language-label{max-width:100px}.code-copy-button{min-width:72px!important}}
238
- @media print{.ywiki-content .ywiki-code-panel .code-scroll{max-height:none!important;overflow:visible!important;display:flex!important}.code-toolbar-actions,.code-fold-button{display:none!important}.ywiki-content .ywiki-code-panel{break-inside:avoid}.ywiki-content .ywiki-code-panel pre.doc-code{white-space:pre-wrap;overflow-wrap:anywhere;flex-shrink:1}}
239
- /* Tokens are document presentation; saved attributes never contain free CSS values. */
240
- [data-wendang-theme] {
241
- --callout-border-gray:#c7cbd1;--callout-border-red:#f0a2a2;--callout-border-orange:#ffc078;--callout-border-yellow:#e3ca71;
242
- --callout-border-green:#91d4a0;--callout-border-blue:#9ac5ef;--callout-border-purple:#c0a4ed;
243
- }
244
- [data-wendang-theme='dark'] {
245
- --callout-border-gray:#697181;--callout-border-red:#a7606b;--callout-border-orange:#a97843;--callout-border-yellow:#97844a;
246
- --callout-border-green:#5c8b6c;--callout-border-blue:#587fa9;--callout-border-purple:#8667af;
247
- }
248
- .ywiki-content .doc-callout {
249
- --callout-first-line-height:calc(var(--content-font-size) * var(--content-line-height));
250
- position:relative;display:grid;grid-template-columns:var(--content-callout-icon-width) minmax(0,1fr);column-gap:var(--content-callout-gap);align-items:start;
251
- border:1px solid var(--callout-border,var(--callout-border-blue));border-radius:var(--content-callout-radius);
252
- background:var(--callout-fill,var(--doc-highlight-blue));color:var(--callout-text,var(--content-text-color));
253
- padding:var(--content-callout-padding-y) var(--content-callout-padding-x);
254
- }
255
- .ywiki-content .doc-callout[data-icon-hidden='true'] {grid-template-columns:minmax(0,1fr);}
256
- .callout-controls-host {display:contents;}
257
- .ywiki-content .doc-callout-content {grid-column:2;grid-row:1;min-width:0;color:inherit;}
258
- .ywiki-content .doc-callout[data-icon-hidden='true']>.doc-callout-content {grid-column:1;}
259
- .ywiki-content .doc-callout .callout-icon {
260
- grid-column:1;grid-row:1;align-self:start;display:inline-flex;align-items:center;justify-content:center;
261
- width:var(--content-callout-icon-width);min-width:var(--content-callout-icon-width);height:var(--callout-first-line-height);min-height:0;padding:0;
262
- font-size:var(--content-callout-icon-size);line-height:1;user-select:none;color:inherit;
263
- }
264
- /* A heading on the first line has its own size and leading; later paragraphs do not move the icon. */
265
- .ywiki-content .doc-callout:has(>.doc-callout-content>h1:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.625 * 1.3);}
266
- .ywiki-content .doc-callout:has(>.doc-callout-content>h2:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.375 * 1.3);}
267
- .ywiki-content .doc-callout:has(>.doc-callout-content>h3:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.125 * 1.3);}
268
- .ywiki-content .doc-callout:has(>.doc-callout-content>:is(h4,h5,h6):first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.3);}
269
- .ywiki-content .doc-callout>.doc-callout-content>:first-child {margin-top:0;}
270
- .ywiki-content .doc-callout>.doc-callout-content>:last-child {margin-bottom:0;}
271
- .ywiki-content .doc-callout-content :where(h1,h2,h3,h4,h5,h6) {color:inherit;}
272
- @media(max-width:600px){.ywiki-content .doc-callout{padding:12px;column-gap:9px;}}
273
-
274
- /**
275
- * 内容排版**单一真源**。
276
- *
277
- * 为什么单独一个文件(对齐《Wiki好用技术方案》1.1 的「单一 schema 真源」):
278
- * 正文的观感必须在**编辑态与只读态完全一致**。此前编辑端样式写在
279
- * `EditorPane.vue` 的 `.ywiki-prose`、只读端写在 `renderer/renderer.css`
280
- * 的 `.doc-renderer`,两份各改各的——实测已经漂移(标题上间距 1.2em vs 1.6em、
281
- * h5/h6 两端都没定义)。这里收敛为一份,两端只在根元素上带同一个类
282
- * `ywiki-content`:
283
- * - 编辑端:`editorProps.attributes.class = 'ywiki-prose ywiki-content'`
284
- * - 只读端:`DocRenderer` 根节点 `class="doc-renderer ywiki-content"`
285
- *
286
- * 只保留「只有一端才有」的规则在各自文件里(如编辑端的块手柄、只读端的
287
- * 图片懒加载占位)。凡是两端都会渲染的元素,样式只写在这里。
288
- *
289
- * 尺度以 docs/Wiki内容区域规范.md 为准;数值是 YWiki 的产品基线。
290
- * 块间距由文件末尾的 flow 规则统一处理,容器结构使用 :where(),确保编辑根
291
- * 与阅读根以及兼容 .doc-body 容器的选择器优先级相同。元素规则不再各自声明纵向 margin。
292
- */
293
-
294
- /* ---------------------------------------------------------------- 根与节奏 */
295
- .ywiki-content {
296
- min-width: 0;
297
- container-type: inline-size;
298
- container-name: wiki-content;
299
- font-size: var(--content-font-size);
300
- line-height: var(--content-line-height);
301
- color: var(--content-text-color);
302
- /* 标点空白裁剪(支持的浏览器生效);不修改正文中的中英文空格。 */
303
- text-spacing-trim: space-all;
304
- overflow-wrap: anywhere;
305
- word-break: normal;
306
- }
307
-
308
- /* reset 与 flow 都只有 .ywiki-content 的一份 class 权重。
309
- 避免 p/ul/pre 的 margin: 0 压过编辑端的相邻块间距。 */
310
- .ywiki-content :where(p, h1, h2, h3, h4, h5, h6, ul, ol, blockquote, pre, table, hr, img) {
311
- margin-block: 0;
312
- }
313
- /* 用户输入的空段落也必须在阅读端保留一行,不能只在编辑端占高度。 */
314
- .ywiki-content p:empty {
315
- min-height: calc(1em * var(--content-line-height));
316
- }
317
- .ywiki-content :where(h1, h2, h3, h4, h5, h6):empty {
318
- min-height: 1.3em;
319
- }
320
-
321
- /* ---------------------------------------------------------------- 标题层级
322
- 标题字号随正文 token 等比缩放。
323
- 字重统一 600(原 650 偏重),标题带轻微负字距更像正文排版而非 UI 文本。 */
324
- .ywiki-content h1,
325
- .ywiki-content h2,
326
- .ywiki-content h3,
327
- .ywiki-content h4,
328
- .ywiki-content h5,
329
- .ywiki-content h6 {
330
- font-weight: 600;
331
- color: var(--content-heading-color);
332
- line-height: 1.3;
333
- letter-spacing: -0.01em;
334
- /* 目录跳转时留出顶部空间,避免标题被页头挡住 */
335
- scroll-margin-top: var(--content-scroll-offset);
336
- }
337
- .ywiki-content h1 { font-size: calc(var(--content-font-size) * 1.625); }
338
- .ywiki-content h2 { font-size: calc(var(--content-font-size) * 1.375); }
339
- .ywiki-content h3 { font-size: calc(var(--content-font-size) * 1.125); }
340
- .ywiki-content h4 { font-size: var(--content-font-size); }
341
- .ywiki-content h5 { font-size: var(--content-font-size); }
342
- .ywiki-content h6 {
343
- font-size: var(--content-font-size);
344
- color: var(--color-text-muted);
345
- letter-spacing: 0;
346
- }
347
-
348
- /* ---------------------------------------------------------------- 列表 */
349
- .ywiki-content ul,
350
- .ywiki-content ol {
351
- padding-left: 1.5em;
352
- }
353
- .ywiki-content ul { list-style: disc; }
354
- .ywiki-content ol { list-style: decimal; }
355
- /* 层级用不同符号区分,长嵌套下更容易看清层级。 */
356
- .ywiki-content ul ul { list-style: circle; }
357
- .ywiki-content ul ul ul { list-style: square; }
358
- .ywiki-content li + li { margin-top: var(--space-list-item); }
359
- .ywiki-content li::marker { color: var(--color-text-muted); }
360
- /* 列表项段落的 reset 与内部间距同样由 flow 规则提供。 */
361
-
362
- /* 待办列表:编辑端是 ul[data-type='taskList'],只读端是 ul.doc-task-list。
363
- 勾选框与正文左缘齐平、且与首行文字垂直居中(此前水平缩进 4px、垂直偏低约 5px,
364
- 用户反馈"不对齐")。刻意不用普通列表的 1.5em 缩进——待办项希望勾选框与
365
- 上方段落左对齐,读起来是一条直线。 */
366
- .ywiki-content ul.doc-task-list,
367
- .ywiki-content ul[data-type='taskList'] {
368
- list-style: none;
369
- padding-left: 0;
370
- }
371
- .ywiki-content li.doc-task-item,
372
- .ywiki-content ul[data-type='taskList'] > li {
373
- display: flex;
374
- gap: 0.5em;
375
- align-items: flex-start;
376
- line-height: var(--content-line-height);
377
- }
378
- .ywiki-content li.doc-task-item > input[type='checkbox'],
379
- .ywiki-content ul[data-type='taskList'] > li > label > input[type='checkbox'] {
380
- flex: none;
381
- font: inherit;
382
- width: 1em;
383
- height: 1em;
384
- margin: 0;
385
- accent-color: var(--color-accent);
386
- }
387
- /* 阅读端的 input 直接参与任务项布局,用上边距对齐首行。
388
- 编辑端由首行等高的 label 居中,不能再给 input 叠加这段偏移。 */
389
- .ywiki-content li.doc-task-item > input[type='checkbox'] {
390
- margin-top: calc((var(--content-line-height) - 1) * 0.5em);
391
- }
392
- .ywiki-content li.doc-task-item > span,
393
- .ywiki-content ul[data-type='taskList'] > li > div {
394
- min-width: 0;
395
- flex: 1;
396
- }
397
-
398
- /* ---------------------------------------------------------------- 引用 */
399
- .ywiki-content blockquote {
400
- border-left: 3px solid var(--color-border-strong);
401
- padding: 0.1em 0 0.1em 1em;
402
- color: var(--color-text-muted);
403
- }
404
-
405
- /* 代码块外观由 code-block.css 统一;裸 pre 用于兼容内容。 */
406
- .ywiki-content pre { overflow:auto; padding:12px 16px; border:1px solid var(--color-border); border-radius:6px; background:var(--color-code-bg); font:13px/22px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; }
407
- .ywiki-content code { background:var(--color-surface-subtle);border:1px solid var(--color-border);border-radius:4px;padding:.1em .35em;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.875em; }
408
-
409
- /* ---------------- 编辑端:公式就地编辑(nodeView) ---------------- */
410
- .math-node { cursor: pointer; }
411
- /* 渲染结果就位后,把它包在带淡底的容器里,提示"这是一段可点击编辑的公式" */
412
- .math-node .math-render { border-radius: 4px; }
413
- .math-node:hover .math-render {
414
- background: color-mix(in srgb, var(--color-accent) 10%, transparent);
415
- }
416
- .math-node.is-editing .math-render { display: none; }
417
- .math-latex-input {
418
- width: 100%;
419
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
420
- font-size: 0.875em;
421
- padding: 2px 6px;
422
- border: 1px solid var(--color-accent);
423
- border-radius: 4px;
424
- background: var(--color-surface);
425
- color: var(--color-text);
426
- }
427
- /* ---------------------------------------------------------------- 表格
428
- 文档网格:白色内容区、浅色表头、圆角外框;读写端共用。 */
429
- .ywiki-content table,
430
- .ywiki-content .doc-table {
431
- --table-grid-color: var(--content-table-grid-color);
432
- --table-header-bg: var(--content-table-header-bg);
433
- border-collapse: separate;
434
- border-spacing: 0;
435
- /* 无显式列宽时按内容分配,避免说明列与短标签列被强制等分。
436
- 有 colwidth 的表格仍通过两端共同的 colgroup + 表宽保留作者尺寸。 */
437
- table-layout: auto;
438
- width: 100%;
439
- font-size: var(--content-table-font-size);
440
- background: var(--color-surface);
441
- border: 1px solid var(--table-grid-color);
442
- border-radius: var(--content-table-radius);
443
- overflow: hidden;
444
- }
445
- .ywiki-content :where(.doc-table-wrap, .tableWrapper) {
446
- overflow-x: auto;
447
- scrollbar-width: thin;
448
- scrollbar-color: var(--color-border-strong) transparent;
449
- }
450
- .ywiki-content th,
451
- .ywiki-content td {
452
- border: none;
453
- border-right: 1px solid var(--table-grid-color);
454
- border-bottom: 1px solid var(--table-grid-color);
455
- padding: var(--content-table-padding-y) var(--content-table-padding-x);
456
- line-height: var(--content-table-line-height);
457
- min-width: 60px;
458
- text-align: left;
459
- vertical-align: top;
460
- overflow-wrap: anywhere;
461
- }
462
- .ywiki-content th {
463
- background: var(--table-header-bg);
464
- color: var(--content-heading-color);
465
- font-weight: 600;
466
- }
467
- .ywiki-content tr:last-child > :where(td, th) { border-bottom: none; }
468
- .ywiki-content tr > :where(td, th):last-child { border-right: none; }
469
- .ywiki-content tr:first-child > :where(td, th):first-child { border-top-left-radius: 5px; }
470
- .ywiki-content tr:first-child > :where(td, th):last-child { border-top-right-radius: 5px; }
471
- .ywiki-content tr:last-child > :where(td, th):first-child { border-bottom-left-radius: 5px; }
472
- .ywiki-content tr:last-child > :where(td, th):last-child { border-bottom-right-radius: 5px; }
473
-
474
- /* ---------------------------------------------------------------- 分割线 */
475
- .ywiki-content hr {
476
- border: none;
477
- border-top: 1px solid var(--color-border);
478
- }
479
-
480
- /* ---------------------------------------------------------------- 图片 */
481
- /* 图注(阅读端由 DocRenderer 渲染在图片下方) */
482
- .ywiki-content .doc-image-caption {
483
- margin-top: 6px;
484
- color: var(--color-text-muted);
485
- font-size: 12px;
486
- line-height: 1.5;
487
- text-align: center;
488
- overflow: hidden;
489
- text-overflow: ellipsis;
490
- white-space: nowrap;
491
- }
492
- .ywiki-content .doc-image-gallery {
493
- display: flex;
494
- flex-wrap: wrap;
495
- align-items: flex-start;
496
- gap: 8px;
497
- width: 100%;
498
- }
499
- .ywiki-content .doc-image-gallery > .doc-image[data-sized] {
500
- /* 图库内的图由容器统一排布,忽略作者对单图设置的宽度。 */
501
- margin-inline: 0;
502
- }
503
- /**
504
- * 图片行:按比例铺满整行(与编辑态同一口径)。
505
- *
506
- * 列宽由 `flex-grow: 比例` 分配,高度由 `aspect-ratio` 自动产生,
507
- * 因此同行几乎等高、右侧没有空白。
508
- */
509
- .ywiki-content .doc-image-gallery {
510
- gap: var(--content-gallery-gap);
511
- align-items: flex-start;
512
- }
513
- .ywiki-content .doc-image-gallery > .doc-image {
514
- flex: 1 1 0;
515
- min-width: 0;
516
- width: auto;
517
- height: auto;
518
- max-width: none;
519
- margin: 0;
520
- aspect-ratio: var(--doc-image-aspect-ratio, 1.3333);
521
- object-fit: contain;
522
- /* 权重 = 原始比例 × 用户拖角设定的相对缩放 */
523
- flex-grow: calc(var(--doc-image-aspect-ratio, 1) * var(--doc-image-weight, 1));
524
- }
525
- /**
526
- * 带图注的图片在图片行里被一层 `<figure>` 包住,因此 **figure 才是 flex 子项**。
527
- *
528
- * 缺了这条规则时 figure 用默认 `flex: 0 1 auto`,按内部图片的固有宽度占位,
529
- * 整行被挤成多行(实测两张 4:3 图变成上下两行、右侧留白),与"按比例铺满"
530
- * 的口径不一致。变量由渲染器同时写到 figure 上(见 DocRenderer 的 galleryVars)。
531
- */
532
- .ywiki-content .doc-image-gallery > .doc-image-figure {
533
- flex: 1 1 0;
534
- min-width: 0;
535
- margin: 0;
536
- flex-grow: calc(var(--doc-image-aspect-ratio, 1) * var(--doc-image-weight, 1));
537
- }
538
- .ywiki-content .doc-image-gallery > .doc-image-figure > .doc-image {
539
- /* 图注容器已按比例分到列宽,图片铺满容器即可。 */
540
- width: 100%;
541
- max-width: 100%;
542
- margin: 0;
543
- }
544
- .ywiki-content .doc-image-gallery > .doc-image-figure > .doc-image-caption {
545
- /* 行内已有 12px 列间距,图注不再额外缩进,跟随图片列宽。 */
546
- margin-inline: 0;
547
- }
548
- .ywiki-content img,
549
- .ywiki-content .doc-image {
550
- display: block;
551
- margin-inline: auto;
552
- max-width: 100%;
553
- height: auto;
554
- border-radius: var(--content-media-radius);
555
- }
556
-
557
- /**
558
- * 图片读取中:**渐变沿边框流动**的加载指示。
559
- *
560
- * ## 为什么不再用"整块灰底 + 微光"
561
- *
562
- * 静态灰块在浅色页面上几乎看不出是在加载,看起来更像"图丢了"或"这里是一块
563
- * 空白"(用户多轮反馈)。改成一条沿边框奔跑的渐变——像贪吃蛇那样顺着圆角
564
- * 绕圈,既明确表达"正在取",又不会往图片区域里填任何东西。
565
- *
566
- * ## 实现要点
567
- *
568
- * 1. **conic-gradient + 遮罩挖空**:整块铺一个锥形渐变,再用
569
- * `mask-composite: exclude` 把中间挖掉,只留 2px 的一圈。
570
- * `<img>` 是替换元素、`::before` 不渲染,所以不能像普通元素那样做双层。
571
- * 2. **旋转靠 `@property` 注册角度变量**:conic-gradient 的 `from` 角度是离散值,
572
- * 只有注册成 `<angle>` 类型才能被 `@keyframes` 平滑插值。不支持 `@property`
573
- * 的浏览器会停在静态渐变上(仍有边框,只是不转)。
574
- * 3. **加载完成时 `data-loading` 消失** → 遮罩一并移除,图片正常显示,
575
- * 不会因为残留的 mask 把图片裁掉。
576
- */
577
- @property --ywiki-image-flow-angle {
578
- syntax: '<angle>';
579
- initial-value: 0deg;
580
- inherits: false;
581
- }
582
-
583
- .ywiki-content .doc-image[data-loading] {
584
- box-sizing: border-box;
585
- /* 这 3px 就是"边框"的厚度:遮罩只保留它,中间透明 */
586
- padding: 3px;
587
- border-radius: var(--content-media-radius);
588
- background-image: conic-gradient(
589
- from var(--ywiki-image-flow-angle),
590
- color-mix(in srgb, var(--color-accent) 14%, var(--color-surface-subtle)) 0turn 55%,
591
- color-mix(in srgb, var(--color-accent) 55%, transparent) 78%,
592
- var(--color-accent) 92%,
593
- color-mix(in srgb, var(--color-accent) 14%, var(--color-surface-subtle)) 100%
594
- );
595
- -webkit-mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
596
- -webkit-mask-clip: content-box, border-box;
597
- -webkit-mask-composite: xor;
598
- mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
599
- mask-clip: content-box, border-box;
600
- mask-composite: exclude;
601
- animation: ywiki-image-flow 1.4s linear infinite;
602
- /* 独立图片没有 aspect-ratio 可撑高:给一个最小高度,否则框不可见 */
603
- min-height: 120px;
604
- }
605
- /* 图片行内的高度由 aspect-ratio 决定,不要再叠加最小高度(会把行撑高) */
606
- .ywiki-content .doc-image-gallery > .doc-image[data-loading] {
607
- min-height: 0;
608
- }
609
- @keyframes ywiki-image-flow {
610
- to { --ywiki-image-flow-angle: 360deg; }
611
- }
612
- /**
613
- * 加载失败:一条很淡的实线边框 + 极浅底色,**不流动**。
614
- *
615
- * 与"加载中"靠"有没有在转"区分:正在转 = 还在取,静止 = 取不到。不需要图标
616
- * 或文字(它们在大块图片里比图片本身还抢眼,用户实测反馈更丑)。
617
- * 不用虚线:虚线在缩略图上会碎成一段段,看起来像边框画错了。
618
- */
619
- .ywiki-content .doc-image[data-image-error] {
620
- box-sizing: border-box;
621
- min-height: 72px;
622
- background-color: color-mix(in srgb, var(--color-surface-subtle) 70%, var(--color-border));
623
- border-radius: var(--content-media-radius);
624
- outline: 1px solid color-mix(in srgb, var(--color-border-strong) 55%, transparent);
625
- outline-offset: -1px;
626
- /*
627
- * 破图图标不在这里处理:组件在失败时给 `<img>` 换上透明像素(见
628
- * `LazyAttachmentImage` 的 `TRANSPARENT_PIXEL`)。CSS 侧的 `content: ''`、
629
- * `text-indent`、`font-size: 0` 都盖不住浏览器为失败图片绘制的那个图标。
630
- */
631
- }
632
- .ywiki-content .doc-image-gallery > .doc-image[data-image-error] {
633
- min-height: 0;
634
- }
635
- @media (prefers-reduced-motion: reduce) {
636
- /* 减少动效:保留渐变的光段,只是不再旋转 */
637
- .ywiki-content .doc-image[data-loading] {
638
- animation: none;
639
- }
640
- }
641
-
642
- /*
643
- * 作者显式缩放过的图片(data-sized):**左对齐**,宽度即作者设定值。
644
- * 与编辑端同一口径(EditorPane 的 .ywiki-image-frame[data-sized]):
645
- * 缩放锚点固定在左缘,编辑端与阅读端观感一致;未缩放的图仍居中。
646
- */
647
- .ywiki-content .doc-image[data-sized] {
648
- margin-left: 0;
649
- margin-right: auto;
650
- }
651
-
652
- /*
653
- * 图片工具条设置的显式对齐(data-align)优先于上面的默认规则。
654
- * 三端共用同一语义:编辑端用 flex 对齐容器,阅读端用 margin 对齐图片。
655
- */
656
- .ywiki-content .doc-image[data-align='left'] { margin-left: 0; margin-right: auto; }
657
- .ywiki-content .doc-image[data-align='center'] { margin-left: auto; margin-right: auto; }
658
- .ywiki-content .doc-image[data-align='right'] { margin-left: auto; margin-right: 0; }
659
-
660
- /* ---------------------------------------------------------------- 链接与行内 chip */
661
- .ywiki-content a,
662
- .ywiki-content .doc-link {
663
- color: var(--color-accent);
664
- text-decoration: none;
665
- }
666
- .ywiki-content a:hover,
667
- .ywiki-content .doc-link:hover { text-decoration: underline; }
668
-
669
- /* 页面引用:蓝色文字 + 淡下划线。 */
670
- .ywiki-content .doc-page-link {
671
- color: var(--color-accent);
672
- text-decoration: none;
673
- border-bottom: 1px solid color-mix(in srgb, var(--color-accent) 40%, transparent);
674
- }
675
- .ywiki-content .doc-page-link:hover {
676
- border-bottom-color: var(--color-accent);
677
- text-decoration: none;
678
- }
679
- .ywiki-content .doc-page-link-plain { color: var(--color-text); }
680
-
681
- /* @提及:蓝色药丸 */
682
- .ywiki-content .doc-mention {
683
- color: var(--color-accent);
684
- background: var(--color-accent-soft);
685
- border-radius: 4px;
686
- padding: 0.05em 0.35em;
687
- font-size: 0.95em;
688
- font-weight: 500;
689
- white-space: nowrap;
690
- }
691
-
692
- /* 文字高亮:无自定义颜色时的默认底色(自定义色走内联 style 覆盖) */
693
- .ywiki-content mark,
694
- .ywiki-content .doc-mark-highlight {
695
- background: color-mix(in srgb, var(--color-warning) 30%, transparent);
696
- border-radius: 2px;
697
- padding: 0.05em 0.1em;
698
- color: inherit;
699
- }
700
-
701
- /* ---------------------------------------------------------------- 分栏 */
702
- .ywiki-content .doc-columns {
703
- display: flex;
704
- gap: 16px;
705
- align-items: flex-start;
706
- }
707
- .ywiki-content .doc-column { flex: 1 1 0; min-width: 0; }
708
- .ywiki-content .doc-column > *:first-child { margin-top: 0; }
709
- @media (max-width: 560px) {
710
- .ywiki-content .doc-columns { flex-direction: column; gap: 10px; }
711
- }
712
- @container wiki-content (max-width: 560px) {
713
- .ywiki-content .doc-columns { flex-direction: column; gap: 10px; }
714
- }
715
-
716
- /* ---------------------------------------------------------------- 公式 */
717
- .ywiki-content .doc-math-inline { display: inline-block; vertical-align: middle; }
718
- .ywiki-content .doc-math-block {
719
- display: block;
720
- overflow-x: auto;
721
- padding: 8px 0;
722
- text-align: center;
723
- }
724
- .doc-math-pending {
725
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
726
- font-size: 0.875em;
727
- color: var(--color-text-muted);
728
- }
729
- .doc-math-error {
730
- border: 1px dashed color-mix(in srgb, var(--color-danger) 50%, transparent);
731
- border-radius: 4px;
732
- padding: 0 4px;
733
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
734
- font-size: 0.875em;
735
- color: var(--color-danger);
736
- }
737
- .doc-math-error-hint { margin-left: 6px; font-size: 0.85em; opacity: 0.8; }
738
-
739
- /* ---------------------------------------------------------------- 文件与媒体
740
- 编辑 NodeView 与阅读卡片的结构类不同,盒模型与正文均由这一份样式提供。 */
741
- .ywiki-content :where(.doc-file, .doc-file-attachment) {
742
- border: 1px solid var(--color-border);
743
- border-radius: 8px;
744
- padding: 10px 12px;
745
- background: var(--color-surface-subtle);
746
- font-size: 14px;
747
- color: var(--color-text-muted);
748
- }
749
- .ywiki-content .doc-file-head { display: flex; align-items: center; gap: 8px; }
750
- .ywiki-content .doc-file-icon { flex: none; }
751
- .ywiki-content .doc-file-name {
752
- flex: 1;
753
- min-width: 0;
754
- overflow: hidden;
755
- text-overflow: ellipsis;
756
- white-space: nowrap;
757
- }
758
- .ywiki-content .doc-file-size { flex: none; font-size: 12px; color: var(--color-text-faint); }
759
- .ywiki-content .doc-file-action {
760
- flex: none;
761
- border: 1px solid var(--color-border);
762
- background: var(--color-surface);
763
- border-radius: 6px;
764
- padding: 2px 10px;
765
- font-size: 12px;
766
- color: var(--color-text-muted);
767
- cursor: pointer;
768
- }
769
- .ywiki-content .doc-file-action:hover { color: var(--color-accent); border-color: var(--color-accent); }
770
- .ywiki-content video.doc-file-video {
771
- display: block;
772
- width: 100%;
773
- max-height: 420px;
774
- margin-top: 8px;
775
- border-radius: 6px;
776
- background: #000;
777
- }
778
- .ywiki-content img.doc-file-image {
779
- display: block;
780
- max-width: 100%;
781
- margin: 8px 0 0;
782
- border-radius: 6px;
783
- }
784
-
785
- /* ---------------------------------------------------------------- 行内评论高亮
786
- 编辑端与只读端共用同一套观感。
787
-
788
- ## 同一黄色系三档,靠深浅表达强弱
789
-
790
- 早先用 `--color-warning`(偏橙棕)叠 22%,是脏橘色、与正文高亮分不清;
791
- 后来改淡米黄又太浅("看不到评论的选中区");再后来"有回复"用蓝色区分,
792
- 用户反馈与黄色差别太大、容易误读成两类东西("可以搞多色,但是不要影响
793
- 用户心智")。
794
-
795
- 现在三档都在黄色家族里:普通评论亮黄底 + 深琥珀下划线,有回复加深一档,
796
- 激活再深一档。下划线用深琥珀而不是亮黄——底色变亮后,浅色下划线在浅蓝
797
- 或白色背景上都看不清(用户反馈"这个看不清,底部和背景色")。
798
-
799
- ## 方角,不用圆角
800
-
801
- `border-radius: 0`(用户明确要求)。标记是"文字底下的一条色带",
802
- 圆角会让它在行内显得像按钮。
803
-
804
- ## 提示不用原生 title
805
-
806
- `title` 由浏览器绘制、样式不可控,这里由 `shared/comment-hint.ts` 自绘。 */
807
- .ywiki-content .doc-inline-comment {
808
- background: var(--comment-mark-bg, #ffe58f);
809
- border-bottom: 2px solid var(--comment-mark-line, #d48806);
810
- border-radius: 0;
811
- /* 让底色与文字之间留一点空隙,读起来像"标记"而不是"文字被染色" */
812
- padding-bottom: 1px;
813
- cursor: pointer;
814
- }
815
- .ywiki-content .doc-inline-comment.has-replies {
816
- background: var(--comment-mark-bg-reply, #ffd666);
817
- border-bottom-color: var(--comment-mark-line-reply, #ad6800);
818
- }
819
- .ywiki-content .doc-inline-comment.is-active {
820
- background: var(--comment-mark-bg-active, #ffc53d);
821
- border-bottom-color: var(--comment-mark-line-active, #ad6800);
822
- /* 激活项加一圈同色细边:与"有评论"区分开,一眼看出当前在看哪条 */
823
- outline: 1px solid var(--comment-mark-line-active, #ad6800);
824
- outline-offset: 1px;
825
- }
826
- /* 原文被改动:零宽落点用左侧竖线标记,避免伪装成正常高亮 */
827
- .ywiki-content .doc-inline-comment.is-shifted {
828
- border-left: 2px solid var(--color-danger);
829
- padding-left: 1px;
830
- background: transparent;
831
- }
832
-
833
- /* ---------------------------------------------------------------- 块流
834
- 两端的结构路径放进 :where(),统一为 (0,1,0) 权重。规则放在元素 reset 之后,
835
- 不以 !important 或逐个给 h/p 添加 class 来补偿 DOM 包装差异。
836
- 引用、高亮块、分栏、单元格内部使用同一节奏,首尾不产生额外空白。 */
837
- .ywiki-content > * + *,
838
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th) > * + * {
839
- margin-top: var(--space-block);
840
- }
841
- .ywiki-content > :where(h1, h2, h3, h4, h5, h6),
842
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th) > :where(h1, h2, h3, h4, h5, h6) {
843
- margin-top: var(--space-heading-top);
844
- }
845
- /* 标题与其后的内容是一组,连续标题也保持紧凑。 */
846
- .ywiki-content > :where(h1, h2, h3, h4, h5, h6) + *,
847
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th) > :where(h1, h2, h3, h4, h5, h6) + * {
848
- margin-top: var(--space-heading-bottom);
849
- }
850
- /* 待办项的 label 和内容容器横向排列,不在二者之间加纵向块间距。 */
851
- /* TaskItem 的编辑 node view 没有 data-type,必须根据父 taskList 识别。 */
852
- .ywiki-content :where(li:not(.doc-task-item):not(ul[data-type='taskList'] > li), li > div, li > span) > * + * {
853
- margin-top: var(--space-list-block);
854
- }
855
- /* 结构模块与普通段落分开:两边都留模块间距,不能由短段距挤在一起。
856
- 编辑 nodeView 与阅读包装分别列明,单元格最后再按其内部紧凑规则覆盖。 */
857
- .ywiki-content > :where(ul, ol, blockquote, pre, table, img, .tableWrapper, .doc-table-wrap, .code-block-wrap, .doc-code-wrap, .ywiki-image-frame, .doc-image, .doc-callout, .doc-columns, .doc-file-attachment, .doc-file-video, .doc-video-embed, [data-video-embed], .doc-math-block, .math-block) ,
858
- .ywiki-content > :where(ul, ol, blockquote, pre, table, img, .tableWrapper, .doc-table-wrap, .code-block-wrap, .doc-code-wrap, .ywiki-image-frame, .doc-image, .doc-callout, .doc-columns, .doc-file-attachment, .doc-file-video, .doc-video-embed, [data-video-embed], .doc-math-block, .math-block) + *,
859
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column) > :where(ul, ol, blockquote, pre, table, img, .tableWrapper, .doc-table-wrap, .code-block-wrap, .doc-code-wrap, .ywiki-image-frame, .doc-image, .doc-callout, .doc-columns, .doc-file-attachment, .doc-file-video, .doc-video-embed, [data-video-embed], .doc-math-block, .math-block),
860
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column) > :where(ul, ol, blockquote, pre, table, img, .tableWrapper, .doc-table-wrap, .code-block-wrap, .doc-code-wrap, .ywiki-image-frame, .doc-image, .doc-callout, .doc-columns, .doc-file-attachment, .doc-file-video, .doc-video-embed, [data-video-embed], .doc-math-block, .math-block) + * {
861
- margin-top: var(--space-module);
862
- }
863
- /* 标题是章节边界;即使前面是表格、代码或媒体,也保留足够章节留白。 */
864
- .ywiki-content > :where(h1, h2, h3, h4, h5, h6),
865
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column) > :where(h1, h2, h3, h4, h5, h6) {
866
- margin-top: var(--space-heading-top);
867
- }
868
- .ywiki-content > :where(h1, h2, h3, h4, h5, h6) + *,
869
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column) > :where(h1, h2, h3, h4, h5, h6) + * {
870
- margin-top: var(--space-heading-bottom);
871
- }
872
- .ywiki-content > hr,
873
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th) > hr {
874
- margin-block: var(--space-divider);
875
- }
876
- .ywiki-content > :first-child,
877
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th, li, li > div, li > span) > :first-child {
878
- margin-top: 0;
879
- }
880
- .ywiki-content > :last-child,
881
- .ywiki-content :where(.doc-body, blockquote, .doc-callout-content, .doc-column, td, th, li, li > div, li > span) > :last-child {
882
- margin-bottom: 0;
883
- }
884
-
885
- /* 文档表格有自己的紧凑节奏,仍保留作者输入的空段落与显式加粗。 */
886
- .ywiki-content :where(td, th) > * + * { margin-top: 0.25em; }
887
- .ywiki-content :where(td, th) > :first-child { margin-top: 0; }
888
- .ywiki-content :where(td, th) > :where(p, ul, ol) { font-weight: inherit; }
889
- .ywiki-content :where(td, th) > p:empty { min-height: calc(1em * var(--content-table-line-height)); }
890
-
891
- /* 阅读端内容宽度交给 token(外观菜单可调) */
892
- .doc-renderer {
893
- width: 100%;
894
- max-width: var(--content-width);
895
- margin-inline: auto;
896
- }
897
-
898
- /* ---------------------------------------------------------------- 图片懒加载占位
899
- 还没取到字节(接近视口时才取,见 LazyAttachmentImage):
900
- 给一个最小占位高度,避免图片陆续到达时正文不断被顶下去。 */
901
- .doc-image {
902
- cursor: zoom-in;
903
- }
904
- .doc-image[data-loading] {
905
- min-width: 160px;
906
- min-height: 60px;
907
- background: var(--color-surface-subtle);
908
- border-radius: 8px;
909
- }
910
- .doc-image-loading,
911
- .doc-image-missing,
912
- .doc-unknown {
913
- color: var(--color-text-muted);
914
- font-size: 0.9em;
915
- }
916
- .doc-unknown {
917
- border: 1px dashed var(--color-border-strong);
918
- border-radius: 6px;
919
- padding: 8px 10px;
920
- }
921
-
922
- /* 文件卡片的共同样式在 shared/content-style.css。 */
923
- .doc-file.is-missing { color: var(--color-text-faint); }
924
- /* 编辑态图片:src 由 node view 按 attachmentId 解析而来(正文不存存储地址)。
925
- 给个最小样式,避免加载中/缺失时排版跳动。 */
926
- .ywiki-prose img.ywiki-image {
927
- max-width: 100%;
928
- border-radius: var(--content-media-radius);
929
- display: block;
930
- }
931
- /**
932
- * 图片容器(node view)的**三层结构**:
933
- * frame(块级、占满整行)→ 水平对齐(flex justify-content)
934
- * inner(贴合图片尺寸)→ 选中框 / 四角手柄 / 块选中高亮
935
- * img
936
- *
937
- * 选中框必须画在 **inner** 上(用户反馈"编辑图片大小时外框没有跟随图片
938
- * 大小变化"):frame 占满整行,蓝框会横跨整行、右边空出一大片,看起来
939
- * 像框没跟着图片走。
940
- */
941
- .ywiki-prose .ywiki-image-frame {
942
- display: flex;
943
- justify-content: center;
944
- /* 图注在图片下方:纵向排列,图片仍按 justify-content 水平对齐 */
945
- flex-direction: column;
946
- align-items: center;
947
- }
948
- /* 有图注时,图片与图注各自成行;图片的水平对齐交给内层 */
949
- .ywiki-prose .ywiki-image-frame.has-caption > .ywiki-image-inner { align-self: center; }
950
- /* 图注:一行灰色小字,超出省略(完整内容见 title) */
951
- .ywiki-prose .ywiki-image-caption {
952
- max-width: 100%;
953
- margin-top: 6px;
954
- padding: 0 2px;
955
- color: var(--color-text-muted);
956
- font-size: 12px;
957
- line-height: 1.5;
958
- text-align: center;
959
- overflow: hidden;
960
- text-overflow: ellipsis;
961
- white-space: nowrap;
962
- user-select: text;
963
- }
964
- .ywiki-prose .ywiki-image-gallery {
965
- display: flex;
966
- flex-wrap: wrap;
967
- align-items: flex-start;
968
- gap: 8px;
969
- width: 100%;
970
- }
971
- /**
972
- * 图片行**整行选中**:给整行加一圈描边。
973
- *
974
- * 只给每张图铺底色是不够的——图片之间的间隙、行首行尾的留白都没有任何
975
- * 选中信号,整行看起来和未选中几乎一样(用户实测反馈:"一行全选中也要有
976
- * 选中效果")。
977
- *
978
- * 不能用普通块的 `::before` 蓝带:图片行是 flex 容器,绝对定位的伪元素
979
- * 会参与 flex 布局计算,外扩的 6px 也容易被行高吃掉。改为与其它自带外观
980
- * 的块一致的实色描边;圆角取 6px,与表格的选中框对齐。
981
- */
982
- .ywiki-prose .ywiki-image-gallery.is-block-selected {
983
- outline: 2px solid var(--color-accent);
984
- outline-offset: 2px;
985
- border-radius: 6px;
986
- }
987
- /**
988
- * 单张图片(独立图片块)被**整块选中**:给图片本身加一圈描边。
989
- *
990
- * 图片块没有自带外观,走的是"普通块铺蓝带"分支,结果只有一条半透明底色
991
- * 与图片上的淡色覆盖,**没有边框**——与表格、高亮块、文件卡片的选中观感
992
- * 不一致(用户实测反馈:"只有一张图的选中没有边框")。
993
- *
994
- * 只作用于独立图片(图片行内的子图不带 `is-block-selected`,整行选中时
995
- * 描边画在行容器上),因此不会与图片行的整行框重叠。
996
- */
997
- .ywiki-prose .ywiki-image-frame.is-block-selected .ywiki-image-inner {
998
- outline: 2px solid var(--color-accent);
999
- outline-offset: 2px;
1000
- border-radius: 6px;
1001
- }
1002
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame.is-in-gallery .ywiki-image-inner {
1003
- /* 图片行里不显示四角缩放手柄(等高排布,单图改宽会破坏对齐)。 */
1004
- cursor: default;
1005
- }
1006
- .ywiki-prose .ywiki-image-gallery {
1007
- position: relative;
1008
- }
1009
- /* 图片行内的框选矩形(挂在 portal 上,视口坐标定位) */
1010
- .ywiki-gallery-marquee {
1011
- position: fixed;
1012
- z-index: 69;
1013
- border: 1px solid color-mix(in srgb, var(--color-accent) 70%, transparent);
1014
- background: color-mix(in srgb, var(--color-accent) 12%, transparent);
1015
- border-radius: 2px;
1016
- pointer-events: none;
1017
- }
1018
- /**
1019
- * 图片上的选中覆盖层:**只有一个 `::after`,强度固定 16%**。
1020
- *
1021
- * ## 为什么必须合并到一个选择器(用户实测:"为什么还有蓝色区域")
1022
- *
1023
- * 这里曾经有两处独立规则写同一个 `::after`:
1024
- * - 框选命中(`.is-multi-picked`)16%;
1025
- * - 整块选中(`.ywiki-image-frame.is-block-selected`)18%。
1026
- *
1027
- * 两者可以同时命中(框选后松手会转成块选区),于是同一个伪元素被两条规则
1028
- * 分别赋值——后者胜出,颜色却与整页带(16%)不一致,图上出现一块更深的矩形。
1029
- * 更早还叠过一层 frame 的 16% 背景,合计接近 50%。
1030
- *
1031
- * 现在统一为一条规则、一个强度:图片区域与非图片区域的选中底色完全相同。
1032
- *
1033
- * `outline` 仍按状态区分(框选中是实线、块选中不描边)——那表达的是"这是
1034
- * 框选出来的"与"这块在选区里"的差别,不影响底色。
1035
- */
1036
- .ywiki-prose .ywiki-image-frame.is-multi-picked .ywiki-image-inner,
1037
- .ywiki-prose .ywiki-image-frame.is-block-selected-image .ywiki-image-inner,
1038
- .wendang-portal .ywiki-image-frame.is-multi-picked .ywiki-image-inner {
1039
- /**
1040
- * 圆角与表格/其他块的选中描边统一为 6px(用户反馈:"图片选中的圆角
1041
- * 和表格选中的差不多,现在有点不一致")。早先是 3px/4px,混在一起时
1042
- * 图片的框明显更方。
1043
- */
1044
- outline: 2px solid var(--color-accent);
1045
- outline-offset: 2px;
1046
- border-radius: 6px;
1047
- }
1048
- .ywiki-prose .is-block-selected .ywiki-image-inner::after,
1049
- .ywiki-prose .ywiki-image-frame.is-multi-picked .ywiki-image-inner::after,
1050
- .ywiki-prose .ywiki-image-frame.is-block-selected-image .ywiki-image-inner::after,
1051
- .wendang-portal .ywiki-image-frame.is-multi-picked .ywiki-image-inner::after {
1052
- content: '';
1053
- position: absolute;
1054
- inset: 0;
1055
- border-radius: var(--content-media-radius, 4px);
1056
- background: color-mix(in srgb, var(--color-accent) 16%, transparent);
1057
- pointer-events: none;
1058
- }
1059
- /**
1060
- * 跨图片拖拽:**落点提示**。
1061
- *
1062
- * ## 从"虚线框"改为"柔和的整体高亮"(用户反馈:虚线框看起来比较生硬)
1063
- *
1064
- * 原先落在目标图上画 2px dashed outline。虚线在照片这类复杂底图上会碎成
1065
- * 一段段,而且"框住整张图"的观感太抢眼——它表达的是"我要插到这里",不是
1066
- * "这张图被选中了",用户的原话是"看怎么处理更好看点"。
1067
- *
1068
- * 现在改成两层柔和的信号:
1069
- * 1. 图片本身叠一层淡强调色(和块选中同一套语言,`::after` 已存在,复用);
1070
- * 2. 外加一圈 2px 实线 + 3px 留白的描边,颜色是强调色但带透明度。
1071
- *
1072
- * 不用虚线、不用发光:拖拽是高频操作,提示需要"看得见但不吵"。
1073
- */
1074
- .ywiki-prose .ywiki-image-frame.is-image-drop-target .ywiki-image-inner {
1075
- outline: 2px solid color-mix(in srgb, var(--color-accent) 70%, transparent);
1076
- outline-offset: 3px;
1077
- border-radius: var(--content-media-radius, 6px);
1078
- }
1079
- /* 落点图上再叠一层淡色,明确"松手就并到这里" */
1080
- .ywiki-prose .ywiki-image-frame.is-image-drop-target .ywiki-image-inner::after {
1081
- content: '';
1082
- position: absolute;
1083
- inset: 0;
1084
- border-radius: var(--content-media-radius, 6px);
1085
- background: color-mix(in srgb, var(--color-accent) 14%, transparent);
1086
- pointer-events: none;
1087
- }
1088
-
1089
- /**
1090
- * 插入指示线:一条**细长的圆头光带**,插在将要落入的位置。
1091
- *
1092
- * 几何与颜色都由脚本内联(挂在 portal / body 上取不到主题变量),这里只给
1093
- * 形状与层级。圆头 + 柔和外发光让它看起来像"一根发光的针",比纯色方块轻。
1094
- */
1095
- .ywiki-image-drop-line,
1096
- .ywiki-gallery-drop-line {
1097
- position: fixed;
1098
- border-radius: 999px;
1099
- pointer-events: none;
1100
- /* 必须高于图片行内容,否则会被图片盖住、看起来"拖拽没有反馈" */
1101
- z-index: 70;
1102
- }
1103
- .ywiki-image-drop-line { z-index: 60; }
1104
- /**
1105
- * 指示线两端的小圆点:把"针"的两端收圆,视觉上更像刻度而不是一条色块。
1106
- * 用伪元素而不是额外 DOM,避免拖拽期间频繁创建节点。
1107
- */
1108
- .ywiki-image-drop-line::before,
1109
- .ywiki-image-drop-line::after,
1110
- .ywiki-gallery-drop-line::before,
1111
- .ywiki-gallery-drop-line::after {
1112
- content: '';
1113
- position: absolute;
1114
- left: 50%;
1115
- width: 7px;
1116
- height: 7px;
1117
- margin-left: -3.5px;
1118
- border-radius: 50%;
1119
- background: inherit;
1120
- }
1121
- .ywiki-image-drop-line::before,
1122
- .ywiki-gallery-drop-line::before { top: -3px; }
1123
- .ywiki-image-drop-line::after,
1124
- .ywiki-gallery-drop-line::after { bottom: -3px; }
1125
- .wendang-portal .ywiki-gallery-drop-line,
1126
- .wendang-portal .ywiki-image-drop-line { position: fixed; }
1127
- .ywiki-prose .ywiki-image-frame.is-gallery-dragging {
1128
- opacity: 0.55;
1129
- }
1130
- /**
1131
- * 图片行(飞书口径):**按比例铺满整行**,高度由比例自然产生。
1132
- *
1133
- * 为什么不用固定行高:固定行高在图片少时右侧留一大片空白(实测两图并排只占
1134
- * 一半宽度)。飞书改成「各列按 比例/比例和 分宽度」——列宽加起来正好铺满,
1135
- * 高度 = 可用宽 / 比例和,因此同行几乎等高且无空白。
1136
- *
1137
- * `--ywiki-image-ratio` 由 node view 按原图宽高比写入,`flex-basis` 用比例
1138
- * 作为权重,`flex-grow` 让它们把剩余空间按权重分掉。
1139
- */
1140
- .ywiki-prose .ywiki-image-gallery {
1141
- /* 12px 间距与飞书的 column-gap 实测一致 */
1142
- gap: 12px;
1143
- align-items: flex-start;
1144
- }
1145
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame {
1146
- flex: 1 1 0;
1147
- /* 基础宽度置零,完全由 flex-grow 按比例分配,避免比例小的图先占位 */
1148
- min-width: 0;
1149
- width: auto;
1150
- height: auto;
1151
- max-width: none;
1152
- justify-content: flex-start;
1153
- }
1154
- /* 分配权重 = 原始比例 × 用户拖角设定的相对缩放(`--ywiki-image-weight`) */
1155
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame {
1156
- flex-grow: calc(var(--ywiki-image-ratio, 1) * var(--ywiki-image-weight, 1));
1157
- }
1158
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame .ywiki-image-inner {
1159
- width: 100%;
1160
- max-width: none;
1161
- }
1162
- /**
1163
- * 图库内图片高度由比例与列宽共同决定:
1164
- * `width:100%` + `aspect-ratio` 让高度自动算出来,不用固定行高。
1165
- * 没有 aspect-ratio(历史图片)时退回 4:3,等补算比例后再自动校正。
1166
- */
1167
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame img.ywiki-image {
1168
- width: 100%;
1169
- height: auto;
1170
- max-width: none;
1171
- aspect-ratio: var(--ywiki-image-ratio, 1.3333);
1172
- object-fit: contain;
1173
- border-radius: var(--content-media-radius);
1174
- }
1175
- /**
1176
- * 图片**加载中**:渐变沿边框流动的指示(与阅读端同一口径)。
1177
- *
1178
- * 不再用"整块灰底 + 微光"——静态灰块在浅色页面上看不出在加载,更像"图丢了"。
1179
- * 现在是一条沿圆角绕圈的渐变,像贪吃蛇一样顺着边框跑,图片区域本身保持透明。
1180
- *
1181
- * 实现同阅读端:conic-gradient + `mask-composite: exclude` 挖空中间,只留 2px
1182
- * 边框;旋转靠 `@property` 注册的角度变量插值(定义在 content-style.css,
1183
- * 该文件也被编辑器引入)。加载完成后 `data-image-loading` 移除,遮罩随之消失。
1184
- */
1185
- .ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-loading] {
1186
- box-sizing: border-box;
1187
- padding: 3px;
1188
- border-radius: var(--content-media-radius);
1189
- background-image: conic-gradient(
1190
- from var(--ywiki-image-flow-angle),
1191
- color-mix(in srgb, var(--color-accent) 14%, var(--color-surface-subtle)) 0turn 55%,
1192
- color-mix(in srgb, var(--color-accent) 55%, transparent) 78%,
1193
- var(--color-accent) 92%,
1194
- color-mix(in srgb, var(--color-accent) 14%, var(--color-surface-subtle)) 100%
1195
- );
1196
- -webkit-mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
1197
- -webkit-mask-clip: content-box, border-box;
1198
- -webkit-mask-composite: xor;
1199
- mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
1200
- mask-clip: content-box, border-box;
1201
- mask-composite: exclude;
1202
- animation: ywiki-image-flow 1.4s linear infinite;
1203
- /* 独立图片没有 aspect-ratio 撑高,需要最小高度才看得见框 */
1204
- min-height: 120px;
1205
- }
1206
- /* 图片行内的高度由 aspect-ratio 与列宽决定,不叠加最小高度(否则整行被撑高) */
1207
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame img.ywiki-image[data-image-loading] {
1208
- min-height: 0;
1209
- }
1210
- /**
1211
- * 加载失败:淡底 + 细实线边框,**不流动**。
1212
- *
1213
- * "在转 = 还在取 / 静止 = 取不到",靠动效区分,不需要图标或文字。
1214
- * 不用虚线:缩略图尺寸下虚线会碎成一段段,看起来像边框画错了。
1215
- */
1216
- .ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-error] {
1217
- box-sizing: border-box;
1218
- min-height: 72px;
1219
- background-color: color-mix(in srgb, var(--color-surface-subtle) 70%, var(--color-border));
1220
- border-radius: var(--content-media-radius);
1221
- outline: 1px solid color-mix(in srgb, var(--color-border-strong) 55%, transparent);
1222
- outline-offset: -1px;
1223
- }
1224
- .ywiki-prose .ywiki-image-gallery > .ywiki-image-frame img.ywiki-image[data-image-error] {
1225
- min-height: 0;
1226
- }
1227
- @media (prefers-reduced-motion: reduce) {
1228
- .ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-loading] {
1229
- animation: none;
1230
- }
1231
- }
1232
-
1233
- /* 显式缩放过(data-sized)的图默认靠左:缩放锚点在左缘,拖动位置稳定 */
1234
- .ywiki-prose .ywiki-image-frame[data-sized] {
1235
- justify-content: flex-start;
1236
- }
1237
- /* 显式对齐(图片工具条的左/中/右)优先于上面的默认规则 */
1238
- .ywiki-prose .ywiki-image-frame[data-align='left'] { justify-content: flex-start; }
1239
- .ywiki-prose .ywiki-image-frame[data-align='center'] { justify-content: center; }
1240
- .ywiki-prose .ywiki-image-frame[data-align='right'] { justify-content: flex-end; }
1241
-
1242
- /* inner 贴合图片:选中框/手柄相对它定位,才随图片尺寸变化 */
1243
- .ywiki-prose .ywiki-image-inner {
1244
- position: relative;
1245
- display: inline-block;
1246
- max-width: 100%;
1247
- line-height: 0;
1248
- }
1249
- /* 缩放期间禁止选中文本:跟手拖动时若触发文字选区会打断手感 */
1250
- .ywiki-prose .ywiki-image-frame.is-resizing {
1251
- user-select: none;
1252
- }
1253
-
1254
- /**
1255
- * 选中态(对齐飞书截图):蓝框 + 四角圆点手柄,拖动等比缩放。
1256
- * 手柄只在"用户点过这张图"时显示(见 `.img-pick-active` 门控说明),
1257
- * 未选中时 display:none,既不拦截点击也不产生视觉噪声。
1258
- */
1259
- /**
1260
- * 四角手柄的尺寸与观感对齐飞书(实测飞书是 20×20 的命中区)。
1261
- *
1262
- * 早前是 10px 的小圆点:在 380px 宽的缩略图上几乎看不见,用户反馈
1263
- * "选中了但看不清是不是选中了"(实测飞书明显更醒目)。这里放大到 14px
1264
- * 的实心圆 + 2px 蓝描边 + 白色打底,并给整块加一圈白色外发光,
1265
- * 保证在深色/蓝色图片上也能分辨。
1266
- */
1267
- .ywiki-prose .ywiki-image-handle {
1268
- display: none;
1269
- position: absolute;
1270
- width: 14px;
1271
- height: 14px;
1272
- box-sizing: border-box;
1273
- border: 2px solid var(--color-accent);
1274
- border-radius: 50%;
1275
- background: #fff;
1276
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
1277
- z-index: 3;
1278
- }
1279
- /*
1280
- * 选中外观需**同时**满足:node view 处于选中态,且用户点过这张图
1281
- * (`.img-pick-active`)。只看前者会被 PM 的默认选区骗到——文档以图片
1282
- * 开头时一打开页面就是 NodeSelection,不门控就会出现"没点过却带蓝框"。
1283
- */
1284
- .editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected .ywiki-image-inner {
1285
- /**
1286
- * 双层描边:内层蓝色实线 + 外层白色细线。
1287
- *
1288
- * 单用蓝色在蓝底图片上几乎看不出边界(用户反馈"看不清有没有选中");
1289
- * 白色隔离带让边框在任何底图上都有对比,与飞书的观感一致。
1290
- *
1291
- * 圆角与表格/其它块的选中框统一为 6px(用户反馈"图片选中的圆角和表格
1292
- * 选中的差不多,现在有点不一致"):早先这里是 4px,图片行的框是 3px,
1293
- * 与表格的 6px 摆在一起时能明显看出差别。
1294
- */
1295
- outline: 2px solid var(--color-accent);
1296
- outline-offset: 3px;
1297
- border-radius: 6px;
1298
- box-shadow: 0 0 0 5px #fff, 0 0 0 6px color-mix(in srgb, var(--color-accent) 28%, transparent);
1299
- }
1300
- .editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected .ywiki-image-handle {
1301
- display: block;
1302
- }
1303
- /*
1304
- * 图片行内**显示**四角手柄(对齐飞书):拖角调整该图的相对权重,
1305
- * 整行按新权重重算,因此仍然铺满、仍然等高。
1306
- * 唯一的例外是「整行处于块选区」时——那时拖动语义是移动整行,
1307
- * 由行内重排逻辑让位给整块拖拽(见 image-nodeview 的 mousedown 判定)。
1308
- */
1309
- .editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected.is-in-gallery .ywiki-image-handle {
1310
- display: block;
1311
- }
1312
- /* 图片行内仍画选中蓝框,但只包住被选中的那一张(inner 贴合图片) */
1313
- .editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected.is-in-gallery .ywiki-image-inner {
1314
- outline: 2px solid var(--color-accent);
1315
- outline-offset: 3px;
1316
- /* 与其它块/图片的选中框同一圆角 */
1317
- border-radius: 6px;
1318
- }
1319
- /* 四个角:手柄中心骑在蓝框上(outline-offset 3px + 手柄半宽 7px = -10px) */
1320
- .ywiki-prose .ywiki-image-handle.handle-nw { left: -10px; top: -10px; cursor: nwse-resize; }
1321
- .ywiki-prose .ywiki-image-handle.handle-ne { right: -10px; top: -10px; cursor: nesw-resize; }
1322
- .ywiki-prose .ywiki-image-handle.handle-sw { left: -10px; bottom: -10px; cursor: nesw-resize; }
1323
- .ywiki-prose .ywiki-image-handle.handle-se { right: -10px; bottom: -10px; cursor: nwse-resize; }
1324
-
1325
- /**
1326
- * 已选中的图片:放大镜光标(点击再次 = 打开大图预览)。
1327
- * 拖拽缩放期间必须让位给缩放光标——否则指针拖离手柄、落在图片上时
1328
- * 会突然变成放大镜(用户实测反馈)。
1329
- */
1330
- .editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected:not(.is-resizing) img.ywiki-image {
1331
- cursor: zoom-in;
1332
- }
1333
- .ywiki-prose img.ywiki-image[data-image-missing] {
1334
- min-width: 120px;
1335
- min-height: 40px;
1336
- border: 1px dashed var(--color-border-strong);
1337
- background: var(--color-surface-subtle);
1338
- }
1339
-
1340
- /**
1341
- * 块级选中:普通块铺蓝底,**自带视觉身份的块只加外圈**。
1342
- *
1343
- * ## 两种画法,按块是否有自己的「脸」来分
1344
- *
1345
- * 飞书的做法(用户提供了对照截图)是一套区分得很清楚的规则:
1346
- *
1347
- * - **普通块**(段落、标题、列表、引用、图片…)——本来没有底色,选中时铺一条
1348
- * 半透明蓝带,一眼能看出"这一段被选中了";
1349
- * - **自带视觉身份的块**(高亮块、表格、代码块)——它们本来就有底色或边框,
1350
- * 再往里铺一层蓝会把内容染色、把表格单元格弄脏。这些块只在**外围加一圈
1351
- * 描边**,表达"这块在选区里",内容配色完全不动。
1352
- *
1353
- * 早先我一度把两类统一成蓝底,结果表格单元格被整片染蓝、高亮块的黄绿底色
1354
- * 也被改掉——用户明确纠正:"像这类(高亮、表格等等)都可以有个外圈,不用蓝色
1355
- * 背景"。
1356
- *
1357
- * ## 宽度只到正文列,不能铺到整页
1358
- *
1359
- * 曾经把带子向两侧溢出到"页面横带"边缘,那是把**可起手区域**和**高亮宽度**
1360
- * 混为一谈了:起手区可以宽(用户在页面空白处按下就能拖选),但高亮必须只覆盖
1361
- * 正文,否则左侧目录、右侧大纲栏也被染蓝(用户原话:"我内容区域在红框区域,
1362
- * 为啥选中后有个这么宽的蓝色背景?不合理啊!")。
1363
- *
1364
- * ## 为什么普通块用伪元素而不是直接改 `background`
1365
- *
1366
- * 直接改背景会与块自身可能存在的底色冲突;伪元素能叠一层半透明,原底色仍透出。
1367
- * 不能用 `z-index: -1`:那会让底色跑到祖先背景之后(`.tiptap` 是
1368
- * `position: relative`),一旦宿主给正文加了底色,高亮就整块消失。
1369
- */
1370
- .ywiki-prose .is-block-selected {
1371
- position: relative;
1372
- border-radius: 6px;
1373
- }
1374
-
1375
- /**
1376
- * 普通块:铺半透明蓝带。
1377
- *
1378
- * 排除自带视觉身份的块(见下方外圈分支)——这是两类画法的唯一分界。
1379
- * 用 `[data-block-chrome]` 声明式判断,而不是硬枚举类名:新增块时只在自己的
1380
- * 渲染代码里加属性即可,不必回来改这里(思维导图就曾因为漏改而错误地变成蓝底)。
1381
- */
1382
- .ywiki-prose .is-block-selected:not([data-block-chrome]):not(.doc-callout):not(.tableWrapper):not(.code-block-wrap):not(.ywiki-image-gallery)::before {
1383
- content: '';
1384
- position: absolute;
1385
- /**
1386
- * 四周比块本身**外扩**,让选中色不要紧贴文字(用户反馈"文字选中区域
1387
- * 往外扩一下")。块盒子就是文字行盒,贴着它画会让文字看起来被框死。
1388
- *
1389
- * 纵向外扩量由 `measureBlocksPadding` 按**实测块间距**逐块写入:
1390
- * - 相邻两个都选中:各溢出间隙的一半 → 两块拼成连续一条,且不重叠
1391
- * (间隙实测 6.86px 到 21px 不等,写死一个值必然要么留白缝要么叠出深线);
1392
- * - 开边一侧(首块上方 / 末块下方):用 `SELECT_PAD_Y` 给文字留呼吸空间。
1393
- *
1394
- * 横向用 `SELECT_PAD_X`:再宽就会溢出正文列(用户此前明确反对底色超出版心)。
1395
- * 两侧同时外扩,因此带子比正文列宽 2×6px,仍落在阅读区留白内。
1396
- */
1397
- top: calc(-1 * var(--block-select-pad-top, 5px));
1398
- bottom: calc(-1 * var(--block-select-pad-bottom, 5px));
1399
- left: calc(-1 * var(--block-select-pad-x, 6px));
1400
- right: calc(-1 * var(--block-select-pad-x, 6px));
1401
- background: color-mix(in srgb, var(--color-accent) 16%, transparent);
1402
- /* 6px 圆角:外扩后的矩形边角更明显,需要圆角才不生硬 */
1403
- border-radius: 6px;
1404
- pointer-events: none;
1405
- }
1406
-
1407
- /**
1408
- * 自带视觉身份的块:**只加外圈,不铺蓝底**。
1409
- *
1410
- * ## 哪些块算"自带视觉身份"
1411
- *
1412
- * 判据是「它本身已经有可见的边框、底色或独立画布」。这类块再往里铺一层蓝,
1413
- * 会把内容染色或把画布弄脏;只在外围加圈,既表达"在选区里",又不改内容观感:
1414
- *
1415
- * - 高亮块(浅色底 + 边框)
1416
- * - 表格(网格线)
1417
- * - 代码块(深色底)
1418
- * - 思维导图(独立画布;用户实测:"为啥思维导图没有框而是蓝色")
1419
- * - 文件卡片 / 视频嵌入(自带卡片外观)
1420
- * - 分栏(多列结构,铺底色会把两栏之间的空隙也染上)
1421
- *
1422
- * 其余块(段落、标题、列表、引用、图片…)没有自己的外观,走蓝底分支。
1423
- *
1424
- * ## 为什么用 `[data-block-chrome]` 而不是继续堆类名选择器
1425
- *
1426
- * 之前是 `:is(.doc-callout, .tableWrapper, .code-block-wrap)` 硬枚举。每新增
1427
- * 一种块都要改两处(`:not()` 与 `:is()`),漏一处就会退化成"这个块又变蓝了"——
1428
- * 思维导图就是这么漏掉的。改为让节点自己在根元素上声明 `data-block-chrome`,
1429
- * 新增块时只在自己的渲染代码里加一个属性,不必再来碰这里。
1430
- *
1431
- * `outline` 而不是 `border`:border 会参与盒模型,给一个已经撑满正文列宽度的
1432
- * 表格加上 2px 边框会让它溢出或挤压内容;outline 不占布局,`outline-offset`
1433
- * 还能让它落在块的外侧,正好是"外圈"的观感。
1434
- *
1435
- * 用 55% 而非更浅的透明度:高亮块是浅蓝底、代码块是深底、表格有网格线,
1436
- * 太淡的圈在这些底色上都看不清边界。
1437
- */
1438
- .ywiki-prose :is([data-block-chrome], .doc-callout, .tableWrapper, .code-block-wrap).is-block-selected {
1439
- /**
1440
- * 描边圆角跟着**块自己的圆角**走,而不是写死 6px。
1441
- *
1442
- * 各块自带外观的圆角并不统一(高亮块 9px、文件卡片 8px、思维导图 12px),
1443
- * 写死一个值就会出现"框的角比块本身的角更方"的错位观感(用户实测反馈:
1444
- * "思维导图的选中圆角最好和选中带边框的圆角一致")。用变量按块类型覆盖,
1445
- * 默认 6px 与表格一致。
1446
- */
1447
- --block-select-radius: 6px;
1448
- /**
1449
- * 实色而不是 55% 半透明:高亮块自带浅色底与彩色边框,半透明蓝圈叠在
1450
- * 这些底色上几乎看不出来(用户反馈"高亮没有被选中、没有边框")。与图片
1451
- * 选中的描边用同一个强度,所有块的"被选中"一眼可辨且观感一致。
1452
- */
1453
- outline: 2px solid var(--color-accent);
1454
- outline-offset: 2px;
1455
- /* 与铺色分支同一圆角,两种选中画的观感才统一 */
1456
- border-radius: var(--block-select-radius);
1457
- }
1458
- /* 各块按自身外观的圆角覆盖描边圆角(值取自它们各自的 border-radius) */
1459
- .ywiki-prose .doc-callout.is-block-selected { --block-select-radius: 9px; }
1460
- .ywiki-prose .doc-file-attachment.is-block-selected { --block-select-radius: 8px; }
1461
- .ywiki-prose [data-mind-map-node].is-block-selected { --block-select-radius: 12px; }
1462
-
1463
- /* 块级拖拽期间:屏蔽浏览器原生的字形级选中高亮。
1464
- 块级选择本质上是一个覆盖整块文字的文本选区(复制/删除需要它),
1465
- 但浏览器会为它画字形级蓝底,与"整块底色"叠在一起很乱。
1466
- 这里只影响绘制,不影响选区模型与复制行为。 */
1467
- .ywiki-prose.is-block-selecting ::selection,
1468
- .ywiki-prose.is-block-selecting *::selection {
1469
- background: transparent;
1470
- color: inherit;
1471
- }
1472
-
1473
- /**
1474
- * 拖拽选择框(飞书式的矩形,跟随鼠标)。
1475
- *
1476
- * ## 必须**填充**,不能只描边(用户对比飞书截图后指出)
1477
- *
1478
- * 此前这里刻意只画边框、不铺底色,理由是"填充会盖住高亮块/表格的颜色"。
1479
- * 但飞书的拖拽框本身就是一块**半透明蓝色矩形**,用户一眼就能判断"我现在框住
1480
- * 了哪些内容、范围有多大";只有边框时,框内的内容看起来和框外没区别,
1481
- * 拖动过程中几乎无法判断落点,这正是用户反馈的差异。
1482
- *
1483
- * 用极低的透明度(12%)解决当初的顾虑:底色仍然透得出来,不会把高亮色
1484
- * 染成另一种颜色;框的边界由 1px 实线 + 白描边交代清楚。
1485
- */
1486
- .block-marquee {
1487
- position: absolute;
1488
- z-index: 33;
1489
- pointer-events: none;
1490
- /**
1491
- * 宽高由插件按「按下点 → 当前指针」的拖拽矩形写入,边框必须算在尺寸内——
1492
- * 否则 1px 边框会让框比鼠标实际划出的范围多出 2px(用户实测:左边贴合、
1493
- * 右边多出一截)。
1494
- */
1495
- box-sizing: border-box;
1496
- background: color-mix(in srgb, var(--color-accent) 12%, transparent);
1497
- border: 1px solid color-mix(in srgb, var(--color-accent) 65%, transparent);
1498
- box-shadow: 0 0 0 1px color-mix(in srgb, var(--color-surface) 60%, transparent);
1499
- border-radius: 2px;
1500
- }
1501
-
1502
- /* ---------------------------------------------------------------- 表格交互样式 */
1503
- /* 这几条此前完全缺失:resizable 生效但没有任何可视反馈,选中态也没有高亮,
1504
- 导致"能拖列宽但看不出在哪拖、选中了格子也不知道"。 */
1505
- /**
1506
- * 列宽拖拽手柄。
1507
- *
1508
- * prosemirror-tables 为**每一行**各插一个 4px 宽的 widget,默认样式是强调色 +
1509
- * 60% 透明度:鼠标经过列边界时它会在表格上竖着亮起一条分段蓝线,既没有
1510
- * 拖拽反馈,也不像任何已知控件(用户反馈"表格里这个蓝色是什么?没什么用吧")。
1511
- *
1512
- * 改为两级语义:
1513
- * - 悬停边界:中性色细线,连续贯穿整列(`top/bottom: -1px` 补齐行间缝隙),
1514
- * 配合 `col-resize` 光标表达"这里可以拖";
1515
- * - 真正拖拽中(单元格带 `column-resize-dragging`):才使用强调色。
1516
- */
1517
- .ywiki-prose .column-resize-handle {
1518
- position: absolute;
1519
- right: -2px;
1520
- top: -4px;
1521
- bottom: -4px;
1522
- width: 3px;
1523
- border-radius: 2px;
1524
- background-color: var(--color-border-strong, #b9c3d2);
1525
- pointer-events: none;
1526
- }
1527
- .ywiki-prose .column-resize-dragging .column-resize-handle {
1528
- background-color: var(--color-accent, #2f6feb);
1529
- box-shadow: 0 0 0 1px var(--color-surface, #fff);
1530
- }
1531
- .ywiki-prose.resize-cursor, .ywiki-prose .resize-cursor { cursor: col-resize; }
1532
- /* 矩形选中的单元格 */
1533
- .ywiki-prose .selectedCell:after {
1534
- content: '';
1535
- position: absolute;
1536
- inset: 0;
1537
- background: color-mix(in srgb, var(--color-accent) 8%, transparent);
1538
- pointer-events: none;
1539
- z-index: 2;
1540
- }
1541
- .ywiki-prose td,
1542
- .ywiki-prose th {
1543
- position: relative;
1544
- }
1545
- .img-preview-mask {
1546
- position: fixed;
1547
- inset: 0;
1548
- z-index: 1300;
1549
- display: flex;
1550
- flex-direction: column;
1551
- align-items: center;
1552
- justify-content: center;
1553
- background: color-mix(in srgb, #0b1220 84%, transparent);
1554
- overflow: hidden;
1555
- user-select: none;
1556
- }
1557
- .img-preview-stage {
1558
- display: flex;
1559
- align-items: center;
1560
- justify-content: center;
1561
- width: 100%;
1562
- flex: 1;
1563
- min-height: 0;
1564
- padding: 32px;
1565
- outline: none;
1566
- }
1567
- .img-preview-image {
1568
- max-width: 100%;
1569
- max-height: 100%;
1570
- object-fit: contain;
1571
- cursor: grab;
1572
- transition: transform 0.12s ease-out;
1573
- will-change: transform;
1574
- }
1575
- .img-preview-image.is-dragging { cursor: grabbing; transition: none; }
1576
- .img-preview-toolbar {
1577
- display: flex;
1578
- align-items: center;
1579
- gap: 4px;
1580
- flex: none;
1581
- margin-bottom: 24px;
1582
- padding: 6px 8px;
1583
- border: 1px solid color-mix(in srgb, #ffffff 18%, transparent);
1584
- border-radius: 8px;
1585
- background: color-mix(in srgb, #101828 72%, transparent);
1586
- color: #f2f5fa;
1587
- backdrop-filter: blur(8px);
1588
- }
1589
- .img-preview-toolbar button {
1590
- min-width: 32px;
1591
- height: 30px;
1592
- padding: 0 8px;
1593
- border: none;
1594
- border-radius: 5px;
1595
- background: transparent;
1596
- color: inherit;
1597
- font-family: inherit;
1598
- font-size: 13px;
1599
- cursor: pointer;
1600
- }
1601
- .img-preview-toolbar button:hover { background: color-mix(in srgb, #ffffff 16%, transparent); }
1602
- .img-preview-toolbar button:focus-visible { outline: 2px solid #fff; outline-offset: 1px; }
1603
- .img-preview-scale { min-width: 48px; text-align: center; font-size: 12px; opacity: 0.85; }
1604
- .img-preview-count {
1605
- min-width: 52px;
1606
- padding: 0 6px;
1607
- text-align: center;
1608
- font-size: 12px;
1609
- font-variant-numeric: tabular-nums;
1610
- opacity: 0.85;
1611
- }
1612
- .img-preview-divider { width: 1px; height: 16px; margin: 0 4px; background: color-mix(in srgb, #ffffff 26%, transparent); }
1613
-
1614
- /* 翻页按钮:两侧垂直居中,避开工具条;深色半透明底保证在任何图片上都可见 */
1615
- .img-preview-nav {
1616
- position: absolute;
1617
- inset: 0;
1618
- pointer-events: none;
1619
- display: flex;
1620
- align-items: center;
1621
- justify-content: space-between;
1622
- padding: 0 18px;
1623
- }
1624
- .img-preview-nav-btn {
1625
- pointer-events: auto;
1626
- display: flex;
1627
- align-items: center;
1628
- justify-content: center;
1629
- width: 44px;
1630
- height: 44px;
1631
- padding: 0;
1632
- border: 1px solid color-mix(in srgb, #ffffff 20%, transparent);
1633
- border-radius: 50%;
1634
- background: color-mix(in srgb, #101828 66%, transparent);
1635
- color: #f2f5fa;
1636
- cursor: pointer;
1637
- backdrop-filter: blur(8px);
1638
- transition: background 0.12s, opacity 0.12s;
1639
- }
1640
- .img-preview-nav-btn:hover:not(:disabled) { background: color-mix(in srgb, #101828 84%, transparent); }
1641
- .img-preview-nav-btn:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
1642
- /* 到头的一侧保留占位(避免另一侧按钮跳动),只降到很低的可见度 */
1643
- .img-preview-nav-btn:disabled { opacity: 0.22; cursor: default; }
1644
-
1645
- @media (prefers-reduced-motion: reduce) {
1646
- .img-preview-image { transition: none; }
1647
- }
1648
- .w-select { display: inline-flex; min-width: 0; }
1649
- .w-select__trigger {
1650
- display: inline-flex;
1651
- align-items: center;
1652
- justify-content: space-between;
1653
- gap: 6px;
1654
- width: 100%;
1655
- min-width: 0;
1656
- border: 1px solid var(--w-border-strong, var(--color-border-strong, #b9c3d2));
1657
- border-radius: var(--w-radius-sm, 4px);
1658
- background: var(--w-surface, var(--color-surface, #fff));
1659
- color: var(--w-text, var(--color-text, #1f2937));
1660
- font-family: var(--w-font-sans, inherit);
1661
- cursor: pointer;
1662
- transition: border-color var(--w-duration-fast, 0.12s);
1663
- }
1664
- .w-select--mini .w-select__trigger { height: var(--w-control-mini, 24px); padding: 0 6px; font-size: var(--w-font-size-mini, 12px); }
1665
- .w-select--small .w-select__trigger { height: var(--w-control-small, 28px); padding: 0 8px; font-size: var(--w-font-size-small, 13px); }
1666
- .w-select--medium .w-select__trigger { height: var(--w-control-medium, 32px); padding: 0 10px; font-size: var(--w-font-size-medium, 14px); }
1667
- .w-select__trigger:hover { border-color: var(--w-accent, var(--color-accent, #2f6feb)); }
1668
- .w-select__trigger:focus-visible { outline: 2px solid var(--w-accent, var(--color-accent, #2f6feb)); outline-offset: 1px; }
1669
- .w-select__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
1670
- .w-select__label { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
1671
- .w-select__label.is-placeholder { color: var(--w-text-faint, var(--color-text-faint, #7c8798)); }
1672
- .w-select__caret { flex: none; opacity: 0.65; }
1673
-
1674
- .w-select-panel { display: flex; flex-direction: column; min-width: 160px; max-width: min(320px, calc(100vw - 24px)); padding: 4px; }
1675
- .w-select-panel .w-select-search {
1676
- width: 100%;
1677
- margin-bottom: 4px;
1678
- padding: 5px 8px;
1679
- border: 1px solid var(--w-border, var(--color-border, #dce2eb));
1680
- border-radius: var(--w-radius-sm, 4px);
1681
- background: var(--w-surface, var(--color-surface, #fff));
1682
- color: var(--w-text, var(--color-text, #1f2937));
1683
- font-size: var(--w-font-size-small, 13px);
1684
- }
1685
- .w-select-panel .w-select-search:focus { outline: 2px solid var(--w-accent, #2f6feb); outline-offset: -1px; }
1686
- .w-select-list {
1687
- display: flex;
1688
- flex-direction: column;
1689
- max-height: min(50vh, 320px);
1690
- overflow-y: auto;
1691
- overscroll-behavior: contain;
1692
- scrollbar-width: thin;
1693
- }
1694
- .w-select-option {
1695
- display: flex;
1696
- align-items: center;
1697
- box-sizing: border-box;
1698
- min-height: 30px;
1699
- padding: 6px 9px;
1700
- border: none;
1701
- border-radius: var(--w-radius-md, 6px);
1702
- background: transparent;
1703
- color: var(--w-text, var(--color-text, #1f2937));
1704
- font-family: inherit;
1705
- font-size: var(--w-font-size-small, 13px);
1706
- text-align: left;
1707
- cursor: pointer;
1708
- }
1709
- .w-select-option.is-active { background: var(--w-surface-subtle, var(--color-surface-subtle, #f5f7fa)); }
1710
- .w-select-option.is-selected { color: var(--w-accent, var(--color-accent, #2f6feb)); background: var(--w-accent-soft, var(--color-accent-soft, #eaf1ff)); }
1711
- .w-select-option:disabled { opacity: 0.45; cursor: not-allowed; }
1712
- .w-select-empty { padding: 8px 9px; color: var(--w-text-faint, #7c8798); font-size: var(--w-font-size-small, 13px); }
1713
- .w-dropdown {
1714
- min-width: 160px;
1715
- max-width: min(320px, calc(100vw - 24px));
1716
- max-height: min(70vh, 520px);
1717
- overflow-y: auto;
1718
- overscroll-behavior: contain;
1719
- padding: 4px;
1720
- scrollbar-width: thin;
1721
- scrollbar-color: color-mix(in srgb, var(--w-text-faint, #7c8798) 40%, transparent) transparent;
1722
- }
1723
- .w-dropdown::-webkit-scrollbar { width: 8px; }
1724
- .w-dropdown::-webkit-scrollbar-thumb {
1725
- border: 2px solid transparent;
1726
- border-radius: 999px;
1727
- background-clip: content-box;
1728
- background-color: color-mix(in srgb, var(--w-text-faint, #7c8798) 36%, transparent);
1729
- }
1730
- .w-dropdown-option {
1731
- display: flex;
1732
- align-items: center;
1733
- gap: 6px;
1734
- box-sizing: border-box;
1735
- min-height: 30px;
1736
- padding: 6px 9px;
1737
- border-radius: var(--w-radius-md, 6px);
1738
- color: var(--w-text, var(--color-text, #1f2937));
1739
- font-size: var(--w-font-size-small, 13px);
1740
- line-height: 1.5;
1741
- cursor: pointer;
1742
- user-select: none;
1743
- }
1744
- .w-dropdown-option:hover,
1745
- .w-dropdown-option:focus-visible {
1746
- background: var(--w-surface-subtle, var(--color-surface-subtle, #f5f7fa));
1747
- outline: none;
1748
- }
1749
- .w-dropdown-option.is-selected {
1750
- color: var(--w-accent, var(--color-accent, #2f6feb));
1751
- background: var(--w-accent-soft, var(--color-accent-soft, #eaf1ff));
1752
- }
1753
- .w-dropdown-option.is-disabled {
1754
- opacity: 0.45;
1755
- cursor: not-allowed;
1756
- background: transparent;
1757
- }
1758
- .w-dropdown-group__title {
1759
- padding: 6px 9px 3px;
1760
- color: var(--w-text-faint, var(--color-text-faint, #7c8798));
1761
- font-size: 11px;
1762
- line-height: 1.5;
1763
- }
1764
- .w-dropdown-group + .w-dropdown-group {
1765
- margin-top: 2px;
1766
- padding-top: 3px;
1767
- border-top: 1px solid var(--w-border, var(--color-border, #dce2eb));
1768
- }
1769
- .w-tooltip {
1770
- padding: 5px 9px;
1771
- border: 1px solid var(--w-border, var(--color-border, #dce2eb));
1772
- border-radius: var(--w-radius-sm, 4px);
1773
- background: var(--w-surface, var(--color-surface, #fff));
1774
- color: var(--w-text, var(--color-text, #1f2937));
1775
- font-size: var(--w-font-size-mini, 12px);
1776
- line-height: 1.55;
1777
- white-space: nowrap;
1778
- box-shadow: var(--w-shadow-pop, 0 10px 32px #14284a20);
1779
- }
1780
- .wd-dialog-mask {
1781
- position: fixed;
1782
- inset: 0;
1783
- z-index: 1100;
1784
- display: flex;
1785
- align-items: flex-start;
1786
- justify-content: center;
1787
- padding: 10vh 16px 24px;
1788
- background: color-mix(in srgb, #101828 42%, transparent);
1789
- overflow-y: auto;
1790
- overscroll-behavior: contain;
1791
- }
1792
- .wd-dialog-mask.is-fullscreen { padding: 0; overflow: hidden; }
1793
-
1794
- .wd-dialog {
1795
- position: relative;
1796
- display: flex;
1797
- flex-direction: column;
1798
- max-width: calc(100vw - 32px);
1799
- max-height: calc(100dvh - 14vh);
1800
- border: 1px solid var(--w-border, var(--color-border, #dce2eb));
1801
- border-radius: var(--w-radius-lg, 8px);
1802
- background: var(--w-surface, var(--color-surface, #fff));
1803
- color: var(--w-text, var(--color-text, #1f2937));
1804
- box-shadow: 0 24px 64px #10182833;
1805
- outline: none;
1806
- }
1807
- .wd-dialog.is-fullscreen {
1808
- width: 100vw;
1809
- max-width: none;
1810
- height: 100dvh;
1811
- max-height: none;
1812
- border: 0;
1813
- border-radius: 0;
1814
- }
1815
-
1816
- .wd-dialog__header {
1817
- display: flex;
1818
- align-items: center;
1819
- gap: 12px;
1820
- flex: none;
1821
- padding: 14px 18px;
1822
- border-bottom: 1px solid var(--w-border, var(--color-border, #dce2eb));
1823
- }
1824
- .wd-dialog__title {
1825
- flex: 1;
1826
- min-width: 0;
1827
- font-size: 16px;
1828
- font-weight: 600;
1829
- line-height: 1.4;
1830
- }
1831
- .wd-dialog__close {
1832
- display: flex;
1833
- align-items: center;
1834
- justify-content: center;
1835
- flex: none;
1836
- width: 28px;
1837
- height: 28px;
1838
- padding: 0;
1839
- border: none;
1840
- border-radius: var(--w-radius-sm, 4px);
1841
- background: transparent;
1842
- color: var(--w-text-muted, var(--color-text-muted, #667085));
1843
- cursor: pointer;
1844
- }
1845
- .wd-dialog__close:hover { background: var(--w-surface-subtle, #f5f7fa); color: var(--w-text, #1f2937); }
1846
- .wd-dialog__close:focus-visible { outline: 2px solid var(--w-accent, #2f6feb); outline-offset: -2px; }
1847
-
1848
- .wd-dialog__body {
1849
- flex: 1;
1850
- min-height: 0;
1851
- overflow-y: auto;
1852
- padding: 4px 25px 24px;
1853
- line-height: 1.7;
1854
- }
1855
- .wd-dialog.is-fullscreen .wd-dialog__body {
1856
- display: flex;
1857
- flex-direction: column;
1858
- overflow: hidden;
1859
- padding: 0;
1860
- }
1861
-
1862
- .wd-dialog__footer {
1863
- display: flex;
1864
- justify-content: flex-end;
1865
- align-items: center;
1866
- gap: 8px;
1867
- flex: none;
1868
- padding: 0 25px 20px;
1869
- }
1870
-
1871
- @media (max-width: 520px) {
1872
- .wd-dialog__body { padding: 4px 18px 20px; }
1873
- .wd-dialog__footer { padding: 0 18px 16px; }
1874
- }
1875
- .w-overlay-scrollbar { overflow: hidden; }
1876
- .w-overlay-scrollbar__viewport {
1877
- overflow: auto; overscroll-behavior: contain; scrollbar-width: none; min-height: 0;
1878
- box-sizing: border-box; padding: 6px; overflow-anchor: none;
1879
- }
1880
- .w-overlay-scrollbar__viewport::-webkit-scrollbar { display: none; width: 0; height: 0; }
1881
- .w-overlay-scrollbar__track {
1882
- position: absolute; top: 5px; right: 2px; bottom: 5px; z-index: 1; width: 10px;
1883
- opacity: 0; transition: opacity .15s; touch-action: none; cursor: default;
1884
- }
1885
- .w-overlay-scrollbar__track[hidden] { display: none; }
1886
- .w-overlay-scrollbar:hover > .w-overlay-scrollbar__track,
1887
- .w-overlay-scrollbar:focus-within > .w-overlay-scrollbar__track,
1888
- .w-overlay-scrollbar.is-scrolling > .w-overlay-scrollbar__track { opacity: 1; }
1889
- .w-overlay-scrollbar__thumb {
1890
- position: absolute; top: 0; right: 2px; width: 6px; border-radius: 999px; touch-action: none;
1891
- background: color-mix(in srgb, var(--color-text-muted) 42%, transparent); cursor: grab;
1892
- }
1893
- .w-overlay-scrollbar__thumb:hover,
1894
- .w-overlay-scrollbar.is-dragging-scrollbar .w-overlay-scrollbar__thumb {
1895
- background: color-mix(in srgb, var(--color-text-muted) 66%, transparent);
1896
- }
1897
- .w-overlay-scrollbar.is-dragging-scrollbar .w-overlay-scrollbar__thumb { cursor: grabbing; }
1898
- .w-overlay-scrollbar__thumb:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 1px; }
1899
- @media (prefers-reduced-motion: reduce) { .w-overlay-scrollbar__track { transition: none; } }
1900
- .mind-inline { height:100%; min-height:380px; }
1901
- .mind-inline .mind-map-workspace { height:100%; padding:0; }
1902
- .mind-canvas-title { display: inline-flex; align-items: center; gap: 14px; max-width: calc(100vw - 110px); }
1903
- .mind-canvas-title > span { font-size: 13px; font-weight: 400; color: var(--color-text-muted); max-width: 65vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1904
- /**
1905
- * 全屏弹层的工作区。
1906
- *
1907
- * ## 为什么是 `height:100%` 而不是 `calc(100dvh - 110px)`
1908
- *
1909
- * 弹层里 `.wd-dialog__body` 已经是"header 以下的全部高度"(flex 列、无内边距),
1910
- * 再把 header 高度写死成 110px 去减就是重复扣减:实际 header 只有 57px,
1911
- * 于是画布底部多出 53px 空白,看起来"没到底"(用户实测:"底部可以进一点")。
1912
- * 交给父容器决定高度,画布就能填满。
1913
- *
1914
- * ## 为什么四周要留内边距
1915
- *
1916
- * 全屏时 body 的内边距是 0,工具栏会紧贴 header 的下边线、画布也贴着窗口
1917
- * 左右边缘(用户实测:"边框距离太近")。这里按工具栏在上、画布在下的顺序
1918
- * 给一圈呼吸空间;inline(正文内嵌)形态不需要,单独复位为 0。
1919
- */
1920
- .mind-map-workspace { display: flex; flex-direction: column; height: 100%; min-height: 300px; box-sizing: border-box; padding: 16px 20px 20px; color: var(--color-text); }
1921
- .mind-save-hint { margin-bottom: 10px; }
1922
- .mind-canvas-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0 0 10px; flex-wrap: wrap; }
1923
- .mind-canvas-tools { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
1924
- .mind-canvas-options { justify-content: flex-end; margin-left: auto; }
1925
- .mind-canvas-status { font-size: 12px; color: var(--color-text-muted); max-width: 32vw; }
1926
- .mind-canvas-body { display: flex; flex: 1; min-height: 0; border: 1px solid var(--color-border); border-radius: 12px; overflow: hidden; }
1927
- .mind-canvas-stage { position: relative; flex: 1; min-width: 0; overflow: hidden; outline: none; background: radial-gradient(var(--color-border) 1px, transparent 1px) 0 0 / 22px 22px var(--color-surface); }
1928
- .mind-canvas-stage.mind-grid-hidden { background-image:none; }
1929
- .mind-canvas-surface { width:100%;height:100%; }
1930
- .mind-canvas-stage .vue-flow__pane { cursor:default; }
1931
- .mind-canvas-stage .vue-flow__selection,.mind-marquee { background:color-mix(in srgb,var(--mind-color) 8%,transparent);border:1px solid var(--mind-color);box-sizing:border-box;pointer-events:none; }
1932
- .mind-marquee {position:absolute;z-index:4;}
1933
- .mind-canvas-stage.mind-space-pan .vue-flow__pane,
1934
- .mind-canvas-stage.mind-space-pan .vue-flow__node { cursor:grab; }
1935
- .mind-canvas-stage .vue-flow__pane.dragging { cursor:grabbing; }
1936
- .mind-selection-summary {position:absolute;left:16px;top:16px;display:flex;align-items:center;gap:10px;padding:6px 12px;border:1px solid var(--color-border);border-radius:9px;background:var(--color-surface);font-size:12px;}
1937
- .mind-menu-key {margin-left:22px;float:right;color:var(--color-text-faint);font-size:11px;}
1938
- .mind-canvas-outline { flex: 0 0 235px; overflow: auto; border-right: 1px solid var(--color-border); padding: 12px 4px; }
1939
- .mind-canvas-outline button { display: block; border: 0; background: transparent; border-radius: 5px; width: 100%; text-align: left; padding: 7px 10px; color: var(--color-text-muted); white-space: pre-wrap; overflow-wrap: anywhere; }
1940
- .mind-canvas-outline button.current { color: var(--mind-color); background: var(--color-surface-subtle); }
1941
- .mind-node-actions { position: absolute; left: 16px; top: 16px; display: flex; flex-wrap: wrap; align-items: center; gap: 5px; border: 1px solid var(--color-border); padding: 6px; background: var(--color-surface); border-radius: 10px; box-shadow: 0 4px 20px #00000008; }
1942
- .mind-canvas-bottom { position: absolute; bottom: 16px; left: 18px; right: 18px; display: flex; justify-content: space-between; align-items: end; gap: 10px; pointer-events: none; }
1943
- .mind-canvas-hint { font-size: 11px; color: var(--color-text-faint); padding: 6px 0; }
1944
- .mind-canvas-viewport { display: flex; align-items: center; gap: 6px; padding: 6px; border: 1px solid var(--color-border); border-radius: 9px; background: var(--color-surface); pointer-events: auto; white-space: nowrap; }
1945
- .mind-viewport-divider { height:20px;border-left:1px solid var(--color-border);margin:0 2px; }
1946
- .mind-zoom-percent { min-width:52px;font-variant-numeric:tabular-nums; }
1947
- .mind-viewport-tip { display:flex;align-items:center;flex-wrap:wrap;gap:7px;max-width:min(480px,calc(100vw - 40px));font-size:12px;line-height:1.6; }
1948
- .mind-viewport-tip kbd { padding:2px 6px;border-radius:4px;background:#ffffff20;font:inherit;white-space:nowrap; }
1949
- .mind-canvas-notice { position: absolute; bottom: 70px; left: 50%; transform: translateX(-50%); padding: 8px 14px; margin: 0; border-radius: 7px; background: var(--color-surface); border: 1px solid var(--color-border); color: var(--color-text-muted); font-size: 12px; pointer-events: none; max-width: 90%; }
1950
- .mind-canvas-stage .mind-drop-child { outline: 3px solid var(--mind-color); border-radius: 10px; }
1951
- .mind-canvas-stage .mind-drop-left { box-shadow:-6px 0 0 0 var(--mind-color);border-radius:9px; }
1952
- .mind-canvas-stage .mind-drop-right { box-shadow:6px 0 0 0 var(--mind-color);border-radius:9px; }
1953
- .mind-canvas-stage .mind-drag-branch { opacity:.35; }
1954
- .mind-canvas-stage .mind-drag-branch-edge { opacity:.12; }
1955
- .mind-side-preview {position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;}
1956
- .mind-side-preview path {fill:none;stroke:var(--mind-color);stroke-width:2;stroke-dasharray:6 4;}
1957
- .mind-side-preview rect {fill:var(--color-surface);stroke:var(--mind-color);stroke-width:2;stroke-dasharray:5 3;}
1958
- .mind-side-preview text {fill:var(--color-text);font-size:14px;}
1959
- .mind-canvas-stage .mind-drop-before::before, .mind-canvas-stage .mind-drop-after::after { content: ''; position: absolute; left: -10px; right: -10px; height: 3px; background: var(--mind-color); }
1960
- .mind-canvas-stage .mind-drop-before::before { top: -7px; }
1961
- .mind-canvas-stage .mind-drop-after::after { bottom: -7px; }
1962
- .mind-canvas-stage .vue-flow__edge-path { stroke: var(--mind-color); }
1963
- @media (max-width: 760px) { .mind-canvas-outline { flex-basis: 170px; } .mind-canvas-hint { display: none; } .mind-canvas-toolbar { gap: 8px; } .mind-canvas-options { justify-content: flex-start; margin-left: 0; } .mind-node-actions { left: 8px; right: 8px; top: 8px; } .mind-canvas-status { max-width: 60vw; } }
1964
- .mind-inline { height:100%; min-height:380px; }
1965
- .mind-inline .mind-map-workspace { height:100%; }
1966
- .mind-search { display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:6px 0 10px;font-size:12px; }
1967
- .mind-search input {width:180px;font-size:12px;}
1968
- .mind-outline-row {display:flex;align-items:center;margin:3px 0;}.mind-outline-row input {min-width:0;width:100%;border:0;background:transparent;font:12px/22px inherit;color:var(--color-text);padding:5px;}.mind-outline-row.current {background:var(--color-surface-subtle);}.mind-outline-row>button:last-child {width:24px;flex-shrink:0;padding:2px;}
1969
- .mind-canvas-outline .mind-outline-row textarea{min-width:0;width:100%;border:0;background:transparent;font-size:12px;line-height:22px;color:var(--color-text);padding:5px;resize:none;border-radius:4px;}
1970
- .mind-inline { height:100%; min-height:380px; }
1971
- .mind-inline .mind-map-workspace { height:100%; }.mind-settings-menu{width:310px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px;font-size:12px;}.mind-settings-menu label{width:100%;display:flex;gap:8px;align-items:center;}.mind-settings-menu input{width:auto;}
1972
- .mind-canvas-fullscreen {
1973
- position: fixed !important;
1974
- top: 0 !important;
1975
- left: 0 !important;
1976
- width: 100vw !important;
1977
- height: 100dvh !important;
1978
- max-width: none !important;
1979
- }
1980
- .mind-topic-shell { position: relative; width: 100%; height: 100%; }
1981
- .mind-topic { position: relative; border-radius: 9px; background: var(--color-surface); color: var(--color-text); border: 1px solid color-mix(in srgb, var(--mind-color) 38%, var(--color-border)); padding: 10px 16px; font-family: inherit; font-size: 14px; line-height: 22px; display: grid; place-items: center; box-sizing: border-box; }
1982
- .mind-topic.root { background: var(--mind-color); border-color: var(--mind-color); color: white; font-weight: 600; }
1983
- .mind-topic.active { box-shadow: 0 0 0 3px color-mix(in srgb, var(--mind-color) 22%, transparent); }
1984
- .mind-topic-label { width:100%;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-all;text-align:center;line-height:var(--mind-topic-line-height,22px); }
1985
- .mind-topic-input { box-sizing:border-box;display:block;border:0;border-radius:4px;outline:0;padding:0;margin:0;width:100%;min-width:0;min-height:var(--mind-topic-line-height,22px);max-width:none;resize:none;overflow:hidden;white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;background:transparent;color:inherit;font:inherit;line-height:var(--mind-topic-line-height,22px);text-align:inherit; }
1986
- .mind-topic-input:focus { box-shadow: none; outline: 0; }
1987
- .mind-topic-fold {
1988
- position:absolute;left:calc(100% + 20px);top:calc(50% - 12px);width:24px;min-width:24px;height:24px;padding:0;
1989
- display:grid;place-items:center;z-index:2;border-radius:50%;border:1px solid var(--mind-color);color:var(--mind-color);background:var(--color-surface);
1990
- font:11px/1 sans-serif;cursor:pointer;opacity:0;pointer-events:none;transition:opacity .12s ease;
1991
- }
1992
- .mind-topic-shell:hover>.mind-topic-fold,.mind-topic-shell.is-selected>.mind-topic-fold,
1993
- .mind-topic-shell:focus-within>.mind-topic-fold,.mind-topic-shell.is-collapsed>.mind-topic-fold {
1994
- opacity:1;pointer-events:auto;
1995
- }
1996
- .mind-topic-fold:hover {background:color-mix(in srgb,var(--mind-color) 10%,var(--color-surface));}
1997
- .mind-topic-fold:focus-visible {outline:2px solid var(--mind-color);outline-offset:3px;}
1998
- .mind-fold-count {font-variant-numeric:tabular-nums;font-weight:600;}
1999
- /* Keep the node and its connector in one hover region while moving toward the button. */
2000
- .mind-topic-shell.has-children:not(.root)::before {content:'';position:absolute;left:100%;top:0;width:64px;height:100%;}
2001
- .mind-topic-handle { opacity: 0; pointer-events: none; }
2002
- .mind-topic-shell.grows-left .mind-topic-add { left: auto; right: calc(100% - 12px); }
2003
- .mind-topic-shell .mind-topic-add.root-left {left:auto;right:calc(100% - 12px);}
2004
- .mind-topic-shell .mind-topic-add.root-right {right:auto;left:calc(100% - 12px);}
2005
- .mind-topic-shell.grows-left .mind-topic-fold {left:auto;right:calc(100% + 20px);}
2006
- .mind-topic-shell.grows-left .mind-fold-chevron {transform:rotate(180deg);}
2007
- .mind-topic-shell.grows-left.has-children:not(.root)::before {left:auto;right:100%;}
2008
- .mind-topic-shell.grows-down .mind-topic-add { left: calc(50% - 12px); top: calc(100% - 12px); }
2009
- .mind-topic-shell.grows-down .mind-topic-fold {right:auto;left:calc(50% - 12px);top:calc(100% + 18px);}
2010
- .mind-topic-shell.grows-down .mind-fold-chevron {transform:rotate(90deg);}
2011
- .mind-topic-shell.grows-down.has-children:not(.root)::before {left:0;right:auto;top:100%;width:100%;height:60px;}
2012
- @media(hover:none){.mind-topic-fold{opacity:1;pointer-events:auto;}}
2013
- .mind-topic-sibling {
2014
- position: absolute; width: 24px; min-width: 24px; height: 24px; padding: 0;
2015
- left: calc(50% - 12px); display: grid; place-items: center;
2016
- border: 0; border-radius: 50%; background: transparent; color: white;
2017
- cursor: pointer; z-index: 1;
2018
- }
2019
- .mind-topic-sibling.before { top: -22px; }
2020
- .mind-topic-sibling.after { bottom: -22px; }
2021
- .mind-topic-sibling > span {
2022
- display: grid; place-items: center; width: 9px; height: 9px; border-radius: 50%;
2023
- background: color-mix(in srgb, var(--mind-color) 36%, var(--color-surface)); font: 0/1 sans-serif;
2024
- }
2025
- .mind-topic-sibling:hover, .mind-topic-sibling:focus-visible { background: transparent; }
2026
- .mind-topic-sibling:hover > span, .mind-topic-sibling:focus-visible > span {
2027
- width: 20px; height: 20px; background: var(--mind-color); font-size: 16px;
2028
- }
2029
- .mind-topic-sibling:focus-visible { outline: 2px solid var(--mind-color); outline-offset: 1px; }
2030
- .mind-topic-shell.grows-down .mind-topic-sibling { top: calc(50% - 12px); bottom: auto; }
2031
- .mind-topic-shell.grows-down .mind-topic-sibling.before { left: -22px; }
2032
- .mind-topic-shell.grows-down .mind-topic-sibling.after { left: auto; right: -22px; }
2033
- .mind-topic-description { font-size:12px;line-height:18px;white-space:pre-wrap;color:var(--color-text-muted);width:100%;min-width:0;word-break:break-all;overflow-wrap:anywhere;margin-top:6px; }
2034
- .root .mind-topic-description { color:#e7f4ff; }.mind-topic-image { width:100%;height:96px;overflow:hidden;margin-top:8px; }
2035
- .mind-topic-image img {width:100%!important;height:96px!important;object-fit:contain;max-height:96px!important;margin:0!important;}
2036
- .mind-topic-note { font-size:10px;line-height:14px;margin-top:6px;opacity:.7;cursor:pointer; }
2037
- /**
2038
- * 「添加子主题」按钮:骑在节点右缘(或左缘)上的圆形按钮。
2039
- *
2040
- * ## 为什么必须显式给全样式(用户实测:"按钮+太怪异了")
2041
- *
2042
- * 这里原来只写了尺寸与圆角,**没有背景、边框、字色**。`<button>` 的默认样式
2043
- * 因此生效:浅灰方块底 + 深灰描边 + 系统字体,压在蓝色根节点上像一块补丁,
2044
- * 与画布其余部分(圆角卡片、细线连接)完全不是一个语言。
2045
- *
2046
- * 现在按参考样式统一为:圆形、白底、细描边、居中「+」,悬停时染色并略微放大。
2047
- * 用 `display:grid` 而不是 `line-height` 居中——后者在 24px 圆里对不齐。
2048
- */
2049
- .mind-topic-add {
2050
- position: absolute;
2051
- left: calc(100% - 12px);
2052
- top: calc(50% - 12px);
2053
- width: 24px;
2054
- height: 24px;
2055
- padding: 0;
2056
- box-sizing: border-box;
2057
- display: grid;
2058
- place-items: center;
2059
- border-radius: 50%;
2060
- border: 1px solid color-mix(in srgb, var(--mind-color) 45%, var(--color-border));
2061
- background: var(--color-surface);
2062
- color: color-mix(in srgb, var(--mind-color) 82%, var(--color-text));
2063
- font: 15px/1 system-ui, sans-serif;
2064
- font-weight: 500;
2065
- cursor: pointer;
2066
- z-index: 3;
2067
- box-shadow: 0 1px 3px rgb(15 23 42 / 12%);
2068
- transition: background .12s ease, border-color .12s ease, transform .12s ease, box-shadow .12s ease;
2069
- }
2070
- /**
2071
- * 悬停/聚焦:底色换成主题色的淡染,边界加深,轻微放大。
2072
- *
2073
- * 只改颜色而不改尺寸(除 transform)是关键:按钮骑在节点边缘,改 width/height
2074
- * 会让它相对节点跳动;`transform: scale` 不参与布局,视觉放大而位置不动。
2075
- */
2076
- .mind-topic-add:hover,
2077
- .mind-topic-add:focus-visible {
2078
- background: color-mix(in srgb, var(--mind-color) 14%, var(--color-surface));
2079
- border-color: var(--mind-color);
2080
- color: var(--mind-color);
2081
- transform: scale(1.12);
2082
- box-shadow: 0 2px 6px rgb(15 23 42 / 18%);
2083
- }
2084
- .mind-topic-add:focus-visible { outline: 2px solid var(--mind-color); outline-offset: 2px; }
2085
- .mind-topic-add:active { transform: scale(0.98); }
2086
- /* 深色节点(根主题)上按钮是白底压在深蓝上:描边改用白色系,避免与底色混在一起 */
2087
- .mind-topic-add.root-left,
2088
- .mind-topic-add.root-right {
2089
- border-color: color-mix(in srgb, var(--color-surface) 70%, transparent);
2090
- }
2091
- .mind-topic-icon { font-size:16px;line-height:20px; }.mind-topic[style*="border: 0"] { background:transparent; }
2092
- .mind-preview-wrap {display:flex;align-items:center;justify-content:center;overflow:hidden;min-height:240px;}
2093
- .mind-preview-sized {position:relative;flex-shrink:0;}.mind-preview-scene {position:relative;transform-origin:top left;}.mind-preview-lines {position:absolute;inset:0;}
2094
- .mind-preview-topic {position:absolute;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--mind-color) 35%,var(--color-border));border-radius:9px;background:var(--color-surface-subtle);color:var(--color-text);padding:10px 16px;display:flex;flex-direction:column;justify-content:center;line-height:22px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-all;}
2095
- .mind-preview-title{display:block;width:100%;min-width:0;}.mind-preview-icon{font-size:16px;line-height:20px;}
2096
- .mind-preview-topic.root {background:var(--mind-color);color:white;font-weight:600;}.mind-preview-topic.text {border:0;background:transparent;}
2097
- .mind-preview-description {font-size:12px;font-weight:400;line-height:18px;margin-top:6px;opacity:.72;}.mind-preview-note{font-size:10px;line-height:14px;margin-top:6px;opacity:.65;}
2098
- .mind-preview-image{width:100%;height:96px;margin-top:8px;overflow:hidden;}.mind-preview-image img{width:100%!important;height:96px!important;object-fit:contain;margin:0!important;}
2099
- .mind-map-block { margin: 20px 0; border: 1px solid var(--color-border); border-radius: 12px; background: var(--color-surface); overflow: hidden; }
2100
- .mind-map-block-header { min-height: 45px; display: flex; gap: 12px; align-items: center; justify-content: space-between; padding: 6px 12px; }
2101
- .mind-map-block-label { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--color-text-muted); }
2102
- .mind-map-block-label > span:first-child { color: var(--mind-color); font-size: 18px; }
2103
- .mind-map-topic-count { font-size: 11px; color: var(--color-text-faint); }
2104
- .mind-map-block-actions { display: flex; flex-shrink: 0; gap: 4px; }
2105
- .mind-map-preview { width: 100%; display: block; min-height: 240px; cursor: zoom-in; }
2106
- .mind-map-preview rect { fill: var(--color-surface-subtle); stroke: var(--mind-color); stroke-opacity: .3; }
2107
- .mind-map-preview text { fill: var(--color-text); font-family: inherit; }
2108
- .mind-map-preview .mind-map-root rect { fill: var(--mind-color); stroke: none; }
2109
- .mind-map-preview .mind-map-root text { fill: white; }
2110
- .mind-map-preview-outline { overflow: auto; padding: 16px 24px 24px; font-size: 14px; line-height: 2; white-space: pre-wrap; overflow-wrap: anywhere; }
2111
- .mind-map-invalid { padding: 20px; color: var(--color-text-muted); }
2112
- @media (max-width: 600px) { .mind-map-topic-count { display: none; } }
2113
- .mind-details { flex: 0 0 280px; padding: 14px; border-left: 1px solid var(--color-border); overflow: auto; background: var(--color-surface); font-size: 12px; }
2114
- .mind-details > header { display: flex; justify-content: space-between; align-items: center; }.mind-details-title { color: var(--color-text-muted); overflow-wrap:anywhere; }
2115
- .mind-details fieldset { border: 0; border-top: 1px solid var(--color-border); padding: 12px 0; margin: 8px 0; display: flex; flex-direction:column; gap:8px; }
2116
- .mind-details legend { font-weight:600; padding:0 8px 0 0; } .mind-details label { display:grid; grid-template-columns:70px minmax(0,1fr);align-items:center;gap:8px; }
2117
- .mind-details input,.mind-details textarea { width:100%;font:inherit;box-sizing:border-box; } .mind-details textarea { resize:vertical; }.mind-format-buttons { display:flex;gap:6px; }
2118
- .mind-relation-item { display:flex;align-items:center;gap:8px; }.mind-relation-item span { flex:1;overflow-wrap:anywhere; }
2119
- .mind-color-grid {display:grid;grid-template-columns:repeat(8,24px);gap:4px;}.mind-color-grid>*{width:24px;min-width:24px;height:24px;padding:0;}
2120
- .mind-comments {
2121
- flex: 0 0 340px;
2122
- display: flex;
2123
- flex-direction: column;
2124
- gap: 12px;
2125
- min-height: 0;
2126
- padding: 16px;
2127
- overflow: auto;
2128
- border-left: 1px solid var(--color-border);
2129
- background: var(--color-surface, #fff);
2130
- font-size: 13px;
2131
- }
2132
- .mind-comments__head {
2133
- display: flex;
2134
- align-items: flex-start;
2135
- justify-content: space-between;
2136
- gap: 8px;
2137
- }
2138
- .mind-comments__intro strong { font-size: 14px; }
2139
- .mind-comments__intro p {
2140
- margin: 4px 0 0;
2141
- color: var(--color-text-muted);
2142
- font-size: 12px;
2143
- line-height: 1.6;
2144
- }
2145
- .mind-comments__head-actions { display: flex; flex: none; gap: 4px; }
2146
- .mind-comments__error {
2147
- margin: 0;
2148
- padding: 8px 10px;
2149
- border-radius: 6px;
2150
- background: #fdecec;
2151
- color: #b42b36;
2152
- font-size: 12px;
2153
- }
2154
- .mind-comments__list { display: grid; gap: 10px; }
2155
- .mind-comment {
2156
- display: grid;
2157
- gap: 8px;
2158
- padding: 10px 12px;
2159
- border: 1px solid var(--color-border);
2160
- border-radius: 8px;
2161
- }
2162
- .mind-comment__head {
2163
- display: flex;
2164
- align-items: baseline;
2165
- justify-content: space-between;
2166
- gap: 8px;
2167
- }
2168
- .mind-comment__head span { color: var(--color-text-muted); font-size: 11px; }
2169
- .mind-comment__body {
2170
- margin: 0;
2171
- white-space: pre-wrap;
2172
- overflow-wrap: anywhere;
2173
- line-height: 1.7;
2174
- }
2175
- .mind-comment__actions { display: flex; flex-wrap: wrap; gap: 4px; }
2176
- .mind-comment__reply {
2177
- display: grid;
2178
- gap: 6px;
2179
- margin-left: 12px;
2180
- padding-left: 10px;
2181
- border-left: 2px solid var(--color-border);
2182
- }
2183
- .mind-comment__label {
2184
- color: var(--color-text-muted);
2185
- font-size: 11px;
2186
- font-weight: 600;
2187
- }
2188
- .mind-comment__compose { display: grid; gap: 6px; }
2189
- .mind-comments__compose {
2190
- display: grid;
2191
- gap: 6px;
2192
- padding-top: 12px;
2193
- border-top: 1px solid var(--color-border);
2194
- }
2195
- .mind-comments__empty {
2196
- margin: 0;
2197
- color: var(--color-text-muted);
2198
- font-size: 12px;
2199
- line-height: 1.7;
2200
- }
2201
- .mind-comments textarea {
2202
- width: 100%;
2203
- padding: 8px 10px;
2204
- border: 1px solid var(--color-border);
2205
- border-radius: 6px;
2206
- background: var(--color-surface, #fff);
2207
- color: inherit;
2208
- font: inherit;
2209
- line-height: 1.6;
2210
- box-sizing: border-box;
2211
- resize: vertical;
2212
- }
2213
- .picker-backdrop {
2214
- position: fixed;
2215
- inset: 0;
2216
- z-index: 1100;
2217
- background: color-mix(in srgb, #000 45%, transparent);
2218
- display: flex;
2219
- align-items: flex-start;
2220
- justify-content: center;
2221
- padding-top: 12vh;
2222
- }
2223
- .picker-backdrop .picker {
2224
- width: 420px;
2225
- max-width: calc(100vw - 32px);
2226
- background: var(--color-surface);
2227
- border: 1px solid var(--color-border);
2228
- border-radius: 10px;
2229
- box-shadow: var(--shadow-pop);
2230
- padding: 8px;
2231
- }
2232
- .picker-backdrop .picker .picker-input {
2233
- width: 100%;
2234
- box-sizing: border-box;
2235
- border: 1px solid var(--color-border);
2236
- border-radius: 6px;
2237
- padding: 8px 10px;
2238
- font-size: 14px;
2239
- background: var(--color-surface-subtle);
2240
- color: var(--color-text);
2241
- }
2242
- .picker-backdrop .picker-input:focus { outline: none; border-color: var(--color-accent); }
2243
- .picker-backdrop .picker-list {
2244
- list-style: none;
2245
- margin: 6px 0 0;
2246
- padding: 0;
2247
- max-height: 320px;
2248
- overflow-y: auto;
2249
- }
2250
- .picker-backdrop .picker-list li {
2251
- padding: 7px 10px;
2252
- border-radius: 6px;
2253
- cursor: pointer;
2254
- font-size: 14px;
2255
- color: var(--color-text);
2256
- }
2257
- .picker-backdrop .picker-list li.active { background: var(--color-accent-soft); color: var(--color-accent); }
2258
- .picker-backdrop .picker-title { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2259
- .picker-backdrop .picker-empty { color: var(--color-text-faint); font-size: 13px; text-align: center; padding: 14px 0; margin: 0; }
2260
- /*
2261
- * 垂直节奏:字段内部 8px,字段之间 16px,最后一段之外留出 dialog body 的
2262
- * 底部内边距。之前的提示文字紧贴输入框、又贴着按钮行,看起来像被截断。
2263
- */
2264
- .video-form { display: flex; flex-direction: column; gap: 16px; }
2265
- .video-field { display: flex; flex-direction: column; gap: 8px; }
2266
- .video-field label { font-size: 13px; font-weight: 600; color: var(--color-text); }
2267
- .video-field input { width: 100%; }
2268
- .video-hint {
2269
- margin: 0;
2270
- font-size: 12px;
2271
- line-height: 1.7;
2272
- color: var(--color-text-muted);
2273
- }
2274
- .video-status {
2275
- margin: 0;
2276
- padding: 8px 10px;
2277
- border-radius: 6px;
2278
- font-size: 12px;
2279
- line-height: 1.7;
2280
- }
2281
- .video-status--ok {
2282
- color: var(--color-text);
2283
- background: var(--color-accent-soft);
2284
- }
2285
- .video-status--error {
2286
- color: var(--color-danger);
2287
- background: color-mix(in srgb, var(--color-danger) 8%, transparent);
2288
- }
2289
- .video-status-meta {
2290
- margin-left: 4px;
2291
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
2292
- color: var(--color-text-muted);
2293
- }
2294
- .video-source {
2295
- margin: 0;
2296
- font-size: 12px;
2297
- line-height: 1.6;
2298
- color: var(--color-text-muted);
2299
- overflow-wrap: anywhere;
2300
- }
2301
- /*
2302
- * `--color-hover` 从来没有被定义过:占位区背景整条声明在计算值阶段失效,
2303
- * 只剩正文白底,看起来像一块空白矩形。改用确定存在的 `--color-surface-subtle`
2304
- * 并给出绝对色兜底,非 SDK 宿主也能正常着色。
2305
- */
2306
- .doc-video-embed { width: 100%; min-width: 0; border: 1px solid var(--color-border, #dce2eb); border-radius: 8px; overflow: hidden; background: var(--color-surface, #fff); }
2307
- .doc-video-embed .video-placeholder {
2308
- min-height: 220px; padding: 28px 24px;
2309
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
2310
- background: var(--color-surface-subtle, #f5f7fa);
2311
- }
2312
- .doc-video-embed .video-play-icon {
2313
- display: inline-flex; align-items: center; justify-content: center;
2314
- width: 46px; height: 46px; margin-bottom: 2px; border-radius: 50%;
2315
- color: var(--color-accent, #2f6feb);
2316
- background: var(--color-accent-soft, #eaf1ff);
2317
- font-size: 18px; line-height: 1; text-indent: 2px;
2318
- }
2319
- .doc-video-embed .video-placeholder strong { font-size: 14px; font-weight: 600; color: var(--color-text, #1f2937); }
2320
- .doc-video-embed .video-id { font-size: 12px; color: var(--color-text-muted, #667085); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
2321
- .doc-video-embed .video-load {
2322
- margin-top: 4px; padding: 7px 20px;
2323
- color: var(--color-accent, #2f6feb); background: var(--color-accent-soft, #eaf1ff);
2324
- border: 0; border-radius: 6px; cursor: pointer; font: inherit; font-size: 13px;
2325
- }
2326
- .doc-video-embed .video-load:hover { background: color-mix(in srgb, var(--color-accent, #2f6feb) 16%, transparent); }
2327
- .doc-video-embed iframe { display: block; width: 100%; aspect-ratio: 16 / 9; min-height: 200px; border: 0; background: #111; }
2328
- .doc-video-embed .video-footer {
2329
- display: flex; justify-content: space-between; flex-wrap: wrap; gap: 10px;
2330
- padding: 10px 14px; font-size: 12px;
2331
- border-top: 1px solid var(--color-border, #dce2eb);
2332
- background: var(--color-surface, #fff);
2333
- }
2334
- .doc-video-embed .video-footer a { color: var(--color-accent, #2f6feb); }
2335
- .doc-video-embed button:focus-visible, .doc-video-embed a:focus-visible { outline: 2px solid var(--color-accent, #2f6feb); outline-offset: 2px; }
2336
- .doc-file-video { margin-top: 8px; }
2337
- .doc-file-video video {
2338
- width: 100%;
2339
- max-height: 420px;
2340
- border-radius: 6px;
2341
- background: #000;
2342
- }
2343
- .doc-file-video-fallback {
2344
- margin: 0;
2345
- font-size: 13px;
2346
- color: var(--color-text-faint);
2347
- }
2348
- .wendang-spreadsheet { position: relative; display: flex; flex-direction: column; height: 100%; min-height: 300px; min-width: 0; flex: 1; }
2349
- .worksheet-grid { position: relative; flex: 1; min-width: 0; min-height: 0; overflow: hidden; }
2350
- .wendang-spreadsheet > p { position: absolute; top: 8px; left: 12px; z-index: 2; }
2351
-
2352
- /**
2353
- * wui 设计令牌与 Vue 版 `wui/styles/tokens.css` 同源:组件自己的变量用 `--w-*`,
2354
- * 颜色两级 fallback(宿主覆盖 → 主题变量 → 绝对色),因此深色模式无需第二套定义。
2355
- */
2356
- .wendang, .wendang-portal {
2357
- --w-font-sans: var(--font-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif);
2358
- --w-text: var(--color-text, #1f2937);
2359
- --w-text-muted: var(--color-text-muted, #667085);
2360
- --w-text-faint: var(--color-text-faint, #7c8798);
2361
- --w-surface: var(--color-surface, #fff);
2362
- --w-surface-subtle: var(--color-surface-subtle, #f5f7fa);
2363
- --w-border: var(--color-border, #dce2eb);
2364
- --w-border-strong: var(--color-border-strong, #b9c3d2);
2365
- --w-accent: var(--color-accent, #2f6feb);
2366
- --w-accent-soft: var(--color-accent-soft, #eaf1ff);
2367
- --w-danger: var(--color-danger, #cf3d48);
2368
- --w-success: var(--color-success, #238353);
2369
- --w-warning: var(--color-warning, #b76e00);
2370
- --w-shadow-pop: var(--shadow-pop, 0 10px 32px #14284a20);
2371
- --w-font-size-mini: 12px; --w-font-size-small: 13px; --w-font-size-medium: 14px;
2372
- --w-control-mini: 24px; --w-control-small: 28px; --w-control-medium: 32px;
2373
- --w-radius-sm: 4px; --w-radius-md: 6px; --w-radius-lg: 8px;
2374
- --w-duration-fast: .12s;
2375
- }
2376
- /* ---------------------------------------------------------------- WButton */
2377
- .w-button {
2378
- display:inline-flex;align-items:center;justify-content:center;gap:4px;flex:none;box-sizing:border-box;margin:0;
2379
- border:1px solid transparent;border-radius:var(--w-radius-sm,4px);
2380
- font-family:var(--w-font-sans,inherit);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;
2381
- transition:background-color var(--w-duration-fast,.12s),border-color var(--w-duration-fast,.12s),color var(--w-duration-fast,.12s);
2382
- }
2383
- .w-button--mini { height:var(--w-control-mini,24px);padding:0 8px;font-size:var(--w-font-size-mini,12px); }
2384
- .w-button--small { height:var(--w-control-small,28px);padding:0 10px;font-size:var(--w-font-size-small,13px); }
2385
- .w-button--medium { height:var(--w-control-medium,32px);padding:0 12px;font-size:var(--w-font-size-medium,14px); }
2386
- .w-button--narrow { padding-inline:0; }.w-button--block { display:flex;width:100%; }
2387
- .w-button--default { background:var(--w-surface-subtle,var(--color-surface-subtle,#f5f7fa));border-color:var(--w-border-strong,var(--color-border-strong,#b9c3d2));color:var(--w-text,var(--color-text,#1f2937)); }
2388
- .w-button--default:not(:disabled):hover { background:color-mix(in srgb,var(--w-accent,#2f6feb) 7%,var(--w-surface-subtle,#f5f7fa));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb)); }
2389
- .w-button--text { background:transparent;border-color:transparent;color:var(--w-text,var(--color-text,#1f2937)); }
2390
- .w-button--text:not(:disabled):hover { background:color-mix(in srgb,currentColor 10%,transparent);color:var(--w-text,var(--color-text,#1f2937)); }
2391
- .w-button--primary { background:var(--w-accent,var(--color-accent,#2f6feb));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:#fff; }
2392
- .w-button--primary:not(:disabled):hover { background:color-mix(in srgb,var(--w-accent,#2f6feb) 88%,#000);border-color:color-mix(in srgb,var(--w-accent,#2f6feb) 88%,#000); }
2393
- .w-button--outline { background:transparent;border-color:var(--w-border,var(--color-border,#dce2eb));color:var(--w-text,var(--color-text,#1f2937)); }
2394
- .w-button--outline:not(:disabled):hover { border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb)); }
2395
- .w-button:disabled { opacity:.5;cursor:not-allowed; }.w-button.is-loading { cursor:progress;opacity:.75; }
2396
- .w-button[aria-pressed=true] { background:var(--w-accent-soft,var(--color-accent-soft,#eaf1ff));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb)); }
2397
- .w-button__icon,.w-button__spinner { display:inline-flex;align-items:center;justify-content:center;flex:none; }
2398
- .w-button__label { display:inline-flex;align-items:center;gap:4px; }.w-button__label > svg,.w-button__label > .wr-icon { flex:none; }
2399
- .w-button__spinner svg { animation:w-button-spin .8s linear infinite; }
2400
- @keyframes w-button-spin { to { transform:rotate(360deg); } }
2401
- .w-button:focus-visible { outline:2px solid var(--w-accent,var(--color-accent,#2f6feb));outline-offset:1px; }
2402
- /* ---------------------------------------------------------------- WAlert */
2403
- .w-alert { display:flex;align-items:flex-start;gap:10px;padding:7px 10px;border:1px solid var(--w-border,var(--color-border));border-radius:var(--w-radius-md,6px);background:var(--w-accent-soft,var(--color-accent-soft));color:var(--w-text,var(--color-text));font-size:12px;margin-bottom:10px;flex:none;line-height:1.5; }
2404
- .w-alert__icon { flex:none;line-height:1.5; }.w-alert__body { flex:1;min-width:0; }
2405
- .w-alert--warning { background:color-mix(in srgb,var(--w-warning,#b76e00) 12%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-warning,#b76e00) 35%,var(--w-border,#dce2eb)); }
2406
- .w-alert--danger { background:color-mix(in srgb,var(--w-danger,#cf3d48) 10%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-danger,#cf3d48) 32%,var(--w-border,#dce2eb)); }
2407
- .w-alert--success { background:color-mix(in srgb,var(--w-success,#238353) 10%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-success,#238353) 32%,var(--w-border,#dce2eb)); }
2408
- /* ---------------------------------------------------------------- WPopover */
2409
- .w-popover { position:fixed;z-index:1400;max-width:min(320px,calc(100vw - 24px));max-height:min(70vh,520px);overflow:auto;min-width:160px;padding:4px;display:flex;flex-direction:column;gap:4px;background:var(--w-surface,var(--color-surface,#fff));border:1px solid var(--w-border,var(--color-border));border-radius:var(--w-radius-lg,8px);box-shadow:var(--w-shadow-pop);color:var(--w-text,var(--color-text)); }
2410
- .w-popover .w-button { justify-content:flex-start;text-align:left;width:100%; }
2411
- /* 内容自带内边距的面板(高亮块图标/颜色)不再叠加外层 padding。 */
2412
- .w-popover--flush { padding:0; }
2413
- .w-popover .wr-settings .w-button { width:auto; }
2414
- .w-popover-group { padding:6px 8px 2px; font-size:11px; color:var(--color-text-faint); }
2415
- /* ---------------------------------------------------------------- WDialog */
2416
- .w-dialog-mask { position:fixed;inset:0;z-index:1100;display:flex;align-items:flex-start;justify-content:center;padding:10vh 16px 24px;background:color-mix(in srgb,#101828 42%,transparent);overflow-y:auto;overscroll-behavior:contain;box-sizing:border-box; }
2417
- .w-dialog-mask.is-fullscreen { padding:0;overflow:hidden; }
2418
- .w-dialog { position:relative;display:flex;flex-direction:column;width:520px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 14vh);border:1px solid var(--w-border,var(--color-border,#dce2eb));border-radius:var(--w-radius-lg,8px);background:var(--w-surface,var(--color-surface,#fff));color:var(--w-text,var(--color-text,#1f2937));box-shadow:0 24px 64px #10182833;outline:none;box-sizing:border-box; }
2419
- .w-dialog.is-fullscreen { width:100vw;max-width:none;height:100dvh;max-height:none;border:0;border-radius:0; }
2420
- .w-dialog__header { display:flex;align-items:center;gap:12px;flex:none;padding:14px 18px 10px; }
2421
- .w-dialog__title { flex:1;min-width:0;font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }
2422
- .w-dialog__close { flex:none;display:grid;place-items:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--w-radius-md,6px);background:transparent;color:var(--w-text-muted,var(--color-text-muted));cursor:pointer; }
2423
- .w-dialog__close:hover { background:var(--w-surface-subtle,#f5f7fa);color:var(--w-text,#1f2937); }
2424
- .w-dialog__body { flex:1;min-height:0;padding:4px 18px 18px;overflow:auto;display:flex;flex-direction:column;gap:12px; }
2425
- .w-dialog.is-fullscreen .w-dialog__body { padding:0;overflow:hidden; }
2426
- .w-dialog__footer { flex:none;display:flex;justify-content:flex-end;gap:8px;padding:0 18px 16px; }
2427
- .video-dialog {width:min(520px,calc(100vw - 32px));}
2428
- .w-dialog label,.wr-mind-panel label { display:flex;flex-direction:column;gap:6px;font-size:13px;margin-bottom:10px; }
2429
- .w-dialog input,.w-dialog textarea,.wr-mind-panel textarea { width:100%;box-sizing:border-box; }
2430
- .wr-toolbar { display:flex;align-items:center;gap:8px;flex-wrap:wrap; }
2431
- .wr-icon { display:block;flex:none; }
2432
- /**
2433
- * 编辑端外壳:**不加边框、不留左侧 padding**。
2434
- *
2435
- * 块快捷条、「+」和表格入口画在正文左缘之外,需要约 56px 留白;但这段留白
2436
- * 必须由宿主提供(页面栏宽、文档容器 padding 等)。SDK 自己加 padding 会把
2437
- * 正文整体右移,而宿主的页头/目录不会跟着动,整篇内容看起来就是歪的。
2438
- * 宿主没留够时,`blockAffordanceStyle` 会把控件夹进视口作为兜底。
2439
- */
2440
- .wr-document { position:relative;min-height:160px; }
2441
- .wr-document-mount { min-width:0; }
2442
- .wr-document .editor-canvas { outline:none;width:100%;max-width:var(--content-width);min-height:60vh;margin-inline:auto;padding-bottom:calc(var(--content-font-size,16px) * var(--content-line-height,1.75) + var(--space-block,12px)); }
2443
- .wr-document-toolbar { margin-bottom:10px; }
2444
- /* 块左侧入口:与 Vue 版共用一条 8px 间距的竖轨。 */
2445
- /* 块左侧入口:与 Vue 的 EditorPane / BlockHandleMenu 同一套类名与尺寸。 */
2446
- .block-plus { position:absolute; z-index:31; width:28px; height:28px; display:flex; align-items:center; justify-content:center; border:1px solid var(--color-border); border-radius:5px; background:var(--color-surface); color:var(--color-text-muted); cursor:pointer; padding:0; transition:background .12s,border-color .12s; }
2447
- .block-plus:hover { color:var(--color-accent); border-color:var(--color-accent); background:var(--color-accent-soft); }
2448
- .block-chip { position:absolute; z-index:31; display:flex; align-items:center; width:48px; height:28px; box-sizing:border-box; padding:1px; border:1px solid var(--color-border); border-radius:6px; background:var(--color-surface); transition:border-color .12s; }
2449
- .block-chip:hover { border-color:var(--color-accent); }
2450
- .chip-btn { width:22px; height:24px; display:flex; align-items:center; justify-content:center; border:none; background:transparent; color:var(--color-accent); cursor:pointer; padding:0; border-radius:3px; }
2451
- .chip-btn:hover { color:var(--color-accent); background:var(--color-accent-soft); }
2452
- .chip-grip { cursor:grab; color:var(--color-text-faint); }
2453
- .chip-grip:active { cursor:grabbing; }
2454
- /* 块菜单:主清单 + 右侧子菜单(结构、宽度、间距与 Vue 的 BlockHandleMenu 一致)。 */
2455
- .block-anchor { position:absolute; z-index:45; overflow-anchor:none; display:flex; align-items:flex-start; gap:4px; pointer-events:auto; }
2456
- .block-menu { width:208px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); padding:4px; }
2457
- .bm-item { display:flex; align-items:center; gap:8px; width:100%; padding:6px 8px; border:0; border-radius:6px; background:transparent; cursor:pointer; font-size:13px; font-family:inherit; color:var(--color-text); text-align:left; }
2458
- .bm-item:hover { background:var(--color-surface-subtle); }
2459
- .bm-item:focus-visible { outline:2px solid var(--color-accent); outline-offset:-2px; }
2460
- .bm-item.active { color:var(--color-accent); }
2461
- .bm-item.disabled { opacity:.45; pointer-events:none; }
2462
- .bm-item.danger { color:var(--color-danger); }
2463
- .bm-item span:first-of-type { flex:1; }
2464
- .bm-chevron { margin-left:auto; opacity:.5; }
2465
- .bm-sep { height:1px; background:var(--color-border); margin:4px 6px; }
2466
- .block-submenu { position:relative; width:208px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); padding:4px; max-height:calc(60vh - 10px); overflow:auto; }
2467
- .block-submenu-color { width:max-content; padding:12px; }
2468
- /* 文档颜色面板(块菜单与文字工具栏共用同一套版式)。 */
2469
- .document-color-panel { width:220px; display:flex; flex-direction:column; gap:12px; }
2470
- .color-section { display:flex; flex-direction:column; gap:6px; }
2471
- .color-label { color:var(--color-text-muted); font-size:12px; line-height:1.5; }
2472
- .color-grid { display:grid; grid-template-columns:repeat(8,24px); gap:4px; }
2473
- .color-choice { width:24px; min-width:24px; height:24px; padding:0; border:1px solid var(--color-border); border-radius:3px; background:var(--color-surface); cursor:pointer; display:flex; align-items:center; justify-content:center; }
2474
- .color-choice.selected { border-color:var(--color-accent); outline:1px solid var(--color-accent); outline-offset:-1px; }
2475
- .font-sample { font-size:16px; font-weight:500; line-height:1; }
2476
- .background-choice { position:relative; }
2477
- .clear-stroke { display:block; width:27px; height:1px; background:var(--color-border-strong); transform:rotate(-45deg); }
2478
- /* 图片工具条:与 Vue 的 EditorPane 同尺寸、同布局。 */
2479
- .img-toolbar { position:absolute; z-index:50; display:flex; align-items:center; gap:2px; padding:3px 4px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); transform:translateX(-50%); }
2480
- .it-btn { display:flex; align-items:center; justify-content:center; min-width:28px; height:28px; border:0; border-radius:5px; background:transparent; color:var(--color-text); cursor:pointer; padding:0 5px; }
2481
- .it-btn:hover { background:var(--color-surface-subtle); }
2482
- .it-btn.on { background:var(--color-accent-soft); color:var(--color-accent); }
2483
- .it-btn.danger { color:var(--color-danger); }
2484
- .it-btn.danger:hover { background:color-mix(in srgb,var(--color-danger) 12%,transparent); }
2485
- .it-sep { width:1px; height:18px; background:var(--color-border); margin:0 3px; }
2486
- /* 插入菜单:与 Vue 的 SlashMenu.vue / InsertPicker.vue 同一套类名与几何。 */
2487
- .slash-anchor { position:absolute; z-index:40; display:flex; align-items:flex-start; gap:6px; }
2488
- .slash-menu { width:268px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); padding:4px; }
2489
- .slash-content { padding:0 0 4px; max-height:min(560px,calc(100dvh - 26px)); overflow-y:auto; overscroll-behavior:contain; }
2490
- .slash-group { font-size:11px; color:var(--color-text-faint); padding:7px 8px 3px; }
2491
- .slash-menu ul { list-style:none; margin:0; padding:0; }
2492
- .slash-menu li { display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:6px; cursor:pointer; font-size:14px; color:var(--color-text); }
2493
- .slash-menu li.active { background:var(--color-accent-soft); }
2494
- .slash-label { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
2495
- .slash-hint { color:var(--color-text-faint); font-size:12px; flex:none; }
2496
- .slash-chevron { color:var(--color-text-faint); flex:none; }
2497
- .slash-empty { color:var(--color-text-faint); font-size:13px; text-align:center; padding:10px; }
2498
- .insert-picker { position:absolute; z-index:46; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); padding:10px; }
2499
- .ip-head { display:flex; align-items:baseline; justify-content:space-between; gap:12px; font-size:12px; color:var(--color-text-muted); margin-bottom:8px; }
2500
- .ip-dim { color:var(--color-text-faint); flex:none; }
2501
- .ip-grid { display:grid; grid-template-columns:repeat(8,18px); grid-auto-rows:18px; gap:3px; }
2502
- .ip-cell { width:18px; height:18px; padding:0; border:1px solid var(--color-border); border-radius:3px; background:var(--color-surface-subtle); cursor:pointer; }
2503
- .ip-cell.on { background:var(--color-accent-soft); border-color:var(--color-accent); }
2504
- .ip-counts { display:flex; gap:6px; }
2505
- .ip-count { display:flex; flex-direction:column; align-items:center; gap:4px; padding:4px 6px; border:1px solid transparent; border-radius:6px; background:transparent; cursor:pointer; }
2506
- .ip-count:hover { background:var(--color-surface-subtle); }
2507
- .ip-count.on { border-color:var(--color-accent); background:var(--color-accent-soft); }
2508
- .ip-count-box { display:flex; gap:2px; width:34px; height:22px; padding:3px; border:1px solid var(--color-border-strong); border-radius:3px; background:var(--color-surface-subtle); box-sizing:border-box; }
2509
- .ip-count-bar { flex:1 1 0; min-width:0; background:var(--color-border-strong); border-radius:1px; }
2510
- .ip-count.on .ip-count-bar { background:var(--color-accent); }
2511
- .ip-count-num { font-size:11px; color:var(--color-text-muted); }
2512
- .ip-close { position:absolute; right:4px; top:4px; padding:2px; border:0; background:transparent; color:var(--color-text-faint); cursor:pointer; }
2513
- /* 表格控件:与 Vue 的 TableHandles.vue 同一套类名、尺寸与轨迹。 */
2514
- .tbl-ui-host { position:absolute; left:0; top:0; width:0; height:0; pointer-events:none; z-index:30; }
2515
- .tbl-ui-host > * { pointer-events:auto; }
2516
- .tbl-corner { position:absolute; z-index:34; display:flex; width:44px; height:26px; padding:1px; box-sizing:border-box; border:1px solid var(--color-border); border-radius:6px; background:var(--color-surface); }
2517
- .tbl-corner button { width:20px; height:22px; padding:0; display:flex; align-items:center; justify-content:center; border:none; border-radius:3px; background:transparent; color:var(--color-accent); cursor:pointer; }
2518
- .tbl-corner .tbl-grip { color:var(--color-text-faint); cursor:grab; }
2519
- .tbl-corner .tbl-grip:active { cursor:grabbing; }
2520
- .tbl-corner button:hover { background:var(--color-accent-soft); }
2521
- .tbl-axis { position:absolute; z-index:35; padding:0; border:none; border-radius:5px; background:transparent; cursor:pointer; }
2522
- .tbl-axis::before { content:''; position:absolute; border-radius:3px; background:var(--color-border-strong); box-shadow:0 0 0 2px var(--color-surface); }
2523
- .tbl-row-axis { width:20px; height:24px; opacity:0; }
2524
- .tbl-row-axis::before { left:8px; top:4px; width:4px; height:16px; }
2525
- .tbl-col-axis { width:24px; height:20px; opacity:0; }
2526
- .tbl-col-axis::before { left:4px; top:8px; width:16px; height:4px; }
2527
- .tbl-axis.current,.tbl-axis:hover,.tbl-axis:focus-visible,.tbl-axis.on { opacity:1; }
2528
- .tbl-axis:hover::before,.tbl-axis.on::before { background:var(--color-accent); }
2529
- .tbl-boundary { position:absolute; z-index:36; display:flex; justify-content:center; align-items:center; width:20px; height:20px; border:none; border-radius:50%; padding:0; background:transparent; color:transparent; cursor:pointer; }
2530
- .tbl-boundary::before { content:''; position:absolute; width:4px; height:4px; border-radius:50%; background:var(--color-border-strong); }
2531
- .tbl-boundary:hover,.tbl-boundary:focus-visible { color:#fff; background:var(--color-accent); }
2532
- .tbl-boundary:hover::before,.tbl-boundary:focus-visible::before { display:none; }
2533
- .tbl-boundary::after { content:''; position:absolute; pointer-events:none; background:var(--color-accent); display:none; }
2534
- .tbl-boundary:hover::after,.tbl-boundary:focus-visible::after { display:block; }
2535
- .tbl-boundary-row::after { left:14px; top:9px; width:var(--insert-length); height:2px; }
2536
- .tbl-boundary-col::after { top:14px; left:9px; width:2px; height:var(--insert-length); }
2537
- .tbl-boundary > svg,.tbl-boundary > .wr-icon { position:relative; z-index:1; }
2538
- .tbl-selection-more { position:absolute; z-index:38; width:32px; height:20px; padding:0; line-height:12px; border:none; border-radius:6px; background:var(--color-accent); color:#fff; cursor:pointer; font-size:20px; }
2539
- .tbl-ui-host > .tbl-selection { position:absolute; z-index:32; border:2px solid var(--color-accent); border-radius:5px; box-sizing:border-box; pointer-events:none; box-shadow:0 0 0 1px var(--color-surface); }
2540
- .tbl-cellbar { position:fixed; z-index:55; box-sizing:border-box; width:max-content; max-width:calc(100vw - 24px); background:var(--color-surface); border:1px solid var(--color-border); border-radius:10px; box-shadow:var(--shadow-pop); padding:6px; }
2541
- .tbl-tools { display:flex; gap:2px; align-items:center; flex-wrap:wrap; }
2542
- .tool { flex:0 0 auto; display:flex; align-items:center; justify-content:center; gap:2px; min-width:32px; height:32px; padding:0 5px; border:none; border-radius:5px; background:transparent; color:var(--color-text); font-size:15px; cursor:pointer; }
2543
- .tool:hover { background:var(--color-surface-subtle); }
2544
- .tool.on { background:var(--color-accent-soft); color:var(--color-accent); }
2545
- .tool[aria-disabled='true'] { opacity:.3; cursor:not-allowed; }
2546
- .color-tool { position:relative; padding-bottom:2px; }
2547
- .color-bar { position:absolute; left:8px; right:8px; bottom:3px; height:2px; border-radius:1px; box-shadow:0 0 0 1px var(--color-surface); }
2548
- .tool-sep { flex:0 0 1px; height:20px; background:var(--color-border); margin:0 4px; }
2549
- .tbl-palette { z-index:60; display:flex; flex-direction:column; gap:8px; width:max-content; max-width:calc(100vw - 48px); padding:10px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); }
2550
- .palette-head { display:flex; flex-direction:column; gap:2px; padding:0 2px; }
2551
- .palette-title { font-size:13px; font-weight:600; color:var(--color-text); }
2552
- .palette-hint { font-size:11px; line-height:1.5; color:var(--color-text-muted); max-width:282px; }
2553
- .palette-grid { display:grid; grid-template-columns:repeat(8,30px); gap:6px; }
2554
- .tbl-align-menu { z-index:60; width:176px; padding:6px; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); }
2555
- .tbl-align-menu button { display:flex; align-items:center; gap:10px; width:100%; min-height:36px; padding:6px 10px; border:none; border-radius:5px; background:transparent; color:var(--color-text); cursor:pointer; }
2556
- .tbl-align-menu button span { flex:1; text-align:left; }
2557
- .tbl-align-menu button:hover,.tbl-align-menu button:focus-visible { background:var(--color-surface-subtle); }
2558
- .tbl-align-menu button[aria-checked='true'] { color:var(--color-accent); }
2559
- .swatch { display:flex; align-items:center; justify-content:center; width:30px; height:30px; padding:4px; border:1px solid var(--color-border); border-radius:5px; background:var(--color-surface); cursor:pointer; color:var(--color-text-muted); }
2560
- .swatch span { width:100%; height:100%; border-radius:2px; }
2561
- .swatch .glyph { display:flex; align-items:center; justify-content:center; width:100%; height:100%; font-size:15px; font-weight:500; line-height:1; border-radius:0; }
2562
- .swatch:hover { border-color:var(--color-accent); }
2563
- .swatch.selected { border-color:var(--color-accent); box-shadow:0 0 0 1px var(--color-accent); }
2564
- .tbl-ctx { z-index:80; padding:0; box-sizing:border-box; background:var(--color-surface); border:1px solid var(--color-border); border-radius:8px; box-shadow:var(--shadow-pop); }
2565
- /* 菜单项:与 Vue 的 TableContextMenu.vue 同尺寸与间距。 */
2566
- .ctx-item { display:flex; align-items:center; gap:8px; width:100%; border:none; background:transparent; min-height:32px; padding:7px 10px; border-radius:6px; color:var(--color-text); cursor:pointer; text-align:left; font:inherit; font-size:13px; }
2567
- .ctx-item:hover { background:var(--color-surface-subtle); }
2568
- .ctx-item:focus-visible { outline:2px solid var(--color-accent); outline-offset:-2px; }
2569
- .ctx-item:disabled { opacity:.5; cursor:wait; }
2570
- .ctx-chevron { margin-left:auto; }
2571
- .ctx-styles { margin:2px 4px; padding-left:12px; border-left:1px solid var(--color-border); }
2572
- .ctx-style-swatch { width:18px; height:14px; border:1px solid var(--color-border); border-radius:3px; }
2573
- .ctx-item.danger { color:var(--color-danger); }
2574
- .ctx-sep { height:1px; background:var(--color-border); margin:4px 6px; }
2575
- .ctx-label { font-size:11px; color:var(--color-text-faint); padding:4px 8px 2px; }
2576
- .ctx-align { display:flex; gap:4px; padding:2px 6px 6px; }
2577
- .al-btn { border:1px solid var(--color-border); background:var(--color-surface); border-radius:5px; padding:3px 6px; cursor:pointer; color:var(--color-text-muted); }
2578
- .al-btn.on { border-color:var(--color-accent); color:var(--color-accent); background:var(--color-accent-soft); }
2579
- .ctx-width { display:flex; align-items:center; gap:6px; padding:4px 8px; }
2580
- .ctx-label-inline { color:var(--color-text-muted); }
2581
- .ctx-num { width:66px; padding:3px 6px; font-size:13px; border:1px solid var(--color-border); border-radius:5px; background:var(--color-surface); color:var(--color-text); }
2582
- .ctx-mini { border:1px solid var(--color-border); background:var(--color-surface); border-radius:5px; padding:3px 8px; font-size:12px; cursor:pointer; }
2583
- .ctx-mini.primary { background:var(--color-accent); border-color:var(--color-accent); color:#fff; }
2584
- .faint { color:var(--color-text-faint); }.small { font-size:11px; }
2585
- /* 图片预览。 */
2586
- .wr-link-popover { position:fixed;z-index:1450;padding:8px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-surface);box-shadow:var(--shadow-pop);max-width:calc(100vw - 16px);font-size:13px; }.wr-link-popover input { min-width:250px; }.wr-link-popover a { max-width:350px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }
2587
- /* 高亮块控件:图标常显,工具条在悬停 / 聚焦时出现。 */
2588
- .callout-controls { display:contents; }
2589
- .callout-icon-button { justify-self:start;background:transparent;border-color:transparent;margin:0;cursor:default; }
2590
- .callout-icon-button:not(:disabled) { cursor:pointer; }
2591
- .callout-toolbar { position:absolute;bottom:calc(100% + 4px);right:0;z-index:25;display:flex;align-items:center;gap:4px;padding:4px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);opacity:0;visibility:hidden;transition:opacity .1s; }
2592
- .doc-callout:hover > .callout-controls-host .callout-toolbar,.doc-callout:focus-within > .callout-controls-host .callout-toolbar,.callout-toolbar.is-open { opacity:1;visibility:visible; }
2593
- .callout-toolbar-button,.callout-preset { min-height:32px;padding:0 8px;border:0;border-radius:5px;background:transparent;color:var(--color-text);font:inherit;font-size:13px;cursor:pointer; }
2594
- .callout-toolbar-button:hover,.callout-preset:hover { background:var(--color-surface-subtle); }
2595
- .callout-toolbar-divider { height:16px;border-left:1px solid var(--color-border);margin:0 3px; }
2596
- .callout-color-panel { width:max-content;display:flex;flex-direction:column;gap:12px;padding:2px; }
2597
- .callout-color-label { font-size:12px;margin-bottom:6px;color:var(--color-text-muted); }
2598
- .callout-color-grid { display:grid;grid-template-columns:repeat(8,26px);gap:5px; }
2599
- .callout-color-choice { position:relative;width:26px;height:26px;padding:0;border:1px solid var(--color-border);border-radius:4px;background:var(--color-surface);cursor:pointer;overflow:hidden;font-size:12px;color:var(--color-text-muted); }
2600
- .callout-color-choice.is-selected { outline:2px solid var(--color-accent);outline-offset:1px; }
2601
- .callout-color-choice.is-none::after { content:'';position:absolute;left:-5px;top:12px;width:36px;height:1px;background:var(--color-border-strong);transform:rotate(-45deg); }
2602
- .callout-font-sample { font-size:16px;line-height:1;color:inherit; }
2603
- .callout-icon-picker { width:254px;box-sizing:border-box;padding:8px 10px 6px; }
2604
- .callout-icon-grid { display:grid;grid-template-columns:repeat(6,34px);gap:6px; }
2605
- .callout-icon-choice { width:34px;height:34px;padding:0;border:0;border-radius:5px;background:transparent;font-size:20px;cursor:pointer; }
2606
- .callout-icon-choice:hover,.callout-icon-choice[aria-pressed='true'] { background:var(--color-accent-soft); }
2607
- .callout-icon-footer { display:flex;gap:8px;margin-top:10px;padding-top:8px;border-top:1px solid var(--color-border); }
2608
- .callout-icon-footer .w-button { flex:1;justify-content:center; }
2609
- .wr-block-drop-line { position:fixed;z-index:1300;height:3px;pointer-events:none;background:var(--color-accent);border:1px solid #fff;border-radius:999px;box-shadow:0 1px 6px #0003;transform:translateY(-1px); }
2610
- .wr-block-handle { position:absolute;left:0;z-index:25; }
2611
- .wr-block-menu,.wr-insert-menu { position:sticky;bottom:10px;z-index:40;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;padding:10px;box-shadow:var(--shadow-pop);max-height:360px;overflow:auto; }
2612
- .wr-insert-menu { display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:5px; }
2613
- .wr-insert-menu header { display:flex;justify-content:space-between;grid-column:1/-1; }
2614
- .wr-image { max-width:100%;height:auto;cursor:zoom-in; }.wr-image-preview { max-width:100%;max-height:70vh;object-fit:contain; }
2615
- .wr-media-placeholder { display:inline-flex;min-height:100px;align-items:center;justify-content:center;background:var(--color-surface-subtle); }
2616
- .wr-code>header { display:flex;justify-content:space-between;background:var(--color-surface-subtle);padding:6px 10px;font-size:12px; }
2617
- .wr-video iframe { width:100%;height:350px;border:0; }.doc-file-card video { max-width:100%; }
2618
- .wr-spreadsheet { height:100%;min-height:360px;position:relative;display:flex;flex-direction:column; }.wr-sheet-engine { flex:1;min-height:300px; }
2619
- /* 工作表只读预览:与 Vue 的 WorksheetPreview.vue 同一套类名与排版。 */
2620
- .worksheet-preview { border:1px solid var(--color-border); border-radius:8px; overflow:hidden; background:var(--color-surface); }
2621
- .worksheet-preview-standalone { display:flex;flex-direction:column;flex:1;min-height:0;border:0;border-radius:0; }
2622
- .worksheet-preview-standalone .sheet-table { flex:1;min-height:0;max-height:none; }
2623
- .sheet-tabs { display:flex; gap:8px; align-items:center; flex-wrap:wrap; padding:8px; font-size:12px; }
2624
- .sheet-note { color:var(--color-text-muted); }
2625
- .sheet-table { overflow:auto; max-height:600px; outline:none; }
2626
- .sheet-table table { border-collapse:collapse; table-layout:fixed; width:max-content; font-size:13px; }
2627
- .sheet-table th,.sheet-table td { border:1px solid var(--color-border); padding:3px 6px; overflow:hidden; white-space:pre-wrap; overflow-wrap:anywhere; vertical-align:top; }
2628
- .sheet-table th { background:var(--color-surface-subtle); font-weight:500; color:var(--color-text-muted); }
2629
- .sheet-table thead { position:sticky; top:0; z-index:1; }
2630
- .sheet-table tr > th:first-child { min-width:40px; text-align:center; }
2631
- .sheet-paging { display:flex; gap:8px; align-items:center; flex-wrap:wrap; padding:8px; font-size:12px; color:var(--color-text-faint); }
2632
- .sheet-paging > span { flex:1; }
2633
- .sheet-view-note { flex:none; margin:0; padding:6px 8px; font-size:12px; color:var(--color-text-muted); background:var(--color-surface-subtle); }
2634
- /* The Canvas and topic visuals come from the canonical Vue style files. */
2635
- .wr-mind-editor {height:100%;min-height:380px;min-width:0;}
2636
- .mind-canvas-layers {position:absolute;left:0;top:0;transform-origin:0 0;}
2637
- .mind-canvas-edges {position:absolute;left:0;top:0;width:1px;height:1px;overflow:visible;pointer-events:none;}
2638
- .mind-canvas-stage {touch-action:none;}
2639
- .mind-canvas-surface {position:absolute;inset:0;}
2640
- .mind-node-actions,.mind-selection-summary,.mind-canvas-bottom {z-index:5;}
2641
- .mind-canvas-notice {z-index:6;}
2642
- .mind-context-menu {position:fixed;z-index:1400;padding:0;min-width:160px;max-height:calc(100vh - 16px);overflow:auto;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);}
2643
- .mind-side-projection {pointer-events:none;}
2644
- .mind-canvas-fullscreen .wd-dialog__body {overflow:hidden;}
2645
- .w-popover .mind-settings-menu .w-button {width:auto;}
2646
- .mind-space-pan,.mind-space-pan .mind-topic {cursor:grab;}
2647
- .mind-peer-badge {position:absolute;right:4px;top:4px;padding:1px 5px;border-radius:9px;background:var(--color-accent);color:white;font-size:10px;line-height:14px;pointer-events:none;}
2648
- .wr-settings { display:flex;flex-direction:column;gap:8px; }
2649
- @media(max-width:760px) { .wr-mind-hint { display:none; }.wr-mind-panel { flex-basis:210px; } }
2650
-
2651
- /* Vue WPopover shell around the shared Select / Dropdown content. */
2652
- .w-popover.w-select-popup,.w-popover.code-settings-popup,.w-popover.code-tooltip-popup,.w-popover.mind-dropdown-popup {
2653
- box-sizing:border-box;min-width:0;max-width:calc(100vw - 16px);max-height:calc(100dvh - 16px);
2654
- padding:0;display:block;overflow:visible;gap:0;overflow-anchor:none;
2655
- }
1
+ .wendang{--content-font-size: 16px;--content-line-height: 1.75;--content-text-color: var(--color-text);--content-heading-color: #101828;--content-table-header-bg: #edf3fc;--content-table-grid-color: #d5dfed;--content-table-font-size: calc(var(--content-font-size) * 13 / 14);--content-table-line-height: 1.5;--content-table-radius: 6px;--content-table-padding-x: 8px;--content-table-padding-y: 6px;--content-media-radius: 8px;--content-gallery-gap: 12px;--content-callout-radius: 9px;--content-callout-padding-x: 18px;--content-callout-padding-y: 16px;--content-callout-icon-width: 30px;--content-callout-icon-size: 22px;--content-callout-gap: 12px;--space-block: calc(var(--content-font-size) * 5 / 7);--space-module: calc(var(--content-font-size) * 9 / 7);--space-heading-top: calc(var(--content-font-size) * 2);--space-heading-bottom: calc(var(--content-font-size) * 5 / 7);--space-list-item: calc(var(--content-font-size) * .25);--space-list-block: calc(var(--content-font-size) * .5);--space-divider: calc(var(--content-font-size) * 2)}:where(.wendang-root,.wendang,.wendang-portal) .color-transparency-grid{display:block;flex:none;width:18px;height:18px;min-height:18px;border-radius:2px;background:repeating-conic-gradient(var(--color-border-strong, #b9c3d2) 0% 25%,var(--color-surface, #fff) 0% 50%) 0 0 / 8px 8px}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-choice .color-transparency-grid{position:absolute;inset:3px;width:auto;height:auto}.wendang{--color-bg: #f6f8fc;--color-surface: #fff;--color-surface-subtle: #f5f7fa;--color-text: #1f2937;--color-text-muted: #667085;--color-text-faint: #7c8798;--color-border: #dce2eb;--color-border-strong: #b9c3d2;--color-accent: var(--wendang-accent, #2f6feb);--color-accent-soft: #eaf1ff;--color-danger: #cf3d48;--color-success: #21814b;--color-warning: #ad6b12;--comment-mark-bg: #ffe58f;--comment-mark-line: #d48806;--comment-mark-bg-reply: #ffd66688;--comment-mark-line-reply: #ff9900;--comment-mark-bg-active: #ffc53d;--comment-mark-line-active: #ad6800;--content-width: 100%;--shadow-pop: 0 10px 32px #14284a20;--content-scroll-offset: 80px;--color-code-bg: #f1f5fa;color:var(--color-text);background:var(--color-surface);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif;min-width:0;min-height:0}.wendang[data-wendang-theme=dark]{--color-bg: #17191e;--color-surface: #202329;--color-surface-subtle: #292d35;--color-text: #e5e9f0;--color-text-muted: #b2bdcd;--color-text-faint: #8f9cb0;--color-border: #3b4350;--color-border-strong: #606c7e;--color-accent-soft: #243653;--content-text-color: #e8e8ec;--content-heading-color: #f0f0f3;--content-table-header-bg: #2a2e38;--content-table-grid-color: #424753;--color-code-bg: #20242c;--comment-mark-bg: #4a3a12;--comment-mark-line: #e8b923;--comment-mark-bg-reply: #5c4813;--comment-mark-line-reply: #ffc53d;--comment-mark-bg-active: #6b5416;--comment-mark-line-active: #ffc53d}.wendang-root{min-height:0;min-width:0;height:100%}.wendang-portal{position:relative;z-index:1000}:is(.wendang,.wendang-popup-scope) :where(button,input,textarea):not(:where(.mind-topic-input)){font:inherit;box-sizing:border-box}:is(.wendang,.wendang-popup-scope) :where(a){color:var(--color-accent)}:is(.wendang,.wendang-popup-scope) :where(button){cursor:pointer}:is(.wendang,.wendang-popup-scope) .muted{color:var(--color-text-muted)}:is(.wendang,.wendang-popup-scope) .small{font-size:12px}:is(.wendang,.wendang-popup-scope) :where(input:not([type=checkbox]):not([type=radio]),textarea):not(.worksheet-grid *):not(:where(.mind-topic-input)){background:var(--color-surface);color:var(--color-text);border:1px solid var(--color-border);border-radius:6px;padding:6px 8px}:is(.wendang,.wendang-popup-scope) :where(.error-banner,.error){color:var(--color-danger)}:is(.wendang,.wendang-popup-scope) :where(.notice){color:var(--color-text-muted)}.wendang{--doc-text-gray: #646a73;--doc-text-red: #d92c2c;--doc-text-orange: #b95d0b;--doc-text-yellow: #8a6c0a;--doc-text-green: #237b35;--doc-text-blue: #1971c2;--doc-text-purple: #7048e8;--doc-highlight-gray-soft: #f1f3f5;--doc-highlight-red: #ffe3e3;--doc-highlight-orange: #fff0db;--doc-highlight-yellow: #fff3bf;--doc-highlight-green: #d3f9d8;--doc-highlight-blue: #d0ebff;--doc-highlight-purple: #e5dbff;--doc-highlight-gray: #dee2e6;--doc-highlight-gray-strong: #ced4da;--doc-highlight-red-strong: #ffc9c9;--doc-highlight-orange-strong: #ffd8a8;--doc-highlight-yellow-strong: #ffec99;--doc-highlight-green-strong: #b2f2bb;--doc-highlight-blue-strong: #a5d8ff;--doc-highlight-purple-strong: #d0bfff}.wendang[data-wendang-theme=dark]{--doc-text-gray: #b8beca;--doc-text-red: #ff9b9b;--doc-text-orange: #ffc078;--doc-text-yellow: #f6d37a;--doc-text-green: #8ce99a;--doc-text-blue: #91caff;--doc-text-purple: #d0bfff;--doc-highlight-gray-soft: #32353d;--doc-highlight-red: #563138;--doc-highlight-orange: #523a2a;--doc-highlight-yellow: #4a4226;--doc-highlight-green: #294737;--doc-highlight-blue: #293f5b;--doc-highlight-purple: #42335b;--doc-highlight-gray: #424650;--doc-highlight-gray-strong: #555b66;--doc-highlight-red-strong: #713f47;--doc-highlight-orange-strong: #6a4b31;--doc-highlight-yellow-strong: #635732;--doc-highlight-green-strong: #355c44;--doc-highlight-blue-strong: #355476;--doc-highlight-purple-strong: #554273}.ywiki-content .ywiki-code-panel{--code-bg:#ffffff;--code-header:#f7f8fa;--code-border:#e2e5e9;--code-text:#303640;--code-muted:#8a9099;--code-keyword:#d13b52;--code-string:#2e8764;--code-number:#a66e12;--code-title:#8250b5;--code-property:#476f9c;--code-comment:#8a9099;--code-tag:#bf3c51;position:relative;min-width:0;max-width:100%;border:1px solid var(--code-border);border-radius:7px;background:var(--code-bg);color:var(--code-text);isolation:isolate}.ywiki-content .ywiki-code-panel.code-theme-soft{--code-bg:#f5f8fc;--code-header:#edf2f8;--code-border:#dce4ef;--code-text:#34445b;--code-muted:#8492a7;--code-keyword:#3478bd;--code-string:#318b6d;--code-number:#9b7a1e;--code-title:#9851c4;--code-property:#516c9f;--code-comment:#8492a7;--code-tag:#b14c6c}[data-wendang-theme=dark] .ywiki-content .ywiki-code-panel.code-theme-auto,.ywiki-content .ywiki-code-panel.code-theme-night{--code-bg:#20242c;--code-header:#272c35;--code-border:#373e49;--code-text:#d7dde7;--code-muted:#929cac;--code-keyword:#f58196;--code-string:#a5cf8b;--code-number:#efbc82;--code-title:#c6a0ee;--code-property:#89b9ee;--code-comment:#919cab;--code-tag:#f08a9d}.code-toolbar{display:flex;align-items:center;gap:7px;min-height:38px;padding:4px 9px;background:var(--code-header);border-bottom:1px solid var(--code-border);border-radius:6px 6px 0 0;font:12px/1.5 var(--font-sans,system-ui,sans-serif);color:var(--code-muted);user-select:none}.code-toolbar-host{position:relative;z-index:2}.code-toolbar-actions{display:flex;align-items:center;gap:7px;margin-left:auto;min-width:0}.code-toolbar-summary{font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}.code-language-select{width:146px;font-size:12px;--w-surface:var(--code-header);--w-text:var(--code-text);--w-text-faint:var(--code-muted);--w-border-strong:var(--code-border);--w-border:var(--code-border);--w-surface-subtle:color-mix(in srgb,var(--code-text) 10%,transparent)}.code-language-label{max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.code-toolbar-divider{height:15px;border-left:1px solid var(--code-border);margin:0 2px}.code-toolbar .code-copy-button,.code-toolbar .code-settings-button,.code-toolbar .code-fold-button{color:var(--code-muted);background:transparent}.code-toolbar .code-copy-button{min-width:86px}.code-toolbar .code-copy-button:hover,.code-toolbar .code-settings-button:hover,.code-toolbar .code-fold-button:hover{color:var(--code-text);background:color-mix(in srgb,var(--code-text) 6%,transparent)}.code-copy-button svg{vertical-align:middle}.code-copy-announcement{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.code-option-check{float:right;margin-left:24px}.code-theme-swatch{display:inline-block;width:13px;height:13px;vertical-align:-2px;margin-right:8px;border:1px solid #c7ccd4;border-radius:3px;background:#fff}.code-theme-swatch[data-code-swatch=auto]{background:linear-gradient(90deg,#fff 50%,#303743 50%)}.code-theme-swatch[data-code-swatch=soft]{background:#e6effa}.code-theme-swatch[data-code-swatch=night]{background:#272c35}.ywiki-content .ywiki-code-panel .code-scroll{display:flex;align-items:stretch;position:relative;overflow:auto;max-height:464px;border-radius:0 0 6px 6px;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--code-muted) 45%,transparent) transparent;background:var(--code-bg)}.ywiki-content .ywiki-code-panel .code-scroll[hidden]{display:none}.ywiki-content .ywiki-code-panel.is-unlimited .code-scroll{max-height:none}.ywiki-content .ywiki-code-panel .code-line-numbers,.ywiki-content .ywiki-code-panel pre.doc-code{font:13px/22px ui-monospace,SFMono-Regular,Menlo,Consolas,Liberation Mono,monospace;font-variant-ligatures:none;tab-size:2;white-space:pre}.ywiki-content .ywiki-code-panel .code-line-numbers{position:sticky;left:0;z-index:1;align-self:stretch;flex:0 0 auto;min-width:42px;box-sizing:border-box;padding:12px 10px 12px 12px;text-align:right;color:var(--code-muted);background:var(--code-bg);border-right:1px solid color-mix(in srgb,var(--code-border) 65%,transparent);user-select:none;pointer-events:none}.ywiki-content .ywiki-code-panel pre.doc-code{flex:1 0 auto;min-width:0;max-width:none;margin:0!important;padding:12px 16px;border:0;border-radius:0;background:var(--code-bg);color:var(--code-text);overflow:visible}.ywiki-content .ywiki-code-panel pre.doc-code code{display:block;margin:0;padding:0;border:0;background:none;color:var(--code-text);font:inherit;white-space:inherit;tab-size:inherit;border-radius:0}.ywiki-content .ywiki-code-panel.is-collapsed .code-toolbar{border-bottom:0;border-radius:6px}.ywiki-content .ywiki-code-panel:focus-within{border-color:color-mix(in srgb,var(--color-accent) 45%,var(--code-border))}.ywiki-content .ywiki-code-panel .code-scroll:focus-visible{outline:2px solid var(--color-accent);outline-offset:-2px}.ywiki-content .ywiki-code-panel :where(.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-meta){color:var(--code-keyword)}.ywiki-content .ywiki-code-panel :where(.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute){color:var(--code-string)}.ywiki-content .ywiki-code-panel :where(.hljs-number,.hljs-symbol,.hljs-bullet,.hljs-variable,.hljs-template-variable){color:var(--code-number)}.ywiki-content .ywiki-code-panel :where(.hljs-title,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-type){color:var(--code-title)}.ywiki-content .ywiki-code-panel :where(.hljs-built_in,.hljs-attr,.hljs-property){color:var(--code-property)}.ywiki-content .ywiki-code-panel :where(.hljs-comment,.hljs-quote){color:var(--code-comment);font-style:normal}.ywiki-content .ywiki-code-panel :where(.hljs-tag,.hljs-name,.hljs-deletion){color:var(--code-tag)}@media(max-width:600px){.code-toolbar{gap:4px;padding-inline:6px}.code-toolbar-actions{gap:4px}.code-language-select{width:108px}.code-toolbar-summary{display:none}.code-toolbar-divider{margin:0}.code-language-label{max-width:100px}.code-copy-button{min-width:72px!important}}@media print{.ywiki-content .ywiki-code-panel .code-scroll{max-height:none!important;overflow:visible!important;display:flex!important}.code-toolbar-actions,.code-fold-button{display:none!important}.ywiki-content .ywiki-code-panel{break-inside:avoid}.ywiki-content .ywiki-code-panel pre.doc-code{white-space:pre-wrap;overflow-wrap:anywhere;flex-shrink:1}}[data-wendang-theme]{--callout-border-gray:#c7cbd1;--callout-border-red:#f0a2a2;--callout-border-orange:#ffc078;--callout-border-yellow:#e3ca71;--callout-border-green:#91d4a0;--callout-border-blue:#9ac5ef;--callout-border-purple:#c0a4ed}[data-wendang-theme=dark]{--callout-border-gray:#697181;--callout-border-red:#a7606b;--callout-border-orange:#a97843;--callout-border-yellow:#97844a;--callout-border-green:#5c8b6c;--callout-border-blue:#587fa9;--callout-border-purple:#8667af}.ywiki-content .doc-callout{--callout-first-line-height:calc(var(--content-font-size) * var(--content-line-height));position:relative;display:grid;grid-template-columns:var(--content-callout-icon-width) minmax(0,1fr);column-gap:var(--content-callout-gap);align-items:start;border:1px solid var(--callout-border,var(--callout-border-blue));border-radius:var(--content-callout-radius);background:var(--callout-fill,var(--doc-highlight-blue));color:var(--callout-text,var(--content-text-color));padding:var(--content-callout-padding-y) var(--content-callout-padding-x)}.ywiki-content .doc-callout[data-icon-hidden=true]{grid-template-columns:minmax(0,1fr)}.callout-controls-host{display:contents}.ywiki-content .doc-callout-content{grid-column:2;grid-row:1;min-width:0;color:inherit}.ywiki-content .doc-callout[data-icon-hidden=true]>.doc-callout-content{grid-column:1}.ywiki-content .doc-callout .callout-icon{grid-column:1;grid-row:1;align-self:start;display:inline-flex;align-items:center;justify-content:center;width:var(--content-callout-icon-width);min-width:var(--content-callout-icon-width);height:var(--callout-first-line-height);min-height:0;padding:0;font-size:var(--content-callout-icon-size);line-height:1;user-select:none;color:inherit}.ywiki-content .doc-callout .callout-icon-button:hover{background:transparent}.callout-toolbar .callout-toolbar-button.callout-palette-button{padding:0}.ywiki-content .doc-callout:has(>.doc-callout-content>h1:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.625 * 1.3)}.ywiki-content .doc-callout:has(>.doc-callout-content>h2:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.375 * 1.3)}.ywiki-content .doc-callout:has(>.doc-callout-content>h3:first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.125 * 1.3)}.ywiki-content .doc-callout:has(>.doc-callout-content>:is(h4,h5,h6):first-child){--callout-first-line-height:calc(var(--content-font-size) * 1.3)}.ywiki-content .doc-callout>.doc-callout-content>:first-child{margin-top:0}.ywiki-content .doc-callout>.doc-callout-content>:last-child{margin-bottom:0}.ywiki-content .doc-callout-content :where(h1,h2,h3,h4,h5,h6){color:inherit}@media(max-width:600px){.ywiki-content .doc-callout{padding:12px;column-gap:9px}}.ywiki-content{min-width:0;container-type:inline-size;container-name:wiki-content;font-size:var(--content-font-size);line-height:var(--content-line-height);color:var(--content-text-color);text-spacing-trim:space-all;overflow-wrap:anywhere;word-break:normal}.ywiki-content :where(p,h1,h2,h3,h4,h5,h6,ul,ol,blockquote,pre,table,hr,img){margin-block:0}.ywiki-content p:empty{min-height:calc(1em * var(--content-line-height))}.ywiki-content :where(h1,h2,h3,h4,h5,h6):empty{min-height:1.3em}.ywiki-content h1,.ywiki-content h2,.ywiki-content h3,.ywiki-content h4,.ywiki-content h5,.ywiki-content h6{font-weight:600;color:var(--content-heading-color);line-height:1.3;letter-spacing:-.01em;scroll-margin-top:var(--content-scroll-offset)}.ywiki-content h1{font-size:calc(var(--content-font-size) * 1.625)}.ywiki-content h2{font-size:calc(var(--content-font-size) * 1.375)}.ywiki-content h3{font-size:calc(var(--content-font-size) * 1.125)}.ywiki-content h4,.ywiki-content h5{font-size:var(--content-font-size)}.ywiki-content h6{font-size:var(--content-font-size);color:var(--color-text-muted);letter-spacing:0}.ywiki-content ul,.ywiki-content ol{padding-left:1.5em}.ywiki-content ul{list-style:disc}.ywiki-content ol{list-style:decimal}.ywiki-content ul ul{list-style:circle}.ywiki-content ul ul ul{list-style:square}.ywiki-content li+li{margin-top:var(--space-list-item)}.ywiki-content li::marker{color:var(--color-text-muted)}.ywiki-content ul.doc-task-list,.ywiki-content ul[data-type=taskList]{list-style:none;padding-left:0}.ywiki-content li.doc-task-item,.ywiki-content ul[data-type=taskList]>li{display:flex;gap:.5em;align-items:flex-start;line-height:var(--content-line-height)}.ywiki-content li.doc-task-item>input[type=checkbox],.ywiki-content ul[data-type=taskList]>li>label>input[type=checkbox]{flex:none;font:inherit;width:1em;height:1em;margin:0;accent-color:var(--color-accent)}.ywiki-content li.doc-task-item>input[type=checkbox]{margin-top:calc((var(--content-line-height) - 1) * .5em)}.ywiki-content li.doc-task-item>span,.ywiki-content ul[data-type=taskList]>li>div{min-width:0;flex:1}.ywiki-content blockquote{border-left:3px solid var(--color-border-strong);padding:.1em 0 .1em 1em;color:var(--color-text-muted)}.ywiki-content pre{overflow:auto;padding:12px 16px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-code-bg);font:13px/22px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.ywiki-content code{background:var(--color-surface-subtle);border:1px solid var(--color-border);border-radius:4px;padding:.1em .35em;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.875em}.math-node{cursor:pointer}.math-node .math-render{border-radius:4px}.math-node:hover .math-render{background:color-mix(in srgb,var(--color-accent) 10%,transparent)}.math-node.is-editing .math-render{display:none}.math-latex-input{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.875em;padding:2px 6px;border:1px solid var(--color-accent);border-radius:4px;background:var(--color-surface);color:var(--color-text)}.ywiki-content table,.ywiki-content .doc-table{--table-grid-color: var(--content-table-grid-color);--table-header-bg: var(--content-table-header-bg);border-collapse:separate;border-spacing:0;table-layout:auto;width:100%;font-size:var(--content-table-font-size);background:var(--color-surface);border:1px solid var(--table-grid-color);border-radius:var(--content-table-radius);overflow:hidden}.ywiki-content :where(.doc-table-wrap,.tableWrapper){overflow-x:auto;scrollbar-width:thin;scrollbar-color:var(--color-border-strong) transparent}.ywiki-content th,.ywiki-content td{border:none;border-right:1px solid var(--table-grid-color);border-bottom:1px solid var(--table-grid-color);padding:var(--content-table-padding-y) var(--content-table-padding-x);line-height:var(--content-table-line-height);min-width:60px;text-align:left;vertical-align:top;overflow-wrap:anywhere}.ywiki-content th{background:var(--table-header-bg);color:var(--content-heading-color);font-weight:600}.ywiki-content tr:last-child>:where(td,th){border-bottom:none}.ywiki-content tr>:where(td,th):last-child{border-right:none}.ywiki-content tr:first-child>:where(td,th):first-child{border-top-left-radius:5px}.ywiki-content tr:first-child>:where(td,th):last-child{border-top-right-radius:5px}.ywiki-content tr:last-child>:where(td,th):first-child{border-bottom-left-radius:5px}.ywiki-content tr:last-child>:where(td,th):last-child{border-bottom-right-radius:5px}.ywiki-content hr{border:none;border-top:1px solid var(--color-border)}.ywiki-content .doc-image-caption{margin-top:6px;color:var(--color-text-muted);font-size:12px;line-height:1.5;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ywiki-content .doc-image-gallery{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;width:100%}.ywiki-content .doc-image-gallery>.doc-image[data-sized]{margin-inline:0}.ywiki-content .doc-image-gallery{gap:var(--content-gallery-gap);align-items:flex-start}.ywiki-content .doc-image-gallery>.doc-image{flex:1 1 0;min-width:0;width:auto;height:auto;max-width:none;margin:0;aspect-ratio:var(--doc-image-aspect-ratio, 1.3333);object-fit:contain;flex-grow:calc(var(--doc-image-aspect-ratio, 1) * var(--doc-image-weight, 1))}.ywiki-content .doc-image-gallery>.doc-image-figure{flex:1 1 0;min-width:0;margin:0;flex-grow:calc(var(--doc-image-aspect-ratio, 1) * var(--doc-image-weight, 1))}.ywiki-content .doc-image-gallery>.doc-image-figure>.doc-image{width:100%;max-width:100%;margin:0}.ywiki-content .doc-image-gallery>.doc-image-figure>.doc-image-caption{margin-inline:0}.ywiki-content img,.ywiki-content .doc-image{display:block;margin-inline:auto;max-width:100%;height:auto;border-radius:var(--content-media-radius)}@property --ywiki-image-flow-angle{syntax: "<angle>"; initial-value: 0deg; inherits: false;}.ywiki-content .doc-image[data-loading]{box-sizing:border-box;padding:3px;border-radius:var(--content-media-radius);background-image:conic-gradient(from var(--ywiki-image-flow-angle),color-mix(in srgb,var(--color-accent) 14%,var(--color-surface-subtle)) 0turn 55%,color-mix(in srgb,var(--color-accent) 55%,transparent) 78%,var(--color-accent) 92%,color-mix(in srgb,var(--color-accent) 14%,var(--color-surface-subtle)) 100%);-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-clip:content-box,border-box;-webkit-mask-composite:xor;mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-clip:content-box,border-box;mask-composite:exclude;animation:ywiki-image-flow 1.4s linear infinite;min-height:120px}.ywiki-content .doc-image-gallery>.doc-image[data-loading]{min-height:0}@keyframes ywiki-image-flow{to{--ywiki-image-flow-angle: 360deg}}.ywiki-content .doc-image[data-image-error]{box-sizing:border-box;min-height:72px;background-color:color-mix(in srgb,var(--color-surface-subtle) 70%,var(--color-border));border-radius:var(--content-media-radius);outline:1px solid color-mix(in srgb,var(--color-border-strong) 55%,transparent);outline-offset:-1px}.ywiki-content .doc-image-gallery>.doc-image[data-image-error]{min-height:0}@media(prefers-reduced-motion:reduce){.ywiki-content .doc-image[data-loading]{animation:none}}.ywiki-content .doc-image[data-sized],.ywiki-content .doc-image[data-align=left]{margin-left:0;margin-right:auto}.ywiki-content .doc-image[data-align=center]{margin-left:auto;margin-right:auto}.ywiki-content .doc-image[data-align=right]{margin-left:auto;margin-right:0}.ywiki-content a,.ywiki-content .doc-link{color:var(--color-accent);text-decoration:none}.ywiki-content a:hover,.ywiki-content .doc-link:hover{text-decoration:underline}.ywiki-content .doc-page-link{color:var(--color-accent);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--color-accent) 40%,transparent)}.ywiki-content .doc-page-link:hover{border-bottom-color:var(--color-accent);text-decoration:none}.ywiki-content .doc-page-link-plain{color:var(--color-text)}.ywiki-content .doc-mention{color:var(--color-accent);background:var(--color-accent-soft);border-radius:4px;padding:.05em .35em;font-size:.95em;font-weight:500;white-space:nowrap}.ywiki-content mark,.ywiki-content .doc-mark-highlight{background:color-mix(in srgb,var(--color-warning) 30%,transparent);border-radius:2px;padding:.05em .1em;color:inherit}.ywiki-content .doc-columns{display:flex;gap:16px;align-items:flex-start}.ywiki-content .doc-column{flex:1 1 0;min-width:0}.ywiki-content .doc-column>*:first-child{margin-top:0}@media(max-width:560px){.ywiki-content .doc-columns{flex-direction:column;gap:10px}}@container wiki-content (max-width: 560px){.ywiki-content .doc-columns{flex-direction:column;gap:10px}}.ywiki-content .doc-math-inline{display:inline-block;vertical-align:middle}.ywiki-content .doc-math-block{display:block;overflow-x:auto;padding:8px 0;text-align:center}.doc-math-pending{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.875em;color:var(--color-text-muted)}.doc-math-error{border:1px dashed color-mix(in srgb,var(--color-danger) 50%,transparent);border-radius:4px;padding:0 4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.875em;color:var(--color-danger)}.doc-math-error-hint{margin-left:6px;font-size:.85em;opacity:.8}.ywiki-content :where(.doc-file,.doc-file-attachment){border:1px solid var(--color-border);border-radius:8px;padding:10px 12px;background:var(--color-surface-subtle);font-size:14px;color:var(--color-text-muted)}.ywiki-content .doc-file-head{display:flex;align-items:center;gap:8px}.ywiki-content .doc-file-icon{flex:none}.ywiki-content .doc-file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ywiki-content .doc-file-size{flex:none;font-size:12px;color:var(--color-text-faint)}.ywiki-content .doc-file-action{flex:none;border:1px solid var(--color-border);background:var(--color-surface);border-radius:6px;padding:2px 10px;font-size:12px;color:var(--color-text-muted);cursor:pointer}.ywiki-content .doc-file-action:hover{color:var(--color-accent);border-color:var(--color-accent)}.ywiki-content video.doc-file-video{display:block;width:100%;max-height:420px;margin-top:8px;border-radius:6px;background:#000}.ywiki-content img.doc-file-image{display:block;max-width:100%;margin:8px 0 0;border-radius:6px}.ywiki-content .doc-inline-comment{background:var(--comment-mark-bg, #ffe58f);border-bottom:2px solid var(--comment-mark-line, #d48806);border-radius:0;padding-bottom:1px;cursor:pointer}.ywiki-content .doc-inline-comment.has-replies{background:var(--comment-mark-bg-reply, #ffd666);border-bottom-color:var(--comment-mark-line-reply, #ad6800)}.ywiki-content .doc-inline-comment.is-active{background:var(--comment-mark-bg-active, #ffc53d);border-bottom-color:var(--comment-mark-line-active, #ad6800);outline:1px solid var(--comment-mark-line-active, #ad6800);outline-offset:1px}.ywiki-content .doc-inline-comment.is-shifted{border-left:2px solid var(--color-danger);padding-left:1px;background:transparent}.ywiki-content>*+*,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th)>*+*{margin-top:var(--space-block)}.ywiki-content>:where(h1,h2,h3,h4,h5,h6),.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th)>:where(h1,h2,h3,h4,h5,h6){margin-top:var(--space-heading-top)}.ywiki-content>:where(h1,h2,h3,h4,h5,h6)+*,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th)>:where(h1,h2,h3,h4,h5,h6)+*{margin-top:var(--space-heading-bottom)}.ywiki-content :where(li:not(.doc-task-item):not(ul[data-type=taskList]>li),li>div,li>span)>*+*{margin-top:var(--space-list-block)}.ywiki-content>:where(ul,ol,blockquote,pre,table,img,.tableWrapper,.doc-table-wrap,.code-block-wrap,.doc-code-wrap,.ywiki-image-frame,.doc-image,.doc-callout,.doc-columns,.doc-file-attachment,.doc-file-video,.doc-video-embed,[data-video-embed],.doc-math-block,.math-block),.ywiki-content>:where(ul,ol,blockquote,pre,table,img,.tableWrapper,.doc-table-wrap,.code-block-wrap,.doc-code-wrap,.ywiki-image-frame,.doc-image,.doc-callout,.doc-columns,.doc-file-attachment,.doc-file-video,.doc-video-embed,[data-video-embed],.doc-math-block,.math-block)+*,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column)>:where(ul,ol,blockquote,pre,table,img,.tableWrapper,.doc-table-wrap,.code-block-wrap,.doc-code-wrap,.ywiki-image-frame,.doc-image,.doc-callout,.doc-columns,.doc-file-attachment,.doc-file-video,.doc-video-embed,[data-video-embed],.doc-math-block,.math-block),.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column)>:where(ul,ol,blockquote,pre,table,img,.tableWrapper,.doc-table-wrap,.code-block-wrap,.doc-code-wrap,.ywiki-image-frame,.doc-image,.doc-callout,.doc-columns,.doc-file-attachment,.doc-file-video,.doc-video-embed,[data-video-embed],.doc-math-block,.math-block)+*{margin-top:var(--space-module)}.ywiki-content>:where(h1,h2,h3,h4,h5,h6),.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column)>:where(h1,h2,h3,h4,h5,h6){margin-top:var(--space-heading-top)}.ywiki-content>:where(h1,h2,h3,h4,h5,h6)+*,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column)>:where(h1,h2,h3,h4,h5,h6)+*{margin-top:var(--space-heading-bottom)}.ywiki-content>hr,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th)>hr{margin-block:var(--space-divider)}.ywiki-content>:first-child,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th,li,li>div,li>span)>:first-child{margin-top:0}.ywiki-content>:last-child,.ywiki-content :where(.doc-body,blockquote,.doc-callout-content,.doc-column,td,th,li,li>div,li>span)>:last-child{margin-bottom:0}.ywiki-content :where(td,th)>*+*{margin-top:.25em}.ywiki-content :where(td,th)>:first-child{margin-top:0}.ywiki-content :where(td,th)>:where(p,ul,ol){font-weight:inherit}.ywiki-content :where(td,th)>p:empty{min-height:calc(1em * var(--content-table-line-height))}.doc-renderer{width:100%;max-width:var(--content-width);margin-inline:auto}.doc-image{cursor:zoom-in}.doc-image[data-loading]{min-width:160px;min-height:60px;background:var(--color-surface-subtle);border-radius:8px}.doc-image-loading,.doc-image-missing,.doc-unknown{color:var(--color-text-muted);font-size:.9em}.doc-unknown{border:1px dashed var(--color-border-strong);border-radius:6px;padding:8px 10px}.doc-file.is-missing{color:var(--color-text-faint)}.ywiki-prose img.ywiki-image{max-width:100%;border-radius:var(--content-media-radius);display:block}.ywiki-prose .ywiki-image-frame{display:flex;justify-content:center;flex-direction:column;align-items:center}.ywiki-prose .ywiki-image-frame.has-caption>.ywiki-image-inner{align-self:center}.ywiki-prose .ywiki-image-caption{max-width:100%;margin-top:6px;padding:0 2px;color:var(--color-text-muted);font-size:12px;line-height:1.5;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:text}.ywiki-prose .ywiki-image-gallery{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;width:100%}.ywiki-prose .ywiki-image-gallery.is-block-selected,.ywiki-prose .ywiki-image-frame.is-block-selected .ywiki-image-inner{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:6px}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame.is-in-gallery .ywiki-image-inner{cursor:default}.ywiki-prose .ywiki-image-gallery{position:relative}.ywiki-gallery-marquee{position:fixed;z-index:69;border:1px solid color-mix(in srgb,var(--color-accent) 70%,transparent);background:color-mix(in srgb,var(--color-accent) 12%,transparent);border-radius:2px;pointer-events:none}.ywiki-prose .ywiki-image-frame.is-multi-picked .ywiki-image-inner,.ywiki-prose .ywiki-image-frame.is-block-selected-image .ywiki-image-inner,.wendang-portal .ywiki-image-frame.is-multi-picked .ywiki-image-inner{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:6px}.ywiki-prose .is-block-selected .ywiki-image-inner:after,.ywiki-prose .ywiki-image-frame.is-multi-picked .ywiki-image-inner:after,.ywiki-prose .ywiki-image-frame.is-block-selected-image .ywiki-image-inner:after,.wendang-portal .ywiki-image-frame.is-multi-picked .ywiki-image-inner:after{content:"";position:absolute;inset:0;border-radius:var(--content-media-radius, 4px);background:color-mix(in srgb,var(--color-accent) 16%,transparent);pointer-events:none}.ywiki-prose .ywiki-image-frame.is-image-drop-target .ywiki-image-inner{outline:2px solid color-mix(in srgb,var(--color-accent) 70%,transparent);outline-offset:3px;border-radius:var(--content-media-radius, 6px)}.ywiki-prose .ywiki-image-frame.is-image-drop-target .ywiki-image-inner:after{content:"";position:absolute;inset:0;border-radius:var(--content-media-radius, 6px);background:color-mix(in srgb,var(--color-accent) 14%,transparent);pointer-events:none}.ywiki-image-drop-line,.ywiki-gallery-drop-line{position:fixed;border-radius:999px;pointer-events:none;z-index:70}.ywiki-image-drop-line{z-index:60}.ywiki-image-drop-line:before,.ywiki-image-drop-line:after,.ywiki-gallery-drop-line:before,.ywiki-gallery-drop-line:after{content:"";position:absolute;left:50%;width:7px;height:7px;margin-left:-3.5px;border-radius:50%;background:inherit}.ywiki-image-drop-line:before,.ywiki-gallery-drop-line:before{top:-3px}.ywiki-image-drop-line:after,.ywiki-gallery-drop-line:after{bottom:-3px}.wendang-portal .ywiki-gallery-drop-line,.wendang-portal .ywiki-image-drop-line{position:fixed}.ywiki-prose .ywiki-image-frame.is-gallery-dragging{opacity:.55}.ywiki-prose .ywiki-image-gallery{gap:12px;align-items:flex-start}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame{flex:1 1 0;min-width:0;width:auto;height:auto;max-width:none;justify-content:flex-start}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame{flex-grow:calc(var(--ywiki-image-ratio, 1) * var(--ywiki-image-weight, 1))}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame .ywiki-image-inner{width:100%;max-width:none}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame img.ywiki-image{width:100%;height:auto;max-width:none;aspect-ratio:var(--ywiki-image-ratio, 1.3333);object-fit:contain;border-radius:var(--content-media-radius)}.ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-loading]{box-sizing:border-box;padding:3px;border-radius:var(--content-media-radius);background-image:conic-gradient(from var(--ywiki-image-flow-angle),color-mix(in srgb,var(--color-accent) 14%,var(--color-surface-subtle)) 0turn 55%,color-mix(in srgb,var(--color-accent) 55%,transparent) 78%,var(--color-accent) 92%,color-mix(in srgb,var(--color-accent) 14%,var(--color-surface-subtle)) 100%);-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-clip:content-box,border-box;-webkit-mask-composite:xor;mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-clip:content-box,border-box;mask-composite:exclude;animation:ywiki-image-flow 1.4s linear infinite;min-height:120px}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame img.ywiki-image[data-image-loading]{min-height:0}.ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-error]{box-sizing:border-box;min-height:72px;background-color:color-mix(in srgb,var(--color-surface-subtle) 70%,var(--color-border));border-radius:var(--content-media-radius);outline:1px solid color-mix(in srgb,var(--color-border-strong) 55%,transparent);outline-offset:-1px}.ywiki-prose .ywiki-image-gallery>.ywiki-image-frame img.ywiki-image[data-image-error]{min-height:0}@media(prefers-reduced-motion:reduce){.ywiki-prose .ywiki-image-frame img.ywiki-image[data-image-loading]{animation:none}}.ywiki-prose .ywiki-image-frame[data-sized],.ywiki-prose .ywiki-image-frame[data-align=left]{justify-content:flex-start}.ywiki-prose .ywiki-image-frame[data-align=center]{justify-content:center}.ywiki-prose .ywiki-image-frame[data-align=right]{justify-content:flex-end}.ywiki-prose .ywiki-image-inner{position:relative;display:inline-block;max-width:100%;line-height:0}.ywiki-prose .ywiki-image-frame.is-resizing{user-select:none}.ywiki-prose .ywiki-image-handle{display:none;position:absolute;width:14px;height:14px;box-sizing:border-box;border:2px solid var(--color-accent);border-radius:50%;background:#fff;box-shadow:0 1px 3px #00000047;z-index:3}.editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected .ywiki-image-inner{outline:2px solid var(--color-accent);outline-offset:3px;border-radius:6px;box-shadow:0 0 0 5px #fff,0 0 0 6px color-mix(in srgb,var(--color-accent) 28%,transparent)}.editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected .ywiki-image-handle,.editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected.is-in-gallery .ywiki-image-handle{display:block}.editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected.is-in-gallery .ywiki-image-inner{outline:2px solid var(--color-accent);outline-offset:3px;border-radius:6px}.ywiki-prose .ywiki-image-handle.handle-nw{left:-10px;top:-10px;cursor:nwse-resize}.ywiki-prose .ywiki-image-handle.handle-ne{right:-10px;top:-10px;cursor:nesw-resize}.ywiki-prose .ywiki-image-handle.handle-sw{left:-10px;bottom:-10px;cursor:nesw-resize}.ywiki-prose .ywiki-image-handle.handle-se{right:-10px;bottom:-10px;cursor:nwse-resize}.editor-shell.img-pick-active .ywiki-prose .ywiki-image-frame.is-selected:not(.is-resizing) img.ywiki-image{cursor:zoom-in}.ywiki-prose img.ywiki-image[data-image-missing]{min-width:120px;min-height:40px;border:1px dashed var(--color-border-strong);background:var(--color-surface-subtle)}.ywiki-prose .is-block-selected{position:relative;border-radius:6px;cursor:grab}.ywiki-prose .is-block-selected:active,.ywiki-prose.is-block-dragging,.ywiki-prose.is-block-dragging *{cursor:grabbing!important}.ywiki-prose .is-block-menu-target:not([data-block-chrome]):not(.doc-callout):not(.tableWrapper):not(.code-block-wrap){background:var(--color-accent-soft);border-radius:4px}.ywiki-prose .is-block-selected:not([data-block-chrome]):not(.doc-callout):not(.tableWrapper):not(.code-block-wrap):not(.ywiki-image-gallery):before{content:"";position:absolute;top:calc(-1 * var(--block-select-pad-top, 5px));bottom:calc(-1 * var(--block-select-pad-bottom, 5px));left:calc(-1 * var(--block-select-pad-x, 6px));right:calc(-1 * var(--block-select-pad-x, 6px));background:color-mix(in srgb,var(--color-accent) 16%,transparent);border-radius:6px;pointer-events:none}.ywiki-prose :is([data-block-chrome],.doc-callout,.tableWrapper,.code-block-wrap).is-block-selected{--block-select-radius: 6px;outline:2px solid var(--color-accent);outline-offset:2px;border-radius:var(--block-select-radius)}.ywiki-prose .doc-callout.is-block-selected{--block-select-radius: 9px}.ywiki-prose .doc-file-attachment.is-block-selected{--block-select-radius: 8px}.ywiki-prose [data-mind-map-node].is-block-selected{--block-select-radius: 12px}.ywiki-prose.is-block-selecting ::selection,.ywiki-prose.is-block-selecting *::selection{background:transparent;color:inherit}.block-marquee{position:absolute;z-index:33;pointer-events:none;box-sizing:border-box;background:color-mix(in srgb,var(--color-accent) 12%,transparent);border:1px solid color-mix(in srgb,var(--color-accent) 65%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--color-surface) 60%,transparent);border-radius:2px}.ywiki-prose .column-resize-handle{position:absolute;right:-2px;top:-4px;bottom:-4px;width:3px;border-radius:2px;background-color:var(--color-border-strong, #b9c3d2);pointer-events:none}.ywiki-prose .column-resize-dragging .column-resize-handle{background-color:var(--color-accent, #2f6feb);box-shadow:0 0 0 1px var(--color-surface, #fff)}.ywiki-prose.resize-cursor,.ywiki-prose .resize-cursor{cursor:col-resize}.ywiki-prose .selectedCell:after{content:"";position:absolute;inset:0;background:color-mix(in srgb,var(--color-accent) 8%,transparent);pointer-events:none;z-index:2}.ywiki-prose td,.ywiki-prose th{position:relative}.img-preview-mask{position:fixed;inset:0;z-index:1300;display:flex;flex-direction:column;align-items:center;justify-content:center;background:color-mix(in srgb,#0b1220 84%,transparent);overflow:hidden;user-select:none}.img-preview-stage{display:flex;align-items:center;justify-content:center;width:100%;flex:1;min-height:0;padding:32px;outline:none}.img-preview-image{max-width:100%;max-height:100%;object-fit:contain;cursor:grab;transition:transform .12s ease-out;will-change:transform}.img-preview-image.is-dragging{cursor:grabbing;transition:none}.img-preview-toolbar{display:flex;align-items:center;gap:4px;flex:none;margin-bottom:24px;padding:6px 8px;border:1px solid color-mix(in srgb,#ffffff 18%,transparent);border-radius:8px;background:color-mix(in srgb,#101828 72%,transparent);color:#f2f5fa;backdrop-filter:blur(8px)}.img-preview-toolbar button{min-width:32px;height:30px;padding:0 8px;border:none;border-radius:5px;background:transparent;color:inherit;font-family:inherit;font-size:13px;cursor:pointer}.img-preview-toolbar button:hover{background:color-mix(in srgb,#ffffff 16%,transparent)}.img-preview-toolbar button:focus-visible{outline:2px solid #fff;outline-offset:1px}.img-preview-scale{min-width:48px;text-align:center;font-size:12px;opacity:.85}.img-preview-count{min-width:52px;padding:0 6px;text-align:center;font-size:12px;font-variant-numeric:tabular-nums;opacity:.85}.img-preview-divider{width:1px;height:16px;margin:0 4px;background:color-mix(in srgb,#ffffff 26%,transparent)}.img-preview-nav{position:absolute;inset:0;pointer-events:none;display:flex;align-items:center;justify-content:space-between;padding:0 18px}.img-preview-nav-btn{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:1px solid color-mix(in srgb,#ffffff 20%,transparent);border-radius:50%;background:color-mix(in srgb,#101828 66%,transparent);color:#f2f5fa;cursor:pointer;backdrop-filter:blur(8px);transition:background .12s,opacity .12s}.img-preview-nav-btn:hover:not(:disabled){background:color-mix(in srgb,#101828 84%,transparent)}.img-preview-nav-btn:focus-visible{outline:2px solid #fff;outline-offset:2px}.img-preview-nav-btn:disabled{opacity:.22;cursor:default}@media(prefers-reduced-motion:reduce){.img-preview-image{transition:none}}:where(.wendang-root,.wendang,.wendang-portal) .w-select{display:inline-flex;min-width:0}:where(.wendang-root,.wendang,.wendang-portal) .w-select__trigger{display:inline-flex;align-items:center;justify-content:space-between;gap:6px;width:100%;min-width:0;border:1px solid var(--w-border-strong, var(--color-border-strong, #b9c3d2));border-radius:var(--w-radius-sm, 4px);background:var(--w-surface, var(--color-surface, #fff));color:var(--w-text, var(--color-text, #1f2937));font-family:var(--w-font-sans, inherit);cursor:pointer;transition:border-color var(--w-duration-fast, .12s)}:where(.wendang-root,.wendang,.wendang-portal) .w-select--mini .w-select__trigger{height:var(--w-control-mini, 24px);padding:0 6px;font-size:var(--w-font-size-mini, 12px)}:where(.wendang-root,.wendang,.wendang-portal) .w-select--small .w-select__trigger{height:var(--w-control-small, 28px);padding:0 8px;font-size:var(--w-font-size-small, 13px)}:where(.wendang-root,.wendang,.wendang-portal) .w-select--medium .w-select__trigger{height:var(--w-control-medium, 32px);padding:0 10px;font-size:var(--w-font-size-medium, 14px)}:where(.wendang-root,.wendang,.wendang-portal) .w-select__trigger:hover{border-color:var(--w-accent, var(--color-accent, #2f6feb))}:where(.wendang-root,.wendang,.wendang-portal) .w-select__trigger:focus-visible{outline:2px solid var(--w-accent, var(--color-accent, #2f6feb));outline-offset:1px}:where(.wendang-root,.wendang,.wendang-portal) .w-select__trigger:disabled{opacity:.5;cursor:not-allowed}:where(.wendang-root,.wendang,.wendang-portal) .w-select__label{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:where(.wendang-root,.wendang,.wendang-portal) .w-select__label.is-placeholder{color:var(--w-text-faint, var(--color-text-faint, #7c8798))}:where(.wendang-root,.wendang,.wendang-portal) .w-select__caret{flex:none;opacity:.65}:where(.wendang-root,.wendang,.wendang-portal) .w-select__prefix{display:inline-flex;align-items:center;flex:none}:where(.wendang-root,.wendang,.wendang-portal) .w-select__prefix svg{width:19px;height:19px}:where(.wendang-root,.wendang,.wendang-portal) .w-select-panel{display:flex;flex-direction:column;min-width:160px;max-width:min(320px,calc(100vw - 24px));padding:4px}:where(.wendang-root,.wendang,.wendang-portal) .w-select-panel .w-select-search{width:100%;margin-bottom:4px;padding:5px 8px;border:1px solid var(--w-border, var(--color-border, #dce2eb));border-radius:var(--w-radius-sm, 4px);background:var(--w-surface, var(--color-surface, #fff));color:var(--w-text, var(--color-text, #1f2937));font-size:var(--w-font-size-small, 13px)}:where(.wendang-root,.wendang,.wendang-portal) .w-select-panel .w-select-search:focus{outline:2px solid var(--w-accent, #2f6feb);outline-offset:-1px}:where(.wendang-root,.wendang,.wendang-portal) .w-select-list{display:flex;flex-direction:column;max-height:min(50vh,320px);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}:where(.wendang-root,.wendang,.wendang-portal) .w-select-option{display:flex;align-items:center;box-sizing:border-box;min-height:30px;padding:6px 9px;border:none;border-radius:var(--w-radius-md, 6px);background:transparent;color:var(--w-text, var(--color-text, #1f2937));font-family:inherit;font-size:var(--w-font-size-small, 13px);text-align:left;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .w-select-option.is-active{background:var(--w-surface-subtle, var(--color-surface-subtle, #f5f7fa))}:where(.wendang-root,.wendang,.wendang-portal) .w-select-option.is-selected{color:var(--w-accent, var(--color-accent, #2f6feb));background:var(--w-accent-soft, var(--color-accent-soft, #eaf1ff))}:where(.wendang-root,.wendang,.wendang-portal) .w-select-option:disabled{opacity:.45;cursor:not-allowed}:where(.wendang-root,.wendang,.wendang-portal) .w-select-empty{padding:8px 9px;color:var(--w-text-faint, #7c8798);font-size:var(--w-font-size-small, 13px)}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown{min-width:160px;max-width:min(320px,calc(100vw - 24px));max-height:min(70vh,520px);overflow-y:auto;overscroll-behavior:contain;padding:4px;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--w-text-faint, #7c8798) 40%,transparent) transparent}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown::-webkit-scrollbar{width:8px}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown::-webkit-scrollbar-thumb{border:2px solid transparent;border-radius:999px;background-clip:content-box;background-color:color-mix(in srgb,var(--w-text-faint, #7c8798) 36%,transparent)}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-option{display:flex;align-items:center;gap:6px;box-sizing:border-box;min-height:30px;padding:6px 9px;border-radius:var(--w-radius-md, 6px);color:var(--w-text, var(--color-text, #1f2937));font-size:var(--w-font-size-small, 13px);line-height:1.5;cursor:pointer;user-select:none}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-option:hover,:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-option:focus-visible{background:var(--w-surface-subtle, var(--color-surface-subtle, #f5f7fa));outline:none}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-option.is-selected{color:var(--w-accent, var(--color-accent, #2f6feb));background:var(--w-accent-soft, var(--color-accent-soft, #eaf1ff))}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-option.is-disabled{opacity:.45;cursor:not-allowed;background:transparent}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-group__title{padding:6px 9px 3px;color:var(--w-text-faint, var(--color-text-faint, #7c8798));font-size:11px;line-height:1.5}:where(.wendang-root,.wendang,.wendang-portal) .w-dropdown-group+.w-dropdown-group{margin-top:2px;padding-top:3px;border-top:1px solid var(--w-border, var(--color-border, #dce2eb))}:where(.wendang-root,.wendang,.wendang-portal) .w-tooltip{padding:5px 9px;border:1px solid var(--w-border, var(--color-border, #dce2eb));border-radius:var(--w-radius-sm, 4px);background:var(--w-surface, var(--color-surface, #fff));color:var(--w-text, var(--color-text, #1f2937));font-size:var(--w-font-size-mini, 12px);line-height:1.55;white-space:nowrap;box-shadow:var(--w-shadow-pop, 0 10px 32px #14284a20)}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog-mask{position:fixed;inset:0;z-index:1100;display:flex;align-items:flex-start;justify-content:center;padding:10vh 16px 24px;background:color-mix(in srgb,#101828 42%,transparent);overflow-y:auto;overscroll-behavior:contain}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog-mask.is-fullscreen{padding:0;overflow:hidden}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog{position:relative;display:flex;flex-direction:column;max-width:calc(100vw - 32px);max-height:calc(100dvh - 14vh);border:1px solid var(--w-border, var(--color-border, #dce2eb));border-radius:var(--w-radius-lg, 8px);background:var(--w-surface, var(--color-surface, #fff));color:var(--w-text, var(--color-text, #1f2937));box-shadow:0 24px 64px #10182833;outline:none}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog.is-fullscreen{width:100vw;max-width:none;height:100dvh;max-height:none;border:0;border-radius:0}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__header{display:flex;align-items:center;gap:12px;flex:none;padding:14px 18px;border-bottom:1px solid var(--w-border, var(--color-border, #dce2eb))}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__title{flex:1;min-width:0;font-size:16px;font-weight:600;line-height:1.4}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__close{display:flex;align-items:center;justify-content:center;flex:none;width:28px;height:28px;padding:0;border:none;border-radius:var(--w-radius-sm, 4px);background:transparent;color:var(--w-text-muted, var(--color-text-muted, #667085));cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__close:hover{background:var(--w-surface-subtle, #f5f7fa);color:var(--w-text, #1f2937)}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__close:focus-visible{outline:2px solid var(--w-accent, #2f6feb);outline-offset:-2px}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__body{flex:1;min-height:0;overflow-y:auto;padding:4px 25px 24px;line-height:1.7}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog.is-fullscreen .wd-dialog__body{display:flex;flex-direction:column;overflow:hidden;padding:0}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__footer{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex:none;padding:0 25px 20px}@media(max-width:520px){:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__body{padding:4px 18px 20px}:where(.wendang-root,.wendang,.wendang-portal) .wd-dialog__footer{padding:0 18px 16px}}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar{overflow:hidden}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__viewport{overflow:auto;overscroll-behavior:contain;scrollbar-width:none;min-height:0;box-sizing:border-box;padding:6px;overflow-anchor:none}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__viewport::-webkit-scrollbar{display:none;width:0;height:0}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__track{position:absolute;top:5px;right:2px;bottom:5px;z-index:1;width:10px;opacity:0;transition:opacity .15s;touch-action:none;cursor:default}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__track[hidden]{display:none}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar:hover>.w-overlay-scrollbar__track,:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar:focus-within>.w-overlay-scrollbar__track,:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar.is-scrolling>.w-overlay-scrollbar__track{opacity:1}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__thumb{position:absolute;top:0;right:2px;width:6px;border-radius:999px;touch-action:none;background:color-mix(in srgb,var(--color-text-muted) 42%,transparent);cursor:grab}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__thumb:hover,:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar.is-dragging-scrollbar .w-overlay-scrollbar__thumb{background:color-mix(in srgb,var(--color-text-muted) 66%,transparent)}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar.is-dragging-scrollbar .w-overlay-scrollbar__thumb{cursor:grabbing}:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__thumb:focus-visible{outline:2px solid var(--color-accent);outline-offset:1px}@media(prefers-reduced-motion:reduce){:where(.wendang-root,.wendang,.wendang-portal) .w-overlay-scrollbar__track{transition:none}}.mind-inline .mind-map-workspace{height:100%;padding:0}.mind-canvas-title{display:inline-flex;align-items:center;gap:14px;max-width:calc(100vw - 110px)}.mind-canvas-title>span{font-size:13px;font-weight:400;color:var(--color-text-muted);max-width:65vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mind-map-workspace{display:flex;flex-direction:column;height:100%;min-height:300px;box-sizing:border-box;padding:16px 20px 20px;color:var(--color-text)}.mind-save-hint{margin-bottom:10px}.mind-canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 0 10px;flex-wrap:wrap}.mind-canvas-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}.mind-canvas-options{justify-content:flex-end;margin-left:auto}.mind-canvas-status{font-size:12px;color:var(--color-text-muted);max-width:32vw}.mind-canvas-body{display:flex;flex:1;min-height:0;border:1px solid var(--color-border);border-radius:12px;overflow:hidden}.mind-canvas-stage{position:relative;flex:1;min-width:0;overflow:hidden;outline:none;background:radial-gradient(var(--color-border) 1px,transparent 1px) 0 0 / 22px 22px var(--color-surface)}.mind-canvas-stage.mind-grid-hidden{background-image:none}.mind-canvas-surface{width:100%;height:100%}.mind-canvas-stage .vue-flow__pane{cursor:default}.mind-canvas-stage .vue-flow__selection,.mind-marquee{background:color-mix(in srgb,var(--mind-color) 8%,transparent);border:1px solid var(--mind-color);box-sizing:border-box;pointer-events:none}.mind-marquee{position:absolute;z-index:4}.mind-canvas-stage.mind-space-pan .vue-flow__pane,.mind-canvas-stage.mind-space-pan .vue-flow__node{cursor:grab}.mind-canvas-stage .vue-flow__pane.dragging{cursor:grabbing}.mind-selection-summary{position:absolute;left:16px;top:16px;display:flex;align-items:center;gap:10px;padding:6px 12px;border:1px solid var(--color-border);border-radius:9px;background:var(--color-surface);font-size:12px}.mind-menu-key{margin-left:22px;float:right;color:var(--color-text-faint);font-size:11px}.mind-canvas-outline{flex:0 0 235px;overflow:auto;border-right:1px solid var(--color-border);padding:12px 4px}.mind-canvas-outline button{display:block;border:0;background:transparent;border-radius:5px;width:100%;text-align:left;padding:7px 10px;color:var(--color-text-muted);white-space:pre-wrap;overflow-wrap:anywhere}.mind-canvas-outline button.current{color:var(--mind-color);background:var(--color-surface-subtle)}.mind-node-actions{position:absolute;left:16px;top:16px;display:flex;flex-wrap:wrap;align-items:center;gap:5px;border:1px solid var(--color-border);padding:6px;background:var(--color-surface);border-radius:10px;box-shadow:0 4px 20px #00000008}.mind-canvas-bottom{position:absolute;bottom:16px;left:18px;right:18px;display:flex;justify-content:space-between;align-items:end;gap:10px;pointer-events:none}.mind-canvas-hint{font-size:11px;color:var(--color-text-faint);padding:6px 0}.mind-canvas-viewport{display:flex;align-items:center;gap:6px;padding:6px;border:1px solid var(--color-border);border-radius:9px;background:var(--color-surface);pointer-events:auto;white-space:nowrap}.mind-viewport-divider{height:20px;border-left:1px solid var(--color-border);margin:0 2px}.mind-zoom-percent{min-width:52px;font-variant-numeric:tabular-nums}.mind-viewport-tip{display:flex;align-items:center;flex-wrap:wrap;gap:7px;max-width:min(480px,calc(100vw - 40px));font-size:12px;line-height:1.6}.mind-viewport-tip kbd{padding:2px 6px;border-radius:4px;background:#ffffff20;font:inherit;white-space:nowrap}.mind-canvas-notice{position:absolute;bottom:70px;left:50%;transform:translate(-50%);padding:8px 14px;margin:0;border-radius:7px;background:var(--color-surface);border:1px solid var(--color-border);color:var(--color-text-muted);font-size:12px;pointer-events:none;max-width:90%}.mind-canvas-stage .mind-drop-child{outline:3px solid var(--mind-color);border-radius:10px}.mind-canvas-stage .mind-drop-left{box-shadow:-6px 0 0 0 var(--mind-color);border-radius:9px}.mind-canvas-stage .mind-drop-right{box-shadow:6px 0 0 0 var(--mind-color);border-radius:9px}.mind-canvas-stage .mind-drag-branch{opacity:.35}.mind-canvas-stage .mind-drag-branch-edge{opacity:.12}.mind-side-preview{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}.mind-side-preview path{fill:none;stroke:var(--mind-color);stroke-width:2;stroke-dasharray:6 4}.mind-side-preview rect{fill:var(--color-surface);stroke:var(--mind-color);stroke-width:2;stroke-dasharray:5 3}.mind-side-preview text{fill:var(--color-text);font-size:14px}.mind-canvas-stage .mind-drop-before:before,.mind-canvas-stage .mind-drop-after:after{content:"";position:absolute;left:-10px;right:-10px;height:3px;background:var(--mind-color)}.mind-canvas-stage .mind-drop-before:before{top:-7px}.mind-canvas-stage .mind-drop-after:after{bottom:-7px}.mind-canvas-stage .vue-flow__edge-path{stroke:var(--mind-color)}@media(max-width:760px){.mind-canvas-outline{flex-basis:170px}.mind-canvas-hint{display:none}.mind-canvas-toolbar{gap:8px}.mind-canvas-options{justify-content:flex-start;margin-left:0}.mind-node-actions{left:8px;right:8px;top:8px}.mind-canvas-status{max-width:60vw}}.mind-search{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:6px 0 10px;font-size:12px}.mind-search input{width:180px;font-size:12px}.mind-outline-row{display:flex;align-items:center;margin:3px 0}.mind-outline-row input{min-width:0;width:100%;border:0;background:transparent;font:12px/22px inherit;color:var(--color-text);padding:5px}.mind-outline-row.current{background:var(--color-surface-subtle)}.mind-outline-row>button:last-child{width:24px;flex-shrink:0;padding:2px}.mind-canvas-outline .mind-outline-row textarea{min-width:0;width:100%;border:0;background:transparent;font-size:12px;line-height:22px;color:var(--color-text);padding:5px;resize:none;border-radius:4px}.mind-inline{height:100%;min-height:380px}.mind-inline .mind-map-workspace{height:100%}.mind-settings-menu{width:310px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px;font-size:12px}.mind-settings-menu label{width:100%;display:flex;gap:8px;align-items:center}.mind-settings-menu input{width:auto}.mind-canvas-fullscreen{position:fixed!important;top:0!important;left:0!important;width:100vw!important;height:100dvh!important;max-width:none!important}.mind-topic-shell{position:relative;width:100%;height:100%}.mind-topic{position:relative;border-radius:9px;background:var(--color-surface);color:var(--color-text);border:1px solid color-mix(in srgb,var(--mind-color) 38%,var(--color-border));padding:10px 16px;font-family:inherit;font-size:14px;line-height:22px;display:grid;place-items:center;box-sizing:border-box}.mind-topic.root{background:var(--mind-color);border-color:var(--mind-color);color:#fff;font-weight:600}.mind-topic.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--mind-color) 22%,transparent)}.mind-topic-label{width:100%;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-all;text-align:center;line-height:var(--mind-topic-line-height,22px)}.mind-topic-input{box-sizing:border-box;display:block;border:0;border-radius:4px;outline:0;padding:0;margin:0;width:100%;min-width:0;min-height:var(--mind-topic-line-height,22px);max-width:none;resize:none;overflow:hidden;white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;background:transparent;color:inherit;font:inherit;line-height:var(--mind-topic-line-height,22px);text-align:inherit}.mind-topic-input:focus{box-shadow:none;outline:0}.mind-topic-fold{position:absolute;left:calc(100% + 20px);top:calc(50% - 12px);width:24px;min-width:24px;height:24px;padding:0;display:grid;place-items:center;z-index:2;border-radius:50%;border:1px solid var(--mind-color);color:var(--mind-color);background:var(--color-surface);font:11px/1 sans-serif;cursor:pointer;opacity:0;pointer-events:none;transition:opacity .12s ease}.mind-topic-shell:hover>.mind-topic-fold,.mind-topic-shell.is-selected>.mind-topic-fold,.mind-topic-shell:focus-within>.mind-topic-fold,.mind-topic-shell.is-collapsed>.mind-topic-fold{opacity:1;pointer-events:auto}.mind-topic-fold:hover{background:color-mix(in srgb,var(--mind-color) 10%,var(--color-surface))}.mind-topic-fold:focus-visible{outline:2px solid var(--mind-color);outline-offset:3px}.mind-fold-count{font-variant-numeric:tabular-nums;font-weight:600}.mind-topic-shell.has-children:not(.root):before{content:"";position:absolute;left:100%;top:0;width:64px;height:100%}.mind-topic-handle{opacity:0;pointer-events:none}.mind-topic-shell.grows-left .mind-topic-add,.mind-topic-shell .mind-topic-add.root-left{left:auto;right:calc(100% - 12px)}.mind-topic-shell .mind-topic-add.root-right{right:auto;left:calc(100% - 12px)}.mind-topic-shell.grows-left .mind-topic-fold{left:auto;right:calc(100% + 20px)}.mind-topic-shell.grows-left .mind-fold-chevron{transform:rotate(180deg)}.mind-topic-shell.grows-left.has-children:not(.root):before{left:auto;right:100%}.mind-topic-shell.grows-down .mind-topic-add{left:calc(50% - 12px);top:calc(100% - 12px)}.mind-topic-shell.grows-down .mind-topic-fold{right:auto;left:calc(50% - 12px);top:calc(100% + 18px)}.mind-topic-shell.grows-down .mind-fold-chevron{transform:rotate(90deg)}.mind-topic-shell.grows-down.has-children:not(.root):before{left:0;right:auto;top:100%;width:100%;height:60px}@media(hover:none){.mind-topic-fold{opacity:1;pointer-events:auto}}.mind-topic-sibling{position:absolute;width:24px;min-width:24px;height:24px;padding:0;left:calc(50% - 12px);display:grid;place-items:center;border:0;border-radius:50%;background:transparent;color:#fff;cursor:pointer;z-index:1}.mind-topic-sibling.before{top:-22px}.mind-topic-sibling.after{bottom:-22px}.mind-topic-sibling>span{display:grid;place-items:center;width:9px;height:9px;border-radius:50%;background:color-mix(in srgb,var(--mind-color) 36%,var(--color-surface));font:0/1 sans-serif}.mind-topic-sibling:hover,.mind-topic-sibling:focus-visible{background:transparent}.mind-topic-sibling:hover>span,.mind-topic-sibling:focus-visible>span{width:20px;height:20px;background:var(--mind-color);font-size:16px}.mind-topic-sibling:focus-visible{outline:2px solid var(--mind-color);outline-offset:1px}.mind-topic-shell.grows-down .mind-topic-sibling{top:calc(50% - 12px);bottom:auto}.mind-topic-shell.grows-down .mind-topic-sibling.before{left:-22px}.mind-topic-shell.grows-down .mind-topic-sibling.after{left:auto;right:-22px}.mind-topic-description{font-size:12px;line-height:18px;white-space:pre-wrap;color:var(--color-text-muted);width:100%;min-width:0;word-break:break-all;overflow-wrap:anywhere;margin-top:6px}.root .mind-topic-description{color:#e7f4ff}.mind-topic-image{width:100%;height:96px;overflow:hidden;margin-top:8px}.mind-topic-image img{width:100%!important;height:96px!important;object-fit:contain;max-height:96px!important;margin:0!important}.mind-topic-note{font-size:10px;line-height:14px;margin-top:6px;opacity:.7;cursor:pointer}.mind-topic-add{position:absolute;left:calc(100% - 12px);top:calc(50% - 12px);width:24px;height:24px;padding:0;box-sizing:border-box;display:grid;place-items:center;border-radius:50%;border:1px solid color-mix(in srgb,var(--mind-color) 45%,var(--color-border));background:var(--color-surface);color:color-mix(in srgb,var(--mind-color) 82%,var(--color-text));font:15px/1 system-ui,sans-serif;font-weight:500;cursor:pointer;z-index:3;box-shadow:0 1px 3px #0f172a1f;transition:background .12s ease,border-color .12s ease,transform .12s ease,box-shadow .12s ease}.mind-topic-add:hover,.mind-topic-add:focus-visible{background:color-mix(in srgb,var(--mind-color) 14%,var(--color-surface));border-color:var(--mind-color);color:var(--mind-color);transform:scale(1.12);box-shadow:0 2px 6px #0f172a2e}.mind-topic-add:focus-visible{outline:2px solid var(--mind-color);outline-offset:2px}.mind-topic-add:active{transform:scale(.98)}.mind-topic-add.root-left,.mind-topic-add.root-right{border-color:color-mix(in srgb,var(--color-surface) 70%,transparent)}.mind-topic-icon{font-size:16px;line-height:20px}.mind-topic[style*="border: 0"]{background:transparent}.mind-preview-wrap{display:flex;align-items:center;justify-content:center;overflow:hidden;min-height:240px}.mind-preview-sized{position:relative;flex-shrink:0}.mind-preview-scene{position:relative;transform-origin:top left}.mind-preview-lines{position:absolute;inset:0}.mind-preview-topic{position:absolute;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--mind-color) 35%,var(--color-border));border-radius:9px;background:var(--color-surface-subtle);color:var(--color-text);padding:10px 16px;display:flex;flex-direction:column;justify-content:center;line-height:22px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-all}.mind-preview-title{display:block;width:100%;min-width:0}.mind-preview-icon{font-size:16px;line-height:20px}.mind-preview-topic.root{background:var(--mind-color);color:#fff;font-weight:600}.mind-preview-topic.text{border:0;background:transparent}.mind-preview-description{font-size:12px;font-weight:400;line-height:18px;margin-top:6px;opacity:.72}.mind-preview-note{font-size:10px;line-height:14px;margin-top:6px;opacity:.65}.mind-preview-image{width:100%;height:96px;margin-top:8px;overflow:hidden}.mind-preview-image img{width:100%!important;height:96px!important;object-fit:contain;margin:0!important}.mind-map-block{margin:20px 0;border:1px solid var(--color-border);border-radius:12px;background:var(--color-surface);overflow:hidden}.mind-map-block-header{min-height:45px;display:flex;gap:12px;align-items:center;justify-content:space-between;padding:6px 12px}.mind-map-block-label{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--color-text-muted)}.mind-map-block-label>span:first-child{color:var(--mind-color);font-size:18px}.mind-map-topic-count{font-size:11px;color:var(--color-text-faint)}.mind-map-block-actions{display:flex;flex-shrink:0;gap:4px}.mind-map-preview{width:100%;display:block;min-height:240px;cursor:zoom-in}.mind-map-preview rect{fill:var(--color-surface-subtle);stroke:var(--mind-color);stroke-opacity:.3}.mind-map-preview text{fill:var(--color-text);font-family:inherit}.mind-map-preview .mind-map-root rect{fill:var(--mind-color);stroke:none}.mind-map-preview .mind-map-root text{fill:#fff}.mind-map-preview-outline{overflow:auto;padding:16px 24px 24px;font-size:14px;line-height:2;white-space:pre-wrap;overflow-wrap:anywhere}.mind-map-invalid{padding:20px;color:var(--color-text-muted)}@media(max-width:600px){.mind-map-topic-count{display:none}}.mind-details{flex:0 0 280px;padding:14px;border-left:1px solid var(--color-border);overflow:auto;background:var(--color-surface);font-size:12px}.mind-details>header{display:flex;justify-content:space-between;align-items:center}.mind-details-title{color:var(--color-text-muted);overflow-wrap:anywhere}.mind-details fieldset{border:0;border-top:1px solid var(--color-border);padding:12px 0;margin:8px 0;display:flex;flex-direction:column;gap:8px}.mind-details legend{font-weight:600;padding:0 8px 0 0}.mind-details label{display:grid;grid-template-columns:70px minmax(0,1fr);align-items:center;gap:8px}.mind-details input,.mind-details textarea{width:100%;font:inherit;box-sizing:border-box}.mind-details textarea{resize:vertical}.mind-format-buttons{display:flex;gap:6px}.mind-relation-item{display:flex;align-items:center;gap:8px}.mind-relation-item span{flex:1;overflow-wrap:anywhere}.mind-color-grid{display:grid;grid-template-columns:repeat(8,24px);gap:4px}.mind-color-grid>*{width:24px;min-width:24px;height:24px;padding:0}.mind-comments{flex:0 0 340px;display:flex;flex-direction:column;gap:12px;min-height:0;padding:16px;overflow:auto;border-left:1px solid var(--color-border);background:var(--color-surface, #fff);font-size:13px}.mind-comments__head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.mind-comments__intro strong{font-size:14px}.mind-comments__intro p{margin:4px 0 0;color:var(--color-text-muted);font-size:12px;line-height:1.6}.mind-comments__head-actions{display:flex;flex:none;gap:4px}.mind-comments__error{margin:0;padding:8px 10px;border-radius:6px;background:#fdecec;color:#b42b36;font-size:12px}.mind-comments__list{display:grid;gap:10px}.mind-comment{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--color-border);border-radius:8px}.mind-comment__head{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.mind-comment__head span{color:var(--color-text-muted);font-size:11px}.mind-comment__body{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.7}.mind-comment__actions{display:flex;flex-wrap:wrap;gap:4px}.mind-comment__reply{display:grid;gap:6px;margin-left:12px;padding-left:10px;border-left:2px solid var(--color-border)}.mind-comment__label{color:var(--color-text-muted);font-size:11px;font-weight:600}.mind-comment__compose{display:grid;gap:6px}.mind-comments__compose{display:grid;gap:6px;padding-top:12px;border-top:1px solid var(--color-border)}.mind-comments__empty{margin:0;color:var(--color-text-muted);font-size:12px;line-height:1.7}.mind-comments textarea{width:100%;padding:8px 10px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface, #fff);color:inherit;font:inherit;line-height:1.6;box-sizing:border-box;resize:vertical}.picker-backdrop{position:fixed;inset:0;z-index:1100;background:color-mix(in srgb,#000 45%,transparent);display:flex;align-items:flex-start;justify-content:center;padding-top:12vh}.picker-backdrop .picker{width:420px;max-width:calc(100vw - 32px);background:var(--color-surface);border:1px solid var(--color-border);border-radius:10px;box-shadow:var(--shadow-pop);padding:8px}.picker-backdrop .picker .picker-input{width:100%;box-sizing:border-box;border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-size:14px;background:var(--color-surface-subtle);color:var(--color-text)}.picker-backdrop .picker-input:focus{outline:none;border-color:var(--color-accent)}.picker-backdrop .picker-list{list-style:none;margin:6px 0 0;padding:0;max-height:320px;overflow-y:auto}.picker-backdrop .picker-list li{padding:7px 10px;border-radius:6px;cursor:pointer;font-size:14px;color:var(--color-text)}.picker-backdrop .picker-list li.active{background:var(--color-accent-soft);color:var(--color-accent)}.picker-backdrop .picker-title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-backdrop .picker-empty{color:var(--color-text-faint);font-size:13px;text-align:center;padding:14px 0;margin:0}.video-form{display:flex;flex-direction:column;gap:16px}.video-field{display:flex;flex-direction:column;gap:8px}.video-field label{font-size:13px;font-weight:600;color:var(--color-text)}.video-field input{width:100%}.video-loading-option{display:flex;flex-direction:column;gap:6px}.video-loading-choice{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;color:var(--color-text)}.video-loading-choice input[type=checkbox]{flex:none;width:16px;height:16px;margin:0;accent-color:var(--color-accent)}.video-loading-option .video-hint{padding-left:24px}.video-hint{margin:0;font-size:12px;line-height:1.7;color:var(--color-text-muted)}.video-status{margin:0;padding:8px 10px;border-radius:6px;font-size:12px;line-height:1.7}.video-status--ok{color:var(--color-text);background:var(--color-accent-soft)}.video-status--error{color:var(--color-danger);background:color-mix(in srgb,var(--color-danger) 8%,transparent)}.video-status-meta{margin-left:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--color-text-muted)}.video-source{margin:0;font-size:12px;line-height:1.6;color:var(--color-text-muted);overflow-wrap:anywhere}.doc-video-embed{width:100%;min-width:0;border:1px solid var(--color-border, #dce2eb);border-radius:8px;overflow:hidden;background:var(--color-surface, #fff)}.doc-video-embed .video-placeholder{min-height:220px;padding:28px 24px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:var(--color-surface-subtle, #f5f7fa)}.doc-video-embed .video-play-icon{display:inline-flex;align-items:center;justify-content:center;width:46px;height:46px;margin-bottom:2px;border-radius:50%;color:var(--color-accent, #2f6feb);background:var(--color-accent-soft, #eaf1ff);font-size:18px;line-height:1;text-indent:2px}.doc-video-embed .video-placeholder strong{font-size:14px;font-weight:600;color:var(--color-text, #1f2937)}.doc-video-embed .video-id{font-size:12px;color:var(--color-text-muted, #667085);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.doc-video-embed .video-load{margin-top:4px;padding:7px 20px;color:var(--color-accent, #2f6feb);background:var(--color-accent-soft, #eaf1ff);border:0;border-radius:6px;cursor:pointer;font:inherit;font-size:13px}.doc-video-embed .video-load:hover{background:color-mix(in srgb,var(--color-accent, #2f6feb) 16%,transparent)}.doc-video-embed iframe{display:block;width:100%;aspect-ratio:16 / 9;min-height:200px;border:0;background:#111}.doc-video-embed .video-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;padding:10px 14px;font-size:12px;border-top:1px solid var(--color-border, #dce2eb);background:var(--color-surface, #fff)}.doc-video-embed .video-footer a{color:var(--color-accent, #2f6feb)}.doc-video-embed button:focus-visible,.doc-video-embed a:focus-visible{outline:2px solid var(--color-accent, #2f6feb);outline-offset:2px}.video-editor-node{position:relative;outline:none}.video-editor-node.is-video-selected>div>.doc-video-embed,.video-editor-node:focus-visible>div>.doc-video-embed{outline:2px solid var(--color-accent, #2f6feb);outline-offset:3px}.video-block-tools{position:fixed;z-index:260;width:max-content;max-width:calc(100vw - 16px);color:var(--color-text, #1f2937);font:13px/1.5 var(--font-sans, system-ui, sans-serif)}.video-block-tools[hidden],.video-block-tools [hidden]{display:none!important}.video-block-toolbar{display:flex;align-items:center;gap:4px;width:max-content;max-width:calc(100vw - 16px);padding:5px;overflow-x:auto;border:1px solid var(--color-border, #dce2eb);border-radius:9px;background:var(--color-surface, #fff);box-shadow:0 4px 18px #0000001a,0 1px 3px #0000000a}.video-block-tools button{display:inline-flex;align-items:center;justify-content:center;gap:6px;flex-shrink:0;min-width:32px;height:32px;padding:5px 7px;border:0;border-radius:5px;color:inherit;background:transparent;cursor:pointer;font:inherit;white-space:nowrap}.video-block-tools button:hover{background:var(--color-surface-subtle, #f5f7fa)}.video-block-tools button[aria-pressed=true]{color:var(--color-accent, #2f6feb);background:var(--color-accent-soft, #eaf1ff)}.video-block-tools button:disabled{opacity:.4;cursor:default}.video-block-tools button:focus-visible,.video-block-tools input:focus-visible{outline:2px solid var(--color-accent, #2f6feb);outline-offset:1px}.video-block-tools .video-block-delete{color:var(--color-danger, #d92d20);margin-left:3px;border-left:1px solid var(--color-border, #dce2eb);border-radius:0 5px 5px 0}.video-block-link-form{position:fixed;display:flex;flex-direction:column;gap:7px;width:min(560px,calc(100vw - 32px));box-sizing:border-box;margin:0;padding:10px;border:1px solid var(--color-border, #dce2eb);border-radius:8px;background:var(--color-surface, #fff);box-shadow:var(--shadow-pop, 0 4px 18px #0000001a);overflow-anchor:none}.video-block-link-row{display:flex;align-items:center;gap:8px}.video-block-link-field{position:relative;display:flex;align-items:center;flex:1;min-width:0}.video-block-link-icon{position:absolute;left:10px;top:9px;color:var(--color-text-faint, #98a2b3);pointer-events:none}.video-block-link-form .video-block-link-field textarea{min-width:0;width:100%;box-sizing:border-box;height:34px;min-height:34px;max-height:110px;padding:7px 10px 7px 32px;border:1px solid var(--color-border-strong, #b9c5d6);border-radius:6px;background:var(--color-surface, #fff);color:inherit;font:inherit;line-height:18px;outline:none;resize:none;overflow-wrap:anywhere;word-break:break-all;overflow-y:hidden}.video-block-link-form .video-block-link-field textarea::placeholder{color:var(--color-text-faint, #98a2b3)}.video-block-link-form .video-block-link-field textarea:focus{border-color:var(--color-accent, #2f6feb);box-shadow:0 0 0 2px color-mix(in srgb,var(--color-accent, #2f6feb) 18%,transparent);outline:none}.video-block-link-form .video-block-link-field textarea[aria-invalid=true]{border-color:var(--color-danger, #d92d20)}.video-block-link-form .video-block-link-field textarea[aria-invalid=true]:focus{box-shadow:0 0 0 2px color-mix(in srgb,var(--color-danger, #d92d20) 16%,transparent)}.video-block-tools .video-block-link-confirm{flex:none;height:34px;min-width:64px;padding:0 16px;border:1px solid var(--color-accent, #2f6feb);border-radius:6px;background:var(--color-accent, #2f6feb);color:#fff;font-weight:500}.video-block-tools .video-block-link-confirm:hover{background:color-mix(in srgb,var(--color-accent, #2f6feb) 88%,#000)}.video-block-tools .video-block-link-confirm:disabled{opacity:1;border-color:var(--color-border, #dce2eb);background:var(--color-surface-subtle, #f5f7fa);color:var(--color-text-faint, #98a2b3);cursor:not-allowed}.video-block-link-arrow{position:absolute;width:9px;height:9px;transform:translate(-50%) rotate(45deg);background:var(--color-surface, #fff);pointer-events:none}.video-block-link-arrow[data-side=below]{top:-5px;border-left:1px solid var(--color-border, #dce2eb);border-top:1px solid var(--color-border, #dce2eb)}.video-block-link-arrow[data-side=above]{bottom:-5px;border-right:1px solid var(--color-border, #dce2eb);border-bottom:1px solid var(--color-border, #dce2eb)}.video-block-link-form p{margin:0;font-size:12px;color:var(--color-danger, #d92d20);overflow-wrap:anywhere}.video-block-link-form p:empty{display:none}.video-block-feedback{padding:8px 12px;margin-top:8px;border:1px solid var(--color-border, #dce2eb);border-radius:6px;background:var(--color-surface, #fff);overflow-wrap:anywhere;max-width:340px;box-sizing:border-box}@media(max-width:480px){.video-block-toolbar{gap:2px}.video-block-tools .video-block-loading{padding-inline:5px}}.doc-file-video{margin-top:8px}.doc-file-video video{width:100%;max-height:420px;border-radius:6px;background:#000}.doc-file-video-fallback{margin:0;font-size:13px;color:var(--color-text-faint)}.wendang-spreadsheet{position:relative;display:flex;flex-direction:column;height:100%;min-height:300px;min-width:0;flex:1}.worksheet-grid{position:relative;flex:1;min-width:0;min-height:0;overflow:hidden}.wendang-spreadsheet>p{position:absolute;top:8px;left:12px;z-index:2}.wendang,.wendang-portal{--w-font-sans: var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", sans-serif);--w-text: var(--color-text, #1f2937);--w-text-muted: var(--color-text-muted, #667085);--w-text-faint: var(--color-text-faint, #7c8798);--w-surface: var(--color-surface, #fff);--w-surface-subtle: var(--color-surface-subtle, #f5f7fa);--w-border: var(--color-border, #dce2eb);--w-border-strong: var(--color-border-strong, #b9c3d2);--w-accent: var(--color-accent, #2f6feb);--w-accent-soft: var(--color-accent-soft, #eaf1ff);--w-danger: var(--color-danger, #cf3d48);--w-success: var(--color-success, #238353);--w-warning: var(--color-warning, #b76e00);--w-shadow-pop: var(--shadow-pop, 0 10px 32px #14284a20);--w-font-size-mini: 12px;--w-font-size-small: 13px;--w-font-size-medium: 14px;--w-control-mini: 24px;--w-control-small: 28px;--w-control-medium: 32px;--w-radius-sm: 4px;--w-radius-md: 6px;--w-radius-lg: 8px;--w-duration-fast: .12s}:where(.wendang-root,.wendang,.wendang-portal) .w-button{display:inline-flex;align-items:center;justify-content:center;gap:4px;flex:none;box-sizing:border-box;margin:0;border:1px solid transparent;border-radius:var(--w-radius-sm,4px);font-family:var(--w-font-sans,inherit);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--w-duration-fast,.12s),border-color var(--w-duration-fast,.12s),color var(--w-duration-fast,.12s)}:where(.wendang-root,.wendang,.wendang-portal) .w-button--mini{height:var(--w-control-mini,24px);padding:0 8px;font-size:var(--w-font-size-mini,12px)}:where(.wendang-root,.wendang,.wendang-portal) .w-button--small{height:var(--w-control-small,28px);padding:0 10px;font-size:var(--w-font-size-small,13px)}:where(.wendang-root,.wendang,.wendang-portal) .w-button--medium{height:var(--w-control-medium,32px);padding:0 12px;font-size:var(--w-font-size-medium,14px)}:where(.wendang-root,.wendang,.wendang-portal) .w-button--narrow{padding-inline:0}:where(.wendang-root,.wendang,.wendang-portal) .w-button--block{display:flex;width:100%}:where(.wendang-root,.wendang,.wendang-portal) .w-button--default{background:var(--w-surface-subtle,var(--color-surface-subtle,#f5f7fa));border-color:var(--w-border-strong,var(--color-border-strong,#b9c3d2));color:var(--w-text,var(--color-text,#1f2937))}:where(.wendang-root,.wendang,.wendang-portal) .w-button--default:not(:disabled):hover{background:color-mix(in srgb,var(--w-accent,#2f6feb) 7%,var(--w-surface-subtle,#f5f7fa));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb))}:where(.wendang-root,.wendang,.wendang-portal) .w-button--text{background:transparent;border-color:transparent;color:var(--w-text,var(--color-text,#1f2937))}:where(.wendang-root,.wendang,.wendang-portal) .w-button--text:not(:disabled):hover{background:color-mix(in srgb,currentColor 10%,transparent);color:var(--w-text,var(--color-text,#1f2937))}:where(.wendang-root,.wendang,.wendang-portal) .w-button--primary{background:var(--w-accent,var(--color-accent,#2f6feb));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:#fff}:where(.wendang-root,.wendang,.wendang-portal) .w-button--primary:not(:disabled):hover{background:color-mix(in srgb,var(--w-accent,#2f6feb) 88%,#000);border-color:color-mix(in srgb,var(--w-accent,#2f6feb) 88%,#000)}:where(.wendang-root,.wendang,.wendang-portal) .w-button--outline{background:transparent;border-color:var(--w-border,var(--color-border,#dce2eb));color:var(--w-text,var(--color-text,#1f2937))}:where(.wendang-root,.wendang,.wendang-portal) .w-button--outline:not(:disabled):hover{border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb))}:where(.wendang-root,.wendang,.wendang-portal) .w-button:disabled{opacity:.5;cursor:not-allowed}:where(.wendang-root,.wendang,.wendang-portal) .w-button.is-loading{cursor:progress;opacity:.75}:where(.wendang-root,.wendang,.wendang-portal) .w-button[aria-pressed=true]{background:var(--w-accent-soft,var(--color-accent-soft,#eaf1ff));border-color:var(--w-accent,var(--color-accent,#2f6feb));color:var(--w-accent,var(--color-accent,#2f6feb))}:where(.wendang-root,.wendang,.wendang-portal) .w-button__icon,:where(.wendang-root,.wendang,.wendang-portal) .w-button__spinner{display:inline-flex;align-items:center;justify-content:center;flex:none}:where(.wendang-root,.wendang,.wendang-portal) .w-button__label{display:inline-flex;align-items:center;gap:4px}:where(.wendang-root,.wendang,.wendang-portal) .w-button__label>svg,:where(.wendang-root,.wendang,.wendang-portal) .w-button__label>.wr-icon{flex:none}:where(.wendang-root,.wendang,.wendang-portal) .w-button__spinner svg{animation:w-button-spin .8s linear infinite}@keyframes w-button-spin{to{transform:rotate(360deg)}}:where(.wendang-root,.wendang,.wendang-portal) .w-button:focus-visible{outline:2px solid var(--w-accent,var(--color-accent,#2f6feb));outline-offset:1px}:where(.wendang-root,.wendang,.wendang-portal) .w-alert{display:flex;align-items:flex-start;gap:10px;padding:7px 10px;border:1px solid var(--w-border,var(--color-border));border-radius:var(--w-radius-md,6px);background:var(--w-accent-soft,var(--color-accent-soft));color:var(--w-text,var(--color-text));font-size:12px;margin-bottom:10px;flex:none;line-height:1.5}:where(.wendang-root,.wendang,.wendang-portal) .w-alert__icon{flex:none;line-height:1.5}:where(.wendang-root,.wendang,.wendang-portal) .w-alert__body{flex:1;min-width:0}:where(.wendang-root,.wendang,.wendang-portal) .w-alert--warning{background:color-mix(in srgb,var(--w-warning,#b76e00) 12%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-warning,#b76e00) 35%,var(--w-border,#dce2eb))}:where(.wendang-root,.wendang,.wendang-portal) .w-alert--danger{background:color-mix(in srgb,var(--w-danger,#cf3d48) 10%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-danger,#cf3d48) 32%,var(--w-border,#dce2eb))}:where(.wendang-root,.wendang,.wendang-portal) .w-alert--success{background:color-mix(in srgb,var(--w-success,#238353) 10%,var(--w-surface,#fff));border-color:color-mix(in srgb,var(--w-success,#238353) 32%,var(--w-border,#dce2eb))}:where(.wendang-root,.wendang,.wendang-portal) .w-popover{position:fixed;z-index:1400;max-width:min(320px,calc(100vw - 24px));max-height:min(70vh,520px);overflow:auto;min-width:160px;padding:4px;display:flex;flex-direction:column;gap:4px;background:var(--w-surface,var(--color-surface,#fff));border:1px solid var(--w-border,var(--color-border));border-radius:var(--w-radius-lg,8px);box-shadow:var(--w-shadow-pop);color:var(--w-text,var(--color-text))}:where(.wendang-root,.wendang,.wendang-portal) .w-popover .w-button{justify-content:flex-start;text-align:left;width:100%}:where(.wendang-root,.wendang,.wendang-portal) .w-popover--flush{padding:0}:where(.wendang-root,.wendang,.wendang-portal) .w-popover .wr-settings .w-button{width:auto}:where(.wendang-root,.wendang,.wendang-portal) .w-popover-group{padding:6px 8px 2px;font-size:11px;color:var(--color-text-faint)}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog-mask{position:fixed;inset:0;z-index:1100;display:flex;align-items:flex-start;justify-content:center;padding:10vh 16px 24px;background:color-mix(in srgb,#101828 42%,transparent);overflow-y:auto;overscroll-behavior:contain;box-sizing:border-box}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog-mask.is-fullscreen{padding:0;overflow:hidden}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog{position:relative;display:flex;flex-direction:column;width:520px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 14vh);border:1px solid var(--w-border,var(--color-border,#dce2eb));border-radius:var(--w-radius-lg,8px);background:var(--w-surface,var(--color-surface,#fff));color:var(--w-text,var(--color-text,#1f2937));box-shadow:0 24px 64px #10182833;outline:none;box-sizing:border-box}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog.is-fullscreen{width:100vw;max-width:none;height:100dvh;max-height:none;border:0;border-radius:0}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__header{display:flex;align-items:center;gap:12px;flex:none;padding:14px 18px 10px}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__title{flex:1;min-width:0;font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__close{flex:none;display:grid;place-items:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--w-radius-md,6px);background:transparent;color:var(--w-text-muted,var(--color-text-muted));cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__close:hover{background:var(--w-surface-subtle,#f5f7fa);color:var(--w-text,#1f2937)}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__body{flex:1;min-height:0;padding:4px 18px 18px;overflow:auto;display:flex;flex-direction:column;gap:12px}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog.is-fullscreen .w-dialog__body{padding:0;overflow:hidden}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog__footer{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:0 18px 16px}:where(.wendang-root,.wendang,.wendang-portal) .video-dialog{width:min(520px,calc(100vw - 32px))}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog label,:where(.wendang-root,.wendang,.wendang-portal) .wr-mind-panel label{display:flex;flex-direction:column;gap:6px;font-size:13px;margin-bottom:10px}:where(.wendang-root,.wendang,.wendang-portal) .w-dialog input,:where(.wendang-root,.wendang,.wendang-portal) .w-dialog textarea,:where(.wendang-root,.wendang,.wendang-portal) .wr-mind-panel textarea{width:100%;box-sizing:border-box}:where(.wendang-root,.wendang,.wendang-portal) .wr-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}:where(.wendang-root,.wendang,.wendang-portal) .wr-icon{display:block;flex:none}:where(.wendang-root,.wendang,.wendang-portal) .wr-document{position:relative;min-height:160px}:where(.wendang-root,.wendang,.wendang-portal) .wr-document-mount{min-width:0}:where(.wendang-root,.wendang,.wendang-portal) .wr-document .editor-canvas{outline:none;width:100%;max-width:var(--content-width);min-height:60vh;margin-inline:auto;padding-bottom:calc(var(--content-font-size,16px) * var(--content-line-height,1.75) + var(--space-block,12px))}:where(.wendang-root,.wendang,.wendang-portal) .wr-document-toolbar{margin-bottom:10px}:where(.wendang-root,.wendang,.wendang-portal) .block-plus{position:absolute;z-index:31;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid var(--color-border);border-radius:5px;background:var(--color-surface);color:var(--color-text-muted);cursor:pointer;padding:0;transition:background .12s,border-color .12s}:where(.wendang-root,.wendang,.wendang-portal) .block-plus:hover{color:var(--color-accent);border-color:var(--color-accent);background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .block-chip{position:absolute;z-index:31;display:flex;align-items:center;width:48px;height:28px;box-sizing:border-box;padding:1px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface);transition:border-color .12s}:where(.wendang-root,.wendang,.wendang-portal) .block-chip:hover{border-color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .chip-btn{width:22px;height:24px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--color-accent);cursor:pointer;padding:0;border-radius:3px}:where(.wendang-root,.wendang,.wendang-portal) .chip-btn:hover{color:var(--color-accent);background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .chip-grip{cursor:grab;color:var(--color-text-faint)}:where(.wendang-root,.wendang,.wendang-portal) .chip-grip:active{cursor:grabbing}:where(.wendang-root,.wendang,.wendang-portal) .block-anchor{position:absolute;z-index:45;overflow-anchor:none;pointer-events:auto}:where(.wendang-root,.wendang,.wendang-portal) .block-menu{width:208px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);padding:4px}:where(.wendang-root,.wendang,.wendang-portal) .bm-item{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border:0;border-radius:6px;background:transparent;cursor:pointer;font-size:13px;font-family:inherit;color:var(--color-text);text-align:left}:where(.wendang-root,.wendang,.wendang-portal) .bm-item:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .bm-item:focus-visible{outline:2px solid var(--color-accent);outline-offset:-2px}:where(.wendang-root,.wendang,.wendang-portal) .bm-item.active{color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .bm-item.disabled{opacity:.45;pointer-events:none}:where(.wendang-root,.wendang,.wendang-portal) .bm-item.danger{color:var(--color-danger)}:where(.wendang-root,.wendang,.wendang-portal) .bm-item span:first-of-type{flex:1}:where(.wendang-root,.wendang,.wendang-portal) .bm-chevron{margin-left:auto;opacity:.5}:where(.wendang-root,.wendang,.wendang-portal) .bm-sep{height:1px;background:var(--color-border);margin:4px 6px}:where(.wendang-root,.wendang,.wendang-portal) .block-submenu{position:absolute;z-index:1;width:208px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);padding:4px;max-height:calc(100dvh - 16px);overflow:auto}:where(.wendang-root,.wendang,.wendang-portal) .block-submenu-color{width:max-content;padding:12px}:where(.wendang-root,.wendang,.wendang-portal) .sel-toolbar{position:absolute;z-index:50;display:flex;align-items:center;gap:2px;padding:3px 4px;width:max-content;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);transform:translateY(-100%);overflow-anchor:none}:where(.wendang-root,.wendang,.wendang-portal) .tb-btn{display:flex;align-items:center;justify-content:center;gap:2px;flex:none;box-sizing:border-box;min-width:32px;height:32px;border:0;border-radius:5px;background:transparent;color:var(--color-text);font-size:16px;line-height:1;cursor:pointer;padding:0 5px}:where(.wendang-root,.wendang,.wendang-portal) .tb-btn:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .tb-btn.on{background:var(--color-accent-soft);color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .tb-btn:focus-visible{outline:2px solid var(--color-accent);outline-offset:1px}:where(.wendang-root,.wendang,.wendang-portal) .tb-sep{flex:none;width:1px;height:20px;background:var(--color-border);margin:0 4px}:where(.wendang-root,.wendang,.wendang-portal) .tb-color-wrap{position:relative}:where(.wendang-root,.wendang,.wendang-portal) .tb-panel{position:absolute;left:0;top:calc(100% + 8px);padding:12px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop)}:where(.wendang-root,.wendang,.wendang-portal) .document-color-panel{width:220px;display:flex;flex-direction:column;gap:12px}:where(.wendang-root,.wendang,.wendang-portal) .color-section{display:flex;flex-direction:column;gap:6px}:where(.wendang-root,.wendang,.wendang-portal) .color-label{color:var(--color-text-muted);font-size:12px;line-height:1.5}:where(.wendang-root,.wendang,.wendang-portal) .color-grid{display:grid;grid-template-columns:repeat(8,24px);gap:4px}:where(.wendang-root,.wendang,.wendang-portal) .color-choice{width:24px;min-width:24px;height:24px;padding:0;border:1px solid var(--color-border);border-radius:3px;background:var(--color-surface);cursor:pointer;display:flex;align-items:center;justify-content:center}:where(.wendang-root,.wendang,.wendang-portal) .color-choice.selected{border-color:var(--color-accent);outline:1px solid var(--color-accent);outline-offset:-1px}:where(.wendang-root,.wendang,.wendang-portal) .font-sample{font-size:16px;font-weight:500;line-height:1}:where(.wendang-root,.wendang,.wendang-portal) .background-choice{position:relative}:where(.wendang-root,.wendang,.wendang-portal) .img-toolbar{position:absolute;z-index:50;display:flex;align-items:center;gap:2px;padding:3px 4px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);transform:translate(-50%)}:where(.wendang-root,.wendang,.wendang-portal) .it-btn{display:flex;align-items:center;justify-content:center;min-width:28px;height:28px;border:0;border-radius:5px;background:transparent;color:var(--color-text);cursor:pointer;padding:0 5px}:where(.wendang-root,.wendang,.wendang-portal) .it-btn:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .it-btn.on{background:var(--color-accent-soft);color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .it-btn.danger{color:var(--color-danger)}:where(.wendang-root,.wendang,.wendang-portal) .it-btn.danger:hover{background:color-mix(in srgb,var(--color-danger) 12%,transparent)}:where(.wendang-root,.wendang,.wendang-portal) .it-sep{width:1px;height:18px;background:var(--color-border);margin:0 3px}:where(.wendang-root,.wendang,.wendang-portal) .slash-anchor{position:absolute;z-index:40;display:flex;align-items:flex-start;gap:6px}:where(.wendang-root,.wendang,.wendang-portal) .slash-menu{width:268px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);padding:4px}:where(.wendang-root,.wendang,.wendang-portal) .slash-content{padding:0 0 4px;max-height:min(560px,calc(100dvh - 26px));overflow-y:auto;overscroll-behavior:contain}:where(.wendang-root,.wendang,.wendang-portal) .slash-group{font-size:11px;color:var(--color-text-faint);padding:7px 8px 3px}:where(.wendang-root,.wendang,.wendang-portal) .slash-menu ul{list-style:none;margin:0;padding:0}:where(.wendang-root,.wendang,.wendang-portal) .slash-menu li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:14px;color:var(--color-text)}:where(.wendang-root,.wendang,.wendang-portal) .slash-menu li.active{background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .slash-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:where(.wendang-root,.wendang,.wendang-portal) .slash-hint{color:var(--color-text-faint);font-size:12px;flex:none}:where(.wendang-root,.wendang,.wendang-portal) .slash-chevron{color:var(--color-text-faint);flex:none}:where(.wendang-root,.wendang,.wendang-portal) .slash-empty{color:var(--color-text-faint);font-size:13px;text-align:center;padding:10px}:where(.wendang-root,.wendang,.wendang-portal) .insert-picker{position:absolute;z-index:46;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);padding:10px}:where(.wendang-root,.wendang,.wendang-portal) .ip-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;font-size:12px;color:var(--color-text-muted);margin-bottom:8px}:where(.wendang-root,.wendang,.wendang-portal) .ip-dim{color:var(--color-text-faint);flex:none}:where(.wendang-root,.wendang,.wendang-portal) .ip-grid{display:grid;grid-template-columns:repeat(8,18px);grid-auto-rows:18px;gap:3px}:where(.wendang-root,.wendang,.wendang-portal) .ip-cell{width:18px;height:18px;padding:0;border:1px solid var(--color-border);border-radius:3px;background:var(--color-surface-subtle);cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .ip-cell.on{background:var(--color-accent-soft);border-color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .ip-counts{display:flex;gap:6px}:where(.wendang-root,.wendang,.wendang-portal) .ip-count{display:flex;flex-direction:column;align-items:center;gap:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px;background:transparent;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .ip-count:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .ip-count.on{border-color:var(--color-accent);background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .ip-count-box{display:flex;gap:2px;width:34px;height:22px;padding:3px;border:1px solid var(--color-border-strong);border-radius:3px;background:var(--color-surface-subtle);box-sizing:border-box}:where(.wendang-root,.wendang,.wendang-portal) .ip-count-bar{flex:1 1 0;min-width:0;background:var(--color-border-strong);border-radius:1px}:where(.wendang-root,.wendang,.wendang-portal) .ip-count.on .ip-count-bar{background:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .ip-count-num{font-size:11px;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .ip-close{position:absolute;right:4px;top:4px;padding:2px;border:0;background:transparent;color:var(--color-text-faint);cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tbl-ui-host{position:absolute;left:0;top:0;width:0;height:0;pointer-events:none;z-index:30}:where(.wendang-root,.wendang,.wendang-portal) .tbl-ui-host>*{pointer-events:auto}:where(.wendang-root,.wendang,.wendang-portal) .tbl-corner{position:absolute;z-index:34;display:flex;width:44px;height:26px;padding:1px;box-sizing:border-box;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-corner button{width:20px;height:22px;padding:0;display:flex;align-items:center;justify-content:center;border:none;border-radius:3px;background:transparent;color:var(--color-accent);cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tbl-corner .tbl-grip{color:var(--color-text-faint);cursor:grab}:where(.wendang-root,.wendang,.wendang-portal) .tbl-corner .tbl-grip:active{cursor:grabbing}:where(.wendang-root,.wendang,.wendang-portal) .tbl-corner button:hover{background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis{position:absolute;z-index:35;padding:0;border:none;border-radius:5px;background:transparent;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis:before{content:"";position:absolute;border-radius:3px;background:var(--color-border-strong);box-shadow:0 0 0 2px var(--color-surface)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-row-axis{width:20px;height:24px;opacity:0}:where(.wendang-root,.wendang,.wendang-portal) .tbl-row-axis:before{left:8px;top:4px;width:4px;height:16px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-col-axis{width:24px;height:20px;opacity:0}:where(.wendang-root,.wendang,.wendang-portal) .tbl-col-axis:before{left:4px;top:8px;width:16px;height:4px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis.current,:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis:hover,:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis:focus-visible,:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis.on{opacity:1}:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis:hover:before,:where(.wendang-root,.wendang,.wendang-portal) .tbl-axis.on:before{background:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary{position:absolute;z-index:36;display:flex;justify-content:center;align-items:center;width:20px;height:20px;border:none;border-radius:50%;padding:0;background:transparent;color:transparent;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:before{content:"";position:absolute;width:4px;height:4px;border-radius:50%;background:var(--color-border-strong)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:hover,:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:focus-visible{color:#fff;background:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:hover:before,:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:focus-visible:before{display:none}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:after{content:"";position:absolute;pointer-events:none;background:var(--color-accent);display:none}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:hover:after,:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary:focus-visible:after{display:block}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary-row:after{left:14px;top:9px;width:var(--insert-length);height:2px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary-col:after{top:14px;left:9px;width:2px;height:var(--insert-length)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary>svg,:where(.wendang-root,.wendang,.wendang-portal) .tbl-boundary>.wr-icon{position:relative;z-index:1}:where(.wendang-root,.wendang,.wendang-portal) .tbl-selection-more{position:absolute;z-index:38;display:flex;align-items:center;justify-content:center;width:32px;height:20px;padding:0;line-height:12px;border:none;border-radius:6px;background:var(--color-accent);color:#fff;cursor:pointer;font-size:20px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-ui-host>.tbl-selection{position:absolute;z-index:32;border:2px solid var(--color-accent);border-radius:5px;box-sizing:border-box;pointer-events:none;box-shadow:0 0 0 1px var(--color-surface)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-cellbar{position:fixed;z-index:55;box-sizing:border-box;width:max-content;max-width:calc(100vw - 24px);background:var(--color-surface);border:1px solid var(--color-border);border-radius:10px;box-shadow:var(--shadow-pop);padding:6px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-tools{display:flex;gap:2px;align-items:center;flex-wrap:wrap}:where(.wendang-root,.wendang,.wendang-portal) .tool{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:2px;min-width:32px;height:32px;padding:0 5px;border:none;border-radius:5px;background:transparent;color:var(--color-text);font-size:15px;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tool:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .tool.on{background:var(--color-accent-soft);color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .tool[aria-disabled=true]{opacity:.3;cursor:not-allowed}:where(.wendang-root,.wendang,.wendang-portal) .color-tool{position:relative;padding-bottom:2px}:where(.wendang-root,.wendang,.wendang-portal) .color-bar{position:absolute;left:8px;right:8px;bottom:3px;height:2px;border-radius:1px;box-shadow:0 0 0 1px var(--color-surface)}:where(.wendang-root,.wendang,.wendang-portal) .tool-sep{flex:0 0 1px;height:20px;background:var(--color-border);margin:0 4px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-palette{z-index:60;display:flex;flex-direction:column;gap:8px;width:max-content;max-width:calc(100vw - 48px);padding:10px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop)}:where(.wendang-root,.wendang,.wendang-portal) .palette-head{display:flex;flex-direction:column;gap:2px;padding:0 2px}:where(.wendang-root,.wendang,.wendang-portal) .palette-title{font-size:13px;font-weight:600;color:var(--color-text)}:where(.wendang-root,.wendang,.wendang-portal) .palette-hint{font-size:11px;line-height:1.5;color:var(--color-text-muted);max-width:282px}:where(.wendang-root,.wendang,.wendang-portal) .palette-grid{display:grid;grid-template-columns:repeat(8,30px);gap:6px}:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu{z-index:60;width:176px;padding:6px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu button{display:flex;align-items:center;gap:10px;width:100%;min-height:36px;padding:6px 10px;border:none;border-radius:5px;background:transparent;color:var(--color-text);cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu button span{flex:1;text-align:left}:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu button:hover,:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu button:focus-visible{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-align-menu button[aria-checked=true]{color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .swatch{display:flex;align-items:center;justify-content:center;width:30px;height:30px;padding:4px;border:1px solid var(--color-border);border-radius:5px;background:var(--color-surface);cursor:pointer;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .swatch span{width:100%;height:100%;border-radius:2px}:where(.wendang-root,.wendang,.wendang-portal) .swatch .glyph{display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:15px;font-weight:500;line-height:1;border-radius:0}:where(.wendang-root,.wendang,.wendang-portal) .swatch:hover{border-color:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .swatch.selected{border-color:var(--color-accent);box-shadow:0 0 0 1px var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .tbl-ctx{z-index:80;padding:0;box-sizing:border-box;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-item{display:flex;align-items:center;gap:8px;width:100%;border:none;background:transparent;min-height:32px;padding:7px 10px;border-radius:6px;color:var(--color-text);cursor:pointer;text-align:left;font:inherit;font-size:13px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-item:hover{background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-item:focus-visible{outline:2px solid var(--color-accent);outline-offset:-2px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-item:disabled{opacity:.5;cursor:wait}:where(.wendang-root,.wendang,.wendang-portal) .ctx-chevron{margin-left:auto}:where(.wendang-root,.wendang,.wendang-portal) .ctx-styles{margin:2px 4px;padding-left:12px;border-left:1px solid var(--color-border)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-style-swatch{width:18px;height:14px;border:1px solid var(--color-border);border-radius:3px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-item.danger{color:var(--color-danger)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-sep{height:1px;background:var(--color-border);margin:4px 6px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-label{font-size:11px;color:var(--color-text-faint);padding:4px 8px 2px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-align{display:flex;gap:4px;padding:2px 6px 6px}:where(.wendang-root,.wendang,.wendang-portal) .al-btn{border:1px solid var(--color-border);background:var(--color-surface);border-radius:5px;padding:3px 6px;cursor:pointer;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .al-btn.on{border-color:var(--color-accent);color:var(--color-accent);background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-width{display:flex;align-items:center;gap:6px;padding:4px 8px}:where(.wendang-root,.wendang,.wendang-portal) .ctx-label-inline{color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-num{width:66px;padding:3px 6px;font-size:13px;border:1px solid var(--color-border);border-radius:5px;background:var(--color-surface);color:var(--color-text)}:where(.wendang-root,.wendang,.wendang-portal) .ctx-mini{border:1px solid var(--color-border);background:var(--color-surface);border-radius:5px;padding:3px 8px;font-size:12px;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .ctx-mini.primary{background:var(--color-accent);border-color:var(--color-accent);color:#fff}:where(.wendang-root,.wendang,.wendang-portal) .faint{color:var(--color-text-faint)}:where(.wendang-root,.wendang,.wendang-portal) .small{font-size:11px}:where(.wendang-root,.wendang,.wendang-portal) .wr-link-popover{position:fixed;z-index:1450;padding:8px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-surface);box-shadow:var(--shadow-pop);max-width:calc(100vw - 16px);font-size:13px}:where(.wendang-root,.wendang,.wendang-portal) .wr-link-popover input{min-width:250px}:where(.wendang-root,.wendang,.wendang-portal) .wr-link-popover a{max-width:350px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:where(.wendang-root,.wendang,.wendang-portal) .callout-controls{display:contents}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-button{justify-self:start;background:transparent;border-color:transparent;margin:0;cursor:default}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-button:not(:disabled){cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .callout-toolbar{position:absolute;bottom:calc(100% + 4px);right:0;z-index:25;display:flex;align-items:center;gap:4px;padding:4px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop);opacity:0;visibility:hidden;transition:opacity .1s}:where(.wendang-root,.wendang,.wendang-portal) .doc-callout:hover>.callout-controls-host .callout-toolbar,:where(.wendang-root,.wendang,.wendang-portal) .doc-callout:focus-within>.callout-controls-host .callout-toolbar,:where(.wendang-root,.wendang,.wendang-portal) .callout-toolbar.is-open{opacity:1;visibility:visible}:where(.wendang-root,.wendang,.wendang-portal) .callout-toolbar-button{min-width:32px}:where(.wendang-root,.wendang,.wendang-portal) .callout-palette-button{width:32px;min-width:32px;padding:0}:where(.wendang-root,.wendang,.wendang-portal) .callout-toolbar-divider{height:16px;border-left:1px solid var(--color-border);margin:0 3px}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-panel{width:max-content;display:flex;flex-direction:column;gap:12px;padding:2px}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-label{font-size:12px;margin-bottom:6px;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-grid{display:grid;grid-template-columns:repeat(8,26px);gap:5px}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-choice{position:relative;width:26px;height:26px;padding:0;border:1px solid var(--color-border);border-radius:4px;background:var(--color-surface);cursor:pointer;overflow:hidden;font-size:12px;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .callout-color-choice.is-selected{outline:2px solid var(--color-accent);outline-offset:1px}:where(.wendang-root,.wendang,.wendang-portal) .callout-font-sample{font-size:16px;line-height:1;color:inherit}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-picker{width:254px;box-sizing:border-box;padding:8px 10px 6px}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-grid{display:grid;grid-template-columns:repeat(6,34px);gap:6px}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-choice{width:34px;height:34px;padding:0;border:0;border-radius:5px;background:transparent;font-size:20px;cursor:pointer}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-choice:hover,:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-choice[aria-pressed=true]{background:var(--color-accent-soft)}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-footer{display:flex;gap:8px;margin-top:10px;padding-top:8px;border-top:1px solid var(--color-border)}:where(.wendang-root,.wendang,.wendang-portal) .callout-icon-footer .w-button{flex:1;justify-content:center}:where(.wendang-root,.wendang,.wendang-portal) .wr-block-drop-line{position:fixed;z-index:1300;height:2px;pointer-events:none;background:var(--color-accent);border-radius:1px}:where(.wendang-root,.wendang,.wendang-portal) .wr-block-drop-line:before{content:"";position:absolute;left:-3px;top:-3px;width:8px;height:8px;border-radius:50%;background:var(--color-accent)}:where(.wendang-root,.wendang,.wendang-portal) .wr-block-handle{position:absolute;left:0;z-index:25}:where(.wendang-root,.wendang,.wendang-portal) .wr-block-menu,:where(.wendang-root,.wendang,.wendang-portal) .wr-insert-menu{position:sticky;bottom:10px;z-index:40;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;padding:10px;box-shadow:var(--shadow-pop);max-height:360px;overflow:auto}:where(.wendang-root,.wendang,.wendang-portal) .wr-insert-menu{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:5px}:where(.wendang-root,.wendang,.wendang-portal) .wr-insert-menu header{display:flex;justify-content:space-between;grid-column:1/-1}:where(.wendang-root,.wendang,.wendang-portal) .wr-image{max-width:100%;height:auto;cursor:zoom-in}:where(.wendang-root,.wendang,.wendang-portal) .wr-image-preview{max-width:100%;max-height:70vh;object-fit:contain}:where(.wendang-root,.wendang,.wendang-portal) .wr-media-placeholder{display:inline-flex;min-height:100px;align-items:center;justify-content:center;background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .wr-code>header{display:flex;justify-content:space-between;background:var(--color-surface-subtle);padding:6px 10px;font-size:12px}:where(.wendang-root,.wendang,.wendang-portal) .wr-video iframe{width:100%;height:350px;border:0}:where(.wendang-root,.wendang,.wendang-portal) .doc-file-card video{max-width:100%}:where(.wendang-root,.wendang,.wendang-portal) .wr-spreadsheet{height:100%;min-height:360px;position:relative;display:flex;flex-direction:column}:where(.wendang-root,.wendang,.wendang-portal) .wr-sheet-engine{flex:1;min-height:300px}:where(.wendang-root,.wendang,.wendang-portal) .worksheet-preview{border:1px solid var(--color-border);border-radius:8px;overflow:hidden;background:var(--color-surface)}:where(.wendang-root,.wendang,.wendang-portal) .worksheet-preview-standalone{display:flex;flex-direction:column;flex:1;min-height:0;border:0;border-radius:0}:where(.wendang-root,.wendang,.wendang-portal) .worksheet-preview-standalone .sheet-table{flex:1;min-height:0;max-height:none}:where(.wendang-root,.wendang,.wendang-portal) .sheet-tabs{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:8px;font-size:12px}:where(.wendang-root,.wendang,.wendang-portal) .sheet-note{color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table{overflow:auto;max-height:600px;outline:none}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table table{border-collapse:collapse;table-layout:fixed;width:max-content;font-size:13px}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table th,:where(.wendang-root,.wendang,.wendang-portal) .sheet-table td{border:1px solid var(--color-border);padding:3px 6px;overflow:hidden;white-space:pre-wrap;overflow-wrap:anywhere;vertical-align:top}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table th{background:var(--color-surface-subtle);font-weight:500;color:var(--color-text-muted)}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table thead{position:sticky;top:0;z-index:1}:where(.wendang-root,.wendang,.wendang-portal) .sheet-table tr>th:first-child{min-width:40px;text-align:center}:where(.wendang-root,.wendang,.wendang-portal) .sheet-paging{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:8px;font-size:12px;color:var(--color-text-faint)}:where(.wendang-root,.wendang,.wendang-portal) .sheet-paging>span{flex:1}:where(.wendang-root,.wendang,.wendang-portal) .sheet-view-note{flex:none;margin:0;padding:6px 8px;font-size:12px;color:var(--color-text-muted);background:var(--color-surface-subtle)}:where(.wendang-root,.wendang,.wendang-portal) .wr-mind-editor{height:100%;min-height:380px;min-width:0}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-layers{position:absolute;left:0;top:0;transform-origin:0 0}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-edges{position:absolute;left:0;top:0;width:1px;height:1px;overflow:visible;pointer-events:none}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-stage{touch-action:none}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-surface{position:absolute;inset:0}:where(.wendang-root,.wendang,.wendang-portal) .mind-node-actions,:where(.wendang-root,.wendang,.wendang-portal) .mind-selection-summary,:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-bottom{z-index:5}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-notice{z-index:6}:where(.wendang-root,.wendang,.wendang-portal) .mind-context-menu{position:fixed;z-index:1400;padding:0;min-width:160px;max-height:calc(100vh - 16px);overflow:auto;background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;box-shadow:var(--shadow-pop)}:where(.wendang-root,.wendang,.wendang-portal) .mind-side-projection{pointer-events:none}:where(.wendang-root,.wendang,.wendang-portal) .mind-canvas-fullscreen .wd-dialog__body{overflow:hidden}:where(.wendang-root,.wendang,.wendang-portal) .w-popover .mind-settings-menu .w-button{width:auto}:where(.wendang-root,.wendang,.wendang-portal) .mind-space-pan,:where(.wendang-root,.wendang,.wendang-portal) .mind-space-pan .mind-topic{cursor:grab}:where(.wendang-root,.wendang,.wendang-portal) .mind-peer-badge{position:absolute;right:4px;top:4px;padding:1px 5px;border-radius:9px;background:var(--color-accent);color:#fff;font-size:10px;line-height:14px;pointer-events:none}:where(.wendang-root,.wendang,.wendang-portal) .wr-settings{display:flex;flex-direction:column;gap:8px}@media(max-width:760px){:where(.wendang-root,.wendang,.wendang-portal) .wr-mind-hint{display:none}:where(.wendang-root,.wendang,.wendang-portal) .wr-mind-panel{flex-basis:210px}}:where(.wendang-root,.wendang,.wendang-portal) .w-popover.w-select-popup,:where(.wendang-root,.wendang,.wendang-portal) .w-popover.code-settings-popup,:where(.wendang-root,.wendang,.wendang-portal) .w-popover.code-tooltip-popup,:where(.wendang-root,.wendang,.wendang-portal) .w-popover.mind-dropdown-popup{box-sizing:border-box;min-width:0;max-width:calc(100vw - 16px);max-height:calc(100dvh - 16px);padding:0;display:block;overflow:visible;gap:0;overflow-anchor:none}