@bojackduy/opencode-learn 0.1.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tui.js CHANGED
@@ -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,9 +257,16 @@ 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
- const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 92));
43
- const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
262
+ const popupWidth = () => {
263
+ const w = dims().width;
264
+ return Math.max(62, Math.min(w - 8, Math.floor(w * 0.8), 92));
265
+ };
266
+ const popupHeight = () => {
267
+ const h = dims().height;
268
+ return Math.max(14, Math.min(h - 6, Math.floor(h * 0.62), 26));
269
+ };
44
270
  const options = () => props.request.options;
45
271
  const correctSet = new Set(props.request.correctIndices);
46
272
  const isMulti = () => !!props.request.multiSelect;
@@ -54,6 +280,40 @@ function QuizDialog(props) {
54
280
  const [selected, setSelected] = createSignal(new Map);
55
281
  const [feedback, setFeedback] = createSignal(null);
56
282
  let noteInputEl;
283
+ let scrollRef;
284
+ const [canScrollUp, setCanScrollUp] = createSignal(false);
285
+ const [canScrollDown, setCanScrollDown] = createSignal(false);
286
+ const updateScrollIndicators = () => {
287
+ try {
288
+ if (!scrollRef) {
289
+ setCanScrollUp(false);
290
+ setCanScrollDown(false);
291
+ return;
292
+ }
293
+ const st = typeof scrollRef.scrollTop === "number" ? scrollRef.scrollTop : 0;
294
+ const h = typeof scrollRef.height === "number" ? scrollRef.height : scrollRef.viewportHeight ?? popupHeight();
295
+ const sh = typeof scrollRef.scrollHeight === "number" ? scrollRef.scrollHeight : 0;
296
+ let effectiveSh = sh;
297
+ if (!effectiveSh && typeof scrollRef.getChildren === "function") {
298
+ try {
299
+ const kids = scrollRef.getChildren();
300
+ if (kids?.length)
301
+ effectiveSh = Math.max(...kids.map((c) => (c.y || 0) + (c.height || 0)), h);
302
+ } catch {}
303
+ }
304
+ if (!effectiveSh || effectiveSh <= h + 1) {
305
+ setCanScrollUp(false);
306
+ setCanScrollDown(false);
307
+ return;
308
+ }
309
+ setCanScrollUp(st > 0);
310
+ setCanScrollDown(st + h < effectiveSh - 1);
311
+ } catch {
312
+ setCanScrollUp(false);
313
+ setCanScrollDown(false);
314
+ }
315
+ };
316
+ const scrollAmount = () => Math.max(1, Math.floor((scrollRef?.height ?? popupHeight()) / 3));
57
317
  createEffect(() => {
58
318
  if (focused() === "note" && noteInputEl) {
59
319
  try {
@@ -61,6 +321,23 @@ function QuizDialog(props) {
61
321
  } catch {}
62
322
  }
63
323
  });
324
+ createEffect(() => {
325
+ phase();
326
+ feedback();
327
+ dims();
328
+ setTimeout(updateScrollIndicators, 40);
329
+ setTimeout(updateScrollIndicators, 200);
330
+ });
331
+ createEffect(() => {
332
+ note();
333
+ setTimeout(updateScrollIndicators, 40);
334
+ });
335
+ createEffect(() => {
336
+ if (phase() !== "feedback" && phase() !== "select")
337
+ return;
338
+ const id = setInterval(updateScrollIndicators, 200);
339
+ onCleanup(() => clearInterval(id));
340
+ });
64
341
  const toggleOption = (idx) => {
65
342
  const opt = options()[idx];
66
343
  if (!opt)
@@ -234,15 +511,78 @@ function QuizDialog(props) {
234
511
  note: note().trim() || undefined
235
512
  });
236
513
  };
514
+ const isPlainKey = (evt, want) => {
515
+ try {
516
+ const n = String(evt.name || evt.sequence || "").toLowerCase();
517
+ if (n !== want.toLowerCase())
518
+ return false;
519
+ if (evt.ctrl || evt.meta || evt.option || evt.alt)
520
+ return false;
521
+ return true;
522
+ } catch {
523
+ return false;
524
+ }
525
+ };
237
526
  useKeyboard((evt) => {
238
527
  const key = evt.name || evt.sequence || evt.raw || "";
239
528
  const seq = evt.sequence || "";
529
+ const lower = String(key || "").toLowerCase();
240
530
  if (phase() === "classifying") {
241
531
  prevent(evt);
242
532
  return;
243
533
  }
244
534
  if (phase() === "feedback") {
245
- if (key === "enter" || seq === "\r" || key === "escape" || key === "esc") {
535
+ if (isPlainKey(evt, "d") || seq === "\x04") {
536
+ prevent(evt);
537
+ try {
538
+ scrollRef?.scrollBy(scrollAmount());
539
+ setTimeout(updateScrollIndicators, 30);
540
+ setTimeout(updateScrollIndicators, 120);
541
+ } catch {}
542
+ return;
543
+ }
544
+ if (isPlainKey(evt, "u") || seq === "\x15") {
545
+ prevent(evt);
546
+ try {
547
+ scrollRef?.scrollBy(-scrollAmount());
548
+ setTimeout(updateScrollIndicators, 30);
549
+ setTimeout(updateScrollIndicators, 120);
550
+ } catch {}
551
+ return;
552
+ }
553
+ if (isPlainKey(evt, "j") || seq === "\x1B[B") {
554
+ prevent(evt);
555
+ try {
556
+ scrollRef?.scrollBy(1);
557
+ setTimeout(updateScrollIndicators, 30);
558
+ } catch {}
559
+ return;
560
+ }
561
+ if (isPlainKey(evt, "k") || seq === "\x1B[A") {
562
+ prevent(evt);
563
+ try {
564
+ scrollRef?.scrollBy(-1);
565
+ setTimeout(updateScrollIndicators, 30);
566
+ } catch {}
567
+ return;
568
+ }
569
+ if (key === "pageup" || seq === "\x1B[5~") {
570
+ prevent(evt);
571
+ try {
572
+ scrollRef?.scrollBy(-scrollAmount());
573
+ setTimeout(updateScrollIndicators, 30);
574
+ } catch {}
575
+ return;
576
+ }
577
+ if (key === "pagedown" || seq === "\x1B[6~") {
578
+ prevent(evt);
579
+ try {
580
+ scrollRef?.scrollBy(scrollAmount());
581
+ setTimeout(updateScrollIndicators, 30);
582
+ } catch {}
583
+ return;
584
+ }
585
+ if (lower === "enter" || seq === "\r" || lower === "escape" || lower === "esc") {
246
586
  prevent(evt);
247
587
  confirmFeedback();
248
588
  }
@@ -266,6 +606,40 @@ function QuizDialog(props) {
266
606
  }
267
607
  return;
268
608
  }
609
+ if (phase() === "select" && (isPlainKey(evt, "d") || seq === "\x04")) {
610
+ prevent(evt);
611
+ try {
612
+ scrollRef?.scrollBy(scrollAmount());
613
+ setTimeout(updateScrollIndicators, 30);
614
+ setTimeout(updateScrollIndicators, 120);
615
+ } catch {}
616
+ return;
617
+ }
618
+ if (phase() === "select" && (isPlainKey(evt, "u") || seq === "\x15")) {
619
+ prevent(evt);
620
+ try {
621
+ scrollRef?.scrollBy(-scrollAmount());
622
+ setTimeout(updateScrollIndicators, 30);
623
+ setTimeout(updateScrollIndicators, 120);
624
+ } catch {}
625
+ return;
626
+ }
627
+ if (phase() === "select" && (lower === "pageup" || seq === "\x1B[5~")) {
628
+ prevent(evt);
629
+ try {
630
+ scrollRef?.scrollBy(-scrollAmount());
631
+ setTimeout(updateScrollIndicators, 30);
632
+ } catch {}
633
+ return;
634
+ }
635
+ if (phase() === "select" && (lower === "pagedown" || seq === "\x1B[6~")) {
636
+ prevent(evt);
637
+ try {
638
+ scrollRef?.scrollBy(scrollAmount());
639
+ setTimeout(updateScrollIndicators, 30);
640
+ } catch {}
641
+ return;
642
+ }
269
643
  const maxIdx = () => {
270
644
  if (isMulti())
271
645
  return submitIdx();
@@ -348,10 +722,10 @@ function QuizDialog(props) {
348
722
  }
349
723
  });
350
724
  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");
725
+ var _el$ = _$createElement("box"), _el$2 = _$createElement("box"), _el$3 = _$createElement("text"), _el$4 = _$createElement("text"), _el$8 = _$createElement("scrollbox"), _el$9 = _$createElement("box"), _el$0 = _$createElement("markdown"), _el$61 = _$createElement("box"), _el$62 = _$createElement("text");
352
726
  _$insertNode(_el$, _el$2);
353
- _$insertNode(_el$, _el$6);
354
- _$insertNode(_el$, _el$62);
727
+ _$insertNode(_el$, _el$8);
728
+ _$insertNode(_el$, _el$61);
355
729
  _$setProp(_el$, "flexDirection", "column");
356
730
  _$setProp(_el$, "border", true);
357
731
  _$setProp(_el$, "padding", 1);
@@ -371,43 +745,79 @@ function QuizDialog(props) {
371
745
  })());
372
746
  _$insertNode(_el$4, _$createTextNode(`learn`));
373
747
  _$setProp(_el$4, "dim", true);
374
- _$insertNode(_el$6, _el$7);
375
- _$setProp(_el$6, "flexGrow", 1);
376
- _$insertNode(_el$7, _el$8);
377
- _$setProp(_el$7, "flexDirection", "column");
378
- _$setProp(_el$7, "gap", 1);
379
- _$setProp(_el$7, "paddingLeft", 1);
380
- _$setProp(_el$7, "paddingRight", 1);
381
- _$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
- _$insert(_el$7, _$createComponent(Show, {
748
+ _$insert(_el$, _$createComponent(Show, {
749
+ get when() {
750
+ return _$memo(() => phase() === "feedback")() && (canScrollUp() || canScrollDown());
751
+ },
752
+ get children() {
753
+ var _el$6 = _$createElement("box"), _el$7 = _$createElement("text");
754
+ _$insertNode(_el$6, _el$7);
755
+ _$setProp(_el$6, "justifyContent", "center");
756
+ _$setProp(_el$6, "height", 1);
757
+ _$setProp(_el$6, "paddingLeft", 1);
758
+ _$setProp(_el$6, "paddingRight", 1);
759
+ _$setProp(_el$7, "bold", true);
760
+ _$insert(_el$7, (() => {
761
+ var _c$2 = _$memo(() => !!(canScrollUp() && canScrollDown()));
762
+ return () => _c$2() ? "\u25B2 more above \xB7 \u25BC more below \u2014 d / u to scroll" : canScrollDown() ? "\u25BC more below \u2014 press d to see explanation" : "\u25B2 more above \u2014 press u to scroll up";
763
+ })());
764
+ _$effect((_p$) => {
765
+ var _v$ = canScrollDown() ? theme().warning : theme().accent, _v$2 = theme().background;
766
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$6, "backgroundColor", _v$, _p$.e));
767
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$7, "fg", _v$2, _p$.t));
768
+ return _p$;
769
+ }, {
770
+ e: undefined,
771
+ t: undefined
772
+ });
773
+ return _el$6;
774
+ }
775
+ }), _el$8);
776
+ _$insertNode(_el$8, _el$9);
777
+ _$use((el) => scrollRef = el, _el$8);
778
+ _$setProp(_el$8, "flexGrow", 1);
779
+ _$insertNode(_el$9, _el$0);
780
+ _$setProp(_el$9, "flexDirection", "column");
781
+ _$setProp(_el$9, "gap", 1);
782
+ _$setProp(_el$9, "paddingLeft", 1);
783
+ _$setProp(_el$9, "paddingRight", 1);
784
+ _$setProp(_el$9, "paddingTop", 1);
785
+ _$insert(_el$9, _$createComponent(Show, {
386
786
  get when() {
387
787
  return props.request.details;
388
788
  },
389
789
  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));
394
- return _el$9;
790
+ var _el$1 = _$createElement("markdown");
791
+ _$effect((_p$) => {
792
+ var _v$3 = syntax(), _v$4 = decodeQuizText(props.request.details), _v$5 = theme().textMuted, _v$6 = theme().backgroundPanel;
793
+ _v$3 !== _p$.e && (_p$.e = _$setProp(_el$1, "syntaxStyle", _v$3, _p$.e));
794
+ _v$4 !== _p$.t && (_p$.t = _$setProp(_el$1, "content", _v$4, _p$.t));
795
+ _v$5 !== _p$.a && (_p$.a = _$setProp(_el$1, "fg", _v$5, _p$.a));
796
+ _v$6 !== _p$.o && (_p$.o = _$setProp(_el$1, "bg", _v$6, _p$.o));
797
+ return _p$;
798
+ }, {
799
+ e: undefined,
800
+ t: undefined,
801
+ a: undefined,
802
+ o: undefined
803
+ });
804
+ return _el$1;
395
805
  }
396
806
  }), null);
397
- _$insert(_el$6, _$createComponent(Show, {
807
+ _$insert(_el$8, _$createComponent(Show, {
398
808
  get when() {
399
809
  return phase() === "select";
400
810
  },
401
811
  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");
403
- _$insertNode(_el$0, _el$11);
404
- _$insertNode(_el$0, _el$19);
405
- _$insertNode(_el$0, _el$27);
406
- _$setProp(_el$0, "flexDirection", "column");
407
- _$setProp(_el$0, "gap", 0);
408
- _$setProp(_el$0, "padding", 1);
409
- _$setProp(_el$0, "border", true);
410
- _$insert(_el$0, _$createComponent(For, {
812
+ var _el$10 = _$createElement("box"), _el$13 = _$createElement("box"), _el$14 = _$createElement("box"), _el$15 = _$createElement("text"), _el$16 = _$createElement("box"), _el$17 = _$createElement("text"), _el$18 = _$createElement("box"), _el$19 = _$createElement("text"), _el$21 = _$createElement("box"), _el$22 = _$createElement("box"), _el$23 = _$createElement("text"), _el$27 = _$createElement("box"), _el$29 = _$createElement("box"), _el$30 = _$createElement("text"), _el$31 = _$createElement("text");
813
+ _$insertNode(_el$10, _el$13);
814
+ _$insertNode(_el$10, _el$21);
815
+ _$insertNode(_el$10, _el$29);
816
+ _$setProp(_el$10, "flexDirection", "column");
817
+ _$setProp(_el$10, "gap", 0);
818
+ _$setProp(_el$10, "padding", 1);
819
+ _$setProp(_el$10, "border", true);
820
+ _$insert(_el$10, _$createComponent(For, {
411
821
  get each() {
412
822
  return options();
413
823
  },
@@ -416,39 +826,39 @@ function QuizDialog(props) {
416
826
  const isFocused = () => focused() === "options" && optionIndex() === idx;
417
827
  const isSelected = () => selected().has(`opt:${idx}`);
418
828
  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(`. `);
829
+ var _el$63 = _$createElement("box"), _el$64 = _$createElement("box"), _el$65 = _$createElement("text"), _el$66 = _$createElement("box"), _el$67 = _$createElement("text"), _el$68 = _$createElement("box"), _el$69 = _$createElement("text"), _el$70 = _$createTextNode(`. `);
830
+ _$insertNode(_el$63, _el$64);
831
+ _$insertNode(_el$63, _el$66);
832
+ _$insertNode(_el$63, _el$68);
833
+ _$setProp(_el$63, "flexDirection", "row");
834
+ _$setProp(_el$63, "alignItems", "flexStart");
835
+ _$setProp(_el$63, "gap", 1);
836
+ _$setProp(_el$63, "paddingLeft", 1);
837
+ _$setProp(_el$63, "paddingRight", 1);
420
838
  _$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, (() => {
436
- var _c$4 = _$memo(() => !!isMulti());
437
- return () => _c$4() ? isSelected() ? "\u2611" : "\u2610" : isSelected() ? "\u2B22" : "\u25CB";
839
+ _$setProp(_el$64, "width", 2);
840
+ _$setProp(_el$64, "alignItems", "center");
841
+ _$insert(_el$65, () => isFocused() ? "\u25B8" : " ");
842
+ _$insertNode(_el$66, _el$67);
843
+ _$setProp(_el$66, "width", 2);
844
+ _$setProp(_el$66, "alignItems", "center");
845
+ _$insert(_el$67, (() => {
846
+ var _c$5 = _$memo(() => !!isMulti());
847
+ return () => _c$5() ? isSelected() ? "\u2611" : "\u2610" : isSelected() ? "\u2B22" : "\u25CB";
438
848
  })());
849
+ _$insertNode(_el$68, _el$69);
850
+ _$setProp(_el$68, "flexGrow", 1);
439
851
  _$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);
852
+ _$setProp(_el$69, "wrapMode", "wrap");
853
+ _$insert(_el$69, idx + 1, _el$70);
854
+ _$insert(_el$69, () => opt.label, null);
445
855
  _$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));
856
+ var _v$52 = isFocused() ? theme().backgroundElement : undefined, _v$53 = isFocused() ? theme().accent : theme().textMuted, _v$54 = isMulti() ? isSelected() ? theme().success : theme().textMuted : isSelected() ? theme().accent : theme().textMuted, _v$55 = isSelected() ? theme().text : theme().textMuted, _v$56 = isFocused();
857
+ _v$52 !== _p$.e && (_p$.e = _$setProp(_el$63, "backgroundColor", _v$52, _p$.e));
858
+ _v$53 !== _p$.t && (_p$.t = _$setProp(_el$65, "fg", _v$53, _p$.t));
859
+ _v$54 !== _p$.a && (_p$.a = _$setProp(_el$67, "fg", _v$54, _p$.a));
860
+ _v$55 !== _p$.o && (_p$.o = _$setProp(_el$69, "fg", _v$55, _p$.o));
861
+ _v$56 !== _p$.i && (_p$.i = _$setProp(_el$69, "bold", _v$56, _p$.i));
452
862
  return _p$;
453
863
  }, {
454
864
  e: undefined,
@@ -457,155 +867,133 @@ function QuizDialog(props) {
457
867
  o: undefined,
458
868
  i: undefined
459
869
  });
460
- return _el$64;
870
+ return _el$63;
461
871
  })();
462
872
  }
463
- }), _el$11);
464
- _$insert(_el$0, _$createComponent(Show, {
873
+ }), _el$13);
874
+ _$insert(_el$10, _$createComponent(Show, {
465
875
  get when() {
466
876
  return options().length > 0;
467
877
  },
468
878
  get children() {
469
- var _el$1 = _$createElement("box"), _el$10 = _$createElement("text");
470
- _$insertNode(_el$1, _el$10);
471
- _$setProp(_el$1, "height", 1);
472
- _$insert(_el$10, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
473
- _$effect((_$p) => _$setProp(_el$10, "fg", theme().borderSubtle, _$p));
474
- return _el$1;
879
+ var _el$11 = _$createElement("box"), _el$12 = _$createElement("text");
880
+ _$insertNode(_el$11, _el$12);
881
+ _$setProp(_el$11, "height", 1);
882
+ _$insert(_el$12, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
883
+ _$effect((_$p) => _$setProp(_el$12, "fg", theme().borderSubtle, _$p));
884
+ return _el$11;
475
885
  }
476
- }), _el$11);
477
- _$insertNode(_el$11, _el$12);
478
- _$insertNode(_el$11, _el$14);
479
- _$insertNode(_el$11, _el$16);
480
- _$setProp(_el$11, "flexDirection", "row");
481
- _$setProp(_el$11, "alignItems", "flexStart");
482
- _$setProp(_el$11, "gap", 1);
483
- _$setProp(_el$11, "paddingLeft", 1);
484
- _$setProp(_el$11, "paddingRight", 1);
485
- _$insertNode(_el$12, _el$13);
486
- _$setProp(_el$12, "width", 2);
487
- _$setProp(_el$12, "alignItems", "center");
488
- _$insert(_el$13, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
886
+ }), _el$13);
887
+ _$insertNode(_el$13, _el$14);
888
+ _$insertNode(_el$13, _el$16);
889
+ _$insertNode(_el$13, _el$18);
890
+ _$setProp(_el$13, "flexDirection", "row");
891
+ _$setProp(_el$13, "alignItems", "flexStart");
892
+ _$setProp(_el$13, "gap", 1);
893
+ _$setProp(_el$13, "paddingLeft", 1);
894
+ _$setProp(_el$13, "paddingRight", 1);
489
895
  _$insertNode(_el$14, _el$15);
490
896
  _$setProp(_el$14, "width", 2);
491
897
  _$setProp(_el$14, "alignItems", "center");
492
- _$insert(_el$15, () => dontKnow() ? "\u2611" : "\u2610");
898
+ _$insert(_el$15, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
493
899
  _$insertNode(_el$16, _el$17);
494
- _$setProp(_el$16, "flexGrow", 1);
495
- _$insertNode(_el$17, _$createTextNode(`I don't know \u2014 genuine gap, not a guess`));
496
- _$setProp(_el$17, "italic", true);
497
- _$setProp(_el$17, "wrapMode", "wrap");
498
- _$insertNode(_el$19, _el$20);
499
- _$insertNode(_el$19, _el$25);
500
- _$setProp(_el$19, "flexDirection", "column");
501
- _$setProp(_el$19, "gap", 0);
502
- _$setProp(_el$19, "paddingTop", 1);
503
- _$insertNode(_el$20, _el$21);
504
- _$setProp(_el$20, "flexDirection", "row");
505
- _$setProp(_el$20, "alignItems", "center");
506
- _$setProp(_el$20, "gap", 1);
507
- _$insertNode(_el$21, _$createTextNode(`\u270E Note (optional)`));
508
- _$insert(_el$20, _$createComponent(Show, {
900
+ _$setProp(_el$16, "width", 2);
901
+ _$setProp(_el$16, "alignItems", "center");
902
+ _$insert(_el$17, () => dontKnow() ? "\u2611" : "\u2610");
903
+ _$insertNode(_el$18, _el$19);
904
+ _$setProp(_el$18, "flexGrow", 1);
905
+ _$insertNode(_el$19, _$createTextNode(`I don't know \u2014 genuine gap, not a guess`));
906
+ _$setProp(_el$19, "italic", true);
907
+ _$setProp(_el$19, "wrapMode", "wrap");
908
+ _$insertNode(_el$21, _el$22);
909
+ _$insertNode(_el$21, _el$27);
910
+ _$setProp(_el$21, "flexDirection", "column");
911
+ _$setProp(_el$21, "gap", 0);
912
+ _$setProp(_el$21, "paddingTop", 1);
913
+ _$insertNode(_el$22, _el$23);
914
+ _$setProp(_el$22, "flexDirection", "row");
915
+ _$setProp(_el$22, "alignItems", "center");
916
+ _$setProp(_el$22, "gap", 1);
917
+ _$insertNode(_el$23, _$createTextNode(`\u270E Note (optional)`));
918
+ _$insert(_el$22, _$createComponent(Show, {
509
919
  get when() {
510
920
  return focused() === "note";
511
921
  },
512
922
  get children() {
513
- var _el$23 = _$createElement("text");
514
- _$insertNode(_el$23, _$createTextNode(`\u25CF editing`));
515
- _$effect((_$p) => _$setProp(_el$23, "fg", theme().accent, _$p));
516
- return _el$23;
923
+ var _el$25 = _$createElement("text");
924
+ _$insertNode(_el$25, _$createTextNode(`\u25CF editing`));
925
+ _$effect((_$p) => _$setProp(_el$25, "fg", theme().accent, _$p));
926
+ return _el$25;
517
927
  }
518
928
  }), null);
519
- _$setProp(_el$25, "border", true);
520
- _$setProp(_el$25, "paddingLeft", 1);
521
- _$setProp(_el$25, "paddingRight", 1);
522
- _$insert(_el$25, _$createComponent(Show, {
929
+ _$setProp(_el$27, "border", true);
930
+ _$setProp(_el$27, "paddingLeft", 1);
931
+ _$setProp(_el$27, "paddingRight", 1);
932
+ _$insert(_el$27, _$createComponent(Show, {
523
933
  get when() {
524
934
  return focused() === "note";
525
935
  },
526
936
  get fallback() {
527
937
  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;
938
+ var _el$71 = _$createElement("text");
939
+ _$setProp(_el$71, "wrapMode", "wrap");
940
+ _$insert(_el$71, () => note() || "Tab to edit \xB7 share what you were thinking");
941
+ _$effect((_$p) => _$setProp(_el$71, "fg", note() ? theme().text : theme().textMuted, _$p));
942
+ return _el$71;
533
943
  })();
534
944
  },
535
945
  get children() {
536
- var _el$26 = _$createElement("input");
537
- _$use((el) => noteInputEl = el, _el$26);
538
- _$setProp(_el$26, "onInput", (value) => setNote(typeof value === "string" ? value : value?.target?.value ?? value?.value ?? String(value ?? "")));
539
- _$setProp(_el$26, "onSubmit", () => {
946
+ var _el$28 = _$createElement("input");
947
+ _$use((el) => noteInputEl = el, _el$28);
948
+ _$setProp(_el$28, "onInput", (value) => setNote(typeof value === "string" ? value : value?.target?.value ?? value?.value ?? String(value ?? "")));
949
+ _$setProp(_el$28, "onSubmit", () => {
540
950
  if (!selected().size && !dontKnow() && note().trim())
541
951
  submitSelect();
542
952
  else
543
953
  setFocused("options");
544
954
  });
545
- _$setProp(_el$26, "placeholder", "what was on your mind? (Enter to submit note \u2192 classify)");
546
- _$effect((_$p) => _$setProp(_el$26, "value", note(), _$p));
547
- return _el$26;
955
+ _$setProp(_el$28, "placeholder", "what was on your mind? (Enter to submit note \u2192 classify)");
956
+ _$effect((_$p) => _$setProp(_el$28, "value", note(), _$p));
957
+ return _el$28;
548
958
  }
549
959
  }));
550
- _$insertNode(_el$27, _el$28);
551
- _$setProp(_el$27, "flexDirection", "row");
552
- _$setProp(_el$27, "justifyContent", "space-between");
553
- _$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, {
960
+ _$insertNode(_el$29, _el$30);
961
+ _$insertNode(_el$29, _el$31);
962
+ _$setProp(_el$29, "flexDirection", "row");
963
+ _$setProp(_el$29, "justifyContent", "space-between");
964
+ _$setProp(_el$29, "paddingTop", 1);
965
+ _$insert(_el$30, (() => {
966
+ var _c$3 = _$memo(() => !!isMulti());
967
+ return () => _c$3() ? `${selected().size} selected${dontKnow() ? " \xB7 I don't know" : ""}` : _$memo(() => !!(note().trim() && !selected().size && !dontKnow()))() ? "note \u2192 classify" : dontKnow() ? "I don't know" : "";
968
+ })());
969
+ _$insert(_el$31, () => focused() === "note" ? "Tab/Esc back" : "");
970
+ _$insert(_el$10, _$createComponent(Show, {
556
971
  get when() {
557
972
  return isMulti();
558
973
  },
559
974
  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);
582
- _$insert(_el$0, _$createComponent(Show, {
583
- get when() {
584
- return isMulti();
585
- },
586
- 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`);
975
+ var _el$32 = _$createElement("box"), _el$33 = _$createElement("box"), _el$34 = _$createElement("text"), _el$35 = _$createElement("text"), _el$36 = _$createTextNode(`\u21B3 Submit`);
976
+ _$insertNode(_el$32, _el$33);
977
+ _$setProp(_el$32, "justifyContent", "center");
978
+ _$setProp(_el$32, "paddingTop", 1);
588
979
  _$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);
980
+ _$insertNode(_el$33, _el$35);
981
+ _$setProp(_el$33, "flexDirection", "row");
982
+ _$setProp(_el$33, "alignItems", "center");
983
+ _$setProp(_el$33, "gap", 1);
984
+ _$setProp(_el$33, "border", true);
985
+ _$setProp(_el$33, "paddingLeft", 2);
986
+ _$setProp(_el$33, "paddingRight", 2);
987
+ _$insert(_el$34, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
988
+ _$insertNode(_el$35, _el$36);
989
+ _$setProp(_el$35, "bold", true);
990
+ _$insert(_el$35, () => note().trim() && !selected().size && !dontKnow() ? " note" : "", null);
603
991
  _$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));
992
+ var _v$7 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().borderSubtle, _v$8 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().background, _v$9 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted, _v$0 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted;
993
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$33, "borderColor", _v$7, _p$.e));
994
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$33, "backgroundColor", _v$8, _p$.t));
995
+ _v$9 !== _p$.a && (_p$.a = _$setProp(_el$34, "fg", _v$9, _p$.a));
996
+ _v$0 !== _p$.o && (_p$.o = _$setProp(_el$35, "fg", _v$0, _p$.o));
609
997
  return _p$;
610
998
  }, {
611
999
  e: undefined,
@@ -613,54 +1001,55 @@ function QuizDialog(props) {
613
1001
  a: undefined,
614
1002
  o: undefined
615
1003
  });
616
- return _el$33;
1004
+ return _el$32;
617
1005
  }
618
1006
  }), null);
619
- _$insert(_el$0, _$createComponent(Show, {
1007
+ _$insert(_el$10, _$createComponent(Show, {
620
1008
  get when() {
621
1009
  return _$memo(() => !!(!isMulti() && note().trim() && !selected().size))() && !dontKnow();
622
1010
  },
623
1011
  get children() {
624
- var _el$38 = _$createElement("box"), _el$39 = _$createElement("box"), _el$40 = _$createElement("text");
1012
+ var _el$37 = _$createElement("box"), _el$38 = _$createElement("box"), _el$39 = _$createElement("text");
1013
+ _$insertNode(_el$37, _el$38);
1014
+ _$setProp(_el$37, "justifyContent", "center");
1015
+ _$setProp(_el$37, "paddingTop", 1);
625
1016
  _$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);
1017
+ _$setProp(_el$38, "flexDirection", "row");
1018
+ _$setProp(_el$38, "alignItems", "center");
1019
+ _$setProp(_el$38, "gap", 1);
1020
+ _$setProp(_el$38, "border", true);
1021
+ _$setProp(_el$38, "paddingLeft", 2);
1022
+ _$setProp(_el$38, "paddingRight", 2);
1023
+ _$insertNode(_el$39, _$createTextNode(`\u21B3 Submit note \u2192 classify`));
1024
+ _$setProp(_el$39, "bold", true);
637
1025
  _$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));
1026
+ var _v$1 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().success, _v$10 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().backgroundElement : theme().success, _v$11 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().background;
1027
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$38, "borderColor", _v$1, _p$.e));
1028
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$38, "backgroundColor", _v$10, _p$.t));
1029
+ _v$11 !== _p$.a && (_p$.a = _$setProp(_el$39, "fg", _v$11, _p$.a));
642
1030
  return _p$;
643
1031
  }, {
644
1032
  e: undefined,
645
1033
  t: undefined,
646
1034
  a: undefined
647
1035
  });
648
- return _el$38;
1036
+ return _el$37;
649
1037
  }
650
1038
  }), null);
651
1039
  _$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));
1040
+ var _v$12 = theme().borderSubtle, _v$13 = theme().background, _v$14 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$15 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$16 = dontKnow() ? theme().warning : theme().textMuted, _v$17 = dontKnow() ? theme().warning : theme().textMuted, _v$18 = focused() === "note" ? theme().accent : theme().textMuted, _v$19 = focused() === "note", _v$20 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$21 = theme().backgroundElement, _v$22 = theme().textMuted, _v$23 = theme().textMuted;
1041
+ _v$12 !== _p$.e && (_p$.e = _$setProp(_el$10, "borderColor", _v$12, _p$.e));
1042
+ _v$13 !== _p$.t && (_p$.t = _$setProp(_el$10, "backgroundColor", _v$13, _p$.t));
1043
+ _v$14 !== _p$.a && (_p$.a = _$setProp(_el$13, "backgroundColor", _v$14, _p$.a));
1044
+ _v$15 !== _p$.o && (_p$.o = _$setProp(_el$15, "fg", _v$15, _p$.o));
1045
+ _v$16 !== _p$.i && (_p$.i = _$setProp(_el$17, "fg", _v$16, _p$.i));
1046
+ _v$17 !== _p$.n && (_p$.n = _$setProp(_el$19, "fg", _v$17, _p$.n));
1047
+ _v$18 !== _p$.s && (_p$.s = _$setProp(_el$23, "fg", _v$18, _p$.s));
1048
+ _v$19 !== _p$.h && (_p$.h = _$setProp(_el$23, "bold", _v$19, _p$.h));
1049
+ _v$20 !== _p$.r && (_p$.r = _$setProp(_el$27, "borderColor", _v$20, _p$.r));
1050
+ _v$21 !== _p$.d && (_p$.d = _$setProp(_el$27, "backgroundColor", _v$21, _p$.d));
1051
+ _v$22 !== _p$.l && (_p$.l = _$setProp(_el$30, "fg", _v$22, _p$.l));
1052
+ _v$23 !== _p$.u && (_p$.u = _$setProp(_el$31, "fg", _v$23, _p$.u));
664
1053
  return _p$;
665
1054
  }, {
666
1055
  e: undefined,
@@ -673,39 +1062,40 @@ function QuizDialog(props) {
673
1062
  h: undefined,
674
1063
  r: undefined,
675
1064
  d: undefined,
676
- l: undefined
1065
+ l: undefined,
1066
+ u: undefined
677
1067
  });
678
- return _el$0;
1068
+ return _el$10;
679
1069
  }
680
1070
  }), null);
681
- _$insert(_el$6, _$createComponent(Show, {
1071
+ _$insert(_el$8, _$createComponent(Show, {
682
1072
  get when() {
683
1073
  return phase() === "classifying";
684
1074
  },
685
1075
  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");
687
- _$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`));
1076
+ var _el$41 = _$createElement("box"), _el$42 = _$createElement("text"), _el$44 = _$createElement("text"), _el$45 = _$createTextNode(`"`), _el$46 = _$createTextNode(`"`), _el$47 = _$createElement("text");
1077
+ _$insertNode(_el$41, _el$42);
1078
+ _$insertNode(_el$41, _el$44);
1079
+ _$insertNode(_el$41, _el$47);
1080
+ _$setProp(_el$41, "flexDirection", "column");
1081
+ _$setProp(_el$41, "gap", 1);
1082
+ _$setProp(_el$41, "padding", 1);
1083
+ _$setProp(_el$41, "border", true);
1084
+ _$setProp(_el$41, "alignItems", "center");
1085
+ _$insertNode(_el$42, _$createTextNode(`\u25D0 Classifying your note...`));
1086
+ _$setProp(_el$42, "bold", true);
1087
+ _$insertNode(_el$44, _el$45);
1088
+ _$insertNode(_el$44, _el$46);
1089
+ _$setProp(_el$44, "wrapMode", "wrap");
1090
+ _$insert(_el$44, note, _el$46);
1091
+ _$insertNode(_el$47, _$createTextNode(`Mapping to options \u2014 please wait`));
702
1092
  _$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));
1093
+ var _v$24 = theme().accent, _v$25 = theme().background, _v$26 = theme().accent, _v$27 = theme().textMuted, _v$28 = theme().textMuted;
1094
+ _v$24 !== _p$.e && (_p$.e = _$setProp(_el$41, "borderColor", _v$24, _p$.e));
1095
+ _v$25 !== _p$.t && (_p$.t = _$setProp(_el$41, "backgroundColor", _v$25, _p$.t));
1096
+ _v$26 !== _p$.a && (_p$.a = _$setProp(_el$42, "fg", _v$26, _p$.a));
1097
+ _v$27 !== _p$.o && (_p$.o = _$setProp(_el$44, "fg", _v$27, _p$.o));
1098
+ _v$28 !== _p$.i && (_p$.i = _$setProp(_el$47, "fg", _v$28, _p$.i));
709
1099
  return _p$;
710
1100
  }, {
711
1101
  e: undefined,
@@ -714,23 +1104,23 @@ function QuizDialog(props) {
714
1104
  o: undefined,
715
1105
  i: undefined
716
1106
  });
717
- return _el$42;
1107
+ return _el$41;
718
1108
  }
719
1109
  }), null);
720
- _$insert(_el$6, _$createComponent(Show, {
1110
+ _$insert(_el$8, _$createComponent(Show, {
721
1111
  get when() {
722
1112
  return phase() === "feedback";
723
1113
  },
724
1114
  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, {
1115
+ var _el$49 = _$createElement("box"), _el$50 = _$createElement("box"), _el$51 = _$createElement("text"), _el$55 = _$createElement("text"), _el$56 = _$createTextNode(`Correct: `), _el$59 = _$createElement("box"), _el$60 = _$createElement("markdown");
1116
+ _$insertNode(_el$49, _el$50);
1117
+ _$insertNode(_el$49, _el$55);
1118
+ _$insertNode(_el$49, _el$59);
1119
+ _$setProp(_el$49, "flexDirection", "column");
1120
+ _$setProp(_el$49, "gap", 1);
1121
+ _$setProp(_el$49, "padding", 1);
1122
+ _$setProp(_el$49, "border", true);
1123
+ _$insert(_el$49, _$createComponent(For, {
734
1124
  get each() {
735
1125
  return options();
736
1126
  },
@@ -759,85 +1149,86 @@ function QuizDialog(props) {
759
1149
  bg = theme().warning;
760
1150
  }
761
1151
  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(`. `);
1152
+ var _el$72 = _$createElement("box"), _el$73 = _$createElement("box"), _el$74 = _$createElement("text"), _el$75 = _$createElement("box"), _el$76 = _$createElement("text"), _el$77 = _$createTextNode(`. `);
1153
+ _$insertNode(_el$72, _el$73);
1154
+ _$insertNode(_el$72, _el$75);
1155
+ _$setProp(_el$72, "flexDirection", "row");
1156
+ _$setProp(_el$72, "alignItems", "flexStart");
1157
+ _$setProp(_el$72, "gap", 1);
1158
+ _$setProp(_el$72, "paddingLeft", 1);
1159
+ _$setProp(_el$72, "backgroundColor", bg);
763
1160
  _$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);
770
- _$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);
1161
+ _$setProp(_el$73, "width", 2);
1162
+ _$setProp(_el$73, "alignItems", "center");
1163
+ _$setProp(_el$74, "fg", fg);
1164
+ _$setProp(_el$74, "bold", true);
1165
+ _$insert(_el$74, icon);
1166
+ _$insertNode(_el$75, _el$76);
1167
+ _$setProp(_el$75, "flexGrow", 1);
776
1168
  _$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;
1169
+ _$setProp(_el$76, "fg", fg);
1170
+ _$setProp(_el$76, "wrapMode", "wrap");
1171
+ _$insert(_el$76, idx, _el$77);
1172
+ _$insert(_el$76, () => opt.label, null);
1173
+ return _el$72;
784
1174
  })();
785
1175
  }
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, {
1176
+ }), _el$50);
1177
+ _$insertNode(_el$50, _el$51);
1178
+ _$setProp(_el$50, "height", 1);
1179
+ _$insert(_el$51, () => "\u2500".repeat(Math.max(20, popupWidth() - 12)));
1180
+ _$insert(_el$49, _$createComponent(Show, {
791
1181
  get when() {
792
1182
  return dontKnow();
793
1183
  },
794
1184
  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;
1185
+ var _el$52 = _$createElement("text");
1186
+ _$insertNode(_el$52, _$createTextNode(`\u25CF You said: I don't know \u2014 genuine gap`));
1187
+ _$effect((_$p) => _$setProp(_el$52, "fg", theme().warning, _$p));
1188
+ return _el$52;
799
1189
  }
800
- }), _el$56);
801
- _$insert(_el$50, _$createComponent(Show, {
1190
+ }), _el$55);
1191
+ _$insert(_el$49, _$createComponent(Show, {
802
1192
  get when() {
803
1193
  return !dontKnow();
804
1194
  },
805
1195
  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;
1196
+ var _el$54 = _$createElement("text");
1197
+ _$setProp(_el$54, "bold", true);
1198
+ _$insert(_el$54, () => feedback()?.correct ? "\u2713 Correct! Well located." : "\u2717 Incorrect \u2014 nice try, let's fix the edge.");
1199
+ _$effect((_$p) => _$setProp(_el$54, "fg", feedback()?.correct ? theme().success : theme().error, _$p));
1200
+ return _el$54;
811
1201
  }
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, {
1202
+ }), _el$55);
1203
+ _$insertNode(_el$55, _el$56);
1204
+ _$insert(_el$55, () => props.request.correctIndices.map((i) => `${i}. ${options()[i - 1]?.label}`).join(", "), null);
1205
+ _$insert(_el$49, _$createComponent(Show, {
816
1206
  get when() {
817
1207
  return note();
818
1208
  },
819
1209
  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;
1210
+ var _el$57 = _$createElement("text"), _el$58 = _$createTextNode(`Your note: `);
1211
+ _$insertNode(_el$57, _el$58);
1212
+ _$insert(_el$57, note, null);
1213
+ _$effect((_$p) => _$setProp(_el$57, "fg", theme().textMuted, _$p));
1214
+ return _el$57;
825
1215
  }
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);
1216
+ }), _el$59);
1217
+ _$insertNode(_el$59, _el$60);
1218
+ _$setProp(_el$59, "border", true);
1219
+ _$setProp(_el$59, "padding", 1);
832
1220
  _$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));
1221
+ var _v$29 = feedback()?.correct ? theme().success : theme().error, _v$30 = theme().background, _v$31 = theme().borderSubtle, _v$32 = theme().textMuted, _v$33 = theme().borderSubtle, _v$34 = theme().backgroundPanel, _v$35 = syntax(), _v$36 = decodeQuizText(props.request.explanation), _v$37 = theme().text, _v$38 = theme().backgroundPanel;
1222
+ _v$29 !== _p$.e && (_p$.e = _$setProp(_el$49, "borderColor", _v$29, _p$.e));
1223
+ _v$30 !== _p$.t && (_p$.t = _$setProp(_el$49, "backgroundColor", _v$30, _p$.t));
1224
+ _v$31 !== _p$.a && (_p$.a = _$setProp(_el$51, "fg", _v$31, _p$.a));
1225
+ _v$32 !== _p$.o && (_p$.o = _$setProp(_el$55, "fg", _v$32, _p$.o));
1226
+ _v$33 !== _p$.i && (_p$.i = _$setProp(_el$59, "borderColor", _v$33, _p$.i));
1227
+ _v$34 !== _p$.n && (_p$.n = _$setProp(_el$59, "backgroundColor", _v$34, _p$.n));
1228
+ _v$35 !== _p$.s && (_p$.s = _$setProp(_el$60, "syntaxStyle", _v$35, _p$.s));
1229
+ _v$36 !== _p$.h && (_p$.h = _$setProp(_el$60, "content", _v$36, _p$.h));
1230
+ _v$37 !== _p$.r && (_p$.r = _$setProp(_el$60, "fg", _v$37, _p$.r));
1231
+ _v$38 !== _p$.d && (_p$.d = _$setProp(_el$60, "bg", _v$38, _p$.d));
841
1232
  return _p$;
842
1233
  }, {
843
1234
  e: undefined,
@@ -846,29 +1237,103 @@ function QuizDialog(props) {
846
1237
  o: undefined,
847
1238
  i: undefined,
848
1239
  n: undefined,
849
- s: undefined
1240
+ s: undefined,
1241
+ h: undefined,
1242
+ r: undefined,
1243
+ d: undefined
850
1244
  });
851
- return _el$50;
1245
+ return _el$49;
852
1246
  }
853
1247
  }), null);
854
- _$insertNode(_el$62, _el$63);
855
- _$setProp(_el$62, "height", 1);
856
- _$setProp(_el$62, "justifyContent", "center");
857
- _$insert(_el$63, (() => {
858
- 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";
1248
+ _$insertNode(_el$61, _el$62);
1249
+ _$setProp(_el$61, "height", 1);
1250
+ _$setProp(_el$61, "justifyContent", "center");
1251
+ _$setProp(_el$62, "wrapMode", "wrap");
1252
+ _$insert(_el$62, (() => {
1253
+ var _c$4 = _$memo(() => phase() === "feedback");
1254
+ return () => _c$4() ? _$memo(() => !!(canScrollUp() && canScrollDown()))() ? [(() => {
1255
+ var _el$78 = _$createElement("span");
1256
+ _$insertNode(_el$78, _$createTextNode(`\u25B2 more above \xB7 \u25BC more below`));
1257
+ _$effect((_$p) => _$setProp(_el$78, "style", {
1258
+ fg: theme.warning,
1259
+ bold: true
1260
+ }, _$p));
1261
+ return _el$78;
1262
+ })(), (() => {
1263
+ var _el$80 = _$createElement("span");
1264
+ _$insertNode(_el$80, _$createTextNode(` \u2014 d/u to scroll \xB7 Enter to continue`));
1265
+ _$effect((_$p) => _$setProp(_el$80, "style", {
1266
+ fg: theme().textMuted
1267
+ }, _$p));
1268
+ return _el$80;
1269
+ })()] : _$memo(() => !!canScrollDown())() ? [(() => {
1270
+ var _el$82 = _$createElement("span");
1271
+ _$insertNode(_el$82, _$createTextNode(`\u25BC more below`));
1272
+ _$effect((_$p) => _$setProp(_el$82, "style", {
1273
+ fg: theme.warning,
1274
+ bold: true
1275
+ }, _$p));
1276
+ return _el$82;
1277
+ })(), (() => {
1278
+ var _el$84 = _$createElement("span");
1279
+ _$insertNode(_el$84, _$createTextNode(` \u2014 d to scroll \xB7 Enter to continue`));
1280
+ _$effect((_$p) => _$setProp(_el$84, "style", {
1281
+ fg: theme().textMuted
1282
+ }, _$p));
1283
+ return _el$84;
1284
+ })()] : _$memo(() => !!canScrollUp())() ? [(() => {
1285
+ var _el$86 = _$createElement("span");
1286
+ _$insertNode(_el$86, _$createTextNode(`\u25B2 more above`));
1287
+ _$effect((_$p) => _$setProp(_el$86, "style", {
1288
+ fg: theme.accent,
1289
+ bold: true
1290
+ }, _$p));
1291
+ return _el$86;
1292
+ })(), (() => {
1293
+ var _el$88 = _$createElement("span");
1294
+ _$insertNode(_el$88, _$createTextNode(` \u2014 u to scroll \xB7 Enter to continue`));
1295
+ _$effect((_$p) => _$setProp(_el$88, "style", {
1296
+ fg: theme().textMuted
1297
+ }, _$p));
1298
+ return _el$88;
1299
+ })()] : "\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" : _$memo(() => !!(canScrollUp() || canScrollDown()))() ? [(() => {
1300
+ var _el$90 = _$createElement("span");
1301
+ _$insertNode(_el$90, _$createTextNode(`j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel`));
1302
+ _$effect((_$p) => _$setProp(_el$90, "style", {
1303
+ fg: theme().textMuted
1304
+ }, _$p));
1305
+ return _el$90;
1306
+ })(), (() => {
1307
+ var _el$92 = _$createElement("span");
1308
+ _$insertNode(_el$92, _$createTextNode(` \xB7 d/u scroll`));
1309
+ _$effect((_$p) => _$setProp(_el$92, "style", {
1310
+ fg: theme.warning,
1311
+ bold: true
1312
+ }, _$p));
1313
+ return _el$92;
1314
+ })()] : "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel";
860
1315
  })());
861
1316
  _$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));
1317
+ var _v$39 = popupWidth(), _v$40 = popupHeight(), _v$41 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$42 = theme().backgroundPanel, _v$43 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$44 = theme().background, _v$45 = theme().background, _v$46 = {
1318
+ visible: true,
1319
+ trackOptions: {
1320
+ backgroundColor: theme().background,
1321
+ foregroundColor: theme().borderActive
1322
+ }
1323
+ }, _v$47 = syntax(), _v$48 = decodeQuizText(props.request.question), _v$49 = theme().text, _v$50 = theme().backgroundPanel, _v$51 = theme().textMuted;
1324
+ _v$39 !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$39, _p$.e));
1325
+ _v$40 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$40, _p$.t));
1326
+ _v$41 !== _p$.a && (_p$.a = _$setProp(_el$, "borderColor", _v$41, _p$.a));
1327
+ _v$42 !== _p$.o && (_p$.o = _$setProp(_el$, "backgroundColor", _v$42, _p$.o));
1328
+ _v$43 !== _p$.i && (_p$.i = _$setProp(_el$2, "backgroundColor", _v$43, _p$.i));
1329
+ _v$44 !== _p$.n && (_p$.n = _$setProp(_el$3, "fg", _v$44, _p$.n));
1330
+ _v$45 !== _p$.s && (_p$.s = _$setProp(_el$4, "fg", _v$45, _p$.s));
1331
+ _v$46 !== _p$.h && (_p$.h = _$setProp(_el$8, "verticalScrollbarOptions", _v$46, _p$.h));
1332
+ _v$47 !== _p$.r && (_p$.r = _$setProp(_el$0, "syntaxStyle", _v$47, _p$.r));
1333
+ _v$48 !== _p$.d && (_p$.d = _$setProp(_el$0, "content", _v$48, _p$.d));
1334
+ _v$49 !== _p$.l && (_p$.l = _$setProp(_el$0, "fg", _v$49, _p$.l));
1335
+ _v$50 !== _p$.u && (_p$.u = _$setProp(_el$0, "bg", _v$50, _p$.u));
1336
+ _v$51 !== _p$.c && (_p$.c = _$setProp(_el$62, "fg", _v$51, _p$.c));
872
1337
  return _p$;
873
1338
  }, {
874
1339
  e: undefined,
@@ -879,16 +1344,27 @@ function QuizDialog(props) {
879
1344
  n: undefined,
880
1345
  s: undefined,
881
1346
  h: undefined,
882
- r: undefined
1347
+ r: undefined,
1348
+ d: undefined,
1349
+ l: undefined,
1350
+ u: undefined,
1351
+ c: undefined
883
1352
  });
884
1353
  return _el$;
885
1354
  })();
886
1355
  }
887
1356
  function QuizBatchDialog(props) {
888
1357
  const theme = () => props.api.theme.current;
1358
+ const syntax = () => syntaxStyle(theme());
889
1359
  const dims = useTerminalDimensions();
890
- const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 96));
891
- const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
1360
+ const popupWidth = () => {
1361
+ const w = dims().width;
1362
+ return Math.max(64, Math.min(w - 8, Math.floor(w * 0.82), 96));
1363
+ };
1364
+ const popupHeight = () => {
1365
+ const h = dims().height;
1366
+ return Math.max(14, Math.min(h - 6, Math.floor(h * 0.64), 28));
1367
+ };
892
1368
  const [idx, setIdx] = createSignal(0);
893
1369
  if (!props.request.quizzes || props.request.quizzes.length === 0) {
894
1370
  tlog("QuizBatchDialog empty quizzes, cancelling", props.request.id);
@@ -908,6 +1384,40 @@ function QuizBatchDialog(props) {
908
1384
  const dontKnowIdx = () => cur().options.length;
909
1385
  const submitIdx = () => isMulti() ? cur().options.length + 1 : -1;
910
1386
  let noteEl;
1387
+ let scrollRefBatch;
1388
+ const [canScrollUpBatch, setCanScrollUpBatch] = createSignal(false);
1389
+ const [canScrollDownBatch, setCanScrollDownBatch] = createSignal(false);
1390
+ const updateScrollBatch = () => {
1391
+ try {
1392
+ if (!scrollRefBatch) {
1393
+ setCanScrollUpBatch(false);
1394
+ setCanScrollDownBatch(false);
1395
+ return;
1396
+ }
1397
+ const st = typeof scrollRefBatch.scrollTop === "number" ? scrollRefBatch.scrollTop : 0;
1398
+ const h = typeof scrollRefBatch.height === "number" ? scrollRefBatch.height : scrollRefBatch.viewportHeight ?? popupHeight();
1399
+ const sh = typeof scrollRefBatch.scrollHeight === "number" ? scrollRefBatch.scrollHeight : 0;
1400
+ let effectiveSh = sh;
1401
+ if (!effectiveSh && typeof scrollRefBatch.getChildren === "function") {
1402
+ try {
1403
+ const kids = scrollRefBatch.getChildren();
1404
+ if (kids?.length)
1405
+ effectiveSh = Math.max(...kids.map((c) => (c.y || 0) + (c.height || 0)), h);
1406
+ } catch {}
1407
+ }
1408
+ if (!effectiveSh || effectiveSh <= h + 1) {
1409
+ setCanScrollUpBatch(false);
1410
+ setCanScrollDownBatch(false);
1411
+ return;
1412
+ }
1413
+ setCanScrollUpBatch(st > 0);
1414
+ setCanScrollDownBatch(st + h < effectiveSh - 1);
1415
+ } catch {
1416
+ setCanScrollUpBatch(false);
1417
+ setCanScrollDownBatch(false);
1418
+ }
1419
+ };
1420
+ const scrollAmountBatch = () => Math.max(1, Math.floor((scrollRefBatch?.height ?? popupHeight()) / 3));
911
1421
  createEffect(() => {
912
1422
  if (focused() === "note" && noteEl)
913
1423
  try {
@@ -916,6 +1426,24 @@ function QuizBatchDialog(props) {
916
1426
  tlog("note focus failed", String(e));
917
1427
  }
918
1428
  });
1429
+ createEffect(() => {
1430
+ phase();
1431
+ feedback();
1432
+ dims();
1433
+ idx();
1434
+ setTimeout(updateScrollBatch, 40);
1435
+ setTimeout(updateScrollBatch, 200);
1436
+ });
1437
+ createEffect(() => {
1438
+ note();
1439
+ setTimeout(updateScrollBatch, 40);
1440
+ });
1441
+ createEffect(() => {
1442
+ if (phase() !== "feedback" && phase() !== "select")
1443
+ return;
1444
+ const id = setInterval(updateScrollBatch, 200);
1445
+ onCleanup(() => clearInterval(id));
1446
+ });
919
1447
  const toggle = (i) => {
920
1448
  try {
921
1449
  const o = cur().options[i];
@@ -1092,16 +1620,63 @@ function QuizBatchDialog(props) {
1092
1620
  tlog("submitSelect failed", String(e));
1093
1621
  }
1094
1622
  };
1623
+ const isPlainKeyBatch = (evt, want) => {
1624
+ try {
1625
+ const n = String(evt.name || evt.sequence || "").toLowerCase();
1626
+ if (n !== want.toLowerCase())
1627
+ return false;
1628
+ if (evt.ctrl || evt.meta || evt.option || evt.alt)
1629
+ return false;
1630
+ return true;
1631
+ } catch {
1632
+ return false;
1633
+ }
1634
+ };
1095
1635
  useKeyboard((evt) => {
1096
1636
  try {
1097
1637
  const k = evt.name || evt.sequence || evt.raw || "";
1098
1638
  const seq = evt.sequence || "";
1639
+ const lower = String(k || "").toLowerCase();
1099
1640
  if (phase() === "classifying") {
1100
1641
  prevent(evt);
1101
1642
  return;
1102
1643
  }
1103
1644
  if (phase() === "feedback") {
1104
- if (k === "enter" || seq === "\r" || k === "escape" || k === "esc") {
1645
+ if (isPlainKeyBatch(evt, "d") || seq === "\x04") {
1646
+ prevent(evt);
1647
+ try {
1648
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1649
+ setTimeout(updateScrollBatch, 30);
1650
+ setTimeout(updateScrollBatch, 120);
1651
+ } catch {}
1652
+ return;
1653
+ }
1654
+ if (isPlainKeyBatch(evt, "u") || seq === "\x15") {
1655
+ prevent(evt);
1656
+ try {
1657
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1658
+ setTimeout(updateScrollBatch, 30);
1659
+ setTimeout(updateScrollBatch, 120);
1660
+ } catch {}
1661
+ return;
1662
+ }
1663
+ if (lower === "pageup" || seq === "\x1B[5~") {
1664
+ prevent(evt);
1665
+ try {
1666
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1667
+ setTimeout(updateScrollBatch, 30);
1668
+ } catch {}
1669
+ return;
1670
+ }
1671
+ if (lower === "pagedown" || seq === "\x1B[6~") {
1672
+ prevent(evt);
1673
+ try {
1674
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1675
+ setTimeout(updateScrollBatch, 30);
1676
+ } catch {}
1677
+ return;
1678
+ }
1679
+ if (lower === "enter" || seq === "\r" || lower === "escape" || lower === "esc") {
1105
1680
  prevent(evt);
1106
1681
  goNext();
1107
1682
  }
@@ -1120,6 +1695,24 @@ function QuizBatchDialog(props) {
1120
1695
  }
1121
1696
  return;
1122
1697
  }
1698
+ if (phase() === "select" && (isPlainKeyBatch(evt, "d") || seq === "\x04")) {
1699
+ prevent(evt);
1700
+ try {
1701
+ scrollRefBatch?.scrollBy(scrollAmountBatch());
1702
+ setTimeout(updateScrollBatch, 30);
1703
+ setTimeout(updateScrollBatch, 120);
1704
+ } catch {}
1705
+ return;
1706
+ }
1707
+ if (phase() === "select" && (isPlainKeyBatch(evt, "u") || seq === "\x15")) {
1708
+ prevent(evt);
1709
+ try {
1710
+ scrollRefBatch?.scrollBy(-scrollAmountBatch());
1711
+ setTimeout(updateScrollBatch, 30);
1712
+ setTimeout(updateScrollBatch, 120);
1713
+ } catch {}
1714
+ return;
1715
+ }
1123
1716
  if (k === "up" || k === "k" || seq === "\x1B[A") {
1124
1717
  prevent(evt);
1125
1718
  setOptionIndex((i) => Math.max(0, i - 1));
@@ -1200,65 +1793,101 @@ function QuizBatchDialog(props) {
1200
1793
  }
1201
1794
  });
1202
1795
  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, (() => {
1225
- var _c$5 = _$memo(() => phase() === "feedback");
1226
- return () => _c$5() ? feedback()?.correct ? "\u2713" : "\u2717" : "";
1796
+ var _el$94 = _$createElement("box"), _el$95 = _$createElement("box"), _el$96 = _$createElement("text"), _el$97 = _$createTextNode(` decks.quiz batch `), _el$98 = _$createTextNode(`/`), _el$99 = _$createTextNode(` `), _el$100 = _$createElement("text"), _el$104 = _$createElement("scrollbox"), _el$105 = _$createElement("markdown"), _el$146 = _$createElement("box"), _el$147 = _$createElement("text");
1797
+ _$insertNode(_el$94, _el$95);
1798
+ _$insertNode(_el$94, _el$104);
1799
+ _$insertNode(_el$94, _el$146);
1800
+ _$setProp(_el$94, "flexDirection", "column");
1801
+ _$setProp(_el$94, "border", true);
1802
+ _$setProp(_el$94, "padding", 1);
1803
+ _$setProp(_el$94, "gap", 1);
1804
+ _$insertNode(_el$95, _el$96);
1805
+ _$insertNode(_el$95, _el$100);
1806
+ _$setProp(_el$95, "flexDirection", "row");
1807
+ _$setProp(_el$95, "justifyContent", "space-between");
1808
+ _$setProp(_el$95, "paddingLeft", 1);
1809
+ _$setProp(_el$95, "paddingRight", 1);
1810
+ _$setProp(_el$95, "height", 1);
1811
+ _$insertNode(_el$96, _el$97);
1812
+ _$insertNode(_el$96, _el$98);
1813
+ _$insertNode(_el$96, _el$99);
1814
+ _$setProp(_el$96, "bold", true);
1815
+ _$insert(_el$96, () => idx() + 1, _el$98);
1816
+ _$insert(_el$96, () => props.request.quizzes.length, _el$99);
1817
+ _$insert(_el$96, (() => {
1818
+ var _c$6 = _$memo(() => phase() === "feedback");
1819
+ return () => _c$6() ? feedback()?.correct ? "\u2713" : "\u2717" : "";
1227
1820
  })(), 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, {
1821
+ _$insertNode(_el$100, _$createTextNode(`learn`));
1822
+ _$setProp(_el$100, "dim", true);
1823
+ _$insert(_el$94, _$createComponent(Show, {
1824
+ get when() {
1825
+ return _$memo(() => phase() === "feedback")() && (canScrollUpBatch() || canScrollDownBatch());
1826
+ },
1827
+ get children() {
1828
+ var _el$102 = _$createElement("box"), _el$103 = _$createElement("text");
1829
+ _$insertNode(_el$102, _el$103);
1830
+ _$setProp(_el$102, "justifyContent", "center");
1831
+ _$setProp(_el$102, "height", 1);
1832
+ _$setProp(_el$102, "paddingLeft", 1);
1833
+ _$setProp(_el$102, "paddingRight", 1);
1834
+ _$setProp(_el$103, "bold", true);
1835
+ _$insert(_el$103, (() => {
1836
+ var _c$7 = _$memo(() => !!(canScrollUpBatch() && canScrollDownBatch()));
1837
+ return () => _c$7() ? "\u25B2 more above \xB7 \u25BC more below \u2014 d / u to scroll" : canScrollDownBatch() ? "\u25BC more below \u2014 press d to see explanation" : "\u25B2 more above \u2014 press u to scroll up";
1838
+ })());
1839
+ _$effect((_p$) => {
1840
+ var _v$57 = canScrollDownBatch() ? theme().warning : theme().accent, _v$58 = theme().background;
1841
+ _v$57 !== _p$.e && (_p$.e = _$setProp(_el$102, "backgroundColor", _v$57, _p$.e));
1842
+ _v$58 !== _p$.t && (_p$.t = _$setProp(_el$103, "fg", _v$58, _p$.t));
1843
+ return _p$;
1844
+ }, {
1845
+ e: undefined,
1846
+ t: undefined
1847
+ });
1848
+ return _el$102;
1849
+ }
1850
+ }), _el$104);
1851
+ _$insertNode(_el$104, _el$105);
1852
+ _$use((el) => scrollRefBatch = el, _el$104);
1853
+ _$setProp(_el$104, "flexGrow", 1);
1854
+ _$insert(_el$104, _$createComponent(Show, {
1236
1855
  get when() {
1237
1856
  return cur().details;
1238
1857
  },
1239
1858
  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;
1859
+ var _el$106 = _$createElement("markdown");
1860
+ _$effect((_p$) => {
1861
+ var _v$59 = syntax(), _v$60 = decodeQuizText(cur().details), _v$61 = theme().textMuted, _v$62 = theme().backgroundPanel;
1862
+ _v$59 !== _p$.e && (_p$.e = _$setProp(_el$106, "syntaxStyle", _v$59, _p$.e));
1863
+ _v$60 !== _p$.t && (_p$.t = _$setProp(_el$106, "content", _v$60, _p$.t));
1864
+ _v$61 !== _p$.a && (_p$.a = _$setProp(_el$106, "fg", _v$61, _p$.a));
1865
+ _v$62 !== _p$.o && (_p$.o = _$setProp(_el$106, "bg", _v$62, _p$.o));
1866
+ return _p$;
1867
+ }, {
1868
+ e: undefined,
1869
+ t: undefined,
1870
+ a: undefined,
1871
+ o: undefined
1872
+ });
1873
+ return _el$106;
1245
1874
  }
1246
1875
  }), null);
1247
- _$insert(_el$87, _$createComponent(Show, {
1876
+ _$insert(_el$104, _$createComponent(Show, {
1248
1877
  get when() {
1249
1878
  return phase() === "select";
1250
1879
  },
1251
1880
  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, {
1881
+ var _el$107 = _$createElement("box"), _el$108 = _$createElement("box"), _el$109 = _$createElement("text"), _el$110 = _$createElement("box"), _el$111 = _$createElement("box"), _el$112 = _$createElement("text"), _el$113 = _$createElement("box"), _el$114 = _$createElement("text"), _el$115 = _$createElement("box"), _el$116 = _$createElement("text"), _el$118 = _$createElement("box"), _el$119 = _$createElement("text"), _el$121 = _$createElement("box"), _el$123 = _$createElement("box"), _el$124 = _$createElement("text"), _el$125 = _$createElement("text"), _el$126 = _$createTextNode(`/`);
1882
+ _$insertNode(_el$107, _el$108);
1883
+ _$insertNode(_el$107, _el$110);
1884
+ _$insertNode(_el$107, _el$118);
1885
+ _$insertNode(_el$107, _el$123);
1886
+ _$setProp(_el$107, "flexDirection", "column");
1887
+ _$setProp(_el$107, "gap", 0);
1888
+ _$setProp(_el$107, "padding", 1);
1889
+ _$setProp(_el$107, "border", true);
1890
+ _$insert(_el$107, _$createComponent(For, {
1262
1891
  get each() {
1263
1892
  return cur().options;
1264
1893
  },
@@ -1267,36 +1896,36 @@ function QuizBatchDialog(props) {
1267
1896
  const foc = () => focused() === "options" && optionIndex() === id;
1268
1897
  const sel = () => selected().has(`opt:${id}`);
1269
1898
  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(`. `);
1271
- _$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";
1899
+ var _el$148 = _$createElement("box"), _el$149 = _$createElement("box"), _el$150 = _$createElement("text"), _el$151 = _$createElement("box"), _el$152 = _$createElement("text"), _el$153 = _$createElement("box"), _el$154 = _$createElement("text"), _el$155 = _$createTextNode(`. `);
1900
+ _$insertNode(_el$148, _el$149);
1901
+ _$insertNode(_el$148, _el$151);
1902
+ _$insertNode(_el$148, _el$153);
1903
+ _$setProp(_el$148, "flexDirection", "row");
1904
+ _$setProp(_el$148, "alignItems", "flexStart");
1905
+ _$setProp(_el$148, "gap", 1);
1906
+ _$setProp(_el$148, "paddingLeft", 1);
1907
+ _$insertNode(_el$149, _el$150);
1908
+ _$setProp(_el$149, "width", 2);
1909
+ _$insert(_el$150, () => foc() ? "\u25B8" : " ");
1910
+ _$insertNode(_el$151, _el$152);
1911
+ _$setProp(_el$151, "width", 2);
1912
+ _$insert(_el$152, (() => {
1913
+ var _c$0 = _$memo(() => !!isMulti());
1914
+ return () => _c$0() ? sel() ? "\u2611" : "\u2610" : sel() ? "\u2B22" : "\u25CB";
1286
1915
  })());
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);
1916
+ _$insertNode(_el$153, _el$154);
1917
+ _$setProp(_el$153, "flexGrow", 1);
1918
+ _$insertNode(_el$154, _el$155);
1919
+ _$setProp(_el$154, "wrapMode", "wrap");
1920
+ _$insert(_el$154, id + 1, _el$155);
1921
+ _$insert(_el$154, () => opt.label, null);
1293
1922
  _$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));
1923
+ var _v$106 = foc() ? theme().backgroundElement : undefined, _v$107 = foc() ? theme().accent : theme().textMuted, _v$108 = isMulti() ? sel() ? theme().success : theme().textMuted : sel() ? theme().accent : theme().textMuted, _v$109 = sel() ? theme().text : theme().textMuted, _v$110 = foc();
1924
+ _v$106 !== _p$.e && (_p$.e = _$setProp(_el$148, "backgroundColor", _v$106, _p$.e));
1925
+ _v$107 !== _p$.t && (_p$.t = _$setProp(_el$150, "fg", _v$107, _p$.t));
1926
+ _v$108 !== _p$.a && (_p$.a = _$setProp(_el$152, "fg", _v$108, _p$.a));
1927
+ _v$109 !== _p$.o && (_p$.o = _$setProp(_el$154, "fg", _v$109, _p$.o));
1928
+ _v$110 !== _p$.i && (_p$.i = _$setProp(_el$154, "bold", _v$110, _p$.i));
1300
1929
  return _p$;
1301
1930
  }, {
1302
1931
  e: undefined,
@@ -1305,120 +1934,123 @@ function QuizBatchDialog(props) {
1305
1934
  o: undefined,
1306
1935
  i: undefined
1307
1936
  });
1308
- return _el$131;
1937
+ return _el$148;
1309
1938
  })();
1310
1939
  }
1311
- }), _el$91);
1312
- _$insertNode(_el$91, _el$92);
1313
- _$setProp(_el$91, "height", 1);
1314
- _$insert(_el$92, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
1315
- _$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");
1327
- _$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, {
1940
+ }), _el$108);
1941
+ _$insertNode(_el$108, _el$109);
1942
+ _$setProp(_el$108, "height", 1);
1943
+ _$insert(_el$109, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
1944
+ _$insertNode(_el$110, _el$111);
1945
+ _$insertNode(_el$110, _el$113);
1946
+ _$insertNode(_el$110, _el$115);
1947
+ _$setProp(_el$110, "flexDirection", "row");
1948
+ _$setProp(_el$110, "gap", 1);
1949
+ _$setProp(_el$110, "paddingLeft", 1);
1950
+ _$insertNode(_el$111, _el$112);
1951
+ _$setProp(_el$111, "width", 2);
1952
+ _$insert(_el$112, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
1953
+ _$insertNode(_el$113, _el$114);
1954
+ _$setProp(_el$113, "width", 2);
1955
+ _$insert(_el$114, () => dontKnow() ? "\u2611" : "\u2610");
1956
+ _$insertNode(_el$115, _el$116);
1957
+ _$setProp(_el$115, "flexGrow", 1);
1958
+ _$insertNode(_el$116, _$createTextNode(`I don't know`));
1959
+ _$setProp(_el$116, "italic", true);
1960
+ _$insertNode(_el$118, _el$119);
1961
+ _$insertNode(_el$118, _el$121);
1962
+ _$setProp(_el$118, "flexDirection", "column");
1963
+ _$setProp(_el$118, "paddingTop", 1);
1964
+ _$insertNode(_el$119, _$createTextNode(`\u270E Note`));
1965
+ _$setProp(_el$121, "border", true);
1966
+ _$setProp(_el$121, "paddingLeft", 1);
1967
+ _$setProp(_el$121, "paddingRight", 1);
1968
+ _$insert(_el$121, _$createComponent(Show, {
1340
1969
  get when() {
1341
1970
  return focused() === "note";
1342
1971
  },
1343
1972
  get fallback() {
1344
1973
  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;
1974
+ var _el$156 = _$createElement("text");
1975
+ _$insert(_el$156, () => note() || "Tab to edit \xB7 share what you were thinking");
1976
+ _$effect((_$p) => _$setProp(_el$156, "fg", theme().textMuted, _$p));
1977
+ return _el$156;
1349
1978
  })();
1350
1979
  },
1351
1980
  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", () => {
1981
+ var _el$122 = _$createElement("input");
1982
+ _$use((el) => noteEl = el, _el$122);
1983
+ _$setProp(_el$122, "onInput", (v) => setNote(typeof v === "string" ? v : v?.target?.value ?? ""));
1984
+ _$setProp(_el$122, "onSubmit", () => {
1356
1985
  if (!selected().size && !dontKnow() && note().trim())
1357
1986
  submitSelect();
1358
1987
  else
1359
1988
  setFocused("options");
1360
1989
  });
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;
1990
+ _$setProp(_el$122, "placeholder", "note (Enter to submit note \u2192 classify)");
1991
+ _$effect((_$p) => _$setProp(_el$122, "value", note(), _$p));
1992
+ return _el$122;
1364
1993
  }
1365
1994
  }));
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, {
1995
+ _$insertNode(_el$123, _el$124);
1996
+ _$insertNode(_el$123, _el$125);
1997
+ _$setProp(_el$123, "flexDirection", "row");
1998
+ _$setProp(_el$123, "justifyContent", "space-between");
1999
+ _$setProp(_el$123, "paddingTop", 1);
2000
+ _$insert(_el$124, (() => {
2001
+ var _c$8 = _$memo(() => !!isMulti());
2002
+ return () => _c$8() ? `${selected().size} selected` : note().trim() && !selected().size ? "note \u2192 classify" : "";
2003
+ })());
2004
+ _$insertNode(_el$125, _el$126);
2005
+ _$insert(_el$125, () => idx() + 1, _el$126);
2006
+ _$insert(_el$125, () => props.request.quizzes.length, null);
2007
+ _$insert(_el$107, _$createComponent(Show, {
1376
2008
  get when() {
1377
2009
  return isMulti();
1378
2010
  },
1379
2011
  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);
2012
+ var _el$127 = _$createElement("box"), _el$128 = _$createElement("box"), _el$129 = _$createElement("text"), _el$130 = _$createElement("text");
2013
+ _$insertNode(_el$127, _el$128);
2014
+ _$setProp(_el$127, "justifyContent", "center");
2015
+ _$setProp(_el$127, "paddingTop", 1);
2016
+ _$insertNode(_el$128, _el$129);
2017
+ _$insertNode(_el$128, _el$130);
2018
+ _$setProp(_el$128, "flexDirection", "row");
2019
+ _$setProp(_el$128, "gap", 1);
2020
+ _$setProp(_el$128, "border", true);
2021
+ _$setProp(_el$128, "paddingLeft", 2);
2022
+ _$setProp(_el$128, "paddingRight", 2);
2023
+ _$insert(_el$129, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
2024
+ _$insertNode(_el$130, _$createTextNode(`\u21B3 Submit`));
2025
+ _$setProp(_el$130, "bold", true);
1394
2026
  _$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));
2027
+ var _v$63 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().borderSubtle, _v$64 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : theme().background, _v$65 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().textMuted;
2028
+ _v$63 !== _p$.e && (_p$.e = _$setProp(_el$128, "borderColor", _v$63, _p$.e));
2029
+ _v$64 !== _p$.t && (_p$.t = _$setProp(_el$128, "backgroundColor", _v$64, _p$.t));
2030
+ _v$65 !== _p$.a && (_p$.a = _$setProp(_el$129, "fg", _v$65, _p$.a));
1399
2031
  return _p$;
1400
2032
  }, {
1401
2033
  e: undefined,
1402
2034
  t: undefined,
1403
2035
  a: undefined
1404
2036
  });
1405
- return _el$110;
2037
+ return _el$127;
1406
2038
  }
1407
2039
  }), null);
1408
2040
  _$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));
2041
+ var _v$66 = theme().borderSubtle, _v$67 = theme().background, _v$68 = theme().borderSubtle, _v$69 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$70 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$71 = dontKnow() ? theme().warning : theme().textMuted, _v$72 = dontKnow() ? theme().warning : theme().textMuted, _v$73 = focused() === "note" ? theme().accent : theme().textMuted, _v$74 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$75 = theme().backgroundElement, _v$76 = theme().textMuted, _v$77 = theme().textMuted;
2042
+ _v$66 !== _p$.e && (_p$.e = _$setProp(_el$107, "borderColor", _v$66, _p$.e));
2043
+ _v$67 !== _p$.t && (_p$.t = _$setProp(_el$107, "backgroundColor", _v$67, _p$.t));
2044
+ _v$68 !== _p$.a && (_p$.a = _$setProp(_el$109, "fg", _v$68, _p$.a));
2045
+ _v$69 !== _p$.o && (_p$.o = _$setProp(_el$110, "backgroundColor", _v$69, _p$.o));
2046
+ _v$70 !== _p$.i && (_p$.i = _$setProp(_el$112, "fg", _v$70, _p$.i));
2047
+ _v$71 !== _p$.n && (_p$.n = _$setProp(_el$114, "fg", _v$71, _p$.n));
2048
+ _v$72 !== _p$.s && (_p$.s = _$setProp(_el$116, "fg", _v$72, _p$.s));
2049
+ _v$73 !== _p$.h && (_p$.h = _$setProp(_el$119, "fg", _v$73, _p$.h));
2050
+ _v$74 !== _p$.r && (_p$.r = _$setProp(_el$121, "borderColor", _v$74, _p$.r));
2051
+ _v$75 !== _p$.d && (_p$.d = _$setProp(_el$121, "backgroundColor", _v$75, _p$.d));
2052
+ _v$76 !== _p$.l && (_p$.l = _$setProp(_el$124, "fg", _v$76, _p$.l));
2053
+ _v$77 !== _p$.u && (_p$.u = _$setProp(_el$125, "fg", _v$77, _p$.u));
1422
2054
  return _p$;
1423
2055
  }, {
1424
2056
  e: undefined,
@@ -1434,37 +2066,37 @@ function QuizBatchDialog(props) {
1434
2066
  l: undefined,
1435
2067
  u: undefined
1436
2068
  });
1437
- return _el$90;
2069
+ return _el$107;
1438
2070
  }
1439
2071
  }), null);
1440
- _$insert(_el$87, _$createComponent(Show, {
2072
+ _$insert(_el$104, _$createComponent(Show, {
1441
2073
  get when() {
1442
2074
  return phase() === "classifying";
1443
2075
  },
1444
2076
  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");
1446
- _$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`));
2077
+ var _el$132 = _$createElement("box"), _el$133 = _$createElement("text"), _el$135 = _$createElement("text"), _el$136 = _$createTextNode(`"`), _el$137 = _$createTextNode(`"`), _el$138 = _$createElement("text");
2078
+ _$insertNode(_el$132, _el$133);
2079
+ _$insertNode(_el$132, _el$135);
2080
+ _$insertNode(_el$132, _el$138);
2081
+ _$setProp(_el$132, "flexDirection", "column");
2082
+ _$setProp(_el$132, "gap", 1);
2083
+ _$setProp(_el$132, "padding", 1);
2084
+ _$setProp(_el$132, "border", true);
2085
+ _$setProp(_el$132, "alignItems", "center");
2086
+ _$insertNode(_el$133, _$createTextNode(`\u25D0 Classifying your note...`));
2087
+ _$setProp(_el$133, "bold", true);
2088
+ _$insertNode(_el$135, _el$136);
2089
+ _$insertNode(_el$135, _el$137);
2090
+ _$setProp(_el$135, "wrapMode", "wrap");
2091
+ _$insert(_el$135, note, _el$137);
2092
+ _$insertNode(_el$138, _$createTextNode(`Mapping to options \u2014 please wait`));
1461
2093
  _$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));
2094
+ var _v$78 = theme().accent, _v$79 = theme().background, _v$80 = theme().accent, _v$81 = theme().textMuted, _v$82 = theme().textMuted;
2095
+ _v$78 !== _p$.e && (_p$.e = _$setProp(_el$132, "borderColor", _v$78, _p$.e));
2096
+ _v$79 !== _p$.t && (_p$.t = _$setProp(_el$132, "backgroundColor", _v$79, _p$.t));
2097
+ _v$80 !== _p$.a && (_p$.a = _$setProp(_el$133, "fg", _v$80, _p$.a));
2098
+ _v$81 !== _p$.o && (_p$.o = _$setProp(_el$135, "fg", _v$81, _p$.o));
2099
+ _v$82 !== _p$.i && (_p$.i = _$setProp(_el$138, "fg", _v$82, _p$.i));
1468
2100
  return _p$;
1469
2101
  }, {
1470
2102
  e: undefined,
@@ -1473,23 +2105,23 @@ function QuizBatchDialog(props) {
1473
2105
  o: undefined,
1474
2106
  i: undefined
1475
2107
  });
1476
- return _el$115;
2108
+ return _el$132;
1477
2109
  }
1478
2110
  }), null);
1479
- _$insert(_el$87, _$createComponent(Show, {
2111
+ _$insert(_el$104, _$createComponent(Show, {
1480
2112
  get when() {
1481
2113
  return phase() === "feedback";
1482
2114
  },
1483
2115
  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, {
2116
+ var _el$140 = _$createElement("box"), _el$141 = _$createElement("text"), _el$142 = _$createElement("text"), _el$143 = _$createTextNode(`Correct: `), _el$144 = _$createElement("box"), _el$145 = _$createElement("markdown");
2117
+ _$insertNode(_el$140, _el$141);
2118
+ _$insertNode(_el$140, _el$142);
2119
+ _$insertNode(_el$140, _el$144);
2120
+ _$setProp(_el$140, "flexDirection", "column");
2121
+ _$setProp(_el$140, "gap", 1);
2122
+ _$setProp(_el$140, "padding", 1);
2123
+ _$setProp(_el$140, "border", true);
2124
+ _$insert(_el$140, _$createComponent(For, {
1493
2125
  get each() {
1494
2126
  return cur().options;
1495
2127
  },
@@ -1518,47 +2150,48 @@ function QuizBatchDialog(props) {
1518
2150
  bg = theme().warning;
1519
2151
  }
1520
2152
  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(`. `);
1522
- _$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);
1528
- _$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;
2153
+ var _el$157 = _$createElement("box"), _el$158 = _$createElement("box"), _el$159 = _$createElement("text"), _el$160 = _$createElement("box"), _el$161 = _$createElement("text"), _el$162 = _$createTextNode(`. `);
2154
+ _$insertNode(_el$157, _el$158);
2155
+ _$insertNode(_el$157, _el$160);
2156
+ _$setProp(_el$157, "flexDirection", "row");
2157
+ _$setProp(_el$157, "gap", 1);
2158
+ _$setProp(_el$157, "paddingLeft", 1);
2159
+ _$setProp(_el$157, "backgroundColor", bg);
2160
+ _$insertNode(_el$158, _el$159);
2161
+ _$setProp(_el$158, "width", 2);
2162
+ _$setProp(_el$159, "fg", fg);
2163
+ _$setProp(_el$159, "bold", true);
2164
+ _$insert(_el$159, ic);
2165
+ _$insertNode(_el$160, _el$161);
2166
+ _$setProp(_el$160, "flexGrow", 1);
2167
+ _$insertNode(_el$161, _el$162);
2168
+ _$setProp(_el$161, "fg", fg);
2169
+ _$setProp(_el$161, "wrapMode", "wrap");
2170
+ _$insert(_el$161, id, _el$162);
2171
+ _$insert(_el$161, () => opt.label, null);
2172
+ return _el$157;
1541
2173
  })();
1542
2174
  }
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);
2175
+ }), _el$141);
2176
+ _$setProp(_el$141, "bold", true);
2177
+ _$insert(_el$141, () => feedback()?.correct ? "\u2713 Correct" : "\u2717 Incorrect");
2178
+ _$insertNode(_el$142, _el$143);
2179
+ _$insert(_el$142, () => cur().correctIndices.map((i) => `${i}. ${cur().options[i - 1]?.label}`).join(", "), null);
2180
+ _$insertNode(_el$144, _el$145);
2181
+ _$setProp(_el$144, "border", true);
2182
+ _$setProp(_el$144, "padding", 1);
1553
2183
  _$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));
2184
+ var _v$83 = feedback()?.correct ? theme().success : theme().error, _v$84 = theme().background, _v$85 = feedback()?.correct ? theme().success : theme().error, _v$86 = theme().textMuted, _v$87 = theme().borderSubtle, _v$88 = theme().backgroundPanel, _v$89 = syntax(), _v$90 = decodeQuizText(cur().explanation), _v$91 = theme().text, _v$92 = theme().backgroundPanel;
2185
+ _v$83 !== _p$.e && (_p$.e = _$setProp(_el$140, "borderColor", _v$83, _p$.e));
2186
+ _v$84 !== _p$.t && (_p$.t = _$setProp(_el$140, "backgroundColor", _v$84, _p$.t));
2187
+ _v$85 !== _p$.a && (_p$.a = _$setProp(_el$141, "fg", _v$85, _p$.a));
2188
+ _v$86 !== _p$.o && (_p$.o = _$setProp(_el$142, "fg", _v$86, _p$.o));
2189
+ _v$87 !== _p$.i && (_p$.i = _$setProp(_el$144, "borderColor", _v$87, _p$.i));
2190
+ _v$88 !== _p$.n && (_p$.n = _$setProp(_el$144, "backgroundColor", _v$88, _p$.n));
2191
+ _v$89 !== _p$.s && (_p$.s = _$setProp(_el$145, "syntaxStyle", _v$89, _p$.s));
2192
+ _v$90 !== _p$.h && (_p$.h = _$setProp(_el$145, "content", _v$90, _p$.h));
2193
+ _v$91 !== _p$.r && (_p$.r = _$setProp(_el$145, "fg", _v$91, _p$.r));
2194
+ _v$92 !== _p$.d && (_p$.d = _$setProp(_el$145, "bg", _v$92, _p$.d));
1562
2195
  return _p$;
1563
2196
  }, {
1564
2197
  e: undefined,
@@ -1567,29 +2200,115 @@ function QuizBatchDialog(props) {
1567
2200
  o: undefined,
1568
2201
  i: undefined,
1569
2202
  n: undefined,
1570
- s: undefined
2203
+ s: undefined,
2204
+ h: undefined,
2205
+ r: undefined,
2206
+ d: undefined
1571
2207
  });
1572
- return _el$123;
2208
+ return _el$140;
1573
2209
  }
1574
2210
  }), 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";
2211
+ _$insertNode(_el$146, _el$147);
2212
+ _$setProp(_el$146, "height", 1);
2213
+ _$setProp(_el$146, "justifyContent", "center");
2214
+ _$setProp(_el$147, "wrapMode", "wrap");
2215
+ _$insert(_el$147, (() => {
2216
+ var _c$9 = _$memo(() => phase() === "feedback");
2217
+ return () => _c$9() ? _$memo(() => !!(canScrollUpBatch() && canScrollDownBatch()))() ? [(() => {
2218
+ var _el$163 = _$createElement("span");
2219
+ _$insertNode(_el$163, _$createTextNode(`\u25B2 more above \xB7 \u25BC more below`));
2220
+ _$effect((_$p) => _$setProp(_el$163, "style", {
2221
+ fg: theme.warning,
2222
+ bold: true
2223
+ }, _$p));
2224
+ return _el$163;
2225
+ })(), (() => {
2226
+ var _el$165 = _$createElement("span"), _el$166 = _$createTextNode(` \u2014 d/u to scroll \xB7 Enter \u2192 next (`), _el$167 = _$createTextNode(`/`), _el$168 = _$createTextNode(`)`);
2227
+ _$insertNode(_el$165, _el$166);
2228
+ _$insertNode(_el$165, _el$167);
2229
+ _$insertNode(_el$165, _el$168);
2230
+ _$insert(_el$165, () => idx() + 1, _el$167);
2231
+ _$insert(_el$165, () => props.request.quizzes.length, _el$168);
2232
+ _$effect((_$p) => _$setProp(_el$165, "style", {
2233
+ fg: theme().textMuted
2234
+ }, _$p));
2235
+ return _el$165;
2236
+ })()] : _$memo(() => !!canScrollDownBatch())() ? [(() => {
2237
+ var _el$169 = _$createElement("span");
2238
+ _$insertNode(_el$169, _$createTextNode(`\u25BC more below`));
2239
+ _$effect((_$p) => _$setProp(_el$169, "style", {
2240
+ fg: theme.warning,
2241
+ bold: true
2242
+ }, _$p));
2243
+ return _el$169;
2244
+ })(), (() => {
2245
+ var _el$171 = _$createElement("span"), _el$172 = _$createTextNode(` \u2014 d to scroll \xB7 Enter \u2192 next (`), _el$173 = _$createTextNode(`/`), _el$174 = _$createTextNode(`)`);
2246
+ _$insertNode(_el$171, _el$172);
2247
+ _$insertNode(_el$171, _el$173);
2248
+ _$insertNode(_el$171, _el$174);
2249
+ _$insert(_el$171, () => idx() + 1, _el$173);
2250
+ _$insert(_el$171, () => props.request.quizzes.length, _el$174);
2251
+ _$effect((_$p) => _$setProp(_el$171, "style", {
2252
+ fg: theme().textMuted
2253
+ }, _$p));
2254
+ return _el$171;
2255
+ })()] : _$memo(() => !!canScrollUpBatch())() ? [(() => {
2256
+ var _el$175 = _$createElement("span");
2257
+ _$insertNode(_el$175, _$createTextNode(`\u25B2 more above`));
2258
+ _$effect((_$p) => _$setProp(_el$175, "style", {
2259
+ fg: theme.accent,
2260
+ bold: true
2261
+ }, _$p));
2262
+ return _el$175;
2263
+ })(), (() => {
2264
+ var _el$177 = _$createElement("span"), _el$178 = _$createTextNode(` \u2014 u to scroll \xB7 Enter \u2192 next (`), _el$179 = _$createTextNode(`/`), _el$180 = _$createTextNode(`)`);
2265
+ _$insertNode(_el$177, _el$178);
2266
+ _$insertNode(_el$177, _el$179);
2267
+ _$insertNode(_el$177, _el$180);
2268
+ _$insert(_el$177, () => idx() + 1, _el$179);
2269
+ _$insert(_el$177, () => props.request.quizzes.length, _el$180);
2270
+ _$effect((_$p) => _$setProp(_el$177, "style", {
2271
+ fg: theme().textMuted
2272
+ }, _$p));
2273
+ return _el$177;
2274
+ })()] : `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" : _$memo(() => !!(canScrollUpBatch() || canScrollDownBatch()))() ? [(() => {
2275
+ var _el$181 = _$createElement("span");
2276
+ _$insertNode(_el$181, _$createTextNode(`j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel`));
2277
+ _$effect((_$p) => _$setProp(_el$181, "style", {
2278
+ fg: theme().textMuted
2279
+ }, _$p));
2280
+ return _el$181;
2281
+ })(), (() => {
2282
+ var _el$183 = _$createElement("span");
2283
+ _$insertNode(_el$183, _$createTextNode(` \xB7 d/u scroll`));
2284
+ _$effect((_$p) => _$setProp(_el$183, "style", {
2285
+ fg: theme.warning,
2286
+ bold: true
2287
+ }, _$p));
2288
+ return _el$183;
2289
+ })()] : "j/k or \u2191\u2193 move \xB7 Space toggle \xB7 Tab note \xB7 Enter submit \xB7 Esc cancel";
1581
2290
  })());
1582
2291
  _$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));
2292
+ var _v$93 = popupWidth(), _v$94 = popupHeight(), _v$95 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$96 = theme().backgroundPanel, _v$97 = theme().accent, _v$98 = theme().background, _v$99 = theme().background, _v$100 = {
2293
+ visible: true,
2294
+ trackOptions: {
2295
+ backgroundColor: theme().background,
2296
+ foregroundColor: theme().borderActive
2297
+ }
2298
+ }, _v$101 = syntax(), _v$102 = decodeQuizText(cur().question), _v$103 = theme().text, _v$104 = theme().backgroundPanel, _v$105 = theme().textMuted;
2299
+ _v$93 !== _p$.e && (_p$.e = _$setProp(_el$94, "width", _v$93, _p$.e));
2300
+ _v$94 !== _p$.t && (_p$.t = _$setProp(_el$94, "height", _v$94, _p$.t));
2301
+ _v$95 !== _p$.a && (_p$.a = _$setProp(_el$94, "borderColor", _v$95, _p$.a));
2302
+ _v$96 !== _p$.o && (_p$.o = _$setProp(_el$94, "backgroundColor", _v$96, _p$.o));
2303
+ _v$97 !== _p$.i && (_p$.i = _$setProp(_el$95, "backgroundColor", _v$97, _p$.i));
2304
+ _v$98 !== _p$.n && (_p$.n = _$setProp(_el$96, "fg", _v$98, _p$.n));
2305
+ _v$99 !== _p$.s && (_p$.s = _$setProp(_el$100, "fg", _v$99, _p$.s));
2306
+ _v$100 !== _p$.h && (_p$.h = _$setProp(_el$104, "verticalScrollbarOptions", _v$100, _p$.h));
2307
+ _v$101 !== _p$.r && (_p$.r = _$setProp(_el$105, "syntaxStyle", _v$101, _p$.r));
2308
+ _v$102 !== _p$.d && (_p$.d = _$setProp(_el$105, "content", _v$102, _p$.d));
2309
+ _v$103 !== _p$.l && (_p$.l = _$setProp(_el$105, "fg", _v$103, _p$.l));
2310
+ _v$104 !== _p$.u && (_p$.u = _$setProp(_el$105, "bg", _v$104, _p$.u));
2311
+ _v$105 !== _p$.c && (_p$.c = _$setProp(_el$147, "fg", _v$105, _p$.c));
1593
2312
  return _p$;
1594
2313
  }, {
1595
2314
  e: undefined,
@@ -1600,9 +2319,13 @@ function QuizBatchDialog(props) {
1600
2319
  n: undefined,
1601
2320
  s: undefined,
1602
2321
  h: undefined,
1603
- r: undefined
2322
+ r: undefined,
2323
+ d: undefined,
2324
+ l: undefined,
2325
+ u: undefined,
2326
+ c: undefined
1604
2327
  });
1605
- return _el$79;
2328
+ return _el$94;
1606
2329
  })();
1607
2330
  }
1608
2331
  var tui = async (api) => {