@bojackduy/opencode-learn 0.1.6 → 1.0.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.
package/dist/tui.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  // plugins/learn-tui.tsx
3
- import { use as _$use } from "@opentui/solid";
4
3
  import { createComponent as _$createComponent } from "@opentui/solid";
5
4
  import { effect as _$effect } from "@opentui/solid";
5
+ import { use as _$use } from "@opentui/solid";
6
6
  import { createTextNode as _$createTextNode } from "@opentui/solid";
7
7
  import { insertNode as _$insertNode } from "@opentui/solid";
8
8
  import { insert as _$insert } from "@opentui/solid";
@@ -14,7 +14,214 @@ import { useKeyboard, useTerminalDimensions } from "@opentui/solid";
14
14
  import * as fs from "fs";
15
15
  import * as path from "path";
16
16
  import { watch } from "fs";
17
+ import { SyntaxStyle } from "@opentui/core";
17
18
  import { tmpdir } from "os";
19
+ function syntaxStyle(theme) {
20
+ return SyntaxStyle.fromTheme([{
21
+ scope: ["default"],
22
+ style: {
23
+ foreground: theme.text
24
+ }
25
+ }, {
26
+ scope: ["comment", "comment.documentation"],
27
+ style: {
28
+ foreground: theme.syntaxComment,
29
+ italic: true
30
+ }
31
+ }, {
32
+ scope: ["string", "symbol", "character", "character.special"],
33
+ style: {
34
+ foreground: theme.syntaxString
35
+ }
36
+ }, {
37
+ scope: ["number", "boolean", "float", "constant"],
38
+ style: {
39
+ foreground: theme.syntaxNumber
40
+ }
41
+ }, {
42
+ scope: ["keyword.return", "keyword.conditional", "keyword.repeat", "keyword.coroutine", "keyword", "keyword.directive", "keyword.modifier", "keyword.exception"],
43
+ style: {
44
+ foreground: theme.syntaxKeyword,
45
+ italic: true
46
+ }
47
+ }, {
48
+ scope: ["keyword.type"],
49
+ style: {
50
+ foreground: theme.syntaxType,
51
+ bold: true,
52
+ italic: true
53
+ }
54
+ }, {
55
+ scope: ["keyword.import", "keyword.export", "tag.attribute"],
56
+ style: {
57
+ foreground: theme.syntaxKeyword
58
+ }
59
+ }, {
60
+ scope: ["keyword.function", "function.method", "variable.member", "function", "constructor"],
61
+ style: {
62
+ foreground: theme.syntaxFunction
63
+ }
64
+ }, {
65
+ scope: ["operator", "keyword.operator", "punctuation.delimiter", "keyword.conditional.ternary", "punctuation.special", "tag.delimiter"],
66
+ style: {
67
+ foreground: theme.syntaxOperator
68
+ }
69
+ }, {
70
+ scope: ["variable", "variable.parameter", "function.method.call", "function.call", "property", "parameter", "field"],
71
+ style: {
72
+ foreground: theme.syntaxVariable
73
+ }
74
+ }, {
75
+ scope: ["type", "module", "class", "namespace"],
76
+ style: {
77
+ foreground: theme.syntaxType
78
+ }
79
+ }, {
80
+ scope: ["punctuation", "punctuation.bracket"],
81
+ style: {
82
+ foreground: theme.syntaxPunctuation
83
+ }
84
+ }, {
85
+ scope: ["variable.builtin", "type.builtin", "function.builtin", "module.builtin", "constant.builtin", "variable.super", "tag"],
86
+ style: {
87
+ foreground: theme.error
88
+ }
89
+ }, {
90
+ scope: ["string.escape", "string.regexp"],
91
+ style: {
92
+ foreground: theme.syntaxKeyword
93
+ }
94
+ }, {
95
+ scope: ["markup.heading"],
96
+ style: {
97
+ foreground: theme.markdownHeading,
98
+ bold: true
99
+ }
100
+ }, {
101
+ scope: ["markup.heading.1"],
102
+ style: {
103
+ foreground: theme.markdownHeading,
104
+ bold: true,
105
+ underline: true
106
+ }
107
+ }, {
108
+ scope: ["markup.bold", "markup.strong"],
109
+ style: {
110
+ foreground: theme.markdownStrong,
111
+ bold: true
112
+ }
113
+ }, {
114
+ scope: ["markup.italic"],
115
+ style: {
116
+ foreground: theme.markdownEmph,
117
+ italic: true
118
+ }
119
+ }, {
120
+ scope: ["markup.list"],
121
+ style: {
122
+ foreground: theme.markdownListItem
123
+ }
124
+ }, {
125
+ scope: ["markup.quote"],
126
+ style: {
127
+ foreground: theme.markdownBlockQuote,
128
+ italic: true
129
+ }
130
+ }, {
131
+ scope: ["markup.raw", "markup.raw.block"],
132
+ style: {
133
+ foreground: theme.markdownCode
134
+ }
135
+ }, {
136
+ scope: ["markup.raw.inline"],
137
+ style: {
138
+ foreground: theme.markdownCode,
139
+ background: theme.background
140
+ }
141
+ }, {
142
+ scope: ["markup.link", "markup.link.url", "string.special", "string.special.url"],
143
+ style: {
144
+ foreground: theme.markdownLink,
145
+ underline: true
146
+ }
147
+ }, {
148
+ scope: ["markup.link.label", "label"],
149
+ style: {
150
+ foreground: theme.markdownLinkText,
151
+ underline: true
152
+ }
153
+ }, {
154
+ scope: ["spell", "nospell", "markup.underline"],
155
+ style: {
156
+ foreground: theme.text
157
+ }
158
+ }, {
159
+ scope: ["conceal", "markup.strikethrough", "markup.list.unchecked", "debug"],
160
+ style: {
161
+ foreground: theme.textMuted
162
+ }
163
+ }, {
164
+ scope: ["comment.error", "error"],
165
+ style: {
166
+ foreground: theme.error,
167
+ italic: true,
168
+ bold: true
169
+ }
170
+ }, {
171
+ scope: ["comment.warning", "warning"],
172
+ style: {
173
+ foreground: theme.warning,
174
+ italic: true,
175
+ bold: true
176
+ }
177
+ }, {
178
+ scope: ["comment.todo", "comment.note"],
179
+ style: {
180
+ foreground: theme.info,
181
+ italic: true,
182
+ bold: true
183
+ }
184
+ }, {
185
+ scope: ["type.definition"],
186
+ style: {
187
+ foreground: theme.syntaxType,
188
+ bold: true
189
+ }
190
+ }, {
191
+ scope: ["attribute", "annotation"],
192
+ style: {
193
+ foreground: theme.warning
194
+ }
195
+ }, {
196
+ scope: ["markup.list.checked"],
197
+ style: {
198
+ foreground: theme.success
199
+ }
200
+ }, {
201
+ scope: ["diff.plus"],
202
+ style: {
203
+ foreground: theme.diffAdded,
204
+ background: theme.diffAddedBg
205
+ }
206
+ }, {
207
+ scope: ["diff.minus"],
208
+ style: {
209
+ foreground: theme.diffRemoved,
210
+ background: theme.diffRemovedBg
211
+ }
212
+ }, {
213
+ scope: ["diff.delta"],
214
+ style: {
215
+ foreground: theme.diffContext,
216
+ background: theme.diffContextBg
217
+ }
218
+ }, {
219
+ scope: ["info"],
220
+ style: {
221
+ foreground: theme.info
222
+ }
223
+ }]);
224
+ }
18
225
  var PENDING_DIR = ".opencode/learn-pending";
19
226
  var TUI_LOG = path.join(tmpdir(), "learn-tui.log");
20
227
  function tlog(...a) {
@@ -30,6 +237,18 @@ function ensureDir(dir) {
30
237
  });
31
238
  } catch {}
32
239
  }
240
+ function decodeQuizText(s) {
241
+ if (!s || typeof s !== "string")
242
+ return s;
243
+ if (!s.includes("\\"))
244
+ return s;
245
+ let out = s.replace(/\\r\\n/g, `
246
+ `).replace(/\\n/g, `
247
+ `).replace(/\\r/g, "\r").replace(/\\t/g, "\t");
248
+ out = out.replace(/\\"/g, '"').replace(/\\'/g, "'");
249
+ out = out.replace(/\\\\/g, "\\");
250
+ return out;
251
+ }
33
252
  function prevent(e) {
34
253
  try {
35
254
  e.preventDefault?.();
@@ -38,6 +257,7 @@ function prevent(e) {
38
257
  }
39
258
  function QuizDialog(props) {
40
259
  const theme = () => props.api.theme.current;
260
+ const syntax = () => syntaxStyle(theme());
41
261
  const dims = useTerminalDimensions();
42
262
  const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 92));
43
263
  const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
@@ -54,6 +274,40 @@ function QuizDialog(props) {
54
274
  const [selected, setSelected] = createSignal(new Map);
55
275
  const [feedback, setFeedback] = createSignal(null);
56
276
  let noteInputEl;
277
+ let scrollRef;
278
+ const [canScrollUp, setCanScrollUp] = createSignal(false);
279
+ const [canScrollDown, setCanScrollDown] = createSignal(false);
280
+ const updateScrollIndicators = () => {
281
+ try {
282
+ if (!scrollRef) {
283
+ setCanScrollUp(false);
284
+ setCanScrollDown(false);
285
+ return;
286
+ }
287
+ const st = typeof scrollRef.scrollTop === "number" ? scrollRef.scrollTop : 0;
288
+ const h = typeof scrollRef.height === "number" ? scrollRef.height : scrollRef.viewportHeight ?? popupHeight();
289
+ const sh = typeof scrollRef.scrollHeight === "number" ? scrollRef.scrollHeight : 0;
290
+ let effectiveSh = sh;
291
+ if (!effectiveSh && typeof scrollRef.getChildren === "function") {
292
+ try {
293
+ const kids = scrollRef.getChildren();
294
+ if (kids?.length)
295
+ effectiveSh = Math.max(...kids.map((c) => (c.y || 0) + (c.height || 0)), h);
296
+ } catch {}
297
+ }
298
+ if (!effectiveSh || effectiveSh <= h + 1) {
299
+ setCanScrollUp(false);
300
+ setCanScrollDown(false);
301
+ return;
302
+ }
303
+ setCanScrollUp(st > 0);
304
+ setCanScrollDown(st + h < effectiveSh - 1);
305
+ } catch {
306
+ setCanScrollUp(false);
307
+ setCanScrollDown(false);
308
+ }
309
+ };
310
+ const scrollAmount = () => Math.max(1, Math.floor((scrollRef?.height ?? popupHeight()) / 3));
57
311
  createEffect(() => {
58
312
  if (focused() === "note" && noteInputEl) {
59
313
  try {
@@ -61,6 +315,23 @@ function QuizDialog(props) {
61
315
  } catch {}
62
316
  }
63
317
  });
318
+ createEffect(() => {
319
+ phase();
320
+ feedback();
321
+ dims();
322
+ setTimeout(updateScrollIndicators, 40);
323
+ setTimeout(updateScrollIndicators, 200);
324
+ });
325
+ createEffect(() => {
326
+ note();
327
+ setTimeout(updateScrollIndicators, 40);
328
+ });
329
+ createEffect(() => {
330
+ if (phase() !== "feedback" && phase() !== "select")
331
+ return;
332
+ const id = setInterval(updateScrollIndicators, 200);
333
+ onCleanup(() => clearInterval(id));
334
+ });
64
335
  const toggleOption = (idx) => {
65
336
  const opt = options()[idx];
66
337
  if (!opt)
@@ -234,15 +505,78 @@ function QuizDialog(props) {
234
505
  note: note().trim() || undefined
235
506
  });
236
507
  };
508
+ const isPlainKey = (evt, want) => {
509
+ try {
510
+ const n = String(evt.name || evt.sequence || "").toLowerCase();
511
+ if (n !== want.toLowerCase())
512
+ return false;
513
+ if (evt.ctrl || evt.meta || evt.option || evt.alt)
514
+ return false;
515
+ return true;
516
+ } catch {
517
+ return false;
518
+ }
519
+ };
237
520
  useKeyboard((evt) => {
238
521
  const key = evt.name || evt.sequence || evt.raw || "";
239
522
  const seq = evt.sequence || "";
523
+ const lower = String(key || "").toLowerCase();
240
524
  if (phase() === "classifying") {
241
525
  prevent(evt);
242
526
  return;
243
527
  }
244
528
  if (phase() === "feedback") {
245
- if (key === "enter" || seq === "\r" || key === "escape" || key === "esc") {
529
+ if (isPlainKey(evt, "d") || seq === "\x04") {
530
+ prevent(evt);
531
+ try {
532
+ scrollRef?.scrollBy(scrollAmount());
533
+ setTimeout(updateScrollIndicators, 30);
534
+ setTimeout(updateScrollIndicators, 120);
535
+ } catch {}
536
+ return;
537
+ }
538
+ if (isPlainKey(evt, "u") || seq === "\x15") {
539
+ prevent(evt);
540
+ try {
541
+ scrollRef?.scrollBy(-scrollAmount());
542
+ setTimeout(updateScrollIndicators, 30);
543
+ setTimeout(updateScrollIndicators, 120);
544
+ } catch {}
545
+ return;
546
+ }
547
+ if (isPlainKey(evt, "j") || seq === "\x1B[B") {
548
+ prevent(evt);
549
+ try {
550
+ scrollRef?.scrollBy(1);
551
+ setTimeout(updateScrollIndicators, 30);
552
+ } catch {}
553
+ return;
554
+ }
555
+ if (isPlainKey(evt, "k") || seq === "\x1B[A") {
556
+ prevent(evt);
557
+ try {
558
+ scrollRef?.scrollBy(-1);
559
+ setTimeout(updateScrollIndicators, 30);
560
+ } catch {}
561
+ return;
562
+ }
563
+ if (key === "pageup" || seq === "\x1B[5~") {
564
+ prevent(evt);
565
+ try {
566
+ scrollRef?.scrollBy(-scrollAmount());
567
+ setTimeout(updateScrollIndicators, 30);
568
+ } catch {}
569
+ return;
570
+ }
571
+ if (key === "pagedown" || seq === "\x1B[6~") {
572
+ prevent(evt);
573
+ try {
574
+ scrollRef?.scrollBy(scrollAmount());
575
+ setTimeout(updateScrollIndicators, 30);
576
+ } catch {}
577
+ return;
578
+ }
579
+ if (lower === "enter" || seq === "\r" || lower === "escape" || lower === "esc") {
246
580
  prevent(evt);
247
581
  confirmFeedback();
248
582
  }
@@ -266,6 +600,40 @@ function QuizDialog(props) {
266
600
  }
267
601
  return;
268
602
  }
603
+ if (phase() === "select" && (isPlainKey(evt, "d") || seq === "\x04")) {
604
+ prevent(evt);
605
+ try {
606
+ scrollRef?.scrollBy(scrollAmount());
607
+ setTimeout(updateScrollIndicators, 30);
608
+ setTimeout(updateScrollIndicators, 120);
609
+ } catch {}
610
+ return;
611
+ }
612
+ if (phase() === "select" && (isPlainKey(evt, "u") || seq === "\x15")) {
613
+ prevent(evt);
614
+ try {
615
+ scrollRef?.scrollBy(-scrollAmount());
616
+ setTimeout(updateScrollIndicators, 30);
617
+ setTimeout(updateScrollIndicators, 120);
618
+ } catch {}
619
+ return;
620
+ }
621
+ if (phase() === "select" && (lower === "pageup" || seq === "\x1B[5~")) {
622
+ prevent(evt);
623
+ try {
624
+ scrollRef?.scrollBy(-scrollAmount());
625
+ setTimeout(updateScrollIndicators, 30);
626
+ } catch {}
627
+ return;
628
+ }
629
+ if (phase() === "select" && (lower === "pagedown" || seq === "\x1B[6~")) {
630
+ prevent(evt);
631
+ try {
632
+ scrollRef?.scrollBy(scrollAmount());
633
+ setTimeout(updateScrollIndicators, 30);
634
+ } catch {}
635
+ return;
636
+ }
269
637
  const maxIdx = () => {
270
638
  if (isMulti())
271
639
  return submitIdx();
@@ -348,10 +716,10 @@ function QuizDialog(props) {
348
716
  }
349
717
  });
350
718
  return (() => {
351
- var _el$ = _$createElement("box"), _el$2 = _$createElement("box"), _el$3 = _$createElement("text"), _el$4 = _$createElement("text"), _el$6 = _$createElement("scrollbox"), _el$7 = _$createElement("box"), _el$8 = _$createElement("text"), _el$62 = _$createElement("box"), _el$63 = _$createElement("text");
719
+ var _el$ = _$createElement("box"), _el$2 = _$createElement("box"), _el$3 = _$createElement("text"), _el$4 = _$createElement("text"), _el$6 = _$createElement("scrollbox"), _el$7 = _$createElement("box"), _el$8 = _$createElement("markdown"), _el$59 = _$createElement("box"), _el$60 = _$createElement("text");
352
720
  _$insertNode(_el$, _el$2);
353
721
  _$insertNode(_el$, _el$6);
354
- _$insertNode(_el$, _el$62);
722
+ _$insertNode(_el$, _el$59);
355
723
  _$setProp(_el$, "flexDirection", "column");
356
724
  _$setProp(_el$, "border", true);
357
725
  _$setProp(_el$, "padding", 1);
@@ -372,6 +740,7 @@ function QuizDialog(props) {
372
740
  _$insertNode(_el$4, _$createTextNode(`learn`));
373
741
  _$setProp(_el$4, "dim", true);
374
742
  _$insertNode(_el$6, _el$7);
743
+ _$use((el) => scrollRef = el, _el$6);
375
744
  _$setProp(_el$6, "flexGrow", 1);
376
745
  _$insertNode(_el$7, _el$8);
377
746
  _$setProp(_el$7, "flexDirection", "column");
@@ -379,18 +748,25 @@ function QuizDialog(props) {
379
748
  _$setProp(_el$7, "paddingLeft", 1);
380
749
  _$setProp(_el$7, "paddingRight", 1);
381
750
  _$setProp(_el$7, "paddingTop", 1);
382
- _$setProp(_el$8, "bold", true);
383
- _$setProp(_el$8, "wrapMode", "wrap");
384
- _$insert(_el$8, () => props.request.question);
385
751
  _$insert(_el$7, _$createComponent(Show, {
386
752
  get when() {
387
753
  return props.request.details;
388
754
  },
389
755
  get children() {
390
- var _el$9 = _$createElement("text");
391
- _$setProp(_el$9, "wrapMode", "wrap");
392
- _$insert(_el$9, () => props.request.details);
393
- _$effect((_$p) => _$setProp(_el$9, "fg", theme().textMuted, _$p));
756
+ var _el$9 = _$createElement("markdown");
757
+ _$effect((_p$) => {
758
+ var _v$ = syntax(), _v$2 = decodeQuizText(props.request.details), _v$3 = theme().textMuted, _v$4 = theme().backgroundPanel;
759
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$9, "syntaxStyle", _v$, _p$.e));
760
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$9, "content", _v$2, _p$.t));
761
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$9, "fg", _v$3, _p$.a));
762
+ _v$4 !== _p$.o && (_p$.o = _$setProp(_el$9, "bg", _v$4, _p$.o));
763
+ return _p$;
764
+ }, {
765
+ e: undefined,
766
+ t: undefined,
767
+ a: undefined,
768
+ o: undefined
769
+ });
394
770
  return _el$9;
395
771
  }
396
772
  }), null);
@@ -399,7 +775,7 @@ function QuizDialog(props) {
399
775
  return phase() === "select";
400
776
  },
401
777
  get children() {
402
- var _el$0 = _$createElement("box"), _el$11 = _$createElement("box"), _el$12 = _$createElement("box"), _el$13 = _$createElement("text"), _el$14 = _$createElement("box"), _el$15 = _$createElement("text"), _el$16 = _$createElement("box"), _el$17 = _$createElement("text"), _el$19 = _$createElement("box"), _el$20 = _$createElement("box"), _el$21 = _$createElement("text"), _el$25 = _$createElement("box"), _el$27 = _$createElement("box"), _el$28 = _$createElement("text");
778
+ var _el$0 = _$createElement("box"), _el$11 = _$createElement("box"), _el$12 = _$createElement("box"), _el$13 = _$createElement("text"), _el$14 = _$createElement("box"), _el$15 = _$createElement("text"), _el$16 = _$createElement("box"), _el$17 = _$createElement("text"), _el$19 = _$createElement("box"), _el$20 = _$createElement("box"), _el$21 = _$createElement("text"), _el$25 = _$createElement("box"), _el$27 = _$createElement("box"), _el$28 = _$createElement("text"), _el$29 = _$createElement("text");
403
779
  _$insertNode(_el$0, _el$11);
404
780
  _$insertNode(_el$0, _el$19);
405
781
  _$insertNode(_el$0, _el$27);
@@ -416,39 +792,39 @@ function QuizDialog(props) {
416
792
  const isFocused = () => focused() === "options" && optionIndex() === idx;
417
793
  const isSelected = () => selected().has(`opt:${idx}`);
418
794
  return (() => {
419
- var _el$64 = _$createElement("box"), _el$65 = _$createElement("box"), _el$66 = _$createElement("text"), _el$67 = _$createElement("box"), _el$68 = _$createElement("text"), _el$69 = _$createElement("box"), _el$70 = _$createElement("text"), _el$71 = _$createTextNode(`. `);
795
+ var _el$61 = _$createElement("box"), _el$62 = _$createElement("box"), _el$63 = _$createElement("text"), _el$64 = _$createElement("box"), _el$65 = _$createElement("text"), _el$66 = _$createElement("box"), _el$67 = _$createElement("text"), _el$68 = _$createTextNode(`. `);
796
+ _$insertNode(_el$61, _el$62);
797
+ _$insertNode(_el$61, _el$64);
798
+ _$insertNode(_el$61, _el$66);
799
+ _$setProp(_el$61, "flexDirection", "row");
800
+ _$setProp(_el$61, "alignItems", "flexStart");
801
+ _$setProp(_el$61, "gap", 1);
802
+ _$setProp(_el$61, "paddingLeft", 1);
803
+ _$setProp(_el$61, "paddingRight", 1);
804
+ _$insertNode(_el$62, _el$63);
805
+ _$setProp(_el$62, "width", 2);
806
+ _$setProp(_el$62, "alignItems", "center");
807
+ _$insert(_el$63, () => isFocused() ? "\u25B8" : " ");
420
808
  _$insertNode(_el$64, _el$65);
421
- _$insertNode(_el$64, _el$67);
422
- _$insertNode(_el$64, _el$69);
423
- _$setProp(_el$64, "flexDirection", "row");
424
- _$setProp(_el$64, "alignItems", "flexStart");
425
- _$setProp(_el$64, "gap", 1);
426
- _$setProp(_el$64, "paddingLeft", 1);
427
- _$setProp(_el$64, "paddingRight", 1);
428
- _$insertNode(_el$65, _el$66);
429
- _$setProp(_el$65, "width", 2);
430
- _$setProp(_el$65, "alignItems", "center");
431
- _$insert(_el$66, () => isFocused() ? "\u25B8" : " ");
432
- _$insertNode(_el$67, _el$68);
433
- _$setProp(_el$67, "width", 2);
434
- _$setProp(_el$67, "alignItems", "center");
435
- _$insert(_el$68, (() => {
809
+ _$setProp(_el$64, "width", 2);
810
+ _$setProp(_el$64, "alignItems", "center");
811
+ _$insert(_el$65, (() => {
436
812
  var _c$4 = _$memo(() => !!isMulti());
437
813
  return () => _c$4() ? isSelected() ? "\u2611" : "\u2610" : isSelected() ? "\u2B22" : "\u25CB";
438
814
  })());
439
- _$insertNode(_el$69, _el$70);
440
- _$setProp(_el$69, "flexGrow", 1);
441
- _$insertNode(_el$70, _el$71);
442
- _$setProp(_el$70, "wrapMode", "wrap");
443
- _$insert(_el$70, idx + 1, _el$71);
444
- _$insert(_el$70, () => opt.label, null);
815
+ _$insertNode(_el$66, _el$67);
816
+ _$setProp(_el$66, "flexGrow", 1);
817
+ _$insertNode(_el$67, _el$68);
818
+ _$setProp(_el$67, "wrapMode", "wrap");
819
+ _$insert(_el$67, idx + 1, _el$68);
820
+ _$insert(_el$67, () => opt.label, null);
445
821
  _$effect((_p$) => {
446
- var _v$38 = isFocused() ? theme().backgroundElement : undefined, _v$39 = isFocused() ? theme().accent : theme().textMuted, _v$40 = isMulti() ? isSelected() ? theme().success : theme().textMuted : isSelected() ? theme().accent : theme().textMuted, _v$41 = isSelected() ? theme().text : theme().textMuted, _v$42 = isFocused();
447
- _v$38 !== _p$.e && (_p$.e = _$setProp(_el$64, "backgroundColor", _v$38, _p$.e));
448
- _v$39 !== _p$.t && (_p$.t = _$setProp(_el$66, "fg", _v$39, _p$.t));
449
- _v$40 !== _p$.a && (_p$.a = _$setProp(_el$68, "fg", _v$40, _p$.a));
450
- _v$41 !== _p$.o && (_p$.o = _$setProp(_el$70, "fg", _v$41, _p$.o));
451
- _v$42 !== _p$.i && (_p$.i = _$setProp(_el$70, "bold", _v$42, _p$.i));
822
+ var _v$50 = isFocused() ? theme().backgroundElement : undefined, _v$51 = isFocused() ? theme().accent : theme().textMuted, _v$52 = isMulti() ? isSelected() ? theme().success : theme().textMuted : isSelected() ? theme().accent : theme().textMuted, _v$53 = isSelected() ? theme().text : theme().textMuted, _v$54 = isFocused();
823
+ _v$50 !== _p$.e && (_p$.e = _$setProp(_el$61, "backgroundColor", _v$50, _p$.e));
824
+ _v$51 !== _p$.t && (_p$.t = _$setProp(_el$63, "fg", _v$51, _p$.t));
825
+ _v$52 !== _p$.a && (_p$.a = _$setProp(_el$65, "fg", _v$52, _p$.a));
826
+ _v$53 !== _p$.o && (_p$.o = _$setProp(_el$67, "fg", _v$53, _p$.o));
827
+ _v$54 !== _p$.i && (_p$.i = _$setProp(_el$67, "bold", _v$54, _p$.i));
452
828
  return _p$;
453
829
  }, {
454
830
  e: undefined,
@@ -457,7 +833,7 @@ function QuizDialog(props) {
457
833
  o: undefined,
458
834
  i: undefined
459
835
  });
460
- return _el$64;
836
+ return _el$61;
461
837
  })();
462
838
  }
463
839
  }), _el$11);
@@ -525,11 +901,11 @@ function QuizDialog(props) {
525
901
  },
526
902
  get fallback() {
527
903
  return (() => {
528
- var _el$72 = _$createElement("text");
529
- _$setProp(_el$72, "wrapMode", "wrap");
530
- _$insert(_el$72, () => note() || "Tab to edit \xB7 share what you were thinking");
531
- _$effect((_$p) => _$setProp(_el$72, "fg", note() ? theme().text : theme().textMuted, _$p));
532
- return _el$72;
904
+ var _el$69 = _$createElement("text");
905
+ _$setProp(_el$69, "wrapMode", "wrap");
906
+ _$insert(_el$69, () => note() || "Tab to edit \xB7 share what you were thinking");
907
+ _$effect((_$p) => _$setProp(_el$69, "fg", note() ? theme().text : theme().textMuted, _$p));
908
+ return _el$69;
533
909
  })();
534
910
  },
535
911
  get children() {
@@ -548,64 +924,42 @@ function QuizDialog(props) {
548
924
  }
549
925
  }));
550
926
  _$insertNode(_el$27, _el$28);
927
+ _$insertNode(_el$27, _el$29);
551
928
  _$setProp(_el$27, "flexDirection", "row");
552
929
  _$setProp(_el$27, "justifyContent", "space-between");
553
930
  _$setProp(_el$27, "paddingTop", 1);
554
- _$insert(_el$28, () => focused() === "note" ? "Enter submit note \u2192 classify \xB7 Tab back \xB7 Esc back" : "\u2191\u2193/j k \xB7 Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Esc cancel");
555
- _$insert(_el$27, _$createComponent(Show, {
556
- get when() {
557
- return isMulti();
558
- },
559
- get children() {
560
- var _el$29 = _$createElement("text"), _el$30 = _$createTextNode(` `);
561
- _$insertNode(_el$29, _el$30);
562
- _$insert(_el$29, (() => {
563
- var _c$2 = _$memo(() => selected().size > 0);
564
- return () => _c$2() ? `${selected().size} selected` : note().trim() ? "note \u2192 classify" : "0 selected";
565
- })(), _el$30);
566
- _$insert(_el$29, () => dontKnow() ? "\xB7 I don't know" : "", null);
567
- _$effect((_$p) => _$setProp(_el$29, "fg", selected().size > 0 || dontKnow() ? theme().success : note().trim() ? theme().warning : theme().warning, _$p));
568
- return _el$29;
569
- }
570
- }), null);
571
- _$insert(_el$27, _$createComponent(Show, {
572
- get when() {
573
- return _$memo(() => !!(!isMulti() && note().trim() && !selected().size))() && !dontKnow();
574
- },
575
- get children() {
576
- var _el$31 = _$createElement("text");
577
- _$insertNode(_el$31, _$createTextNode(`note \u2192 classify on Enter`));
578
- _$effect((_$p) => _$setProp(_el$31, "fg", theme().warning, _$p));
579
- return _el$31;
580
- }
581
- }), null);
931
+ _$insert(_el$28, (() => {
932
+ var _c$2 = _$memo(() => !!isMulti());
933
+ return () => _c$2() ? `${selected().size} selected${dontKnow() ? " \xB7 I don't know" : ""}` : _$memo(() => !!(note().trim() && !selected().size && !dontKnow()))() ? "note \u2192 classify" : dontKnow() ? "I don't know" : "";
934
+ })());
935
+ _$insert(_el$29, () => focused() === "note" ? "Tab/Esc back" : "");
582
936
  _$insert(_el$0, _$createComponent(Show, {
583
937
  get when() {
584
938
  return isMulti();
585
939
  },
586
940
  get children() {
587
- var _el$33 = _$createElement("box"), _el$34 = _$createElement("box"), _el$35 = _$createElement("text"), _el$36 = _$createElement("text"), _el$37 = _$createTextNode(`\u21B3 Submit`);
941
+ var _el$30 = _$createElement("box"), _el$31 = _$createElement("box"), _el$32 = _$createElement("text"), _el$33 = _$createElement("text"), _el$34 = _$createTextNode(`\u21B3 Submit`);
942
+ _$insertNode(_el$30, _el$31);
943
+ _$setProp(_el$30, "justifyContent", "center");
944
+ _$setProp(_el$30, "paddingTop", 1);
945
+ _$insertNode(_el$31, _el$32);
946
+ _$insertNode(_el$31, _el$33);
947
+ _$setProp(_el$31, "flexDirection", "row");
948
+ _$setProp(_el$31, "alignItems", "center");
949
+ _$setProp(_el$31, "gap", 1);
950
+ _$setProp(_el$31, "border", true);
951
+ _$setProp(_el$31, "paddingLeft", 2);
952
+ _$setProp(_el$31, "paddingRight", 2);
953
+ _$insert(_el$32, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
588
954
  _$insertNode(_el$33, _el$34);
589
- _$setProp(_el$33, "justifyContent", "center");
590
- _$setProp(_el$33, "paddingTop", 1);
591
- _$insertNode(_el$34, _el$35);
592
- _$insertNode(_el$34, _el$36);
593
- _$setProp(_el$34, "flexDirection", "row");
594
- _$setProp(_el$34, "alignItems", "center");
595
- _$setProp(_el$34, "gap", 1);
596
- _$setProp(_el$34, "border", true);
597
- _$setProp(_el$34, "paddingLeft", 2);
598
- _$setProp(_el$34, "paddingRight", 2);
599
- _$insert(_el$35, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
600
- _$insertNode(_el$36, _el$37);
601
- _$setProp(_el$36, "bold", true);
602
- _$insert(_el$36, () => note().trim() && !selected().size && !dontKnow() ? " note" : "", null);
955
+ _$setProp(_el$33, "bold", true);
956
+ _$insert(_el$33, () => note().trim() && !selected().size && !dontKnow() ? " note" : "", null);
603
957
  _$effect((_p$) => {
604
- var _v$ = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().borderSubtle, _v$2 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().background, _v$3 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted, _v$4 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted;
605
- _v$ !== _p$.e && (_p$.e = _$setProp(_el$34, "borderColor", _v$, _p$.e));
606
- _v$2 !== _p$.t && (_p$.t = _$setProp(_el$34, "backgroundColor", _v$2, _p$.t));
607
- _v$3 !== _p$.a && (_p$.a = _$setProp(_el$35, "fg", _v$3, _p$.a));
608
- _v$4 !== _p$.o && (_p$.o = _$setProp(_el$36, "fg", _v$4, _p$.o));
958
+ var _v$5 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().borderSubtle, _v$6 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().background, _v$7 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted, _v$8 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted;
959
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$31, "borderColor", _v$5, _p$.e));
960
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$31, "backgroundColor", _v$6, _p$.t));
961
+ _v$7 !== _p$.a && (_p$.a = _$setProp(_el$32, "fg", _v$7, _p$.a));
962
+ _v$8 !== _p$.o && (_p$.o = _$setProp(_el$33, "fg", _v$8, _p$.o));
609
963
  return _p$;
610
964
  }, {
611
965
  e: undefined,
@@ -613,7 +967,7 @@ function QuizDialog(props) {
613
967
  a: undefined,
614
968
  o: undefined
615
969
  });
616
- return _el$33;
970
+ return _el$30;
617
971
  }
618
972
  }), null);
619
973
  _$insert(_el$0, _$createComponent(Show, {
@@ -621,46 +975,47 @@ function QuizDialog(props) {
621
975
  return _$memo(() => !!(!isMulti() && note().trim() && !selected().size))() && !dontKnow();
622
976
  },
623
977
  get children() {
624
- var _el$38 = _$createElement("box"), _el$39 = _$createElement("box"), _el$40 = _$createElement("text");
625
- _$insertNode(_el$38, _el$39);
626
- _$setProp(_el$38, "justifyContent", "center");
627
- _$setProp(_el$38, "paddingTop", 1);
628
- _$insertNode(_el$39, _el$40);
629
- _$setProp(_el$39, "flexDirection", "row");
630
- _$setProp(_el$39, "alignItems", "center");
631
- _$setProp(_el$39, "gap", 1);
632
- _$setProp(_el$39, "border", true);
633
- _$setProp(_el$39, "paddingLeft", 2);
634
- _$setProp(_el$39, "paddingRight", 2);
635
- _$insertNode(_el$40, _$createTextNode(`\u21B3 Submit note \u2192 classify`));
636
- _$setProp(_el$40, "bold", true);
978
+ var _el$35 = _$createElement("box"), _el$36 = _$createElement("box"), _el$37 = _$createElement("text");
979
+ _$insertNode(_el$35, _el$36);
980
+ _$setProp(_el$35, "justifyContent", "center");
981
+ _$setProp(_el$35, "paddingTop", 1);
982
+ _$insertNode(_el$36, _el$37);
983
+ _$setProp(_el$36, "flexDirection", "row");
984
+ _$setProp(_el$36, "alignItems", "center");
985
+ _$setProp(_el$36, "gap", 1);
986
+ _$setProp(_el$36, "border", true);
987
+ _$setProp(_el$36, "paddingLeft", 2);
988
+ _$setProp(_el$36, "paddingRight", 2);
989
+ _$insertNode(_el$37, _$createTextNode(`\u21B3 Submit note \u2192 classify`));
990
+ _$setProp(_el$37, "bold", true);
637
991
  _$effect((_p$) => {
638
- var _v$5 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().success, _v$6 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().backgroundElement : theme().success, _v$7 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().background;
639
- _v$5 !== _p$.e && (_p$.e = _$setProp(_el$39, "borderColor", _v$5, _p$.e));
640
- _v$6 !== _p$.t && (_p$.t = _$setProp(_el$39, "backgroundColor", _v$6, _p$.t));
641
- _v$7 !== _p$.a && (_p$.a = _$setProp(_el$40, "fg", _v$7, _p$.a));
992
+ var _v$9 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().success, _v$0 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().backgroundElement : theme().success, _v$1 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().background;
993
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$36, "borderColor", _v$9, _p$.e));
994
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$36, "backgroundColor", _v$0, _p$.t));
995
+ _v$1 !== _p$.a && (_p$.a = _$setProp(_el$37, "fg", _v$1, _p$.a));
642
996
  return _p$;
643
997
  }, {
644
998
  e: undefined,
645
999
  t: undefined,
646
1000
  a: undefined
647
1001
  });
648
- return _el$38;
1002
+ return _el$35;
649
1003
  }
650
1004
  }), null);
651
1005
  _$effect((_p$) => {
652
- var _v$8 = theme().borderSubtle, _v$9 = theme().background, _v$0 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$1 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$10 = dontKnow() ? theme().warning : theme().textMuted, _v$11 = dontKnow() ? theme().warning : theme().textMuted, _v$12 = focused() === "note" ? theme().accent : theme().textMuted, _v$13 = focused() === "note", _v$14 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$15 = theme().backgroundElement, _v$16 = theme().textMuted;
653
- _v$8 !== _p$.e && (_p$.e = _$setProp(_el$0, "borderColor", _v$8, _p$.e));
654
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$0, "backgroundColor", _v$9, _p$.t));
655
- _v$0 !== _p$.a && (_p$.a = _$setProp(_el$11, "backgroundColor", _v$0, _p$.a));
656
- _v$1 !== _p$.o && (_p$.o = _$setProp(_el$13, "fg", _v$1, _p$.o));
657
- _v$10 !== _p$.i && (_p$.i = _$setProp(_el$15, "fg", _v$10, _p$.i));
658
- _v$11 !== _p$.n && (_p$.n = _$setProp(_el$17, "fg", _v$11, _p$.n));
659
- _v$12 !== _p$.s && (_p$.s = _$setProp(_el$21, "fg", _v$12, _p$.s));
660
- _v$13 !== _p$.h && (_p$.h = _$setProp(_el$21, "bold", _v$13, _p$.h));
661
- _v$14 !== _p$.r && (_p$.r = _$setProp(_el$25, "borderColor", _v$14, _p$.r));
662
- _v$15 !== _p$.d && (_p$.d = _$setProp(_el$25, "backgroundColor", _v$15, _p$.d));
663
- _v$16 !== _p$.l && (_p$.l = _$setProp(_el$28, "fg", _v$16, _p$.l));
1006
+ var _v$10 = theme().borderSubtle, _v$11 = theme().background, _v$12 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$13 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$14 = dontKnow() ? theme().warning : theme().textMuted, _v$15 = dontKnow() ? theme().warning : theme().textMuted, _v$16 = focused() === "note" ? theme().accent : theme().textMuted, _v$17 = focused() === "note", _v$18 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$19 = theme().backgroundElement, _v$20 = theme().textMuted, _v$21 = theme().textMuted;
1007
+ _v$10 !== _p$.e && (_p$.e = _$setProp(_el$0, "borderColor", _v$10, _p$.e));
1008
+ _v$11 !== _p$.t && (_p$.t = _$setProp(_el$0, "backgroundColor", _v$11, _p$.t));
1009
+ _v$12 !== _p$.a && (_p$.a = _$setProp(_el$11, "backgroundColor", _v$12, _p$.a));
1010
+ _v$13 !== _p$.o && (_p$.o = _$setProp(_el$13, "fg", _v$13, _p$.o));
1011
+ _v$14 !== _p$.i && (_p$.i = _$setProp(_el$15, "fg", _v$14, _p$.i));
1012
+ _v$15 !== _p$.n && (_p$.n = _$setProp(_el$17, "fg", _v$15, _p$.n));
1013
+ _v$16 !== _p$.s && (_p$.s = _$setProp(_el$21, "fg", _v$16, _p$.s));
1014
+ _v$17 !== _p$.h && (_p$.h = _$setProp(_el$21, "bold", _v$17, _p$.h));
1015
+ _v$18 !== _p$.r && (_p$.r = _$setProp(_el$25, "borderColor", _v$18, _p$.r));
1016
+ _v$19 !== _p$.d && (_p$.d = _$setProp(_el$25, "backgroundColor", _v$19, _p$.d));
1017
+ _v$20 !== _p$.l && (_p$.l = _$setProp(_el$28, "fg", _v$20, _p$.l));
1018
+ _v$21 !== _p$.u && (_p$.u = _$setProp(_el$29, "fg", _v$21, _p$.u));
664
1019
  return _p$;
665
1020
  }, {
666
1021
  e: undefined,
@@ -673,7 +1028,8 @@ function QuizDialog(props) {
673
1028
  h: undefined,
674
1029
  r: undefined,
675
1030
  d: undefined,
676
- l: undefined
1031
+ l: undefined,
1032
+ u: undefined
677
1033
  });
678
1034
  return _el$0;
679
1035
  }
@@ -683,29 +1039,29 @@ function QuizDialog(props) {
683
1039
  return phase() === "classifying";
684
1040
  },
685
1041
  get children() {
686
- var _el$42 = _$createElement("box"), _el$43 = _$createElement("text"), _el$45 = _$createElement("text"), _el$46 = _$createTextNode(`"`), _el$47 = _$createTextNode(`"`), _el$48 = _$createElement("text");
1042
+ var _el$39 = _$createElement("box"), _el$40 = _$createElement("text"), _el$42 = _$createElement("text"), _el$43 = _$createTextNode(`"`), _el$44 = _$createTextNode(`"`), _el$45 = _$createElement("text");
1043
+ _$insertNode(_el$39, _el$40);
1044
+ _$insertNode(_el$39, _el$42);
1045
+ _$insertNode(_el$39, _el$45);
1046
+ _$setProp(_el$39, "flexDirection", "column");
1047
+ _$setProp(_el$39, "gap", 1);
1048
+ _$setProp(_el$39, "padding", 1);
1049
+ _$setProp(_el$39, "border", true);
1050
+ _$setProp(_el$39, "alignItems", "center");
1051
+ _$insertNode(_el$40, _$createTextNode(`\u25D0 Classifying your note...`));
1052
+ _$setProp(_el$40, "bold", true);
687
1053
  _$insertNode(_el$42, _el$43);
688
- _$insertNode(_el$42, _el$45);
689
- _$insertNode(_el$42, _el$48);
690
- _$setProp(_el$42, "flexDirection", "column");
691
- _$setProp(_el$42, "gap", 1);
692
- _$setProp(_el$42, "padding", 1);
693
- _$setProp(_el$42, "border", true);
694
- _$setProp(_el$42, "alignItems", "center");
695
- _$insertNode(_el$43, _$createTextNode(`\u25D0 Classifying your note...`));
696
- _$setProp(_el$43, "bold", true);
697
- _$insertNode(_el$45, _el$46);
698
- _$insertNode(_el$45, _el$47);
699
- _$setProp(_el$45, "wrapMode", "wrap");
700
- _$insert(_el$45, note, _el$47);
701
- _$insertNode(_el$48, _$createTextNode(`Mapping to options \u2014 please wait`));
1054
+ _$insertNode(_el$42, _el$44);
1055
+ _$setProp(_el$42, "wrapMode", "wrap");
1056
+ _$insert(_el$42, note, _el$44);
1057
+ _$insertNode(_el$45, _$createTextNode(`Mapping to options \u2014 please wait`));
702
1058
  _$effect((_p$) => {
703
- var _v$17 = theme().accent, _v$18 = theme().background, _v$19 = theme().accent, _v$20 = theme().textMuted, _v$21 = theme().textMuted;
704
- _v$17 !== _p$.e && (_p$.e = _$setProp(_el$42, "borderColor", _v$17, _p$.e));
705
- _v$18 !== _p$.t && (_p$.t = _$setProp(_el$42, "backgroundColor", _v$18, _p$.t));
706
- _v$19 !== _p$.a && (_p$.a = _$setProp(_el$43, "fg", _v$19, _p$.a));
707
- _v$20 !== _p$.o && (_p$.o = _$setProp(_el$45, "fg", _v$20, _p$.o));
708
- _v$21 !== _p$.i && (_p$.i = _$setProp(_el$48, "fg", _v$21, _p$.i));
1059
+ var _v$22 = theme().accent, _v$23 = theme().background, _v$24 = theme().accent, _v$25 = theme().textMuted, _v$26 = theme().textMuted;
1060
+ _v$22 !== _p$.e && (_p$.e = _$setProp(_el$39, "borderColor", _v$22, _p$.e));
1061
+ _v$23 !== _p$.t && (_p$.t = _$setProp(_el$39, "backgroundColor", _v$23, _p$.t));
1062
+ _v$24 !== _p$.a && (_p$.a = _$setProp(_el$40, "fg", _v$24, _p$.a));
1063
+ _v$25 !== _p$.o && (_p$.o = _$setProp(_el$42, "fg", _v$25, _p$.o));
1064
+ _v$26 !== _p$.i && (_p$.i = _$setProp(_el$45, "fg", _v$26, _p$.i));
709
1065
  return _p$;
710
1066
  }, {
711
1067
  e: undefined,
@@ -714,7 +1070,7 @@ function QuizDialog(props) {
714
1070
  o: undefined,
715
1071
  i: undefined
716
1072
  });
717
- return _el$42;
1073
+ return _el$39;
718
1074
  }
719
1075
  }), null);
720
1076
  _$insert(_el$6, _$createComponent(Show, {
@@ -722,15 +1078,15 @@ function QuizDialog(props) {
722
1078
  return phase() === "feedback";
723
1079
  },
724
1080
  get children() {
725
- var _el$50 = _$createElement("box"), _el$51 = _$createElement("box"), _el$52 = _$createElement("text"), _el$56 = _$createElement("text"), _el$57 = _$createTextNode(`Correct: `), _el$60 = _$createElement("box"), _el$61 = _$createElement("text");
726
- _$insertNode(_el$50, _el$51);
727
- _$insertNode(_el$50, _el$56);
728
- _$insertNode(_el$50, _el$60);
729
- _$setProp(_el$50, "flexDirection", "column");
730
- _$setProp(_el$50, "gap", 1);
731
- _$setProp(_el$50, "padding", 1);
732
- _$setProp(_el$50, "border", true);
733
- _$insert(_el$50, _$createComponent(For, {
1081
+ var _el$47 = _$createElement("box"), _el$48 = _$createElement("box"), _el$49 = _$createElement("text"), _el$53 = _$createElement("text"), _el$54 = _$createTextNode(`Correct: `), _el$57 = _$createElement("box"), _el$58 = _$createElement("markdown");
1082
+ _$insertNode(_el$47, _el$48);
1083
+ _$insertNode(_el$47, _el$53);
1084
+ _$insertNode(_el$47, _el$57);
1085
+ _$setProp(_el$47, "flexDirection", "column");
1086
+ _$setProp(_el$47, "gap", 1);
1087
+ _$setProp(_el$47, "padding", 1);
1088
+ _$setProp(_el$47, "border", true);
1089
+ _$insert(_el$47, _$createComponent(For, {
734
1090
  get each() {
735
1091
  return options();
736
1092
  },
@@ -759,85 +1115,86 @@ function QuizDialog(props) {
759
1115
  bg = theme().warning;
760
1116
  }
761
1117
  return (() => {
762
- var _el$73 = _$createElement("box"), _el$74 = _$createElement("box"), _el$75 = _$createElement("text"), _el$76 = _$createElement("box"), _el$77 = _$createElement("text"), _el$78 = _$createTextNode(`. `);
1118
+ var _el$70 = _$createElement("box"), _el$71 = _$createElement("box"), _el$72 = _$createElement("text"), _el$73 = _$createElement("box"), _el$74 = _$createElement("text"), _el$75 = _$createTextNode(`. `);
1119
+ _$insertNode(_el$70, _el$71);
1120
+ _$insertNode(_el$70, _el$73);
1121
+ _$setProp(_el$70, "flexDirection", "row");
1122
+ _$setProp(_el$70, "alignItems", "flexStart");
1123
+ _$setProp(_el$70, "gap", 1);
1124
+ _$setProp(_el$70, "paddingLeft", 1);
1125
+ _$setProp(_el$70, "backgroundColor", bg);
1126
+ _$insertNode(_el$71, _el$72);
1127
+ _$setProp(_el$71, "width", 2);
1128
+ _$setProp(_el$71, "alignItems", "center");
1129
+ _$setProp(_el$72, "fg", fg);
1130
+ _$setProp(_el$72, "bold", true);
1131
+ _$insert(_el$72, icon);
763
1132
  _$insertNode(_el$73, _el$74);
764
- _$insertNode(_el$73, _el$76);
765
- _$setProp(_el$73, "flexDirection", "row");
766
- _$setProp(_el$73, "alignItems", "flexStart");
767
- _$setProp(_el$73, "gap", 1);
768
- _$setProp(_el$73, "paddingLeft", 1);
769
- _$setProp(_el$73, "backgroundColor", bg);
1133
+ _$setProp(_el$73, "flexGrow", 1);
770
1134
  _$insertNode(_el$74, _el$75);
771
- _$setProp(_el$74, "width", 2);
772
- _$setProp(_el$74, "alignItems", "center");
773
- _$setProp(_el$75, "fg", fg);
774
- _$setProp(_el$75, "bold", true);
775
- _$insert(_el$75, icon);
776
- _$insertNode(_el$76, _el$77);
777
- _$setProp(_el$76, "flexGrow", 1);
778
- _$insertNode(_el$77, _el$78);
779
- _$setProp(_el$77, "fg", fg);
780
- _$setProp(_el$77, "wrapMode", "wrap");
781
- _$insert(_el$77, idx, _el$78);
782
- _$insert(_el$77, () => opt.label, null);
783
- return _el$73;
1135
+ _$setProp(_el$74, "fg", fg);
1136
+ _$setProp(_el$74, "wrapMode", "wrap");
1137
+ _$insert(_el$74, idx, _el$75);
1138
+ _$insert(_el$74, () => opt.label, null);
1139
+ return _el$70;
784
1140
  })();
785
1141
  }
786
- }), _el$51);
787
- _$insertNode(_el$51, _el$52);
788
- _$setProp(_el$51, "height", 1);
789
- _$insert(_el$52, () => "\u2500".repeat(Math.max(20, popupWidth() - 12)));
790
- _$insert(_el$50, _$createComponent(Show, {
1142
+ }), _el$48);
1143
+ _$insertNode(_el$48, _el$49);
1144
+ _$setProp(_el$48, "height", 1);
1145
+ _$insert(_el$49, () => "\u2500".repeat(Math.max(20, popupWidth() - 12)));
1146
+ _$insert(_el$47, _$createComponent(Show, {
791
1147
  get when() {
792
1148
  return dontKnow();
793
1149
  },
794
1150
  get children() {
795
- var _el$53 = _$createElement("text");
796
- _$insertNode(_el$53, _$createTextNode(`\u25CF You said: I don't know \u2014 genuine gap`));
797
- _$effect((_$p) => _$setProp(_el$53, "fg", theme().warning, _$p));
798
- return _el$53;
1151
+ var _el$50 = _$createElement("text");
1152
+ _$insertNode(_el$50, _$createTextNode(`\u25CF You said: I don't know \u2014 genuine gap`));
1153
+ _$effect((_$p) => _$setProp(_el$50, "fg", theme().warning, _$p));
1154
+ return _el$50;
799
1155
  }
800
- }), _el$56);
801
- _$insert(_el$50, _$createComponent(Show, {
1156
+ }), _el$53);
1157
+ _$insert(_el$47, _$createComponent(Show, {
802
1158
  get when() {
803
1159
  return !dontKnow();
804
1160
  },
805
1161
  get children() {
806
- var _el$55 = _$createElement("text");
807
- _$setProp(_el$55, "bold", true);
808
- _$insert(_el$55, () => feedback()?.correct ? "\u2713 Correct! Well located." : "\u2717 Incorrect \u2014 nice try, let's fix the edge.");
809
- _$effect((_$p) => _$setProp(_el$55, "fg", feedback()?.correct ? theme().success : theme().error, _$p));
810
- return _el$55;
1162
+ var _el$52 = _$createElement("text");
1163
+ _$setProp(_el$52, "bold", true);
1164
+ _$insert(_el$52, () => feedback()?.correct ? "\u2713 Correct! Well located." : "\u2717 Incorrect \u2014 nice try, let's fix the edge.");
1165
+ _$effect((_$p) => _$setProp(_el$52, "fg", feedback()?.correct ? theme().success : theme().error, _$p));
1166
+ return _el$52;
811
1167
  }
812
- }), _el$56);
813
- _$insertNode(_el$56, _el$57);
814
- _$insert(_el$56, () => props.request.correctIndices.map((i) => `${i}. ${options()[i - 1]?.label}`).join(", "), null);
815
- _$insert(_el$50, _$createComponent(Show, {
1168
+ }), _el$53);
1169
+ _$insertNode(_el$53, _el$54);
1170
+ _$insert(_el$53, () => props.request.correctIndices.map((i) => `${i}. ${options()[i - 1]?.label}`).join(", "), null);
1171
+ _$insert(_el$47, _$createComponent(Show, {
816
1172
  get when() {
817
1173
  return note();
818
1174
  },
819
1175
  get children() {
820
- var _el$58 = _$createElement("text"), _el$59 = _$createTextNode(`Your note: `);
821
- _$insertNode(_el$58, _el$59);
822
- _$insert(_el$58, note, null);
823
- _$effect((_$p) => _$setProp(_el$58, "fg", theme().textMuted, _$p));
824
- return _el$58;
1176
+ var _el$55 = _$createElement("text"), _el$56 = _$createTextNode(`Your note: `);
1177
+ _$insertNode(_el$55, _el$56);
1178
+ _$insert(_el$55, note, null);
1179
+ _$effect((_$p) => _$setProp(_el$55, "fg", theme().textMuted, _$p));
1180
+ return _el$55;
825
1181
  }
826
- }), _el$60);
827
- _$insertNode(_el$60, _el$61);
828
- _$setProp(_el$60, "border", true);
829
- _$setProp(_el$60, "padding", 1);
830
- _$setProp(_el$61, "wrapMode", "wrap");
831
- _$insert(_el$61, () => props.request.explanation);
1182
+ }), _el$57);
1183
+ _$insertNode(_el$57, _el$58);
1184
+ _$setProp(_el$57, "border", true);
1185
+ _$setProp(_el$57, "padding", 1);
832
1186
  _$effect((_p$) => {
833
- var _v$22 = feedback()?.correct ? theme().success : theme().error, _v$23 = theme().background, _v$24 = theme().borderSubtle, _v$25 = theme().textMuted, _v$26 = theme().borderSubtle, _v$27 = theme().backgroundPanel, _v$28 = theme().text;
834
- _v$22 !== _p$.e && (_p$.e = _$setProp(_el$50, "borderColor", _v$22, _p$.e));
835
- _v$23 !== _p$.t && (_p$.t = _$setProp(_el$50, "backgroundColor", _v$23, _p$.t));
836
- _v$24 !== _p$.a && (_p$.a = _$setProp(_el$52, "fg", _v$24, _p$.a));
837
- _v$25 !== _p$.o && (_p$.o = _$setProp(_el$56, "fg", _v$25, _p$.o));
838
- _v$26 !== _p$.i && (_p$.i = _$setProp(_el$60, "borderColor", _v$26, _p$.i));
839
- _v$27 !== _p$.n && (_p$.n = _$setProp(_el$60, "backgroundColor", _v$27, _p$.n));
840
- _v$28 !== _p$.s && (_p$.s = _$setProp(_el$61, "fg", _v$28, _p$.s));
1187
+ var _v$27 = feedback()?.correct ? theme().success : theme().error, _v$28 = theme().background, _v$29 = theme().borderSubtle, _v$30 = theme().textMuted, _v$31 = theme().borderSubtle, _v$32 = theme().backgroundPanel, _v$33 = syntax(), _v$34 = decodeQuizText(props.request.explanation), _v$35 = theme().text, _v$36 = theme().backgroundPanel;
1188
+ _v$27 !== _p$.e && (_p$.e = _$setProp(_el$47, "borderColor", _v$27, _p$.e));
1189
+ _v$28 !== _p$.t && (_p$.t = _$setProp(_el$47, "backgroundColor", _v$28, _p$.t));
1190
+ _v$29 !== _p$.a && (_p$.a = _$setProp(_el$49, "fg", _v$29, _p$.a));
1191
+ _v$30 !== _p$.o && (_p$.o = _$setProp(_el$53, "fg", _v$30, _p$.o));
1192
+ _v$31 !== _p$.i && (_p$.i = _$setProp(_el$57, "borderColor", _v$31, _p$.i));
1193
+ _v$32 !== _p$.n && (_p$.n = _$setProp(_el$57, "backgroundColor", _v$32, _p$.n));
1194
+ _v$33 !== _p$.s && (_p$.s = _$setProp(_el$58, "syntaxStyle", _v$33, _p$.s));
1195
+ _v$34 !== _p$.h && (_p$.h = _$setProp(_el$58, "content", _v$34, _p$.h));
1196
+ _v$35 !== _p$.r && (_p$.r = _$setProp(_el$58, "fg", _v$35, _p$.r));
1197
+ _v$36 !== _p$.d && (_p$.d = _$setProp(_el$58, "bg", _v$36, _p$.d));
841
1198
  return _p$;
842
1199
  }, {
843
1200
  e: undefined,
@@ -846,29 +1203,43 @@ function QuizDialog(props) {
846
1203
  o: undefined,
847
1204
  i: undefined,
848
1205
  n: undefined,
849
- s: undefined
1206
+ s: undefined,
1207
+ h: undefined,
1208
+ r: undefined,
1209
+ d: undefined
850
1210
  });
851
- return _el$50;
1211
+ return _el$47;
852
1212
  }
853
1213
  }), null);
854
- _$insertNode(_el$62, _el$63);
855
- _$setProp(_el$62, "height", 1);
856
- _$setProp(_el$62, "justifyContent", "center");
857
- _$insert(_el$63, (() => {
1214
+ _$insertNode(_el$59, _el$60);
1215
+ _$setProp(_el$59, "height", 1);
1216
+ _$setProp(_el$59, "justifyContent", "center");
1217
+ _$setProp(_el$60, "wrapMode", "wrap");
1218
+ _$insert(_el$60, (() => {
858
1219
  var _c$3 = _$memo(() => phase() === "feedback");
859
- return () => _c$3() ? "\u21B5 Enter / Esc to continue \u2192 next probe" : phase() === "classifying" ? "Classifying your note..." : "Navigate options \xB7 Tab note \xB7 Esc cancel";
1220
+ return () => _c$3() ? _$memo(() => !!(canScrollUp() && canScrollDown()))() ? "\u25B2 more above \xB7 \u25BC more below \u2014 d/u to scroll \xB7 Enter to continue" : _$memo(() => !!canScrollDown())() ? "\u25BC more below \u2014 d to scroll \xB7 Enter to continue" : canScrollUp() ? "\u25B2 more above \u2014 u to scroll \xB7 Enter to continue" : "\u21B5 Enter / Esc to continue \u2192 next probe" : _$memo(() => phase() === "classifying")() ? "Classifying your note..." : _$memo(() => focused() === "note")() ? "Enter submit note \u2192 classify \xB7 Tab/Esc back" : canScrollUp() || canScrollDown() ? "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel \xB7 d/u scroll" : "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel";
860
1221
  })());
861
1222
  _$effect((_p$) => {
862
- var _v$29 = popupWidth(), _v$30 = popupHeight(), _v$31 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$32 = theme().backgroundPanel, _v$33 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$34 = theme().background, _v$35 = theme().background, _v$36 = theme().text, _v$37 = theme().textMuted;
863
- _v$29 !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$29, _p$.e));
864
- _v$30 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$30, _p$.t));
865
- _v$31 !== _p$.a && (_p$.a = _$setProp(_el$, "borderColor", _v$31, _p$.a));
866
- _v$32 !== _p$.o && (_p$.o = _$setProp(_el$, "backgroundColor", _v$32, _p$.o));
867
- _v$33 !== _p$.i && (_p$.i = _$setProp(_el$2, "backgroundColor", _v$33, _p$.i));
868
- _v$34 !== _p$.n && (_p$.n = _$setProp(_el$3, "fg", _v$34, _p$.n));
869
- _v$35 !== _p$.s && (_p$.s = _$setProp(_el$4, "fg", _v$35, _p$.s));
870
- _v$36 !== _p$.h && (_p$.h = _$setProp(_el$8, "fg", _v$36, _p$.h));
871
- _v$37 !== _p$.r && (_p$.r = _$setProp(_el$63, "fg", _v$37, _p$.r));
1223
+ var _v$37 = popupWidth(), _v$38 = popupHeight(), _v$39 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$40 = theme().backgroundPanel, _v$41 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$42 = theme().background, _v$43 = theme().background, _v$44 = {
1224
+ visible: true,
1225
+ trackOptions: {
1226
+ backgroundColor: theme().background,
1227
+ foregroundColor: theme().borderActive
1228
+ }
1229
+ }, _v$45 = syntax(), _v$46 = decodeQuizText(props.request.question), _v$47 = theme().text, _v$48 = theme().backgroundPanel, _v$49 = theme().textMuted;
1230
+ _v$37 !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$37, _p$.e));
1231
+ _v$38 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$38, _p$.t));
1232
+ _v$39 !== _p$.a && (_p$.a = _$setProp(_el$, "borderColor", _v$39, _p$.a));
1233
+ _v$40 !== _p$.o && (_p$.o = _$setProp(_el$, "backgroundColor", _v$40, _p$.o));
1234
+ _v$41 !== _p$.i && (_p$.i = _$setProp(_el$2, "backgroundColor", _v$41, _p$.i));
1235
+ _v$42 !== _p$.n && (_p$.n = _$setProp(_el$3, "fg", _v$42, _p$.n));
1236
+ _v$43 !== _p$.s && (_p$.s = _$setProp(_el$4, "fg", _v$43, _p$.s));
1237
+ _v$44 !== _p$.h && (_p$.h = _$setProp(_el$6, "verticalScrollbarOptions", _v$44, _p$.h));
1238
+ _v$45 !== _p$.r && (_p$.r = _$setProp(_el$8, "syntaxStyle", _v$45, _p$.r));
1239
+ _v$46 !== _p$.d && (_p$.d = _$setProp(_el$8, "content", _v$46, _p$.d));
1240
+ _v$47 !== _p$.l && (_p$.l = _$setProp(_el$8, "fg", _v$47, _p$.l));
1241
+ _v$48 !== _p$.u && (_p$.u = _$setProp(_el$8, "bg", _v$48, _p$.u));
1242
+ _v$49 !== _p$.c && (_p$.c = _$setProp(_el$60, "fg", _v$49, _p$.c));
872
1243
  return _p$;
873
1244
  }, {
874
1245
  e: undefined,
@@ -879,13 +1250,18 @@ function QuizDialog(props) {
879
1250
  n: undefined,
880
1251
  s: undefined,
881
1252
  h: undefined,
882
- r: undefined
1253
+ r: undefined,
1254
+ d: undefined,
1255
+ l: undefined,
1256
+ u: undefined,
1257
+ c: undefined
883
1258
  });
884
1259
  return _el$;
885
1260
  })();
886
1261
  }
887
1262
  function QuizBatchDialog(props) {
888
1263
  const theme = () => props.api.theme.current;
1264
+ const syntax = () => syntaxStyle(theme());
889
1265
  const dims = useTerminalDimensions();
890
1266
  const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 96));
891
1267
  const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
@@ -908,6 +1284,40 @@ function QuizBatchDialog(props) {
908
1284
  const dontKnowIdx = () => cur().options.length;
909
1285
  const submitIdx = () => isMulti() ? cur().options.length + 1 : -1;
910
1286
  let noteEl;
1287
+ let scrollRefBatch;
1288
+ const [canScrollUpBatch, setCanScrollUpBatch] = createSignal(false);
1289
+ const [canScrollDownBatch, setCanScrollDownBatch] = createSignal(false);
1290
+ const updateScrollBatch = () => {
1291
+ try {
1292
+ if (!scrollRefBatch) {
1293
+ setCanScrollUpBatch(false);
1294
+ setCanScrollDownBatch(false);
1295
+ return;
1296
+ }
1297
+ const st = typeof scrollRefBatch.scrollTop === "number" ? scrollRefBatch.scrollTop : 0;
1298
+ const h = typeof scrollRefBatch.height === "number" ? scrollRefBatch.height : scrollRefBatch.viewportHeight ?? popupHeight();
1299
+ const sh = typeof scrollRefBatch.scrollHeight === "number" ? scrollRefBatch.scrollHeight : 0;
1300
+ let effectiveSh = sh;
1301
+ if (!effectiveSh && typeof scrollRefBatch.getChildren === "function") {
1302
+ try {
1303
+ const kids = scrollRefBatch.getChildren();
1304
+ if (kids?.length)
1305
+ effectiveSh = Math.max(...kids.map((c) => (c.y || 0) + (c.height || 0)), h);
1306
+ } catch {}
1307
+ }
1308
+ if (!effectiveSh || effectiveSh <= h + 1) {
1309
+ setCanScrollUpBatch(false);
1310
+ setCanScrollDownBatch(false);
1311
+ return;
1312
+ }
1313
+ setCanScrollUpBatch(st > 0);
1314
+ setCanScrollDownBatch(st + h < effectiveSh - 1);
1315
+ } catch {
1316
+ setCanScrollUpBatch(false);
1317
+ setCanScrollDownBatch(false);
1318
+ }
1319
+ };
1320
+ const scrollAmountBatch = () => Math.max(1, Math.floor((scrollRefBatch?.height ?? popupHeight()) / 3));
911
1321
  createEffect(() => {
912
1322
  if (focused() === "note" && noteEl)
913
1323
  try {
@@ -916,6 +1326,24 @@ function QuizBatchDialog(props) {
916
1326
  tlog("note focus failed", String(e));
917
1327
  }
918
1328
  });
1329
+ createEffect(() => {
1330
+ phase();
1331
+ feedback();
1332
+ dims();
1333
+ idx();
1334
+ setTimeout(updateScrollBatch, 40);
1335
+ setTimeout(updateScrollBatch, 200);
1336
+ });
1337
+ createEffect(() => {
1338
+ note();
1339
+ setTimeout(updateScrollBatch, 40);
1340
+ });
1341
+ createEffect(() => {
1342
+ if (phase() !== "feedback" && phase() !== "select")
1343
+ return;
1344
+ const id = setInterval(updateScrollBatch, 200);
1345
+ onCleanup(() => clearInterval(id));
1346
+ });
919
1347
  const toggle = (i) => {
920
1348
  try {
921
1349
  const o = cur().options[i];
@@ -1092,16 +1520,63 @@ function QuizBatchDialog(props) {
1092
1520
  tlog("submitSelect failed", String(e));
1093
1521
  }
1094
1522
  };
1523
+ const isPlainKeyBatch = (evt, want) => {
1524
+ try {
1525
+ const n = String(evt.name || evt.sequence || "").toLowerCase();
1526
+ if (n !== want.toLowerCase())
1527
+ return false;
1528
+ if (evt.ctrl || evt.meta || evt.option || evt.alt)
1529
+ return false;
1530
+ return true;
1531
+ } catch {
1532
+ return false;
1533
+ }
1534
+ };
1095
1535
  useKeyboard((evt) => {
1096
1536
  try {
1097
1537
  const k = evt.name || evt.sequence || evt.raw || "";
1098
1538
  const seq = evt.sequence || "";
1539
+ const lower = String(k || "").toLowerCase();
1099
1540
  if (phase() === "classifying") {
1100
1541
  prevent(evt);
1101
1542
  return;
1102
1543
  }
1103
1544
  if (phase() === "feedback") {
1104
- if (k === "enter" || seq === "\r" || k === "escape" || k === "esc") {
1545
+ if (isPlainKeyBatch(evt, "d") || seq === "\x04") {
1546
+ prevent(evt);
1547
+ try {
1548
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1549
+ setTimeout(updateScrollBatch, 30);
1550
+ setTimeout(updateScrollBatch, 120);
1551
+ } catch {}
1552
+ return;
1553
+ }
1554
+ if (isPlainKeyBatch(evt, "u") || seq === "\x15") {
1555
+ prevent(evt);
1556
+ try {
1557
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1558
+ setTimeout(updateScrollBatch, 30);
1559
+ setTimeout(updateScrollBatch, 120);
1560
+ } catch {}
1561
+ return;
1562
+ }
1563
+ if (lower === "pageup" || seq === "\x1B[5~") {
1564
+ prevent(evt);
1565
+ try {
1566
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1567
+ setTimeout(updateScrollBatch, 30);
1568
+ } catch {}
1569
+ return;
1570
+ }
1571
+ if (lower === "pagedown" || seq === "\x1B[6~") {
1572
+ prevent(evt);
1573
+ try {
1574
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1575
+ setTimeout(updateScrollBatch, 30);
1576
+ } catch {}
1577
+ return;
1578
+ }
1579
+ if (lower === "enter" || seq === "\r" || lower === "escape" || lower === "esc") {
1105
1580
  prevent(evt);
1106
1581
  goNext();
1107
1582
  }
@@ -1120,6 +1595,24 @@ function QuizBatchDialog(props) {
1120
1595
  }
1121
1596
  return;
1122
1597
  }
1598
+ if (phase() === "select" && (isPlainKeyBatch(evt, "d") || seq === "\x04")) {
1599
+ prevent(evt);
1600
+ try {
1601
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1602
+ setTimeout(updateScrollBatch, 30);
1603
+ setTimeout(updateScrollBatch, 120);
1604
+ } catch {}
1605
+ return;
1606
+ }
1607
+ if (phase() === "select" && (isPlainKeyBatch(evt, "u") || seq === "\x15")) {
1608
+ prevent(evt);
1609
+ try {
1610
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1611
+ setTimeout(updateScrollBatch, 30);
1612
+ setTimeout(updateScrollBatch, 120);
1613
+ } catch {}
1614
+ return;
1615
+ }
1123
1616
  if (k === "up" || k === "k" || seq === "\x1B[A") {
1124
1617
  prevent(evt);
1125
1618
  setOptionIndex((i) => Math.max(0, i - 1));
@@ -1200,65 +1693,73 @@ function QuizBatchDialog(props) {
1200
1693
  }
1201
1694
  });
1202
1695
  return (() => {
1203
- var _el$79 = _$createElement("box"), _el$80 = _$createElement("box"), _el$81 = _$createElement("text"), _el$82 = _$createTextNode(` decks.quiz batch `), _el$83 = _$createTextNode(`/`), _el$84 = _$createTextNode(` `), _el$85 = _$createElement("text"), _el$87 = _$createElement("scrollbox"), _el$88 = _$createElement("text"), _el$129 = _$createElement("box"), _el$130 = _$createElement("text");
1204
- _$insertNode(_el$79, _el$80);
1205
- _$insertNode(_el$79, _el$87);
1206
- _$insertNode(_el$79, _el$129);
1207
- _$setProp(_el$79, "flexDirection", "column");
1208
- _$setProp(_el$79, "border", true);
1209
- _$setProp(_el$79, "padding", 1);
1210
- _$setProp(_el$79, "gap", 1);
1211
- _$insertNode(_el$80, _el$81);
1212
- _$insertNode(_el$80, _el$85);
1213
- _$setProp(_el$80, "flexDirection", "row");
1214
- _$setProp(_el$80, "justifyContent", "space-between");
1215
- _$setProp(_el$80, "paddingLeft", 1);
1216
- _$setProp(_el$80, "paddingRight", 1);
1217
- _$setProp(_el$80, "height", 1);
1218
- _$insertNode(_el$81, _el$82);
1219
- _$insertNode(_el$81, _el$83);
1220
- _$insertNode(_el$81, _el$84);
1221
- _$setProp(_el$81, "bold", true);
1222
- _$insert(_el$81, () => idx() + 1, _el$83);
1223
- _$insert(_el$81, () => props.request.quizzes.length, _el$84);
1224
- _$insert(_el$81, (() => {
1696
+ var _el$76 = _$createElement("box"), _el$77 = _$createElement("box"), _el$78 = _$createElement("text"), _el$79 = _$createTextNode(` decks.quiz batch `), _el$80 = _$createTextNode(`/`), _el$81 = _$createTextNode(` `), _el$82 = _$createElement("text"), _el$84 = _$createElement("scrollbox"), _el$85 = _$createElement("markdown"), _el$126 = _$createElement("box"), _el$127 = _$createElement("text");
1697
+ _$insertNode(_el$76, _el$77);
1698
+ _$insertNode(_el$76, _el$84);
1699
+ _$insertNode(_el$76, _el$126);
1700
+ _$setProp(_el$76, "flexDirection", "column");
1701
+ _$setProp(_el$76, "border", true);
1702
+ _$setProp(_el$76, "padding", 1);
1703
+ _$setProp(_el$76, "gap", 1);
1704
+ _$insertNode(_el$77, _el$78);
1705
+ _$insertNode(_el$77, _el$82);
1706
+ _$setProp(_el$77, "flexDirection", "row");
1707
+ _$setProp(_el$77, "justifyContent", "space-between");
1708
+ _$setProp(_el$77, "paddingLeft", 1);
1709
+ _$setProp(_el$77, "paddingRight", 1);
1710
+ _$setProp(_el$77, "height", 1);
1711
+ _$insertNode(_el$78, _el$79);
1712
+ _$insertNode(_el$78, _el$80);
1713
+ _$insertNode(_el$78, _el$81);
1714
+ _$setProp(_el$78, "bold", true);
1715
+ _$insert(_el$78, () => idx() + 1, _el$80);
1716
+ _$insert(_el$78, () => props.request.quizzes.length, _el$81);
1717
+ _$insert(_el$78, (() => {
1225
1718
  var _c$5 = _$memo(() => phase() === "feedback");
1226
1719
  return () => _c$5() ? feedback()?.correct ? "\u2713" : "\u2717" : "";
1227
1720
  })(), null);
1228
- _$insertNode(_el$85, _$createTextNode(`learn`));
1229
- _$setProp(_el$85, "dim", true);
1230
- _$insertNode(_el$87, _el$88);
1231
- _$setProp(_el$87, "flexGrow", 1);
1232
- _$setProp(_el$88, "bold", true);
1233
- _$setProp(_el$88, "wrapMode", "wrap");
1234
- _$insert(_el$88, () => cur().question);
1235
- _$insert(_el$87, _$createComponent(Show, {
1721
+ _$insertNode(_el$82, _$createTextNode(`learn`));
1722
+ _$setProp(_el$82, "dim", true);
1723
+ _$insertNode(_el$84, _el$85);
1724
+ _$use((el) => scrollRefBatch = el, _el$84);
1725
+ _$setProp(_el$84, "flexGrow", 1);
1726
+ _$insert(_el$84, _$createComponent(Show, {
1236
1727
  get when() {
1237
1728
  return cur().details;
1238
1729
  },
1239
1730
  get children() {
1240
- var _el$89 = _$createElement("text");
1241
- _$setProp(_el$89, "wrapMode", "wrap");
1242
- _$insert(_el$89, () => cur().details);
1243
- _$effect((_$p) => _$setProp(_el$89, "fg", theme().textMuted, _$p));
1244
- return _el$89;
1731
+ var _el$86 = _$createElement("markdown");
1732
+ _$effect((_p$) => {
1733
+ var _v$55 = syntax(), _v$56 = decodeQuizText(cur().details), _v$57 = theme().textMuted, _v$58 = theme().backgroundPanel;
1734
+ _v$55 !== _p$.e && (_p$.e = _$setProp(_el$86, "syntaxStyle", _v$55, _p$.e));
1735
+ _v$56 !== _p$.t && (_p$.t = _$setProp(_el$86, "content", _v$56, _p$.t));
1736
+ _v$57 !== _p$.a && (_p$.a = _$setProp(_el$86, "fg", _v$57, _p$.a));
1737
+ _v$58 !== _p$.o && (_p$.o = _$setProp(_el$86, "bg", _v$58, _p$.o));
1738
+ return _p$;
1739
+ }, {
1740
+ e: undefined,
1741
+ t: undefined,
1742
+ a: undefined,
1743
+ o: undefined
1744
+ });
1745
+ return _el$86;
1245
1746
  }
1246
1747
  }), null);
1247
- _$insert(_el$87, _$createComponent(Show, {
1748
+ _$insert(_el$84, _$createComponent(Show, {
1248
1749
  get when() {
1249
1750
  return phase() === "select";
1250
1751
  },
1251
1752
  get children() {
1252
- var _el$90 = _$createElement("box"), _el$91 = _$createElement("box"), _el$92 = _$createElement("text"), _el$93 = _$createElement("box"), _el$94 = _$createElement("box"), _el$95 = _$createElement("text"), _el$96 = _$createElement("box"), _el$97 = _$createElement("text"), _el$98 = _$createElement("box"), _el$99 = _$createElement("text"), _el$101 = _$createElement("box"), _el$102 = _$createElement("text"), _el$104 = _$createElement("box"), _el$106 = _$createElement("box"), _el$107 = _$createElement("text"), _el$108 = _$createElement("text"), _el$109 = _$createTextNode(`/`);
1253
- _$insertNode(_el$90, _el$91);
1254
- _$insertNode(_el$90, _el$93);
1255
- _$insertNode(_el$90, _el$101);
1256
- _$insertNode(_el$90, _el$106);
1257
- _$setProp(_el$90, "flexDirection", "column");
1258
- _$setProp(_el$90, "gap", 0);
1259
- _$setProp(_el$90, "padding", 1);
1260
- _$setProp(_el$90, "border", true);
1261
- _$insert(_el$90, _$createComponent(For, {
1753
+ var _el$87 = _$createElement("box"), _el$88 = _$createElement("box"), _el$89 = _$createElement("text"), _el$90 = _$createElement("box"), _el$91 = _$createElement("box"), _el$92 = _$createElement("text"), _el$93 = _$createElement("box"), _el$94 = _$createElement("text"), _el$95 = _$createElement("box"), _el$96 = _$createElement("text"), _el$98 = _$createElement("box"), _el$99 = _$createElement("text"), _el$101 = _$createElement("box"), _el$103 = _$createElement("box"), _el$104 = _$createElement("text"), _el$105 = _$createElement("text"), _el$106 = _$createTextNode(`/`);
1754
+ _$insertNode(_el$87, _el$88);
1755
+ _$insertNode(_el$87, _el$90);
1756
+ _$insertNode(_el$87, _el$98);
1757
+ _$insertNode(_el$87, _el$103);
1758
+ _$setProp(_el$87, "flexDirection", "column");
1759
+ _$setProp(_el$87, "gap", 0);
1760
+ _$setProp(_el$87, "padding", 1);
1761
+ _$setProp(_el$87, "border", true);
1762
+ _$insert(_el$87, _$createComponent(For, {
1262
1763
  get each() {
1263
1764
  return cur().options;
1264
1765
  },
@@ -1267,36 +1768,36 @@ function QuizBatchDialog(props) {
1267
1768
  const foc = () => focused() === "options" && optionIndex() === id;
1268
1769
  const sel = () => selected().has(`opt:${id}`);
1269
1770
  return (() => {
1270
- var _el$131 = _$createElement("box"), _el$132 = _$createElement("box"), _el$133 = _$createElement("text"), _el$134 = _$createElement("box"), _el$135 = _$createElement("text"), _el$136 = _$createElement("box"), _el$137 = _$createElement("text"), _el$138 = _$createTextNode(`. `);
1771
+ var _el$128 = _$createElement("box"), _el$129 = _$createElement("box"), _el$130 = _$createElement("text"), _el$131 = _$createElement("box"), _el$132 = _$createElement("text"), _el$133 = _$createElement("box"), _el$134 = _$createElement("text"), _el$135 = _$createTextNode(`. `);
1772
+ _$insertNode(_el$128, _el$129);
1773
+ _$insertNode(_el$128, _el$131);
1774
+ _$insertNode(_el$128, _el$133);
1775
+ _$setProp(_el$128, "flexDirection", "row");
1776
+ _$setProp(_el$128, "alignItems", "flexStart");
1777
+ _$setProp(_el$128, "gap", 1);
1778
+ _$setProp(_el$128, "paddingLeft", 1);
1779
+ _$insertNode(_el$129, _el$130);
1780
+ _$setProp(_el$129, "width", 2);
1781
+ _$insert(_el$130, () => foc() ? "\u25B8" : " ");
1271
1782
  _$insertNode(_el$131, _el$132);
1272
- _$insertNode(_el$131, _el$134);
1273
- _$insertNode(_el$131, _el$136);
1274
- _$setProp(_el$131, "flexDirection", "row");
1275
- _$setProp(_el$131, "alignItems", "flexStart");
1276
- _$setProp(_el$131, "gap", 1);
1277
- _$setProp(_el$131, "paddingLeft", 1);
1278
- _$insertNode(_el$132, _el$133);
1279
- _$setProp(_el$132, "width", 2);
1280
- _$insert(_el$133, () => foc() ? "\u25B8" : " ");
1281
- _$insertNode(_el$134, _el$135);
1282
- _$setProp(_el$134, "width", 2);
1283
- _$insert(_el$135, (() => {
1284
- var _c$7 = _$memo(() => !!isMulti());
1285
- return () => _c$7() ? sel() ? "\u2611" : "\u2610" : sel() ? "\u2B22" : "\u25CB";
1783
+ _$setProp(_el$131, "width", 2);
1784
+ _$insert(_el$132, (() => {
1785
+ var _c$8 = _$memo(() => !!isMulti());
1786
+ return () => _c$8() ? sel() ? "\u2611" : "\u2610" : sel() ? "\u2B22" : "\u25CB";
1286
1787
  })());
1287
- _$insertNode(_el$136, _el$137);
1288
- _$setProp(_el$136, "flexGrow", 1);
1289
- _$insertNode(_el$137, _el$138);
1290
- _$setProp(_el$137, "wrapMode", "wrap");
1291
- _$insert(_el$137, id + 1, _el$138);
1292
- _$insert(_el$137, () => opt.label, null);
1788
+ _$insertNode(_el$133, _el$134);
1789
+ _$setProp(_el$133, "flexGrow", 1);
1790
+ _$insertNode(_el$134, _el$135);
1791
+ _$setProp(_el$134, "wrapMode", "wrap");
1792
+ _$insert(_el$134, id + 1, _el$135);
1793
+ _$insert(_el$134, () => opt.label, null);
1293
1794
  _$effect((_p$) => {
1294
- var _v$79 = foc() ? theme().backgroundElement : undefined, _v$80 = foc() ? theme().accent : theme().textMuted, _v$81 = isMulti() ? sel() ? theme().success : theme().textMuted : sel() ? theme().accent : theme().textMuted, _v$82 = sel() ? theme().text : theme().textMuted, _v$83 = foc();
1295
- _v$79 !== _p$.e && (_p$.e = _$setProp(_el$131, "backgroundColor", _v$79, _p$.e));
1296
- _v$80 !== _p$.t && (_p$.t = _$setProp(_el$133, "fg", _v$80, _p$.t));
1297
- _v$81 !== _p$.a && (_p$.a = _$setProp(_el$135, "fg", _v$81, _p$.a));
1298
- _v$82 !== _p$.o && (_p$.o = _$setProp(_el$137, "fg", _v$82, _p$.o));
1299
- _v$83 !== _p$.i && (_p$.i = _$setProp(_el$137, "bold", _v$83, _p$.i));
1795
+ var _v$102 = foc() ? theme().backgroundElement : undefined, _v$103 = foc() ? theme().accent : theme().textMuted, _v$104 = isMulti() ? sel() ? theme().success : theme().textMuted : sel() ? theme().accent : theme().textMuted, _v$105 = sel() ? theme().text : theme().textMuted, _v$106 = foc();
1796
+ _v$102 !== _p$.e && (_p$.e = _$setProp(_el$128, "backgroundColor", _v$102, _p$.e));
1797
+ _v$103 !== _p$.t && (_p$.t = _$setProp(_el$130, "fg", _v$103, _p$.t));
1798
+ _v$104 !== _p$.a && (_p$.a = _$setProp(_el$132, "fg", _v$104, _p$.a));
1799
+ _v$105 !== _p$.o && (_p$.o = _$setProp(_el$134, "fg", _v$105, _p$.o));
1800
+ _v$106 !== _p$.i && (_p$.i = _$setProp(_el$134, "bold", _v$106, _p$.i));
1300
1801
  return _p$;
1301
1802
  }, {
1302
1803
  e: undefined,
@@ -1305,120 +1806,123 @@ function QuizBatchDialog(props) {
1305
1806
  o: undefined,
1306
1807
  i: undefined
1307
1808
  });
1308
- return _el$131;
1809
+ return _el$128;
1309
1810
  })();
1310
1811
  }
1311
- }), _el$91);
1812
+ }), _el$88);
1813
+ _$insertNode(_el$88, _el$89);
1814
+ _$setProp(_el$88, "height", 1);
1815
+ _$insert(_el$89, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
1816
+ _$insertNode(_el$90, _el$91);
1817
+ _$insertNode(_el$90, _el$93);
1818
+ _$insertNode(_el$90, _el$95);
1819
+ _$setProp(_el$90, "flexDirection", "row");
1820
+ _$setProp(_el$90, "gap", 1);
1821
+ _$setProp(_el$90, "paddingLeft", 1);
1312
1822
  _$insertNode(_el$91, _el$92);
1313
- _$setProp(_el$91, "height", 1);
1314
- _$insert(_el$92, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
1823
+ _$setProp(_el$91, "width", 2);
1824
+ _$insert(_el$92, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
1315
1825
  _$insertNode(_el$93, _el$94);
1316
- _$insertNode(_el$93, _el$96);
1317
- _$insertNode(_el$93, _el$98);
1318
- _$setProp(_el$93, "flexDirection", "row");
1319
- _$setProp(_el$93, "gap", 1);
1320
- _$setProp(_el$93, "paddingLeft", 1);
1321
- _$insertNode(_el$94, _el$95);
1322
- _$setProp(_el$94, "width", 2);
1323
- _$insert(_el$95, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
1324
- _$insertNode(_el$96, _el$97);
1325
- _$setProp(_el$96, "width", 2);
1326
- _$insert(_el$97, () => dontKnow() ? "\u2611" : "\u2610");
1826
+ _$setProp(_el$93, "width", 2);
1827
+ _$insert(_el$94, () => dontKnow() ? "\u2611" : "\u2610");
1828
+ _$insertNode(_el$95, _el$96);
1829
+ _$setProp(_el$95, "flexGrow", 1);
1830
+ _$insertNode(_el$96, _$createTextNode(`I don't know`));
1831
+ _$setProp(_el$96, "italic", true);
1327
1832
  _$insertNode(_el$98, _el$99);
1328
- _$setProp(_el$98, "flexGrow", 1);
1329
- _$insertNode(_el$99, _$createTextNode(`I don't know`));
1330
- _$setProp(_el$99, "italic", true);
1331
- _$insertNode(_el$101, _el$102);
1332
- _$insertNode(_el$101, _el$104);
1333
- _$setProp(_el$101, "flexDirection", "column");
1334
- _$setProp(_el$101, "paddingTop", 1);
1335
- _$insertNode(_el$102, _$createTextNode(`\u270E Note`));
1336
- _$setProp(_el$104, "border", true);
1337
- _$setProp(_el$104, "paddingLeft", 1);
1338
- _$setProp(_el$104, "paddingRight", 1);
1339
- _$insert(_el$104, _$createComponent(Show, {
1833
+ _$insertNode(_el$98, _el$101);
1834
+ _$setProp(_el$98, "flexDirection", "column");
1835
+ _$setProp(_el$98, "paddingTop", 1);
1836
+ _$insertNode(_el$99, _$createTextNode(`\u270E Note`));
1837
+ _$setProp(_el$101, "border", true);
1838
+ _$setProp(_el$101, "paddingLeft", 1);
1839
+ _$setProp(_el$101, "paddingRight", 1);
1840
+ _$insert(_el$101, _$createComponent(Show, {
1340
1841
  get when() {
1341
1842
  return focused() === "note";
1342
1843
  },
1343
1844
  get fallback() {
1344
1845
  return (() => {
1345
- var _el$139 = _$createElement("text");
1346
- _$insert(_el$139, () => note() || "Tab to edit \xB7 share what you were thinking");
1347
- _$effect((_$p) => _$setProp(_el$139, "fg", theme().textMuted, _$p));
1348
- return _el$139;
1846
+ var _el$136 = _$createElement("text");
1847
+ _$insert(_el$136, () => note() || "Tab to edit \xB7 share what you were thinking");
1848
+ _$effect((_$p) => _$setProp(_el$136, "fg", theme().textMuted, _$p));
1849
+ return _el$136;
1349
1850
  })();
1350
1851
  },
1351
1852
  get children() {
1352
- var _el$105 = _$createElement("input");
1353
- _$use((el) => noteEl = el, _el$105);
1354
- _$setProp(_el$105, "onInput", (v) => setNote(typeof v === "string" ? v : v?.target?.value ?? ""));
1355
- _$setProp(_el$105, "onSubmit", () => {
1853
+ var _el$102 = _$createElement("input");
1854
+ _$use((el) => noteEl = el, _el$102);
1855
+ _$setProp(_el$102, "onInput", (v) => setNote(typeof v === "string" ? v : v?.target?.value ?? ""));
1856
+ _$setProp(_el$102, "onSubmit", () => {
1356
1857
  if (!selected().size && !dontKnow() && note().trim())
1357
1858
  submitSelect();
1358
1859
  else
1359
1860
  setFocused("options");
1360
1861
  });
1361
- _$setProp(_el$105, "placeholder", "note (Enter to submit note \u2192 classify)");
1362
- _$effect((_$p) => _$setProp(_el$105, "value", note(), _$p));
1363
- return _el$105;
1862
+ _$setProp(_el$102, "placeholder", "note (Enter to submit note \u2192 classify)");
1863
+ _$effect((_$p) => _$setProp(_el$102, "value", note(), _$p));
1864
+ return _el$102;
1364
1865
  }
1365
1866
  }));
1366
- _$insertNode(_el$106, _el$107);
1367
- _$insertNode(_el$106, _el$108);
1368
- _$setProp(_el$106, "flexDirection", "row");
1369
- _$setProp(_el$106, "justifyContent", "space-between");
1370
- _$setProp(_el$106, "paddingTop", 1);
1371
- _$insert(_el$107, () => focused() === "note" ? "Enter submit note \u2192 classify \xB7 Tab back \xB7 Esc back" : "Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Ctrl+Enter submit");
1372
- _$insertNode(_el$108, _el$109);
1373
- _$insert(_el$108, () => idx() + 1, _el$109);
1374
- _$insert(_el$108, () => props.request.quizzes.length, null);
1375
- _$insert(_el$90, _$createComponent(Show, {
1867
+ _$insertNode(_el$103, _el$104);
1868
+ _$insertNode(_el$103, _el$105);
1869
+ _$setProp(_el$103, "flexDirection", "row");
1870
+ _$setProp(_el$103, "justifyContent", "space-between");
1871
+ _$setProp(_el$103, "paddingTop", 1);
1872
+ _$insert(_el$104, (() => {
1873
+ var _c$6 = _$memo(() => !!isMulti());
1874
+ return () => _c$6() ? `${selected().size} selected` : note().trim() && !selected().size ? "note \u2192 classify" : "";
1875
+ })());
1876
+ _$insertNode(_el$105, _el$106);
1877
+ _$insert(_el$105, () => idx() + 1, _el$106);
1878
+ _$insert(_el$105, () => props.request.quizzes.length, null);
1879
+ _$insert(_el$87, _$createComponent(Show, {
1376
1880
  get when() {
1377
1881
  return isMulti();
1378
1882
  },
1379
1883
  get children() {
1380
- var _el$110 = _$createElement("box"), _el$111 = _$createElement("box"), _el$112 = _$createElement("text"), _el$113 = _$createElement("text");
1381
- _$insertNode(_el$110, _el$111);
1382
- _$setProp(_el$110, "justifyContent", "center");
1383
- _$setProp(_el$110, "paddingTop", 1);
1384
- _$insertNode(_el$111, _el$112);
1385
- _$insertNode(_el$111, _el$113);
1386
- _$setProp(_el$111, "flexDirection", "row");
1387
- _$setProp(_el$111, "gap", 1);
1388
- _$setProp(_el$111, "border", true);
1389
- _$setProp(_el$111, "paddingLeft", 2);
1390
- _$setProp(_el$111, "paddingRight", 2);
1391
- _$insert(_el$112, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
1392
- _$insertNode(_el$113, _$createTextNode(`\u21B3 Submit`));
1393
- _$setProp(_el$113, "bold", true);
1884
+ var _el$107 = _$createElement("box"), _el$108 = _$createElement("box"), _el$109 = _$createElement("text"), _el$110 = _$createElement("text");
1885
+ _$insertNode(_el$107, _el$108);
1886
+ _$setProp(_el$107, "justifyContent", "center");
1887
+ _$setProp(_el$107, "paddingTop", 1);
1888
+ _$insertNode(_el$108, _el$109);
1889
+ _$insertNode(_el$108, _el$110);
1890
+ _$setProp(_el$108, "flexDirection", "row");
1891
+ _$setProp(_el$108, "gap", 1);
1892
+ _$setProp(_el$108, "border", true);
1893
+ _$setProp(_el$108, "paddingLeft", 2);
1894
+ _$setProp(_el$108, "paddingRight", 2);
1895
+ _$insert(_el$109, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
1896
+ _$insertNode(_el$110, _$createTextNode(`\u21B3 Submit`));
1897
+ _$setProp(_el$110, "bold", true);
1394
1898
  _$effect((_p$) => {
1395
- var _v$43 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().borderSubtle, _v$44 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : theme().background, _v$45 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().textMuted;
1396
- _v$43 !== _p$.e && (_p$.e = _$setProp(_el$111, "borderColor", _v$43, _p$.e));
1397
- _v$44 !== _p$.t && (_p$.t = _$setProp(_el$111, "backgroundColor", _v$44, _p$.t));
1398
- _v$45 !== _p$.a && (_p$.a = _$setProp(_el$112, "fg", _v$45, _p$.a));
1899
+ var _v$59 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().borderSubtle, _v$60 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : theme().background, _v$61 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().textMuted;
1900
+ _v$59 !== _p$.e && (_p$.e = _$setProp(_el$108, "borderColor", _v$59, _p$.e));
1901
+ _v$60 !== _p$.t && (_p$.t = _$setProp(_el$108, "backgroundColor", _v$60, _p$.t));
1902
+ _v$61 !== _p$.a && (_p$.a = _$setProp(_el$109, "fg", _v$61, _p$.a));
1399
1903
  return _p$;
1400
1904
  }, {
1401
1905
  e: undefined,
1402
1906
  t: undefined,
1403
1907
  a: undefined
1404
1908
  });
1405
- return _el$110;
1909
+ return _el$107;
1406
1910
  }
1407
1911
  }), null);
1408
1912
  _$effect((_p$) => {
1409
- var _v$46 = theme().borderSubtle, _v$47 = theme().background, _v$48 = theme().borderSubtle, _v$49 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$50 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$51 = dontKnow() ? theme().warning : theme().textMuted, _v$52 = dontKnow() ? theme().warning : theme().textMuted, _v$53 = focused() === "note" ? theme().accent : theme().textMuted, _v$54 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$55 = theme().backgroundElement, _v$56 = theme().textMuted, _v$57 = theme().textMuted;
1410
- _v$46 !== _p$.e && (_p$.e = _$setProp(_el$90, "borderColor", _v$46, _p$.e));
1411
- _v$47 !== _p$.t && (_p$.t = _$setProp(_el$90, "backgroundColor", _v$47, _p$.t));
1412
- _v$48 !== _p$.a && (_p$.a = _$setProp(_el$92, "fg", _v$48, _p$.a));
1413
- _v$49 !== _p$.o && (_p$.o = _$setProp(_el$93, "backgroundColor", _v$49, _p$.o));
1414
- _v$50 !== _p$.i && (_p$.i = _$setProp(_el$95, "fg", _v$50, _p$.i));
1415
- _v$51 !== _p$.n && (_p$.n = _$setProp(_el$97, "fg", _v$51, _p$.n));
1416
- _v$52 !== _p$.s && (_p$.s = _$setProp(_el$99, "fg", _v$52, _p$.s));
1417
- _v$53 !== _p$.h && (_p$.h = _$setProp(_el$102, "fg", _v$53, _p$.h));
1418
- _v$54 !== _p$.r && (_p$.r = _$setProp(_el$104, "borderColor", _v$54, _p$.r));
1419
- _v$55 !== _p$.d && (_p$.d = _$setProp(_el$104, "backgroundColor", _v$55, _p$.d));
1420
- _v$56 !== _p$.l && (_p$.l = _$setProp(_el$107, "fg", _v$56, _p$.l));
1421
- _v$57 !== _p$.u && (_p$.u = _$setProp(_el$108, "fg", _v$57, _p$.u));
1913
+ var _v$62 = theme().borderSubtle, _v$63 = theme().background, _v$64 = theme().borderSubtle, _v$65 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$66 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$67 = dontKnow() ? theme().warning : theme().textMuted, _v$68 = dontKnow() ? theme().warning : theme().textMuted, _v$69 = focused() === "note" ? theme().accent : theme().textMuted, _v$70 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$71 = theme().backgroundElement, _v$72 = theme().textMuted, _v$73 = theme().textMuted;
1914
+ _v$62 !== _p$.e && (_p$.e = _$setProp(_el$87, "borderColor", _v$62, _p$.e));
1915
+ _v$63 !== _p$.t && (_p$.t = _$setProp(_el$87, "backgroundColor", _v$63, _p$.t));
1916
+ _v$64 !== _p$.a && (_p$.a = _$setProp(_el$89, "fg", _v$64, _p$.a));
1917
+ _v$65 !== _p$.o && (_p$.o = _$setProp(_el$90, "backgroundColor", _v$65, _p$.o));
1918
+ _v$66 !== _p$.i && (_p$.i = _$setProp(_el$92, "fg", _v$66, _p$.i));
1919
+ _v$67 !== _p$.n && (_p$.n = _$setProp(_el$94, "fg", _v$67, _p$.n));
1920
+ _v$68 !== _p$.s && (_p$.s = _$setProp(_el$96, "fg", _v$68, _p$.s));
1921
+ _v$69 !== _p$.h && (_p$.h = _$setProp(_el$99, "fg", _v$69, _p$.h));
1922
+ _v$70 !== _p$.r && (_p$.r = _$setProp(_el$101, "borderColor", _v$70, _p$.r));
1923
+ _v$71 !== _p$.d && (_p$.d = _$setProp(_el$101, "backgroundColor", _v$71, _p$.d));
1924
+ _v$72 !== _p$.l && (_p$.l = _$setProp(_el$104, "fg", _v$72, _p$.l));
1925
+ _v$73 !== _p$.u && (_p$.u = _$setProp(_el$105, "fg", _v$73, _p$.u));
1422
1926
  return _p$;
1423
1927
  }, {
1424
1928
  e: undefined,
@@ -1434,37 +1938,37 @@ function QuizBatchDialog(props) {
1434
1938
  l: undefined,
1435
1939
  u: undefined
1436
1940
  });
1437
- return _el$90;
1941
+ return _el$87;
1438
1942
  }
1439
1943
  }), null);
1440
- _$insert(_el$87, _$createComponent(Show, {
1944
+ _$insert(_el$84, _$createComponent(Show, {
1441
1945
  get when() {
1442
1946
  return phase() === "classifying";
1443
1947
  },
1444
1948
  get children() {
1445
- var _el$115 = _$createElement("box"), _el$116 = _$createElement("text"), _el$118 = _$createElement("text"), _el$119 = _$createTextNode(`"`), _el$120 = _$createTextNode(`"`), _el$121 = _$createElement("text");
1949
+ var _el$112 = _$createElement("box"), _el$113 = _$createElement("text"), _el$115 = _$createElement("text"), _el$116 = _$createTextNode(`"`), _el$117 = _$createTextNode(`"`), _el$118 = _$createElement("text");
1950
+ _$insertNode(_el$112, _el$113);
1951
+ _$insertNode(_el$112, _el$115);
1952
+ _$insertNode(_el$112, _el$118);
1953
+ _$setProp(_el$112, "flexDirection", "column");
1954
+ _$setProp(_el$112, "gap", 1);
1955
+ _$setProp(_el$112, "padding", 1);
1956
+ _$setProp(_el$112, "border", true);
1957
+ _$setProp(_el$112, "alignItems", "center");
1958
+ _$insertNode(_el$113, _$createTextNode(`\u25D0 Classifying your note...`));
1959
+ _$setProp(_el$113, "bold", true);
1446
1960
  _$insertNode(_el$115, _el$116);
1447
- _$insertNode(_el$115, _el$118);
1448
- _$insertNode(_el$115, _el$121);
1449
- _$setProp(_el$115, "flexDirection", "column");
1450
- _$setProp(_el$115, "gap", 1);
1451
- _$setProp(_el$115, "padding", 1);
1452
- _$setProp(_el$115, "border", true);
1453
- _$setProp(_el$115, "alignItems", "center");
1454
- _$insertNode(_el$116, _$createTextNode(`\u25D0 Classifying your note...`));
1455
- _$setProp(_el$116, "bold", true);
1456
- _$insertNode(_el$118, _el$119);
1457
- _$insertNode(_el$118, _el$120);
1458
- _$setProp(_el$118, "wrapMode", "wrap");
1459
- _$insert(_el$118, note, _el$120);
1460
- _$insertNode(_el$121, _$createTextNode(`Mapping to options \u2014 please wait`));
1961
+ _$insertNode(_el$115, _el$117);
1962
+ _$setProp(_el$115, "wrapMode", "wrap");
1963
+ _$insert(_el$115, note, _el$117);
1964
+ _$insertNode(_el$118, _$createTextNode(`Mapping to options \u2014 please wait`));
1461
1965
  _$effect((_p$) => {
1462
- var _v$58 = theme().accent, _v$59 = theme().background, _v$60 = theme().accent, _v$61 = theme().textMuted, _v$62 = theme().textMuted;
1463
- _v$58 !== _p$.e && (_p$.e = _$setProp(_el$115, "borderColor", _v$58, _p$.e));
1464
- _v$59 !== _p$.t && (_p$.t = _$setProp(_el$115, "backgroundColor", _v$59, _p$.t));
1465
- _v$60 !== _p$.a && (_p$.a = _$setProp(_el$116, "fg", _v$60, _p$.a));
1466
- _v$61 !== _p$.o && (_p$.o = _$setProp(_el$118, "fg", _v$61, _p$.o));
1467
- _v$62 !== _p$.i && (_p$.i = _$setProp(_el$121, "fg", _v$62, _p$.i));
1966
+ var _v$74 = theme().accent, _v$75 = theme().background, _v$76 = theme().accent, _v$77 = theme().textMuted, _v$78 = theme().textMuted;
1967
+ _v$74 !== _p$.e && (_p$.e = _$setProp(_el$112, "borderColor", _v$74, _p$.e));
1968
+ _v$75 !== _p$.t && (_p$.t = _$setProp(_el$112, "backgroundColor", _v$75, _p$.t));
1969
+ _v$76 !== _p$.a && (_p$.a = _$setProp(_el$113, "fg", _v$76, _p$.a));
1970
+ _v$77 !== _p$.o && (_p$.o = _$setProp(_el$115, "fg", _v$77, _p$.o));
1971
+ _v$78 !== _p$.i && (_p$.i = _$setProp(_el$118, "fg", _v$78, _p$.i));
1468
1972
  return _p$;
1469
1973
  }, {
1470
1974
  e: undefined,
@@ -1473,23 +1977,23 @@ function QuizBatchDialog(props) {
1473
1977
  o: undefined,
1474
1978
  i: undefined
1475
1979
  });
1476
- return _el$115;
1980
+ return _el$112;
1477
1981
  }
1478
1982
  }), null);
1479
- _$insert(_el$87, _$createComponent(Show, {
1983
+ _$insert(_el$84, _$createComponent(Show, {
1480
1984
  get when() {
1481
1985
  return phase() === "feedback";
1482
1986
  },
1483
1987
  get children() {
1484
- var _el$123 = _$createElement("box"), _el$124 = _$createElement("text"), _el$125 = _$createElement("text"), _el$126 = _$createTextNode(`Correct: `), _el$127 = _$createElement("box"), _el$128 = _$createElement("text");
1485
- _$insertNode(_el$123, _el$124);
1486
- _$insertNode(_el$123, _el$125);
1487
- _$insertNode(_el$123, _el$127);
1488
- _$setProp(_el$123, "flexDirection", "column");
1489
- _$setProp(_el$123, "gap", 1);
1490
- _$setProp(_el$123, "padding", 1);
1491
- _$setProp(_el$123, "border", true);
1492
- _$insert(_el$123, _$createComponent(For, {
1988
+ var _el$120 = _$createElement("box"), _el$121 = _$createElement("text"), _el$122 = _$createElement("text"), _el$123 = _$createTextNode(`Correct: `), _el$124 = _$createElement("box"), _el$125 = _$createElement("markdown");
1989
+ _$insertNode(_el$120, _el$121);
1990
+ _$insertNode(_el$120, _el$122);
1991
+ _$insertNode(_el$120, _el$124);
1992
+ _$setProp(_el$120, "flexDirection", "column");
1993
+ _$setProp(_el$120, "gap", 1);
1994
+ _$setProp(_el$120, "padding", 1);
1995
+ _$setProp(_el$120, "border", true);
1996
+ _$insert(_el$120, _$createComponent(For, {
1493
1997
  get each() {
1494
1998
  return cur().options;
1495
1999
  },
@@ -1518,47 +2022,48 @@ function QuizBatchDialog(props) {
1518
2022
  bg = theme().warning;
1519
2023
  }
1520
2024
  return (() => {
1521
- var _el$140 = _$createElement("box"), _el$141 = _$createElement("box"), _el$142 = _$createElement("text"), _el$143 = _$createElement("box"), _el$144 = _$createElement("text"), _el$145 = _$createTextNode(`. `);
2025
+ var _el$137 = _$createElement("box"), _el$138 = _$createElement("box"), _el$139 = _$createElement("text"), _el$140 = _$createElement("box"), _el$141 = _$createElement("text"), _el$142 = _$createTextNode(`. `);
2026
+ _$insertNode(_el$137, _el$138);
2027
+ _$insertNode(_el$137, _el$140);
2028
+ _$setProp(_el$137, "flexDirection", "row");
2029
+ _$setProp(_el$137, "gap", 1);
2030
+ _$setProp(_el$137, "paddingLeft", 1);
2031
+ _$setProp(_el$137, "backgroundColor", bg);
2032
+ _$insertNode(_el$138, _el$139);
2033
+ _$setProp(_el$138, "width", 2);
2034
+ _$setProp(_el$139, "fg", fg);
2035
+ _$setProp(_el$139, "bold", true);
2036
+ _$insert(_el$139, ic);
1522
2037
  _$insertNode(_el$140, _el$141);
1523
- _$insertNode(_el$140, _el$143);
1524
- _$setProp(_el$140, "flexDirection", "row");
1525
- _$setProp(_el$140, "gap", 1);
1526
- _$setProp(_el$140, "paddingLeft", 1);
1527
- _$setProp(_el$140, "backgroundColor", bg);
2038
+ _$setProp(_el$140, "flexGrow", 1);
1528
2039
  _$insertNode(_el$141, _el$142);
1529
- _$setProp(_el$141, "width", 2);
1530
- _$setProp(_el$142, "fg", fg);
1531
- _$setProp(_el$142, "bold", true);
1532
- _$insert(_el$142, ic);
1533
- _$insertNode(_el$143, _el$144);
1534
- _$setProp(_el$143, "flexGrow", 1);
1535
- _$insertNode(_el$144, _el$145);
1536
- _$setProp(_el$144, "fg", fg);
1537
- _$setProp(_el$144, "wrapMode", "wrap");
1538
- _$insert(_el$144, id, _el$145);
1539
- _$insert(_el$144, () => opt.label, null);
1540
- return _el$140;
2040
+ _$setProp(_el$141, "fg", fg);
2041
+ _$setProp(_el$141, "wrapMode", "wrap");
2042
+ _$insert(_el$141, id, _el$142);
2043
+ _$insert(_el$141, () => opt.label, null);
2044
+ return _el$137;
1541
2045
  })();
1542
2046
  }
1543
- }), _el$124);
1544
- _$setProp(_el$124, "bold", true);
1545
- _$insert(_el$124, () => feedback()?.correct ? "\u2713 Correct" : "\u2717 Incorrect");
1546
- _$insertNode(_el$125, _el$126);
1547
- _$insert(_el$125, () => cur().correctIndices.map((i) => `${i}. ${cur().options[i - 1]?.label}`).join(", "), null);
1548
- _$insertNode(_el$127, _el$128);
1549
- _$setProp(_el$127, "border", true);
1550
- _$setProp(_el$127, "padding", 1);
1551
- _$setProp(_el$128, "wrapMode", "wrap");
1552
- _$insert(_el$128, () => cur().explanation);
2047
+ }), _el$121);
2048
+ _$setProp(_el$121, "bold", true);
2049
+ _$insert(_el$121, () => feedback()?.correct ? "\u2713 Correct" : "\u2717 Incorrect");
2050
+ _$insertNode(_el$122, _el$123);
2051
+ _$insert(_el$122, () => cur().correctIndices.map((i) => `${i}. ${cur().options[i - 1]?.label}`).join(", "), null);
2052
+ _$insertNode(_el$124, _el$125);
2053
+ _$setProp(_el$124, "border", true);
2054
+ _$setProp(_el$124, "padding", 1);
1553
2055
  _$effect((_p$) => {
1554
- var _v$63 = feedback()?.correct ? theme().success : theme().error, _v$64 = theme().background, _v$65 = feedback()?.correct ? theme().success : theme().error, _v$66 = theme().textMuted, _v$67 = theme().borderSubtle, _v$68 = theme().backgroundPanel, _v$69 = theme().text;
1555
- _v$63 !== _p$.e && (_p$.e = _$setProp(_el$123, "borderColor", _v$63, _p$.e));
1556
- _v$64 !== _p$.t && (_p$.t = _$setProp(_el$123, "backgroundColor", _v$64, _p$.t));
1557
- _v$65 !== _p$.a && (_p$.a = _$setProp(_el$124, "fg", _v$65, _p$.a));
1558
- _v$66 !== _p$.o && (_p$.o = _$setProp(_el$125, "fg", _v$66, _p$.o));
1559
- _v$67 !== _p$.i && (_p$.i = _$setProp(_el$127, "borderColor", _v$67, _p$.i));
1560
- _v$68 !== _p$.n && (_p$.n = _$setProp(_el$127, "backgroundColor", _v$68, _p$.n));
1561
- _v$69 !== _p$.s && (_p$.s = _$setProp(_el$128, "fg", _v$69, _p$.s));
2056
+ var _v$79 = feedback()?.correct ? theme().success : theme().error, _v$80 = theme().background, _v$81 = feedback()?.correct ? theme().success : theme().error, _v$82 = theme().textMuted, _v$83 = theme().borderSubtle, _v$84 = theme().backgroundPanel, _v$85 = syntax(), _v$86 = decodeQuizText(cur().explanation), _v$87 = theme().text, _v$88 = theme().backgroundPanel;
2057
+ _v$79 !== _p$.e && (_p$.e = _$setProp(_el$120, "borderColor", _v$79, _p$.e));
2058
+ _v$80 !== _p$.t && (_p$.t = _$setProp(_el$120, "backgroundColor", _v$80, _p$.t));
2059
+ _v$81 !== _p$.a && (_p$.a = _$setProp(_el$121, "fg", _v$81, _p$.a));
2060
+ _v$82 !== _p$.o && (_p$.o = _$setProp(_el$122, "fg", _v$82, _p$.o));
2061
+ _v$83 !== _p$.i && (_p$.i = _$setProp(_el$124, "borderColor", _v$83, _p$.i));
2062
+ _v$84 !== _p$.n && (_p$.n = _$setProp(_el$124, "backgroundColor", _v$84, _p$.n));
2063
+ _v$85 !== _p$.s && (_p$.s = _$setProp(_el$125, "syntaxStyle", _v$85, _p$.s));
2064
+ _v$86 !== _p$.h && (_p$.h = _$setProp(_el$125, "content", _v$86, _p$.h));
2065
+ _v$87 !== _p$.r && (_p$.r = _$setProp(_el$125, "fg", _v$87, _p$.r));
2066
+ _v$88 !== _p$.d && (_p$.d = _$setProp(_el$125, "bg", _v$88, _p$.d));
1562
2067
  return _p$;
1563
2068
  }, {
1564
2069
  e: undefined,
@@ -1567,29 +2072,43 @@ function QuizBatchDialog(props) {
1567
2072
  o: undefined,
1568
2073
  i: undefined,
1569
2074
  n: undefined,
1570
- s: undefined
2075
+ s: undefined,
2076
+ h: undefined,
2077
+ r: undefined,
2078
+ d: undefined
1571
2079
  });
1572
- return _el$123;
2080
+ return _el$120;
1573
2081
  }
1574
2082
  }), null);
1575
- _$insertNode(_el$129, _el$130);
1576
- _$setProp(_el$129, "height", 1);
1577
- _$setProp(_el$129, "justifyContent", "center");
1578
- _$insert(_el$130, (() => {
1579
- var _c$6 = _$memo(() => phase() === "feedback");
1580
- return () => _c$6() ? `Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : phase() === "classifying" ? "Classifying your note..." : "Navigate options \xB7 Tab note \xB7 Esc cancel";
2083
+ _$insertNode(_el$126, _el$127);
2084
+ _$setProp(_el$126, "height", 1);
2085
+ _$setProp(_el$126, "justifyContent", "center");
2086
+ _$setProp(_el$127, "wrapMode", "wrap");
2087
+ _$insert(_el$127, (() => {
2088
+ var _c$7 = _$memo(() => phase() === "feedback");
2089
+ return () => _c$7() ? _$memo(() => !!(canScrollUpBatch() && canScrollDownBatch()))() ? `\u25B2 more above \xB7 \u25BC more below \u2014 d/u to scroll \xB7 Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : _$memo(() => !!canScrollDownBatch())() ? `\u25BC more below \u2014 d to scroll \xB7 Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : _$memo(() => !!canScrollUpBatch())() ? `\u25B2 more above \u2014 u to scroll \xB7 Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : `Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : _$memo(() => phase() === "classifying")() ? "Classifying your note..." : _$memo(() => focused() === "note")() ? "Enter submit note \u2192 classify \xB7 Tab/Esc back" : canScrollUpBatch() || canScrollDownBatch() ? "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel \xB7 d/u scroll" : "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel";
1581
2090
  })());
1582
2091
  _$effect((_p$) => {
1583
- var _v$70 = popupWidth(), _v$71 = popupHeight(), _v$72 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$73 = theme().backgroundPanel, _v$74 = theme().accent, _v$75 = theme().background, _v$76 = theme().background, _v$77 = theme().text, _v$78 = theme().textMuted;
1584
- _v$70 !== _p$.e && (_p$.e = _$setProp(_el$79, "width", _v$70, _p$.e));
1585
- _v$71 !== _p$.t && (_p$.t = _$setProp(_el$79, "height", _v$71, _p$.t));
1586
- _v$72 !== _p$.a && (_p$.a = _$setProp(_el$79, "borderColor", _v$72, _p$.a));
1587
- _v$73 !== _p$.o && (_p$.o = _$setProp(_el$79, "backgroundColor", _v$73, _p$.o));
1588
- _v$74 !== _p$.i && (_p$.i = _$setProp(_el$80, "backgroundColor", _v$74, _p$.i));
1589
- _v$75 !== _p$.n && (_p$.n = _$setProp(_el$81, "fg", _v$75, _p$.n));
1590
- _v$76 !== _p$.s && (_p$.s = _$setProp(_el$85, "fg", _v$76, _p$.s));
1591
- _v$77 !== _p$.h && (_p$.h = _$setProp(_el$88, "fg", _v$77, _p$.h));
1592
- _v$78 !== _p$.r && (_p$.r = _$setProp(_el$130, "fg", _v$78, _p$.r));
2092
+ var _v$89 = popupWidth(), _v$90 = popupHeight(), _v$91 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$92 = theme().backgroundPanel, _v$93 = theme().accent, _v$94 = theme().background, _v$95 = theme().background, _v$96 = {
2093
+ visible: true,
2094
+ trackOptions: {
2095
+ backgroundColor: theme().background,
2096
+ foregroundColor: theme().borderActive
2097
+ }
2098
+ }, _v$97 = syntax(), _v$98 = decodeQuizText(cur().question), _v$99 = theme().text, _v$100 = theme().backgroundPanel, _v$101 = theme().textMuted;
2099
+ _v$89 !== _p$.e && (_p$.e = _$setProp(_el$76, "width", _v$89, _p$.e));
2100
+ _v$90 !== _p$.t && (_p$.t = _$setProp(_el$76, "height", _v$90, _p$.t));
2101
+ _v$91 !== _p$.a && (_p$.a = _$setProp(_el$76, "borderColor", _v$91, _p$.a));
2102
+ _v$92 !== _p$.o && (_p$.o = _$setProp(_el$76, "backgroundColor", _v$92, _p$.o));
2103
+ _v$93 !== _p$.i && (_p$.i = _$setProp(_el$77, "backgroundColor", _v$93, _p$.i));
2104
+ _v$94 !== _p$.n && (_p$.n = _$setProp(_el$78, "fg", _v$94, _p$.n));
2105
+ _v$95 !== _p$.s && (_p$.s = _$setProp(_el$82, "fg", _v$95, _p$.s));
2106
+ _v$96 !== _p$.h && (_p$.h = _$setProp(_el$84, "verticalScrollbarOptions", _v$96, _p$.h));
2107
+ _v$97 !== _p$.r && (_p$.r = _$setProp(_el$85, "syntaxStyle", _v$97, _p$.r));
2108
+ _v$98 !== _p$.d && (_p$.d = _$setProp(_el$85, "content", _v$98, _p$.d));
2109
+ _v$99 !== _p$.l && (_p$.l = _$setProp(_el$85, "fg", _v$99, _p$.l));
2110
+ _v$100 !== _p$.u && (_p$.u = _$setProp(_el$85, "bg", _v$100, _p$.u));
2111
+ _v$101 !== _p$.c && (_p$.c = _$setProp(_el$127, "fg", _v$101, _p$.c));
1593
2112
  return _p$;
1594
2113
  }, {
1595
2114
  e: undefined,
@@ -1600,9 +2119,13 @@ function QuizBatchDialog(props) {
1600
2119
  n: undefined,
1601
2120
  s: undefined,
1602
2121
  h: undefined,
1603
- r: undefined
2122
+ r: undefined,
2123
+ d: undefined,
2124
+ l: undefined,
2125
+ u: undefined,
2126
+ c: undefined
1604
2127
  });
1605
- return _el$79;
2128
+ return _el$76;
1606
2129
  })();
1607
2130
  }
1608
2131
  var tui = async (api) => {