@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,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:`IdentifyChroma`,components:{RadioMultipleChoice:n.RadioMultipleChoice},props:{data:{type:Array,required:!0},modifyDifficulty:{type:Number,required:!1,default:0}},setup(e,{emit:r}){let i=(0,n.useViewable)(e,r,`IdentifyChroma`),a=(0,n.useQuestionView)(i),o=(0,t.ref)(``),s=(0,t.ref)(new AudioContext);a.question.value=new l(e.data);let c=(0,t.computed)(()=>a.question.value),octaves=e=>{let t=[],n=e/2;for(;n>100;)t.push(n),n/=2;t.push(e);let r=e*2;for(;r<5e3;)t.push(r),r*=2;return t},tone=e=>{let t=s.value.createOscillator();t.type=`sine`,t.frequency.value=e;let n=s.value.createGain();console.log(`Max Gain: `+n.gain.maxValue),n.gain.setValueAtTime(0,0),n.gain.linearRampToValueAtTime(.5,15),t.connect(n),n.connect(s.value.destination),t.start(0),t.stop(14)};(0,t.onMounted)(()=>{octaves(295).forEach(e=>tone(e))});let submit=()=>{c.value&&c.value.isCorrect(o.value)};return{...i,...a,answer:o,question:c,submit}}}),a={"data-viewable":`IdentifyChroma`};function _sfc_render(e,n,r,i,o,s){let c=(0,t.resolveComponent)(`radio-multiple-choice`);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,a,[e.question?((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:0},[n[0]||=(0,t.createTextVNode)(` What note is being played? `),(0,t.createVNode)(c,{"choice-list":e.question.choiceList},null,8,[`choice-list`])],64)):(0,t.createCommentVNode)(``,!0)])}var o=e.r(i,[[`render`,_sfc_render]]),s=function(e){return e.A=`A`,e.B=`B`,e.C=`C`,e.D=`D`,e.E=`E`,e.F=`F`,e.G=`G`,e}(s||{}),c=[{name:`Chroma`,type:r.FieldType.STRING,validator:{test:e=>Object.values(s).includes(e)?{status:r.Status.ok,msg:``}:{status:r.Status.error,msg:`That's not a chroma!`},instructions:`Enter a valid musical note (A-G)`}}],l=class ChromaQuestion extends n.Question{static dataShapes=[{fields:c,name:r.DataShapeName.PITCH_chroma}];static views=[o];chroma;constructor(e){super(e),this.chroma=e[0].Chroma}get baseFreq(){return this.chroma===`A`?440:this.chroma===`B`?440*2**(2/12):this.chroma===`C`?440*2**(3/12):440}get choiceList(){return e.s([this.chroma.toString(),`test`,`options`,`are`,`fun`])}isCorrect(e){return e.choiceList[e.selection]===this.chroma.toString()}dataShapes(){return ChromaQuestion.dataShapes}views(){return ChromaQuestion.views}},u=new e.t(`pitch`,[l]);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return u}});
2
+ //# sourceMappingURL=pitch-C-lh9ezH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pitch-C-lh9ezH.cjs","names":[],"sources":["../src/pitch/questions/indentify/textBox.vue","../src/pitch/questions/indentify/textBox.vue","../src/pitch/questions/indentify/index.ts","../src/pitch/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"IdentifyChroma\">\n <template v-if=\"question\">\n What note is being played?\n <radio-multiple-choice :choice-list=\"question.choiceList\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { ChromaQuestion } from './index';\nimport { useViewable, useQuestionView, RadioMultipleChoice } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyChroma',\n\n components: {\n RadioMultipleChoice,\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, 'IdentifyChroma');\n const questionUtils = useQuestionView<ChromaQuestion>(viewableUtils);\n\n const answer = ref('');\n const ctx = ref(new AudioContext());\n\n // Initialize question immediately\n questionUtils.question.value = new ChromaQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const octaves = (freq: number): number[] => {\n const ret: number[] = [];\n let lowerFreq: number = freq / 2;\n while (lowerFreq > 100) {\n ret.push(lowerFreq);\n lowerFreq /= 2;\n }\n ret.push(freq);\n let above: number = freq * 2;\n while (above < 5000) {\n ret.push(above);\n above *= 2;\n }\n return ret;\n };\n\n const tone = (freq: number) => {\n const osc = ctx.value.createOscillator();\n osc.type = 'sine';\n osc.frequency.value = freq;\n\n const g = ctx.value.createGain();\n console.log('Max Gain: ' + g.gain.maxValue);\n g.gain.setValueAtTime(0, 0);\n g.gain.linearRampToValueAtTime(0.5, 15);\n\n osc.connect(g);\n g.connect(ctx.value.destination);\n\n osc.start(0);\n osc.stop(14);\n };\n\n onMounted(() => {\n octaves(295).forEach((t) => tone(t));\n });\n\n const submit = () => {\n if (question.value) {\n question.value.isCorrect(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=\"IdentifyChroma\">\n <template v-if=\"question\">\n What note is being played?\n <radio-multiple-choice :choice-list=\"question.choiceList\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { ChromaQuestion } from './index';\nimport { useViewable, useQuestionView, RadioMultipleChoice } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyChroma',\n\n components: {\n RadioMultipleChoice,\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, 'IdentifyChroma');\n const questionUtils = useQuestionView<ChromaQuestion>(viewableUtils);\n\n const answer = ref('');\n const ctx = ref(new AudioContext());\n\n // Initialize question immediately\n questionUtils.question.value = new ChromaQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const octaves = (freq: number): number[] => {\n const ret: number[] = [];\n let lowerFreq: number = freq / 2;\n while (lowerFreq > 100) {\n ret.push(lowerFreq);\n lowerFreq /= 2;\n }\n ret.push(freq);\n let above: number = freq * 2;\n while (above < 5000) {\n ret.push(above);\n above *= 2;\n }\n return ret;\n };\n\n const tone = (freq: number) => {\n const osc = ctx.value.createOscillator();\n osc.type = 'sine';\n osc.frequency.value = freq;\n\n const g = ctx.value.createGain();\n console.log('Max Gain: ' + g.gain.maxValue);\n g.gain.setValueAtTime(0, 0);\n g.gain.linearRampToValueAtTime(0.5, 15);\n\n osc.connect(g);\n g.connect(ctx.value.destination);\n\n osc.start(0);\n osc.stop(14);\n };\n\n onMounted(() => {\n octaves(295).forEach((t) => tone(t));\n });\n\n const submit = () => {\n if (question.value) {\n question.value.isCorrect(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 { DataShape, FieldDefinition } from '@vue-skuilder/common';\nimport { ViewData, DataShapeName, FieldType, Status, Answer } from '@vue-skuilder/common';\nimport TextBox from './textBox.vue';\nimport { shuffle } from '@courseware/math/utility';\n\nenum Chroma {\n A = 'A',\n B = 'B',\n C = 'C',\n D = 'D',\n E = 'E',\n F = 'F',\n G = 'G',\n}\n\nconst fields: FieldDefinition[] = [\n {\n name: 'Chroma',\n type: FieldType.STRING,\n validator: {\n test: (value) => {\n // Check if the value is a valid Chroma enum value\n if (Object.values(Chroma).includes(value as Chroma)) {\n return {\n status: Status.ok,\n msg: '',\n };\n }\n return {\n status: Status.error,\n msg: \"That's not a chroma!\",\n };\n },\n instructions: 'Enter a valid musical note (A-G)',\n },\n },\n];\n\nexport class ChromaQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n fields,\n name: DataShapeName.PITCH_chroma,\n },\n ];\n\n public static views = [TextBox];\n\n public chroma: Chroma;\n\n constructor(data: ViewData[]) {\n super(data);\n\n this.chroma = data[0].Chroma as Chroma;\n }\n public get baseFreq(): number {\n const aFreq = 440;\n\n if (this.chroma === 'A') return aFreq;\n else if (this.chroma === 'B') return aFreq * Math.pow(2, 2 / 12);\n else if (this.chroma === 'C') {\n return aFreq * Math.pow(2, 3 / 12);\n }\n\n return aFreq;\n }\n\n public get choiceList(): string[] {\n return shuffle([this.chroma.toString(), 'test', 'options', 'are', 'fun']);\n }\n\n public isCorrect(answer: Answer): boolean {\n // alert(JSON.stringify(answer));\n return (answer as any).choiceList[(answer as any).selection] === this.chroma.toString();\n }\n public dataShapes(): DataShape[] {\n return ChromaQuestion.dataShapes;\n }\n public views() {\n return ChromaQuestion.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { ChromaQuestion } from './questions/indentify';\n\nconst pitch: CourseWare = new CourseWare('pitch', [ChromaQuestion]);\n\nexport default pitch;\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import "./shapes-BQUVJdp5.js";
2
+ import { r as e, s as t, t as n } from "./CourseWare-BTFRjgBR.js";
3
+ import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createTextVNode as s, createVNode as c, defineComponent as l, onMounted as u, openBlock as d, ref as f, resolveComponent as p } from "vue";
4
+ import { Question as m, RadioMultipleChoice as h, useQuestionView as g, useViewable as _ } from "@vue-skuilder/common-ui";
5
+ import { DataShapeName as v, FieldType as y, Status as b } from "@vue-skuilder/common";
6
+ //#region src/pitch/questions/indentify/textBox.vue?vue&type=script&lang.ts
7
+ var x = l({
8
+ name: "IdentifyChroma",
9
+ components: { RadioMultipleChoice: h },
10
+ props: {
11
+ data: {
12
+ type: Array,
13
+ required: !0
14
+ },
15
+ modifyDifficulty: {
16
+ type: Number,
17
+ required: !1,
18
+ default: 0
19
+ }
20
+ },
21
+ setup(e, { emit: t }) {
22
+ let n = _(e, t, "IdentifyChroma"), r = g(n), a = f(""), o = f(new AudioContext());
23
+ r.question.value = new E(e.data);
24
+ let s = i(() => r.question.value), octaves = (e) => {
25
+ let t = [], n = e / 2;
26
+ for (; n > 100;) t.push(n), n /= 2;
27
+ t.push(e);
28
+ let r = e * 2;
29
+ for (; r < 5e3;) t.push(r), r *= 2;
30
+ return t;
31
+ }, tone = (e) => {
32
+ let t = o.value.createOscillator();
33
+ t.type = "sine", t.frequency.value = e;
34
+ let n = o.value.createGain();
35
+ console.log("Max Gain: " + n.gain.maxValue), n.gain.setValueAtTime(0, 0), n.gain.linearRampToValueAtTime(.5, 15), t.connect(n), n.connect(o.value.destination), t.start(0), t.stop(14);
36
+ };
37
+ u(() => {
38
+ octaves(295).forEach((e) => tone(e));
39
+ });
40
+ let submit = () => {
41
+ s.value && s.value.isCorrect(a.value);
42
+ };
43
+ return {
44
+ ...n,
45
+ ...r,
46
+ answer: a,
47
+ question: s,
48
+ submit
49
+ };
50
+ }
51
+ }), S = { "data-viewable": "IdentifyChroma" };
52
+ function _sfc_render(e, t, n, i, l, u) {
53
+ let f = p("radio-multiple-choice");
54
+ return d(), o("div", S, [e.question ? (d(), o(r, { key: 0 }, [t[0] ||= s(" What note is being played? "), c(f, { "choice-list": e.question.choiceList }, null, 8, ["choice-list"])], 64)) : a("", !0)]);
55
+ }
56
+ var C = /* @__PURE__ */ e(x, [["render", _sfc_render]]), w = /* @__PURE__ */ function(e) {
57
+ return e.A = "A", e.B = "B", e.C = "C", e.D = "D", e.E = "E", e.F = "F", e.G = "G", e;
58
+ }(w || {}), T = [{
59
+ name: "Chroma",
60
+ type: y.STRING,
61
+ validator: {
62
+ test: (e) => Object.values(w).includes(e) ? {
63
+ status: b.ok,
64
+ msg: ""
65
+ } : {
66
+ status: b.error,
67
+ msg: "That's not a chroma!"
68
+ },
69
+ instructions: "Enter a valid musical note (A-G)"
70
+ }
71
+ }], E = class ChromaQuestion extends m {
72
+ static dataShapes = [{
73
+ fields: T,
74
+ name: v.PITCH_chroma
75
+ }];
76
+ static views = [C];
77
+ chroma;
78
+ constructor(e) {
79
+ super(e), this.chroma = e[0].Chroma;
80
+ }
81
+ get baseFreq() {
82
+ return this.chroma === "A" ? 440 : this.chroma === "B" ? 440 * 2 ** (2 / 12) : this.chroma === "C" ? 440 * 2 ** (3 / 12) : 440;
83
+ }
84
+ get choiceList() {
85
+ return t([
86
+ this.chroma.toString(),
87
+ "test",
88
+ "options",
89
+ "are",
90
+ "fun"
91
+ ]);
92
+ }
93
+ isCorrect(e) {
94
+ return e.choiceList[e.selection] === this.chroma.toString();
95
+ }
96
+ dataShapes() {
97
+ return ChromaQuestion.dataShapes;
98
+ }
99
+ views() {
100
+ return ChromaQuestion.views;
101
+ }
102
+ }, D = new n("pitch", [E]);
103
+ //#endregion
104
+ export { D as t };
105
+
106
+ //# sourceMappingURL=pitch-CgGJFkZ1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pitch-CgGJFkZ1.js","names":[],"sources":["../src/pitch/questions/indentify/textBox.vue","../src/pitch/questions/indentify/textBox.vue","../src/pitch/questions/indentify/index.ts","../src/pitch/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"IdentifyChroma\">\n <template v-if=\"question\">\n What note is being played?\n <radio-multiple-choice :choice-list=\"question.choiceList\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { ChromaQuestion } from './index';\nimport { useViewable, useQuestionView, RadioMultipleChoice } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyChroma',\n\n components: {\n RadioMultipleChoice,\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, 'IdentifyChroma');\n const questionUtils = useQuestionView<ChromaQuestion>(viewableUtils);\n\n const answer = ref('');\n const ctx = ref(new AudioContext());\n\n // Initialize question immediately\n questionUtils.question.value = new ChromaQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const octaves = (freq: number): number[] => {\n const ret: number[] = [];\n let lowerFreq: number = freq / 2;\n while (lowerFreq > 100) {\n ret.push(lowerFreq);\n lowerFreq /= 2;\n }\n ret.push(freq);\n let above: number = freq * 2;\n while (above < 5000) {\n ret.push(above);\n above *= 2;\n }\n return ret;\n };\n\n const tone = (freq: number) => {\n const osc = ctx.value.createOscillator();\n osc.type = 'sine';\n osc.frequency.value = freq;\n\n const g = ctx.value.createGain();\n console.log('Max Gain: ' + g.gain.maxValue);\n g.gain.setValueAtTime(0, 0);\n g.gain.linearRampToValueAtTime(0.5, 15);\n\n osc.connect(g);\n g.connect(ctx.value.destination);\n\n osc.start(0);\n osc.stop(14);\n };\n\n onMounted(() => {\n octaves(295).forEach((t) => tone(t));\n });\n\n const submit = () => {\n if (question.value) {\n question.value.isCorrect(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=\"IdentifyChroma\">\n <template v-if=\"question\">\n What note is being played?\n <radio-multiple-choice :choice-list=\"question.choiceList\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { ChromaQuestion } from './index';\nimport { useViewable, useQuestionView, RadioMultipleChoice } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'IdentifyChroma',\n\n components: {\n RadioMultipleChoice,\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, 'IdentifyChroma');\n const questionUtils = useQuestionView<ChromaQuestion>(viewableUtils);\n\n const answer = ref('');\n const ctx = ref(new AudioContext());\n\n // Initialize question immediately\n questionUtils.question.value = new ChromaQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const octaves = (freq: number): number[] => {\n const ret: number[] = [];\n let lowerFreq: number = freq / 2;\n while (lowerFreq > 100) {\n ret.push(lowerFreq);\n lowerFreq /= 2;\n }\n ret.push(freq);\n let above: number = freq * 2;\n while (above < 5000) {\n ret.push(above);\n above *= 2;\n }\n return ret;\n };\n\n const tone = (freq: number) => {\n const osc = ctx.value.createOscillator();\n osc.type = 'sine';\n osc.frequency.value = freq;\n\n const g = ctx.value.createGain();\n console.log('Max Gain: ' + g.gain.maxValue);\n g.gain.setValueAtTime(0, 0);\n g.gain.linearRampToValueAtTime(0.5, 15);\n\n osc.connect(g);\n g.connect(ctx.value.destination);\n\n osc.start(0);\n osc.stop(14);\n };\n\n onMounted(() => {\n octaves(295).forEach((t) => tone(t));\n });\n\n const submit = () => {\n if (question.value) {\n question.value.isCorrect(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 { DataShape, FieldDefinition } from '@vue-skuilder/common';\nimport { ViewData, DataShapeName, FieldType, Status, Answer } from '@vue-skuilder/common';\nimport TextBox from './textBox.vue';\nimport { shuffle } from '@courseware/math/utility';\n\nenum Chroma {\n A = 'A',\n B = 'B',\n C = 'C',\n D = 'D',\n E = 'E',\n F = 'F',\n G = 'G',\n}\n\nconst fields: FieldDefinition[] = [\n {\n name: 'Chroma',\n type: FieldType.STRING,\n validator: {\n test: (value) => {\n // Check if the value is a valid Chroma enum value\n if (Object.values(Chroma).includes(value as Chroma)) {\n return {\n status: Status.ok,\n msg: '',\n };\n }\n return {\n status: Status.error,\n msg: \"That's not a chroma!\",\n };\n },\n instructions: 'Enter a valid musical note (A-G)',\n },\n },\n];\n\nexport class ChromaQuestion extends Question {\n public static dataShapes: DataShape[] = [\n {\n fields,\n name: DataShapeName.PITCH_chroma,\n },\n ];\n\n public static views = [TextBox];\n\n public chroma: Chroma;\n\n constructor(data: ViewData[]) {\n super(data);\n\n this.chroma = data[0].Chroma as Chroma;\n }\n public get baseFreq(): number {\n const aFreq = 440;\n\n if (this.chroma === 'A') return aFreq;\n else if (this.chroma === 'B') return aFreq * Math.pow(2, 2 / 12);\n else if (this.chroma === 'C') {\n return aFreq * Math.pow(2, 3 / 12);\n }\n\n return aFreq;\n }\n\n public get choiceList(): string[] {\n return shuffle([this.chroma.toString(), 'test', 'options', 'are', 'fun']);\n }\n\n public isCorrect(answer: Answer): boolean {\n // alert(JSON.stringify(answer));\n return (answer as any).choiceList[(answer as any).selection] === this.chroma.toString();\n }\n public dataShapes(): DataShape[] {\n return ChromaQuestion.dataShapes;\n }\n public views() {\n return ChromaQuestion.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { ChromaQuestion } from './questions/indentify';\n\nconst pitch: CourseWare = new CourseWare('pitch', [ChromaQuestion]);\n\nexport default pitch;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import "./CourseWare-BTFRjgBR.js";
2
+ import { t as e } from "./pitch-CgGJFkZ1.js";
3
+ export { e as default };
@@ -0,0 +1 @@
1
+ require(`./CourseWare-DSeyTAtH.cjs`);const e=require(`./pitch-C-lh9ezH.cjs`);exports.default=e.t;
@@ -24,26 +24,8 @@ var n = Object.create, r = Object.defineProperty, __name = (e, t) => r(e, "name"
24
24
  name: "Uploads",
25
25
  type: t.MEDIA_UPLOADS
26
26
  }]
27
- }], u = {
28
- name: e.MATH_SingleDigitAddition,
29
- fields: [{
30
- name: "a",
31
- type: t.INT
32
- }, {
33
- name: "b",
34
- type: t.INT
35
- }]
36
- }, d = {
37
- name: e.MATH_EqualityTest,
38
- fields: [{
39
- name: "a",
40
- type: t.STRING
41
- }, {
42
- name: "b",
43
- type: t.STRING
44
- }]
45
- };
27
+ }];
46
28
  //#endregion
47
- export { __name as a, __commonJSMin as i, u as n, c as o, l as r, __toESM as s, d as t };
29
+ export { __toESM as a, c as i, __commonJSMin as n, __name as r, l as t };
48
30
 
49
- //# sourceMappingURL=shapes-nszfsx3o.js.map
31
+ //# sourceMappingURL=shapes-BQUVJdp5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes-BQUVJdp5.js","names":[],"sources":["../src/default/questions/fillIn/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];"],"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"}
@@ -0,0 +1,2 @@
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}]}];Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return __toESM}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return __commonJSMin}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return __name}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
2
+ //# sourceMappingURL=shapes-C_-mvrCc.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes-C_-mvrCc.cjs","names":[],"sources":["../src/default/questions/fillIn/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];"],"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"}
@@ -0,0 +1,2 @@
1
+ require(`./shapes-C_-mvrCc.cjs`);let e=require(`@vue-skuilder/common`);var t={name:e.DataShapeName.MATH_SingleDigitAddition,fields:[{name:`a`,type:e.FieldType.INT},{name:`b`,type:e.FieldType.INT}]},n={name:e.DataShapeName.MATH_EqualityTest,fields:[{name:`a`,type:e.FieldType.STRING},{name:`b`,type:e.FieldType.STRING}]};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=shapes-DRq8J94A.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes-DRq8J94A.cjs","names":[],"sources":["../src/math/questions/addition/shapes.ts","../src/math/questions/equalityTest/shapes.ts"],"sourcesContent":["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":"uEAEA,IAAa,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"}
@@ -0,0 +1,25 @@
1
+ import { DataShapeName as e, FieldType as t } from "@vue-skuilder/common";
2
+ //#region src/math/questions/addition/shapes.ts
3
+ var n = {
4
+ name: e.MATH_SingleDigitAddition,
5
+ fields: [{
6
+ name: "a",
7
+ type: t.INT
8
+ }, {
9
+ name: "b",
10
+ type: t.INT
11
+ }]
12
+ }, r = {
13
+ name: e.MATH_EqualityTest,
14
+ fields: [{
15
+ name: "a",
16
+ type: t.STRING
17
+ }, {
18
+ name: "b",
19
+ type: t.STRING
20
+ }]
21
+ };
22
+ //#endregion
23
+ export { n, r as t };
24
+
25
+ //# sourceMappingURL=shapes-ICeg46lr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes-ICeg46lr.js","names":[],"sources":["../src/math/questions/addition/shapes.ts","../src/math/questions/equalityTest/shapes.ts"],"sourcesContent":["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":";;AAEA,IAAa,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"}