@pie-element/simple-cloze 0.1.4-next.3 → 0.1.4-next.4

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 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/controller/defaults.ts","../../../src/controller/index.ts"],"sourcesContent":["export default {\n model: {\n prompt: '<p>Enter your answer:</p>',\n promptEnabled: true,\n correctAnswer: '',\n },\n configuration: {\n prompt: {\n label: 'Prompt',\n settings: true,\n },\n },\n};\n","import defaults from './defaults';\n\nconst isEmptySession = (session: unknown) =>\n !session || (typeof session === 'object' && Object.keys(session).length === 0);\n\nexport const getCorrectness = (question: any, session: any) => {\n if (!session?.response) {\n return 'unanswered';\n }\n\n const correctAnswer = question?.correctAnswer || '';\n const userAnswer = session.response || '';\n\n // Simple string comparison for now\n if (userAnswer.trim().toLowerCase() === correctAnswer.trim().toLowerCase()) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const getPartialScore = (_question: any, session: any) => {\n if (isEmptySession(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question: any, session: any, env: any) =>\n new Promise((resolve) => {\n if (isEmptySession(session)) {\n resolve({ score: 0, empty: true });\n return;\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, session);\n const score = correctness === 'correct' ? 1 : 0;\n resolve({ score });\n }\n });\n\nexport const createDefaultModel = (model: any = {}) => ({ ...defaults.model, ...model });\n\nexport const normalizeSession = (s: any) => ({ ...s });\n\nexport const model = (question: any, session: any, env: any) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n\n const out: any = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n env,\n };\n\n if (env.mode === 'evaluate') {\n const correctness = getCorrectness(normalizedQuestion, session);\n out.correctness = correctness;\n out.correctAnswer = normalizedQuestion.correctAnswer;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question: any, env: any) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1', response: question.correctAnswer || '' });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model: any = {}, _config: any = {}) => {\n const errors: any = {};\n\n if (!model.prompt || model.prompt.trim() === '' || model.prompt === '<p></p>') {\n errors.prompt = 'Prompt is required';\n }\n\n return errors;\n};\n"],"mappings":";AAAA,IAAA,IAAe;CACb,OAAO;EACL,QAAQ;EACR,eAAe;EACf,eAAe;CACjB;CACA,eAAe,EACb,QAAQ;EACN,OAAO;EACP,UAAU;CACZ,EACF;AACF,GCVM,KAAkB,MACtB,CAAC,KAAY,OAAO,KAAY,YAAY,OAAO,KAAK,CAAO,EAAE,WAAW,GAEjE,KAAkB,GAAe,MAAiB;CAC7D,IAAI,CAAC,GAAS,UACZ,OAAO;CAGT,IAAM,IAAgB,GAAU,iBAAiB;CAQjD,QAPmB,EAAQ,YAAY,IAGxB,KAAK,EAAE,YAAY,MAAM,EAAc,KAAK,EAAE,YAAY,IAChE,YAGF;AACT,GAEa,KAAmB,GAAgB,MAC9C,EAAI,EAAe,CAAO,GAOf,KAAW,GAAe,GAAc,MACnD,IAAI,SAAS,MAAY;CACvB,IAAI,EAAe,CAAO,GAAG;EAC3B,EAAQ;GAAE,OAAO;GAAG,OAAO;EAAK,CAAC;EACjC;CACF;CAIA,AAFA,IAAU,EAAiB,CAAO,GAE9B,EAAI,SAAS,aAKf,EAAQ,EAAE,OAFU,IAAe,GAAU,CAC/B,MAAgB,WACd,CAAC,IAJjB,EAAQ;EAAE,OAAO,KAAA;EAAW,WAAW,KAAA;CAAU,CAAC;AAMtD,CAAC,GAEU,KAAsB,IAAa,CAAC,OAAO;CAAE,GAAG,EAAS;CAAO,GAAG;AAAM,IAEzE,KAAoB,OAAY,EAAE,GAAG,EAAE,IAEvC,KAAS,GAAe,GAAc,MAC1C,IAAI,SAAS,MAAY;CAC9B,MAAqB,CAAC;CACtB,IAAM,IAAqB,EAAmB,CAAQ,GAEhD,IAAW;EACf,QAAQ,EAAmB,gBAAgB,EAAmB,SAAS;EACvE,UAAU,EAAI,SAAS;EACvB,MAAM,EAAI,SAAS;EACnB;CACF;CAgBA,AAdI,EAAI,SAAS,eAEf,EAAI,cADgB,EAAe,GAAoB,CACrC,GAClB,EAAI,gBAAgB,EAAmB,gBAGrC,EAAI,SAAS,iBAAiB,EAAI,SAAS,UAAU,EAAI,SAAS,cACpE,EAAI,sBAAsB,EAAmB,6BACzC,EAAmB,sBACnB,OAEJ,EAAI,sBAAsB,MAG5B,EAAQ,CAAG;AACb,CAAC,GAGU,KAAgC,GAAe,MACnD,IAAI,SAAS,MAAY;CAC9B,AAAI,EAAI,SAAS,cAAc,EAAI,SAAS,eAC1C,EAAQ;EAAE,IAAI;EAAK,UAAU,EAAS,iBAAiB;CAAG,CAAC,IAE3D,EAAQ,IAAI;AAEhB,CAAC,GAGU,KAAY,IAAa,CAAC,GAAG,IAAe,CAAC,MAAM;CAC9D,IAAM,IAAc,CAAC;CAMrB,QAJI,CAAC,EAAM,UAAU,EAAM,OAAO,KAAK,MAAM,MAAM,EAAM,WAAW,eAClE,EAAO,SAAS,uBAGX;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/controller/defaults.ts","../../../src/controller/index.ts"],"sourcesContent":["export default {\n model: {\n prompt: '<p>Enter your answer:</p>',\n promptEnabled: true,\n correctAnswer: '',\n },\n configuration: {\n prompt: {\n label: 'Prompt',\n settings: true,\n },\n },\n};\n","import defaults from './defaults';\n\nconst isEmptySession = (session: unknown) =>\n !session || (typeof session === 'object' && Object.keys(session).length === 0);\n\nexport const getCorrectness = (question: any, session: any) => {\n if (!session?.response) {\n return 'unanswered';\n }\n\n const correctAnswer = question?.correctAnswer || '';\n const userAnswer = session.response || '';\n\n // Simple string comparison for now\n if (userAnswer.trim().toLowerCase() === correctAnswer.trim().toLowerCase()) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const getPartialScore = (_question: any, session: any) => {\n if (isEmptySession(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question: any, session: any, env: any) =>\n new Promise((resolve) => {\n if (isEmptySession(session)) {\n resolve({ score: 0, empty: true });\n return;\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, session);\n const score = correctness === 'correct' ? 1 : 0;\n resolve({ score });\n }\n });\n\nexport const createDefaultModel = (model: any = {}) => ({ ...defaults.model, ...model });\n\nexport const normalizeSession = (s: any) => ({ ...s });\n\nexport const model = (question: any, session: any, env: any) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n\n const out: any = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n env,\n };\n\n if (env.mode === 'evaluate') {\n const correctness = getCorrectness(normalizedQuestion, session);\n out.correctness = correctness;\n out.correctAnswer = normalizedQuestion.correctAnswer;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question: any, env: any) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1', response: question.correctAnswer || '' });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model: any = {}, _config: any = {}) => {\n const errors: any = {};\n\n if (!model.prompt || model.prompt.trim() === '' || model.prompt === '<p></p>') {\n errors.prompt = 'Prompt is required';\n }\n\n return errors;\n};\n"],"mappings":";AAAA,IAAA,IAAe;CACb,OAAO;EACL,QAAQ;EACR,eAAe;EACf,eAAe;CACjB;CACA,eAAe,EACb,QAAQ;EACN,OAAO;EACP,UAAU;CACZ,EACF;AACF,GCVM,KAAkB,MACtB,CAAC,KAAY,OAAO,KAAY,YAAY,OAAO,KAAK,CAAO,CAAC,CAAC,WAAW,GAEjE,KAAkB,GAAe,MAAiB;CAC7D,IAAI,CAAC,GAAS,UACZ,OAAO;CAGT,IAAM,IAAgB,GAAU,iBAAiB;CAQjD,QAPmB,EAAQ,YAAY,GAAA,CAGxB,KAAK,CAAC,CAAC,YAAY,MAAM,EAAc,KAAK,CAAC,CAAC,YAAY,IAChE,YAGF;AACT,GAEa,KAAmB,GAAgB,MAC9C,EAAI,EAAe,CAAO,GAOf,KAAW,GAAe,GAAc,MACnD,IAAI,SAAS,MAAY;CACvB,IAAI,EAAe,CAAO,GAAG;EAC3B,EAAQ;GAAE,OAAO;GAAG,OAAO;EAAK,CAAC;EACjC;CACF;CAIA,AAFA,IAAU,EAAiB,CAAO,GAE9B,EAAI,SAAS,aAKf,EAAQ,EAAE,OAFU,IAAe,GAAU,CAC/B,MAAgB,WACd,CAAC,IAJjB,EAAQ;EAAE,OAAO,KAAA;EAAW,WAAW,KAAA;CAAU,CAAC;AAMtD,CAAC,GAEU,KAAsB,IAAa,CAAC,OAAO;CAAE,GAAG,EAAS;CAAO,GAAG;AAAM,IAEzE,KAAoB,OAAY,EAAE,GAAG,EAAE,IAEvC,KAAS,GAAe,GAAc,MAC1C,IAAI,SAAS,MAAY;CAC9B,MAAqB,CAAC;CACtB,IAAM,IAAqB,EAAmB,CAAQ,GAEhD,IAAW;EACf,QAAQ,EAAmB,gBAAgB,EAAmB,SAAS;EACvE,UAAU,EAAI,SAAS;EACvB,MAAM,EAAI,SAAS;EACnB;CACF;CAgBA,AAdI,EAAI,SAAS,eAEf,EAAI,cADgB,EAAe,GAAoB,CACrC,GAClB,EAAI,gBAAgB,EAAmB,gBAGrC,EAAI,SAAS,iBAAiB,EAAI,SAAS,UAAU,EAAI,SAAS,cACpE,EAAI,sBAAsB,EAAmB,6BACzC,EAAmB,sBACnB,OAEJ,EAAI,sBAAsB,MAG5B,EAAQ,CAAG;AACb,CAAC,GAGU,KAAgC,GAAe,MACnD,IAAI,SAAS,MAAY;CAC9B,AAAI,EAAI,SAAS,cAAc,EAAI,SAAS,eAC1C,EAAQ;EAAE,IAAI;EAAK,UAAU,EAAS,iBAAiB;CAAG,CAAC,IAE3D,EAAQ,IAAI;AAEhB,CAAC,GAGU,KAAY,IAAa,CAAC,GAAG,IAAe,CAAC,MAAM;CAC9D,IAAM,IAAc,CAAC;CAMrB,QAJI,CAAC,EAAM,UAAU,EAAM,OAAO,KAAK,MAAM,MAAM,EAAM,WAAW,eAClE,EAAO,SAAS,uBAGX;AACT"}
@@ -1,4 +1,4 @@
1
- import { A as e, C as t, E as n, F as r, L as i, M as a, O as o, P as s, S as c, T as l, _ as u, b as d, c as f, d as p, f as m, g as h, h as g, i as _, j as v, o as y, r as b, t as x, u as S, w as C, x as w, y as T } from "../client-Cas_f5u-.js";
1
+ import { C as e, E as t, F as n, I as r, M as i, O as a, P as o, R as s, S as c, T as l, _ as u, b as d, c as f, d as p, f as m, g as h, h as ee, i as g, j as _, k as v, o as y, r as b, t as x, u as S, w as C, x as w, y as T } from "../client-Dt8SOe5Z.js";
2
2
  //#region ../../lib-svelte/delivery-events/dist/index2.js
3
3
  var E = class e extends CustomEvent {
4
4
  static {
@@ -51,7 +51,7 @@ function A({ sourceEl: e, fallbackSelector: t, component: n, complete: r, sessio
51
51
  }
52
52
  //#endregion
53
53
  //#region src/delivery/SimpleCloze.svelte
54
- var j = new Set([
54
+ var j = /* @__PURE__ */ new Set([
55
55
  "$$slots",
56
56
  "$$events",
57
57
  "$$legacy",
@@ -62,16 +62,16 @@ var j = new Set([
62
62
  };
63
63
  function B(d, x) {
64
64
  r(x, !0), S(d, z), b(x, j);
65
- let w = null, T = v(!1);
66
- g(() => (w && (w.value = x?.session?.response || "", w.addEventListener("input", E)), () => {
65
+ let w = null, T = i(!1);
66
+ ee(() => (w && (w.value = x?.session?.response || "", w.addEventListener("input", E)), () => {
67
67
  w && w.removeEventListener("input", E);
68
68
  })), l(() => {
69
- if (w && !t(T)) {
69
+ if (w && !e(T)) {
70
70
  let e = x?.session?.response || "";
71
71
  w.value !== e && (w.value = e);
72
72
  }
73
73
  }), l(() => {
74
- w && (t(T) && x?.model?.correctAnswer ? w.value = x.model.correctAnswer : t(T) || (w.value = x?.session?.response || ""));
74
+ w && (e(T) && x?.model?.correctAnswer ? w.value = x.model.correctAnswer : e(T) || (w.value = x?.session?.response || ""));
75
75
  });
76
76
  function E(e) {
77
77
  let t = e.target, n = t.value;
@@ -87,53 +87,53 @@ function B(d, x) {
87
87
  });
88
88
  }
89
89
  function D() {
90
- e(T, !t(T));
90
+ _(T, !e(T));
91
91
  }
92
- let O = a(() => x?.model?.env?.mode === "evaluate"), k = a(() => x?.model?.correctness), B = a(() => t(k) === "correct"), V = a(() => t(k) === "incorrect");
93
- var H = R(), U = n(H), W = (e) => {
92
+ let O = o(() => x?.model?.env?.mode === "evaluate"), k = o(() => x?.model?.correctness), B = o(() => e(k) === "correct"), V = o(() => e(k) === "incorrect");
93
+ var H = R(), U = t(H), W = (e) => {
94
94
  var t = M();
95
- p(t, () => x.model.prompt, !0), i(t), u(e, t);
95
+ p(t, () => x.model.prompt, !0), s(t), u(e, t);
96
96
  };
97
97
  m(U, (e) => {
98
98
  x?.model?.prompt && e(W);
99
99
  });
100
- var G = o(U, 2), K = (e) => {
101
- var r = F(), a = n(r), s = (e) => {
100
+ var G = v(U, 2), K = (n) => {
101
+ var r = F(), i = t(r), o = (e) => {
102
102
  u(e, N());
103
103
  }, l = (e) => {
104
104
  u(e, P());
105
105
  };
106
- m(a, (e) => {
107
- t(T) ? e(s) : e(l, -1);
106
+ m(i, (t) => {
107
+ e(T) ? t(o) : t(l, -1);
108
108
  });
109
- var d = o(a, 2), f = n(d);
110
- i(d), i(r), C(() => {
111
- y(r, "aria-pressed", t(T)), h(f, `${t(T) ? "Hide" : "Show"} correct answer`);
112
- }), c("click", r, D), u(e, r);
109
+ var d = a(v(i, 2));
110
+ s(r), C(() => {
111
+ y(r, "aria-pressed", e(T)), h(d, `${e(T) ? "Hide" : "Show"} correct answer`);
112
+ }), c("click", r, D), u(n, r);
113
113
  };
114
- m(G, (e) => {
115
- t(O) && t(V) && e(K);
114
+ m(G, (t) => {
115
+ e(O) && e(V) && t(K);
116
116
  });
117
- var q = o(G, 2), J = n(q), Y = (e) => {
117
+ var q = v(G, 2), J = t(q), Y = (e) => {
118
118
  u(e, I());
119
119
  };
120
- m(J, (e) => {
121
- t(O) && (t(B) || t(T)) && e(Y);
120
+ m(J, (t) => {
121
+ e(O) && (e(B) || e(T)) && t(Y);
122
122
  });
123
- var X = o(J, 2), Z = (e) => {
123
+ var X = v(J, 2), Z = (e) => {
124
124
  u(e, L());
125
125
  };
126
- m(X, (e) => {
127
- t(O) && t(V) && !t(T) && e(Z);
126
+ m(X, (t) => {
127
+ e(O) && e(V) && !e(T) && t(Z);
128
128
  });
129
- var Q = o(X, 2);
129
+ var Q = v(X, 2);
130
130
  let $;
131
- _(Q, (e) => w = e, () => w), i(q), i(H), C(() => {
132
- Q.disabled = x?.model?.disabled, Q.readOnly = t(T), $ = f(Q, "", $, {
133
- border: t(O) && (t(B) || t(T)) ? "solid 2px #0EA449" : t(O) && t(V) && !t(T) ? "solid 2px #BF0D00" : "solid 1px #d1d5db",
134
- color: t(O) && (t(B) || t(V)) ? "black" : ""
131
+ g(Q, (e) => w = e, () => w), s(q), s(H), C(() => {
132
+ Q.disabled = x?.model?.disabled, Q.readOnly = e(T), $ = f(Q, "", $, {
133
+ border: e(O) && (e(B) || e(T)) ? "solid 2px #0EA449" : e(O) && e(V) && !e(T) ? "solid 2px #BF0D00" : "solid 1px #d1d5db",
134
+ color: e(O) && (e(B) || e(V)) ? "black" : ""
135
135
  });
136
- }), u(d, H), s();
136
+ }), u(d, H), n();
137
137
  }
138
138
  w(["click"]), x(B, {
139
139
  model: { type: "Object" },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["t","e"],"sources":["../../../../../lib-svelte/delivery-events/dist/index2.js","../../../../../lib-svelte/delivery-events/dist/index3.js","../../../src/delivery/SimpleCloze.svelte","../../../src/delivery/index.ts"],"sourcesContent":["//#region ../../shared/player-events/dist/index.js\nvar e = class e extends CustomEvent {\n\tstatic {\n\t\tthis.TYPE = \"model-set\";\n\t}\n\tconstructor(t, n, r) {\n\t\tsuper(e.TYPE, {\n\t\t\tbubbles: !0,\n\t\t\tcomposed: !0,\n\t\t\tdetail: {\n\t\t\t\tcomplete: n,\n\t\t\t\tcomponent: t,\n\t\t\t\thasModel: r\n\t\t\t}\n\t\t}), this.component = t, this.complete = n;\n\t}\n}, t = class e extends CustomEvent {\n\tstatic {\n\t\tthis.TYPE = \"session-changed\";\n\t}\n\tconstructor(t, n) {\n\t\tsuper(e.TYPE, {\n\t\t\tbubbles: !0,\n\t\t\tcomposed: !0,\n\t\t\tdetail: {\n\t\t\t\tcomplete: n,\n\t\t\t\tcomponent: t\n\t\t\t}\n\t\t}), this.component = t, this.complete = n;\n\t}\n};\n//#endregion\nexport { e, t };\n","import { t as e } from \"./index2.js\";\n//#region src/session-bridge.ts\nvar t = (e) => {\n\tlet t = e;\n\treturn t ? typeof t.onSessionChange == \"function\" || typeof t.onAudioStarted == \"function\" || typeof t.onAudioEnded == \"function\" : !1;\n};\nfunction n(e, n = {}) {\n\tlet r = n.hostPredicate ?? t, i = e;\n\tfor (; i;) {\n\t\tif (r(i)) return i;\n\t\ti = i.parentElement;\n\t}\n\tif (typeof document < \"u\" && n.fallbackSelector) {\n\t\tlet e = document.querySelector(n.fallbackSelector);\n\t\tif (r(e)) return e;\n\t}\n\treturn null;\n}\nfunction r({ sourceEl: t, fallbackSelector: r, component: i, complete: a, session: o }) {\n\tlet s = n(t, { fallbackSelector: r });\n\treturn s ? typeof s.onSessionChange == \"function\" ? (s.onSessionChange(o), s) : (s.dispatchEvent(new e(i, a)), s) : null;\n}\n//#endregion\nexport { r as forwardSessionChange, n as resolveDeliveryHost };\n","<svelte:options\n customElement={{\n shadow: 'none',\n props: {\n model: { type: 'Object' },\n session: { type: 'Object' }\n }\n }}\n/>\n\n<script lang=\"ts\">\nimport { onMount } from 'svelte';\nimport { forwardSessionChange } from '@pie-lib/delivery-events-svelte';\n\n// Props using $props() in Svelte 5 custom element mode\nlet props = $props<{ model?: any; session?: any }>();\n\nlet inputElement: HTMLInputElement | null = null;\nlet showCorrectAnswer = $state(false);\n\nonMount(() => {\n if (inputElement) {\n // Set initial value from session\n inputElement.value = props?.session?.response || '';\n\n inputElement.addEventListener('input', handleInput);\n }\n\n return () => {\n if (inputElement) {\n inputElement.removeEventListener('input', handleInput);\n }\n };\n});\n\n// Update input value when session changes externally\n$effect(() => {\n if (inputElement && !showCorrectAnswer) {\n const sessionValue = props?.session?.response || '';\n if (inputElement.value !== sessionValue) {\n inputElement.value = sessionValue;\n }\n }\n});\n\n// Update input value when showing correct answer\n$effect(() => {\n if (inputElement) {\n if (showCorrectAnswer && props?.model?.correctAnswer) {\n inputElement.value = props.model.correctAnswer;\n } else if (!showCorrectAnswer) {\n inputElement.value = props?.session?.response || '';\n }\n }\n});\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement;\n const newValue = target.value;\n\n // Replace the session object so host players can detect updates reliably.\n const updatedSession = {\n ...props.session,\n response: newValue,\n };\n\n forwardSessionChange({\n sourceEl: target,\n fallbackSelector: 'simple-cloze',\n component: 'simple-cloze',\n session: updatedSession,\n complete: newValue.trim().length > 0,\n });\n}\n\nfunction toggleCorrectAnswer() {\n showCorrectAnswer = !showCorrectAnswer;\n}\n\n// Computed values\nconst isEvaluateMode = $derived(props?.model?.env?.mode === 'evaluate');\nconst correctness = $derived(props?.model?.correctness);\nconst isCorrect = $derived(correctness === 'correct');\nconst isIncorrect = $derived(correctness === 'incorrect');\n</script>\n\n<div class=\"p-4\">\n {#if props?.model?.prompt}\n <div class=\"mb-4 prose\">{@html props.model.prompt}</div>\n {/if}\n\n {#if isEvaluateMode && isIncorrect}\n <button\n type=\"button\"\n class=\"mb-3 flex items-center gap-2 cursor-pointer select-none\"\n onclick={toggleCorrectAnswer}\n aria-pressed={showCorrectAnswer}\n >\n {#if showCorrectAnswer}\n <!-- Hide correct answer icon (open state) -->\n <svg style=\"width: 25px; height: 25px;\" preserveAspectRatio=\"xMinYMin meet\" version=\"1.1\" viewBox=\"-283 359 34 35\">\n <circle cx=\"-266\" cy=\"375.9\" r=\"14\" fill=\"#bce2ff\" />\n <path d=\"M-280.5,375.9c0-8,6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5s-6.5,14.5-14.5,14.5S-280.5,383.9-280.5,375.9z M-279.5,375.9c0,7.4,6.1,13.5,13.5,13.5c7.4,0,13.5-6.1,13.5-13.5s-6.1-13.5-13.5-13.5C-273.4,362.4-279.5,368.5-279.5,375.9z\" fill=\"#bce2ff\" />\n <polygon points=\"-265.4,383.1 -258.6,377.2 -261.2,374.2 -264.3,376.9 -268.9,368.7 -272.4,370.6\" fill=\"#1a9cff\" />\n </svg>\n {:else}\n <!-- Show correct answer icon (closed state) -->\n <svg style=\"width: 25px; height: 25px;\" preserveAspectRatio=\"xMinYMin meet\" version=\"1.1\" viewBox=\"-129.5 127 34 35\">\n <path style=\"fill: #D0CAC5; stroke: #E6E3E0; stroke-width: 0.75; stroke-miterlimit: 10;\" d=\"M-112.9,160.4c-8.5,0-15.5-6.9-15.5-15.5c0-8.5,6.9-15.5,15.5-15.5s15.5,6.9,15.5,15.5 C-97.4,153.5-104.3,160.4-112.9,160.4z\" />\n <path style=\"fill: #B3ABA4; stroke: #CDC7C2; stroke-width: 0.5; stroke-miterlimit: 10;\" d=\"M-113.2,159c-8,0-14.5-6.5-14.5-14.5s6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5S-105.2,159-113.2,159z\" />\n <circle cx=\"-114.2\" cy=\"143.5\" r=\"14\" fill=\"white\" />\n <path d=\"M-114.2,158c-8,0-14.5-6.5-14.5-14.5s6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5S-106.2,158-114.2,158z M-114.2,130c-7.4,0-13.5,6.1-13.5,13.5s6.1,13.5,13.5,13.5s13.5-6.1,13.5-13.5S-106.8,130-114.2,130z\" fill=\"#bce2ff\" />\n <polygon points=\"-114.8,150.7 -121.6,144.8 -119,141.8 -115.9,144.5 -111.3,136.3 -107.8,138.2\" fill=\"#1a9cff\" />\n </svg>\n {/if}\n <span class=\"text-sm hover:underline\">\n {showCorrectAnswer ? 'Hide' : 'Show'} correct answer\n </span>\n </button>\n {/if}\n\n <div class=\"relative inline-block\">\n {#if isEvaluateMode && (isCorrect || showCorrectAnswer)}\n <span class=\"correctness-icon\" style=\"background-color: #0EA449;\">\n <svg style=\"width: 12px; height: 12px; color: white;\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/>\n </svg>\n </span>\n {/if}\n {#if isEvaluateMode && isIncorrect && !showCorrectAnswer}\n <span class=\"correctness-icon\" style=\"background-color: #BF0D00;\">\n <svg style=\"width: 12px; height: 12px; color: white;\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/>\n </svg>\n </span>\n {/if}\n <input\n bind:this={inputElement}\n type=\"text\"\n placeholder=\"Enter your answer...\"\n disabled={props?.model?.disabled}\n readonly={showCorrectAnswer}\n class=\"outline-none px-3 py-2 rounded\"\n style:border={isEvaluateMode && (isCorrect || showCorrectAnswer) ? 'solid 2px #0EA449' : isEvaluateMode && isIncorrect && !showCorrectAnswer ? 'solid 2px #BF0D00' : 'solid 1px #d1d5db'}\n style:color={isEvaluateMode && (isCorrect || isIncorrect) ? 'black' : ''}\n />\n </div>\n</div>\n\n<style>\n /* Custom styles for correct answer display */\n input[readonly] {\n font-weight: 600;\n }\n\n .correctness-icon {\n position: absolute;\n top: -8px;\n left: -8px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 2px;\n }\n</style>\n","// Import the Svelte component compiled as custom element\nimport SimpleClozeComponent from './SimpleCloze.svelte';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-lib/delivery-events-svelte';\n\n// Get the base Svelte custom element class\nconst SvelteElementClass = (SimpleClozeComponent as any).element;\n\n// Create a wrapper that properly handles session updates\nclass SimpleClozeElement extends SvelteElementClass {\n _internalSession: any = null;\n _model: any = null;\n\n _isComplete = () => {\n const response = this._internalSession?.response;\n return typeof response === 'string' && response.trim().length > 0;\n };\n\n _dispatchModelSet = () => {\n this.dispatchEvent(\n new ModelSetEvent(this.tagName.toLowerCase(), this._isComplete(), this._model !== undefined)\n );\n };\n\n _dispatchSessionChanged = () => {\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this._isComplete()));\n };\n\n set model(m: any) {\n this._model = m;\n super.model = m;\n this._dispatchModelSet();\n }\n\n get model() {\n return this._model;\n }\n\n set session(s: any) {\n this._internalSession = s;\n super.session = s;\n this._dispatchSessionChanged();\n }\n\n get session() {\n return this._internalSession;\n }\n\n onSessionChange = (updatedSession: any) => {\n this._internalSession = updatedSession;\n super.session = updatedSession;\n this._dispatchSessionChanged();\n };\n\n connectedCallback() {\n super.connectedCallback();\n (this as any).onSessionChange = this.onSessionChange;\n }\n}\n\n// Export the custom element class\n// The demo loader will register it with customElements.define()\nexport default SimpleClozeElement;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["t","e"],"sources":["../../../../../lib-svelte/delivery-events/dist/index2.js","../../../../../lib-svelte/delivery-events/dist/index3.js","../../../src/delivery/SimpleCloze.svelte","../../../src/delivery/index.ts"],"sourcesContent":["//#region ../../shared/player-events/dist/index.js\nvar e = class e extends CustomEvent {\n\tstatic {\n\t\tthis.TYPE = \"model-set\";\n\t}\n\tconstructor(t, n, r) {\n\t\tsuper(e.TYPE, {\n\t\t\tbubbles: !0,\n\t\t\tcomposed: !0,\n\t\t\tdetail: {\n\t\t\t\tcomplete: n,\n\t\t\t\tcomponent: t,\n\t\t\t\thasModel: r\n\t\t\t}\n\t\t}), this.component = t, this.complete = n;\n\t}\n}, t = class e extends CustomEvent {\n\tstatic {\n\t\tthis.TYPE = \"session-changed\";\n\t}\n\tconstructor(t, n) {\n\t\tsuper(e.TYPE, {\n\t\t\tbubbles: !0,\n\t\t\tcomposed: !0,\n\t\t\tdetail: {\n\t\t\t\tcomplete: n,\n\t\t\t\tcomponent: t\n\t\t\t}\n\t\t}), this.component = t, this.complete = n;\n\t}\n};\n//#endregion\nexport { e as ModelSetEvent, t as SessionChangedEvent };\n","import { SessionChangedEvent as e } from \"./index2.js\";\n//#region src/session-bridge.ts\nvar t = (e) => {\n\tlet t = e;\n\treturn t ? typeof t.onSessionChange == \"function\" || typeof t.onAudioStarted == \"function\" || typeof t.onAudioEnded == \"function\" : !1;\n};\nfunction n(e, n = {}) {\n\tlet r = n.hostPredicate ?? t, i = e;\n\tfor (; i;) {\n\t\tif (r(i)) return i;\n\t\ti = i.parentElement;\n\t}\n\tif (typeof document < \"u\" && n.fallbackSelector) {\n\t\tlet e = document.querySelector(n.fallbackSelector);\n\t\tif (r(e)) return e;\n\t}\n\treturn null;\n}\nfunction r({ sourceEl: t, fallbackSelector: r, component: i, complete: a, session: o }) {\n\tlet s = n(t, { fallbackSelector: r });\n\treturn s ? typeof s.onSessionChange == \"function\" ? (s.onSessionChange(o), s) : (s.dispatchEvent(new e(i, a)), s) : null;\n}\n//#endregion\nexport { r as forwardSessionChange, n as resolveDeliveryHost };\n","<svelte:options\n customElement={{\n shadow: 'none',\n props: {\n model: { type: 'Object' },\n session: { type: 'Object' }\n }\n }}\n/>\n\n<script lang=\"ts\">\nimport { onMount } from 'svelte';\nimport { forwardSessionChange } from '@pie-lib/delivery-events-svelte';\n\n// Props using $props() in Svelte 5 custom element mode\nlet props = $props<{ model?: any; session?: any }>();\n\nlet inputElement: HTMLInputElement | null = null;\nlet showCorrectAnswer = $state(false);\n\nonMount(() => {\n if (inputElement) {\n // Set initial value from session\n inputElement.value = props?.session?.response || '';\n\n inputElement.addEventListener('input', handleInput);\n }\n\n return () => {\n if (inputElement) {\n inputElement.removeEventListener('input', handleInput);\n }\n };\n});\n\n// Update input value when session changes externally\n$effect(() => {\n if (inputElement && !showCorrectAnswer) {\n const sessionValue = props?.session?.response || '';\n if (inputElement.value !== sessionValue) {\n inputElement.value = sessionValue;\n }\n }\n});\n\n// Update input value when showing correct answer\n$effect(() => {\n if (inputElement) {\n if (showCorrectAnswer && props?.model?.correctAnswer) {\n inputElement.value = props.model.correctAnswer;\n } else if (!showCorrectAnswer) {\n inputElement.value = props?.session?.response || '';\n }\n }\n});\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement;\n const newValue = target.value;\n\n // Replace the session object so host players can detect updates reliably.\n const updatedSession = {\n ...props.session,\n response: newValue,\n };\n\n forwardSessionChange({\n sourceEl: target,\n fallbackSelector: 'simple-cloze',\n component: 'simple-cloze',\n session: updatedSession,\n complete: newValue.trim().length > 0,\n });\n}\n\nfunction toggleCorrectAnswer() {\n showCorrectAnswer = !showCorrectAnswer;\n}\n\n// Computed values\nconst isEvaluateMode = $derived(props?.model?.env?.mode === 'evaluate');\nconst correctness = $derived(props?.model?.correctness);\nconst isCorrect = $derived(correctness === 'correct');\nconst isIncorrect = $derived(correctness === 'incorrect');\n</script>\n\n<div class=\"p-4\">\n {#if props?.model?.prompt}\n <div class=\"mb-4 prose\">{@html props.model.prompt}</div>\n {/if}\n\n {#if isEvaluateMode && isIncorrect}\n <button\n type=\"button\"\n class=\"mb-3 flex items-center gap-2 cursor-pointer select-none\"\n onclick={toggleCorrectAnswer}\n aria-pressed={showCorrectAnswer}\n >\n {#if showCorrectAnswer}\n <!-- Hide correct answer icon (open state) -->\n <svg style=\"width: 25px; height: 25px;\" preserveAspectRatio=\"xMinYMin meet\" version=\"1.1\" viewBox=\"-283 359 34 35\">\n <circle cx=\"-266\" cy=\"375.9\" r=\"14\" fill=\"#bce2ff\" />\n <path d=\"M-280.5,375.9c0-8,6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5s-6.5,14.5-14.5,14.5S-280.5,383.9-280.5,375.9z M-279.5,375.9c0,7.4,6.1,13.5,13.5,13.5c7.4,0,13.5-6.1,13.5-13.5s-6.1-13.5-13.5-13.5C-273.4,362.4-279.5,368.5-279.5,375.9z\" fill=\"#bce2ff\" />\n <polygon points=\"-265.4,383.1 -258.6,377.2 -261.2,374.2 -264.3,376.9 -268.9,368.7 -272.4,370.6\" fill=\"#1a9cff\" />\n </svg>\n {:else}\n <!-- Show correct answer icon (closed state) -->\n <svg style=\"width: 25px; height: 25px;\" preserveAspectRatio=\"xMinYMin meet\" version=\"1.1\" viewBox=\"-129.5 127 34 35\">\n <path style=\"fill: #D0CAC5; stroke: #E6E3E0; stroke-width: 0.75; stroke-miterlimit: 10;\" d=\"M-112.9,160.4c-8.5,0-15.5-6.9-15.5-15.5c0-8.5,6.9-15.5,15.5-15.5s15.5,6.9,15.5,15.5 C-97.4,153.5-104.3,160.4-112.9,160.4z\" />\n <path style=\"fill: #B3ABA4; stroke: #CDC7C2; stroke-width: 0.5; stroke-miterlimit: 10;\" d=\"M-113.2,159c-8,0-14.5-6.5-14.5-14.5s6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5S-105.2,159-113.2,159z\" />\n <circle cx=\"-114.2\" cy=\"143.5\" r=\"14\" fill=\"white\" />\n <path d=\"M-114.2,158c-8,0-14.5-6.5-14.5-14.5s6.5-14.5,14.5-14.5s14.5,6.5,14.5,14.5S-106.2,158-114.2,158z M-114.2,130c-7.4,0-13.5,6.1-13.5,13.5s6.1,13.5,13.5,13.5s13.5-6.1,13.5-13.5S-106.8,130-114.2,130z\" fill=\"#bce2ff\" />\n <polygon points=\"-114.8,150.7 -121.6,144.8 -119,141.8 -115.9,144.5 -111.3,136.3 -107.8,138.2\" fill=\"#1a9cff\" />\n </svg>\n {/if}\n <span class=\"text-sm hover:underline\">\n {showCorrectAnswer ? 'Hide' : 'Show'} correct answer\n </span>\n </button>\n {/if}\n\n <div class=\"relative inline-block\">\n {#if isEvaluateMode && (isCorrect || showCorrectAnswer)}\n <span class=\"correctness-icon\" style=\"background-color: #0EA449;\">\n <svg style=\"width: 12px; height: 12px; color: white;\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/>\n </svg>\n </span>\n {/if}\n {#if isEvaluateMode && isIncorrect && !showCorrectAnswer}\n <span class=\"correctness-icon\" style=\"background-color: #BF0D00;\">\n <svg style=\"width: 12px; height: 12px; color: white;\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/>\n </svg>\n </span>\n {/if}\n <input\n bind:this={inputElement}\n type=\"text\"\n placeholder=\"Enter your answer...\"\n disabled={props?.model?.disabled}\n readonly={showCorrectAnswer}\n class=\"outline-none px-3 py-2 rounded\"\n style:border={isEvaluateMode && (isCorrect || showCorrectAnswer) ? 'solid 2px #0EA449' : isEvaluateMode && isIncorrect && !showCorrectAnswer ? 'solid 2px #BF0D00' : 'solid 1px #d1d5db'}\n style:color={isEvaluateMode && (isCorrect || isIncorrect) ? 'black' : ''}\n />\n </div>\n</div>\n\n<style>\n /* Custom styles for correct answer display */\n input[readonly] {\n font-weight: 600;\n }\n\n .correctness-icon {\n position: absolute;\n top: -8px;\n left: -8px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 2px;\n }\n</style>\n","// Import the Svelte component compiled as custom element\nimport SimpleClozeComponent from './SimpleCloze.svelte';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-lib/delivery-events-svelte';\n\n// Get the base Svelte custom element class\nconst SvelteElementClass = (SimpleClozeComponent as any).element;\n\n// Create a wrapper that properly handles session updates\nclass SimpleClozeElement extends SvelteElementClass {\n _internalSession: any = null;\n _model: any = null;\n\n _isComplete = () => {\n const response = this._internalSession?.response;\n return typeof response === 'string' && response.trim().length > 0;\n };\n\n _dispatchModelSet = () => {\n this.dispatchEvent(\n new ModelSetEvent(this.tagName.toLowerCase(), this._isComplete(), this._model !== undefined)\n );\n };\n\n _dispatchSessionChanged = () => {\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this._isComplete()));\n };\n\n set model(m: any) {\n this._model = m;\n super.model = m;\n this._dispatchModelSet();\n }\n\n get model() {\n return this._model;\n }\n\n set session(s: any) {\n this._internalSession = s;\n super.session = s;\n this._dispatchSessionChanged();\n }\n\n get session() {\n return this._internalSession;\n }\n\n onSessionChange = (updatedSession: any) => {\n this._internalSession = updatedSession;\n super.session = updatedSession;\n this._dispatchSessionChanged();\n };\n\n connectedCallback() {\n super.connectedCallback();\n (this as any).onSessionChange = this.onSessionChange;\n }\n}\n\n// Export the custom element class\n// The demo loader will register it with customElements.define()\nexport default SimpleClozeElement;\n"],"mappings":";;AACA,IAAI,IAAI,MAAM,UAAU,YAAY;CACnC;EACC,KAAK,OAAO;CACb;CACA,YAAY,GAAG,GAAG,GAAG;EACpB,MAAM,EAAE,MAAM;GACb,SAAS,CAAC;GACV,UAAU,CAAC;GACX,QAAQ;IACP,UAAU;IACV,WAAW;IACX,UAAU;GACX;EACD,CAAC,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW;CACzC;AACD,GAAGA,IAAI,MAAM,UAAU,YAAY;CAClC;EACC,KAAK,OAAO;CACb;CACA,YAAY,GAAG,GAAG;EACjB,MAAM,EAAE,MAAM;GACb,SAAS,CAAC;GACV,UAAU,CAAC;GACX,QAAQ;IACP,UAAU;IACV,WAAW;GACZ;EACD,CAAC,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW;CACzC;AACD,GC5BI,KAAK,MAAM;CACd,IAAI,IAAI;CACR,OAAO,IAAI,OAAO,EAAE,mBAAmB,cAAc,OAAO,EAAE,kBAAkB,cAAc,OAAO,EAAE,gBAAgB,aAAa,CAAC;AACtI;AACA,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG;CACrB,IAAI,IAAI,EAAE,iBAAiB,GAAG,IAAI;CAClC,OAAO,IAAI;EACV,IAAI,EAAE,CAAC,GAAG,OAAO;EACjB,IAAI,EAAE;CACP;CACA,IAAI,OAAO,WAAW,OAAO,EAAE,kBAAkB;EAChD,IAAI,IAAI,SAAS,cAAc,EAAE,gBAAgB;EACjD,IAAI,EAAE,CAAC,GAAG,OAAO;CAClB;CACA,OAAO;AACR;AACA,SAAS,EAAE,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,KAAK;CACvF,IAAI,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;CACpC,OAAO,IAAI,OAAO,EAAE,mBAAmB,cAAc,EAAE,gBAAgB,CAAC,GAAG,MAAM,EAAE,cAAc,IAAIC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK;AACrH;;;;;;;;;;;;iBCXA;CAKS,mBAAA,EAAA,GAAA,CAAA;CAET,IAAI,IAAwC,MACxC,IAAoB,EAAO,EAAK;CA4BpC,AA1BA,UACM,MAEF,EAAa,QAAK,GAAU,SAAS,YAAY,IAEjD,EAAa,iBAAiB,SAAS,CAAW,UAGvC;EACX,AAAI,KACF,EAAa,oBAAoB,SAAS,CAAW;CAEzD,EACD,GAGD,QAAc;EACZ,IAAI,KAAY,CAAA,EAAK,CAAiB,GAAE;GACtC,IAAM,IAAY,GAAU,SAAS,YAAY;GACjD,AAAI,EAAa,UAAU,MACzB,EAAa,QAAQ;EAEzB;CACF,CAAC,GAGD,QAAc;EACZ,AAAI,MACA,EAAE,CAAiB,KAAA,GAAW,OAAO,gBACrC,EAAa,QAAK,EAAS,MAAM,gBAC1B,EAAG,CAAiB,MAC3B,EAAa,QAAK,GAAU,SAAS,YAAY;CAGvD,CAAC;CAED,SAAS,EAAY,GAAc;EACjC,IAAM,IAAS,EAAM,QACf,IAAW,EAAO;EAQxB,EAAoB;GAClB,UAAU;GACV,kBAAkB;GAClB,WAAW;GACX,SAAS;IATS,GAAA,EACT;IACT,UAAU;GAOD;GACT,UAAU,EAAS,KAAI,CAAA,CAAG,SAAS;;CAEvC;CAEA,SAAS,IAAsB;IAC7B,GAAiB,CAAA,EAAI,CAAiB,CAAA;CACxC;CAGA,IAAM,IAAc,QAAA,GAAmB,OAAO,KAAK,SAAS,UAAU,GAChE,IAAW,QAAA,GAAmB,OAAO,WAAW,GAChD,IAAS,QAAA,EAAY,CAAW,MAAK,SAAS,GAC9C,IAAW,QAAA,EAAY,CAAW,MAAK,WAAW;KAGvD,IAAG,EAAA,SAAH,CAAG;MAEC,IAAG,EAAA;IAAH,SAAG,EAAiC,MAAM,QAAM,EAAA,KAAhD,CAAG,QAAH,CAAG;;;KADM,OAAO,UAAM,EAAA,CAAA;;;MAKtB,IAAA,EAAA,SAAA,CAAA;QAQO,EAAH,CAAG;;QAOA,EAAH,CAAG;;;KATD,CAAiB,IAAA,EAAA,CAAA,IAAA,EAAA,GAAA,EAAA;;YAiBjB,EAAA,GAAA,CAAJ,CAAI;IAvBN,CAAA;KAAA,GAAA,gBAAA,EAIe,CAAiB,CAAA,aAoB5B,CAAiB,IAAG,SAAS,OAAM,gBAAA;iBAxBvC,GAGU,CAAmB,QAH7B,CAAA;;;IADE,CAAc,KAAA,EAAI,CAAW,KAAA,EAAA,CAAA;;KA8BjC,IAAG,EAAA,GAAA,CAAA,SAAH,CAAG;OAEK,EAAJ,CAAI;;;IADF,CAAc,MAAA,EAAK,CAAS,KAAA,EAAI,CAAiB,MAAA,EAAA,CAAA;;;OAQ/C,EAAJ,CAAI;;;IADF,CAAc,KAAA,EAAI,CAAW,KAAA,CAAA,EAAK,CAAiB,KAAA,EAAA,CAAA;;KAOvD,IAAA,EAAA,GAAA,CAAA;;GAAA,IAAA,MACY,IAAY,SAAZ,CAAY,KAhB1B,CAAG,KAnCL,CAAG;EAkDC,EAAA,WAAA,GAIkB,OAAO,UAJzB,EAAA,WAAA,EAKW,CAAiB,SAL5B,GAAA,IAAA,GAAA;aAOe,CAAc,MAAA,EAAK,CAAS,KAAA,EAAI,CAAiB,KAAI,sBAAA,EAAsB,CAAc,KAAA,EAAI,CAAW,KAAA,CAAA,EAAK,CAAiB,IAAG,sBAAsB;YACxJ,CAAc,MAAA,EAAK,CAAS,KAAA,EAAI,CAAW,KAAI,UAAU;;UA1D3E,CAAG;AAFI;;;;;;;AC/ER,IAAM,IAAsB,EAA6B,SAGnD,IAAN,cAAiC,EAAmB;CAClD,mBAAwB;CACxB,SAAc;CAEd,oBAAoB;EAClB,IAAM,IAAW,KAAK,kBAAkB;EACxC,OAAO,OAAO,KAAa,YAAY,EAAS,KAAK,CAAC,CAAC,SAAS;CAClE;CAEA,0BAA0B;EACxB,KAAK,cACH,IAAI,EAAc,KAAK,QAAQ,YAAY,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,KAAA,CAAS,CAC7F;CACF;CAEA,gCAAgC;EAC9B,KAAK,cAAc,IAAI,EAAoB,KAAK,QAAQ,YAAY,GAAG,KAAK,YAAY,CAAC,CAAC;CAC5F;CAEA,IAAI,MAAM,GAAQ;EAGhB,AAFA,KAAK,SAAS,GACd,MAAM,QAAQ,GACd,KAAK,kBAAkB;CACzB;CAEA,IAAI,QAAQ;EACV,OAAO,KAAK;CACd;CAEA,IAAI,QAAQ,GAAQ;EAGlB,AAFA,KAAK,mBAAmB,GACxB,MAAM,UAAU,GAChB,KAAK,wBAAwB;CAC/B;CAEA,IAAI,UAAU;EACZ,OAAO,KAAK;CACd;CAEA,mBAAmB,MAAwB;EAGzC,AAFA,KAAK,mBAAmB,GACxB,MAAM,UAAU,GAChB,KAAK,wBAAwB;CAC/B;CAEA,oBAAoB;EAElB,AADA,MAAM,kBAAkB,GACxB,KAAc,kBAAkB,KAAK;CACvC;AACF"}
@@ -1,4 +1,4 @@
1
- import { A as e, C as t, E as n, F as r, I as i, L as a, N as o, P as s, T as c, _ as l, d as u, f as d, j as f, n as p, t as m, u as h, y as g } from "../client-Cas_f5u-.js";
1
+ import { C as e, E as t, F as n, I as r, L as i, M as a, N as o, R as s, T as c, _ as l, d as u, f as d, j as f, n as p, t as m, u as h, y as g } from "../client-Dt8SOe5Z.js";
2
2
  //#region src/print/Print.svelte
3
3
  var _ = g("<div class=\"mb-4 prose prose-sm svelte-1fx5wwa\"></div>"), v = g("<div class=\"p-4 print:p-0\"><!> <div class=\"inline-block\"><input type=\"text\" placeholder=\"______________________\" class=\"px-3 py-2 border-b-2 border-gray-400 bg-transparent print:border-black svelte-1fx5wwa\" style=\"border-top: none; border-left: none; border-right: none;\" disabled=\"\"/></div></div>"), y = {
4
4
  hash: "svelte-1fx5wwa",
@@ -6,9 +6,9 @@ var _ = g("<div class=\"mb-4 prose prose-sm svelte-1fx5wwa\"></div>"), v = g("<d
6
6
  };
7
7
  function b(m, g) {
8
8
  r(g, !0), h(m, y);
9
- let b = p(g, "model", 7, null), x = f("");
9
+ let b = p(g, "model", 7, null), x = a("");
10
10
  c(() => {
11
- e(x, b()?.prompt || "", !0);
11
+ f(x, b()?.prompt || "", !0);
12
12
  });
13
13
  var S = {
14
14
  get model() {
@@ -17,13 +17,13 @@ function b(m, g) {
17
17
  set model(e = null) {
18
18
  b(e), o();
19
19
  }
20
- }, C = v(), w = n(C), T = (e) => {
20
+ }, C = v(), w = t(C), T = (t) => {
21
21
  var n = _();
22
- u(n, () => t(x), !0), a(n), l(e, n);
22
+ u(n, () => e(x), !0), s(n), l(t, n);
23
23
  };
24
- return d(w, (e) => {
25
- t(x) && e(T);
26
- }), i(2), a(C), l(m, C), s(S);
24
+ return d(w, (t) => {
25
+ e(x) && t(T);
26
+ }), i(2), s(C), l(m, C), n(S);
27
27
  }
28
28
  m(b, { model: { type: "Object" } }, [], []);
29
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/print/Print.svelte","../../../src/print/index.ts"],"sourcesContent":["<svelte:options\n customElement={{\n shadow: 'none',\n props: {\n model: { type: 'Object' }\n }\n }}\n/>\n\n<script lang=\"ts\">\n// Destructure props so Svelte can infer what to expose as custom element properties\nlet { model = null }: { model?: any } = $props();\n\nlet prompt = $state('');\n$effect(() => {\n prompt = model?.prompt || '';\n});\n</script>\n\n<div class=\"p-4 print:p-0\">\n {#if prompt}\n <div class=\"mb-4 prose prose-sm\">{@html prompt}</div>\n {/if}\n\n <div class=\"inline-block\">\n <input\n type=\"text\"\n placeholder=\"______________________\"\n class=\"px-3 py-2 border-b-2 border-gray-400 bg-transparent print:border-black\"\n style=\"border-top: none; border-left: none; border-right: none;\"\n disabled\n />\n </div>\n</div>\n\n<style>\n @media print {\n input {\n border-color: black !important;\n }\n }\n\n .prose :global(p) {\n margin: 0.5em 0;\n }\n .prose :global(strong) {\n font-weight: 600;\n }\n</style>\n","import PrintComponent from './Print.svelte';\n\nconst SvelteElementClass = (PrintComponent as any).element;\n\nclass SimpleClozePrint extends SvelteElementClass {\n private _model: any = null;\n\n set model(m: any) {\n this._model = m;\n super.model = m;\n }\n\n get model() {\n return this._model;\n }\n}\n\nexport default SimpleClozePrint;\n"],"mappings":";;;;;;iBASA;;CAEA,IAAI,IAAO,EAAA,GAAA,SAAA,GAAG,IAAI,GAEd,IAAS,EAAO,EAAE;CACtB,QAAc;IACZ,GAAS,EAAK,GAAE,UAAU,IAAE,EAAA;CAC9B,CAAC;;;;;gBALa,MAAI;;;IAQjB,IAAG,EAAA,SAAH,CAAG;MAEC,IAAG,EAAA;IAAH,SAAG,EAAoC,CAAM,GAAA,EAAA,KAA7C,CAAG,QAAH,CAAG;;;IADD,CAAM,KAAA,EAAA,CAAA;aADZ,CAAG,QAAH,CAAG;AAFI;;;;ACfR,IAAM,IAAsB,EAAuB,SAE7C,IAAN,cAA+B,EAAmB;CAChD,SAAsB;CAEtB,IAAI,MAAM,GAAQ;EAEhB,AADA,KAAK,SAAS,GACd,MAAM,QAAQ;CAChB;CAEA,IAAI,QAAQ;EACV,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/print/Print.svelte","../../../src/print/index.ts"],"sourcesContent":["<svelte:options\n customElement={{\n shadow: 'none',\n props: {\n model: { type: 'Object' }\n }\n }}\n/>\n\n<script lang=\"ts\">\n// Destructure props so Svelte can infer what to expose as custom element properties\nlet { model = null }: { model?: any } = $props();\n\nlet prompt = $state('');\n$effect(() => {\n prompt = model?.prompt || '';\n});\n</script>\n\n<div class=\"p-4 print:p-0\">\n {#if prompt}\n <div class=\"mb-4 prose prose-sm\">{@html prompt}</div>\n {/if}\n\n <div class=\"inline-block\">\n <input\n type=\"text\"\n placeholder=\"______________________\"\n class=\"px-3 py-2 border-b-2 border-gray-400 bg-transparent print:border-black\"\n style=\"border-top: none; border-left: none; border-right: none;\"\n disabled\n />\n </div>\n</div>\n\n<style>\n @media print {\n input {\n border-color: black !important;\n }\n }\n\n .prose :global(p) {\n margin: 0.5em 0;\n }\n .prose :global(strong) {\n font-weight: 600;\n }\n</style>\n","import PrintComponent from './Print.svelte';\n\nconst SvelteElementClass = (PrintComponent as any).element;\n\nclass SimpleClozePrint extends SvelteElementClass {\n private _model: any = null;\n\n set model(m: any) {\n this._model = m;\n super.model = m;\n }\n\n get model() {\n return this._model;\n }\n}\n\nexport default SimpleClozePrint;\n"],"mappings":";;;;;;iBASA;;CAEA,IAAI,IAAO,EAAA,GAAA,SAAA,GAAG,IAAI,GAEd,IAAS,EAAO,EAAE;CACtB,QAAc;IACZ,GAAS,EAAK,CAAA,EAAE,UAAU,IAAE,EAAA;CAC9B,CAAC;;;;;gBALa,MAAI;;;IAQjB,IAAG,EAAA,SAAH,CAAG;MAEC,IAAG,EAAA;IAAH,SAAG,EAAoC,CAAM,GAAA,EAAA,KAA7C,CAAG,QAAH,CAAG;;;IADD,CAAM,KAAA,EAAA,CAAA;aADZ,CAAG,QAAH,CAAG;AAFI;;;;ACfR,IAAM,IAAsB,EAAuB,SAE7C,IAAN,cAA+B,EAAmB;CAChD,SAAsB;CAEtB,IAAI,MAAM,GAAQ;EAEhB,AADA,KAAK,SAAS,GACd,MAAM,QAAQ;CAChB;CAEA,IAAI,QAAQ;EACV,OAAO,KAAK;CACd;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/controller/defaults.ts","../../src/controller/index.ts"],"sourcesContent":["export default {\n model: {\n prompt: '<p>Enter your answer:</p>',\n promptEnabled: true,\n correctAnswer: '',\n },\n configuration: {\n prompt: {\n label: 'Prompt',\n settings: true,\n },\n },\n};\n","import defaults from './defaults';\n\nconst isEmptySession = (session: unknown) =>\n !session || (typeof session === 'object' && Object.keys(session).length === 0);\n\nexport const getCorrectness = (question: any, session: any) => {\n if (!session?.response) {\n return 'unanswered';\n }\n\n const correctAnswer = question?.correctAnswer || '';\n const userAnswer = session.response || '';\n\n // Simple string comparison for now\n if (userAnswer.trim().toLowerCase() === correctAnswer.trim().toLowerCase()) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const getPartialScore = (_question: any, session: any) => {\n if (isEmptySession(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question: any, session: any, env: any) =>\n new Promise((resolve) => {\n if (isEmptySession(session)) {\n resolve({ score: 0, empty: true });\n return;\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, session);\n const score = correctness === 'correct' ? 1 : 0;\n resolve({ score });\n }\n });\n\nexport const createDefaultModel = (model: any = {}) => ({ ...defaults.model, ...model });\n\nexport const normalizeSession = (s: any) => ({ ...s });\n\nexport const model = (question: any, session: any, env: any) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n\n const out: any = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n env,\n };\n\n if (env.mode === 'evaluate') {\n const correctness = getCorrectness(normalizedQuestion, session);\n out.correctness = correctness;\n out.correctAnswer = normalizedQuestion.correctAnswer;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question: any, env: any) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1', response: question.correctAnswer || '' });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model: any = {}, _config: any = {}) => {\n const errors: any = {};\n\n if (!model.prompt || model.prompt.trim() === '' || model.prompt === '<p></p>') {\n errors.prompt = 'Prompt is required';\n }\n\n return errors;\n};\n"],"mappings":";AAAA,IAAA,mBAAe;CACb,OAAO;EACL,QAAQ;EACR,eAAe;EACf,eAAe;CACjB;CACA,eAAe,EACb,QAAQ;EACN,OAAO;EACP,UAAU;CACZ,EACF;AACF;;;ACVA,IAAM,kBAAkB,YACtB,CAAC,WAAY,OAAO,YAAY,YAAY,OAAO,KAAK,OAAO,EAAE,WAAW;AAE9E,IAAa,kBAAkB,UAAe,YAAiB;CAC7D,IAAI,CAAC,SAAS,UACZ,OAAO;CAGT,MAAM,gBAAgB,UAAU,iBAAiB;CAIjD,KAHmB,QAAQ,YAAY,IAGxB,KAAK,EAAE,YAAY,MAAM,cAAc,KAAK,EAAE,YAAY,GACvE,OAAO;CAGT,OAAO;AACT;AAEA,IAAa,mBAAmB,WAAgB,YAAiB;CAC/D,IAAI,eAAe,OAAO,GACxB,OAAO;CAGT,OAAO;AACT;AAEA,IAAa,WAAW,UAAe,SAAc,QACnD,IAAI,SAAS,YAAY;CACvB,IAAI,eAAe,OAAO,GAAG;EAC3B,QAAQ;GAAE,OAAO;GAAG,OAAO;EAAK,CAAC;EACjC;CACF;CAEA,UAAU,iBAAiB,OAAO;CAElC,IAAI,IAAI,SAAS,YACf,QAAQ;EAAE,OAAO,KAAA;EAAW,WAAW,KAAA;CAAU,CAAC;MAIlD,QAAQ,EAAE,OAFU,eAAe,UAAU,OAC/B,MAAgB,YAAY,IAAI,EAC9B,CAAC;AAErB,CAAC;AAEH,IAAa,sBAAsB,QAAa,CAAC,OAAO;CAAE,GAAG,iBAAS;CAAO,GAAG;AAAM;AAEtF,IAAa,oBAAoB,OAAY,EAAE,GAAG,EAAE;AAEpD,IAAa,SAAS,UAAe,SAAc,QAAa;CAC9D,OAAO,IAAI,SAAS,YAAY;EAC9B,UAAU,WAAW,CAAC;EACtB,MAAM,qBAAqB,mBAAmB,QAAQ;EAEtD,MAAM,MAAW;GACf,QAAQ,mBAAmB,gBAAgB,mBAAmB,SAAS;GACvE,UAAU,IAAI,SAAS;GACvB,MAAM,IAAI,SAAS;GACnB;EACF;EAEA,IAAI,IAAI,SAAS,YAAY;GAE3B,IAAI,cADgB,eAAe,oBAAoB,OACrC;GAClB,IAAI,gBAAgB,mBAAmB;EACzC;EAEA,IAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,UAAU,IAAI,SAAS,aACpE,IAAI,sBAAsB,mBAAmB,6BACzC,mBAAmB,sBACnB;OAEJ,IAAI,sBAAsB;EAG5B,QAAQ,GAAG;CACb,CAAC;AACH;AAEA,IAAa,gCAAgC,UAAe,QAAa;CACvE,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,IAAI,SAAS,cAAc,IAAI,SAAS,cAC1C,QAAQ;GAAE,IAAI;GAAK,UAAU,SAAS,iBAAiB;EAAG,CAAC;OAE3D,QAAQ,IAAI;CAEhB,CAAC;AACH;AAEA,IAAa,YAAY,QAAa,CAAC,GAAG,UAAe,CAAC,MAAM;CAC9D,MAAM,SAAc,CAAC;CAErB,IAAI,CAAC,MAAM,UAAU,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,WAAW,WAClE,OAAO,SAAS;CAGlB,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/controller/defaults.ts","../../src/controller/index.ts"],"sourcesContent":["export default {\n model: {\n prompt: '<p>Enter your answer:</p>',\n promptEnabled: true,\n correctAnswer: '',\n },\n configuration: {\n prompt: {\n label: 'Prompt',\n settings: true,\n },\n },\n};\n","import defaults from './defaults';\n\nconst isEmptySession = (session: unknown) =>\n !session || (typeof session === 'object' && Object.keys(session).length === 0);\n\nexport const getCorrectness = (question: any, session: any) => {\n if (!session?.response) {\n return 'unanswered';\n }\n\n const correctAnswer = question?.correctAnswer || '';\n const userAnswer = session.response || '';\n\n // Simple string comparison for now\n if (userAnswer.trim().toLowerCase() === correctAnswer.trim().toLowerCase()) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const getPartialScore = (_question: any, session: any) => {\n if (isEmptySession(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question: any, session: any, env: any) =>\n new Promise((resolve) => {\n if (isEmptySession(session)) {\n resolve({ score: 0, empty: true });\n return;\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, session);\n const score = correctness === 'correct' ? 1 : 0;\n resolve({ score });\n }\n });\n\nexport const createDefaultModel = (model: any = {}) => ({ ...defaults.model, ...model });\n\nexport const normalizeSession = (s: any) => ({ ...s });\n\nexport const model = (question: any, session: any, env: any) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n\n const out: any = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n env,\n };\n\n if (env.mode === 'evaluate') {\n const correctness = getCorrectness(normalizedQuestion, session);\n out.correctness = correctness;\n out.correctAnswer = normalizedQuestion.correctAnswer;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question: any, env: any) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1', response: question.correctAnswer || '' });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model: any = {}, _config: any = {}) => {\n const errors: any = {};\n\n if (!model.prompt || model.prompt.trim() === '' || model.prompt === '<p></p>') {\n errors.prompt = 'Prompt is required';\n }\n\n return errors;\n};\n"],"mappings":";AAAA,IAAA,mBAAe;CACb,OAAO;EACL,QAAQ;EACR,eAAe;EACf,eAAe;CACjB;CACA,eAAe,EACb,QAAQ;EACN,OAAO;EACP,UAAU;CACZ,EACF;AACF;;;ACVA,IAAM,kBAAkB,YACtB,CAAC,WAAY,OAAO,YAAY,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW;AAE9E,IAAa,kBAAkB,UAAe,YAAiB;CAC7D,IAAI,CAAC,SAAS,UACZ,OAAO;CAGT,MAAM,gBAAgB,UAAU,iBAAiB;CAIjD,KAHmB,QAAQ,YAAY,GAAA,CAGxB,KAAK,CAAC,CAAC,YAAY,MAAM,cAAc,KAAK,CAAC,CAAC,YAAY,GACvE,OAAO;CAGT,OAAO;AACT;AAEA,IAAa,mBAAmB,WAAgB,YAAiB;CAC/D,IAAI,eAAe,OAAO,GACxB,OAAO;CAGT,OAAO;AACT;AAEA,IAAa,WAAW,UAAe,SAAc,QACnD,IAAI,SAAS,YAAY;CACvB,IAAI,eAAe,OAAO,GAAG;EAC3B,QAAQ;GAAE,OAAO;GAAG,OAAO;EAAK,CAAC;EACjC;CACF;CAEA,UAAU,iBAAiB,OAAO;CAElC,IAAI,IAAI,SAAS,YACf,QAAQ;EAAE,OAAO,KAAA;EAAW,WAAW,KAAA;CAAU,CAAC;MAIlD,QAAQ,EAAE,OAFU,eAAe,UAAU,OAC/B,MAAgB,YAAY,IAAI,EAC9B,CAAC;AAErB,CAAC;AAEH,IAAa,sBAAsB,QAAa,CAAC,OAAO;CAAE,GAAG,iBAAS;CAAO,GAAG;AAAM;AAEtF,IAAa,oBAAoB,OAAY,EAAE,GAAG,EAAE;AAEpD,IAAa,SAAS,UAAe,SAAc,QAAa;CAC9D,OAAO,IAAI,SAAS,YAAY;EAC9B,UAAU,WAAW,CAAC;EACtB,MAAM,qBAAqB,mBAAmB,QAAQ;EAEtD,MAAM,MAAW;GACf,QAAQ,mBAAmB,gBAAgB,mBAAmB,SAAS;GACvE,UAAU,IAAI,SAAS;GACvB,MAAM,IAAI,SAAS;GACnB;EACF;EAEA,IAAI,IAAI,SAAS,YAAY;GAE3B,IAAI,cADgB,eAAe,oBAAoB,OACrC;GAClB,IAAI,gBAAgB,mBAAmB;EACzC;EAEA,IAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,UAAU,IAAI,SAAS,aACpE,IAAI,sBAAsB,mBAAmB,6BACzC,mBAAmB,sBACnB;OAEJ,IAAI,sBAAsB;EAG5B,QAAQ,GAAG;CACb,CAAC;AACH;AAEA,IAAa,gCAAgC,UAAe,QAAa;CACvE,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,IAAI,SAAS,cAAc,IAAI,SAAS,cAC1C,QAAQ;GAAE,IAAI;GAAK,UAAU,SAAS,iBAAiB;EAAG,CAAC;OAE3D,QAAQ,IAAI;CAEhB,CAAC;AACH;AAEA,IAAa,YAAY,QAAa,CAAC,GAAG,UAAe,CAAC,MAAM;CAC9D,MAAM,SAAc,CAAC;CAErB,IAAI,CAAC,MAAM,UAAU,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,WAAW,WAClE,OAAO,SAAS;CAGlB,OAAO;AACT"}