reviw 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { dirname as dirname$2025, join as join$2008, resolve as resolve$2046, extname as extname$2034, basename as basename$2044 } from "node:path";
3
- import { spawnSync as spawnSync$2114, execSync as execSync$2079, spawn as spawn$2109 } from "node:child_process";
4
- import { createHash as createHash$2066 } from "node:crypto";
5
- import { createServer as createServer$2051 } from "node:http";
6
- import { tmpdir as tmpdir$2084, homedir as homedir$2013 } from "node:os";
7
- import { statSync as statSync$2129, unwatchFile as unwatchFile$2072, readdirSync as readdirSync$2094, existsSync as existsSync$2005, rmSync as rmSync$2103, mkdtempSync as mkdtempSync$2083, createReadStream as createReadStream$2133, writeFileSync as writeFileSync$2019, unlinkSync as unlinkSync$2021, readFileSync as readFileSync$2011, watchFile as watchFile$2169, mkdirSync as mkdirSync$2016 } from "node:fs";
2
+ import { dirname as dirname$2163, join as join$2143, resolve as resolve$2182, extname as extname$2170, basename as basename$2180 } from "node:path";
3
+ import { spawnSync as spawnSync$2259, execSync as execSync$2224, spawn as spawn$2254 } from "node:child_process";
4
+ import { createHash as createHash$2206 } from "node:crypto";
5
+ import { createServer as createServer$2187 } from "node:http";
6
+ import { tmpdir as tmpdir$2229, homedir as homedir$2148 } from "node:os";
7
+ import { statSync as statSync$2274, unwatchFile as unwatchFile$2212, readdirSync as readdirSync$2239, existsSync as existsSync$2140, rmSync as rmSync$2248, mkdtempSync as mkdtempSync$2228, createReadStream as createReadStream$2278, unlinkSync as unlinkSync$2156, writeFileSync as writeFileSync$2159, readFileSync as readFileSync$2146, watchFile as watchFile$2315, mkdirSync as mkdirSync$2151 } from "node:fs";
8
8
  class $PanicError extends Error {}
9
9
  function $panic() {
10
10
  throw new $PanicError();
@@ -61,13 +61,16 @@ const _M0FP36kazuph5reviw6server16get__script__dir = () => {
61
61
  };
62
62
  const _M0FP36kazuph5reviw6server13get__env__var = (name) => process.env[name] || "";
63
63
  const _M0FP36kazuph5reviw6server22mkdir__recursive__opts = () => ({ recursive: true });
64
+ const _M0FP36kazuph5reviw6server15process__exists = (pid) => { try { process.kill(pid, 0); return true; } catch(e) { return false; } };
65
+ const _M0FP36kazuph5reviw6server17try__call__string = (fn, fb) => { try { return fn(); } catch(e) { return fb; } };
66
+ const _M0FP36kazuph5reviw6server12process__pid = () => process.pid;
64
67
  const _M0FP36kazuph5reviw6server12console__log = (msg) => console.log(msg);
65
68
  const _M0FP36kazuph5reviw6server9get__argv = () => process.argv;
66
69
  const _M0FP36kazuph5reviw6server20parse__json__version = (s) => { try { return JSON.parse(s).version || "unknown"; } catch { return "unknown"; } };
67
- const _M0FP36kazuph5reviw6server17try__call__string = (fn, fb) => { try { return fn(); } catch(e) { return fb; } };
68
70
  const _M0FP36kazuph5reviw6server14is__stdin__tty = () => process.stdin.isTTY || false;
69
71
  const _M0FP36kazuph5reviw6server19on__process__signal = (sig, handler) => process.on(sig, handler);
70
72
  const _M0FP36kazuph5reviw6server13process__exit = (code) => process.exit(code);
73
+ const _M0FP36kazuph5reviw6server8js__null = () => null;
71
74
  const _M0FP36kazuph5reviw6server14decode__buffer = (buf, enc) => {
72
75
  try {
73
76
  if (enc === "utf-8" || enc === "utf8") return buf.toString("utf-8");
@@ -79,6 +82,9 @@ const _M0FP36kazuph5reviw6server10buffer__at = (buf, idx) => buf[idx];
79
82
  const _M0FP36kazuph5reviw6server14buffer__length = (buf) => buf.length;
80
83
  const _M0FP36kazuph5reviw6server9sse__send = (res, event, data) => res.write(`event: ${event}\ndata: ${data}\n\n`);
81
84
  const _M0FP36kazuph5reviw6server11error__code = (err) => err.code || "";
85
+ const _M0FP36kazuph5reviw6server19json__parse__string = (key, s) => { try { return JSON.parse(s)[key] || ""; } catch(e) { return ""; } };
86
+ const _M0FP36kazuph5reviw6server14clear__timeout = (timer) => { if (timer != null) clearTimeout(timer); };
87
+ const _M0FP36kazuph5reviw6server15js__is__nullish = (value) => value == null;
82
88
  const _M0FP36kazuph5reviw6server20buffer__from__base64 = (data) => Buffer.from(data, "base64");
83
89
  const _M0FP36kazuph5reviw6server21extract__base64__data = (data) => {
84
90
  const m = data.match(/^data:image\/(\w+);base64,(.+)$/);
@@ -96,11 +102,17 @@ const _M0FP36kazuph5reviw6server21json__parse__comments = (s) => {
96
102
  } catch(e) { return []; }
97
103
  };
98
104
  const _M0FP36kazuph5reviw6server19json__parse__images = (s) => { try { return JSON.parse(s).summaryImages || []; } catch(e) { return []; } };
99
- const _M0FP36kazuph5reviw6server19json__parse__string = (key, s) => { try { return JSON.parse(s)[key] || ""; } catch(e) { return ""; } };
105
+ const _M0FP36kazuph5reviw6server28json__parse__mermaid__errors = (s) => {
106
+ try {
107
+ const obj = JSON.parse(s);
108
+ return (obj.mermaidErrors || []).map(e => [String(e.line || 0), e.message || ""]);
109
+ } catch(e) { return []; }
110
+ };
100
111
  const _M0FP36kazuph5reviw6server22process__stdout__write = (data) => process.stdout.write(data);
101
112
  const _M0FP36kazuph5reviw6server11chmod__sync = (path, mode) => { try { import("node:fs").then(fs => fs.chmodSync(path, mode)); } catch(e) {} };
102
113
  const _M0FP36kazuph5reviw6server27hash__update__digest__hex16 = (h, d) => h.update(d).digest("hex").slice(0, 16);
103
114
  const _M0FP36kazuph5reviw6server15try__call__void = (fn) => { try { fn(); } catch(e) {} };
115
+ const _M0FP36kazuph5reviw6server12set__timeout = (cb, ms) => setTimeout(cb, ms);
104
116
  const _M0FP36kazuph5reviw6server15js__stdio__pipe = () => ({ stdio: "pipe" });
105
117
  const _M0FP36kazuph5reviw6server15try__call__bool = (fn) => { try { return fn(); } catch(e) { return false; } };
106
118
  const _M0FP36kazuph5reviw6server30on__spawn__close__with__stderr = (proc, handler) => {
@@ -184,146 +196,147 @@ const _M0FP36kazuph5reviw6server22child__spawn__detached = (cmd, args) => {
184
196
  };
185
197
  const _M0FP36kazuph5reviw6server13get__platform = () => process.platform;
186
198
  const _M0FP36kazuph5reviw6server21js__spawn__opts__utf8 = () => ({ encoding: "utf8", timeout: 3000 });
187
- const _M0FP36kazuph5reviw6server14server__listen = (server, port, cb) => server.listen(port, "127.0.0.1", cb);
199
+ const _M0FP36kazuph5reviw6server14server__listen = (server, port, host, cb) => server.listen(port, host, cb);
188
200
  const _M0FP36kazuph5reviw6server17server__on__error = (server, cb) => server.on("error", cb);
189
201
  const _M0FP36kazuph5reviw6server13set__interval = (cb, ms) => setInterval(cb, ms);
190
202
  const _M0FP095_40moonbitlang_2fcore_2fbuiltin_2eStringBuilder_24as_24_40moonbitlang_2fcore_2fbuiltin_2eLogger = { method_0: _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string, method_1: _M0IP016_24default__implP311moonbitlang4core7builtin6Logger16write__substringGRP311moonbitlang4core7builtin13StringBuilderE, method_2: _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__view, method_3: _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char };
191
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c639 = ":";
192
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c640 = "#";
193
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c641 = "'";
194
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c642 = "\"";
195
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c643 = "\n";
196
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c644 = "[";
197
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c645 = "]";
198
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c646 = "{";
199
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c647 = "}";
200
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c648 = ",";
201
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c649 = "&";
202
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c650 = "*";
203
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c651 = "!";
204
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c652 = "|";
205
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c653 = ">";
206
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c654 = "%";
207
- const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c655 = "@";
208
- const _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c680 = "\n";
209
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c693 = "- ";
210
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c694 = " -";
211
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c695 = " ";
212
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c696 = " ";
213
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c698 = "- ";
214
- const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c699 = " ";
215
- const _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c703 = "- ";
216
- const _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c704 = " ";
217
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c719 = "<details";
218
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c720 = "<div";
219
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c721 = "<section";
220
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c722 = "<article";
221
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c723 = "<aside";
222
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c724 = "<nav";
223
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c725 = "<header";
224
- const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c726 = "<footer";
225
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c728 = "#";
226
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c729 = "```";
227
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c730 = ">";
228
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c731 = "- ";
229
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c732 = "* ";
230
- const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c733 = "<";
231
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c734 = "graph ";
232
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c735 = "flowchart ";
233
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c736 = "sequenceDiagram";
234
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c737 = "classDiagram";
235
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c738 = "stateDiagram";
236
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c739 = "erDiagram";
237
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c740 = "journey";
238
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c741 = "gantt";
239
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c742 = "pie";
240
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c743 = "gitGraph";
241
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c744 = "mindmap";
242
- const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c745 = "timeline";
243
- const _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c746 = "|";
244
- const _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c747 = "-";
245
- const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c760 = "|";
246
- const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c761 = "|";
247
- const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c762 = "|";
248
- const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c759 = "|";
249
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c763 = ".mp4";
250
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c764 = ".webm";
251
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c765 = ".mov";
252
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c766 = ".avi";
253
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c767 = ".mkv";
254
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c768 = ".m4v";
255
- const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c769 = ".ogv";
256
- const _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c775 = "javascript:";
257
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c788 = "expression(";
258
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c789 = "url(";
259
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c790 = "-moz-binding";
260
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c791 = "behavior:";
261
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c792 = "behaviour:";
262
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c793 = "javascript:";
263
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c794 = "vbscript:";
264
- const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c795 = "@import";
265
- const _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c796 = "on";
266
- const _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c797 = "javascript:";
267
- const _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c798 = "data:text/html";
268
- const _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c814 = ">";
269
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c816 = "<";
270
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c818 = "<summary>";
271
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c819 = "</details>";
272
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c821 = "</details>";
273
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c822 = "<details";
274
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c826 = "#";
275
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c827 = "```";
276
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c829 = "```";
277
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c830 = ">";
278
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c832 = ">";
279
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c835 = "- ";
280
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c836 = "* ";
281
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841 = "- ";
282
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c842 = "* ";
283
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838 = "[ ] ";
284
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c839 = "[x] ";
285
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840 = "[X] ";
286
- const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849 = "|";
287
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c934 = "@@ ";
288
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c936 = "@@ ";
289
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c937 = "diff ";
290
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c938 = "--- ";
291
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c939 = "+";
292
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c940 = "-";
293
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c941 = " ";
294
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c942 = "diff ";
295
- const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c943 = "--- ";
296
- const _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c945 = "a/";
297
- const _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c946 = "b/";
298
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c948 = "diff --git ";
299
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c950 = "new file mode";
300
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c951 = "deleted file mode";
301
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c952 = "Binary files";
302
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c953 = "index ";
303
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c954 = "--- ";
304
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c955 = "+++ ";
305
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c956 = "--- ";
306
- const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c957 = "+++ ";
203
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c657 = ":";
204
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c658 = "#";
205
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c659 = "'";
206
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c660 = "\"";
207
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c661 = "\n";
208
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c662 = "[";
209
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c663 = "]";
210
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c664 = "{";
211
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c665 = "}";
212
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c666 = ",";
213
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c667 = "&";
214
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c668 = "*";
215
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c669 = "!";
216
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c670 = "|";
217
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c671 = ">";
218
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c672 = "%";
219
+ const _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c673 = "@";
220
+ const _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c702 = "\n";
221
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c715 = "- ";
222
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c716 = " -";
223
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c717 = " ";
224
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c718 = " ";
225
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c720 = "- ";
226
+ const _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c721 = " ";
227
+ const _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c725 = "- ";
228
+ const _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c726 = " ";
229
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c741 = "<details";
230
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c742 = "<div";
231
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c743 = "<section";
232
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c744 = "<article";
233
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c745 = "<aside";
234
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c746 = "<nav";
235
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c747 = "<header";
236
+ const _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c748 = "<footer";
237
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c750 = "#";
238
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c751 = "```";
239
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c752 = ">";
240
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c753 = "- ";
241
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c754 = "* ";
242
+ const _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c755 = "<";
243
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c756 = "graph ";
244
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c757 = "flowchart ";
245
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c758 = "sequenceDiagram";
246
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c759 = "classDiagram";
247
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c760 = "stateDiagram";
248
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c761 = "erDiagram";
249
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c762 = "journey";
250
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c763 = "gantt";
251
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c764 = "pie";
252
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c765 = "gitGraph";
253
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c766 = "mindmap";
254
+ const _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c767 = "timeline";
255
+ const _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c768 = "|";
256
+ const _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c769 = "-";
257
+ const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c782 = "|";
258
+ const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c783 = "|";
259
+ const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c784 = "|";
260
+ const _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c781 = "|";
261
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c785 = ".mp4";
262
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c786 = ".webm";
263
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c787 = ".mov";
264
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c788 = ".avi";
265
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c789 = ".mkv";
266
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c790 = ".m4v";
267
+ const _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c791 = ".ogv";
268
+ const _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c797 = "javascript:";
269
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c810 = "expression(";
270
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c811 = "url(";
271
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c812 = "-moz-binding";
272
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c813 = "behavior:";
273
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c814 = "behaviour:";
274
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c815 = "javascript:";
275
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c816 = "vbscript:";
276
+ const _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c817 = "@import";
277
+ const _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c818 = "on";
278
+ const _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c819 = "javascript:";
279
+ const _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c820 = "data:text/html";
280
+ const _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c836 = ">";
281
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838 = "<";
282
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840 = "<summary>";
283
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841 = "</details>";
284
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c843 = "</details>";
285
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c844 = "<details";
286
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c848 = "#";
287
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849 = "```";
288
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c851 = "```";
289
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c852 = ">";
290
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c854 = ">";
291
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c857 = "- ";
292
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c858 = "* ";
293
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c863 = "- ";
294
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c864 = "* ";
295
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c860 = "[ ] ";
296
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c861 = "[x] ";
297
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c862 = "[X] ";
298
+ const _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c871 = "|";
299
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c956 = "@@ ";
300
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c958 = "@@ ";
301
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c959 = "diff ";
302
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c960 = "--- ";
303
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c961 = "+";
304
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c962 = "-";
305
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c963 = " ";
306
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c964 = "diff ";
307
+ const _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c965 = "--- ";
308
+ const _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c967 = "a/";
309
+ const _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c968 = "b/";
310
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c970 = "diff --git ";
311
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c972 = "new file mode";
312
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c973 = "deleted file mode";
313
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c974 = "Binary files";
314
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c975 = "index ";
315
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c976 = "--- ";
316
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c977 = "+++ ";
317
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c978 = "--- ";
318
+ const _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c979 = "+++ ";
307
319
  const _M0FP36kazuph5reviw6server15active__servers = [];
308
320
  const _M0FP36kazuph5reviw6server12all__results = [];
309
- const _M0FP36kazuph5reviw6server26print__usage_2eusage_7c402 = "Usage: reviw <file...> [options]\n\nOptions:\n --port <n> Base port (default: 4989)\n --no-open Don't open browser\n -e, --encoding <enc> Force encoding (e.g. shift-jis, euc-jp)\n -h, --help Show help\n -v, --version Show version\n\nSupported formats: CSV, TSV, Markdown, Diff, Plain text\nPipe stdin for diff: git diff | reviw";
310
- const _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c448 = ".";
311
- const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c479 = "..";
312
- const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c482 = "scene_";
313
- const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c483 = ".jpg";
314
- const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c512 = "/";
315
- const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c510 = "..";
316
- const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c511 = "video/";
317
- const _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c514 = "/";
318
- const _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c513 = "..";
319
- const _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c515 = "/video-timeline?";
320
- const _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c516 = "true";
321
- const _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c517 = "true";
322
- const _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c527 = "-";
321
+ const _M0FP36kazuph5reviw6server26print__usage_2eusage_7c449 = "Usage: reviw <file...> [options]\n\nOptions:\n --port <n> Base port (default: 4989)\n --host <addr> Bind address (default: 127.0.0.1, use 0.0.0.0 for remote)\n --no-open Don't open browser\n -e, --encoding <enc> Force encoding (e.g. shift-jis, euc-jp)\n -h, --help Show help\n -v, --version Show version\n\nSupported formats: CSV, TSV, Markdown, Diff, Plain text\nPipe stdin for diff: git diff | reviw";
322
+ const _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c497 = ".";
323
+ const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c539 = "..";
324
+ const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c542 = "scene_";
325
+ const _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c543 = ".jpg";
326
+ const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c572 = "/";
327
+ const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c570 = "..";
328
+ const _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c571 = "video/";
329
+ const _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c574 = "/";
330
+ const _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c573 = "..";
331
+ const _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c575 = "/video-timeline?";
332
+ const _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c576 = "true";
333
+ const _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c577 = "true";
334
+ const _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c589 = "-";
323
335
  const _M0FP36kazuph5reviw6server15expected__count = _M0MP311moonbitlang4core3ref3Ref3newGiE(0);
324
336
  const _M0FP36kazuph5reviw6server18encoding__override = _M0MP311moonbitlang4core3ref3Ref3newGsE("");
325
- const _M0FP311moonbitlang4core7builtin33brute__force__find_2econstr_2f244 = 0;
326
- const _M0FP311moonbitlang4core7builtin43boyer__moore__horspool__find_2econstr_2f230 = 0;
337
+ const _M0FP311moonbitlang4core7builtin33brute__force__find_2econstr_2f247 = 0;
338
+ const _M0FP311moonbitlang4core7builtin43boyer__moore__horspool__find_2econstr_2f233 = 0;
339
+ const _M0FP36kazuph5reviw6server10bind__host = _M0MP311moonbitlang4core3ref3Ref3newGsE("127.0.0.1");
327
340
  const _M0FP36kazuph5reviw6server13ui__js__cache = _M0MP311moonbitlang4core3ref3Ref3newGsE("");
328
341
  const _M0FP311moonbitlang4core7builtin4seed = _M0FP311moonbitlang4core7builtin12random__seed();
329
342
  const _M0FP36kazuph5reviw4core16heading__counter = _M0MP311moonbitlang4core3ref3Ref3newGiE(0);
@@ -333,6 +346,9 @@ function _M0FP311moonbitlang4core5abort5abortGRP311moonbitlang4core6string10Stri
333
346
  function _M0FP311moonbitlang4core5abort5abortGRP36kazuph5reviw6server7JsValueE(msg) {
334
347
  return $panic();
335
348
  }
349
+ function _M0FP311moonbitlang4core5abort5abortGsE(msg) {
350
+ return $panic();
351
+ }
336
352
  function _M0MP311moonbitlang4core7builtin6Hasher8consume4(self, input) {
337
353
  const _p = (self.acc >>> 0) + ((Math.imul(input, -1028477379) | 0) >>> 0) | 0;
338
354
  const _p$2 = 17;
@@ -348,6 +364,9 @@ function _M0FP311moonbitlang4core7builtin5abortGRP311moonbitlang4core6string10St
348
364
  function _M0FP311moonbitlang4core7builtin5abortGRP36kazuph5reviw6server7JsValueE(string, loc) {
349
365
  return _M0FP311moonbitlang4core5abort5abortGRP36kazuph5reviw6server7JsValueE(`${string}\n at ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGRP311moonbitlang4core7builtin9SourceLocE(loc)}\n`);
350
366
  }
367
+ function _M0FP311moonbitlang4core7builtin5abortGsE(string, loc) {
368
+ return _M0FP311moonbitlang4core5abort5abortGsE(`${string}\n at ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGRP311moonbitlang4core7builtin9SourceLocE(loc)}\n`);
369
+ }
351
370
  function _M0MP311moonbitlang4core7builtin13StringBuilder11new_2einner(size_hint) {
352
371
  return { val: "" };
353
372
  }
@@ -1170,7 +1189,7 @@ function _M0FP311moonbitlang4core7builtin28boyer__moore__horspool__find(haystack
1170
1189
  return undefined;
1171
1190
  }
1172
1191
  } else {
1173
- return _M0FP311moonbitlang4core7builtin43boyer__moore__horspool__find_2econstr_2f230;
1192
+ return _M0FP311moonbitlang4core7builtin43boyer__moore__horspool__find_2econstr_2f233;
1174
1193
  }
1175
1194
  }
1176
1195
  function _M0FP311moonbitlang4core7builtin18brute__force__find(haystack, needle) {
@@ -1229,7 +1248,7 @@ function _M0FP311moonbitlang4core7builtin18brute__force__find(haystack, needle)
1229
1248
  return undefined;
1230
1249
  }
1231
1250
  } else {
1232
- return _M0FP311moonbitlang4core7builtin33brute__force__find_2econstr_2f244;
1251
+ return _M0FP311moonbitlang4core7builtin33brute__force__find_2econstr_2f247;
1233
1252
  }
1234
1253
  }
1235
1254
  function _M0MP311moonbitlang4core6string10StringView4find(self, str) {
@@ -1432,6 +1451,9 @@ function _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core13ReviwQ
1432
1451
  function _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core7CommentE(self, value) {
1433
1452
  _M0MP311moonbitlang4core7builtin7JSArray4push(self, value);
1434
1453
  }
1454
+ function _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core12MermaidErrorE(self, value) {
1455
+ _M0MP311moonbitlang4core7builtin7JSArray4push(self, value);
1456
+ }
1435
1457
  function _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core12ReviewResultE(self, value) {
1436
1458
  _M0MP311moonbitlang4core7builtin7JSArray4push(self, value);
1437
1459
  }
@@ -1769,6 +1791,124 @@ function _M0MP311moonbitlang4core7builtin3Map11from__arrayGssE(arr) {
1769
1791
  }
1770
1792
  return m;
1771
1793
  }
1794
+ function _M0MP311moonbitlang4core7builtin3Map3getGssE(self, key) {
1795
+ const hash = _M0IP016_24default__implP311moonbitlang4core7builtin4Hash4hashGsE(key);
1796
+ let _tmp = 0;
1797
+ let _tmp$2 = hash & self.capacity_mask;
1798
+ while (true) {
1799
+ const i = _tmp;
1800
+ const idx = _tmp$2;
1801
+ const _tmp$3 = self.entries;
1802
+ $bound_check(_tmp$3, idx);
1803
+ const _bind = _tmp$3[idx];
1804
+ if (_bind === undefined) {
1805
+ return undefined;
1806
+ } else {
1807
+ const _Some = _bind;
1808
+ const _entry = _Some;
1809
+ if (_entry.hash === hash && _entry.key === key) {
1810
+ return _entry.value;
1811
+ }
1812
+ if (i > _entry.psl) {
1813
+ return undefined;
1814
+ }
1815
+ _tmp = i + 1 | 0;
1816
+ _tmp$2 = idx + 1 & self.capacity_mask;
1817
+ continue;
1818
+ }
1819
+ }
1820
+ }
1821
+ function _M0MP311moonbitlang4core7builtin3Map13remove__entryGssE(self, entry) {
1822
+ const _bind = entry.prev;
1823
+ if (_bind === -1) {
1824
+ self.head = entry.next;
1825
+ } else {
1826
+ const _tmp = self.entries;
1827
+ $bound_check(_tmp, _bind);
1828
+ const _p = _tmp[_bind];
1829
+ let _tmp$2;
1830
+ if (_p === undefined) {
1831
+ _tmp$2 = $panic();
1832
+ } else {
1833
+ const _p$2 = _p;
1834
+ _tmp$2 = _p$2;
1835
+ }
1836
+ _tmp$2.next = entry.next;
1837
+ }
1838
+ const _bind$2 = entry.next;
1839
+ if (_bind$2 === undefined) {
1840
+ self.tail = entry.prev;
1841
+ return;
1842
+ } else {
1843
+ const _Some = _bind$2;
1844
+ const _next = _Some;
1845
+ _next.prev = entry.prev;
1846
+ return;
1847
+ }
1848
+ }
1849
+ function _M0MP311moonbitlang4core7builtin3Map11shift__backGssE(self, idx) {
1850
+ let _tmp = idx;
1851
+ while (true) {
1852
+ const idx$2 = _tmp;
1853
+ const next = idx$2 + 1 & self.capacity_mask;
1854
+ _L: {
1855
+ const _tmp$2 = self.entries;
1856
+ $bound_check(_tmp$2, next);
1857
+ const _bind = _tmp$2[next];
1858
+ if (_bind === undefined) {
1859
+ break _L;
1860
+ } else {
1861
+ const _Some = _bind;
1862
+ const _x = _Some;
1863
+ const _x$2 = _x.psl;
1864
+ if (_x$2 === 0) {
1865
+ break _L;
1866
+ } else {
1867
+ _x.psl = _x.psl - 1 | 0;
1868
+ _M0MP311moonbitlang4core7builtin3Map10set__entryGssE(self, _x, idx$2);
1869
+ _tmp = next;
1870
+ continue;
1871
+ }
1872
+ }
1873
+ }
1874
+ const _tmp$2 = self.entries;
1875
+ $bound_check(_tmp$2, idx$2);
1876
+ _tmp$2[idx$2] = undefined;
1877
+ return;
1878
+ }
1879
+ }
1880
+ function _M0MP311moonbitlang4core7builtin3Map18remove__with__hashGssE(self, key, hash) {
1881
+ let _tmp = 0;
1882
+ let _tmp$2 = hash & self.capacity_mask;
1883
+ while (true) {
1884
+ const i = _tmp;
1885
+ const idx = _tmp$2;
1886
+ const _tmp$3 = self.entries;
1887
+ $bound_check(_tmp$3, idx);
1888
+ const _bind = _tmp$3[idx];
1889
+ if (_bind === undefined) {
1890
+ break;
1891
+ } else {
1892
+ const _Some = _bind;
1893
+ const _entry = _Some;
1894
+ if (_entry.hash === hash && _entry.key === key) {
1895
+ _M0MP311moonbitlang4core7builtin3Map13remove__entryGssE(self, _entry);
1896
+ _M0MP311moonbitlang4core7builtin3Map11shift__backGssE(self, idx);
1897
+ self.size = self.size - 1 | 0;
1898
+ break;
1899
+ }
1900
+ if (i > _entry.psl) {
1901
+ break;
1902
+ }
1903
+ _tmp = i + 1 | 0;
1904
+ _tmp$2 = idx + 1 & self.capacity_mask;
1905
+ continue;
1906
+ }
1907
+ }
1908
+ }
1909
+ function _M0MP311moonbitlang4core7builtin3Map6removeGssE(self, key) {
1910
+ _M0MP311moonbitlang4core7builtin3Map18remove__with__hashGssE(self, key, _M0IP016_24default__implP311moonbitlang4core7builtin4Hash4hashGsE(key));
1911
+ }
1772
1912
  function _M0MP311moonbitlang4core7builtin5Iter24nextGicE(self) {
1773
1913
  return _M0MP311moonbitlang4core7builtin4Iter4nextGUicEE(self);
1774
1914
  }
@@ -1935,6 +2075,16 @@ function _M0MP311moonbitlang4core5array5Array6removeGRP36kazuph5reviw6server7JsV
1935
2075
  return _M0FP311moonbitlang4core7builtin5abortGRP36kazuph5reviw6server7JsValueE(`index out of bounds: the len is from 0 to ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(self.length)} but the index is ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(index)}`, "@moonbitlang/core/builtin:arraycore_js.mbt:251:5-253:6");
1936
2076
  }
1937
2077
  }
2078
+ function _M0MP311moonbitlang4core5array5Array6removeGsE(self, index) {
2079
+ if (index >= 0 && index < self.length) {
2080
+ $bound_check(self, index);
2081
+ const value = self[index];
2082
+ _M0MP311moonbitlang4core7builtin7JSArray6splice(self, index, 1);
2083
+ return value;
2084
+ } else {
2085
+ return _M0FP311moonbitlang4core7builtin5abortGsE(`index out of bounds: the len is from 0 to ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(self.length)} but the index is ${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(index)}`, "@moonbitlang/core/builtin:arraycore_js.mbt:251:5-253:6");
2086
+ }
2087
+ }
1938
2088
  function _M0MP311moonbitlang4core5array5Array4copyGsE(self) {
1939
2089
  return _M0MP311moonbitlang4core7builtin7JSArray4copy(self);
1940
2090
  }
@@ -1947,38 +2097,38 @@ function _M0MP311moonbitlang4core3ref3Ref3newGsE(x) {
1947
2097
  function _M0MP311moonbitlang4core3ref3Ref3newGiE(x) {
1948
2098
  return { val: x };
1949
2099
  }
1950
- function _M0IP36kazuph5reviw4core8FileModeP311moonbitlang4core7builtin2Eq5equal(_x_561, _x_562) {
1951
- switch (_x_561) {
2100
+ function _M0IP36kazuph5reviw4core8FileModeP311moonbitlang4core7builtin2Eq5equal(_x_571, _x_572) {
2101
+ switch (_x_571) {
1952
2102
  case 0: {
1953
- if (_x_562 === 0) {
2103
+ if (_x_572 === 0) {
1954
2104
  return true;
1955
2105
  } else {
1956
2106
  return false;
1957
2107
  }
1958
2108
  }
1959
2109
  case 1: {
1960
- if (_x_562 === 1) {
2110
+ if (_x_572 === 1) {
1961
2111
  return true;
1962
2112
  } else {
1963
2113
  return false;
1964
2114
  }
1965
2115
  }
1966
2116
  case 2: {
1967
- if (_x_562 === 2) {
2117
+ if (_x_572 === 2) {
1968
2118
  return true;
1969
2119
  } else {
1970
2120
  return false;
1971
2121
  }
1972
2122
  }
1973
2123
  case 3: {
1974
- if (_x_562 === 3) {
2124
+ if (_x_572 === 3) {
1975
2125
  return true;
1976
2126
  } else {
1977
2127
  return false;
1978
2128
  }
1979
2129
  }
1980
2130
  default: {
1981
- if (_x_562 === 4) {
2131
+ if (_x_572 === 4) {
1982
2132
  return true;
1983
2133
  } else {
1984
2134
  return false;
@@ -1987,7 +2137,7 @@ function _M0IP36kazuph5reviw4core8FileModeP311moonbitlang4core7builtin2Eq5equal(
1987
2137
  }
1988
2138
  }
1989
2139
  function _M0FP36kazuph5reviw4core20yaml__escape__string(s) {
1990
- const needs_quote = _M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c639, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c639.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c640, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c640.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c641, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c641.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c642, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c642.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c643, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c643.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c644, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c644.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c645, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c645.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c646, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c646.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c647, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c647.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c648, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c648.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c649, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c649.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c650, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c650.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c651, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c651.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c652, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c652.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c653, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c653.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c654, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c654.length }) || _M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c655, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c655.length }))))))))))))))));
2140
+ const needs_quote = _M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c657, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c657.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c658, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c658.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c659, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c659.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c660, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c660.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c661, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c661.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c662, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c662.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c663, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c663.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c664, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c664.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c665, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c665.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c666, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c666.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c667, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c667.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c668, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c668.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c669, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c669.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c670, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c670.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c671, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c671.length }) || (_M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c672, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c672.length }) || _M0MP311moonbitlang4core6string6String8contains(s, { str: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c673, start: 0, end: _M0FP36kazuph5reviw4core36yaml__escape__string_2e_2abind_7c673.length }))))))))))))))));
1991
2141
  if (needs_quote) {
1992
2142
  const buf = _M0MP311moonbitlang4core7builtin13StringBuilder11new_2einner(0);
1993
2143
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 39);
@@ -2078,6 +2228,28 @@ function _M0FP36kazuph5reviw4core16review__to__yaml(result) {
2078
2228
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core20yaml__escape__string(result.answers));
2079
2229
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2080
2230
  }
2231
+ if (result.mermaid_errors.length > 0) {
2232
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid_errors:\n");
2233
+ const _arr$2 = result.mermaid_errors;
2234
+ const _len$2 = _arr$2.length;
2235
+ let _tmp$2 = 0;
2236
+ while (true) {
2237
+ const _i = _tmp$2;
2238
+ if (_i < _len$2) {
2239
+ const err = _arr$2[_i];
2240
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, " - line: ");
2241
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0MP311moonbitlang4core3int3Int18to__string_2einner(err.line, 10));
2242
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2243
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, " error: ");
2244
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core20yaml__escape__string(err.message));
2245
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2246
+ _tmp$2 = _i + 1 | 0;
2247
+ continue;
2248
+ } else {
2249
+ break;
2250
+ }
2251
+ }
2252
+ }
2081
2253
  return buf.val;
2082
2254
  }
2083
2255
  function _M0FP36kazuph5reviw4core17reviews__to__yaml(results) {
@@ -2129,6 +2301,28 @@ function _M0FP36kazuph5reviw4core17reviews__to__yaml(results) {
2129
2301
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core20yaml__escape__string(result.answers));
2130
2302
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2131
2303
  }
2304
+ if (result.mermaid_errors.length > 0) {
2305
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, " mermaid_errors:\n");
2306
+ const _arr$2 = result.mermaid_errors;
2307
+ const _len$3 = _arr$2.length;
2308
+ let _tmp$3 = 0;
2309
+ while (true) {
2310
+ const _i$2 = _tmp$3;
2311
+ if (_i$2 < _len$3) {
2312
+ const err = _arr$2[_i$2];
2313
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, " - line: ");
2314
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0MP311moonbitlang4core3int3Int18to__string_2einner(err.line, 10));
2315
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2316
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, " error: ");
2317
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core20yaml__escape__string(err.message));
2318
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, 10);
2319
+ _tmp$3 = _i$2 + 1 | 0;
2320
+ continue;
2321
+ } else {
2322
+ break;
2323
+ }
2324
+ }
2325
+ }
2132
2326
  _tmp = _i + 1 | 0;
2133
2327
  continue;
2134
2328
  } else {
@@ -2204,7 +2398,7 @@ function _M0FP36kazuph5reviw4core16parse__int__safe(s) {
2204
2398
  }
2205
2399
  function _M0FP36kazuph5reviw4core16split__to__lines(input) {
2206
2400
  const result = [];
2207
- const _it = _M0MP311moonbitlang4core6string6String5split(input, { str: _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c680, start: 0, end: _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c680.length });
2401
+ const _it = _M0MP311moonbitlang4core6string6String5split(input, { str: _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c702, start: 0, end: _M0FP36kazuph5reviw4core32split__to__lines_2e_2abind_7c702.length });
2208
2402
  while (true) {
2209
2403
  const _bind = _M0MP311moonbitlang4core7builtin4Iter4nextGRP311moonbitlang4core6string10StringViewE(_it);
2210
2404
  if (_bind === undefined) {
@@ -2305,12 +2499,12 @@ function _M0FP36kazuph5reviw4core4trim(s) {
2305
2499
  return "";
2306
2500
  }
2307
2501
  const buf = _M0MP311moonbitlang4core7builtin13StringBuilder11new_2einner(0);
2308
- const _start452 = start;
2309
- const _end453 = end;
2310
- let _tmp = _start452;
2502
+ const _start454 = start;
2503
+ const _end455 = end;
2504
+ let _tmp = _start454;
2311
2505
  while (true) {
2312
2506
  const i = _tmp;
2313
- if (i <= _end453) {
2507
+ if (i <= _end455) {
2314
2508
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger11write__char(buf, _M0MP311moonbitlang4core5array5Array2atGcE(chars, i));
2315
2509
  _tmp = i + 1 | 0;
2316
2510
  continue;
@@ -2350,10 +2544,10 @@ function _M0FP36kazuph5reviw4core23parse__single__question(lines, start, end) {
2350
2544
  if (i < end) {
2351
2545
  const line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
2352
2546
  const trimmed = _M0FP36kazuph5reviw4core4trim(line);
2353
- if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c693, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c693.length }) && _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c694, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c694.length })) {
2547
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c715, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c715.length }) && _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c716, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c716.length })) {
2354
2548
  break;
2355
2549
  }
2356
- if (trimmed.length === 0 || !_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c695, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c695.length }) && !_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c696, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c696.length })) {
2550
+ if (trimmed.length === 0 || !_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c717, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c717.length }) && !_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c718, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c718.length })) {
2357
2551
  break;
2358
2552
  }
2359
2553
  const content_colon = _M0FP36kazuph5reviw4core15index__of__char(trimmed, 58);
@@ -2378,7 +2572,7 @@ function _M0FP36kazuph5reviw4core23parse__single__question(lines, start, end) {
2378
2572
  if (i < end) {
2379
2573
  const opt_line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
2380
2574
  const opt_trimmed = _M0FP36kazuph5reviw4core4trim(opt_line);
2381
- if (_M0MP311moonbitlang4core6string6String11has__prefix(opt_trimmed, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c698, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c698.length }) && _M0MP311moonbitlang4core6string6String11has__prefix(opt_line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c699, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c699.length })) {
2575
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(opt_trimmed, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c720, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c720.length }) && _M0MP311moonbitlang4core6string6String11has__prefix(opt_line, { str: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c721, start: 0, end: _M0FP36kazuph5reviw4core39parse__single__question_2e_2abind_7c721.length })) {
2382
2576
  _M0MP311moonbitlang4core5array5Array4pushGsE(options, _M0FP36kazuph5reviw4core4trim(_M0FP36kazuph5reviw4core11safe__slice(opt_trimmed, 2)));
2383
2577
  i = i + 1 | 0;
2384
2578
  } else {
@@ -2418,12 +2612,12 @@ function _M0FP36kazuph5reviw4core23parse__reviw__questions(lines, start, end) {
2418
2612
  if (i < end) {
2419
2613
  const item_line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
2420
2614
  const trimmed = _M0FP36kazuph5reviw4core4trim(item_line);
2421
- if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c703, start: 0, end: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c703.length })) {
2615
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c725, start: 0, end: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c725.length })) {
2422
2616
  const q = _M0FP36kazuph5reviw4core23parse__single__question(lines, i, end);
2423
2617
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core13ReviwQuestionE(questions, q._0);
2424
2618
  i = q._1;
2425
2619
  } else {
2426
- if (trimmed.length === 0 || !_M0MP311moonbitlang4core6string6String11has__prefix(item_line, { str: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c704, start: 0, end: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c704.length })) {
2620
+ if (trimmed.length === 0 || !_M0MP311moonbitlang4core6string6String11has__prefix(item_line, { str: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c726, start: 0, end: _M0FP36kazuph5reviw4core39parse__reviw__questions_2e_2abind_7c726.length })) {
2427
2621
  break;
2428
2622
  } else {
2429
2623
  i = i + 1 | 0;
@@ -2573,7 +2767,7 @@ function _M0FP36kazuph5reviw4core20is__horizontal__rule(line) {
2573
2767
  }
2574
2768
  function _M0FP36kazuph5reviw4core22is__html__block__start(line) {
2575
2769
  const t = _M0FP36kazuph5reviw4core4trim(line);
2576
- return _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c719, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c719.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c720, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c720.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c721, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c721.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c722, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c722.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c723, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c723.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c724, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c724.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c725, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c725.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c726, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c726.length })))))));
2770
+ return _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c741, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c741.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c742, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c742.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c743, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c743.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c744, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c744.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c745, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c745.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c746, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c746.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c747, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c747.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c748, start: 0, end: _M0FP36kazuph5reviw4core38is__html__block__start_2e_2abind_7c748.length })))))));
2577
2771
  }
2578
2772
  function _M0FP36kazuph5reviw4core23is__ordered__list__item(line) {
2579
2773
  const chars = _M0MP311moonbitlang4core6string6String9to__array(line);
@@ -2592,15 +2786,15 @@ function _M0FP36kazuph5reviw4core23is__ordered__list__item(line) {
2592
2786
  return i < (chars.length - 1 | 0) && (_M0MP311moonbitlang4core5array5Array2atGcE(chars, i) === 46 && _M0MP311moonbitlang4core5array5Array2atGcE(chars, i + 1 | 0) === 32);
2593
2787
  }
2594
2788
  function _M0FP36kazuph5reviw4core16is__block__start(line) {
2595
- return _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c728, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c728.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c729, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c729.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c730, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c730.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c731, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c731.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c732, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c732.length }) || (_M0FP36kazuph5reviw4core23is__ordered__list__item(line) || (_M0FP36kazuph5reviw4core20is__horizontal__rule(line) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c733, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c733.length }) && _M0FP36kazuph5reviw4core22is__html__block__start(line)))))));
2789
+ return _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c750, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c750.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c751, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c751.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c752, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c752.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c753, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c753.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c754, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c754.length }) || (_M0FP36kazuph5reviw4core23is__ordered__list__item(line) || (_M0FP36kazuph5reviw4core20is__horizontal__rule(line) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c755, start: 0, end: _M0FP36kazuph5reviw4core32is__block__start_2e_2abind_7c755.length }) && _M0FP36kazuph5reviw4core22is__html__block__start(line)))))));
2596
2790
  }
2597
2791
  function _M0FP36kazuph5reviw4core20is__mermaid__content(text) {
2598
2792
  const t = _M0FP36kazuph5reviw4core4trim(text);
2599
- return _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c734, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c734.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c735, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c735.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c736, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c736.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c737, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c737.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c738, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c738.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c739, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c739.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c740, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c740.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c741, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c741.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c742, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c742.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c743, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c743.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c744, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c744.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c745, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c745.length })))))))))));
2793
+ return _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c756, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c756.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c757, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c757.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c758, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c758.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c759, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c759.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c760, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c760.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c761, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c761.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c762, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c762.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c763, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c763.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c764, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c764.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c765, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c765.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c766, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c766.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c767, start: 0, end: _M0FP36kazuph5reviw4core36is__mermaid__content_2e_2abind_7c767.length })))))))))));
2600
2794
  }
2601
2795
  function _M0FP36kazuph5reviw4core20is__table__separator(line) {
2602
2796
  const t = _M0FP36kazuph5reviw4core4trim(line);
2603
- if (!_M0MP311moonbitlang4core6string6String8contains(t, { str: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c746, start: 0, end: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c746.length }) || !_M0MP311moonbitlang4core6string6String8contains(t, { str: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c747, start: 0, end: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c747.length })) {
2797
+ if (!_M0MP311moonbitlang4core6string6String8contains(t, { str: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c768, start: 0, end: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c768.length }) || !_M0MP311moonbitlang4core6string6String8contains(t, { str: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c769, start: 0, end: _M0FP36kazuph5reviw4core36is__table__separator_2e_2abind_7c769.length })) {
2604
2798
  return false;
2605
2799
  }
2606
2800
  const chars = _M0MP311moonbitlang4core6string6String9to__array(t);
@@ -2655,8 +2849,8 @@ function _M0FP36kazuph5reviw4core18make__heading__key(text, counter) {
2655
2849
  function _M0FP36kazuph5reviw4core17parse__table__row(line) {
2656
2850
  const result = [];
2657
2851
  const t = _M0FP36kazuph5reviw4core4trim(line);
2658
- const inner = _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c760, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c760.length }) && _M0MP311moonbitlang4core6string6String11has__suffix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c761, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c761.length }) ? _M0FP36kazuph5reviw4core18safe__slice__range(t, 1, t.length - 1 | 0) : _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c762, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c762.length }) ? _M0FP36kazuph5reviw4core11safe__slice(t, 1) : t;
2659
- const _it = _M0MP311moonbitlang4core6string6String5split(inner, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c759, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c759.length });
2852
+ const inner = _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c782, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c782.length }) && _M0MP311moonbitlang4core6string6String11has__suffix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c783, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c783.length }) ? _M0FP36kazuph5reviw4core18safe__slice__range(t, 1, t.length - 1 | 0) : _M0MP311moonbitlang4core6string6String11has__prefix(t, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c784, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c784.length }) ? _M0FP36kazuph5reviw4core11safe__slice(t, 1) : t;
2853
+ const _it = _M0MP311moonbitlang4core6string6String5split(inner, { str: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c781, start: 0, end: _M0FP36kazuph5reviw4core33parse__table__row_2e_2abind_7c781.length });
2660
2854
  while (true) {
2661
2855
  const _bind = _M0MP311moonbitlang4core7builtin4Iter4nextGRP311moonbitlang4core6string10StringViewE(_it);
2662
2856
  if (_bind === undefined) {
@@ -2672,7 +2866,7 @@ function _M0FP36kazuph5reviw4core17parse__table__row(line) {
2672
2866
  }
2673
2867
  function _M0FP36kazuph5reviw4core14is__video__url(url) {
2674
2868
  const lower = _M0MP311moonbitlang4core6string6String9to__lower(url);
2675
- return _M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c763, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c763.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c764, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c764.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c765, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c765.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c766, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c766.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c767, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c767.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c768, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c768.length }) || _M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c769, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c769.length }))))));
2869
+ return _M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c785, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c785.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c786, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c786.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c787, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c787.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c788, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c788.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c789, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c789.length }) || (_M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c790, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c790.length }) || _M0MP311moonbitlang4core6string6String11has__suffix(lower, { str: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c791, start: 0, end: _M0FP36kazuph5reviw4core30is__video__url_2e_2abind_7c791.length }))))));
2676
2870
  }
2677
2871
  function _M0FP36kazuph5reviw4core14render__inline(text) {
2678
2872
  const chars = _M0MP311moonbitlang4core6string6String9to__array(text);
@@ -2771,7 +2965,7 @@ function _M0FP36kazuph5reviw4core14render__inline(text) {
2771
2965
  const link_text = _M0FP36kazuph5reviw4core18safe__slice__range(text, text_start, text_end);
2772
2966
  const link_url = _M0FP36kazuph5reviw4core18safe__slice__range(text, url_start, url_end);
2773
2967
  const lower_url = _M0MP311moonbitlang4core6string6String9to__lower(link_url);
2774
- if (_M0MP311moonbitlang4core6string6String11has__prefix(lower_url, { str: _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c775, start: 0, end: _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c775.length })) {
2968
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(lower_url, { str: _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c797, start: 0, end: _M0FP36kazuph5reviw4core30render__inline_2e_2abind_7c797.length })) {
2775
2969
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core12escape__html(link_text));
2776
2970
  } else {
2777
2971
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<a href=\"");
@@ -2968,18 +3162,18 @@ function _M0FP36kazuph5reviw4core17is__allowed__attr(name) {
2968
3162
  }
2969
3163
  function _M0FP36kazuph5reviw4core18is__dangerous__css(value) {
2970
3164
  const lower = _M0MP311moonbitlang4core6string6String9to__lower(value);
2971
- return _M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c788, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c788.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c789, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c789.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c790, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c790.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c791, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c791.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c792, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c792.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c793, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c793.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c794, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c794.length }) || _M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c795, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c795.length })))))));
3165
+ return _M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c810, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c810.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c811, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c811.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c812, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c812.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c813, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c813.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c814, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c814.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c815, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c815.length }) || (_M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c816, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c816.length }) || _M0MP311moonbitlang4core6string6String8contains(lower, { str: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c817, start: 0, end: _M0FP36kazuph5reviw4core34is__dangerous__css_2e_2abind_7c817.length })))))));
2972
3166
  }
2973
3167
  function _M0FP36kazuph5reviw4core24is__event__handler__attr(name) {
2974
- return _M0MP311moonbitlang4core6string6String11has__prefix(name, { str: _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c796, start: 0, end: _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c796.length });
3168
+ return _M0MP311moonbitlang4core6string6String11has__prefix(name, { str: _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c818, start: 0, end: _M0FP36kazuph5reviw4core40is__event__handler__attr_2e_2abind_7c818.length });
2975
3169
  }
2976
3170
  function _M0FP36kazuph5reviw4core13is__safe__url(url) {
2977
3171
  const lower = _M0MP311moonbitlang4core6string6String9to__lower(url);
2978
3172
  const trimmed = _M0FP36kazuph5reviw4core4trim(lower);
2979
- if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c797, start: 0, end: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c797.length })) {
3173
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c819, start: 0, end: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c819.length })) {
2980
3174
  return false;
2981
3175
  }
2982
- if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c798, start: 0, end: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c798.length })) {
3176
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(trimmed, { str: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c820, start: 0, end: _M0FP36kazuph5reviw4core29is__safe__url_2e_2abind_7c820.length })) {
2983
3177
  return false;
2984
3178
  }
2985
3179
  return true;
@@ -3318,7 +3512,7 @@ function _M0FP36kazuph5reviw4core14sanitize__html(input) {
3318
3512
  if (!_M0FP36kazuph5reviw4core16is__allowed__tag(tag_name) && tag_name.length > 0) {
3319
3513
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "&lt;");
3320
3514
  const tag_content = _M0FP36kazuph5reviw4core18safe__slice__range(input, tag_start + 1 | 0, tag_end);
3321
- const trimmed_content = _M0MP311moonbitlang4core6string6String11has__suffix(tag_content, { str: _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c814, start: 0, end: _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c814.length }) ? _M0FP36kazuph5reviw4core18safe__slice__range(tag_content, 0, tag_content.length - 1 | 0) : tag_content;
3515
+ const trimmed_content = _M0MP311moonbitlang4core6string6String11has__suffix(tag_content, { str: _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c836, start: 0, end: _M0FP36kazuph5reviw4core30sanitize__html_2e_2abind_7c836.length }) ? _M0FP36kazuph5reviw4core18safe__slice__range(tag_content, 0, tag_content.length - 1 | 0) : tag_content;
3322
3516
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core12escape__html(trimmed_content));
3323
3517
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "&gt;");
3324
3518
  i = tag_end;
@@ -3362,7 +3556,7 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3362
3556
  i = i + 1 | 0;
3363
3557
  continue;
3364
3558
  }
3365
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c816, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c816.length }) && _M0FP36kazuph5reviw4core22is__html__block__start(line)) {
3559
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838.length }) && _M0FP36kazuph5reviw4core22is__html__block__start(line)) {
3366
3560
  const tag_name = _M0FP36kazuph5reviw4core24extract__html__tag__name(line);
3367
3561
  if (tag_name === "details") {
3368
3562
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<details>\n");
@@ -3370,13 +3564,13 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3370
3564
  while (true) {
3371
3565
  if (i < len) {
3372
3566
  const current = _M0FP36kazuph5reviw4core4trim(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i));
3373
- if (_M0MP311moonbitlang4core6string6String11has__prefix(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c818, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c818.length })) {
3567
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840.length })) {
3374
3568
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core14sanitize__html(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i)));
3375
3569
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "\n");
3376
3570
  i = i + 1 | 0;
3377
3571
  break;
3378
3572
  } else {
3379
- if (_M0MP311moonbitlang4core6string6String11has__prefix(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c819, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c819.length })) {
3573
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841.length })) {
3380
3574
  break;
3381
3575
  }
3382
3576
  }
@@ -3391,14 +3585,14 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3391
3585
  while (true) {
3392
3586
  if (i < len && depth > 0) {
3393
3587
  const current = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
3394
- if (_M0MP311moonbitlang4core6string6String8contains(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c821, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c821.length })) {
3588
+ if (_M0MP311moonbitlang4core6string6String8contains(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c843, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c843.length })) {
3395
3589
  depth = depth - 1 | 0;
3396
3590
  if (depth === 0) {
3397
3591
  i = i + 1 | 0;
3398
3592
  break;
3399
3593
  }
3400
3594
  }
3401
- if (_M0MP311moonbitlang4core6string6String8contains(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c822, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c822.length })) {
3595
+ if (_M0MP311moonbitlang4core6string6String8contains(current, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c844, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c844.length })) {
3402
3596
  depth = depth + 1 | 0;
3403
3597
  }
3404
3598
  _M0MP311moonbitlang4core5array5Array4pushGsE(inner_lines, current);
@@ -3443,7 +3637,7 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3443
3637
  }
3444
3638
  continue;
3445
3639
  }
3446
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c826, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c826.length })) {
3640
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c848, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c848.length })) {
3447
3641
  const level = _M0FP36kazuph5reviw4core21count__heading__level(line);
3448
3642
  if (level >= 1 && level <= 6) {
3449
3643
  const content = _M0FP36kazuph5reviw4core4trim(_M0FP36kazuph5reviw4core11safe__slice(line, level + 1 | 0));
@@ -3469,13 +3663,14 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3469
3663
  i = i + 1 | 0;
3470
3664
  continue;
3471
3665
  }
3472
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c827, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c827.length })) {
3666
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849.length })) {
3473
3667
  const lang = _M0FP36kazuph5reviw4core4trim(_M0FP36kazuph5reviw4core11safe__slice(line, 3));
3668
+ const code_block_start_line = i + 1 | 0;
3474
3669
  i = i + 1 | 0;
3475
3670
  const code_buf = _M0MP311moonbitlang4core7builtin13StringBuilder11new_2einner(0);
3476
3671
  let code_first = true;
3477
3672
  while (true) {
3478
- if (i < len && !_M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c829, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c829.length })) {
3673
+ if (i < len && !_M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c851, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c851.length })) {
3479
3674
  if (!code_first) {
3480
3675
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(code_buf, "\n");
3481
3676
  }
@@ -3487,13 +3682,20 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3487
3682
  break;
3488
3683
  }
3489
3684
  }
3685
+ const code_block_end_line = i < len ? i + 1 | 0 : len;
3490
3686
  if (i < len) {
3491
3687
  i = i + 1 | 0;
3492
3688
  }
3493
3689
  const code_text = code_buf.val;
3494
3690
  if (lang === "mermaid" || _M0FP36kazuph5reviw4core20is__mermaid__content(code_text)) {
3495
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"mermaid-container\"><div class=\"mermaid\" data-source=\"");
3691
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"mermaid-container\" data-source-start-line=\"");
3692
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0MP311moonbitlang4core3int3Int18to__string_2einner(code_block_start_line, 10));
3693
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "\" data-source-end-line=\"");
3694
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0MP311moonbitlang4core3int3Int18to__string_2einner(code_block_end_line, 10));
3695
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "\"><div class=\"mermaid\" data-source=\"");
3496
3696
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core12escape__html(code_text));
3697
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "\" data-source-line=\"");
3698
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0MP311moonbitlang4core3int3Int18to__string_2einner(code_block_start_line, 10));
3497
3699
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "\">");
3498
3700
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core12escape__html(code_text));
3499
3701
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div><button class=\"mermaid-fullscreen-btn\" title=\"Fullscreen\">⛶</button></div>\n");
@@ -3510,10 +3712,10 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3510
3712
  }
3511
3713
  continue;
3512
3714
  }
3513
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c830, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c830.length })) {
3715
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c852, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c852.length })) {
3514
3716
  const quote_lines = [];
3515
3717
  while (true) {
3516
- if (i < len && _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c832, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c832.length })) {
3718
+ if (i < len && _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c854, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c854.length })) {
3517
3719
  const content = _M0FP36kazuph5reviw4core4trim(_M0FP36kazuph5reviw4core11safe__slice(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), 1));
3518
3720
  _M0MP311moonbitlang4core5array5Array4pushGsE(quote_lines, content);
3519
3721
  i = i + 1 | 0;
@@ -3541,16 +3743,16 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3541
3743
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</blockquote>\n");
3542
3744
  continue;
3543
3745
  }
3544
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c835, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c835.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c836, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c836.length })) {
3746
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c857, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c857.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c858, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c858.length })) {
3545
3747
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<ul>\n");
3546
3748
  while (true) {
3547
- if (i < len && (_M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c841.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c842, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c842.length }))) {
3749
+ if (i < len && (_M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c863, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c863.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c864, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c864.length }))) {
3548
3750
  const item_text = _M0FP36kazuph5reviw4core11safe__slice(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), 2);
3549
- if (_M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c838.length })) {
3751
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c860, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c860.length })) {
3550
3752
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<li class=\"task-list-item\"><input type=\"checkbox\" disabled /> ");
3551
3753
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core14render__inline(_M0FP36kazuph5reviw4core11safe__slice(item_text, 4)));
3552
3754
  } else {
3553
- if (_M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c839, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c839.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c840.length })) {
3755
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c861, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c861.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(item_text, { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c862, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c862.length })) {
3554
3756
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled /> ");
3555
3757
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, _M0FP36kazuph5reviw4core14render__inline(_M0FP36kazuph5reviw4core11safe__slice(item_text, 4)));
3556
3758
  } else {
@@ -3607,7 +3809,7 @@ function _M0FP36kazuph5reviw4core23render__markdown__lines(lines) {
3607
3809
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</tr>\n</thead>\n<tbody>\n");
3608
3810
  i = i + 2 | 0;
3609
3811
  while (true) {
3610
- if (i < len && _M0MP311moonbitlang4core6string6String8contains(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c849.length })) {
3812
+ if (i < len && _M0MP311moonbitlang4core6string6String8contains(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c871, start: 0, end: _M0FP36kazuph5reviw4core39render__markdown__lines_2e_2abind_7c871.length })) {
3611
3813
  const cells = _M0FP36kazuph5reviw4core17parse__table__row(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i));
3612
3814
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<tr>\n");
3613
3815
  const _len$2 = cells.length;
@@ -3674,11 +3876,11 @@ function _M0FP36kazuph5reviw4core15parse__markdown(input) {
3674
3876
  let content_start = 0;
3675
3877
  if (lines.length > 0 && _M0MP311moonbitlang4core5array5Array2atGsE(lines, 0) === "---") {
3676
3878
  let end_idx = -1;
3677
- const _end471 = lines.length;
3879
+ const _end473 = lines.length;
3678
3880
  let _tmp = 1;
3679
3881
  while (true) {
3680
3882
  const i = _tmp;
3681
- if (i < _end471) {
3883
+ if (i < _end473) {
3682
3884
  if (_M0MP311moonbitlang4core5array5Array2atGsE(lines, i) === "---") {
3683
3885
  end_idx = i;
3684
3886
  break;
@@ -3690,11 +3892,11 @@ function _M0FP36kazuph5reviw4core15parse__markdown(input) {
3690
3892
  }
3691
3893
  }
3692
3894
  if (end_idx > 0) {
3693
- const _end476 = end_idx;
3895
+ const _end478 = end_idx;
3694
3896
  let _tmp$2 = 1;
3695
3897
  while (true) {
3696
3898
  const i = _tmp$2;
3697
- if (i < _end476) {
3899
+ if (i < _end478) {
3698
3900
  const line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
3699
3901
  const colon = _M0FP36kazuph5reviw4core15index__of__char(line, 58);
3700
3902
  if (colon >= 0) {
@@ -3714,12 +3916,12 @@ function _M0FP36kazuph5reviw4core15parse__markdown(input) {
3714
3916
  }
3715
3917
  }
3716
3918
  const content_lines = [];
3717
- const _start485 = content_start;
3718
- const _end486 = lines.length;
3719
- let _tmp = _start485;
3919
+ const _start487 = content_start;
3920
+ const _end488 = lines.length;
3921
+ let _tmp = _start487;
3720
3922
  while (true) {
3721
3923
  const i = _tmp;
3722
- if (i < _end486) {
3924
+ if (i < _end488) {
3723
3925
  _M0MP311moonbitlang4core5array5Array4pushGsE(content_lines, _M0MP311moonbitlang4core5array5Array2atGsE(lines, i));
3724
3926
  _tmp = i + 1 | 0;
3725
3927
  continue;
@@ -3825,19 +4027,21 @@ function _M0FP36kazuph5reviw4core24build__video__fullscreen(buf) {
3825
4027
  }
3826
4028
  function _M0FP36kazuph5reviw4core20build__comment__card(buf) {
3827
4029
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"floating\" id=\"comment-card\">");
3828
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<header><h2 id=\"card-title\">Cell Comment</h2>");
3829
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div style=\"display:flex; gap:6px;\">");
3830
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button class=\"icon-only\" id=\"copy-selection\" title=\"Copy selected lines\">&#128203;</button>");
3831
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button id=\"close-card\">Close</button>");
3832
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button id=\"clear-comment\">Delete</button>");
3833
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div></header>");
3834
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div id=\"cell-preview\" style=\"font-size:12px; color: var(--muted); margin-bottom:8px;\"></div>");
4030
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button class=\"card-close-x\" id=\"close-card\" title=\"Close\">&times;</button>");
4031
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<header><h2 id=\"card-title\">Cell Comment</h2></header>");
4032
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div id=\"cell-preview\" style=\"font-size:12px; color: var(--muted); margin-bottom:4px;\"></div>");
4033
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div style=\"position:relative\">");
4034
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button class=\"icon-only copy-btn-float\" id=\"copy-selection\" title=\"Copy selected lines\">&#128203;</button>");
3835
4035
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<textarea id=\"comment-input\" placeholder=\"Enter your comment or note\"></textarea>");
4036
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div>");
3836
4037
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"image-attach-area image-attach-small\" id=\"comment-image-area\">");
3837
4038
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<label>Image (Paste, max 1)</label>");
3838
4039
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"image-preview-list\" id=\"comment-image-preview\"></div>");
3839
4040
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div>");
3840
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"actions\"><button class=\"primary\" id=\"save-comment\">Save</button></div>");
4041
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<div class=\"actions card-actions-split\">");
4042
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button class=\"danger-text\" id=\"clear-comment\">Delete</button>");
4043
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<button class=\"primary\" id=\"save-comment\">Save</button>");
4044
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div>");
3841
4045
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</div>");
3842
4046
  }
3843
4047
  function _M0FP36kazuph5reviw4core27build__comment__list__aside(buf) {
@@ -3869,7 +4073,7 @@ function _M0FP36kazuph5reviw4core26build__page__start_2einner(buf, filename, fil
3869
4073
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github.min.css\" id=\"hljs-theme-light\">");
3870
4074
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<script src=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js\"></script>");
3871
4075
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<style>");
3872
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "/* Dark theme (default) */\n:root {\n color-scheme: dark;\n --bg: #0f172a;\n --bg-gradient: radial-gradient(circle at 20% 20%, #1e293b 0%, #0b1224 35%, #0b1224 60%, #0f172a 100%);\n --panel: #111827;\n --panel-alpha: rgba(15, 23, 42, 0.9);\n --panel-solid: #0b1224;\n --card-bg: rgba(11, 18, 36, 0.95);\n --input-bg: rgba(15, 23, 42, 0.6);\n --border: #1f2937;\n --accent: #60a5fa;\n --accent-2: #f472b6;\n --text: #e5e7eb;\n --text-inverse: #0b1224;\n --muted: #94a3b8;\n --comment: #0f766e;\n --badge: #22c55e;\n --table-bg: rgba(15, 23, 42, 0.7);\n --row-even: rgba(30, 41, 59, 0.4);\n --row-odd: rgba(15, 23, 42, 0.2);\n --selected-bg: rgba(96,165,250,0.15);\n --hover-bg: rgba(96,165,250,0.08);\n --shadow-color: rgba(0,0,0,0.35);\n --code-bg: #1e293b;\n --error: #dc3545;\n}\n/* Light theme */\n[data-theme=\"light\"] {\n color-scheme: light;\n --bg: #f8fafc;\n --bg-gradient: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);\n --panel: #ffffff;\n --panel-alpha: rgba(255, 255, 255, 0.95);\n --panel-solid: #ffffff;\n --card-bg: rgba(255, 255, 255, 0.98);\n --input-bg: #f1f5f9;\n --border: #e2e8f0;\n --accent: #3b82f6;\n --accent-2: #ec4899;\n --text: #1e293b;\n --text-inverse: #ffffff;\n --muted: #64748b;\n --comment: #14b8a6;\n --badge: #22c55e;\n --table-bg: #ffffff;\n --row-even: #f8fafc;\n --row-odd: #ffffff;\n --selected-bg: rgba(59,130,246,0.12);\n --hover-bg: rgba(59,130,246,0.06);\n --shadow-color: rgba(0,0,0,0.1);\n --code-bg: #f1f5f9;\n --error: #dc3545;\n}\n* { box-sizing: border-box; }\nbody {\n margin: 0;\n font-family: \"Inter\", \"Hiragino Sans\", system-ui, -apple-system, sans-serif;\n background: var(--bg-gradient);\n color: var(--text);\n min-height: 100vh;\n transition: background 200ms ease, color 200ms ease;\n}\nheader {\n position: sticky;\n top: 0;\n z-index: 5;\n padding: 12px 16px;\n background: var(--panel-alpha);\n backdrop-filter: blur(8px);\n border-bottom: 1px solid var(--border);\n display: flex;\n gap: 12px;\n align-items: center;\n justify-content: space-between;\n transition: background 200ms ease, border-color 200ms ease;\n}\nheader .meta { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }\nheader .actions { display: flex; gap: 8px; align-items: center; }\nheader h1 { display: flex; flex-direction: column; margin: 0; line-height: 1.3; }\nheader h1 .title-path { font-size: 11px; font-weight: 400; color: var(--muted); }\nheader h1 .title-file { font-size: 16px; font-weight: 700; }\nheader .badge {\n background: var(--selected-bg);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid var(--border);\n}\nheader button {\n background: linear-gradient(135deg, #38bdf8, #6366f1);\n color: var(--text-inverse);\n border: none;\n border-radius: 10px;\n padding: 10px 14px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: 0 10px 30px var(--shadow-color);\n transition: transform 120ms ease, box-shadow 120ms ease;\n}\nheader button:hover { transform: translateY(-1px); box-shadow: 0 16px 36px var(--shadow-color); }\nheader button:active { transform: translateY(0); }\n/* Theme toggle button */\n.theme-toggle {\n background: var(--selected-bg);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 16px;\n cursor: pointer;\n transition: background 120ms ease, transform 120ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n height: 38px;\n}\n.theme-toggle:hover { background: var(--hover-bg); transform: scale(1.05); }\n\n.wrap { padding: 12px 16px 12px; }\n.toolbar {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n margin: 10px 0 12px;\n color: var(--muted);\n font-size: 13px;\n}\n.toolbar button {\n background: rgba(96,165,250,0.12);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 13px;\n cursor: pointer;\n}\n.toolbar button:hover { background: rgba(96,165,250,0.2); }\n\n.table-box {\n background: var(--table-bg);\n border: 1px solid var(--border);\n border-radius: 12px;\n overflow: auto;\n max-height: calc(100vh - 110px);\n box-shadow: 0 20px 50px var(--shadow-color);\n transition: background 200ms ease, border-color 200ms ease;\n}\ntable {\n border-collapse: collapse;\n width: 100%;\n min-width: 540px;\n table-layout: fixed;\n}\nthead th {\n position: sticky;\n top: 0;\n z-index: 3;\n background: var(--panel-solid) !important;\n color: var(--muted);\n font-size: 12px;\n text-align: center;\n padding: 0;\n border-bottom: 1px solid var(--border);\n border-right: 1px solid var(--border);\n white-space: nowrap;\n transition: background 200ms ease;\n}\nthead th:not(.selected) {\n background: var(--panel-solid) !important;\n}\nthead th:first-child,\ntbody th {\n width: 28px;\n min-width: 28px;\n max-width: 28px;\n}\nthead th .th-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px 6px;\n position: relative;\n height: 100%;\n}\nthead th.filtered .th-inner {\n background: linear-gradient(135deg, rgba(96,165,250,0.18), rgba(34,197,94,0.18));\n color: #e5e7eb;\n border-radius: 6px;\n box-shadow: inset 0 -1px 0 rgba(255,255,255,0.05);\n}\nthead th.filtered .th-inner::after {\n content: 'FILTER';\n font-size: 10px;\n color: #c7d2fe;\n background: rgba(99,102,241,0.24);\n border: 1px solid rgba(99,102,241,0.45);\n padding: 1px 6px;\n border-radius: 999px;\n position: absolute;\n bottom: 4px;\n right: 6px;\n}\n.resizer {\n position: absolute;\n right: 2px;\n top: 0;\n width: 6px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n touch-action: none;\n opacity: 0.6;\n}\n.resizer::after {\n content: '';\n position: absolute;\n top: 10%;\n bottom: 10%;\n left: 2px;\n width: 2px;\n background: rgba(96,165,250,0.6);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\nthead th:hover .resizer::after { opacity: 1; }\n\n.freeze {\n position: sticky !important;\n background: var(--panel-solid);\n z-index: 4;\n}\n.freeze-row {\n position: sticky !important;\n background: var(--panel-solid);\n}\n.freeze-row.freeze {\n z-index: 6;\n}\nth.freeze-row {\n z-index: 6;\n}\ntbody th {\n position: sticky;\n left: 0;\n z-index: 2;\n background: var(--panel-solid);\n color: var(--muted);\n text-align: right;\n padding: 8px 10px;\n font-size: 12px;\n border-right: 1px solid var(--border);\n border-bottom: 1px solid var(--border);\n transition: background 200ms ease;\n}\ntd {\n padding: 10px 10px;\n border-bottom: 1px solid var(--border);\n border-right: 1px solid var(--border);\n background: var(--row-odd);\n color: var(--text);\n font-size: 13px;\n line-height: 1.45;\n cursor: pointer;\n transition: background 120ms ease, box-shadow 120ms ease;\n position: relative;\n white-space: pre-wrap;\n word-break: break-word;\n max-width: 320px;\n}\ntr:nth-child(even) td:not(.selected):not(.has-comment) { background: var(--row-even); }\ntd:hover:not(.selected) { background: var(--hover-bg); box-shadow: inset 0 0 0 1px rgba(96,165,250,0.25); }\ntd.has-comment { background: rgba(34,197,94,0.12); box-shadow: inset 0 0 0 1px rgba(34,197,94,0.35); }\ntd.selected, tbody th.selected { background: rgba(99,102,241,0.22) !important; box-shadow: inset 0 0 0 1px rgba(99,102,241,0.45); }\n.preview-highlight { background: rgba(167,139,250,0.18) !important; box-shadow: inset 0 0 0 2px rgba(139,92,246,0.35); border-radius: 4px; transition: background 150ms ease, box-shadow 150ms ease; padding-left: 8px; margin-left: -8px; }\nthead th.selected { background: #c7d2fe !important; box-shadow: inset 0 0 0 1px rgba(99,102,241,0.45); }\n[data-theme=\"dark\"] thead th.selected { background: #3730a3 !important; }\nbody.dragging { user-select: none; cursor: crosshair; }\nbody.dragging td, body.dragging tbody th { cursor: crosshair; }\ntbody th { cursor: pointer; }\ntd .dot {\n position: absolute;\n right: 6px;\n top: 6px;\n width: 8px;\n height: 8px;\n border-radius: 99px;\n background: var(--badge);\n box-shadow: 0 0 0 4px rgba(34,197,94,0.15);\n}\n.floating {\n position: absolute;\n z-index: 10;\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n width: min(420px, calc(100vw - 32px));\n box-shadow: 0 20px 40px var(--shadow-color);\n display: none;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.floating header {\n position: static;\n background: transparent;\n backdrop-filter: none;\n border: none;\n padding: 0 0 8px 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.floating h2 { font-size: 14px; margin: 0; color: var(--text); }\n.floating button {\n margin-left: 8px;\n background: var(--accent);\n color: var(--text-inverse);\n border: 1px solid var(--accent);\n padding: 6px 10px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 120ms ease, opacity 120ms ease;\n}\n.floating button.icon-only {\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n}\n.floating button:hover { opacity: 0.85; }\n.floating textarea {\n width: 100%;\n min-height: 110px;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid var(--border);\n background: var(--input-bg);\n color: var(--text);\n padding: 10px;\n font-size: 13px;\n line-height: 1.4;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.floating textarea:focus {\n outline: none;\n border-color: var(--accent);\n}\n.floating .actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 10px;\n}\n.floating .actions button.primary {\n background: linear-gradient(135deg, #22c55e, #16a34a);\n color: var(--text-inverse);\n border: none;\n font-weight: 700;\n box-shadow: 0 10px 30px rgba(22,163,74,0.35);\n}\n.comment-list {\n position: fixed;\n right: 14px;\n bottom: 14px;\n width: 320px;\n max-height: 60vh;\n overflow: auto;\n border: 1px solid var(--border);\n border-radius: 12px;\n background: var(--card-bg);\n box-shadow: 0 18px 40px var(--shadow-color);\n padding: 12px;\n backdrop-filter: blur(6px);\n transition: opacity 120ms ease, transform 120ms ease, background 200ms ease;\n}\n.comment-list h3 { margin: 0 0 8px 0; font-size: 13px; color: var(--muted); }\n.comment-list ol {\n margin: 0;\n padding-left: 18px;\n color: var(--text);\n font-size: 13px;\n line-height: 1.45;\n}\n.comment-list li { margin-bottom: 6px; }\n.comment-list .hint { color: var(--muted); font-size: 12px; }\n.pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 999px; background: var(--selected-bg); border: 1px solid var(--border); font-size: 12px; color: var(--text); cursor: pointer; transition: background 150ms ease, border-color 150ms ease; }\n.pill:hover { background: var(--hover-bg); border-color: var(--accent); }\n.pill strong { color: var(--text); font-weight: 700; }\n.comment-list.collapsed {\n opacity: 0;\n pointer-events: none;\n transform: translateY(8px) scale(0.98);\n}\n.md-preview {\n background: var(--input-bg);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n margin-bottom: 12px;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.md-layout {\n display: flex;\n gap: 16px;\n align-items: stretch;\n margin-top: 8px;\n height: calc(100vh - 80px);\n}\n.md-left {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n overflow-x: auto;\n overscroll-behavior: contain;\n}\n.md-left .md-preview {\n max-height: none;\n}\n.md-right {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n overflow-x: auto;\n overscroll-behavior: contain;\n}\n.md-right .table-box {\n max-width: none;\n min-width: 0;\n max-height: none;\n overflow: visible;\n}\n/* Ensure thead is opaque in md-right to prevent content showing through */\n.md-right thead th {\n background: var(--panel-solid) !important;\n}\n.md-right thead th.selected {\n background: #c7d2fe !important;\n}\n[data-theme=\"dark\"] .md-right thead th {\n background: var(--panel-solid) !important;\n}\n[data-theme=\"dark\"] .md-right thead th.selected {\n background: #3730a3 !important;\n}\n\n/* === Media Sidebar === */\n.media-sidebar {\n display: flex;\n flex-shrink: 0;\n height: calc(100vh - 80px);\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 10;\n}\n.media-sidebar.hidden {\n display: none;\n}\n.media-sidebar-thumbs {\n width: 96px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 8px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--panel);\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar {\n width: 4px;\n}\n.media-sidebar-thumbs::-webkit-scrollbar-track {\n background: transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar-thumb {\n background: var(--border);\n border-radius: 4px;\n}\n.media-sidebar-thumb {\n width: 80px;\n height: 60px;\n border-radius: 6px;\n border: 2px solid var(--border);\n overflow: hidden;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n background: var(--bg);\n transition: border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;\n}\n.media-sidebar-thumb:hover {\n border-color: var(--accent);\n transform: scale(1.05);\n box-shadow: 0 2px 8px var(--shadow-color);\n}\n.media-sidebar-thumb.active {\n border-color: var(--accent);\n box-shadow: 0 0 0 2px var(--accent), 0 2px 8px var(--shadow-color);\n}\n.media-sidebar-thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n.media-sidebar-thumb svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n.media-sidebar-thumb-video {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n}\n.media-sidebar-thumb-video video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.media-sidebar-thumb-video::after {\n content: '';\n position: absolute;\n width: 24px;\n height: 24px;\n background: rgba(255,255,255,0.85);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.media-sidebar-thumb-video::before {\n content: '';\n position: absolute;\n z-index: 1;\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 5px 0 5px 9px;\n border-color: transparent transparent transparent #000;\n margin-left: 2px;\n}\n.media-sidebar-thumb-mermaid {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 2px;\n background: var(--panel);\n overflow: hidden;\n}\n.media-sidebar-thumb-mermaid svg {\n width: 100% !important;\n height: 100% !important;\n max-width: 100%;\n max-height: 100%;\n display: block;\n}\n.media-sidebar-thumb-index {\n position: absolute;\n top: 2px;\n left: 2px;\n background: rgba(0,0,0,0.6);\n color: #fff;\n font-size: 9px;\n font-weight: 600;\n padding: 1px 4px;\n border-radius: 3px;\n line-height: 1.2;\n pointer-events: none;\n z-index: 1;\n}\n.media-sidebar-viewer {\n width: 0;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--bg);\n position: relative;\n}\n.media-sidebar-viewer.open {\n width: 45vw;\n overflow: hidden;\n padding: 16px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n}\n.media-sidebar-viewer-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n padding-top: 32px;\n}\n.media-sidebar-viewer-content img {\n max-width: 100%;\n max-height: calc(100vh - 170px);\n object-fit: contain;\n border-radius: 8px;\n}\n.media-sidebar-viewer-content video {\n max-width: 100%;\n max-height: calc(100vh - 170px);\n border-radius: 8px;\n background: #000;\n}\n.media-sidebar-viewer-content .viewer-mermaid-wrap {\n width: 100%;\n overflow: auto;\n display: flex;\n justify-content: center;\n background: var(--panel);\n border-radius: 8px;\n padding: 16px;\n}\n.media-sidebar-viewer-content .viewer-mermaid-wrap svg {\n width: 100% !important;\n height: auto !important;\n max-height: calc(100vh - 200px);\n}\n\n/* === Sidebar Rich Viewer: Mermaid zoom/pan/minimap === */\n.sidebar-mermaid-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 8px;\n margin-bottom: 8px;\n width: 100%;\n box-sizing: border-box;\n}\n.sidebar-mermaid-controls button {\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 5px;\n padding: 4px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 13px;\n line-height: 1;\n transition: background 0.15s ease;\n}\n.sidebar-mermaid-controls button:hover { background: var(--hover-bg); }\n.sidebar-mermaid-controls .sidebar-zoom-info {\n font-size: 11px;\n color: var(--muted);\n min-width: 40px;\n text-align: center;\n user-select: none;\n}\n.sidebar-mermaid-viewport {\n width: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n background: var(--panel);\n border-radius: 8px;\n border: 1px solid var(--border);\n}\n.sidebar-mermaid-viewport:active { cursor: grabbing; }\n.sidebar-mermaid-wrapper {\n position: absolute;\n transform-origin: 0 0;\n}\n.sidebar-mermaid-wrapper svg {\n display: block;\n}\n.sidebar-minimap {\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 140px;\n height: 100px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0,0,0,0.12);\n z-index: 3;\n}\n.sidebar-minimap-content {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n}\n.sidebar-minimap-content svg {\n max-width: 100%;\n max-height: 100%;\n opacity: 0.6;\n}\n.sidebar-minimap-viewport {\n position: absolute;\n border: 2px solid var(--accent);\n background: rgba(102, 126, 234, 0.2);\n pointer-events: none;\n border-radius: 2px;\n}\n\n/* === Sidebar Rich Viewer: Image zoom/pan === */\n.sidebar-image-viewport {\n width: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.sidebar-image-viewport.panning { cursor: grabbing; }\n.sidebar-image-viewport img {\n transform-origin: 0 0;\n max-width: none !important;\n max-height: none !important;\n border-radius: 0 !important;\n user-select: none;\n -webkit-user-drag: none;\n}\n.sidebar-zoom-indicator {\n position: absolute;\n bottom: 10px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.65);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n pointer-events: none;\n z-index: 3;\n backdrop-filter: blur(4px);\n transition: opacity 0.3s ease;\n user-select: none;\n}\n.sidebar-zoom-indicator.hidden { opacity: 0; }\n.sidebar-image-hint {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 11px;\n color: var(--muted);\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.4s ease;\n text-align: center;\n z-index: 2;\n}\n\n/* === Sidebar Rich Viewer: Video container (timeline uses shared .video-timeline classes) === */\n.sidebar-video-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.sidebar-video-container video {\n width: 100%;\n border-radius: 8px 8px 0 0;\n background: #000;\n max-height: calc(100vh - 260px);\n}\n\n.media-sidebar-viewer-label {\n margin-top: 12px;\n font-size: 12px;\n color: var(--muted);\n text-align: center;\n word-break: break-all;\n}\n.media-sidebar-viewer-close {\n position: absolute;\n top: 8px;\n right: 8px;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n z-index: 2;\n transition: background 0.15s ease;\n}\n.media-sidebar-viewer-close:hover {\n background: var(--hover-bg);\n}\n.sidebar-viewer-settings-btn {\n position: absolute;\n top: 8px;\n right: 44px;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n z-index: 2;\n transition: background 0.15s ease;\n}\n.sidebar-viewer-settings-btn:hover {\n background: var(--hover-bg);\n}\n.sidebar-viewer-settings-btn + .video-settings-panel {\n position: absolute;\n top: 44px;\n right: 8px;\n}\n\n.media-sidebar-toggle {\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n transition: background 0.15s ease, border-color 0.15s ease;\n display: none;\n}\n.media-sidebar-toggle.has-media {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.media-sidebar-toggle:hover {\n background: var(--hover-bg);\n border-color: var(--accent);\n}\n.media-sidebar-toggle .toggle-count {\n font-size: 10px;\n font-weight: 700;\n background: var(--accent);\n color: var(--text-inverse);\n padding: 1px 5px;\n border-radius: 8px;\n line-height: 1.4;\n}\n.view-toggle {\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n.view-toggle:hover { background: rgba(96,165,250,0.2); }\n.view-toggle.active { background: var(--accent); color: #fff; }\n@media (max-width: 1200px) {\n .media-sidebar-viewer.open {\n width: 40vw;\n }\n}\n@media (max-width: 900px) {\n .media-sidebar-thumbs {\n width: 72px;\n }\n .media-sidebar-thumb {\n width: 56px;\n height: 42px;\n }\n .media-sidebar-viewer.open {\n width: 35vw;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .media-sidebar,\n .media-sidebar-viewer,\n .media-sidebar-thumb {\n transition: none !important;\n }\n}\n\n.md-preview h1, .md-preview h2, .md-preview h3, .md-preview h4 {\n margin: 0.4em 0 0.2em;\n}\n/* Heading toggle feature */\n.md-preview .md-heading-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.md-preview .heading-toggle-icon {\n font-size: 0.6em;\n transition: transform 150ms ease;\n color: var(--muted);\n flex-shrink: 0;\n cursor: pointer;\n padding: 4px 8px;\n margin: -4px 0 -4px -8px;\n border-radius: 4px;\n}\n.md-preview .heading-toggle-icon:hover {\n background: var(--hover-bg);\n color: var(--accent);\n}\n.md-preview .md-heading-toggle.collapsed .heading-toggle-icon {\n transform: rotate(-90deg);\n}\n.md-preview details.heading-toggle {\n margin: 0.2em 0;\n}\n.md-preview details.heading-toggle > summary {\n list-style: none;\n cursor: pointer;\n}\n.md-preview details.heading-toggle > summary::-webkit-details-marker {\n display: none;\n}\n.md-preview details.heading-toggle:not([open]) > .toggle-content {\n display: none;\n}\n.md-preview .heading-section-content {\n /* Content wrapper for collapsible sections */\n}\n.md-preview .heading-section-content.hidden {\n display: none;\n}\n.md-preview p { margin: 0.3em 0; line-height: 1.5; }\n.md-preview img { max-width: 100%; height: auto; border-radius: 8px; }\n.md-preview video.video-preview { max-width: 100%; height: auto; border-radius: 8px; background: #000; }\n.md-preview table video.video-preview {\n display: block;\n width: 100%;\n height: auto;\n}\n.md-preview code { background: rgba(255,255,255,0.08); padding: 2px 4px; border-radius: 4px; }\n.md-preview pre {\n background: var(--code-bg);\n padding: 12px 16px;\n border-radius: 8px;\n overflow: auto;\n border: 1px solid var(--border);\n}\n.md-preview pre code {\n background: none;\n padding: 0;\n font-size: 13px;\n line-height: 1.5;\n}\n.md-preview pre code.hljs {\n background: transparent;\n padding: 0;\n}\n/* YAML Frontmatter table */\n.frontmatter-table {\n margin-bottom: 20px;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--border);\n background: var(--panel);\n}\n.frontmatter-table table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n}\n.frontmatter-table thead th {\n background: linear-gradient(135deg, rgba(147, 51, 234, 0.15), rgba(96, 165, 250, 0.15));\n color: var(--text);\n font-size: 12px;\n font-weight: 600;\n padding: 10px 16px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n}\n.frontmatter-table tbody th {\n background: rgba(147, 51, 234, 0.08);\n color: #c084fc;\n font-weight: 500;\n font-size: 12px;\n padding: 8px 10px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n vertical-align: top;\n}\n.frontmatter-table tbody td {\n padding: 8px 14px;\n font-size: 13px;\n border-bottom: 1px solid var(--border);\n word-break: break-word;\n}\n.frontmatter-table tbody tr:last-child th,\n.frontmatter-table tbody tr:last-child td {\n border-bottom: none;\n}\n.frontmatter-table .fm-tag {\n display: inline-block;\n background: rgba(96, 165, 250, 0.15);\n color: var(--accent);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n margin-right: 4px;\n margin-bottom: 4px;\n}\n.frontmatter-table pre {\n margin: 0;\n background: var(--code-bg);\n padding: 8px;\n border-radius: 4px;\n font-size: 11px;\n}\n/* Reviw questions preview cards */\n.reviw-questions-preview {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.reviw-q-card {\n background: var(--code-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 10px 12px;\n}\n.reviw-q-card.resolved {\n border-left: 3px solid #22c55e;\n}\n.reviw-q-card.pending {\n border-left: 3px solid #f59e0b;\n}\n.reviw-q-header {\n font-size: 12px;\n color: var(--text-dim);\n margin-bottom: 4px;\n}\n.reviw-q-header strong {\n color: var(--accent);\n}\n.reviw-q-question {\n font-size: 13px;\n color: var(--text);\n margin-bottom: 6px;\n}\n.reviw-q-options {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 6px;\n}\n.reviw-q-answer {\n font-size: 12px;\n color: #22c55e;\n background: rgba(34, 197, 94, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n}\n[data-theme=\"light\"] .frontmatter-table tbody th {\n color: #7c3aed;\n}\n/* Table scroll container and indicator */\n.table-scroll-container {\n position: relative;\n margin: 16px 0;\n}\n.table-scroll-wrapper {\n overflow-x: auto;\n border-radius: 8px;\n}\n.scroll-hint {\n text-align: right;\n font-size: 12px;\n color: var(--accent);\n padding: 4px 8px;\n margin-bottom: 4px;\n opacity: 0;\n visibility: hidden;\n transition: opacity 200ms ease;\n}\n.table-scroll-container.can-scroll .scroll-hint {\n opacity: 0.8;\n visibility: visible;\n}\n.table-scroll-container.scrolled-end .scroll-hint {\n opacity: 0;\n visibility: hidden;\n}\n/* Markdown tables in preview */\n.md-preview table:not(.frontmatter-table table) {\n min-width: 100%;\n width: max-content;\n border-collapse: collapse;\n border: 1px solid var(--border);\n border-radius: 8px;\n}\n.md-preview table:not(.frontmatter-table table) th,\n.md-preview table:not(.frontmatter-table table) td {\n padding: 10px 16px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n vertical-align: top;\n word-break: break-word;\n overflow-wrap: anywhere;\n width: auto;\n}\n/* Force equal column widths when colgroup is not specified */\n.md-preview table:not(.frontmatter-table table) colgroup ~ * th,\n.md-preview table:not(.frontmatter-table table) colgroup ~ * td {\n width: auto;\n}\n.md-preview table:not(.frontmatter-table table) td:has(video),\n.md-preview table:not(.frontmatter-table table) td:has(img) {\n padding: 4px;\n line-height: 0;\n}\n.md-preview table:not(.frontmatter-table table) td video,\n.md-preview table:not(.frontmatter-table table) td img {\n width: 100%;\n max-width: 100%;\n height: auto;\n}\n.md-preview table:not(.frontmatter-table table) th {\n background: var(--panel);\n font-weight: 600;\n font-size: 13px;\n}\n.md-preview table:not(.frontmatter-table table) td {\n font-size: 13px;\n}\n.md-preview table:not(.frontmatter-table table) tr:last-child td {\n border-bottom: none;\n}\n.md-preview table:not(.frontmatter-table table) tr:hover td {\n background: var(--hover-bg);\n}\n/* Source table (右ペイン) */\n.table-box table {\n table-layout: fixed;\n width: 100%;\n}\n.table-box th,\n.table-box td {\n word-break: break-word;\n min-width: 140px;\n}\n.table-box th:first-child,\n.table-box td:first-child {\n min-width: 320px;\n max-width: 480px;\n}\n/* Image fullscreen overlay */\n.image-fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: var(--bg);\n z-index: 1001;\n display: none;\n flex-direction: column;\n}\n.image-fullscreen-overlay.visible {\n display: flex;\n}\n.image-fs-content {\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.image-fs-content:active { cursor: grabbing; }\n.image-fs-content .image-fs-wrapper {\n position: absolute;\n transform-origin: 0 0;\n}\n.image-fs-content .image-fs-wrapper img {\n display: block;\n}\n/* Video fullscreen overlay */\n.video-fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.95);\n z-index: 1001;\n display: none;\n justify-content: center;\n align-items: center;\n}\n.video-fullscreen-overlay.visible {\n display: flex;\n}\n.video-close-btn {\n position: absolute;\n top: 14px;\n right: 14px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 50%;\n cursor: pointer;\n color: #fff;\n font-size: 18px;\n z-index: 10;\n backdrop-filter: blur(4px);\n transition: background 120ms ease, transform 120ms ease;\n}\n.video-close-btn:hover {\n background: rgba(0, 0, 0, 0.75);\n transform: scale(1.04);\n}\n.video-container {\n width: 90vw;\n height: 90vh;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.video-container video {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: 8px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);\n}\n/* Video Timeline - shared base styles (used by both fullscreen and sidebar) */\n.video-timeline {\n background: rgba(0, 0, 0, 0.85);\n display: flex;\n overflow-x: auto;\n backdrop-filter: blur(8px);\n height: 80px;\n padding: 8px;\n gap: 4px;\n}\n.video-timeline::-webkit-scrollbar {\n height: 6px;\n}\n.video-timeline::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n}\n.video-timeline::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.3);\n border-radius: 3px;\n}\n.video-timeline::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.5);\n}\n/* Fullscreen-specific video timeline positioning */\n.video-container .video-timeline {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 5;\n}\n/* Sidebar-specific video timeline sizing */\n.sidebar-video-container .video-timeline {\n width: 100%;\n height: 72px;\n padding: 6px;\n gap: 3px;\n border-radius: 0 0 8px 8px;\n background: rgba(0, 0, 0, 0.88);\n}\n.sidebar-video-container .video-timeline::-webkit-scrollbar { height: 5px; }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.08); }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.4); }\n.timeline-thumb {\n height: 64px;\n cursor: pointer;\n border: 2px solid transparent;\n border-radius: 4px;\n flex-shrink: 0;\n transition: border-color 0.2s, transform 0.15s;\n opacity: 0.85;\n}\n.sidebar-video-container .timeline-thumb {\n height: 52px;\n opacity: 0.8;\n}\n.timeline-thumb:hover {\n border-color: rgba(59, 130, 246, 0.5);\n opacity: 1;\n transform: scale(1.05);\n}\n.timeline-thumb.active {\n border-color: #3b82f6;\n opacity: 1;\n box-shadow: 0 0 12px rgba(59, 130, 246, 0.5);\n}\n.sidebar-video-container .timeline-thumb.active {\n box-shadow: 0 0 8px rgba(59, 130, 246, 0.4);\n}\n.timeline-loading {\n color: rgba(255, 255, 255, 0.6);\n font-size: 12px;\n padding: 8px 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.sidebar-video-container .timeline-loading {\n font-size: 11px;\n padding: 6px 10px;\n gap: 6px;\n color: rgba(255, 255, 255, 0.5);\n}\n.timeline-loading::before {\n content: '';\n width: 14px;\n height: 14px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: timeline-spin 0.8s linear infinite;\n}\n.sidebar-video-container .timeline-loading::before {\n width: 12px;\n height: 12px;\n border-width: 2px;\n border-color: rgba(255, 255, 255, 0.25);\n border-top-color: #3b82f6;\n}\n@keyframes timeline-spin {\n to { transform: rotate(360deg); }\n}\n.timeline-time {\n position: absolute;\n bottom: 2px;\n right: 4px;\n font-size: 9px;\n color: #fff;\n background: rgba(0, 0, 0, 0.7);\n padding: 1px 4px;\n border-radius: 2px;\n pointer-events: none;\n}\n.sidebar-video-container .timeline-time {\n font-size: 8px;\n right: 3px;\n padding: 1px 3px;\n}\n.timeline-thumb-wrapper {\n position: relative;\n flex-shrink: 0;\n}\n/* Video threshold settings panel */\n.video-settings-btn {\n position: absolute;\n top: 14px;\n right: 64px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 50%;\n cursor: pointer;\n color: #fff;\n font-size: 18px;\n z-index: 10;\n backdrop-filter: blur(4px);\n transition: background 120ms ease, transform 120ms ease;\n}\n.video-settings-btn:hover {\n background: rgba(0, 0, 0, 0.75);\n transform: scale(1.04);\n}\n.video-settings-panel {\n position: absolute;\n top: 60px;\n right: 14px;\n background: rgba(0, 0, 0, 0.9);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 12px;\n padding: 16px;\n z-index: 15;\n min-width: 280px;\n display: none;\n backdrop-filter: blur(8px);\n}\n.video-settings-panel.visible {\n display: block;\n}\n.video-settings-panel h4 {\n margin: 0 0 8px;\n color: #fff;\n font-size: 14px;\n font-weight: 500;\n}\n.video-settings-desc {\n margin: 0 0 12px;\n color: rgba(255, 255, 255, 0.6);\n font-size: 11px;\n line-height: 1.4;\n}\n.video-settings-buttons {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n}\n.video-settings-buttons button {\n flex: 1;\n padding: 8px 4px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n font-size: 11px;\n cursor: pointer;\n transition: all 120ms ease;\n}\n.video-settings-buttons button:hover {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n}\n.video-settings-buttons button.selected {\n background: #3b82f6;\n border-color: #3b82f6;\n color: #fff;\n}\n.video-settings-actions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n.video-settings-actions button {\n flex: 1;\n padding: 8px 12px;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n cursor: pointer;\n transition: background 120ms ease;\n}\n.video-settings-actions .reset-btn {\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n}\n.video-settings-actions .reset-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n/* Video Shortcuts Help */\n.video-shortcuts-help {\n opacity: 0.85;\n transition: opacity 0.2s;\n}\n.video-shortcuts-help:hover {\n opacity: 1;\n}\n.video-shortcuts-help .shortcuts-title {\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n color: rgba(255, 255, 255, 0.7);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.video-shortcuts-help .shortcuts-title::before {\n content: '\\u2328';\n font-size: 14px;\n}\n.video-shortcuts-help .shortcut-item {\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.video-shortcuts-help .shortcut-item:last-child {\n margin-bottom: 0;\n}\n.video-shortcuts-help kbd {\n display: inline-block;\n background: rgba(255, 255, 255, 0.15);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 4px;\n padding: 2px 6px;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 10px;\n font-weight: 500;\n min-width: 18px;\n text-align: center;\n margin-right: 2px;\n}\n/* Reviw Questions Modal */\n.reviw-questions-overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.8);\n z-index: 1100;\n justify-content: center;\n align-items: center;\n}\n.reviw-questions-overlay.visible {\n display: flex;\n}\n.reviw-questions-modal {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: 16px;\n width: 90%;\n max-width: 600px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n box-shadow: 0 25px 80px rgba(0, 0, 0, 0.5);\n}\n.reviw-questions-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--border);\n}\n.reviw-questions-header h2 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text);\n}\n.reviw-questions-header h2 span {\n font-size: 14px;\n color: var(--text-dim);\n font-weight: 400;\n}\n.reviw-questions-close {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--text-dim);\n font-size: 18px;\n cursor: pointer;\n border-radius: 8px;\n transition: all 150ms ease;\n}\n.reviw-questions-close:hover {\n background: var(--border);\n color: var(--text);\n}\n.reviw-questions-body {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n}\n.reviw-questions-footer {\n padding: 12px 20px;\n border-top: 1px solid var(--border);\n display: flex;\n justify-content: flex-end;\n}\n.reviw-questions-later {\n padding: 8px 16px;\n border: 1px solid var(--border);\n background: transparent;\n color: var(--text-dim);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n.reviw-questions-later:hover {\n background: var(--border);\n color: var(--text);\n}\n/* Question Item */\n.reviw-question-item {\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--border);\n}\n.reviw-question-item:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n}\n.reviw-question-text {\n font-size: 14px;\n color: var(--text);\n margin-bottom: 12px;\n line-height: 1.5;\n}\n.reviw-question-options {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n}\n.reviw-question-option {\n padding: 8px 14px;\n border: 1px solid var(--border);\n background: transparent;\n color: var(--text);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n.reviw-question-option:hover {\n border-color: var(--accent);\n background: rgba(96, 165, 250, 0.1);\n}\n.reviw-question-option.selected {\n border-color: var(--accent);\n background: var(--accent);\n color: var(--text-inverse);\n}\n.reviw-question-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--border);\n background: var(--input-bg);\n color: var(--text);\n border-radius: 8px;\n font-size: 13px;\n resize: vertical;\n min-height: 60px;\n}\n.reviw-question-input:focus {\n outline: none;\n border-color: var(--accent);\n}\n.reviw-question-input::placeholder {\n color: var(--text-dim);\n}\n.reviw-check-mark {\n color: #22c55e;\n font-weight: bold;\n}\n.reviw-question-item.answered {\n border-color: #22c55e;\n background: rgba(34, 197, 94, 0.05);\n}\n.reviw-question-submit {\n margin-top: 10px;\n padding: 8px 16px;\n border: none;\n background: var(--accent);\n color: var(--text-inverse);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 150ms ease;\n}\n.reviw-question-submit:hover {\n filter: brightness(1.1);\n}\n.reviw-question-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n/* Resolved Section */\n.reviw-resolved-section {\n margin-top: 16px;\n border-top: 1px solid var(--border);\n padding-top: 12px;\n}\n.reviw-resolved-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n color: var(--text-dim);\n font-size: 13px;\n cursor: pointer;\n padding: 4px 0;\n}\n.reviw-resolved-toggle:hover {\n color: var(--text);\n}\n.reviw-resolved-toggle .arrow {\n transition: transform 150ms ease;\n}\n.reviw-resolved-toggle.open .arrow {\n transform: rotate(90deg);\n}\n.reviw-resolved-list {\n display: none;\n margin-top: 12px;\n}\n.reviw-resolved-list.visible {\n display: block;\n}\n.reviw-resolved-item {\n padding: 10px 12px;\n background: var(--input-bg);\n border-radius: 8px;\n margin-bottom: 8px;\n opacity: 0.7;\n}\n.reviw-resolved-item:last-child {\n margin-bottom: 0;\n}\n.reviw-resolved-q {\n font-size: 12px;\n color: var(--text-dim);\n margin-bottom: 4px;\n}\n.reviw-resolved-a {\n font-size: 13px;\n color: var(--text);\n}\n/* Notice Bar */\n.reviw-questions-bar {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n background: var(--accent);\n color: var(--text-inverse);\n padding: 8px 16px;\n font-size: 13px;\n z-index: 1050;\n justify-content: center;\n align-items: center;\n gap: 12px;\n}\n.reviw-questions-bar.visible {\n display: flex;\n}\n.reviw-questions-bar button {\n padding: 4px 12px;\n border: 1px solid rgba(255, 255, 255, 0.3);\n background: rgba(255, 255, 255, 0.1);\n color: var(--text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n transition: all 150ms ease;\n}\n.reviw-questions-bar button:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n/* Adjust layout when bar is visible */\nbody.has-questions-bar header {\n top: 36px;\n}\nbody.has-questions-bar .toolbar,\nbody.has-questions-bar .table-wrap {\n margin-top: 36px;\n}\n/* Copy notification toast */\n.copy-toast {\n position: fixed;\n bottom: 60px;\n left: 50%;\n transform: translateX(-50%) translateY(20px);\n background: var(--accent);\n color: var(--text-inverse);\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n opacity: 0;\n pointer-events: none;\n transition: opacity 200ms ease, transform 200ms ease;\n z-index: 1000;\n}\n.copy-toast.visible {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n@media (max-width: 960px) {\n .md-layout { flex-direction: column; }\n .md-left { max-width: 100%; flex: 1 1 0; min-height: 0; }\n .md-right { display: none; }\n .media-sidebar { display: none; }\n .media-sidebar-toggle { display: none !important; }\n}\n.md-layout.preview-only .md-right { display: none; }\n.md-layout.preview-only .md-left { flex: 1 1 0; min-height: 0; max-width: 100%; }\n.filter-menu {\n position: absolute;\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 10px;\n box-shadow: 0 14px 30px var(--shadow-color);\n padding: 8px;\n display: none;\n z-index: 12;\n width: 180px;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.filter-menu button {\n width: 100%;\n display: block;\n margin: 4px 0;\n padding: 8px 10px;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n color: var(--text);\n cursor: pointer;\n font-size: 13px;\n text-align: left;\n}\n.filter-menu button:hover { background: var(--hover-bg); }\n.modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n display: none;\n align-items: center;\n justify-content: center;\n z-index: 100;\n}\n.modal-overlay.visible { display: flex; }\n/* Submit modal: top-right position, no blocking overlay */\n#submit-modal {\n background: transparent;\n pointer-events: none;\n align-items: flex-start;\n justify-content: flex-end;\n}\n#submit-modal.visible { display: flex; }\n#submit-modal .modal-dialog {\n pointer-events: auto;\n margin: 60px 20px 20px 20px; /* top margin avoids header button overlap */\n}\n.modal-dialog {\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 14px;\n padding: 20px;\n width: 90%;\n max-width: 480px;\n box-shadow: 0 20px 40px var(--shadow-color);\n transition: background 200ms ease, border-color 200ms ease;\n}\n.modal-dialog h3 { margin: 0 0 12px; font-size: 18px; color: var(--accent); }\n.modal-summary { color: var(--muted); font-size: 13px; margin-bottom: 12px; }\n.modal-dialog label { display: block; font-size: 13px; margin-bottom: 6px; color: var(--muted); }\n.modal-dialog textarea {\n width: 100%;\n min-height: 100px;\n background: var(--input-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n color: var(--text);\n padding: 10px;\n font-size: 14px;\n resize: vertical;\n box-sizing: border-box;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.modal-dialog textarea:focus { outline: none; border-color: var(--accent); }\n.modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }\n.modal-actions button {\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid var(--border);\n background: var(--selected-bg);\n color: var(--text);\n cursor: pointer;\n font-size: 14px;\n}\n.modal-actions button:hover { background: var(--hover-bg); }\n.modal-actions button.primary { background: var(--accent); color: var(--text-inverse); border-color: var(--accent); }\n.image-attach-area { margin: 12px 0; }\n.image-attach-area label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 6px; }\n.image-attach-area.image-attach-small { margin: 8px 0; }\n.image-attach-area.image-attach-small label { font-size: 11px; }\n.image-preview-list { display: flex; flex-wrap: wrap; gap: 8px; min-height: 24px; }\n.image-preview-item { position: relative; }\n.image-preview-item img { max-width: 80px; max-height: 60px; border-radius: 4px; border: 1px solid var(--border); object-fit: cover; }\n.image-preview-item .remove-image { position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%; background: var(--error, #ef4444); color: #fff; border: none; cursor: pointer; font-size: 12px; line-height: 1; display: flex; align-items: center; justify-content: center; }\n.image-preview-item .remove-image:hover { background: #dc2626; }\n.modal-actions button.primary:hover { background: #7dd3fc; }\n\n.modal-checkboxes { margin: 12px 0; }\n.modal-checkboxes label {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 12px;\n color: var(--text);\n margin-bottom: 8px;\n cursor: pointer;\n}\n.modal-checkboxes input[type=\"checkbox\"] {\n margin-top: 2px;\n accent-color: var(--accent);\n}\n\nbody.dragging { user-select: none; cursor: crosshair; }\nbody.dragging .diff-line { cursor: crosshair; }\n@media (max-width: 840px) {\n header { flex-direction: column; align-items: flex-start; }\n .comment-list { width: calc(100% - 24px); right: 12px; }\n}\n/* Mermaid diagram styles */\n.mermaid-container {\n position: relative;\n margin: 16px 0;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 16px;\n overflow: hidden;\n}\n.mermaid-container .mermaid {\n display: flex;\n justify-content: center;\n}\n.mermaid-container .mermaid svg {\n max-width: 100%;\n height: auto;\n cursor: pointer;\n pointer-events: auto;\n}\n.mermaid-fullscreen-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 12px;\n z-index: 2;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.mermaid-fullscreen-btn:hover { background: var(--hover-bg); }\n/* Fullscreen overlay */\n.fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: var(--bg);\n z-index: 1000;\n display: none;\n flex-direction: column;\n}\n.fullscreen-overlay.visible { display: flex; }\n.fullscreen-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--panel-alpha);\n border-bottom: 1px solid var(--border);\n}\n.fullscreen-header h3 { margin: 0; font-size: 14px; }\n.fullscreen-controls { display: flex; gap: 8px; align-items: center; }\n.fullscreen-controls button {\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 12px;\n cursor: pointer;\n color: var(--text);\n font-size: 13px;\n}\n.fullscreen-controls button:hover { background: var(--hover-bg); }\n.fullscreen-controls .zoom-info { font-size: 12px; color: var(--muted); min-width: 50px; text-align: center; }\n.fullscreen-content {\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.fullscreen-content:active { cursor: grabbing; }\n.fullscreen-content .mermaid-wrapper {\n position: absolute;\n transform-origin: 0 0;\n padding: 40px;\n}\n.fullscreen-content .mermaid svg {\n display: block;\n}\n/* Minimap */\n.minimap {\n position: absolute;\n top: 70px;\n right: 20px;\n width: 200px;\n height: 150px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n.minimap-content {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n}\n.minimap-content svg {\n max-width: 100%;\n max-height: 100%;\n opacity: 0.6;\n}\n.minimap-viewport {\n position: absolute;\n border: 2px solid var(--accent);\n background: rgba(102, 126, 234, 0.2);\n pointer-events: none;\n border-radius: 2px;\n}\n/* Error toast */\n.mermaid-error-toast {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--error);\n color: white;\n padding: 12px 24px;\n border-radius: 8px;\n font-size: 13px;\n max-width: 80%;\n z-index: 2000;\n display: none;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n white-space: pre-wrap;\n font-family: monospace;\n}\n.mermaid-error-toast.visible { display: block; }\n\n/* History Panel - Push layout */\nbody { transition: margin-right 0.25s ease; }\nbody.history-open { margin-right: 320px; }\nbody.history-open header { right: 320px; }\nheader { transition: right 0.25s ease; right: 0; }\n\n.history-toggle {\n background: var(--selected-bg);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 8px;\n font-size: 14px;\n cursor: pointer;\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.history-toggle:hover { background: var(--border); }\n.history-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100vh;\n background: var(--panel-solid);\n border-left: 1px solid var(--border);\n z-index: 90;\n transform: translateX(100%);\n transition: transform 0.25s ease;\n display: flex;\n flex-direction: column;\n}\n.history-panel.open { transform: translateX(0); }\n.history-panel-header {\n padding: 16px;\n border-bottom: 1px solid var(--border);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.history-panel-header h3 { margin: 0; font-size: 14px; font-weight: 600; }\n.history-panel-close {\n background: transparent;\n border: none;\n color: var(--muted);\n cursor: pointer;\n font-size: 18px;\n padding: 4px;\n}\n.history-panel-close:hover { color: var(--text); }\n.history-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n.history-empty {\n color: var(--muted);\n font-size: 13px;\n text-align: center;\n padding: 40px 20px;\n}\n.history-date-group { margin-bottom: 16px; }\n.history-date {\n font-size: 11px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 8px;\n text-transform: uppercase;\n}\n.history-item {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n margin-bottom: 8px;\n overflow: hidden;\n}\n.history-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 10px;\n background: var(--selected-bg);\n cursor: pointer;\n}\n.history-item-header:hover { background: var(--hover-bg); }\n.history-item-file {\n font-size: 12px;\n font-weight: 600;\n color: var(--text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 180px;\n}\n.history-item-time { font-size: 10px; color: var(--muted); }\n.history-item-body {\n display: none;\n padding: 10px;\n font-size: 12px;\n border-top: 1px solid var(--border);\n}\n.history-item.expanded .history-item-body { display: block; }\n.history-summary {\n color: var(--text);\n margin-bottom: 8px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--border);\n}\n.history-summary-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 4px;\n}\n.history-summary-text { white-space: pre-wrap; line-height: 1.4; }\n.history-comments-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 6px;\n}\n.history-comment {\n padding: 6px 0;\n border-bottom: 1px solid var(--border);\n}\n.history-comment:last-child { border-bottom: none; }\n.history-comment-line {\n font-size: 10px;\n color: var(--accent);\n font-weight: 600;\n margin-bottom: 2px;\n}\n.history-comment-quote {\n background: rgba(0, 0, 0, 0.3);\n border-left: 2px solid var(--accent);\n padding: 4px 8px;\n margin: 4px 0;\n font-family: 'SF Mono', Monaco, Consolas, monospace;\n font-size: 11px;\n color: var(--muted);\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 80px;\n overflow-y: auto;\n}\n.history-comment-text {\n color: var(--text);\n line-height: 1.4;\n white-space: pre-wrap;\n}\n.history-badge {\n display: inline-block;\n background: var(--accent);\n color: var(--text-inverse);\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n margin-left: 6px;\n}\n/* Table scroll container */\n.table-container {\n overflow-x: auto;\n margin: 16px 0;\n border-radius: 8px;\n border: 1px solid var(--border);\n}\n.table-container table {\n margin: 0;\n border: none;\n border-radius: 0;\n}\n.table-container::-webkit-scrollbar {\n height: 6px;\n}\n.table-container::-webkit-scrollbar-track {\n background: var(--bg);\n border-radius: 3px;\n}\n.table-container::-webkit-scrollbar-thumb {\n background: var(--border);\n border-radius: 3px;\n}\n.table-container::-webkit-scrollbar-thumb:hover {\n background: var(--muted);\n}\n/* Media sidebar */\n.media-sidebar {\n display: flex;\n flex-shrink: 0;\n height: calc(100vh - 80px);\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 10;\n}\n.media-sidebar.hidden { display: none; }\n.media-sidebar-thumbs {\n width: 96px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 8px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--panel);\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar { width: 4px; }\n.media-sidebar-thumbs::-webkit-scrollbar-track { background: transparent; }\n.media-sidebar-thumbs::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }\n.media-sidebar-thumb {\n width: 80px;\n height: 60px;\n border-radius: 6px;\n border: 2px solid var(--border);\n overflow: hidden;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n background: var(--bg);\n transition: border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;\n}\n.media-sidebar-thumb:hover { border-color: var(--accent); transform: scale(1.05); box-shadow: 0 2px 8px var(--shadow-color); }\n.media-sidebar-thumb.active { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent), 0 2px 8px var(--shadow-color); }\n.media-sidebar-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.media-sidebar-thumb svg { width: 100%; height: 100%; display: block; }\n.media-sidebar-thumb-video {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n}\n.media-sidebar-thumb-video video { width: 100%; height: 100%; object-fit: cover; }\n.media-sidebar-thumb-video::after {\n content: '';\n position: absolute;\n width: 24px;\n height: 24px;\n background: rgba(255,255,255,0.85);\n border-radius: 50%;\n}\n.media-sidebar-thumb-video::before {\n content: '';\n position: absolute;\n z-index: 1;\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 5px 0 5px 9px;\n border-color: transparent transparent transparent #000;\n margin-left: 2px;\n}\n.media-sidebar-thumb-mermaid {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 2px;\n background: var(--panel);\n overflow: hidden;\n}\n.media-sidebar-thumb-mermaid svg { width: 100% !important; height: 100% !important; max-width: 100%; max-height: 100%; display: block; }\n.media-sidebar-thumb-index {\n position: absolute;\n top: 2px;\n left: 2px;\n background: rgba(0,0,0,0.6);\n color: #fff;\n font-size: 9px;\n font-weight: 600;\n padding: 1px 4px;\n border-radius: 3px;\n line-height: 1.2;\n pointer-events: none;\n z-index: 1;\n}\n.media-sidebar-viewer {\n width: 0;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--bg);\n position: relative;\n}\n.media-sidebar-viewer.open {\n width: 45vw;\n overflow: hidden;\n padding: 16px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n}\n.media-sidebar-viewer-close {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 2;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n color: var(--text);\n width: 28px;\n height: 28px;\n border-radius: 50%;\n cursor: pointer;\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.media-sidebar-viewer-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.media-sidebar-viewer-content img { max-width: 100%; max-height: calc(100vh - 140px); object-fit: contain; border-radius: 8px; }\n.media-sidebar-viewer-content video { max-width: 100%; max-height: calc(100vh - 140px); border-radius: 8px; background: #000; }\n.media-sidebar-viewer-label {\n margin-top: 8px;\n font-size: 12px;\n color: var(--muted);\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n.sidebar-zoom-indicator {\n position: absolute;\n bottom: 12px;\n right: 12px;\n background: rgba(0,0,0,0.7);\n color: #fff;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n pointer-events: none;\n transition: opacity 0.3s ease;\n}\n.sidebar-zoom-indicator.hidden { opacity: 0; }\n.sidebar-mermaid-viewport { overflow: hidden; position: relative; cursor: grab; }\n.sidebar-mermaid-wrapper { position: absolute; left: 0; top: 0; transform-origin: 0 0; }\n.sidebar-video-container { width: 100%; }\n.sidebar-video-container video { width: 100%; max-height: calc(100vh - 200px); border-radius: 8px; background: #000; }\n/* Video timeline */\n.video-timeline {\n display: flex;\n gap: 8px;\n padding: 8px;\n overflow-x: auto;\n background: var(--panel);\n border-radius: 8px;\n margin-top: 8px;\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.timeline-loading { color: var(--muted); font-size: 12px; padding: 8px; }\n.timeline-thumb-wrapper {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n.timeline-thumb {\n width: 80px;\n height: 60px;\n object-fit: cover;\n border-radius: 4px;\n border: 2px solid transparent;\n transition: border-color 0.2s ease;\n}\n.timeline-thumb.active { border-color: var(--accent); }\n.timeline-thumb:hover { border-color: var(--accent); opacity: 0.8; }\n.timeline-time { font-size: 10px; color: var(--muted); }\n/* Fullscreen overlay */\n.fullscreen-overlay {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0,0,0,0.9);\n z-index: 1000;\n flex-direction: column;\n}\n.fullscreen-overlay.visible { display: flex; }\n.fullscreen-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: rgba(0,0,0,0.8);\n border-bottom: 1px solid rgba(255,255,255,0.1);\n}\n.fullscreen-header h3 { margin: 0; color: #fff; font-size: 14px; }\n.fullscreen-controls { display: flex; gap: 6px; align-items: center; }\n.fullscreen-controls button {\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: #fff;\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n}\n.fullscreen-controls button:hover { background: rgba(255,255,255,0.2); }\n.fullscreen-controls .zoom-info { color: #fff; font-size: 12px; min-width: 40px; text-align: center; }");
4076
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "/* Dark theme (default) */\n:root {\n color-scheme: dark;\n --bg: #0f172a;\n --bg-gradient: radial-gradient(circle at 20% 20%, #1e293b 0%, #0b1224 35%, #0b1224 60%, #0f172a 100%);\n --panel: #111827;\n --panel-alpha: rgba(15, 23, 42, 0.9);\n --panel-solid: #0b1224;\n --card-bg: rgba(11, 18, 36, 0.95);\n --input-bg: rgba(15, 23, 42, 0.6);\n --border: #1f2937;\n --accent: #60a5fa;\n --accent-2: #f472b6;\n --text: #e5e7eb;\n --text-inverse: #0b1224;\n --muted: #94a3b8;\n --comment: #0f766e;\n --badge: #22c55e;\n --table-bg: rgba(15, 23, 42, 0.7);\n --row-even: rgba(30, 41, 59, 0.4);\n --row-odd: rgba(15, 23, 42, 0.2);\n --selected-bg: rgba(96,165,250,0.15);\n --hover-bg: rgba(96,165,250,0.08);\n --shadow-color: rgba(0,0,0,0.35);\n --code-bg: #1e293b;\n --error: #dc3545;\n}\n/* Light theme */\n[data-theme=\"light\"] {\n color-scheme: light;\n --bg: #f8fafc;\n --bg-gradient: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);\n --panel: #ffffff;\n --panel-alpha: rgba(255, 255, 255, 0.95);\n --panel-solid: #ffffff;\n --card-bg: rgba(255, 255, 255, 0.98);\n --input-bg: #f1f5f9;\n --border: #e2e8f0;\n --accent: #3b82f6;\n --accent-2: #ec4899;\n --text: #1e293b;\n --text-inverse: #ffffff;\n --muted: #64748b;\n --comment: #14b8a6;\n --badge: #22c55e;\n --table-bg: #ffffff;\n --row-even: #f8fafc;\n --row-odd: #ffffff;\n --selected-bg: rgba(59,130,246,0.12);\n --hover-bg: rgba(59,130,246,0.06);\n --shadow-color: rgba(0,0,0,0.1);\n --code-bg: #f1f5f9;\n --error: #dc3545;\n}\n* { box-sizing: border-box; }\nbody {\n margin: 0;\n font-family: \"Inter\", \"Hiragino Sans\", system-ui, -apple-system, sans-serif;\n background: var(--bg-gradient);\n color: var(--text);\n min-height: 100vh;\n transition: background 200ms ease, color 200ms ease;\n}\nheader {\n position: sticky;\n top: 0;\n z-index: 5;\n padding: 12px 16px;\n background: var(--panel-alpha);\n backdrop-filter: blur(8px);\n border-bottom: 1px solid var(--border);\n display: flex;\n gap: 12px;\n align-items: center;\n justify-content: space-between;\n transition: background 200ms ease, border-color 200ms ease;\n}\nheader .meta { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }\nheader .actions { display: flex; gap: 8px; align-items: center; }\nheader h1 { display: flex; flex-direction: column; margin: 0; line-height: 1.3; }\nheader h1 .title-path { font-size: 11px; font-weight: 400; color: var(--muted); }\nheader h1 .title-file { font-size: 16px; font-weight: 700; }\nheader .badge {\n background: var(--selected-bg);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid var(--border);\n}\nheader button {\n background: linear-gradient(135deg, #38bdf8, #6366f1);\n color: var(--text-inverse);\n border: none;\n border-radius: 10px;\n padding: 10px 14px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: 0 10px 30px var(--shadow-color);\n transition: transform 120ms ease, box-shadow 120ms ease;\n}\nheader button:hover { transform: translateY(-1px); box-shadow: 0 16px 36px var(--shadow-color); }\nheader button:active { transform: translateY(0); }\n/* Theme toggle button */\n.theme-toggle {\n background: var(--selected-bg);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 16px;\n cursor: pointer;\n transition: background 120ms ease, transform 120ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n height: 38px;\n}\n.theme-toggle:hover { background: var(--hover-bg); transform: scale(1.05); }\n\n.wrap { padding: 12px 16px 12px; }\n.toolbar {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n margin: 10px 0 12px;\n color: var(--muted);\n font-size: 13px;\n}\n.toolbar button {\n background: rgba(96,165,250,0.12);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 13px;\n cursor: pointer;\n}\n.toolbar button:hover { background: rgba(96,165,250,0.2); }\n\n.table-box {\n background: var(--table-bg);\n border: 1px solid var(--border);\n border-radius: 12px;\n overflow: auto;\n max-height: calc(100vh - 110px);\n box-shadow: 0 20px 50px var(--shadow-color);\n transition: background 200ms ease, border-color 200ms ease;\n}\ntable {\n border-collapse: collapse;\n width: 100%;\n min-width: 540px;\n table-layout: fixed;\n}\nthead th {\n position: sticky;\n top: 0;\n z-index: 3;\n background: var(--panel-solid) !important;\n color: var(--muted);\n font-size: 12px;\n text-align: center;\n padding: 0;\n border-bottom: 1px solid var(--border);\n border-right: 1px solid var(--border);\n white-space: nowrap;\n transition: background 200ms ease;\n}\nthead th:not(.selected) {\n background: var(--panel-solid) !important;\n}\nthead th:first-child,\ntbody th {\n width: 28px;\n min-width: 28px;\n max-width: 28px;\n}\nthead th .th-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px 6px;\n position: relative;\n height: 100%;\n}\nthead th.filtered .th-inner {\n background: linear-gradient(135deg, rgba(96,165,250,0.18), rgba(34,197,94,0.18));\n color: #e5e7eb;\n border-radius: 6px;\n box-shadow: inset 0 -1px 0 rgba(255,255,255,0.05);\n}\nthead th.filtered .th-inner::after {\n content: 'FILTER';\n font-size: 10px;\n color: #c7d2fe;\n background: rgba(99,102,241,0.24);\n border: 1px solid rgba(99,102,241,0.45);\n padding: 1px 6px;\n border-radius: 999px;\n position: absolute;\n bottom: 4px;\n right: 6px;\n}\n.resizer {\n position: absolute;\n right: 2px;\n top: 0;\n width: 6px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n touch-action: none;\n opacity: 0.6;\n}\n.resizer::after {\n content: '';\n position: absolute;\n top: 10%;\n bottom: 10%;\n left: 2px;\n width: 2px;\n background: rgba(96,165,250,0.6);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\nthead th:hover .resizer::after { opacity: 1; }\n\n.freeze {\n position: sticky !important;\n background: var(--panel-solid);\n z-index: 4;\n}\n.freeze-row {\n position: sticky !important;\n background: var(--panel-solid);\n}\n.freeze-row.freeze {\n z-index: 6;\n}\nth.freeze-row {\n z-index: 6;\n}\ntbody th {\n position: sticky;\n left: 0;\n z-index: 2;\n background: var(--panel-solid);\n color: var(--muted);\n text-align: right;\n padding: 8px 10px;\n font-size: 12px;\n border-right: 1px solid var(--border);\n border-bottom: 1px solid var(--border);\n transition: background 200ms ease;\n}\ntd {\n padding: 10px 10px;\n border-bottom: 1px solid var(--border);\n border-right: 1px solid var(--border);\n background: var(--row-odd);\n color: var(--text);\n font-size: 13px;\n line-height: 1.45;\n cursor: pointer;\n transition: background 120ms ease, box-shadow 120ms ease;\n position: relative;\n white-space: pre-wrap;\n word-break: break-word;\n max-width: 320px;\n}\ntr:nth-child(even) td:not(.selected):not(.has-comment) { background: var(--row-even); }\ntd:hover:not(.selected) { background: var(--hover-bg); box-shadow: inset 0 0 0 1px rgba(96,165,250,0.25); }\ntd.has-comment { background: rgba(34,197,94,0.12); box-shadow: inset 0 0 0 1px rgba(34,197,94,0.35); }\ntd.selected, tbody th.selected { background: rgba(99,102,241,0.22) !important; box-shadow: inset 0 0 0 1px rgba(99,102,241,0.45); }\n.preview-highlight { background: rgba(167,139,250,0.18) !important; box-shadow: inset 0 0 0 2px rgba(139,92,246,0.35); border-radius: 4px; transition: background 150ms ease, box-shadow 150ms ease; padding-left: 8px; margin-left: -8px; }\nthead th.selected { background: #c7d2fe !important; box-shadow: inset 0 0 0 1px rgba(99,102,241,0.45); }\n[data-theme=\"dark\"] thead th.selected { background: #3730a3 !important; }\nbody.dragging { user-select: none; cursor: crosshair; }\nbody.dragging td, body.dragging tbody th { cursor: crosshair; }\ntbody th { cursor: pointer; }\ntd .dot {\n position: absolute;\n right: 6px;\n top: 6px;\n width: 8px;\n height: 8px;\n border-radius: 99px;\n background: var(--badge);\n box-shadow: 0 0 0 4px rgba(34,197,94,0.15);\n}\n.floating {\n position: fixed;\n z-index: 10;\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n width: min(420px, calc(100vw - 32px));\n box-shadow: 0 20px 40px var(--shadow-color);\n display: none;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.card-close-x {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 28px;\n height: 28px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--muted);\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: background 120ms ease, color 120ms ease;\n}\n.card-close-x:hover { background: var(--border); color: var(--text);\n}\n.floating header {\n position: static;\n background: transparent;\n backdrop-filter: none;\n border: none;\n padding: 0 0 8px 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.floating h2 { font-size: 14px; margin: 0; color: var(--text); }\n.floating button {\n margin-left: 8px;\n background: var(--accent);\n color: var(--text-inverse);\n border: 1px solid var(--accent);\n padding: 6px 10px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 120ms ease, opacity 120ms ease;\n}\n.floating button.icon-only {\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n}\n.floating button:hover { opacity: 0.85; }\n.copy-btn-float {\n position: absolute;\n top: 4px;\n right: 4px;\n z-index: 2;\n background: var(--panel-solid) !important;\n border: 1px solid var(--border) !important;\n color: var(--muted) !important;\n opacity: 0.7;\n}\n.copy-btn-float:hover { opacity: 1 !important; }\n.card-actions-split {\n display: flex;\n justify-content: space-between !important;\n align-items: center;\n margin-top: 8px;\n}\n.danger-text {\n background: transparent !important;\n border: none !important;\n color: #ef4444 !important;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n padding: 4px 8px;\n}\n.danger-text:hover { color: #dc2626 !important; text-decoration: underline; }\n.floating textarea {\n width: 100%;\n min-height: 70px;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid var(--border);\n background: var(--input-bg);\n color: var(--text);\n padding: 10px;\n font-size: 13px;\n line-height: 1.4;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.floating textarea:focus {\n outline: none;\n border-color: var(--accent);\n}\n.floating .actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 10px;\n}\n.floating .actions button.primary {\n background: linear-gradient(135deg, #22c55e, #16a34a);\n color: var(--text-inverse);\n border: none;\n font-weight: 700;\n box-shadow: 0 10px 30px rgba(22,163,74,0.35);\n}\n.comment-list {\n position: fixed;\n right: 14px;\n bottom: 14px;\n width: 320px;\n max-height: 60vh;\n overflow: auto;\n border: 1px solid var(--border);\n border-radius: 12px;\n background: var(--card-bg);\n box-shadow: 0 18px 40px var(--shadow-color);\n padding: 12px;\n backdrop-filter: blur(6px);\n transition: opacity 120ms ease, transform 120ms ease, background 200ms ease;\n}\n.comment-list h3 { margin: 0 0 8px 0; font-size: 13px; color: var(--muted); }\n.comment-list ol {\n margin: 0;\n padding-left: 18px;\n color: var(--text);\n font-size: 13px;\n line-height: 1.45;\n}\n.comment-list li { margin-bottom: 6px; }\n.comment-list .hint { color: var(--muted); font-size: 12px; }\n.pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 999px; background: var(--selected-bg); border: 1px solid var(--border); font-size: 12px; color: var(--text); cursor: pointer; transition: background 150ms ease, border-color 150ms ease; }\n.pill:hover { background: var(--hover-bg); border-color: var(--accent); }\n.pill strong { color: var(--text); font-weight: 700; }\n.comment-list.collapsed {\n opacity: 0;\n pointer-events: none;\n transform: translateY(8px) scale(0.98);\n}\n.md-preview {\n background: var(--input-bg);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 14px;\n margin-bottom: 12px;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.md-layout {\n display: flex;\n gap: 16px;\n align-items: stretch;\n margin-top: 8px;\n height: calc(100vh - 80px);\n}\n.md-left {\n flex: 1;\n min-width: 200px;\n overflow-y: auto;\n overflow-x: auto;\n overscroll-behavior: contain;\n}\n.md-left .md-preview {\n max-height: none;\n}\n.md-right {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n overflow-x: auto;\n overscroll-behavior: contain;\n}\n.md-right .table-box {\n max-width: none;\n min-width: 0;\n max-height: none;\n overflow: visible;\n}\n/* Ensure thead is opaque in md-right to prevent content showing through */\n.md-right thead th {\n background: var(--panel-solid) !important;\n}\n.md-right thead th.selected {\n background: #c7d2fe !important;\n}\n[data-theme=\"dark\"] .md-right thead th {\n background: var(--panel-solid) !important;\n}\n[data-theme=\"dark\"] .md-right thead th.selected {\n background: #3730a3 !important;\n}\n\n/* === Media Sidebar === */\n.media-sidebar {\n display: flex;\n flex-shrink: 0;\n height: calc(100vh - 80px);\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 10;\n max-width: 60%;\n}\n.media-sidebar.hidden {\n display: none;\n}\n.media-sidebar-thumbs {\n width: 96px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 8px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--panel);\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar {\n width: 4px;\n}\n.media-sidebar-thumbs::-webkit-scrollbar-track {\n background: transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar-thumb {\n background: var(--border);\n border-radius: 4px;\n}\n.media-sidebar-thumb {\n width: 80px;\n height: 60px;\n border-radius: 6px;\n border: 2px solid var(--border);\n overflow: hidden;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n background: var(--bg);\n transition: border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;\n}\n.media-sidebar-thumb:hover {\n border-color: var(--accent);\n transform: scale(1.05);\n box-shadow: 0 2px 8px var(--shadow-color);\n}\n.media-sidebar-thumb.active {\n border-color: var(--accent);\n box-shadow: 0 0 0 2px var(--accent), 0 2px 8px var(--shadow-color);\n}\n.media-sidebar-thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n.media-sidebar-thumb svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n.media-sidebar-thumb-video {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n}\n.media-sidebar-thumb-video video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.media-sidebar-thumb-video::after {\n content: '';\n position: absolute;\n width: 24px;\n height: 24px;\n background: rgba(255,255,255,0.85);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.media-sidebar-thumb-video::before {\n content: '';\n position: absolute;\n z-index: 1;\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 5px 0 5px 9px;\n border-color: transparent transparent transparent #000;\n margin-left: 2px;\n}\n.media-sidebar-thumb-mermaid {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 2px;\n background: var(--panel);\n overflow: hidden;\n}\n.media-sidebar-thumb-mermaid svg {\n width: 100% !important;\n height: 100% !important;\n max-width: 100%;\n max-height: 100%;\n display: block;\n}\n.media-sidebar-thumb-index {\n position: absolute;\n top: 2px;\n left: 2px;\n background: rgba(0,0,0,0.6);\n color: #fff;\n font-size: 9px;\n font-weight: 600;\n padding: 1px 4px;\n border-radius: 3px;\n line-height: 1.2;\n pointer-events: none;\n z-index: 1;\n}\n.media-sidebar-viewer {\n width: 0;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--bg);\n position: relative;\n}\n.media-sidebar-viewer.open {\n width: 45vw;\n max-width: calc(100vw - 400px);\n overflow: hidden;\n padding: 16px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n}\n.media-sidebar-viewer-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n padding-top: 32px;\n}\n.media-sidebar-viewer-content img {\n max-width: 100%;\n max-height: calc(100vh - 170px);\n object-fit: contain;\n border-radius: 8px;\n}\n.media-sidebar-viewer-content video {\n max-width: 100%;\n max-height: calc(100vh - 170px);\n border-radius: 8px;\n background: #000;\n}\n.media-sidebar-viewer-content .viewer-mermaid-wrap {\n width: 100%;\n overflow: auto;\n display: flex;\n justify-content: center;\n background: var(--panel);\n border-radius: 8px;\n padding: 16px;\n}\n.media-sidebar-viewer-content .viewer-mermaid-wrap svg {\n width: 100% !important;\n height: auto !important;\n max-height: calc(100vh - 200px);\n}\n\n/* === Sidebar Rich Viewer: Mermaid zoom/pan/minimap === */\n.sidebar-mermaid-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 8px;\n margin-bottom: 8px;\n width: 100%;\n box-sizing: border-box;\n}\n.sidebar-mermaid-controls button {\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 5px;\n padding: 4px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 13px;\n line-height: 1;\n transition: background 0.15s ease;\n}\n.sidebar-mermaid-controls button:hover { background: var(--hover-bg); }\n.sidebar-mermaid-controls .sidebar-zoom-info {\n font-size: 11px;\n color: var(--muted);\n min-width: 40px;\n text-align: center;\n user-select: none;\n}\n.sidebar-mermaid-viewport {\n width: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n background: var(--panel);\n border-radius: 8px;\n border: 1px solid var(--border);\n}\n.sidebar-mermaid-viewport:active { cursor: grabbing; }\n.sidebar-mermaid-wrapper {\n position: absolute;\n transform-origin: 0 0;\n}\n.sidebar-mermaid-wrapper svg {\n display: block;\n}\n.sidebar-minimap {\n position: absolute;\n top: 12px;\n right: 8px;\n bottom: auto;\n left: auto;\n width: 140px;\n height: 100px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0,0,0,0.12);\n z-index: 3;\n}\n.sidebar-minimap-content {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n}\n.sidebar-minimap-content svg {\n max-width: 100%;\n max-height: 100%;\n opacity: 0.6;\n}\n.sidebar-minimap-viewport {\n position: absolute;\n border: 2px solid var(--accent);\n background: rgba(102, 126, 234, 0.2);\n pointer-events: none;\n border-radius: 2px;\n}\n\n/* === Sidebar Rich Viewer: Image zoom/pan === */\n.sidebar-image-viewport {\n width: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.sidebar-image-viewport.panning { cursor: grabbing; }\n.sidebar-image-viewport img {\n transform-origin: 0 0;\n max-width: none !important;\n max-height: none !important;\n border-radius: 0 !important;\n user-select: none;\n -webkit-user-drag: none;\n}\n.sidebar-zoom-indicator {\n position: absolute;\n bottom: 10px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.65);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n pointer-events: none;\n z-index: 3;\n backdrop-filter: blur(4px);\n transition: opacity 0.3s ease;\n user-select: none;\n}\n.sidebar-zoom-indicator.hidden { opacity: 0; }\n.sidebar-image-hint {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 11px;\n color: var(--muted);\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.4s ease;\n text-align: center;\n z-index: 2;\n}\n\n/* === Sidebar Rich Viewer: Video container (timeline uses shared .video-timeline classes) === */\n.sidebar-video-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.sidebar-video-container video {\n width: 100%;\n border-radius: 8px 8px 0 0;\n background: #000;\n max-height: calc(100vh - 260px);\n}\n\n.media-sidebar-viewer-label {\n margin-top: 12px;\n font-size: 12px;\n color: var(--muted);\n text-align: center;\n word-break: break-all;\n}\n.media-sidebar-viewer-close {\n position: absolute;\n top: 8px;\n right: 8px;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n z-index: 2;\n transition: background 0.15s ease;\n}\n.media-sidebar-viewer-close:hover {\n background: var(--hover-bg);\n}\n.sidebar-viewer-settings-btn {\n position: absolute;\n top: 8px;\n right: 44px;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n z-index: 2;\n transition: background 0.15s ease;\n}\n.sidebar-viewer-settings-btn:hover {\n background: var(--hover-bg);\n}\n.sidebar-viewer-settings-btn + .video-settings-panel {\n position: absolute;\n top: 44px;\n right: 8px;\n}\n\n.media-sidebar-toggle {\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n transition: background 0.15s ease, border-color 0.15s ease;\n display: none;\n}\n.media-sidebar-toggle.has-media {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.media-sidebar-toggle:hover {\n background: var(--hover-bg);\n border-color: var(--accent);\n}\n.media-sidebar-toggle .toggle-count {\n font-size: 10px;\n font-weight: 700;\n background: var(--accent);\n color: var(--text-inverse);\n padding: 1px 5px;\n border-radius: 8px;\n line-height: 1.4;\n}\n.view-toggle {\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 14px;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n.view-toggle:hover { background: rgba(96,165,250,0.2); }\n.view-toggle.active { background: var(--accent); color: #fff; }\n@media (max-width: 1200px) {\n .media-sidebar-viewer.open {\n width: 40vw;\n max-width: calc(100vw - 350px);\n }\n}\n@media (max-width: 900px) {\n .media-sidebar-thumbs {\n width: 72px;\n }\n .media-sidebar-thumb {\n width: 56px;\n height: 42px;\n }\n .media-sidebar-viewer.open {\n width: 35vw;\n max-width: calc(100vw - 300px);\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .media-sidebar,\n .media-sidebar-viewer,\n .media-sidebar-thumb {\n transition: none !important;\n }\n}\n\n.md-preview h1, .md-preview h2, .md-preview h3, .md-preview h4 {\n margin: 0.4em 0 0.2em;\n}\n/* Heading toggle feature */\n.md-preview .md-heading-toggle {\n margin: 0;\n}\n.md-preview .heading-toggle-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.6em;\n transition: transform 150ms ease;\n color: var(--muted);\n flex-shrink: 0;\n cursor: pointer;\n padding: 4px 8px;\n margin: -4px 0 -4px -8px;\n border-radius: 4px;\n}\n.md-preview .heading-toggle-icon:hover {\n background: var(--hover-bg);\n color: var(--accent);\n}\n.md-preview .md-heading-toggle.collapsed .heading-toggle-icon {\n transform: rotate(-90deg);\n}\n.md-preview details.heading-toggle {\n margin: 0.2em 0;\n}\n.md-preview details.heading-toggle > summary {\n list-style: none;\n cursor: default;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.md-preview details.heading-toggle > summary::-webkit-details-marker {\n display: none;\n}\n.md-preview details.heading-toggle > summary > .md-heading-toggle {\n flex: 1;\n}\n.md-preview details.heading-toggle:not([open]) > .toggle-content {\n display: none;\n}\n.md-preview .heading-section-content {\n /* Content wrapper for collapsible sections */\n}\n.md-preview .heading-section-content.hidden {\n display: none;\n}\n.md-preview p { margin: 0.3em 0; line-height: 1.5; }\n.md-preview img { max-width: 100%; height: auto; border-radius: 8px; }\n.md-preview video.video-preview { max-width: 100%; height: auto; border-radius: 8px; background: #000; }\n.md-preview table video.video-preview {\n display: block;\n width: 100%;\n height: auto;\n}\n.md-preview code { background: rgba(255,255,255,0.08); padding: 2px 4px; border-radius: 4px; }\n.md-preview pre {\n background: var(--code-bg);\n padding: 12px 16px;\n border-radius: 8px;\n overflow: auto;\n border: 1px solid var(--border);\n}\n.md-preview pre code {\n background: none;\n padding: 0;\n font-size: 13px;\n line-height: 1.5;\n}\n.md-preview pre code.hljs {\n background: transparent;\n padding: 0;\n}\n/* YAML Frontmatter table */\n.frontmatter-table {\n margin-bottom: 20px;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--border);\n background: var(--panel);\n}\n.frontmatter-table table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n}\n.frontmatter-table thead th {\n background: linear-gradient(135deg, rgba(147, 51, 234, 0.15), rgba(96, 165, 250, 0.15));\n color: var(--text);\n font-size: 12px;\n font-weight: 600;\n padding: 10px 16px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n}\n.frontmatter-table tbody th {\n background: rgba(147, 51, 234, 0.08);\n color: #c084fc;\n font-weight: 500;\n font-size: 12px;\n padding: 8px 10px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n vertical-align: top;\n}\n.frontmatter-table tbody td {\n padding: 8px 14px;\n font-size: 13px;\n border-bottom: 1px solid var(--border);\n word-break: break-word;\n}\n.frontmatter-table tbody tr:last-child th,\n.frontmatter-table tbody tr:last-child td {\n border-bottom: none;\n}\n.frontmatter-table .fm-tag {\n display: inline-block;\n background: rgba(96, 165, 250, 0.15);\n color: var(--accent);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n margin-right: 4px;\n margin-bottom: 4px;\n}\n.frontmatter-table pre {\n margin: 0;\n background: var(--code-bg);\n padding: 8px;\n border-radius: 4px;\n font-size: 11px;\n}\n/* Reviw questions preview cards */\n.reviw-questions-preview {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.reviw-q-card {\n background: var(--code-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 10px 12px;\n}\n.reviw-q-card.resolved {\n border-left: 3px solid #22c55e;\n}\n.reviw-q-card.pending {\n border-left: 3px solid #f59e0b;\n}\n.reviw-q-header {\n font-size: 12px;\n color: var(--text-dim);\n margin-bottom: 4px;\n}\n.reviw-q-header strong {\n color: var(--accent);\n}\n.reviw-q-question {\n font-size: 13px;\n color: var(--text);\n margin-bottom: 6px;\n}\n.reviw-q-options {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 6px;\n}\n.reviw-q-answer {\n font-size: 12px;\n color: #22c55e;\n background: rgba(34, 197, 94, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n}\n[data-theme=\"light\"] .frontmatter-table tbody th {\n color: #7c3aed;\n}\n/* Table scroll container and indicator */\n.table-scroll-container {\n position: relative;\n margin: 16px 0;\n}\n.table-scroll-wrapper {\n overflow-x: auto;\n border-radius: 8px;\n}\n.scroll-hint {\n text-align: right;\n font-size: 12px;\n color: var(--accent);\n padding: 4px 8px;\n margin-bottom: 4px;\n opacity: 0;\n visibility: hidden;\n transition: opacity 200ms ease;\n}\n.table-scroll-container.can-scroll .scroll-hint {\n opacity: 0.8;\n visibility: visible;\n}\n.table-scroll-container.scrolled-end .scroll-hint {\n opacity: 0;\n visibility: hidden;\n}\n/* Markdown tables in preview */\n.md-preview table:not(.frontmatter-table table) {\n min-width: 100%;\n width: max-content;\n border-collapse: collapse;\n border: 1px solid var(--border);\n border-radius: 8px;\n}\n.md-preview table:not(.frontmatter-table table) th,\n.md-preview table:not(.frontmatter-table table) td {\n padding: 10px 16px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n vertical-align: top;\n word-break: break-word;\n overflow-wrap: anywhere;\n width: auto;\n}\n/* Force equal column widths when colgroup is not specified */\n.md-preview table:not(.frontmatter-table table) colgroup ~ * th,\n.md-preview table:not(.frontmatter-table table) colgroup ~ * td {\n width: auto;\n}\n.md-preview table:not(.frontmatter-table table) td:has(video),\n.md-preview table:not(.frontmatter-table table) td:has(img) {\n padding: 4px;\n line-height: 0;\n}\n.md-preview table:not(.frontmatter-table table) td video,\n.md-preview table:not(.frontmatter-table table) td img {\n width: 100%;\n max-width: 100%;\n height: auto;\n}\n.md-preview table:not(.frontmatter-table table) th {\n background: var(--panel);\n font-weight: 600;\n font-size: 13px;\n}\n.md-preview table:not(.frontmatter-table table) td {\n font-size: 13px;\n}\n.md-preview table:not(.frontmatter-table table) tr:last-child td {\n border-bottom: none;\n}\n.md-preview table:not(.frontmatter-table table) tr:hover td {\n background: var(--hover-bg);\n}\n/* Source table (右ペイン) */\n.table-box table {\n table-layout: fixed;\n width: 100%;\n}\n.table-box th,\n.table-box td {\n word-break: break-word;\n min-width: 140px;\n}\n.table-box th:first-child,\n.table-box td:first-child {\n min-width: 320px;\n max-width: 480px;\n}\n/* Image fullscreen overlay */\n.image-fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: var(--bg);\n z-index: 1001;\n display: none;\n flex-direction: column;\n}\n.image-fullscreen-overlay.visible {\n display: flex;\n}\n.image-fs-content {\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n touch-action: none;\n}\n.image-fs-content:active { cursor: grabbing; }\n.image-fs-content .image-fs-wrapper {\n position: absolute;\n transform-origin: 0 0;\n}\n.image-fs-content .image-fs-wrapper img {\n display: block;\n}\n/* Video fullscreen overlay */\n.video-fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.95);\n z-index: 1001;\n display: none;\n justify-content: center;\n align-items: center;\n}\n.video-fullscreen-overlay.visible {\n display: flex;\n}\n.video-close-btn {\n position: absolute;\n top: 14px;\n right: 14px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 50%;\n cursor: pointer;\n color: #fff;\n font-size: 18px;\n z-index: 10;\n backdrop-filter: blur(4px);\n transition: background 120ms ease, transform 120ms ease;\n}\n.video-close-btn:hover {\n background: rgba(0, 0, 0, 0.75);\n transform: scale(1.04);\n}\n.video-container {\n width: 90vw;\n height: 90vh;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.video-container video {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: 8px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);\n}\n/* Video Timeline - shared base styles (used by both fullscreen and sidebar) */\n.video-timeline {\n background: rgba(0, 0, 0, 0.85);\n display: flex;\n overflow-x: auto;\n backdrop-filter: blur(8px);\n height: 80px;\n padding: 8px;\n gap: 4px;\n}\n.video-timeline::-webkit-scrollbar {\n height: 6px;\n}\n.video-timeline::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n}\n.video-timeline::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.3);\n border-radius: 3px;\n}\n.video-timeline::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.5);\n}\n/* Fullscreen-specific video timeline positioning */\n.video-container .video-timeline {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 5;\n}\n/* Sidebar-specific video timeline sizing */\n.sidebar-video-container .video-timeline {\n width: 100%;\n height: 72px;\n padding: 6px;\n gap: 3px;\n border-radius: 0 0 8px 8px;\n background: rgba(0, 0, 0, 0.88);\n}\n.sidebar-video-container .video-timeline::-webkit-scrollbar { height: 5px; }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.08); }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); }\n.sidebar-video-container .video-timeline::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.4); }\n.timeline-thumb {\n height: 64px;\n cursor: pointer;\n border: 2px solid transparent;\n border-radius: 4px;\n flex-shrink: 0;\n transition: border-color 0.2s, transform 0.15s;\n opacity: 0.85;\n}\n.sidebar-video-container .timeline-thumb {\n height: 52px;\n opacity: 0.8;\n}\n.timeline-thumb:hover {\n border-color: rgba(59, 130, 246, 0.5);\n opacity: 1;\n transform: scale(1.05);\n}\n.timeline-thumb.active {\n border-color: #3b82f6;\n opacity: 1;\n box-shadow: 0 0 12px rgba(59, 130, 246, 0.5);\n}\n.sidebar-video-container .timeline-thumb.active {\n box-shadow: 0 0 8px rgba(59, 130, 246, 0.4);\n}\n.timeline-loading {\n color: rgba(255, 255, 255, 0.6);\n font-size: 12px;\n padding: 8px 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.sidebar-video-container .timeline-loading {\n font-size: 11px;\n padding: 6px 10px;\n gap: 6px;\n color: rgba(255, 255, 255, 0.5);\n}\n.timeline-loading::before {\n content: '';\n width: 14px;\n height: 14px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: timeline-spin 0.8s linear infinite;\n}\n.sidebar-video-container .timeline-loading::before {\n width: 12px;\n height: 12px;\n border-width: 2px;\n border-color: rgba(255, 255, 255, 0.25);\n border-top-color: #3b82f6;\n}\n@keyframes timeline-spin {\n to { transform: rotate(360deg); }\n}\n.timeline-time {\n position: absolute;\n bottom: 2px;\n right: 4px;\n font-size: 9px;\n color: #fff;\n background: rgba(0, 0, 0, 0.7);\n padding: 1px 4px;\n border-radius: 2px;\n pointer-events: none;\n}\n.sidebar-video-container .timeline-time {\n font-size: 8px;\n right: 3px;\n padding: 1px 3px;\n}\n.timeline-thumb-wrapper {\n position: relative;\n flex-shrink: 0;\n}\n/* Video threshold settings panel */\n.video-settings-btn {\n position: absolute;\n top: 14px;\n right: 64px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 50%;\n cursor: pointer;\n color: #fff;\n font-size: 18px;\n z-index: 10;\n backdrop-filter: blur(4px);\n transition: background 120ms ease, transform 120ms ease;\n}\n.video-settings-btn:hover {\n background: rgba(0, 0, 0, 0.75);\n transform: scale(1.04);\n}\n.video-settings-panel {\n position: absolute;\n top: 60px;\n right: 14px;\n background: rgba(0, 0, 0, 0.9);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 12px;\n padding: 16px;\n z-index: 15;\n min-width: 280px;\n display: none;\n backdrop-filter: blur(8px);\n}\n.video-settings-panel.visible {\n display: block;\n}\n.video-settings-panel h4 {\n margin: 0 0 8px;\n color: #fff;\n font-size: 14px;\n font-weight: 500;\n}\n.video-settings-desc {\n margin: 0 0 12px;\n color: rgba(255, 255, 255, 0.6);\n font-size: 11px;\n line-height: 1.4;\n}\n.video-settings-buttons {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n}\n.video-settings-buttons button {\n flex: 1;\n padding: 8px 4px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n font-size: 11px;\n cursor: pointer;\n transition: all 120ms ease;\n}\n.video-settings-buttons button:hover {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n}\n.video-settings-buttons button.selected {\n background: #3b82f6;\n border-color: #3b82f6;\n color: #fff;\n}\n.video-settings-actions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n.video-settings-actions button {\n flex: 1;\n padding: 8px 12px;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n cursor: pointer;\n transition: background 120ms ease;\n}\n.video-settings-actions .reset-btn {\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n}\n.video-settings-actions .reset-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n/* Video Shortcuts Help */\n.video-shortcuts-help {\n opacity: 0.85;\n transition: opacity 0.2s;\n}\n.video-shortcuts-help:hover {\n opacity: 1;\n}\n.video-shortcuts-help .shortcuts-title {\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n color: rgba(255, 255, 255, 0.7);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.video-shortcuts-help .shortcuts-title::before {\n content: '\\u2328';\n font-size: 14px;\n}\n.video-shortcuts-help .shortcut-item {\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.video-shortcuts-help .shortcut-item:last-child {\n margin-bottom: 0;\n}\n.video-shortcuts-help kbd {\n display: inline-block;\n background: rgba(255, 255, 255, 0.15);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 4px;\n padding: 2px 6px;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 10px;\n font-weight: 500;\n min-width: 18px;\n text-align: center;\n margin-right: 2px;\n}\n/* Reviw Questions Modal */\n.reviw-questions-overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.8);\n z-index: 1100;\n justify-content: center;\n align-items: center;\n}\n.reviw-questions-overlay.visible {\n display: flex;\n}\n.reviw-questions-modal {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: 16px;\n width: 90%;\n max-width: 600px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n box-shadow: 0 25px 80px rgba(0, 0, 0, 0.5);\n}\n.reviw-questions-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--border);\n}\n.reviw-questions-header h2 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text);\n}\n.reviw-questions-header h2 span {\n font-size: 14px;\n color: var(--text-dim);\n font-weight: 400;\n}\n.reviw-questions-close {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--text-dim);\n font-size: 18px;\n cursor: pointer;\n border-radius: 8px;\n transition: all 150ms ease;\n}\n.reviw-questions-close:hover {\n background: var(--border);\n color: var(--text);\n}\n.reviw-questions-body {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n}\n.reviw-questions-footer {\n padding: 12px 20px;\n border-top: 1px solid var(--border);\n display: flex;\n justify-content: flex-end;\n}\n.reviw-questions-later {\n padding: 8px 16px;\n border: 1px solid var(--border);\n background: transparent;\n color: var(--text-dim);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n.reviw-questions-later:hover {\n background: var(--border);\n color: var(--text);\n}\n/* Question Item */\n.reviw-question-item {\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--border);\n}\n.reviw-question-item:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n}\n.reviw-question-text {\n font-size: 14px;\n color: var(--text);\n margin-bottom: 12px;\n line-height: 1.5;\n}\n.reviw-question-options {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n}\n.reviw-question-option {\n padding: 8px 14px;\n border: 1px solid var(--border);\n background: transparent;\n color: var(--text);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n.reviw-question-option:hover {\n border-color: var(--accent);\n background: rgba(96, 165, 250, 0.1);\n}\n.reviw-question-option.selected {\n border-color: var(--accent);\n background: var(--accent);\n color: var(--text-inverse);\n}\n.reviw-question-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--border);\n background: var(--input-bg);\n color: var(--text);\n border-radius: 8px;\n font-size: 13px;\n resize: vertical;\n min-height: 60px;\n}\n.reviw-question-input:focus {\n outline: none;\n border-color: var(--accent);\n}\n.reviw-question-input::placeholder {\n color: var(--text-dim);\n}\n.reviw-check-mark {\n color: #22c55e;\n font-weight: bold;\n}\n.reviw-question-item.answered {\n border-color: #22c55e;\n background: rgba(34, 197, 94, 0.05);\n}\n.reviw-question-submit {\n margin-top: 10px;\n padding: 8px 16px;\n border: none;\n background: var(--accent);\n color: var(--text-inverse);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 150ms ease;\n}\n.reviw-question-submit:hover {\n filter: brightness(1.1);\n}\n.reviw-question-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n/* Resolved Section */\n.reviw-resolved-section {\n margin-top: 16px;\n border-top: 1px solid var(--border);\n padding-top: 12px;\n}\n.reviw-resolved-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n color: var(--text-dim);\n font-size: 13px;\n cursor: pointer;\n padding: 4px 0;\n}\n.reviw-resolved-toggle:hover {\n color: var(--text);\n}\n.reviw-resolved-toggle .arrow {\n transition: transform 150ms ease;\n}\n.reviw-resolved-toggle.open .arrow {\n transform: rotate(90deg);\n}\n.reviw-resolved-list {\n display: none;\n margin-top: 12px;\n}\n.reviw-resolved-list.visible {\n display: block;\n}\n.reviw-resolved-item {\n padding: 10px 12px;\n background: var(--input-bg);\n border-radius: 8px;\n margin-bottom: 8px;\n opacity: 0.7;\n}\n.reviw-resolved-item:last-child {\n margin-bottom: 0;\n}\n.reviw-resolved-q {\n font-size: 12px;\n color: var(--text-dim);\n margin-bottom: 4px;\n}\n.reviw-resolved-a {\n font-size: 13px;\n color: var(--text);\n}\n/* Notice Bar */\n.reviw-questions-bar {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n background: var(--accent);\n color: var(--text-inverse);\n padding: 8px 16px;\n font-size: 13px;\n z-index: 1050;\n justify-content: center;\n align-items: center;\n gap: 12px;\n}\n.reviw-questions-bar.visible {\n display: flex;\n}\n.reviw-questions-bar button {\n padding: 4px 12px;\n border: 1px solid rgba(255, 255, 255, 0.3);\n background: rgba(255, 255, 255, 0.1);\n color: var(--text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n transition: all 150ms ease;\n}\n.reviw-questions-bar button:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n/* Adjust layout when bar is visible */\nbody.has-questions-bar header {\n top: 36px;\n}\nbody.has-questions-bar .toolbar,\nbody.has-questions-bar .table-wrap {\n margin-top: 36px;\n}\n/* Copy notification toast */\n.copy-toast {\n position: fixed;\n bottom: 60px;\n left: 50%;\n transform: translateX(-50%) translateY(20px);\n background: var(--accent);\n color: var(--text-inverse);\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n opacity: 0;\n pointer-events: none;\n transition: opacity 200ms ease, transform 200ms ease;\n z-index: 1000;\n}\n.copy-toast.visible {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n@media (max-width: 960px) {\n .md-layout { flex-direction: column; }\n .md-left { max-width: 100%; flex: 1 1 0; min-height: 0; }\n .md-right { display: none; }\n .media-sidebar { display: none; }\n .media-sidebar-toggle { display: none !important; }\n}\n.md-layout.preview-only .md-right { display: none; }\n.md-layout.preview-only .md-left { flex: 1 1 0; min-height: 0; max-width: 100%; }\n.filter-menu {\n position: absolute;\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 10px;\n box-shadow: 0 14px 30px var(--shadow-color);\n padding: 8px;\n display: none;\n z-index: 12;\n width: 180px;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.filter-menu button {\n width: 100%;\n display: block;\n margin: 4px 0;\n padding: 8px 10px;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n color: var(--text);\n cursor: pointer;\n font-size: 13px;\n text-align: left;\n}\n.filter-menu button:hover { background: var(--hover-bg); }\n.modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n display: none;\n align-items: center;\n justify-content: center;\n z-index: 100;\n}\n.modal-overlay.visible { display: flex; }\n/* Submit modal: top-right position, no blocking overlay */\n#submit-modal {\n background: transparent;\n pointer-events: none;\n align-items: flex-start;\n justify-content: flex-end;\n}\n#submit-modal.visible { display: flex; }\n#submit-modal .modal-dialog {\n pointer-events: auto;\n margin: 60px 20px 20px 20px; /* top margin avoids header button overlap */\n}\n.modal-dialog {\n background: var(--panel-solid);\n border: 1px solid var(--border);\n border-radius: 14px;\n padding: 20px;\n width: 90%;\n max-width: 480px;\n box-shadow: 0 20px 40px var(--shadow-color);\n transition: background 200ms ease, border-color 200ms ease;\n}\n.modal-dialog h3 { margin: 0 0 12px; font-size: 18px; color: var(--accent); }\n.modal-summary { color: var(--muted); font-size: 13px; margin-bottom: 12px; }\n.modal-dialog label { display: block; font-size: 13px; margin-bottom: 6px; color: var(--muted); }\n.modal-dialog textarea {\n width: 100%;\n min-height: 100px;\n background: var(--input-bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n color: var(--text);\n padding: 10px;\n font-size: 14px;\n resize: vertical;\n box-sizing: border-box;\n transition: background 200ms ease, border-color 200ms ease;\n}\n.modal-dialog textarea:focus { outline: none; border-color: var(--accent); }\n.modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }\n.modal-actions button {\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid var(--border);\n background: var(--selected-bg);\n color: var(--text);\n cursor: pointer;\n font-size: 14px;\n}\n.modal-actions button:hover { background: var(--hover-bg); }\n.modal-actions button.primary { background: var(--accent); color: var(--text-inverse); border-color: var(--accent); }\n.image-attach-area { margin: 12px 0; }\n.image-attach-area label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 6px; }\n.image-attach-area.image-attach-small { margin: 8px 0; }\n.image-attach-area.image-attach-small label { font-size: 11px; }\n.image-preview-list { display: flex; flex-wrap: wrap; gap: 8px; min-height: 24px; }\n.image-preview-item { position: relative; }\n.image-preview-item img { max-width: 80px; max-height: 60px; border-radius: 4px; border: 1px solid var(--border); object-fit: cover; }\n.image-preview-item .remove-image { position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%; background: var(--error, #ef4444); color: #fff; border: none; cursor: pointer; font-size: 12px; line-height: 1; display: flex; align-items: center; justify-content: center; }\n.image-preview-item .remove-image:hover { background: #dc2626; }\n.modal-actions button.primary:hover { background: #7dd3fc; }\n\n.modal-checkboxes { margin: 12px 0; }\n.modal-checkboxes label {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 12px;\n color: var(--text);\n margin-bottom: 8px;\n cursor: pointer;\n}\n.modal-checkboxes input[type=\"checkbox\"] {\n margin-top: 2px;\n accent-color: var(--accent);\n}\n\nbody.dragging { user-select: none; cursor: crosshair; }\nbody.dragging .diff-line { cursor: crosshair; }\n@media (max-width: 840px) {\n header { flex-direction: column; align-items: flex-start; }\n .comment-list { width: calc(100% - 24px); right: 12px; }\n}\n/* Mermaid diagram styles */\n.mermaid-container {\n position: relative;\n margin: 16px 0;\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 16px;\n overflow: hidden;\n}\n.mermaid-container .mermaid {\n display: flex;\n justify-content: center;\n}\n.mermaid-container .mermaid svg {\n max-width: 100%;\n height: auto;\n cursor: pointer;\n pointer-events: auto;\n}\n.mermaid-error-banner {\n background: #fff3f3;\n color: #c33;\n border: 1px solid #e88;\n border-radius: 4px;\n padding: 6px 10px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 500;\n}\n[data-theme=\"dark\"] .mermaid-error-banner {\n background: #3a1a1a;\n color: #f88;\n border-color: #744;\n}\n.mermaid-fullscreen-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n color: var(--text);\n font-size: 12px;\n z-index: 2;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.mermaid-fullscreen-btn:hover { background: var(--hover-bg); }\n/* Fullscreen overlay */\n.fullscreen-overlay {\n position: fixed;\n inset: 0;\n background: var(--bg);\n z-index: 1000;\n display: none;\n flex-direction: column;\n}\n.fullscreen-overlay.visible { display: flex; }\n.fullscreen-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--panel-alpha);\n border-bottom: 1px solid var(--border);\n}\n.fullscreen-header h3 { margin: 0; font-size: 14px; }\n.fullscreen-controls { display: flex; gap: 8px; align-items: center; }\n.fullscreen-controls button {\n background: var(--selected-bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 12px;\n cursor: pointer;\n color: var(--text);\n font-size: 13px;\n}\n.fullscreen-controls button:hover { background: var(--hover-bg); }\n.fullscreen-controls .zoom-info { font-size: 12px; color: var(--muted); min-width: 50px; text-align: center; }\n.fullscreen-content {\n flex: 1;\n overflow: hidden;\n position: relative;\n cursor: grab;\n touch-action: none;\n}\n.fullscreen-content:active { cursor: grabbing; }\n.fullscreen-content .mermaid-wrapper {\n position: absolute;\n transform-origin: 0 0;\n padding: 40px;\n}\n.fullscreen-content .mermaid svg {\n display: block;\n}\n/* Minimap */\n.minimap {\n position: absolute;\n top: 70px;\n right: 20px;\n width: 200px;\n height: 150px;\n background: var(--panel-alpha);\n border: 1px solid var(--border);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n.minimap-content {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n}\n.minimap-content svg {\n max-width: 100%;\n max-height: 100%;\n opacity: 0.6;\n}\n.minimap-viewport {\n position: absolute;\n border: 2px solid var(--accent);\n background: rgba(102, 126, 234, 0.2);\n pointer-events: none;\n border-radius: 2px;\n}\n/* Error toast */\n.mermaid-error-toast {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--error);\n color: white;\n padding: 12px 24px;\n border-radius: 8px;\n font-size: 13px;\n max-width: 80%;\n z-index: 2000;\n display: none;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n white-space: pre-wrap;\n font-family: monospace;\n}\n.mermaid-error-toast.visible { display: block; }\n\n/* History Panel - Push layout */\nbody { transition: margin-right 0.25s ease; }\nbody.history-open { margin-right: 320px; }\nbody.history-open header { right: 320px; }\nheader { transition: right 0.25s ease; right: 0; }\n\n.history-toggle {\n background: var(--selected-bg);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 6px 8px;\n font-size: 14px;\n cursor: pointer;\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.history-toggle:hover { background: var(--border); }\n.history-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100vh;\n background: var(--panel-solid);\n border-left: 1px solid var(--border);\n z-index: 90;\n transform: translateX(100%);\n transition: transform 0.25s ease;\n display: flex;\n flex-direction: column;\n}\n.history-panel.open { transform: translateX(0); }\n.history-panel-header {\n padding: 16px;\n border-bottom: 1px solid var(--border);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.history-panel-header h3 { margin: 0; font-size: 14px; font-weight: 600; }\n.history-panel-close {\n background: transparent;\n border: none;\n color: var(--muted);\n cursor: pointer;\n font-size: 18px;\n padding: 4px;\n}\n.history-panel-close:hover { color: var(--text); }\n.history-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n.history-empty {\n color: var(--muted);\n font-size: 13px;\n text-align: center;\n padding: 40px 20px;\n}\n.history-date-group { margin-bottom: 16px; }\n.history-date {\n font-size: 11px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 8px;\n text-transform: uppercase;\n}\n.history-item {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n margin-bottom: 8px;\n overflow: hidden;\n}\n.history-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 10px;\n background: var(--selected-bg);\n cursor: pointer;\n}\n.history-item-header:hover { background: var(--hover-bg); }\n.history-item-file {\n font-size: 12px;\n font-weight: 600;\n color: var(--text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 180px;\n}\n.history-item-time { font-size: 10px; color: var(--muted); }\n.history-item-body {\n display: none;\n padding: 10px;\n font-size: 12px;\n border-top: 1px solid var(--border);\n}\n.history-item.expanded .history-item-body { display: block; }\n.history-summary {\n color: var(--text);\n margin-bottom: 8px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--border);\n}\n.history-summary-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 4px;\n}\n.history-summary-text { white-space: pre-wrap; line-height: 1.4; }\n.history-comments-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--muted);\n margin-bottom: 6px;\n}\n.history-comment {\n padding: 6px 0;\n border-bottom: 1px solid var(--border);\n}\n.history-comment:last-child { border-bottom: none; }\n.history-comment-line {\n font-size: 10px;\n color: var(--accent);\n font-weight: 600;\n margin-bottom: 2px;\n}\n.history-comment-quote {\n background: rgba(0, 0, 0, 0.3);\n border-left: 2px solid var(--accent);\n padding: 4px 8px;\n margin: 4px 0;\n font-family: 'SF Mono', Monaco, Consolas, monospace;\n font-size: 11px;\n color: var(--muted);\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 80px;\n overflow-y: auto;\n}\n.history-comment-text {\n color: var(--text);\n line-height: 1.4;\n white-space: pre-wrap;\n}\n.history-badge {\n display: inline-block;\n background: var(--accent);\n color: var(--text-inverse);\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n margin-left: 6px;\n}\n/* Table scroll container */\n.table-container {\n overflow-x: auto;\n margin: 16px 0;\n border-radius: 8px;\n border: 1px solid var(--border);\n}\n.table-container table {\n margin: 0;\n border: none;\n border-radius: 0;\n}\n.table-container::-webkit-scrollbar {\n height: 6px;\n}\n.table-container::-webkit-scrollbar-track {\n background: var(--bg);\n border-radius: 3px;\n}\n.table-container::-webkit-scrollbar-thumb {\n background: var(--border);\n border-radius: 3px;\n}\n.table-container::-webkit-scrollbar-thumb:hover {\n background: var(--muted);\n}\n/* Media sidebar */\n.media-sidebar {\n display: flex;\n flex-shrink: 0;\n height: calc(100vh - 80px);\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 10;\n max-width: 60%;\n}\n.media-sidebar.hidden { display: none; }\n.media-sidebar-thumbs {\n width: 96px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 8px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--panel);\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.media-sidebar-thumbs::-webkit-scrollbar { width: 4px; }\n.media-sidebar-thumbs::-webkit-scrollbar-track { background: transparent; }\n.media-sidebar-thumbs::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }\n.media-sidebar-thumb {\n width: 80px;\n height: 60px;\n border-radius: 6px;\n border: 2px solid var(--border);\n overflow: hidden;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n background: var(--bg);\n transition: border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;\n}\n.media-sidebar-thumb:hover { border-color: var(--accent); transform: scale(1.05); box-shadow: 0 2px 8px var(--shadow-color); }\n.media-sidebar-thumb.active { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent), 0 2px 8px var(--shadow-color); }\n.media-sidebar-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.media-sidebar-thumb svg { width: 100%; height: 100%; display: block; }\n.media-sidebar-thumb-video {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n}\n.media-sidebar-thumb-video video { width: 100%; height: 100%; object-fit: cover; }\n.media-sidebar-thumb-video::after {\n content: '';\n position: absolute;\n width: 24px;\n height: 24px;\n background: rgba(255,255,255,0.85);\n border-radius: 50%;\n}\n.media-sidebar-thumb-video::before {\n content: '';\n position: absolute;\n z-index: 1;\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 5px 0 5px 9px;\n border-color: transparent transparent transparent #000;\n margin-left: 2px;\n}\n.media-sidebar-thumb-mermaid {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 2px;\n background: var(--panel);\n overflow: hidden;\n}\n.media-sidebar-thumb-mermaid svg { width: 100% !important; height: 100% !important; max-width: 100%; max-height: 100%; display: block; }\n.media-sidebar-thumb-index {\n position: absolute;\n top: 2px;\n left: 2px;\n background: rgba(0,0,0,0.6);\n color: #fff;\n font-size: 9px;\n font-weight: 600;\n padding: 1px 4px;\n border-radius: 3px;\n line-height: 1.2;\n pointer-events: none;\n z-index: 1;\n}\n.media-sidebar-viewer {\n width: 0;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--bg);\n position: relative;\n}\n.media-sidebar-viewer.open {\n width: 45vw;\n max-width: calc(100vw - 400px);\n overflow: hidden;\n padding: 16px;\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n}\n.media-sidebar-viewer-close {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 2;\n background: var(--selected-bg);\n border: 1px solid var(--border);\n color: var(--text);\n width: 28px;\n height: 28px;\n border-radius: 50%;\n cursor: pointer;\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.media-sidebar-viewer-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.media-sidebar-viewer-content img { max-width: 100%; max-height: calc(100vh - 140px); object-fit: contain; border-radius: 8px; }\n.media-sidebar-viewer-content video { max-width: 100%; max-height: calc(100vh - 140px); border-radius: 8px; background: #000; }\n.media-sidebar-viewer-label {\n margin-top: 8px;\n font-size: 12px;\n color: var(--muted);\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n.sidebar-zoom-indicator {\n position: absolute;\n bottom: 12px;\n right: 12px;\n background: rgba(0,0,0,0.7);\n color: #fff;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n pointer-events: none;\n transition: opacity 0.3s ease;\n}\n.sidebar-zoom-indicator.hidden { opacity: 0; }\n.sidebar-mermaid-viewport { overflow: hidden; position: relative; cursor: grab; }\n.sidebar-mermaid-wrapper { position: absolute; left: 0; top: 0; transform-origin: 0 0; }\n.sidebar-video-container { width: 100%; }\n.sidebar-video-container video { width: 100%; max-height: calc(100vh - 200px); border-radius: 8px; background: #000; }\n/* Video timeline */\n.video-timeline {\n display: flex;\n gap: 8px;\n padding: 8px;\n overflow-x: auto;\n background: var(--panel);\n border-radius: 8px;\n margin-top: 8px;\n scrollbar-width: thin;\n scrollbar-color: var(--border) transparent;\n}\n.timeline-loading { color: var(--muted); font-size: 12px; padding: 8px; }\n.timeline-thumb-wrapper {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n.timeline-thumb {\n width: 80px;\n height: 60px;\n object-fit: cover;\n border-radius: 4px;\n border: 2px solid transparent;\n transition: border-color 0.2s ease;\n}\n.timeline-thumb.active { border-color: var(--accent); }\n.timeline-thumb:hover { border-color: var(--accent); opacity: 0.8; }\n.timeline-time { font-size: 10px; color: var(--muted); }\n/* Fullscreen overlay */\n.fullscreen-overlay {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0,0,0,0.9);\n z-index: 1000;\n flex-direction: column;\n}\n.fullscreen-overlay.visible { display: flex; }\n.fullscreen-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: rgba(0,0,0,0.8);\n border-bottom: 1px solid rgba(255,255,255,0.1);\n}\n.fullscreen-header h3 { margin: 0; color: #fff; font-size: 14px; }\n.fullscreen-controls { display: flex; gap: 6px; align-items: center; }\n.fullscreen-controls button {\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: #fff;\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n}\n.fullscreen-controls button:hover { background: rgba(255,255,255,0.2); }\n.fullscreen-controls .zoom-info { color: #fff; font-size: 12px; min-width: 40px; text-align: center; }\n@media (max-width: 960px) {\n .media-sidebar { display: none !important; }\n .media-sidebar-toggle { display: none !important; }\n}\n.video-overlay-wrapper {\n position: relative;\n display: inline-block;\n}\n.video-fs-overlay-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n padding: 0;\n background: rgba(0,0,0,0.6);\n border: 1px solid rgba(255,255,255,0.3);\n color: #fff;\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n transition: background 120ms ease;\n}\n.video-fs-overlay-btn:hover { background: rgba(0,0,0,0.8); }\n@media (max-width: 600px) {\n .minimap { display: none !important; }\n .fullscreen-header { padding: 8px 12px; }\n .fullscreen-controls { gap: 4px; }\n .fullscreen-controls button { padding: 6px 8px; font-size: 11px; }\n .fullscreen-controls .zoom-info { font-size: 11px; min-width: 32px; }\n .history-panel { width: 100vw; }\n body.history-open header { right: 0; }\n}");
3873
4077
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</style></head><body>");
3874
4078
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<header><div class=\"meta\">");
3875
4079
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<h1>");
@@ -4133,15 +4337,38 @@ function _M0FP36kazuph5reviw4core21build__script__footer(buf, port, mode, filena
4133
4337
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<script src=\"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js\"></script>");
4134
4338
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "<script>");
4135
4339
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__mermaidErrors=[];");
4136
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid.parseError=function(err,hash){var msg=err.message||err.str||String(err);console.error('[reviw] Mermaid parse error:',msg);window.__mermaidErrors.push({message:msg,hash:hash||null});};");
4340
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__collectMermaidErrors=async function(){");
4341
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__mermaidErrors=[];");
4342
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var divs=document.querySelectorAll('.mermaid');");
4343
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "for(var i=0;i<divs.length;i++){");
4344
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var d=divs[i];");
4345
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var noSvg=!d.querySelector('svg');");
4346
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var errSvg=!!d.querySelector('.error-icon');");
4347
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "if(noSvg||errSvg){");
4348
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var line=parseInt(d.getAttribute('data-source-line'))||0;");
4349
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var src=d.getAttribute('data-source')||'';");
4350
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var msg='Mermaid render failed';");
4351
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "try{await mermaid.parse(src);}catch(e){msg=e.message||String(e);}");
4352
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "console.error('[reviw] Mermaid error at line '+line+':',msg);");
4353
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__mermaidErrors.push({line:line,message:msg,source:src});");
4354
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var container=d.closest('.mermaid-container');");
4355
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "if(container&&!container.querySelector('.mermaid-error-banner')){");
4356
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var banner=document.createElement('div');");
4357
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "banner.className='mermaid-error-banner';");
4358
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "banner.textContent='\\u26A0 Mermaid error (line '+line+'): '+msg;");
4359
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "container.prepend(banner);");
4360
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "}");
4361
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "}");
4362
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "}");
4363
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "};");
4137
4364
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid.initialize({startOnLoad:false,logLevel:0,theme:document.documentElement.getAttribute('data-theme')==='light'?'default':'dark',securityLevel:'loose'});");
4138
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid.run().catch(function(e){console.error('[reviw] Mermaid render error:',e);window.__mermaidErrors.push({message:e.message||String(e),source:''});});");
4365
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid.run().then(function(){return window.__collectMermaidErrors();}).catch(function(e){console.error('[reviw] Mermaid render error:',e);return window.__collectMermaidErrors();});");
4139
4366
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__reRenderMermaid=function(theme){");
4140
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "window.__mermaidErrors=[];");
4367
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "document.querySelectorAll('.mermaid-error-banner').forEach(function(b){b.remove();});");
4141
4368
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "mermaid.initialize({startOnLoad:false,logLevel:0,theme:theme!=='light'?'dark':'default',securityLevel:'loose'});");
4142
4369
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "var divs=document.querySelectorAll('.mermaid');");
4143
4370
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "divs.forEach(function(d){d.removeAttribute('data-processed');d.innerHTML=d.getAttribute('data-source');});");
4144
- _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "if(divs.length>0)mermaid.run({nodes:Array.from(divs)}).catch(function(e){console.error('[reviw] Mermaid render error:',e);window.__mermaidErrors.push({message:e.message||String(e),source:''});});");
4371
+ _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "if(divs.length>0)mermaid.run({nodes:Array.from(divs)}).then(function(){return window.__collectMermaidErrors();}).catch(function(e){console.error('[reviw] Mermaid render error:',e);return window.__collectMermaidErrors();});");
4145
4372
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "};");
4146
4373
  _M0IP311moonbitlang4core7builtin13StringBuilderP311moonbitlang4core7builtin6Logger13write__string(buf, "</script>");
4147
4374
  }
@@ -4750,23 +4977,23 @@ function _M0FP36kazuph5reviw4core14collect__hunks(lines, start, len) {
4750
4977
  while (true) {
4751
4978
  if (i < len) {
4752
4979
  const line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
4753
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c934, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c934.length })) {
4980
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c956, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c956.length })) {
4754
4981
  const header = _M0FP36kazuph5reviw4core19parse__hunk__header(line);
4755
4982
  const hunk_lines = [];
4756
4983
  i = i + 1 | 0;
4757
4984
  while (true) {
4758
4985
  if (i < len) {
4759
4986
  const l = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
4760
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c936, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c936.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c937, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c937.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c938, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c938.length }))) {
4987
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c958, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c958.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c959, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c959.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c960, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c960.length }))) {
4761
4988
  break;
4762
4989
  }
4763
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c939, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c939.length })) {
4990
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c961, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c961.length })) {
4764
4991
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffLineE(hunk_lines, { kind: 1, content: _M0FP36kazuph5reviw4core11safe__slice(l, 1) });
4765
4992
  } else {
4766
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c940, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c940.length })) {
4993
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c962, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c962.length })) {
4767
4994
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffLineE(hunk_lines, { kind: 2, content: _M0FP36kazuph5reviw4core11safe__slice(l, 1) });
4768
4995
  } else {
4769
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c941, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c941.length })) {
4996
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c963, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c963.length })) {
4770
4997
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffLineE(hunk_lines, { kind: 0, content: _M0FP36kazuph5reviw4core11safe__slice(l, 1) });
4771
4998
  } else {
4772
4999
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffLineE(hunk_lines, { kind: 0, content: l });
@@ -4781,7 +5008,7 @@ function _M0FP36kazuph5reviw4core14collect__hunks(lines, start, len) {
4781
5008
  }
4782
5009
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffHunkE(hunks, { old_start: header._0, old_count: header._1, new_start: header._2, new_count: header._3, context: header._4, lines: hunk_lines });
4783
5010
  } else {
4784
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c942, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c942.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c943, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c943.length })) {
5011
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c964, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c964.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c965, start: 0, end: _M0FP36kazuph5reviw4core30collect__hunks_2e_2abind_7c965.length })) {
4785
5012
  break;
4786
5013
  } else {
4787
5014
  i = i + 1 | 0;
@@ -4821,7 +5048,7 @@ function _M0FP36kazuph5reviw4core19extract__git__paths(line) {
4821
5048
  }
4822
5049
  }
4823
5050
  function _M0FP36kazuph5reviw4core19strip__diff__prefix(path) {
4824
- return _M0MP311moonbitlang4core6string6String11has__prefix(path, { str: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c945, start: 0, end: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c945.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(path, { str: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c946, start: 0, end: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c946.length }) ? _M0FP36kazuph5reviw4core11safe__slice(path, 2) : path;
5051
+ return _M0MP311moonbitlang4core6string6String11has__prefix(path, { str: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c967, start: 0, end: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c967.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(path, { str: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c968, start: 0, end: _M0FP36kazuph5reviw4core35strip__diff__prefix_2e_2abind_7c968.length }) ? _M0FP36kazuph5reviw4core11safe__slice(path, 2) : path;
4825
5052
  }
4826
5053
  function _M0FP36kazuph5reviw4core11parse__diff(input) {
4827
5054
  const files = [];
@@ -4831,7 +5058,7 @@ function _M0FP36kazuph5reviw4core11parse__diff(input) {
4831
5058
  while (true) {
4832
5059
  if (i < len) {
4833
5060
  const line = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
4834
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c948, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c948.length })) {
5061
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c970, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c970.length })) {
4835
5062
  const paths = _M0FP36kazuph5reviw4core19extract__git__paths(line);
4836
5063
  let is_new = false;
4837
5064
  let is_deleted = false;
@@ -4840,19 +5067,19 @@ function _M0FP36kazuph5reviw4core11parse__diff(input) {
4840
5067
  while (true) {
4841
5068
  if (i < len) {
4842
5069
  const l = _M0MP311moonbitlang4core5array5Array2atGsE(lines, i);
4843
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c950, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c950.length })) {
5070
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c972, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c972.length })) {
4844
5071
  is_new = true;
4845
5072
  i = i + 1 | 0;
4846
5073
  } else {
4847
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c951, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c951.length })) {
5074
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c973, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c973.length })) {
4848
5075
  is_deleted = true;
4849
5076
  i = i + 1 | 0;
4850
5077
  } else {
4851
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c952, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c952.length })) {
5078
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c974, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c974.length })) {
4852
5079
  is_binary = true;
4853
5080
  i = i + 1 | 0;
4854
5081
  } else {
4855
- if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c953, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c953.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c954, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c954.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c955, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c955.length }))) {
5082
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c975, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c975.length }) || (_M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c976, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c976.length }) || _M0MP311moonbitlang4core6string6String11has__prefix(l, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c977, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c977.length }))) {
4856
5083
  i = i + 1 | 0;
4857
5084
  } else {
4858
5085
  break;
@@ -4869,11 +5096,11 @@ function _M0FP36kazuph5reviw4core11parse__diff(input) {
4869
5096
  i = result._1;
4870
5097
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core8DiffFileE(files, { old_path: paths._0, new_path: paths._1, is_new: is_new, is_deleted: is_deleted, is_binary: is_binary, hunks: result._0 });
4871
5098
  } else {
4872
- if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c956, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c956.length })) {
5099
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(line, { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c978, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c978.length })) {
4873
5100
  const old_path = _M0FP36kazuph5reviw4core19strip__diff__prefix(_M0FP36kazuph5reviw4core11safe__slice(line, 4));
4874
5101
  let new_path = "";
4875
5102
  i = i + 1 | 0;
4876
- if (i < len && _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c957, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c957.length })) {
5103
+ if (i < len && _M0MP311moonbitlang4core6string6String11has__prefix(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), { str: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c979, start: 0, end: _M0FP36kazuph5reviw4core27parse__diff_2e_2abind_7c979.length })) {
4877
5104
  new_path = _M0FP36kazuph5reviw4core19strip__diff__prefix(_M0FP36kazuph5reviw4core11safe__slice(_M0MP311moonbitlang4core5array5Array2atGsE(lines, i), 4));
4878
5105
  i = i + 1 | 0;
4879
5106
  }
@@ -4994,13 +5221,13 @@ function _M0FP36kazuph5reviw4core21csv__data__from__flat(flat) {
4994
5221
  }
4995
5222
  }
4996
5223
  function _M0FP36kazuph5reviw6server12exists__sync(_tmp) {
4997
- return existsSync$2005(_tmp);
5224
+ return existsSync$2140(_tmp);
4998
5225
  }
4999
5226
  function _M0FP36kazuph5reviw6server10path__join(_tmp, _tmp$2) {
5000
- return join$2008(_tmp, _tmp$2);
5227
+ return join$2143(_tmp, _tmp$2);
5001
5228
  }
5002
5229
  function _M0FP36kazuph5reviw6server16read__file__sync(_tmp, _tmp$2) {
5003
- return readFileSync$2011(_tmp, _tmp$2);
5230
+ return readFileSync$2146(_tmp, _tmp$2);
5004
5231
  }
5005
5232
  function _M0FP36kazuph5reviw6server12load__ui__js() {
5006
5233
  if (_M0FP36kazuph5reviw6server13ui__js__cache.val.length > 0) {
@@ -5018,7 +5245,7 @@ function _M0FP36kazuph5reviw6server12load__ui__js() {
5018
5245
  }
5019
5246
  }
5020
5247
  function _M0FP36kazuph5reviw6server11os__homedir() {
5021
- return homedir$2013();
5248
+ return homedir$2148();
5022
5249
  }
5023
5250
  function _M0FP36kazuph5reviw6server9lock__dir() {
5024
5251
  const override_dir = _M0FP36kazuph5reviw6server13get__env__var("REVIW_LOCK_DIR");
@@ -5029,7 +5256,7 @@ function _M0FP36kazuph5reviw6server10lock__path(port) {
5029
5256
  return _M0FP36kazuph5reviw6server10path__join(dir, `${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(port)}.lock`);
5030
5257
  }
5031
5258
  function _M0FP36kazuph5reviw6server11mkdir__sync(_tmp, _tmp$2) {
5032
- return mkdirSync$2016(_tmp, _tmp$2);
5259
+ return mkdirSync$2151(_tmp, _tmp$2);
5033
5260
  }
5034
5261
  function _M0FP36kazuph5reviw6server17ensure__lock__dir() {
5035
5262
  const dir = _M0FP36kazuph5reviw6server9lock__dir();
@@ -5040,20 +5267,41 @@ function _M0FP36kazuph5reviw6server17ensure__lock__dir() {
5040
5267
  return;
5041
5268
  }
5042
5269
  }
5270
+ function _M0FP36kazuph5reviw6server16read__file__safe(path) {
5271
+ return _M0FP36kazuph5reviw6server17try__call__string(() => _M0FP36kazuph5reviw6server16read__file__sync(path, "utf-8"), "");
5272
+ }
5273
+ function _M0FP36kazuph5reviw6server12unlink__sync(_tmp) {
5274
+ return unlinkSync$2156(_tmp);
5275
+ }
5043
5276
  function _M0FP36kazuph5reviw6server16is__port__locked(port) {
5044
5277
  const lp = _M0FP36kazuph5reviw6server10lock__path(port);
5045
- return _M0FP36kazuph5reviw6server12exists__sync(lp);
5278
+ if (!_M0FP36kazuph5reviw6server12exists__sync(lp)) {
5279
+ return false;
5280
+ }
5281
+ const content = _M0FP36kazuph5reviw6server16read__file__safe(lp);
5282
+ if (content.length === 0) {
5283
+ _M0FP36kazuph5reviw6server12unlink__sync(lp);
5284
+ return false;
5285
+ }
5286
+ const pid = _M0FP36kazuph5reviw4core16parse__int__safe(content);
5287
+ if (pid <= 0) {
5288
+ _M0FP36kazuph5reviw6server12unlink__sync(lp);
5289
+ return false;
5290
+ }
5291
+ if (_M0FP36kazuph5reviw6server15process__exists(pid)) {
5292
+ return true;
5293
+ } else {
5294
+ _M0FP36kazuph5reviw6server12unlink__sync(lp);
5295
+ return false;
5296
+ }
5046
5297
  }
5047
5298
  function _M0FP36kazuph5reviw6server17write__file__sync(_tmp, _tmp$2) {
5048
- return writeFileSync$2019(_tmp, _tmp$2);
5299
+ return writeFileSync$2159(_tmp, _tmp$2);
5049
5300
  }
5050
5301
  function _M0FP36kazuph5reviw6server11write__lock(port) {
5051
5302
  _M0FP36kazuph5reviw6server17ensure__lock__dir();
5052
5303
  const lp = _M0FP36kazuph5reviw6server10lock__path(port);
5053
- _M0FP36kazuph5reviw6server17write__file__sync(lp, _M0MP311moonbitlang4core3int3Int18to__string_2einner(port, 10));
5054
- }
5055
- function _M0FP36kazuph5reviw6server12unlink__sync(_tmp) {
5056
- return unlinkSync$2021(_tmp);
5304
+ _M0FP36kazuph5reviw6server17write__file__sync(lp, _M0MP311moonbitlang4core3int3Int18to__string_2einner(_M0FP36kazuph5reviw6server12process__pid(), 10));
5057
5305
  }
5058
5306
  function _M0FP36kazuph5reviw6server12remove__lock(port) {
5059
5307
  const lp = _M0FP36kazuph5reviw6server10lock__path(port);
@@ -5083,10 +5331,7 @@ function _M0FP36kazuph5reviw6server21find__available__port(base) {
5083
5331
  return base;
5084
5332
  }
5085
5333
  function _M0FP36kazuph5reviw6server13path__dirname(_tmp) {
5086
- return dirname$2025(_tmp);
5087
- }
5088
- function _M0FP36kazuph5reviw6server16read__file__safe(path) {
5089
- return _M0FP36kazuph5reviw6server17try__call__string(() => _M0FP36kazuph5reviw6server16read__file__sync(path, "utf-8"), "");
5334
+ return dirname$2163(_tmp);
5090
5335
  }
5091
5336
  function _M0FP36kazuph5reviw6server21get__package__version() {
5092
5337
  let dir = _M0FP36kazuph5reviw6server16get__script__dir();
@@ -5132,17 +5377,17 @@ function _M0FP36kazuph5reviw6server11parse__port(s) {
5132
5377
  return n === 0 ? 4989 : n;
5133
5378
  }
5134
5379
  function _M0FP36kazuph5reviw6server12print__usage() {
5135
- _M0FP36kazuph5reviw6server12console__log(_M0FP36kazuph5reviw6server26print__usage_2eusage_7c402);
5380
+ _M0FP36kazuph5reviw6server12console__log(_M0FP36kazuph5reviw6server26print__usage_2eusage_7c449);
5136
5381
  }
5137
5382
  function _M0FP36kazuph5reviw6server17read__stdin__sync() {
5138
5383
  return _M0FP36kazuph5reviw6server16read__file__sync("/dev/stdin", "utf-8");
5139
5384
  }
5140
5385
  function _M0FP36kazuph5reviw6server13path__extname(_tmp) {
5141
- return extname$2034(_tmp);
5386
+ return extname$2170(_tmp);
5142
5387
  }
5143
5388
  function _M0FP36kazuph5reviw6server12detect__mode(file_path) {
5144
5389
  const ext = _M0FP36kazuph5reviw6server13path__extname(file_path);
5145
- const ext_lower = _M0MP311moonbitlang4core6string6String11has__prefix(ext, { str: _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c448, start: 0, end: _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c448.length }) ? _M0MP311moonbitlang4core6string6String9to__lower(_M0FP36kazuph5reviw4core11safe__slice(ext, 1)) : _M0MP311moonbitlang4core6string6String9to__lower(ext);
5390
+ const ext_lower = _M0MP311moonbitlang4core6string6String11has__prefix(ext, { str: _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c497, start: 0, end: _M0FP36kazuph5reviw6server28detect__mode_2e_2abind_7c497.length }) ? _M0MP311moonbitlang4core6string6String9to__lower(_M0FP36kazuph5reviw4core11safe__slice(ext, 1)) : _M0MP311moonbitlang4core6string6String9to__lower(ext);
5146
5391
  return _M0MP36kazuph5reviw4core8FileMode15from__extension(ext_lower);
5147
5392
  }
5148
5393
  function _M0FP36kazuph5reviw6server16detect__encoding(buf) {
@@ -5240,7 +5485,7 @@ function _M0FP36kazuph5reviw6server16detect__encoding(buf) {
5240
5485
  return "utf-8";
5241
5486
  }
5242
5487
  function _M0FP36kazuph5reviw6server18read__file__buffer(_tmp) {
5243
- return readFileSync$2011(_tmp);
5488
+ return readFileSync$2146(_tmp);
5244
5489
  }
5245
5490
  function _M0FP36kazuph5reviw6server12decode__file(path, override_enc) {
5246
5491
  const buf = _M0FP36kazuph5reviw6server18read__file__buffer(path);
@@ -5282,19 +5527,57 @@ function _M0FP36kazuph5reviw6server22load__and__build__html(ctx) {
5282
5527
  return _M0FP36kazuph5reviw4core16build__csv__html(data, ctx.filename, ctx.port);
5283
5528
  }
5284
5529
  function _M0FP36kazuph5reviw6server14path__basename(_tmp) {
5285
- return basename$2044(_tmp);
5530
+ return basename$2180(_tmp);
5286
5531
  }
5287
5532
  function _M0FP36kazuph5reviw6server13path__resolve(_tmp) {
5288
- return resolve$2046(_tmp);
5533
+ return resolve$2182(_tmp);
5289
5534
  }
5290
5535
  function _M0FP36kazuph5reviw6server25http__create__server__raw(_tmp) {
5291
- return createServer$2051(_tmp);
5536
+ return createServer$2187(_tmp);
5292
5537
  }
5293
5538
  function _M0FP36kazuph5reviw6server14create__server(handler) {
5294
5539
  return _M0FP36kazuph5reviw6server25http__create__server__raw(handler);
5295
5540
  }
5541
+ function _M0FP36kazuph5reviw6server19remove__active__tab(ctx, tab_id) {
5542
+ if (tab_id.length === 0) {
5543
+ return undefined;
5544
+ }
5545
+ let idx = -1;
5546
+ const _arr = ctx.active_tabs;
5547
+ const _len = _arr.length;
5548
+ let _tmp = 0;
5549
+ while (true) {
5550
+ const _i = _tmp;
5551
+ if (_i < _len) {
5552
+ const existing = _arr[_i];
5553
+ if (existing === tab_id) {
5554
+ idx = _i;
5555
+ break;
5556
+ }
5557
+ _tmp = _i + 1 | 0;
5558
+ continue;
5559
+ } else {
5560
+ break;
5561
+ }
5562
+ }
5563
+ if (idx >= 0 && idx < ctx.active_tabs.length) {
5564
+ _M0MP311moonbitlang4core5array5Array6removeGsE(ctx.active_tabs, idx);
5565
+ return;
5566
+ } else {
5567
+ return;
5568
+ }
5569
+ }
5570
+ function _M0FP36kazuph5reviw6server22cancel__pending__close(ctx) {
5571
+ if (!_M0FP36kazuph5reviw6server15js__is__nullish(ctx.pending_close_timer)) {
5572
+ _M0FP36kazuph5reviw6server14clear__timeout(ctx.pending_close_timer);
5573
+ ctx.pending_close_timer = _M0FP36kazuph5reviw6server8js__null();
5574
+ return;
5575
+ } else {
5576
+ return;
5577
+ }
5578
+ }
5296
5579
  function _M0FP36kazuph5reviw6server22write__file__sync__buf(_tmp, _tmp$2) {
5297
- return writeFileSync$2019(_tmp, _tmp$2);
5580
+ return writeFileSync$2159(_tmp, _tmp$2);
5298
5581
  }
5299
5582
  function _M0FP36kazuph5reviw6server16base64__to__file(data, dir, index) {
5300
5583
  const ext = _M0FP36kazuph5reviw6server20extract__base64__ext(data);
@@ -5328,7 +5611,7 @@ function _M0FP36kazuph5reviw6server20ensure__history__dir() {
5328
5611
  }
5329
5612
  }
5330
5613
  function _M0FP36kazuph5reviw6server20crypto__create__hash(_tmp) {
5331
- return createHash$2066(_tmp);
5614
+ return createHash$2206(_tmp);
5332
5615
  }
5333
5616
  function _M0FP36kazuph5reviw6server14crypto__sha256(s) {
5334
5617
  return _M0FP36kazuph5reviw6server27hash__update__digest__hex16(_M0FP36kazuph5reviw6server20crypto__create__hash("sha256"), s);
@@ -5387,9 +5670,14 @@ function _M0FP36kazuph5reviw6server13save__history(file_path, entry_json) {
5387
5670
  _M0FP36kazuph5reviw6server11chmod__sync(hp, 384);
5388
5671
  }
5389
5672
  function _M0FP36kazuph5reviw6server13unwatch__file(_tmp) {
5390
- return unwatchFile$2072(_tmp);
5673
+ return unwatchFile$2212(_tmp);
5391
5674
  }
5392
5675
  function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5676
+ if (ctx.finished) {
5677
+ return undefined;
5678
+ }
5679
+ ctx.finished = true;
5680
+ _M0FP36kazuph5reviw6server22cancel__pending__close(ctx);
5393
5681
  const summary = _M0FP36kazuph5reviw6server19json__parse__string("summary", body);
5394
5682
  const raw_comments = _M0FP36kazuph5reviw6server21json__parse__comments(body);
5395
5683
  const comments = [];
@@ -5409,7 +5697,24 @@ function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5409
5697
  }
5410
5698
  }
5411
5699
  const answers = _M0FP36kazuph5reviw6server19json__parse__string("reviwAnswers", body);
5412
- const result = { file: ctx.filename, mode: ctx.mode, comments: comments, summary: summary, answers: answers };
5700
+ const raw_merr = _M0FP36kazuph5reviw6server28json__parse__mermaid__errors(body);
5701
+ const mermaid_errors = [];
5702
+ const _len$2 = raw_merr.length;
5703
+ let _tmp$2 = 0;
5704
+ while (true) {
5705
+ const _i = _tmp$2;
5706
+ if (_i < _len$2) {
5707
+ const me = raw_merr[_i];
5708
+ if (me.length >= 2) {
5709
+ _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core12MermaidErrorE(mermaid_errors, { line: _M0FP36kazuph5reviw4core16parse__int__safe(_M0MP311moonbitlang4core5array5Array2atGsE(me, 0)), message: _M0MP311moonbitlang4core5array5Array2atGsE(me, 1) });
5710
+ }
5711
+ _tmp$2 = _i + 1 | 0;
5712
+ continue;
5713
+ } else {
5714
+ break;
5715
+ }
5716
+ }
5717
+ const result = { file: ctx.filename, mode: ctx.mode, comments: comments, summary: summary, answers: answers, mermaid_errors: mermaid_errors };
5413
5718
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw4core12ReviewResultE(_M0FP36kazuph5reviw6server12all__results, result);
5414
5719
  if (comments.length > 0 || summary.length > 0) {
5415
5720
  const entry_buf = _M0MP311moonbitlang4core7builtin13StringBuilder11new_2einner(0);
@@ -5426,33 +5731,33 @@ function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5426
5731
  }
5427
5732
  const images = _M0FP36kazuph5reviw6server19json__parse__images(body);
5428
5733
  const output_dir = _M0FP36kazuph5reviw6server10path__join(_M0FP36kazuph5reviw6server11os__homedir(), ".reviw/outputs");
5429
- const _len$2 = images.length;
5430
- let _tmp$2 = 0;
5734
+ const _len$3 = images.length;
5735
+ let _tmp$3 = 0;
5431
5736
  while (true) {
5432
- const _i = _tmp$2;
5433
- if (_i < _len$2) {
5737
+ const _i = _tmp$3;
5738
+ if (_i < _len$3) {
5434
5739
  const img = images[_i];
5435
5740
  if (img.length > 0) {
5436
5741
  _M0FP36kazuph5reviw6server16base64__to__file(img, output_dir, _i);
5437
5742
  }
5438
- _tmp$2 = _i + 1 | 0;
5743
+ _tmp$3 = _i + 1 | 0;
5439
5744
  continue;
5440
5745
  } else {
5441
5746
  break;
5442
5747
  }
5443
5748
  }
5444
5749
  let comment_img_idx = images.length;
5445
- const _len$3 = raw_comments.length;
5446
- let _tmp$3 = 0;
5750
+ const _len$4 = raw_comments.length;
5751
+ let _tmp$4 = 0;
5447
5752
  while (true) {
5448
- const _i = _tmp$3;
5449
- if (_i < _len$3) {
5753
+ const _i = _tmp$4;
5754
+ if (_i < _len$4) {
5450
5755
  const c = raw_comments[_i];
5451
5756
  if (c.length >= 5 && _M0MP311moonbitlang4core5array5Array2atGsE(c, 4).length > 0) {
5452
5757
  _M0FP36kazuph5reviw6server16base64__to__file(_M0MP311moonbitlang4core5array5Array2atGsE(c, 4), output_dir, comment_img_idx);
5453
5758
  comment_img_idx = comment_img_idx + 1 | 0;
5454
5759
  }
5455
- _tmp$3 = _i + 1 | 0;
5760
+ _tmp$4 = _i + 1 | 0;
5456
5761
  continue;
5457
5762
  } else {
5458
5763
  break;
@@ -5462,11 +5767,11 @@ function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5462
5767
  if (_M0FP36kazuph5reviw6server12all__results.length >= _M0FP36kazuph5reviw6server15expected__count.val) {
5463
5768
  const yaml = _M0FP36kazuph5reviw4core17reviews__to__yaml(_M0FP36kazuph5reviw6server12all__results);
5464
5769
  _M0FP36kazuph5reviw6server22process__stdout__write(yaml);
5465
- const _len$4 = _M0FP36kazuph5reviw6server15active__servers.length;
5466
- let _tmp$4 = 0;
5770
+ const _len$5 = _M0FP36kazuph5reviw6server15active__servers.length;
5771
+ let _tmp$5 = 0;
5467
5772
  while (true) {
5468
- const _i = _tmp$4;
5469
- if (_i < _len$4) {
5773
+ const _i = _tmp$5;
5774
+ if (_i < _len$5) {
5470
5775
  const srv = _M0FP36kazuph5reviw6server15active__servers[_i];
5471
5776
  const _p = srv.file_path;
5472
5777
  const _p$2 = "<stdin>";
@@ -5474,7 +5779,7 @@ function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5474
5779
  _M0FP36kazuph5reviw6server13unwatch__file(srv.file_path);
5475
5780
  }
5476
5781
  _M0FP36kazuph5reviw6server12remove__lock(srv.port);
5477
- _tmp$4 = _i + 1 | 0;
5782
+ _tmp$5 = _i + 1 | 0;
5478
5783
  continue;
5479
5784
  } else {
5480
5785
  break;
@@ -5486,8 +5791,95 @@ function _M0FP36kazuph5reviw6server14handle__submit(ctx, body) {
5486
5791
  return;
5487
5792
  }
5488
5793
  }
5794
+ function _M0FP36kazuph5reviw6server23schedule__close__submit(ctx, draft) {
5795
+ if (ctx.finished) {
5796
+ return undefined;
5797
+ }
5798
+ _M0FP36kazuph5reviw6server22cancel__pending__close(ctx);
5799
+ const draft_body = draft.length > 0 ? draft : "{\"summary\":\"\",\"comments\":[]}";
5800
+ ctx.pending_close_timer = _M0FP36kazuph5reviw6server12set__timeout(() => {
5801
+ ctx.pending_close_timer = _M0FP36kazuph5reviw6server8js__null();
5802
+ let _tmp;
5803
+ if (ctx.finished) {
5804
+ _tmp = true;
5805
+ } else {
5806
+ const _p = ctx.active_tabs;
5807
+ _tmp = !(_p.length === 0);
5808
+ }
5809
+ if (_tmp) {
5810
+ return undefined;
5811
+ }
5812
+ _M0FP36kazuph5reviw6server14handle__submit(ctx, draft_body);
5813
+ }, 700);
5814
+ }
5815
+ function _M0FP36kazuph5reviw6server22handle__session__close(ctx, body) {
5816
+ if (ctx.finished) {
5817
+ return undefined;
5818
+ }
5819
+ const tab_id = _M0FP36kazuph5reviw6server19json__parse__string("tabId", body);
5820
+ const instance_id = _M0FP36kazuph5reviw6server19json__parse__string("instanceId", body);
5821
+ const draft = _M0FP36kazuph5reviw6server19json__parse__string("draft", body);
5822
+ if (tab_id.length > 0 && instance_id.length > 0) {
5823
+ const _bind = _M0MP311moonbitlang4core7builtin3Map3getGssE(ctx.active_tab_instances, tab_id);
5824
+ if (_bind === undefined) {
5825
+ } else {
5826
+ const _Some = _bind;
5827
+ const _active_instance = _Some;
5828
+ if (!(_active_instance === instance_id)) {
5829
+ return undefined;
5830
+ }
5831
+ }
5832
+ }
5833
+ _M0MP311moonbitlang4core7builtin3Map6removeGssE(ctx.active_tab_instances, tab_id);
5834
+ _M0FP36kazuph5reviw6server19remove__active__tab(ctx, tab_id);
5835
+ const _p = ctx.active_tabs;
5836
+ if (_p.length === 0) {
5837
+ _M0FP36kazuph5reviw6server23schedule__close__submit(ctx, draft);
5838
+ return;
5839
+ } else {
5840
+ return;
5841
+ }
5842
+ }
5843
+ function _M0FP36kazuph5reviw6server16has__active__tab(ctx, tab_id) {
5844
+ const _arr = ctx.active_tabs;
5845
+ const _len = _arr.length;
5846
+ let _tmp = 0;
5847
+ while (true) {
5848
+ const _i = _tmp;
5849
+ if (_i < _len) {
5850
+ const existing = _arr[_i];
5851
+ if (existing === tab_id) {
5852
+ return true;
5853
+ }
5854
+ _tmp = _i + 1 | 0;
5855
+ continue;
5856
+ } else {
5857
+ break;
5858
+ }
5859
+ }
5860
+ return false;
5861
+ }
5862
+ function _M0FP36kazuph5reviw6server16add__active__tab(ctx, tab_id) {
5863
+ if (tab_id.length === 0 || _M0FP36kazuph5reviw6server16has__active__tab(ctx, tab_id)) {
5864
+ return undefined;
5865
+ }
5866
+ _M0MP311moonbitlang4core5array5Array4pushGsE(ctx.active_tabs, tab_id);
5867
+ }
5868
+ function _M0FP36kazuph5reviw6server21handle__session__open(ctx, body) {
5869
+ if (ctx.finished) {
5870
+ return undefined;
5871
+ }
5872
+ const tab_id = _M0FP36kazuph5reviw6server19json__parse__string("tabId", body);
5873
+ const instance_id = _M0FP36kazuph5reviw6server19json__parse__string("instanceId", body);
5874
+ if (tab_id.length === 0 || instance_id.length === 0) {
5875
+ return undefined;
5876
+ }
5877
+ _M0FP36kazuph5reviw6server22cancel__pending__close(ctx);
5878
+ _M0FP36kazuph5reviw6server16add__active__tab(ctx, tab_id);
5879
+ _M0MP311moonbitlang4core7builtin3Map3setGssE(ctx.active_tab_instances, tab_id, instance_id);
5880
+ }
5489
5881
  function _M0FP36kazuph5reviw6server17child__exec__sync(_tmp, _tmp$2) {
5490
- return execSync$2079(_tmp, _tmp$2);
5882
+ return execSync$2224(_tmp, _tmp$2);
5491
5883
  }
5492
5884
  function _M0FP36kazuph5reviw6server15command__exists(cmd) {
5493
5885
  return _M0FP36kazuph5reviw6server15try__call__bool(() => {
@@ -5540,10 +5932,10 @@ function _M0FP36kazuph5reviw6server19json__encode__value(s) {
5540
5932
  return buf.val;
5541
5933
  }
5542
5934
  function _M0FP36kazuph5reviw6server17fs__mkdtemp__sync(_tmp) {
5543
- return mkdtempSync$2083(_tmp);
5935
+ return mkdtempSync$2228(_tmp);
5544
5936
  }
5545
5937
  function _M0FP36kazuph5reviw6server10os__tmpdir() {
5546
- return tmpdir$2084();
5938
+ return tmpdir$2229();
5547
5939
  }
5548
5940
  function _M0FP36kazuph5reviw6server15make__temp__dir() {
5549
5941
  return _M0FP36kazuph5reviw6server17fs__mkdtemp__sync(`${_M0FP36kazuph5reviw6server10os__tmpdir()}/reviw-`);
@@ -5552,13 +5944,13 @@ function _M0FP36kazuph5reviw6server18read__file__base64(path) {
5552
5944
  return _M0FP36kazuph5reviw6server17try__call__string(() => _M0FP36kazuph5reviw6server15buf__to__base64(_M0FP36kazuph5reviw6server18read__file__buffer(path)), "");
5553
5945
  }
5554
5946
  function _M0FP36kazuph5reviw6server22fs__readdir__sync__raw(_tmp) {
5555
- return readdirSync$2094(_tmp);
5947
+ return readdirSync$2239(_tmp);
5556
5948
  }
5557
5949
  function _M0FP36kazuph5reviw6server13readdir__sync(path) {
5558
5950
  return _M0FP36kazuph5reviw6server24try__call__array__string(() => _M0FP36kazuph5reviw6server22fs__readdir__sync__raw(path));
5559
5951
  }
5560
5952
  function _M0FP36kazuph5reviw6server12fs__rm__sync(_tmp, _tmp$2) {
5561
- return rmSync$2103(_tmp, _tmp$2);
5953
+ return rmSync$2248(_tmp, _tmp$2);
5562
5954
  }
5563
5955
  function _M0FP36kazuph5reviw6server18rm__dir__recursive(path) {
5564
5956
  _M0FP36kazuph5reviw6server15try__call__void(() => {
@@ -5566,13 +5958,13 @@ function _M0FP36kazuph5reviw6server18rm__dir__recursive(path) {
5566
5958
  });
5567
5959
  }
5568
5960
  function _M0FP36kazuph5reviw6server12child__spawn(_tmp, _tmp$2, _tmp$3) {
5569
- return spawn$2109(_tmp, _tmp$2, _tmp$3);
5961
+ return spawn$2254(_tmp, _tmp$2, _tmp$3);
5570
5962
  }
5571
5963
  function _M0FP36kazuph5reviw6server12spawn__async(cmd, args_json) {
5572
5964
  return _M0FP36kazuph5reviw6server12child__spawn(cmd, _M0FP36kazuph5reviw6server15js__parse__json(args_json), _M0FP36kazuph5reviw6server21js__spawn__opts__pipe());
5573
5965
  }
5574
5966
  function _M0FP36kazuph5reviw6server18child__spawn__sync(_tmp, _tmp$2, _tmp$3) {
5575
- return spawnSync$2114(_tmp, _tmp$2, _tmp$3);
5967
+ return spawnSync$2259(_tmp, _tmp$2, _tmp$3);
5576
5968
  }
5577
5969
  function _M0FP36kazuph5reviw6server19spawn__sync__stdout(cmd, args_json) {
5578
5970
  return _M0FP36kazuph5reviw6server17try__call__string(() => _M0FP36kazuph5reviw6server15js__obj__stdout(_M0FP36kazuph5reviw6server18child__spawn__sync(cmd, _M0FP36kazuph5reviw6server15js__parse__json(args_json), _M0FP36kazuph5reviw6server27js__spawn__opts__utf8__pipe())), "");
@@ -5580,7 +5972,7 @@ function _M0FP36kazuph5reviw6server19spawn__sync__stdout(cmd, args_json) {
5580
5972
  function _M0FP36kazuph5reviw6server23handle__video__timeline(ctx, url, res) {
5581
5973
  const video_path = _M0FP36kazuph5reviw6server19parse__query__param(url, "path");
5582
5974
  const scene_str = _M0FP36kazuph5reviw6server19parse__query__param(url, "scene");
5583
- if (_M0MP311moonbitlang4core6string6String8contains(video_path, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c479, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c479.length })) {
5975
+ if (_M0MP311moonbitlang4core6string6String8contains(video_path, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c539, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c539.length })) {
5584
5976
  _M0FP36kazuph5reviw6server16res__write__head(res, 400, "text/plain");
5585
5977
  _M0FP36kazuph5reviw6server8res__end(res, "Invalid path");
5586
5978
  return undefined;
@@ -5625,7 +6017,7 @@ function _M0FP36kazuph5reviw6server23handle__video__timeline(ctx, url, res) {
5625
6017
  const _i = _tmp;
5626
6018
  if (_i < _len) {
5627
6019
  const file = files[_i];
5628
- if (_M0MP311moonbitlang4core6string6String11has__prefix(file, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c482, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c482.length }) && _M0MP311moonbitlang4core6string6String11has__suffix(file, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c483, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c483.length })) {
6020
+ if (_M0MP311moonbitlang4core6string6String11has__prefix(file, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c542, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c542.length }) && _M0MP311moonbitlang4core6string6String11has__suffix(file, { str: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c543, start: 0, end: _M0FP36kazuph5reviw6server39handle__video__timeline_2e_2abind_7c543.length })) {
5629
6021
  _M0MP311moonbitlang4core5array5Array4pushGsE(scene_files, file);
5630
6022
  }
5631
6023
  _tmp = _i + 1 | 0;
@@ -5786,13 +6178,13 @@ function _M0FP36kazuph5reviw6server9index__of(s, target) {
5786
6178
  return -1;
5787
6179
  }
5788
6180
  function _M0FP36kazuph5reviw6server14fs__stat__sync(_tmp) {
5789
- return statSync$2129(_tmp);
6181
+ return statSync$2274(_tmp);
5790
6182
  }
5791
6183
  function _M0FP36kazuph5reviw6server14is__file__sync(path) {
5792
6184
  return _M0FP36kazuph5reviw6server18js__stat__is__file(_M0FP36kazuph5reviw6server14fs__stat__sync(path));
5793
6185
  }
5794
6186
  function _M0FP36kazuph5reviw6server30fs__create__read__stream__opts(_tmp, _tmp$2) {
5795
- return createReadStream$2133(_tmp, _tmp$2);
6187
+ return createReadStream$2278(_tmp, _tmp$2);
5796
6188
  }
5797
6189
  function _M0FP36kazuph5reviw6server17pipe__file__range(file_path, res, content_type, range_header) {
5798
6190
  const stat = _M0FP36kazuph5reviw6server14fs__stat__sync(file_path);
@@ -5807,7 +6199,7 @@ function _M0FP36kazuph5reviw6server17pipe__file__range(file_path, res, content_t
5807
6199
  _M0FP36kazuph5reviw6server8js__pipe(stream, res);
5808
6200
  }
5809
6201
  function _M0FP36kazuph5reviw6server24fs__create__read__stream(_tmp) {
5810
- return createReadStream$2133(_tmp);
6202
+ return createReadStream$2278(_tmp);
5811
6203
  }
5812
6204
  function _M0FP36kazuph5reviw6server24pipe__file__to__response(file_path, res, content_type) {
5813
6205
  const stat = _M0FP36kazuph5reviw6server14fs__stat__sync(file_path);
@@ -5820,8 +6212,8 @@ function _M0FP36kazuph5reviw6server24pipe__file__to__response(file_path, res, co
5820
6212
  function _M0FP36kazuph5reviw6server19serve__static__file(ctx, url, req, res) {
5821
6213
  const qmark = _M0FP36kazuph5reviw6server9index__of(url, 63);
5822
6214
  const url_path = qmark >= 0 ? _M0FP36kazuph5reviw4core18safe__slice__range(url, 0, qmark) : url;
5823
- const relative_path = _M0MP311moonbitlang4core6string6String11has__prefix(url_path, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c512, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c512.length }) ? _M0FP36kazuph5reviw4core11safe__slice(url_path, 1) : url_path;
5824
- if (_M0MP311moonbitlang4core6string6String8contains(relative_path, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c510, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c510.length })) {
6215
+ const relative_path = _M0MP311moonbitlang4core6string6String11has__prefix(url_path, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c572, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c572.length }) ? _M0FP36kazuph5reviw4core11safe__slice(url_path, 1) : url_path;
6216
+ if (_M0MP311moonbitlang4core6string6String8contains(relative_path, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c570, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c570.length })) {
5825
6217
  _M0FP36kazuph5reviw6server16res__write__head(res, 403, "text/plain");
5826
6218
  _M0FP36kazuph5reviw6server8res__end(res, "Forbidden");
5827
6219
  return undefined;
@@ -5838,7 +6230,7 @@ function _M0FP36kazuph5reviw6server19serve__static__file(ctx, url, req, res) {
5838
6230
  if (_M0FP36kazuph5reviw6server12exists__sync(resolved_static) && _M0FP36kazuph5reviw6server14is__file__sync(resolved_static)) {
5839
6231
  const ext = _M0MP311moonbitlang4core6string6String9to__lower(_M0FP36kazuph5reviw6server13path__extname(resolved_static));
5840
6232
  const content_type = _M0FP36kazuph5reviw6server15get__mime__type(ext);
5841
- const is_video = _M0MP311moonbitlang4core6string6String11has__prefix(content_type, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c511, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c511.length });
6233
+ const is_video = _M0MP311moonbitlang4core6string6String11has__prefix(content_type, { str: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c571, start: 0, end: _M0FP36kazuph5reviw6server35serve__static__file_2e_2abind_7c571.length });
5842
6234
  const range = _M0FP36kazuph5reviw6server18req__range__header(req);
5843
6235
  if (is_video && range.length > 0) {
5844
6236
  _M0FP36kazuph5reviw6server17pipe__file__range(resolved_static, res, content_type, range);
@@ -5856,8 +6248,8 @@ function _M0FP36kazuph5reviw6server19serve__static__file(ctx, url, req, res) {
5856
6248
  function _M0FP36kazuph5reviw6server25serve__static__file__head(ctx, url, res) {
5857
6249
  const qmark = _M0FP36kazuph5reviw6server9index__of(url, 63);
5858
6250
  const url_path = qmark >= 0 ? _M0FP36kazuph5reviw4core18safe__slice__range(url, 0, qmark) : url;
5859
- const relative_path = _M0MP311moonbitlang4core6string6String11has__prefix(url_path, { str: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c514, start: 0, end: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c514.length }) ? _M0FP36kazuph5reviw4core11safe__slice(url_path, 1) : url_path;
5860
- if (_M0MP311moonbitlang4core6string6String8contains(relative_path, { str: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c513, start: 0, end: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c513.length })) {
6251
+ const relative_path = _M0MP311moonbitlang4core6string6String11has__prefix(url_path, { str: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c574, start: 0, end: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c574.length }) ? _M0FP36kazuph5reviw4core11safe__slice(url_path, 1) : url_path;
6252
+ if (_M0MP311moonbitlang4core6string6String8contains(relative_path, { str: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c573, start: 0, end: _M0FP36kazuph5reviw6server41serve__static__file__head_2e_2abind_7c573.length })) {
5861
6253
  _M0FP36kazuph5reviw6server16res__write__head(res, 403, "text/plain");
5862
6254
  _M0FP36kazuph5reviw6server8res__end(res, "");
5863
6255
  return undefined;
@@ -5918,54 +6310,72 @@ function _M0FP36kazuph5reviw6server15handle__request(ctx, req, res) {
5918
6310
  _M0FP36kazuph5reviw6server8res__end(res, history_json);
5919
6311
  return;
5920
6312
  } else {
5921
- if (http_method === "GET" && _M0MP311moonbitlang4core6string6String11has__prefix(url, { str: _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c515, start: 0, end: _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c515.length })) {
6313
+ if (http_method === "GET" && _M0MP311moonbitlang4core6string6String11has__prefix(url, { str: _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c575, start: 0, end: _M0FP36kazuph5reviw6server31handle__request_2e_2abind_7c575.length })) {
5922
6314
  _M0FP36kazuph5reviw6server23handle__video__timeline(ctx, url, res);
5923
6315
  return;
5924
6316
  } else {
5925
- if (http_method === "POST" && url === "/exit") {
6317
+ if (http_method === "POST" && url === "/session/open") {
5926
6318
  _M0FP36kazuph5reviw6server10read__body(req, (body) => {
5927
- _M0FP36kazuph5reviw6server14handle__submit(ctx, body);
6319
+ _M0FP36kazuph5reviw6server21handle__session__open(ctx, body);
5928
6320
  _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
5929
6321
  _M0FP36kazuph5reviw6server8res__end(res, "{\"ok\":true}");
5930
6322
  });
5931
6323
  return;
5932
6324
  } else {
5933
- if (http_method === "HEAD") {
5934
- if (url === "/" || url === "/index.html") {
5935
- _M0FP36kazuph5reviw6server16res__write__head(res, 200, "text/html; charset=utf-8");
5936
- _M0FP36kazuph5reviw6server8res__end(res, "");
6325
+ if (http_method === "POST" && url === "/close") {
6326
+ _M0FP36kazuph5reviw6server10read__body(req, (body) => {
6327
+ _M0FP36kazuph5reviw6server22handle__session__close(ctx, body);
6328
+ _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
6329
+ _M0FP36kazuph5reviw6server8res__end(res, "{\"ok\":true}");
6330
+ });
6331
+ return;
6332
+ } else {
6333
+ if (http_method === "POST" && url === "/exit") {
6334
+ _M0FP36kazuph5reviw6server10read__body(req, (body) => {
6335
+ _M0FP36kazuph5reviw6server14handle__submit(ctx, body);
6336
+ _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
6337
+ _M0FP36kazuph5reviw6server8res__end(res, "{\"ok\":true}");
6338
+ });
5937
6339
  return;
5938
6340
  } else {
5939
- if (url === "/healthz") {
5940
- _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
5941
- _M0FP36kazuph5reviw6server8res__end(res, "");
5942
- return;
5943
- } else {
5944
- if (url === "/ui.js") {
5945
- _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/javascript; charset=utf-8");
6341
+ if (http_method === "HEAD") {
6342
+ if (url === "/" || url === "/index.html") {
6343
+ _M0FP36kazuph5reviw6server16res__write__head(res, 200, "text/html; charset=utf-8");
5946
6344
  _M0FP36kazuph5reviw6server8res__end(res, "");
5947
6345
  return;
5948
6346
  } else {
5949
- if (url === "/history") {
6347
+ if (url === "/healthz") {
5950
6348
  _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
5951
6349
  _M0FP36kazuph5reviw6server8res__end(res, "");
5952
6350
  return;
5953
6351
  } else {
5954
- _M0FP36kazuph5reviw6server25serve__static__file__head(ctx, url, res);
5955
- return;
6352
+ if (url === "/ui.js") {
6353
+ _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/javascript; charset=utf-8");
6354
+ _M0FP36kazuph5reviw6server8res__end(res, "");
6355
+ return;
6356
+ } else {
6357
+ if (url === "/history") {
6358
+ _M0FP36kazuph5reviw6server16res__write__head(res, 200, "application/json");
6359
+ _M0FP36kazuph5reviw6server8res__end(res, "");
6360
+ return;
6361
+ } else {
6362
+ _M0FP36kazuph5reviw6server25serve__static__file__head(ctx, url, res);
6363
+ return;
6364
+ }
6365
+ }
5956
6366
  }
5957
6367
  }
6368
+ } else {
6369
+ if (http_method === "GET") {
6370
+ _M0FP36kazuph5reviw6server19serve__static__file(ctx, url, req, res);
6371
+ return;
6372
+ } else {
6373
+ _M0FP36kazuph5reviw6server16res__write__head(res, 404, "text/plain");
6374
+ _M0FP36kazuph5reviw6server8res__end(res, "Not Found");
6375
+ return;
6376
+ }
5958
6377
  }
5959
6378
  }
5960
- } else {
5961
- if (http_method === "GET") {
5962
- _M0FP36kazuph5reviw6server19serve__static__file(ctx, url, req, res);
5963
- return;
5964
- } else {
5965
- _M0FP36kazuph5reviw6server16res__write__head(res, 404, "text/plain");
5966
- _M0FP36kazuph5reviw6server8res__end(res, "Not Found");
5967
- return;
5968
- }
5969
6379
  }
5970
6380
  }
5971
6381
  }
@@ -5989,13 +6399,13 @@ function _M0FP36kazuph5reviw6server28try__activate__existing__tab(url) {
5989
6399
  }
5990
6400
  const chrome_script = `set found to false\ntell application \"System Events\"\n if exists process \"Google Chrome\" then\n tell application \"Google Chrome\"\n set targetUrl to \"${url}\"\n repeat with w in windows\n set tabIndex to 1\n repeat with t in tabs of w\n if URL of t starts with targetUrl then\n set active tab index of w to tabIndex\n set index of w to 1\n activate\n set found to true\n exit repeat\n end if\n set tabIndex to tabIndex + 1\n end repeat\n if found then exit repeat\n end repeat\n end tell\n end if\nend tell\nfound`;
5991
6401
  const chrome_result = _M0FP36kazuph5reviw6server19spawn__sync__result("osascript", `[\"-e\", ${_M0FP36kazuph5reviw6server19json__encode__value(chrome_script)}]`);
5992
- if (_M0MP311moonbitlang4core6string6String8contains(chrome_result, { str: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c516, start: 0, end: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c516.length })) {
6402
+ if (_M0MP311moonbitlang4core6string6String8contains(chrome_result, { str: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c576, start: 0, end: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c576.length })) {
5993
6403
  _M0FP36kazuph5reviw6server12console__log(`Activated existing Chrome tab: ${url}`);
5994
6404
  return true;
5995
6405
  }
5996
6406
  const safari_script = `set found to false\ntell application \"System Events\"\n if exists process \"Safari\" then\n tell application \"Safari\"\n set targetUrl to \"${url}\"\n repeat with w in windows\n repeat with t in tabs of w\n if URL of t starts with targetUrl then\n set current tab of w to t\n set index of w to 1\n activate\n set found to true\n exit repeat\n end if\n end repeat\n if found then exit repeat\n end repeat\n end tell\n end if\nend tell\nfound`;
5997
6407
  const safari_result = _M0FP36kazuph5reviw6server19spawn__sync__result("osascript", `[\"-e\", ${_M0FP36kazuph5reviw6server19json__encode__value(safari_script)}]`);
5998
- if (_M0MP311moonbitlang4core6string6String8contains(safari_result, { str: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c517, start: 0, end: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c517.length })) {
6408
+ if (_M0MP311moonbitlang4core6string6String8contains(safari_result, { str: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c577, start: 0, end: _M0FP36kazuph5reviw6server44try__activate__existing__tab_2e_2abind_7c577.length })) {
5999
6409
  _M0FP36kazuph5reviw6server12console__log(`Activated existing Safari tab: ${url}`);
6000
6410
  return true;
6001
6411
  }
@@ -6038,10 +6448,12 @@ function _M0FP36kazuph5reviw6server11try__listen(ctx, port, attempt, no_open) {
6038
6448
  return;
6039
6449
  }
6040
6450
  });
6041
- _M0FP36kazuph5reviw6server14server__listen(server, port, () => {
6451
+ const host = _M0FP36kazuph5reviw6server10bind__host.val;
6452
+ _M0FP36kazuph5reviw6server14server__listen(server, port, host, () => {
6042
6453
  ctx.port = port;
6043
6454
  _M0FP36kazuph5reviw6server11write__lock(port);
6044
- const url = `http://127.0.0.1:${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(port)}`;
6455
+ const display_host = host === "0.0.0.0" ? "127.0.0.1" : host;
6456
+ const url = `http://${display_host}:${_M0IP016_24default__implP311moonbitlang4core7builtin4Show10to__stringGiE(port)}`;
6045
6457
  _M0FP36kazuph5reviw6server12console__log(`reviw serving ${ctx.filename} at ${url}`);
6046
6458
  if (!no_open) {
6047
6459
  _M0FP36kazuph5reviw6server13open__browser(url);
@@ -6071,13 +6483,16 @@ function _M0FP36kazuph5reviw6server19start__http__server(ctx, no_open) {
6071
6483
  _M0FP36kazuph5reviw6server11try__listen(ctx, ctx.port, 0, no_open);
6072
6484
  }
6073
6485
  function _M0FP36kazuph5reviw6server11watch__file(_tmp, _tmp$2) {
6074
- return watchFile$2169(_tmp, _tmp$2);
6486
+ return watchFile$2315(_tmp, _tmp$2);
6075
6487
  }
6076
6488
  function _M0FP36kazuph5reviw6server19start__file__server(file_path, port, no_open) {
6077
6489
  const resolved = _M0FP36kazuph5reviw6server13path__resolve(file_path);
6078
6490
  const filename = _M0FP36kazuph5reviw6server14path__basename(resolved);
6079
6491
  const mode = _M0FP36kazuph5reviw6server12detect__mode(resolved);
6080
- const ctx = { file_path: resolved, filename: filename, mode: mode, port: port, html_cache: "", sse_clients: [] };
6492
+ const _tmp = [];
6493
+ const _tmp$2 = [];
6494
+ const _bind = [];
6495
+ const ctx = { file_path: resolved, filename: filename, mode: mode, port: port, html_cache: "", sse_clients: _tmp, active_tabs: _tmp$2, active_tab_instances: _M0MP311moonbitlang4core7builtin3Map11from__arrayGssE({ buf: _bind, start: 0, end: 0 }), pending_close_timer: _M0FP36kazuph5reviw6server8js__null(), finished: false };
6081
6496
  ctx.html_cache = _M0FP36kazuph5reviw6server22load__and__build__html(ctx);
6082
6497
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw6server13ServerContextE(_M0FP36kazuph5reviw6server15active__servers, ctx);
6083
6498
  const _p = ctx.file_path;
@@ -6087,13 +6502,13 @@ function _M0FP36kazuph5reviw6server19start__file__server(file_path, port, no_ope
6087
6502
  _M0FP36kazuph5reviw6server11watch__file(resolved, (_curr, _prev) => {
6088
6503
  ctx.html_cache = _M0FP36kazuph5reviw6server22load__and__build__html(ctx);
6089
6504
  const _len = clients.length;
6090
- let _tmp = 0;
6505
+ let _tmp$3 = 0;
6091
6506
  while (true) {
6092
- const _i = _tmp;
6507
+ const _i = _tmp$3;
6093
6508
  if (_i < _len) {
6094
6509
  const client = clients[_i];
6095
6510
  _M0FP36kazuph5reviw6server9sse__send(client, "reload", "");
6096
- _tmp = _i + 1 | 0;
6511
+ _tmp$3 = _i + 1 | 0;
6097
6512
  continue;
6098
6513
  } else {
6099
6514
  return;
@@ -6106,7 +6521,10 @@ function _M0FP36kazuph5reviw6server19start__file__server(file_path, port, no_ope
6106
6521
  function _M0FP36kazuph5reviw6server20start__stdin__server(content, port, no_open) {
6107
6522
  const data = _M0FP36kazuph5reviw4core11parse__diff(content);
6108
6523
  const html = _M0FP36kazuph5reviw4core17build__diff__html(data, "stdin", port);
6109
- const ctx = { file_path: "<stdin>", filename: "stdin", mode: 3, port: port, html_cache: html, sse_clients: [] };
6524
+ const _tmp = [];
6525
+ const _tmp$2 = [];
6526
+ const _bind = [];
6527
+ const ctx = { file_path: "<stdin>", filename: "stdin", mode: 3, port: port, html_cache: html, sse_clients: _tmp, active_tabs: _tmp$2, active_tab_instances: _M0MP311moonbitlang4core7builtin3Map11from__arrayGssE({ buf: _bind, start: 0, end: 0 }), pending_close_timer: _M0FP36kazuph5reviw6server8js__null(), finished: false };
6110
6528
  _M0MP311moonbitlang4core5array5Array4pushGRP36kazuph5reviw6server13ServerContextE(_M0FP36kazuph5reviw6server15active__servers, ctx);
6111
6529
  _M0FP36kazuph5reviw6server15expected__count.val = 1;
6112
6530
  _M0FP36kazuph5reviw6server19start__http__server(ctx, no_open);
@@ -6114,11 +6532,11 @@ function _M0FP36kazuph5reviw6server20start__stdin__server(content, port, no_open
6114
6532
  (() => {
6115
6533
  const argv = _M0FP36kazuph5reviw6server9get__argv();
6116
6534
  const args = [];
6117
- const _end406 = argv.length;
6535
+ const _end453 = argv.length;
6118
6536
  let _tmp = 2;
6119
6537
  while (true) {
6120
6538
  const i = _tmp;
6121
- if (i < _end406) {
6539
+ if (i < _end453) {
6122
6540
  _M0MP311moonbitlang4core5array5Array4pushGsE(args, _M0MP311moonbitlang4core5array5Array2atGsE(argv, i));
6123
6541
  _tmp = i + 1 | 0;
6124
6542
  continue;
@@ -6151,14 +6569,21 @@ function _M0FP36kazuph5reviw6server20start__stdin__server(content, port, no_open
6151
6569
  if (arg === "--no-open") {
6152
6570
  no_open = true;
6153
6571
  } else {
6154
- if (arg === "--encoding" || arg === "-e") {
6572
+ if (arg === "--host") {
6155
6573
  i = i + 1 | 0;
6156
6574
  if (i < args.length) {
6157
- _M0FP36kazuph5reviw6server18encoding__override.val = _M0MP311moonbitlang4core5array5Array2atGsE(args, i);
6575
+ _M0FP36kazuph5reviw6server10bind__host.val = _M0MP311moonbitlang4core5array5Array2atGsE(args, i);
6158
6576
  }
6159
6577
  } else {
6160
- if (!_M0MP311moonbitlang4core6string6String11has__prefix(arg, { str: _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c527, start: 0, end: _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c527.length })) {
6161
- _M0MP311moonbitlang4core5array5Array4pushGsE(files, arg);
6578
+ if (arg === "--encoding" || arg === "-e") {
6579
+ i = i + 1 | 0;
6580
+ if (i < args.length) {
6581
+ _M0FP36kazuph5reviw6server18encoding__override.val = _M0MP311moonbitlang4core5array5Array2atGsE(args, i);
6582
+ }
6583
+ } else {
6584
+ if (!_M0MP311moonbitlang4core6string6String11has__prefix(arg, { str: _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c589, start: 0, end: _M0FP36kazuph5reviw6server26_2ainit_2a_2e_2abind_7c589.length })) {
6585
+ _M0MP311moonbitlang4core5array5Array4pushGsE(files, arg);
6586
+ }
6162
6587
  }
6163
6588
  }
6164
6589
  }