@citolab/qti-components 7.0.6-beta.3 → 7.0.6-beta.5

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 (108) hide show
  1. package/cdn/chunks/{chunk-MJMONWKB.js → chunk-4ILXLVT5.js} +8 -2
  2. package/cdn/chunks/chunk-4PEUIMDK.js +8 -0
  3. package/cdn/chunks/chunk-EFU4L43Q.js +8 -0
  4. package/cdn/chunks/chunk-H2V2RXUW.js +11 -0
  5. package/cdn/chunks/chunk-IQZ7AOCQ.js +8 -0
  6. package/cdn/chunks/chunk-J3JSSCM6.js +5 -0
  7. package/cdn/chunks/chunk-LARBLB7K.js +8 -0
  8. package/cdn/chunks/chunk-PPWEIKLT.js +1 -0
  9. package/cdn/chunks/{chunk-N5OHGRGG.js → chunk-PT523RSK.js} +2 -2
  10. package/cdn/chunks/chunk-QTK4CPHP.js +8 -0
  11. package/cdn/chunks/chunk-RIXTWE2H.js +8 -0
  12. package/cdn/chunks/chunk-ROZIP5LG.js +8 -0
  13. package/cdn/chunks/chunk-RPZVSBLM.js +8 -0
  14. package/cdn/chunks/chunk-TEYXRLTI.js +8 -0
  15. package/cdn/chunks/{chunk-TVDTF6P6.js → chunk-U2TE6TOV.js} +89 -89
  16. package/cdn/chunks/{chunk-6S4CDN3T.js → chunk-YHWMZAZD.js} +2 -2
  17. package/cdn/chunks/{chunk-TQBDBMWL.js → chunk-YWH4TGMA.js} +1 -1
  18. package/cdn/index.global.js +1 -1
  19. package/cdn/index.js +1 -1
  20. package/cdn/qti-components/index.js +1 -1
  21. package/cdn/qti-item/core/index.js +1 -1
  22. package/cdn/qti-test/components/index.js +1 -1
  23. package/cdn/qti-test/components/test-component.abstract.js +1 -1
  24. package/cdn/qti-test/components/test-end-attempt.js +1 -0
  25. package/cdn/qti-test/components/test-item-link.js +1 -1
  26. package/cdn/qti-test/components/test-next.js +1 -1
  27. package/cdn/qti-test/components/test-paging-buttons-stamp.js +1 -1
  28. package/cdn/qti-test/components/test-prev.js +1 -1
  29. package/cdn/qti-test/components/test-show-correct-response.js +1 -0
  30. package/cdn/qti-test/components/test-view.js +1 -1
  31. package/cdn/qti-test/core/index.js +1 -1
  32. package/dist/chunks/{chunk-ZHAJ3CMP.js → chunk-6PAEJQSQ.js} +107 -140
  33. package/dist/chunks/chunk-6PAEJQSQ.js.map +1 -0
  34. package/dist/chunks/{chunk-UFYWCLXF.js → chunk-AUWATZ65.js} +1 -1
  35. package/dist/chunks/{chunk-UFYWCLXF.js.map → chunk-AUWATZ65.js.map} +1 -1
  36. package/dist/chunks/{chunk-7QMCKYDR.js → chunk-CEXAR7BF.js} +13 -4
  37. package/dist/chunks/chunk-CEXAR7BF.js.map +1 -0
  38. package/dist/chunks/{chunk-GSWZT6N2.js → chunk-DNHDFXTV.js} +14 -5
  39. package/dist/chunks/chunk-DNHDFXTV.js.map +1 -0
  40. package/dist/chunks/chunk-GQ5P3NWC.js +46 -0
  41. package/dist/chunks/chunk-GQ5P3NWC.js.map +1 -0
  42. package/dist/chunks/chunk-HOTNM5DT.js +1 -0
  43. package/dist/chunks/{chunk-3EU75IUF.js → chunk-MLT7V47R.js} +3 -21
  44. package/dist/chunks/chunk-MLT7V47R.js.map +1 -0
  45. package/dist/chunks/{chunk-J2SHENRN.js → chunk-NZQKGIJP.js} +9 -3
  46. package/dist/chunks/{chunk-J2SHENRN.js.map → chunk-NZQKGIJP.js.map} +1 -1
  47. package/dist/chunks/{chunk-6JXR63MH.js → chunk-RX3BRYYI.js} +14 -5
  48. package/dist/chunks/chunk-RX3BRYYI.js.map +1 -0
  49. package/dist/chunks/chunk-W4272Q5U.js +46 -0
  50. package/dist/chunks/chunk-W4272Q5U.js.map +1 -0
  51. package/dist/chunks/{chunk-A24F75DB.js → chunk-WWN5AD6V.js} +11 -2
  52. package/dist/chunks/chunk-WWN5AD6V.js.map +1 -0
  53. package/dist/chunks/{chunk-HHVRU3AJ.js → chunk-XCHS3RTZ.js} +2 -2
  54. package/dist/chunks/{chunk-KYAIMBP5.js → chunk-YQB6YLNW.js} +3 -3
  55. package/dist/chunks/chunk-YQB6YLNW.js.map +1 -0
  56. package/dist/chunks/{chunk-4GNVYCBN.js → chunk-ZQXZ6PK7.js} +92 -70
  57. package/dist/chunks/chunk-ZQXZ6PK7.js.map +1 -0
  58. package/dist/index.d.ts +4 -2
  59. package/dist/index.js +29 -21
  60. package/dist/item.css +8 -2
  61. package/dist/qti-components/index.d.ts +2 -2
  62. package/dist/qti-components/index.js +1 -1
  63. package/dist/qti-components-jsx.d.ts +62 -46
  64. package/dist/qti-item/core/index.js +2 -2
  65. package/dist/qti-loader/index.d.ts +1 -1
  66. package/dist/{qti-response-declaration-DAeBp8HH.d.ts → qti-response-declaration-Di9CsqiJ.d.ts} +4 -0
  67. package/dist/qti-test/components/index.d.ts +4 -2
  68. package/dist/qti-test/components/index.js +17 -9
  69. package/dist/qti-test/components/test-component.abstract.d.ts +2 -4
  70. package/dist/qti-test/components/test-component.abstract.js +2 -2
  71. package/dist/qti-test/components/test-end-attempt.d.ts +26 -0
  72. package/dist/qti-test/components/test-end-attempt.js +13 -0
  73. package/dist/qti-test/components/test-end-attempt.js.map +1 -0
  74. package/dist/qti-test/components/test-item-link.d.ts +3 -2
  75. package/dist/qti-test/components/test-item-link.js +4 -4
  76. package/dist/qti-test/components/test-next.d.ts +3 -2
  77. package/dist/qti-test/components/test-next.js +4 -4
  78. package/dist/qti-test/components/test-paging-buttons-stamp.d.ts +2 -2
  79. package/dist/qti-test/components/test-paging-buttons-stamp.js +3 -3
  80. package/dist/qti-test/components/test-prev.d.ts +3 -2
  81. package/dist/qti-test/components/test-prev.js +4 -4
  82. package/dist/qti-test/components/test-show-correct-response.d.ts +26 -0
  83. package/dist/qti-test/components/test-show-correct-response.js +13 -0
  84. package/dist/qti-test/components/test-show-correct-response.js.map +1 -0
  85. package/dist/qti-test/components/test-view.d.ts +3 -2
  86. package/dist/qti-test/components/test-view.js +3 -3
  87. package/dist/qti-test/core/index.d.ts +6 -6
  88. package/dist/qti-test/core/index.js +3 -3
  89. package/dist/{test.context-CaENAJNk.d.ts → test.context-CmsDQ8k2.d.ts} +3 -5
  90. package/dist/vscode.html-custom-data.json +36 -17
  91. package/package.json +1 -1
  92. package/cdn/chunks/chunk-5P7CTN7Q.js +0 -11
  93. package/cdn/chunks/chunk-DZCKF45D.js +0 -5
  94. package/cdn/chunks/chunk-IMJOPCFR.js +0 -1
  95. package/cdn/chunks/chunk-NDHSIO2G.js +0 -8
  96. package/cdn/chunks/chunk-QV6I5NVQ.js +0 -8
  97. package/dist/chunks/chunk-3EU75IUF.js.map +0 -1
  98. package/dist/chunks/chunk-4GNVYCBN.js.map +0 -1
  99. package/dist/chunks/chunk-6JXR63MH.js.map +0 -1
  100. package/dist/chunks/chunk-7QMCKYDR.js.map +0 -1
  101. package/dist/chunks/chunk-A24F75DB.js.map +0 -1
  102. package/dist/chunks/chunk-GSWZT6N2.js.map +0 -1
  103. package/dist/chunks/chunk-KYAIMBP5.js.map +0 -1
  104. package/dist/chunks/chunk-UN2IFSGC.js +0 -1
  105. package/dist/chunks/chunk-ZHAJ3CMP.js.map +0 -1
  106. /package/cdn/chunks/{chunk-3GO57DNP.js → chunk-6PW2L463.js} +0 -0
  107. /package/dist/chunks/{chunk-UN2IFSGC.js.map → chunk-HOTNM5DT.js.map} +0 -0
  108. /package/dist/chunks/{chunk-HHVRU3AJ.js.map → chunk-XCHS3RTZ.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TestComponent
3
- } from "./chunk-3EU75IUF.js";
3
+ } from "./chunk-MLT7V47R.js";
4
4
  import {
5
5
  __decorateClass
6
6
  } from "./chunk-H2JE6IVU.js";
@@ -12,7 +12,7 @@ import { prepareTemplate } from "stampino";
12
12
  var TestPagingButtonsStamp = class extends TestComponent {
13
13
  constructor() {
14
14
  super();
15
- this.maxDisplayedItems = 2;
15
+ this.maxDisplayedItems = 20;
16
16
  this.skipOnCategory = "dep-informational";
17
17
  this._internals.ariaLabel = "pagination";
18
18
  }
@@ -75,4 +75,4 @@ TestPagingButtonsStamp = __decorateClass([
75
75
  export {
76
76
  TestPagingButtonsStamp
77
77
  };
78
- //# sourceMappingURL=chunk-KYAIMBP5.js.map
78
+ //# sourceMappingURL=chunk-YQB6YLNW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-paging-buttons-stamp.ts"],"sourcesContent":["import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { TestComponent } from './test-component.abstract';\nimport { prepareTemplate } from 'stampino';\n\n@customElement('test-paging-buttons-stamp')\nexport class TestPagingButtonsStamp extends TestComponent {\n @property({ type: Number, attribute: 'max-displayed-items' })\n private maxDisplayedItems = 20;\n\n @property({ type: String, attribute: 'skip-on-category' })\n private skipOnCategory = 'dep-informational';\n\n protected createRenderRoot() {\n return this;\n }\n\n constructor() {\n super();\n this._internals.ariaLabel = 'pagination';\n }\n\n render() {\n const items = this._testContext.items.reduce(\n (acc, item) => {\n const isDepInfoItem = item.category?.split(' ').includes(this.skipOnCategory);\n const newIndex = isDepInfoItem ? 'i' : acc.counter++;\n acc.result.push({\n ...item,\n newIndex // Assign the new index, which only increments for non-info items\n });\n return acc;\n },\n { counter: 0, result: [] }\n ).result;\n\n // Get the index of the current item\n const itemIndex = items.findIndex(item => item.identifier === this._testContext.navItemId);\n\n // Calculate the start and end range based on maxDisplayedItems\n const start = Math.max(0, itemIndex - this.maxDisplayedItems);\n const end = Math.min(items.length, itemIndex + this.maxDisplayedItems + 1);\n\n // console.log('start', start, 'end', end);\n // Adjust the items array to only include the clamped range\n const clampedItems = items.slice(start, end);\n\n return html`\n ${clampedItems.map(item => {\n const rawscore = item.variables.find(vr => vr.identifier == 'SCORE');\n const score = parseInt(rawscore?.value?.toString());\n const completionStatus = item.variables.find(v => v.identifier === 'completionStatus')?.value;\n const type = item.category !== this.skipOnCategory ? 'regular' : 'info'; // rounded-full\n const active = this._testContext.navItemId === item.identifier; // !border-sky-600\n const correct =\n this._testContext.view === 'scorer' && type == 'regular' && score !== undefined && !isNaN(score) && score > 0; // bg-green-100 border-green-400\n const incorrect =\n this._testContext.view === 'scorer' &&\n type == 'regular' &&\n score !== undefined &&\n !isNaN(score) &&\n score <= 0; // bg-red-100 border-red-400\n const answered =\n this._testContext.view === 'candidate' &&\n completionStatus === 'completed' &&\n item.category !== this.skipOnCategory; // bg-slate-300 shadow-sm\n\n const computedItem = {\n ...item,\n type,\n active,\n correct,\n incorrect,\n answered\n };\n\n const templateElement = this.firstElementChild as HTMLTemplateElement;\n const myTemplate = prepareTemplate(templateElement);\n return myTemplate({ item: computedItem });\n })}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-paging-buttons-stamp': TestPagingButtonsStamp;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,eAAe,gBAAgB;AAGxC,SAAS,uBAAuB;AAGzB,IAAM,yBAAN,cAAqC,cAAc;AAAA,EAWxD,cAAc;AACZ,UAAM;AAVR,SAAQ,oBAAoB;AAG5B,SAAQ,iBAAiB;AAQvB,SAAK,WAAW,YAAY;AAAA,EAC9B;AAAA,EAPU,mBAAmB;AAC3B,WAAO;AAAA,EACT;AAAA,EAOA,SAAS;AACP,UAAM,QAAQ,KAAK,aAAa,MAAM;AAAA,MACpC,CAAC,KAAK,SAAS;AACb,cAAM,gBAAgB,KAAK,UAAU,MAAM,GAAG,EAAE,SAAS,KAAK,cAAc;AAC5E,cAAM,WAAW,gBAAgB,MAAM,IAAI;AAC3C,YAAI,OAAO,KAAK;AAAA,UACd,GAAG;AAAA,UACH;AAAA;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,EAAE,SAAS,GAAG,QAAQ,CAAC,EAAE;AAAA,IAC3B,EAAE;AAGF,UAAM,YAAY,MAAM,UAAU,UAAQ,KAAK,eAAe,KAAK,aAAa,SAAS;AAGzF,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,iBAAiB;AAC5D,UAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,YAAY,KAAK,oBAAoB,CAAC;AAIzE,UAAM,eAAe,MAAM,MAAM,OAAO,GAAG;AAE3C,WAAO;AAAA,QACH,aAAa,IAAI,UAAQ;AACzB,YAAM,WAAW,KAAK,UAAU,KAAK,QAAM,GAAG,cAAc,OAAO;AACnE,YAAM,QAAQ,SAAS,UAAU,OAAO,SAAS,CAAC;AAClD,YAAM,mBAAmB,KAAK,UAAU,KAAK,OAAK,EAAE,eAAe,kBAAkB,GAAG;AACxF,YAAM,OAAO,KAAK,aAAa,KAAK,iBAAiB,YAAY;AACjE,YAAM,SAAS,KAAK,aAAa,cAAc,KAAK;AACpD,YAAM,UACJ,KAAK,aAAa,SAAS,YAAY,QAAQ,aAAa,UAAU,UAAa,CAAC,MAAM,KAAK,KAAK,QAAQ;AAC9G,YAAM,YACJ,KAAK,aAAa,SAAS,YAC3B,QAAQ,aACR,UAAU,UACV,CAAC,MAAM,KAAK,KACZ,SAAS;AACX,YAAM,WACJ,KAAK,aAAa,SAAS,eAC3B,qBAAqB,eACrB,KAAK,aAAa,KAAK;AAEzB,YAAM,eAAe;AAAA,QACnB,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK;AAC7B,YAAM,aAAa,gBAAgB,eAAe;AAClD,aAAO,WAAW,EAAE,MAAM,aAAa,CAAC;AAAA,IAC1C,CAAC,CAAC;AAAA;AAAA,EAEN;AACF;AA1EU;AAAA,EADP,SAAS,EAAE,MAAM,QAAQ,WAAW,sBAAsB,CAAC;AAAA,GADjD,uBAEH;AAGA;AAAA,EADP,SAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,CAAC;AAAA,GAJ9C,uBAKH;AALG,yBAAN;AAAA,EADN,cAAc,2BAA2B;AAAA,GAC7B;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  item_default
3
- } from "./chunk-J2SHENRN.js";
3
+ } from "./chunk-NZQKGIJP.js";
4
4
  import {
5
5
  qtiTransformItem,
6
6
  qtiTransformTest
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  testContext,
10
10
  testElement
11
- } from "./chunk-UFYWCLXF.js";
11
+ } from "./chunk-AUWATZ65.js";
12
12
  import {
13
13
  watch
14
14
  } from "./chunk-ELDMXTUQ.js";
@@ -98,28 +98,55 @@ import { html as html2 } from "lit";
98
98
  import { customElement as customElement2 } from "lit/decorators.js";
99
99
 
100
100
  // src/lib/qti-test/core/mixins/test-loader.mixin.ts
101
+ import { property as property2 } from "lit/decorators.js";
102
+ var setSessionData = (key, value) => sessionStorage.setItem(key, JSON.stringify(value));
103
+ var getSessionData = (key) => sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key)) : null;
101
104
  var TestLoaderMixin = (superClass) => {
102
105
  class TestLoaderClass extends superClass {
103
- // private testURL = '';
104
106
  constructor(...args) {
105
107
  super(...args);
106
- this.addEventListener("qti-assessment-test-connected", () => {
108
+ this.autoScoreItems = false;
109
+ this.autoStoreRestoreContext = false;
110
+ this.addEventListener("qti-test-connected", () => {
111
+ if (this.autoStoreRestoreContext) {
112
+ this.context = getSessionData(`testcontext`);
113
+ }
107
114
  });
108
115
  this.addEventListener("qti-load-item-request", ({ detail }) => {
109
116
  detail.promise = (async () => {
110
- const api = await qtiTransformItem().load(
111
- `${detail.href}`,
112
- detail.cancelPreviousRequest
113
- );
117
+ const api = await qtiTransformItem().load(`${detail.href}`, detail.cancelPreviousRequest);
114
118
  return api.htmlDoc();
115
119
  })();
116
120
  });
117
- this.addEventListener("qti-interaction-changed", (_e) => {
118
- });
119
- this.addEventListener("qti-outcome-changed", () => {
121
+ this.addEventListener("qti-interaction-changed", (e) => {
122
+ if (this.autoScoreItems) {
123
+ const qtiItemEl = this.testElement.querySelector(
124
+ `qti-assessment-item-ref[identifier="${this.context.navItemId}"]`
125
+ );
126
+ const qtiAssessmentItem = qtiItemEl.assessmentItem;
127
+ const scoreOutcomeIdentifier = qtiAssessmentItem.variables.find(
128
+ (v) => v.identifier === "SCORE"
129
+ );
130
+ if (scoreOutcomeIdentifier.externalScored === null && qtiAssessmentItem.adaptive === "false") {
131
+ qtiAssessmentItem.processResponse();
132
+ if (this.autoStoreRestoreContext) {
133
+ setSessionData(`testcontext`, this.context);
134
+ }
135
+ }
136
+ } else {
137
+ if (this.autoStoreRestoreContext) {
138
+ setSessionData(`testcontext`, this.context);
139
+ }
140
+ }
120
141
  });
121
142
  }
122
143
  }
144
+ __decorateClass([
145
+ property2({ type: Boolean, attribute: "auto-score-items" })
146
+ ], TestLoaderClass.prototype, "autoScoreItems", 2);
147
+ __decorateClass([
148
+ property2({ type: Boolean, attribute: "auto-store-restore" })
149
+ ], TestLoaderClass.prototype, "autoStoreRestoreContext", 2);
123
150
  return TestLoaderClass;
124
151
  };
125
152
 
@@ -131,7 +158,7 @@ var TestNavigationMixin = (superClass) => {
131
158
  this.addEventListener("qti-request-test-item", ({ detail: navItemId }) => {
132
159
  if (!navItemId) return;
133
160
  this._clearLoadedItems();
134
- const itemRefEl = this.testElement.el.querySelector(
161
+ const itemRefEl = this.testElement.querySelector(
135
162
  `qti-assessment-item-ref[identifier="${navItemId}"]`
136
163
  );
137
164
  const promise = this._loadItemRequest(itemRefEl.href, false);
@@ -153,7 +180,7 @@ var TestNavigationMixin = (superClass) => {
153
180
  this.addEventListener("qti-assessment-test-connected", () => {
154
181
  let navItemId = this._testContext.navItemId;
155
182
  if (!navItemId) {
156
- const itemRefEl = this.testElement.el.querySelector("qti-assessment-item-ref");
183
+ const itemRefEl = this.testElement.querySelector("qti-assessment-item-ref");
157
184
  navItemId = itemRefEl.identifier;
158
185
  }
159
186
  this.dispatchEvent(
@@ -162,7 +189,7 @@ var TestNavigationMixin = (superClass) => {
162
189
  });
163
190
  }
164
191
  _clearLoadedItems() {
165
- const itemRefEls = this.testElement.el.querySelectorAll(`qti-assessment-test qti-assessment-item-ref`);
192
+ const itemRefEls = this.testElement.querySelectorAll(`qti-assessment-test qti-assessment-item-ref`);
166
193
  Array.from(itemRefEls).forEach((itemElement) => {
167
194
  itemElement.xmlDoc = null;
168
195
  });
@@ -210,12 +237,12 @@ var TestViewMixin = (superClass) => {
210
237
  }
211
238
  // Method to handle view updates for elements based on the current context view
212
239
  _updateElementView() {
213
- if (this.testElement && this.testElement.el) {
214
- const viewElements = Array.from(this.testElement.el.querySelectorAll("[view]"));
240
+ if (this.testElement && this.testElement) {
241
+ const viewElements = Array.from(this.testElement.querySelectorAll("[view]"));
215
242
  viewElements.forEach((element) => {
216
243
  element.classList.toggle("show", element.getAttribute("view") === this._testContext.view);
217
244
  });
218
- const assessmentItem = this.testElement.el.querySelector(
245
+ const assessmentItem = this.testElement.querySelector(
219
246
  `qti-assessment-item[identifier="${this._testContext.navItemId}"]`
220
247
  );
221
248
  if (assessmentItem) {
@@ -239,7 +266,7 @@ var TestBase = class extends LitElement2 {
239
266
  constructor() {
240
267
  super();
241
268
  this._testContext = { items: [], testOutcomeVariables: [] };
242
- this.testElement = { el: null };
269
+ this.testElement = null;
243
270
  /**
244
271
  * Updates the variables of an assessment item in the test context.
245
272
  * - Matches the assessment item with the corresponding test context item.
@@ -264,15 +291,24 @@ var TestBase = class extends LitElement2 {
264
291
  };
265
292
  this.addEventListener("qti-assessment-test-connected", (e) => {
266
293
  const qtiAssessmentTest = e.detail;
267
- const items = Array.from(qtiAssessmentTest.querySelectorAll("qti-assessment-item-ref")).map(
268
- (itemRef) => ({
269
- href: itemRef.href,
270
- identifier: itemRef.identifier,
271
- category: itemRef.category,
272
- variables: [{ identifier: "completionStatus", value: "not_attempted", type: "outcome" }]
273
- })
274
- );
275
- this.testElement = { el: qtiAssessmentTest };
294
+ this.testElement = qtiAssessmentTest;
295
+ const items = Array.from(qtiAssessmentTest.querySelectorAll("qti-assessment-item-ref")).map((itemRef) => {
296
+ const existingItem = this._testContext.items.find((item) => item.identifier === itemRef.identifier);
297
+ return {
298
+ ...existingItem,
299
+ // Spread all existing properties
300
+ href: existingItem?.href || itemRef.href,
301
+ identifier: existingItem?.identifier || itemRef.identifier,
302
+ category: existingItem?.category || itemRef.category,
303
+ variables: existingItem?.variables || [
304
+ {
305
+ identifier: "completionStatus",
306
+ value: "not_attempted",
307
+ type: "outcome"
308
+ }
309
+ ]
310
+ };
311
+ });
276
312
  this._testContext = { ...this._testContext, items };
277
313
  });
278
314
  this.addEventListener("qti-assessment-item-connected", (e) => {
@@ -318,25 +354,6 @@ var TestBase = class extends LitElement2 {
318
354
  })
319
355
  };
320
356
  }
321
- // private _addItemToTestContext(
322
- // e: CustomEvent<{ href: string; identifier: string; category: string }> & { target: QtiAssessmentItemRef }
323
- // ): void {
324
- // const { href, identifier, category } = e.detail;
325
- // // Update test context items, adding a new item if the identifier is not already in the list
326
- // if (!this._testContext.items.some(item => item.identifier === identifier)) {
327
- // this._testContext.items.push({
328
- // href,
329
- // identifier,
330
- // category,
331
- // variables: [{ identifier: 'completionStatus', value: 'not_attempted', type: 'outcome' }]
332
- // // category: e.target.category
333
- // });
334
- // }
335
- // }
336
- connectedCallback() {
337
- super.connectedCallback();
338
- this.setAttribute("qti-test", "");
339
- }
340
357
  };
341
358
  __decorateClass([
342
359
  state2(),
@@ -411,6 +428,11 @@ var QtiTest = class extends TestLoaderMixin(TestProcessingMixin(TestNavigationMi
411
428
  * Renders the component's template.
412
429
  * Provides a default `<slot>` for content projection.
413
430
  */
431
+ async connectedCallback() {
432
+ super.connectedCallback();
433
+ await this.updateComplete;
434
+ this.dispatchEvent(new CustomEvent("qti-test-connected", { detail: this }));
435
+ }
414
436
  render() {
415
437
  return html2`<slot></slot>`;
416
438
  }
@@ -422,7 +444,7 @@ QtiTest = __decorateClass([
422
444
  // src/lib/qti-test/core/qti-assessment-test/qti-assessment-item-ref.ts
423
445
  import { consume } from "@lit/context";
424
446
  import { html as html3, LitElement as LitElement3 } from "lit";
425
- import { property as property2 } from "lit/decorators.js";
447
+ import { property as property3 } from "lit/decorators.js";
426
448
  var stringToBooleanConverter = {
427
449
  fromAttribute(value) {
428
450
  return value === "true";
@@ -459,25 +481,25 @@ var QtiAssessmentItemRef = class extends LitElement3 {
459
481
  }
460
482
  };
461
483
  __decorateClass([
462
- property2({ type: String })
484
+ property3({ type: String })
463
485
  ], QtiAssessmentItemRef.prototype, "category", 2);
464
486
  __decorateClass([
465
- property2({ type: String })
487
+ property3({ type: String })
466
488
  ], QtiAssessmentItemRef.prototype, "identifier", 2);
467
489
  __decorateClass([
468
- property2({ type: Boolean, converter: stringToBooleanConverter })
490
+ property3({ type: Boolean, converter: stringToBooleanConverter })
469
491
  ], QtiAssessmentItemRef.prototype, "required", 2);
470
492
  __decorateClass([
471
- property2({ type: Boolean, converter: stringToBooleanConverter })
493
+ property3({ type: Boolean, converter: stringToBooleanConverter })
472
494
  ], QtiAssessmentItemRef.prototype, "fixed", 2);
473
495
  __decorateClass([
474
- property2({ type: String })
496
+ property3({ type: String })
475
497
  ], QtiAssessmentItemRef.prototype, "href", 2);
476
498
  __decorateClass([
477
499
  consume({ context: testContext, subscribe: true })
478
500
  ], QtiAssessmentItemRef.prototype, "_testContext", 2);
479
501
  __decorateClass([
480
- property2({ type: Object, attribute: false })
502
+ property3({ type: Object, attribute: false })
481
503
  ], QtiAssessmentItemRef.prototype, "xmlDoc", 2);
482
504
  if (!customElements.get("qti-assessment-item-ref")) {
483
505
  customElements.define("qti-assessment-item-ref", QtiAssessmentItemRef);
@@ -486,7 +508,7 @@ if (!customElements.get("qti-assessment-item-ref")) {
486
508
  // src/lib/qti-test/core/qti-assessment-test/qti-assessment-section.ts
487
509
  import { consume as consume2 } from "@lit/context";
488
510
  import { html as html4, LitElement as LitElement4 } from "lit";
489
- import { property as property3 } from "lit/decorators.js";
511
+ import { property as property4 } from "lit/decorators.js";
490
512
  var stringToBooleanConverter2 = {
491
513
  fromAttribute(value) {
492
514
  return value === "true";
@@ -511,22 +533,22 @@ var QtiAssessmentSection = class extends LitElement4 {
511
533
  }
512
534
  };
513
535
  __decorateClass([
514
- property3({ type: String })
536
+ property4({ type: String })
515
537
  ], QtiAssessmentSection.prototype, "identifier", 2);
516
538
  __decorateClass([
517
- property3({ type: String })
539
+ property4({ type: String })
518
540
  ], QtiAssessmentSection.prototype, "required", 2);
519
541
  __decorateClass([
520
- property3({ type: Boolean, converter: stringToBooleanConverter2 })
542
+ property4({ type: Boolean, converter: stringToBooleanConverter2 })
521
543
  ], QtiAssessmentSection.prototype, "fixed", 2);
522
544
  __decorateClass([
523
- property3({ type: String })
545
+ property4({ type: String })
524
546
  ], QtiAssessmentSection.prototype, "title", 2);
525
547
  __decorateClass([
526
- property3({ type: Boolean, converter: stringToBooleanConverter2 })
548
+ property4({ type: Boolean, converter: stringToBooleanConverter2 })
527
549
  ], QtiAssessmentSection.prototype, "visible", 2);
528
550
  __decorateClass([
529
- property3({ type: Boolean, converter: stringToBooleanConverter2, attribute: "keep-together" })
551
+ property4({ type: Boolean, converter: stringToBooleanConverter2, attribute: "keep-together" })
530
552
  ], QtiAssessmentSection.prototype, "keepTogether", 2);
531
553
  __decorateClass([
532
554
  consume2({ context: testContext, subscribe: true })
@@ -538,7 +560,7 @@ if (!customElements.get("qti-assessment-section")) {
538
560
  // src/lib/qti-test/core/qti-assessment-test/qti-assessment-test.ts
539
561
  import { consume as consume3 } from "@lit/context";
540
562
  import { html as html5, LitElement as LitElement5 } from "lit";
541
- import { customElement as customElement3, property as property4 } from "lit/decorators.js";
563
+ import { customElement as customElement3, property as property5 } from "lit/decorators.js";
542
564
  var QtiAssessmentTest = class extends LitElement5 {
543
565
  async connectedCallback() {
544
566
  super.connectedCallback();
@@ -556,10 +578,10 @@ var QtiAssessmentTest = class extends LitElement5 {
556
578
  }
557
579
  };
558
580
  __decorateClass([
559
- property4({ type: String })
581
+ property5({ type: String })
560
582
  ], QtiAssessmentTest.prototype, "identifier", 2);
561
583
  __decorateClass([
562
- property4({ type: String })
584
+ property5({ type: String })
563
585
  ], QtiAssessmentTest.prototype, "title", 2);
564
586
  __decorateClass([
565
587
  consume3({ context: testContext, subscribe: true })
@@ -570,7 +592,7 @@ QtiAssessmentTest = __decorateClass([
570
592
 
571
593
  // src/lib/qti-test/core/qti-assessment-test/qti-test-part.ts
572
594
  import { html as html6, LitElement as LitElement6 } from "lit";
573
- import { customElement as customElement4, property as property5 } from "lit/decorators.js";
595
+ import { customElement as customElement4, property as property6 } from "lit/decorators.js";
574
596
  var QtiTestPart = class extends LitElement6 {
575
597
  constructor() {
576
598
  super(...arguments);
@@ -595,19 +617,19 @@ var QtiTestPart = class extends LitElement6 {
595
617
  }
596
618
  };
597
619
  __decorateClass([
598
- property5({ type: String })
620
+ property6({ type: String })
599
621
  ], QtiTestPart.prototype, "identifier", 2);
600
622
  __decorateClass([
601
- property5({ type: String })
623
+ property6({ type: String })
602
624
  ], QtiTestPart.prototype, "title", 2);
603
625
  __decorateClass([
604
- property5({ type: String })
626
+ property6({ type: String })
605
627
  ], QtiTestPart.prototype, "class", 2);
606
628
  __decorateClass([
607
- property5({ type: String, attribute: "navigation-mode" })
629
+ property6({ type: String, attribute: "navigation-mode" })
608
630
  ], QtiTestPart.prototype, "NavigationMode", 2);
609
631
  __decorateClass([
610
- property5({ type: String, attribute: "submission-mode" })
632
+ property6({ type: String, attribute: "submission-mode" })
611
633
  ], QtiTestPart.prototype, "submissionMode", 2);
612
634
  QtiTestPart = __decorateClass([
613
635
  customElement4("qti-test-part")
@@ -624,4 +646,4 @@ export {
624
646
  QtiAssessmentTest,
625
647
  QtiTestPart
626
648
  };
627
- //# sourceMappingURL=chunk-4GNVYCBN.js.map
649
+ //# sourceMappingURL=chunk-ZQXZ6PK7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/core/components/test-container.ts","../../src/lib/qti-test/core/qti-test.ts","../../src/lib/qti-test/core/mixins/test-loader.mixin.ts","../../src/lib/qti-test/core/mixins/test-navigation.mixin.ts","../../src/lib/qti-test/core/mixins/test-view.mixin.ts","../../src/lib/qti-test/core/test-base.ts","../../src/lib/qti-test/core/mixins/test-processing.mixin.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-item-ref.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-section.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-test.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-test-part.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { until } from 'lit/directives/until.js';\nimport { watch } from '../../../decorators/watch';\nimport itemCss from '../../../../item.css?inline';\nimport { qtiTransformTest } from '../../../qti-transformers';\n\n/**\n * `<test-container>` is a custom element designed for hosting the qti-assessment-item.\n * The `qti-assessment-test` will be placed inside the shadow DOM of this element.\n * The element loads the test from the provided URL and renders it inside the shadow DOM.\n *\n * ```html\n * <qti-test>\n * <test-container class=\"m-4 bg-white\" test-url=\"./path/to/assessmenttest.xml\"></test-container>\n * </qti-test>\n * ```\n */\n@customElement('test-container')\nexport class TestContainer extends LitElement {\n /** URL of the item to load */\n @property({ type: String, attribute: 'test-url' })\n testURL: string = null;\n\n /** A parsed HTML document */\n @state()\n testDoc: DocumentFragment = null;\n\n /** The raw XML string */\n @state()\n testXML: string = null;\n\n /** Template content if provided */\n private templateContent = null;\n\n @watch('testURL', { waitUntilFirstUpdate: true })\n protected async handleTestURLChange() {\n if (!this.testURL) return;\n try {\n const api = await qtiTransformTest().load(this.testURL);\n this.testDoc = api.htmlDoc();\n } catch (error) {\n console.error('Error loading or parsing XML:', error);\n }\n }\n\n @watch('testXML', { waitUntilFirstUpdate: true })\n protected handleTestXMLChange() {\n if (!this.testXML) return;\n try {\n this.testDoc = qtiTransformTest().parse(this.testXML).htmlDoc();\n } catch (error) {\n console.error('Error parsing XML:', error);\n }\n }\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.initializeTemplateContent();\n this.applyStyles();\n if (this.testURL) {\n this.handleTestURLChange();\n }\n if (this.testXML) {\n this.handleTestXMLChange();\n }\n }\n\n private initializeTemplateContent() {\n const template = this.querySelector('template') as HTMLTemplateElement;\n this.templateContent = template ? template.content : html``;\n }\n\n private applyStyles() {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(itemCss);\n this.shadowRoot.adoptedStyleSheets = [sheet];\n }\n\n render() {\n return html`\n ${this.templateContent}\n <slot></slot>\n ${until(this.testDoc, html`<span>Loading...</span>`)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-container': TestContainer;\n }\n}\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { TestLoaderMixin, TestNavigationMixin, TestViewMixin } from './mixins';\nimport { TestBase } from './test-base';\nimport { TestProcessingMixin } from './mixins/test-processing.mixin';\n\n/**\n * `<qti-test>` is a custom element designed for rendering and interacting with QTI (Question and Test Interoperability) tests.\n *\n * This component leverages several mixins to provide functionality for loading, navigating, processing, and displaying QTI test assessments.\n *\n * ### Example Usage\n *\n * Minimal example including navigation:\n *\n * ```html\n * <qti-test>\n * <test-container test-url=\"./path/to/assessment.xml\"></test-container>\n * <nav class=\"flex\">\n * <test-prev></test-prev>\n * <test-next></test-next>\n * </nav>\n * </qti-test>\n * ```\n *\n * Use the following file structure\n * A qti-test loads a QTI3.0 assessmenttest.xml file from a package folder.\n *\n * ```plaintext\n * Root/\n * ├── index.html\n * └── /assets/api/examples/\n * ├── assessmenttest.xml\n * └── imsmanifest.xml\n *\n * ```\n *\n * ### Test components\n *\n * Use test components inside the qti-test component for added functionality.\n * ### Test next\n * `<test-next> | TestNext`\n *\n * ### Test prev\n *\n * `<test-prev> | TestPrev`\n * ### Test components\n *\n * You can use normal class names to style the elements.\n * And you can use the `test-prev` and `test-next` elements to navigate through the test.\n *\n */\n@customElement('qti-test')\nexport class QtiTest extends TestLoaderMixin(TestProcessingMixin(TestNavigationMixin(TestViewMixin(TestBase)))) {\n /**\n * Renders the component's template.\n * Provides a default `<slot>` for content projection.\n */\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(new CustomEvent('qti-test-connected', { detail: this }));\n }\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-test': QtiTest;\n }\n}\n","import { qtiTransformItem } from '../../../qti-transformers';\nimport { property } from 'lit/decorators.js';\nimport type { TestBase } from '../test-base';\nimport type { OutcomeVariable } from '../../../exports/variables';\nimport type { QtiAssessmentItemRef } from '../qti-assessment-test';\n\nconst setSessionData = <T>(key: string, value?: T): void => sessionStorage.setItem(key, JSON.stringify(value));\nconst getSessionData = <T>(key: string): T | null =>\n sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key)!) : null;\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestLoaderInterface {}\nexport const TestLoaderMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestLoaderClass extends superClass {\n /** Items will be scored on everyinteraction when `qti-assessment-item` is not set to adaptive, and the `SCORE` outcome identifier is not set to be \"human\" | \"externalMachine\" */\n @property({ type: Boolean, attribute: 'auto-score-items' }) autoScoreItems = false;\n @property({ type: Boolean, attribute: 'auto-store-restore' }) autoStoreRestoreContext = false;\n\n constructor(...args: any[]) {\n super(...args);\n\n // this.addEventListener('qti-load-test-request', (e: CustomEvent /* 1. Request the test */) => {\n // const { testURL } = e.detail;\n // if (!testURL) {\n // console.warn(\n // 'No test found, there should be an attribute test-url with the path to the test on the test-container'\n // );\n // } else {\n // this.testURL = testURL;\n // }\n\n // e.detail.promise = (async () => {\n // e.preventDefault(); /* indicates that the event was catched and handled */\n // const api = await qtiTransformTest().load(`${this.testURL}`); /* 6. load the item */\n // return api.htmlDoc(); /* 3. Return html version of the assessment.xml */\n // })();\n // });\n\n this.addEventListener('qti-test-connected', () => {\n if (this.autoStoreRestoreContext) {\n this.context = getSessionData(`testcontext`); /* 4. Set the context */\n }\n });\n\n this.addEventListener('qti-load-item-request' /* 5. Request the item */, ({ detail }: CustomEvent) => {\n detail.promise = (async () => {\n const api = await qtiTransformItem().load(`${detail.href}`, detail.cancelPreviousRequest);\n return api.htmlDoc();\n })();\n });\n\n this.addEventListener('qti-interaction-changed', (e: CustomEvent<any>) => {\n if (this.autoScoreItems) {\n const qtiItemEl = this.testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${this.context.navItemId}\"]`\n );\n const qtiAssessmentItem = qtiItemEl.assessmentItem;\n const scoreOutcomeIdentifier = qtiAssessmentItem.variables.find(\n v => v.identifier === 'SCORE'\n ) as OutcomeVariable;\n if (scoreOutcomeIdentifier.externalScored === null && qtiAssessmentItem.adaptive === 'false') {\n qtiAssessmentItem.processResponse();\n if (this.autoStoreRestoreContext) {\n setSessionData(`testcontext`, this.context);\n }\n }\n } else {\n if (this.autoStoreRestoreContext) {\n setSessionData(`testcontext`, this.context);\n }\n }\n });\n }\n }\n\n return TestLoaderClass as Constructor<TestLoaderInterface> & T;\n};\n","import type { QtiAssessmentItemRef } from '../qti-assessment-test';\nimport type { TestBase } from '../test-base';\n\ndeclare module '../context/test.context' {\n interface TestContext {\n navPartId?: string | null;\n navSectionId?: string | null;\n navItemId?: string | null;\n navItemLoading?: boolean;\n navTestLoading?: boolean;\n }\n}\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestNavigationInterface {}\nexport const TestNavigationMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestNavigationClass extends superClass {\n constructor(...args: any[]) {\n super(...args);\n\n // load an item\n this.addEventListener('qti-request-test-item', ({ detail: navItemId }: CustomEvent<string>) => {\n if (!navItemId) return;\n this._clearLoadedItems();\n\n const itemRefEl = this.testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${navItemId}\"]`\n );\n\n const promise = this._loadItemRequest(itemRefEl.href, false);\n\n const navPartId = itemRefEl.closest('qti-test-part').identifier;\n const navSectionId = itemRefEl.closest('qti-assessment-section').identifier;\n this._testContext = { ...this._testContext, navPartId, navSectionId, navItemId, navItemLoading: true };\n\n if (promise) {\n promise\n .then(doc => {\n itemRefEl.xmlDoc = doc;\n requestAnimationFrame(() =>\n this.dispatchEvent(new CustomEvent('qti-item-connected', { bubbles: true, composed: true }))\n );\n this._testContext = { ...this._testContext, navItemLoading: false };\n })\n .catch(error => console.error('Failed to load item:', error));\n } else {\n console.info('Load item request was not handled:', itemRefEl.href);\n }\n });\n\n this.addEventListener('qti-assessment-test-connected', () => {\n let navItemId = this._testContext.navItemId;\n if (!navItemId) {\n const itemRefEl = this.testElement.querySelector<QtiAssessmentItemRef>('qti-assessment-item-ref');\n navItemId = itemRefEl.identifier;\n }\n this.dispatchEvent(\n new CustomEvent('qti-request-test-item', { detail: navItemId, bubbles: true, composed: true })\n );\n });\n }\n\n private _clearLoadedItems(): void {\n const itemRefEls = this.testElement.querySelectorAll(`qti-assessment-test qti-assessment-item-ref`);\n Array.from(itemRefEls).forEach((itemElement: QtiAssessmentItemRef) => {\n itemElement.xmlDoc = null;\n });\n }\n\n private _loadItemRequest(href: string, cancelPreviousRequest: boolean = true): Promise<DocumentFragment> {\n const event = new CustomEvent('qti-load-item-request', {\n bubbles: true,\n composed: true,\n detail: {\n href: href,\n promise: null,\n cancelPreviousRequest\n }\n });\n this.dispatchEvent(event);\n\n return event.detail.promise;\n }\n }\n\n return TestNavigationClass as Constructor<TestNavigationInterface> & T;\n};\n","import type { QtiAssessmentItem } from '../../../qti-components';\nimport type { TestBase } from '../test-base';\n\nexport type View = 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor' | '';\n\ndeclare module '../context/test.context' {\n interface TestContext {\n view?: View;\n }\n}\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestViewInterface {}\n\nexport const TestViewMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestViewClass extends superClass {\n constructor(...args: any[]) {\n super(...args);\n this._testContext = { ...this._testContext, view: 'candidate' };\n\n this.addEventListener('on-test-switch-view', (e: CustomEvent<View>) => {\n this._testContext = { ...this._testContext, view: e.detail };\n this._updateElementView();\n });\n this.addEventListener('qti-assessment-test-connected', () => {\n this._updateElementView();\n });\n this.addEventListener('qti-assessment-item-connected', (e: CustomEvent) => {\n this._updateElementView();\n this._setCorrectResponseVisibility(e.detail);\n });\n }\n\n willUpdate(changedProperties: Map<string | number | symbol, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('_testContext')) {\n // if (previousContext && previousContext.view !== this._testContext.view) {\n this._updateElementView();\n // }\n }\n }\n\n // Method to handle view updates for elements based on the current context view\n private _updateElementView() {\n if (this.testElement && this.testElement) {\n const viewElements = Array.from(this.testElement.querySelectorAll('[view]'));\n\n viewElements.forEach((element: HTMLElement) => {\n element.classList.toggle('show', element.getAttribute('view') === this._testContext.view);\n });\n\n const assessmentItem = this.testElement.querySelector<QtiAssessmentItem>(\n `qti-assessment-item[identifier=\"${this._testContext.navItemId}\"]`\n );\n if (assessmentItem) {\n assessmentItem.showCorrectResponse(this._testContext.view === 'scorer');\n }\n }\n }\n\n // Event handler for connected QTI assessment items\n private _setCorrectResponseVisibility(assessmentItem: QtiAssessmentItem): void {\n assessmentItem.showCorrectResponse(this._testContext.view === 'scorer');\n }\n }\n\n return TestViewClass as Constructor<TestViewInterface> & T;\n};\n","import { provide } from '@lit/context';\nimport { LitElement } from 'lit';\nimport { state } from 'lit/decorators.js';\nimport type { TestContext, TestElement } from './context';\nimport { testContext, testElement } from './context';\nimport type { QtiAssessmentTest } from './qti-assessment-test';\nimport type { QtiAssessmentItem } from '../../qti-components/';\nimport type { VariableValue } from '../../exports/variables';\n\nexport abstract class TestBase extends LitElement {\n @state()\n @provide({ context: testContext })\n protected _testContext: Readonly<TestContext> = { items: [], testOutcomeVariables: [] };\n\n @state()\n @provide({ context: testElement })\n protected testElement: TestElement = null;\n\n constructor() {\n super();\n\n /**\n * When the test is connected, the items are updated in the test context.\n * An existing context item is updated with the itemRef properties if nessesary.\n */\n this.addEventListener('qti-assessment-test-connected', (e: CustomEvent<QtiAssessmentTest>) => {\n const qtiAssessmentTest = e.detail;\n this.testElement = qtiAssessmentTest;\n\n const items = Array.from(qtiAssessmentTest.querySelectorAll('qti-assessment-item-ref')).map(itemRef => {\n const existingItem = this._testContext.items.find(item => item.identifier === itemRef.identifier);\n\n return {\n ...existingItem, // Spread all existing properties\n href: existingItem?.href || itemRef.href,\n identifier: existingItem?.identifier || itemRef.identifier,\n category: existingItem?.category || itemRef.category,\n variables: existingItem?.variables || [\n {\n identifier: 'completionStatus',\n value: 'not_attempted',\n type: 'outcome'\n }\n ]\n };\n });\n this._testContext = { ...this._testContext, items };\n });\n this.addEventListener('qti-assessment-item-connected', (e: CustomEvent<QtiAssessmentItem>) => {\n this._updateItemInTestContext(e.detail);\n });\n this.addEventListener('qti-outcome-changed', e => {\n const assessmentitem = e.composedPath()[0] as QtiAssessmentItem;\n this._updateItemVariablesInTestContext(assessmentitem.identifier, assessmentitem.variables);\n });\n }\n\n get context(): TestContext {\n return this._testContext;\n }\n\n // /* restores the context by updating existing items and adding new items from the \"contextToRestore\" parameter into the \"this._context.items\" array. */\n set context(testContext: TestContext) {\n if (testContext === null || testContext === undefined) return;\n this._testContext = { ...testContext }; // Clone the context to avoid modifying the original object\n // // append the items that are not yet in the context and replace the ones that are\n testContext.items?.forEach(itemContext => {\n const existingItemContext = this._testContext.items.find(i => i.identifier === itemContext.identifier);\n if (existingItemContext) {\n existingItemContext.variables = itemContext.variables;\n } else {\n this._testContext.items.push(itemContext);\n }\n });\n }\n\n private _updateItemVariablesInTestContext(\n identifier: string,\n variables: VariableValue<string | string[] | null>[]\n ): void {\n // Update the test context with modified variables for the specified item\n this._testContext = {\n ...this._testContext, // Spread existing test context properties\n items: this._testContext.items.map(itemContext => {\n // If the item identifier doesn't match, keep it unchanged\n if (itemContext.identifier !== identifier) {\n return itemContext;\n }\n\n // Update the matching item with new variables\n return {\n ...itemContext, // Keep other properties of the item context\n variables: variables.map(variable => {\n // Find a matching variable in the current item context\n const matchingVariable = itemContext.variables.find(v => v.identifier === variable.identifier);\n\n // Merge matching variable with the new one, or use the new variable if no match\n return matchingVariable ? { ...matchingVariable, ...variable } : variable;\n })\n };\n })\n };\n }\n\n /**\n * Updates the variables of an assessment item in the test context.\n * - Matches the assessment item with the corresponding test context item.\n * - If the item is not found, logs a warning.\n * - Updates variables in the test context if exactly one variable exists.\n * - Otherwise, syncs the assessment item's variables with the test context.\n *\n * @param assessmentItem - The assessment item to update.\n */\n private _updateItemInTestContext = (assessmentItem: QtiAssessmentItem): void => {\n const { identifier, variables } = assessmentItem;\n\n // console.log(this._testContext);\n\n // Find the corresponding item in the test context by identifier\n const itemContext = this._testContext.items.find(i => i?.identifier === identifier);\n\n if (!itemContext) {\n console.warn(`Item IDs between assessment.xml and item.xml should match: ${identifier} is not found!`);\n return;\n }\n\n // Update variables in the test context or sync them to the assessment item\n if (itemContext.variables?.length === 1) {\n // The loaded qti-assessment-item itself has variables which are not in test context yet.\n this._updateItemVariablesInTestContext(identifier, variables);\n } else {\n // Sync the assessment item's variables with the test context\n assessmentItem.variables = [...(itemContext.variables || [])];\n }\n };\n}\n","import type { OutcomeVariable, VariableDeclaration } from '../../../exports/variables';\nimport type { QtiOutcomeProcessing } from '../../../qti-components';\nimport type { TestBase } from '../test-base';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestProcessingInterface {\n updateOutcomeVariable(identifier: string, value: string | string[] | undefined): void;\n getOutcome(identifier: string): Readonly<OutcomeVariable>;\n getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>>;\n outcomeProcessing(): boolean;\n}\nexport const TestProcessingMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestProcessingElement extends superClass {\n constructor(...args: any[]) {\n super(...args);\n this.addEventListener('qti-register-variable', (e: CustomEvent<{ variable: any }>) => {\n this._testContext = {\n ...this._testContext,\n testOutcomeVariables: [...this._testContext.testOutcomeVariables, e.detail.variable]\n };\n e.stopPropagation();\n });\n // wordt aangeroepen vanuit de processingtemplate\n this.addEventListener(\n 'qti-set-outcome-value',\n (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n }\n );\n }\n\n outcomeProcessing(): boolean {\n const outcomeProcessor = this.querySelector('qti-outcome-processing') as unknown as QtiOutcomeProcessing;\n if (!outcomeProcessor) return false;\n outcomeProcessor?.process();\n return true;\n }\n\n /* --------------------------- ENABLED WHEN UNIT TESTING OUTCOME PROCESSING ------------------------------------ */\n\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n this._testContext = {\n ...this._testContext,\n testOutcomeVariables: this._testContext.testOutcomeVariables.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : [...v.value, value as string]\n };\n })\n };\n }\n\n public getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n public getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this._testContext.testOutcomeVariables.find(v => v.identifier === identifier) || null;\n }\n /* --------------------------- ENABLED WHEN UNIT TESTING OUTCOME PROCESSING ------------------------------------ */\n }\n\n return TestProcessingElement as Constructor<TestProcessingInterface> & T;\n};\n","import { consume } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { TestContext } from '../context';\nimport { testContext } from '../context';\nimport type { QtiAssessmentItem } from '../../../qti-components';\n\n// Converter function to interpret \"true\" and \"false\" as booleans\nconst stringToBooleanConverter = {\n fromAttribute(value: string): boolean {\n return value === 'true';\n },\n toAttribute(value: boolean): string {\n return value ? 'true' : 'false';\n }\n};\n\n// @customElement('qti-assessment-item-ref')\nexport class QtiAssessmentItemRef extends LitElement {\n @property({ type: String }) category?: string;\n @property({ type: String }) identifier?: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) required?: boolean;\n @property({ type: Boolean, converter: stringToBooleanConverter }) fixed?: boolean;\n @property({ type: String }) href?: string;\n\n @consume({ context: testContext, subscribe: true })\n public _testContext?: TestContext;\n\n weigths: Map<string, number> = new Map();\n\n @property({ type: Object, attribute: false })\n xmlDoc!: DocumentFragment; // the XMLDocument\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n get assessmentItem(): QtiAssessmentItem | null {\n return this.renderRoot?.querySelector('qti-assessment-item');\n }\n\n async connectedCallback(): Promise<void> {\n // debugger;\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new CustomEvent('qti-assessment-item-ref-connected', {\n bubbles: true,\n composed: true,\n detail: { identifier: this.identifier, href: this.href, category: this.category }\n })\n );\n }\n\n render() {\n return html`${this.xmlDoc}`;\n }\n}\n\nif (!customElements.get('qti-assessment-item-ref')) {\n customElements.define('qti-assessment-item-ref', QtiAssessmentItemRef);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item-ref': QtiAssessmentItemRef;\n }\n}\n","import { consume } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { TestContext } from '../context';\nimport { testContext } from '../context';\n\n// https://www.imsglobal.org/sites/default/files/spec/qti/v3/info/index.html#Root_AssessmentSection\n\nconst stringToBooleanConverter = {\n fromAttribute(value: string): boolean {\n return value === 'true';\n },\n toAttribute(value: boolean): string {\n return value ? 'true' : 'false';\n }\n};\n\nexport class QtiAssessmentSection extends LitElement {\n @property({ type: String }) identifier: string;\n @property({ type: String }) required: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) fixed: boolean;\n @property({ type: String }) title: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) visible: boolean;\n @property({ type: Boolean, converter: stringToBooleanConverter, attribute: 'keep-together' }) keepTogether: boolean;\n\n @consume({ context: testContext, subscribe: true })\n public _testContext?: TestContext;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new Event('qti-assessment-section-connected', {\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html`<slot name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\nif (!customElements.get('qti-assessment-section')) {\n customElements.define('qti-assessment-section', QtiAssessmentSection);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-section': QtiAssessmentSection;\n }\n}\n","import { consume } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { TestContext } from '../context';\nimport { testContext } from '../context';\n\n@customElement('qti-assessment-test')\nexport class QtiAssessmentTest extends LitElement {\n @property({ type: String }) identifier: string;\n @property({ type: String }) title: string;\n\n @consume({ context: testContext, subscribe: true })\n public _testContext?: TestContext;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new CustomEvent('qti-assessment-test-connected', {\n detail: this,\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html` <slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-test': QtiAssessmentTest;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n@customElement('qti-test-part')\nexport class QtiTestPart extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) title: string = '';\n @property({ type: String }) class: string = '';\n\n @property({ type: String, attribute: 'navigation-mode' })\n NavigationMode: 'linear' | 'nonlinear' = 'nonlinear';\n\n @property({ type: String, attribute: 'submission-mode' })\n submissionMode: 'individual' | 'simultaneous' = 'individual';\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new Event('qti-test-part-connected', {\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html` <slot></slot>`;\n }\n}\n\nif (!customElements.get('qti-test-part')) {\n customElements.define('qti-test-part', QtiTestPart);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-test-part': QtiTestPart;\n }\n}\n"],"mappings":"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","names":["html","customElement","property","property","LitElement","state","LitElement","testContext","state","html","customElement","html","LitElement","property","LitElement","html","property","consume","html","LitElement","property","stringToBooleanConverter","LitElement","html","property","consume","consume","html","LitElement","customElement","property","LitElement","html","property","consume","customElement","html","LitElement","customElement","property","LitElement","html","property","customElement"]}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,15 @@
1
- export { O as Orientation, Q as QtiAssessmentItem, a as QtiAssessmentStimulusRef, g as QtiAssociableHotspot, h as QtiAssociateInteraction, i as QtiChoiceInteraction, b as QtiCompanionMaterialsInfo, W as QtiContentBody, j as QtiCustomInteraction, c as QtiCustomOperator, k as QtiEndAttemptInteraction, l as QtiExtendedTextInteraction, d as QtiFeedbackBlock, e as QtiFeedbackInline, p as QtiGap, m as QtiGapImg, n as QtiGapMatchInteraction, o as QtiGapText, q as QtiGraphicAssociateInteraction, r as QtiGraphicGapMatchInteraction, s as QtiGraphicOrderInteraction, t as QtiHotspotChoice, u as QtiHotspotInteraction, w as QtiHottext, v as QtiHottextInteraction, y as QtiInlineChoice, x as QtiInlineChoiceInteraction, K as QtiItemBody, R as QtiLookupOutcomeValue, z as QtiMatchInteraction, A as QtiMediaInteraction, f as QtiModalFeedback, B as QtiOrderInteraction, Z as QtiOutcomeDeclaration, L as QtiOutcomeProcessing, M as QtiOutcomeProcessingProcessor, C as QtiPortableCustomInteraction, D as QtiPositionObjectStage, N as QtiPrompt, _ as QtiResponseDeclaration, P as QtiResponseProcessing, X as QtiRubricBlock, U as QtiRule, V as QtiRuleBase, E as QtiSelectPointInteraction, F as QtiSimpleAssociableChoice, G as QtiSimpleChoice, H as QtiSliderInteraction, Y as QtiStylesheet, S as QtiSubtract, I as QtiTextEntryInteraction, J as QtiUploadInteraction, T as qtiSubtractMixin } from './qti-response-declaration-DAeBp8HH.js';
1
+ export { O as Orientation, Q as QtiAssessmentItem, a as QtiAssessmentStimulusRef, g as QtiAssociableHotspot, h as QtiAssociateInteraction, i as QtiChoiceInteraction, b as QtiCompanionMaterialsInfo, W as QtiContentBody, j as QtiCustomInteraction, c as QtiCustomOperator, k as QtiEndAttemptInteraction, l as QtiExtendedTextInteraction, d as QtiFeedbackBlock, e as QtiFeedbackInline, p as QtiGap, m as QtiGapImg, n as QtiGapMatchInteraction, o as QtiGapText, q as QtiGraphicAssociateInteraction, r as QtiGraphicGapMatchInteraction, s as QtiGraphicOrderInteraction, t as QtiHotspotChoice, u as QtiHotspotInteraction, w as QtiHottext, v as QtiHottextInteraction, y as QtiInlineChoice, x as QtiInlineChoiceInteraction, K as QtiItemBody, R as QtiLookupOutcomeValue, z as QtiMatchInteraction, A as QtiMediaInteraction, f as QtiModalFeedback, B as QtiOrderInteraction, Z as QtiOutcomeDeclaration, L as QtiOutcomeProcessing, M as QtiOutcomeProcessingProcessor, C as QtiPortableCustomInteraction, D as QtiPositionObjectStage, N as QtiPrompt, _ as QtiResponseDeclaration, P as QtiResponseProcessing, X as QtiRubricBlock, U as QtiRule, V as QtiRuleBase, E as QtiSelectPointInteraction, F as QtiSimpleAssociableChoice, G as QtiSimpleChoice, H as QtiSliderInteraction, Y as QtiStylesheet, S as QtiSubtract, I as QtiTextEntryInteraction, J as QtiUploadInteraction, T as qtiSubtractMixin } from './qti-response-declaration-Di9CsqiJ.js';
2
2
  export { QtiAnd, QtiBaseValue, QtiContains, QtiCorrect, QtiEqual, QtiEqualRounded, QtiGt, QtiGte, QtiIsNull, QtiLt, QtiLte, QtiMapResponse, QtiMatch, QtiMember, QtiMultiple, QtiNot, QtiOr, QtiOrdered, QtiPositionObjectInteraction, QtiPrintedVariable, QtiProduct, QtiResponseCondition, QtiResponseElse, QtiResponseElseIf, QtiResponseIf, QtiSetOutcomeValue, QtiSetOutcomeValueRule, QtiStringMatch, QtiSum, QtiSumExpression, QtiVariable, qtiAndMixin } from './qti-components/index.js';
3
3
  export { Q as QtiMapping } from './variables-cO3DzqJy.js';
4
4
  export { QtiTest, TestContainer } from './qti-test/core/index.js';
5
- export { Q as QtiAssessmentItemRef, a as QtiAssessmentSection, b as QtiAssessmentTest, c as QtiTestPart, T as TestContext, d as TestElement, t as testContext, e as testElement } from './test.context-CaENAJNk.js';
5
+ export { Q as QtiAssessmentItemRef, a as QtiAssessmentSection, b as QtiAssessmentTest, c as QtiTestPart, T as TestContext, d as TestElement, t as testContext, e as testElement } from './test.context-CmsDQ8k2.js';
6
6
  export { TestComponent } from './qti-test/components/test-component.abstract.js';
7
7
  export { TestNext } from './qti-test/components/test-next.js';
8
8
  export { TestPrev } from './qti-test/components/test-prev.js';
9
9
  export { TestView } from './qti-test/components/test-view.js';
10
10
  export { TestItemLink } from './qti-test/components/test-item-link.js';
11
+ export { TestEndAttempt } from './qti-test/components/test-end-attempt.js';
12
+ export { TestShowCorrectResponse } from './qti-test/components/test-show-correct-response.js';
11
13
  export { TestPagingButtonsStamp } from './qti-test/components/test-paging-buttons-stamp.js';
12
14
  export { ItemContainer, QtiItem } from './qti-item/core/index.js';
13
15
  export { ManifestInfo, getItemByUri, getManifestInfo } from './qti-loader/index.js';
package/dist/index.js CHANGED
@@ -1,11 +1,3 @@
1
- import {
2
- QtiAssessmentItemRef,
3
- QtiAssessmentSection,
4
- QtiAssessmentTest,
5
- QtiTest,
6
- QtiTestPart,
7
- TestContainer
8
- } from "./chunks/chunk-4GNVYCBN.js";
9
1
  import {
10
2
  QtiAnd,
11
3
  QtiAssessmentItem,
@@ -91,7 +83,7 @@ import {
91
83
  QtiVariable,
92
84
  qtiAndMixin,
93
85
  qtiSubtractMixin
94
- } from "./chunks/chunk-ZHAJ3CMP.js";
86
+ } from "./chunks/chunk-6PAEJQSQ.js";
95
87
  import {
96
88
  getItemByUri,
97
89
  getManifestInfo
@@ -99,39 +91,53 @@ import {
99
91
  import {
100
92
  ItemContainer,
101
93
  QtiItem
102
- } from "./chunks/chunk-HHVRU3AJ.js";
103
- import "./chunks/chunk-J2SHENRN.js";
94
+ } from "./chunks/chunk-XCHS3RTZ.js";
95
+ import {
96
+ QtiAssessmentItemRef,
97
+ QtiAssessmentSection,
98
+ QtiAssessmentTest,
99
+ QtiTest,
100
+ QtiTestPart,
101
+ TestContainer
102
+ } from "./chunks/chunk-ZQXZ6PK7.js";
103
+ import "./chunks/chunk-NZQKGIJP.js";
104
104
  import {
105
105
  qtiTransformItem,
106
106
  qtiTransformManifest,
107
107
  qtiTransformTest
108
108
  } from "./chunks/chunk-XDMSEAYC.js";
109
- import "./chunks/chunk-UN2IFSGC.js";
109
+ import "./chunks/chunk-HOTNM5DT.js";
110
+ import {
111
+ TestEndAttempt
112
+ } from "./chunks/chunk-W4272Q5U.js";
110
113
  import {
111
114
  TestItemLink
112
- } from "./chunks/chunk-7QMCKYDR.js";
115
+ } from "./chunks/chunk-CEXAR7BF.js";
113
116
  import {
114
117
  TestNext
115
- } from "./chunks/chunk-6JXR63MH.js";
118
+ } from "./chunks/chunk-RX3BRYYI.js";
116
119
  import {
117
120
  TestPagingButtonsStamp
118
- } from "./chunks/chunk-KYAIMBP5.js";
121
+ } from "./chunks/chunk-YQB6YLNW.js";
119
122
  import {
120
123
  TestPrev
121
- } from "./chunks/chunk-GSWZT6N2.js";
124
+ } from "./chunks/chunk-DNHDFXTV.js";
125
+ import {
126
+ TestShowCorrectResponse
127
+ } from "./chunks/chunk-GQ5P3NWC.js";
122
128
  import {
123
129
  TestView
124
- } from "./chunks/chunk-A24F75DB.js";
125
- import "./chunks/chunk-4O5F7WV7.js";
130
+ } from "./chunks/chunk-WWN5AD6V.js";
126
131
  import {
127
132
  TestComponent
128
- } from "./chunks/chunk-3EU75IUF.js";
133
+ } from "./chunks/chunk-MLT7V47R.js";
134
+ import "./chunks/chunk-D3RGDWKP.js";
129
135
  import {
130
136
  testContext,
131
137
  testElement
132
- } from "./chunks/chunk-UFYWCLXF.js";
133
- import "./chunks/chunk-D3RGDWKP.js";
138
+ } from "./chunks/chunk-AUWATZ65.js";
134
139
  import "./chunks/chunk-ELDMXTUQ.js";
140
+ import "./chunks/chunk-4O5F7WV7.js";
135
141
  import "./chunks/chunk-OIRWOI3E.js";
136
142
  import "./chunks/chunk-DLUJN2FW.js";
137
143
  import "./chunks/chunk-XSI6FXGD.js";
@@ -230,10 +236,12 @@ export {
230
236
  QtiVariable,
231
237
  TestComponent,
232
238
  TestContainer,
239
+ TestEndAttempt,
233
240
  TestItemLink,
234
241
  TestNext,
235
242
  TestPagingButtonsStamp,
236
243
  TestPrev,
244
+ TestShowCorrectResponse,
237
245
  TestView,
238
246
  getItemByUri,
239
247
  getManifestInfo,
package/dist/item.css CHANGED
@@ -2620,6 +2620,14 @@ qti-response-declaration {
2620
2620
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' width='100%' height='100%' viewBox='0 0 24 24'%3E%3Cpath d='M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z'/%3E%3C/svg%3E");
2621
2621
  }
2622
2622
 
2623
+ &:state(correct-response),
2624
+ &[data-correct-response='true'] {
2625
+ &::after {
2626
+ content: '\02714';
2627
+ color: #16a34a; /* text-green-600 */
2628
+ }
2629
+ }
2630
+
2623
2631
  gap: 0.5rem;
2624
2632
 
2625
2633
  border-radius: var(--qti-border-radius);
@@ -2631,8 +2639,6 @@ qti-response-declaration {
2631
2639
  cursor: pointer
2632
2640
  }
2633
2641
 
2634
- /* } */
2635
-
2636
2642
  &.qti-input-control-hidden {
2637
2643
  qti-hottext {
2638
2644
  /* --qti-padding-md: 0.1rem;
@@ -1,5 +1,5 @@
1
- import { U as QtiRule, V as QtiRuleBase } from '../qti-response-declaration-DAeBp8HH.js';
2
- export { O as Orientation, Q as QtiAssessmentItem, a as QtiAssessmentStimulusRef, g as QtiAssociableHotspot, h as QtiAssociateInteraction, i as QtiChoiceInteraction, b as QtiCompanionMaterialsInfo, W as QtiContentBody, j as QtiCustomInteraction, c as QtiCustomOperator, k as QtiEndAttemptInteraction, l as QtiExtendedTextInteraction, d as QtiFeedbackBlock, e as QtiFeedbackInline, p as QtiGap, m as QtiGapImg, n as QtiGapMatchInteraction, o as QtiGapText, q as QtiGraphicAssociateInteraction, r as QtiGraphicGapMatchInteraction, s as QtiGraphicOrderInteraction, t as QtiHotspotChoice, u as QtiHotspotInteraction, w as QtiHottext, v as QtiHottextInteraction, y as QtiInlineChoice, x as QtiInlineChoiceInteraction, K as QtiItemBody, R as QtiLookupOutcomeValue, z as QtiMatchInteraction, A as QtiMediaInteraction, f as QtiModalFeedback, B as QtiOrderInteraction, Z as QtiOutcomeDeclaration, L as QtiOutcomeProcessing, M as QtiOutcomeProcessingProcessor, C as QtiPortableCustomInteraction, D as QtiPositionObjectStage, N as QtiPrompt, _ as QtiResponseDeclaration, P as QtiResponseProcessing, X as QtiRubricBlock, E as QtiSelectPointInteraction, F as QtiSimpleAssociableChoice, G as QtiSimpleChoice, H as QtiSliderInteraction, Y as QtiStylesheet, S as QtiSubtract, I as QtiTextEntryInteraction, J as QtiUploadInteraction, T as qtiSubtractMixin } from '../qti-response-declaration-DAeBp8HH.js';
1
+ import { U as QtiRule, V as QtiRuleBase } from '../qti-response-declaration-Di9CsqiJ.js';
2
+ export { O as Orientation, Q as QtiAssessmentItem, a as QtiAssessmentStimulusRef, g as QtiAssociableHotspot, h as QtiAssociateInteraction, i as QtiChoiceInteraction, b as QtiCompanionMaterialsInfo, W as QtiContentBody, j as QtiCustomInteraction, c as QtiCustomOperator, k as QtiEndAttemptInteraction, l as QtiExtendedTextInteraction, d as QtiFeedbackBlock, e as QtiFeedbackInline, p as QtiGap, m as QtiGapImg, n as QtiGapMatchInteraction, o as QtiGapText, q as QtiGraphicAssociateInteraction, r as QtiGraphicGapMatchInteraction, s as QtiGraphicOrderInteraction, t as QtiHotspotChoice, u as QtiHotspotInteraction, w as QtiHottext, v as QtiHottextInteraction, y as QtiInlineChoice, x as QtiInlineChoiceInteraction, K as QtiItemBody, R as QtiLookupOutcomeValue, z as QtiMatchInteraction, A as QtiMediaInteraction, f as QtiModalFeedback, B as QtiOrderInteraction, Z as QtiOutcomeDeclaration, L as QtiOutcomeProcessing, M as QtiOutcomeProcessingProcessor, C as QtiPortableCustomInteraction, D as QtiPositionObjectStage, N as QtiPrompt, _ as QtiResponseDeclaration, P as QtiResponseProcessing, X as QtiRubricBlock, E as QtiSelectPointInteraction, F as QtiSimpleAssociableChoice, G as QtiSimpleChoice, H as QtiSliderInteraction, Y as QtiStylesheet, S as QtiSubtract, I as QtiTextEntryInteraction, J as QtiUploadInteraction, T as qtiSubtractMixin } from '../qti-response-declaration-Di9CsqiJ.js';
3
3
  import * as lit from 'lit';
4
4
  import { LitElement } from 'lit';
5
5
  import * as lit_html from 'lit-html';