@citolab/qti-components 8.0.1 → 8.0.2

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 (60) hide show
  1. package/cdn/index.global.js +1 -1
  2. package/cdn/index.js +103 -103
  3. package/dist/base.d.ts +3 -3
  4. package/dist/base.js +1 -1
  5. package/dist/chunk-4DB4SC5K.js +100 -0
  6. package/dist/chunk-4DB4SC5K.js.map +1 -0
  7. package/dist/{chunk-WVVMNF74.js → chunk-7AVWRQIS.js} +188 -160
  8. package/dist/{chunk-WVVMNF74.js.map → chunk-7AVWRQIS.js.map} +1 -1
  9. package/dist/{chunk-CAO4JRLY.js → chunk-BQFWCZFH.js} +2 -2
  10. package/dist/{chunk-LVBIQDPM.js → chunk-CK7AV2UJ.js} +147 -101
  11. package/dist/chunk-CK7AV2UJ.js.map +1 -0
  12. package/dist/{chunk-7HC5SMCU.js → chunk-G6GFQDVN.js} +1 -96
  13. package/dist/chunk-G6GFQDVN.js.map +1 -0
  14. package/dist/{chunk-RXGDQDOV.js → chunk-HBSWJC3B.js} +478 -392
  15. package/dist/chunk-HBSWJC3B.js.map +1 -0
  16. package/dist/chunk-HQESINXH.js +834 -0
  17. package/dist/chunk-HQESINXH.js.map +1 -0
  18. package/dist/{chunk-XU7HNT4F.js → chunk-J5SQLKNP.js} +145 -119
  19. package/dist/{chunk-XU7HNT4F.js.map → chunk-J5SQLKNP.js.map} +1 -1
  20. package/dist/{chunk-V5G7X53Y.js → chunk-NJQHUUTN.js} +2 -2
  21. package/dist/{chunk-QECOPVPO.js → chunk-RSVRS5AK.js} +59 -58
  22. package/dist/chunk-RSVRS5AK.js.map +1 -0
  23. package/dist/{chunk-F4BNJWYN.js → chunk-TWPXES3S.js} +642 -673
  24. package/dist/chunk-TWPXES3S.js.map +1 -0
  25. package/dist/{chunk-NA2N2WSG.js → chunk-VAE6HBKR.js} +176 -152
  26. package/dist/{chunk-NA2N2WSG.js.map → chunk-VAE6HBKR.js.map} +1 -1
  27. package/dist/{chunk-3AJOQCDU.js → chunk-ZII6M3SN.js} +2 -2
  28. package/dist/{computed.types.d-rKLSPvVG.d.ts → computed.types.d-DpKIYO6e.d.ts} +2 -0
  29. package/dist/corrections.d.ts +12 -29
  30. package/dist/corrections.js +8 -9
  31. package/dist/elements.d.ts +86 -86
  32. package/dist/elements.js +4 -5
  33. package/dist/index.d.ts +6 -37
  34. package/dist/index.js +13 -14
  35. package/dist/{interaction.d-D4MstYRz.d.ts → interaction.d-CJiMv8H7.d.ts} +13 -2
  36. package/dist/interactions.d.ts +11 -1299
  37. package/dist/interactions.js +4 -5
  38. package/dist/item.d.ts +3 -3
  39. package/dist/item.js +5 -5
  40. package/dist/processing.js +2 -2
  41. package/dist/qti-components-jsx.d.ts +759 -739
  42. package/dist/qti-test.d-_YAlhDbt.d.ts +702 -0
  43. package/dist/qti-text-entry-interaction.d-BGdfV9qG.d.ts +1567 -0
  44. package/dist/test.d.ts +11 -678
  45. package/dist/test.js +6 -7
  46. package/package.json +8 -7
  47. package/dist/chunk-64XSIBGO.js +0 -241
  48. package/dist/chunk-64XSIBGO.js.map +0 -1
  49. package/dist/chunk-7HC5SMCU.js.map +0 -1
  50. package/dist/chunk-F4BNJWYN.js.map +0 -1
  51. package/dist/chunk-H3J7LFRO.js +0 -2243
  52. package/dist/chunk-H3J7LFRO.js.map +0 -1
  53. package/dist/chunk-LVBIQDPM.js.map +0 -1
  54. package/dist/chunk-QECOPVPO.js.map +0 -1
  55. package/dist/chunk-RXGDQDOV.js.map +0 -1
  56. package/dist/chunk-X3E5HXG2.js +0 -20
  57. package/dist/chunk-X3E5HXG2.js.map +0 -1
  58. /package/dist/{chunk-CAO4JRLY.js.map → chunk-BQFWCZFH.js.map} +0 -0
  59. /package/dist/{chunk-V5G7X53Y.js.map → chunk-NJQHUUTN.js.map} +0 -0
  60. /package/dist/{chunk-3AJOQCDU.js.map → chunk-ZII6M3SN.js.map} +0 -0
@@ -1,34 +1,30 @@
1
1
  import {
2
- item_default,
3
- m
4
- } from "./chunk-7HC5SMCU.js";
2
+ item_default
3
+ } from "./chunk-G6GFQDVN.js";
5
4
  import {
6
5
  watch
7
- } from "./chunk-64XSIBGO.js";
6
+ } from "./chunk-4DB4SC5K.js";
8
7
  import {
9
8
  qtiTransformItem
10
9
  } from "./chunk-IJD53WY6.js";
11
10
  import {
12
- T,
13
- c,
14
11
  computedItemContext,
15
12
  configContext,
16
- e,
17
- i,
18
- i2,
19
- n2 as n,
20
- qtiContext,
21
- r
22
- } from "./chunk-H3J7LFRO.js";
13
+ qtiContext
14
+ } from "./chunk-HQESINXH.js";
23
15
 
24
16
  // ../qti-item/dist/components/item-container/item-container.js
17
+ import { consume } from "@lit/context";
18
+ import { LitElement, html } from "lit";
19
+ import { property, state } from "lit/decorators.js";
20
+ import { until } from "lit/directives/until.js";
25
21
  var __decorate = function(decorators, target, key, desc) {
26
- var c2 = arguments.length, r2 = c2 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r2 = Reflect.decorate(decorators, target, key, desc);
28
- else for (var i3 = decorators.length - 1; i3 >= 0; i3--) if (d = decorators[i3]) r2 = (c2 < 3 ? d(r2) : c2 > 3 ? d(target, key, r2) : d(target, key)) || r2;
29
- return c2 > 3 && r2 && Object.defineProperty(target, key, r2), r2;
22
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
23
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
24
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
25
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
30
26
  };
31
- var ItemContainer = class extends i2 {
27
+ var ItemContainer = class extends LitElement {
32
28
  constructor() {
33
29
  super(...arguments);
34
30
  this.customElementRegistry = null;
@@ -85,7 +81,7 @@ var ItemContainer = class extends i2 {
85
81
  }
86
82
  #initializeTemplateContent() {
87
83
  const template = this.querySelector("template");
88
- this.#templateContent = template ? template.content : T``;
84
+ this.#templateContent = template ? template.content : html``;
89
85
  }
90
86
  #applyStyles() {
91
87
  const sheet = new CSSStyleSheet();
@@ -93,28 +89,28 @@ var ItemContainer = class extends i2 {
93
89
  this.shadowRoot.adoptedStyleSheets = [sheet];
94
90
  }
95
91
  render() {
96
- return T`
92
+ return html`
97
93
  ${this.#templateContent}
98
94
  <slot></slot>
99
- ${m(this.itemDoc, T`<span>Loading...</span>`)}
95
+ ${until(this.itemDoc, html`<span>Loading...</span>`)}
100
96
  `;
101
97
  }
102
98
  };
103
99
  __decorate([
104
- n({ attribute: false })
100
+ property({ attribute: false })
105
101
  ], ItemContainer.prototype, "customElementRegistry", void 0);
106
102
  __decorate([
107
- n({ type: String, attribute: "item-url" })
103
+ property({ type: String, attribute: "item-url" })
108
104
  ], ItemContainer.prototype, "itemURL", void 0);
109
105
  __decorate([
110
- r()
106
+ state()
111
107
  ], ItemContainer.prototype, "itemDoc", void 0);
112
108
  __decorate([
113
- r()
109
+ state()
114
110
  ], ItemContainer.prototype, "itemXML", void 0);
115
111
  __decorate([
116
- r(),
117
- c({ context: qtiContext, subscribe: true })
112
+ state(),
113
+ consume({ context: qtiContext, subscribe: true })
118
114
  ], ItemContainer.prototype, "qtiContext", void 0);
119
115
  __decorate([
120
116
  watch("itemURL", { waitUntilFirstUpdate: true })
@@ -124,15 +120,17 @@ __decorate([
124
120
  ], ItemContainer.prototype, "handleItemXMLChange", null);
125
121
 
126
122
  // ../qti-item/dist/components/item-print-variables/item-print-variables.js
123
+ import { consume as consume2 } from "@lit/context";
124
+ import { css, html as html2, LitElement as LitElement2 } from "lit";
127
125
  var __decorate2 = function(decorators, target, key, desc) {
128
- var c2 = arguments.length, r2 = c2 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
129
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r2 = Reflect.decorate(decorators, target, key, desc);
130
- else for (var i3 = decorators.length - 1; i3 >= 0; i3--) if (d = decorators[i3]) r2 = (c2 < 3 ? d(r2) : c2 > 3 ? d(target, key, r2) : d(target, key)) || r2;
131
- return c2 > 3 && r2 && Object.defineProperty(target, key, r2), r2;
126
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
127
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
128
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
129
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
132
130
  };
133
- var ItemPrintVariables = class extends i2 {
131
+ var ItemPrintVariables = class extends LitElement2 {
134
132
  static {
135
- this.styles = i`
133
+ this.styles = css`
136
134
  table {
137
135
  width: 100%;
138
136
  border-collapse: collapse;
@@ -158,10 +156,10 @@ var ItemPrintVariables = class extends i2 {
158
156
  render() {
159
157
  const activeItem = this.computedContext;
160
158
  if (!activeItem || !activeItem.variables)
161
- return T``;
159
+ return html2``;
162
160
  const responseVariables = activeItem.variables.filter((v) => v.type === "response");
163
161
  const outcomeVariables = activeItem.variables.filter((v) => v.type === "outcome");
164
- const renderTable = (variables, title) => T`
162
+ const renderTable = (variables, title) => html2`
165
163
  <h3>${title}</h3>
166
164
  <table>
167
165
  <thead>
@@ -176,9 +174,9 @@ var ItemPrintVariables = class extends i2 {
176
174
  <tbody>
177
175
  ${variables.map((v) => {
178
176
  const correctResponse = v.correctResponse ? Array.isArray(v.correctResponse) ? v.correctResponse.join(", ") : v.correctResponse : "";
179
- const mapEntries = v.mapping?.mapEntries?.map((m2) => `${m2.mapKey}=${m2.mappedValue}pt`).join(", ") || "";
180
- const areaMapEntries = v.areaMapping?.areaMapEntries?.map((m2) => `${m2.shape}(${m2.coords})=${m2.mappedValue}pt`).join(", ") || "";
181
- return T`
177
+ const mapEntries = v.mapping?.mapEntries?.map((m) => `${m.mapKey}=${m.mappedValue}pt`).join(", ") || "";
178
+ const areaMapEntries = v.areaMapping?.areaMapEntries?.map((m) => `${m.shape}(${m.coords})=${m.mappedValue}pt`).join(", ") || "";
179
+ return html2`
182
180
  <tr>
183
181
  <td>${v.identifier}</td>
184
182
  <td>${Array.isArray(v.value) ? v.value.join(", ") : v.value}</td>
@@ -191,23 +189,26 @@ var ItemPrintVariables = class extends i2 {
191
189
  </tbody>
192
190
  </table>
193
191
  `;
194
- return T`
192
+ return html2`
195
193
  ${renderTable(responseVariables, "Response Variables")} ${renderTable(outcomeVariables, "Outcome Variables")}
196
194
  `;
197
195
  }
198
196
  };
199
197
  __decorate2([
200
- c({ context: computedItemContext, subscribe: true })
198
+ consume2({ context: computedItemContext, subscribe: true })
201
199
  ], ItemPrintVariables.prototype, "computedContext", void 0);
202
200
 
203
201
  // ../qti-item/dist/components/qti-item/qti-item.js
202
+ import { provide } from "@lit/context";
203
+ import { html as html3, LitElement as LitElement3 } from "lit";
204
+ import { state as state2 } from "lit/decorators.js";
204
205
  var __decorate3 = function(decorators, target, key, desc) {
205
- var c2 = arguments.length, r2 = c2 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
206
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r2 = Reflect.decorate(decorators, target, key, desc);
207
- else for (var i3 = decorators.length - 1; i3 >= 0; i3--) if (d = decorators[i3]) r2 = (c2 < 3 ? d(r2) : c2 > 3 ? d(target, key, r2) : d(target, key)) || r2;
208
- return c2 > 3 && r2 && Object.defineProperty(target, key, r2), r2;
206
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
207
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
208
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
209
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
209
210
  };
210
- var QtiItem = class extends i2 {
211
+ var QtiItem = class extends LitElement3 {
211
212
  // Store event handlers as instance properties
212
213
  #onItemContextChanged;
213
214
  #onAssessmentItemConnected;
@@ -226,12 +227,12 @@ var QtiItem = class extends i2 {
226
227
  this.addEventListener("qti-item-context-updated", this.#onItemContextChanged);
227
228
  this.addEventListener("qti-assessment-item-connected", this.#onAssessmentItemConnected);
228
229
  }
229
- #handleItemContextChanged(e2) {
230
- this.#updateItemVariablesInTestContext(e2.detail.itemContext.identifier, e2.detail?.itemContext?.variables || []);
230
+ #handleItemContextChanged(e) {
231
+ this.#updateItemVariablesInTestContext(e.detail.itemContext.identifier, e.detail?.itemContext?.variables || []);
231
232
  }
232
- #handleAssessmentItemConnected(e2) {
233
- const fullVariables = e2.detail._context.variables;
234
- this.assessmentItem = e2.detail;
233
+ #handleAssessmentItemConnected(e) {
234
+ const fullVariables = e.detail._context.variables;
235
+ this.assessmentItem = e.detail;
235
236
  this.computedContext = this.computedContext?.identifier === this.assessmentItem.identifier ? { ...this.computedContext, title: this.assessmentItem.title } : {
236
237
  identifier: this.assessmentItem.identifier,
237
238
  title: this.assessmentItem.title,
@@ -257,7 +258,7 @@ var QtiItem = class extends i2 {
257
258
  };
258
259
  }
259
260
  render() {
260
- return T`<slot></slot>`;
261
+ return html3`<slot></slot>`;
261
262
  }
262
263
  disconnectedCallback() {
263
264
  super.disconnectedCallback();
@@ -266,16 +267,16 @@ var QtiItem = class extends i2 {
266
267
  }
267
268
  };
268
269
  __decorate3([
269
- r(),
270
- e({ context: computedItemContext })
270
+ state2(),
271
+ provide({ context: computedItemContext })
271
272
  ], QtiItem.prototype, "computedContext", void 0);
272
273
  __decorate3([
273
- r(),
274
- e({ context: configContext })
274
+ state2(),
275
+ provide({ context: configContext })
275
276
  ], QtiItem.prototype, "configContext", void 0);
276
277
  __decorate3([
277
- r(),
278
- e({ context: qtiContext })
278
+ state2(),
279
+ provide({ context: qtiContext })
279
280
  ], QtiItem.prototype, "qtiContext", void 0);
280
281
 
281
282
  // ../qti-item/dist/elements.js
@@ -291,4 +292,4 @@ export {
291
292
  QtiItem,
292
293
  qtiItemElements
293
294
  };
294
- //# sourceMappingURL=chunk-QECOPVPO.js.map
295
+ //# sourceMappingURL=chunk-RSVRS5AK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../qti-item/src/components/item-container/item-container.ts","../../qti-item/src/components/item-print-variables/item-print-variables.ts","../../qti-item/src/components/qti-item/qti-item.ts","../../qti-item/src/elements.ts"],"sourcesContent":["import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { until } from 'lit/directives/until.js';\n\nimport { qtiContext } from '@qti-components/base';\nimport { watch } from '@qti-components/utilities';\nimport { qtiTransformItem } from '@qti-components/transformers';\n\n// eslint-disable-next-line import/no-relative-packages\nimport itemCss from '../../../../qti-theme/src/item.css?inline';\n\nimport type { QtiContext } from '@qti-components/base';\n\n/**\n * `<item-container>` is a custom element designed for hosting the qti-assessment-item.\n * The `qti-assessment-item` will be placed inside the shadow DOM of this element.\n * The element loads the item from the provided URL and renders it inside the shadow DOM.\n *\n * ### Styling\n * Add a class to the element for styling.\n *\n * ```html\n * <qti-item>\n * <item-container class=\"m-4 bg-white\" item-url=\"./path/to/item.xml\"></item-container>\n * </qti-item>\n * ```\n */\n\nexport class ItemContainer extends LitElement {\n /** Scoped registry used by the item shadow root. Must be set before connection. */\n @property({ attribute: false })\n customElementRegistry: CustomElementRegistry | null = null;\n\n /** URL of the item to load */\n @property({ type: String, attribute: 'item-url' })\n itemURL: string | null = null;\n\n /** A parsed HTML document */\n @state()\n itemDoc: DocumentFragment | null = null;\n\n /** The raw XML string */\n @state()\n itemXML: string | null = null;\n\n @state()\n @consume({ context: qtiContext, subscribe: true })\n protected qtiContext: QtiContext = {\n QTI_CONTEXT: { testIdentifier: '', candidateIdentifier: '', environmentIdentifier: 'default' }\n };\n\n /** Template content if provided */\n #templateContent: unknown = null;\n #resolvedCustomElementRegistry: CustomElementRegistry | null = null;\n\n protected override createRenderRoot(): HTMLElement | DocumentFragment {\n const registry = this.customElementRegistry;\n\n this.#resolvedCustomElementRegistry = registry;\n\n return (\n this.shadowRoot ??\n this.attachShadow({\n ...(this.constructor as typeof ItemContainer).shadowRootOptions,\n ...(registry ? { customElementRegistry: registry } : {})\n })\n );\n }\n\n @watch('itemURL', { waitUntilFirstUpdate: true })\n protected async handleItemURLChange() {\n if (!this.itemURL) return;\n try {\n const explicitSeed = this.qtiContext?.QTI_CONTEXT?.seed;\n const api = (await qtiTransformItem().load(this.itemURL)).shuffleInteractions(explicitSeed);\n this.itemDoc = api.htmlDoc(this.#resolvedCustomElementRegistry ?? undefined);\n } catch (error) {\n console.error('Error loading or parsing XML:', error);\n }\n }\n\n @watch('itemXML', { waitUntilFirstUpdate: true })\n protected handleItemXMLChange() {\n if (!this.itemXML) return;\n try {\n this.itemDoc = qtiTransformItem()\n .parse(this.itemXML)\n .htmlDoc(this.#resolvedCustomElementRegistry ?? undefined);\n } catch (error) {\n console.error('Error parsing XML:', error);\n }\n }\n\n override async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.#initializeTemplateContent();\n this.#applyStyles();\n if (this.itemURL) {\n this.handleItemURLChange();\n }\n if (this.itemXML) {\n this.handleItemXMLChange();\n }\n }\n\n #initializeTemplateContent() {\n const template = this.querySelector('template') as HTMLTemplateElement;\n this.#templateContent = template ? template.content : html``;\n }\n\n #applyStyles() {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(itemCss);\n this.shadowRoot.adoptedStyleSheets = [sheet];\n }\n\n override render() {\n return html`\n ${this.#templateContent}\n <slot></slot>\n ${until(this.itemDoc, html`<span>Loading...</span>`)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'item-container': ItemContainer;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html, LitElement } from 'lit';\n\nimport { computedItemContext } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { ComputedItemContext } from '@qti-components/base';\n\nexport class ItemPrintVariables extends LitElement {\n @consume({ context: computedItemContext, subscribe: true })\n protected computedContext?: ComputedItemContext;\n\n static override styles = css`\n table {\n width: 100%;\n border-collapse: collapse;\n margin: 20px 0;\n font-size: 14px;\n text-align: left;\n }\n th,\n td {\n border: 1px solid #ddd;\n padding: 8px;\n }\n th {\n background-color: #f4f4f4;\n font-weight: bold;\n }\n h3 {\n margin-top: 20px;\n font-size: 16px;\n }\n `;\n\n override render() {\n const activeItem = this.computedContext;\n\n if (!activeItem || !activeItem.variables) return html``;\n\n const responseVariables: ResponseVariable[] = activeItem.variables.filter(v => v.type === 'response');\n const outcomeVariables = activeItem.variables.filter(v => v.type === 'outcome');\n\n const renderTable = (variables: ResponseVariable[], title: string) => html`\n <h3>${title}</h3>\n <table>\n <thead>\n <tr>\n <th>Identifier</th>\n <th>Value</th>\n <th>Cardinality</th>\n <th>Base Type</th>\n <th>Correct Response / Mappings</th>\n </tr>\n </thead>\n <tbody>\n ${variables.map(v => {\n const correctResponse = v.correctResponse\n ? Array.isArray(v.correctResponse)\n ? v.correctResponse.join(', ')\n : v.correctResponse\n : '';\n\n const mapEntries = v.mapping?.mapEntries?.map(m => `${m.mapKey}=${m.mappedValue}pt`).join(', ') || '';\n\n const areaMapEntries =\n v.areaMapping?.areaMapEntries?.map(m => `${m.shape}(${m.coords})=${m.mappedValue}pt`).join(', ') || '';\n\n return html`\n <tr>\n <td>${v.identifier}</td>\n <td>${Array.isArray(v.value) ? v.value.join(', ') : v.value}</td>\n <td>${v.cardinality}</td>\n <td>${v.baseType}</td>\n <td>${correctResponse || mapEntries || areaMapEntries}</td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `;\n\n return html`\n ${renderTable(responseVariables, 'Response Variables')} ${renderTable(outcomeVariables, 'Outcome Variables')}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'item-print-variables': ItemPrintVariables;\n }\n}\n","import { provide } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { state } from 'lit/decorators.js';\n\nimport { computedItemContext } from '@qti-components/base';\nimport { configContext } from '@qti-components/base';\nimport { qtiContext } from '@qti-components/base';\n\nimport type { QtiAssessmentItem } from '@qti-components/elements';\nimport type { ConfigContext } from '@qti-components/base';\nimport type { QtiContext } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\nimport type { VariableDeclaration } from '@qti-components/base';\nimport type { ComputedItemContext } from '@qti-components/base';\n\n/**\n * `<qti-item>` is a custom element designed for rendering a single `qti-assessment-item`.\n * It can also host some functionalities to interact with the item like scoring, showing feedback, etc.\n * Placing a mandatory `<item-container>` inside '<qti-item>' will load or parse the item and render it.\n * See `<item-container>` for more details.\n *\n * ```html\n * <qti-item>\n * <item-container class=\"m-4 bg-white\" item-url=\"./path/to/item.xml\"></item-container>\n * </qti-item>\n * ```\n */\n\nexport class QtiItem extends LitElement {\n @state()\n @provide({ context: computedItemContext })\n public computedContext: ComputedItemContext;\n protected assessmentItem?: QtiAssessmentItem;\n\n @state()\n @provide({ context: configContext })\n public configContext: ConfigContext = {};\n\n /**\n * Provided so that descendants (e.g. `<item-container>`) can read the QTI runtime\n * context for standalone item delivery, including the optional shuffle `seed`.\n */\n @state()\n @provide({ context: qtiContext })\n public qtiContext: QtiContext = {\n QTI_CONTEXT: {\n testIdentifier: '',\n candidateIdentifier: '',\n environmentIdentifier: 'default'\n }\n };\n\n // Store event handlers as instance properties\n #onItemContextChanged = this.#handleItemContextChanged.bind(this);\n #onAssessmentItemConnected = this.#handleAssessmentItemConnected.bind(this);\n\n constructor() {\n super();\n this.addEventListener('qti-item-context-updated', this.#onItemContextChanged);\n this.addEventListener('qti-assessment-item-connected', this.#onAssessmentItemConnected);\n }\n\n #handleItemContextChanged(e: CustomEvent<{ itemContext: ItemContext }>) {\n this.#updateItemVariablesInTestContext(e.detail.itemContext.identifier, e.detail?.itemContext?.variables || []);\n }\n\n #handleAssessmentItemConnected(e: CustomEvent<QtiAssessmentItem>) {\n const fullVariables = (e.detail as any)._context.variables;\n this.assessmentItem = e.detail;\n this.computedContext =\n this.computedContext?.identifier === this.assessmentItem.identifier\n ? { ...this.computedContext, title: this.assessmentItem.title }\n : ({\n identifier: this.assessmentItem.identifier,\n title: this.assessmentItem.title,\n adaptive: this.assessmentItem.getAttribute('adaptive')?.toLowerCase() === 'true' || false,\n variables: fullVariables\n } as ComputedItemContext);\n this.#updateItemVariablesInTestContext(this.assessmentItem.identifier, fullVariables || []);\n }\n\n #updateItemVariablesInTestContext(\n identifier: string,\n variables: readonly VariableDeclaration<string | string[] | null>[]\n ): void {\n const rawscore = variables?.find(vr => vr.identifier == 'SCORE')?.value;\n const score = parseFloat(rawscore?.toString());\n const completionStatus = variables?.find(v => v.identifier === 'completionStatus')?.value;\n\n const correct = score !== undefined && !isNaN(score) && score > 0;\n const incorrect = score !== undefined && !isNaN(score) && score <= 0;\n const completed = completionStatus === 'completed';\n this.computedContext = {\n ...this.computedContext,\n identifier,\n correct,\n incorrect,\n completed,\n variables\n };\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('qti-item-context-changed', this.#onItemContextChanged);\n this.removeEventListener('qti-assessment-item-connected', this.#onAssessmentItemConnected);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item': QtiItem;\n }\n}\n","import { ItemContainer } from './components/item-container/item-container';\nimport { ItemPrintVariables } from './components/item-print-variables/item-print-variables';\nimport { QtiItem } from './components/qti-item/qti-item';\n\nexport { ItemContainer, ItemPrintVariables, QtiItem };\n\nexport const qtiItemElements = [\n { tag: 'item-container', ctor: ItemContainer },\n { tag: 'item-print-variables', ctor: ItemPrintVariables },\n { tag: 'qti-item', ctor: QtiItem }\n] as const;\n"],"mappings":"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","names":["consume","html","LitElement","LitElement","html","__decorate","consume","html","LitElement","state","LitElement","html","__decorate","state"]}