markstream-solid 0.0.0-stage → 2.0.23

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 (102) hide show
  1. package/README.md +120 -2
  2. package/dist/client/extended-BTbixd9o.js +38 -0
  3. package/dist/client/index.js +5640 -0
  4. package/dist/client/katexWorkerClient-ZLzkPVv_.js +260 -0
  5. package/dist/client/languageIcon-CDTPjsAQ.js +280 -0
  6. package/dist/client/mermaidWorkerClient-BAvGYsCO.js +243 -0
  7. package/dist/client/utils/index.js +31 -0
  8. package/dist/client/utils/katex-threshold.js +32 -0
  9. package/dist/client/utils/performance-monitor.js +73 -0
  10. package/dist/client/utils/safeRaf.js +27 -0
  11. package/dist/client/workers/katexCdnWorker.js +177 -0
  12. package/dist/client/workers/katexRenderer.worker.js +45 -0
  13. package/dist/client/workers/katexWorkerClient.js +16 -0
  14. package/dist/client/workers/mermaidCdnWorker.js +226 -0
  15. package/dist/client/workers/mermaidParser.worker.js +73 -0
  16. package/dist/client/workers/mermaidWorkerClient.js +13 -0
  17. package/dist/components/BuiltinNodes.d.ts +42 -0
  18. package/dist/components/CodeBlockNode.d.ts +10 -0
  19. package/dist/components/DiagramBlockNode.d.ts +27 -0
  20. package/dist/components/HtmlPreviewFrame.d.ts +10 -0
  21. package/dist/components/MarkstreamProvider.d.ts +5 -0
  22. package/dist/components/MarkstreamVirtualTimeline.d.ts +35 -0
  23. package/dist/components/MathNode.d.ts +6 -0
  24. package/dist/components/NodeRenderer.d.ts +27 -0
  25. package/dist/components/NodeSlot.d.ts +11 -0
  26. package/dist/components/PreCodeBlock.d.ts +3 -0
  27. package/dist/components/PreCodeNode.d.ts +9 -0
  28. package/dist/components/RenderNode.d.ts +11 -0
  29. package/dist/components/StreamingTextNode.d.ts +2 -0
  30. package/dist/components/ToolbarButton.d.ts +14 -0
  31. package/dist/components/ToolbarIcon.d.ts +18 -0
  32. package/dist/components/Tooltip.d.ts +13 -0
  33. package/dist/components/lifecycle.d.ts +6 -0
  34. package/dist/components/mathHeightCache.d.ts +5 -0
  35. package/dist/components/rendererModeDefaults.d.ts +4 -0
  36. package/dist/components/shared/diagram-height.d.ts +16 -0
  37. package/dist/components/shared/node-helpers.d.ts +78 -0
  38. package/dist/components/shared/node-outlet-helpers.d.ts +10 -0
  39. package/dist/components/shared/render-window.d.ts +18 -0
  40. package/dist/components/shared/reuseParsedNodes.d.ts +3 -0
  41. package/dist/components/viewport.d.ts +5 -0
  42. package/dist/components/virtualLayoutKey.d.ts +13 -0
  43. package/dist/configuration.d.ts +9 -0
  44. package/dist/customComponents.d.ts +36 -0
  45. package/dist/enhanceRenderedHtml.d.ts +25 -0
  46. package/dist/hydrateCustomTagContent.d.ts +2 -0
  47. package/dist/i18n/useSafeI18n.d.ts +4 -0
  48. package/dist/icon-themes/index.d.ts +2 -0
  49. package/dist/icon-themes/material/core.d.ts +2 -0
  50. package/dist/icon-themes/material/extended.d.ts +2 -0
  51. package/dist/icon-themes/material/index.d.ts +2 -0
  52. package/dist/icon-themes/registry.d.ts +9 -0
  53. package/dist/icon-themes/types.d.ts +11 -0
  54. package/dist/index.css +3279 -0
  55. package/dist/index.d.ts +48 -0
  56. package/dist/index.px.css +3279 -0
  57. package/dist/index.tailwind.css +3279 -0
  58. package/dist/optional/d2.d.ts +17 -0
  59. package/dist/optional/infographic.d.ts +31 -0
  60. package/dist/optional/katex.d.ts +9 -0
  61. package/dist/optional/mermaid.d.ts +27 -0
  62. package/dist/optional/streamDiffs.d.ts +29 -0
  63. package/dist/renderMarkdownHtml.d.ts +30 -0
  64. package/dist/sanitizeHtmlContent.d.ts +2 -0
  65. package/dist/server/extended-CKyCqQt3.js +69 -0
  66. package/dist/server/index.js +6264 -0
  67. package/dist/server/languageIcon-TXkIEBPf.js +353 -0
  68. package/dist/server/utils/index.js +31 -0
  69. package/dist/server/utils/katex-threshold.js +41 -0
  70. package/dist/server/utils/performance-monitor.js +120 -0
  71. package/dist/server/utils/safeRaf.js +28 -0
  72. package/dist/server/workers/katexCdnWorker.js +190 -0
  73. package/dist/server/workers/katexWorkerClient.js +373 -0
  74. package/dist/server/workers/mermaidCdnWorker.js +238 -0
  75. package/dist/server/workers/mermaidWorkerClient.js +333 -0
  76. package/dist/streamDiffsWorker.d.ts +72 -0
  77. package/dist/tailwind.d.ts +2 -0
  78. package/dist/tailwind.js +3 -0
  79. package/dist/tooltip/singletonTooltip.d.ts +7 -0
  80. package/dist/types/component-props.d.ts +253 -0
  81. package/dist/types/node-renderer-props.d.ts +333 -0
  82. package/dist/useSmoothMarkdownStream.d.ts +22 -0
  83. package/dist/utils/clipboard.d.ts +1 -0
  84. package/dist/utils/d2RenderSalt.d.ts +1 -0
  85. package/dist/utils/footnoteTarget.d.ts +1 -0
  86. package/dist/utils/index.d.ts +8 -0
  87. package/dist/utils/katex-threshold.d.ts +20 -0
  88. package/dist/utils/languageIcon.d.ts +8 -0
  89. package/dist/utils/mermaidRenderId.d.ts +1 -0
  90. package/dist/utils/normalizeKaTeXRenderInput.d.ts +1 -0
  91. package/dist/utils/performance-monitor.d.ts +121 -0
  92. package/dist/utils/resolveLanguageIcon.d.ts +2 -0
  93. package/dist/utils/safeRaf.d.ts +2 -0
  94. package/dist/utils/virtualItemMeasurement.d.ts +5 -0
  95. package/dist/virtual-adapter.d.ts +165 -0
  96. package/dist/workers/katexCdnWorker.d.ts +20 -0
  97. package/dist/workers/katexRenderer.worker.d.ts +1 -0
  98. package/dist/workers/katexWorkerClient.d.ts +35 -0
  99. package/dist/workers/mermaidCdnWorker.d.ts +15 -0
  100. package/dist/workers/mermaidParser.worker.d.ts +1 -0
  101. package/dist/workers/mermaidWorkerClient.d.ts +15 -0
  102. package/package.json +149 -3
@@ -0,0 +1,3279 @@
1
+ /* Minimal, safe defaults to reduce flicker during frequent text updates */
2
+ :is(.markstream-vue, .markstream-solid) pre[class^='language-'],
3
+ :is(.markstream-vue, .markstream-solid) pre[class*=' language-'] {
4
+ /* Ensure code layout is stable */
5
+ white-space: pre;
6
+ overflow: auto;
7
+ -moz-tab-size: var(--markstream-code-tab-size, 4);
8
+ -o-tab-size: var(--markstream-code-tab-size, 4);
9
+ tab-size: var(--markstream-code-tab-size, 4);
10
+ font-variant-ligatures: none;
11
+ /* Isolate painting/layout to this block to avoid ancestor reflow jank */
12
+ contain: content;
13
+ /* Hint GPU compositing on WebKit/Blink to reduce paint flashing */
14
+ backface-visibility: hidden;
15
+ transform: translateZ(0);
16
+ -webkit-font-smoothing: antialiased;
17
+ }
18
+ :is(.markstream-vue, .markstream-solid) pre[class^='language-'] > code,
19
+ :is(.markstream-vue, .markstream-solid) pre[class*=' language-'] > code {
20
+ display: block;
21
+ }
22
+
23
+ :is(.markstream-vue, .markstream-solid) pre[data-markstream-pre='1']:not(.markstream-pre--diff-preview) {
24
+ background: var(--markstream-code-fallback-bg, var(--markstream-code-theme-bg, var(--code-bg)));
25
+ color: var(--markstream-code-fallback-fg, var(--markstream-code-theme-fg, var(--code-fg)));
26
+ }
27
+
28
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers {
29
+ position: relative;
30
+ }
31
+
32
+ :is(.markstream-vue, .markstream-solid) pre.code-pre-fallback[data-markstream-code-loading='1'] {
33
+ --markstream-pre-line-number-top: var(--markstream-code-padding-y, 8px);
34
+ --markstream-pre-line-number-left: 0px;
35
+ --markstream-pre-line-number-width: 2ch;
36
+ --markstream-pre-line-number-padding-left: 2ch;
37
+ --markstream-pre-line-number-padding-right: 1ch;
38
+ --markstream-pre-line-number-separator-width: 2px;
39
+ --markstream-code-padding-left: calc(2ch + 2ch + 1ch + 2px + 1ch);
40
+ box-sizing: border-box;
41
+ width: 100%;
42
+ margin: 0;
43
+ padding: var(--markstream-code-padding-y, 8px) var(--markstream-code-padding-x, 1ch);
44
+ padding-left: var(--markstream-code-padding-left);
45
+ overflow: auto;
46
+ border: 0;
47
+ border-radius: 0;
48
+ background: var(--markstream-code-fallback-bg, var(--markstream-code-theme-bg, var(--code-bg)));
49
+ color: var(--markstream-code-fallback-fg, var(--markstream-code-theme-fg, var(--code-fg)));
50
+ font-family: var(--markstream-code-font-family, \"SF Mono\", Monaco, Consolas, \"Ubuntu Mono\", \"Liberation Mono\", \"Courier New\", monospace);
51
+ font-size: var(--vscode-editor-font-size, 12px);
52
+ line-height: var(--vscode-editor-line-height, 18px);
53
+ }
54
+
55
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__line-numbers {
56
+ position: absolute;
57
+ top: var(--markstream-pre-line-number-top, 0);
58
+ left: var(--markstream-pre-line-number-left, 0);
59
+ box-sizing: content-box;
60
+ display: flex;
61
+ flex-direction: column;
62
+ align-items: flex-end;
63
+ width: var(--markstream-pre-line-number-width, 2ch);
64
+ min-width: var(--markstream-pre-line-number-width, 2ch);
65
+ padding-left: var(--markstream-pre-line-number-padding-left, 2ch);
66
+ padding-right: var(--markstream-pre-line-number-padding-right, 1ch);
67
+ border-right: var(--markstream-pre-line-number-separator-width, 2px) solid transparent;
68
+ color: var(--code-line-number);
69
+ font: inherit;
70
+ font-variant-numeric: tabular-nums;
71
+ line-height: inherit;
72
+ pointer-events: none;
73
+ -webkit-user-select: none;
74
+ -moz-user-select: none;
75
+ user-select: none;
76
+ }
77
+
78
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers:not(.markstream-pre--diff-preview):not(.code-pre-fallback) > .markstream-pre__code {
79
+ box-sizing: border-box;
80
+ min-width: 100%;
81
+ padding-left: var(--markstream-code-padding-left, 52px);
82
+ padding-right: var(--markstream-code-padding-x, 12px);
83
+ }
84
+
85
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__code--wrapped {
86
+ white-space: pre-wrap;
87
+ }
88
+
89
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__code--wrapped > .markstream-pre__logical-line {
90
+ position: relative;
91
+ display: block;
92
+ min-height: 1lh;
93
+ }
94
+
95
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__code--wrapped > .markstream-pre__logical-line::before {
96
+ position: absolute;
97
+ left: calc(-1 * var(--markstream-code-padding-left, 52px));
98
+ box-sizing: content-box;
99
+ width: var(--markstream-pre-line-number-width, 2ch);
100
+ padding-left: var(--markstream-pre-line-number-padding-left, 2ch);
101
+ color: var(--code-line-number);
102
+ font: inherit;
103
+ font-variant-numeric: tabular-nums;
104
+ line-height: inherit;
105
+ text-align: right;
106
+ white-space: pre;
107
+ content: attr(data-line-number);
108
+ pointer-events: none;
109
+ -webkit-user-select: none;
110
+ -moz-user-select: none;
111
+ user-select: none;
112
+ }
113
+
114
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__line-numbers > .markstream-pre__line-number {
115
+ display: block;
116
+ min-height: 1lh;
117
+ }
118
+
119
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--line-numbers > .markstream-pre__line-numbers > .markstream-pre__line-numbers-text {
120
+ display: block;
121
+ min-height: 1lh;
122
+ text-align: right;
123
+ white-space: pre;
124
+ }
125
+
126
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview {
127
+ box-sizing: border-box;
128
+ /* The diff rows manage their own number-column padding, so the pre itself
129
+ must not add another left padding. `!important` so the loading-placeholder
130
+ rule (`pre[data-markstream-code-loading='1']`) cannot double-count it. */
131
+ padding-left: 0 !important;
132
+ padding-right: 0 !important;
133
+ width: 100%;
134
+
135
+ --markstream-pre-diff-gutter-marker-width: 4px;
136
+ --markstream-pre-diff-gutter-gap: 1ch;
137
+ --markstream-pre-diff-code-gap: 1ch;
138
+ --markstream-pre-diff-code-padding: 0px;
139
+ --markstream-diff-added-fg: var(--diff-added-fg, #2f8f68);
140
+ --markstream-diff-removed-fg: var(--diff-removed-fg, #c24141);
141
+ --markstream-diff-added-line-fill: var(--diff-added-bg, rgb(47 143 104 / 12%));
142
+ --markstream-diff-removed-line-fill: var(--diff-removed-bg, rgb(194 65 65 / 12%));
143
+ --markstream-diff-added-gutter: linear-gradient(
144
+ 90deg,
145
+ var(--markstream-diff-added-fg) 0 var(--markstream-pre-diff-gutter-marker-width),
146
+ transparent var(--markstream-pre-diff-gutter-marker-width) 100%
147
+ );
148
+ --markstream-diff-removed-gutter: linear-gradient(
149
+ 90deg,
150
+ var(--markstream-diff-removed-fg) 0 var(--markstream-pre-diff-gutter-marker-width),
151
+ transparent var(--markstream-pre-diff-gutter-marker-width) 100%
152
+ );
153
+ --markstream-pre-diff-line-number-width: 2ch;
154
+ --markstream-pre-diff-line-number-padding-left: 2ch;
155
+ --markstream-pre-diff-line-number-padding-right: 1ch;
156
+ --markstream-pre-diff-line-number-separator-width: 2px;
157
+ --markstream-pre-diff-pane-min-width: 225px;
158
+ --markstream-pre-diff-line-number-box-width: calc(
159
+ var(--markstream-pre-diff-line-number-padding-left)
160
+ + var(--markstream-pre-diff-line-number-width)
161
+ + var(--markstream-pre-diff-line-number-padding-right)
162
+ + var(--markstream-pre-diff-line-number-separator-width)
163
+ );
164
+ --markstream-pre-diff-line-number-bg: var(--markstream-diff-line-number-bg, transparent);
165
+ --markstream-pre-diff-line-number-gap-to-code: var(--markstream-pre-diff-code-gap);
166
+ --markstream-pre-diff-line-number-left: 0px;
167
+ --markstream-pre-diff-line-number-align: var(--markstream-diff-line-number-align, right);
168
+ --markstream-pre-diff-code-fill-left: calc(
169
+ var(--markstream-pre-diff-line-number-left)
170
+ + var(--markstream-pre-diff-line-number-box-width)
171
+ );
172
+ --markstream-pre-diff-code-left: calc(
173
+ var(--markstream-pre-diff-code-fill-left)
174
+ + var(--markstream-pre-diff-line-number-gap-to-code)
175
+ + var(--markstream-pre-diff-code-padding)
176
+ );
177
+ }
178
+
179
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview::-webkit-scrollbar {
180
+ width: 12px;
181
+ height: 12px;
182
+ }
183
+
184
+ :is(.markstream-vue, .markstream-solid) pre.code-pre-fallback.markstream-pre--diff-preview.markstream-pre--diff-inline:not(.is-wrap) {
185
+ scrollbar-width: none;
186
+ }
187
+
188
+ :is(.markstream-vue, .markstream-solid) pre.code-pre-fallback.markstream-pre--diff-preview.markstream-pre--diff-inline:not(.is-wrap)::-webkit-scrollbar {
189
+ width: 0;
190
+ height: 0;
191
+ }
192
+
193
+ :is(.markstream-vue, .markstream-solid) pre.is-wrap {
194
+ white-space: pre-wrap;
195
+ overflow-wrap: anywhere;
196
+ word-break: normal;
197
+ }
198
+
199
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-inline {
200
+ --markstream-pre-diff-line-number-gap-to-code: var(--markstream-pre-diff-code-gap);
201
+ --markstream-pre-diff-line-number-left: 0px;
202
+ }
203
+
204
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview > .markstream-pre__diff-code {
205
+ display: grid;
206
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
207
+ font: inherit;
208
+ line-height: inherit;
209
+ min-width: 100%;
210
+ width: 100%;
211
+ }
212
+
213
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.is-wrap > .markstream-pre__diff-code {
214
+ grid-template-columns: minmax(var(--markstream-pre-diff-pane-min-width, 225px), 1fr) minmax(var(--markstream-pre-diff-pane-min-width, 225px), 1fr);
215
+ }
216
+
217
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-inline > .markstream-pre__diff-code {
218
+ grid-template-columns: minmax(0, 1fr);
219
+ }
220
+
221
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-inline:not(.is-wrap) > .markstream-pre__diff-code {
222
+ grid-template-columns: minmax(100%, max-content);
223
+ width: 100%;
224
+ min-width: -moz-max-content;
225
+ min-width: max-content;
226
+ }
227
+
228
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-pane {
229
+ min-width: 0;
230
+ overflow: hidden;
231
+ }
232
+
233
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.is-wrap):not(.markstream-pre--diff-inline) .markstream-pre__diff-pane {
234
+ overflow-x: auto;
235
+ overflow-y: hidden;
236
+ }
237
+
238
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-pane-content {
239
+ display: block;
240
+ min-width: 100%;
241
+ }
242
+
243
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.is-wrap):not(.markstream-pre--diff-inline) .markstream-pre__diff-pane-content {
244
+ width: -moz-max-content;
245
+ width: max-content;
246
+ }
247
+
248
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-inline:not(.is-wrap) .markstream-pre__diff-pane {
249
+ min-width: -moz-max-content;
250
+ min-width: max-content;
251
+ width: 100%;
252
+ overflow: visible;
253
+ }
254
+
255
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-pane--modified {
256
+ --markstream-pre-diff-line-number-gap-to-code: var(--markstream-pre-diff-code-gap);
257
+ --markstream-pre-diff-line-number-left: 0px;
258
+ /* The finalized highlight surface separates its split columns with a clean
259
+ background gap (pierre's 1ch line paddings plus background-colored column
260
+ borders), not a colored 1px divider line. Keep the pre fallback visually
261
+ identical: drop the divider so the middle between the two columns reads
262
+ as a 2ch white gap. */
263
+ box-shadow: none;
264
+ }
265
+
266
+ /* Match the finalized highlight surface's 2ch white split divider: pierre's
267
+ split lines carry 1ch inline padding on each side of the code content. The
268
+ left pane mirrors the text's 1ch right padding toward the seam; the right
269
+ pane already spaces its text 1ch past the line-number gutter
270
+ (`--markstream-pre-diff-line-number-gap-to-code`), so no extra left padding
271
+ is added there — adding one would push the right column's content one `ch`
272
+ away from the line numbers compared with the highlight surface. */
273
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.markstream-pre--diff-inline) .markstream-pre__diff-pane--original .markstream-pre__diff-line:not(.markstream-pre__diff-line--collapsed) .markstream-pre__diff-content {
274
+ padding-right: 1ch;
275
+ }
276
+
277
+ /* Split view: the collapsed "N unmodified lines" pill must read as ONE
278
+ continuous pill spanning both columns (pierre's split separators meet at the
279
+ middle divider). The left pane extends its pill flush to its right edge and
280
+ the right pane starts flush at its own left edge, so the two halves abut
281
+ exactly at the column seam; the inner corners are squared so there is no
282
+ notch where they meet. */
283
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.markstream-pre--diff-inline) .markstream-pre__diff-pane--original .markstream-pre__diff-line--collapsed::before {
284
+ right: 0px;
285
+ border-top-right-radius: 0px;
286
+ border-bottom-right-radius: 0px;
287
+ }
288
+
289
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.markstream-pre--diff-inline) .markstream-pre__diff-pane--modified .markstream-pre__diff-line--collapsed::before {
290
+ left: 0px;
291
+ border-top-left-radius: 0px;
292
+ border-bottom-left-radius: 0px;
293
+ }
294
+
295
+ /* The modified (right) pane's collapsed row is only the empty half of the
296
+ continuous pill — the finalized surface renders the "N unmodified lines"
297
+ widget once on the original side. Hide the duplicated chevron/icon so the
298
+ right half stays clean (matches the highlight surface). */
299
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview:not(.markstream-pre--diff-inline) .markstream-pre__diff-pane--modified .markstream-pre__diff-line--collapsed > .markstream-pre__diff-collapsed-icon {
300
+ display: none;
301
+ }
302
+
303
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line {
304
+ position: relative;
305
+ display: block;
306
+ box-sizing: border-box;
307
+ width: 100%;
308
+ min-width: 100%;
309
+ min-height: var(
310
+ --markstream-pre-diff-synced-row-height,
311
+ var(--markstream-pre-diff-line-height, 18px)
312
+ );
313
+ padding-left: var(--markstream-pre-diff-code-left);
314
+ line-height: var(--markstream-pre-diff-line-height, 18px);
315
+ }
316
+
317
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line::before {
318
+ content: '';
319
+ position: absolute;
320
+ left: var(--markstream-pre-diff-code-fill-left);
321
+ right: 0;
322
+ top: 0;
323
+ height: var(
324
+ --markstream-pre-diff-synced-row-height,
325
+ var(--markstream-pre-diff-line-height, 18px)
326
+ );
327
+ z-index: 0;
328
+ pointer-events: none;
329
+ border-radius: 0;
330
+ background: transparent;
331
+ }
332
+
333
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line::after {
334
+ content: '';
335
+ position: absolute;
336
+ left: var(--markstream-pre-diff-line-number-left);
337
+ top: 0;
338
+ width: var(--markstream-pre-diff-line-number-box-width);
339
+ height: var(
340
+ --markstream-pre-diff-synced-row-height,
341
+ var(--markstream-pre-diff-line-height, 18px)
342
+ );
343
+ z-index: 0;
344
+ pointer-events: none;
345
+ background: var(--markstream-pre-diff-line-number-bg);
346
+ box-shadow: none;
347
+ }
348
+
349
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-rail {
350
+ position: absolute;
351
+ z-index: 2;
352
+ top: 0;
353
+ left: 0;
354
+ height: var(
355
+ --markstream-pre-diff-synced-row-height,
356
+ var(--markstream-pre-diff-line-height, 18px)
357
+ );
358
+ width: var(--markstream-pre-diff-gutter-marker-width, 4px);
359
+ min-width: var(--markstream-pre-diff-gutter-marker-width, 4px);
360
+ }
361
+
362
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-number {
363
+ position: absolute;
364
+ z-index: 1;
365
+ top: 0;
366
+ left: var(--markstream-pre-diff-line-number-left);
367
+ width: var(--markstream-pre-diff-line-number-width);
368
+ min-width: var(--markstream-pre-diff-line-number-width);
369
+ height: var(
370
+ --markstream-pre-diff-synced-row-height,
371
+ var(--markstream-pre-diff-line-height, 18px)
372
+ );
373
+ box-sizing: content-box;
374
+ background: var(--markstream-pre-diff-line-number-bg);
375
+ box-shadow: none;
376
+ padding-left: var(--markstream-pre-diff-line-number-padding-left, 2ch);
377
+ padding-right: var(--markstream-pre-diff-line-number-padding-right, 1ch);
378
+ border-right: var(--markstream-pre-diff-line-number-separator-width, 2px) solid var(--markstream-diff-editor-bg, var(--code-bg));
379
+ color: var(--code-line-number);
380
+ font-variant-numeric: tabular-nums;
381
+ line-height: var(--markstream-pre-diff-line-height, 18px);
382
+ text-align: var(--markstream-pre-diff-line-number-align, right);
383
+ -webkit-user-select: none;
384
+ -moz-user-select: none;
385
+ user-select: none;
386
+ }
387
+
388
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--added > .markstream-pre__diff-number {
389
+ background: var(--markstream-diff-added-number-fill, var(--markstream-diff-added-line-fill, transparent));
390
+ color: var(--markstream-diff-added-fg, var(--code-line-number));
391
+ }
392
+
393
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--removed > .markstream-pre__diff-number {
394
+ background: var(--markstream-diff-removed-number-fill, var(--markstream-diff-removed-line-fill, transparent));
395
+ color: var(--markstream-diff-removed-fg, var(--code-line-number));
396
+ }
397
+
398
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-content {
399
+ position: relative;
400
+ z-index: 1;
401
+ display: block;
402
+ width: -moz-max-content;
403
+ width: max-content;
404
+ min-width: 100%;
405
+ line-height: var(--markstream-pre-diff-line-height, 18px);
406
+ white-space: inherit;
407
+ overflow-wrap: normal;
408
+ word-break: normal;
409
+ line-break: auto;
410
+ }
411
+
412
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.is-wrap .markstream-pre__diff-content {
413
+ box-sizing: border-box;
414
+ width: auto;
415
+ min-width: 0;
416
+ padding-right: 1ch;
417
+ overflow-wrap: anywhere;
418
+ word-break: normal;
419
+ }
420
+
421
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-content-inner {
422
+ white-space: inherit;
423
+ overflow-wrap: inherit;
424
+ word-break: inherit;
425
+ line-break: inherit;
426
+ -webkit-box-decoration-break: clone;
427
+ box-decoration-break: clone;
428
+ }
429
+
430
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--hunk {
431
+ color: var(--markstream-diff-unchanged-fg, var(--code-line-number));
432
+ }
433
+
434
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--hunk::before {
435
+ background: var(--markstream-diff-unchanged-bg, transparent);
436
+ }
437
+
438
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--spacer::before {
439
+ background-image: linear-gradient(
440
+ -45deg,
441
+ color-mix(in srgb, currentColor 20%, transparent) 12.5%,
442
+ transparent 12.5%,
443
+ transparent 50%,
444
+ color-mix(in srgb, currentColor 20%, transparent) 50%,
445
+ color-mix(in srgb, currentColor 20%, transparent) 62.5%,
446
+ transparent 62.5%,
447
+ transparent 100%
448
+ );
449
+ background-size: 10px 10px;
450
+ opacity: 0.38;
451
+ }
452
+
453
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--metadata {
454
+ color: var(--markstream-diff-metadata-fg, var(--code-line-number));
455
+ background: var(--markstream-diff-metadata-bg, var(--code-bg));
456
+ }
457
+
458
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--metadata::after,
459
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--metadata > .markstream-pre__diff-rail,
460
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--metadata > .markstream-pre__diff-number {
461
+ display: none;
462
+ }
463
+
464
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-inline .markstream-pre__diff-line--metadata + .markstream-pre__diff-line--metadata {
465
+ margin-top: calc(-1 * var(--markstream-pre-diff-line-height, 18px));
466
+ }
467
+
468
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--spacer::after,
469
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--spacer > .markstream-pre__diff-rail,
470
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--spacer > .markstream-pre__diff-number,
471
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--spacer > .markstream-pre__diff-content {
472
+ display: none;
473
+ }
474
+
475
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview.markstream-pre--diff-collapsed:not(.code-pre-fallback) {
476
+ height: auto !important;
477
+ min-height: 0 !important;
478
+ }
479
+
480
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed {
481
+ /* The finalized highlight surface renders its "N unmodified lines" widget as a
482
+ 32px pill separated from the surrounding diff rows by an 8px gap on each
483
+ side (pierre's `line-info` separator with its 8px `--diffs-gap-fallback`).
484
+ The first/last collapsed rows drop the outer gap (pierre's
485
+ `data-separator-first/last` rules): a terminal row reuses the pre's own
486
+ 8px bottom padding so the pill sits at the bottom of the pre. */
487
+ min-height: calc(
488
+ var(--markstream-pre-diff-collapsed-row-height, 32px)
489
+ + var(--markstream-pre-diff-collapsed-row-gap-top, var(--markstream-pre-diff-collapsed-row-gap, 8px))
490
+ + var(--markstream-pre-diff-collapsed-row-gap-bottom, var(--markstream-pre-diff-collapsed-row-gap, 8px))
491
+ );
492
+ padding:
493
+ var(--markstream-pre-diff-collapsed-row-gap-top, var(--markstream-pre-diff-collapsed-row-gap, 8px))
494
+ 0
495
+ var(--markstream-pre-diff-collapsed-row-gap-bottom, var(--markstream-pre-diff-collapsed-row-gap, 8px));
496
+ /* Match the finalized separator's text: pierre paints "N unmodified lines" in
497
+ its header/sans-serif font in the muted `--diffs-fg-number` gray
498
+ (`color-mix(in lab, fg 65%, bg)`), not the code's monospace foreground. */
499
+ color: color-mix(
500
+ in lab,
501
+ var(--markstream-code-theme-fg, var(--markstream-code-fallback-fg, var(--markstream-pre-resolved-theme-fg, var(--code-fg, #000)))) 65%,
502
+ var(--markstream-code-theme-bg, var(--markstream-code-fallback-bg, var(--markstream-pre-resolved-theme-bg, var(--code-bg, #fff))))
503
+ );
504
+ font-family: var(
505
+ --markstream-pre-diff-header-font,
506
+ system-ui,
507
+ -apple-system,
508
+ 'Segoe UI',
509
+ Roboto,
510
+ 'Helvetica Neue',
511
+ 'Noto Sans',
512
+ 'Liberation Sans',
513
+ Arial,
514
+ sans-serif
515
+ );
516
+ line-height: var(--markstream-pre-diff-collapsed-row-height, 32px);
517
+ }
518
+
519
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed::before {
520
+ top: var(--markstream-pre-diff-collapsed-row-gap-top, var(--markstream-pre-diff-collapsed-row-gap, 8px));
521
+ left: 8px;
522
+ right: 8px;
523
+ height: var(--markstream-pre-diff-collapsed-row-height, 32px);
524
+ border-radius: 6px;
525
+ background: var(--markstream-diff-unchanged-bg, rgb(0 0 0 / 4%));
526
+ }
527
+
528
+ /* First collapsed region: flush against the top diff rows (pierre's
529
+ `data-separator-first` clears the leading margin). */
530
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed-first {
531
+ --markstream-pre-diff-collapsed-row-gap-top: 0px;
532
+ }
533
+
534
+ /* Terminal collapsed region: the pill sits at the bottom of the pre and the
535
+ pre's own 8px bottom padding provides the gap (pierre's
536
+ `data-separator-last` clears the trailing margin). */
537
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed-last {
538
+ --markstream-pre-diff-collapsed-row-gap-bottom: 0px;
539
+ }
540
+
541
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed::after,
542
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed > .markstream-pre__diff-rail,
543
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed > .markstream-pre__diff-number {
544
+ display: none;
545
+ }
546
+
547
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed > .markstream-pre__diff-content {
548
+ width: 100%;
549
+ min-width: 0;
550
+ /* Match the finalized separator's text offset: pierre's `line-info` pill
551
+ sits 8px from the code-area left (`padding-inline: 8px`), the text
552
+ follows a 34px expand-button column, and the content itself carries
553
+ `padding: 0 1ch` (8px + 34px + 1ch). */
554
+ padding-left: calc(8px + 34px + 1ch);
555
+ line-height: var(--markstream-pre-diff-collapsed-row-height, 32px);
556
+ }
557
+
558
+ /* Mirror pierre's `diffs-icon-expand` chevron occupying the 34px column left
559
+ of the "N unmodified lines" text, so the fallback pill matches the
560
+ finalized separator (same color, same position, non-interactive). */
561
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--collapsed > .markstream-pre__diff-collapsed-icon {
562
+ position: absolute;
563
+ left: 8px;
564
+ top: var(--markstream-pre-diff-collapsed-row-gap-top, var(--markstream-pre-diff-collapsed-row-gap, 8px));
565
+ width: 34px;
566
+ height: var(--markstream-pre-diff-collapsed-row-height, 32px);
567
+ display: flex;
568
+ align-items: center;
569
+ justify-content: center;
570
+ color: inherit;
571
+ pointer-events: none;
572
+
573
+ & svg {
574
+ fill: currentColor;
575
+ flex: none;
576
+ }
577
+ }
578
+
579
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--added::before {
580
+ background: var(--markstream-diff-added-line-fill, transparent);
581
+ }
582
+
583
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--removed::before {
584
+ background: var(--markstream-diff-removed-line-fill, transparent);
585
+ }
586
+
587
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--added > .markstream-pre__diff-rail {
588
+ background: var(--markstream-diff-added-gutter, currentColor);
589
+ }
590
+
591
+ :is(.markstream-vue, .markstream-solid) pre.markstream-pre--diff-preview .markstream-pre__diff-line--removed > .markstream-pre__diff-rail {
592
+ background: var(--markstream-diff-removed-gutter, currentColor);
593
+ }
594
+
595
+ /* Keyboard accessibility: visible focus when scroll container is focused */
596
+ :is(.markstream-vue, .markstream-solid) pre[class^='language-']:focus,
597
+ :is(.markstream-vue, .markstream-solid) pre[class*=' language-']:focus {
598
+ outline: var(--ms-focus-ring-width) solid var(--focus-ring);
599
+ outline-offset: var(--ms-focus-ring-offset);
600
+ }
601
+ :is(.markstream-vue, .markstream-solid) {
602
+
603
+ /* Base tokens — self-contained defaults.
604
+ * Override --ms-* directly to customise (e.g. .markstream-vue { --ms-foreground: ... }). */
605
+ --ms-background: 0 0% 100%;
606
+ --ms-foreground: 0 0% 10%;
607
+
608
+ --ms-muted: 0 0% 96.5%;
609
+ --ms-muted-foreground: 0 0% 43%;
610
+
611
+ --ms-secondary: 0 0% 93.5%;
612
+ --ms-secondary-foreground: 0 0% 10%;
613
+
614
+ --ms-accent: 0 0% 91%;
615
+ --ms-accent-foreground: 0 0% 10%;
616
+
617
+ --ms-primary: 0 0% 10%;
618
+ --ms-primary-foreground: 0 0% 100%;
619
+
620
+ --ms-destructive: 0 62% 52%;
621
+ --ms-destructive-foreground: 0 0% 100%;
622
+
623
+ --ms-border: 0 0% 87%;
624
+ --ms-ring: 0 0% 10%;
625
+
626
+ --ms-popover: 0 0% 100%;
627
+ --ms-popover-foreground: 0 0% 10%;
628
+
629
+ --ms-radius: 8px;
630
+
631
+ /* Extension: markdown-specific, no shadcn collision
632
+ * Functional colors: unified sat ~58-64%, lightness tuned for
633
+ * equal visual weight on neutral canvas.
634
+ * Highlight & warning use dark foreground (light bg). */
635
+ --ms-info: 215 60% 50%;
636
+ --ms-info-foreground: 0 0% 100%;
637
+
638
+ --ms-success: 152 56% 39%;
639
+ --ms-success-foreground: 0 0% 100%;
640
+
641
+ --ms-warning: 38 64% 46%;
642
+ --ms-warning-foreground: 0 0% 9%;
643
+
644
+ --ms-diff-added: 152 50% 36%;
645
+ --ms-diff-removed: 0 58% 48%;
646
+
647
+ --ms-highlight: 50 60% 72%;
648
+ --ms-highlight-foreground: 0 0% 0%;
649
+
650
+ --ms-font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
651
+ --ms-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
652
+ }
653
+
654
+ .dark :is(.markstream-vue, .markstream-solid),
655
+ :is(.markstream-vue, .markstream-solid).dark {
656
+
657
+ /* Dark defaults
658
+ * Neutral steps: bg 7 → muted 12 → secondary 16 → border 20 → accent 24
659
+ * Ensures each surface level is visually distinguishable. */
660
+ --ms-background: 0 0% 7%;
661
+ --ms-foreground: 0 0% 93%;
662
+
663
+ --ms-muted: 0 0% 12%;
664
+ --ms-muted-foreground: 0 0% 60%;
665
+
666
+ --ms-secondary: 0 0% 16%;
667
+ --ms-secondary-foreground: 0 0% 93%;
668
+
669
+ --ms-accent: 0 0% 24%;
670
+ --ms-accent-foreground: 0 0% 93%;
671
+
672
+ --ms-primary: 0 0% 93%;
673
+ --ms-primary-foreground: 0 0% 10%;
674
+
675
+ --ms-destructive: 0 60% 50%;
676
+ --ms-destructive-foreground: 0 0% 93%;
677
+
678
+ --ms-border: 0 0% 20%;
679
+ --ms-ring: 0 0% 80%;
680
+
681
+ --ms-popover: 0 0% 9%;
682
+ --ms-popover-foreground: 0 0% 93%;
683
+
684
+ /* Extension: dark overrides — lightness lifted for readability */
685
+ --ms-info: 215 55% 62%;
686
+ --ms-info-foreground: 0 0% 100%;
687
+
688
+ --ms-success: 152 48% 55%;
689
+ --ms-success-foreground: 0 0% 100%;
690
+
691
+ --ms-warning: 32 65% 58%;
692
+ --ms-warning-foreground: 0 0% 9%;
693
+
694
+ --ms-diff-added: 152 42% 60%;
695
+ --ms-diff-removed: 0 58% 58%;
696
+
697
+ --ms-highlight: 48 65% 50%;
698
+ --ms-highlight-foreground: 0 0% 0%;
699
+
700
+ /* Shadows: use black in dark mode (foreground is bright, would glow) */
701
+ --ms-shadow-subtle: 0 1px 3px 0 hsl(0 0% 0% / 0.25);
702
+ --ms-shadow-popover: 0 4px 6px -1px hsl(0 0% 0% / 0.2),
703
+ 0 2px 4px -2px hsl(0 0% 0% / 0.15);
704
+ --ms-shadow-modal: 0 10px 15px -3px hsl(0 0% 0% / 0.5),
705
+ 0 4px 6px -4px hsl(0 0% 0% / 0.4);
706
+ --ms-shadow-preview: 0 10px 40px hsl(0 0% 0% / 0.6);
707
+
708
+ /* Tooltip: subtle lift from black, muted text */
709
+ --tooltip-bg: hsl(0 0% 12%);
710
+ --tooltip-fg: hsl(0 0% 72%);
711
+
712
+ /* Code block defaults stay stable across renderers; explicit editor themes
713
+ * can still paint the enhanced surface. */
714
+ --code-bg: #111827;
715
+ --code-header-bg: hsl(var(--ms-muted));
716
+
717
+ /* Admonition: stronger tint on dark backgrounds */
718
+ --admonition-note-header-bg: color-mix(in srgb, hsl(var(--ms-info)) 12%, transparent);
719
+ --admonition-tip-header-bg: color-mix(in srgb, hsl(var(--ms-success)) 12%, transparent);
720
+ --admonition-warn-header-bg: color-mix(in srgb, hsl(var(--ms-warning)) 12%, transparent);
721
+ --admonition-danger-header-bg: color-mix(in srgb, hsl(var(--ms-destructive)) 12%, transparent);
722
+ }
723
+
724
+ :is(.markstream-vue, .markstream-solid) {
725
+
726
+ /* ── Base typography (inherited by all children) ── */
727
+ font-family: var(--ms-font-sans);
728
+ font-size: var(--ms-text-body);
729
+ line-height: var(--ms-leading-body);
730
+
731
+ /* ── Inline code ── */
732
+ --inline-code-bg: hsl(var(--ms-secondary));
733
+ --inline-code-fg: hsl(var(--ms-foreground) / 0.75);
734
+ --inline-code-border: hsl(var(--ms-border) / 0.9);
735
+
736
+ /* ── Code block ── */
737
+ --code-bg: #fff;
738
+ --code-fg: hsl(var(--ms-foreground));
739
+ --code-border: hsl(var(--ms-border));
740
+ --code-header-bg: hsl(var(--ms-secondary));
741
+ --code-selection-bg: hsl(var(--ms-accent) / 0.3);
742
+ --code-line-number: hsl(var(--ms-muted-foreground));
743
+ --markstream-code-line-number-align: right;
744
+
745
+ /* ── Code block actions ── */
746
+ --code-action-fg: hsl(var(--ms-muted-foreground));
747
+ --code-action-hover-bg: hsl(var(--ms-accent));
748
+ --code-action-hover-fg: hsl(var(--ms-accent-foreground));
749
+ --code-action-active-bg: hsl(var(--ms-primary));
750
+ --code-action-active-fg: hsl(var(--ms-primary-foreground));
751
+
752
+ /* ── Diff ── */
753
+ --diff-added-fg: hsl(var(--ms-diff-added));
754
+ --diff-removed-fg: hsl(var(--ms-diff-removed));
755
+ --diff-added-bg: hsl(var(--ms-diff-added) / 0.1);
756
+ --diff-added-inline-bg: hsl(var(--ms-diff-added) / 0.2);
757
+ --diff-removed-bg: hsl(var(--ms-diff-removed) / 0.1);
758
+ --diff-removed-inline-bg: hsl(var(--ms-diff-removed) / 0.2);
759
+
760
+ /* ── Blockquote ── */
761
+ --blockquote-border: hsl(var(--ms-muted-foreground) / 0.2);
762
+
763
+ /* ── Admonition ── */
764
+ --admonition-bg: hsl(var(--ms-muted));
765
+ --admonition-border: hsl(var(--ms-border));
766
+ --admonition-fg: hsl(var(--ms-foreground));
767
+ --admonition-muted: hsl(var(--ms-muted-foreground));
768
+ --admonition-header-bg: hsl(var(--ms-muted) / 0.5);
769
+ --admonition-note: hsl(var(--ms-info));
770
+ --admonition-tip: hsl(var(--ms-success));
771
+ --admonition-warning: hsl(var(--ms-warning));
772
+ --admonition-danger: hsl(var(--ms-destructive));
773
+ --admonition-note-header-bg: color-mix(in srgb, hsl(var(--ms-info)) 6%, transparent);
774
+ --admonition-tip-header-bg: color-mix(in srgb, hsl(var(--ms-success)) 6%, transparent);
775
+ --admonition-warn-header-bg: color-mix(in srgb, hsl(var(--ms-warning)) 6%, transparent);
776
+ --admonition-danger-header-bg: color-mix(in srgb, hsl(var(--ms-destructive)) 6%, transparent);
777
+
778
+ /* ── Table ── */
779
+ --table-border: hsl(var(--ms-border));
780
+ --table-header-bg: hsl(var(--ms-muted));
781
+
782
+ /* ── Link ── */
783
+ --link-color: hsl(var(--ms-info));
784
+
785
+ /* ── List ── */
786
+ --list-marker: hsl(var(--ms-muted-foreground) / 0.5);
787
+ --list-counter-marker: hsl(var(--ms-muted-foreground));
788
+
789
+ /* ── Thematic break (HR) ── */
790
+ --hr-border: hsl(var(--ms-border));
791
+
792
+ /* ── Highlight ── */
793
+ --highlight-bg: hsl(var(--ms-highlight));
794
+
795
+ /* ── Footnote ── */
796
+ --footnote-border: hsl(var(--ms-border));
797
+
798
+ /* ── Tooltip ── */
799
+ --tooltip-bg: hsl(0 0% 18%);
800
+ --tooltip-fg: hsl(0 0% 88%);
801
+ --tooltip-border: hsl(var(--ms-border));
802
+
803
+ /* ── Modal ── */
804
+ --modal-overlay: hsl(0 0% 0% / 0.7);
805
+ --modal-bg: hsl(var(--ms-popover));
806
+ --modal-fg: hsl(var(--ms-popover-foreground));
807
+
808
+ /* ── Diagram containers (Mermaid / D2 / Infographic) ── */
809
+ --diagram-bg: hsl(var(--ms-muted));
810
+ --diagram-border: hsl(var(--ms-border));
811
+ --diagram-header-bg: hsl(var(--ms-muted));
812
+
813
+ /* ── Loading states ── */
814
+ --loading-spinner: hsl(var(--ms-muted-foreground));
815
+ --loading-shimmer: hsl(var(--ms-muted) / 0.5);
816
+
817
+ /* ── Image ── */
818
+ --image-placeholder-bg: hsl(var(--ms-muted));
819
+
820
+ /* ── Focus ring ── */
821
+ --focus-ring: hsl(var(--ms-ring));
822
+
823
+ /* =======================================================================
824
+ Layer 2b: Spacing, Shadow, Animation, Border, Size Tokens
825
+ These are non-color tokens for layout theming and density control.
826
+ ======================================================================= */
827
+
828
+ /* ── Spacing scale ── */
829
+ --ms-space-1: 4px;
830
+ --ms-space-1_5: 6px;
831
+ --ms-space-2: 8px;
832
+ --ms-space-2_5: 10px;
833
+ --ms-space-3: 12px;
834
+ --ms-space-4: 16px;
835
+ --ms-space-5: 20px;
836
+ --ms-space-6: 24px;
837
+ --ms-space-8: 32px;
838
+ --ms-space-12: 48px;
839
+
840
+ /* ── Document flow spacing ── */
841
+ --ms-flow-paragraph-y: 1.5em;
842
+ --ms-flow-list-y: 1em;
843
+ --ms-flow-list-item-y: 0.25em;
844
+ --ms-flow-list-indent: calc(13 / 8 * 1em);
845
+ --ms-flow-list-indent-mobile: calc(14 / 9 * 1em);
846
+ --ms-flow-table-y: 2em;
847
+ --ms-flow-table-cell: 0.5em 0.75em;
848
+ --ms-flow-blockquote-y: 1.25em;
849
+ --ms-flow-blockquote-indent: 1.25em;
850
+ --ms-flow-admonition-y: 1.25em;
851
+ --ms-flow-footnote-y: 0.5em;
852
+ --ms-flow-hr-y: 2.5em;
853
+ --ms-flow-diagram-y: 1.5em;
854
+ --ms-flow-codeblock-y: 1.5em;
855
+ --ms-flow-definition-term-mt: 0.75em;
856
+ --ms-flow-definition-desc-ml: 1.25em;
857
+ --ms-flow-definition-desc-mb: 0.5em;
858
+
859
+ /* ── Heading rhythm ── */
860
+ --ms-flow-heading-1-mt: 0;
861
+ --ms-flow-heading-1-mb: 1em;
862
+ --ms-flow-heading-2-mt: 2em;
863
+ --ms-flow-heading-2-mb: 0.75em;
864
+ --ms-flow-heading-3-mt: 1.5em;
865
+ --ms-flow-heading-3-mb: 0.6em;
866
+ --ms-flow-heading-4-mt: 1.25em;
867
+ --ms-flow-heading-4-mb: 0.4em;
868
+ --ms-flow-heading-5-mt: 1em;
869
+ --ms-flow-heading-5-mb: 0.25em;
870
+ --ms-flow-heading-6-mt: 1em;
871
+ --ms-flow-heading-6-mb: 0.25em;
872
+
873
+ /* ── Typography ── */
874
+ --ms-text-body: 16px;
875
+ --ms-leading-body: 1.75;
876
+ --ms-text-h1: 36px;
877
+ --ms-text-h2: 24px;
878
+ --ms-text-h3: 20px;
879
+ --ms-text-h4: 16px;
880
+ --ms-text-h5: 16px;
881
+ --ms-text-h6: 16px;
882
+ --ms-leading-h1: 1.2;
883
+ --ms-leading-h2: 1.35;
884
+ --ms-leading-h3: 1.5;
885
+ --ms-weight-h1: 700;
886
+ --ms-weight-h2: 600;
887
+ --ms-weight-h3: 600;
888
+ --ms-weight-h4: 600;
889
+ --ms-text-label: 12px;
890
+ --ms-action-btn-padding: 6px;
891
+ --ms-action-btn-icon: 14px;
892
+
893
+ /* ── Panel insets & layout gaps ── */
894
+ --ms-inset-panel-x: 10px;
895
+ --ms-inset-panel-y: 6px;
896
+ --ms-inset-panel-body-sm: 8px;
897
+ --ms-inset-panel-body: 16px;
898
+ --ms-inset-admonition-body-top: 8px;
899
+ --ms-inset-admonition-body-bottom: 12px;
900
+ --ms-gap-header: var(--ms-space-4);
901
+ --ms-gap-header-main: var(--ms-space-2_5);
902
+ --ms-gap-header-actions: var(--ms-space-2);
903
+
904
+ /* ── Shadows ── */
905
+ --ms-shadow-subtle: 0 1px 3px 0 hsl(var(--ms-foreground) / 0.06);
906
+ --ms-shadow-popover: 0 4px 6px -1px hsl(var(--ms-foreground) / 0.1),
907
+ 0 2px 4px -2px hsl(var(--ms-foreground) / 0.1);
908
+ --ms-shadow-modal: 0 10px 15px -3px hsl(var(--ms-foreground) / 0.1),
909
+ 0 4px 6px -4px hsl(var(--ms-foreground) / 0.1);
910
+ --ms-shadow-preview: 0 10px 40px hsl(var(--ms-foreground) / 0.25);
911
+
912
+ /* ── Animation ── */
913
+ --ms-duration-fast: 120ms;
914
+ --ms-duration-standard: 180ms;
915
+ --ms-duration-overlay: 200ms;
916
+ --ms-duration-emphasis: 220ms;
917
+ --ms-duration-slow: 300ms;
918
+ --ms-duration-stream: 280ms;
919
+ --ms-ease-linear: linear;
920
+ --ms-ease-standard: ease;
921
+ --ms-ease-out: ease-out;
922
+ --ms-ease-in-out: ease-in-out;
923
+ --ms-ease-spring: cubic-bezier(.16, 1, .3, 1);
924
+
925
+ /* ── Border & focus ── */
926
+ --ms-border-width: 1px;
927
+ --ms-border-width-strong: 4px;
928
+ --ms-focus-ring-width: 2px;
929
+ --ms-focus-ring-offset: 2px;
930
+
931
+ /* ── Container sizes ── */
932
+ --ms-size-diagram-min-height: 360px;
933
+ --ms-size-code-max-height: 500px;
934
+ --ms-size-image-max-width: 384px;
935
+ --ms-size-image-min-width: 128px;
936
+ --ms-size-image-min-height: 1.5em;
937
+ --ms-size-math-min-height: 40px;
938
+ --ms-size-skeleton-min-height: 120px;
939
+ }
940
+
941
+ /*
942
+ * Keep button defaults minimal, but don't override Tailwind utilities.
943
+ * Use :where() to keep specificity low so `.markstream-solid .<utility>` wins.
944
+ */
945
+ :where(.markstream-solid) button {
946
+ appearance: none;
947
+ -webkit-appearance: none;
948
+ -moz-appearance: none;
949
+ background: transparent;
950
+ border: 0;
951
+ font: inherit;
952
+ color: inherit;
953
+ }
954
+
955
+ markstream-solid {
956
+ display: block;
957
+ width: 100%;
958
+ }
959
+
960
+ .markstream-solid {color:inherit;word-break:break-word;position:relative;}
961
+
962
+ .markstream-solid.markdown-renderer {
963
+ contain: layout;
964
+ content-visibility: auto;
965
+ contain-intrinsic-size: 800px 0;
966
+ }
967
+
968
+ .markstream-solid.virtualized {
969
+ content-visibility: visible;
970
+ contain-intrinsic-size: auto;
971
+ }
972
+
973
+ .markstream-solid > :first-child {
974
+ margin-top: 0;
975
+ }
976
+
977
+ .markstream-solid > :last-child {
978
+ margin-bottom: 0;
979
+ }
980
+
981
+ .markstream-solid .node-slot,
982
+ .markstream-solid .node-content {
983
+ width: 100%;
984
+ }
985
+
986
+ .markstream-solid markstream-solid-blockquote-node,
987
+ .markstream-solid markstream-solid-paragraph-node {
988
+ display: flow-root;
989
+ width: 100%;
990
+ }
991
+
992
+ .markstream-solid markstream-solid-nested-renderer,
993
+ .markstream-solid markstream-solid-node-outlet,
994
+ .markstream-solid markstream-solid-image-node {
995
+ display: contents;
996
+ }
997
+
998
+ .markstream-solid .node-placeholder {
999
+ position: relative;
1000
+ overflow: hidden;
1001
+ width: 100%;
1002
+ min-height: 16px;
1003
+ margin: 4px 0;
1004
+ border-radius: 8px;
1005
+ background: rgba(148, 163, 184, 0.18);
1006
+ }
1007
+
1008
+ .markstream-solid .node-placeholder::before {
1009
+ content: '';
1010
+ position: absolute;
1011
+ inset-block: 0;
1012
+ left: -200%;
1013
+ width: 500%;
1014
+ background: linear-gradient(90deg, rgba(148, 163, 184, 0.18), rgba(148, 163, 184, 0.05), rgba(148, 163, 184, 0.18));
1015
+ background-size: 40% 100%;
1016
+ animation: node-placeholder-shimmer 1.1s ease-in-out infinite;
1017
+ }
1018
+
1019
+ .markstream-solid .node-spacer {
1020
+ width: 100%;
1021
+ }
1022
+
1023
+ .markstream-solid .typewriter-node,
1024
+ .markstream-solid .fade-node {
1025
+ opacity: 0;
1026
+ animation: typewriter-fade var(--fade-duration, var(--typewriter-fade-duration, 280ms)) var(--fade-ease, var(--typewriter-fade-ease, cubic-bezier(0.33, 0, 0.67, 1))) both;
1027
+ }
1028
+
1029
+ .markstream-solid .markstream-solid-text-node {
1030
+ display: inline;
1031
+ font-weight: inherit;
1032
+ vertical-align: baseline;
1033
+ white-space: pre-wrap;
1034
+ overflow-wrap: break-word;
1035
+ }
1036
+
1037
+ .markstream-solid .markstream-solid-text--centered {
1038
+ display: inline-flex;
1039
+ justify-content: center;
1040
+ width: 100%;
1041
+ }
1042
+
1043
+ .markstream-solid .markstream-solid-text__stream-delta {
1044
+ animation-duration: var(--stream-update-fade-duration, var(--fade-duration, var(--typewriter-fade-duration, 280ms)));
1045
+ animation-timing-function: var(--stream-update-fade-ease, var(--fade-ease, var(--typewriter-fade-ease, cubic-bezier(0.33, 0, 0.67, 1))));
1046
+ animation-fill-mode: both;
1047
+ }
1048
+
1049
+ .markstream-solid .markstream-solid-text__stream-delta--a {
1050
+ animation-name: markstream-solid-text-stream-update-fade-a;
1051
+ }
1052
+
1053
+ .markstream-solid .markstream-solid-text__stream-delta--b {
1054
+ animation-name: markstream-solid-text-stream-update-fade-b;
1055
+ }
1056
+
1057
+ .markstream-solid h1,
1058
+ .markstream-solid h2,
1059
+ .markstream-solid h3,
1060
+ .markstream-solid h4,
1061
+ .markstream-solid h5,
1062
+ .markstream-solid h6 {
1063
+ margin: 28.8px 0 12.8px;
1064
+ line-height: 1.15;
1065
+ font-weight: 700;
1066
+ letter-spacing: -0.02em;
1067
+ }
1068
+
1069
+ .markstream-solid h1 {
1070
+ font-size: clamp(32px, 4vw, 42.4px);
1071
+ }
1072
+
1073
+ .markstream-solid h2 {
1074
+ font-size: clamp(24.8px, 3vw, 32px);
1075
+ }
1076
+
1077
+ .markstream-solid h3 {
1078
+ font-size: 21.6px;
1079
+ }
1080
+
1081
+ .markstream-solid h4 {
1082
+ font-size: 18.4px;
1083
+ }
1084
+
1085
+ .markstream-solid p,
1086
+ .markstream-solid ul,
1087
+ .markstream-solid ol,
1088
+ .markstream-solid blockquote,
1089
+ .markstream-solid pre,
1090
+ .markstream-solid table,
1091
+ .markstream-solid details,
1092
+ .markstream-solid dl {
1093
+ margin: 16px 0;
1094
+ }
1095
+
1096
+ .markstream-solid ul,
1097
+ .markstream-solid ol {
1098
+ padding-left: 23.2px;
1099
+ }
1100
+
1101
+ .markstream-solid li + li {
1102
+ margin-top: 5.6px;
1103
+ }
1104
+
1105
+ .markstream-solid li > p {
1106
+ margin: 5.6px 0;
1107
+ }
1108
+
1109
+ .markstream-solid a {
1110
+ color: #2563eb;
1111
+ text-decoration: underline;
1112
+ text-underline-offset: 0.18em;
1113
+ }
1114
+
1115
+ .markstream-solid .link-node {
1116
+ color: var(--link-color, #0366d6);
1117
+ text-decoration: none;
1118
+ }
1119
+
1120
+ .markstream-solid .link-node:hover {
1121
+ text-decoration: underline;
1122
+ text-underline-offset: 3.2px;
1123
+ }
1124
+
1125
+ .markstream-solid .link-loading {
1126
+ display: inline-flex;
1127
+ align-items: baseline;
1128
+ gap: 6px;
1129
+ color: var(--link-color, #0366d6);
1130
+ }
1131
+
1132
+ .markstream-solid .link-loading .link-text-wrapper {
1133
+ position: relative;
1134
+ display: inline-flex;
1135
+ }
1136
+
1137
+ .markstream-solid .link-loading .link-text {
1138
+ position: relative;
1139
+ z-index: 2;
1140
+ }
1141
+
1142
+ .markstream-solid .link-loading-indicator {
1143
+ position: absolute;
1144
+ left: 0;
1145
+ right: 0;
1146
+ height: var(--underline-height, 2px);
1147
+ bottom: var(--underline-bottom, -3px);
1148
+ background: currentColor;
1149
+ border-radius: 999px;
1150
+ opacity: var(--underline-rest-opacity, 0.18);
1151
+ animation: markstream-solid-link-loading-pulse var(--underline-duration, 1.6s) var(--underline-timing, ease-in-out) var(--underline-iteration, infinite);
1152
+ }
1153
+
1154
+ @keyframes markstream-solid-link-loading-pulse {
1155
+ 0%, 100% { opacity: var(--underline-rest-opacity, 0.18); }
1156
+ 50% { opacity: var(--underline-opacity, 0.35); }
1157
+ }
1158
+
1159
+ @keyframes markstream-solid-text-stream-update-fade-a {
1160
+ from { opacity: 0; }
1161
+ to { opacity: 1; }
1162
+ }
1163
+
1164
+ @keyframes markstream-solid-text-stream-update-fade-b {
1165
+ from { opacity: 0; }
1166
+ to { opacity: 1; }
1167
+ }
1168
+
1169
+ .markstream-solid .typewriter-cursor {
1170
+ position: absolute;
1171
+ left: 0;
1172
+ top: 0;
1173
+ display: inline-block;
1174
+ width: 0.55em;
1175
+ height: 1em;
1176
+ margin-left: 0.08em;
1177
+ vertical-align: -0.12em;
1178
+ border-right: 2px solid currentColor;
1179
+ pointer-events: none;
1180
+ animation: typewriter-cursor-blink 1s steps(1, end) infinite;
1181
+ }
1182
+
1183
+ @keyframes typewriter-cursor-blink {
1184
+ 0%, 49% {
1185
+ opacity: 1;
1186
+ }
1187
+ 50%, 100% {
1188
+ opacity: 0;
1189
+ }
1190
+ }
1191
+
1192
+ @media (prefers-reduced-motion: reduce) {
1193
+ .markstream-solid .node-placeholder::before {
1194
+ animation: none !important;
1195
+ }
1196
+
1197
+ .markstream-solid .link-loading-indicator {
1198
+ animation: none !important;
1199
+ opacity: var(--underline-rest-opacity, 0.18);
1200
+ }
1201
+
1202
+ .markstream-solid .markstream-solid-text__stream-delta {
1203
+ animation: none !important;
1204
+ }
1205
+
1206
+ .markstream-solid .typewriter-node,
1207
+ .markstream-solid .fade-node {
1208
+ animation: none !important;
1209
+ opacity: 1;
1210
+ }
1211
+
1212
+ .markstream-solid .typewriter-cursor {
1213
+ animation: none !important;
1214
+ }
1215
+ }
1216
+
1217
+ .markstream-solid strong {
1218
+ font-weight: 700;
1219
+ }
1220
+
1221
+ .markstream-solid em {
1222
+ font-style: italic;
1223
+ }
1224
+
1225
+ .markstream-solid code {
1226
+ padding: 1.92px 5.6px;
1227
+ border-radius: 6.72px;
1228
+ background: rgba(15, 23, 42, 0.06);
1229
+ font:
1230
+ 500 0.92em/1.5 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
1231
+ }
1232
+
1233
+ .markstream-solid pre {
1234
+ overflow: auto;
1235
+ padding: 16px 17.6px;
1236
+ border-radius: 16px;
1237
+ background: var(--code-bg);
1238
+ color: var(--code-fg);
1239
+ box-shadow: inset 0 0 0 1px rgba(148, 163, 184, 0.14);
1240
+ }
1241
+
1242
+ .markstream-solid pre code {
1243
+ padding: 0;
1244
+ background: transparent;
1245
+ color: inherit;
1246
+ }
1247
+
1248
+ .markstream-solid blockquote,
1249
+ .markstream-solid .blockquote-node {
1250
+ display: flow-root;
1251
+ font-weight: 400;
1252
+ font-style: normal;
1253
+ color: var(--blockquote-fg, hsl(var(--ms-muted-foreground)));
1254
+ border-left: 3px solid var(--blockquote-border);
1255
+ quotes: "\201C" "\201D" "\2018" "\2019";
1256
+ margin-top: var(--ms-flow-blockquote-y);
1257
+ margin-bottom: var(--ms-flow-blockquote-y);
1258
+ padding-left: var(--ms-flow-blockquote-indent);
1259
+ background: transparent;
1260
+ border-radius: 0;
1261
+ }
1262
+
1263
+ .markstream-solid .blockquote-node .markstream-solid,
1264
+ .markstream-solid blockquote .markstream-solid {
1265
+ content-visibility: visible;
1266
+ contain: content;
1267
+ contain-intrinsic-size: 0 0;
1268
+ }
1269
+
1270
+ .markstream-solid .blockquote-node > markstream-solid-nested-renderer,
1271
+ .markstream-solid blockquote > markstream-solid-nested-renderer,
1272
+ .markstream-solid .blockquote-node > markstream-solid-node-outlet,
1273
+ .markstream-solid blockquote > markstream-solid-node-outlet {
1274
+ display: block;
1275
+ width: 100%;
1276
+ }
1277
+
1278
+ .markstream-solid hr {
1279
+ margin: 24px 0;
1280
+ border: 0;
1281
+ border-top: 1px solid rgba(15, 23, 42, 0.12);
1282
+ }
1283
+
1284
+ .markstream-solid table {
1285
+ width: 100%;
1286
+ border-collapse: collapse;
1287
+ overflow: hidden;
1288
+ border-radius: 16px;
1289
+ box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.08);
1290
+ }
1291
+
1292
+ .markstream-solid th,
1293
+ .markstream-solid td {
1294
+ padding: 11.2px 12.8px;
1295
+ border: 1px solid rgba(15, 23, 42, 0.08);
1296
+ text-align: left;
1297
+ vertical-align: top;
1298
+ white-space: normal;
1299
+ overflow-wrap: break-word;
1300
+ word-break: normal;
1301
+ }
1302
+
1303
+ .markstream-solid th {
1304
+ position: relative;
1305
+ background: rgba(15, 23, 42, 0.05);
1306
+ font-weight: 700;
1307
+ }
1308
+
1309
+ .markstream-solid .table-node__resize-handle {
1310
+ position: absolute;
1311
+ top: 0;
1312
+ right: -4px;
1313
+ bottom: 0;
1314
+ z-index: 1;
1315
+ width: 8px;
1316
+ padding: 0;
1317
+ border: 0;
1318
+ background: transparent;
1319
+ cursor: col-resize;
1320
+ touch-action: none;
1321
+ }
1322
+
1323
+ .markstream-solid .table-node__resize-handle::after {
1324
+ content: '';
1325
+ position: absolute;
1326
+ top: 0.35em;
1327
+ bottom: 0.35em;
1328
+ left: 50%;
1329
+ width: 2px;
1330
+ border-radius: 9999px;
1331
+ background: rgba(94, 104, 121, 0.55);
1332
+ opacity: 0;
1333
+ transform: translateX(-50%);
1334
+ transition: opacity 0.12s ease;
1335
+ }
1336
+
1337
+ .markstream-solid .table-node__resize-handle:hover::after,
1338
+ .markstream-solid .table-node__resize-handle:focus-visible::after {
1339
+ opacity: 1;
1340
+ }
1341
+
1342
+ .markstream-solid table .markstream-solid-text-node,
1343
+ .markstream-solid table code {
1344
+ white-space: inherit;
1345
+ overflow-wrap: inherit;
1346
+ word-break: inherit;
1347
+ max-width: none;
1348
+ }
1349
+
1350
+ .markstream-solid img {
1351
+ display: inline-block;
1352
+ max-width: 100%;
1353
+ height: auto;
1354
+ border-radius: 14.4px;
1355
+ vertical-align: middle;
1356
+ }
1357
+
1358
+ .markstream-solid .image-node-container {
1359
+ display: inline-block;
1360
+ vertical-align: middle;
1361
+ max-width: var(--ms-size-image-max-width);
1362
+ }
1363
+
1364
+ .markstream-solid .image-node__img {
1365
+ display: inline-block;
1366
+ width: auto;
1367
+ max-width: 100%;
1368
+ height: auto;
1369
+ border-radius: 12px;
1370
+ vertical-align: middle;
1371
+ transition: opacity var(--ms-duration-emphasis) var(--ms-ease-standard);
1372
+ }
1373
+
1374
+ .markstream-solid .image-node__img.is-loading {
1375
+ opacity: 0;
1376
+ }
1377
+
1378
+ .markstream-solid .image-node__img.is-loaded {
1379
+ opacity: 1;
1380
+ }
1381
+
1382
+ .markstream-solid .image-placeholder {
1383
+ display: inline-flex;
1384
+ align-items: center;
1385
+ justify-content: center;
1386
+ width: 100%;
1387
+ min-height: 128px;
1388
+ max-width: var(--ms-size-image-max-width);
1389
+ background: hsl(var(--ms-muted));
1390
+ overflow: hidden;
1391
+ vertical-align: middle;
1392
+ }
1393
+
1394
+ .markstream-solid .image-shimmer {
1395
+ position: relative;
1396
+ overflow: hidden;
1397
+ display: block;
1398
+ width: 100%;
1399
+ height: 100%;
1400
+ min-height: 128px;
1401
+ background: hsl(var(--ms-muted));
1402
+ }
1403
+
1404
+ .markstream-solid .image-shimmer::before {
1405
+ content: '';
1406
+ position: absolute;
1407
+ inset-block: 0;
1408
+ left: -200%;
1409
+ width: 300%;
1410
+ background: linear-gradient(
1411
+ 90deg,
1412
+ hsl(var(--ms-muted)) 0%,
1413
+ hsl(var(--ms-muted-foreground) / 0.06) 50%,
1414
+ hsl(var(--ms-muted)) 100%
1415
+ );
1416
+ background-position: 100% 0;
1417
+ background-size: 66.6667% 100%;
1418
+ animation: markstream-solid-image-shimmer 1.5s ease-in-out infinite;
1419
+ }
1420
+
1421
+ .markstream-solid .image-error {
1422
+ display: inline-flex;
1423
+ align-items: center;
1424
+ justify-content: center;
1425
+ gap: 8px;
1426
+ padding: 16px 24px;
1427
+ min-height: 64px;
1428
+ max-width: var(--ms-size-image-max-width);
1429
+ background: hsl(var(--ms-muted));
1430
+ color: hsl(var(--ms-muted-foreground));
1431
+ font-size: var(--ms-text-label);
1432
+ vertical-align: middle;
1433
+ }
1434
+
1435
+ .markstream-solid .image-node__raw-text {
1436
+ font-size: var(--ms-text-label);
1437
+ color: hsl(var(--ms-muted-foreground));
1438
+ }
1439
+
1440
+ @keyframes markstream-solid-image-shimmer {
1441
+ from { transform: translateX(0); }
1442
+ to { transform: translateX(66.6667%); }
1443
+ }
1444
+
1445
+ @media (prefers-reduced-motion: reduce) {
1446
+ .markstream-solid .image-shimmer::before {
1447
+ animation: none !important;
1448
+ }
1449
+
1450
+ .markstream-solid .image-node__img {
1451
+ transition: none !important;
1452
+ }
1453
+ }
1454
+
1455
+ .markstream-solid details {
1456
+ padding: 13.6px 16px;
1457
+ border-radius: 14.4px;
1458
+ border: 1px solid rgba(15, 23, 42, 0.08);
1459
+ background: rgba(15, 23, 42, 0.03);
1460
+ }
1461
+
1462
+ .markstream-solid summary {
1463
+ cursor: pointer;
1464
+ font-weight: 700;
1465
+ }
1466
+
1467
+ .markstream-solid dl {
1468
+ display: grid;
1469
+ gap: 7.2px;
1470
+ }
1471
+
1472
+ .markstream-solid dt {
1473
+ font-weight: 700;
1474
+ }
1475
+
1476
+ .markstream-solid dd {
1477
+ margin: 0 0 7.2px 16px;
1478
+ }
1479
+
1480
+ .markstream-solid input[type='checkbox'] {
1481
+ margin-right: 6.4px;
1482
+ }
1483
+
1484
+ .markstream-solid mark {
1485
+ padding: 1.28px 3.84px;
1486
+ border-radius: 4.8px;
1487
+ background: rgba(250, 204, 21, 0.28);
1488
+ }
1489
+
1490
+ .markstream-solid ins {
1491
+ text-decoration-thickness: 0.08em;
1492
+ }
1493
+
1494
+ .markstream-solid del {
1495
+ text-decoration-thickness: 0.08em;
1496
+ }
1497
+
1498
+ /* Prevent mermaid temporary render containers from causing layout shift */
1499
+ body > div[id^="dmermaid-"] {
1500
+ position: fixed;
1501
+ top: -10000px;
1502
+ left: 0;
1503
+ width: 100%;
1504
+ visibility: hidden;
1505
+ pointer-events: none;
1506
+ }
1507
+
1508
+ .markstream-solid .markstream-nested-custom {
1509
+ display: block;
1510
+ margin: 16px 0;
1511
+ padding: 14.4px 16px;
1512
+ border-radius: 14.4px;
1513
+ background: rgba(15, 23, 42, 0.04);
1514
+ border: 1px solid rgba(15, 23, 42, 0.08);
1515
+ }
1516
+
1517
+ .markstream-solid .markstream-nested-custom--thinking {
1518
+ background: linear-gradient(180deg, rgba(14, 165, 233, 0.08), rgba(255, 255, 255, 0.92));
1519
+ border-color: rgba(14, 165, 233, 0.18);
1520
+ }
1521
+
1522
+ .markstream-solid .markstream-nested-admonition {
1523
+ margin: 16px 0;
1524
+ padding: 16px 17.6px;
1525
+ border-radius: 16px;
1526
+ border: 1px solid rgba(37, 99, 235, 0.14);
1527
+ background: rgba(37, 99, 235, 0.05);
1528
+ }
1529
+
1530
+ .markstream-solid .markstream-nested-admonition__title {
1531
+ margin-bottom: 8.8px;
1532
+ font-weight: 700;
1533
+ }
1534
+
1535
+ .markstream-solid .markstream-nested-admonition--warning {
1536
+ border-color: rgba(245, 158, 11, 0.24);
1537
+ background: rgba(245, 158, 11, 0.08);
1538
+ }
1539
+
1540
+ .markstream-solid .markstream-nested-admonition--error,
1541
+ .markstream-solid .markstream-nested-admonition--danger {
1542
+ border-color: rgba(239, 68, 68, 0.22);
1543
+ background: rgba(239, 68, 68, 0.07);
1544
+ }
1545
+
1546
+ .markstream-solid .markstream-nested-admonition--tip {
1547
+ border-color: rgba(16, 185, 129, 0.2);
1548
+ background: rgba(16, 185, 129, 0.07);
1549
+ }
1550
+
1551
+ .markstream-solid .markstream-nested-reference {
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ justify-content: center;
1555
+ min-width: 21.6px;
1556
+ margin: 0 2px;
1557
+ padding: 0 6px;
1558
+ border-radius: 6px;
1559
+ background: hsl(var(--muted));
1560
+ color: hsl(var(--muted-foreground));
1561
+ font-size: 12px;
1562
+ line-height: 20px;
1563
+ vertical-align: baseline;
1564
+ font-family: "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
1565
+ }
1566
+
1567
+ .markstream-solid .reference-node:hover {
1568
+ background-color: hsl(var(--ms-secondary));
1569
+ }
1570
+
1571
+ .markstream-solid .footnote-node {
1572
+ display: flex;
1573
+ margin-top: var(--ms-flow-footnote-y);
1574
+ margin-bottom: var(--ms-flow-footnote-y);
1575
+ padding-top: 8px;
1576
+ border-top: 1px solid var(--footnote-border);
1577
+ font-size: 14px;
1578
+ line-height: 1.625;
1579
+ }
1580
+
1581
+ .markstream-solid .footnote-node__content {
1582
+ flex: 1 1 auto;
1583
+ min-width: 0;
1584
+ }
1585
+
1586
+ .markstream-solid .footnote-reference {
1587
+ font-size: 0.75em;
1588
+ line-height: 0;
1589
+ vertical-align: super;
1590
+ }
1591
+
1592
+ .markstream-solid .footnote-link {
1593
+ color: var(--link-color);
1594
+ text-decoration: none;
1595
+ cursor: pointer;
1596
+ }
1597
+
1598
+ .markstream-solid .footnote-link:hover {
1599
+ text-decoration: underline;
1600
+ }
1601
+
1602
+ .markstream-solid .footnote-anchor {
1603
+ margin-left: 5.6px;
1604
+ color: var(--link-color);
1605
+ font-size: 0.875em;
1606
+ text-decoration: none;
1607
+ cursor: pointer;
1608
+ }
1609
+
1610
+ .markstream-solid .footnote-anchor:hover {
1611
+ text-decoration: underline;
1612
+ }
1613
+
1614
+ .markstream-solid .math-inline-wrapper {
1615
+ position: relative;
1616
+ display: inline-block;
1617
+ }
1618
+
1619
+ .markstream-solid .math-inline {
1620
+ display: inline-block;
1621
+ vertical-align: middle;
1622
+ }
1623
+
1624
+ .markstream-solid .math-inline--hidden {
1625
+ visibility: hidden;
1626
+ }
1627
+
1628
+ .markstream-solid .math-inline__loading {
1629
+ display: inline-flex;
1630
+ align-items: center;
1631
+ justify-content: center;
1632
+ pointer-events: none;
1633
+ }
1634
+
1635
+ .markstream-solid .math-inline__spinner {
1636
+ width: 16px;
1637
+ height: 16px;
1638
+ border-radius: 9999px;
1639
+ border: 2px solid rgba(94, 104, 121, 0.25);
1640
+ border-top-color: rgba(94, 104, 121, 0.8);
1641
+ animation: spin 1s linear infinite;
1642
+ }
1643
+
1644
+ .markstream-solid .math-block,
1645
+ .markstream-solid .markstream-nested-math-block {
1646
+ position: relative;
1647
+ text-align: center;
1648
+ overflow-x: auto;
1649
+ min-height: 40px;
1650
+ padding: 8px;
1651
+ }
1652
+
1653
+ .markstream-solid .math-rendering {
1654
+ opacity: 0.3;
1655
+ transition: opacity 0.2s ease;
1656
+ }
1657
+
1658
+ .markstream-solid .markstream-nested-math[data-markstream-katex="1"] .markstream-nested-math__source,
1659
+ .markstream-solid .markstream-nested-math-block--rendered > .markstream-nested-math-block__source {
1660
+ display: none;
1661
+ }
1662
+
1663
+ .markstream-solid .markstream-nested-math-block__render .katex-display {
1664
+ margin: 0;
1665
+ overflow-x: auto;
1666
+ overflow-y: hidden;
1667
+ }
1668
+
1669
+ .markstream-solid .markstream-solid-mermaid {
1670
+ background: transparent;
1671
+ color: hsl(var(--ms-foreground));
1672
+ }
1673
+
1674
+ .markstream-solid.dark .markstream-solid-mermaid,
1675
+ .dark .markstream-solid .markstream-solid-mermaid {
1676
+ background: transparent;
1677
+ color: hsl(var(--ms-foreground));
1678
+ }
1679
+
1680
+ .markstream-solid .markstream-solid-mermaid svg {
1681
+ display: block;
1682
+ max-width: 100%;
1683
+ height: auto;
1684
+ margin: 0 auto;
1685
+ }
1686
+
1687
+ .markstream-solid .mermaid-block {
1688
+ margin: var(--ms-flow-diagram-y) 0;
1689
+ border: 1px solid var(--diagram-border);
1690
+ border-radius: 8px;
1691
+ overflow: hidden;
1692
+ background: var(--diagram-bg);
1693
+ color: hsl(var(--ms-foreground));
1694
+ box-shadow: var(--ms-shadow-subtle);
1695
+ }
1696
+
1697
+ .markstream-solid.dark .mermaid-block,
1698
+ .dark .markstream-solid .mermaid-block {
1699
+ border-color: var(--diagram-border);
1700
+ background: var(--diagram-bg);
1701
+ color: hsl(var(--ms-foreground));
1702
+ }
1703
+
1704
+ .markstream-solid.markstream-solid-modal-root {
1705
+ position: fixed;
1706
+ inset: 0;
1707
+ z-index: 9999;
1708
+ width: auto;
1709
+ contain: none;
1710
+ content-visibility: visible;
1711
+ pointer-events: none;
1712
+ }
1713
+
1714
+ .markstream-solid .mermaid-modal-overlay {
1715
+ position: fixed;
1716
+ inset: 0;
1717
+ z-index: 9999;
1718
+ display: flex;
1719
+ align-items: center;
1720
+ justify-content: center;
1721
+ padding: 16px;
1722
+ background: var(--modal-overlay);
1723
+ pointer-events: auto;
1724
+ }
1725
+
1726
+ .markstream-solid .mermaid-modal-panel {
1727
+ position: relative;
1728
+ width: 100%;
1729
+ height: 100%;
1730
+ max-width: 100%;
1731
+ max-height: 100%;
1732
+ border-radius: 8px;
1733
+ overflow: hidden;
1734
+ background: var(--modal-bg);
1735
+ color: var(--modal-fg);
1736
+ box-shadow: var(--ms-shadow-modal);
1737
+ }
1738
+
1739
+ .markstream-solid .mermaid-modal-panel.is-dark {
1740
+ background: var(--modal-bg);
1741
+ color: var(--modal-fg);
1742
+ }
1743
+
1744
+ .markstream-solid .mermaid-modal-header {
1745
+ display: flex;
1746
+ align-items: center;
1747
+ justify-content: space-between;
1748
+ padding: 8px 16px;
1749
+ border-bottom: 1px solid rgba(148, 163, 184, 0.25);
1750
+ }
1751
+
1752
+ .markstream-solid .mermaid-modal-title {
1753
+ font-size: 14px;
1754
+ font-weight: 600;
1755
+ }
1756
+
1757
+ .markstream-solid .mermaid-modal-close {
1758
+ font-size: 14px;
1759
+ padding: 4px 8px;
1760
+ border-radius: 6px;
1761
+ cursor: pointer;
1762
+ opacity: 0.9;
1763
+ }
1764
+
1765
+ .markstream-solid .mermaid-modal-close:hover {
1766
+ opacity: 1;
1767
+ background: rgba(148, 163, 184, 0.16);
1768
+ }
1769
+
1770
+ .markstream-solid .mermaid-modal-controls {
1771
+ position: absolute;
1772
+ top: 24px;
1773
+ right: 24px;
1774
+ z-index: 2;
1775
+ display: inline-flex;
1776
+ align-items: center;
1777
+ gap: 8px;
1778
+ }
1779
+
1780
+ .markstream-solid .mermaid-modal-body {
1781
+ width: 100%;
1782
+ height: 100%;
1783
+ overflow: hidden;
1784
+ }
1785
+
1786
+ .markstream-solid .mermaid-modal-content {
1787
+ width: 100%;
1788
+ height: 100%;
1789
+ display: flex;
1790
+ align-items: center;
1791
+ justify-content: center;
1792
+ padding: 16px;
1793
+ transform-origin: center center;
1794
+ overflow: hidden;
1795
+ }
1796
+
1797
+ .markstream-solid .mermaid-modal-content svg,
1798
+ .markstream-solid .infographic-modal-content svg {
1799
+ max-width: 100%;
1800
+ max-height: 100%;
1801
+ height: auto;
1802
+ }
1803
+
1804
+ .markstream-solid .fullscreen {
1805
+ width: 100%;
1806
+ max-height: 100% !important;
1807
+ height: 100% !important;
1808
+ }
1809
+
1810
+ .markstream-solid .mermaid-header {
1811
+ display: grid;
1812
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
1813
+ align-items: center;
1814
+ gap: 12px;
1815
+ padding: var(--ms-inset-panel-y) var(--ms-inset-panel-x);
1816
+ border-bottom: 1px solid var(--diagram-border);
1817
+ background: var(--diagram-header-bg);
1818
+ color: hsl(var(--ms-foreground));
1819
+ }
1820
+
1821
+ .markstream-solid.dark .mermaid-header,
1822
+ .dark .markstream-solid .mermaid-header {
1823
+ background: var(--diagram-header-bg);
1824
+ border-color: var(--diagram-border);
1825
+ }
1826
+
1827
+ .markstream-solid .mermaid-header__title,
1828
+ .markstream-solid .icon-slot {
1829
+ display: inline-flex;
1830
+ align-items: center;
1831
+ }
1832
+
1833
+ .markstream-solid .mermaid-header__title {
1834
+ min-width: 0;
1835
+ gap: 8px;
1836
+ overflow: hidden;
1837
+ }
1838
+
1839
+ .markstream-solid .action-icon {
1840
+ width: var(--ms-action-btn-icon);
1841
+ height: var(--ms-action-btn-icon);
1842
+ flex: 0 0 auto;
1843
+ }
1844
+
1845
+ .markstream-solid .icon-slot {
1846
+ justify-content: center;
1847
+ }
1848
+
1849
+ .markstream-solid .icon-slot svg {
1850
+ display: block;
1851
+ width: 100%;
1852
+ height: 100%;
1853
+ }
1854
+
1855
+ .markstream-solid .mermaid-title__text {
1856
+ min-width: 0;
1857
+ overflow: hidden;
1858
+ color: var(--code-action-fg);
1859
+ font:
1860
+ 500 var(--ms-text-label)/1.2 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
1861
+ text-overflow: ellipsis;
1862
+ white-space: nowrap;
1863
+ }
1864
+
1865
+ .markstream-solid .mermaid-actions {
1866
+ display: flex;
1867
+ align-items: center;
1868
+ gap: var(--ms-gap-header-actions);
1869
+ grid-column: 3;
1870
+ justify-content: flex-end;
1871
+ justify-self: end;
1872
+ }
1873
+
1874
+ .markstream-solid .mermaid-action-btn,
1875
+ .markstream-solid .mermaid-btn {
1876
+ display: inline-flex;
1877
+ align-items: center;
1878
+ justify-content: center;
1879
+ border: 0;
1880
+ background: transparent;
1881
+ color: var(--code-action-fg);
1882
+ font:
1883
+ 500 var(--ms-text-label)/1 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
1884
+ padding: var(--ms-action-btn-padding);
1885
+ border-radius: 4px;
1886
+ cursor: pointer;
1887
+ transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease, transform 0.15s ease;
1888
+ }
1889
+
1890
+ .markstream-solid .mermaid-btn--icon {
1891
+ width: calc(var(--ms-action-btn-icon) + var(--ms-action-btn-padding) + var(--ms-action-btn-padding));
1892
+ height: calc(var(--ms-action-btn-icon) + var(--ms-action-btn-padding) + var(--ms-action-btn-padding));
1893
+ }
1894
+
1895
+ .markstream-solid .mermaid-action-btn svg,
1896
+ .markstream-solid .mermaid-btn svg,
1897
+ .markstream-solid .mermaid-toggle-btn svg {
1898
+ display: block;
1899
+ width: var(--ms-action-btn-icon);
1900
+ height: var(--ms-action-btn-icon);
1901
+ flex: 0 0 auto;
1902
+ }
1903
+
1904
+ .markstream-solid .mermaid-action-btn:hover:not(:disabled),
1905
+ .markstream-solid .mermaid-btn:hover:not(:disabled) {
1906
+ background: var(--code-action-hover-bg);
1907
+ color: var(--code-action-hover-fg);
1908
+ }
1909
+
1910
+ .markstream-solid.dark .mermaid-btn:hover:not(:disabled),
1911
+ .dark .markstream-solid .mermaid-btn:hover:not(:disabled) {
1912
+ background: var(--code-action-hover-bg);
1913
+ color: var(--code-action-hover-fg);
1914
+ }
1915
+
1916
+ .markstream-solid .mermaid-action-btn:active,
1917
+ .markstream-solid .mermaid-btn:active {
1918
+ transform: scale(0.98);
1919
+ }
1920
+
1921
+ .markstream-solid .mermaid-btn:disabled {
1922
+ opacity: 0.4;
1923
+ cursor: not-allowed;
1924
+ }
1925
+
1926
+ .markstream-solid .mermaid-toggle {
1927
+ display: inline-flex;
1928
+ align-items: center;
1929
+ gap: 2px;
1930
+ grid-column: 2;
1931
+ background: transparent;
1932
+ }
1933
+
1934
+ .markstream-solid .mermaid-toggle-btn {
1935
+ border: none;
1936
+ background: transparent;
1937
+ color: var(--code-action-fg);
1938
+ font:
1939
+ 500 var(--ms-text-label)/1 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
1940
+ padding: 2px 8px;
1941
+ border-radius: 4px;
1942
+ cursor: pointer;
1943
+ opacity: 0.6;
1944
+ transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;
1945
+ }
1946
+
1947
+ .markstream-solid .mermaid-action-content {
1948
+ display: inline-flex;
1949
+ align-items: center;
1950
+ gap: 4px;
1951
+ }
1952
+
1953
+ .markstream-solid .mermaid-toggle-btn:hover {
1954
+ opacity: 0.9;
1955
+ }
1956
+
1957
+ .markstream-solid .mermaid-toggle-btn--active {
1958
+ background: hsl(var(--ms-foreground) / 0.08);
1959
+ color: var(--code-fg);
1960
+ opacity: 1;
1961
+ }
1962
+
1963
+ .markstream-solid.dark .mermaid-toggle-btn--active,
1964
+ .dark .markstream-solid .mermaid-toggle-btn--active {
1965
+ background: hsl(var(--ms-foreground) / 0.08);
1966
+ color: var(--code-fg);
1967
+ }
1968
+
1969
+ /* The pan transform is applied to `.mermaid-preview` itself, and a transformed
1970
+ element paints above the header it overlaps; the body is what clips the panned
1971
+ diagram back into the preview area. clip (not auto/hidden) means it is not a
1972
+ scroll container at all, so a touch swipe keeps scrolling the page. */
1973
+ .markstream-solid .mermaid-body {
1974
+ position: relative;
1975
+ padding: 0;
1976
+ overflow: clip;
1977
+ }
1978
+
1979
+ .markstream-solid .markstream-solid-zoom-controls {
1980
+ position: absolute;
1981
+ top: 12px;
1982
+ right: 12px;
1983
+ z-index: 2;
1984
+ display: inline-flex;
1985
+ align-items: center;
1986
+ gap: 4px;
1987
+ padding: 4px;
1988
+ border: 1px solid rgba(148, 163, 184, 0.3);
1989
+ border-radius: 8px;
1990
+ background: rgba(255, 255, 255, 0.82);
1991
+ backdrop-filter: blur(10px);
1992
+ }
1993
+
1994
+ .markstream-solid.dark .markstream-solid-zoom-controls,
1995
+ .dark .markstream-solid .markstream-solid-zoom-controls {
1996
+ background: rgba(15, 23, 42, 0.78);
1997
+ border-color: rgba(71, 85, 105, 0.65);
1998
+ }
1999
+
2000
+ .markstream-solid .mermaid-preview {
2001
+ width: 100%;
2002
+ min-height: var(--ms-size-diagram-min-height);
2003
+ /* clip, not auto: an overflow:auto pan surface is a "user-scrollable" box,
2004
+ so a touch swipe latches onto it and, when nothing can scroll there, the
2005
+ page does not scroll either. clip is never a scroll container and clips
2006
+ the same (the diagram is scaled to fit). */
2007
+ overflow: clip;
2008
+ display: flex;
2009
+ align-items: center;
2010
+ justify-content: center;
2011
+ text-align: center;
2012
+ transform-origin: top center;
2013
+ }
2014
+
2015
+ .markstream-solid .mermaid-preview svg {
2016
+ width: 100%;
2017
+ height: auto;
2018
+ }
2019
+
2020
+ /* The pan surface takes the touch gesture instead of letting the page scroller
2021
+ claim it, which would fire pointercancel and stop the drag mid-gesture. The
2022
+ class is only bound while panning can reveal something (zoomed in, or in the
2023
+ fullscreen modal), so at fit zoom a swipe keeps scrolling the page. */
2024
+ .markstream-solid .markstream-solid-pan-touch {
2025
+ touch-action: none;
2026
+ }
2027
+
2028
+ .markstream-solid .mermaid-source {
2029
+ margin: 0;
2030
+ padding: var(--ms-inset-panel-body);
2031
+ border-radius: 0;
2032
+ background: var(--diagram-bg);
2033
+ color: hsl(var(--ms-foreground));
2034
+ box-shadow: none;
2035
+ white-space: pre-wrap;
2036
+ font-family: ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2037
+ font-size: 14px;
2038
+ line-height: 20px;
2039
+ overflow-x: auto;
2040
+ }
2041
+
2042
+ .markstream-solid .mermaid-source code {
2043
+ padding: 0;
2044
+ background: transparent;
2045
+ color: inherit;
2046
+ font: inherit;
2047
+ white-space: inherit;
2048
+ }
2049
+
2050
+ .markstream-solid .mermaid-error {
2051
+ padding: 13.6px 16px;
2052
+ color: #b91c1c;
2053
+ background: rgba(248, 113, 113, 0.15);
2054
+ border-top: 1px solid rgba(248, 113, 113, 0.25);
2055
+ }
2056
+
2057
+ .markstream-solid .mermaid-loading {
2058
+ display: flex;
2059
+ align-items: center;
2060
+ gap: 8px;
2061
+ padding: 12px 16px 16px;
2062
+ font-size: 13.6px;
2063
+ color: rgba(15, 23, 42, 0.6);
2064
+ }
2065
+
2066
+ .markstream-solid.dark .mermaid-loading,
2067
+ .dark .markstream-solid .mermaid-loading {
2068
+ color: rgba(226, 232, 240, 0.7);
2069
+ }
2070
+
2071
+ .markstream-solid .mermaid-spinner {
2072
+ width: 13.6px;
2073
+ height: 13.6px;
2074
+ border-radius: 9999px;
2075
+ border: 2px solid rgba(59, 130, 246, 0.2);
2076
+ border-top-color: #2563eb;
2077
+ animation: spin 1s linear infinite;
2078
+ }
2079
+
2080
+ .markstream-solid .markstream-solid-enhanced-block {
2081
+ margin: var(--ms-flow-diagram-y) 0;
2082
+ border-radius: 8px;
2083
+ overflow: hidden;
2084
+ border: 1px solid var(--diagram-border);
2085
+ background: var(--diagram-bg);
2086
+ color: hsl(var(--ms-foreground));
2087
+ box-shadow: var(--ms-shadow-subtle);
2088
+ }
2089
+
2090
+ .markstream-solid .markstream-solid-enhanced-block__header {
2091
+ display: grid;
2092
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
2093
+ align-items: center;
2094
+ gap: 12px;
2095
+ padding: var(--ms-inset-panel-y) var(--ms-inset-panel-x);
2096
+ border-bottom: 1px solid var(--diagram-border);
2097
+ background: var(--diagram-header-bg);
2098
+ }
2099
+
2100
+ .markstream-solid .markstream-solid-enhanced-block__actions {
2101
+ display: inline-flex;
2102
+ align-items: center;
2103
+ justify-content: flex-end;
2104
+ justify-self: end;
2105
+ grid-column: 3;
2106
+ gap: var(--ms-gap-header-actions);
2107
+ }
2108
+
2109
+ .markstream-solid .markstream-solid-enhanced-block__title {
2110
+ display: inline-flex;
2111
+ align-items: center;
2112
+ min-width: 0;
2113
+ gap: 8px;
2114
+ }
2115
+
2116
+ .markstream-solid .markstream-solid-enhanced-block__title-icon {
2117
+ display: inline-flex;
2118
+ align-items: center;
2119
+ justify-content: center;
2120
+ flex: 0 0 auto;
2121
+ width: 16px;
2122
+ height: 16px;
2123
+ }
2124
+
2125
+ .markstream-solid .markstream-solid-enhanced-block__title-text {
2126
+ overflow: hidden;
2127
+ font:
2128
+ 500 var(--ms-text-label)/1.2 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
2129
+ text-overflow: ellipsis;
2130
+ white-space: nowrap;
2131
+ }
2132
+
2133
+ .markstream-solid .markstream-solid-enhanced-block__action {
2134
+ display: inline-flex;
2135
+ align-items: center;
2136
+ justify-content: center;
2137
+ padding: var(--ms-action-btn-padding);
2138
+ border: 0;
2139
+ border-radius: 4px;
2140
+ background: transparent;
2141
+ box-shadow: none;
2142
+ color: var(--code-action-fg);
2143
+ font:
2144
+ 500 var(--ms-text-label)/1 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
2145
+ cursor: pointer;
2146
+ transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease, transform 0.15s ease;
2147
+ }
2148
+
2149
+ .markstream-solid .markstream-solid-enhanced-block__action-content {
2150
+ display: inline-flex;
2151
+ align-items: center;
2152
+ gap: 5.6px;
2153
+ }
2154
+
2155
+ .markstream-solid .markstream-solid-enhanced-block__action--icon {
2156
+ width: calc(var(--ms-action-btn-icon) + var(--ms-action-btn-padding) + var(--ms-action-btn-padding));
2157
+ height: calc(var(--ms-action-btn-icon) + var(--ms-action-btn-padding) + var(--ms-action-btn-padding));
2158
+ }
2159
+
2160
+ .markstream-solid .markstream-solid-enhanced-block__action:hover {
2161
+ background: var(--code-action-hover-bg);
2162
+ color: var(--code-action-hover-fg);
2163
+ }
2164
+
2165
+ .markstream-solid .markstream-solid-enhanced-block__action:active {
2166
+ transform: scale(0.98);
2167
+ }
2168
+
2169
+ .markstream-solid .markstream-solid-enhanced-block__action:disabled {
2170
+ opacity: 0.45;
2171
+ cursor: not-allowed;
2172
+ }
2173
+
2174
+ .markstream-solid .markstream-solid-enhanced-block__action:disabled:hover {
2175
+ background: transparent;
2176
+ }
2177
+
2178
+ .markstream-solid .markstream-solid-enhanced-block__badge {
2179
+ display: inline-flex;
2180
+ align-items: center;
2181
+ padding: 3.52px 8.8px;
2182
+ border-radius: 999px;
2183
+ background: rgba(37, 99, 235, 0.1);
2184
+ color: #1d4ed8;
2185
+ font:
2186
+ 700 11.52px/1 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
2187
+ letter-spacing: 0.04em;
2188
+ text-transform: uppercase;
2189
+ }
2190
+
2191
+ .markstream-solid .markstream-solid-enhanced-block__body {
2192
+ position: relative;
2193
+ overflow: auto;
2194
+ padding: var(--ms-inset-panel-body);
2195
+ background: var(--diagram-bg);
2196
+ }
2197
+
2198
+ .markstream-solid .markstream-solid-enhanced-block__body > :first-child {
2199
+ margin-top: 0;
2200
+ }
2201
+
2202
+ .markstream-solid .markstream-solid-enhanced-block__body > :last-child {
2203
+ margin-bottom: 0;
2204
+ }
2205
+
2206
+ .markstream-solid .markstream-solid-enhanced-block__body--code {
2207
+ padding: 0;
2208
+ background: #0b1220;
2209
+ }
2210
+
2211
+ .markstream-solid .markstream-solid-enhanced-block__body--code .stream-diffs-shell,
2212
+ .markstream-solid .markstream-solid-enhanced-block__body--code diffs-container {
2213
+ min-height: inherit;
2214
+ }
2215
+
2216
+ .markstream-solid .markstream-solid-enhanced-block__details {
2217
+ margin: 0;
2218
+ border-top: 1px solid rgba(15, 23, 42, 0.08);
2219
+ border-radius: 0;
2220
+ background: rgba(248, 250, 252, 0.92);
2221
+ }
2222
+
2223
+ .markstream-solid .markstream-solid-enhanced-block__details summary {
2224
+ padding: 12.8px 15.2px;
2225
+ }
2226
+
2227
+ .markstream-solid .markstream-solid-enhanced-block__source {
2228
+ margin: 0;
2229
+ border-radius: 0;
2230
+ }
2231
+
2232
+ .markstream-solid .markstream-solid-enhanced-block--d2 svg,
2233
+ .markstream-solid .markstream-solid-enhanced-block--infographic svg {
2234
+ display: block;
2235
+ width: 100%;
2236
+ height: auto;
2237
+ }
2238
+
2239
+ .markstream-solid .markstream-solid-enhanced-block .markstream-solid-enhanced-block__title-icon svg,
2240
+ .markstream-solid .markstream-solid-enhanced-block .markstream-solid-enhanced-block__action svg {
2241
+ width: var(--ms-action-btn-icon);
2242
+ height: var(--ms-action-btn-icon);
2243
+ flex: 0 0 auto;
2244
+ }
2245
+
2246
+ .markstream-solid .infographic-label {
2247
+ color: hsl(var(--ms-muted-foreground));
2248
+ }
2249
+
2250
+ .markstream-solid .infographic-mode-toggle {
2251
+ display: inline-flex;
2252
+ align-items: center;
2253
+ gap: 2px;
2254
+ grid-column: 2;
2255
+ background: transparent;
2256
+ }
2257
+
2258
+ .markstream-solid .infographic-mode-btn {
2259
+ color: var(--code-action-fg);
2260
+ opacity: 0.6;
2261
+ }
2262
+
2263
+ .markstream-solid .infographic-mode-btn:hover {
2264
+ opacity: 0.9;
2265
+ }
2266
+
2267
+ .markstream-solid .infographic-mode-btn.is-active {
2268
+ background: hsl(var(--ms-foreground) / 0.08);
2269
+ color: var(--code-fg);
2270
+ opacity: 1;
2271
+ }
2272
+
2273
+ .markstream-solid .infographic-action-btn,
2274
+ .markstream-solid .infographic-zoom-reset {
2275
+ font-family: inherit;
2276
+ color: var(--code-action-fg);
2277
+ }
2278
+
2279
+ .markstream-solid .infographic-action-btn:hover:not(:disabled),
2280
+ .markstream-solid .infographic-zoom-reset:hover:not(:disabled) {
2281
+ background: var(--code-action-hover-bg);
2282
+ color: var(--code-action-hover-fg);
2283
+ }
2284
+
2285
+ .markstream-solid .infographic-block-body {
2286
+ padding: 0;
2287
+ background: var(--diagram-bg);
2288
+ /* The pan transform is applied to .infographic-render itself, so the body is
2289
+ what clips the panned diagram back into the preview area. clip (not the
2290
+ base __body's auto) so it is not a scroll container a swipe could latch on. */
2291
+ overflow: clip;
2292
+ }
2293
+
2294
+ .markstream-solid .infographic-source {
2295
+ padding: var(--ms-inset-panel-body);
2296
+ background: var(--diagram-bg);
2297
+ }
2298
+
2299
+ .markstream-solid .infographic-source-code {
2300
+ margin: 0;
2301
+ padding: 0;
2302
+ border-radius: 0;
2303
+ background: transparent;
2304
+ color: hsl(var(--ms-foreground));
2305
+ box-shadow: none;
2306
+ white-space: pre-wrap;
2307
+ font-family: ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2308
+ font-size: 14px;
2309
+ line-height: 20px;
2310
+ }
2311
+
2312
+ .markstream-solid .infographic-source-code code {
2313
+ padding: 0;
2314
+ background: transparent;
2315
+ color: inherit;
2316
+ font: inherit;
2317
+ white-space: inherit;
2318
+ }
2319
+
2320
+ .markstream-solid.dark .markstream-solid-enhanced-block,
2321
+ .dark .markstream-solid .markstream-solid-enhanced-block {
2322
+ border-color: var(--diagram-border);
2323
+ background: var(--diagram-bg);
2324
+ }
2325
+
2326
+ .markstream-solid.dark .markstream-solid-enhanced-block__header,
2327
+ .dark .markstream-solid .markstream-solid-enhanced-block__header {
2328
+ border-bottom-color: var(--diagram-border);
2329
+ background: var(--diagram-header-bg);
2330
+ }
2331
+
2332
+ .markstream-solid.dark .markstream-solid-enhanced-block__action,
2333
+ .dark .markstream-solid .markstream-solid-enhanced-block__action {
2334
+ background: transparent;
2335
+ box-shadow: none;
2336
+ }
2337
+
2338
+ .markstream-solid.dark .markstream-solid-enhanced-block__action:hover,
2339
+ .dark .markstream-solid .markstream-solid-enhanced-block__action:hover {
2340
+ background: var(--code-action-hover-bg);
2341
+ }
2342
+
2343
+ .markstream-solid.dark .markstream-solid-enhanced-block__action:disabled:hover,
2344
+ .dark .markstream-solid .markstream-solid-enhanced-block__action:disabled:hover {
2345
+ background: transparent;
2346
+ }
2347
+
2348
+ .markstream-solid.dark .markstream-solid-enhanced-block__badge,
2349
+ .dark .markstream-solid .markstream-solid-enhanced-block__badge {
2350
+ background: rgba(96, 165, 250, 0.16);
2351
+ color: #93c5fd;
2352
+ }
2353
+
2354
+ .markstream-solid.dark .markstream-solid-enhanced-block__body,
2355
+ .dark .markstream-solid .markstream-solid-enhanced-block__body {
2356
+ background: var(--diagram-bg);
2357
+ }
2358
+
2359
+ .markstream-solid.dark .markstream-solid-enhanced-block__details,
2360
+ .dark .markstream-solid .markstream-solid-enhanced-block__details {
2361
+ border-top-color: rgba(148, 163, 184, 0.18);
2362
+ background: rgba(15, 23, 42, 0.96);
2363
+ }
2364
+
2365
+ @keyframes node-placeholder-shimmer {
2366
+ from { transform: translateX(0); }
2367
+ to { transform: translateX(80%); }
2368
+ }
2369
+
2370
+ @keyframes spin {
2371
+ to {
2372
+ transform: rotate(360deg);
2373
+ }
2374
+ }
2375
+
2376
+ @keyframes typewriter-fade {
2377
+ from {
2378
+ opacity: 0;
2379
+ }
2380
+
2381
+ to {
2382
+ opacity: 1;
2383
+ }
2384
+ }
2385
+
2386
+ .markstream-solid .code-block-container {
2387
+ --markstream-code-fallback-bg: var(--code-bg);
2388
+ --markstream-code-fallback-fg: var(--code-fg);
2389
+ --markstream-code-border-color: var(--code-border);
2390
+ --markstream-diff-shell-fg: #0f172a;
2391
+ --markstream-diff-shell-muted: #64748b;
2392
+ --markstream-diff-shell-border: rgba(148, 163, 184, 0.24);
2393
+ --markstream-diff-shell-bg: #ffffff;
2394
+ --markstream-diff-header-border: rgba(148, 163, 184, 0.18);
2395
+ --markstream-diff-editor-bg: #111111;
2396
+ --markstream-diff-editor-fg: #d4d4d4;
2397
+ --markstream-diff-unchanged-fg: #d4d4d4;
2398
+ --markstream-diff-unchanged-bg: rgba(64, 64, 64, 0.92);
2399
+ --markstream-diff-unchanged-divider: rgba(255, 255, 255, 0.18);
2400
+ --markstream-diff-focus: rgba(96, 165, 250, 0.42);
2401
+ --markstream-diff-widget-shadow: rgba(0, 0, 0, 0.72);
2402
+ --markstream-diff-action-hover: rgba(148, 163, 184, 0.18);
2403
+ --markstream-diff-pane-divider: rgba(82, 82, 91, 0.34);
2404
+ --markstream-diff-gutter-gap: 8px;
2405
+ --markstream-diff-line-number: rgba(161, 161, 170, 0.68);
2406
+ --markstream-diff-line-number-active: rgba(228, 228, 231, 0.82);
2407
+ --markstream-diff-added-fg: #5eead4;
2408
+ --markstream-diff-removed-fg: #fda4af;
2409
+ --markstream-diff-added-line: rgba(13, 148, 136, 0.18);
2410
+ --markstream-diff-removed-line: rgba(225, 29, 72, 0.18);
2411
+ --markstream-diff-added-inline: rgba(45, 212, 191, 0.24);
2412
+ --markstream-diff-removed-inline: rgba(251, 113, 133, 0.24);
2413
+ --markstream-diff-added-inline-border: transparent;
2414
+ --markstream-diff-removed-inline-border: transparent;
2415
+ --markstream-diff-added-line-fill: rgba(13, 148, 136, 0.18);
2416
+ --markstream-diff-removed-line-fill: rgba(225, 29, 72, 0.18);
2417
+ margin: 16px 0;
2418
+ overflow: hidden;
2419
+ border: 1px solid rgba(148, 163, 184, 0.24);
2420
+ border-radius: 12px;
2421
+ background: var(--markstream-code-fallback-bg, var(--code-bg));
2422
+ color: var(--markstream-code-fallback-fg, var(--code-fg));
2423
+ box-shadow: 0 18px 38px -28px rgba(15, 23, 42, 0.45);
2424
+ }
2425
+
2426
+ .markstream-solid .code-block-container.is-dark,
2427
+ .dark .markstream-solid .code-block-container {
2428
+ --markstream-code-fallback-bg: #111827;
2429
+ --markstream-code-fallback-fg: hsl(0 0% 93%);
2430
+ --markstream-diff-shell-fg: #e2e8f0;
2431
+ --markstream-diff-shell-muted: #94a3b8;
2432
+ --markstream-diff-shell-border: rgba(82, 82, 91, 0.56);
2433
+ --markstream-diff-shell-bg: rgba(10, 10, 11, 0.99);
2434
+ --markstream-diff-header-border: rgba(63, 63, 70, 0.82);
2435
+ --markstream-diff-editor-bg: rgba(12, 12, 14, 0.99);
2436
+ --markstream-diff-editor-fg: #b6c2d3;
2437
+ --markstream-diff-unchanged-fg: #cbd5e1;
2438
+ --markstream-diff-unchanged-bg: rgba(24, 24, 27, 0.92);
2439
+ --markstream-diff-unchanged-divider: rgba(255, 255, 255, 0.18);
2440
+ --markstream-diff-action-hover: rgba(255, 255, 255, 0.08);
2441
+ border-color: rgba(71, 85, 105, 0.55);
2442
+ background: var(--markstream-code-fallback-bg, var(--code-bg));
2443
+ color: var(--markstream-code-fallback-fg, var(--code-fg));
2444
+ box-shadow: 0 22px 44px -30px rgba(2, 6, 23, 0.95);
2445
+ }
2446
+
2447
+ .markstream-solid .code-block-container.is-plain-text .stream-diffs-shell,
2448
+ .markstream-solid .code-block-container.is-plain-text diffs-container {
2449
+ background: var(--vscode-editor-background, var(--markstream-code-fallback-bg)) !important;
2450
+ color: var(--vscode-editor-foreground, var(--markstream-code-fallback-fg)) !important;
2451
+ }
2452
+
2453
+ .markstream-solid .code-block-header {
2454
+ display: flex;
2455
+ align-items: center;
2456
+ justify-content: space-between;
2457
+ gap: var(--ms-gap-header);
2458
+ padding: var(--ms-inset-panel-y) var(--ms-inset-panel-x);
2459
+ border-bottom: 1px solid var(--code-border);
2460
+ background: var(--code-header-bg);
2461
+ color: var(--code-fg);
2462
+ border-radius: var(--ms-radius) var(--ms-radius) 0 0;
2463
+ }
2464
+
2465
+ .markstream-solid .code-block-header__meta {
2466
+ display: flex;
2467
+ flex: 1 1 auto;
2468
+ align-items: center;
2469
+ gap: var(--ms-gap-header-main);
2470
+ min-width: 0;
2471
+ }
2472
+
2473
+ .markstream-solid .code-block-header__label {
2474
+ min-width: 0;
2475
+ overflow: hidden;
2476
+ color: var(--code-action-fg);
2477
+ text-overflow: ellipsis;
2478
+ white-space: nowrap;
2479
+ font-size: var(--ms-text-label);
2480
+ font-weight: 500;
2481
+ line-height: 1.2;
2482
+ }
2483
+
2484
+ .markstream-solid .code-block-header__actions {
2485
+ display: flex;
2486
+ flex: 0 0 auto;
2487
+ align-items: center;
2488
+ justify-content: flex-end;
2489
+ gap: var(--ms-gap-header-actions);
2490
+ margin-left: auto;
2491
+ }
2492
+
2493
+ .markstream-solid .code-block-language-icon {
2494
+ width: 16px;
2495
+ height: 16px;
2496
+ flex: 0 0 16px;
2497
+ color: #2563eb;
2498
+ }
2499
+
2500
+ .markstream-solid.dark .code-block-language-icon,
2501
+ .dark .markstream-solid .code-block-language-icon {
2502
+ color: #93c5fd;
2503
+ }
2504
+
2505
+ .markstream-solid .code-block-language-icon svg,
2506
+ .markstream-solid .code-block-language-icon img {
2507
+ display: block;
2508
+ width: 100%;
2509
+ height: 100%;
2510
+ }
2511
+
2512
+ .markstream-solid .code-block-language-icon__image {
2513
+ -o-object-fit: contain;
2514
+ object-fit: contain;
2515
+ }
2516
+
2517
+ .markstream-solid .code-block-body {
2518
+ position: relative;
2519
+ display: grid;
2520
+ grid-template-columns: minmax(0, 1fr);
2521
+ min-width: 0;
2522
+ overflow: hidden;
2523
+ background: var(--markstream-code-fallback-bg, var(--code-bg));
2524
+ }
2525
+
2526
+ .markstream-solid .code-block-body > .code-editor-container,
2527
+ .markstream-solid .code-block-body > .code-editor-fallback-surface {
2528
+ grid-area: 1 / 1;
2529
+ }
2530
+
2531
+ .markstream-solid .code-editor-fallback-surface {
2532
+ min-width: 0;
2533
+ background: var(--markstream-code-fallback-bg, var(--code-bg));
2534
+ }
2535
+
2536
+ /* Once the enhanced editor owns the grid row, the retired fallback must leave
2537
+ layout entirely: visibility-only hiding keeps the row at the fallback's
2538
+ (uncollapsed) height, so collapsed diffs reserve space they no longer use. */
2539
+ .markstream-solid .code-editor-fallback-surface.is-retired {
2540
+ display: none;
2541
+ }
2542
+
2543
+ .code-block-body--expanded {
2544
+ max-height: none;
2545
+ }
2546
+
2547
+ .code-block-body--collapsed {
2548
+ min-height: 0;
2549
+ height: 0;
2550
+ overflow: hidden;
2551
+ }
2552
+
2553
+ .markstream-solid .code-action-btn {
2554
+ display: inline-flex;
2555
+ align-items: center;
2556
+ justify-content: center;
2557
+ padding: var(--ms-action-btn-padding);
2558
+ border-radius: 6px;
2559
+ color: var(--code-action-fg);
2560
+ transition: background-color 140ms ease, color 140ms ease, transform 140ms ease, opacity 140ms ease;
2561
+ }
2562
+
2563
+ .markstream-solid .code-action-btn:hover {
2564
+ background: var(--code-action-hover-bg);
2565
+ color: var(--code-action-hover-fg);
2566
+ }
2567
+
2568
+ .markstream-solid .code-action-btn__icon,
2569
+ .markstream-solid .code-action-btn svg {
2570
+ display: block;
2571
+ width: 12.8px;
2572
+ height: 12.8px;
2573
+ flex: 0 0 auto;
2574
+ }
2575
+
2576
+ .markstream-solid .code-action-btn:active {
2577
+ transform: scale(0.98);
2578
+ }
2579
+
2580
+ .markstream-solid .code-action-btn:disabled {
2581
+ opacity: 0.5;
2582
+ cursor: not-allowed;
2583
+ }
2584
+
2585
+ .markstream-solid .code-action-btn:disabled:hover {
2586
+ background: transparent;
2587
+ }
2588
+
2589
+ .markstream-solid .code-editor-container.is-hidden {
2590
+ opacity: 0;
2591
+ pointer-events: none;
2592
+ }
2593
+
2594
+ /* ── Pre fallback: non-diff line numbers (aligned with markstream-vue PreCodeNode) ── */
2595
+ .markstream-solid pre[class^='language-'],
2596
+ .markstream-solid pre[class*=' language-'] {
2597
+ white-space: pre;
2598
+ overflow: auto;
2599
+ -moz-tab-size: 2;
2600
+ -o-tab-size: 2;
2601
+ tab-size: 2;
2602
+ font-variant-ligatures: none;
2603
+ contain: content;
2604
+ backface-visibility: hidden;
2605
+ transform: translateZ(0);
2606
+ -webkit-font-smoothing: antialiased;
2607
+ }
2608
+ .markstream-solid pre[class^='language-'] > code,
2609
+ .markstream-solid pre[class*=' language-'] > code {
2610
+ display: block;
2611
+ }
2612
+
2613
+ .markstream-solid .code-block-container.is-diff {
2614
+ color: var(--markstream-diff-shell-fg);
2615
+ border-color: var(--markstream-diff-shell-border);
2616
+ background: var(--markstream-diff-shell-bg);
2617
+ --vscode-editor-selectionBackground: var(--markstream-diff-action-hover);
2618
+ }
2619
+
2620
+ .markstream-solid .code-block-container.is-diff .code-block-header {
2621
+ color: var(--markstream-diff-shell-fg);
2622
+ border-bottom-color: var(--markstream-diff-header-border);
2623
+ background: var(--markstream-diff-shell-bg);
2624
+ }
2625
+
2626
+ .markstream-solid .code-block-container.is-diff .code-action-btn {
2627
+ color: var(--markstream-diff-shell-muted);
2628
+ }
2629
+
2630
+ .markstream-solid .code-block-container.is-diff .code-block-body {
2631
+ background: var(--markstream-diff-editor-bg);
2632
+ --vscode-editor-background: var(--markstream-diff-editor-bg);
2633
+ --vscode-editor-foreground: var(--markstream-diff-editor-fg);
2634
+ --vscode-diffEditor-unchangedRegionForeground: var(--markstream-diff-unchanged-fg);
2635
+ --vscode-diffEditor-unchangedRegionBackground: var(--markstream-diff-unchanged-bg);
2636
+ --vscode-diffEditor-insertedTextBackground: var(--markstream-diff-added-inline);
2637
+ --vscode-diffEditor-removedTextBackground: var(--markstream-diff-removed-inline);
2638
+ --vscode-diffEditor-insertedLineBackground: var(--markstream-diff-added-line);
2639
+ --vscode-diffEditor-removedLineBackground: var(--markstream-diff-removed-line);
2640
+ --vscode-diffEditor-insertedTextBorder: var(--markstream-diff-added-inline-border);
2641
+ --vscode-diffEditor-removedTextBorder: var(--markstream-diff-removed-inline-border);
2642
+ --vscode-focusBorder: var(--markstream-diff-focus);
2643
+ --vscode-widget-shadow: var(--markstream-diff-widget-shadow);
2644
+ }
2645
+
2646
+ .markstream-solid .code-block-container.is-diff .code-editor-container {
2647
+ min-height: 0;
2648
+ background: var(--markstream-diff-editor-bg);
2649
+ }
2650
+
2651
+ .html-preview-frame__backdrop {
2652
+ position: fixed;
2653
+ inset: 0;
2654
+ background-color: rgba(0, 0, 0, 0.5);
2655
+ display: flex;
2656
+ align-items: center;
2657
+ justify-content: center;
2658
+ z-index: 50;
2659
+ }
2660
+
2661
+ .html-preview-frame__backdrop--dark {
2662
+ background-color: rgba(15, 23, 42, 0.8);
2663
+ }
2664
+
2665
+ .html-preview-frame {
2666
+ width: 80vw;
2667
+ max-width: 960px;
2668
+ height: 70vh;
2669
+ background-color: #fff;
2670
+ border-radius: 8px;
2671
+ overflow: hidden;
2672
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.25);
2673
+ display: flex;
2674
+ flex-direction: column;
2675
+ }
2676
+
2677
+ .html-preview-frame--dark {
2678
+ background-color: #020617;
2679
+ color: #e5e7eb;
2680
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.6);
2681
+ }
2682
+
2683
+ .html-preview-frame__header {
2684
+ display: flex;
2685
+ justify-content: space-between;
2686
+ align-items: center;
2687
+ padding: 6.4px 12px;
2688
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
2689
+ }
2690
+
2691
+ .html-preview-frame--dark .html-preview-frame__header {
2692
+ border-bottom-color: rgba(148, 163, 184, 0.35);
2693
+ }
2694
+
2695
+ .html-preview-frame__title {
2696
+ display: inline-flex;
2697
+ align-items: center;
2698
+ gap: 6.4px;
2699
+ font-size: 12px;
2700
+ font-weight: 500;
2701
+ letter-spacing: 0.02em;
2702
+ text-transform: uppercase;
2703
+ opacity: 0.85;
2704
+ }
2705
+
2706
+ .html-preview-frame__dot {
2707
+ width: 8px;
2708
+ height: 8px;
2709
+ border-radius: 999px;
2710
+ background-color: #22c55e;
2711
+ }
2712
+
2713
+ .html-preview-frame--dark .html-preview-frame__dot {
2714
+ background-color: #4ade80;
2715
+ }
2716
+
2717
+ .html-preview-frame__label {
2718
+ white-space: nowrap;
2719
+ }
2720
+
2721
+ .html-preview-frame__close {
2722
+ border: none;
2723
+ background: transparent;
2724
+ font-size: 20px;
2725
+ line-height: 1;
2726
+ cursor: pointer;
2727
+ }
2728
+
2729
+ .html-preview-frame__close--dark {
2730
+ color: #e5e7eb;
2731
+ }
2732
+
2733
+ .html-preview-frame__iframe {
2734
+ width: 100%;
2735
+ height: 100%;
2736
+ border: none;
2737
+ display: block;
2738
+ }
2739
+
2740
+ @media (max-width: 640px) {
2741
+ .html-preview-frame {
2742
+ width: 100vw;
2743
+ height: 80vh;
2744
+ border-radius: 0;
2745
+ }
2746
+ }
2747
+
2748
+ .ms-tooltip {
2749
+ position: fixed;
2750
+ padding: 6.4px 10.4px;
2751
+ font-size: 14px;
2752
+ border-radius: 6px;
2753
+ border-width: 1px;
2754
+ border-style: solid;
2755
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.08);
2756
+ pointer-events: none;
2757
+ z-index: 9999;
2758
+ opacity: 0;
2759
+ transition: opacity 120ms linear, transform 220ms cubic-bezier(.16, 1, .3, 1);
2760
+ }
2761
+
2762
+ .ms-tooltip[data-visible='true'] {
2763
+ opacity: 1;
2764
+ }
2765
+
2766
+ .ms-tooltip[data-dark='true'] {
2767
+ background-color: #111827;
2768
+ color: #f9fafb;
2769
+ border-color: #374151;
2770
+ }
2771
+
2772
+ .ms-tooltip[data-dark='false'],
2773
+ .ms-tooltip:not([data-dark='true']) {
2774
+ background-color: #ffffff;
2775
+ color: #111827;
2776
+ border-color: #e5e7eb;
2777
+ }
2778
+
2779
+ .markstream-solid .sr-only {
2780
+ position: absolute;
2781
+ width: 1px;
2782
+ height: 1px;
2783
+ padding: 0;
2784
+ margin: -1px;
2785
+ overflow: hidden;
2786
+ clip: rect(0, 0, 0, 0);
2787
+ white-space: nowrap;
2788
+ border: 0;
2789
+ }
2790
+
2791
+ .markstream-solid .d2-block-body {
2792
+ position: relative;
2793
+ padding: 0;
2794
+ }
2795
+
2796
+ .markstream-solid .d2-block-header {
2797
+ display: flex;
2798
+ grid-template-columns: none;
2799
+ justify-content: space-between;
2800
+ border-bottom: 1px solid var(--diagram-border);
2801
+ color: hsl(var(--ms-foreground));
2802
+ }
2803
+
2804
+ .markstream-solid .d2-header-title {
2805
+ display: inline-flex;
2806
+ align-items: center;
2807
+ min-width: 0;
2808
+ gap: 8px;
2809
+ }
2810
+
2811
+ .markstream-solid .d2-label {
2812
+ color: hsl(var(--ms-foreground));
2813
+ font:
2814
+ 500 var(--ms-text-label)/1.2 "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
2815
+ }
2816
+
2817
+ .markstream-solid .d2-header-actions {
2818
+ display: inline-flex;
2819
+ align-items: center;
2820
+ justify-content: flex-end;
2821
+ justify-self: auto;
2822
+ grid-column: auto;
2823
+ gap: var(--ms-gap-header-actions);
2824
+ }
2825
+
2826
+ .markstream-solid .d2-mode-toggle {
2827
+ display: inline-flex;
2828
+ align-items: center;
2829
+ gap: 2px;
2830
+ background: transparent;
2831
+ }
2832
+
2833
+ .markstream-solid .d2-mode-btn {
2834
+ padding: 2px 8px;
2835
+ border-radius: 4px;
2836
+ color: var(--code-action-fg);
2837
+ opacity: 0.6;
2838
+ transition: opacity 0.2s, color 0.2s, background-color 0.2s;
2839
+ }
2840
+
2841
+ .markstream-solid .d2-mode-btn:hover {
2842
+ opacity: 0.9;
2843
+ }
2844
+
2845
+ .markstream-solid .d2-mode-btn.is-active {
2846
+ background: hsl(var(--ms-foreground) / 0.08);
2847
+ color: var(--code-fg);
2848
+ opacity: 1;
2849
+ }
2850
+
2851
+ .markstream-solid .d2-action-btn {
2852
+ color: var(--code-action-fg);
2853
+ opacity: 0.7;
2854
+ transition: opacity 0.2s, background-color 0.15s, color 0.15s;
2855
+ }
2856
+
2857
+ .markstream-solid .d2-action-btn:hover:not(:disabled) {
2858
+ opacity: 1;
2859
+ background: var(--code-action-hover-bg);
2860
+ color: var(--code-action-hover-fg);
2861
+ }
2862
+
2863
+ .markstream-solid .d2-action-btn:disabled {
2864
+ opacity: 0.3;
2865
+ cursor: not-allowed;
2866
+ }
2867
+
2868
+ .markstream-solid .d2-source {
2869
+ padding: var(--ms-inset-panel-body) var(--ms-inset-panel-x);
2870
+ font-family: var(--vscode-editor-font-family, "Fira Code", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
2871
+ }
2872
+
2873
+ .markstream-solid .d2-code {
2874
+ margin: 0;
2875
+ padding: 0;
2876
+ border-radius: 0;
2877
+ background: transparent;
2878
+ color: hsl(var(--ms-foreground));
2879
+ box-shadow: none;
2880
+ white-space: pre;
2881
+ font-size: 14px;
2882
+ line-height: 1.5;
2883
+ }
2884
+
2885
+ .markstream-solid .d2-code code {
2886
+ padding: 0;
2887
+ background: transparent;
2888
+ color: inherit;
2889
+ font: inherit;
2890
+ white-space: inherit;
2891
+ }
2892
+
2893
+ /* Center the rendered diagram like the mermaid/infographic blocks: a
2894
+ column flex container with margin:auto children stays centered while
2895
+ remaining scroll-safe when content overflows. */
2896
+ .markstream-solid .d2-render {
2897
+ max-height: var(--ms-size-code-max-height);
2898
+ overflow: auto;
2899
+ display: flex;
2900
+ flex-direction: column;
2901
+ }
2902
+
2903
+ /* margin: auto (not justify-content: center) keeps overflow scrolling safe. */
2904
+ .markstream-solid .d2-svg {
2905
+ margin: auto;
2906
+ width: 100%;
2907
+ }
2908
+
2909
+ .markstream-solid .d2-render .d2-error {
2910
+ margin-left: auto;
2911
+ margin-right: auto;
2912
+ }
2913
+
2914
+ .markstream-solid .d2-svg svg.markstream-d2-root-svg {
2915
+ width: 100%;
2916
+ max-width: 100%;
2917
+ height: auto;
2918
+ /* Match the container cap so tall diagrams scale down to fit, mirroring
2919
+ the mermaid block's max-height behavior. The inline maxHeight prop
2920
+ exposes its value as --ms-d2-render-max-height so the svg cap always
2921
+ tracks the effective container cap. The fallback is the shared token. */
2922
+ max-height: var(--ms-d2-render-max-height, var(--ms-size-code-max-height));
2923
+ display: block;
2924
+ }
2925
+
2926
+ .markstream-solid .d2-error {
2927
+ color: #dc2626;
2928
+ margin-top: 12px;
2929
+ }
2930
+
2931
+ .markstream-solid .infographic-render {
2932
+ position: relative;
2933
+ width: 100%;
2934
+ min-height: var(--ms-size-diagram-min-height);
2935
+ /* clip, not auto — same reason as .mermaid-preview: a scrollable pan surface
2936
+ would latch touch swipes and stop the page from scrolling. */
2937
+ overflow: clip;
2938
+ text-align: center;
2939
+ }
2940
+
2941
+ .markstream-solid .infographic-pending-source {
2942
+ position: absolute;
2943
+ inset: 0;
2944
+ z-index: 1;
2945
+ overflow: auto;
2946
+ padding: var(--ms-inset-panel-body);
2947
+ text-align: left;
2948
+ }
2949
+
2950
+ /* The render host mirrors the mermaid/vue diagram layers: an inset-0
2951
+ layer with a definite height (the inline min-height estimate on
2952
+ .infographic-render) that flex-centers the rendered diagram. */
2953
+ .markstream-solid .infographic-render > div {
2954
+ position: absolute;
2955
+ inset: 0;
2956
+ display: flex;
2957
+ align-items: center;
2958
+ justify-content: center;
2959
+ transition: transform 120ms ease;
2960
+ }
2961
+
2962
+ /* Keep the diagram fully visible and centered like the mermaid block:
2963
+ scale down proportionally inside the preview area. Scoped to the
2964
+ preview container only; the fullscreen modal clone (portaled to body
2965
+ without this wrapper) keeps its own sizing. */
2966
+ .markstream-solid .infographic-render svg {
2967
+ max-width: 100%;
2968
+ max-height: 100%;
2969
+ width: auto;
2970
+ height: auto;
2971
+ }
2972
+
2973
+
2974
+
2975
+ .html-preview-frame__backdrop {
2976
+ position: fixed;
2977
+ inset: 0;
2978
+ background-color: var(--modal-overlay);
2979
+ display: flex;
2980
+ align-items: center;
2981
+ justify-content: center;
2982
+ z-index: 50;
2983
+ }
2984
+
2985
+ .html-preview-frame {
2986
+ width: 80vw;
2987
+ max-width: 960px;
2988
+ height: 70vh;
2989
+ background-color: var(--modal-bg);
2990
+ color: var(--modal-fg);
2991
+ border-radius: calc(var(--ms-radius) * 2);
2992
+ overflow: hidden;
2993
+ box-shadow: var(--ms-shadow-preview);
2994
+ display: flex;
2995
+ flex-direction: column;
2996
+ }
2997
+
2998
+ .html-preview-frame__header {
2999
+ display: flex;
3000
+ justify-content: space-between;
3001
+ align-items: center;
3002
+ padding: 6.4px 12px;
3003
+ border-bottom: 1px solid var(--code-border);
3004
+ }
3005
+
3006
+ .html-preview-frame__title {
3007
+ display: inline-flex;
3008
+ align-items: center;
3009
+ gap: 6.4px;
3010
+ font-size: 12px;
3011
+ font-weight: 500;
3012
+ letter-spacing: 0.02em;
3013
+ text-transform: uppercase;
3014
+ opacity: 0.85;
3015
+ }
3016
+
3017
+ .html-preview-frame__dot {
3018
+ width: 8px;
3019
+ height: 8px;
3020
+ border-radius: 999px;
3021
+ background-color: hsl(var(--ms-success));
3022
+ }
3023
+
3024
+ .html-preview-frame__label {
3025
+ white-space: nowrap;
3026
+ }
3027
+
3028
+ .html-preview-frame__close {
3029
+ border: none;
3030
+ background: transparent;
3031
+ font-size: 20px;
3032
+ line-height: 1;
3033
+ cursor: pointer;
3034
+ color: var(--modal-fg);
3035
+ }
3036
+
3037
+ .html-preview-frame__iframe {
3038
+ width: 100%;
3039
+ height: 100%;
3040
+ border: none;
3041
+ display: block;
3042
+ }
3043
+
3044
+ @media (max-width: 640px) {
3045
+ .html-preview-frame {
3046
+ width: 100vw;
3047
+ height: 80vh;
3048
+ border-radius: 0;
3049
+ }
3050
+ }
3051
+
3052
+
3053
+
3054
+ /* Minimal, safe defaults to reduce flicker during frequent text updates */
3055
+ .markstream-solid pre[class^='language-'],
3056
+ .markstream-solid pre[class*=' language-'] {
3057
+ /* Ensure code layout is stable */
3058
+ white-space: pre;
3059
+ overflow: auto;
3060
+ -moz-tab-size: var(--markstream-code-tab-size, 4);
3061
+ -o-tab-size: var(--markstream-code-tab-size, 4);
3062
+ tab-size: var(--markstream-code-tab-size, 4);
3063
+ font-variant-ligatures: none;
3064
+ /* Isolate painting/layout to this block to avoid ancestor reflow jank */
3065
+ contain: content;
3066
+ /* Hint GPU compositing on WebKit/Blink to reduce paint flashing */
3067
+ backface-visibility: hidden;
3068
+ transform: translateZ(0);
3069
+ -webkit-font-smoothing: antialiased;
3070
+ }
3071
+ .markstream-solid pre[class^='language-'] > code,
3072
+ .markstream-solid pre[class*=' language-'] > code {
3073
+ display: block;
3074
+ }
3075
+
3076
+ .markstream-solid pre.is-wrap {
3077
+ white-space: pre-wrap;
3078
+ overflow-wrap: anywhere;
3079
+ word-break: normal;
3080
+ }
3081
+
3082
+ /* Match the finalized highlight surface's 2ch white split divider: pierre's
3083
+ split lines carry 1ch inline padding on each side of the code content. The
3084
+ left pane mirrors the text's 1ch right padding toward the seam; the right
3085
+ pane already spaces its text 1ch past the line-number gutter
3086
+ (`--markstream-pre-diff-line-number-gap-to-code`), so no extra left padding
3087
+ is added there — adding one would push the right column's content one `ch`
3088
+ away from the line numbers compared with the highlight surface. */
3089
+
3090
+ /* Split view: the collapsed "N unmodified lines" pill must read as ONE
3091
+ continuous pill spanning both columns (pierre's split separators meet at the
3092
+ middle divider). The left pane extends its pill flush to its right edge and
3093
+ the right pane starts flush at its own left edge, so the two halves abut
3094
+ exactly at the column seam; the inner corners are squared so there is no
3095
+ notch where they meet. */
3096
+
3097
+ /* The modified (right) pane's collapsed row is only the empty half of the
3098
+ continuous pill — the finalized surface renders the "N unmodified lines"
3099
+ widget once on the original side. Hide the duplicated chevron/icon so the
3100
+ right half stays clean (matches the highlight surface). */
3101
+
3102
+ /* First collapsed region: flush against the top diff rows (pierre's
3103
+ `data-separator-first` clears the leading margin). */
3104
+
3105
+ /* Terminal collapsed region: the pill sits at the bottom of the pre and the
3106
+ pre's own 8px bottom padding provides the gap (pierre's
3107
+ `data-separator-last` clears the trailing margin). */
3108
+
3109
+ /* Mirror pierre's `diffs-icon-expand` chevron occupying the 34px column left
3110
+ of the "N unmodified lines" text, so the fallback pill matches the
3111
+ finalized separator (same color, same position, non-interactive). */
3112
+
3113
+ /* Keyboard accessibility: visible focus when scroll container is focused */
3114
+ .markstream-solid pre[class^='language-']:focus,
3115
+ .markstream-solid pre[class*=' language-']:focus {
3116
+ outline: var(--ms-focus-ring-width) solid var(--focus-ring);
3117
+ outline-offset: var(--ms-focus-ring-offset);
3118
+ }
3119
+
3120
+
3121
+ .markstream-solid .code-block-container { margin: var(--ms-flow-code-y, 16px) 0; border: 1px solid var(--code-border); border-radius: var(--ms-radius, 8px); overflow: visible; color: var(--code-fg); background: var(--code-bg); }
3122
+ .markstream-solid .code-block-header { display:flex; align-items:center; justify-content:space-between; gap:16px; border-bottom:1px solid var(--code-border); padding:8px 12px; background:var(--code-header-bg); color:var(--code-fg); }
3123
+ .markstream-solid .code-block-title,.markstream-solid .code-block-actions { display:flex;align-items:center;gap:8px;min-width:0; }
3124
+ .markstream-solid .code-block-title small { display:block;opacity:.6;font-size:11.2px; }
3125
+ .markstream-solid .code-language-icon { display:inline-flex;width:18.4px;height:18.4px;flex-shrink:0; }
3126
+ .markstream-solid .code-language-icon svg { width:100%;height:100%; }
3127
+ .markstream-solid .code-action-btn { cursor:pointer;border:0;border-radius:4px;padding:6px 8px;color:var(--code-action-fg);background:transparent;line-height:1.2;font:inherit;font-size:12px; }
3128
+ .markstream-solid .code-action-btn:hover,.markstream-solid .code-action-btn:focus-visible { background:var(--code-action-hover-bg);color:var(--code-action-hover-fg); }
3129
+ .markstream-solid .code-action-btn:disabled { opacity:.4;cursor:default; }
3130
+ .markstream-solid .code-more { position:relative; }
3131
+ .markstream-solid .code-more-menu { position:absolute;right:0;top:100%;z-index:20;min-width:176px;padding:4px;border:1px solid var(--code-border);border-radius:8px;background:hsl(var(--ms-popover));color:hsl(var(--ms-popover-foreground));box-shadow:0 8px 24px #0002; }
3132
+ .markstream-solid .code-more-menu button { display:block;text-align:left;width:100%; }
3133
+ .markstream-solid .code-diff-stats { display:flex;gap:6.4px;font-size:12px;font-variant-numeric:tabular-nums; }
3134
+ .markstream-solid .code-diff-stats .removed {color:#d14444;} .markstream-solid .code-diff-stats .added {color:#29934c;}
3135
+ .markstream-solid .code-block-body { min-width:0; } .markstream-solid .code-block-body pre {margin:0;}
3136
+ .markstream-solid .diagram-block-container { border:1px solid var(--diagram-border);border-radius:var(--ms-radius,8px);margin:16px 0;overflow:hidden;background:var(--diagram-bg); }
3137
+ .markstream-solid .diagram-preview { overflow:hidden;position:relative;display:flex;align-items:center;justify-content:center; }
3138
+ .markstream-solid .diagram-content { transform-origin:center;will-change:transform; }
3139
+ .markstream-solid .diagram-content svg { display:block;max-width:100%;height:auto; }
3140
+ .markstream-solid .diagram-zoom-controls {display:flex;justify-content:flex-end;gap:4px;padding:4px;border-top:1px solid var(--diagram-border);}
3141
+ .markstream-solid .diagram-modal-backdrop {position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--modal-overlay,#000a);}
3142
+ .markstream-solid .diagram-modal {width:92vw;height:90vh;background:var(--modal-bg,#fff);color:var(--modal-fg);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;}
3143
+ .markstream-solid .diagram-modal-surface {overflow:hidden;display:flex;align-items:center;justify-content:center;flex:1;}
3144
+ .markstream-solid .diagram-error {padding:16px;color:#b63737;}
3145
+ .markstream-solid .image-node {display:inline-block;position:relative;max-width:100%;}
3146
+ .markstream-solid .image-node img {max-width:100%;height:auto;display:block;}
3147
+ .markstream-solid .image-placeholder {position:absolute;inset:0;min-width:96px;min-height:32px;background:hsl(var(--ms-muted));font-size:12px;opacity:.6;pointer-events:none;}
3148
+ .markstream-solid .image-error {display:inline-block;padding:12px;border:1px solid var(--code-border);font-size:12.8px;}
3149
+ .markstream-solid .table-node-wrapper {overflow:auto;}
3150
+ .markstream-solid .table-node {width:100%;border-collapse:collapse;table-layout:fixed;}
3151
+ .markstream-solid .table-node th {position:relative;}
3152
+ .markstream-solid .table-node th,.markstream-solid .table-node td {border:1px solid var(--code-border);padding:8px 12px;vertical-align:top;}
3153
+ .markstream-solid .table-column-resize {position:absolute;right:-3px;top:0;bottom:0;width:6px;cursor:col-resize;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;}
3154
+ .markstream-solid .link-node {position:relative;color:var(--link-color,#3b82f6);text-decoration:underline;text-decoration-thickness:var(--underline-height,2px);text-underline-offset:3px;}
3155
+ .markstream-solid .typewriter-cursor {top:0;left:0;width:2px;background:currentColor;pointer-events:none;animation:markstream-solid-cursor-blink 1s steps(1,end) infinite;}
3156
+ @keyframes markstream-solid-cursor-blink {50%{opacity:0}}
3157
+ .markstream-solid .admonition-node,.markstream-solid .vmr-container {padding:16px;border:1px solid var(--code-border);border-left-width:4px;border-radius:8px;margin:16px 0;}
3158
+ .markstream-solid .admonition-title {font-weight:600;}
3159
+ .markstream-solid .footnote-node {font-size:.875em;}
3160
+ .markstream-virtual-timeline .markstream-timeline-item {display:flow-root;}
3161
+ .markstream-virtual-timeline .markstream-timeline-default {padding:12px;white-space:pre-wrap;}
3162
+ .markstream-solid.typewriter-simple-cursor .typewriter-simple-cursor-target::after {content:'';display:inline-block;width:2px;height:1em;margin-left:2px;vertical-align:text-bottom;background:currentColor;animation:markstream-solid-cursor-blink 1s steps(1,end) infinite;}
3163
+ .markstream-solid .diagram-content {max-width:100%;min-width:0;width:100%;display:flex;align-items:center;justify-content:center;}
3164
+ .markstream-solid.code-block-container {margin:16px 0;border:1px solid var(--code-border);border-radius:var(--ms-radius,8px);color:var(--code-fg);background:var(--code-bg);}
3165
+ .markstream-solid.diagram-block-container {margin:16px 0;border:1px solid var(--diagram-border);border-radius:var(--ms-radius,8px);overflow:hidden;background:var(--diagram-bg);}
3166
+
3167
+ .markstream-solid .code-block-header {padding:6px 10px;font-family:ui-sans-serif,system-ui,sans-serif;}
3168
+ .markstream-solid .code-header-main {gap:10px;}
3169
+ .markstream-solid .code-header-title {font-size:12px;color:hsl(var(--ms-muted-foreground));font-family:inherit;}
3170
+ .markstream-solid .code-header-actions {gap:2px;}
3171
+ .markstream-solid .code-block-container > .code-block-header .code-action-btn:not([role="menuitem"]) {width:26px;height:26px;padding:6px;line-height:1;}
3172
+ .markstream-solid .code-block-header .code-action-btn .action-icon {width:14px;height:14px;display:block;}
3173
+
3174
+ .markstream-solid .math-block {position:relative;text-align:center;overflow-x:auto;min-height:40px;padding:0;}
3175
+ .markstream-solid .math-block__content .katex-display {margin:1em 0;}
3176
+ .markstream-solid .math-block__fallback {white-space:pre-wrap;overflow-wrap:anywhere;margin:0;text-align:left;}
3177
+ .markstream-solid .math-inline-wrapper {position:relative;display:inline-block;}
3178
+ .markstream-solid .math-inline {display:inline-block;vertical-align:middle;}
3179
+ .markstream-solid .math-inline--fallback {white-space:pre-wrap;}
3180
+ .markstream-solid .math-inline__loading {display:inline-flex;align-items:center;justify-content:center;pointer-events:none;}
3181
+ .markstream-solid .math-loading-overlay {position:absolute;inset:0;display:flex;align-items:center;justify-content:center;min-height:40px;}
3182
+ .markstream-solid .math-loading-spinner {width:20px;height:20px;border:2px solid #94a3b826;border-top-color:#94a3b8cc;border-radius:50%;animation:spin .8s linear infinite;}
3183
+
3184
+ .markstream-solid .diagram-block-header {display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 10px;border-bottom:1px solid var(--diagram-border);background:var(--diagram-header-bg);min-width:0;}
3185
+ .markstream-solid .diagram-header-label {display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden;font:500 12px/1.75 var(--ms-font-mono,ui-monospace,SFMono-Regular,Menlo,monospace);color:var(--code-action-fg);}
3186
+ .markstream-solid .diagram-header-label > span:last-child {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
3187
+ .markstream-solid .diagram-header-icon {display:inline-flex;width:14px;height:14px;flex:0 0 14px;}
3188
+ .markstream-solid .diagram-header-icon svg {width:100%;height:100%;display:block;}
3189
+ .markstream-solid .diagram-mode-toggle {display:flex;align-items:center;gap:2px;flex-shrink:0;}
3190
+ .markstream-solid .diagram-mode-btn {display:inline-flex;align-items:center;justify-content:center;gap:4px;width:auto;white-space:nowrap;word-break:normal;padding:2px 8px;font-size:12px;line-height:1.75;opacity:.6;}
3191
+ .markstream-solid .diagram-mode-btn[aria-pressed=true] {opacity:1;background:hsl(var(--ms-foreground)/.08);color:var(--code-fg);}
3192
+ .markstream-solid .diagram-header-actions {display:flex;align-items:center;gap:8px;flex-shrink:0;}
3193
+ .markstream-solid .diagram-header-actions .code-action-btn {display:inline-flex;align-items:center;justify-content:center;padding:6px;width:26px;height:26px;}
3194
+ .markstream-solid .diagram-block-header .action-icon,.markstream-solid .diagram-zoom-controls .action-icon {display:block;flex-shrink:0;width:14px;height:14px;}
3195
+ .markstream-solid .diagram-zoom-controls {position:absolute;top:8px;right:8px;z-index:1;display:flex;align-items:center;gap:8px;border:0;padding:0;backdrop-filter:blur(8px);}
3196
+ .markstream-solid .diagram-modal-header {display:flex;align-items:center;justify-content:space-between;padding:8px;}
3197
+ .markstream-solid .diagram-modal-header > div {display:flex;align-items:center;gap:8px;}
3198
+
3199
+ .markstream-solid .heading-node {font-weight:500;line-height:1.25;color:inherit;}
3200
+ .markstream-solid .heading-1 {font-size:var(--ms-text-h1);line-height:var(--ms-leading-h1);font-weight:var(--ms-weight-h1);margin-top:var(--ms-flow-heading-1-mt);margin-bottom:var(--ms-flow-heading-1-mb);}
3201
+ .markstream-solid .heading-2 {font-size:var(--ms-text-h2);line-height:var(--ms-leading-h2);font-weight:var(--ms-weight-h2);margin-top:var(--ms-flow-heading-2-mt);margin-bottom:var(--ms-flow-heading-2-mb);}
3202
+ .markstream-solid .heading-3 {font-size:var(--ms-text-h3);line-height:var(--ms-leading-h3);font-weight:var(--ms-weight-h3);margin-top:var(--ms-flow-heading-3-mt);margin-bottom:var(--ms-flow-heading-3-mb);}
3203
+ .markstream-solid .heading-4 {font-size:var(--ms-text-h4);font-weight:var(--ms-weight-h4);margin-top:var(--ms-flow-heading-4-mt);margin-bottom:var(--ms-flow-heading-4-mb);}
3204
+ .markstream-solid .heading-5 {font-size:var(--ms-text-h5);margin-top:var(--ms-flow-heading-5-mt);margin-bottom:var(--ms-flow-heading-5-mb);}
3205
+ .markstream-solid .heading-6 {font-size:var(--ms-text-h6);margin-top:var(--ms-flow-heading-6-mt);margin-bottom:var(--ms-flow-heading-6-mb);}
3206
+ .markstream-solid .paragraph-node {font-size:var(--ms-text-body);line-height:var(--ms-leading-body);margin:var(--ms-flow-paragraph-y) 0;}
3207
+ .markstream-solid li .paragraph-node {margin:0;}
3208
+ .markstream-solid .blockquote {display:block;font-weight:400;font-style:normal;color:var(--blockquote-fg,hsl(var(--ms-muted-foreground)));border-left:3px solid var(--blockquote-border);margin:var(--ms-flow-blockquote-y) 0;padding-left:var(--ms-flow-blockquote-indent);}
3209
+ .markstream-solid .blockquote > .paragraph-node:first-child {margin-top:0;}
3210
+ .markstream-solid .blockquote > .paragraph-node:last-child {margin-bottom:0;}
3211
+ .markstream-solid .blockquote-content,.markstream-solid .footnote-node__content {content-visibility:visible;contain:content;contain-intrinsic-size:0px 0px;}
3212
+ .markstream-solid .list-node {margin:var(--ms-flow-list-y) 0;padding-left:var(--ms-flow-list-indent);}
3213
+ .markstream-solid .list-decimal {list-style-type:decimal;}
3214
+ .markstream-solid .list-disc {list-style-type:disc;}
3215
+ .markstream-solid .list-item {margin:var(--ms-flow-list-item-y) 0;padding-left:var(--ms-space-1_5);}
3216
+ .markstream-solid .highlight-node {background:var(--highlight-bg);padding:0 3.2px;border-radius:.2em;}
3217
+ .markstream-solid .subscript-node {font-size:.8em;vertical-align:sub;}
3218
+ .markstream-solid .superscript-node {font-size:.8em;vertical-align:super;}
3219
+ .markstream-solid .hr-node {margin:var(--ms-flow-hr-y) 0;border-color:var(--hr-border);}
3220
+ .markstream-solid .inline-code {display:inline;font-family:var(--ms-font-mono);font-size:.8125em;font-weight:inherit;line-height:inherit;color:var(--inline-code-fg);background:var(--inline-code-bg);padding:.15em .35em;border-radius:.25em;white-space:normal;word-break:break-word;max-width:100%;-webkit-box-decoration-break:clone;box-decoration-break:clone;}
3221
+ .markstream-solid .table-node {table-layout:fixed;border-collapse:separate;border-spacing:0;margin:var(--ms-flow-table-y) 0;font-size:inherit;border:1px solid var(--table-border);border-radius:var(--ms-radius);overflow:hidden;box-shadow:var(--ms-shadow-subtle);}
3222
+ .markstream-solid .table-node th,.markstream-solid .table-node td {border:0;border-bottom:1px solid var(--table-border);border-right:1px solid var(--table-border);padding:var(--ms-flow-table-cell);vertical-align:middle;white-space:normal;overflow-wrap:break-word;word-break:normal;}
3223
+ .markstream-solid .table-node th:last-child,.markstream-solid .table-node td:last-child {border-right:0;}
3224
+ .markstream-solid .table-node tbody tr:last-child td {border-bottom:0;}
3225
+ .markstream-solid .table-node thead th {position:relative;font-weight:600;background:var(--table-header-bg);border-bottom-width:2px;}
3226
+ .markstream-solid .image-node img {display:inline-block;border-radius:0;}
3227
+ .markstream-solid li:has(.checkbox-node) {list-style-type:none;margin-left:calc(-1 * var(--ms-flow-list-indent));}
3228
+ @media (max-width:1023px) {.markstream-solid .list-disc {margin-top:calc(4/3*1em);margin-bottom:calc(4/3*1em);padding-left:var(--ms-flow-list-indent-mobile);}}
3229
+ .markstream-solid .diagram-block-header {gap:normal;}
3230
+ .markstream-solid .infographic-block-header {color:hsl(var(--ms-foreground));}
3231
+ .markstream-solid .code-block-header {font-family:var(--ms-font-sans);}
3232
+ .markstream-solid .checkbox-node {display:inline-flex;align-items:center;margin-right:.5em;vertical-align:-.15em;}
3233
+ .markstream-solid .checkbox-icon {flex-shrink:0;}
3234
+ .markstream-solid .checkbox-unchecked {color:hsl(var(--ms-muted-foreground)/.5);}
3235
+ .markstream-solid .checkbox-checked {color:hsl(var(--ms-info));}
3236
+ .markstream-solid .reference-node {background:hsl(var(--ms-muted));color:hsl(var(--ms-muted-foreground));cursor:pointer;font-size:12px;border-radius:6px;padding:0 6px;margin:0 2px;}
3237
+ .markstream-solid .admonition {position:relative;margin:var(--ms-flow-admonition-y) 0;padding:.25em .75em .375em;border:1px solid var(--admonition-border);border-radius:var(--ms-radius);color:var(--admonition-fg);}
3238
+ .markstream-solid .admonition-legend {position:absolute;top:0;left:.75em;transform:translateY(-50%);display:inline-flex;align-items:center;gap:.35em;padding:0 .5em;background:hsl(var(--ms-background));font-size:13px;font-weight:600;line-height:1;}
3239
+ .markstream-solid .admonition-icon {flex-shrink:0;}
3240
+ .markstream-solid .admonition-title {white-space:nowrap;}
3241
+ .markstream-solid .admonition-content {padding-top:.25em;color:var(--admonition-fg);}
3242
+ .markstream-solid .admonition-note,.markstream-solid .admonition-info {border-color:hsl(var(--ms-info)/.3);background:hsl(var(--ms-info)/.04);}
3243
+ .markstream-solid .admonition-note .admonition-legend,.markstream-solid .admonition-info .admonition-legend {color:var(--admonition-note);}
3244
+ .markstream-solid .admonition-tip {border-color:hsl(var(--ms-success)/.3);background:hsl(var(--ms-success)/.04);}
3245
+ .markstream-solid .admonition-tip .admonition-legend {color:var(--admonition-tip);}
3246
+ .markstream-solid .admonition-warning,.markstream-solid .admonition-caution {border-color:hsl(var(--ms-warning)/.3);background:hsl(var(--ms-warning)/.04);}
3247
+ .markstream-solid .admonition-warning .admonition-legend,.markstream-solid .admonition-caution .admonition-legend {color:var(--admonition-warning);}
3248
+ .markstream-solid .admonition-danger,.markstream-solid .admonition-error {border-color:hsl(var(--ms-destructive)/.3);background:hsl(var(--ms-destructive)/.04);}
3249
+ .markstream-solid .admonition-danger .admonition-legend,.markstream-solid .admonition-error .admonition-legend {color:var(--admonition-danger);}
3250
+ .markstream-solid .admonition-toggle {margin-left:.25em;background:transparent;border:0;color:inherit;cursor:pointer;padding:2px;border-radius:calc(var(--ms-radius)*.5);display:inline-flex;align-items:center;}
3251
+ .markstream-solid.virtualized .node-slot,.markstream-solid.virtualized .node-content,.markstream-solid.virtual-scroll-coordinated .node-slot,.markstream-solid.virtual-scroll-coordinated .node-content {display:flow-root;}
3252
+ .markstream-solid .footnote-node {display:flex;font-size:14px;line-height:1.625;margin:var(--ms-flow-footnote-y) 0;border-top:1px solid var(--footnote-border);padding-top:8px;}
3253
+ .markstream-solid .code-pre-fallback code {color:inherit;font:inherit;background:transparent;}
3254
+ .markstream-solid.markdown-renderer {contain-intrinsic-size:auto 800px auto 0px;}
3255
+ .markstream-solid.markdown-renderer.virtualized,.markstream-solid.markdown-renderer.virtual-scroll-coordinated {content-visibility:visible;contain-intrinsic-size:none;}
3256
+ .markstream-solid .text-node-stream-delta {animation:markstream-solid-stream-fade var(--stream-update-fade-duration,var(--fade-duration,200ms)) var(--stream-update-fade-ease,var(--fade-ease,cubic-bezier(.2,0,.4,1))) both;}
3257
+ @keyframes markstream-solid-stream-fade {from{opacity:0}to{opacity:1}}
3258
+ @media (prefers-reduced-motion:reduce) {.markstream-solid .text-node-stream-delta {animation-duration:0s!important;}}
3259
+ .markstream-solid .heading-node {letter-spacing:normal;}
3260
+ .markstream-solid .math-loading-spinner {border-color:color-mix(in srgb,var(--loading-spinner) 15%,transparent);border-top-color:color-mix(in srgb,var(--loading-spinner) 80%,transparent);}
3261
+ .markstream-solid .reference-node {line-height:16px;}
3262
+ .markstream-solid .reference-node:hover {background:hsl(var(--ms-secondary));}
3263
+ .markstream-solid .footnote-reference {font-size:.75em;line-height:0;}
3264
+ .markstream-solid .table-node-wrapper {position:relative;max-width:100%;overflow-x:auto;scrollbar-gutter:stable;overscroll-behavior-x:contain;}
3265
+ .markstream-solid .table-node--loading tbody td {position:relative;overflow:hidden;}
3266
+ .markstream-solid .table-node--loading tbody td > * {visibility:hidden;}
3267
+ .markstream-solid .table-node--loading tbody td::after {content:'';position:absolute;inset:0;border-radius:calc(var(--ms-radius)*.5);background:var(--loading-shimmer);}
3268
+ .markstream-solid .table-node__loading {position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;}
3269
+ .markstream-solid .table-node__spinner {width:40px;height:40px;border-radius:9999px;border:2px solid color-mix(in srgb,var(--loading-spinner) 25%,transparent);border-top-color:color-mix(in srgb,var(--loading-spinner) 80%,transparent);animation:spin 1s linear infinite;}
3270
+ .markstream-solid .link-node {position:static;text-decoration:none;}
3271
+ .markstream-solid .link-node:hover {text-decoration:underline;}
3272
+ .markstream-solid .footnote-reference {vertical-align:baseline;}
3273
+ .markstream-solid .footnote-anchor {font-size:14px;line-height:20px;margin-left:8px;color:var(--link-color);}
3274
+ .markstream-solid .footnote-link {color:var(--link-color);text-decoration:none;}
3275
+ .markstream-solid .footnote-link:hover {text-decoration:underline;}
3276
+ .markstream-solid .emoji-node {display:inline-block;}
3277
+ .markstream-solid .diagram-source-panel {padding:var(--ms-inset-panel-body);background:var(--diagram-bg);}
3278
+ .markstream-solid .diagram-source-code {margin:0;padding:0;font-family:var(--ms-font-mono);font-size:14px;line-height:20px;white-space:pre-wrap;text-align:left;color:hsl(var(--ms-foreground));background:transparent;border:0;border-radius:0;}
3279
+ .markstream-solid .d2-source-code {white-space:pre;line-height:1.5;}