@vue-skuilder/courseware 0.1.33 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/CourseWare-BTFRjgBR.js +305 -0
  2. package/dist/CourseWare-BTFRjgBR.js.map +1 -0
  3. package/dist/CourseWare-DSeyTAtH.cjs +2 -0
  4. package/dist/CourseWare-DSeyTAtH.cjs.map +1 -0
  5. package/dist/assets/CourseWare.css +1 -0
  6. package/dist/assets/chess.css +1 -0
  7. package/dist/assets/index.css +1 -1
  8. package/dist/assets/math.css +1 -0
  9. package/dist/assets/piano.css +1 -0
  10. package/dist/assets/sightsing.css +1 -0
  11. package/dist/assets/typing.css +1 -0
  12. package/dist/backend.cjs.js +1 -1
  13. package/dist/backend.cjs.js.map +1 -1
  14. package/dist/backend.mjs +4 -3
  15. package/dist/backend.mjs.map +1 -1
  16. package/dist/chess/components/ChessBoard.vue.d.ts.map +1 -1
  17. package/dist/chess/composables/useChessgroundBounds.d.ts +24 -0
  18. package/dist/chess/composables/useChessgroundBounds.d.ts.map +1 -0
  19. package/dist/chess/questions/puzzle/puzzle.vue.d.ts.map +1 -1
  20. package/dist/chess-BbHATAzk.js +2949 -0
  21. package/dist/chess-BbHATAzk.js.map +1 -0
  22. package/dist/chess-BsgVZARV.cjs +7 -0
  23. package/dist/chess-BsgVZARV.cjs.map +1 -0
  24. package/dist/chess-C_2RQEuq.cjs +1 -0
  25. package/dist/chess-X1bmWmh3.js +3 -0
  26. package/dist/french-Bxet7hJm.cjs +2 -0
  27. package/dist/french-Bxet7hJm.cjs.map +1 -0
  28. package/dist/french-Dk7YG8Td.js +140 -0
  29. package/dist/french-Dk7YG8Td.js.map +1 -0
  30. package/dist/french-evUMlbbq.js +3 -0
  31. package/dist/french-x9P8RRn8.cjs +1 -0
  32. package/dist/index.cjs.js +2 -170
  33. package/dist/index.cjs.js.map +1 -1
  34. package/dist/index.d.ts +23 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.mjs +172 -62021
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/math-B1oDAkOy.cjs +34 -0
  39. package/dist/math-B1oDAkOy.cjs.map +1 -0
  40. package/dist/math-B4HbgYf6.js +13391 -0
  41. package/dist/math-B4HbgYf6.js.map +1 -0
  42. package/dist/math-BWlIa6-l.cjs +1 -0
  43. package/dist/math-DYni7rRl.js +3 -0
  44. package/dist/piano-BN5Btq91.js +3 -0
  45. package/dist/piano-Btvkzjfz.cjs +1 -0
  46. package/dist/piano-CefQUc72.cjs +2 -0
  47. package/dist/piano-CefQUc72.cjs.map +1 -0
  48. package/dist/piano-DF1g6yaX.js +3603 -0
  49. package/dist/piano-DF1g6yaX.js.map +1 -0
  50. package/dist/pitch-C-lh9ezH.cjs +2 -0
  51. package/dist/pitch-C-lh9ezH.cjs.map +1 -0
  52. package/dist/pitch-CgGJFkZ1.js +106 -0
  53. package/dist/pitch-CgGJFkZ1.js.map +1 -0
  54. package/dist/pitch-Dn0iNqiS.js +3 -0
  55. package/dist/pitch-DsopN5IR.cjs +1 -0
  56. package/dist/{shapes-nszfsx3o.js → shapes-BQUVJdp5.js} +3 -21
  57. package/dist/shapes-BQUVJdp5.js.map +1 -0
  58. package/dist/shapes-C_-mvrCc.cjs +2 -0
  59. package/dist/shapes-C_-mvrCc.cjs.map +1 -0
  60. package/dist/shapes-DRq8J94A.cjs +2 -0
  61. package/dist/shapes-DRq8J94A.cjs.map +1 -0
  62. package/dist/shapes-ICeg46lr.js +25 -0
  63. package/dist/shapes-ICeg46lr.js.map +1 -0
  64. package/dist/sightsing-BFQ7HRig.js +41061 -0
  65. package/dist/sightsing-BFQ7HRig.js.map +1 -0
  66. package/dist/sightsing-CJX3k0Fd.js +3 -0
  67. package/dist/sightsing-Cr_SJ5Vc.cjs +133 -0
  68. package/dist/sightsing-Cr_SJ5Vc.cjs.map +1 -0
  69. package/dist/sightsing-CtagQ0FJ.cjs +1 -0
  70. package/dist/typing-BevtfWlp.js +184 -0
  71. package/dist/typing-BevtfWlp.js.map +1 -0
  72. package/dist/typing-CBPjtwrg.cjs +1 -0
  73. package/dist/typing-CK-glKhm.cjs +2 -0
  74. package/dist/typing-CK-glKhm.cjs.map +1 -0
  75. package/dist/typing-k-ojjO7G.js +3 -0
  76. package/dist/word-work-BOnRlZgd.js +108 -0
  77. package/dist/word-work-BOnRlZgd.js.map +1 -0
  78. package/dist/word-work-C5MTSapy.cjs +1 -0
  79. package/dist/word-work-Dd6tIKrt.js +3 -0
  80. package/dist/word-work-fNbCLNuN.cjs +2 -0
  81. package/dist/word-work-fNbCLNuN.cjs.map +1 -0
  82. package/package.json +6 -5
  83. package/dist/shapes-DJ-ujuDr.cjs +0 -2
  84. package/dist/shapes-DJ-ujuDr.cjs.map +0 -1
  85. package/dist/shapes-nszfsx3o.js.map +0 -1
@@ -0,0 +1 @@
1
+ require(`./CourseWare-DSeyTAtH.cjs`);const e=require(`./sightsing-Cr_SJ5Vc.cjs`);exports.default=e.t;
@@ -0,0 +1,184 @@
1
+ import { r as e } from "./shapes-BQUVJdp5.js";
2
+ import { r as t, t as n } from "./CourseWare-BTFRjgBR.js";
3
+ import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, defineComponent as c, onMounted as l, onUnmounted as u, openBlock as d, ref as f, toDisplayString as p } from "vue";
4
+ import { Question as m, useQuestionView as h, useViewable as g } from "@vue-skuilder/common-ui";
5
+ import { DataShapeName as _, FieldType as v, Status as y } from "@vue-skuilder/common";
6
+ //#region src/typing/questions/single-letter/typeSingleLetter.vue?vue&type=script&lang.ts
7
+ var b = c({
8
+ name: "LetterQuestionView",
9
+ props: {
10
+ data: {
11
+ type: Array,
12
+ required: !0
13
+ },
14
+ modifyDifficulty: {
15
+ type: Number,
16
+ required: !1,
17
+ default: 0
18
+ }
19
+ },
20
+ setup(e, { emit: t }) {
21
+ let n = g(e, t, "LetterQuestionView"), r = h(n), a = f(null);
22
+ r.question.value = new w(e.data);
23
+ let o = i(() => r.question.value), handleKeyPress = (e) => {
24
+ if (!o.value) return;
25
+ let t = e.key.toLowerCase(), n = o.value.letter.toLowerCase();
26
+ if (t === n) {
27
+ a.value?.classList.add("pressed");
28
+ let handleKeyUp = (e) => {
29
+ e.key.toLowerCase() === n && (a.value?.classList.remove("pressed"), r.submitAnswer(t), window.removeEventListener("keyup", handleKeyUp));
30
+ };
31
+ window.addEventListener("keyup", handleKeyUp);
32
+ } else r.submitAnswer(t);
33
+ };
34
+ return l(() => {
35
+ window.addEventListener("keypress", handleKeyPress);
36
+ }), u(() => {
37
+ window.removeEventListener("keypress", handleKeyPress);
38
+ }), {
39
+ ...r,
40
+ ...n,
41
+ letterDisplay: a,
42
+ question: o
43
+ };
44
+ }
45
+ }), x = { "data-viewable": "LetterQuestionView" };
46
+ function _sfc_render(e, t, n, i, c, l) {
47
+ return d(), o("div", x, [e.question ? (d(), o(r, { key: 0 }, [t[0] ||= s("p", { class: "text-h5" }, "Type this letter!", -1), s("div", {
48
+ ref: "letterDisplay",
49
+ class: "letter-display"
50
+ }, p(e.question.letter), 513)], 64)) : a("", !0)]);
51
+ }
52
+ var S = /* @__PURE__ */ t(b, [["render", _sfc_render], ["__scopeId", "data-v-4ae4db54"]]), C = /* @__PURE__ */ e(function() {
53
+ let e = [];
54
+ for (let t = 0; t < 26; t++) e.push({ letter: String.fromCharCode(65 + t) });
55
+ return e;
56
+ }, "data"), w = class TypeLetterQuestion extends m {
57
+ static dataShapes = [{
58
+ name: _.TYPING_singleLetter,
59
+ fields: [{
60
+ name: "letter",
61
+ type: v.STRING,
62
+ validator: {
63
+ instructions: "Enter a single letter",
64
+ test: function(e) {
65
+ return !e || e.length !== 1 || !/[a-zA-Z]/.test(e) ? {
66
+ status: y.error,
67
+ msg: "Input must be a single letter"
68
+ } : {
69
+ status: y.ok,
70
+ msg: ""
71
+ };
72
+ }
73
+ }
74
+ }]
75
+ }];
76
+ static views = [S];
77
+ static acceptsUserData = !0;
78
+ letter;
79
+ static seedData = C();
80
+ constructor(e) {
81
+ super(e), this.letter = e[0].letter;
82
+ }
83
+ evaluate(e, t) {
84
+ return {
85
+ isCorrect: this.isCorrect(e),
86
+ performance: this.displayedSkill(e, t)
87
+ };
88
+ }
89
+ displayedSkill(e, t) {
90
+ if (this.isCorrect(e)) {
91
+ if (t < 3e3) return 1;
92
+ {
93
+ let e = 1 - (t - 3e3) / 7e3 * .75;
94
+ return Math.max(.25, e);
95
+ }
96
+ }
97
+ return 0;
98
+ }
99
+ dataShapes() {
100
+ return TypeLetterQuestion.dataShapes;
101
+ }
102
+ views() {
103
+ return TypeLetterQuestion.views;
104
+ }
105
+ isCorrect(e) {
106
+ let t = e.toLowerCase() === this.letter.toLowerCase();
107
+ return console.log(`singleLetter Q isCorrect: ${t}`), t;
108
+ }
109
+ }, data = function() {
110
+ return [{
111
+ gameLength: 30,
112
+ initialSpeed: 2,
113
+ acceleration: .1,
114
+ spawnInterval: 1
115
+ }];
116
+ }, T = new n("typing", [w, class FallingLettersQuestion extends m {
117
+ static dataShapes = [{
118
+ name: _.TYPING_fallingLetters,
119
+ fields: [
120
+ {
121
+ name: "gameLength",
122
+ type: v.NUMBER
123
+ },
124
+ {
125
+ name: "initialSpeed",
126
+ type: v.NUMBER
127
+ },
128
+ {
129
+ name: "acceleration",
130
+ type: v.NUMBER
131
+ },
132
+ {
133
+ name: "spawnInterval",
134
+ type: v.NUMBER,
135
+ validator: {
136
+ instructions: "How often should a new letter spawn? (in seconds)",
137
+ test: (e) => typeof e == "string" ? parseFloat(e) > 0 ? {
138
+ status: y.ok,
139
+ msg: ""
140
+ } : {
141
+ status: y.error,
142
+ msg: "Must be greater than 0"
143
+ } : {
144
+ status: y.error,
145
+ msg: "Unexpected non-string input."
146
+ },
147
+ placeholder: "1"
148
+ }
149
+ }
150
+ ]
151
+ }];
152
+ static views = [];
153
+ static acceptsUserData = !0;
154
+ static seedData = data();
155
+ gameLength;
156
+ initialSpeed;
157
+ acceleration;
158
+ spawnInterval;
159
+ constructor(e) {
160
+ super(e), this.gameLength = e[0].gameLength, this.initialSpeed = e[0].initialSpeed, this.acceleration = e[0].acceleration, this.spawnInterval = e[0].spawnInterval;
161
+ }
162
+ evaluate(e) {
163
+ return {
164
+ isCorrect: this.isCorrect(e),
165
+ performance: this.displayedSkill(e)
166
+ };
167
+ }
168
+ displayedSkill(e) {
169
+ return e.win ? 1 : e.percentage;
170
+ }
171
+ dataShapes() {
172
+ return FallingLettersQuestion.dataShapes;
173
+ }
174
+ views() {
175
+ return FallingLettersQuestion.views;
176
+ }
177
+ isCorrect(e) {
178
+ return e.win;
179
+ }
180
+ }]);
181
+ //#endregion
182
+ export { T as t };
183
+
184
+ //# sourceMappingURL=typing-BevtfWlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-BevtfWlp.js","names":[],"sources":["../src/typing/questions/single-letter/typeSingleLetter.vue","../src/typing/questions/single-letter/typeSingleLetter.vue","../src/typing/questions/single-letter/index.ts","../src/typing/questions/falling-letters/FallingLettersQuestion.ts","../src/typing/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"LetterQuestionView\">\n <template v-if=\"question\">\n <p class=\"text-h5\">Type this letter!</p>\n <div ref=\"letterDisplay\" class=\"letter-display\">{{ question.letter }}</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, onUnmounted, PropType } from 'vue';\nimport { TypeLetterQuestion } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'LetterQuestionView',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'LetterQuestionView');\n const questionUtils = useQuestionView<TypeLetterQuestion>(viewableUtils);\n const letterDisplay = ref<HTMLElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new TypeLetterQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const handleKeyPress = (event: KeyboardEvent) => {\n if (!question.value) return;\n\n const pressedKey = event.key.toLowerCase();\n const targetKey = question.value.letter.toLowerCase();\n\n if (pressedKey === targetKey) {\n letterDisplay.value?.classList.add('pressed');\n\n // Remove pressed class and submit answer after key release\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === targetKey) {\n letterDisplay.value?.classList.remove('pressed');\n questionUtils.submitAnswer(pressedKey);\n window.removeEventListener('keyup', handleKeyUp);\n }\n };\n\n window.addEventListener('keyup', handleKeyUp);\n } else {\n questionUtils.submitAnswer(pressedKey);\n }\n };\n\n onMounted(() => {\n window.addEventListener('keypress', handleKeyPress);\n });\n\n onUnmounted(() => {\n window.removeEventListener('keypress', handleKeyPress);\n });\n\n return {\n ...questionUtils,\n ...viewableUtils,\n letterDisplay,\n question,\n };\n },\n});\n</script>\n\n<style scoped>\n.letter-display {\n font-size: 48px;\n font-weight: bold;\n font-family: monospace;\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #f8f9fa;\n border: 2px solid #dee2e6;\n border-radius: 8px;\n box-shadow: 0 2px 0 #dee2e6, 0 3px 3px rgba(0, 0, 0, 0.2);\n margin: 20px auto;\n color: #333;\n text-transform: uppercase;\n}\n\n.letter-display.pressed {\n box-shadow: 0 0 0 #dee2e6, 0 1px 2px rgba(0, 0, 0, 0.2);\n transform: translateY(2px);\n}\n</style>\n","<template>\n <div data-viewable=\"LetterQuestionView\">\n <template v-if=\"question\">\n <p class=\"text-h5\">Type this letter!</p>\n <div ref=\"letterDisplay\" class=\"letter-display\">{{ question.letter }}</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, onUnmounted, PropType } from 'vue';\nimport { TypeLetterQuestion } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'LetterQuestionView',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'LetterQuestionView');\n const questionUtils = useQuestionView<TypeLetterQuestion>(viewableUtils);\n const letterDisplay = ref<HTMLElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new TypeLetterQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const handleKeyPress = (event: KeyboardEvent) => {\n if (!question.value) return;\n\n const pressedKey = event.key.toLowerCase();\n const targetKey = question.value.letter.toLowerCase();\n\n if (pressedKey === targetKey) {\n letterDisplay.value?.classList.add('pressed');\n\n // Remove pressed class and submit answer after key release\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === targetKey) {\n letterDisplay.value?.classList.remove('pressed');\n questionUtils.submitAnswer(pressedKey);\n window.removeEventListener('keyup', handleKeyUp);\n }\n };\n\n window.addEventListener('keyup', handleKeyUp);\n } else {\n questionUtils.submitAnswer(pressedKey);\n }\n };\n\n onMounted(() => {\n window.addEventListener('keypress', handleKeyPress);\n });\n\n onUnmounted(() => {\n window.removeEventListener('keypress', handleKeyPress);\n });\n\n return {\n ...questionUtils,\n ...viewableUtils,\n letterDisplay,\n question,\n };\n },\n});\n</script>\n\n<style scoped>\n.letter-display {\n font-size: 48px;\n font-weight: bold;\n font-family: monospace;\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #f8f9fa;\n border: 2px solid #dee2e6;\n border-radius: 8px;\n box-shadow: 0 2px 0 #dee2e6, 0 3px 3px rgba(0, 0, 0, 0.2);\n margin: 20px auto;\n color: #333;\n text-transform: uppercase;\n}\n\n.letter-display.pressed {\n box-shadow: 0 0 0 #dee2e6, 0 1px 2px rgba(0, 0, 0, 0.2);\n transform: translateY(2px);\n}\n</style>\n","// index.ts\nimport { Question } from '@vue-skuilder/common-ui';\nimport {\n Answer,\n DataShape,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport LetterQuestionView from './typeSingleLetter.vue';\n\nconst data = function () {\n const ret: { letter: string }[] = [];\n for (let i = 0; i < 26; i++) {\n ret.push({\n letter: String.fromCharCode(65 + i),\n });\n }\n return ret;\n};\n\nexport class TypeLetterQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n name: DataShapeName.TYPING_singleLetter,\n fields: [\n {\n name: 'letter',\n type: FieldType.STRING,\n validator: {\n instructions: 'Enter a single letter',\n test: function (s: string) {\n if (!s || s.length !== 1 || !/[a-zA-Z]/.test(s)) {\n return {\n status: Status.error,\n msg: 'Input must be a single letter',\n };\n }\n return {\n status: Status.ok,\n msg: '',\n };\n },\n },\n },\n ],\n },\n ];\n\n public static views = [LetterQuestionView];\n public static acceptsUserData: boolean = true;\n\n public letter: string;\n public static seedData = data();\n\n constructor(data: ViewData[]) {\n super(data);\n this.letter = data[0].letter as string;\n }\n\n evaluate(a: Answer, t: number) {\n return {\n isCorrect: this.isCorrect(a),\n performance: this.displayedSkill(a, t),\n };\n }\n\n displayedSkill(a: Answer, t: number) {\n if (this.isCorrect(a)) {\n if (t < 3000) {\n return 1.0;\n } else {\n // scale from 1 at 3s to 0.25 at 10s, clamped to [0.25, 1]\n const skill = 1 - ((t - 3000) / 7000) * 0.75;\n return Math.max(0.25, skill);\n }\n }\n return 0;\n }\n\n dataShapes() {\n return TypeLetterQuestion.dataShapes;\n }\n\n views() {\n return TypeLetterQuestion.views;\n }\n\n isCorrect(a: Answer) {\n const isCorrect = (a as string).toLowerCase() === this.letter.toLowerCase();\n console.log(`singleLetter Q isCorrect: ${isCorrect}`);\n return isCorrect;\n }\n}\n","// Extracted from index.ts to break circular dependency\nimport { Question } from '@vue-skuilder/common-ui';\nimport {\n Answer,\n DataShape,\n DataShapeName,\n FieldType,\n Status,\n ViewData,\n} from '@vue-skuilder/common';\n\nconst data = function () {\n return [\n {\n gameLength: 30, // 30 seconds game\n initialSpeed: 2, // Initial fall speed\n acceleration: 0.1, // Speed increase per second\n spawnInterval: 1, // New letter every second\n },\n ];\n};\n\nexport interface Score extends Answer {\n win: boolean;\n lettersTyped: number;\n // the percentage of the gameLength that the user was able to complete\n // (0-1)\n percentage: number;\n}\n\nexport class FallingLettersQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n name: DataShapeName.TYPING_fallingLetters,\n fields: [\n {\n name: 'gameLength',\n type: FieldType.NUMBER,\n },\n {\n name: 'initialSpeed',\n type: FieldType.NUMBER,\n },\n {\n name: 'acceleration',\n type: FieldType.NUMBER,\n },\n {\n name: 'spawnInterval',\n type: FieldType.NUMBER,\n validator: {\n instructions: 'How often should a new letter spawn? (in seconds)',\n test: (input: unknown) => {\n if (typeof input === 'string') {\n const x = parseFloat(input);\n if (x > 0) {\n return { status: Status.ok, msg: '' };\n } else {\n return { status: Status.error, msg: 'Must be greater than 0' };\n }\n } else {\n return { status: Status.error, msg: 'Unexpected non-string input.' };\n }\n },\n placeholder: '1',\n },\n },\n ],\n },\n ];\n\n // Note: views will be set in index.ts to avoid circular dependency\n public static views: any[] = [];\n public static acceptsUserData: boolean = true;\n public static seedData = data();\n\n public gameLength: number;\n public initialSpeed: number;\n public acceleration: number;\n public spawnInterval: number;\n\n constructor(data: ViewData[]) {\n super(data);\n this.gameLength = data[0].gameLength as number;\n this.initialSpeed = data[0].initialSpeed as number;\n this.acceleration = data[0].acceleration as number;\n this.spawnInterval = data[0].spawnInterval as number;\n }\n\n evaluate(a: Answer) {\n return {\n isCorrect: this.isCorrect(a as Score),\n performance: this.displayedSkill(a as Score),\n };\n }\n\n displayedSkill(a: Answer) {\n if ((a as Score).win) {\n return 1;\n } else {\n return (a as Score).percentage;\n }\n }\n\n dataShapes() {\n return FallingLettersQuestion.dataShapes;\n }\n\n views() {\n return FallingLettersQuestion.views;\n }\n\n isCorrect(a: Score) {\n return a.win;\n }\n}","// vue/src/courses/typing/index.ts\nimport { CourseWare } from '../CourseWare';\nimport { TypeLetterQuestion } from './questions/single-letter';\nimport { FallingLettersQuestion } from './questions/falling-letters';\n\nconst typing: CourseWare = new CourseWare('typing', [TypeLetterQuestion, FallingLettersQuestion]);\n\nexport default typing;\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ require(`./CourseWare-DSeyTAtH.cjs`);const e=require(`./typing-CK-glKhm.cjs`);exports.default=e.t;
@@ -0,0 +1,2 @@
1
+ const e=require(`./shapes-C_-mvrCc.cjs`),t=require(`./CourseWare-DSeyTAtH.cjs`);let n=require(`vue`),r=require(`@vue-skuilder/common-ui`),i=require(`@vue-skuilder/common`);var a=(0,n.defineComponent)({name:`LetterQuestionView`,props:{data:{type:Array,required:!0},modifyDifficulty:{type:Number,required:!1,default:0}},setup(e,{emit:t}){let i=(0,r.useViewable)(e,t,`LetterQuestionView`),a=(0,r.useQuestionView)(i),o=(0,n.ref)(null);a.question.value=new l(e.data);let s=(0,n.computed)(()=>a.question.value),handleKeyPress=e=>{if(!s.value)return;let t=e.key.toLowerCase(),n=s.value.letter.toLowerCase();if(t===n){o.value?.classList.add(`pressed`);let handleKeyUp=e=>{e.key.toLowerCase()===n&&(o.value?.classList.remove(`pressed`),a.submitAnswer(t),window.removeEventListener(`keyup`,handleKeyUp))};window.addEventListener(`keyup`,handleKeyUp)}else a.submitAnswer(t)};return(0,n.onMounted)(()=>{window.addEventListener(`keypress`,handleKeyPress)}),(0,n.onUnmounted)(()=>{window.removeEventListener(`keypress`,handleKeyPress)}),{...a,...i,letterDisplay:o,question:s}}}),o={"data-viewable":`LetterQuestionView`};function _sfc_render(e,t,r,i,a,s){return(0,n.openBlock)(),(0,n.createElementBlock)(`div`,o,[e.question?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:0},[t[0]||=(0,n.createElementVNode)(`p`,{class:`text-h5`},`Type this letter!`,-1),(0,n.createElementVNode)(`div`,{ref:`letterDisplay`,class:`letter-display`},(0,n.toDisplayString)(e.question.letter),513)],64)):(0,n.createCommentVNode)(``,!0)])}var s=t.r(a,[[`render`,_sfc_render],[`__scopeId`,`data-v-4ae4db54`]]),c=e.r(function(){let e=[];for(let t=0;t<26;t++)e.push({letter:String.fromCharCode(65+t)});return e},`data`),l=class TypeLetterQuestion extends r.Question{static dataShapes=[{name:i.DataShapeName.TYPING_singleLetter,fields:[{name:`letter`,type:i.FieldType.STRING,validator:{instructions:`Enter a single letter`,test:function(e){return!e||e.length!==1||!/[a-zA-Z]/.test(e)?{status:i.Status.error,msg:`Input must be a single letter`}:{status:i.Status.ok,msg:``}}}}]}];static views=[s];static acceptsUserData=!0;letter;static seedData=c();constructor(e){super(e),this.letter=e[0].letter}evaluate(e,t){return{isCorrect:this.isCorrect(e),performance:this.displayedSkill(e,t)}}displayedSkill(e,t){if(this.isCorrect(e)){if(t<3e3)return 1;{let e=1-(t-3e3)/7e3*.75;return Math.max(.25,e)}}return 0}dataShapes(){return TypeLetterQuestion.dataShapes}views(){return TypeLetterQuestion.views}isCorrect(e){let t=e.toLowerCase()===this.letter.toLowerCase();return console.log(`singleLetter Q isCorrect: ${t}`),t}},data=function(){return[{gameLength:30,initialSpeed:2,acceleration:.1,spawnInterval:1}]},u=class FallingLettersQuestion extends r.Question{static dataShapes=[{name:i.DataShapeName.TYPING_fallingLetters,fields:[{name:`gameLength`,type:i.FieldType.NUMBER},{name:`initialSpeed`,type:i.FieldType.NUMBER},{name:`acceleration`,type:i.FieldType.NUMBER},{name:`spawnInterval`,type:i.FieldType.NUMBER,validator:{instructions:`How often should a new letter spawn? (in seconds)`,test:e=>typeof e==`string`?parseFloat(e)>0?{status:i.Status.ok,msg:``}:{status:i.Status.error,msg:`Must be greater than 0`}:{status:i.Status.error,msg:`Unexpected non-string input.`},placeholder:`1`}}]}];static views=[];static acceptsUserData=!0;static seedData=data();gameLength;initialSpeed;acceleration;spawnInterval;constructor(e){super(e),this.gameLength=e[0].gameLength,this.initialSpeed=e[0].initialSpeed,this.acceleration=e[0].acceleration,this.spawnInterval=e[0].spawnInterval}evaluate(e){return{isCorrect:this.isCorrect(e),performance:this.displayedSkill(e)}}displayedSkill(e){return e.win?1:e.percentage}dataShapes(){return FallingLettersQuestion.dataShapes}views(){return FallingLettersQuestion.views}isCorrect(e){return e.win}},d=new t.t(`typing`,[l,u]);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
2
+ //# sourceMappingURL=typing-CK-glKhm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-CK-glKhm.cjs","names":[],"sources":["../src/typing/questions/single-letter/typeSingleLetter.vue","../src/typing/questions/single-letter/typeSingleLetter.vue","../src/typing/questions/single-letter/index.ts","../src/typing/questions/falling-letters/FallingLettersQuestion.ts","../src/typing/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"LetterQuestionView\">\n <template v-if=\"question\">\n <p class=\"text-h5\">Type this letter!</p>\n <div ref=\"letterDisplay\" class=\"letter-display\">{{ question.letter }}</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, onUnmounted, PropType } from 'vue';\nimport { TypeLetterQuestion } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'LetterQuestionView',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'LetterQuestionView');\n const questionUtils = useQuestionView<TypeLetterQuestion>(viewableUtils);\n const letterDisplay = ref<HTMLElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new TypeLetterQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const handleKeyPress = (event: KeyboardEvent) => {\n if (!question.value) return;\n\n const pressedKey = event.key.toLowerCase();\n const targetKey = question.value.letter.toLowerCase();\n\n if (pressedKey === targetKey) {\n letterDisplay.value?.classList.add('pressed');\n\n // Remove pressed class and submit answer after key release\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === targetKey) {\n letterDisplay.value?.classList.remove('pressed');\n questionUtils.submitAnswer(pressedKey);\n window.removeEventListener('keyup', handleKeyUp);\n }\n };\n\n window.addEventListener('keyup', handleKeyUp);\n } else {\n questionUtils.submitAnswer(pressedKey);\n }\n };\n\n onMounted(() => {\n window.addEventListener('keypress', handleKeyPress);\n });\n\n onUnmounted(() => {\n window.removeEventListener('keypress', handleKeyPress);\n });\n\n return {\n ...questionUtils,\n ...viewableUtils,\n letterDisplay,\n question,\n };\n },\n});\n</script>\n\n<style scoped>\n.letter-display {\n font-size: 48px;\n font-weight: bold;\n font-family: monospace;\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #f8f9fa;\n border: 2px solid #dee2e6;\n border-radius: 8px;\n box-shadow: 0 2px 0 #dee2e6, 0 3px 3px rgba(0, 0, 0, 0.2);\n margin: 20px auto;\n color: #333;\n text-transform: uppercase;\n}\n\n.letter-display.pressed {\n box-shadow: 0 0 0 #dee2e6, 0 1px 2px rgba(0, 0, 0, 0.2);\n transform: translateY(2px);\n}\n</style>\n","<template>\n <div data-viewable=\"LetterQuestionView\">\n <template v-if=\"question\">\n <p class=\"text-h5\">Type this letter!</p>\n <div ref=\"letterDisplay\" class=\"letter-display\">{{ question.letter }}</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, onUnmounted, PropType } from 'vue';\nimport { TypeLetterQuestion } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'LetterQuestionView',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'LetterQuestionView');\n const questionUtils = useQuestionView<TypeLetterQuestion>(viewableUtils);\n const letterDisplay = ref<HTMLElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new TypeLetterQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const handleKeyPress = (event: KeyboardEvent) => {\n if (!question.value) return;\n\n const pressedKey = event.key.toLowerCase();\n const targetKey = question.value.letter.toLowerCase();\n\n if (pressedKey === targetKey) {\n letterDisplay.value?.classList.add('pressed');\n\n // Remove pressed class and submit answer after key release\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === targetKey) {\n letterDisplay.value?.classList.remove('pressed');\n questionUtils.submitAnswer(pressedKey);\n window.removeEventListener('keyup', handleKeyUp);\n }\n };\n\n window.addEventListener('keyup', handleKeyUp);\n } else {\n questionUtils.submitAnswer(pressedKey);\n }\n };\n\n onMounted(() => {\n window.addEventListener('keypress', handleKeyPress);\n });\n\n onUnmounted(() => {\n window.removeEventListener('keypress', handleKeyPress);\n });\n\n return {\n ...questionUtils,\n ...viewableUtils,\n letterDisplay,\n question,\n };\n },\n});\n</script>\n\n<style scoped>\n.letter-display {\n font-size: 48px;\n font-weight: bold;\n font-family: monospace;\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #f8f9fa;\n border: 2px solid #dee2e6;\n border-radius: 8px;\n box-shadow: 0 2px 0 #dee2e6, 0 3px 3px rgba(0, 0, 0, 0.2);\n margin: 20px auto;\n color: #333;\n text-transform: uppercase;\n}\n\n.letter-display.pressed {\n box-shadow: 0 0 0 #dee2e6, 0 1px 2px rgba(0, 0, 0, 0.2);\n transform: translateY(2px);\n}\n</style>\n","// index.ts\nimport { Question } from '@vue-skuilder/common-ui';\nimport {\n Answer,\n DataShape,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport LetterQuestionView from './typeSingleLetter.vue';\n\nconst data = function () {\n const ret: { letter: string }[] = [];\n for (let i = 0; i < 26; i++) {\n ret.push({\n letter: String.fromCharCode(65 + i),\n });\n }\n return ret;\n};\n\nexport class TypeLetterQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n name: DataShapeName.TYPING_singleLetter,\n fields: [\n {\n name: 'letter',\n type: FieldType.STRING,\n validator: {\n instructions: 'Enter a single letter',\n test: function (s: string) {\n if (!s || s.length !== 1 || !/[a-zA-Z]/.test(s)) {\n return {\n status: Status.error,\n msg: 'Input must be a single letter',\n };\n }\n return {\n status: Status.ok,\n msg: '',\n };\n },\n },\n },\n ],\n },\n ];\n\n public static views = [LetterQuestionView];\n public static acceptsUserData: boolean = true;\n\n public letter: string;\n public static seedData = data();\n\n constructor(data: ViewData[]) {\n super(data);\n this.letter = data[0].letter as string;\n }\n\n evaluate(a: Answer, t: number) {\n return {\n isCorrect: this.isCorrect(a),\n performance: this.displayedSkill(a, t),\n };\n }\n\n displayedSkill(a: Answer, t: number) {\n if (this.isCorrect(a)) {\n if (t < 3000) {\n return 1.0;\n } else {\n // scale from 1 at 3s to 0.25 at 10s, clamped to [0.25, 1]\n const skill = 1 - ((t - 3000) / 7000) * 0.75;\n return Math.max(0.25, skill);\n }\n }\n return 0;\n }\n\n dataShapes() {\n return TypeLetterQuestion.dataShapes;\n }\n\n views() {\n return TypeLetterQuestion.views;\n }\n\n isCorrect(a: Answer) {\n const isCorrect = (a as string).toLowerCase() === this.letter.toLowerCase();\n console.log(`singleLetter Q isCorrect: ${isCorrect}`);\n return isCorrect;\n }\n}\n","// Extracted from index.ts to break circular dependency\nimport { Question } from '@vue-skuilder/common-ui';\nimport {\n Answer,\n DataShape,\n DataShapeName,\n FieldType,\n Status,\n ViewData,\n} from '@vue-skuilder/common';\n\nconst data = function () {\n return [\n {\n gameLength: 30, // 30 seconds game\n initialSpeed: 2, // Initial fall speed\n acceleration: 0.1, // Speed increase per second\n spawnInterval: 1, // New letter every second\n },\n ];\n};\n\nexport interface Score extends Answer {\n win: boolean;\n lettersTyped: number;\n // the percentage of the gameLength that the user was able to complete\n // (0-1)\n percentage: number;\n}\n\nexport class FallingLettersQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n name: DataShapeName.TYPING_fallingLetters,\n fields: [\n {\n name: 'gameLength',\n type: FieldType.NUMBER,\n },\n {\n name: 'initialSpeed',\n type: FieldType.NUMBER,\n },\n {\n name: 'acceleration',\n type: FieldType.NUMBER,\n },\n {\n name: 'spawnInterval',\n type: FieldType.NUMBER,\n validator: {\n instructions: 'How often should a new letter spawn? (in seconds)',\n test: (input: unknown) => {\n if (typeof input === 'string') {\n const x = parseFloat(input);\n if (x > 0) {\n return { status: Status.ok, msg: '' };\n } else {\n return { status: Status.error, msg: 'Must be greater than 0' };\n }\n } else {\n return { status: Status.error, msg: 'Unexpected non-string input.' };\n }\n },\n placeholder: '1',\n },\n },\n ],\n },\n ];\n\n // Note: views will be set in index.ts to avoid circular dependency\n public static views: any[] = [];\n public static acceptsUserData: boolean = true;\n public static seedData = data();\n\n public gameLength: number;\n public initialSpeed: number;\n public acceleration: number;\n public spawnInterval: number;\n\n constructor(data: ViewData[]) {\n super(data);\n this.gameLength = data[0].gameLength as number;\n this.initialSpeed = data[0].initialSpeed as number;\n this.acceleration = data[0].acceleration as number;\n this.spawnInterval = data[0].spawnInterval as number;\n }\n\n evaluate(a: Answer) {\n return {\n isCorrect: this.isCorrect(a as Score),\n performance: this.displayedSkill(a as Score),\n };\n }\n\n displayedSkill(a: Answer) {\n if ((a as Score).win) {\n return 1;\n } else {\n return (a as Score).percentage;\n }\n }\n\n dataShapes() {\n return FallingLettersQuestion.dataShapes;\n }\n\n views() {\n return FallingLettersQuestion.views;\n }\n\n isCorrect(a: Score) {\n return a.win;\n }\n}","// vue/src/courses/typing/index.ts\nimport { CourseWare } from '../CourseWare';\nimport { TypeLetterQuestion } from './questions/single-letter';\nimport { FallingLettersQuestion } from './questions/falling-letters';\n\nconst typing: CourseWare = new CourseWare('typing', [TypeLetterQuestion, FallingLettersQuestion]);\n\nexport default typing;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import "./CourseWare-BTFRjgBR.js";
2
+ import { t as e } from "./typing-BevtfWlp.js";
3
+ export { e as default };
@@ -0,0 +1,108 @@
1
+ import "./shapes-BQUVJdp5.js";
2
+ import { r as e, t } from "./CourseWare-BTFRjgBR.js";
3
+ import { Fragment as n, computed as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, openBlock as l, ref as u, resolveComponent as d, toDisplayString as f, withCtx as p } from "vue";
4
+ import { AudioAutoPlayer as m, Question as h, UserInputString as g, useQuestionView as _, useViewable as v } from "@vue-skuilder/common-ui";
5
+ import { DataShapeName as y, FieldType as b, Validators as x } from "@vue-skuilder/common";
6
+ //#region src/word-work/questions/spelling/textBox.vue?vue&type=script&lang.ts
7
+ var S = c({
8
+ name: "IdentifyVocab",
9
+ components: {
10
+ AudioAutoPlayer: m,
11
+ UserInputString: g
12
+ },
13
+ props: {
14
+ data: {
15
+ type: Array,
16
+ required: !0
17
+ },
18
+ modifyDifficulty: {
19
+ type: Number,
20
+ required: !1,
21
+ default: 0
22
+ }
23
+ },
24
+ setup(e, { emit: t }) {
25
+ let n = v(e, t, "IdentifyVocab"), i = _(n), a = u("");
26
+ i.question.value = new D(e.data);
27
+ let o = r(() => i.question.value), submit = () => {
28
+ o.value && i.submitAnswer(a.value);
29
+ };
30
+ return {
31
+ ...n,
32
+ ...i,
33
+ answer: a,
34
+ question: o,
35
+ submit
36
+ };
37
+ }
38
+ }), C = { "data-viewable": "IdentifyVocab" }, w = {
39
+ key: 0,
40
+ class: "text-h6"
41
+ };
42
+ function _sfc_render(e, t, r, c, u, m) {
43
+ let h = d("UserInputString"), g = d("center"), _ = d("audio-auto-player");
44
+ return l(), a("div", C, [e.question ? (l(), a(n, { key: 0 }, [
45
+ t[1] ||= o("span", { class: "text-h5" }, " Spell the word: ", -1),
46
+ s(h, {
47
+ modelValue: e.answer,
48
+ "onUpdate:modelValue": t[0] ||= (t) => e.answer = t
49
+ }, null, 8, ["modelValue"]),
50
+ s(g, null, {
51
+ default: p(() => [e.priorAttempts ? (l(), a("span", w, f(e.question.word), 1)) : i("", !0)]),
52
+ _: 1
53
+ }),
54
+ s(g, null, {
55
+ default: p(() => [s(_, { src: [
56
+ e.getURL("WordAudio"),
57
+ e.getURL("SentenceAudio"),
58
+ e.getURL("WordAudio")
59
+ ] }, null, 8, ["src"])]),
60
+ _: 1
61
+ })
62
+ ], 64)) : i("", !0)]);
63
+ }
64
+ var T = /* @__PURE__ */ e(S, [["render", _sfc_render]]), E = [
65
+ {
66
+ name: "Word",
67
+ type: b.STRING,
68
+ validator: x.NonEmptyString
69
+ },
70
+ {
71
+ name: "ExampleSentence",
72
+ type: b.STRING
73
+ },
74
+ {
75
+ name: "WordAudio",
76
+ type: b.AUDIO
77
+ },
78
+ {
79
+ name: "SentenceAudio",
80
+ type: b.AUDIO
81
+ }
82
+ ], D = class SpellingQuestion extends h {
83
+ static dataShapes = [{
84
+ fields: E,
85
+ name: y.WORDWORK_Spelling
86
+ }];
87
+ static views = [T];
88
+ word;
89
+ sentence;
90
+ audio_word;
91
+ audio_sentence;
92
+ constructor(e) {
93
+ super(e), this.word = e[0].Word, this.sentence = e[0].Sentence, this.audio_word = e[0].WordAudio, this.audio_sentence = e[0].SentenceAudio;
94
+ }
95
+ isCorrect(e) {
96
+ return e === this.word;
97
+ }
98
+ dataShapes() {
99
+ return SpellingQuestion.dataShapes;
100
+ }
101
+ views() {
102
+ return SpellingQuestion.views;
103
+ }
104
+ }, O = new t("wordWork", [D]);
105
+ //#endregion
106
+ export { O as t };
107
+
108
+ //# sourceMappingURL=word-work-BOnRlZgd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-work-BOnRlZgd.js","names":[],"sources":["../src/word-work/questions/spelling/textBox.vue","../src/word-work/questions/spelling/textBox.vue","../src/word-work/questions/spelling/index.ts","../src/word-work/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"IdentifyVocab\">\n <template v-if=\"question\">\n <span class=\"text-h5\"> Spell the word: </span>\n <UserInputString v-model=\"answer\" />\n <center>\n <span v-if=\"priorAttempts\" class=\"text-h6\">\n {{ question.word }}\n </span>\n </center>\n <center>\n <audio-auto-player :src=\"[getURL('WordAudio'), getURL('SentenceAudio'), getURL('WordAudio')]\" />\n </center>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SpellingQuestion } from '@courseware/word-work/questions/spelling';\nimport { AudioAutoPlayer, UserInputString, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\n\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyVocab',\n\n components: {\n AudioAutoPlayer,\n UserInputString,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyVocab');\n const questionUtils = useQuestionView<SpellingQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SpellingQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n questionUtils.submitAnswer(answer.value);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"IdentifyVocab\">\n <template v-if=\"question\">\n <span class=\"text-h5\"> Spell the word: </span>\n <UserInputString v-model=\"answer\" />\n <center>\n <span v-if=\"priorAttempts\" class=\"text-h6\">\n {{ question.word }}\n </span>\n </center>\n <center>\n <audio-auto-player :src=\"[getURL('WordAudio'), getURL('SentenceAudio'), getURL('WordAudio')]\" />\n </center>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SpellingQuestion } from '@courseware/word-work/questions/spelling';\nimport { AudioAutoPlayer, UserInputString, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\n\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyVocab',\n\n components: {\n AudioAutoPlayer,\n UserInputString,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyVocab');\n const questionUtils = useQuestionView<SpellingQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SpellingQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n questionUtils.submitAnswer(answer.value);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n DataShapeName,\n FieldType,\n Validators,\n DataShape,\n Answer,\n FieldDefinition,\n ViewData,\n} from '@vue-skuilder/common';\nimport TextBox from './textBox.vue';\n\nconst fields: FieldDefinition[] = [\n {\n name: 'Word',\n type: FieldType.STRING,\n validator: Validators.NonEmptyString,\n },\n {\n name: 'ExampleSentence',\n type: FieldType.STRING,\n },\n {\n name: 'WordAudio',\n type: FieldType.AUDIO,\n },\n {\n name: 'SentenceAudio',\n type: FieldType.AUDIO,\n },\n];\n\nexport class SpellingQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n fields,\n name: DataShapeName.WORDWORK_Spelling,\n },\n ];\n\n public static views = [TextBox];\n\n public word: string;\n public sentence: string;\n public audio_word: Blob;\n public audio_sentence: Blob;\n\n constructor(data: ViewData[]) {\n super(data);\n this.word = data[0].Word as string;\n this.sentence = data[0].Sentence as string;\n this.audio_word = data[0].WordAudio as Blob;\n this.audio_sentence = data[0].SentenceAudio as Blob;\n }\n\n public isCorrect(answer: Answer): boolean {\n return answer === this.word;\n }\n public dataShapes(): DataShape[] {\n return SpellingQuestion.dataShapes;\n }\n public views() {\n return SpellingQuestion.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { SpellingQuestion } from './questions/spelling';\n\nconst wordWork: CourseWare = new CourseWare('wordWork', [SpellingQuestion]);\n\nexport default wordWork;\n"],"mappings":";;;;;;ACwBA,IAAA,IAAe,EAAgB;CAC7B,MAAM;CAEN,YAAY;EACV;EACA;EACD;CAED,OAAO;EACL,MAAM;GACJ,MAAM;GACN,UAAU;GACX;EACD,kBAAkB;GAChB,MAAM;GACN,UAAU;GACV,SAAS;GACV;EACF;CAED,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,IAAgB,EAAY,GAAO,GAAM,gBAAgB,EACzD,IAAgB,EAAkC,EAAc,EAEhE,IAAS,EAAI,GAAG;AAGtB,IAAc,SAAS,QAAQ,IAAI,EAAiB,EAAM,KAAK;EAG/D,IAAM,IAAW,QAAe,EAAc,SAAS,MAAM,EAEvD,eAAe;AACnB,GAAI,EAAS,SACX,EAAc,aAAa,EAAO,MAAM;;AAI5C,SAAO;GACL,GAAG;GACH,GAAG;GACH;GACA;GACA;GACD;;CAEJ,CAAC,QArEK,iBAAc,iBAAe;CADpC,KAAA;CAMmC,OAAM;;;;aALvC,EAaM,OAbN,GAaM,CAZY,EAAA,YAAA,GAAA,EAAhB,EAWW,GAAA,EAbf,KAAA,GAAA,EAAA;WAGM,EAA8C,QAAA,EAAxC,OAAM,WAAS,EAAC,qBAAiB,GAAA;EACvC,EAAoC,GAAA;GAJ1C,YAIgC,EAAA;GAJhC,uBAAA,AAAA,EAAA,QAAA,MAAA,EAIgC,SAAM;;EAChC,EAIS,GAAA,MAAA;GATf,SAAA,QAQe,CAFK,EAAA,iBAAA,GAAA,EAAZ,EAEO,QAFP,GAEO,EADF,EAAA,SAAS,KAAI,EAAA,EAAA,IAP1B,EAAA,IAAA,GAAA,CAAA,CAAA;GAAA,GAAA;;EAUM,EAES,GAAA,MAAA;GAZf,SAAA,QAWwG,CAAhG,EAAgG,GAAA,EAA5E,KAAG;IAAG,EAAA,OAAM,YAAA;IAAe,EAAA,OAAM,gBAAA;IAAmB,EAAA,OAAM,YAAA;IAAA,EAAA,EAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;GAXtF,GAAA;;WAAA,EAAA,IAAA,GAAA,CAAA,CAAA;;yDCYM,IAA4B;CAChC;EACE,MAAM;EACN,MAAM,EAAU;EAChB,WAAW,EAAW;EACvB;CACD;EACE,MAAM;EACN,MAAM,EAAU;EACjB;CACD;EACE,MAAM;EACN,MAAM,EAAU;EACjB;CACD;EACE,MAAM;EACN,MAAM,EAAU;EACjB;CACF,EAEY,IAAb,MAAa,yBAAyB,EAAS;CAC7C,OAAc,aAA0B,CACtC;EACE;EACA,MAAM,EAAc;EACrB,CACF;CAED,OAAc,QAAQ,CAAC,EAAQ;CAE/B;CACA;CACA;CACA;CAEA,YAAY,GAAkB;AAK5B,EAJA,MAAM,EAAK,EACX,KAAK,OAAO,EAAK,GAAG,MACpB,KAAK,WAAW,EAAK,GAAG,UACxB,KAAK,aAAa,EAAK,GAAG,WAC1B,KAAK,iBAAiB,EAAK,GAAG;;CAGhC,UAAiB,GAAyB;AACxC,SAAO,MAAW,KAAK;;CAEzB,aAAiC;AAC/B,SAAO,iBAAiB;;CAE1B,QAAe;AACb,SAAO,iBAAiB;;GC3DtB,IAAuB,IAAI,EAAW,YAAY,CAAC,EAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ require(`./CourseWare-DSeyTAtH.cjs`);const e=require(`./word-work-fNbCLNuN.cjs`);exports.default=e.t;
@@ -0,0 +1,3 @@
1
+ import "./CourseWare-BTFRjgBR.js";
2
+ import { t as e } from "./word-work-BOnRlZgd.js";
3
+ export { e as default };
@@ -0,0 +1,2 @@
1
+ require(`./shapes-C_-mvrCc.cjs`);const e=require(`./CourseWare-DSeyTAtH.cjs`);let t=require(`vue`),n=require(`@vue-skuilder/common-ui`),r=require(`@vue-skuilder/common`);var i=(0,t.defineComponent)({name:`IdentifyVocab`,components:{AudioAutoPlayer:n.AudioAutoPlayer,UserInputString:n.UserInputString},props:{data:{type:Array,required:!0},modifyDifficulty:{type:Number,required:!1,default:0}},setup(e,{emit:r}){let i=(0,n.useViewable)(e,r,`IdentifyVocab`),a=(0,n.useQuestionView)(i),o=(0,t.ref)(``);a.question.value=new l(e.data);let s=(0,t.computed)(()=>a.question.value),submit=()=>{s.value&&a.submitAnswer(o.value)};return{...i,...a,answer:o,question:s,submit}}}),a={"data-viewable":`IdentifyVocab`},o={key:0,class:`text-h6`};function _sfc_render(e,n,r,i,s,c){let l=(0,t.resolveComponent)(`UserInputString`),u=(0,t.resolveComponent)(`center`),d=(0,t.resolveComponent)(`audio-auto-player`);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,a,[e.question?((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:0},[n[1]||=(0,t.createElementVNode)(`span`,{class:`text-h5`},` Spell the word: `,-1),(0,t.createVNode)(l,{modelValue:e.answer,"onUpdate:modelValue":n[0]||=t=>e.answer=t},null,8,[`modelValue`]),(0,t.createVNode)(u,null,{default:(0,t.withCtx)(()=>[e.priorAttempts?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,o,(0,t.toDisplayString)(e.question.word),1)):(0,t.createCommentVNode)(``,!0)]),_:1}),(0,t.createVNode)(u,null,{default:(0,t.withCtx)(()=>[(0,t.createVNode)(d,{src:[e.getURL(`WordAudio`),e.getURL(`SentenceAudio`),e.getURL(`WordAudio`)]},null,8,[`src`])]),_:1})],64)):(0,t.createCommentVNode)(``,!0)])}var s=e.r(i,[[`render`,_sfc_render]]),c=[{name:`Word`,type:r.FieldType.STRING,validator:r.Validators.NonEmptyString},{name:`ExampleSentence`,type:r.FieldType.STRING},{name:`WordAudio`,type:r.FieldType.AUDIO},{name:`SentenceAudio`,type:r.FieldType.AUDIO}],l=class SpellingQuestion extends n.Question{static dataShapes=[{fields:c,name:r.DataShapeName.WORDWORK_Spelling}];static views=[s];word;sentence;audio_word;audio_sentence;constructor(e){super(e),this.word=e[0].Word,this.sentence=e[0].Sentence,this.audio_word=e[0].WordAudio,this.audio_sentence=e[0].SentenceAudio}isCorrect(e){return e===this.word}dataShapes(){return SpellingQuestion.dataShapes}views(){return SpellingQuestion.views}},u=new e.t(`wordWork`,[l]);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return u}});
2
+ //# sourceMappingURL=word-work-fNbCLNuN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-work-fNbCLNuN.cjs","names":[],"sources":["../src/word-work/questions/spelling/textBox.vue","../src/word-work/questions/spelling/textBox.vue","../src/word-work/questions/spelling/index.ts","../src/word-work/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"IdentifyVocab\">\n <template v-if=\"question\">\n <span class=\"text-h5\"> Spell the word: </span>\n <UserInputString v-model=\"answer\" />\n <center>\n <span v-if=\"priorAttempts\" class=\"text-h6\">\n {{ question.word }}\n </span>\n </center>\n <center>\n <audio-auto-player :src=\"[getURL('WordAudio'), getURL('SentenceAudio'), getURL('WordAudio')]\" />\n </center>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SpellingQuestion } from '@courseware/word-work/questions/spelling';\nimport { AudioAutoPlayer, UserInputString, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\n\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyVocab',\n\n components: {\n AudioAutoPlayer,\n UserInputString,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyVocab');\n const questionUtils = useQuestionView<SpellingQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SpellingQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n questionUtils.submitAnswer(answer.value);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"IdentifyVocab\">\n <template v-if=\"question\">\n <span class=\"text-h5\"> Spell the word: </span>\n <UserInputString v-model=\"answer\" />\n <center>\n <span v-if=\"priorAttempts\" class=\"text-h6\">\n {{ question.word }}\n </span>\n </center>\n <center>\n <audio-auto-player :src=\"[getURL('WordAudio'), getURL('SentenceAudio'), getURL('WordAudio')]\" />\n </center>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SpellingQuestion } from '@courseware/word-work/questions/spelling';\nimport { AudioAutoPlayer, UserInputString, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\n\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyVocab',\n\n components: {\n AudioAutoPlayer,\n UserInputString,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyVocab');\n const questionUtils = useQuestionView<SpellingQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SpellingQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n questionUtils.submitAnswer(answer.value);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n DataShapeName,\n FieldType,\n Validators,\n DataShape,\n Answer,\n FieldDefinition,\n ViewData,\n} from '@vue-skuilder/common';\nimport TextBox from './textBox.vue';\n\nconst fields: FieldDefinition[] = [\n {\n name: 'Word',\n type: FieldType.STRING,\n validator: Validators.NonEmptyString,\n },\n {\n name: 'ExampleSentence',\n type: FieldType.STRING,\n },\n {\n name: 'WordAudio',\n type: FieldType.AUDIO,\n },\n {\n name: 'SentenceAudio',\n type: FieldType.AUDIO,\n },\n];\n\nexport class SpellingQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n fields,\n name: DataShapeName.WORDWORK_Spelling,\n },\n ];\n\n public static views = [TextBox];\n\n public word: string;\n public sentence: string;\n public audio_word: Blob;\n public audio_sentence: Blob;\n\n constructor(data: ViewData[]) {\n super(data);\n this.word = data[0].Word as string;\n this.sentence = data[0].Sentence as string;\n this.audio_word = data[0].WordAudio as Blob;\n this.audio_sentence = data[0].SentenceAudio as Blob;\n }\n\n public isCorrect(answer: Answer): boolean {\n return answer === this.word;\n }\n public dataShapes(): DataShape[] {\n return SpellingQuestion.dataShapes;\n }\n public views() {\n return SpellingQuestion.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { SpellingQuestion } from './questions/spelling';\n\nconst wordWork: CourseWare = new CourseWare('wordWork', [SpellingQuestion]);\n\nexport default wordWork;\n"],"mappings":"0KCwBA,IAAA,GAAA,EAAA,EAAA,iBAA+B,CAC7B,KAAM,gBAEN,WAAY,CACV,gBAAA,EAAA,gBACA,gBAAA,EAAA,gBACD,CAED,MAAO,CACL,KAAM,CACJ,KAAM,MACN,SAAU,GACX,CACD,iBAAkB,CAChB,KAAM,OACN,SAAU,GACV,QAAS,EACV,CACF,CAED,MAAM,EAAO,CAAE,QAAQ,CACrB,IAAM,GAAA,EAAA,EAAA,aAA4B,EAAO,EAAM,gBAAgB,CACzD,GAAA,EAAA,EAAA,iBAAkD,EAAc,CAEhE,GAAA,EAAA,EAAA,KAAa,GAAG,CAGtB,EAAc,SAAS,MAAQ,IAAI,EAAiB,EAAM,KAAK,CAG/D,IAAM,GAAA,EAAA,EAAA,cAA0B,EAAc,SAAS,MAAM,CAEvD,WAAe,CACf,EAAS,OACX,EAAc,aAAa,EAAO,MAAM,EAI5C,MAAO,CACL,GAAG,EACH,GAAG,EACH,SACA,WACA,OACD,EAEJ,CAAC,IArEK,gBAAc,gBAAe,IADpC,IAAA,EAMmC,MAAM,+NAQjC,MAbN,EAaM,CAZY,EAAA,WAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAWL,EAAA,SAAA,CAbf,IAAA,EAAA,CAAA,iCAGoD,OAAA,CAAxC,MAAM,UAAS,CAAC,oBAAiB,GAAA,mBACH,EAAA,CAJ1C,WAIgC,EAAA,OAJhC,sBAAA,AAAA,EAAA,KAAA,GAAA,EAIgC,OAAM,4CAKvB,EAAA,KAAA,CATf,SAAA,EAAA,EAAA,aAQe,CAFK,EAAA,gBAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAEL,OAFP,GAAA,EAAA,EAAA,iBACK,EAAA,SAAS,KAAI,CAAA,EAAA,GAAA,EAAA,EAAA,oBAP1B,GAAA,GAAA,CAAA,CAAA,CAAA,EAAA,sBAYe,EAAA,KAAA,CAZf,SAAA,EAAA,EAAA,aAWwG,EAAA,EAAA,EAAA,aAAA,EAAA,CAA5E,IAAG,CAAG,EAAA,OAAM,YAAA,CAAe,EAAA,OAAM,gBAAA,CAAmB,EAAA,OAAM,YAAA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAXtF,EAAA,mCAAA,GAAA,GAAA,CAAA,CAAA,uCCYM,EAA4B,CAChC,CACE,KAAM,OACN,KAAM,EAAA,UAAU,OAChB,UAAW,EAAA,WAAW,eACvB,CACD,CACE,KAAM,kBACN,KAAM,EAAA,UAAU,OACjB,CACD,CACE,KAAM,YACN,KAAM,EAAA,UAAU,MACjB,CACD,CACE,KAAM,gBACN,KAAM,EAAA,UAAU,MACjB,CACF,CAEY,EAAb,MAAa,yBAAyB,EAAA,QAAS,CAC7C,OAAc,WAA0B,CACtC,CACE,SACA,KAAM,EAAA,cAAc,kBACrB,CACF,CAED,OAAc,MAAQ,CAAC,EAAQ,CAE/B,KACA,SACA,WACA,eAEA,YAAY,EAAkB,CAC5B,MAAM,EAAK,CACX,KAAK,KAAO,EAAK,GAAG,KACpB,KAAK,SAAW,EAAK,GAAG,SACxB,KAAK,WAAa,EAAK,GAAG,UAC1B,KAAK,eAAiB,EAAK,GAAG,cAGhC,UAAiB,EAAyB,CACxC,OAAO,IAAW,KAAK,KAEzB,YAAiC,CAC/B,OAAO,iBAAiB,WAE1B,OAAe,CACb,OAAO,iBAAiB,QC3DtB,EAAuB,IAAI,EAAA,EAAW,WAAY,CAAC,EAAiB,CAAC"}
package/package.json CHANGED
@@ -3,8 +3,9 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.1.33",
6
+ "version": "0.1.35",
7
7
  "type": "module",
8
+ "sideEffects": false,
8
9
  "main": "./dist/index.cjs.js",
9
10
  "module": "./dist/index.mjs",
10
11
  "types": "./dist/index.d.ts",
@@ -43,9 +44,9 @@
43
44
  "lint:check": "eslint ."
44
45
  },
45
46
  "dependencies": {
46
- "@vue-skuilder/common": "0.1.33",
47
- "@vue-skuilder/common-ui": "0.1.33",
48
- "@vue-skuilder/db": "0.1.33",
47
+ "@vue-skuilder/common": "0.1.35",
48
+ "@vue-skuilder/common-ui": "0.1.35",
49
+ "@vue-skuilder/db": "0.1.35",
49
50
  "moment": "^2.29.4",
50
51
  "paper": "^0.12.3",
51
52
  "vue": "^3.5.13"
@@ -67,5 +68,5 @@
67
68
  "peerDependencies": {
68
69
  "vue": "^3.2.0"
69
70
  },
70
- "stableVersion": "0.1.33"
71
+ "stableVersion": "0.1.35"
71
72
  }
@@ -1,2 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,__name=(e,n)=>t(e,`name`,{value:n,configurable:!0}),n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),__copyProps=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},__toESM=(n,r,a)=>(a=n==null?{}:e(i(n)),__copyProps(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let o=require(`@vue-skuilder/common`);var s=[{name:o.DataShapeName.Blanks,fields:[{name:`Input`,type:o.FieldType.MARKDOWN},{name:`Uploads`,type:o.FieldType.MEDIA_UPLOADS}]}],c={name:o.DataShapeName.MATH_SingleDigitAddition,fields:[{name:`a`,type:o.FieldType.INT},{name:`b`,type:o.FieldType.INT}]},l={name:o.DataShapeName.MATH_EqualityTest,fields:[{name:`a`,type:o.FieldType.STRING},{name:`b`,type:o.FieldType.STRING}]};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return __name}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return __commonJSMin}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return __toESM}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return l}});
2
- //# sourceMappingURL=shapes-DJ-ujuDr.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shapes-DJ-ujuDr.cjs","names":[],"sources":["../src/default/questions/fillIn/shapes.ts","../src/math/questions/addition/shapes.ts","../src/math/questions/equalityTest/shapes.ts"],"sourcesContent":["import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const BlanksCardDataShapes: DataShape[] = [\n {\n name: DataShapeName.Blanks,\n fields: [\n {\n name: 'Input',\n type: FieldType.MARKDOWN,\n },\n {\n name: 'Uploads',\n type: FieldType.MEDIA_UPLOADS,\n },\n ],\n },\n];","import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const SingleDigitAdditionDataShape: DataShape = {\n name: DataShapeName.MATH_SingleDigitAddition,\n fields: [\n { name: 'a', type: FieldType.INT },\n { name: 'b', type: FieldType.INT },\n ],\n};","import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const EqualityTestDataShape: DataShape = {\n name: DataShapeName.MATH_EqualityTest,\n fields: [\n { name: 'a', type: FieldType.STRING },\n { name: 'b', type: FieldType.STRING },\n ],\n};"],"mappings":"wpBAEA,IAAa,EAAoC,CAC/C,CACE,KAAM,EAAA,cAAc,OACpB,OAAQ,CACN,CACE,KAAM,QACN,KAAM,EAAA,UAAU,SACjB,CACD,CACE,KAAM,UACN,KAAM,EAAA,UAAU,cACjB,CACF,CACF,CACF,CCdY,EAA0C,CACrD,KAAM,EAAA,cAAc,yBACpB,OAAQ,CACN,CAAE,KAAM,IAAK,KAAM,EAAA,UAAU,IAAK,CAClC,CAAE,KAAM,IAAK,KAAM,EAAA,UAAU,IAAK,CACnC,CACF,CCNY,EAAmC,CAC9C,KAAM,EAAA,cAAc,kBACpB,OAAQ,CACN,CAAE,KAAM,IAAK,KAAM,EAAA,UAAU,OAAQ,CACrC,CAAE,KAAM,IAAK,KAAM,EAAA,UAAU,OAAQ,CACtC,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shapes-nszfsx3o.js","names":[],"sources":["../src/default/questions/fillIn/shapes.ts","../src/math/questions/addition/shapes.ts","../src/math/questions/equalityTest/shapes.ts"],"sourcesContent":["import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const BlanksCardDataShapes: DataShape[] = [\n {\n name: DataShapeName.Blanks,\n fields: [\n {\n name: 'Input',\n type: FieldType.MARKDOWN,\n },\n {\n name: 'Uploads',\n type: FieldType.MEDIA_UPLOADS,\n },\n ],\n },\n];","import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const SingleDigitAdditionDataShape: DataShape = {\n name: DataShapeName.MATH_SingleDigitAddition,\n fields: [\n { name: 'a', type: FieldType.INT },\n { name: 'b', type: FieldType.INT },\n ],\n};","import { DataShape, FieldType, DataShapeName } from '@vue-skuilder/common';\n\nexport const EqualityTestDataShape: DataShape = {\n name: DataShapeName.MATH_EqualityTest,\n fields: [\n { name: 'a', type: FieldType.STRING },\n { name: 'b', type: FieldType.STRING },\n ],\n};"],"mappings":";;;;;;;;;;;;;;;;;IAEa,IAAoC,CAC/C;CACE,MAAM,EAAc;CACpB,QAAQ,CACN;EACE,MAAM;EACN,MAAM,EAAU;EACjB,EACD;EACE,MAAM;EACN,MAAM,EAAU;EACjB,CACF;CACF,CACF,ECdY,IAA0C;CACrD,MAAM,EAAc;CACpB,QAAQ,CACN;EAAE,MAAM;EAAK,MAAM,EAAU;EAAK,EAClC;EAAE,MAAM;EAAK,MAAM,EAAU;EAAK,CACnC;CACF,ECNY,IAAmC;CAC9C,MAAM,EAAc;CACpB,QAAQ,CACN;EAAE,MAAM;EAAK,MAAM,EAAU;EAAQ,EACrC;EAAE,MAAM;EAAK,MAAM,EAAU;EAAQ,CACtC;CACF"}