@vue-skuilder/edit-ui 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,472 @@
1
- import { defineComponent, defineAsyncComponent, ref, computed, onMounted, onUnmounted, watch, nextTick, onBeforeUnmount, markRaw, createElementBlock, openBlock, Fragment, renderList, createElementVNode, createCommentVNode, toDisplayString, resolveComponent, createVNode, withCtx, createTextVNode, normalizeStyle, createBlock, withDirectives, normalizeClass, vModelText, withModifiers, withKeys } from "vue";
1
+ import { defineComponent, resolveComponent, createElementBlock, openBlock, createVNode, withCtx, Fragment, renderList, createBlock, createTextVNode, toDisplayString, createElementVNode, createCommentVNode, defineAsyncComponent, ref, computed, onMounted, onUnmounted, watch, nextTick, onBeforeUnmount, markRaw, normalizeStyle, withDirectives, normalizeClass, vModelText, withModifiers, withKeys } from "vue";
2
+ import { getDataLayer, DocType, Navigators, validateProcessorConfig, importParsedCards } from "@vue-skuilder/db";
2
3
  import { AudioAutoPlayer, RadioMultipleChoice, useViewable, useQuestionView, Question, splitByDelimiters, containsComponent, UserInputNumber, TFSelect, alertUser, SkldrMouseTrap, UserInputString, TagsInput, CardBrowser, getCurrentUser, SkMouseTrap } from "@vue-skuilder/common-ui";
3
4
  import { FieldType, DataShapeName, Status, Validators, log, NameSpacer, fieldConverters, validationFunctionToVuetifyRule, isValidBulkFormat, parseBulkTextToCards } from "@vue-skuilder/common";
4
- import { getDataLayer, validateProcessorConfig, importParsedCards } from "@vue-skuilder/db";
5
5
  import { defineStore } from "pinia";
6
+ const _sfc_main$r = defineComponent({
7
+ name: "NavigationStrategyList",
8
+ props: {
9
+ strategies: {
10
+ type: Array,
11
+ required: true
12
+ },
13
+ defaultStrategyId: {
14
+ type: String,
15
+ default: null
16
+ }
17
+ },
18
+ emits: ["edit", "delete", "update:defaultStrategy"],
19
+ methods: {
20
+ getDisplayConfig(strategy) {
21
+ if (!strategy.serializedData) return "No configuration";
22
+ try {
23
+ const config = JSON.parse(strategy.serializedData);
24
+ if (Array.isArray(config)) {
25
+ return `${config.length} cards in sequence`;
26
+ }
27
+ return Object.keys(config).map((key) => `${key}: ${config[key]}`).join(", ");
28
+ } catch {
29
+ return strategy.serializedData;
30
+ }
31
+ }
32
+ }
33
+ });
34
+ const _export_sfc$1 = (sfc, props) => {
35
+ const target = sfc.__vccOpts || sfc;
36
+ for (const [key, val] of props) {
37
+ target[key] = val;
38
+ }
39
+ return target;
40
+ };
41
+ const _hoisted_1$r = { class: "navigation-strategy-list" };
42
+ const _hoisted_2$f = { key: 0 };
43
+ const _hoisted_3$b = { class: "d-flex" };
44
+ function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
45
+ const _component_v_radio = resolveComponent("v-radio");
46
+ const _component_v_list_item_title = resolveComponent("v-list-item-title");
47
+ const _component_v_list_item_subtitle = resolveComponent("v-list-item-subtitle");
48
+ const _component_v_icon = resolveComponent("v-icon");
49
+ const _component_v_btn = resolveComponent("v-btn");
50
+ const _component_v_list_item = resolveComponent("v-list-item");
51
+ const _component_v_list = resolveComponent("v-list");
52
+ const _component_v_radio_group = resolveComponent("v-radio-group");
53
+ return openBlock(), createElementBlock("div", _hoisted_1$r, [
54
+ createVNode(_component_v_radio_group, {
55
+ "model-value": _ctx.defaultStrategyId,
56
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:defaultStrategy", $event))
57
+ }, {
58
+ default: withCtx(() => [
59
+ createVNode(_component_v_list, null, {
60
+ default: withCtx(() => [
61
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.strategies, (strategy) => {
62
+ return openBlock(), createBlock(_component_v_list_item, {
63
+ key: strategy._id,
64
+ lines: "three"
65
+ }, {
66
+ prepend: withCtx(() => [
67
+ createVNode(_component_v_radio, {
68
+ value: strategy._id
69
+ }, null, 8, ["value"])
70
+ ]),
71
+ append: withCtx(() => [
72
+ createElementVNode("div", _hoisted_3$b, [
73
+ createVNode(_component_v_btn, {
74
+ icon: "",
75
+ size: "small",
76
+ title: "Edit Strategy (coming soon)",
77
+ class: "mr-1",
78
+ disabled: ""
79
+ }, {
80
+ default: withCtx(() => [
81
+ createVNode(_component_v_icon, null, {
82
+ default: withCtx(() => _cache[3] || (_cache[3] = [
83
+ createTextVNode("mdi-pencil")
84
+ ])),
85
+ _: 1
86
+ })
87
+ ]),
88
+ _: 1
89
+ }),
90
+ createVNode(_component_v_btn, {
91
+ icon: "",
92
+ size: "small",
93
+ title: "Delete Strategy",
94
+ class: "mr-1",
95
+ onClick: ($event) => _ctx.$emit("delete", strategy)
96
+ }, {
97
+ default: withCtx(() => [
98
+ createVNode(_component_v_icon, null, {
99
+ default: withCtx(() => _cache[4] || (_cache[4] = [
100
+ createTextVNode("mdi-delete")
101
+ ])),
102
+ _: 1
103
+ })
104
+ ]),
105
+ _: 2
106
+ }, 1032, ["onClick"])
107
+ ])
108
+ ]),
109
+ default: withCtx(() => [
110
+ createVNode(_component_v_list_item_title, { class: "text-h6" }, {
111
+ default: withCtx(() => [
112
+ createTextVNode(toDisplayString(strategy.name), 1)
113
+ ]),
114
+ _: 2
115
+ }, 1024),
116
+ createVNode(_component_v_list_item_subtitle, null, {
117
+ default: withCtx(() => [
118
+ createTextVNode(toDisplayString(strategy.description), 1)
119
+ ]),
120
+ _: 2
121
+ }, 1024),
122
+ createVNode(_component_v_list_item_subtitle, { class: "strategy-details mt-2" }, {
123
+ default: withCtx(() => [
124
+ createElementVNode("div", null, [
125
+ _cache[1] || (_cache[1] = createElementVNode("strong", null, "Type:", -1)),
126
+ createTextVNode(" " + toDisplayString(strategy.implementingClass), 1)
127
+ ]),
128
+ strategy.serializedData ? (openBlock(), createElementBlock("div", _hoisted_2$f, [
129
+ _cache[2] || (_cache[2] = createElementVNode("strong", null, "Configuration:", -1)),
130
+ createTextVNode(" " + toDisplayString(_ctx.getDisplayConfig(strategy)), 1)
131
+ ])) : createCommentVNode("", true)
132
+ ]),
133
+ _: 2
134
+ }, 1024)
135
+ ]),
136
+ _: 2
137
+ }, 1024);
138
+ }), 128))
139
+ ]),
140
+ _: 1
141
+ })
142
+ ]),
143
+ _: 1
144
+ }, 8, ["model-value"])
145
+ ]);
146
+ }
147
+ const NavigationStrategyList = /* @__PURE__ */ _export_sfc$1(_sfc_main$r, [["render", _sfc_render$r], ["__scopeId", "data-v-3a73a1db"]]);
148
+ const _sfc_main$q = defineComponent({
149
+ name: "NavigationStrategyEditor",
150
+ components: {
151
+ NavigationStrategyList
152
+ },
153
+ props: {
154
+ courseId: {
155
+ type: String,
156
+ required: true
157
+ }
158
+ },
159
+ data() {
160
+ return {
161
+ strategies: [],
162
+ loading: true,
163
+ showDeleteConfirm: false,
164
+ strategyToDelete: null,
165
+ showCreateDialog: false,
166
+ newStrategy: {
167
+ name: "",
168
+ description: "",
169
+ cardIds: ""
170
+ },
171
+ defaultStrategyId: null
172
+ };
173
+ },
174
+ async created() {
175
+ await this.loadStrategies();
176
+ },
177
+ methods: {
178
+ async loadStrategies() {
179
+ this.loading = true;
180
+ try {
181
+ const dataLayer = getDataLayer();
182
+ const courseDB = dataLayer.getCourseDB(this.courseId);
183
+ const [strategies, courseConfig] = await Promise.all([
184
+ courseDB.getAllNavigationStrategies(),
185
+ courseDB.getCourseConfig()
186
+ ]);
187
+ this.strategies = strategies;
188
+ this.defaultStrategyId = courseConfig.defaultNavigationStrategyId || null;
189
+ } catch (error) {
190
+ console.error("Failed to load navigation strategies:", error);
191
+ this.strategies = [
192
+ {
193
+ _id: `NAVIGATION_STRATEGY-ELO`,
194
+ docType: DocType.NAVIGATION_STRATEGY,
195
+ name: "ELO",
196
+ description: "Default ELO-based navigation strategy",
197
+ implementingClass: Navigators.ELO,
198
+ course: this.courseId,
199
+ serializedData: "",
200
+ author: "system"
201
+ }
202
+ ];
203
+ }
204
+ this.loading = false;
205
+ },
206
+ async setDefaultStrategy(strategyId) {
207
+ try {
208
+ this.loading = true;
209
+ const dataLayer = getDataLayer();
210
+ const courseDB = dataLayer.getCourseDB(this.courseId);
211
+ const config = await courseDB.getCourseConfig();
212
+ config.defaultNavigationStrategyId = strategyId;
213
+ await courseDB.updateCourseConfig(config);
214
+ this.defaultStrategyId = strategyId;
215
+ alert("Default strategy updated!");
216
+ } catch (error) {
217
+ console.error("Failed to set default strategy:", error);
218
+ alert("Error updating default strategy. See console for details.");
219
+ } finally {
220
+ this.loading = false;
221
+ }
222
+ },
223
+ openCreateDialog() {
224
+ this.newStrategy = { name: "", description: "", cardIds: "" };
225
+ this.showCreateDialog = true;
226
+ },
227
+ async saveNewStrategy() {
228
+ if (!this.newStrategy.name || !this.newStrategy.cardIds) {
229
+ alert("Strategy Name and Card IDs are required.");
230
+ return;
231
+ }
232
+ this.loading = true;
233
+ try {
234
+ const dataLayer = getDataLayer();
235
+ const userDB = dataLayer.getUserDB();
236
+ const userName = userDB.getUsername();
237
+ const courseDB = dataLayer.getCourseDB(this.courseId);
238
+ const cardIdArray = this.newStrategy.cardIds.split(/[\n,]+/).map((id) => id.trim()).filter((id) => id);
239
+ const strategyData = {
240
+ _id: `NAVIGATION_STRATEGY-${Date.now()}`,
241
+ docType: DocType.NAVIGATION_STRATEGY,
242
+ name: this.newStrategy.name,
243
+ description: this.newStrategy.description,
244
+ implementingClass: Navigators.HARDCODED,
245
+ author: userName,
246
+ course: this.courseId,
247
+ serializedData: JSON.stringify(cardIdArray)
248
+ };
249
+ await courseDB.addNavigationStrategy(strategyData);
250
+ this.showCreateDialog = false;
251
+ await this.loadStrategies();
252
+ } catch (error) {
253
+ console.error("Failed to save new strategy:", error);
254
+ alert("Error saving strategy. See console for details.");
255
+ }
256
+ this.loading = false;
257
+ },
258
+ editStrategy(strategy) {
259
+ console.log(`Editing strategy ${strategy._id} is not yet implemented`);
260
+ },
261
+ confirmDeleteStrategy(strategy) {
262
+ this.strategyToDelete = strategy;
263
+ this.showDeleteConfirm = true;
264
+ },
265
+ async deleteStrategy() {
266
+ if (!this.strategyToDelete) return;
267
+ this.loading = true;
268
+ try {
269
+ const dataLayer = getDataLayer();
270
+ const courseDB = dataLayer.getCourseDB(this.courseId);
271
+ const emptyStrategy = {
272
+ _id: this.strategyToDelete._id,
273
+ docType: DocType.NAVIGATION_STRATEGY,
274
+ name: "DELETED",
275
+ description: "This strategy has been deleted",
276
+ implementingClass: "",
277
+ course: this.courseId,
278
+ serializedData: ""
279
+ };
280
+ await courseDB.updateNavigationStrategy(this.strategyToDelete._id, emptyStrategy);
281
+ console.log(`Strategy ${this.strategyToDelete._id} marked as deleted`);
282
+ this.strategies = this.strategies.filter((s2) => s2._id !== this.strategyToDelete?._id);
283
+ this.showDeleteConfirm = false;
284
+ this.strategyToDelete = null;
285
+ } catch (error) {
286
+ console.error("Failed to delete navigation strategy:", error);
287
+ }
288
+ this.loading = false;
289
+ }
290
+ }
291
+ });
292
+ const _hoisted_1$q = { class: "navigation-strategy-editor" };
293
+ const _hoisted_2$e = { key: 0 };
294
+ const _hoisted_3$a = { key: 1 };
295
+ const _hoisted_4$9 = {
296
+ key: 0,
297
+ class: "no-strategies"
298
+ };
299
+ function _sfc_render$q(_ctx, _cache, $props, $setup, $data, $options) {
300
+ const _component_v_progress_circular = resolveComponent("v-progress-circular");
301
+ const _component_navigation_strategy_list = resolveComponent("navigation-strategy-list");
302
+ const _component_v_icon = resolveComponent("v-icon");
303
+ const _component_v_btn = resolveComponent("v-btn");
304
+ const _component_v_card_title = resolveComponent("v-card-title");
305
+ const _component_v_text_field = resolveComponent("v-text-field");
306
+ const _component_v_textarea = resolveComponent("v-textarea");
307
+ const _component_v_card_text = resolveComponent("v-card-text");
308
+ const _component_v_spacer = resolveComponent("v-spacer");
309
+ const _component_v_card_actions = resolveComponent("v-card-actions");
310
+ const _component_v_card = resolveComponent("v-card");
311
+ const _component_v_dialog = resolveComponent("v-dialog");
312
+ return openBlock(), createElementBlock("div", _hoisted_1$q, [
313
+ _ctx.loading ? (openBlock(), createElementBlock("div", _hoisted_2$e, [
314
+ createVNode(_component_v_progress_circular, {
315
+ indeterminate: "",
316
+ color: "secondary"
317
+ })
318
+ ])) : (openBlock(), createElementBlock("div", _hoisted_3$a, [
319
+ _cache[16] || (_cache[16] = createElementVNode("h2", { class: "text-h5 mb-4" }, "Navigation Strategies", -1)),
320
+ _ctx.strategies.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_4$9, _cache[7] || (_cache[7] = [
321
+ createElementVNode("p", null, "No navigation strategies defined for this course.", -1)
322
+ ]))) : (openBlock(), createBlock(_component_navigation_strategy_list, {
323
+ key: 1,
324
+ strategies: _ctx.strategies,
325
+ "default-strategy-id": _ctx.defaultStrategyId,
326
+ "onUpdate:defaultStrategy": _ctx.setDefaultStrategy,
327
+ onEdit: _ctx.editStrategy,
328
+ onDelete: _ctx.confirmDeleteStrategy
329
+ }, null, 8, ["strategies", "default-strategy-id", "onUpdate:defaultStrategy", "onEdit", "onDelete"])),
330
+ createVNode(_component_v_btn, {
331
+ color: "primary",
332
+ class: "mt-4",
333
+ onClick: _ctx.openCreateDialog
334
+ }, {
335
+ default: withCtx(() => [
336
+ createVNode(_component_v_icon, { start: "" }, {
337
+ default: withCtx(() => _cache[8] || (_cache[8] = [
338
+ createTextVNode("mdi-plus")
339
+ ])),
340
+ _: 1
341
+ }),
342
+ _cache[9] || (_cache[9] = createTextVNode(" Add New Strategy "))
343
+ ]),
344
+ _: 1
345
+ }, 8, ["onClick"]),
346
+ createVNode(_component_v_dialog, {
347
+ modelValue: _ctx.showCreateDialog,
348
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => _ctx.showCreateDialog = $event),
349
+ "max-width": "600px"
350
+ }, {
351
+ default: withCtx(() => [
352
+ createVNode(_component_v_card, null, {
353
+ default: withCtx(() => [
354
+ createVNode(_component_v_card_title, null, {
355
+ default: withCtx(() => _cache[10] || (_cache[10] = [
356
+ createTextVNode("Create New Navigation Strategy")
357
+ ])),
358
+ _: 1
359
+ }),
360
+ createVNode(_component_v_card_text, null, {
361
+ default: withCtx(() => [
362
+ createVNode(_component_v_text_field, {
363
+ modelValue: _ctx.newStrategy.name,
364
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.newStrategy.name = $event),
365
+ label: "Strategy Name",
366
+ required: ""
367
+ }, null, 8, ["modelValue"]),
368
+ createVNode(_component_v_text_field, {
369
+ modelValue: _ctx.newStrategy.description,
370
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.newStrategy.description = $event),
371
+ label: "Description",
372
+ required: ""
373
+ }, null, 8, ["modelValue"]),
374
+ createVNode(_component_v_textarea, {
375
+ modelValue: _ctx.newStrategy.cardIds,
376
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.newStrategy.cardIds = $event),
377
+ label: "Card IDs",
378
+ placeholder: "Enter card IDs, one per line or separated by commas",
379
+ rows: "10",
380
+ required: ""
381
+ }, null, 8, ["modelValue"])
382
+ ]),
383
+ _: 1
384
+ }),
385
+ createVNode(_component_v_card_actions, null, {
386
+ default: withCtx(() => [
387
+ createVNode(_component_v_spacer),
388
+ createVNode(_component_v_btn, {
389
+ color: "blue darken-1",
390
+ text: "",
391
+ onClick: _cache[3] || (_cache[3] = ($event) => _ctx.showCreateDialog = false)
392
+ }, {
393
+ default: withCtx(() => _cache[11] || (_cache[11] = [
394
+ createTextVNode("Cancel")
395
+ ])),
396
+ _: 1
397
+ }),
398
+ createVNode(_component_v_btn, {
399
+ color: "blue darken-1",
400
+ text: "",
401
+ onClick: _ctx.saveNewStrategy
402
+ }, {
403
+ default: withCtx(() => _cache[12] || (_cache[12] = [
404
+ createTextVNode("Save")
405
+ ])),
406
+ _: 1
407
+ }, 8, ["onClick"])
408
+ ]),
409
+ _: 1
410
+ })
411
+ ]),
412
+ _: 1
413
+ })
414
+ ]),
415
+ _: 1
416
+ }, 8, ["modelValue"]),
417
+ createVNode(_component_v_dialog, {
418
+ modelValue: _ctx.showDeleteConfirm,
419
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => _ctx.showDeleteConfirm = $event),
420
+ "max-width": "400px"
421
+ }, {
422
+ default: withCtx(() => [
423
+ createVNode(_component_v_card, null, {
424
+ default: withCtx(() => [
425
+ createVNode(_component_v_card_title, { class: "text-h5" }, {
426
+ default: withCtx(() => _cache[13] || (_cache[13] = [
427
+ createTextVNode("Delete Strategy")
428
+ ])),
429
+ _: 1
430
+ }),
431
+ createVNode(_component_v_card_text, null, {
432
+ default: withCtx(() => [
433
+ createTextVNode(' Are you sure you want to delete the strategy "' + toDisplayString(_ctx.strategyToDelete?.name) + '"? ', 1)
434
+ ]),
435
+ _: 1
436
+ }),
437
+ createVNode(_component_v_card_actions, null, {
438
+ default: withCtx(() => [
439
+ createVNode(_component_v_spacer),
440
+ createVNode(_component_v_btn, {
441
+ color: "error",
442
+ onClick: _ctx.deleteStrategy
443
+ }, {
444
+ default: withCtx(() => _cache[14] || (_cache[14] = [
445
+ createTextVNode("Delete")
446
+ ])),
447
+ _: 1
448
+ }, 8, ["onClick"]),
449
+ createVNode(_component_v_btn, {
450
+ onClick: _cache[5] || (_cache[5] = ($event) => _ctx.showDeleteConfirm = false)
451
+ }, {
452
+ default: withCtx(() => _cache[15] || (_cache[15] = [
453
+ createTextVNode("Cancel")
454
+ ])),
455
+ _: 1
456
+ })
457
+ ]),
458
+ _: 1
459
+ })
460
+ ]),
461
+ _: 1
462
+ })
463
+ ]),
464
+ _: 1
465
+ }, 8, ["modelValue"])
466
+ ]))
467
+ ]);
468
+ }
469
+ const NavigationStrategyEditor = /* @__PURE__ */ _export_sfc$1(_sfc_main$q, [["render", _sfc_render$q], ["__scopeId", "data-v-cdd166d3"]]);
6
470
  const BlanksCardDataShapes = [
7
471
  {
8
472
  name: DataShapeName.Blanks,
@@ -5769,7 +6233,7 @@ const _sfc_main$p = defineComponent({
5769
6233
  };
5770
6234
  }
5771
6235
  });
5772
- const _export_sfc$1 = (sfc, props) => {
6236
+ const _export_sfc = (sfc, props) => {
5773
6237
  const target = sfc.__vccOpts || sfc;
5774
6238
  for (const [key, val] of props) {
5775
6239
  target[key] = val;
@@ -5835,7 +6299,7 @@ function _sfc_render$p(_ctx, _cache, $props, $setup, $data, $options) {
5835
6299
  })) : createCommentVNode("", true)
5836
6300
  ]);
5837
6301
  }
5838
- const FillInView = /* @__PURE__ */ _export_sfc$1(_sfc_main$p, [["render", _sfc_render$p], ["__scopeId", "data-v-0aa9252e"]]);
6302
+ const FillInView = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["render", _sfc_render$p], ["__scopeId", "data-v-0aa9252e"]]);
5839
6303
  function splitText(text2, leftBound, rightBound) {
5840
6304
  const leftSplit = text2.split(leftBound);
5841
6305
  const left = leftSplit[0];
@@ -10164,7 +10628,7 @@ function _sfc_render$o(_ctx, _cache, $props, $setup, $data, $options) {
10164
10628
  ])) : createCommentVNode("", true)
10165
10629
  ]);
10166
10630
  }
10167
- const PuzzleView = /* @__PURE__ */ _export_sfc$1(_sfc_main$o, [["render", _sfc_render$o]]);
10631
+ const PuzzleView = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["render", _sfc_render$o]]);
10168
10632
  const _ChessPuzzle = class _ChessPuzzle2 extends Question {
10169
10633
  constructor(data2) {
10170
10634
  super(data2);
@@ -10309,7 +10773,7 @@ function _sfc_render$n(_ctx, _cache, $props, $setup, $data, $options) {
10309
10773
  ], 64)) : createCommentVNode("", true)
10310
10774
  ]);
10311
10775
  }
10312
- const AudioParseView = /* @__PURE__ */ _export_sfc$1(_sfc_main$n, [["render", _sfc_render$n]]);
10776
+ const AudioParseView = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["render", _sfc_render$n]]);
10313
10777
  const _AudioParsingQuestion = class _AudioParsingQuestion2 extends Question {
10314
10778
  constructor(data2) {
10315
10779
  super(data2);
@@ -10391,7 +10855,7 @@ function _sfc_render$m(_ctx, _cache, $props, $setup, $data, $options) {
10391
10855
  ], 64)) : createCommentVNode("", true)
10392
10856
  ]);
10393
10857
  }
10394
- const IdentifyVocab = /* @__PURE__ */ _export_sfc$1(_sfc_main$m, [["render", _sfc_render$m]]);
10858
+ const IdentifyVocab = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["render", _sfc_render$m]]);
10395
10859
  const fields$a = [
10396
10860
  {
10397
10861
  name: "word",
@@ -10478,7 +10942,7 @@ function _sfc_render$l(_ctx, _cache, $props, $setup, $data, $options) {
10478
10942
  ], 64)) : createCommentVNode("", true)
10479
10943
  ]);
10480
10944
  }
10481
- const HorizontalAddition = /* @__PURE__ */ _export_sfc$1(_sfc_main$l, [["render", _sfc_render$l]]);
10945
+ const HorizontalAddition = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["render", _sfc_render$l]]);
10482
10946
  const _sfc_main$k = defineComponent({
10483
10947
  name: "VerbalAddition",
10484
10948
  components: {
@@ -10529,7 +10993,7 @@ function _sfc_render$k(_ctx, _cache, $props, $setup, $data, $options) {
10529
10993
  ], 64)) : createCommentVNode("", true)
10530
10994
  ]);
10531
10995
  }
10532
- const VerbalAddition = /* @__PURE__ */ _export_sfc$1(_sfc_main$k, [["render", _sfc_render$k]]);
10996
+ const VerbalAddition = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["render", _sfc_render$k]]);
10533
10997
  const data$3 = function() {
10534
10998
  const ret = [];
10535
10999
  for (let i2 = 0; i2 < 10; i2++) {
@@ -10615,7 +11079,7 @@ function _sfc_render$j(_ctx, _cache, $props, $setup, $data, $options) {
10615
11079
  ], 64)) : createCommentVNode("", true)
10616
11080
  ]);
10617
11081
  }
10618
- const HorizontalDivision = /* @__PURE__ */ _export_sfc$1(_sfc_main$j, [["render", _sfc_render$j]]);
11082
+ const HorizontalDivision = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["render", _sfc_render$j]]);
10619
11083
  const fields$9 = [
10620
11084
  {
10621
11085
  name: "a",
@@ -10728,7 +11192,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
10728
11192
  ], 64)) : createCommentVNode("", true)
10729
11193
  ]);
10730
11194
  }
10731
- const MultiplicationHorizontal = /* @__PURE__ */ _export_sfc$1(_sfc_main$i, [["render", _sfc_render$i]]);
11195
+ const MultiplicationHorizontal = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["render", _sfc_render$i]]);
10732
11196
  const _sfc_main$h = defineComponent({
10733
11197
  name: "VerbalMultiplication",
10734
11198
  components: {
@@ -10779,7 +11243,7 @@ function _sfc_render$h(_ctx, _cache, $props, $setup, $data, $options) {
10779
11243
  ], 64)) : createCommentVNode("", true)
10780
11244
  ]);
10781
11245
  }
10782
- const VerbalMultiplication = /* @__PURE__ */ _export_sfc$1(_sfc_main$h, [["render", _sfc_render$h]]);
11246
+ const VerbalMultiplication = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["render", _sfc_render$h]]);
10783
11247
  const validator$3 = {
10784
11248
  instructions: "An integer between 0 and 10, inclusive.",
10785
11249
  test: (value) => {
@@ -10873,7 +11337,7 @@ function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
10873
11337
  createVNode(_component_TFSelect, { submit: _ctx.submit }, null, 8, ["submit"])
10874
11338
  ]);
10875
11339
  }
10876
- const TrueFalse = /* @__PURE__ */ _export_sfc$1(_sfc_main$g, [["render", _sfc_render$g]]);
11340
+ const TrueFalse = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["render", _sfc_render$g]]);
10877
11341
  const _EqualityTest = class _EqualityTest2 extends Question {
10878
11342
  /**
10879
11343
  * @param data a and b are seed props that will pop a question of
@@ -10963,7 +11427,7 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
10963
11427
  ], 64)) : createCommentVNode("", true)
10964
11428
  ]);
10965
11429
  }
10966
- const Solve = /* @__PURE__ */ _export_sfc$1(_sfc_main$f, [["render", _sfc_render$f]]);
11430
+ const Solve = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["render", _sfc_render$f]]);
10967
11431
  const validator$2 = {
10968
11432
  instructions: "An integer between 0 and 10, inclusive.",
10969
11433
  test: (value) => {
@@ -11149,7 +11613,7 @@ function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
11149
11613
  ], 64)) : createCommentVNode("", true)
11150
11614
  ]);
11151
11615
  }
11152
- const AngleCategorizeV = /* @__PURE__ */ _export_sfc$1(_sfc_main$e, [["render", _sfc_render$e], ["__scopeId", "data-v-57f16e4a"]]);
11616
+ const AngleCategorizeV = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["render", _sfc_render$e], ["__scopeId", "data-v-57f16e4a"]]);
11153
11617
  const validator$1 = {
11154
11618
  instructions: 'Must be "ACUTE", "RIGHT", "OBTUSE", "STRAIGHT", or "REFLEX".',
11155
11619
  test: (value) => {
@@ -31459,7 +31923,7 @@ function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
31459
31923
  }, null, 8, ["modelValue"])
31460
31924
  ]);
31461
31925
  }
31462
- const CalculateSupplementaryAngles = /* @__PURE__ */ _export_sfc$1(_sfc_main$d, [["render", _sfc_render$d], ["__scopeId", "data-v-4f8ac466"]]);
31926
+ const CalculateSupplementaryAngles = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$d], ["__scopeId", "data-v-4f8ac466"]]);
31463
31927
  const validator = {
31464
31928
  instructions: "Must be 2 or 3.",
31465
31929
  test: (value) => {
@@ -31617,7 +32081,7 @@ function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
31617
32081
  }), 128))
31618
32082
  ]);
31619
32083
  }
31620
- const defaultView = /* @__PURE__ */ _export_sfc$1(_sfc_main$c, [["render", _sfc_render$c], ["__scopeId", "data-v-0452c3a5"]]);
32084
+ const defaultView = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["render", _sfc_render$c], ["__scopeId", "data-v-0452c3a5"]]);
31621
32085
  const fields$4 = [
31622
32086
  {
31623
32087
  name: "n",
@@ -37648,7 +38112,7 @@ function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
37648
38112
  ], 8, _hoisted_1$b))
37649
38113
  ]);
37650
38114
  }
37651
- const SyllableSeqVis = /* @__PURE__ */ _export_sfc$1(_sfc_main$b, [["render", _sfc_render$b], ["__scopeId", "data-v-2f79c080"]]);
38115
+ const SyllableSeqVis = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$b], ["__scopeId", "data-v-2f79c080"]]);
37652
38116
  const _sfc_main$a$1 = defineComponent({
37653
38117
  name: "NoteDisplay",
37654
38118
  props: {
@@ -37913,7 +38377,7 @@ function _sfc_render$a$1(_ctx, _cache, $props, $setup, $data, $options) {
37913
38377
  ])
37914
38378
  ]);
37915
38379
  }
37916
- const NoteDisplay = /* @__PURE__ */ _export_sfc$1(_sfc_main$a$1, [["render", _sfc_render$a$1]]);
38380
+ const NoteDisplay = /* @__PURE__ */ _export_sfc(_sfc_main$a$1, [["render", _sfc_render$a$1]]);
37917
38381
  const _sfc_main$9$1 = defineComponent({
37918
38382
  // this class name *may* be used as a lookup for dynamic component.
37919
38383
  // eslint-disable-next-line
@@ -38184,7 +38648,7 @@ function _sfc_render$9$1(_ctx, _cache, $props, $setup, $data, $options) {
38184
38648
  ]))) : createCommentVNode("", true)
38185
38649
  ])) : createCommentVNode("", true);
38186
38650
  }
38187
- const Playback = /* @__PURE__ */ _export_sfc$1(_sfc_main$9$1, [["render", _sfc_render$9$1]]);
38651
+ const Playback = /* @__PURE__ */ _export_sfc(_sfc_main$9$1, [["render", _sfc_render$9$1]]);
38188
38652
  const fields$3 = [
38189
38653
  {
38190
38654
  name: "Melody",
@@ -38575,7 +39039,7 @@ function _sfc_render$8$1(_ctx, _cache, $props, $setup, $data, $options) {
38575
39039
  ])) : createCommentVNode("", true)
38576
39040
  ]);
38577
39041
  }
38578
- const NotePlayback = /* @__PURE__ */ _export_sfc$1(_sfc_main$8$1, [["render", _sfc_render$8$1]]);
39042
+ const NotePlayback = /* @__PURE__ */ _export_sfc(_sfc_main$8$1, [["render", _sfc_render$8$1]]);
38579
39043
  const fields$2 = [
38580
39044
  {
38581
39045
  name: "Note",
@@ -38713,7 +39177,7 @@ function _sfc_render$7$1(_ctx, _cache, $props, $setup, $data, $options) {
38713
39177
  ], 64)) : createCommentVNode("", true)
38714
39178
  ]);
38715
39179
  }
38716
- const TextBox$1 = /* @__PURE__ */ _export_sfc$1(_sfc_main$7$1, [["render", _sfc_render$7$1]]);
39180
+ const TextBox$1 = /* @__PURE__ */ _export_sfc(_sfc_main$7$1, [["render", _sfc_render$7$1]]);
38717
39181
  var Chroma = /* @__PURE__ */ ((Chroma2) => {
38718
39182
  Chroma2["A"] = "A";
38719
39183
  Chroma2["B"] = "B";
@@ -61441,7 +61905,7 @@ const _hoisted_1$6 = { id: "abc" };
61441
61905
  function _sfc_render$6$1(_ctx, _cache, $props, $setup, $data, $options) {
61442
61906
  return openBlock(), createElementBlock("div", _hoisted_1$6);
61443
61907
  }
61444
- const MusicScoreRenderer = /* @__PURE__ */ _export_sfc$1(_sfc_main$6$1, [["render", _sfc_render$6$1]]);
61908
+ const MusicScoreRenderer = /* @__PURE__ */ _export_sfc(_sfc_main$6$1, [["render", _sfc_render$6$1]]);
61445
61909
  function fiveRandomKeys() {
61446
61910
  const randomKeys = [];
61447
61911
  for (let i2 = 0; i2 < 5; i2++) {
@@ -61511,7 +61975,7 @@ K:${_ctx.question.key}
61511
61975
  ], 64)) : createCommentVNode("", true)
61512
61976
  ]);
61513
61977
  }
61514
- const IdentifyKeyView = /* @__PURE__ */ _export_sfc$1(_sfc_main$5$1, [["render", _sfc_render$5$1]]);
61978
+ const IdentifyKeyView = /* @__PURE__ */ _export_sfc(_sfc_main$5$1, [["render", _sfc_render$5$1]]);
61515
61979
  const keys = [
61516
61980
  "C",
61517
61981
  "G",
@@ -61640,7 +62104,7 @@ function _sfc_render$4$1(_ctx, _cache, $props, $setup, $data, $options) {
61640
62104
  ], 64)) : createCommentVNode("", true)
61641
62105
  ]);
61642
62106
  }
61643
- const LetterQuestionView = /* @__PURE__ */ _export_sfc$1(_sfc_main$4$1, [["render", _sfc_render$4$1], ["__scopeId", "data-v-4ae4db54"]]);
62107
+ const LetterQuestionView = /* @__PURE__ */ _export_sfc(_sfc_main$4$1, [["render", _sfc_render$4$1], ["__scopeId", "data-v-4ae4db54"]]);
61644
62108
  const data$1 = function() {
61645
62109
  const ret = [];
61646
62110
  for (let i2 = 0; i2 < 26; i2++) {
@@ -61715,8 +62179,101 @@ __publicField(_TypeLetterQuestion, "views", [LetterQuestionView]);
61715
62179
  __publicField(_TypeLetterQuestion, "acceptsUserData", true);
61716
62180
  __publicField(_TypeLetterQuestion, "seedData", data$1());
61717
62181
  let TypeLetterQuestion = _TypeLetterQuestion;
62182
+ const data = function() {
62183
+ return [
62184
+ {
62185
+ gameLength: 30,
62186
+ // 30 seconds game
62187
+ initialSpeed: 2,
62188
+ // Initial fall speed
62189
+ acceleration: 0.1,
62190
+ // Speed increase per second
62191
+ spawnInterval: 1
62192
+ // New letter every second
62193
+ }
62194
+ ];
62195
+ };
62196
+ const _FallingLettersQuestion = class _FallingLettersQuestion2 extends Question {
62197
+ constructor(data2) {
62198
+ super(data2);
62199
+ __publicField(this, "gameLength");
62200
+ __publicField(this, "initialSpeed");
62201
+ __publicField(this, "acceleration");
62202
+ __publicField(this, "spawnInterval");
62203
+ this.gameLength = data2[0].gameLength;
62204
+ this.initialSpeed = data2[0].initialSpeed;
62205
+ this.acceleration = data2[0].acceleration;
62206
+ this.spawnInterval = data2[0].spawnInterval;
62207
+ }
62208
+ evaluate(a) {
62209
+ return {
62210
+ isCorrect: this.isCorrect(a),
62211
+ performance: this.displayedSkill(a)
62212
+ };
62213
+ }
62214
+ displayedSkill(a) {
62215
+ if (a.win) {
62216
+ return 1;
62217
+ } else {
62218
+ return a.percentage;
62219
+ }
62220
+ }
62221
+ dataShapes() {
62222
+ return _FallingLettersQuestion2.dataShapes;
62223
+ }
62224
+ views() {
62225
+ return _FallingLettersQuestion2.views;
62226
+ }
62227
+ isCorrect(a) {
62228
+ return a.win;
62229
+ }
62230
+ };
62231
+ __publicField(_FallingLettersQuestion, "dataShapes", [
62232
+ {
62233
+ name: DataShapeName.TYPING_fallingLetters,
62234
+ fields: [
62235
+ {
62236
+ name: "gameLength",
62237
+ type: FieldType.NUMBER
62238
+ },
62239
+ {
62240
+ name: "initialSpeed",
62241
+ type: FieldType.NUMBER
62242
+ },
62243
+ {
62244
+ name: "acceleration",
62245
+ type: FieldType.NUMBER
62246
+ },
62247
+ {
62248
+ name: "spawnInterval",
62249
+ type: FieldType.NUMBER,
62250
+ validator: {
62251
+ instructions: "How often should a new letter spawn? (in seconds)",
62252
+ test: (input) => {
62253
+ if (typeof input === "string") {
62254
+ const x = parseFloat(input);
62255
+ if (x > 0) {
62256
+ return { status: Status.ok, msg: "" };
62257
+ } else {
62258
+ return { status: Status.error, msg: "Must be greater than 0" };
62259
+ }
62260
+ } else {
62261
+ return { status: Status.error, msg: "Unexpected non-string input." };
62262
+ }
62263
+ },
62264
+ placeholder: "1"
62265
+ }
62266
+ }
62267
+ ]
62268
+ }
62269
+ ]);
62270
+ __publicField(_FallingLettersQuestion, "views", []);
62271
+ __publicField(_FallingLettersQuestion, "acceptsUserData", true);
62272
+ __publicField(_FallingLettersQuestion, "seedData", data());
62273
+ let FallingLettersQuestion = _FallingLettersQuestion;
61718
62274
  const _sfc_main$3$1 = defineComponent({
61719
62275
  name: "FallingLettersView",
62276
+ emits: ["emitResponse"],
61720
62277
  props: {
61721
62278
  data: {
61722
62279
  type: Array,
@@ -61955,99 +62512,8 @@ function _sfc_render$3$1(_ctx, _cache, $props, $setup, $data, $options) {
61955
62512
  _ctx.gameOver ? (openBlock(), createElementBlock("div", _hoisted_8$1$1, toDisplayString(_ctx.gameOverMessage), 1)) : createCommentVNode("", true)
61956
62513
  ]);
61957
62514
  }
61958
- const FallingLettersView = /* @__PURE__ */ _export_sfc$1(_sfc_main$3$1, [["render", _sfc_render$3$1], ["__scopeId", "data-v-3c9f2af5"]]);
61959
- const data = function() {
61960
- return [
61961
- {
61962
- gameLength: 30,
61963
- // 30 seconds game
61964
- initialSpeed: 2,
61965
- // Initial fall speed
61966
- acceleration: 0.1,
61967
- // Speed increase per second
61968
- spawnInterval: 1
61969
- // New letter every second
61970
- }
61971
- ];
61972
- };
61973
- const _FallingLettersQuestion = class _FallingLettersQuestion2 extends Question {
61974
- constructor(data2) {
61975
- super(data2);
61976
- __publicField(this, "gameLength");
61977
- __publicField(this, "initialSpeed");
61978
- __publicField(this, "acceleration");
61979
- __publicField(this, "spawnInterval");
61980
- this.gameLength = data2[0].gameLength;
61981
- this.initialSpeed = data2[0].initialSpeed;
61982
- this.acceleration = data2[0].acceleration;
61983
- this.spawnInterval = data2[0].spawnInterval;
61984
- }
61985
- evaluate(a) {
61986
- return {
61987
- isCorrect: this.isCorrect(a),
61988
- performance: this.displayedSkill(a)
61989
- };
61990
- }
61991
- displayedSkill(a) {
61992
- if (a.win) {
61993
- return 1;
61994
- } else {
61995
- return a.percentage;
61996
- }
61997
- }
61998
- dataShapes() {
61999
- return _FallingLettersQuestion2.dataShapes;
62000
- }
62001
- views() {
62002
- return _FallingLettersQuestion2.views;
62003
- }
62004
- isCorrect(a) {
62005
- return a.win;
62006
- }
62007
- };
62008
- __publicField(_FallingLettersQuestion, "dataShapes", [
62009
- {
62010
- name: DataShapeName.TYPING_fallingLetters,
62011
- fields: [
62012
- {
62013
- name: "gameLength",
62014
- type: FieldType.NUMBER
62015
- },
62016
- {
62017
- name: "initialSpeed",
62018
- type: FieldType.NUMBER
62019
- },
62020
- {
62021
- name: "acceleration",
62022
- type: FieldType.NUMBER
62023
- },
62024
- {
62025
- name: "spawnInterval",
62026
- type: FieldType.NUMBER,
62027
- validator: {
62028
- instructions: "How often should a new letter spawn? (in seconds)",
62029
- test: (input) => {
62030
- if (typeof input === "string") {
62031
- const x = parseFloat(input);
62032
- if (x > 0) {
62033
- return { status: Status.ok, msg: "" };
62034
- } else {
62035
- return { status: Status.error, msg: "Must be greater than 0" };
62036
- }
62037
- } else {
62038
- return { status: Status.error, msg: "Unexpected non-string input." };
62039
- }
62040
- },
62041
- placeholder: "1"
62042
- }
62043
- }
62044
- ]
62045
- }
62046
- ]);
62047
- __publicField(_FallingLettersQuestion, "views", [FallingLettersView]);
62048
- __publicField(_FallingLettersQuestion, "acceptsUserData", true);
62049
- __publicField(_FallingLettersQuestion, "seedData", data());
62050
- let FallingLettersQuestion = _FallingLettersQuestion;
62515
+ const FallingLettersView = /* @__PURE__ */ _export_sfc(_sfc_main$3$1, [["render", _sfc_render$3$1], ["__scopeId", "data-v-41b85e8b"]]);
62516
+ FallingLettersQuestion.views = [FallingLettersView];
62051
62517
  const typing = new CourseWare("typing", [TypeLetterQuestion, FallingLettersQuestion]);
62052
62518
  const _sfc_main$2$1 = defineComponent({
62053
62519
  name: "IdentifyVocab",
@@ -62119,7 +62585,7 @@ function _sfc_render$2$1(_ctx, _cache, $props, $setup, $data, $options) {
62119
62585
  ], 64)) : createCommentVNode("", true)
62120
62586
  ]);
62121
62587
  }
62122
- const TextBox = /* @__PURE__ */ _export_sfc$1(_sfc_main$2$1, [["render", _sfc_render$2$1]]);
62588
+ const TextBox = /* @__PURE__ */ _export_sfc(_sfc_main$2$1, [["render", _sfc_render$2$1]]);
62123
62589
  const fields = [
62124
62590
  {
62125
62591
  name: "Word",
@@ -62374,7 +62840,7 @@ function _sfc_render$1$1(_ctx, _cache, $props, $setup, $data, $options) {
62374
62840
  ], 512)
62375
62841
  ]);
62376
62842
  }
62377
- const PianoRangeVisualizer = /* @__PURE__ */ _export_sfc$1(_sfc_main$1$1, [["render", _sfc_render$1$1], ["__scopeId", "data-v-4b232a8b"]]);
62843
+ const PianoRangeVisualizer = /* @__PURE__ */ _export_sfc(_sfc_main$1$1, [["render", _sfc_render$1$1], ["__scopeId", "data-v-4b232a8b"]]);
62378
62844
  defineComponent({
62379
62845
  name: "MidiConfig",
62380
62846
  components: {
@@ -68699,13 +69165,6 @@ const _sfc_main$a = defineComponent({
68699
69165
  };
68700
69166
  }
68701
69167
  });
68702
- const _export_sfc = (sfc, props) => {
68703
- const target = sfc.__vccOpts || sfc;
68704
- for (const [key, val] of props) {
68705
- target[key] = val;
68706
- }
68707
- return target;
68708
- };
68709
69168
  function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
68710
69169
  const _component_v_text_field = resolveComponent("v-text-field");
68711
69170
  return openBlock(), createBlock(_component_v_text_field, {
@@ -68721,7 +69180,7 @@ function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
68721
69180
  autofocus: _ctx.autofocus
68722
69181
  }, null, 8, ["modelValue", "name", "label", "rules", "hint", "autofocus"]);
68723
69182
  }
68724
- const IntegerInput = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["render", _sfc_render$a]]);
69183
+ const IntegerInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$a, [["render", _sfc_render$a]]);
68725
69184
  const _sfc_main$9 = defineComponent({
68726
69185
  name: "MarkdownInput",
68727
69186
  extends: FieldInput,
@@ -68746,7 +69205,7 @@ function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) {
68746
69205
  autofocus: _ctx.autofocus
68747
69206
  }, null, 8, ["modelValue", "name", "label", "rules", "hint", "autofocus"]);
68748
69207
  }
68749
- const MarkdownInput = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["render", _sfc_render$9], ["__scopeId", "data-v-28ef24ff"]]);
69208
+ const MarkdownInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$9, [["render", _sfc_render$9], ["__scopeId", "data-v-28ef24ff"]]);
68750
69209
  const _sfc_main$8 = defineComponent({
68751
69210
  name: "MediaDragDropUploader",
68752
69211
  extends: FieldInput,
@@ -68942,7 +69401,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
68942
69401
  ], 34)
68943
69402
  ]);
68944
69403
  }
68945
- const MediaDragDropUploader = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$8], ["__scopeId", "data-v-e86645b6"]]);
69404
+ const MediaDragDropUploader = /* @__PURE__ */ _export_sfc$1(_sfc_main$8, [["render", _sfc_render$8], ["__scopeId", "data-v-e86645b6"]]);
68946
69405
  const _sfc_main$7 = defineComponent({
68947
69406
  name: "MidiInput",
68948
69407
  components: {
@@ -69074,7 +69533,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
69074
69533
  }, null, 8, ["modelValue", "onClickCapture"])
69075
69534
  ]);
69076
69535
  }
69077
- const MidiInput = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render$7]]);
69536
+ const MidiInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$7, [["render", _sfc_render$7]]);
69078
69537
  const _sfc_main$6 = defineComponent({
69079
69538
  name: "NumberInput",
69080
69539
  extends: FieldInput,
@@ -69112,7 +69571,7 @@ function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {
69112
69571
  autofocus: _ctx.autofocus
69113
69572
  }, null, 8, ["modelValue", "name", "label", "rules", "hint", "autofocus"]);
69114
69573
  }
69115
- const NumberInput = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$6]]);
69574
+ const NumberInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$6, [["render", _sfc_render$6]]);
69116
69575
  const _sfc_main$5 = defineComponent({
69117
69576
  name: "StringInput",
69118
69577
  extends: FieldInput,
@@ -69150,7 +69609,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
69150
69609
  autofocus: _ctx.autofocus
69151
69610
  }, null, 8, ["modelValue", "name", "label", "rules", "hint", "autofocus"]);
69152
69611
  }
69153
- const StringInput = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$5]]);
69612
+ const StringInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$5, [["render", _sfc_render$5]]);
69154
69613
  const _sfc_main$4 = defineComponent({
69155
69614
  name: "ChessPuzzleInput",
69156
69615
  extends: FieldInput,
@@ -69211,7 +69670,7 @@ function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
69211
69670
  autofocus: _ctx.autofocus
69212
69671
  }, null, 8, ["modelValue", "name", "label", "rules", "autofocus"]);
69213
69672
  }
69214
- const ChessPuzzleInput = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$4]]);
69673
+ const ChessPuzzleInput = /* @__PURE__ */ _export_sfc$1(_sfc_main$4, [["render", _sfc_render$4]]);
69215
69674
  const useDataInputFormStore = defineStore("dataInputForm", {
69216
69675
  state: () => ({
69217
69676
  dataInputForm: {
@@ -69721,7 +70180,7 @@ function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
69721
70180
  _: 1
69722
70181
  });
69723
70182
  }
69724
- const DataInputForm = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$3]]);
70183
+ const DataInputForm = /* @__PURE__ */ _export_sfc$1(_sfc_main$3, [["render", _sfc_render$3]]);
69725
70184
  const _sfc_main$2 = defineComponent({
69726
70185
  name: "CardPreviewList",
69727
70186
  components: {
@@ -70128,7 +70587,7 @@ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
70128
70587
  })) : createCommentVNode("", true)
70129
70588
  ]);
70130
70589
  }
70131
- const CardPreviewList = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2], ["__scopeId", "data-v-41613480"]]);
70590
+ const CardPreviewList = /* @__PURE__ */ _export_sfc$1(_sfc_main$2, [["render", _sfc_render$2], ["__scopeId", "data-v-41613480"]]);
70132
70591
  const _sfc_main$1 = defineComponent({
70133
70592
  name: "BulkImportView",
70134
70593
  components: {
@@ -70840,13 +71299,13 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
70840
71299
  _: 1
70841
71300
  });
70842
71301
  }
70843
- const BulkImportView = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__scopeId", "data-v-901d842b"]]);
71302
+ const BulkImportView = /* @__PURE__ */ _export_sfc$1(_sfc_main$1, [["render", _sfc_render$1], ["__scopeId", "data-v-901d842b"]]);
70844
71303
  const _sfc_main = defineComponent({
70845
71304
  name: "CourseEditor",
70846
71305
  components: {
70847
71306
  DataInputForm,
70848
71307
  // ComponentRegistration,
70849
- // NavigationStrategyEditor,
71308
+ NavigationStrategyEditor,
70850
71309
  BulkImportView
70851
71310
  },
70852
71311
  props: {
@@ -70969,7 +71428,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
70969
71428
  ])),
70970
71429
  _: 1
70971
71430
  }),
70972
- createVNode(_component_v_tab, { value: "registration" }, {
71431
+ createVNode(_component_v_tab, { value: "navigation" }, {
70973
71432
  default: withCtx(() => _cache[7] || (_cache[7] = [
70974
71433
  createTextVNode("Navigation")
70975
71434
  ])),
@@ -71057,7 +71516,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
71057
71516
  ]))
71058
71517
  ])) : createCommentVNode("", true);
71059
71518
  }
71060
- const CourseEditor = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e1502803"]]);
71519
+ const CourseEditor = /* @__PURE__ */ _export_sfc$1(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-772fe5be"]]);
71061
71520
  export {
71062
71521
  BulkImportView,
71063
71522
  ChessPuzzleInput,