@citolab/qti-components 7.14.3 → 7.15.0
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 +4044 -4030
- package/custom-elements.json +10478 -26460
- package/dist/base.d.ts +8 -0
- package/dist/base.js +50 -0
- package/dist/{chunks/chunk-DGBI4IU5.js → chunk-2DOYPVF5.js} +252 -136
- package/dist/chunk-2DOYPVF5.js.map +1 -0
- package/dist/chunk-2ZEJ3RR5.js +89 -0
- package/dist/chunk-2ZEJ3RR5.js.map +1 -0
- package/dist/{chunks/chunk-E4GR4K26.js → chunk-352OTVTY.js} +1481 -442
- package/dist/chunk-352OTVTY.js.map +1 -0
- package/dist/{chunks/chunk-C4ELTNV7.js → chunk-C2HQFI2C.js} +857 -3819
- package/dist/chunk-C2HQFI2C.js.map +1 -0
- package/dist/chunk-DWIRLYDS.js +20 -0
- package/dist/chunk-DWIRLYDS.js.map +1 -0
- package/dist/{chunks/chunk-H2JE6IVU.js → chunk-EUXUH3YW.js} +1 -1
- package/dist/chunk-F44CI35W.js +145 -0
- package/dist/chunk-F44CI35W.js.map +1 -0
- package/dist/{chunks/chunk-XBPO6E25.js → chunk-INKI27D5.js} +6 -5
- package/dist/chunk-INKI27D5.js.map +1 -0
- package/dist/chunk-JEUY3MYB.js +2010 -0
- package/dist/chunk-JEUY3MYB.js.map +1 -0
- package/dist/chunk-O4XIWHTF.js +1139 -0
- package/dist/chunk-O4XIWHTF.js.map +1 -0
- package/dist/chunk-RI47B4ZT.js +1753 -0
- package/dist/chunk-RI47B4ZT.js.map +1 -0
- package/dist/{qti-loader/index.js → chunk-VEV4DGPH.js} +6 -6
- package/dist/chunk-VEV4DGPH.js.map +1 -0
- package/dist/{chunks/chunk-TN75CWLX.js → chunk-W4SQRNWO.js} +97 -2
- package/dist/chunk-W4SQRNWO.js.map +1 -0
- package/dist/elements.d.ts +1 -0
- package/dist/elements.js +42 -0
- package/dist/index.d.ts +8 -24
- package/dist/index.js +117 -285
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +1 -0
- package/dist/interactions.js +72 -0
- package/dist/item.d.ts +1 -0
- package/dist/item.js +23 -0
- package/dist/loader.d.ts +1 -0
- package/dist/loader.js +11 -0
- package/dist/processing.d.ts +1 -0
- package/dist/processing.js +103 -0
- package/dist/qti-components-jsx.d.ts +1475 -2388
- package/dist/test.d.ts +1 -0
- package/dist/{qti-test/index.js → test.js} +11 -19
- package/dist/transformers.d.ts +1 -0
- package/dist/{qti-transformers/index.js → transformers.js} +3 -3
- package/dist/vscode.html-custom-data.json +469 -631
- package/package.json +70 -166
- package/LICENSE.md +0 -674
- package/dist/chunks/chunk-4OGJBG35.js +0 -8
- package/dist/chunks/chunk-4OGJBG35.js.map +0 -1
- package/dist/chunks/chunk-AGV5GOTF.js +0 -234
- package/dist/chunks/chunk-AGV5GOTF.js.map +0 -1
- package/dist/chunks/chunk-BHJSX3Q6.js +0 -8
- package/dist/chunks/chunk-BHJSX3Q6.js.map +0 -1
- package/dist/chunks/chunk-C4ELTNV7.js.map +0 -1
- package/dist/chunks/chunk-C5RLRG3L.js +0 -10
- package/dist/chunks/chunk-C5RLRG3L.js.map +0 -1
- package/dist/chunks/chunk-CJADUWEC.js +0 -10
- package/dist/chunks/chunk-CJADUWEC.js.map +0 -1
- package/dist/chunks/chunk-DGBI4IU5.js.map +0 -1
- package/dist/chunks/chunk-DVQQ7I6Y.js +0 -8
- package/dist/chunks/chunk-DVQQ7I6Y.js.map +0 -1
- package/dist/chunks/chunk-E4GR4K26.js.map +0 -1
- package/dist/chunks/chunk-ELDMXTUQ.js +0 -31
- package/dist/chunks/chunk-ELDMXTUQ.js.map +0 -1
- package/dist/chunks/chunk-GAAFN7QF.js +0 -146
- package/dist/chunks/chunk-GAAFN7QF.js.map +0 -1
- package/dist/chunks/chunk-H6KHXSIO.js +0 -8
- package/dist/chunks/chunk-H6KHXSIO.js.map +0 -1
- package/dist/chunks/chunk-JQ6HWGRY.js +0 -22
- package/dist/chunks/chunk-JQ6HWGRY.js.map +0 -1
- package/dist/chunks/chunk-NJNQOQUU.js +0 -8
- package/dist/chunks/chunk-NJNQOQUU.js.map +0 -1
- package/dist/chunks/chunk-P4QBOVQ2.js +0 -206
- package/dist/chunks/chunk-P4QBOVQ2.js.map +0 -1
- package/dist/chunks/chunk-SV4K25ZI.js +0 -19
- package/dist/chunks/chunk-SV4K25ZI.js.map +0 -1
- package/dist/chunks/chunk-TN75CWLX.js.map +0 -1
- package/dist/chunks/chunk-XBPO6E25.js.map +0 -1
- package/dist/exports/computed-item.context.d.ts +0 -23
- package/dist/exports/computed-item.context.js +0 -8
- package/dist/exports/computed.context.d.ts +0 -34
- package/dist/exports/computed.context.js +0 -8
- package/dist/exports/config.context.d.ts +0 -14
- package/dist/exports/config.context.js +0 -8
- package/dist/exports/expression-result.d.ts +0 -19
- package/dist/exports/expression-result.js +0 -1
- package/dist/exports/interaction.d.ts +0 -46
- package/dist/exports/interaction.interface.d.ts +0 -13
- package/dist/exports/interaction.interface.js +0 -1
- package/dist/exports/interaction.js +0 -12
- package/dist/exports/item.context.d.ts +0 -11
- package/dist/exports/item.context.js +0 -8
- package/dist/exports/qti-assessment-item.context.d.ts +0 -9
- package/dist/exports/qti-assessment-item.context.js +0 -8
- package/dist/exports/qti-condition-expression.d.ts +0 -14
- package/dist/exports/qti-condition-expression.js +0 -11
- package/dist/exports/qti-condition-expression.js.map +0 -1
- package/dist/exports/qti-expression.d.ts +0 -23
- package/dist/exports/qti-expression.js +0 -10
- package/dist/exports/qti-expression.js.map +0 -1
- package/dist/exports/qti-test.d.ts +0 -12
- package/dist/exports/qti-test.js +0 -1
- package/dist/exports/qti-test.js.map +0 -1
- package/dist/exports/qti.context.d.ts +0 -14
- package/dist/exports/qti.context.js +0 -8
- package/dist/exports/qti.context.js.map +0 -1
- package/dist/exports/session.context.d.ts +0 -15
- package/dist/exports/session.context.js +0 -10
- package/dist/exports/session.context.js.map +0 -1
- package/dist/exports/test.context.d.ts +0 -16
- package/dist/exports/test.context.js +0 -10
- package/dist/exports/test.context.js.map +0 -1
- package/dist/exports/variables.d.ts +0 -2
- package/dist/exports/variables.js +0 -1
- package/dist/exports/variables.js.map +0 -1
- package/dist/qti-assessment-item-l-mN3teH.d.ts +0 -105
- package/dist/qti-components/index.d.ts +0 -1524
- package/dist/qti-components/index.js +0 -216
- package/dist/qti-components/index.js.map +0 -1
- package/dist/qti-item/index.d.ts +0 -114
- package/dist/qti-item/index.js +0 -19
- package/dist/qti-item/index.js.map +0 -1
- package/dist/qti-loader/index.d.ts +0 -21
- package/dist/qti-loader/index.js.map +0 -1
- package/dist/qti-modal-feedback-Cp3CHVKw.d.ts +0 -30
- package/dist/qti-test/index.d.ts +0 -480
- package/dist/qti-test/index.js.map +0 -1
- package/dist/qti-test-mmY8zNIj.d.ts +0 -120
- package/dist/qti-transform-test-Bz9A3hmD.d.ts +0 -63
- package/dist/qti-transformers/index.d.ts +0 -18
- package/dist/qti-transformers/index.js.map +0 -1
- package/dist/variables-BCkyLoXK.d.ts +0 -55
- package/readme.md +0 -59
- /package/dist/{chunks/chunk-H2JE6IVU.js.map → base.js.map} +0 -0
- /package/dist/{exports/computed-item.context.js.map → chunk-EUXUH3YW.js.map} +0 -0
- /package/dist/{exports/computed.context.js.map → elements.js.map} +0 -0
- /package/dist/{exports/config.context.js.map → interactions.js.map} +0 -0
- /package/dist/{exports/expression-result.js.map → item.js.map} +0 -0
- /package/dist/{exports/interaction.interface.js.map → loader.js.map} +0 -0
- /package/dist/{exports/interaction.js.map → processing.js.map} +0 -0
- /package/dist/{exports/item.context.js.map → test.js.map} +0 -0
- /package/dist/{exports/qti-assessment-item.context.js.map → transformers.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/qti-components/qti-assessment-item/qti-assessment-item.ts","../../src/lib/qti-components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref.ts","../../src/lib/qti-components/qti-companion-materials-info/qti-companion-materials-info.ts","../../src/lib/qti-components/qti-custom-operator/qti-custom-operator.ts","../../src/lib/qti-components/qti-feedback/qti-feedback-block/qti-feedback-block.ts","../../src/lib/qti-components/qti-feedback/qti-feedback-inline/qti-feedback-inline.ts","../../src/lib/qti-components/qti-interaction/qti-associable-hotspot.ts","../../src/lib/qti-components/qti-interaction/qti-associate-interaction/qti-associate-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/drag-drop-interaction-mixin.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/flippables-mixin.ts","../../src/lib/qti-components/qti-interaction/qti-associate-interaction/qti-associate-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-choice-interaction/qti-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/choices/choices.mixin.ts","../../src/lib/qti-components/qti-interaction/internal/vocabulary/vocabulary-mixin.ts","../../src/lib/qti-components/qti-interaction/qti-choice-interaction/qti-choice-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-custom-interaction/qti-custom-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-end-attempt-interaction/qti-end-attempt-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-gap-img.ts","../../src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-gap-text.ts","../../src/lib/qti-components/qti-interaction/internal/active-element/active-element.mixin.ts","../../src/lib/qti-components/qti-interaction/qti-gap.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-associate-interaction/qti-graphic-associate-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/hotspots/hotspot.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-associate-interaction/qti-graphic-associate-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-choice.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-interaction/qti-hotspot-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-interaction/qti-hotspot-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-hottext-interaction/qti-hottext-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-hottext.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice-interaction/qti-inline-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice.ts","../../src/lib/qti-components/qti-interaction/qti-simple-associable-choice.ts","../../src/lib/qti-components/qti-interaction/qti-match-interaction/qti-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-match-interaction/qti-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-media-interaction/qti-media-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-order-interaction/qti-order-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-order-interaction/qti-order-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-stage.ts","../../src/lib/qti-components/qti-interaction/qti-select-point-interaction/qti-select-point-interaction.ts","../../src/lib/qti-components/qti-response-processing/utilities/scoring-helper.ts","../../src/lib/qti-components/qti-interaction/qti-simple-choice.ts","../../src/lib/qti-components/qti-interaction/qti-slider-interaction/qti-slider-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-slider-interaction/qti-slider-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-text-entry-interaction/qti-text-entry-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-text-entry-interaction/qti-text-entry-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-upload-interaction/qti-upload-interaction.ts","../../src/lib/qti-components/qti-item-body/qti-item-body.ts","../../src/lib/qti-components/qti-item-body/qti-item-body.styles.ts","../../src/lib/qti-components/qti-outcome-processing/qti-outcome-processing.ts","../../src/lib/qti-components/qti-prompt/qti-prompt.ts","../../src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts","../../src/lib/qti-components/internal/template-strings.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-lookup-outcome-value/qti-lookup-outcome-value.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-rule.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-response-condition/qti-response-condition.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-set-outcome-value/qti-set-outcome-value.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-else.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-if/qti-response-else-if/qti-response-else-if.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-if/qti-response-if.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-and/qti-and.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-basevalue/qti-basevalue.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-container-size/qti-container-size.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-contains/qti-contains.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-correct/qti-correct.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-default/qti-default.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-equal-rounded/qti-equal-rounded.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-round/qti-round.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-round-to/qti-round-to.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-equal/qti-equal.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-gcd/qti.gcd.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-gt/qti-gt.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-gte/qti-gte.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-null/qti-null.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-is-null/qti-is-null.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-field-value/qti-field-value.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-lt/qti-lt.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-lte/qti-lte.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-map-response/qti-map-response.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-map-response-point/qti-map-response-point.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-math-operator/qti-math-operator.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-match/qti-match.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-member/qti-member.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-multiple/qti-multiple.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-not/qti-not.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-or/qti-or.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-ordered/qti-ordered.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-power/qti-power.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-printed-variable/qti-printed-variable.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-product/qti-product.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/qti-subtract.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/index.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-string-match/qti-string-match.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-sum/qti-sum.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-variable/qti-variable.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-random-integer/qti-random-integer.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-random/qti-random.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-delete/qti-delete.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-index/qti-index.ts","../../src/lib/qti-components/qti-rubric-block/qti-content-body.ts","../../src/lib/qti-components/qti-rubric-block/qti-rubric-block.ts","../../src/lib/qti-components/qti-stylesheet/qti-stylesheet.ts","../../src/lib/qti-components/qti-variable-declaration/qti-outcome-declaration/qti-outcome-declaration.ts","../../src/lib/qti-components/qti-variable-declaration/qti-variable-declaration.ts","../../src/lib/qti-components/qti-variable-declaration/qti-response-declaration/qti-response-declaration.ts"],"sourcesContent":["import { provide } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { watch } from '../../decorators';\nimport { itemContext } from '../../exports/qti-assessment-item.context';\nimport { itemContextVariables } from '../../exports/item.context';\n\nimport type { ItemShowCandidateCorrection } from '../../qti-item/components/item-show-candidate-correction.ts';\nimport type { QtiTemplateProcessing } from '../qti-template-processing/qti-template-declaration/qti-template-processing';\nimport type { InteractionChangedDetails, OutcomeChangedDetails } from '../internal/event-types';\nimport type { ResponseInteraction } from '../../exports/expression-result';\nimport type { VariableDeclaration, VariableValue } from '../../exports/variables';\nimport type { OutcomeVariable, ResponseVariable } from '../../exports/variables';\nimport type { QtiFeedback } from '../qti-feedback/qti-feedback';\nimport type { QtiResponseProcessing } from '../qti-response-processing';\nimport type QtiRegisterVariable from '../internal/events/qti-register-variable';\nimport type { ItemContext } from '../../exports/item.context';\nimport type { Interaction } from '../../exports/interaction';\nimport type { ItemShowCorrectResponse } from '../../qti-item/components/item-show-correct-response.ts';\n\n/**\n * @summary The qti-assessment-item element contains all the other QTI 3 item structures.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.dltnnj87l0yj\n *\n * @dependency qti-feedback\n * @dependency qti-responseprocessing\n *\n * @event qti-item-context-updated - Emitted when through a user action the itemContext is updated,\n * typically on interaction with the interactions, or calling response processing.\n */\n@customElement('qti-assessment-item')\nexport class QtiAssessmentItem extends LitElement {\n private _itemTitle: string;\n private _templateProcessing: QtiTemplateProcessing | null = null;\n\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) adaptive: 'true' | 'false' = 'false';\n @property({ type: String }) timeDependent: 'true' | 'false' | null = null;\n\n @property({ type: String })\n get title(): string {\n return this._itemTitle;\n }\n set title(value: string) {\n this._itemTitle = value;\n this.removeAttribute('title');\n this.setAttribute('data-title', value);\n }\n\n @property({ type: Boolean }) disabled: boolean;\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this._interactionElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @property({ type: Boolean }) readonly: boolean;\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) =>\n this._interactionElements.forEach(ch => (ch.readonly = readonly));\n\n @provide({ context: itemContext })\n private _context: ItemContext = {\n variables: itemContextVariables\n };\n\n /**\n * Sets the identifier for the assessment item reference if this item is in a test.\n *\n * @param identifier - The identifier for the assessment item reference.\n */\n public set assessmentItemRefId(identifier: string) {\n this._context = { ...this._context, identifier };\n }\n\n public get assessmentItemRefId(): string {\n return this._context.identifier;\n }\n\n public get variables(): VariableValue<string | string[] | null>[] {\n return this._context.variables.map(v => ({\n identifier: v.identifier,\n value: v.value,\n type: v.type,\n // add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item\n ...(v.type === 'outcome' && v.identifier === 'SCORE'\n ? { externalScored: (v as OutcomeVariable).externalScored }\n : {})\n }));\n }\n\n public set variables(value: VariableValue<string | string[] | null>[]) {\n if (!Array.isArray(value) || value.some(v => !('identifier' in v))) {\n console.warn('variables property should be an array of VariableDeclaration');\n return;\n }\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n const matchingValue = value.find(v => v.identifier === variable.identifier);\n if (matchingValue) {\n return {\n ...variable,\n ...matchingValue,\n interpolationTable: (variable as OutcomeVariable).interpolationTable\n };\n }\n return variable;\n })\n };\n\n this._context.variables.forEach(variable => {\n if (variable.type === 'response') {\n const interactionElement = this._interactionElements.find(\n (el: Interaction) => el.responseIdentifier === variable.identifier\n );\n if (interactionElement) {\n interactionElement.response = variable.value as string | string[];\n }\n }\n });\n\n this.variables.forEach(variable => {\n if (variable.type === 'outcome') {\n this._feedbackElements.forEach(fe => fe.checkShowFeedback(variable.identifier));\n }\n });\n }\n\n private _initialContext: Readonly<ItemContext> = { ...this._context, variables: this._context.variables };\n private _feedbackElements: QtiFeedback[] = [];\n private _interactionElements: Interaction[] = [];\n\n /** @deprecated use variables property instead */\n set responses(myResponses: ResponseInteraction[]) {\n if (myResponses) {\n for (const response of myResponses) {\n const responseVariable = this.getResponse(response.responseIdentifier);\n if (responseVariable) {\n this.updateResponseVariable(response.responseIdentifier, response.response);\n }\n\n const interaction: Interaction | undefined = this._interactionElements.find(\n i => i.getAttribute('response-identifier') === response.responseIdentifier\n );\n if (interaction) {\n interaction.response = response.response;\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n connectedCallback(): void {\n this._attachEventListeners();\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent<QtiAssessmentItem>('qti-assessment-item-connected', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n this._processTemplates();\n });\n }\n\n disconnectedCallback(): void {\n this._removeEventListeners();\n super.disconnectedCallback();\n }\n\n private _attachEventListeners() {\n this.addEventListener('qti-register-variable', this._handleRegisterVariable);\n this.addEventListener('qti-register-feedback', this._handleRegisterFeedback);\n this.addEventListener('qti-register-interaction', this._handleRegisterInteraction);\n this.addEventListener('end-attempt', this._handleEndAttempt);\n this.addEventListener('qti-set-outcome-value', this._handleSetOutcomeValue);\n this.addEventListener('qti-interaction-response', this._handleUpdateResponseVariable);\n }\n\n private _removeEventListeners() {\n this.removeEventListener('qti-register-variable', this._handleRegisterVariable);\n this.removeEventListener('qti-register-feedback', this._handleRegisterFeedback);\n this.removeEventListener('qti-register-interaction', this._handleRegisterInteraction);\n this.removeEventListener('end-attempt', this._handleEndAttempt);\n this.removeEventListener('qti-set-outcome-value', this._handleSetOutcomeValue);\n this.removeEventListener('qti-interaction-response', this._handleUpdateResponseVariable);\n }\n\n private _handleRegisterVariable = (e: QtiRegisterVariable) => {\n e.stopImmediatePropagation();\n this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };\n this._initialContext = this._context;\n e.stopPropagation();\n };\n\n private _handleRegisterFeedback = (e: CustomEvent<QtiFeedback>) => {\n e.stopImmediatePropagation();\n const feedbackElement = e.detail;\n this._feedbackElements.push(feedbackElement);\n const numAttempts = Number(this._context.variables.find(v => v.identifier === 'numAttempts')?.value) || 0;\n if (numAttempts > 0) {\n feedbackElement.checkShowFeedback(feedbackElement.outcomeIdentifier);\n }\n };\n\n private _handleRegisterInteraction = (e: CustomEvent<{ interaction: string; interactionElement: Interaction }>) => {\n e.stopImmediatePropagation();\n this._interactionElements.push(e.detail.interactionElement);\n };\n\n private _handleEndAttempt = (e: CustomEvent<{ responseIdentifier: string; countAttempt: boolean }>) => {\n e.stopImmediatePropagation();\n const { responseIdentifier, countAttempt } = e.detail;\n this.validate();\n this.updateResponseVariable(responseIdentifier, 'true');\n this.processResponse(countAttempt);\n };\n\n private _handleSetOutcomeValue = (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n e.stopImmediatePropagation();\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n };\n\n private _handleUpdateResponseVariable = (e: CustomEvent<ResponseInteraction>) => {\n e.stopImmediatePropagation();\n\n const { responseIdentifier, response } = e.detail;\n this.updateResponseVariable(responseIdentifier, response);\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n };\n\n /**\n * Toggles the display of correct responses for all interactions.\n * @param show - A boolean indicating whether to show or hide correct responses.\n */\n public showCorrectResponse(show: boolean): void {\n // Iterate through all interaction elements\n for (const interaction of this._interactionElements) {\n interaction.toggleCorrectResponse(show);\n }\n\n // Update one or more toggle component states\n document.querySelectorAll('item-show-correct-response').forEach((el: ItemShowCorrectResponse) => {\n el.shown = show;\n });\n }\n\n /**\n * Toggles the display of the candidate correction for all interactions.\n * @param show - A boolean indicating whether to show or hide candidate correction.\n */\n public showCandidateCorrection(show: boolean): void {\n // Iterate through all interaction elements\n for (const interaction of this._interactionElements) {\n interaction.toggleCandidateCorrection(show);\n }\n\n // Update one or more toggle component states\n document.querySelectorAll('item-show-candidate-correction').forEach((el: ItemShowCandidateCorrection) => {\n el.shown = show;\n });\n }\n\n private _processTemplates(): void {\n this._templateProcessing = this.querySelector<QtiTemplateProcessing>('qti-template-processing');\n if (this._templateProcessing) {\n // Run template processing before first presentation\n this._templateProcessing.process();\n }\n }\n\n public processResponse(countNumAttempts = true, reportValidityAfterScoring = true): boolean {\n this.validate(reportValidityAfterScoring);\n\n if (countNumAttempts) {\n this.updateOutcomeVariable(\n 'numAttempts',\n (+this._context.variables.find(v => v.identifier === 'numAttempts')?.value + 1).toString()\n );\n }\n\n const responseProcessor = this.querySelector<QtiResponseProcessing>('qti-response-processing');\n if (!responseProcessor) {\n // console.info('Client side response processing template not available');\n return false;\n }\n\n if (!responseProcessor.process) {\n // console.info('Client side response webcomponents not available');\n return false;\n }\n\n responseProcessor.process();\n\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this._getCompletionStatus());\n }\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n\n return true;\n }\n\n public resetResponses() {\n this._context = this._initialContext;\n }\n\n protected getResponse(identifier: string): Readonly<ResponseVariable> {\n return this.getVariable(identifier) as ResponseVariable;\n }\n\n protected getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n\n protected getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this._context.variables.find(v => v.identifier === identifier) || null;\n }\n\n // saving privates here: ------------------------------------------------------------------------------\n\n /**\n * Updates the response variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateResponseVariable(identifier: string, value: string | string[] | undefined) {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => (v.identifier !== identifier ? v : { ...v, value: value }))\n };\n\n // Turn off candidate correction after change of response variable\n this.showCandidateCorrection(false);\n\n this.dispatchEvent(\n new CustomEvent<InteractionChangedDetails>('qti-interaction-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n responseIdentifier: identifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this._getCompletionStatus());\n }\n }\n\n public setOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n this.updateOutcomeVariable(identifier, value);\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n /**\n * Updates the outcome variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : Array.isArray(value) ? value : [value]\n };\n })\n };\n this._feedbackElements.forEach(fe => fe.checkShowFeedback(identifier));\n\n this.dispatchEvent(\n new CustomEvent<OutcomeChangedDetails>('qti-outcome-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n outcomeIdentifier: identifier,\n value: this._context.variables.find(v => v.identifier === identifier)?.value\n }\n })\n );\n }\n\n public validate(reportValidity = true): boolean {\n const isValid = this._interactionElements.every(interactionElement => interactionElement.validate());\n\n if (reportValidity) {\n this.reportValidity();\n }\n\n return isValid;\n }\n\n public reportValidity() {\n for (const interactionElement of this._interactionElements) {\n interactionElement.reportValidity();\n }\n }\n\n private _getCompletionStatus(): 'completed' | 'incomplete' | 'not_attempted' | 'unknown' {\n const valid = this.validate(false);\n if (valid === true) return 'completed';\n if (valid === false) return 'incomplete';\n return 'not_attempted';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item': QtiAssessmentItem;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { qtiTransformItem } from '../../qti-transformers';\n\nimport type { QtiAssessmentItem } from '../qti-assessment-item/qti-assessment-item';\n\nexport class QtiAssessmentStimulusRefConnectedEvent extends Event {\n public static eventName = 'qti-assessment-stimulus-ref-connected';\n constructor(\n public element: QtiAssessmentStimulusRef,\n public item: QtiAssessmentItem\n ) {\n super(QtiAssessmentStimulusRefConnectedEvent.eventName, { bubbles: true, composed: true, cancelable: true });\n }\n}\n\n/**\n * Represents a custom element for referencing an assessment stimulus.\n */\n@customElement('qti-assessment-stimulus-ref')\nexport class QtiAssessmentStimulusRef extends LitElement {\n @property({ type: String }) identifier = '';\n @property({ type: String }) href = '';\n\n /**\n * Lifecycle method called when the element is connected to the DOM.\n * First checks if there's a data-stimulus-idref element. If found, loads the stimulus directly.\n * If not found, delegates to the delivery platform via an event.\n */\n public async connectedCallback(): Promise<void> {\n super.connectedCallback();\n // VERY important to wait for updateComplete to ensure that the stimulusRef is connected after item\n // for the test-navigation to correctly process everything in order\n await this.updateComplete;\n\n const item = this.closest<QtiAssessmentItem>('qti-assessment-item');\n\n const event = new QtiAssessmentStimulusRefConnectedEvent(this, item);\n this.dispatchEvent(event);\n\n const stimulusRef = item?.querySelector(`[data-stimulus-idref=\"${this.identifier}\"]`);\n if (!event.defaultPrevented && stimulusRef) {\n await this.updateStimulusRef(stimulusRef);\n }\n }\n\n /**\n * Loads and appends the stimulus to the specified element.\n * @param stimulusRef - The element to which the stimulus will be appended.\n */\n public async updateStimulusRef(stimulusRef: Element) {\n const stimulus = await qtiTransformItem()\n .load(this.href)\n .then(api => api.htmlDoc());\n if (stimulus) {\n const elements = stimulus.querySelectorAll('qti-stimulus-body, qti-stylesheet');\n stimulusRef.innerHTML = '';\n stimulusRef.append(...elements);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-stimulus-ref': QtiAssessmentStimulusRef;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-companion-materials-info')\nexport class QtiCompanionMaterialsInfo extends LitElement {\n // static override styles = css`\n // slot {\n // display: hidden;\n // }\n // `;\n // override render() {\n // return html` <slot></slot> `;\n // }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-companion-materials-info': QtiCompanionMaterialsInfo;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../exports/qti-assessment-item.context';\n\nimport type { Calculate } from '../../exports/expression-result';\nimport type { ResponseVariable } from '../../exports/variables';\nimport type { ItemContext } from '../../exports/item.context';\n\n/**\n * https://www.imsglobal.org/spec/qti/v3p0/impl#h.fi29q8dubjgw\n * <qti-custom-operator class=\"js.org\">\n <qti-base-value base-type=\"string\"><![CDATA[\n console.log(context.variables);\n return 'B'\n document.querySelector('qti-end-attempt-interaction').disabled = true;\n ]]></qti-base-value>\n </qti-custom-operator>\n </qti-set-outcome-value>\n */\n@customElement('qti-custom-operator')\nexport class QtiCustomOperator extends LitElement implements Calculate {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private operatorFunction: Function;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`;\n }\n\n handleSlotChange() {\n // expecting <[!CDATA[ ... ]]> is converted into <!-- ... --> with qti-transform: cDataToComment\n const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(\n node => node.nodeType === Node.COMMENT_NODE\n );\n try {\n this.operatorFunction = new Function('context', 'fn', 'item', commentNode?.textContent ?? '');\n } catch (e) {\n console.error('custom-operator contains invalid javascript code', e);\n }\n }\n\n public calculate() {\n const fn = {\n variable: (responseIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === responseIdentifier)?.value ?? '',\n correct: (responseIdentifier: string) =>\n (this._context?.variables.find(v => v.identifier === responseIdentifier) as ResponseVariable)\n ?.correctResponse ?? ''\n };\n const item = {\n getVariable: (variableIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === variableIdentifier),\n updateOutcomeVariable: (outcomeIdentifier: string, value: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value\n }\n })\n );\n },\n updateResponseVariable: (responseIdentifier: string, response: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ responseIdentifier: string; response: string | string[] }>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier,\n response\n }\n })\n );\n }\n };\n\n return this.operatorFunction(this._context, fn, item);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-operator': QtiCustomOperator;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-feedback-block')\nexport class QtiFeedbackBlock extends QtiFeedback {\n static override styles = css`\n :host {\n display: block;\n }\n .on {\n display: block;\n }\n .off {\n display: none;\n }\n `;\n\n override render() {\n return html` <slot part=\"feedback\" class=\"feedback ${this.showStatus}\"></slot> `;\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-block': QtiFeedbackBlock;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-feedback-inline')\nexport class QtiFeedbackInline extends QtiFeedback {\n static override styles = css`\n .on {\n display: inline-block;\n }\n .off {\n display: none;\n }\n `;\n\n override render = () => html` <slot part=\"feedback\" class=\"${ifDefined(this.showStatus)}\"></slot> `;\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-inline': QtiFeedbackInline;\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-associable-hotspot')\nexport class QtiAssociableHotspot extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n position: absolute;\n }\n `;\n\n override connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(\n new CustomEvent('qti-register-hotspot', {\n bubbles: true,\n composed: true,\n cancelable: false\n })\n );\n }\n\n override render() {\n return html` <slot name=\"drags\"></slot> `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-associable-hotspot': QtiAssociableHotspot;\n }\n}\n","import { html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport styles from './qti-associate-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-associate-interaction')\nexport class QtiAssociateInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-simple-associable-choice',\n '.dl',\n `slot[name='qti-simple-associable-choice']`\n) {\n static styles: CSSResultGroup = styles;\n @state() protected _childrenMap: Element[] = [];\n\n protected _registerChoiceHandler: (event: CustomEvent) => void;\n\n constructor() {\n super();\n this._registerChoiceHandler = this._registerChoice.bind(this);\n this.addEventListener('register-qti-simple-associable-choice', this._registerChoiceHandler);\n }\n\n protected _registerChoice(event: CustomEvent) {\n const choice = event.target as QtiSimpleAssociableChoice;\n this._childrenMap.push(choice);\n }\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot name=\"qti-simple-associable-choice\"></slot>\n <div part=\"drop-container\">\n ${this._childrenMap.length > 0 &&\n Array.from(Array(Math.ceil(this._childrenMap.length / 2)).keys()).map(\n (_, index) =>\n html`<div part=\"associables-container\">\n <div name=\"left${index}\" part=\"drop-list\" class=\"dl\" identifier=\"droplist${index}_left\"></div>\n <div name=\"right${index}\" part=\"drop-list\" class=\"dl\" identifier=\"droplist${index}_right\"></div>\n </div>`\n )}\n\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>\n </div>`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('register-qti-simple-associable-choice', this._registerChoiceHandler);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-associate-interaction': QtiAssociateInteraction;\n }\n}\n","import { property } from 'lit/decorators.js';\n\nimport { FlippablesMixin } from './flippables-mixin';\nimport { liveQuery } from '../../../../decorators/live-query';\n\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { IInteraction } from '../../../../exports/interaction.interface';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ninterface InteractionConfiguration {\n copyStylesDragClone: boolean;\n dragCanBePlacedBack: boolean;\n dragOnClick: boolean;\n}\n\nexport const DragDropInteractionMixin = <T extends Constructor<Interaction>>(\n superClass: T,\n draggablesSelector: string,\n droppablesSelector: string,\n dragContainersSelector: string\n) => {\n abstract class DragDropInteractionElement extends FlippablesMixin(\n superClass,\n droppablesSelector,\n draggablesSelector\n ) {\n // protected draggables = new Map<HTMLElement, { parent: HTMLElement; index: number }>();\n private observer: MutationObserver | null = null;\n private droppableObsever: MutationObserver | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private draggables: HTMLElement[] = [];\n private droppables: HTMLElement[] = [];\n private dragContainers: HTMLElement[] = [];\n private dragClone: HTMLElement = null; // Clone of drag source for visual feedback\n private dragSource: HTMLElement = null; // The source element being dragged\n\n private touchStartPoint = null; // Point of the first touch\n private isDraggable = false; // Whether a draggable element is active\n private cloneOffset = { x: 0, y: 0 }; // Offset for positioning the drag clone\n private isDragging = false; // Whether a drag operation is ongoing\n private allDropzones: HTMLElement[] = []; // All dropzones for keyboard navigation\n private lastTarget = null; // Last touch target\n private currentDropTarget = null; // Current droppable element\n\n private onMove = this.handleTouchMove.bind(this);\n private onEnd = this.handleTouchEnd.bind(this);\n private onCancel = this.handleTouchCancel.bind(this);\n\n private readonly MIN_DRAG_DISTANCE = 5; // Minimum pixel movement to start dragging\n private readonly DRAG_CLONE_OPACITY = 1; // Opacity of the drag clone element\n private readonly MAX_DRAGGABLE_WIDTH = 600; // Maximum width of a draggable element\n\n private dataTransfer = {\n data: {},\n setData(type, val) {\n this.data[type] = val;\n },\n getData(type) {\n return this.data[type];\n },\n effectAllowed: 'move'\n };\n\n @property({ attribute: false, type: Object }) protected configuration: InteractionConfiguration = {\n copyStylesDragClone: true,\n dragCanBePlacedBack: true,\n dragOnClick: false\n };\n @property({ type: Number, reflect: true, attribute: 'min-associations' }) minAssociations = 1;\n @property({ type: Number, reflect: true, attribute: 'max-associations' }) maxAssociations = 0;\n\n @liveQuery(dragContainersSelector)\n handleDraggableContainerChange(dragContainersAdded: HTMLElement[], dragContainersRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n\n if (dragContainersAdded.length > 0 || dragContainersRemoved.length > 0) {\n this.dragContainersModified(dragContainersAdded || [], dragContainersRemoved || []);\n }\n }\n\n dragContainersModified(addedDragContainers: HTMLElement[], removedDragContainers: HTMLElement[]) {\n for (const removedContainer of removedDragContainers) {\n if (this.dragContainers.includes(removedContainer)) {\n this.dragContainers = this.dragContainers.filter(container => container !== removedContainer);\n this.allDropzones = this.allDropzones.filter(dropzone => dropzone !== removedContainer);\n }\n }\n for (const dragContainer of addedDragContainers) {\n if (!this.dragContainers.includes(dragContainer)) {\n this.dragContainers.push(dragContainer);\n this.allDropzones.push(dragContainer);\n }\n }\n }\n\n @liveQuery(draggablesSelector)\n handleDraggablesChange(dragsAdded: HTMLElement[], dragsRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n if (dragsAdded.length > 0 || dragsRemoved.length > 0) {\n this.draggablesModified(dragsAdded || [], dragsRemoved || []);\n }\n }\n\n @liveQuery(droppablesSelector)\n handleDroppablesChange(dropsAdded: HTMLElement[], dropsRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n if (dropsAdded.length > 0 || dropsRemoved.length > 0) {\n this.droppablesModified(dropsAdded || [], dropsRemoved || []);\n }\n }\n\n override firstUpdated(changedProps): void {\n super.firstUpdated(changedProps);\n if (this.isMatchTabular()) return;\n const disabled = this.hasAttribute('disabled');\n if (!disabled) {\n document.addEventListener('mousemove', this.onMove, { passive: false });\n document.addEventListener('mouseup', this.onEnd, { passive: false });\n document.addEventListener('touchmove', this.onMove, { passive: false });\n document.addEventListener('touchend', this.onEnd, { passive: false });\n document.addEventListener('touchcancel', this.onCancel, { passive: false });\n }\n const draggables = Array.from(this.querySelectorAll(draggablesSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(draggablesSelector) || [])\n ) as HTMLElement[];\n const droppables = Array.from(this.querySelectorAll(droppablesSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(droppablesSelector) || [])\n ) as HTMLElement[];\n const dragContainers = Array.from(this.querySelectorAll(dragContainersSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(dragContainersSelector) || [])\n ) as HTMLElement[];\n this.dragContainersModified(dragContainers, []);\n this.droppablesModified(droppables, []);\n this.draggablesModified(draggables, []);\n\n this.updateMinDimensionsForDropZones();\n\n // MutationObserver to observe changes in child elements\n this.observer = new MutationObserver(() => this.updateMinDimensionsForDropZones());\n this.observer.observe(this, { childList: true, subtree: true });\n\n // ResizeObserver to monitor size changes of `gapTexts`\n this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDropZones());\n const gapTexts = this.querySelectorAll('qti-gap-text');\n gapTexts.forEach(gapText => this.resizeObserver?.observe(gapText));\n }\n\n private draggablesModified = (addedDraggables: HTMLElement[], removedDraggables: HTMLElement[]) => {\n if (this.isMatchTabular()) return;\n for (const removedDraggable of removedDraggables) {\n if (this.draggables.includes(removedDraggable)) {\n this.draggables = this.draggables.filter(draggable => draggable !== removedDraggable);\n removedDraggable.removeAttribute('tabindex');\n removedDraggable.removeEventListener('touchstart', this.handleTouchStart.bind(this));\n removedDraggable.removeEventListener('mousedown', this.handleTouchStart.bind(this));\n }\n }\n for (const draggable of addedDraggables) {\n if (!this.draggables.includes(draggable)) {\n this.draggables.push(draggable);\n // draggables.forEach(el => {\n draggable.setAttribute('tabindex', '0'); // Make draggable elements focusable\n if (!(draggable as any).hasTouchStartListener) {\n // Prevent adding multiple listeners\n draggable.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });\n draggable.addEventListener('mousedown', this.handleTouchStart.bind(this), { passive: false });\n (draggable as any).hasTouchStartListener = true;\n }\n // });\n }\n }\n let index = 0;\n this.draggables.forEach(draggable => {\n draggable.style.viewTransitionName = `drag-${index}-${this.getAttribute('identifier') || crypto.randomUUID()}`;\n draggable.setAttribute('qti-draggable', 'true');\n index++;\n });\n };\n\n private droppablesModified = (addedDroppables: HTMLElement[], removedDroppables: HTMLElement[]) => {\n if (this.isMatchTabular()) return;\n for (const removedDroppable of removedDroppables) {\n if (this.droppables.includes(removedDroppable)) {\n this.droppables = this.droppables.filter(droppable => droppable !== removedDroppable);\n this.allDropzones = this.allDropzones.filter(dropzone => dropzone !== removedDroppable);\n }\n }\n for (const droppable of addedDroppables) {\n if (!this.droppables.includes(droppable)) {\n this.droppables.push(droppable);\n this.allDropzones.push(droppable);\n }\n }\n for (const droppable of this.droppables) {\n if (this.dataset.choicesContainerWidth) {\n droppable.style.width = `${this.dataset.choicesContainerWidth}px`;\n droppable.style.boxSizing = `border-box`;\n }\n }\n };\n\n private async moveDraggableToDroppable(draggable: HTMLElement, droppable: HTMLElement): Promise<void> {\n if (this.isMatchTabular()) return;\n // console.log(`moveDraggableToDroppable, draggable: ${draggable.tagName}, droppable: ${droppable.tagName}`);\n const moveElement = (): void => {\n draggable.style.transform = 'translate(0, 0)';\n if (droppable.tagName === 'SLOT') {\n draggable.setAttribute('slot', droppable.getAttribute('name'));\n } else {\n droppable.appendChild(draggable);\n }\n this.checkAllMaxAssociations();\n this.saveResponse(); //\n };\n // if (!document.startViewTransition) {\n moveElement();\n return;\n // }\n\n // const transition = document.startViewTransition(moveElement);\n // await transition.finished;\n }\n\n private activateDroppable(droppable: HTMLElement): void {\n if (this.dragContainers.includes(droppable)) {\n this._internals.states.add('--dragzone-active');\n droppable.setAttribute('active', '');\n } else {\n this._internals.states.delete('--dragzone-active');\n droppable.setAttribute('active', '');\n }\n }\n\n private deactivateDroppable(droppable: HTMLElement, makeDragzoneActive = true): void {\n if (makeDragzoneActive) {\n this._internals.states.add('--dragzone-active');\n }\n droppable.removeAttribute('active');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n }\n\n private isMatchTabular(): boolean {\n return this.classList.contains('qti-match-tabular');\n }\n\n private async updateMinDimensionsForDropZones() {\n await this.updateComplete;\n if (this.isMatchTabular()) return;\n\n const draggables: NodeListOf<HTMLElement> = this.querySelectorAll(draggablesSelector);\n const dragContainer: HTMLElement =\n this.querySelector(dragContainersSelector) || this.shadowRoot?.querySelector(dragContainersSelector);\n\n const droppables: NodeListOf<HTMLElement> = this.querySelectorAll(droppablesSelector);\n const dropContainer: HTMLElement = droppables[0]?.parentElement;\n\n const maxWidth = this.determineMaxWidth(dragContainer, dropContainer);\n\n let maxDraggableHeight = 0;\n let maxDraggableWidth = 0;\n for (const draggable of draggables) {\n draggable.style.maxWidth = maxWidth + 'px';\n const { width, height } = await this.measureIntrinsicSize(draggable);\n maxDraggableHeight = Math.max(maxDraggableHeight, height);\n maxDraggableWidth = Math.max(maxDraggableWidth, width);\n }\n\n if (dropContainer) {\n // Calculate the correct width of grid columns by adding the defined padding to the maximum width\n dropContainer.style.gridTemplateColumns = `repeat(auto-fit, minmax(calc(min(${maxWidth}px,${maxDraggableWidth}px + 2 * var(--qti-dropzone-padding))), 1fr))`;\n }\n\n if (dragContainer) {\n dragContainer.style.minHeight = `${maxDraggableHeight}px`;\n }\n for (const droppable of droppables) {\n droppable.style.minHeight = `${maxDraggableHeight}px`;\n droppable.style.minWidth = `${maxDraggableWidth}px`;\n\n const dropSlot: HTMLElement = droppable.shadowRoot?.querySelector('slot[part=\"dropslot\"]');\n if (dropSlot) {\n dropSlot.style.minHeight = `${maxDraggableHeight}px`;\n }\n }\n }\n\n private determineMaxWidth(dragContainer: HTMLElement, dropContainer: HTMLElement) {\n const referenceContainer = dropContainer ?? dragContainer;\n\n if (!referenceContainer || referenceContainer.clientWidth == 0) {\n return this.MAX_DRAGGABLE_WIDTH;\n }\n\n const styles = window.getComputedStyle(referenceContainer);\n const paddingLeft = parseFloat(styles.paddingLeft);\n const paddingRight = parseFloat(styles.paddingRight);\n\n return Math.min(this.MAX_DRAGGABLE_WIDTH, referenceContainer.clientWidth - paddingLeft - paddingRight);\n }\n\n private async measureIntrinsicSize(el: HTMLElement): Promise<{ width: number; height: number }> {\n const origPosition = el.style.position;\n el.style.position = 'fixed';\n const rect = el.getBoundingClientRect();\n el.style.position = origPosition;\n\n return { width: rect.width, height: rect.height };\n }\n\n private activateDroppables(target: HTMLElement): void {\n if (this.isMatchTabular()) return;\n const dragContainers = this.dragContainers;\n dragContainers.forEach(d => {\n d.setAttribute('enabled', '');\n if (d.hasAttribute('disabled')) {\n if (d.contains(target) || (d.shadowRoot && d.shadowRoot.contains(target))) {\n d.removeAttribute('disabled');\n }\n }\n });\n this.droppables.forEach(d => {\n d.setAttribute('enabled', '');\n if (d.hasAttribute('disabled')) {\n if (d.contains(target) || (d.shadowRoot && d.shadowRoot.contains(target))) {\n d.removeAttribute('disabled');\n }\n }\n });\n }\n\n private activateDragLocation(): void {\n this._internals.states.add('--dragzone-enabled');\n }\n\n private deactivateDragLocation(): void {\n this._internals.states.delete('--dragzone-enabled');\n }\n\n private deactivateDroppables(): void {\n const dragContainers = this.dragContainers;\n dragContainers.forEach(d => {\n d.removeAttribute('enabled');\n d.removeAttribute('active');\n });\n this.droppables.forEach(d => {\n d.removeAttribute('enabled');\n d.removeAttribute('active');\n });\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n // Cleanup MutationObserver\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n\n if (this.droppableObsever) {\n this.droppableObsever.disconnect();\n this.droppableObsever = null;\n }\n\n // Cleanup ResizeObserver\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n // Remove global event listeners\n document.removeEventListener('mousemove', this.onMove);\n document.removeEventListener('mouseup', this.onEnd);\n document.removeEventListener('touchmove', this.onMove);\n document.removeEventListener('touchend', this.onEnd);\n document.removeEventListener('touchcancel', this.onCancel);\n }\n\n private handleTouchMove(e) {\n if (this.isMatchTabular()) return;\n if (this.isDraggable && this.dragClone) {\n const { x, y } = this.getEventCoordinates(e);\n const currentTouch = { clientX: x, clientY: y };\n\n // Check if the minimum drag distance has been reached\n if (this.calculateDragDistance(currentTouch) >= this.MIN_DRAG_DISTANCE) {\n this.isDragging = true;\n this.updateDragClonePosition(currentTouch);\n }\n\n // Find the closest dropzone to the current drag clone position\n const closestDropzone = this.findClosestDropzone();\n this.currentDropTarget = closestDropzone;\n\n // Handle dragenter and dragleave\n if (closestDropzone !== this.lastTarget) {\n if (this.lastTarget) {\n // Simulate dragleave for the previous target\n this.deactivateDroppable(this.lastTarget);\n this.dispatchCustomEvent(this.lastTarget, 'dragleave');\n }\n if (closestDropzone) {\n // Simulate dragenter for the new target\n this.activateDroppable(closestDropzone);\n this.dispatchCustomEvent(closestDropzone, 'dragenter');\n }\n this.lastTarget = closestDropzone;\n }\n\n // Simulate dragover for the current dropzone\n if (this.currentDropTarget) {\n this.dispatchCustomEvent(this.currentDropTarget, 'dragover');\n }\n\n e.preventDefault();\n }\n }\n\n private handleTouchEnd(e) {\n if (this.isMatchTabular()) return;\n if (this.isDragging || this.isDraggable || this.dragClone) {\n this.resetDragState();\n }\n this._internals.states.delete('--dragzone-active');\n this.checkAllMaxAssociations();\n\n this._internals.states.delete('--dragzone-enabled');\n this._internals.states.delete('--dragzone-active');\n this.deactivateDragLocation();\n this.deactivateDroppables();\n this.draggables.forEach(d => {\n d.removeAttribute('dragging');\n });\n e.preventDefault();\n }\n\n private handleTouchCancel(_e) {\n this.resetDragState();\n }\n\n validate(): boolean {\n if (this.isMatchTabular()) return;\n if (!this.shadowRoot) return false;\n const validAssociations = this.getValidAssociations();\n let isValid = true;\n let validityMessage = '';\n\n if (this.maxAssociations > 0 && validAssociations > this.maxAssociations) {\n isValid = false;\n validityMessage =\n this.dataset.maxSelectionsMessage ||\n `You've selected too many associations. Maximum allowed is ${this.maxAssociations}.`;\n } else if (this.minAssociations > 0 && validAssociations < this.minAssociations) {\n isValid = false;\n validityMessage =\n this.dataset.minSelectionsMessage ||\n `You haven't selected enough associations. Minimum required is ${this.minAssociations}.`;\n }\n const lastElementChild = this.lastElementChild as HTMLElement;\n // Use null for the third argument if no specific anchor is needed\n this._internals.setValidity(isValid ? {} : { customError: true }, validityMessage, lastElementChild);\n return isValid;\n }\n\n override reportValidity(): boolean {\n const validationMessageElement = this.shadowRoot.querySelector('#validation-message') as HTMLElement;\n if (validationMessageElement) {\n if (!this._internals.validity.valid) {\n validationMessageElement.textContent = this._internals.validationMessage;\n validationMessageElement.style.setProperty('display', 'block', 'important');\n } else {\n validationMessageElement.textContent = '';\n validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n private checkMaxAssociations(droppable: HTMLElement): boolean {\n const maxMatch = this.getMatchMaxValue(droppable);\n const currentAssociations = droppable.querySelectorAll('[qti-draggable=\"true\"]').length;\n const unlimitedAssociations = maxMatch === 0;\n return !unlimitedAssociations && currentAssociations >= maxMatch;\n }\n\n private dropDraggableInDroppable(draggable: HTMLElement, droppable: HTMLElement): void {\n // Create a clean clone of the original draggable without computed styles\n const cleanClone = draggable.cloneNode(true) as HTMLElement;\n cleanClone.removeAttribute('style'); // Remove inline styles from the clone\n // Place the clean clone into the drop target\n this.moveDraggableToDroppable(cleanClone, droppable);\n // this.currentDropTarget.appendChild(cleanClone);\n this.draggablesModified([cleanClone], []);\n\n // check if max associations are reached\n const matchMax = this.getMatchMaxValue(draggable);\n const currentDraggables = this.draggables.filter(\n d => d.getAttribute('identifier') === draggable.getAttribute('identifier')\n );\n if (matchMax !== 0 && currentDraggables.length >= matchMax) {\n draggable.style.opacity = '0.0';\n draggable.style.pointerEvents = 'none';\n } else {\n draggable.style.opacity = '1.0';\n }\n }\n\n private resetDragState() {\n if (this.dragClone) {\n const isDropped = this.currentDropTarget !== null;\n const droppedInDragContainer = !isDropped || this.dragContainers.includes(this.currentDropTarget);\n if (isDropped && this.currentDropTarget && !droppedInDragContainer) {\n this.dropDraggableInDroppable(this.dragSource, this.currentDropTarget);\n }\n if (droppedInDragContainer) {\n this.dragSource.style.opacity = '1.0';\n this.dragSource.style.display = 'block';\n this.dragSource.style.position = 'static';\n this.dragSource.style.pointerEvents = 'auto';\n this.saveResponse();\n }\n this.dragClone.remove();\n this.draggablesModified([], [this.dragClone]);\n }\n\n this.isDragging = false;\n this.isDraggable = false;\n this.dragSource = null;\n this.dragClone = null;\n this.touchStartPoint = null;\n this.currentDropTarget = null;\n this.lastTarget = null;\n\n this.deactivateDroppables();\n }\n\n protected checkAllMaxAssociations(): void {\n const currentAssociations = this.getValidAssociations();\n const maxAssociationsInterationReached =\n this.maxAssociations !== 0 && currentAssociations >= this.maxAssociations;\n this.droppables.forEach(d => {\n if (maxAssociationsInterationReached) {\n this.disableDroppable(d);\n } else {\n const maxAssociationsReached = this.checkMaxAssociations(d);\n if (maxAssociationsReached) {\n this.disableDroppable(d);\n } else {\n this.enableDroppable(d);\n }\n }\n });\n }\n\n private getMatchMaxValue(el: HTMLElement): number {\n const matchMaxRawValue = el.getAttribute('match-max');\n return matchMaxRawValue ? parseInt(matchMaxRawValue, 10) : 1;\n }\n\n private disableDroppable(droppable: Element): void {\n droppable.setAttribute('disabled', '');\n }\n\n private enableDroppable(droppable: Element): void {\n droppable.removeAttribute('disabled');\n }\n\n get response(): string {\n let response: string[];\n if (typeof (this as any).getResponse === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n response = (this as any).getResponse(); // Call the method from the implementing class\n } else {\n response = this.collectResponseData();\n }\n return response.join(',');\n }\n\n set response(value: string | null) {\n if (this.isMatchTabular()) return;\n // Assuming this.value is an array of strings\n\n if (typeof (this as any).getValue === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n value = (this as any).getValue(value); // Call the method from the implementing class\n }\n\n if (Array.isArray(value)) {\n this.reset(false);\n\n value?.forEach(entry => this.placeResponse(entry));\n const formData = new FormData();\n value.forEach(response => {\n formData.append(this.responseIdentifier, response);\n });\n this._internals.setFormValue(formData);\n } else {\n // Handle the case where this.value is not an array\n this._internals.setFormValue(value || '');\n }\n }\n\n private placeResponse(response: string): void {\n const [dropId, ...dragIds] = response.split(' ').reverse();\n\n const draggableArray = Array.from(this.draggables);\n const droppableArray = Array.from(this.droppables);\n\n dragIds.forEach(dragId => {\n if (dragId === '') return; // in the case of a qti-order-interaction this is necessary, ['drag0','drag1','','drag2'] there can be empty placeholders\n const draggable = draggableArray.find(d => d.getAttribute('identifier') === dragId);\n const droppable = droppableArray.find(d => d.getAttribute('identifier') === dropId);\n this.dropDraggableInDroppable(draggable, droppable);\n });\n }\n\n private getValidAssociations(): number {\n let count = 0;\n for (const droppable of this.droppables) {\n count = count + this.getDraggablesFromDroppable(droppable).length;\n }\n return count;\n }\n\n public saveResponse(): void {\n let response: string | string[];\n if (typeof (this as any).getResponse === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n response = (this as any).getResponse(); // Call the method from the implementing class\n } else {\n response = this.collectResponseData();\n }\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response\n }\n })\n );\n }\n\n private collectResponseData(): string[] {\n const response = this.droppables\n .map(droppable => {\n const draggablesInDroppable = this.getDraggablesFromDroppable(droppable);\n const identifiers = draggablesInDroppable.map(d => d.getAttribute('identifier'));\n const droppableIdentifier = droppable.getAttribute('identifier');\n return identifiers.map(id => `${id} ${droppableIdentifier}`);\n })\n .flat();\n return response;\n }\n\n private getDraggablesFromDroppable(droppable: HTMLElement): HTMLElement[] {\n const uniqueDraggableIds = this.draggables\n .map(d => d.getAttribute('identifier'))\n .filter((v, i, a) => a.indexOf(v) === i);\n\n const draggables = uniqueDraggableIds\n .flatMap(d => Array.from(droppable.querySelectorAll(`[identifier='${d}']`)))\n .filter(d => !!d)\n .map(d => d as HTMLElement);\n return draggables;\n }\n\n reset(save = true): void {\n // Remove all draggables from droppables\n this.droppables.forEach(droppable => {\n const draggables = this.getDraggablesFromDroppable(droppable);\n draggables.forEach((draggable: HTMLElement) => {\n draggable.remove();\n this.draggablesModified([], [draggable]);\n });\n });\n this.dragContainers.forEach(dragContainer => {\n const draggables = Array.from(dragContainer.querySelectorAll('[qti-draggable=\"true\"]')) as HTMLElement[];\n draggables.forEach(draggable => {\n draggable.style.opacity = '1.0';\n });\n });\n\n // Reset dragClone, dragSource, and related states\n this.dragClone = null;\n this.dragSource = null;\n this.isDragging = false;\n this.isDraggable = false;\n this.currentDropTarget = null;\n this.lastTarget = null;\n\n // Optionally save the reset state\n if (save) {\n this.saveResponse();\n }\n }\n\n private updateDragClonePosition(touch) {\n if (!this.isDragging || !this.dragClone) return;\n\n const newLeft = touch.clientX - this.cloneOffset.x;\n const newTop = touch.clientY - this.cloneOffset.y;\n\n // Apply boundaries specific to the interaction element\n const { newLeft: boundedLeft, newTop: boundedTop } = this.applyInteractionBoundaries(\n newLeft,\n newTop,\n this.dragClone\n );\n\n this.dragClone.style.left = `${boundedLeft}px`;\n this.dragClone.style.top = `${boundedTop}px`;\n }\n\n private applyInteractionBoundaries(newLeft: number, newTop: number, element: HTMLElement) {\n // Get the interaction element's boundaries\n const interactionRect = this.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const elementWidth = elementRect.width;\n const elementHeight = elementRect.height;\n\n // Constrain the position to the interaction's boundaries\n const boundedLeft = Math.max(interactionRect.left, Math.min(newLeft, interactionRect.right - elementWidth));\n const boundedTop = Math.max(interactionRect.top, Math.min(newTop, interactionRect.bottom - elementHeight));\n\n return { newLeft: boundedLeft, newTop: boundedTop };\n }\n\n private getEventCoordinates(event, page = false) {\n const touch = event.touches ? event.touches[0] : event;\n return {\n x: page ? touch.pageX : touch.clientX,\n y: page ? touch.pageY : touch.clientY\n };\n }\n\n private calculateDragDistance(touch): number {\n const xDist = Math.abs(touch.clientX - this.touchStartPoint.x);\n const yDist = Math.abs(touch.clientY - this.touchStartPoint.y);\n return xDist + yDist;\n }\n\n private getDropzoneRect(el: HTMLElement): DOMRect {\n const slot = el.shadowRoot?.querySelector<HTMLElement>('slot[part=\"dropslot\"]');\n return (slot ?? el).getBoundingClientRect();\n }\n\n private findClosestDropzone(): HTMLElement | null {\n const activeDrops = this.allDropzones.filter(d => !d.hasAttribute('disabled'));\n if (!this.dragClone || activeDrops.length === 0) return null;\n\n const dragRect = this.dragClone.getBoundingClientRect();\n let closestDropzone: HTMLElement | null = null;\n let maxArea = 0;\n\n // prefer real droppables first\n const prefer = (elements: HTMLElement[]) => {\n for (const dz of elements) {\n const dzRect = this.getDropzoneRect(dz);\n const area = this.calculateOverlapArea(dragRect, dzRect);\n if (area > maxArea) {\n maxArea = area;\n closestDropzone = dz;\n }\n }\n };\n\n prefer(this.droppables.filter(droppable => !droppable.hasAttribute('disabled')));\n if (!closestDropzone) {\n // fallback to drag containers only if no droppable overlaps\n prefer(this.dragContainers.filter(drags => !drags.hasAttribute('disabled')));\n }\n\n // fallback by distance\n if (!closestDropzone) {\n let minDist = Number.POSITIVE_INFINITY;\n for (const dz of activeDrops) {\n const dzRect = this.getDropzoneRect(dz);\n const dist = Math.hypot(dragRect.left - dzRect.left, dragRect.top - dzRect.top);\n if (dist < minDist) {\n minDist = dist;\n closestDropzone = dz;\n }\n }\n }\n return closestDropzone;\n }\n\n private calculateOverlapArea(rect1: DOMRect, rect2: DOMRect): number {\n const xOverlap = Math.max(0, Math.min(rect1.right, rect2.right) - Math.max(rect1.left, rect2.left));\n const yOverlap = Math.max(0, Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top));\n return xOverlap * yOverlap;\n }\n\n private dispatchCustomEvent(element, eventType, bubble = true) {\n if (!element) return;\n const event = new CustomEvent(eventType, { bubbles: bubble, cancelable: true });\n event['dataTransfer'] = this.dataTransfer;\n element.dispatchEvent(event);\n }\n\n private appendClone() {\n document.body.appendChild(this.dragClone);\n }\n\n private handleTouchStart(e) {\n if (this.isMatchTabular()) return;\n if (e instanceof MouseEvent) {\n // Only allow the left button\n if (e.button !== 0) return;\n }\n if (this.isDragging) {\n return;\n }\n const { x, y } = this.getEventCoordinates(e);\n this.touchStartPoint = { x, y };\n this.dragSource = e.currentTarget;\n this.isDraggable = true;\n\n this._internals.states.add('--dragzone-enabled');\n this._internals.states.add('--dragzone-active');\n\n this.activateDragLocation();\n this.activateDroppables(this.dragSource);\n\n // Create and position the drag clone\n const draggableInDragContainer = this.findDraggableInDraggableContainer(\n this.dragSource.getAttribute('identifier')\n );\n\n // clone the element if it is not in a dropzone\n const draggedFromDropzone = this.droppables.some(d =>\n Array.from(d.children).some(child => child === this.dragSource)\n );\n const rect = this.dragSource.getBoundingClientRect();\n if (draggedFromDropzone) {\n this.dragSource.remove();\n this.draggablesModified([], [this.dragSource]);\n this.dragSource = draggableInDragContainer;\n }\n\n this.cloneOffset.x = x - rect.left;\n this.cloneOffset.y = y - rect.top;\n this.dragClone = draggableInDragContainer.cloneNode(true) as HTMLElement;\n\n // Copy computed styles to the clone\n const computedStyles = window.getComputedStyle(draggableInDragContainer);\n for (let i = 0; i < computedStyles.length; i++) {\n const key = computedStyles[i];\n this.dragClone.style.setProperty(key, computedStyles.getPropertyValue(key));\n }\n const rectOrg = draggableInDragContainer.getBoundingClientRect();\n this.dragClone.style.width = `${rectOrg.width}px`;\n this.dragClone.style.height = `${rectOrg.height}px`;\n if (rect) {\n this.setDragCloneStyles(rect);\n }\n this.dragClone.style.display = 'block';\n this.dragClone.style.opacity = '1';\n this.appendClone();\n\n // check if max associations are reached\n const matchMax = this.getMatchMaxValue(this.dragSource);\n const currentDraggables = this.draggables.filter(\n d => d.getAttribute('identifier') === this.dragSource.getAttribute('identifier')\n );\n if (matchMax !== 0 && currentDraggables.length >= matchMax) {\n draggableInDragContainer.style.opacity = '0.0';\n draggableInDragContainer.style.pointerEvents = 'none';\n } else {\n draggableInDragContainer.style.opacity = '1.0';\n }\n e.preventDefault();\n this.dragClone.setAttribute('dragging', '');\n }\n\n private findDraggableInDraggableContainer(identifier: string): HTMLElement | undefined {\n // Flatten all drag containers\n const allDragContainers = this.dragContainers.flat();\n // Iterate through each drag container\n for (const container of allDragContainers) {\n // Check if the container itself has the identifier\n if (container.getAttribute('identifier') === identifier) {\n // Return the container itself if it matches\n return container;\n }\n // If the container is a slot element, get assigned elements\n let elements: HTMLElement[];\n // Check if the container is a slot element\n if (container instanceof HTMLSlotElement) {\n // If it's a slot, get the assigned elements\n elements = Array.from(container?.assignedElements() || []) as HTMLElement[];\n } else {\n // Otherwise, query the container using draggablesSelector\n elements = Array.from(container.querySelectorAll(draggablesSelector)) as HTMLElement[];\n }\n // Search for a matching child element inside the container\n const foundElement = elements.find(e => e.getAttribute('identifier') === identifier);\n\n // If a matching element is found, return it\n if (foundElement) {\n return foundElement;\n }\n }\n // Return undefined if no matching element is found\n return undefined;\n }\n\n private setDragCloneStyles(rect: DOMRect) {\n this.dragClone.style.position = 'fixed';\n this.dragClone.style.top = `${rect.top}px`;\n this.dragClone.style.left = `${rect.left}px`;\n this.dragClone.style.setProperty('box-sizing', 'border-box', 'important');\n this.dragClone.style.zIndex = '9999';\n this.dragClone.style.pointerEvents = 'none';\n this.dragClone.style.opacity = this.DRAG_CLONE_OPACITY.toString();\n this.dragClone.style.display = 'block';\n }\n }\n\n return DragDropInteractionElement as Constructor<IInteraction> & T;\n};\n","// THIS IS A MIXIN, THIS IS A MIXIN\n// USE LIKE THIS\n// ```class DropList extends Flippables(LitElement) {```\n// mixin which animates children with FLIP\n// a combination between this directive:\n// https://ng-run.com/edit/9MGr5dYWA20AiJtpy5az?open=app%2Fapp.component.html\n// and a tutorial how to make a mixin\n// https://lit.dev/docs/composition/mixins/\n\nimport type { Interaction } from '../../../../exports/interaction';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport declare class FlippablesInterface {\n connectedCallback(): void;\n disconnectedCallback(): void;\n}\n\n// just a conversion of a angular FLIP directive, made as a Mixin\n// https://ng-run.com/edit/9MGr5dYWA20AiJtpy5az?open=app%2Fapp.component.html\nexport const FlippablesMixin = <T extends Constructor<Interaction>>(\n superClass: T,\n _droppablesSel: string,\n _draggablesSel: string\n) => {\n abstract class FlippablesElement extends superClass {\n // private state = new Map<Element, any>();\n // private observer: MutationObserver;\n // flippablesSelector: string;\n // override async firstUpdated(changedProps) {\n // await this.updateComplete; // pk: this is the key to calculate correct proportions\n // const draggables = Array.from(this.querySelectorAll(draggablesSel));\n // draggables.forEach((elem) => {\n // const { left, top, width, height } = elem.getBoundingClientRect();\n // this.state.set(elem, { left, top, width, height });\n // });\n // this.observer = new MutationObserver(this.animateMe);\n // const droppables = Array.from(this.querySelectorAll(droppablesSel));\n // droppables.forEach((draggable) => {\n // this.observer.observe(draggable, { childList: true });\n // });\n // this.observer.observe(this, { childList: true });\n // super.firstUpdated(changedProps);\n // }\n // private animateMe = () => {\n // this.state.forEach((value, elem) => {\n // const { left, top, width, height } = elem.getBoundingClientRect();\n // if (this.state.get(elem) == null) {\n // this.state.set(elem, { left, top, width, height });\n // }\n // const cache = this.state.get(elem);\n // const deltaX = cache.left - left;\n // const deltaY = cache.top - top;\n // const deltaW = cache.width / width;\n // const deltaH = cache.height / height;\n // this.state.set(elem, { left, top, width, height });\n // const { duration, easing } = { duration: 350, easing: 'cubic-bezier(0.26, 0.86, 0.44, 0.985)' };\n // elem.animate(\n // [\n // {\n // transformOrigin: 'top left',\n // transform: `\n // translate(${deltaX}px, ${deltaY}px)\n // scale(${deltaW}, ${deltaH})\n // `,\n // // width: cache.width,\n // // height: cache.height+ 'px',\n // // opacity: cache.opacity,\n // },\n // {\n // transformOrigin: 'top left',\n // transform: 'none',\n // },\n // ],\n // {\n // duration,\n // easing,\n // }\n // );\n // });\n // };\n // override disconnectedCallback(): void {\n // super.disconnectedCallback();\n // this.observer.disconnect();\n // }\n }\n return FlippablesElement as Constructor<FlippablesInterface> & T;\n};\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block; /* necessary to calculate scaling position */\n }\n slot[name='qti-simple-associable-choice'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n\n [part='drop-list'][active] {\n border-color: var(--qti-border-active) !important;\n background-color: var(--qti-bg-active) !important;\n }\n\n [part='drop-list'][enabled] {\n background-color: var(--qti-bg-active) !important;\n }\n\n :host::part(associables-container) {\n display: flex;\n padding: 0.5rem;\n justify-content: space-between;\n background: linear-gradient(\n 180deg,\n rgb(0 0 0 / 0%) calc(50% - 1px),\n var(--qti-border-color-gray) calc(50%),\n rgb(0 0 0 / 0%) calc(50% + 1px)\n );\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { VocabularyMixin } from '../internal/vocabulary/vocabulary-mixin';\nimport styles from './qti-choice-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ChoicesInterface } from '../internal/choices/choices.mixin';\nimport type { CSSResultGroup } from 'lit';\n\nexport type Orientation = 'horizontal' | 'vertical' | undefined;\n\n@customElement('qti-choice-interaction')\nexport class QtiChoiceInteraction\n extends VocabularyMixin(ChoicesMixin(Interaction, 'qti-simple-choice'), 'qti-simple-choice')\n implements ChoicesInterface\n{\n static styles: CSSResultGroup = styles;\n\n /** @deprecated, use 'qti-orientation-horizontal' or 'qti-orientation-vertical' instead */\n @property({ type: String })\n public orientation: Orientation = 'vertical';\n\n private _handleSlotChange() {\n // count the number of choices, set a css variable for the number of choices\n const choices = this.querySelectorAll('qti-simple-choice');\n this.style.setProperty('--item-count', choices.length.toString());\n }\n\n render() {\n return html`\n <slot part=\"prompt\" name=\"prompt\"></slot>\n <slot part=\"slot\" @slotchange=${this._handleSlotChange}></slot>\n <div part=\"message\" role=\"alert\" id=\"validation-message\"></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-choice-interaction': QtiChoiceInteraction;\n }\n}\n","import { property, query, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { watch } from '../../../../decorators';\nimport { configContext, type ConfigContext } from '../../../../exports/config.context';\n\nimport type { ChoiceInterface } from '../active-element/active-element.mixin';\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { IInteraction } from '../../../../exports/interaction.interface';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport type Choice = HTMLElement & ChoiceInterface & { internals: ElementInternals };\n\nexport interface ChoicesInterface extends IInteraction {\n minChoices: number;\n maxChoices: number;\n value: string | null;\n response: string | string[] | null;\n validate(): boolean;\n reportValidity(): boolean;\n}\n\nexport const ChoicesMixin = <T extends Constructor<Interaction>>(superClass: T, selector: string) => {\n abstract class ChoicesMixinElement extends superClass implements ChoicesInterface {\n protected _choiceElements: Choice[] = [];\n\n @query('#validation-message')\n protected _validationMessageElement!: HTMLElement;\n\n @property({ type: Number, attribute: 'min-choices' })\n public minChoices = 0;\n\n @property({ type: Number, attribute: 'max-choices' })\n public maxChoices = 1;\n\n @watch('maxChoices', { waitUntilFirstUpdate: true })\n protected _handleMaxChoicesChange(_oldValue: number, _newValue: number) {\n this._determineInputType();\n }\n\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this._choiceElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) => {\n this._choiceElements.forEach(choice => (choice.readonly = readonly));\n };\n\n @state() response: string | string[] | null = '';\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleValueChange = () => {\n this._internals.setFormValue(this.value);\n this._updateChoiceSelection();\n };\n\n @state()\n @consume({ context: configContext, subscribe: true })\n protected _configContext: ConfigContext; //configContext\n get value(): string | null {\n if (Array.isArray(this.response) && this.response.length === 0) {\n return null;\n } else if (this.response === '') {\n return null;\n }\n return Array.isArray(this.response) ? this.response.join(',') : this.response;\n }\n\n set value(val: string | null) {\n if (this.maxChoices > 1 && (typeof val === 'string' || val === null)) {\n this.response = !val ? [] : val.toString().split(',');\n } else {\n this.response = val || '';\n }\n }\n\n protected toggleInternalCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n if (responseVariable?.correctResponse) {\n const responseArray = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n this._choiceElements.forEach(choice => {\n choice.internals.states.delete('correct-response');\n choice.internals.states.delete('incorrect-response');\n if (show && responseArray.length > 0) {\n if (responseArray.includes(choice.identifier)) {\n choice.internals.states.add('correct-response');\n } else {\n choice.internals.states.add('incorrect-response');\n }\n }\n });\n }\n }\n\n public toggleCandidateCorrection(show: boolean) {\n const responseVariable = this.responseVariable;\n\n if (!responseVariable?.correctResponse) {\n return;\n }\n\n const correctResponseArray = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const candidateResponseArray = Array.isArray(responseVariable.value)\n ? responseVariable.value\n : [responseVariable.value];\n\n this._choiceElements.forEach(choice => {\n choice.internals.states.delete('candidate-correct');\n choice.internals.states.delete('candidate-incorrect');\n if (!show) {\n return;\n }\n if (!candidateResponseArray.includes(choice.identifier)) {\n return; // Not checked, so no feedback\n }\n if (correctResponseArray.includes(choice.identifier)) {\n choice.internals.states.add('candidate-correct');\n } else {\n choice.internals.states.add('candidate-incorrect');\n }\n });\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.addEventListener(`register-${selector}`, this._registerChoiceElement);\n this.addEventListener(`unregister-${selector}`, this._unregisterChoiceElement);\n this.addEventListener(`activate-${selector}`, this._choiceElementSelectedHandler);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(`register-${selector}`, this._registerChoiceElement);\n this.removeEventListener(`unregister-${selector}`, this._unregisterChoiceElement);\n this.removeEventListener(`activate-${selector}`, this._choiceElementSelectedHandler);\n }\n\n public validate(): boolean {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n const selectedCount = selectedChoices.length;\n let isValid = true;\n let validityMessage = '';\n if (this.maxChoices !== 0 && selectedCount > this.maxChoices) {\n isValid = false;\n validityMessage =\n this.dataset.maxSelectionsMessage ||\n `Please select no more than ${this.maxChoices} ${this.maxChoices === 1 ? 'option' : 'options'}.`;\n } else if (selectedCount < this.minChoices) {\n isValid = false;\n validityMessage =\n this.dataset.minSelectionsMessage ||\n `Please select at least ${this.minChoices} ${this.minChoices === 1 ? 'option' : 'options'}.`;\n }\n if (selectedChoices.length > 0) {\n this._internals.setValidity(\n isValid ? {} : { customError: true },\n validityMessage,\n selectedChoices[selectedCount - 1] || this._choiceElements[0] || this\n );\n }\n return isValid;\n }\n\n override reportValidity() {\n if (this._validationMessageElement) {\n if (!this._internals.validity.valid) {\n this._validationMessageElement.textContent = this._internals.validationMessage;\n // Set the display to block to show the message, add important to override any styles\n\n this._validationMessageElement.style.setProperty('display', 'block', 'important');\n } else {\n this._validationMessageElement.textContent = '';\n this._validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n protected _registerChoiceElement(event: CustomEvent) {\n event.stopPropagation();\n const choiceElement = event.target as Choice;\n choiceElement.disabled = this.disabled;\n\n this._choiceElements.push(choiceElement);\n this._setInputType(choiceElement);\n }\n\n protected _unregisterChoiceElement(event: CustomEvent) {\n event.stopPropagation();\n const choiceElement = event.target as Choice;\n this._choiceElements = this._choiceElements.filter(choice => choice !== choiceElement);\n }\n\n protected _determineInputType() {\n this._choiceElements.forEach(choice => {\n this._setInputType(choice);\n });\n }\n\n protected _setInputType(choiceElement: Choice) {\n this._internals.role = this.maxChoices === 1 ? 'radiogroup' : null;\n\n const role = this.maxChoices === 1 ? 'radio' : 'checkbox';\n choiceElement.internals.role = role;\n choiceElement.internals.states.delete(role === 'radio' ? 'checkbox' : 'radio');\n choiceElement.internals.states.add(role);\n }\n\n protected _choiceElementSelectedHandler(event: CustomEvent<{ identifier: string }>) {\n this._toggleChoiceChecked(event.target as Choice);\n if (this.maxChoices === 1) {\n this._choiceElements.forEach(choice => {\n if (choice.identifier !== event.detail.identifier) {\n this._setChoiceChecked(choice, false);\n }\n });\n } else if (this.maxChoices !== 0 && this._configContext?.disableAfterIfMaxChoicesReached) {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n if (selectedChoices.length >= this.maxChoices) {\n this._choiceElements.forEach(choice => {\n if (!this._getChoiceChecked(choice)) {\n choice.disabled = true;\n }\n });\n } else {\n this._choiceElements.forEach(choice => (choice.disabled = false));\n }\n }\n\n this._handleChoiceSelection();\n }\n\n protected _setChoiceChecked(choice: Choice, checked: boolean) {\n if (choice.internals?.states) {\n if (checked) {\n choice.internals.states.add('--checked');\n choice.internals.ariaChecked = 'true';\n } else {\n choice.internals.states.delete('--checked');\n choice.internals.ariaChecked = 'false';\n }\n }\n }\n\n protected _getChoiceChecked(choice: Choice): boolean {\n return choice.internals.states.has('--checked');\n }\n\n protected _toggleChoiceChecked(choice: Choice) {\n const checked = this._getChoiceChecked(choice);\n this._setChoiceChecked(choice, !checked);\n }\n\n protected _handleChoiceSelection() {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n const selectedIdentifiers = selectedChoices.map(choice => choice.identifier);\n\n this.response = this.maxChoices === 1 ? selectedIdentifiers[0] || '' : selectedIdentifiers;\n\n this.validate();\n this.saveResponse(this.response);\n }\n\n /**\n * Updates the selection state of each choice element based on the current response.\n */\n protected _updateChoiceSelection() {\n const responseArray = Array.isArray(this.response) ? this.response : [this.response];\n this._choiceElements.forEach(choice => {\n const isSelected = responseArray.includes(choice.identifier);\n this._setChoiceChecked(choice, isSelected);\n });\n }\n }\n return ChoicesMixinElement as Constructor<ChoicesInterface> & T;\n};\n","import { property } from 'lit/decorators.js';\n\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { PropertyValues } from 'lit';\nimport type { QtiSimpleChoice } from '../../qti-simple-choice';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ntype LabelType = 'qti-labels-decimal' | 'qti-labels-lower-alpha' | 'qti-labels-upper-alpha';\ntype LabelSuffixType = 'qti-labels-suffix-period' | 'qti-labels-suffix-parenthesis';\n\ndeclare class VocabularyInterface {}\n\nexport const VocabularyMixin = <T extends Constructor<Interaction>>(superClass: T, _selector: string) => {\n abstract class VocabularyElement extends superClass {\n private _classes: string[] = [];\n private _allLabels = ['qti-labels-decimal', 'qti-labels-lower-alpha', 'qti-labels-upper-alpha'];\n private _allLabelSuffixes = ['qti-labels-suffix-period', 'qti-labels-suffix-parenthesis'] as LabelSuffixType[];\n // Define the property with the custom converter\n @property({\n type: String,\n reflect: true\n })\n set class(value: string) {\n if (!value) {\n return;\n }\n // const oldValue = this._classes.join(' ');\n this._classes = value.split(' ');\n\n this._addLabels();\n // this.requestUpdate('class', oldValue);\n }\n get class(): string {\n return this._classes?.join(' ') || '';\n }\n\n protected override updated(_changedProperties: PropertyValues): void {\n super.updated(_changedProperties);\n // if (_changedProperties.has('shuffle')) {\n this._addLabels();\n // }\n }\n\n private _addLabels() {\n const classContainsLabel = this._classes.some(\n cls => this._allLabels.includes(cls) || this._allLabelSuffixes.includes(cls as LabelSuffixType)\n );\n const isNumber = value => {\n return !isNaN(+value);\n };\n if (classContainsLabel) {\n const choiceElements = Array.from(this.querySelectorAll('qti-simple-choice')).map(c => c as QtiSimpleChoice);\n const choices = choiceElements\n .map((choice: HTMLElement, index) => {\n return { el: choice, order: isNumber(choice.style.order) ? +choice.style.order : index + 1 };\n })\n .sort((a, b) => a.order - b.order)\n .map(choice => choice.el);\n for (let i = 0; i < choices.length; i++) {\n (choices[i] as QtiSimpleChoice).marker = this._getLabel(i + 1);\n }\n }\n }\n private _getLabel(index: number) {\n let lastLabel = this._classes.filter(c => this._allLabels.includes(c)).pop() as LabelType;\n const lastLabelSuffix = this._classes.filter(c => this._allLabelSuffixes.includes(c as LabelSuffixType)).pop();\n\n if (!lastLabel && lastLabelSuffix) {\n // a suffix without a label is strange so add qti-labels-upper-alpha\n lastLabel = 'qti-labels-upper-alpha';\n }\n let label = '';\n switch (lastLabel) {\n case 'qti-labels-decimal':\n label = `${index}`;\n break;\n case 'qti-labels-lower-alpha':\n label = `${String.fromCharCode(97 + index - 1)}`;\n break;\n case 'qti-labels-upper-alpha':\n label = `${String.fromCharCode(65 + index - 1)}`;\n break;\n }\n if (lastLabelSuffix === 'qti-labels-suffix-period') {\n label += '.';\n } else if (lastLabelSuffix === 'qti-labels-suffix-parenthesis') {\n label += `)`;\n }\n return label;\n }\n }\n return VocabularyElement as Constructor<VocabularyInterface> & T;\n};\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n\n [part='slot'] {\n display: grid;\n gap: 10px;\n }\n\n /* Define the number of columns dynamically */\n :host([class*='qti-choices-stacking-']) [part='slot'] {\n grid-template-columns: repeat(var(--stacking-count, 1), 1fr);\n }\n\n /* Apply dynamic stacking count based on class */\n :host(.qti-choices-stacking-1) {\n --stacking-count: 1;\n }\n :host(.qti-choices-stacking-2) {\n --stacking-count: 2;\n }\n :host(.qti-choices-stacking-3) {\n --stacking-count: 3;\n }\n :host(.qti-choices-stacking-4) {\n --stacking-count: 4;\n }\n :host(.qti-choices-stacking-5) {\n --stacking-count: 5;\n }\n :host(.qti-choices-stacking-6) {\n --stacking-count: 6;\n }\n\n /* Default slot item layout */\n ::slotted(qti-simple-choice) {\n display: flex;\n align-items: center;\n white-space: normal;\n }\n\n /* Orientation styles */\n :host(.qti-orientation-horizontal) [part='slot'] {\n grid-auto-flow: dense column;\n grid-auto-columns: 1fr;\n }\n\n :host(.qti-orientation-vertical) [part='slot'] {\n grid-auto-flow: row;\n }\n\n /* Vertical and horizontal stacking logic */\n :host(.qti-orientation-vertical[class*='qti-choices-stacking-']) [part='slot'] {\n grid-auto-flow: dense column;\n grid-auto-columns: 1fr;\n grid-template-columns: repeat(var(--stacking-count), 1fr);\n grid-template-rows: repeat(calc(var(--item-count) / var(--stacking-count)), 1fr);\n }\n\n :host(.qti-orientation-horizontal[class*='qti-choices-stacking-']) [part='slot'] {\n grid-auto-flow: row;\n grid-template-columns: repeat(var(--stacking-count), 1fr);\n grid-template-rows: unset;\n }\n\n /* Ensure even distribution in vertical mode */\n :host(.qti-orientation-vertical) ::slotted(qti-simple-choice:nth-child(even)) {\n grid-row: auto;\n }\n`;\n\n// export default css`\n// [part='slot'] {\n// display: flex;\n// flex-direction: column;\n// gap: var(--qti-gap-size);\n// flex-wrap: wrap;\n// }\n\n// ::slotted(qti-simple-choice) {\n// flex: 0 0\n// calc((100% - (var(--qti-gap-size) * var(--choice-interactions-stacking))) / var(--choice-interactions-stacking)) !important;\n// box-sizing: border-box !important;\n// }\n\n// :host(.qti-choices-stacking-1) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 1;\n// }\n\n// :host(.qti-choices-stacking-2) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 2;\n// }\n// :host(.qti-choices-stacking-3) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 3;\n// }\n// :host(.qti-choices-stacking-4) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 4;\n// }\n// :host(.qti-choices-stacking-5) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 5;\n// }\n// :host([orientation='horizontal']) [part='slot'] {\n// flex-direction: row;\n// }\n\n// :host(.qti-orientation-horizontal) [part='slot'] {\n// flex-direction: row;\n// flex-wrap: nowrap;\n// }\n\n// :host(.qti-orientation-horizontal) ::slotted(qti-simple-choice) {\n// flex: 1 1 auto !important;\n// }\n// `;\n","import { html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { removeDoubleSlashes } from '../../internal/utils';\n\n@customElement('qti-custom-interaction')\nexport class QtiCustomInteraction extends Interaction {\n // This custom-interaction support the CES API which is use in FACET\n //\n // It works like this:\n // 1. The CI manifest is fetched\n // 2. An iframe is created and the first style and first script from the manifest are loaded\n // 3. The first script is bootstrap.js which also creates an iframe and loads the first media from the manifest\n // 4. Communication is done via the CES API but because the iframe is not allowed to access the global CES object we need to use window.postMessage\n\n // To achieve this we change the package by replacing the bootstrap.js with our own and inject a proxy CES API that communicates via postMessage\n // Because we also want to run this in storybook, we cannot use window.top because to send messages there, because in case of storybook that is not the top window.\n // So we send messages to all parent windows\n private rawResponse: string | string[] = '';\n\n constructor() {\n super();\n this.handlePostMessage = this.handlePostMessage.bind(this);\n }\n\n @property({ type: String, attribute: 'data' })\n data: string;\n\n @property({ type: String, attribute: 'data-base-item' })\n baseItemUrl: string;\n\n @property({ type: String, attribute: 'data-base-ref' })\n baseRefUrl: string;\n\n @property({ type: String, attribute: 'id' })\n id: string;\n\n @state()\n private _errorMessage: string = null;\n manifest: {\n script: string[];\n style: string[];\n media: string[];\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n const uriToManifest =\n this.data.startsWith('http') || this.data.startsWith('blob')\n ? this.data\n : removeDoubleSlashes(this.baseItemUrl + '/' + this.data);\n // fetch the json file located at the data attribute\n fetch(uriToManifest)\n .then(response => {\n return response.json();\n })\n .then(data => {\n this.manifest = data;\n this.setupCES();\n })\n .catch(err => {\n this._errorMessage = err;\n });\n }\n\n // MH: Changed the default bootstrap.js to use the new CES API\n // Because the old one uses the global CES object that is not allowed to be accessed when the CI\n // is embedded in an iframe and coming from another domain\n // Therefor we need to use the new CES API to communicates via the broadcast API\n setupCES() {\n const iframe = this.shadowRoot.querySelector('#pciContainer') as HTMLIFrameElement;\n const iframeDoc = iframe.contentDocument;\n\n if (!this.manifest.script || this.manifest.script.length === 0) {\n this._errorMessage = 'No script found in manifest';\n return;\n }\n if (!this.manifest.style || this.manifest.style.length === 0) {\n this._errorMessage = 'No style found in manifest';\n return;\n }\n const cssRef = this.manifest.style[0];\n const cssUrl =\n cssRef.startsWith('http') || cssRef.startsWith('blob')\n ? cssRef\n : removeDoubleSlashes(`${this.baseRefUrl}/${cssRef}`);\n const scriptRef = this.manifest.script[0];\n const scriptUrl =\n scriptRef.startsWith('http') || scriptRef.startsWith('blob')\n ? scriptRef\n : removeDoubleSlashes(`${this.baseRefUrl}/${scriptRef}`);\n // const channel = new BroadcastChannel('ces_channel');\n window.addEventListener('message', this.handlePostMessage);\n iframeDoc.open();\n iframeDoc.write(`\n <html>\n <head>\n <link href='${cssUrl}' rel=\"stylesheet\" />\n <script src='${scriptUrl}'></script>\n </head>\n <body></body>\n </html>\n `);\n\n iframeDoc.close();\n }\n\n private getIFrames() {\n const iframesInShadowRoot = this.shadowRoot.querySelectorAll('iframe');\n const iframe = this.querySelectorAll('iframe');\n\n const outerIFrames = [...iframesInShadowRoot, ...iframe];\n for (const iframe of outerIFrames) {\n const iframeSrc = iframe.src;\n const isSameOrigin = new URL(iframeSrc, window.location.href).origin === window.location.origin;\n if (isSameOrigin) {\n try {\n const outerDoc = iframe.contentDocument || iframe.contentWindow.document;\n if (outerDoc) {\n this.getInnerIFrames(outerDoc, outerIFrames);\n }\n } catch (e) {\n console.error('Error accessing nested iframe:', e);\n }\n }\n }\n // get only unique iframes\n outerIFrames.forEach((iframe, index) => {\n if (outerIFrames.indexOf(iframe) !== index) {\n outerIFrames.splice(index, 1);\n }\n });\n return outerIFrames;\n }\n\n private getInnerIFrames(iframeDocument: Document, iframes = []) {\n // Get all iframes in the current document\n const currentIframes = iframeDocument.querySelectorAll('iframe');\n\n currentIframes.forEach(iframe => {\n // Add the current iframe to the list\n iframes.push(iframe);\n\n // Recursively get iframes within the current iframe\n // Check if the iframe src is from the same origin\n const iframeSrc = iframe.src;\n const isSameOrigin = new URL(iframeSrc, window.location.href).origin === window.location.origin;\n\n if (isSameOrigin) {\n try {\n const nestedDoc = iframe.contentDocument || iframe.contentWindow.document;\n this.getInnerIFrames(nestedDoc, iframes);\n } catch (e) {\n console.error('Error accessing nested iframe:', e);\n }\n } else {\n console.warn('Skipped cross-origin iframe:', iframeSrc);\n }\n });\n\n return iframes;\n }\n\n private postToWindowAndIframes(type: string, data: any) {\n window.postMessage({ type, data }, '*');\n const iframes = this.getIFrames();\n for (const iframe of iframes) {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type, data }, '*');\n }\n }\n }\n\n handlePostMessage(event: MessageEvent) {\n const { type, data } = event.data;\n switch (type) {\n case 'setResponse':\n if (data === null || !(Array.isArray(data) && data.length === 1 && data[0] === '')) {\n this.rawResponse = data;\n this.saveResponse(data);\n }\n break;\n case 'getResponse': {\n this.postToWindowAndIframes('responseData', this.rawResponse);\n break;\n }\n case 'getMedia': {\n const mediaData = this.manifest.media.map(media => {\n const url =\n media.startsWith('http') || media.startsWith('blob')\n ? media\n : removeDoubleSlashes(this.baseRefUrl + '/' + media);\n return url;\n });\n this.postToWindowAndIframes('mediaData', mediaData);\n break;\n }\n case 'setStageHeight':\n console.log('setStageHeight not implemented');\n break;\n }\n }\n\n validate(): boolean {\n if (!this.rawResponse) {\n return false;\n }\n if (Array.isArray(this.rawResponse)) {\n if (this.rawResponse.length === 0) {\n return false;\n }\n // check if one of the values has a value\n for (const value of this.rawResponse) {\n if (value !== '' && value !== null) {\n return true;\n }\n }\n }\n return true;\n }\n\n get response(): string | string[] | null {\n return (this.rawResponse as string | string[]) || null;\n }\n\n set response(val: string | string[] | null) {\n if (typeof val === 'string') {\n this.rawResponse = val;\n this.saveResponse(val);\n } else if (Array.isArray(val)) {\n this.rawResponse = val;\n } else if (!val) {\n // do nothing\n } else {\n throw new Error('Value must be a string or an array of strings');\n }\n }\n\n override disconnectedCallback(): void {\n window.removeEventListener('message', this.handlePostMessage);\n super.disconnectedCallback();\n }\n\n override render() {\n return html`<iframe\n width=${this.getAttribute('width')}\n height=${this.getAttribute('height')}\n frameborder=\"0\"\n title=\"pciContainer\"\n id=\"pciContainer\"\n >\n </iframe>\n ${this._errorMessage &&\n html`<div style=\"color:red\">\n <h1>Error</h1>\n ${this._errorMessage}\n </div>`}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-interaction': QtiCustomInteraction;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n@customElement('qti-end-attempt-interaction')\nexport class QtiEndAttemptInteraction extends LitElement {\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier;\n\n @property({ reflect: true, type: Boolean }) disabled = false;\n\n /** Defines the number of attempts that a user can make using the 'endAttemptInteraction' mechanism (this can be used to limit the number of hints, etc.). [More information](https://www.imsglobal.org/sites/default/files/spec/qti/v3/info/index.html#DataCharacteristic_EndAttemptInteraction.Attr_count-attempt) */\n @property({ type: String, attribute: 'count-attempt' })\n public countAttempt: 'true' | 'false' | null = null;\n\n @property({ type: String })\n public title: string = 'end attempt';\n\n override render() {\n return html`<button ?disabled=${this.disabled} part=\"button\" @click=${this.endAttempt}>${this.title}</button>`;\n }\n public endAttempt(_: Event) {\n this.dispatchEvent(\n new CustomEvent('end-attempt', {\n bubbles: true,\n composed: true,\n detail: { responseIdentifier: this.responseIdentifier, countAttempt: this.countAttempt === 'true' }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-end-attempt-interaction': QtiEndAttemptInteraction;\n }\n}\n","import { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { watch } from '../../../decorators';\nimport styles from './qti-extended-text-interaction.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-extended-text-interaction')\nexport class QtiExtendedTextInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n @state()\n protected _rows = 5;\n\n /** expected length is mapped to the property maxlength on the textarea */\n @property({ type: Number, attribute: 'expected-length' }) expectedLength: number;\n\n @property({ type: String, attribute: 'pattern-mask' }) patternMask: string;\n\n /** text appearing in the extended-text-interaction if it is empty */\n @property({ type: String, attribute: 'placeholder-text' }) placeholderText: string;\n\n @property({ type: String, attribute: 'data-patternmask-message' }) dataPatternmaskMessage: string;\n\n @property({ type: String, attribute: 'class' }) classNames;\n @watch('classNames')\n handleclassNamesChange(_: any, classes: string) {\n const classNames = classes.split(' ');\n let rowsSet = false;\n classNames.forEach((className: string) => {\n if (className.startsWith('qti-height-lines-')) {\n const nrRows = className.replace('qti-height-lines-', '');\n this._rows = parseInt(nrRows);\n rowsSet = true;\n }\n });\n // If no qti-height-lines class is set, calculate rows based on expectedLength\n if (!rowsSet && this.expectedLength) {\n const estimatedRows = Math.ceil(this.expectedLength / 50); // '50' based on an estimate for characters per row\n this._rows = estimatedRows;\n }\n }\n\n @state()\n response: string | null = null;\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleResponseChange = () => {\n this._internals.setFormValue(this.value);\n this.validate();\n };\n\n get value(): string | null {\n return this.response || null;\n }\n set value(val: string | null) {\n this.response = val || null;\n }\n\n public override validate() {\n const textarea = this.shadowRoot.querySelector('textarea');\n if (!textarea) return false;\n\n if (this.patternMask && this.dataPatternmaskMessage) {\n // Clear any custom error initially\n this._internals.setValidity({});\n textarea.setCustomValidity('');\n const patternSource =\n this.patternMask.startsWith('^') && this.patternMask.endsWith('$') ? this.patternMask : `^${this.patternMask}$`;\n\n const pattern = new RegExp(patternSource);\n const isValid = textarea.checkValidity() && pattern.test(textarea.value);\n\n if (!isValid) {\n // Set custom error if invalid\n this._internals.setValidity({ customError: true }, this.dataPatternmaskMessage);\n textarea.setCustomValidity(this.dataPatternmaskMessage);\n }\n } else {\n const isValid = textarea.checkValidity();\n this._internals.setValidity(isValid ? {} : { customError: false });\n }\n\n return !!this.response && textarea.checkValidity();\n }\n\n public toggleCorrectResponse() {\n // No correct response possible for extended text interactions\n }\n\n override reportValidity() {\n const textarea = this.shadowRoot.querySelector('textarea');\n if (!textarea) return false;\n\n // Run the validate function to ensure the custom validity state is up to date\n const isValid = this.validate();\n if (!isValid) {\n textarea.reportValidity();\n }\n return isValid;\n }\n\n override render() {\n return html`<slot name=\"prompt\"></slot\n ><textarea\n part=\"textarea\"\n name=\"${this.responseIdentifier}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"${5000}\"\n @keydown=\"${event => event.stopImmediatePropagation()}\"\n @keyup=\"${this.textChanged}\"\n @change=\"${this.textChanged}\"\n @blur=\"${(_: FocusEvent) => {\n this.reportValidity();\n }}\"\n placeholder=\"${ifDefined(this.placeholderText ? this.placeholderText : undefined)}\"\n rows=\"${this._rows}\"\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${this.readonly}\"\n .value=${this.response}\n ></textarea>`;\n }\n\n protected textChanged(event: Event) {\n if (this.disabled || this.readonly) return;\n const input = event.target as HTMLInputElement;\n this.setEmptyAttribute(input.value);\n if (this.response !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n protected setEmptyAttribute(text: string) {\n this.setAttribute('empty', text === '' ? 'true' : 'false');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-extended-text-interaction': QtiExtendedTextInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n /* PK: display host as block, else design will be collapsed */\n :host {\n display: block;\n }\n textarea {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border: 0;\n }\n`;\n","import { css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-gap-img')\nexport class QtiGapImg extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n connectedCallback() {\n this.setAttribute('slot', 'drags');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-img': QtiGapImg;\n }\n}\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-gap-match-interaction.styles';\n\nimport type { CSSResultGroup } from 'lit';\nimport type { ResponseVariable } from '../../../exports/variables.ts';\nimport { QtiGap } from '../qti-gap.ts';\n@customElement('qti-gap-match-interaction')\nexport class QtiGapMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-gap-text',\n 'qti-gap',\n `slot[part='drags']`\n) {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot name=\"prompt\"> </slot>\n <slot part=\"drags\" name=\"drags\"></slot>\n <slot part=\"drops\"></slot>\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>`;\n }\n\n public toggleCorrectResponse(show: boolean): void {\n const responseVariable = this.responseVariable;\n\n if (show && responseVariable?.correctResponse) {\n let matches: { text: string; gap: string }[] = [];\n const response = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n if (response) {\n matches = response.map(x => {\n const split = x.split(' ');\n return { text: split[0], gap: split[1] };\n });\n }\n\n const gaps = this.querySelectorAll('qti-gap');\n gaps.forEach(gap => {\n const identifier = gap.getAttribute('identifier');\n const textIdentifier = matches.find(x => x.gap === identifier)?.text;\n const text = this.querySelector(`qti-gap-text[identifier=\"${textIdentifier}\"]`)?.textContent.trim();\n if (textIdentifier && text) {\n if (!gap.nextElementSibling?.classList.contains('correct-option')) {\n const textSpan = document.createElement('span');\n textSpan.classList.add('correct-option');\n textSpan.textContent = text;\n\n // Apply styles\n textSpan.style.border = '1px solid var(--qti-correct)';\n textSpan.style.borderRadius = '4px';\n textSpan.style.padding = '2px 4px';\n textSpan.style.display = 'inline-block';\n\n gap.insertAdjacentElement('afterend', textSpan);\n }\n } else if (gap.nextElementSibling?.classList.contains('correct-option')) {\n gap.nextElementSibling.remove();\n }\n });\n } else {\n const correctOptions = this.querySelectorAll('.correct-option');\n correctOptions.forEach(option => {\n option.remove();\n });\n }\n }\n\n private getMatches(responseVariable: ResponseVariable): { source: string; target: string }[] {\n if (!responseVariable.correctResponse) {\n return [];\n }\n const correctResponse = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const matches: { source: string; target: string }[] = [];\n if (correctResponse) {\n correctResponse.forEach(x => {\n const split = x.split(' ');\n matches.push({ source: split[0], target: split[1] });\n });\n }\n return matches;\n }\n\n public toggleCandidateCorrection(show: boolean) {\n const responseVariable = this.responseVariable;\n\n if (!responseVariable?.correctResponse) {\n return;\n }\n const matches = this.getMatches(responseVariable);\n\n const targetChoices = Array.from<QtiGap>(this.querySelectorAll('qti-gap'));\n targetChoices.forEach(targetChoice => {\n const targetId = targetChoice.getAttribute('identifier');\n const targetMatches = matches.filter(m => m.target === targetId);\n\n const selectedChoices = targetChoice.querySelectorAll(`qti-gap-text`);\n\n selectedChoices.forEach(selectedChoice => {\n selectedChoice.internals.states.delete('candidate-correct');\n selectedChoice.internals.states.delete('candidate-incorrect');\n\n if (!show) {\n return;\n }\n\n const isCorrect = targetMatches.find(m => m.source === selectedChoice.identifier)?.source !== undefined;\n if (isCorrect) {\n selectedChoice.internals.states.add('candidate-correct');\n } else {\n selectedChoice.internals.states.add('candidate-incorrect');\n }\n });\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-match-interaction': QtiGapMatchInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n// :host {\n// display: inline-block;\n// position: relative;\n// }\n/* ${componentStyles} */\nexport default css`\n :host {\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n :host(.qti-choices-top) {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) {\n flex-direction: row;\n }\n :host(.qti-choices-right) {\n flex-direction: row-reverse;\n }\n /* [part='drops'] , */\n [name='prompt'] {\n width: 100%;\n }\n [name='drags'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n`;\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n@customElement('qti-gap-text')\nexport class QtiGapText extends ActiveElementMixin(LitElement, 'qti-gap-text') {\n static styles = css`\n :host {\n display: inline-flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('slot', 'drags');\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-text': QtiGapText;\n }\n}\n","import { html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { watch } from '../../../../decorators/watch';\n\nimport type { ComplexAttributeConverter, LitElement} from 'lit';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport interface ChoiceInterface {\n identifier: string;\n disabled: boolean;\n readonly: boolean;\n}\n\n/**\n * Converter to handle boolean attributes for ARIA properties,\n * ensuring they are set as 'true' or 'false' strings.\n */\nconst ariaBooleanConverter: ComplexAttributeConverter<boolean, boolean> = {\n toAttribute: (value: boolean) => (value ? 'true' : 'false'),\n fromAttribute: (value: string | null) => value === 'true'\n};\n\n/**\n * A mixin that adds choice functionality to a LitElement-based class.\n * It dispatches events with a custom `type` and handles selection logic.\n *\n * @param Base - The base class to extend.\n * @param type - The type of the choice, used in event names.\n * @returns A new class extending the base class with choice functionality.\n */\nexport interface ActiveElementMixinInterface {\n identifier: string;\n tabIndex: number;\n disabled: boolean;\n readonly: boolean;\n internals: ElementInternals;\n}\n\n\nexport function ActiveElementMixin<T extends Constructor<LitElement>>(Base: T, type: string) {\n abstract class QtiChoice extends Base {\n @property({ type: String })\n public identifier = '';\n\n @property({ type: Number, reflect: true, attribute: 'tabindex' })\n public tabIndex = 0;\n\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'aria-disabled',\n converter: ariaBooleanConverter\n })\n public disabled = false;\n\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'aria-readonly',\n converter: ariaBooleanConverter\n })\n public readonly = false;\n\n public internals: ElementInternals;\n\n @watch('disabled', { waitUntilFirstUpdate: true })\n handleDisabledChange(_oldValue: boolean, disabled: boolean) {\n this.tabIndex = disabled ? -1 : 0;\n if (disabled) {\n this.blur();\n }\n }\n\n constructor(...args: any[]) {\n super(...args);\n this.internals = this.attachInternals();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.addEventListener('keyup', this._onKeyUp);\n this.addEventListener('click', this._onClick);\n\n this.dispatchEvent(\n new CustomEvent(`register-${type}`, {\n bubbles: true,\n composed: true\n })\n );\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('keyup', this._onKeyUp);\n this.removeEventListener('click', this._onClick);\n this.dispatchEvent(\n new CustomEvent(`unregister-${type}`, {\n bubbles: true,\n composed: true\n })\n );\n }\n\n private _onKeyUp(event: KeyboardEvent) {\n if (event.altKey) return;\n\n if (event.code === 'Space') {\n event.preventDefault();\n this._activate();\n }\n }\n\n private _onClick() {\n if (this.disabled || this.readonly) return;\n this.focus();\n this._activate();\n }\n\n private _activate() {\n if (this.disabled || this.readonly) return;\n\n this.dispatchEvent(\n new CustomEvent<{ identifier: string }>(`activate-${type}`, {\n bubbles: true,\n composed: true,\n detail: { identifier: this.identifier }\n })\n );\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n }\n return QtiChoice as Constructor<ActiveElementMixinInterface> & T;\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-gap')\nexport class QtiGap extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n override render() {\n return html` <slot name=\"drags\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap': QtiGap;\n }\n}\n","import { html, svg } from 'lit';\nimport { customElement, queryAssignedElements, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-associate-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-graphic-associate-interaction')\nexport class QtiGraphicAssociateInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n private hotspots;\n private startPoint = null;\n private endPoint = null;\n\n @state() private _correctLines = [];\n @state() private startCoord: { x: number; y: number };\n @state() private mouseCoord: { x: number; y: number };\n @queryAssignedElements({ selector: 'img' }) private grImage;\n\n @state()\n private _response: string[] | null = [];\n\n constructor() {\n super();\n this.addEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n\n reset(): void {\n this._response = [];\n this._correctLines = [];\n }\n\n validate(): boolean {\n return this.response.length > 0;\n }\n\n set response(val) {\n this._response = val;\n }\n\n get response() {\n return this._response;\n }\n\n public toggleInternalCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n if (!show || !responseVariable) {\n this._correctLines = [];\n return;\n }\n if (!responseVariable.correctResponse) {\n console.error('No correct response found for this interaction.');\n return;\n }\n const correctResponses = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n this._correctLines = correctResponses;\n }\n\n override render() {\n return html`<slot name=\"prompt\"></slot>\n <line-container>\n <svg\n width=${ifDefined(this.grImage[0]?.width)}\n height=${ifDefined(this.grImage[0]?.height)}\n viewbox=\"0 0 ${this.grImage[0]?.width} ${this.grImage[0]?.height}\"\n >\n ${repeat(\n this.response || [],\n line => line,\n (line, index) => svg`\n <line\n part=\"line\"\n x1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.left)}\n y1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.top)}\n x2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.left)}\n y2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.top)}\n stroke=\"red\"\n stroke-width=\"3\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this._response = this._response.filter((_, i) => i !== index);\n this.saveResponse(this.response);\n }}\n />\n `\n )}\n ${repeat(\n this._correctLines || [],\n line => line,\n (line, _index) => svg`\n <line\n part=\"correct-line\"\n x1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.left)}\n y1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.top)}\n x2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.left)}\n y2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.top)}\n stroke=\"var(--qti-correct)\"\n stroke-width=\"3\"\n stroke-dasharray=\"5,5\"\n />\n `\n )}\n ${this.startPoint &&\n svg`<line\n part=\"point\"\n x1=${this.startCoord.x}\n y1=${this.startCoord.y}\n x2=${this.mouseCoord.x}\n y2=${this.mouseCoord.y}\n stroke=\"var(--qti-border-active)\"\n stroke-width=\"3\"\n />`}\n </svg>\n <slot></slot>\n </line-container>\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>`;\n }\n\n private positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): void {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n positionShapes(shape, coordsNumber, img, hotspot);\n }\n\n override firstUpdated(): void {\n this.hotspots = this.querySelectorAll('qti-associable-hotspot');\n\n this.addEventListener('mousemove', event => {\n const img = this.grImage[0];\n if (!img) return;\n\n const rect = img.getBoundingClientRect();\n // const scaleX = img.naturalWidth / img.clientWidth;\n // const scaleY = img.naturalHeight / img.clientHeight;\n\n // console.log(`scaleX: ${scaleX}, scaleY: ${scaleY}`);\n\n this.mouseCoord = {\n x: event.clientX - rect.left, // * scaleX,\n y: event.clientY - rect.top // * scaleY\n };\n });\n\n this.hotspots.forEach(hotspot => {\n // const img = this.grImage[0];\n // const scaleX = img.naturalWidth / img.clientWidth;\n // const scaleY = img.naturalHeight / img.clientHeight;\n\n hotspot.style.left = hotspot.getAttribute('coords').split(',')[0] + 'px';\n hotspot.style.top = hotspot.getAttribute('coords').split(',')[1] + 'px';\n\n hotspot.addEventListener('click', event => {\n if (!this.startPoint) {\n this.startPoint = event.target;\n\n this.startCoord = {\n x: parseInt(this.startPoint.getAttribute('coords').split(',')[0]),\n y: parseInt(this.startPoint.getAttribute('coords').split(',')[1])\n };\n } else if (!this.endPoint) {\n this.endPoint = event.target;\n\n this._response = [\n ...this.response,\n `${this.startPoint.getAttribute('identifier')} ${this.endPoint.getAttribute('identifier')}`\n ];\n this.saveResponse(this.response);\n this.startPoint = null;\n this.endPoint = null;\n }\n });\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-associate-interaction': QtiGraphicAssociateInteraction;\n }\n}\n","export function positionShapes(shape: string, coordsNumber: number[], img: HTMLImageElement, hotspot: HTMLElement) {\n // Determine the reference width and height based on the attributes or natural dimensions\n const imgWidth = img.getAttribute('width') ? parseFloat(img.getAttribute('width')!) : img.naturalWidth;\n const imgHeight = img.getAttribute('height') ? parseFloat(img.getAttribute('height')!) : img.naturalHeight;\n\n switch (shape) {\n case 'circle':\n {\n if (coordsNumber.length !== 3) {\n console.error('Invalid circle coordinates:', coordsNumber);\n return;\n }\n const [centerX, centerY, radius] = coordsNumber;\n\n // Calculate percentages for center and radius\n const centerXPer = (centerX / imgWidth) * 100;\n const centerYPer = (centerY / imgHeight) * 100;\n const radiusXPer = (radius / imgWidth) * 100; // Relative to width\n const radiusYPer = (radius / imgHeight) * 100; // Relative to height\n\n // Position the hotspot so its center aligns with the circle center\n hotspot.style.left = centerXPer - radiusXPer + '%';\n hotspot.style.top = centerYPer - radiusYPer + '%';\n hotspot.style.width = 2 * radiusXPer + '%';\n hotspot.style.height = 2 * radiusYPer + '%';\n hotspot.style.borderRadius = `50%`; // Create a circular shape\n }\n break;\n\n case 'rect':\n {\n if (coordsNumber.length !== 4) {\n console.error('Invalid rectangle coordinates:', coordsNumber);\n return;\n }\n const [leftX, topY, rightX, bottomY] = coordsNumber;\n const leftXPer = (leftX / imgWidth) * 100;\n const topYPer = (topY / imgHeight) * 100;\n const rightXPer = (rightX / imgWidth) * 100;\n const bottomYPer = (bottomY / imgHeight) * 100;\n hotspot.style.left = leftXPer + '%';\n hotspot.style.top = topYPer + '%';\n hotspot.style.width = rightXPer - leftXPer + '%';\n hotspot.style.height = bottomYPer - topYPer + '%';\n }\n break;\n case 'ellipse':\n {\n if (coordsNumber.length !== 4) {\n console.error('Invalid ellipse coordinates:', coordsNumber);\n return;\n }\n const [centerX, centerY, radiusX, radiusY] = coordsNumber;\n\n // Calculate center position as percentages\n const centerXPer = (centerX / imgWidth) * 100;\n const centerYPer = (centerY / imgHeight) * 100;\n\n // Calculate radii as percentages (relative to their respective dimensions)\n const radiusXPer = (radiusX / imgWidth) * 100;\n const radiusYPer = (radiusY / imgHeight) * 100;\n\n // Position the hotspot so its center aligns with the ellipse center\n hotspot.style.left = centerXPer - radiusXPer + '%';\n hotspot.style.top = centerYPer - radiusYPer + '%';\n hotspot.style.width = 2 * radiusXPer + '%';\n hotspot.style.height = 2 * radiusYPer + '%';\n hotspot.style.borderRadius = `50%`; // Create an elliptical shape\n }\n break;\n case 'poly':\n {\n if (coordsNumber.length < 6 || coordsNumber.length % 2 !== 0) {\n console.error('Invalid polygon coordinates:', coordsNumber);\n return;\n }\n // Convert coordsNumber to an array of {x, y}\n const polycoords = [];\n for (let i = 0; i < coordsNumber.length; i += 2) {\n polycoords.push({ x: coordsNumber[i], y: coordsNumber[i + 1] });\n }\n\n // Calculate the bounding box\n const leftX = Math.min(...polycoords.map(point => point.x));\n const rightX = Math.max(...polycoords.map(point => point.x));\n const topY = Math.min(...polycoords.map(point => point.y));\n const bottomY = Math.max(...polycoords.map(point => point.y));\n\n // Set the hotspot position and size in percentages\n const leftXPer = (leftX / imgWidth) * 100;\n const topYPer = (topY / imgHeight) * 100;\n const rightXPer = (rightX / imgWidth) * 100;\n const bottomYPer = (bottomY / imgHeight) * 100;\n\n hotspot.style.left = leftXPer + '%';\n hotspot.style.top = topYPer + '%';\n hotspot.style.width = rightXPer - leftXPer + '%';\n hotspot.style.height = bottomYPer - topYPer + '%';\n\n // Calculate the clip path based on the bounding box\n const polygonData = polycoords.map(point => ({\n x: ((point.x - leftX) / (rightX - leftX)) * 100,\n y: ((point.y - topY) / (bottomY - topY)) * 100\n }));\n\n const polyD = polygonData.map(p => `${p.x}% ${p.y}%`).join(',');\n hotspot.style.clipPath = `polygon(${polyD})`;\n }\n break;\n\n default:\n console.error(`Unsupported shape: ${shape}`);\n break;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n // position: relative; /* qti-hotspot-choice relative to the slot */\n display: block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n pointer-events: none;\n user-select: none;\n }\n ::slotted(qti-associable-hotspot) {\n transform: translate(-50%, -50%);\n }\n line-container {\n display: block;\n position: relative;\n width: fit-content;\n }\n svg {\n position: absolute;\n top: 0px;\n left: 0px;\n }\n`;\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-gap-match-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-graphic-gap-match-interaction')\nexport class QtiGraphicGapMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-gap-img, qti-gap-text',\n 'qti-associable-hotspot',\n `slot[part='drags']`\n) {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot part=\"image\"></slot>\n <slot part=\"drags\" name=\"drags\" class=\"hover-border\"></slot>\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>`;\n }\n\n private positionHotspotOnRegister(e: CustomEvent<null>): void {\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n\n // positionHotspots(shape, coordsNumber, img, hotspot);\n switch (shape) {\n case 'circle':\n {\n const [centerX, centerY, radius] = coordsNumber;\n hotspot.style.left = centerX - radius + 'px';\n hotspot.style.top = centerY - radius + 'px';\n hotspot.style.width = hotspot.style.height = 2 * radius + 'px';\n }\n break;\n\n case 'rect':\n {\n const [leftX, topY, rightX, bottomY] = coordsNumber;\n hotspot.style.left = leftX + 'px';\n hotspot.style.top = topY + 'px';\n hotspot.style.width = rightX - leftX + 'px';\n hotspot.style.height = bottomY - topY + 'px';\n }\n break;\n\n default:\n break;\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-gap-match-interaction': QtiGraphicGapMatchInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n :host(.qti-choices-top) {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-bottom) {\n flex-direction: column;\n }\n :host(.qti-choices-left) {\n flex-direction: row-reverse;\n & [name='drags'] {\n width: 25%;\n }\n & [part='image'] {\n width: 75%;\n }\n }\n :host(.qti-choices-right) {\n flex-direction: row;\n & [name='drags'] {\n width: 25%;\n }\n & [part='image'] {\n width: 75%;\n }\n }\n [part='image'] {\n display: block;\n position: relative;\n }\n /* [part='drops'] , */\n\n [name='drags'] {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n ::slotted(img) {\n display: inline-block;\n user-select: none;\n pointer-events: none;\n }\n`;\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-order-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { Choice } from '../internal/choices/choices.mixin';\nimport type { CSSResultGroup } from 'lit';\n\ntype HotspotChoice = Choice & { order: number; orderCorrect?: number };\n\n@customElement('qti-graphic-order-interaction')\nexport class QtiGraphicOrderInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n static styles: CSSResultGroup = styles;\n\n protected choiceOrdering: boolean;\n\n protected _choiceElements: Choice[] = [];\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <slot></slot>\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>\n `;\n }\n\n private setHotspotOrder(e: CustomEvent<{ identifier: string }>): void {\n const { identifier } = e.detail;\n\n const hotspot = this._choiceElements.find(el => el.getAttribute('identifier') === identifier) as HotspotChoice;\n\n if (!hotspot) return;\n\n const maxSelection = this._choiceElements.length;\n\n if (!this.choiceOrdering) {\n this.choiceOrdering = true;\n\n if (hotspot.order == null) {\n // Hotspot is not selected, so assign the next available order\n const currentSelection = (this._choiceElements as HotspotChoice[]).filter(i => i.order != null).length;\n\n if (currentSelection >= maxSelection) {\n this.choiceOrdering = false;\n return; // Maximum selection reached\n }\n\n hotspot.order = currentSelection + 1;\n } else {\n // Hotspot is already selected, so remove its order and renumber the rest\n const removedOrder = hotspot.order;\n\n hotspot.order = null;\n\n (this._choiceElements as HotspotChoice[]).forEach(hotspot => {\n if (hotspot.order != null && hotspot.order > removedOrder) {\n hotspot.order--;\n }\n });\n }\n\n this.choiceOrdering = false;\n }\n }\n\n public toggleCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n const hotspots = this._choiceElements as HotspotChoice[];\n for (const hotspot of hotspots) {\n if (show && responseVariable?.correctResponse?.length > 0 && Array.isArray(responseVariable.correctResponse)) {\n const index = responseVariable.correctResponse.findIndex(identifier => identifier === hotspot.identifier);\n if (index >= 0) {\n hotspot.orderCorrect = index + 1;\n } else {\n hotspot.orderCorrect = null;\n }\n } else {\n hotspot.orderCorrect = null;\n }\n }\n }\n\n private positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): void {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n\n positionShapes(shape, coordsNumber, img, hotspot);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('activate-qti-hotspot-choice', this.setHotspotOrder);\n this.addEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('activate-qti-hotspot-choice', this.setHotspotOrder);\n this.removeEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-order-interaction': QtiGraphicOrderInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n position: relative; /* qti-hotspot-choice relative to the slot */\n display: block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n pointer-events: none;\n user-select: none;\n }\n`;\n","import { css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n// type shape = { shape: 'rect' | 'circle' | 'poly'; coords: number[] };\n\n@customElement('qti-hotspot-choice')\nexport class QtiHotspotChoice extends ActiveElementMixin(LitElement, 'qti-hotspot-choice') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n position: absolute;\n }\n `;\n @property({ attribute: 'aria-ordervalue', type: Number, reflect: true }) order: number;\n @property({ attribute: 'aria-ordercorrectvalue', type: Number, reflect: true }) orderCorrect: number;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hotspot-choice': QtiHotspotChoice;\n }\n}\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-hotspot-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-hotspot-interaction')\nexport class QtiHotspotInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <slot></slot>\n `;\n }\n\n private imageLoadPromise: Promise<HTMLImageElement> | null = null;\n\n private getImageLoadPromise(img: HTMLImageElement): Promise<HTMLImageElement> {\n if (!this.imageLoadPromise) {\n if (img.naturalWidth > 0 && img.naturalHeight > 0) {\n this.imageLoadPromise = Promise.resolve(img);\n } else {\n this.imageLoadPromise = new Promise(resolve => {\n const handler = () => {\n img.removeEventListener('load', handler);\n resolve(img);\n };\n img.addEventListener('load', handler);\n });\n }\n }\n return this.imageLoadPromise;\n }\n\n private async positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): Promise<void> {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n const loadedImg = await this.getImageLoadPromise(img);\n positionShapes(shape, coordsNumber, loadedImg, hotspot);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('unregister-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hotspot-interaction': QtiHotspotInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n position: relative; /* qti-hotspot-choice relative to the slot */\n display: inline-block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n line-height: 0; /* remove gaps below image */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n display: block;\n pointer-events: none;\n user-select: none;\n /* width:100%; */\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { PropertyValues } from 'lit';\n\n@customElement('qti-hottext-interaction')\nexport class QtiHottextInteraction extends ChoicesMixin(Interaction, 'qti-hottext') {\n @property({ type: String, reflect: true })\n class = '';\n\n // NOTE: there is no way to get the variant with radiobuttons or checkboxes\n // as the QTI standard does not define a way to specify this.\n // The default is to not show any radio or checkbox buttons just like amp-up does.\n // If they should be shown in the future, we should make a configuration option for it.\n private get classObject() {\n const classes = {\n 'qti-input-control-hidden': true\n };\n\n if (this.class) {\n this.class.split(' ').forEach(className => {\n if (className.trim()) {\n classes[className.trim()] = true;\n }\n });\n }\n\n return classes;\n }\n\n override render = () =>\n html`<slot></slot>\n <div part=\"message\" role=\"alert\" id=\"validation-message\"></div>`;\n\n override connectedCallback() {\n super.connectedCallback();\n this.updateHostClasses();\n }\n\n override updated(_changedProperties: PropertyValues) {\n super.updated(_changedProperties);\n this.updateHostClasses();\n }\n\n private updateHostClasses() {\n // Clear existing classes and apply merged ones\n const classString = Object.keys(this.classObject).join(' ');\n this.className = classString;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n@customElement('qti-hottext')\nexport class QtiHottext extends ActiveElementMixin(LitElement, 'qti-hottext') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n override render() {\n return html`<div part=\"ch\"><div part=\"cha\"></div></div>\n <slot></slot> `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hottext': QtiHottext;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { consume } from '@lit/context';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { configContext } from '../../../exports/config.context';\n\nimport type { PropertyValues } from 'lit';\nimport type { ConfigContext } from '../../../exports/config.context';\n\ninterface OptionType {\n textContent: string;\n value: string;\n selected: boolean;\n}\n\n@customElement('qti-inline-choice-interaction')\nexport class QtiInlineChoiceInteraction extends Interaction {\n get isInline(): boolean {\n return true;\n }\n\n static override get styles() {\n return [\n css`\n :host {\n display: inline-block;\n }\n slot {\n display: flex;\n flex-direction: column;\n }\n [role='menu'] {\n position: absolute;\n z-index: 1000;\n }\n .anchor {\n /* anchor-name: --infobox; */\n width: fit-content;\n }\n\n .positionedElement {\n position: absolute;\n /* position-anchor: --infobox; */\n /* top: anchor(bottom); */\n }\n `\n ];\n }\n\n public static inputWidthClass = [\n '',\n 'qti-input-width-2',\n 'qti-input-width-1',\n 'qti-input-width-3',\n 'qti-input-width-4',\n 'qti-input-width-6',\n 'qti-input-width-10',\n 'qti-input-width-15',\n 'qti-input-width-20',\n 'qti-input-width-72'\n ];\n\n @state()\n protected options: OptionType[] = [];\n\n @state()\n protected correctOption: string = '';\n\n @property({ attribute: 'data-prompt', type: String })\n dataPrompt: string = '';\n\n @consume({ context: configContext, subscribe: true })\n @property({ attribute: false })\n declare configContext: ConfigContext;\n\n override render() {\n return html`\n <select part=\"select\" @change=\"${this.choiceSelected}\" ?disabled=\"${this.disabled}\" ?readonly=\"${this.readonly}\">\n ${this.options.map(\n option => html`\n <option value=\"${option.value}\" ?selected=\"${option.selected}\">${unsafeHTML(option.textContent)}</option>\n `\n )}\n </select>\n\n ${unsafeHTML(this.correctOption)}\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('on-dropdown-selected', this.choiceSelected);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('on-dropdown-selected', this.choiceSelected);\n }\n\n override willUpdate(changed: PropertyValues<this>) {\n if (changed.has('configContext') || changed.has('dataPrompt')) {\n this._updateOptions();\n }\n }\n\n private _updateOptions() {\n const choices = Array.from(this.querySelectorAll('qti-inline-choice'));\n const prompt = this.dataPrompt || this.configContext?.inlineChoicePrompt || 'select';\n if (!this.options || this.options.length === 0) {\n this.options = [\n {\n textContent: prompt,\n value: '',\n selected: false\n },\n ...choices.map(choice => ({\n textContent: choice.innerHTML,\n value: choice.getAttribute('identifier'),\n selected: false\n }))\n ];\n } else {\n this.options = this.options.map(o => {\n return o.value === '' ? { ...o, textContent: prompt } : o;\n });\n }\n }\n\n public validate(): boolean {\n const selectedOption = this.options.find(option => option.selected);\n return selectedOption ? selectedOption.value !== '' : false;\n }\n\n public reset() {\n this.options = this.options.map((option, i) => ({ ...option, selected: i === 0 }));\n }\n\n public set response(value: string | null) {\n this.options = this.options.map(option => {\n if (value && value === option.value) {\n option.selected = true;\n }\n return option;\n });\n }\n get response(): string | null {\n return this.options.find(option => option.selected)?.value || null;\n }\n\n toggleInternalCorrectResponse(show: boolean) {\n this.correctResponse = show && this.responseVariable?.correctResponse?.toString();\n if (!this.correctResponse) {\n this.correctOption = '';\n return;\n }\n\n // textSpan.classList.add('correct-option');\n // textSpan.textContent = text;\n\n // // Apply styles\n // textSpan.style.border = '1px solid var(--qti-correct)';\n // textSpan.style.borderRadius = '4px';\n // textSpan.style.padding = '2px 4px';\n // textSpan.style.margin = '4px';\n // textSpan.style.display = 'inline-block';\n\n this.correctOption = `<span part=\"correct-option\" style=\"border:1px solid var(--qti-correct); border-radius:4px; padding: 2px 4px; margin: 4px; display:inline-block\">${\n this.options.find(option => this.correctResponse === option.value).textContent\n }</span>`;\n }\n\n protected choiceSelected(event: Event) {\n const selectedOptionValue = (event.target as HTMLSelectElement).value;\n this.options = this.options.map(option => ({ ...option, selected: option.value === selectedOptionValue }));\n this.saveResponse(selectedOptionValue);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-inline-choice-interaction': QtiInlineChoiceInteraction;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-inline-choice')\nexport class QtiInlineChoice extends LitElement {\n static override get styles() {\n return [\n css`\n :host {\n display: block;\n cursor: pointer;\n }\n `\n ];\n }\n\n @property({ type: String })\n identifier: string;\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.addEventListener('click', this._onSelectInlineChoice);\n\n this.dispatchEvent(\n new CustomEvent('qti-inline-choice-register', {\n bubbles: true,\n composed: true,\n cancelable: false\n })\n );\n }\n\n override disconnectedCallback() {\n this.removeEventListener('click', this._onSelectInlineChoice);\n }\n\n override render() {\n return html` <slot></slot> `;\n }\n\n private _onSelectInlineChoice() {\n // if (this.disabled || this.readonly) return;\n\n this.dispatchEvent(\n new CustomEvent('qti-inline-choice-select', {\n bubbles: true,\n cancelable: false,\n composed: true,\n detail: { identifier: this.identifier }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-inline-choice': QtiInlineChoice;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n/*\nqti-match-interaction\nqti-associate-interaction\n*/\n@customElement('qti-simple-associable-choice')\n// tslint:disable: indent\nexport class QtiSimpleAssociableChoice extends ActiveElementMixin(LitElement, 'qti-simple-associable-choice') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n slot {\n width: 100%;\n display: block;\n }\n slot[name='qti-simple-associable-choice'] {\n width: auto;\n }\n `;\n\n /** the minimal number of selections a candidate must make */\n @property({\n type: Number,\n attribute: 'match-min'\n })\n public matchMin: number = 0;\n\n /** the maximum number of selections a candidate must make, the other options will be disabled when max options is checked */\n @property({\n type: Number,\n attribute: 'match-max'\n })\n public matchMax: number = 1;\n\n @property({\n type: String,\n attribute: 'fixed',\n converter: {\n fromAttribute: (value: string | null) => value === 'true',\n toAttribute: (value: boolean) => String(value)\n }\n })\n public fixed: boolean = false;\n\n // pk: This needs some explanation\n // in the associate interaction there is a special slot for these qti-simple-associable-choices\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('slot', 'qti-simple-associable-choice');\n this.setAttribute('part', 'qti-simple-associable-choice');\n }\n\n // pk: This needs some explanation\n // in qti-match-interaction, qti-simple-associable-choice is used to denote the\n // draggable, but also the droppable. WEIRD.. but lets deal with it.\n // So we have a slot for whenever another qti-simple-associable-choice is dropped in here.\n // And we have slot for content like in this associate interaction\n override render() {\n return html`\n <slot part=\"slot\"></slot>\n <slot part=\"dropslot\" name=\"qti-simple-associable-choice\"></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-simple-associable-choice': QtiSimpleAssociableChoice;\n }\n}\n","import '../qti-simple-associable-choice';\n\nimport { html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport styles from './qti-match-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\nimport type { ResponseInteraction } from '../../../exports/expression-result';\nimport type { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\n\n@customElement('qti-match-interaction')\nexport class QtiMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-simple-match-set:first-of-type qti-simple-associable-choice, qti-simple-match-set:last-of-type > qti-simple-associable-choice > qti-simple-associable-choice',\n 'qti-simple-match-set:last-of-type > qti-simple-associable-choice',\n 'qti-simple-match-set:first-of-type'\n) {\n static styles: CSSResultGroup = styles;\n\n protected sourceChoices: QtiSimpleAssociableChoice[];\n protected targetChoices: QtiSimpleAssociableChoice[];\n protected lastCheckedRadio: HTMLInputElement | null = null;\n\n @property({ type: String }) class: string = '';\n\n @state() protected _response: string | string[] = [];\n // dragDropApi: TouchDragAndDrop;\n get response(): string[] {\n if (!this.classList.contains('qti-match-tabular')) return super.response as string[];\n else return this._response as string[];\n }\n set response(val: string[]) {\n if (!this.classList.contains('qti-match-tabular')) super.response = val;\n else this._response = val;\n }\n\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier: string = '';\n\n @state() protected correctOptions: { source: string; target: string }[] = null;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.sourceChoices = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:first-of-type qti-simple-associable-choice')\n );\n this.targetChoices = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:last-of-type qti-simple-associable-choice')\n );\n\n this.response = [];\n }\n\n protected handleRadioClick = e => {\n const radio = e.target as HTMLInputElement;\n if (this.lastCheckedRadio === radio) {\n radio.checked = false;\n this.lastCheckedRadio = null;\n this.handleRadioChange(e);\n } else {\n this.lastCheckedRadio = radio;\n }\n };\n\n protected handleRadioChange = e => {\n const checkbox = e.target as HTMLInputElement;\n const value = checkbox.value;\n const name = checkbox.name;\n const type = checkbox.type;\n\n if (checkbox.checked) {\n if (!this.response) {\n this.response = [value];\n } else if (this.response.indexOf(value) === -1) {\n if (type === 'radio') {\n this.response = (this.response || []).filter(v => v.indexOf(name) === -1);\n }\n this.response = [...this.response, value];\n }\n this.lastCheckedRadio = checkbox;\n } else {\n this.response = (this.response || []).filter(v => v !== value);\n this.lastCheckedRadio = null;\n }\n\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent<ResponseInteraction>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response: Array.isArray(this.response) ? [...this.response] : this.response\n }\n })\n );\n };\n\n validate(): boolean {\n if (this.class.split(' ').includes('qti-match-tabular')) {\n return this.response?.length === this.sourceChoices.length;\n } else {\n return super.validate();\n }\n }\n\n private getMatches(responseVariable: ResponseVariable): { source: string; target: string }[] {\n if (!responseVariable.correctResponse) {\n return [];\n }\n const correctResponse = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const matches: { source: string; target: string }[] = [];\n if (correctResponse) {\n correctResponse.forEach(x => {\n const split = x.split(' ');\n matches.push({ source: split[0], target: split[1] });\n });\n }\n return matches;\n }\n\n public toggleInternalCorrectResponse(show: boolean): void {\n const responseVariable = this.responseVariable;\n\n if (!responseVariable?.correctResponse) {\n // Remove all previously added correct responses\n this.querySelectorAll('.correct-option').forEach(el => el.remove());\n return;\n }\n const matches = this.getMatches(responseVariable);\n\n if (!this.class.split(' ').includes('qti-match-tabular')) {\n if (show) {\n // Clear old correct options first\n this.querySelectorAll('.correct-option').forEach(el => el.remove());\n\n this.targetChoices.forEach(targetChoice => {\n const targetId = targetChoice.getAttribute('identifier');\n const match = matches.find(m => m.target === targetId);\n\n if (match?.source) {\n const sourceChoice = this.querySelector(`qti-simple-associable-choice[identifier=\"${match.source}\"]`);\n const text = sourceChoice?.textContent?.trim();\n\n if (text && !targetChoice.previousElementSibling?.classList.contains('correct-option')) {\n const textSpan = document.createElement('span');\n textSpan.classList.add('correct-option');\n textSpan.textContent = text;\n\n // Style the span\n textSpan.style.border = '1px solid var(--qti-correct)';\n textSpan.style.borderRadius = '4px';\n textSpan.style.padding = '2px 4px';\n textSpan.style.display = 'inline-block';\n\n // Insert before the target choice\n targetChoice.insertAdjacentElement('beforebegin', textSpan);\n }\n }\n });\n } else {\n this.correctOptions = null;\n }\n } else {\n if (show) {\n this.correctOptions = matches || [];\n } else {\n this.correctOptions = null;\n }\n }\n }\n\n public toggleCandidateCorrection(show: boolean) {\n const responseVariable = this.responseVariable;\n\n if (!responseVariable?.correctResponse) {\n return;\n }\n const matches = this.getMatches(responseVariable);\n\n this.targetChoices.forEach(targetChoice => {\n const targetId = targetChoice.getAttribute('identifier');\n const targetMatches = matches.filter(m => m.target === targetId);\n\n const selectedChoices = targetChoice.querySelectorAll(`qti-simple-associable-choice`);\n\n selectedChoices.forEach(selectedChoice => {\n selectedChoice.internals.states.delete('candidate-correct');\n selectedChoice.internals.states.delete('candidate-incorrect');\n\n if (!show) {\n return;\n }\n\n const isCorrect = targetMatches.find(m => m.source === selectedChoice.identifier)?.source !== undefined;\n if (isCorrect) {\n selectedChoice.internals.states.add('candidate-correct');\n } else {\n selectedChoice.internals.states.add('candidate-incorrect');\n }\n })\n });\n }\n\n override render() {\n const isTabular = this.class.split(' ').includes('qti-match-tabular');\n const hasCorrectResponse = this.correctOptions !== null;\n return html`\n <slot name=\"prompt\"></slot>\n <slot ?hidden=${isTabular}></slot>\n\n ${isTabular\n ? html`\n <table part=\"table\">\n <tr part=\"r-header\">\n <td></td>\n ${this.targetChoices.map(col => html`<th part=\"r-header\">${unsafeHTML(col.innerHTML)}</th>`)}\n </tr>\n\n ${this.sourceChoices.map(\n row =>\n html`<tr part=\"row\">\n <td part=\"c-header\">${unsafeHTML(row.innerHTML)}</td>\n ${this.targetChoices.map(col => {\n const rowId = row.getAttribute('identifier');\n const colId = col.getAttribute('identifier');\n const value = `${rowId} ${colId}`;\n const selectedInRowCount =\n (this.response || []).filter(v => v.split(' ')[0] === rowId).length || 0;\n const checked = this.response?.includes(value) || false;\n const type = row.matchMax === 1 ? 'radio' : 'checkbox';\n const isCorrect = !!this.correctOptions?.find(option => option.source === rowId && option.target === colId);\n const part =\n type === 'radio'\n ? `rb ${checked ? 'rb-checked' : ''} ${hasCorrectResponse ? (isCorrect ? 'rb-correct' : 'rb-incorrect') : ''}`\n : `cb ${checked ? 'cb-checked' : ''} ${hasCorrectResponse ? (isCorrect ? 'cb-correct' : 'cb-incorrect') : ''}`;\n\n // disable if match max is greater than 1 and max is reached\n const disable =\n this.correctOptions?.length > 0\n ? true\n : row.matchMax === 1\n ? false\n : row.matchMax !== 0 && selectedInRowCount >= row.matchMax && !checked;\n return html`<td part=\"input-cell\">\n <div\n class=\"input-container\"\n style=\"position: relative; width: 24px; height: 24px; margin: 0 auto;\"\n >\n <input\n type=${type}\n part=${part}\n name=${rowId}\n value=${value}\n .disabled=${disable}\n @change=${e => this.handleRadioChange(e)}\n @click=${e => (row.matchMax === 1 ? this.handleRadioClick(e) : null)}\n />\n ${type === 'checkbox' && checked\n ? html`\n <svg\n part=\"checkmark\"\n viewBox=\"0 0 24 24\"\n style=\"position: absolute; width: 20px; height: 20px; top: 2px; left: 2px; pointer-events: none;\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" fill=\"white\" />\n </svg>\n `\n : ''}\n </div>\n </td>`;\n })}\n </tr>`\n )}\n </table>\n `\n : nothing}\n\n <div role=\"alert\" part=\"message\" id=\"validation-message\"></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-match-interaction': QtiMatchInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n\n/* ${componentStyles} */\nexport default css`\n slot:not([hidden]) {\n /* slot where the */\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n :host(.qti-choices-top) slot {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) slot {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) slot {\n flex-direction: row;\n }\n :host(.qti-choices-right) slot {\n flex-direction: row-reverse;\n }\n slot[name='prompt'] {\n display: block;\n }\n ::slotted(qti-simple-match-set) {\n /* Make sure the drag and drop container slots have the same width */\n flex: 1;\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\n\n@customElement('qti-media-interaction')\nexport class QtiMediaInteraction extends Interaction {\n private _value = null;\n\n reset() {\n // throw new Error('Method not implemented.');\n }\n validate(): boolean {\n return true;\n // maybe check if the media has been played?\n }\n\n get response(): string | null {\n return this._value ? this._value.toString() : null;\n }\n\n set response(val: string | null) {\n if (val) {\n const isNumber = !isNaN(parseInt(val?.toString()));\n if (isNumber) {\n this._value = parseInt(val.toString());\n } else {\n throw new Error(`Value must be a number ${val}`);\n }\n }\n }\n\n static override get properties() {\n return {\n ...Interaction.properties,\n ...{\n step: {\n type: Number,\n attribute: 'step',\n default: 10\n }\n }\n };\n }\n\n static override styles = [css``];\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot></slot>`;\n }\n\n constructor() {\n super();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n // get audio, video of object tag.\n const mediaObject = this.querySelector('audio') || this.querySelector('video') || this.querySelector('object');\n if (mediaObject) {\n // listen to ended event\n mediaObject.addEventListener('ended', () => {\n // set value to 0\n // check if this.value is a number\n this._value++;\n this.saveResponse(this.value);\n });\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-media-interaction': QtiMediaInteraction;\n }\n}\n","import { html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-order-interaction.styles';\n\nimport type { QtiSimpleChoice } from '../qti-simple-choice';\n@customElement('qti-order-interaction')\nexport class QtiOrderInteraction extends DragDropInteractionMixin(\n Interaction,\n `qti-simple-choice`,\n 'drop-list',\n `slot[part='drags']`\n) {\n static styles = styles;\n protected childrenMap: Element[];\n\n @state() protected nrChoices: number = 0;\n @state() correctResponses: string[] = [];\n @state() showCorrectResponses: boolean = false;\n\n /** orientation of choices */\n @property({ type: String })\n public orientation: 'horizontal' | 'vertical';\n\n override render() {\n const choices = Array.from(this.querySelectorAll('qti-simple-choice'));\n if (this.nrChoices < choices.length) {\n this.nrChoices = choices.length;\n }\n\n return html` <slot name=\"prompt\"> </slot>\n <div part=\"container\">\n <slot part=\"drags\"> </slot>\n <div part=\"drops\">\n ${[...Array(this.nrChoices)].map(\n (_, i) => html`<drop-list role=\"region\" part=\"drop-list\" identifier=\"droplist${i}\"></drop-list>`\n )}\n </div>\n </div>`;\n }\n\n public toggleCorrectResponse(show: boolean): void {\n const responseVariable = this.responseVariable;\n // Always start by removing old correct answers\n this.shadowRoot.querySelectorAll('.correct-option').forEach(option => option.remove());\n\n if (show && responseVariable?.correctResponse) {\n const response = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const correctIds = response.map(r => r.split(' ')[0]); // e.g., ['A', 'B', 'C']\n\n const used = new Set<string>(); // to track already rendered correct-answers\n\n const gaps = this.querySelectorAll('qti-simple-choice');\n\n gaps.forEach((gap, i) => {\n const identifier = gap.getAttribute('identifier');\n if (!identifier || !correctIds.includes(identifier)) return;\n\n // Only render once per identifier\n if (used.has(identifier)) return;\n used.add(identifier);\n\n // Get the choice label\n const text = gap.textContent?.trim();\n if (!text) return;\n\n const relativeDrop = this.shadowRoot.querySelector(`drop-list[identifier=\"droplist${i}\"]`);\n if (!relativeDrop) return;\n\n const span = document.createElement('span');\n span.classList.add('correct-option');\n span.textContent = text;\n\n // Style\n span.style.border = '1px solid var(--qti-correct)';\n span.style.borderRadius = '4px';\n span.style.padding = '2px 4px';\n span.style.display = 'inline-block';\n span.style.marginTop = '4px';\n\n relativeDrop.insertAdjacentElement('afterend', span);\n });\n }\n }\n\n // some interactions have a different way of getting the response\n // this is called from the drag and drop mixin class\n // you have to implement your own getResponse method in the superclass\n // cause they are different for some interactions.\n getValue(val: string[]) {\n return val?.map((v, i) => `${v} droplist${i}`) || [];\n }\n\n // some interactions have a different way of getting the response\n // this is called from the drag and drop mixin class\n // you have to implement your own getResponse method in the superclass\n // cause they are different for some interactions.\n // MH: is this function called? Shouldn't we use getValue?\n protected getResponse(): string[] {\n const droppables = Array.from<QtiSimpleChoice>(this.shadowRoot.querySelectorAll('drop-list'));\n\n const response = droppables.map(droppable => {\n const dragsInDroppable = droppable.querySelectorAll('[qti-draggable=\"true\"]');\n const identifiers = Array.from(dragsInDroppable).map(d => d.getAttribute('identifier'));\n return [...identifiers].join(' ');\n });\n return response;\n }\n\n override async firstUpdated(changedProps) {\n super.firstUpdated(changedProps);\n this.childrenMap = Array.from(this.querySelectorAll('qti-simple-choice'));\n this.childrenMap.forEach(el => el.setAttribute('part', 'qti-simple-choice'));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-order-interaction': QtiOrderInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n// :host {\n// display: inline-block;\n// position: relative;\n// }\n/* ${componentStyles} */\nexport default css`\n [part='drags'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n flex-wrap: wrap;\n }\n\n [part='drops'] {\n flex: 1;\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n }\n\n :host([orientation='horizontal']) [part='drags'] {\n flex-direction: row;\n }\n :host([orientation='horizontal']) [part='drops'] {\n grid-auto-flow: column;\n }\n :host([orientation='vertical']) [part='drags'] {\n flex-direction: column;\n }\n :host([orientation='vertical']) [part='drops'] {\n grid-auto-flow: row;\n }\n\n [part='drop-list'] {\n display: block;\n flex: 1;\n }\n\n [part='drop-list'][active] {\n border-color: var(--qti-border-active) !important;\n background-color: var(--qti-bg-active) !important;\n }\n\n [part='drop-list'][enabled] {\n background-color: var(--qti-bg-active) !important;\n }\n\n [part='container'] {\n display: flex;\n gap: 0.5rem;\n }\n :host(.qti-choices-top) [part='container'] {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) [part='container'] {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) [part='container'] {\n flex-direction: row;\n }\n :host(.qti-choices-right) [part='container'] {\n flex-direction: row-reverse;\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport styles from './qti-portable-custom-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { removeDoubleSlashes } from '../../internal/utils';\n\nimport type { CSSResultGroup } from 'lit';\nimport type { ItemContext } from '../../../exports/item.context';\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type {\n ConfigProperties,\n IMSpci,\n ModuleResolutionConfig,\n QtiVariableJSON,\n ResponseVariableType\n} from './interface';\n\ndeclare const requirejs: any;\ndeclare const define: any;\n\n@customElement('qti-portable-custom-interaction')\nexport class QtiPortableCustomInteraction extends Interaction {\n private _value: string | string[];\n\n // Only used in direct mode\n private pci: IMSpci<ConfigProperties<unknown>>;\n\n // Only used in iframe mode\n protected _iframeLoaded = false;\n protected _pendingMessages: Array<{ method: string; params: any }> = [];\n protected iframe: HTMLIFrameElement;\n\n private _responseCheckInterval: number | null = null;\n\n // Define a static style that applies to both direct and iframe modes\n static styles: CSSResultGroup = [\n styles,\n // Add default width/height for direct mode\n css`\n :host {\n display: block;\n width: 100%;\n min-height: 50px;\n }\n .qti-customInteraction {\n display: block;\n width: 100%;\n min-height: 50px;\n }\n `\n ];\n\n @property({ type: String, attribute: 'module' })\n module: string;\n\n @property({ type: String, attribute: 'custom-interaction-type-identifier' })\n customInteractionTypeIdentifier: string;\n\n @property({ type: String, attribute: 'data-require-paths' })\n requirePathsJson: string = '';\n\n @property({ type: String, attribute: 'data-require-shim' })\n requireShimJson: string = '';\n\n @property({ type: String, attribute: 'data-require-js-url' })\n requireJsUrl: string = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js';\n\n @property({ type: String, attribute: 'data-base-url' })\n baseUrl: string = '';\n\n @property({ type: Boolean, attribute: 'data-use-iframe' })\n useIframe = false;\n\n @property({ type: Boolean, attribute: 'data-use-default-shims' })\n useDefaultShims = false;\n\n @property({ type: Boolean, attribute: 'data-use-default-paths' })\n useDefaultPaths = false;\n\n @state()\n private _errorMessage: string = null;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n @state() response: string | string[] = [];\n\n private dom: HTMLElement;\n\n private _parsedRequirePaths: Record<string, string | string[]> = null;\n private _parsedRequireShim: Record<string, any> = null;\n\n /**\n * Parse the require paths JSON string into an object\n */\n private getRequirePaths(): Record<string, string | string[]> {\n if (this._parsedRequirePaths === null && this.requirePathsJson) {\n try {\n // Handle the array format [{name: \"path/name\", value: \"path/value\"}, ...]\n // and convert to object format {name: value, ...}\n const parsedJson = JSON.parse(this.requirePathsJson);\n if (Array.isArray(parsedJson)) {\n this._parsedRequirePaths = {};\n parsedJson.forEach(item => {\n if (item.name && item.value) {\n this._parsedRequirePaths[item.name] = item.value;\n }\n });\n } else {\n // If it's already in object format, use it directly\n this._parsedRequirePaths = parsedJson;\n }\n } catch (e) {\n console.error('Error parsing require paths JSON:', e);\n this._errorMessage = `Error parsing require paths JSON: ${e.message}`;\n this._parsedRequirePaths = {};\n }\n }\n return this._parsedRequirePaths || {};\n }\n\n /**\n * Parse the require shim JSON string into an object\n */\n private getRequireShim(): Record<string, any> {\n if (this._parsedRequireShim === null && this.requireShimJson) {\n try {\n this._parsedRequireShim = JSON.parse(this.requireShimJson);\n } catch (e) {\n console.error('Error parsing require shim JSON:', e);\n this._errorMessage = `Error parsing require shim JSON: ${e.message}`;\n this._parsedRequireShim = {};\n }\n }\n return this._parsedRequireShim || {};\n }\n\n /**\n * Get the default require paths\n */\n private getDefaultRequirePaths(): Record<string, string | string[]> {\n return {\n 'taoQtiItem/portableLib/OAT/util/event': '/assets/pci-scripts/portableLib/OAT/util/event',\n 'taoQtiItem/portableLib/OAT/util/html': '/assets/pci-scripts/portableLib/OAT/util/html',\n 'taoQtiItem/portableLib/OAT/util/EventMgr': '/assets/pci-scripts/portableLib/OAT/util/EventMgr',\n 'taoQtiItem/portableLib/OAT/util/math': '/assets/pci-scripts/portableLib/OAT/util/math',\n 'taoQtiItem/portableLib/OAT/util/xml': '/assets/pci-scripts/portableLib/OAT/util/xml',\n 'taoQtiItem/portableLib/OAT/util/tooltip': '/assets/pci-scripts/portableLib/OAT/util/tooltip',\n 'taoQtiItem/portableLib/jquery_2_1_1': '/assets/pci-scripts/portableLib/jquery_2_1_1',\n 'taoQtiItem/pci-scripts/portableLib/jquery.qtip': '/assets/portableLib/jquery.qtip',\n 'taoQtiItem/pci-scripts/portableLib/lodash': '/assets/pci-scripts/portableLib/lodash',\n 'taoQtiItem/pci-scripts/portableLib/raphael': '/assets/pci-scripts/portableLib/raphael',\n 'IMSGlobal/jquery_2_1_1': '/assets/pci-scripts/IMSGlobal/jquery_2_1_1',\n 'OAT/util/event': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/event',\n 'OAT/util/html': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/html',\n 'OAT/util/EventMgr': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/EventMgr',\n 'OAT/util/math': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/math',\n 'OAT/util/xml': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/xml',\n 'OAT/util/tooltip': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/tooltip',\n 'OAT/lodash': '/assets/pci-scripts/legacyPortableSharedLib/lodash',\n mathJax: '/assets/pci-scripts/mathjax/mathJax',\n css: '/assets/pci-scripts/css/css'\n };\n }\n\n /**\n * Get the default require shim\n */\n private getDefaultRequireShim(): Record<string, any> {\n return {\n mathJax: {\n exports: 'MathJax',\n init: function () {\n const anyWindow = window as any;\n if (anyWindow.MathJax) {\n anyWindow.MathJax.Hub.Config({\n showMathMenu: false,\n showMathMenuMSIE: false,\n menuSettings: { inTabOrder: false }\n });\n anyWindow.MathJax.Hub.Startup.MenuZoom = function () {\n /* nothing */\n };\n anyWindow.MathJax.Hub.Startup.onload();\n return anyWindow.MathJax;\n }\n }\n }\n };\n }\n\n /**\n * Get the final require paths by combining defaults with user-provided paths\n */\n private getFinalRequirePaths(): Record<string, string | string[]> {\n const defaults = this.getDefaultRequirePaths();\n const userPaths = this.getRequirePaths();\n if (this.useDefaultPaths) {\n return { ...defaults, ...userPaths };\n }\n return userPaths;\n }\n\n /**\n * Get the final require shim by combining defaults with user-provided shim\n */\n private getFinalRequireShim(): Record<string, any> {\n const userShim = this.getRequireShim();\n const defaults = this.getDefaultRequireShim();\n if (this.useDefaultShims) {\n return { ...defaults, ...userShim };\n }\n return userShim;\n }\n\n /**\n * Converts QtiVariableJSON to a string or string array\n */\n private convertQtiVariableJSON(input: QtiVariableJSON): string | string[] {\n for (const topLevelKey in input) {\n // eslint-disable-next-line no-prototype-builtins\n if (input.hasOwnProperty(topLevelKey)) {\n const nestedObject = input[topLevelKey as 'list' | 'base'];\n if (nestedObject) {\n for (const nestedKey in nestedObject) {\n // eslint-disable-next-line no-prototype-builtins\n if (nestedObject.hasOwnProperty(nestedKey)) {\n const value = nestedObject[nestedKey as keyof typeof nestedObject];\n if (Array.isArray(value)) {\n return value.map(String); // Convert each element in the array to string\n } else if (value !== undefined && value !== null) {\n return String(value); // Convert the single value to string\n }\n }\n }\n }\n }\n }\n return null;\n }\n\n /**\n * Adds hyphenated versions of camelCase keys to properties object\n */\n private addHyphenatedKeys(properties: Record<string, any>): Record<string, any> {\n const updatedProperties = { ...properties };\n\n for (const key in properties) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n const hyphenatedKey = key.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`);\n updatedProperties[hyphenatedKey] = properties[key];\n }\n }\n\n return updatedProperties;\n }\n\n /**\n * Converts response variables to QtiVariableJSON\n */\n protected responseVariablesToQtiVariableJSON(\n input: string | string[],\n cardinality: Cardinality,\n baseType: BaseType\n ): QtiVariableJSON {\n if (cardinality !== 'single') {\n const list = { list: {} };\n list.list[baseType] = input;\n return list;\n } else {\n const base = { base: {} };\n base.base[baseType] = input;\n return base;\n }\n }\n\n validate(): boolean {\n return true;\n }\n\n set value(v: string | null) {\n if (v === null) {\n this._value = [];\n } else {\n this._value = Array.isArray(v) ? v : v.split(',');\n }\n // PCI handles response setting via boundTo property during initialization\n // No need to call setResponse directly\n }\n\n get value(): string | null {\n if (this.useIframe) {\n return this._value?.toString() || null;\n } else {\n // Try to get the value from the PCI first for direct mode\n const pciValue = this.pci?.getResponse();\n if (pciValue) {\n const convertedValue = this.convertQtiVariableJSON(pciValue);\n return Array.isArray(convertedValue) ? convertedValue.join(',') : convertedValue;\n }\n }\n\n // Fallback to stored value\n return Array.isArray(this._value) ? this._value.join(',') : this._value?.toString() || null;\n }\n\n set boundTo(newValue: Record<string, ResponseVariableType>) {\n if (!newValue || !newValue[this.responseIdentifier]) {\n return;\n }\n\n const value = this.convertQtiVariableJSON(newValue[this.responseIdentifier]);\n this._value = value;\n\n // No direct call to setResponse - PCI will handle this during initialization\n // through the boundTo property in the config\n\n this.saveResponse(value);\n }\n\n get boundTo(): Record<string, QtiVariableJSON> {\n const responseVariable: Record<string, QtiVariableJSON> = {};\n const variable = this.context?.variables?.find(v => v.identifier === this.responseIdentifier);\n if (variable) {\n const cardinality =\n this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.cardinality || 'single';\n const baseType =\n this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.baseType || 'string';\n const value = this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.value || null;\n const responseVal = this.responseVariablesToQtiVariableJSON(value as string | string[], cardinality, baseType);\n responseVariable[this.responseIdentifier] = responseVal;\n }\n\n return responseVariable;\n }\n\n /**\n * Unescape HTML entities in a string\n */\n private unescapeHtml(str: string): string {\n if (!str) return str;\n\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(///g, '/')\n .replace(/`/g, '`')\n .replace(/=/g, '=');\n }\n\n /**\n * Unescape HTML entities in all values of an object\n */\n private unescapeDataAttributes(obj: Record<string, any>): Record<string, any> {\n const unescaped: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n unescaped[key] = this.unescapeHtml(value);\n } else {\n unescaped[key] = value;\n }\n }\n\n return unescaped;\n }\n\n /**\n * DIRECT MODE: Register PCI instance\n */\n register(pci: IMSpci<ConfigProperties<unknown>>) {\n this.pci = pci;\n this.dom = this.querySelector('qti-interaction-markup');\n if (!this.dom) {\n this.dom = document.createElement('div');\n this.appendChild(this.dom);\n }\n this.dom.classList.add('qti-customInteraction');\n\n // Add explicit styling to DOM element for direct mode\n this.dom.style.width = '100%';\n this.dom.style.minHeight = '50px';\n this.dom.style.display = 'block';\n\n this.dom.addEventListener('qti-interaction-changed', this._onInteractionChanged);\n if (this.querySelector('properties')) {\n (this.querySelector('properties') as HTMLElement).style.display = 'none';\n }\n\n const config: any = {\n properties: this.addHyphenatedKeys(this.unescapeDataAttributes({ ...this.dataset })),\n contextVariables: {},\n templateVariables: {},\n onready: pciInstance => {\n this.pci = pciInstance;\n // Set up a ResizeObserver to handle dynamic size changes in direct mode\n try {\n const resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n if (entry.contentRect) {\n // Adjust container height based on content\n if (entry.contentRect.height > 0) {\n // Add a small buffer for padding\n this.style.height = `${entry.contentRect.height + 20}px`;\n }\n }\n }\n });\n\n // Observe the DOM element\n resizeObserver.observe(this.dom);\n\n // Store reference for cleanup\n (this as any)._resizeObserver = resizeObserver;\n } catch (e) {\n console.warn('ResizeObserver not supported, falling back to static sizing');\n }\n },\n ondone: (_pciInstance, response, _state, _status: 'interacting' | 'closed' | 'solution' | 'review') => {\n this.response = this.convertQtiVariableJSON(response);\n this.saveResponse(this.response);\n },\n responseIdentifier: this.responseIdentifier,\n boundTo: this.boundTo\n };\n\n if (pci.getInstance) {\n pci.getInstance(this.dom, config, undefined);\n } else {\n // Try the TAO custom interaction initialization.\n const restoreTAOConfig = (element: HTMLElement): any => {\n const config: any = {};\n\n const parseDataAttributes = (element: HTMLElement) => {\n const result: Record<string, any> = {};\n\n // Separate direct attributes from nested ones\n Object.entries(element.dataset).forEach(([key, value]) => {\n if (!key.includes('__')) {\n // Direct attributes (like version)\n result[key] = value;\n }\n });\n\n // Parse nested attributes\n const nestedData: Record<string, Record<string, any>> = {};\n\n Object.entries(element.dataset).forEach(([key, value]) => {\n const parts = key.split('__');\n if (parts.length > 1) {\n const [group, index, prop] = parts;\n nestedData[group] = nestedData[group] || {};\n nestedData[group][index] = nestedData[group][index] || {};\n nestedData[group][index][prop] = value;\n }\n });\n\n // Convert nested groups to arrays\n Object.entries(nestedData).forEach(([key, group]) => {\n result[key] = Object.values(group);\n });\n\n return result;\n };\n\n const data = parseDataAttributes(element);\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key];\n if (key === 'config') {\n config[key] = JSON.parse(value);\n } else {\n config[key] = value;\n }\n }\n }\n return config;\n };\n const taoConfig = restoreTAOConfig(this);\n (pci as any).initialize(\n this.customInteractionTypeIdentifier,\n this.dom.firstElementChild || this.dom,\n Object.keys(taoConfig).length ? taoConfig : null\n );\n }\n }\n\n /* ... rest of the code remains the same ... */\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n if (this.useIframe) {\n // IFRAME MODE cleanup\n window.removeEventListener('message', this.handleIframeMessage);\n } else {\n // DIRECT MODE cleanup\n // Clean up ResizeObserver if it exists\n // DIRECT MODE cleanup\n // Stop response checking interval\n this.stopResponseCheck();\n if ((this as any)._resizeObserver) {\n (this as any)._resizeObserver.disconnect();\n (this as any)._resizeObserver = null;\n }\n\n requirejs.undef(this.customInteractionTypeIdentifier);\n // Clear the modules in the context\n const context = requirejs.s.contexts;\n delete context[this.customInteractionTypeIdentifier];\n // Remove the event listener when the component is disconnected\n this.removeEventListener('qti-interaction-changed', this._onInteractionChanged);\n }\n }\n\n /**\n * IFRAME MODE: Send message to iframe\n */\n protected sendMessageToIframe(method: string, params: any) {\n if (!this._iframeLoaded) {\n this._pendingMessages.push({ method, params });\n return;\n }\n this.iframe.contentWindow.postMessage(\n {\n source: 'qti-portable-custom-interaction',\n method,\n params\n },\n '*'\n );\n }\n\n /**\n * IFRAME MODE: Process pending messages\n */\n private processPendingMessages() {\n if (this._pendingMessages.length) {\n this._pendingMessages.forEach(message => {\n this.sendMessageToIframe(message.method, message.params);\n });\n this._pendingMessages = [];\n }\n }\n\n /**\n * IFRAME MODE: Handle iframe messages\n */\n protected handleIframeMessage = (event: MessageEvent) => {\n const { data } = event;\n // Ensure the message is from our iframe\n if (!data || data.source !== 'qti-pci-iframe') {\n return;\n }\n switch (data.method) {\n case 'iframeReady':\n this.initializeInteraction();\n this.processPendingMessages();\n this.dispatchEvent(\n new CustomEvent('qti-portable-custom-interaction-loaded', {\n bubbles: true\n })\n );\n break;\n\n case 'resize':\n if (typeof data.height === 'number' && this.iframe) {\n this.iframe.style.height = `${data.height}px`;\n this.iframe.style.width = `${data.width}px`;\n }\n break;\n\n case 'interactionChanged': {\n const value = this.convertQtiVariableJSON(data.params.value);\n this.response = value;\n this.validate();\n this.saveResponse(this.response);\n break;\n }\n case 'error':\n this._errorMessage = data.params.message;\n console.error('Error from PCI iframe:', data.params.message);\n break;\n }\n };\n\n /**\n * IFRAME MODE: Create iframe element\n */\n protected createIframe() {\n this.iframe = document.createElement('iframe');\n this.iframe.id = `pci-iframe-${this.responseIdentifier}`;\n this.iframe.setAttribute('title', 'QTI PCI Iframe');\n this.iframe.setAttribute('aria-label', 'QTI PCI Iframe');\n this.iframe.setAttribute('aria-hidden', 'false');\n this.iframe.setAttribute('role', 'application');\n this.iframe.style.width = '100%';\n this.iframe.style.border = 'none';\n this.iframe.style.display = 'block';\n\n // Handle iframe load event\n this.iframe.onload = () => {\n this._iframeLoaded = true;\n this.addMarkupToIframe();\n // Send initialization data to iframe\n this.sendIframeInitData();\n };\n\n // Create a unique name for the iframe\n const iframeName = `qti-pci-${this.responseIdentifier}-${Date.now()}`;\n this.iframe.name = iframeName;\n\n // Generate iframe HTML content with all required scripts\n const iframeContent = this.generateIframeContent();\n\n // Set iframe src as data URI\n const encodedContent = encodeURIComponent(iframeContent);\n this.iframe.src = `data:text/html;charset=utf-8,${encodedContent}`;\n\n // Append iframe to component\n this.appendChild(this.iframe);\n }\n\n /**\n * IFRAME MODE: Send initialization data to iframe\n */\n private sendIframeInitData() {\n // Once iframe is loaded, send initialization data\n const initData = {\n module: this.module,\n customInteractionTypeIdentifier: this.customInteractionTypeIdentifier,\n baseUrl: !this.baseUrl\n ? window.location.origin\n : this.baseUrl.startsWith('http') || this.baseUrl.startsWith('blob') || this.baseUrl.startsWith('base64')\n ? this.baseUrl\n : removeDoubleSlashes(`${window.location.origin}${this.baseUrl}`),\n responseIdentifier: this.responseIdentifier,\n dataAttributes: { ...this.dataset },\n interactionModules: this.getInteractionModules(),\n boundTo: this.boundTo\n };\n\n this.sendMessageToIframe('initialize', initData);\n }\n\n /**\n * IFRAME MODE: Get interaction modules from DOM\n */\n private getInteractionModules() {\n const modules = [];\n const interactionModules = this.querySelector('qti-interaction-modules');\n\n if (interactionModules) {\n const moduleElements = interactionModules.querySelectorAll('qti-interaction-module');\n for (const module of moduleElements) {\n modules.push({\n id: module.getAttribute('id'),\n primaryPath: module.getAttribute('primary-path'),\n fallbackPath: module.getAttribute('fallback-path')\n });\n }\n }\n\n return modules;\n }\n\n /**\n * IFRAME MODE: Add markup and properties to iframe\n */\n private addMarkupToIframe() {\n // Get interaction markup if any\n const markup = this.querySelector('qti-interaction-markup');\n if (markup) {\n this.sendMessageToIframe('setMarkup', markup.innerHTML);\n }\n // Get properties if any\n const properties = this.querySelector('properties');\n if (properties) {\n this.sendMessageToIframe('setProperties', properties.innerHTML);\n }\n }\n\n /**\n * IFRAME MODE: Initialize the interaction\n */\n private initializeInteraction() {\n // No explicit action needed, as the PCI will initialize\n // with the boundTo property already provided\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.useIframe) {\n // IFRAME MODE\n window.addEventListener('message', this.handleIframeMessage);\n this.createIframe();\n } else {\n // DIRECT MODE\n define('qtiCustomInteractionContext', () => {\n return {\n register: ctxA => {\n this.register(ctxA);\n },\n notifyReady: () => {\n /* only used in the TAO version */\n }\n };\n });\n\n const config = this.buildRequireConfig();\n if (config) {\n const requirePCI = requirejs.config(config);\n requirejs.onError = function (err) {\n console.error('RequireJS error:', err);\n if (err.requireType === 'timeout') {\n console.error('Modules that timed out:', err.requireModules);\n }\n throw err;\n };\n requirePCI(['require'], require => {\n try {\n require([this.module], () => {}, err => {\n console.error('Error loading module:', err);\n });\n } catch (error) {\n console.error('Error in require call:', error);\n }\n });\n }\n }\n }\n\n /**\n * Stop checking for response changes\n */\n private stopResponseCheck(): void {\n if (this._responseCheckInterval !== null) {\n window.clearInterval(this._responseCheckInterval);\n this._responseCheckInterval = null;\n }\n }\n\n private _onInteractionChanged = (event: CustomEvent) => {\n // Prevent further propagation of the event\n event.stopPropagation();\n\n // Optionally, handle the event here (e.g., update internal state)\n const value = this.convertQtiVariableJSON(event.detail.value);\n this.response = value;\n this.saveResponse(value);\n };\n\n /**\n * DIRECT MODE: Build RequireJS configuration\n */\n buildRequireConfig() {\n // Set RequireJS paths and shim configuration if available\n const config: ModuleResolutionConfig = {\n context: this.customInteractionTypeIdentifier,\n catchError: true,\n paths: { ...this.getFinalRequirePaths(), ...(window['requirePaths'] || {}) },\n shim: { ...this.getFinalRequireShim(), ...(window['requireShim'] || {}) }\n };\n // Check if RequireJS is available, if not, set an error message\n if (!globalThis.require) {\n this._errorMessage = `RequireJS not found. Please load it via CDN: https://cdnjs.com/libraries/require.js`;\n return null;\n }\n const baseUrl = this.getAttribute('data-base-url');\n const interactionModules = this.querySelector('qti-interaction-modules');\n\n if (interactionModules) {\n const modules = interactionModules.querySelectorAll('qti-interaction-module');\n for (const module of modules) {\n const moduleId = module.getAttribute('id');\n const primaryPath = module.getAttribute('primary-path');\n const fallbackPath = module.getAttribute('fallback-path');\n\n if (moduleId && primaryPath) {\n // Set the paths using RequireJS's fallback array\n const paths = fallbackPath\n ? this.combineRequireResolvePaths(\n this.getResolvablePath(primaryPath, baseUrl),\n this.getResolvablePath(fallbackPath, baseUrl)\n )\n : this.getResolvablePath(primaryPath, baseUrl);\n const existingPath = config.paths[moduleId] || [];\n config.paths[moduleId] = this.combineRequireResolvePaths(existingPath, paths);\n }\n }\n }\n return config;\n }\n\n /**\n * DIRECT MODE: Helper method to combine require paths\n */\n private combineRequireResolvePaths(path1: string | string[], path2: string | string[]) {\n const path1Array = Array.isArray(path1) ? path1 : [path1];\n const path2Array = Array.isArray(path2) ? path2 : [path2];\n return path1Array.concat(path2Array).filter((value, index, self) => self.indexOf(value) === index);\n }\n\n /**\n * DIRECT MODE: Helper method to remove double slashes\n */\n private removeDoubleSlashes(str: string) {\n const singleForwardSlashes = str\n .replace(/([^:]\\/)\\/+/g, '$1')\n .replace(/\\/\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n return singleForwardSlashes;\n }\n\n /**\n * DIRECT MODE: Load config from URL\n */\n loadConfig = async (url: string, baseUrl?: string): Promise<ModuleResolutionConfig> => {\n url = this.removeDoubleSlashes(url);\n try {\n const requireConfig = await fetch(url);\n if (requireConfig.ok) {\n const config = await requireConfig.json();\n const moduleCong = config as ModuleResolutionConfig;\n for (const moduleId in moduleCong.paths) {\n if (baseUrl) {\n moduleCong.paths[moduleId] = this.getResolvablePath(moduleCong.paths[moduleId], baseUrl);\n }\n }\n return moduleCong;\n }\n } catch (e) {\n // do nothing\n }\n return null;\n };\n\n /**\n * DIRECT MODE: Helper method to get resolvable path string\n */\n getResolvablePathString = (path: string, basePath?: string) => {\n path = path.replace(/\\.js$/, '');\n return path?.toLocaleLowerCase().startsWith('http') || !basePath\n ? path\n : this.removeDoubleSlashes(`${basePath}/${path}`);\n };\n\n /**\n * DIRECT MODE: Helper method to get resolvable path\n */\n getResolvablePath = (path: string | string[], basePath?: string) => {\n return Array.isArray(path)\n ? path.map(p => this.getResolvablePathString(p, basePath))\n : this.getResolvablePathString(path, basePath);\n };\n\n /**\n * IFRAME MODE: Generate iframe HTML content\n */\n protected generateIframeContent(): string {\n const parentStyles = window.getComputedStyle(document.body);\n\n // Get the configured require paths and shim\n const requirePaths = JSON.stringify(this.getFinalRequirePaths());\n const requireShim = JSON.stringify(this.getFinalRequireShim());\n\n // Extract just the font-related properties you want to copy\n const fontStyles = `\n font-family: ${parentStyles.getPropertyValue('font-family')};\n font-size: ${parentStyles.getPropertyValue('font-size')};\n line-height: ${parentStyles.getPropertyValue('line-height')};\n font-weight: ${parentStyles.getPropertyValue('font-weight')};\n color: ${parentStyles.getPropertyValue('color')};\n `;\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>QTI PCI Container</title>\n <base href=\"${window.location.origin}\" />\n <style>\n body, html {\n margin: 0;\n padding: 0;\n width: 100%;\n height: auto;\n overflow: hidden;\n /* Add the extracted font styles here */\n ${fontStyles}\n }\n .qti-customInteraction {\n width: 100%;\n height: 100%;\n }\n #pci-container {\n width: 100%;\n </style>\n <script src=\"${this.requireJsUrl}\"></script>\n <script>\n // Define standard paths and shims\n window.requirePaths = ${requirePaths};\n\n window.requireShim = ${requireShim};\n\n // Single initial RequireJS configuration with error handling\n window.requirejs.config({\n catchError: true,\n waitSeconds: 30,\n paths: window.requirePaths,\n baseUrl: '${this.dataset.baseUrl}',\n shim: window.requireShim,\n onNodeCreated: function(node, config, moduleName, url) {\n console.log('RequireJS creating node for module:', moduleName, 'URL:', url);\n\n // Add error handler to script node\n node.addEventListener('error', function(evt) {\n console.error('Script load error for module:', moduleName, 'URL:', url, 'Event:', evt);\n });\n },\n onError: function(err) {\n console.error('RequireJS error:', {\n type: err.requireType,\n modules: err.requireModules,\n error: err\n });\n\n if (err.requireType === 'scripterror') {\n console.error('Script error usually indicates a network or CORS issue with:', err.requireModules);\n }\n\n // Notify parent window about the error\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'error',\n params: {\n message: 'RequireJS ' + err.requireType + ' error for modules: ' + err.requireModules,\n details: {\n type: err.requireType,\n modules: err.requireModules,\n error: err.toString()\n }\n }\n }, '*');\n }\n });\n\n // PCI Manager for iframe implementation\n window.PCIManager = {\n pciInstance: null,\n container: null,\n customInteractionTypeIdentifier: null,\n\n initialize: function(config) {\n this.customInteractionTypeIdentifier = config.customInteractionTypeIdentifier;\n this.container = document.getElementById('pci-container');\n this.container.classList.add('qti-customInteraction');\n\n function getResolvablePath(path, basePath) {\n if (Array.isArray(path)) {\n return path.map(p => getResolvablePathString(p, basePath));\n } else {\n return getResolvablePathString(path, basePath);\n }\n }\n\n function removeDoubleSlashes(str) {\n return str\n .replace(/([^:\\\\/])\\\\/\\\\/+/g, '$1/')\n .replace(/\\\\/\\\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n }\n\n function getResolvablePathString(path, basePath) {\n path = path.replace(/\\\\.js$/, '');\n return path?.toLocaleLowerCase().startsWith('http') || !basePath\n ? path\n : removeDoubleSlashes(\\`\\${basePath}/\\${path}\\`);\n }\n\n function combineRequireResolvePaths(path1, path2, baseUrl) {\n path1 = getResolvablePath(path1, baseUrl);\n const path1Array = Array.isArray(path1) ? path1 : [path1];\n if (!path2) {\n return path1Array;\n }\n path2 = getResolvablePath(path2, baseUrl);\n const path2Array = Array.isArray(path2) ? path2 : [path2];\n return path1Array.concat(path2Array).filter((value, index, self) => self.indexOf(value) === index);\n }\n\n // Update paths with modules from the config\n if (config.interactionModules && config.interactionModules.length > 0) {\n config.interactionModules.forEach(module => {\n if (module.id && module.primaryPath) {\n const currentPath = window.requirePaths[module.id] || [];\n const currentPaths = Array.isArray(currentPath) ? currentPath : [currentPath];\n const newPath = combineRequireResolvePaths(\n module.primaryPath, module.fallbackPath, config.baseUrl\n );\n window.requirePaths[module.id] = currentPaths.concat(newPath).filter((value, index, self) => self.indexOf(value) === index);\n }\n });\n }\n\n // The ONLY other requirejs.config call - with the context for this specific PCI\n window.requirejs.config({\n context: this.customInteractionTypeIdentifier,\n paths: window.requirePaths,\n shim: window.requireShim\n });\n\n // Define qtiCustomInteractionContext for the PCI\n define('qtiCustomInteractionContext', () => {\n return {\n register: pciInstance => {\n this.pciInstance = pciInstance;\n // Configure PCI instance\n const pciConfig = {\n properties: this.addHyphenatedKeys(this.unescapeDataAttributes({ ...config.dataAttributes })),\n contextVariables: config.contextVariables || {},\n templateVariables: config.templateVariables || {},\n onready: pciInstance => {\n this.pciInstance = pciInstance;\n this.notifyReady();\n },\n ondone: (pciInstance, response, state, status) => {\n this.notifyInteractionChanged(response);\n },\n responseIdentifier: config.responseIdentifier,\n boundTo: config.boundTo,\n };\n\n if (pciInstance.getInstance) {\n pciInstance.getInstance(this.container, pciConfig, undefined);\n } else {\n // TAO custom interaction initialization\n const restoreTAOConfig = (dataset) => {\n const config = {};\n const parseDataAttributes = () => {\n const result = {};\n\n // Separate direct attributes from nested ones\n Object.entries(dataset || []).forEach(([key, value]) => {\n if (!key.includes('__')) {\n // Direct attributes (like version)\n result[key] = value;\n }\n });\n\n // Parse nested attributes\n const nestedData = {};\n\n Object.entries(dataset || []).forEach(([key, value]) => {\n const parts = key.split('__');\n if (parts.length > 1) {\n const [group, index, prop] = parts;\n nestedData[group] = nestedData[group] || {};\n nestedData[group][index] = nestedData[group][index] || {};\n nestedData[group][index][prop] = value;\n }\n });\n\n // Convert nested groups to arrays\n Object.entries(nestedData).forEach(([key, group]) => {\n result[key] = Object.values(group);\n });\n return result;\n };\n const data = parseDataAttributes();\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key];\n if (key === 'config') {\n config[key] = JSON.parse(value);\n } else {\n config[key] = value;\n }\n }\n }\n return config;\n };\n const taoConfig = restoreTAOConfig(config.dataAttributes);\n\n this.pciInstance.initialize(\n this.customInteractionTypeIdentifier,\n this.container.firstElementChild || this.container,\n Object.keys(taoConfig).length ? taoConfig : null\n );\n }\n },\n notifyReady: () => {\n // Notify parent that the PCI is ready\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'pciReady'\n }, '*');\n }\n };\n });\n\n // Load the PCI module\n this.loadModule(config.module);\n },\n\n loadModule: function(modulePath) {\n try {\n // Get the context-specific require\n const contextRequire = window.requirejs.config({\n context: this.customInteractionTypeIdentifier\n });\n contextRequire(['require'], require => {\n // Now load the actual module\n require([modulePath], () => {\n }, err => {\n console.error('Error loading module:', modulePath, err);\n this.notifyError('Module load error: ' + err.toString());\n });\n });\n } catch (error) {\n console.error('Exception in loadModule:', modulePath);\n console.error(error);\n this.notifyError('Error in require call: ' + error.toString());\n }\n },\n\n notifyReady: function() {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'iframeReady'\n }, '*');\n },\n\n notifyInteractionChanged: function(response) {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'interactionChanged',\n params: { value: response }\n }, '*');\n },\n\n notifyError: function(message) {\n console.error('PCI Error:', message);\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'error',\n params: { message: message }\n }, '*');\n },\n\n setMarkup: function(markupHtml) {\n this.container = document.getElementById('pci-container');\n this.container.innerHTML = markupHtml;\n },\n\n addHyphenatedKeys: function(properties) {\n const updatedProperties = { ...properties };\n for (const key in properties) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n const hyphenatedKey = key.replace(/[A-Z]/g, char => \\`-\\${char.toLowerCase()}\\`);\n updatedProperties[hyphenatedKey] = properties[key];\n }\n }\n return updatedProperties;\n },\n unescapeDataAttributes: function(obj) {\n const unescaped = {};\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n unescaped[key] = value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(///g, '/')\n .replace(/`/g, '\\`')\n .replace(/=/g, '=');\n } else {\n unescaped[key] = value;\n }\n }\n return unescaped;\n },\n };\n\n // Set up message listener for communication with parent\n window.addEventListener('message', function(event) {\n const { data } = event;\n\n // Ensure the message is from our parent\n if (!data || data.source !== 'qti-portable-custom-interaction') {\n return;\n }\n\n switch(data.method) {\n case 'initialize':\n PCIManager.initialize(data.params);\n break;\n\n case 'setMarkup':\n PCIManager.setMarkup(data.params);\n break;\n\n case 'setBoundTo':\n // Handle setting boundTo\n break;\n\n case 'setProperties':\n // Handle setting properties\n break;\n }\n });\n\n // Notify parent that iframe has loaded\n window.addEventListener('load', function() {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'iframeLoaded'\n }, '*');\n });\n let resizeTimeout;\n let previousHeight = 0;\n const notifyResize = () => {\n const container = document.getElementById('pci-container');\n const newHeight = container.scrollHeight + 100;\n if (newHeight !== previousHeight) {\n previousHeight = newHeight;\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'resize',\n height: newHeight,\n width: container.scrollWidth\n }, '*');\n }, 100); // Adjust debounce time as needed\n }\n };\n\n function setupResizeObserver() {\n const container = document.getElementById('pci-container');\n if (!container || !(container instanceof Element)) {\n console.warn('ResizeObserver: document.container is not an Element');\n return;\n }\n\n const resizeObserver = new ResizeObserver(() => {\n notifyResize();\n });\n\n resizeObserver.observe(container);\n }\n\n // Run setup once DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n notifyResize(); // initial resize\n setupResizeObserver();\n });\n } else {\n notifyResize();\n setupResizeObserver();\n }\n\n window.addEventListener('load', () => {\n notifyResize();\n });\n let lastResponseStr = '';\n setInterval(() => {\n if (PCIManager.pciInstance && PCIManager.pciInstance.getResponse) {\n const response = PCIManager.pciInstance.getResponse();\n const responseStr = JSON.stringify(response);\n\n if (responseStr !== lastResponseStr) {\n lastResponseStr = responseStr;\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'interactionChanged',\n params: { value: response }\n }, '*');\n }\n }\n }, 500); // Check every 500ms\n </script>\n</head>\n<body>\n <div id=\"pci-container\"></div>\n</body>\n</html>`;\n }\n\n /**\n * Toggle the display of the correct response\n * @param responseVariable The response variable containing the correct response\n * @param show Whether to show or hide the correct response\n */\n public toggleInternalCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n\n // Store the correct response or clear it based on the show parameter\n this.correctResponse = show\n ? responseVariable?.correctResponse\n : responseVariable.cardinality === 'single'\n ? ''\n : [];\n\n // Get unique identifiers for this PCI's correct response elements\n const containerId = `correct-response-container-${this.responseIdentifier}`;\n\n // Check the parent element for any existing containers with this ID\n const existingContainers = this.parentElement?.querySelectorAll(`#${containerId}`);\n if (existingContainers) {\n existingContainers.forEach(existingContainer => {\n existingContainer.remove();\n });\n }\n\n // Handle the current interaction's state\n if (show) {\n // Disable the current interaction when showing correct response\n this.disable();\n } else {\n // Enable the current interaction when hiding correct response\n this.enable();\n return; // Exit early, nothing else to do\n }\n\n // If there's no correct response to show, exit\n if (!show || !responseVariable?.correctResponse) {\n return;\n }\n\n // Create a container for the correct response viewer\n const correctResponseContainer = document.createElement('div');\n correctResponseContainer.id = containerId;\n correctResponseContainer.className = 'pci-correct-response-container';\n correctResponseContainer.style.position = 'relative';\n correctResponseContainer.style.marginTop = '20px';\n correctResponseContainer.style.border = '2px solid green';\n correctResponseContainer.style.padding = '16px';\n correctResponseContainer.style.borderRadius = '4px';\n correctResponseContainer.style.backgroundColor = 'rgba(0, 128, 0, 0.05)';\n\n // Add a label for the correct response\n const label = document.createElement('div');\n label.textContent = 'Correct Response:';\n label.style.fontWeight = 'bold';\n label.style.marginBottom = '10px';\n label.style.color = 'green';\n correctResponseContainer.appendChild(label);\n\n // Instead of cloning, we'll create a new instance and copy necessary attributes\n const correctResponseViewer = document.createElement(\n 'qti-portable-custom-interaction'\n ) as QtiPortableCustomInteraction;\n\n // Copy all attributes from the original PCI\n Array.from(this.attributes).forEach(attr => {\n if (attr.name !== 'id' && attr.name !== 'response-identifier') {\n correctResponseViewer.setAttribute(attr.name, attr.value);\n }\n });\n\n // Set a unique response identifier to avoid conflicts\n const originalResponseId = this.responseIdentifier;\n correctResponseViewer.responseIdentifier = `${originalResponseId}-correct`;\n\n // Copy any light DOM content from the original PCI\n // This includes markup and properties\n Array.from(this.children).forEach(child => {\n const clonedChild = child.cloneNode(true);\n correctResponseViewer.appendChild(clonedChild);\n });\n\n // Store the correct response value\n const correctResponseValue = responseVariable.correctResponse;\n\n // Different initialization based on mode\n if (this.useIframe) {\n // For iframe mode, add a custom connected callback\n const originalConnectedCallback = correctResponseViewer.connectedCallback;\n correctResponseViewer.connectedCallback = function () {\n // Call the original connected callback to set up the iframe\n originalConnectedCallback.call(this);\n\n // Wait for iframe to load then set the correct response\n const checkIframeLoaded = () => {\n if (this._iframeLoaded) {\n // Set response after a small delay to ensure PCI is ready\n setTimeout(() => {\n const qtiVariableJSON = this.responseVariablesToQtiVariableJSON(\n correctResponseValue,\n responseVariable.cardinality,\n responseVariable.baseType\n );\n\n // Send the correct response to the iframe\n this.sendMessageToIframe('setBoundTo', {\n [originalResponseId]: qtiVariableJSON\n });\n\n // Disable interaction with the correct response viewer\n this.sendMessageToIframe('setState', { state: 'review' });\n }, 1000);\n\n return true;\n }\n return false;\n };\n\n // Try immediately\n if (!checkIframeLoaded()) {\n // If not loaded yet, set up an interval to check\n const intervalId = setInterval(() => {\n if (checkIframeLoaded()) {\n clearInterval(intervalId);\n }\n }, 100);\n\n // Safety timeout to clear interval after 10 seconds\n setTimeout(() => {\n clearInterval(intervalId);\n }, 10000);\n }\n };\n } else {\n // For direct mode, add a custom register method\n const originalRegister = correctResponseViewer.register;\n correctResponseViewer.register = function (pci) {\n // Call the original register method\n originalRegister.call(this, pci);\n\n // Once registered, set the correct response\n const setCorrectResponse = () => {\n if (this.pci) {\n if (typeof this.pci.setResponse === 'function') {\n // Convert to the format expected by the PCI\n const pciResponse = this.responseVariablesToQtiVariableJSON(\n correctResponseValue,\n responseVariable.cardinality,\n responseVariable.baseType\n );\n\n // Set the response\n this.pci.setResponse(pciResponse);\n\n // Disable interaction if the PCI supports it\n if (typeof this.pci.setState === 'function') {\n this.pci.setState('review');\n }\n\n return true;\n }\n }\n return false;\n };\n\n // Try to set response after a delay to ensure PCI is fully initialized\n setTimeout(() => {\n if (!setCorrectResponse()) {\n // If not successful, try again with a longer delay\n const intervalId = setInterval(() => {\n if (setCorrectResponse()) {\n clearInterval(intervalId);\n }\n }, 200);\n\n // Safety timeout to clear interval after 5 seconds\n setTimeout(() => {\n clearInterval(intervalId);\n }, 5000);\n }\n }, 500);\n };\n }\n\n // Make sure the viewer is not interactive\n correctResponseViewer.style.pointerEvents = 'none';\n\n // Add the correct response viewer to the container\n correctResponseContainer.appendChild(correctResponseViewer);\n\n // Append the container after this PCI\n this.after(correctResponseContainer);\n }\n /**\n * Method to disable the PCI for review mode\n * This can be used when showing the correct response\n */\n public disable() {\n // First, store the current state of the PCI\n this._previousState = {\n pointerEvents: this.style.pointerEvents,\n position: this.style.position\n };\n\n if (this.useIframe) {\n // For iframe mode, send a message to disable interaction\n this.sendMessageToIframe('setState', { state: 'disabled' });\n } else {\n // // For direct mode, use the PCI's disable method if available\n // if (this.pci && typeof this.pci.setState === 'function') {\n // this.pci.setState('disabled');\n // }\n }\n\n // Add an overlay to prevent interaction if not already there\n const existingOverlay = this.querySelector('.pci-interaction-overlay');\n if (!existingOverlay) {\n const overlay = document.createElement('div');\n overlay.className = 'pci-interaction-overlay';\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.backgroundColor = 'rgba(200, 200, 200, 0.3)';\n overlay.style.zIndex = '100';\n overlay.style.pointerEvents = 'all';\n overlay.style.cursor = 'not-allowed';\n\n // Make sure the container is relatively positioned\n if (getComputedStyle(this).position === 'static') {\n this.style.position = 'relative';\n }\n\n this.appendChild(overlay);\n }\n }\n\n /**\n * Method to enable the PCI for interactive mode\n */\n public enable() {\n // Remove any overlays\n const overlay = this.querySelector('.pci-interaction-overlay');\n if (overlay) {\n overlay.remove();\n }\n\n // Restore previous state if available\n if (this._previousState) {\n if (this._previousState.pointerEvents) {\n this.style.pointerEvents = this._previousState.pointerEvents;\n }\n if (this._previousState.position) {\n this.style.position = this._previousState.position;\n }\n this._previousState = null;\n }\n\n if (this.useIframe) {\n // For iframe mode, send a message to enable interaction\n this.sendMessageToIframe('setState', { state: 'interacting' });\n } else {\n // // For direct mode, use the PCI's enable method if available\n // if (this.pci && typeof this.pci.setState === 'function') {\n // this.pci.setState('interacting');\n // }\n }\n }\n\n // Add this property to store the previous state\n private _previousState: {\n pointerEvents?: string;\n position?: string;\n } = null;\n\n override render() {\n return html`\n <slot></slot>\n ${this._errorMessage\n ? html`<div style=\"color:red\">\n <h1>Error</h1>\n ${this._errorMessage}\n </div>`\n : ''}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-portable-custom-interaction': QtiPortableCustomInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n\n/* ${componentStyles} */\nexport default css`\n ::slotted(qti-interaction-markup) {\n display: none;\n }\n`;\n","import { LitElement, css, html } from 'lit';\n\nexport class QtiPositionObjectInteraction extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n css`\n :host {\n display: block;\n }\n ::slotted(img) {\n position: absolute;\n cursor: move;\n user-select: none;\n left: 50%;\n transform: translateX(-50%);\n }\n `\n ];\n}\n\ncustomElements.define('qti-position-object-interaction', QtiPositionObjectInteraction);\n","import { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-position-object-stage')\nexport class QtiPositionObjectStage extends LitElement {\n choiceOrdering: boolean;\n startX: any;\n startY: any;\n dragElement: any;\n\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n css`\n :host {\n display: inline-block;\n position: relative;\n }\n `\n ];\n\n constructor() {\n super();\n this.removeMoveListener = this.removeMoveListener.bind(this);\n this.dragElementHandler = this.dragElementHandler.bind(this);\n }\n\n // Define a function to handle the mousemove event on the draggable element\n dragElementHandler(event) {\n event.preventDefault();\n\n // Calculate the distance the mouse has moved since the last event\n const deltaX = event.clientX - this.startX;\n const deltaY = event.clientY - this.startY;\n\n // Update the position of the draggable element\n this.dragElement.style.left = this.dragElement.offsetLeft + deltaX + 'px';\n this.dragElement.style.top = this.dragElement.offsetTop + deltaY + 'px';\n\n // Update the starting position of the mouse\n this.startX = event.clientX;\n this.startY = event.clientY;\n }\n\n override firstUpdated(a): void {\n super.firstUpdated(a);\n\n // Get the draggable and drop zone elements\n this.dragElement = this.querySelector('qti-position-object-interaction>img');\n // const canvasElement = document.getElementById('canvas');\n\n // Initialize variables for the starting position of the draggable element\n this.startX = 0;\n this.startY = 0;\n\n // Add a mousedown event listener to the draggable element\n this.dragElement.addEventListener('mousedown', (event: MouseEvent) => {\n // Save the starting position of the mouse\n this.startX = event.clientX;\n this.startY = event.clientY;\n\n // Add a mousemove event listener to the document\n document.addEventListener('mousemove', this.dragElementHandler, true);\n });\n document.addEventListener('mouseup', this.removeMoveListener);\n }\n\n removeMoveListener() {\n document.removeEventListener('mousemove', this.dragElementHandler, true);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('mousemove', this.dragElementHandler);\n document.removeEventListener('mouseup', this.removeMoveListener);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-position-object-stage': QtiPositionObjectStage;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { ScoringHelper } from '../../qti-response-processing/utilities/scoring-helper.ts';\n\nimport type { QtiAreaMapEntry, QtiAreaMapping } from '../../qti-response-processing';\n\n@customElement('qti-select-point-interaction')\nexport class QtiSelectPointInteraction extends Interaction {\n static override styles = [\n css`\n :host {\n display: block;\n }\n point-container {\n display: block;\n position: relative;\n width: fit-content;\n }\n\n ::slotted(img) {\n max-width: 100%;\n height: auto;\n display: block;\n }\n `\n ];\n\n @property({\n type: Number,\n attribute: 'max-choices'\n })\n public maxChoices: number = Infinity;\n\n @property({\n type: Number,\n attribute: 'min-choices'\n })\n public minChoices: number = 0;\n\n @state() response: string[] | null = null;\n\n @state()\n private _correctAreas: { shape: string; coords: string }[] = [];\n\n @state()\n private _responseCorrection: boolean[] = [];\n\n // Reference to the image element\n private _imgElement: HTMLImageElement | null = null;\n\n private _scaleX = 1;\n private _scaleY = 1;\n private _imageWidthOriginal = 0;\n private _imageHeightOriginal = 0;\n\n // Extracted click handler method\n private _onImageClick = (event: MouseEvent) => {\n if (this.disabled) {\n return;\n }\n if (!this._imgElement) {\n console.warn('No <img> element found in <qti-select-point-interaction>');\n return;\n }\n this.calculateScale();\n // Get the image's bounding rectangle and calculate scaling factors\n const rect = this._imgElement.getBoundingClientRect();\n\n // Calculate the x and y coordinates relative to the original image size\n const x = (event.clientX - rect.left) * this._scaleX;\n const y = (event.clientY - rect.top) * this._scaleY;\n\n // Save the new point as a string\n const newPoint = `${x.toFixed()} ${y.toFixed()}`;\n\n if (this.maxChoices === 1) {\n // If maxChoices is 1, replace the existing marker with the new one\n this.response = [newPoint];\n } else {\n // If maxChoices > 1, add a new marker if within the limit\n if (this.maxChoices === 0 || (this.response || []).length < this.maxChoices) {\n this.response = [...(this.response || []), newPoint];\n } else {\n // Optional: Notify the user to remove a marker before adding a new one\n // console.warn('Maximum number of points reached. Remove a marker to add a new one.');\n }\n }\n // Save the response with the calculated points\n this.saveResponse(this.response);\n };\n\n override connectedCallback() {\n super.connectedCallback();\n window.addEventListener('resize', this._onResize);\n }\n\n private _onResize = () => {\n this.calculateScale();\n };\n\n get responsePoints() {\n return (this.response || [])\n .filter(point => point)\n .map(point => {\n const [x, y] = point.split(' ').map(Number);\n return { x, y };\n });\n }\n\n public toggleCandidateCorrection(show: boolean) {\n this._responseCorrection = [];\n if (!show) {\n return;\n }\n this.responsePoints.forEach(point => {\n const correct = (this.responseVariable.areaMapping as QtiAreaMapping).areaMapEntries.some(correctArea =>\n ScoringHelper.isPointInArea(\n `${point.x} ${point.y}`,\n `${correctArea.shape},${correctArea.coords}`,\n this.responseVariable.baseType\n )\n );\n this._responseCorrection.push(correct);\n });\n }\n\n public toggleCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n if (!show || !responseVariable) {\n this._correctAreas = [];\n return;\n }\n // Find the area mapping element from the response variable\n const areaMapping = responseVariable.areaMapping as QtiAreaMapping;\n let areaMapEntries: QtiAreaMapEntry[] = [];\n if (!areaMapping || areaMapping.areaMapEntries.length === 0) {\n if (responseVariable.correctResponse) {\n const correctResponses = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n if (correctResponses.length === 0 || correctResponses.find(r => r.split(' ').length < 2)) {\n console.error('No valid correct responses found for the response variable.');\n return null;\n }\n console.warn(\n `No area mapping found for the response variable. Using the correct responses to display the correct response but it probably won't score correct.`\n );\n // Create a new area mapping object with the correct responses\n areaMapEntries = correctResponses.map(r => {\n const coords = r.split(' ').join(',').concat(',10'); // Add a radius of 10 pixels to the coordinates\n return { shape: 'circle', coords, defaultValue: 1, mappedValue: 1 };\n });\n } else {\n console.error('No area mapping found for the response variable.');\n return;\n }\n } else {\n // Get all map entries from the area mapping\n areaMapEntries = areaMapping.areaMapEntries;\n }\n this._correctAreas = areaMapEntries.map(e => ({ coords: e.coords, shape: e.shape }));\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>) {\n super.updated(changedProperties);\n const img = this._imgElement;\n if (img && changedProperties.has('_correctAreas') && this._correctAreas.length > 0) {\n this.calculateScale();\n this.shadowRoot.querySelectorAll('div').forEach((el: HTMLElement) => {\n const coords = el.dataset.coord;\n const shape = el.dataset.shape;\n if (coords && shape) {\n positionShapes(\n shape,\n coords.split(',').map(c => +c),\n img,\n el\n );\n }\n });\n }\n }\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <point-container>\n ${repeat(\n (this.response || []).filter(point => point),\n point => point,\n (point, index) => {\n const [x, y] = point.split(' ').map(Number);\n // point are based on the original image size, so we need calculate the percentage based on the original image\n const leftPercentage = (x / (this._imageWidthOriginal || 1)) * 100;\n const topPercentage = (y / (this._imageHeightOriginal || 1)) * 100;\n\n // Base size is 1rem (16px), scaled proportionally to the image's current size\n // Base size is 1rem in the original image size\n const baseSize = 16; // Assuming 1rem = 16px\n const widthPercentage = (baseSize / (this._imageWidthOriginal || 1)) * 100;\n const heightPercentage = (baseSize / (this._imageHeightOriginal || 1)) * 100;\n\n let correctionPart = '';\n if (this._responseCorrection[index] === true) {\n correctionPart = ' correct';\n } else if (this._responseCorrection[index] === false) {\n correctionPart = ' incorrect';\n }\n\n return html`\n <button\n part=\"point${correctionPart}\"\n style=${styleMap({\n pointerEvents: this.maxChoices === 1 ? 'none' : 'auto',\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n left: `${leftPercentage}%`,\n top: `${topPercentage}%`,\n width: `min(${widthPercentage}%, 1rem)`,\n height: `min(${heightPercentage}%, 1rem)`,\n minWidth: `min(${widthPercentage}%, 1rem)`,\n minHeight: `min(${heightPercentage}%, 1rem)`,\n borderRadius: '50%', // Ensures round shape\n background: 'red' // Example styling, adjust as needed\n })}\n aria-label=\"Remove point at ${point}\"\n ?disabled=${this.disabled}\n @click=${(e: Event) => {\n e.stopPropagation();\n this.response = (this.response || []).filter((_, i) => i !== index);\n this.saveResponse(this.response);\n }}\n ></button>\n `;\n }\n )}\n ${repeat(\n this._correctAreas?.filter(area => area) || [],\n area => area,\n (area, i) =>\n html`<div\n style=${styleMap({\n position: 'absolute',\n pointerEvents: 'none',\n backgroundColor: 'var(--qti-correct)',\n opacity: '0.5'\n })}\n data-coord=\"${area.coords}\"\n alt=${`correct-response-${i + 1}`}\n data-shape=\"${area.shape}\"\n ></div>`\n )}\n <slot></slot>\n </point-container>`;\n }\n\n validate(): boolean {\n return this.response !== null && this.response.length >= this.minChoices && this.response.length <= this.maxChoices;\n }\n\n private calculateScale() {\n // Get the image dimensions\n this._imageWidthOriginal = this._imgElement.getAttribute('width')\n ? parseFloat(this._imgElement.getAttribute('width')!)\n : this._imgElement.naturalWidth;\n this._imageHeightOriginal = this._imgElement.getAttribute('height')\n ? parseFloat(this._imgElement.getAttribute('height')!)\n : this._imgElement.naturalHeight;\n // Get the image's bounding rectangle and calculate scaling factors\n const rect = this._imgElement.getBoundingClientRect();\n this._scaleX = rect.width === 0 ? 1 : this._imageWidthOriginal / rect.width; // Horizontal scaling factor\n this._scaleY = rect.height === 0 ? 1 : this._imageHeightOriginal / rect.height; // Vertical scaling factor\n }\n\n override firstUpdated(): void {\n this._imgElement = this.querySelector('img');\n\n if (this._imgElement) {\n this.calculateScale();\n // Attach the click event listener to the image element\n this._imgElement.addEventListener('click', this._onImageClick);\n } else {\n console.warn('No <img> element found in <qti-select-point-interaction>');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n window.removeEventListener('resize', this._onResize);\n if (this._imgElement) {\n // Remove the click event listener from the image element\n this._imgElement.removeEventListener('click', this._onImageClick);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-select-point-interaction': QtiSelectPointInteraction;\n }\n}\n","import type { BaseType } from '../../../exports/expression-result';\n\nexport class ScoringHelper {\n /**\n * Checks if a given point is within a specified area.\n * @param point The point to test, represented as a string \"x y\" (e.g., \"102 113\").\n * @param areaKey The area definition, including shape and coordinates (e.g., \"circle,102,113,16\").\n * @param baseType The base type of the response, must be \"point\" for this method to proceed.\n * @returns True if the point is within the area; false otherwise.\n */\n public static isPointInArea(point: string, areaKey: string, baseType: string): boolean {\n if (baseType !== 'point') {\n console.warn(`Base type ${baseType} is not supported for point area mapping.`);\n return false;\n }\n\n // Parse the point as x and y coordinates\n const [px, py] = point.split(' ').map(Number);\n\n // Parse the area definition\n const [shape, ...coords] = areaKey.split(',');\n const coordinates = coords.map(Number);\n\n switch (shape.toLowerCase()) {\n case 'circle':\n case 'default': {\n const [cx, cy, radius] = coordinates;\n if (coordinates.length !== 3) {\n console.warn(`Invalid circle definition: ${areaKey}`);\n return false;\n }\n const distance = Math.sqrt((px - cx) ** 2 + (py - cy) ** 2);\n return distance <= radius;\n }\n\n case 'rect': {\n const [x1, y1, x2, y2] = coordinates;\n if (coordinates.length !== 4) {\n console.warn(`Invalid rectangle definition: ${areaKey}`);\n return false;\n }\n return px >= x1 && px <= x2 && py >= y1 && py <= y2;\n }\n\n case 'ellipse': {\n const [cx, cy, rx, ry] = coordinates;\n if (coordinates.length !== 4) {\n console.warn(`Invalid ellipse definition: ${areaKey}`);\n return false;\n }\n // Ellipse equation: ((px - cx)² / rx²) + ((py - cy)² / ry²) <= 1\n const normalizedX = (px - cx) ** 2 / rx ** 2;\n const normalizedY = (py - cy) ** 2 / ry ** 2;\n return normalizedX + normalizedY <= 1;\n }\n\n case 'poly': {\n if (coordinates.length < 6 || coordinates.length % 2 !== 0) {\n console.warn(`Invalid polygon definition: ${areaKey}`);\n return false;\n }\n const vertices = [];\n for (let i = 0; i < coordinates.length; i += 2) {\n vertices.push({ x: coordinates[i], y: coordinates[i + 1] });\n }\n return this.isPointInPolygon({ x: px, y: py }, vertices);\n }\n\n default:\n console.warn(`Unsupported shape type: ${shape}`);\n return false;\n }\n }\n\n /**\n * Checks if a point is inside a polygon using the ray-casting algorithm.\n * @param point The point to test.\n * @param vertices The vertices of the polygon in order (array of {x, y} objects).\n * @returns True if the point is inside the polygon; false otherwise.\n */\n static isPointInPolygon(point: { x: number; y: number }, vertices: { x: number; y: number }[]): boolean {\n let inside = false;\n for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) {\n const xi = vertices[i].x,\n yi = vertices[i].y;\n const xj = vertices[j].x,\n yj = vertices[j].y;\n\n const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n\n if (intersect) inside = !inside;\n }\n return inside;\n }\n\n public static compareSingleValues(value1: Readonly<string>, value2: Readonly<string>, baseType: BaseType): boolean {\n switch (baseType) {\n case 'identifier':\n case 'string':\n return value1 === value2;\n case 'integer': {\n const int1 = parseInt(value1, 10);\n const int2 = parseInt(value2, 10);\n if (!isNaN(int1) && !isNaN(int2)) {\n return int1 === int2;\n } else {\n console.error(`Cannot convert ${value1} and/or ${value2} to int.`);\n }\n break;\n }\n case 'float': {\n const float1 = parseFloat(value1);\n const float2 = parseFloat(value2);\n if (!isNaN(float1) && !isNaN(float2)) {\n return float1 === float2;\n } else {\n console.error(`couldn't convert ${value1} and/or ${value2} to float.`);\n }\n break;\n }\n case 'pair':\n case 'directedPair': {\n const pair1 = value1.split(' ').sort();\n const pair2 = value2.split(' ').sort();\n if (pair1.length === 2 && pair2.length === 2) {\n if (baseType === 'pair') {\n pair1.sort();\n pair2.sort();\n }\n return pair1.join(' ') === pair2.join(' ');\n } else {\n console.error(`compared two pair but one of the values does not have 2 values: 1: ${value1} 2: ${value2}`);\n }\n break;\n }\n }\n\n return false;\n }\n}\n","import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n/**\n * qti-order-interaction\n * qti-choice-interaction\n */\n@customElement('qti-simple-choice')\nexport class QtiSimpleChoice extends ActiveElementMixin(LitElement, 'qti-simple-choice') {\n @property({ type: String, attribute: 'template-identifier' })\n public templateIdentifier: string | null = null;\n\n @property({ type: String, attribute: 'show-hide' })\n public showHide: string | null = 'show';\n\n @property({\n type: Boolean,\n converter: {\n fromAttribute: (value: string | null) => value === 'true',\n toAttribute: (value: boolean) => String(value)\n }\n })\n public fixed: boolean = false;\n\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n user-select: none;\n }\n slot {\n width: 100%;\n display: flex;\n align-items: center;\n }\n [part='ch'] {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n }\n `;\n\n // property label\n @property({ type: String, attribute: false })\n public marker: string;\n\n get checked() {\n return this['internals'].states.has('--checked');\n }\n\n override render() {\n return html`<div part=\"ch\">\n <div part=\"cha\"></div>\n </div>\n ${this.marker ? html`<div id=\"label\">${this.marker}</div>` : nothing}\n <slot part=\"slot\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-simple-choice': QtiSimpleChoice;\n }\n}\n","import { html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nimport styles from './qti-slider-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-slider-interaction')\nexport class QtiSliderInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n private _value = 0;\n private _correctResponseNumber: number | null = null;\n\n @query('#rail') private _rail!: HTMLElement;\n\n @property({ type: Number, attribute: 'lower-bound' }) min = 0;\n @property({ type: Number, attribute: 'upper-bound' }) max = 100;\n @property({ type: Number, attribute: 'step' }) step = 1;\n\n validate(): boolean {\n return true;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateValue(this.min); // Set initial value\n this.setAttribute('tabindex', '0');\n this.setAttribute('role', 'slider');\n }\n\n get response(): string {\n return this._value.toString();\n }\n\n set response(val: string) {\n const newValue = parseInt(val, 10);\n if (!isNaN(newValue)) {\n this._updateValue(newValue);\n }\n }\n\n public toggleCorrectResponse(show: boolean) {\n const responseVariable = this.responseVariable;\n if (!responseVariable?.correctResponse) return;\n\n if (show) {\n this._correctResponse = responseVariable.correctResponse.toString();\n const nr = parseFloat(responseVariable.correctResponse.toString());\n if (!isNaN(nr)) {\n this._correctResponseNumber = nr;\n const valuePercentage = ((this._correctResponseNumber - this.min) / (this.max - this.min)) * 100;\n this.style.setProperty('--value-percentage-correct', `${valuePercentage}%`);\n } else {\n this._correctResponseNumber = null;\n }\n } else {\n this._correctResponseNumber = null;\n }\n this.requestUpdate();\n }\n\n private _updateValue(newValue: number) {\n const oldValue = this._value;\n this._value = Math.min(this.max, Math.max(this.min, newValue));\n if (this._value === oldValue) {\n return; // Do not update if the value is the same as before\n }\n const valuePercentage = ((this._value - this.min) / (this.max - this.min)) * 100;\n this.style.setProperty('--value-percentage', `${valuePercentage}%`);\n this._internals.setFormValue(this.value); // Update form value\n this.saveResponse(this.response);\n this.requestUpdate();\n }\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <div id=\"slider\" part=\"slider\">\n <div id=\"bounds\" part=\"bounds\">\n <div>${this.min}</div>\n <div>${this.max}</div>\n </div>\n\n <div id=\"ticks\" part=\"ticks\"></div>\n\n <div id=\"rail\" part=\"rail\" @mousedown=${this._onMouseDown} @touchstart=${this._onTouchStart}>\n <div id=\"knob\" part=\"knob\">\n <div id=\"value\" part=\"value\">${this.response}</div>\n </div>\n\n ${this._correctResponseNumber !== null\n ? html`\n <div id=\"knob-correct\" part=\"knob-correct\">\n <div id=\"value\" part=\"value\">${this._correctResponseNumber}</div>\n </div>\n `\n : null}\n </div>\n </div>\n `;\n }\n\n private _onMouseDown(event: MouseEvent) {\n this._startDrag(event.pageX);\n const handleMouseMove = (e: MouseEvent) => this._onDrag(e.pageX);\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n this._onDragEnd();\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n private _onTouchStart(event: TouchEvent) {\n this._startDrag(event.touches[0].pageX);\n const handleTouchMove = (e: TouchEvent) => this._onDrag(e.touches[0].pageX);\n const handleTouchEnd = () => {\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n this._onDragEnd();\n };\n\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleTouchEnd);\n }\n\n private _startDrag(pageX: number) {\n this._onDrag(pageX);\n }\n\n private _onDrag(pageX: number) {\n const railRect = this._rail.getBoundingClientRect();\n const diffX = pageX - railRect.left;\n const percentage = Math.min(1, Math.max(0, diffX / railRect.width));\n const steppedValue = this.min + Math.round((percentage * (this.max - this.min)) / this.step) * this.step;\n this._updateValue(steppedValue);\n }\n\n private _onDragEnd() {\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-slider-interaction': QtiSliderInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n --show-bounds: true;\n --show-ticks: true;\n --show-value: true;\n }\n\n [part='slider'] {\n margin-left: 2rem; /* mx-8 */\n margin-right: 2rem;\n padding-bottom: 1rem; /* pb-4 */\n padding-top: 1.25rem; /* pt-5 */\n }\n\n [part='bounds'] {\n display: flex;\n width: 100%;\n justify-content: space-between;\n margin-bottom: 0.5rem; /* mb-2 */\n }\n\n [part='ticks'] {\n margin-left: 0.125rem; /* mx-0.5 */\n margin-right: 0.125rem;\n margin-bottom: 0.25rem; /* mb-1 */\n height: 0.5rem; /* h-2 */\n background: linear-gradient(to right, var(--qti-border-color) var(--qti-border-thickness), transparent 1px) repeat-x\n 0 center / calc(calc(100% - var(--qti-border-thickness)) / ((var(--max) - var(--min)) / var(--step))) 100%;\n }\n\n [part='rail'] {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n height: 0.375rem; /* h-1.5 */\n width: 100%;\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n border: 1px solid #d1d5db; /* border-gray-300 */\n background-color: #e5e7eb; /* bg-gray-200 */\n }\n\n [part='knob'] {\n background-color: var(--qti-bg-active);\n border: 2px solid var(--qti-border-active);\n position: relative;\n height: 1rem; /* h-4 */\n width: 1rem; /* w-4 */\n transform-origin: center;\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n left: var(--value-percentage);\n }\n [part='knob-correct'] {\n background-color: var(--qti-correct-light);\n border: 2px solid var(--qti-correct);\n position: relative;\n height: 1rem; /* h-4 */\n width: 1rem; /* w-4 */\n transform-origin: center;\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n left: var(--value-percentage-correct);\n }\n\n [part='value'] {\n position: absolute;\n bottom: 2rem; /* bottom-8 */\n left: 0.5rem; /* left-2 */\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 0.25rem; /* rounded */\n background-color: #f3f4f6; /* bg-gray-100 */\n padding: 0.25rem 0.5rem; /* px-2 py-1 */\n text-align: center;\n color: #6b7280; /* text-gray-500 */\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef } from 'lit/directives/ref.js';\n\nimport { Correctness, Interaction } from '../../../exports/interaction';\nimport styles from './qti-text-entry-interaction.styles';\nimport { watch } from '../../../decorators';\n\nimport type { CSSResultGroup } from 'lit';\n@customElement('qti-text-entry-interaction')\nexport class QtiTextEntryInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n inputRef = createRef<HTMLInputElement>();\n\n @property({ type: Number, attribute: 'expected-length' }) expectedLength: number;\n\n @property({ type: String, attribute: 'pattern-mask' }) patternMask: string;\n\n @property({ type: String, attribute: 'placeholder-text' }) placeholderText: string;\n\n @property({ type: String, attribute: 'data-patternmask-message' }) dataPatternmaskMessage: string;\n\n @state()\n response: string | null = null;\n\n @query('input') private _input!: HTMLInputElement;\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleValueChange = () => {\n // const formData = new FormData();\n // formData.append(this.responseIdentifier, this.response);\n this._internals.setFormValue(this.value);\n this.validate();\n };\n\n get value(): string | null {\n return this.response || null;\n }\n set value(val: string | null) {\n this.response = val || null;\n }\n\n get correctness(): Readonly<Correctness | null> {\n const responseVariable = this.responseVariable;\n\n if (!responseVariable) {\n return null;\n }\n\n if (responseVariable.value === null) {\n return Correctness.Incorrect;\n }\n\n if (responseVariable.mapping) {\n const maxScore = responseVariable.mapping.mapEntries.reduce<number>(\n (currentMax, mapEntry) => Math.max(mapEntry.mappedValue, currentMax),\n 0\n );\n for (const mapEntry of responseVariable.mapping.mapEntries) {\n let mapAnswer = mapEntry.mapKey;\n let responseAnswer = responseVariable.value as string;\n if (!mapEntry.caseSensitive) {\n mapAnswer = mapAnswer.toLowerCase();\n responseAnswer = responseAnswer.toLowerCase();\n }\n if (mapAnswer === responseAnswer) {\n if (mapEntry.mappedValue === maxScore) {\n return Correctness.Correct;\n }\n if (mapEntry.mappedValue <= (responseVariable.mapping.defaultValue || 0)) {\n return Correctness.Incorrect;\n }\n return Correctness.PartiallyCorrect;\n }\n }\n }\n\n // Fallback to the correct response\n\n return responseVariable.correctResponse === responseVariable.value ? Correctness.Correct : Correctness.Incorrect;\n }\n\n get isInline(): boolean {\n return true;\n }\n\n public override validate(): boolean {\n if (!this._input) return false;\n if (this.patternMask && this.dataPatternmaskMessage) {\n // Clear any custom error if the this._input is valid\n this._internals.setValidity({});\n this._input.setCustomValidity(''); // Clear the custom message\n const isValid = this._input.checkValidity();\n if (!isValid) {\n // Set custom error if invalid\n this._internals.setValidity({ customError: true }, this.dataPatternmaskMessage);\n this._input.setCustomValidity(this.dataPatternmaskMessage); // Set custom message only if invalid\n }\n } else {\n const isValid = this._input.checkValidity();\n this._internals.setValidity(isValid ? {} : { customError: false });\n }\n return this.response !== '' && this._input.checkValidity();\n }\n\n public toggleInternalCorrectResponse(show: boolean): void {\n const responseVariable = this.responseVariable;\n\n if (show && responseVariable?.correctResponse) {\n const text = responseVariable.correctResponse.toString();\n this._correctResponse = text;\n // if (text) {\n // if (!this._input.nextElementSibling?.classList.contains('correct-option')) {\n // const textSpan = document.createElement('span');\n // textSpan.classList.add('correct-option');\n // textSpan.textContent = text;\n\n // // Apply styles\n // textSpan.style.border = '1px solid var(--qti-correct)';\n // textSpan.style.borderRadius = '4px';\n // textSpan.style.padding = '2px 4px';\n // textSpan.style.margin = '4px';\n // textSpan.style.display = 'inline-block';\n\n // this._input.insertAdjacentElement('afterend', textSpan);\n // }\n // } else if (this._input.nextElementSibling?.classList.contains('correct-option')) {\n // this._input.nextElementSibling?.remove();\n // }\n } else {\n // this._input.nextElementSibling?.remove();\n this._correctResponse = null;\n }\n }\n\n override render() {\n return html`\n <input\n part=\"input\"\n name=\"${this.responseIdentifier}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n @blur=\"${(_: FocusEvent) => {\n this.reportValidity();\n }}\"\n @keydown=\"${event => event.stopImmediatePropagation()}\"\n @keyup=\"${this.textChanged}\"\n @change=\"${this.textChanged}\"\n type=\"${this.patternMask == '[0-9]*' ? 'number' : 'text'}\"\n placeholder=\"${ifDefined(this.placeholderText ? this.placeholderText : undefined)}\"\n .value=\"${this.response}\"\n pattern=\"${ifDefined(this.patternMask ? this.patternMask : undefined)}\"\n maxlength=${1000}\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${this.readonly}\"\n />\n ${this._correctResponse ? html`<div part=\"correct\">${this._correctResponse}</div>` : nothing}\n `;\n }\n // ${this._correctResponse ? html`<div popover part=\"correct\">${this._correctResponse}</div>` : nothing}\n\n protected textChanged(event: Event): void {\n if (this.disabled || this.readonly) return;\n const input = event.target as HTMLInputElement;\n this.setEmptyAttribute(input.value);\n if (this.response !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n override reportValidity(): boolean {\n const input = this.shadowRoot.querySelector('input');\n if (!input) return false;\n\n // Run the validate function to ensure the custom validity state is up to date\n const isValid = this.validate();\n if (!isValid) {\n input.reportValidity();\n }\n return isValid;\n }\n\n reset(): void {\n this.response = '';\n }\n\n private setEmptyAttribute(text: string): void {\n this.setAttribute('empty', text === '' ? 'true' : 'false');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-text-entry-interaction': QtiTextEntryInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: inline-block;\n }\n\n :host(.qti-input-width-1) [part='input'] {\n width: 1.1rem;\n min-width: 1.1rem;\n }\n\n :host(.qti-input-width-2) [part='input'] {\n width: 2.3rem;\n min-width: 2.3rem;\n }\n\n :host(.qti-input-width-3) [part='input'] {\n width: 3.3rem;\n min-width: 3.3rem;\n }\n\n :host(.qti-input-width-4) [part='input'] {\n width: 4.2rem;\n min-width: 4.2rem;\n }\n\n :host(.qti-input-width-6) [part='input'] {\n width: 6.6rem;\n min-width: 6.6rem;\n }\n\n :host(.qti-input-width-10) [part='input'] {\n width: 8rem;\n min-width: 8rem;\n }\n\n :host(.qti-input-width-15) [part='input'] {\n width: 12rem;\n min-width: 12rem;\n }\n\n :host(.qti-input-width-20) [part='input'] {\n width: 17rem;\n min-width: 17rem;\n }\n\n :host(.qti-input-width-25) [part='input'] {\n width: 20rem;\n min-width: 20rem;\n }\n\n :host(.qti-input-width-30) [part='input'] {\n width: 24rem;\n min-width: 24rem;\n }\n\n :host(.qti-input-width-35) [part='input'] {\n width: 28rem;\n min-width: 28rem;\n }\n\n :host(.qti-input-width-40) [part='input'] {\n width: 32rem;\n min-width: 32rem;\n }\n\n :host(.qti-input-width-45) [part='input'] {\n width: 36rem;\n min-width: 36rem;\n }\n\n :host(.qti-input-width-50) [part='input'] {\n width: 40rem;\n min-width: 40rem;\n }\n\n :host(.qti-input-width-72) [part='input'] {\n width: 57rem;\n min-width: 57rem;\n }\n\n :host {\n position: relative;\n }\n input {\n anchor-name: --text-entry-input;\n z-index: 100;\n position: relative;\n }\n\n [part='correct'] {\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n background-color: var(--qti-bg);\n z-index: 0;\n position: absolute;\n left: 0;\n right: 0;\n position-anchor: --text-entry-input;\n bottom: anchor(top);\n left: anchor(left);\n /* opacity: 1; */\n transition: all 1s;\n\n @starting-style {\n display: grid;\n /* opacity: 0; */\n bottom: 0;\n }\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\n\n@customElement('qti-upload-interaction')\nexport class QtiUploadInteraction extends Interaction {\n private _file: File | null = null;\n private _base64: string | null = null;\n\n reset() {\n this._file = null;\n this._base64 = null;\n this.saveResponse(null);\n }\n\n validate(): boolean {\n return this._base64 !== null; // Ensure the Base64 string is set\n }\n\n get response(): string | null {\n return this._base64; // Return the Base64 string\n }\n\n set response(base64: string | null) {\n if (typeof base64 === 'string') {\n this._base64 = base64;\n this.saveResponse(base64); // Save Base64 string as the response\n } else if (base64 === null) {\n this.reset();\n } else {\n throw new Error('Value must be a Base64-encoded string or null');\n }\n }\n\n static override get properties() {\n return {\n ...Interaction.properties\n };\n }\n\n static override styles = [\n css`\n :host {\n display: block;\n margin: 1em 0;\n }\n input[type='file'] {\n display: block;\n margin-top: 0.5em;\n }\n `\n ];\n\n override render() {\n return html`\n <div>\n <slot name=\"prompt\"></slot>\n <input type=\"file\" @change=\"${this._onFileChange}\" ?disabled=\"${this.disabled}\" ?readonly=\"${this.readonly}\" />\n </div>\n `;\n }\n\n private async _onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this._file = input.files[0];\n this._base64 = await this._convertToBase64(this._file);\n this.saveResponse(this._base64); // Save the Base64 string\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n detail: { response: this._base64 }\n })\n );\n }\n }\n\n private _convertToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file); // Converts to Base64\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-upload-interaction': QtiUploadInteraction;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\nimport styles from './qti-item-body.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n/**\n * @summary The qti-item-body node contains the text, graphics, media objects and interactions that describe the item's content and information about how it is structured.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.sphpo6lu6zqi\n * @status stable\n * @since 4.0\n *\n * @slot - item body content.\n * @slot qti-rubric-block - the qti rubric block is placed above the item\n * @part qti-rubric-block - the qti rubric block part\n */\n@customElement('qti-item-body')\nexport class QtiItemBody extends LitElement {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot part=\"qti-rubric-blocks\" name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item-body': QtiItemBody;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n`;\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { QtiRule, QtiRuleBase } from '../qti-response-processing/qti-rule/qti-rule';\n\n@customElement('qti-outcome-processing')\nexport class QtiOutcomeProcessing extends LitElement {\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const logic = new QtiOutcomeProcessingProcessor();\n const rules = [...this.children] as QtiRule[];\n logic.process(rules);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-processing': QtiOutcomeProcessing;\n }\n}\n\nexport class QtiOutcomeProcessingProcessor {\n public process(rules: QtiRuleBase[]) {\n for (const rule of rules) {\n rule.process();\n }\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n@customElement('qti-prompt')\nexport class QtiPrompt extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n // if prompts are in interactions they should have a slot, so the prompt has to go there\n // if prompt is in the body, then just display the prompt there.\n // A better check would be the latter, but not can't get through the shadowroot to find the slot\n const inInteraction = this.parentElement.tagName.endsWith('INTERACTION');\n if (inInteraction) {\n this.setAttribute('slot', 'prompt');\n }\n // const promptSlot = this.parentElement.shadowRoot.querySelector(\"[name='prompt']\");\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-prompt': QtiPrompt;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { mapResponse, mapResponsePoint, matchCorrect } from '../../internal/template-strings';\nimport { type QtiRule } from '../qti-rule/qti-rule';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-response-processing')\nexport class QtiResponseProcessing extends LitElement {\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const assessmentItem = this.closest('qti-assessment-item');\n if (!assessmentItem) return;\n const rules = [...this.children] as QtiRule[];\n for (const rule of rules) {\n rule.process();\n }\n }\n\n public firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n if (this.getAttribute('template')) {\n const splittedTemplateName = this.getAttribute('template')!.split('/');\n const templateName = splittedTemplateName[splittedTemplateName.length - 1].replace('.xml', '');\n this.innerHTML = '';\n switch (templateName) {\n case 'map_response': {\n this.appendChild(this.fragmentFromString(mapResponse).firstElementChild.firstElementChild);\n break;\n }\n case 'map_response_point': {\n this.appendChild(this.fragmentFromString(mapResponsePoint).firstElementChild.firstElementChild);\n break;\n }\n case 'match_correct':\n this.appendChild(this.fragmentFromString(matchCorrect).firstElementChild.firstElementChild);\n break;\n }\n }\n }\n\n private fragmentFromString(strHTML: string) {\n return document.createRange().createContextualFragment(strHTML);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-processing': QtiResponseProcessing;\n }\n}\n","export const matchCorrect = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-match>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n <qti-correct identifier=\"RESPONSE\"></qti-correct>\n </qti-match>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">1</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponse = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0.0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response identifier=\"RESPONSE\"> </qti-map-response>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponsePoint = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response-point identifier=\"RESPONSE\"></qti-map-response-point>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n","import { property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { convertNumberToUniversalFormat } from '../../../internal/utils';\nimport { QtiRule } from '../qti-rule';\nimport { itemContext } from '../../../../exports/qti-assessment-item.context';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\nimport type { OutcomeVariable } from '../../../../exports/variables';\nimport type { ItemContext } from '../../../../exports/item.context';\n\n/**\n * The lookupOutcomeValue rule sets the value of an outcome variable to the value obtained\n * by looking up the value of the associated expression in the lookupTable associated\n * with the outcome's declaration.\n */\nexport class QtiLookupOutcomeValue extends QtiRule {\n @property({ type: String }) identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n get childExpression(): QtiExpression<string> {\n return this.firstElementChild as QtiExpression<string>;\n }\n\n public override process(): number {\n const identifier = this.getAttribute('identifier');\n\n const outcomeVariable: OutcomeVariable | null =\n this.context.variables.find(v => v.identifier === identifier) || null;\n\n let value;\n if (outcomeVariable.interpolationTable) {\n value = outcomeVariable.interpolationTable.get(parseFloat(this.childExpression.calculate()));\n }\n if (value === null || value === undefined) {\n console.warn('lookupOutcomeValue: value is null or undefined');\n return 0;\n }\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier: this.identifier,\n value: convertNumberToUniversalFormat(value)\n }\n })\n );\n return value;\n }\n}\ncustomElements.define('qti-lookup-outcome-value', QtiLookupOutcomeValue);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-lookup-outcome-value': QtiLookupOutcomeValue;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\n@customElement('qti-rule')\nexport class QtiRule extends LitElement implements QtiRuleBase {\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n throw new Error('Not implemented');\n }\n}\n\nexport interface QtiRuleBase {\n process(): any;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rule': QtiRule;\n }\n}\n","import { html } from 'lit';\n\nimport { QtiRule } from '../qti-rule';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiResponseCondition extends QtiRule {\n override render() {\n return html`<slot></slot>`;\n }\n\n public override process() {\n const branches = [...this.children] as QtiExpression<any>[];\n\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n\n if (branch.calculate()) {\n (branch as unknown as QtiRule).process();\n\n return;\n }\n }\n }\n}\n\ncustomElements.define('qti-response-condition', QtiResponseCondition);\n","import { convertNumberToUniversalFormat } from '../../../internal/utils';\nimport { QtiRule } from '../qti-rule';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nimport type { QtiExpression, QtiExpressionBase } from '../../../../exports/qti-expression';\nimport type { QtiRuleBase } from '../qti-rule';\n\n/**\n * Web component that processes `setOutcomeValue` in QTI.\n */\nexport class QtiSetOutcomeValue extends QtiRule {\n /**\n * Processes the QTI rule and dispatches a custom event with the computed outcome value.\n */\n public override process(): void {\n const outcomeIdentifier = this.getAttribute('identifier');\n\n if (!outcomeIdentifier) {\n console.warn('QtiSetOutcomeValue: Missing \"identifier\" attribute.');\n return;\n }\n\n const expression = this.firstElementChild as QtiExpression<string | ResponseVariable[]> | null;\n\n if (!expression) {\n console.warn('QtiSetOutcomeValue: No expression found.');\n return;\n }\n\n const rule = new QtiSetOutcomeValueRule<string | ResponseVariable[] | null>(expression);\n const value = rule.process();\n\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] | null }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value: this.formatValue(value)\n }\n })\n );\n }\n\n /**\n * Formats the computed value before dispatching.\n * Ensures numbers are converted to a universal format.\n */\n private formatValue(value: string | string[] | null): string | string[] | null {\n if (Array.isArray(value)) {\n return value.map(convertNumberToUniversalFormat);\n }\n return value !== null ? convertNumberToUniversalFormat(value) : null;\n }\n}\n\n/**\n * Encapsulates the logic for processing QTI setOutcomeValue expressions.\n */\nexport class QtiSetOutcomeValueRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n /**\n * Evaluates the expression and returns its value.\n */\n process(): string | string[] | null {\n const value = (this.expression.calculate() ?? null) as unknown as string | string[] | null;\n\n if (value === null) {\n console.warn('QtiSetOutcomeValueRule: Evaluated value is null.');\n }\n\n return Array.isArray(value) ? (value as any).map(v => (v.value ? v.value : v)) : value;\n }\n}\n\n// Define the custom element\ncustomElements.define('qti-set-outcome-value', QtiSetOutcomeValue);\n","import { LitElement, html } from 'lit';\n\nimport type { QtiRule } from '../qti-rule/qti-rule';\n\nexport class QtiResponseElse extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n public calculate() {\n return true;\n }\n\n public getSubRules(): QtiRule[] {\n return [...this.children] as QtiRule[];\n }\n\n public process() {\n const subRules = this.getSubRules();\n for (let i = 0; i < subRules.length; i++) {\n const subRule = subRules[i];\n subRule.process();\n }\n }\n}\n\ncustomElements.define('qti-response-else', QtiResponseElse);\n","import { html } from 'lit';\n\nimport { QtiResponseIf } from '../qti-response-if';\n\nexport class QtiResponseElseIf extends QtiResponseIf {\n override render() {\n return html`${super.render()}`;\n }\n}\n\ncustomElements.define('qti-response-else-if', QtiResponseElseIf);\n","import { QtiResponseElse } from '../qti-response-else';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\nimport type { QtiRule } from '../../qti-rule/qti-rule';\n\nexport class QtiResponseIf extends QtiResponseElse {\n public override calculate() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return result;\n }\n\n public override getSubRules(): QtiRule[] {\n const result = [];\n for (let i = 1; i < this.children.length; i++) {\n result.push(this.children[i]);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-response-if', QtiResponseIf);\n","import { customElement } from 'lit/decorators.js';\n\nimport { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('qti-and')\nexport class QtiAnd extends qtiAndMixin(QtiConditionExpression as unknown as Constructor<QtiConditionExpression>) {\n public calculate() {\n return this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\nexport function qtiAndMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiAnd extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(c => {\n const condition = c as MockQtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.every(e => {\n return typeof e === 'boolean' && e;\n });\n }\n };\n}\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { BaseType } from '../../../../exports/expression-result';\nexport class QtiBaseValue extends QtiExpression<string> {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType = 'string';\n\n public override getResult(): string {\n const value = this.textContent.trim();\n return value;\n }\n}\n\ncustomElements.define('qti-base-value', QtiBaseValue);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-container-size operator returns the number of values in a container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.container-size\n *\n * Takes a sub-expression with any base-type and either multiple or ordered cardinality.\n * Returns an integer giving the number of values in the container.\n * Returns 0 if the sub-expression is NULL.\n */\nexport class QtiContainerSize extends QtiExpression<number> {\n public override getResult(): number {\n if (this.children?.length !== 1) {\n console.error('qti-container-size must have exactly one child expression');\n return 0;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n\n if (!variables || variables?.length === 0) {\n return 0;\n }\n\n const variable = variables[0];\n\n // Handle null values - return 0 as per spec\n if (variable.value === null || variable.value === undefined) {\n return 0;\n }\n\n // Check cardinality - must be multiple or ordered\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'ordered') {\n console.error('qti-container-size requires multiple or ordered cardinality');\n return 0;\n }\n\n // The value should be an array for multiple/ordered cardinality\n if (!Array.isArray(variable.value)) {\n console.error('qti-container-size: expected array value for multiple/ordered cardinality');\n return 0;\n }\n\n // Return the size of the container\n return variable.value.length;\n }\n}\n\ncustomElements.define('qti-container-size', QtiContainerSize);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiContains extends QtiConditionExpression {\n public override getResult() {\n // TODO: implement this for other types than directedPair\n const values = this.getVariables() as ResponseVariable[];\n if (this.children.length === 2) {\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'multiple'\n ) {\n const projection1 = value1.value as string[];\n const projection2 = value2.value as string[];\n const enumerable = projection1.filter(x => projection2.includes(x));\n\n const result = enumerable.length > 0;\n return result;\n } else if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'single'\n ) {\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n } else {\n console.error(\n 'unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported'\n );\n }\n } else {\n console.error('unexpected number of children in qti contains');\n }\n return false;\n }\n}\n\ncustomElements.define('qti-contains', QtiContains);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiCorrect extends QtiExpression<string | string[]> {\n get interpretation() {\n return this.getAttribute('interpretation') || '';\n }\n\n override getResult() {\n const identifier = this.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable = this.context.variables.find(v => v.identifier === identifier) || null;\n if (responseVariable.cardinality !== 'single') {\n return responseVariable.correctResponse.length > 0 ? responseVariable.correctResponse[0] : '';\n } else {\n return responseVariable.correctResponse;\n }\n }\n}\n\ncustomElements.define('qti-correct', QtiCorrect);\n","import { property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\nimport { itemContext } from '../../../../exports/qti-assessment-item.context';\nimport { testContext } from '../../../../exports/test.context';\n\nimport type { ItemContext } from '../../../../exports/item.context';\nimport type { TestContext } from '../../../../exports/test.context';\n\n/**\n * @summary The qti-default expression returns the default value of a declared variable.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.default\n *\n * Looks up the declaration of an itemVariable and returns the associated defaultValue\n * or NULL if no default value was declared. Supports item identifier prefixing\n * for obtaining default values from individual items in outcomes processing.\n */\nexport class QtiDefault extends QtiExpression<any> {\n @property({ type: String }) identifier: string = '';\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n @state()\n @consume({ context: testContext, subscribe: true })\n protected _testContext?: TestContext;\n\n public override getResult(): any {\n if (!this.identifier) {\n console.error('qti-default requires an identifier attribute');\n return null;\n }\n\n // Check for item identifier prefixing (format: \"itemId.variableId\")\n const parts = this.identifier.split('.');\n\n let itemId: string | null = null;\n let variableId: string;\n\n if (parts.length === 2) {\n itemId = parts[0];\n variableId = parts[1];\n } else if (parts.length === 1) {\n variableId = parts[0];\n } else {\n console.error('qti-default: invalid identifier format');\n return null;\n }\n\n // If item identifier is specified, look in that specific item\n if (itemId) {\n const itemContext = this._testContext.items.find(item => item.identifier === itemId);\n console.debug(`itemContext: ${JSON.stringify(itemContext)}`);\n if (!this._testContext || !itemContext) {\n console.warn(`qti-default: item \"${itemId}\" not found in test context`);\n return null;\n }\n const variable = this._testContext.items\n .find(item => item.identifier === itemId)\n ?.variables.find(v => v.identifier === variableId);\n if (!variable) {\n console.warn(`qti-default: variable \"${variableId}\" not found in item \"${itemId}\"`);\n return null;\n }\n return variable.defaultValue || null;\n }\n\n // Otherwise, look in the current item context\n if (!this.context?.variables) {\n console.warn('qti-default: no variables found in item context');\n return null;\n }\n const variable = this.context.variables.find(v => v.identifier === variableId);\n if (!variable) {\n console.warn(`qti-default: variable \"${variableId}\" not found in item context`);\n return null;\n }\n return variable.defaultValue || null;\n }\n}\n\ncustomElements.define('qti-default', QtiDefault);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiEqualRounded extends QtiExpression<boolean> {\n @property({ type: String }) roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n get figures() {\n const attr = this.getAttribute('figures');\n if (!attr) {\n console.error('figures attribute is missing');\n return null;\n }\n const figures = parseInt(this.getAttribute('figures') || '0');\n if (isNaN(figures)) {\n console.error('figures attribute is not a number');\n return null;\n }\n if (figures < 0) {\n console.error('figures attribute is negative');\n return null;\n }\n if (figures < 1 && this.roundingMode === 'significantFigures') {\n console.error('figures cannot be smaller than 1 for RoundingMode significantFigures');\n return null;\n }\n return figures;\n }\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.roundingMode === null) {\n return null;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n switch (values[0].baseType) {\n case 'integer':\n case 'float': {\n const float1 = parseFloat(value1.value as string);\n const float2 = parseFloat(value2.value as string);\n\n if (!isNaN(float1) && !isNaN(float2)) {\n if (this.roundingMode === 'significantFigures') {\n return float1.toPrecision(this.figures) === float2.toPrecision(this.figures);\n } else {\n return (\n Math.round(float1 * Math.pow(10, this.figures)) / Math.pow(10, this.figures) ===\n Math.round(float2 * Math.pow(10, this.figures)) / Math.pow(10, this.figures)\n );\n }\n } else {\n console.error(`value cannot be casted to numeric value in equalRounded operator: ${float1}, ${float2}`);\n }\n break;\n }\n default: {\n console.error(`values other than float and int cannot be used in equalRounded operator.`);\n break;\n }\n }\n return false;\n }\n console.error('unexpected number of children in qti-equal-rounded');\n return null;\n }\n}\n\ncustomElements.define('qti-equal-rounded', QtiEqualRounded);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-round operator rounds a numerical value to the nearest integer.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.round\n *\n * Takes a single sub-expression with single cardinality and numerical base-type.\n * Returns an integer formed by rounding the value using the rule: n for all input\n * values in the range [n-0.5, n+0.5). For example, 6.8 and 6.5 both round to 7,\n * 6.49 rounds to 6, and -6.5 rounds to -6.\n */\nexport class QtiRound extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length !== 1) {\n console.error('qti-round must have exactly one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n const variable = variables[0];\n\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-round requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-round unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-round requires numerical base-type (integer or float)');\n return null;\n }\n\n // Convert to number\n const numericValue = parseFloat(variable.value as string);\n\n // Handle special cases\n if (isNaN(numericValue)) {\n console.warn('qti-round: NaN input results in NULL');\n return null;\n }\n\n if (!isFinite(numericValue)) {\n // Handle infinity cases\n if (numericValue === Infinity) {\n return Infinity;\n }\n if (numericValue === -Infinity) {\n return -Infinity;\n }\n return null;\n }\n\n // Apply QTI rounding rule: result is integer n for all input values in [n-0.5, n+0.5)\n // This means we need to find n such that: n-0.5 <= value < n+0.5\n // Rearranging: n <= value + 0.5 < n + 1\n // So n = floor(value + 0.5)\n return Math.floor(numericValue + 0.5);\n }\n}\n\ncustomElements.define('qti-round', QtiRound);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-round-to operator rounds a numerical value to specified precision.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.round-to\n *\n * Takes one sub-expression with single cardinality and numerical base-type.\n * Returns a single float rounded by the specified method to the specified precision.\n * Supports rounding to decimal places or significant figures.\n */\nexport class QtiRoundTo extends QtiExpression<number | null> {\n @property({ type: String, attribute: 'rounding-mode' })\n roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n @property({ type: Number })\n figures: number = 3;\n\n public override getResult(): number | null {\n if (this.children.length !== 1) {\n console.error('qti-round-to must have exactly one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n const variable = variables[0];\n\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-round-to requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-round-to unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-round-to requires numerical base-type');\n return null;\n }\n\n // Convert to number\n const numericValue = parseFloat(variable.value as string);\n\n // Handle special cases\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!isFinite(numericValue)) {\n // Handle infinity cases\n if (numericValue === Infinity) {\n return Infinity;\n }\n if (numericValue === -Infinity) {\n return -Infinity;\n }\n return null;\n }\n\n // Validate figures\n if (this.figures < 0) {\n console.error('qti-round-to: figures must be non-negative');\n return null;\n }\n\n if (this.roundingMode === 'significantFigures' && this.figures < 1) {\n console.error('qti-round-to: figures must be at least 1 for significantFigures mode');\n return null;\n }\n\n // Perform rounding\n if (this.roundingMode === 'decimalPlaces') {\n return this._roundToDecimalPlaces(numericValue, this.figures);\n } else {\n return this._roundToSignificantFigures(numericValue, this.figures);\n }\n }\n\n /**\n * Round to specified number of decimal places\n */\n private _roundToDecimalPlaces(value: number, decimalPlaces: number): number {\n if (value === 0) {\n return 0;\n }\n\n const multiplier = Math.pow(10, decimalPlaces);\n return Math.round(value * multiplier) / multiplier;\n }\n\n /**\n * Round to specified number of significant figures\n */\n private _roundToSignificantFigures(value: number, significantFigures: number): number {\n if (value === 0) {\n return 0;\n }\n\n // Find the order of magnitude of the first non-zero digit\n const magnitude = Math.floor(Math.log10(Math.abs(value)));\n\n // Calculate the multiplier to shift the decimal point\n const multiplier = Math.pow(10, significantFigures - magnitude - 1);\n\n // Round and shift back\n return Math.round(value * multiplier) / multiplier;\n }\n}\n\ncustomElements.define('qti-round-to', QtiRoundTo);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiEqual extends QtiExpression<boolean> {\n @property({ type: String }) toleranceMode: 'exact' | 'relative' | 'absolute' = 'exact';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.toleranceMode !== 'exact') {\n console.error('toleranceMode is not supported yet');\n return false;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n return ScoringHelper.compareSingleValues(value1.value as string, value2.value as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-equal');\n return null;\n }\n}\n\ncustomElements.define('qti-equal', QtiEqual);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-gcd operator calculates the greatest common divisor of integer values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.gcd\n *\n * Takes 1 or more sub-expressions with base-type integer and any cardinality.\n * Returns a single integer equal to the greatest common divisor of all argument values.\n * Special cases: gcd(0,0)=0, gcd(0,n)=n if n≠0, returns NULL if any argument is NULL or non-numerical.\n */\nexport class QtiGcd extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length === 0) {\n console.error('qti-gcd must have at least one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n // Collect all integer values from all variables\n const allValues: number[] = [];\n\n for (const variable of variables) {\n // Check base type\n if (variable.baseType !== 'integer') {\n console.error('qti-gcd requires integer base-type');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Handle different cardinalities\n if (variable.cardinality === 'single') {\n if (Array.isArray(variable.value)) {\n console.error('qti-gcd unexpected array value for single cardinality');\n return null;\n }\n const numValue = parseInt(variable.value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n } else if (variable.cardinality === 'multiple' || variable.cardinality === 'ordered') {\n if (!Array.isArray(variable.value)) {\n console.error('qti-gcd expected array value for multiple/ordered cardinality');\n return null;\n }\n for (const value of variable.value) {\n if (value === null || value === undefined) {\n return null;\n }\n const numValue = parseInt(value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n }\n } else {\n console.error('qti-gcd unsupported cardinality');\n return null;\n }\n }\n\n if (allValues.length === 0) {\n return null;\n }\n\n // Calculate GCD of all values\n return this._calculateGcd(allValues);\n }\n\n /**\n * Calculate the greatest common divisor of an array of integers\n */\n private _calculateGcd(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n\n if (values.length === 1) {\n return Math.abs(values[0]);\n }\n\n // Start with the first value\n let result = Math.abs(values[0]);\n\n // Calculate GCD with each subsequent value\n for (let i = 1; i < values.length; i++) {\n result = this._gcdTwoNumbers(result, Math.abs(values[i]));\n\n // Early termination: if GCD becomes 1, it won't get smaller\n if (result === 1) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Calculate GCD of two numbers using Euclidean algorithm\n */\n private _gcdTwoNumbers(a: number, b: number): number {\n // Handle special cases according to QTI spec\n if (a === 0 && b === 0) {\n return 0; // gcd(0,0) = 0\n }\n if (a === 0) {\n return b; // gcd(0,n) = n\n }\n if (b === 0) {\n return a; // gcd(n,0) = n\n }\n\n // Euclidean algorithm\n while (b !== 0) {\n const temp = b;\n b = a % b;\n a = temp;\n }\n\n return a;\n }\n}\n\ncustomElements.define('qti-gcd', QtiGcd);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiGt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value > +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gt');\n }\n }\n console.error('unexpected number of children in qt');\n return null;\n }\n}\n\ncustomElements.define('qti-gt', QtiGt);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiGte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value >= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gte');\n return null;\n }\n }\n console.log('unexpected number of children in qte');\n return null;\n }\n}\n\ncustomElements.define('qti-gte', QtiGte);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\n/**\n * @summary The qti-null expression returns the NULL value.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.null\n *\n * A simple expression that returns the NULL value. The null value is treated\n * as if it is of any desired base-type.\n */\nexport class QtiNull extends QtiExpression<null> {\n public override getResult(): null {\n return null;\n }\n}\n\ncustomElements.define('qti-null', QtiNull);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiIsNull extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 1) {\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables) {\n return true;\n }\n const value = variables[0].value;\n return value == null || value == undefined || value === '';\n }\n console.error('unexpected number of children in qti Null');\n return null;\n }\n}\n\ncustomElements.define('qti-is-null', QtiIsNull);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiFieldValue extends QtiExpression<string | string[]> {\n public override getResult() {\n const fieldIdentifier = this.getAttribute('field-identifier');\n\n if (!fieldIdentifier) {\n throw new Error('field-identifier attribute is required');\n }\n\n // Get the result from the child expression (should be a record)\n const childElements = Array.from(this.children) as QtiExpression<any>[];\n\n if (childElements.length !== 1) {\n throw new Error('qti-field-value must have exactly one child expression');\n }\n\n const variable = (this.getVariables() as ResponseVariable[])[0];\n\n // Check if the result is a record/object\n if (variable.baseType !== 'record' || variable.value === null) {\n throw new Error('qti-field-value child expression must return a record');\n }\n\n // Return the field value\n const fieldValue = variable.value[fieldIdentifier];\n\n if (fieldValue === undefined) {\n throw new Error(`Field \"${fieldIdentifier}\" not found in record`);\n }\n\n return fieldValue;\n }\n}\n\ncustomElements.define('qti-field-value', QtiFieldValue);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiLt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value < +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lt');\n }\n }\n console.error('unexpected number of children in lt');\n return null;\n }\n}\n\ncustomElements.define('qti-lt', QtiLt);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiLte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value <= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lte');\n return null;\n }\n }\n console.log('unexpected number of children in lte');\n return null;\n }\n}\n\ncustomElements.define('qti-lte', QtiLte);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMapResponse extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response || !response.mapping) {\n console.error(`Response ${this.identifier} can not be found`);\n return null;\n }\n const mapping = response.mapping;\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n let result = 0;\n for (const candidateResponse of candidateResponses) {\n const mappedValues = mapping.mapEntries.filter(entry => {\n if (response.baseType === 'string' && !entry.caseSensitive) {\n return ScoringHelper.compareSingleValues(\n entry.mapKey.toLowerCase(),\n candidateResponse.toLowerCase(),\n response.baseType\n );\n } else {\n return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);\n }\n });\n // now find the mapped value with the highest value (if there are multiple)\n const mappedValue = mappedValues.reduce(\n (prev, current) => (prev.mappedValue > current.mappedValue ? prev : current),\n mappedValues.length > 0 ? mappedValues[0] : { mapKey: null, mappedValue: null } // Use the first element instead of a manual initial value\n );\n if (!(mappedValue === null || mappedValue.mappedValue == undefined)) {\n result += mappedValue.mappedValue;\n } else {\n result += mapping.defaultValue;\n }\n }\n if (mapping?.lowerBound !== null && mapping?.lowerBound !== undefined) {\n result = Math.max(mapping.lowerBound, result);\n }\n if (mapping?.upperBound !== null && mapping?.upperBound !== undefined) {\n result = Math.min(mapping.upperBound, result);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-map-response', QtiMapResponse);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nimport type { QtiAreaMapping } from '../qti-area-mapping/qti-area-mapping';\n\nexport class QtiMapResponsePoint extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response) {\n console.warn(`Response ${this.identifier} cannot be found`);\n return null;\n }\n\n const areaMapping: QtiAreaMapping = response.areaMapping;\n if (!areaMapping) {\n console.warn(`Area mapping not found for response ${this.identifier}`);\n return null;\n }\n\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n if (!candidateResponses || candidateResponses.length === 0) {\n console.warn(`No candidate responses for response ${this.identifier}`);\n return null;\n }\n\n let result = 0;\n\n // Keep track of areas that have already been matched\n const mappedAreas = new Set<string>();\n\n for (const candidateResponse of candidateResponses) {\n for (const entry of areaMapping.areaMapEntries) {\n if (mappedAreas.has(entry.coords)) {\n continue; // Skip areas that have already been mapped\n }\n const isPointInArea = ScoringHelper.isPointInArea(\n candidateResponse,\n `${entry.shape},${entry.coords}`,\n response.baseType\n );\n if (isPointInArea) {\n result += entry.mappedValue ?? 0;\n mappedAreas.add(entry.coords);\n }\n }\n }\n\n // Add default value for unmatched candidate responses\n if (mappedAreas.size < candidateResponses.length) {\n result += areaMapping.defaultValue;\n }\n\n // Apply bounds if defined\n if (areaMapping.lowerBound != null) {\n result = Math.max(areaMapping.lowerBound, result);\n }\n if (areaMapping.upperBound != null) {\n result = Math.min(areaMapping.upperBound, result);\n }\n\n return result;\n }\n}\n\ncustomElements.define('qti-map-response-point', QtiMapResponsePoint);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-math-operator performs mathematical operations on numerical values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.math-operator\n *\n * Takes 1 or more sub-expressions with single cardinality and numerical base-types.\n * The result is a single float, except for signum, floor and ceil which return integers.\n * Returns NULL if any argument is NULL or falls outside the function's natural domain.\n */\nexport class QtiMathOperator extends QtiExpression<number | null> {\n @property({ type: String }) name: string = '';\n\n public override getResult(): number | null {\n if (!this.name) {\n console.error('qti-math-operator requires a name attribute');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n // Extract numerical values and validate\n const values: number[] = [];\n for (const variable of variables) {\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-math-operator requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-math-operator unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-math-operator requires numerical base-type');\n return null;\n }\n\n // Convert to number\n const numValue = parseFloat(variable.value as string);\n if (isNaN(numValue)) {\n console.error('qti-math-operator non-numerical value');\n return null;\n }\n\n values.push(numValue);\n }\n\n // Perform the mathematical operation\n return this._performOperation(this.name, values);\n }\n\n private _performOperation(operation: string, values: number[]): number | null {\n try {\n switch (operation.toLowerCase()) {\n // Single argument functions\n case 'sin':\n if (values.length !== 1) return null;\n return Math.sin(values[0]);\n\n case 'cos':\n if (values.length !== 1) return null;\n return Math.cos(values[0]);\n\n case 'tan':\n if (values.length !== 1) return null;\n return Math.tan(values[0]);\n\n case 'asin':\n if (values.length !== 1) return null;\n if (values[0] < -1 || values[0] > 1) return null; // Outside domain\n return Math.asin(values[0]);\n\n case 'acos':\n if (values.length !== 1) return null;\n if (values[0] < -1 || values[0] > 1) return null; // Outside domain\n return Math.acos(values[0]);\n\n case 'atan':\n if (values.length !== 1) return null;\n return Math.atan(values[0]);\n\n case 'sinh':\n if (values.length !== 1) return null;\n return Math.sinh(values[0]);\n\n case 'cosh':\n if (values.length !== 1) return null;\n return Math.cosh(values[0]);\n\n case 'tanh':\n if (values.length !== 1) return null;\n return Math.tanh(values[0]);\n\n case 'log':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log(values[0]);\n\n case 'ln':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log(values[0]);\n\n case 'log10':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log10(values[0]);\n\n case 'exp':\n if (values.length !== 1) return null;\n return Math.exp(values[0]);\n\n case 'abs':\n if (values.length !== 1) return null;\n return Math.abs(values[0]);\n\n case 'sqrt':\n if (values.length !== 1) return null;\n if (values[0] < 0) return null; // Outside domain\n return Math.sqrt(values[0]);\n\n case 'signum':\n if (values.length !== 1) return null;\n return Math.sign(values[0]); // Returns -1, 0, or 1 (integer)\n\n case 'floor':\n if (values.length !== 1) return null;\n return Math.floor(values[0]); // Returns integer\n\n case 'ceil':\n if (values.length !== 1) return null;\n return Math.ceil(values[0]); // Returns integer\n\n case 'round':\n if (values.length !== 1) return null;\n return Math.round(values[0]);\n\n // Two argument functions\n case 'atan2':\n if (values.length !== 2) return null;\n return Math.atan2(values[0], values[1]);\n\n case 'pow': {\n if (values.length !== 2) {\n return null;\n }\n const base = values[0];\n const exponent = values[1];\n // Check for invalid cases\n if (base === 0 && exponent <= 0) return null;\n if (base < 0 && !Number.isInteger(exponent)) return null;\n return Math.pow(base, exponent);\n }\n case 'log_base': {\n if (values.length !== 2) {\n return null;\n }\n const value = values[0];\n const base = values[1];\n if (value <= 0 || base <= 0 || base === 1) return null; // Outside domain\n return Math.log(value) / Math.log(base);\n }\n case 'mod':\n if (values.length !== 2) return null;\n if (values[1] === 0) return null; // Division by zero\n return values[0] % values[1];\n\n case 'max':\n if (values.length < 1) return null;\n return Math.max(...values);\n\n case 'min':\n if (values.length < 1) return null;\n return Math.min(...values);\n\n default:\n console.error(`qti-math-operator: unknown operation \"${operation}\"`);\n return null;\n }\n } catch (error) {\n console.error(`qti-math-operator: error performing operation \"${operation}\":`, error);\n return null;\n }\n }\n}\n\ncustomElements.define('qti-math-operator', QtiMathOperator);\n","import { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMatch extends QtiExpression<boolean> {\n //PK : FIXME.\n // This was a little experiment if we could call the match function as a static function,\n // This can be used for all kind of things, but now especially for use in\n // qti-response-condition-script\n // in which we pass the expressions as pure functions, and hope for the best.\n // SADLY, the getVariables throws roet in de eten.. weet nog niet precies hoe deze werkt.\n // Maar ik ga erin duiken.\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const valueToMap = values[0];\n const correctValueInfo = values[1];\n return QtiMatch.match(valueToMap, correctValueInfo);\n }\n\n console.error('unexpected number of children in match');\n return null;\n }\n\n public static match(valueToMap: ResponseVariable, correctValueInfo: ResponseVariable) {\n if (valueToMap.value === null) return false;\n switch (correctValueInfo.cardinality) {\n case 'single': {\n if (Array.isArray(valueToMap.value) || Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n return ScoringHelper.compareSingleValues(\n valueToMap.value?.toString(),\n correctValueInfo.value.toString(),\n correctValueInfo.baseType\n );\n }\n\n case 'ordered': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n for (let i = 0; i < valueToMap.value.length; i++) {\n const result = ScoringHelper.compareSingleValues(\n correctValueInfo.value[i],\n valueToMap.value[i],\n correctValueInfo.baseType\n );\n if (!result) {\n return false;\n }\n }\n return true;\n }\n\n case 'multiple': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n let answerIndex = 0;\n for (const correctAnswer of correctValueInfo.value) {\n let matchingValue: string | null = null;\n const arr = [...valueToMap.value];\n for (const mv of arr) {\n const result = ScoringHelper.compareSingleValues(correctAnswer, mv, correctValueInfo.baseType);\n if (result) {\n matchingValue = mv;\n break;\n }\n }\n if (matchingValue !== null) {\n (arr as string[]).splice(arr.indexOf(matchingValue), 1);\n } else {\n return false;\n }\n answerIndex++;\n }\n return true;\n }\n\n default:\n console.error('unexpected cardinality in qti match');\n return false;\n }\n }\n}\n\ncustomElements.define('qti-match', QtiMatch);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMember extends QtiExpression<boolean | null> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n\n if (!(this.children.length === 2)) {\n console.warn('The member operator takes two sub-expressions');\n }\n\n const [value1, value2] = values;\n\n if (\n !(\n value1.baseType === value2.baseType ||\n (value1.baseType === 'integer' && value2.baseType === 'float') ||\n (value1.baseType === 'float' && value2.baseType === 'integer')\n )\n ) {\n console.warn('Which must both have the same base-type');\n }\n if (!(value2.cardinality === 'multiple' || value2.cardinality === 'ordered')) {\n console.warn('and the second must be a multiple or ordered container');\n }\n if (value1.baseType === 'float' || value2.baseType === 'float') {\n console.warn('The member operator should not be used on sub-expressions with a base-type of float');\n }\n if (value1.baseType === 'duration' || value2.baseType === 'duration') {\n console.warn('It must not be used on sub-expressions with a base-type of duration');\n }\n\n // If either sub-expression is NULL then the result of the operator is NULL\n if (value1.value === null || value2.value === null) {\n return null;\n }\n\n // The result is a single boolean with a value of 'true' if the value given by the first sub-expression is in the container defined by the second sub-expression.\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n }\n}\n\ncustomElements.define('qti-member', QtiMember);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable, VariableDeclaration } from '../../../../exports/variables';\nexport class QtiMultiple extends QtiExpression<VariableDeclaration<string | string[]>[]> {\n public override getResult(): ResponseVariable[] {\n console.debug('qti-multiple getResult called', this.innerHTML);\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti multiple');\n return [];\n }\n }\n\n // const values = variables.map(v => v.value);\n // console.log(variables);\n // const flattenedArray = values.reduce((acc: string[], value: string | string[]) => {\n // return acc.concat(Array.isArray(value) ? [...value] : value);\n // }, []);\n // return flattenedArray;\n\n return variables;\n }\n}\n\ncustomElements.define('qti-multiple', QtiMultiple);\n","import { html } from 'lit';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiNot extends QtiExpression<boolean> {\n override render() {\n return html`${super.render()}`;\n }\n\n public override getResult() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return !result;\n }\n}\n\ncustomElements.define('qti-not', QtiNot);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiOr extends QtiConditionExpression {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = Array.from(this.children).map(c => {\n const condition = c as QtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.some(e => {\n return typeof e === 'boolean' && e;\n });\n }\n}\n\ncustomElements.define('qti-or', QtiOr);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nexport class QtiOrdered extends QtiExpression<ResponseVariable[]> {\n public override getResult(): ResponseVariable[] {\n const variables = this.getVariables() as ResponseVariable[];\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'ordered' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti ordered');\n return [];\n }\n }\n return variables;\n }\n}\n\ncustomElements.define('qti-ordered', QtiOrdered);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n/**\n * @summary The qti-power operator raises the first expression to the power of the second.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.power\n *\n * Takes 2 sub-expressions with single cardinality and numerical base-types.\n * Returns a single float corresponding to the first expression raised to the power of the second.\n * Returns NULL if either expression is NULL or if the result is outside the float value set.\n */\nexport class QtiPower extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length !== 2) {\n console.error('qti-power must have exactly two child expressions');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length !== 2) {\n return null;\n }\n\n const [base, exponent] = variables;\n\n // Check cardinality for both expressions\n if (base.cardinality !== 'single' || exponent.cardinality !== 'single') {\n console.error('qti-power requires single cardinality for both expressions');\n return null;\n }\n\n // Check if values are arrays (shouldn't be for single cardinality)\n if (Array.isArray(base.value) || Array.isArray(exponent.value)) {\n console.error('qti-power unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (base.value === null || base.value === undefined || exponent.value === null || exponent.value === undefined) {\n return null;\n }\n\n // Check base types\n if (\n (base.baseType !== 'integer' && base.baseType !== 'float') ||\n (exponent.baseType !== 'integer' && exponent.baseType !== 'float')\n ) {\n console.error('qti-power requires numerical base-types');\n return null;\n }\n\n // Convert to numbers\n const baseValue = parseFloat(base.value as string);\n const exponentValue = parseFloat(exponent.value as string);\n\n // Check for NaN values\n if (isNaN(baseValue) || isNaN(exponentValue)) {\n console.error('qti-power: non-numerical values encountered');\n return null;\n }\n\n // Handle special cases that should return NULL according to mathematical rules\n if (baseValue === 0 && exponentValue <= 0) {\n // 0^0, 0^(-n) are undefined\n return null;\n }\n\n if (baseValue < 0 && !Number.isInteger(exponentValue)) {\n // Negative base with non-integer exponent results in complex number\n return null;\n }\n\n // Calculate the power\n let result: number;\n try {\n result = Math.pow(baseValue, exponentValue);\n } catch (error) {\n console.error('qti-power: error calculating power:', error);\n return null;\n }\n\n // Check if result is within valid float range\n if (isNaN(result)) {\n return null;\n }\n\n // Allow positive and negative infinity as per spec\n if (result === Infinity || result === -Infinity) {\n return result;\n }\n\n // Check if result is within JavaScript's safe number range\n // This is a practical limit for what can be represented as a float\n if (!isFinite(result)) {\n return null;\n }\n\n // Additional check for extremely large or small numbers that might cause issues\n if (Math.abs(result) > Number.MAX_VALUE) {\n return null;\n }\n\n // Check for underflow (extremely small numbers that round to 0)\n if (result !== 0 && Math.abs(result) < Number.MIN_VALUE) {\n return null;\n }\n if (isFinite(result) && result !== 0) {\n // Determine appropriate precision based on the magnitude of the result\n const magnitude = Math.floor(Math.log10(Math.abs(result)));\n const precision = Math.max(0, 14 - magnitude); // Maintain 14 significant digits\n const factor = Math.pow(10, precision);\n result = Math.round(result * factor) / factor;\n }\n\n return result;\n }\n}\n\ncustomElements.define('qti-power', QtiPower);\n","import { consume } from '@lit/context';\nimport { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../../exports/qti-assessment-item.context';\n\nimport type { VariableDeclaration } from '../../../../exports/variables';\nimport type { ItemContext } from '../../../../exports/item.context';\n\nexport class QtiPrintedVariable extends LitElement {\n @property({ type: String })\n identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n override render() {\n const value = this.context?.variables.find(v => v.identifier === this.identifier)?.value;\n return value === null ? nothing : html`${JSON.stringify(value, null, 2)}`;\n }\n\n public calculate(): VariableDeclaration<string | string[]> {\n const result = this.context.variables.find(v => v.identifier === this.identifier) || null;\n return result;\n }\n}\n\ncustomElements.define('qti-printed-variable', QtiPrintedVariable);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiProduct extends QtiExpression<number> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n const product = values.reduce((accumulator, currentValue) => {\n if (currentValue.baseType == 'float' || currentValue.baseType == 'integer') {\n try {\n return accumulator * parseFloat(currentValue.value.toString());\n } catch (error) {\n console.warn(`can not convert to number`);\n }\n } else {\n console.warn(`has another baseType ${currentValue.baseType}`);\n }\n return accumulator;\n }, 1);\n return product;\n }\n}\n\ncustomElements.define('qti-product', QtiProduct);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\ntype Constructor<T> = new (...args: any[]) => T;\nexport class QtiSubtract extends qtiSubtractMixin(QtiExpression<any> as unknown as Constructor<QtiExpression<number>>) {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const value = this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n return value;\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\n\nexport function qtiSubtractMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiSubtract extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(expression => {\n if (!expression.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = expression.calculate();\n if (Number.isNaN(value)) {\n console.error('Unexpected value in qti-subtract, expected number');\n return null;\n }\n return Number(value);\n });\n if (values.some(value => value === null)) {\n console.error('One or more child expressions returned invalid values');\n return 0;\n }\n // Subtract the two values\n return values[0] - values[1];\n }\n };\n}\n","import { QtiSubtract } from './qti-subtract';\ncustomElements.define('qti-subtract', QtiSubtract);\n\nexport * from './qti-subtract';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-subtract': QtiSubtract;\n }\n}\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiStringMatch extends QtiExpression<boolean> {\n @property({ type: String, attribute: 'case-sensitive' }) caseSensitive = 'true';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti string-match');\n return false;\n }\n const v1 = this.caseSensitive === 'true' ? value1.value : (value1.value as string).toLowerCase();\n const v2 = this.caseSensitive === 'true' ? value2.value : (value2.value as string).toLowerCase();\n return ScoringHelper.compareSingleValues(v1 as string, v2 as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-string-match');\n return null;\n }\n}\n\ncustomElements.define('qti-string-match', QtiStringMatch);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { QtiExpressionBase } from '../../../../exports/qti-expression';\n\nexport class QtiSum extends QtiExpression<number> {\n private _expression: QtiSumExpression;\n constructor() {\n super();\n this._expression = new QtiSumExpression(Array.from(this.children as unknown as QtiExpressionBase<number>[]));\n }\n\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const value = this._expression.calculate();\n return value;\n }\n}\n\nexport class QtiSumExpression implements QtiExpressionBase<number> {\n constructor(private expressions: QtiExpressionBase<number>[]) {}\n\n public calculate() {\n const expressions = this.expressions.filter(c => c.calculate !== undefined);\n // check if one expresssion returns null\n if (expressions.some(c => c.calculate() === null)) {\n return null;\n }\n\n const values = this.expressions.map(c => {\n const value = c.calculate();\n if (Number.isNaN(value)) {\n console.error('unexpected value in qti-sum, expected number');\n return null;\n }\n\n return Number(value);\n });\n return values.reduce((a, b) => a + b, 0);\n }\n}\n\ncustomElements.define('qti-sum', QtiSum);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiVariable extends QtiExpression<string | string[]> {\n public override getResult() {\n const identifier = this.getAttribute('identifier');\n const result = this.context.variables.find(v => v.identifier === identifier).value;\n return result;\n }\n}\n\ncustomElements.define('qti-variable', QtiVariable);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\n/**\n * @summary The qti-random-integer operator selects a random integer from a specified range.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.random-integer\n *\n * Selects a random integer from the range [min,max] satisfying min + step * n for some integer n.\n * For example, with min=2, max=11 and step=3 the values {2,5,8,11} are possible.\n */\nexport class QtiRandomInteger extends QtiExpression<number> {\n @property({ type: Number }) min: number = 0;\n @property({ type: Number }) max: number = 10;\n @property({ type: Number }) step: number = 1;\n\n public override getResult(): number {\n // Validate attributes\n if (this.min > this.max) {\n console.error('qti-random-integer: min cannot be greater than max');\n return this.min;\n }\n\n if (this.step <= 0) {\n console.error('qti-random-integer: step must be positive');\n return this.min;\n }\n\n // Calculate all possible values in the range\n const possibleValues: number[] = [];\n\n // Generate values using the formula: min + step * n for integer n\n let n = 0;\n while (true) {\n const value = this.min + this.step * n;\n if (value > this.max) {\n break;\n }\n // Only add integer values\n if (Number.isInteger(value)) {\n possibleValues.push(value);\n }\n n++;\n }\n\n // If no valid integer values found, return min (if it's an integer) or floor(min)\n if (possibleValues.length === 0) {\n console.warn('qti-random-integer: no valid integer values in range');\n return Number.isInteger(this.min) ? this.min : Math.floor(this.min);\n }\n\n // Select a random value from the possible values\n const randomIndex = Math.floor(Math.random() * possibleValues.length);\n return possibleValues[randomIndex];\n }\n\n /**\n * Get all possible values for testing purposes\n */\n public getPossibleValues(): number[] {\n const possibleValues: number[] = [];\n\n if (this.min > this.max || this.step <= 0) {\n return [Number.isInteger(this.min) ? this.min : Math.floor(this.min)];\n }\n\n let n = 0;\n while (true) {\n const value = this.min + this.step * n;\n if (value > this.max) {\n break;\n }\n // Only add integer values\n if (Number.isInteger(value)) {\n possibleValues.push(value);\n }\n n++;\n }\n\n return possibleValues.length > 0 ? possibleValues : [Number.isInteger(this.min) ? this.min : Math.floor(this.min)];\n }\n}\n\ncustomElements.define('qti-random-integer', QtiRandomInteger);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiRandom extends QtiExpression<string> {\n public override getResult() {\n const values = this.getVariables();\n // console.log(values);\n\n if (values.length === 1) {\n const value = values[0].value;\n if (Array.isArray(value)) {\n const randomIndex = Math.floor(Math.random() * value.length);\n return value[randomIndex];\n }\n return value;\n }\n console.error('unexpected number of children in match');\n return null;\n }\n}\n\ncustomElements.define('qti-random', QtiRandom);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiDelete extends QtiExpression<string[] | null> {\n override getResult(): string[] | null {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n\n if (value1.cardinality !== 'single' || !Array.isArray(value2.value)) {\n console.error('unexpected cardinality in qti equal');\n return null;\n }\n\n if (values[0].baseType !== values[1].baseType) {\n console.error('The baseType of the two variables is different');\n return null;\n }\n\n const filtered = value2.value.filter(v => !value1.value.includes(v));\n\n return filtered;\n }\n }\n}\n\ncustomElements.define('qti-delete', QtiDelete);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { integer } from '../../../../exports/expression-result';\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n@customElement('qti-index')\nexport class QtiIndex extends QtiExpression<any> {\n @property({ type: String })\n n!: string; // Required attribute, can be a number or an identifier\n\n public override getResult(): any {\n if (!this.n) {\n console.error('qti-index: missing required attribute \"n\"');\n return null;\n }\n\n // Check if there is exactly one child\n if (this.children.length !== 1) {\n console.error('qti-index: must have exactly one child container element');\n return null;\n }\n\n // Get the container from the child\n const containerVariable = this.getVariables()[0] as ResponseVariable;\n if (!containerVariable) {\n console.error('qti-index: missing container');\n return null;\n }\n\n // Determine the index value - either from n as a direct number or by looking up identifier\n let index: number;\n\n if (!isNaN(Number(this.n))) {\n // n is a direct number\n index = Number(this.n);\n } else {\n // n is an identifier - need to look up its value at runtime\n // This would require access to the QTI runtime context to resolve variables\n const variableValue = this.lookupVariableValue(this.n);\n if (variableValue === null) {\n console.error(`qti-index: variable \"${this.n}\" is not a valid number`);\n return null;\n }\n index = Number(variableValue);\n }\n\n // Check if index is a positive integer\n if (index <= 0 || !Number.isInteger(index)) {\n console.error('qti-index: index must be a positive integer');\n return null;\n }\n\n // Check if container has ordered values\n if (containerVariable.cardinality === 'ordered') {\n const containerValues = Array.isArray(containerVariable.value)\n ? containerVariable.value\n : [containerVariable.value];\n\n // Index out of bounds or container is NULL\n if (containerVariable.value === null || index > containerValues.length) {\n return null;\n }\n\n // Return the nth value (index is 1-based)\n return containerValues[index - 1];\n } else {\n console.error('qti-index: child must have ordered cardinality');\n return null;\n }\n }\n\n // Helper method to look up a variable value by identifier\n // This would need to be implemented based on your actual QTI runtime environment\n private lookupVariableValue(identifier: string): integer | null {\n const value = this.context.variables.find(v => v.identifier === identifier)?.value;\n // check if value is a number\n if (value === null || isNaN(Number(value))) {\n return null;\n }\n return Number(value) as integer;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-content-body')\nexport class QtiContentBody extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-content-body': QtiContentBody;\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { watch } from '../../decorators/watch';\n\n@customElement('qti-rubric-block')\nexport class QtiRubricBlock extends LitElement {\n @property({ type: String }) override id; // =\"qtiAspectInhoudRubricBlock\"\n\n @property({ type: String }) use: 'instructions' | 'scoring' | 'navigation'; // = \"scoring\"\n\n @property({ type: String }) view: 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor';\n\n @property({ type: String, attribute: 'class' }) classNames;\n @watch('classNames', { waitUntilFirstUpdate: true })\n handleclassNamesChange() {\n const classNames = this.classNames.split(' ');\n classNames.forEach((className: string) => {\n switch (className) {\n case 'qti-rubric-discretionary-placement':\n {\n const event = new CustomEvent('qti-rubric:discretionary-placement', {\n detail: { className, element: this },\n bubbles: true,\n composed: true,\n cancelable: true\n });\n const notCancelled = this.dispatchEvent(event);\n if (!notCancelled) return;\n this.setAttribute('slot', 'qti-rubric-block');\n }\n break;\n case 'qti-rubric-inline':\n this.setAttribute('slot', '');\n break;\n default:\n break;\n }\n });\n }\n\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rubric-block': QtiRubricBlock;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-stylesheet')\nexport class QtiStylesheet extends LitElement {\n private styleElement: HTMLStyleElement | null = null;\n\n protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n const link = this.getAttribute('href');\n\n if (link !== null) {\n // Fetch the stylesheet content\n fetch(link)\n .then(response => response.text())\n .then(cssContent => {\n // Minify the CSS content by removing whitespace and comments\n const minifiedCss = this.minifyCss(cssContent);\n\n // Create a <style> element with @scope surrounding the minified CSS\n this.styleElement = document.createElement('style');\n this.styleElement.media = 'screen';\n this.styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n })\n .catch(error => {\n console.error('Failed to load stylesheet:', error);\n });\n }\n\n if (this.textContent !== null && this.textContent.trim() !== '') {\n // Minify the inline CSS content\n const minifiedCss = this.minifyCss(this.textContent);\n\n // Directly create a <style> element with the @scope surrounding the minified inline styles\n this.styleElement = document.createElement('style');\n this.styleElement.media = 'screen';\n this.styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n }\n }\n\n private minifyCss(cssContent: string): string {\n // Remove comments, whitespace, and newline characters\n return cssContent\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .replace(/\\s*([{}:;])\\s*/g, '$1') // Remove spaces around {}, :, ;\n .trim(); // Trim leading/trailing whitespace\n }\n\n override disconnectedCallback() {\n if (this.styleElement) {\n try {\n this.styleElement.remove();\n } catch (error) {\n console.error('Could not remove stylesheet:', error);\n }\n }\n super.disconnectedCallback();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-stylesheet': QtiStylesheet;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\n\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type { OutcomeVariable } from '../../../exports/variables';\nimport type { ItemContext } from '../../../exports/item.context';\n\n@customElement('qti-outcome-declaration')\nexport class QtiOutcomeDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n @property({ type: String, attribute: 'external-scored' }) externalScored: 'human' | 'externalMachine' | null = null;\n @property({ type: String }) identifier: string;\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n get interpolationTable(): Map<number, number> | null {\n const table = this.querySelector('qti-interpolation-table');\n if (table) {\n const entries = new Map<number, number>();\n for (const entry of table.querySelectorAll('qti-interpolation-table-entry')) {\n if (!entry.getAttribute('source-value') && entry.getAttribute('target-value')) {\n console.error('source-value or target-value is missing in qti-interpolation-table-entry');\n }\n const sourceValue = parseFloat(entry.getAttribute('source-value'));\n const targetValue = parseFloat(entry.getAttribute('target-value'));\n if (isNaN(sourceValue) || isNaN(targetValue)) {\n console.error('source-value or target-value is not a number in qti-interpolation-table-entry');\n }\n entries.set(sourceValue, targetValue);\n }\n return entries;\n }\n return null;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n\n const defaultValue = this.defaultValues(this.cardinality);\n\n const outcomeVariable: OutcomeVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n defaultValue: defaultValue,\n type: 'outcome',\n value: null,\n interpolationTable: this.interpolationTable,\n externalScored: this.externalScored\n };\n // At runtime, outcome variables are instantiated as part of an item session.\n // Their values may be initialized with a default value and/or set during response processing.\n // If no default value is given in the declaration then the outcome variable is initialized to NULL unless the outcome is of a numeric type (integer or float) in which case it is initialized to 0.\n outcomeVariable.value = defaultValue;\n if (\n (outcomeVariable.value === null || outcomeVariable.value == undefined) &&\n (outcomeVariable.baseType === 'integer' || outcomeVariable.baseType === 'float')\n ) {\n outcomeVariable.value = '0';\n }\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: outcomeVariable }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-declaration': QtiOutcomeDeclaration;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { Cardinality } from '../../exports/expression-result';\n\n@customElement('qti-variabledeclaration')\nexport class QtiVariableDeclaration extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n protected defaultValues(cardinality: Cardinality) {\n const htmlValues = Array.from(this.querySelectorAll('qti-default-value > qti-value'));\n\n if (htmlValues.length === 0) {\n return null;\n }\n\n const defaultValues = htmlValues.map(n => n.innerHTML.trim());\n if (defaultValues.length > 1 || cardinality === 'multiple' || cardinality === 'ordered') {\n return defaultValues;\n }\n return defaultValues[0];\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-variabledeclaration': QtiVariableDeclaration;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\n\nimport type { QtiAreaMapping } from '../../qti-response-processing';\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { QtiMapping } from '../../qti-response-processing/qti-expression/qti-mapping/qti-mapping';\nimport type { ItemContext } from '../../../exports/item.context';\n\n@customElement('qti-response-declaration')\nexport class QtiResponseDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n\n @property({ type: String }) identifier: string;\n\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n const defaultValue = this.defaultValues(this.cardinality);\n\n const responseVariable: ResponseVariable = {\n baseType: this.baseType,\n identifier: this.identifier,\n correctResponse: this.correctResponse,\n cardinality: this.cardinality || 'single',\n mapping: this.mapping,\n defaultValue,\n areaMapping: this.areaMapping,\n value: null,\n type: 'response',\n candidateResponse: null\n };\n responseVariable.value = defaultValue;\n\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: responseVariable }\n })\n );\n }\n\n private get correctResponse(): string | string[] {\n let result: string | string[];\n const correctResponse = this.querySelector('qti-correct-response');\n if (correctResponse) {\n const values = correctResponse.querySelectorAll('qti-value');\n if (this.cardinality === 'single' && values.length > 0) {\n result = values[0].textContent.trim();\n values[0].remove();\n } else if (this.cardinality !== 'single') {\n result = [];\n for (let i = 0; i < values.length; i++) {\n result.push(values[i].textContent.trim());\n values[i].remove();\n }\n }\n }\n return result;\n }\n\n private get mapping(): QtiMapping {\n const mappingElement = this.querySelector('qti-mapping');\n const lowerBound = parseFloat(mappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(mappingElement?.getAttribute('upper-bound'));\n const mappingValue = {\n defaultValue: Number(mappingElement?.getAttribute('default-value')) || 0,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n mapEntries: Array.from(mappingElement?.querySelectorAll('qti-map-entry') || []).map(el => ({\n mapKey: el.getAttribute('map-key') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n caseSensitive: el.hasAttribute('case-sensitive') ? el.getAttribute('case-sensitive') !== 'false' : false\n }))\n };\n return mappingValue;\n }\n\n private get areaMapping(): QtiAreaMapping {\n const areaMappingElement = this.querySelector('qti-area-mapping') as HTMLElement;\n\n const defaultValue = Number(areaMappingElement?.getAttribute('default-value')) || 0;\n const lowerBound = parseFloat(areaMappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(areaMappingElement?.getAttribute('upper-bound'));\n\n const areaMapEntries = Array.from(areaMappingElement?.querySelectorAll('qti-area-map-entry') || []).map(\n (el: HTMLElement) => ({\n shape: (el.getAttribute('shape') as 'default' | 'circle' | 'rect' | 'ellipse' | 'poly') || 'default',\n coords: el.getAttribute('coords') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n defaultValue: Number(el.getAttribute('default-value')) || 0\n })\n );\n\n return {\n defaultValue,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n areaMapEntries\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-declaration': QtiResponseDeclaration;\n }\n}\n"],"mappings":"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","names":["LitElement","customElement","property","LitElement","property","customElement","LitElement","customElement","LitElement","customElement","LitElement","html","customElement","LitElement","html","customElement","html","customElement","html","customElement","css","html","customElement","html","css","customElement","LitElement","css","html","customElement","LitElement","html","css","customElement","html","customElement","state","property","property","css","html","state","customElement","html","customElement","property","property","state","consume","property","state","consume","property","property","css","html","property","customElement","html","customElement","property","state","iframe","html","property","state","customElement","html","LitElement","customElement","property","LitElement","html","property","customElement","html","ifDefined","customElement","property","state","css","html","ifDefined","state","property","customElement","css","LitElement","customElement","property","LitElement","css","property","customElement","html","customElement","css","html","customElement","css","html","LitElement","customElement","property","html","property","html","property","LitElement","html","css","property","customElement","css","html","LitElement","customElement","property","LitElement","html","css","property","customElement","html","customElement","state","ifDefined","css","html","ifDefined","state","customElement","html","customElement","css","html","customElement","html","customElement","css","html","hotspot","customElement","css","LitElement","customElement","property","LitElement","css","property","customElement","html","customElement","css","html","customElement","html","customElement","property","html","property","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","css","html","customElement","property","state","consume","css","html","state","property","consume","customElement","css","html","LitElement","customElement","property","LitElement","css","html","property","customElement","css","html","LitElement","customElement","property","LitElement","html","css","property","customElement","html","customElement","property","state","unsafeHTML","css","html","unsafeHTML","property","state","customElement","css","html","customElement","html","css","customElement","html","customElement","property","state","css","html","state","property","customElement","css","html","customElement","property","state","consume","css","config","element","require","html","css","property","state","consume","customElement","LitElement","css","html","LitElement","css","html","customElement","LitElement","html","css","customElement","css","html","customElement","property","state","repeat","html","repeat","css","property","state","customElement","css","html","LitElement","nothing","customElement","property","LitElement","html","nothing","css","property","customElement","html","customElement","property","query","css","html","query","property","customElement","html","nothing","customElement","property","query","state","ifDefined","css","html","ifDefined","nothing","property","state","query","customElement","css","html","customElement","html","css","customElement","customElement","html","LitElement","css","LitElement","html","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","html","LitElement","customElement","LitElement","html","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","property","state","consume","customElement","html","LitElement","LitElement","html","customElement","property","consume","state","html","html","LitElement","html","html","html","customElement","customElement","property","property","property","state","consume","itemContext","variable","property","consume","state","property","property","property","property","property","property","property","property","property","property","property","property","html","html","consume","LitElement","html","nothing","property","state","LitElement","nothing","html","property","consume","state","property","property","property","property","customElement","property","property","customElement","LitElement","html","customElement","LitElement","html","customElement","LitElement","css","html","customElement","property","LitElement","html","css","property","customElement","LitElement","customElement","LitElement","customElement","consume","css","html","customElement","property","state","html","LitElement","customElement","LitElement","html","customElement","html","css","property","consume","state","customElement","consume","css","html","customElement","property","state","html","css","property","consume","state","customElement"]}
|