@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.
- package/cdn/index.global.js +1 -1
- package/cdn/index.js +103 -103
- package/dist/base.d.ts +3 -3
- package/dist/base.js +1 -1
- package/dist/chunk-4DB4SC5K.js +100 -0
- package/dist/chunk-4DB4SC5K.js.map +1 -0
- package/dist/{chunk-WVVMNF74.js → chunk-7AVWRQIS.js} +188 -160
- package/dist/{chunk-WVVMNF74.js.map → chunk-7AVWRQIS.js.map} +1 -1
- package/dist/{chunk-CAO4JRLY.js → chunk-BQFWCZFH.js} +2 -2
- package/dist/{chunk-LVBIQDPM.js → chunk-CK7AV2UJ.js} +147 -101
- package/dist/chunk-CK7AV2UJ.js.map +1 -0
- package/dist/{chunk-7HC5SMCU.js → chunk-G6GFQDVN.js} +1 -96
- package/dist/chunk-G6GFQDVN.js.map +1 -0
- package/dist/{chunk-RXGDQDOV.js → chunk-HBSWJC3B.js} +478 -392
- package/dist/chunk-HBSWJC3B.js.map +1 -0
- package/dist/chunk-HQESINXH.js +834 -0
- package/dist/chunk-HQESINXH.js.map +1 -0
- package/dist/{chunk-XU7HNT4F.js → chunk-J5SQLKNP.js} +145 -119
- package/dist/{chunk-XU7HNT4F.js.map → chunk-J5SQLKNP.js.map} +1 -1
- package/dist/{chunk-V5G7X53Y.js → chunk-NJQHUUTN.js} +2 -2
- package/dist/{chunk-QECOPVPO.js → chunk-RSVRS5AK.js} +59 -58
- package/dist/chunk-RSVRS5AK.js.map +1 -0
- package/dist/{chunk-F4BNJWYN.js → chunk-TWPXES3S.js} +642 -673
- package/dist/chunk-TWPXES3S.js.map +1 -0
- package/dist/{chunk-NA2N2WSG.js → chunk-VAE6HBKR.js} +176 -152
- package/dist/{chunk-NA2N2WSG.js.map → chunk-VAE6HBKR.js.map} +1 -1
- package/dist/{chunk-3AJOQCDU.js → chunk-ZII6M3SN.js} +2 -2
- package/dist/{computed.types.d-rKLSPvVG.d.ts → computed.types.d-DpKIYO6e.d.ts} +2 -0
- package/dist/corrections.d.ts +12 -29
- package/dist/corrections.js +8 -9
- package/dist/elements.d.ts +86 -86
- package/dist/elements.js +4 -5
- package/dist/index.d.ts +6 -37
- package/dist/index.js +13 -14
- package/dist/{interaction.d-D4MstYRz.d.ts → interaction.d-CJiMv8H7.d.ts} +13 -2
- package/dist/interactions.d.ts +11 -1299
- package/dist/interactions.js +4 -5
- package/dist/item.d.ts +3 -3
- package/dist/item.js +5 -5
- package/dist/processing.js +2 -2
- package/dist/qti-components-jsx.d.ts +759 -739
- package/dist/qti-test.d-_YAlhDbt.d.ts +702 -0
- package/dist/qti-text-entry-interaction.d-BGdfV9qG.d.ts +1567 -0
- package/dist/test.d.ts +11 -678
- package/dist/test.js +6 -7
- package/package.json +8 -7
- package/dist/chunk-64XSIBGO.js +0 -241
- package/dist/chunk-64XSIBGO.js.map +0 -1
- package/dist/chunk-7HC5SMCU.js.map +0 -1
- package/dist/chunk-F4BNJWYN.js.map +0 -1
- package/dist/chunk-H3J7LFRO.js +0 -2243
- package/dist/chunk-H3J7LFRO.js.map +0 -1
- package/dist/chunk-LVBIQDPM.js.map +0 -1
- package/dist/chunk-QECOPVPO.js.map +0 -1
- package/dist/chunk-RXGDQDOV.js.map +0 -1
- package/dist/chunk-X3E5HXG2.js +0 -20
- package/dist/chunk-X3E5HXG2.js.map +0 -1
- /package/dist/{chunk-CAO4JRLY.js.map → chunk-BQFWCZFH.js.map} +0 -0
- /package/dist/{chunk-V5G7X53Y.js.map → chunk-NJQHUUTN.js.map} +0 -0
- /package/dist/{chunk-3AJOQCDU.js.map → chunk-ZII6M3SN.js.map} +0 -0
|
@@ -1,34 +1,30 @@
|
|
|
1
1
|
import {
|
|
2
|
-
item_default
|
|
3
|
-
|
|
4
|
-
} from "./chunk-7HC5SMCU.js";
|
|
2
|
+
item_default
|
|
3
|
+
} from "./chunk-G6GFQDVN.js";
|
|
5
4
|
import {
|
|
6
5
|
watch
|
|
7
|
-
} from "./chunk-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
27
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
28
|
-
else for (var
|
|
29
|
-
return
|
|
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
|
|
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 :
|
|
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
|
|
92
|
+
return html`
|
|
97
93
|
${this.#templateContent}
|
|
98
94
|
<slot></slot>
|
|
99
|
-
${
|
|
95
|
+
${until(this.itemDoc, html`<span>Loading...</span>`)}
|
|
100
96
|
`;
|
|
101
97
|
}
|
|
102
98
|
};
|
|
103
99
|
__decorate([
|
|
104
|
-
|
|
100
|
+
property({ attribute: false })
|
|
105
101
|
], ItemContainer.prototype, "customElementRegistry", void 0);
|
|
106
102
|
__decorate([
|
|
107
|
-
|
|
103
|
+
property({ type: String, attribute: "item-url" })
|
|
108
104
|
], ItemContainer.prototype, "itemURL", void 0);
|
|
109
105
|
__decorate([
|
|
110
|
-
|
|
106
|
+
state()
|
|
111
107
|
], ItemContainer.prototype, "itemDoc", void 0);
|
|
112
108
|
__decorate([
|
|
113
|
-
|
|
109
|
+
state()
|
|
114
110
|
], ItemContainer.prototype, "itemXML", void 0);
|
|
115
111
|
__decorate([
|
|
116
|
-
|
|
117
|
-
|
|
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
|
|
129
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
130
|
-
else for (var
|
|
131
|
-
return
|
|
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
|
|
131
|
+
var ItemPrintVariables = class extends LitElement2 {
|
|
134
132
|
static {
|
|
135
|
-
this.styles =
|
|
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
|
|
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) =>
|
|
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((
|
|
180
|
-
const areaMapEntries = v.areaMapping?.areaMapEntries?.map((
|
|
181
|
-
return
|
|
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
|
|
192
|
+
return html2`
|
|
195
193
|
${renderTable(responseVariables, "Response Variables")} ${renderTable(outcomeVariables, "Outcome Variables")}
|
|
196
194
|
`;
|
|
197
195
|
}
|
|
198
196
|
};
|
|
199
197
|
__decorate2([
|
|
200
|
-
|
|
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
|
|
206
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
207
|
-
else for (var
|
|
208
|
-
return
|
|
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
|
|
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(
|
|
230
|
-
this.#updateItemVariablesInTestContext(
|
|
230
|
+
#handleItemContextChanged(e) {
|
|
231
|
+
this.#updateItemVariablesInTestContext(e.detail.itemContext.identifier, e.detail?.itemContext?.variables || []);
|
|
231
232
|
}
|
|
232
|
-
#handleAssessmentItemConnected(
|
|
233
|
-
const fullVariables =
|
|
234
|
-
this.assessmentItem =
|
|
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
|
|
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
|
-
|
|
270
|
-
|
|
270
|
+
state2(),
|
|
271
|
+
provide({ context: computedItemContext })
|
|
271
272
|
], QtiItem.prototype, "computedContext", void 0);
|
|
272
273
|
__decorate3([
|
|
273
|
-
|
|
274
|
-
|
|
274
|
+
state2(),
|
|
275
|
+
provide({ context: configContext })
|
|
275
276
|
], QtiItem.prototype, "configContext", void 0);
|
|
276
277
|
__decorate3([
|
|
277
|
-
|
|
278
|
-
|
|
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-
|
|
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"]}
|